{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/babel-runtime/core-js/array/from.js","node_modules/babel-runtime/core-js/json/stringify.js","node_modules/core-js/library/fn/array/from.js","node_modules/core-js/library/fn/json/stringify.js","node_modules/core-js/library/modules/_a-function.js","node_modules/core-js/library/modules/_an-object.js","node_modules/core-js/library/modules/_array-includes.js","node_modules/core-js/library/modules/_classof.js","node_modules/core-js/library/modules/_cof.js","node_modules/core-js/library/modules/_core.js","node_modules/core-js/library/modules/_create-property.js","node_modules/core-js/library/modules/_ctx.js","node_modules/core-js/library/modules/_defined.js","node_modules/core-js/library/modules/_descriptors.js","node_modules/core-js/library/modules/_dom-create.js","node_modules/core-js/library/modules/_enum-bug-keys.js","node_modules/core-js/library/modules/_export.js","node_modules/core-js/library/modules/_fails.js","node_modules/core-js/library/modules/_global.js","node_modules/core-js/library/modules/_has.js","node_modules/core-js/library/modules/_hide.js","node_modules/core-js/library/modules/_html.js","node_modules/core-js/library/modules/_ie8-dom-define.js","node_modules/core-js/library/modules/_iobject.js","node_modules/core-js/library/modules/_is-array-iter.js","node_modules/core-js/library/modules/_is-object.js","node_modules/core-js/library/modules/_iter-call.js","node_modules/core-js/library/modules/_iter-create.js","node_modules/core-js/library/modules/_iter-define.js","node_modules/core-js/library/modules/_iter-detect.js","node_modules/core-js/library/modules/_iterators.js","node_modules/core-js/library/modules/_library.js","node_modules/core-js/library/modules/_object-create.js","node_modules/core-js/library/modules/_object-dp.js","node_modules/core-js/library/modules/_object-dps.js","node_modules/core-js/library/modules/_object-gpo.js","node_modules/core-js/library/modules/_object-keys-internal.js","node_modules/core-js/library/modules/_object-keys.js","node_modules/core-js/library/modules/_property-desc.js","node_modules/core-js/library/modules/_redefine.js","node_modules/core-js/library/modules/_set-to-string-tag.js","node_modules/core-js/library/modules/_shared-key.js","node_modules/core-js/library/modules/_shared.js","node_modules/core-js/library/modules/_string-at.js","node_modules/core-js/library/modules/_to-absolute-index.js","node_modules/core-js/library/modules/_to-integer.js","node_modules/core-js/library/modules/_to-iobject.js","node_modules/core-js/library/modules/_to-length.js","node_modules/core-js/library/modules/_to-object.js","node_modules/core-js/library/modules/_to-primitive.js","node_modules/core-js/library/modules/_uid.js","node_modules/core-js/library/modules/_wks.js","node_modules/core-js/library/modules/core.get-iterator-method.js","node_modules/core-js/library/modules/es6.array.from.js","node_modules/core-js/library/modules/es6.string.iterator.js","node_modules/mustache/mustache.js","src/js/master.js","src/js/modules/animations.js","src/js/modules/branch-bar.js","src/js/modules/questions.js"],"names":[],"mappings":"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","file":"lakipalvelu.min.js","sourceRoot":"/","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\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","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('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","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\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","// optional / simple context binding\nvar aFunction = require('./_a-function');\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","// 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","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').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","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\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 && has(exports, key)) 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","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\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","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? 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","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\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","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\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","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('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","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('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","var ITERATOR = require('./_wks')('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","module.exports = {};\n","module.exports = true;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('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 = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').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","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? 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","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? 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","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('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","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('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","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","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","module.exports = require('./_hide');\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('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","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\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","var toInteger = require('./_to-integer');\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","// 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","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\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","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').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","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(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","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(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","// This file has been generated from mustache.mjs\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.Mustache = factory());\n}(this, (function () { 'use strict';\n\n /*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n var objectToString = Object.prototype.toString;\n var isArray = Array.isArray || function isArrayPolyfill (object) {\n return objectToString.call(object) === '[object Array]';\n };\n\n function isFunction (object) {\n return typeof object === 'function';\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr (obj) {\n return isArray(obj) ? 'array' : typeof obj;\n }\n\n function escapeRegExp (string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty (obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n }\n\n /**\n * Safe way of detecting whether or not the given thing is a primitive and\n * whether it has the given property\n */\n function primitiveHasOwnProperty (primitive, propName) {\n return (\n primitive != null\n && typeof primitive !== 'object'\n && primitive.hasOwnProperty\n && primitive.hasOwnProperty(propName)\n );\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp (re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace (string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n function escapeHtml (string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n *\n * Tokens for partials also contain two more elements: 1) a string value of\n * indendation prior to that tag and 2) the index of that tag on that line -\n * eg a value of 2 indicates the partial is the third tag on this line.\n */\n function parseTemplate (template, tags) {\n if (!template)\n return [];\n var lineHasNonSpace = false;\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n var indentation = ''; // Tracks indentation for tags that use it\n var tagIndex = 0; // Stores a count of number of tags encountered on a line\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace () {\n if (hasTag && !nonSpace) {\n while (spaces.length)\n delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags (tagsToCompile) {\n if (typeof tagsToCompile === 'string')\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error('Invalid tags: ' + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n indentation += chr;\n } else {\n nonSpace = true;\n lineHasNonSpace = true;\n indentation += ' ';\n }\n\n tokens.push([ 'text', chr, start, start + 1 ]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === '\\n') {\n stripSpace();\n indentation = '';\n tagIndex = 0;\n lineHasNonSpace = false;\n }\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe))\n break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || 'name';\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === '=') {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error('Unclosed tag at ' + scanner.pos);\n\n if (type == '>') {\n token = [ type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace ];\n } else {\n token = [ type, value, start, scanner.pos ];\n }\n tagIndex++;\n tokens.push(token);\n\n if (type === '#' || type === '^') {\n sections.push(token);\n } else if (type === '/') {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n } else if (type === 'name' || type === '{' || type === '&') {\n nonSpace = true;\n } else if (type === '=') {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n stripSpace();\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens (tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens (tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case '/':\n section = sections.pop();\n section[5] = token[2];\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner (string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos () {\n return this.tail === '';\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan (re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0)\n return '';\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil (re) {\n var index = this.tail.search(re), match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context (view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push (view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup (name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this, intermediateValue, names, index, lookupHit = false;\n\n while (context) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n *\n * In the case where dot notation is used, we consider the lookup\n * to be successful even if the last \"object\" in the path is\n * not actually an object but a primitive (e.g., a string, or an\n * integer), because it is sometimes useful to access a property\n * of an autoboxed primitive, such as the length of a string.\n **/\n while (intermediateValue != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = (\n hasProperty(intermediateValue, names[index])\n || primitiveHasOwnProperty(intermediateValue, names[index])\n );\n\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n intermediateValue = context.view[name];\n\n /**\n * Only checking against `hasProperty`, which always returns `false` if\n * `context.view` is not an object. Deliberately omitting the check\n * against `primitiveHasOwnProperty` if dot notation is not used.\n *\n * Consider this example:\n * ```\n * Mustache.render(\"The length of a football field is {{#length}}{{length}}{{/length}}.\", {length: \"100 yards\"})\n * ```\n *\n * If we were to check also against `primitiveHasOwnProperty`, as we do\n * in the dot notation case, then render call would return:\n *\n * \"The length of a football field is 9.\"\n *\n * rather than the expected:\n *\n * \"The length of a football field is 100 yards.\"\n **/\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value))\n value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer () {\n this.templateCache = {\n _cache: {},\n set: function set (key, value) {\n this._cache[key] = value;\n },\n get: function get (key) {\n return this._cache[key];\n },\n clear: function clear () {\n this._cache = {};\n }\n };\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache () {\n if (typeof this.templateCache !== 'undefined') {\n this.templateCache.clear();\n }\n };\n\n /**\n * Parses and caches the given `template` according to the given `tags` or\n * `mustache.tags` if `tags` is omitted, and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse (template, tags) {\n var cache = this.templateCache;\n var cacheKey = template + ':' + (tags || mustache.tags).join(':');\n var isCacheEnabled = typeof cache !== 'undefined';\n var tokens = isCacheEnabled ? cache.get(cacheKey) : undefined;\n\n if (tokens == undefined) {\n tokens = parseTemplate(template, tags);\n isCacheEnabled && cache.set(cacheKey, tokens);\n }\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n *\n * If the optional `tags` argument is given here it must be an array with two\n * string values: the opening and closing tags used in the template (e.g.\n * [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n */\n Writer.prototype.render = function render (template, view, partials, tags) {\n var tokens = this.parse(template, tags);\n var context = (view instanceof Context) ? view : new Context(view, undefined);\n return this.renderTokens(tokens, context, partials, template, tags);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens (tokens, context, partials, originalTemplate, tags) {\n var buffer = '';\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate);\n else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate);\n else if (symbol === '>') value = this.renderPartial(token, context, partials, tags);\n else if (symbol === '&') value = this.unescapedValue(token, context);\n else if (symbol === 'name') value = this.escapedValue(token, context);\n else if (symbol === 'text') value = this.rawValue(token);\n\n if (value !== undefined)\n buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection (token, context, partials, originalTemplate) {\n var self = this;\n var buffer = '';\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender (template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate);\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate);\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== 'string')\n throw new Error('Cannot use higher-order sections without the original template');\n\n // Extract the portion of the original template that the section contains.\n value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n if (value != null)\n buffer += value;\n } else {\n buffer += this.renderTokens(token[4], context, partials, originalTemplate);\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted (token, context, partials, originalTemplate) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.indentPartial = function indentPartial (partial, indentation, lineHasNonSpace) {\n var filteredIndentation = indentation.replace(/[^ \\t]/g, '');\n var partialByNl = partial.split('\\n');\n for (var i = 0; i < partialByNl.length; i++) {\n if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) {\n partialByNl[i] = filteredIndentation + partialByNl[i];\n }\n }\n return partialByNl.join('\\n');\n };\n\n Writer.prototype.renderPartial = function renderPartial (token, context, partials, tags) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n var lineHasNonSpace = token[6];\n var tagIndex = token[5];\n var indentation = token[4];\n var indentedValue = value;\n if (tagIndex == 0 && indentation) {\n indentedValue = this.indentPartial(value, indentation, lineHasNonSpace);\n }\n return this.renderTokens(this.parse(indentedValue, tags), context, partials, indentedValue, tags);\n }\n };\n\n Writer.prototype.unescapedValue = function unescapedValue (token, context) {\n var value = context.lookup(token[1]);\n if (value != null)\n return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue (token, context) {\n var value = context.lookup(token[1]);\n if (value != null)\n return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue (token) {\n return token[1];\n };\n\n var mustache = {\n name: 'mustache.js',\n version: '4.0.1',\n tags: [ '{{', '}}' ],\n clearCache: undefined,\n escape: undefined,\n parse: undefined,\n render: undefined,\n Scanner: undefined,\n Context: undefined,\n Writer: undefined,\n /**\n * Allows a user to override the default caching strategy, by providing an\n * object with set, get and clear methods. This can also be used to disable\n * the cache by setting it to the literal `undefined`.\n */\n set templateCache (cache) {\n defaultWriter.templateCache = cache;\n },\n /**\n * Gets the default or overridden caching object from the default writer.\n */\n get templateCache () {\n return defaultWriter.templateCache;\n }\n };\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache () {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse (template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer. If the optional `tags` argument is given here it must be an\n * array with two string values: the opening and closing tags used in the\n * template (e.g. [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n */\n mustache.render = function render (template, view, partials, tags) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\" ' +\n 'but \"' + typeStr(template) + '\" was given as the first ' +\n 'argument for mustache#render(template, view, partials)');\n }\n\n return defaultWriter.render(template, view, partials, tags);\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n\n return mustache;\n\n})));\n","import branchBar from './modules/branch-bar'; //branch bar\nimport questions from './modules/questions';\nimport animations from './modules/animations';\n\n//Init branch bar\nbranchBar.init();\n\n/**\n * Sends logout request to server.\n *\n * @param {Event} event - Logout button which was clicked.\n */\nfunction logout(event) {\n event.preventDefault();\n const xhr = new XMLHttpRequest();\n xhr.open('POST', '/stage-ajax/logout/', true);\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n xhr.onreadystatechange = () => {\n if(xhr.readyState === XMLHttpRequest.DONE) {\n window.location = event.target.href;\n }\n }\n xhr.send('theme=' + event.target.getAttribute('data-logout'));\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n\n const logoutLinks = document.querySelectorAll('[data-logout]');\n for(let i = 0; i < logoutLinks.length; i++) {\n logoutLinks[i].addEventListener('click', logout);\n }\n\n questions.init();\n animations.init();\n\n});\n","export default {\n init: function() {\n const page = document.querySelector('.page__inner');\n\n // FadeOutRight animation when back link is clicked\n const backLink = document.querySelector('.page__back_link');\n if(backLink) {\n backLink.addEventListener('click', () => {\n page.classList.remove('animate__fadeInLeft');\n page.classList.remove('animate__fadeInRight');\n page.classList.add('animate__animated');\n page.classList.add('animate__fadeOutRight');\n });\n }\n\n // FadeOutLeft animation when subject/question link is clicked\n const forwardLinks = document.querySelectorAll('.main-links a, .questions a');\n Array.from(forwardLinks).forEach(link => {\n link.addEventListener('click', () => {\n page.classList.remove('animate__fadeInLeft');\n page.classList.remove('animate__fadeInRight');\n page.classList.add('animate__animated');\n page.classList.add('animate__fadeOutLeft');\n })\n });\n }\n};\n","'use strict';\n\nvar branchBar = {\n _minifiedClass: 'branch-bar--minified',\n _hiddenClass: 'branch-bar--hidden',\n _storageSettings: null,\n _folderId: null,\n _settingsKey: null,\n _dom: {\n bar: null,\n toggles: null,\n pageSelects: null\n },\n _isLocalStorageEnabled: function() {\n var test = 'branch-bar-test';\n\n try {\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch(e) {\n return false;\n }\n },\n _isMinified: function() {\n return this._dom.bar.className.split(' ').indexOf(this._minifiedClass) >= 0;\n },\n _getSettings: function() {\n var settings = null;\n\n if(!this._isLocalStorageEnabled()) {\n return null;\n }\n this._folderId = this._dom.bar.getAttribute('data-folder-id');\n this._settingsKey = 'branch-bar--' + this._folderId;\n if(this._settingsKey) {\n try {\n settings = JSON.parse(localStorage.getItem(this._settingsKey));\n return settings;\n } catch(e) {\n return null;\n }\n }\n\n return settings;\n },\n _updateSettings: function() {\n if(!this._isLocalStorageEnabled()) {\n return false;\n }\n\n if(!this._storageSettings) {\n this._storageSettings = {};\n }\n\n this._storageSettings.minified = this._isMinified();\n\n try {\n localStorage.setItem(this._settingsKey, JSON.stringify(this._storageSettings));\n return true;\n } catch(e) {\n return false;\n }\n },\n _toggleMinified: function() {\n if(this._isMinified()) {\n var reg = new RegExp('(\\\\s|^)' + this._minifiedClass + '(\\\\s|$)');\n this._dom.bar.className = this._dom.bar.className.replace(reg, ' ');\n } else {\n this._dom.bar.className += ' ' + this._minifiedClass;\n }\n },\n _initToggles: function() {\n var self = this;\n\n this._dom.toggles = this._dom.bar.getElementsByClassName('js-branch-bar__toggle');\n\n for(var i = 0, l = this._dom.toggles.length; i < l; i++) {\n this._dom.toggles[i].addEventListener('click', function() {\n self._toggleMinified();\n self._updateSettings();\n }, false);\n }\n },\n _initPageSelects: function() {\n this._dom.pageSelects = this._dom.bar.getElementsByClassName('js-branch-bar__page-select');\n\n for(var i = 0, l = this._dom.pageSelects.length; i < l; i++) {\n this._dom.pageSelects[i].addEventListener('change', function(e) {\n var val = e.target.value;\n\n if(val) {\n window.location.href = val;\n }\n }, false);\n }\n },\n _showBar: function() {\n var reg = new RegExp('(\\\\s|^)' + this._hiddenClass + '(\\\\s|$)');\n var self = this;\n\n self._dom.bar.className = self._dom.bar.className.replace(reg, ' ');\n },\n init: function() {\n var that = this;\n document.addEventListener('DOMContentLoaded', function(event) {\n that._dom.bar = document.getElementById('js-branch-bar'); // Assumes only one bar per page\n\n if(that._dom.bar) {\n that._storageSettings = that._getSettings();\n\n // If user left the bar open\n if(that._storageSettings && !that._storageSettings.minified) {\n that._toggleMinified();\n }\n\n that._initToggles();\n that._initPageSelects();\n\n that._showBar();\n }\n });\n }\n};\n\nmodule.exports = branchBar;\n","import Mustache from 'mustache';\n\nconst question = {\n _data: null,\n _template: null,\n _el: {\n question: null,\n result: null\n },\n _state: {\n question: false,\n choices: [],\n result: ''\n },\n\n /**\n * Renders question template.\n */\n render: function() {\n this._el.question.innerHTML = Mustache.render(this._template, this._state);\n\n // Add listeners\n Array.from(this._el.question.querySelectorAll('[data-print]')).forEach(el => {\n el.addEventListener('click', () => { window.print() });\n });\n Array.from(this._el.question.querySelectorAll('[data-question]')).forEach(el => {\n el.addEventListener('click', () => { this.answer(el.getAttribute('data-question'), el.getAttribute('data-answer')) });\n });\n },\n\n /**\n * Get question from hierarchical question data.\n *\n * @param {String} id Question id to find.\n * @param {Object} data Hierarchical question data.\n * @return {Object|null} Question data or null if question with given id does not exist.\n */\n findQuestion: function(id, data) {\n if(id === data.id) {\n return data;\n }\n\n let question = null;\n\n const findRecursive = (items) => {\n const result = items.find(item => item.id === id);\n if(result) {\n question = result;\n }\n else {\n items.forEach(item => {\n if(item.choices && item.choices.length > 0) {\n findRecursive(item.choices);\n }\n });\n }\n };\n findRecursive(data.choices);\n\n return question;\n },\n\n /**\n * Sets answer to given question and renders question.\n *\n * @param {String} questionId Question to update.\n * @param {String} answerId Answer for given question. If empty, removes answer for given question.\n */\n answer: function(questionId, answerId) {\n const question = this.findQuestion(questionId, this._data);\n if(!question) {\n return;\n }\n\n // If question has already been answered, remove answer and all subsequent answers\n const index = this._state.choices.findIndex(item => item.questionId === questionId);\n if(index > -1) {\n this._state.choices.splice(index);\n }\n\n // Add new answer\n const answer = question.choices.find(item => item.id === answerId);\n if(answer) {\n this._state.choices.push({ questionId: questionId, answerId: answerId, question: question.question, answer: answer.answer });\n }\n\n // Set currently active question or result\n const nextQuestion = answer || question;\n if(nextQuestion.choices && nextQuestion.choices.length > 0) {\n this._state.result = false;\n this._state.question = {\n text: nextQuestion.question,\n choices: nextQuestion.choices.map(choice => ({ questionId: nextQuestion.id, answerId: choice.id, answer: choice.answer })),\n animateQuestion: !!answerId\n };\n this._el.result.classList.remove('visible');\n }\n else {\n this._state.result = nextQuestion.result;\n this._state.question = false;\n this._el.result.classList.add('visible');\n }\n\n this.render();\n },\n\n /**\n * Initialize question logic.\n */\n init: function() {\n this._data = window.questionData;\n this._template = document.getElementById('tmpl-questions');\n this._template = this._template ? this._template.innerHTML : '';\n this._el.question = document.getElementById('question');\n this._el.result = document.getElementById('question-result');\n if(this._data && this._template && this._el.question && this._el.result) {\n this.answer(this._data.id);\n }\n }\n};\n\nexport default question;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2pzb24vc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9tdXN0YWNoZS9tdXN0YWNoZS5qcyIsInNyYy9qcy9tYXN0ZXIuanMiLCJzcmMvanMvbW9kdWxlcy9hbmltYXRpb25zLmpzIiwic3JjL2pzL21vZHVsZXMvYnJhbmNoLWJhci5qcyIsInNyYy9qcy9tb2R1bGVzL3F1ZXN0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBLE9BQU8sU0FBWSxRQUFXLFFBQVEsaUNBQWtDLFlBQVk7OztBQ0FwRixPQUFPLFNBQVksUUFBVyxRQUFRLHFDQUFzQyxZQUFZOzs7QUNBeEYsUUFBUSxxQ0FDUixRQUFRLGdDQUNSLE9BQU8sUUFBVSxRQUFRLHVCQUF1QixNQUFNOzs7QUNGdEQsR0FBSSxNQUFPLFFBQVEsdUJBQ2YsTUFBUSxLQUFLLE9BQVMsS0FBSyxNQUFTLFVBQVcsS0FBSyxXQUN4RCxRQUFPLFFBQVUsU0FBbUIsR0FDbEMsTUFBTyxPQUFNLFVBQVUsTUFBTSxNQUFPOzs7QUNIdEMsT0FBTyxRQUFVLFNBQVUsR0FDekIsR0FBaUIsa0JBQU4sR0FBa0IsS0FBTSxXQUFVLEVBQUssc0JBQ2xELE9BQU87OztBQ0ZULEdBQUksVUFBVyxRQUFRLGVBQ3ZCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLElBQUssU0FBUyxHQUFLLEtBQU0sV0FBVSxFQUFLLHFCQUN4QyxP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QUEsT0FBYSxXQUFZLEVBQWEsR0FBSSxTQUFVLEVBQU8sR0FBSSxPQUFRLEVBQU8sVUFDaEgsa0JBQW1CLEdBRXJCLEtBQUssSUFBSSxPQUFPLFVBQVUsT0FBTyxhQUdqQyxLQUFLLE9BQU8sT0FBUyxFQUFhLE9BQ2xDLEtBQUssT0FBTyxVQUFXLEVBQ3ZCLEtBQUssSUFBSSxPQUFPLFVBQVUsSUFBSSxZQUdoQyxLQUFLLFdBTVAsS0FBTSxXQUNKLEtBQUssTUFBUSxPQUFPLGFBQ3BCLEtBQUssVUFBWSxTQUFTLGVBQWUsa0JBQ3pDLEtBQUssVUFBWSxLQUFLLFVBQVksS0FBSyxVQUFVLFVBQVksR0FDN0QsS0FBSyxJQUFJLFNBQVcsU0FBUyxlQUFlLFlBQzVDLEtBQUssSUFBSSxPQUFTLFNBQVMsZUFBZSxtQkFDdkMsS0FBSyxPQUFTLEtBQUssV0FBYSxLQUFLLElBQUksVUFBWSxLQUFLLElBQUksUUFDL0QsS0FBSyxPQUFPLEtBQUssTUFBTSxzQkFLZCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5XCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5mcm9tO1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJyk7XG52YXIgJEpTT04gPSBjb3JlLkpTT04gfHwgKGNvcmUuSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuICRKU09OLnN0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJndW1lbnRzKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuNScgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIGhhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIGhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikgeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKG1hcHBpbmcpIG1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDKCk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvciAocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIG11c3RhY2hlLm1qc1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5NdXN0YWNoZSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKiFcbiAgICogbXVzdGFjaGUuanMgLSBMb2dpYy1sZXNzIHt7bXVzdGFjaGV9fSB0ZW1wbGF0ZXMgd2l0aCBKYXZhU2NyaXB0XG4gICAqIGh0dHA6Ly9naXRodWIuY29tL2phbmwvbXVzdGFjaGUuanNcbiAgICovXG5cbiAgdmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXlQb2x5ZmlsbCAob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgfTtcblxuICBmdW5jdGlvbiBpc0Z1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3JlIGNvcnJlY3QgdHlwZW9mIHN0cmluZyBoYW5kbGluZyBhcnJheVxuICAgKiB3aGljaCBub3JtYWxseSByZXR1cm5zIHR5cGVvZiAnb2JqZWN0J1xuICAgKi9cbiAgZnVuY3Rpb24gdHlwZVN0ciAob2JqKSB7XG4gICAgcmV0dXJuIGlzQXJyYXkob2JqKSA/ICdhcnJheScgOiB0eXBlb2Ygb2JqO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XG4gIH1cblxuICAvKipcbiAgICogTnVsbCBzYWZlIHdheSBvZiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QsXG4gICAqIGluY2x1ZGluZyBpdHMgcHJvdG90eXBlLCBoYXMgYSBnaXZlbiBwcm9wZXJ0eVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzUHJvcGVydHkgKG9iaiwgcHJvcE5hbWUpIHtcbiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgKHByb3BOYW1lIGluIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogU2FmZSB3YXkgb2YgZGV0ZWN0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0aGluZyBpcyBhIHByaW1pdGl2ZSBhbmRcbiAgICogd2hldGhlciBpdCBoYXMgdGhlIGdpdmVuIHByb3BlcnR5XG4gICAqL1xuICBmdW5jdGlvbiBwcmltaXRpdmVIYXNPd25Qcm9wZXJ0eSAocHJpbWl0aXZlLCBwcm9wTmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICBwcmltaXRpdmUgIT0gbnVsbFxuICAgICAgJiYgdHlwZW9mIHByaW1pdGl2ZSAhPT0gJ29iamVjdCdcbiAgICAgICYmIHByaW1pdGl2ZS5oYXNPd25Qcm9wZXJ0eVxuICAgICAgJiYgcHJpbWl0aXZlLmhhc093blByb3BlcnR5KHByb3BOYW1lKVxuICAgICk7XG4gIH1cblxuICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NPVUNIREItNTc3XG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFubC9tdXN0YWNoZS5qcy9pc3N1ZXMvMTg5XG4gIHZhciByZWdFeHBUZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xuICBmdW5jdGlvbiB0ZXN0UmVnRXhwIChyZSwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlZ0V4cFRlc3QuY2FsbChyZSwgc3RyaW5nKTtcbiAgfVxuXG4gIHZhciBub25TcGFjZVJlID0gL1xcUy87XG4gIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAoc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0ZXN0UmVnRXhwKG5vblNwYWNlUmUsIHN0cmluZyk7XG4gIH1cblxuICB2YXIgZW50aXR5TWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnLyc6ICcmI3gyRjsnLFxuICAgICdgJzogJyYjeDYwOycsXG4gICAgJz0nOiAnJiN4M0Q7J1xuICB9O1xuXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwgKHN0cmluZykge1xuICAgIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9bJjw+XCInYD1cXC9dL2csIGZ1bmN0aW9uIGZyb21FbnRpdHlNYXAgKHMpIHtcbiAgICAgIHJldHVybiBlbnRpdHlNYXBbc107XG4gICAgfSk7XG4gIH1cblxuICB2YXIgd2hpdGVSZSA9IC9cXHMqLztcbiAgdmFyIHNwYWNlUmUgPSAvXFxzKy87XG4gIHZhciBlcXVhbHNSZSA9IC9cXHMqPS87XG4gIHZhciBjdXJseVJlID0gL1xccypcXH0vO1xuICB2YXIgdGFnUmUgPSAvI3xcXF58XFwvfD58XFx7fCZ8PXwhLztcblxuICAvKipcbiAgICogQnJlYWtzIHVwIHRoZSBnaXZlbiBgdGVtcGxhdGVgIHN0cmluZyBpbnRvIGEgdHJlZSBvZiB0b2tlbnMuIElmIHRoZSBgdGFnc2BcbiAgICogYXJndW1lbnQgaXMgZ2l2ZW4gaGVyZSBpdCBtdXN0IGJlIGFuIGFycmF5IHdpdGggdHdvIHN0cmluZyB2YWx1ZXM6IHRoZVxuICAgKiBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgdXNlZCBpbiB0aGUgdGVtcGxhdGUgKGUuZy4gWyBcIjwlXCIsIFwiJT5cIiBdKS4gT2ZcbiAgICogY291cnNlLCB0aGUgZGVmYXVsdCBpcyB0byB1c2UgbXVzdGFjaGVzIChpLmUuIG11c3RhY2hlLnRhZ3MpLlxuICAgKlxuICAgKiBBIHRva2VuIGlzIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgNCBlbGVtZW50cy4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlXG4gICAqIG11c3RhY2hlIHN5bWJvbCB0aGF0IHdhcyB1c2VkIGluc2lkZSB0aGUgdGFnLCBlLmcuIFwiI1wiIG9yIFwiJlwiLiBJZiB0aGUgdGFnXG4gICAqIGRpZCBub3QgY29udGFpbiBhIHN5bWJvbCAoaS5lLiB7e215VmFsdWV9fSkgdGhpcyBlbGVtZW50IGlzIFwibmFtZVwiLiBGb3JcbiAgICogYWxsIHRleHQgdGhhdCBhcHBlYXJzIG91dHNpZGUgYSBzeW1ib2wgdGhpcyBlbGVtZW50IGlzIFwidGV4dFwiLlxuICAgKlxuICAgKiBUaGUgc2Vjb25kIGVsZW1lbnQgb2YgYSB0b2tlbiBpcyBpdHMgXCJ2YWx1ZVwiLiBGb3IgbXVzdGFjaGUgdGFncyB0aGlzIGlzXG4gICAqIHdoYXRldmVyIGVsc2Ugd2FzIGluc2lkZSB0aGUgdGFnIGJlc2lkZXMgdGhlIG9wZW5pbmcgc3ltYm9sLiBGb3IgdGV4dCB0b2tlbnNcbiAgICogdGhpcyBpcyB0aGUgdGV4dCBpdHNlbGYuXG4gICAqXG4gICAqIFRoZSB0aGlyZCBhbmQgZm91cnRoIGVsZW1lbnRzIG9mIHRoZSB0b2tlbiBhcmUgdGhlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyxcbiAgICogcmVzcGVjdGl2ZWx5LCBvZiB0aGUgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIHRlbXBsYXRlLlxuICAgKlxuICAgKiBUb2tlbnMgdGhhdCBhcmUgdGhlIHJvb3Qgbm9kZSBvZiBhIHN1YnRyZWUgY29udGFpbiB0d28gbW9yZSBlbGVtZW50czogMSkgYW5cbiAgICogYXJyYXkgb2YgdG9rZW5zIGluIHRoZSBzdWJ0cmVlIGFuZCAyKSB0aGUgaW5kZXggaW4gdGhlIG9yaWdpbmFsIHRlbXBsYXRlIGF0XG4gICAqIHdoaWNoIHRoZSBjbG9zaW5nIHRhZyBmb3IgdGhhdCBzZWN0aW9uIGJlZ2lucy5cbiAgICpcbiAgICogVG9rZW5zIGZvciBwYXJ0aWFscyBhbHNvIGNvbnRhaW4gdHdvIG1vcmUgZWxlbWVudHM6IDEpIGEgc3RyaW5nIHZhbHVlIG9mXG4gICAqIGluZGVuZGF0aW9uIHByaW9yIHRvIHRoYXQgdGFnIGFuZCAyKSB0aGUgaW5kZXggb2YgdGhhdCB0YWcgb24gdGhhdCBsaW5lIC1cbiAgICogZWcgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyB0aGUgcGFydGlhbCBpcyB0aGUgdGhpcmQgdGFnIG9uIHRoaXMgbGluZS5cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGUgKHRlbXBsYXRlLCB0YWdzKSB7XG4gICAgaWYgKCF0ZW1wbGF0ZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICB2YXIgbGluZUhhc05vblNwYWNlID0gZmFsc2U7XG4gICAgdmFyIHNlY3Rpb25zID0gW107ICAgICAvLyBTdGFjayB0byBob2xkIHNlY3Rpb24gdG9rZW5zXG4gICAgdmFyIHRva2VucyA9IFtdOyAgICAgICAvLyBCdWZmZXIgdG8gaG9sZCB0aGUgdG9rZW5zXG4gICAgdmFyIHNwYWNlcyA9IFtdOyAgICAgICAvLyBJbmRpY2VzIG9mIHdoaXRlc3BhY2UgdG9rZW5zIG9uIHRoZSBjdXJyZW50IGxpbmVcbiAgICB2YXIgaGFzVGFnID0gZmFsc2U7ICAgIC8vIElzIHRoZXJlIGEge3t0YWd9fSBvbiB0aGUgY3VycmVudCBsaW5lP1xuICAgIHZhciBub25TcGFjZSA9IGZhbHNlOyAgLy8gSXMgdGhlcmUgYSBub24tc3BhY2UgY2hhciBvbiB0aGUgY3VycmVudCBsaW5lP1xuICAgIHZhciBpbmRlbnRhdGlvbiA9ICcnOyAgLy8gVHJhY2tzIGluZGVudGF0aW9uIGZvciB0YWdzIHRoYXQgdXNlIGl0XG4gICAgdmFyIHRhZ0luZGV4ID0gMDsgICAgICAvLyBTdG9yZXMgYSBjb3VudCBvZiBudW1iZXIgb2YgdGFncyBlbmNvdW50ZXJlZCBvbiBhIGxpbmVcblxuICAgIC8vIFN0cmlwcyBhbGwgd2hpdGVzcGFjZSB0b2tlbnMgYXJyYXkgZm9yIHRoZSBjdXJyZW50IGxpbmVcbiAgICAvLyBpZiB0aGVyZSB3YXMgYSB7eyN0YWd9fSBvbiBpdCBhbmQgb3RoZXJ3aXNlIG9ubHkgc3BhY2UuXG4gICAgZnVuY3Rpb24gc3RyaXBTcGFjZSAoKSB7XG4gICAgICBpZiAoaGFzVGFnICYmICFub25TcGFjZSkge1xuICAgICAgICB3aGlsZSAoc3BhY2VzLmxlbmd0aClcbiAgICAgICAgICBkZWxldGUgdG9rZW5zW3NwYWNlcy5wb3AoKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGFjZXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaGFzVGFnID0gZmFsc2U7XG4gICAgICBub25TcGFjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBvcGVuaW5nVGFnUmUsIGNsb3NpbmdUYWdSZSwgY2xvc2luZ0N1cmx5UmU7XG4gICAgZnVuY3Rpb24gY29tcGlsZVRhZ3MgKHRhZ3NUb0NvbXBpbGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdGFnc1RvQ29tcGlsZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHRhZ3NUb0NvbXBpbGUgPSB0YWdzVG9Db21waWxlLnNwbGl0KHNwYWNlUmUsIDIpO1xuXG4gICAgICBpZiAoIWlzQXJyYXkodGFnc1RvQ29tcGlsZSkgfHwgdGFnc1RvQ29tcGlsZS5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YWdzOiAnICsgdGFnc1RvQ29tcGlsZSk7XG5cbiAgICAgIG9wZW5pbmdUYWdSZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKHRhZ3NUb0NvbXBpbGVbMF0pICsgJ1xcXFxzKicpO1xuICAgICAgY2xvc2luZ1RhZ1JlID0gbmV3IFJlZ0V4cCgnXFxcXHMqJyArIGVzY2FwZVJlZ0V4cCh0YWdzVG9Db21waWxlWzFdKSk7XG4gICAgICBjbG9zaW5nQ3VybHlSZSA9IG5ldyBSZWdFeHAoJ1xcXFxzKicgKyBlc2NhcGVSZWdFeHAoJ30nICsgdGFnc1RvQ29tcGlsZVsxXSkpO1xuICAgIH1cblxuICAgIGNvbXBpbGVUYWdzKHRhZ3MgfHwgbXVzdGFjaGUudGFncyk7XG5cbiAgICB2YXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRlbXBsYXRlKTtcblxuICAgIHZhciBzdGFydCwgdHlwZSwgdmFsdWUsIGNociwgdG9rZW4sIG9wZW5TZWN0aW9uO1xuICAgIHdoaWxlICghc2Nhbm5lci5lb3MoKSkge1xuICAgICAgc3RhcnQgPSBzY2FubmVyLnBvcztcblxuICAgICAgLy8gTWF0Y2ggYW55IHRleHQgYmV0d2VlbiB0YWdzLlxuICAgICAgdmFsdWUgPSBzY2FubmVyLnNjYW5VbnRpbChvcGVuaW5nVGFnUmUpO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoOyBpIDwgdmFsdWVMZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNociA9IHZhbHVlLmNoYXJBdChpKTtcblxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY2hyKSkge1xuICAgICAgICAgICAgc3BhY2VzLnB1c2godG9rZW5zLmxlbmd0aCk7XG4gICAgICAgICAgICBpbmRlbnRhdGlvbiArPSBjaHI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vblNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpbmVIYXNOb25TcGFjZSA9IHRydWU7XG4gICAgICAgICAgICBpbmRlbnRhdGlvbiArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9rZW5zLnB1c2goWyAndGV4dCcsIGNociwgc3RhcnQsIHN0YXJ0ICsgMSBdKTtcbiAgICAgICAgICBzdGFydCArPSAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIHdoaXRlc3BhY2Ugb24gdGhlIGN1cnJlbnQgbGluZS5cbiAgICAgICAgICBpZiAoY2hyID09PSAnXFxuJykge1xuICAgICAgICAgICAgc3RyaXBTcGFjZSgpO1xuICAgICAgICAgICAgaW5kZW50YXRpb24gPSAnJztcbiAgICAgICAgICAgIHRhZ0luZGV4ID0gMDtcbiAgICAgICAgICAgIGxpbmVIYXNOb25TcGFjZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBNYXRjaCB0aGUgb3BlbmluZyB0YWcuXG4gICAgICBpZiAoIXNjYW5uZXIuc2NhbihvcGVuaW5nVGFnUmUpKVxuICAgICAgICBicmVhaztcblxuICAgICAgaGFzVGFnID0gdHJ1ZTtcblxuICAgICAgLy8gR2V0IHRoZSB0YWcgdHlwZS5cbiAgICAgIHR5cGUgPSBzY2FubmVyLnNjYW4odGFnUmUpIHx8ICduYW1lJztcbiAgICAgIHNjYW5uZXIuc2Nhbih3aGl0ZVJlKTtcblxuICAgICAgLy8gR2V0IHRoZSB0YWcgdmFsdWUuXG4gICAgICBpZiAodHlwZSA9PT0gJz0nKSB7XG4gICAgICAgIHZhbHVlID0gc2Nhbm5lci5zY2FuVW50aWwoZXF1YWxzUmUpO1xuICAgICAgICBzY2FubmVyLnNjYW4oZXF1YWxzUmUpO1xuICAgICAgICBzY2FubmVyLnNjYW5VbnRpbChjbG9zaW5nVGFnUmUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAneycpIHtcbiAgICAgICAgdmFsdWUgPSBzY2FubmVyLnNjYW5VbnRpbChjbG9zaW5nQ3VybHlSZSk7XG4gICAgICAgIHNjYW5uZXIuc2NhbihjdXJseVJlKTtcbiAgICAgICAgc2Nhbm5lci5zY2FuVW50aWwoY2xvc2luZ1RhZ1JlKTtcbiAgICAgICAgdHlwZSA9ICcmJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gc2Nhbm5lci5zY2FuVW50aWwoY2xvc2luZ1RhZ1JlKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWF0Y2ggdGhlIGNsb3NpbmcgdGFnLlxuICAgICAgaWYgKCFzY2FubmVyLnNjYW4oY2xvc2luZ1RhZ1JlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmNsb3NlZCB0YWcgYXQgJyArIHNjYW5uZXIucG9zKTtcblxuICAgICAgaWYgKHR5cGUgPT0gJz4nKSB7XG4gICAgICAgIHRva2VuID0gWyB0eXBlLCB2YWx1ZSwgc3RhcnQsIHNjYW5uZXIucG9zLCBpbmRlbnRhdGlvbiwgdGFnSW5kZXgsIGxpbmVIYXNOb25TcGFjZSBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9rZW4gPSBbIHR5cGUsIHZhbHVlLCBzdGFydCwgc2Nhbm5lci5wb3MgXTtcbiAgICAgIH1cbiAgICAgIHRhZ0luZGV4Kys7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cbiAgICAgIGlmICh0eXBlID09PSAnIycgfHwgdHlwZSA9PT0gJ14nKSB7XG4gICAgICAgIHNlY3Rpb25zLnB1c2godG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnLycpIHtcbiAgICAgICAgLy8gQ2hlY2sgc2VjdGlvbiBuZXN0aW5nLlxuICAgICAgICBvcGVuU2VjdGlvbiA9IHNlY3Rpb25zLnBvcCgpO1xuXG4gICAgICAgIGlmICghb3BlblNlY3Rpb24pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbm9wZW5lZCBzZWN0aW9uIFwiJyArIHZhbHVlICsgJ1wiIGF0ICcgKyBzdGFydCk7XG5cbiAgICAgICAgaWYgKG9wZW5TZWN0aW9uWzFdICE9PSB2YWx1ZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuY2xvc2VkIHNlY3Rpb24gXCInICsgb3BlblNlY3Rpb25bMV0gKyAnXCIgYXQgJyArIHN0YXJ0KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25hbWUnIHx8IHR5cGUgPT09ICd7JyB8fCB0eXBlID09PSAnJicpIHtcbiAgICAgICAgbm9uU3BhY2UgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnPScpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB0YWdzIGZvciB0aGUgbmV4dCB0aW1lIGFyb3VuZC5cbiAgICAgICAgY29tcGlsZVRhZ3ModmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0cmlwU3BhY2UoKTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gb3BlbiBzZWN0aW9ucyB3aGVuIHdlJ3JlIGRvbmUuXG4gICAgb3BlblNlY3Rpb24gPSBzZWN0aW9ucy5wb3AoKTtcblxuICAgIGlmIChvcGVuU2VjdGlvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5jbG9zZWQgc2VjdGlvbiBcIicgKyBvcGVuU2VjdGlvblsxXSArICdcIiBhdCAnICsgc2Nhbm5lci5wb3MpO1xuXG4gICAgcmV0dXJuIG5lc3RUb2tlbnMoc3F1YXNoVG9rZW5zKHRva2VucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmVzIHRoZSB2YWx1ZXMgb2YgY29uc2VjdXRpdmUgdGV4dCB0b2tlbnMgaW4gdGhlIGdpdmVuIGB0b2tlbnNgIGFycmF5XG4gICAqIHRvIGEgc2luZ2xlIHRva2VuLlxuICAgKi9cbiAgZnVuY3Rpb24gc3F1YXNoVG9rZW5zICh0b2tlbnMpIHtcbiAgICB2YXIgc3F1YXNoZWRUb2tlbnMgPSBbXTtcblxuICAgIHZhciB0b2tlbiwgbGFzdFRva2VuO1xuICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyArK2kpIHtcbiAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgaWYgKHRva2VuWzBdID09PSAndGV4dCcgJiYgbGFzdFRva2VuICYmIGxhc3RUb2tlblswXSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgbGFzdFRva2VuWzFdICs9IHRva2VuWzFdO1xuICAgICAgICAgIGxhc3RUb2tlblszXSA9IHRva2VuWzNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxdWFzaGVkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxdWFzaGVkVG9rZW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1zIHRoZSBnaXZlbiBhcnJheSBvZiBgdG9rZW5zYCBpbnRvIGEgbmVzdGVkIHRyZWUgc3RydWN0dXJlIHdoZXJlXG4gICAqIHRva2VucyB0aGF0IHJlcHJlc2VudCBhIHNlY3Rpb24gaGF2ZSB0d28gYWRkaXRpb25hbCBpdGVtczogMSkgYW4gYXJyYXkgb2ZcbiAgICogYWxsIHRva2VucyB0aGF0IGFwcGVhciBpbiB0aGF0IHNlY3Rpb24gYW5kIDIpIHRoZSBpbmRleCBpbiB0aGUgb3JpZ2luYWxcbiAgICogdGVtcGxhdGUgdGhhdCByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhhdCBzZWN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gbmVzdFRva2VucyAodG9rZW5zKSB7XG4gICAgdmFyIG5lc3RlZFRva2VucyA9IFtdO1xuICAgIHZhciBjb2xsZWN0b3IgPSBuZXN0ZWRUb2tlbnM7XG4gICAgdmFyIHNlY3Rpb25zID0gW107XG5cbiAgICB2YXIgdG9rZW4sIHNlY3Rpb247XG4gICAgZm9yICh2YXIgaSA9IDAsIG51bVRva2VucyA9IHRva2Vucy5sZW5ndGg7IGkgPCBudW1Ub2tlbnM7ICsraSkge1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgIGNhc2UgJ14nOlxuICAgICAgICAgIGNvbGxlY3Rvci5wdXNoKHRva2VuKTtcbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICBjb2xsZWN0b3IgPSB0b2tlbls0XSA9IFtdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICBzZWN0aW9uID0gc2VjdGlvbnMucG9wKCk7XG4gICAgICAgICAgc2VjdGlvbls1XSA9IHRva2VuWzJdO1xuICAgICAgICAgIGNvbGxlY3RvciA9IHNlY3Rpb25zLmxlbmd0aCA+IDAgPyBzZWN0aW9uc1tzZWN0aW9ucy5sZW5ndGggLSAxXVs0XSA6IG5lc3RlZFRva2VucztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb2xsZWN0b3IucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5lc3RlZFRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNpbXBsZSBzdHJpbmcgc2Nhbm5lciB0aGF0IGlzIHVzZWQgYnkgdGhlIHRlbXBsYXRlIHBhcnNlciB0byBmaW5kXG4gICAqIHRva2VucyBpbiB0ZW1wbGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgZnVuY3Rpb24gU2Nhbm5lciAoc3RyaW5nKSB7XG4gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgdGhpcy50YWlsID0gc3RyaW5nO1xuICAgIHRoaXMucG9zID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGFpbCBpcyBlbXB0eSAoZW5kIG9mIHN0cmluZykuXG4gICAqL1xuICBTY2FubmVyLnByb3RvdHlwZS5lb3MgPSBmdW5jdGlvbiBlb3MgKCkge1xuICAgIHJldHVybiB0aGlzLnRhaWwgPT09ICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUcmllcyB0byBtYXRjaCB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgKiBSZXR1cm5zIHRoZSBtYXRjaGVkIHRleHQgaWYgaXQgY2FuIG1hdGNoLCB0aGUgZW1wdHkgc3RyaW5nIG90aGVyd2lzZS5cbiAgICovXG4gIFNjYW5uZXIucHJvdG90eXBlLnNjYW4gPSBmdW5jdGlvbiBzY2FuIChyZSkge1xuICAgIHZhciBtYXRjaCA9IHRoaXMudGFpbC5tYXRjaChyZSk7XG5cbiAgICBpZiAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ICE9PSAwKVxuICAgICAgcmV0dXJuICcnO1xuXG4gICAgdmFyIHN0cmluZyA9IG1hdGNoWzBdO1xuXG4gICAgdGhpcy50YWlsID0gdGhpcy50YWlsLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKTtcbiAgICB0aGlzLnBvcyArPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogU2tpcHMgYWxsIHRleHQgdW50aWwgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYW4gYmUgbWF0Y2hlZC4gUmV0dXJuc1xuICAgKiB0aGUgc2tpcHBlZCBzdHJpbmcsIHdoaWNoIGlzIHRoZSBlbnRpcmUgdGFpbCBpZiBubyBtYXRjaCBjYW4gYmUgbWFkZS5cbiAgICovXG4gIFNjYW5uZXIucHJvdG90eXBlLnNjYW5VbnRpbCA9IGZ1bmN0aW9uIHNjYW5VbnRpbCAocmUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnRhaWwuc2VhcmNoKHJlKSwgbWF0Y2g7XG5cbiAgICBzd2l0Y2ggKGluZGV4KSB7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICBtYXRjaCA9IHRoaXMudGFpbDtcbiAgICAgICAgdGhpcy50YWlsID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAwOlxuICAgICAgICBtYXRjaCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG1hdGNoID0gdGhpcy50YWlsLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgIHRoaXMudGFpbCA9IHRoaXMudGFpbC5zdWJzdHJpbmcoaW5kZXgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zICs9IG1hdGNoLmxlbmd0aDtcblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIHJlbmRlcmluZyBjb250ZXh0IGJ5IHdyYXBwaW5nIGEgdmlldyBvYmplY3QgYW5kXG4gICAqIG1haW50YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgY29udGV4dC5cbiAgICovXG4gIGZ1bmN0aW9uIENvbnRleHQgKHZpZXcsIHBhcmVudENvbnRleHQpIHtcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgIHRoaXMuY2FjaGUgPSB7ICcuJzogdGhpcy52aWV3IH07XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRDb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gdmlldyB3aXRoIHRoaXMgY29udGV4dFxuICAgKiBhcyB0aGUgcGFyZW50LlxuICAgKi9cbiAgQ29udGV4dC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKHZpZXcpIHtcbiAgICByZXR1cm4gbmV3IENvbnRleHQodmlldywgdGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgY29udGV4dCwgdHJhdmVyc2luZ1xuICAgKiB1cCB0aGUgY29udGV4dCBoaWVyYXJjaHkgaWYgdGhlIHZhbHVlIGlzIGFic2VudCBpbiB0aGlzIGNvbnRleHQncyB2aWV3LlxuICAgKi9cbiAgQ29udGV4dC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gbG9va3VwIChuYW1lKSB7XG4gICAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHZhbHVlID0gY2FjaGVbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgaW50ZXJtZWRpYXRlVmFsdWUsIG5hbWVzLCBpbmRleCwgbG9va3VwSGl0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlIChjb250ZXh0KSB7XG4gICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSA+IDApIHtcbiAgICAgICAgICBpbnRlcm1lZGlhdGVWYWx1ZSA9IGNvbnRleHQudmlldztcbiAgICAgICAgICBuYW1lcyA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICBpbmRleCA9IDA7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBVc2luZyB0aGUgZG90IG5vdGlvbiBwYXRoIGluIGBuYW1lYCwgd2UgZGVzY2VuZCB0aHJvdWdoIHRoZVxuICAgICAgICAgICAqIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVG8gYmUgY2VydGFpbiB0aGF0IHRoZSBsb29rdXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bCwgd2UgaGF2ZSB0b1xuICAgICAgICAgICAqIGNoZWNrIGlmIHRoZSBsYXN0IG9iamVjdCBpbiB0aGUgcGF0aCBhY3R1YWxseSBoYXMgdGhlIHByb3BlcnR5XG4gICAgICAgICAgICogd2UgYXJlIGxvb2tpbmcgZm9yLiBXZSBzdG9yZSB0aGUgcmVzdWx0IGluIGBsb29rdXBIaXRgLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhpcyBpcyBzcGVjaWFsbHkgbmVjZXNzYXJ5IGZvciB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiBzZXQgdG9cbiAgICAgICAgICAgKiBgdW5kZWZpbmVkYCBhbmQgd2Ugd2FudCB0byBhdm9pZCBsb29raW5nIHVwIHBhcmVudCBjb250ZXh0cy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIGRvdCBub3RhdGlvbiBpcyB1c2VkLCB3ZSBjb25zaWRlciB0aGUgbG9va3VwXG4gICAgICAgICAgICogdG8gYmUgc3VjY2Vzc2Z1bCBldmVuIGlmIHRoZSBsYXN0IFwib2JqZWN0XCIgaW4gdGhlIHBhdGggaXNcbiAgICAgICAgICAgKiBub3QgYWN0dWFsbHkgYW4gb2JqZWN0IGJ1dCBhIHByaW1pdGl2ZSAoZS5nLiwgYSBzdHJpbmcsIG9yIGFuXG4gICAgICAgICAgICogaW50ZWdlciksIGJlY2F1c2UgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhY2Nlc3MgYSBwcm9wZXJ0eVxuICAgICAgICAgICAqIG9mIGFuIGF1dG9ib3hlZCBwcmltaXRpdmUsIHN1Y2ggYXMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZy5cbiAgICAgICAgICAgKiovXG4gICAgICAgICAgd2hpbGUgKGludGVybWVkaWF0ZVZhbHVlICE9IG51bGwgJiYgaW5kZXggPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbmFtZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgbG9va3VwSGl0ID0gKFxuICAgICAgICAgICAgICAgIGhhc1Byb3BlcnR5KGludGVybWVkaWF0ZVZhbHVlLCBuYW1lc1tpbmRleF0pXG4gICAgICAgICAgICAgICAgfHwgcHJpbWl0aXZlSGFzT3duUHJvcGVydHkoaW50ZXJtZWRpYXRlVmFsdWUsIG5hbWVzW2luZGV4XSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVmFsdWUgPSBpbnRlcm1lZGlhdGVWYWx1ZVtuYW1lc1tpbmRleCsrXV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVybWVkaWF0ZVZhbHVlID0gY29udGV4dC52aWV3W25hbWVdO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogT25seSBjaGVja2luZyBhZ2FpbnN0IGBoYXNQcm9wZXJ0eWAsIHdoaWNoIGFsd2F5cyByZXR1cm5zIGBmYWxzZWAgaWZcbiAgICAgICAgICAgKiBgY29udGV4dC52aWV3YCBpcyBub3QgYW4gb2JqZWN0LiBEZWxpYmVyYXRlbHkgb21pdHRpbmcgdGhlIGNoZWNrXG4gICAgICAgICAgICogYWdhaW5zdCBgcHJpbWl0aXZlSGFzT3duUHJvcGVydHlgIGlmIGRvdCBub3RhdGlvbiBpcyBub3QgdXNlZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZTpcbiAgICAgICAgICAgKiBgYGBcbiAgICAgICAgICAgKiBNdXN0YWNoZS5yZW5kZXIoXCJUaGUgbGVuZ3RoIG9mIGEgZm9vdGJhbGwgZmllbGQgaXMge3sjbGVuZ3RofX17e2xlbmd0aH19e3svbGVuZ3RofX0uXCIsIHtsZW5ndGg6IFwiMTAwIHlhcmRzXCJ9KVxuICAgICAgICAgICAqIGBgYFxuICAgICAgICAgICAqXG4gICAgICAgICAgICogSWYgd2Ugd2VyZSB0byBjaGVjayBhbHNvIGFnYWluc3QgYHByaW1pdGl2ZUhhc093blByb3BlcnR5YCwgYXMgd2UgZG9cbiAgICAgICAgICAgKiBpbiB0aGUgZG90IG5vdGF0aW9uIGNhc2UsIHRoZW4gcmVuZGVyIGNhbGwgd291bGQgcmV0dXJuOlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogXCJUaGUgbGVuZ3RoIG9mIGEgZm9vdGJhbGwgZmllbGQgaXMgOS5cIlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogcmF0aGVyIHRoYW4gdGhlIGV4cGVjdGVkOlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogXCJUaGUgbGVuZ3RoIG9mIGEgZm9vdGJhbGwgZmllbGQgaXMgMTAwIHlhcmRzLlwiXG4gICAgICAgICAgICoqL1xuICAgICAgICAgIGxvb2t1cEhpdCA9IGhhc1Byb3BlcnR5KGNvbnRleHQudmlldywgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9va3VwSGl0KSB7XG4gICAgICAgICAgdmFsdWUgPSBpbnRlcm1lZGlhdGVWYWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnBhcmVudDtcbiAgICAgIH1cblxuICAgICAgY2FjaGVbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpXG4gICAgICB2YWx1ZSA9IHZhbHVlLmNhbGwodGhpcy52aWV3KTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQSBXcml0ZXIga25vd3MgaG93IHRvIHRha2UgYSBzdHJlYW0gb2YgdG9rZW5zIGFuZCByZW5kZXIgdGhlbSB0byBhXG4gICAqIHN0cmluZywgZ2l2ZW4gYSBjb250ZXh0LiBJdCBhbHNvIG1haW50YWlucyBhIGNhY2hlIG9mIHRlbXBsYXRlcyB0b1xuICAgKiBhdm9pZCB0aGUgbmVlZCB0byBwYXJzZSB0aGUgc2FtZSB0ZW1wbGF0ZSB0d2ljZS5cbiAgICovXG4gIGZ1bmN0aW9uIFdyaXRlciAoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZUNhY2hlID0ge1xuICAgICAgX2NhY2hlOiB7fSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0IChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtrZXldO1xuICAgICAgfSxcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgaW4gdGhpcyB3cml0ZXIuXG4gICAqL1xuICBXcml0ZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiBjbGVhckNhY2hlICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudGVtcGxhdGVDYWNoZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVDYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUGFyc2VzIGFuZCBjYWNoZXMgdGhlIGdpdmVuIGB0ZW1wbGF0ZWAgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBgdGFnc2Agb3JcbiAgICogYG11c3RhY2hlLnRhZ3NgIGlmIGB0YWdzYCBpcyBvbWl0dGVkLCAgYW5kIHJldHVybnMgdGhlIGFycmF5IG9mIHRva2Vuc1xuICAgKiB0aGF0IGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBwYXJzZS5cbiAgICovXG4gIFdyaXRlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiBwYXJzZSAodGVtcGxhdGUsIHRhZ3MpIHtcbiAgICB2YXIgY2FjaGUgPSB0aGlzLnRlbXBsYXRlQ2FjaGU7XG4gICAgdmFyIGNhY2hlS2V5ID0gdGVtcGxhdGUgKyAnOicgKyAodGFncyB8fCBtdXN0YWNoZS50YWdzKS5qb2luKCc6Jyk7XG4gICAgdmFyIGlzQ2FjaGVFbmFibGVkID0gdHlwZW9mIGNhY2hlICE9PSAndW5kZWZpbmVkJztcbiAgICB2YXIgdG9rZW5zID0gaXNDYWNoZUVuYWJsZWQgPyBjYWNoZS5nZXQoY2FjaGVLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRva2VucyA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRva2VucyA9IHBhcnNlVGVtcGxhdGUodGVtcGxhdGUsIHRhZ3MpO1xuICAgICAgaXNDYWNoZUVuYWJsZWQgJiYgY2FjaGUuc2V0KGNhY2hlS2V5LCB0b2tlbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWdoLWxldmVsIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBnaXZlbiBgdGVtcGxhdGVgIHdpdGhcbiAgICogdGhlIGdpdmVuIGB2aWV3YC5cbiAgICpcbiAgICogVGhlIG9wdGlvbmFsIGBwYXJ0aWFsc2AgYXJndW1lbnQgbWF5IGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZVxuICAgKiBuYW1lcyBhbmQgdGVtcGxhdGVzIG9mIHBhcnRpYWxzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHRlbXBsYXRlLiBJdCBtYXlcbiAgICogYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBsb2FkIHBhcnRpYWwgdGVtcGxhdGVzIG9uIHRoZSBmbHlcbiAgICogdGhhdCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudDogdGhlIG5hbWUgb2YgdGhlIHBhcnRpYWwuXG4gICAqXG4gICAqIElmIHRoZSBvcHRpb25hbCBgdGFnc2AgYXJndW1lbnQgaXMgZ2l2ZW4gaGVyZSBpdCBtdXN0IGJlIGFuIGFycmF5IHdpdGggdHdvXG4gICAqIHN0cmluZyB2YWx1ZXM6IHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgdXNlZCBpbiB0aGUgdGVtcGxhdGUgKGUuZy5cbiAgICogWyBcIjwlXCIsIFwiJT5cIiBdKS4gVGhlIGRlZmF1bHQgaXMgdG8gbXVzdGFjaGUudGFncy5cbiAgICovXG4gIFdyaXRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyICh0ZW1wbGF0ZSwgdmlldywgcGFydGlhbHMsIHRhZ3MpIHtcbiAgICB2YXIgdG9rZW5zID0gdGhpcy5wYXJzZSh0ZW1wbGF0ZSwgdGFncyk7XG4gICAgdmFyIGNvbnRleHQgPSAodmlldyBpbnN0YW5jZW9mIENvbnRleHQpID8gdmlldyA6IG5ldyBDb250ZXh0KHZpZXcsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyVG9rZW5zKHRva2VucywgY29udGV4dCwgcGFydGlhbHMsIHRlbXBsYXRlLCB0YWdzKTtcbiAgfTtcblxuICAvKipcbiAgICogTG93LWxldmVsIG1ldGhvZCB0aGF0IHJlbmRlcnMgdGhlIGdpdmVuIGFycmF5IG9mIGB0b2tlbnNgIHVzaW5nXG4gICAqIHRoZSBnaXZlbiBgY29udGV4dGAgYW5kIGBwYXJ0aWFsc2AuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBgb3JpZ2luYWxUZW1wbGF0ZWAgaXMgb25seSBldmVyIHVzZWQgdG8gZXh0cmFjdCB0aGUgcG9ydGlvblxuICAgKiBvZiB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdGhhdCB3YXMgY29udGFpbmVkIGluIGEgaGlnaGVyLW9yZGVyIHNlY3Rpb24uXG4gICAqIElmIHRoZSB0ZW1wbGF0ZSBkb2Vzbid0IHVzZSBoaWdoZXItb3JkZXIgc2VjdGlvbnMsIHRoaXMgYXJndW1lbnQgbWF5XG4gICAqIGJlIG9taXR0ZWQuXG4gICAqL1xuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlclRva2VucyA9IGZ1bmN0aW9uIHJlbmRlclRva2VucyAodG9rZW5zLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSwgdGFncykge1xuICAgIHZhciBidWZmZXIgPSAnJztcblxuICAgIHZhciB0b2tlbiwgc3ltYm9sLCB2YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMCwgbnVtVG9rZW5zID0gdG9rZW5zLmxlbmd0aDsgaSA8IG51bVRva2VuczsgKytpKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgc3ltYm9sID0gdG9rZW5bMF07XG5cbiAgICAgIGlmIChzeW1ib2wgPT09ICcjJykgdmFsdWUgPSB0aGlzLnJlbmRlclNlY3Rpb24odG9rZW4sIGNvbnRleHQsIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlKTtcbiAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gJ14nKSB2YWx1ZSA9IHRoaXMucmVuZGVySW52ZXJ0ZWQodG9rZW4sIGNvbnRleHQsIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlKTtcbiAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gJz4nKSB2YWx1ZSA9IHRoaXMucmVuZGVyUGFydGlhbCh0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIHRhZ3MpO1xuICAgICAgZWxzZSBpZiAoc3ltYm9sID09PSAnJicpIHZhbHVlID0gdGhpcy51bmVzY2FwZWRWYWx1ZSh0b2tlbiwgY29udGV4dCk7XG4gICAgICBlbHNlIGlmIChzeW1ib2wgPT09ICduYW1lJykgdmFsdWUgPSB0aGlzLmVzY2FwZWRWYWx1ZSh0b2tlbiwgY29udGV4dCk7XG4gICAgICBlbHNlIGlmIChzeW1ib2wgPT09ICd0ZXh0JykgdmFsdWUgPSB0aGlzLnJhd1ZhbHVlKHRva2VuKTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGJ1ZmZlciArPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUucmVuZGVyU2VjdGlvbiA9IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb24gKHRva2VuLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYnVmZmVyID0gJyc7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dC5sb29rdXAodG9rZW5bMV0pO1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbmRlciBhbiBhcmJpdHJhcnkgdGVtcGxhdGVcbiAgICAvLyBpbiB0aGUgY3VycmVudCBjb250ZXh0IGJ5IGhpZ2hlci1vcmRlciBzZWN0aW9ucy5cbiAgICBmdW5jdGlvbiBzdWJSZW5kZXIgKHRlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gc2VsZi5yZW5kZXIodGVtcGxhdGUsIGNvbnRleHQsIHBhcnRpYWxzKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAodmFyIGogPSAwLCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaiA8IHZhbHVlTGVuZ3RoOyArK2opIHtcbiAgICAgICAgYnVmZmVyICs9IHRoaXMucmVuZGVyVG9rZW5zKHRva2VuWzRdLCBjb250ZXh0LnB1c2godmFsdWVbal0pLCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYnVmZmVyICs9IHRoaXMucmVuZGVyVG9rZW5zKHRva2VuWzRdLCBjb250ZXh0LnB1c2godmFsdWUpLCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSk7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbFRlbXBsYXRlICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGhpZ2hlci1vcmRlciBzZWN0aW9ucyB3aXRob3V0IHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZScpO1xuXG4gICAgICAvLyBFeHRyYWN0IHRoZSBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zLlxuICAgICAgdmFsdWUgPSB2YWx1ZS5jYWxsKGNvbnRleHQudmlldywgb3JpZ2luYWxUZW1wbGF0ZS5zbGljZSh0b2tlblszXSwgdG9rZW5bNV0pLCBzdWJSZW5kZXIpO1xuXG4gICAgICBpZiAodmFsdWUgIT0gbnVsbClcbiAgICAgICAgYnVmZmVyICs9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgKz0gdGhpcy5yZW5kZXJUb2tlbnModG9rZW5bNF0sIGNvbnRleHQsIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlckludmVydGVkID0gZnVuY3Rpb24gcmVuZGVySW52ZXJ0ZWQgKHRva2VuLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSkge1xuICAgIHZhciB2YWx1ZSA9IGNvbnRleHQubG9va3VwKHRva2VuWzFdKTtcblxuICAgIC8vIFVzZSBKYXZhU2NyaXB0J3MgZGVmaW5pdGlvbiBvZiBmYWxzeS4gSW5jbHVkZSBlbXB0eSBhcnJheXMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5sL211c3RhY2hlLmpzL2lzc3Vlcy8xODZcbiAgICBpZiAoIXZhbHVlIHx8IChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKVxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVG9rZW5zKHRva2VuWzRdLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSk7XG4gIH07XG5cbiAgV3JpdGVyLnByb3RvdHlwZS5pbmRlbnRQYXJ0aWFsID0gZnVuY3Rpb24gaW5kZW50UGFydGlhbCAocGFydGlhbCwgaW5kZW50YXRpb24sIGxpbmVIYXNOb25TcGFjZSkge1xuICAgIHZhciBmaWx0ZXJlZEluZGVudGF0aW9uID0gaW5kZW50YXRpb24ucmVwbGFjZSgvW14gXFx0XS9nLCAnJyk7XG4gICAgdmFyIHBhcnRpYWxCeU5sID0gcGFydGlhbC5zcGxpdCgnXFxuJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0aWFsQnlObC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhcnRpYWxCeU5sW2ldLmxlbmd0aCAmJiAoaSA+IDAgfHwgIWxpbmVIYXNOb25TcGFjZSkpIHtcbiAgICAgICAgcGFydGlhbEJ5TmxbaV0gPSBmaWx0ZXJlZEluZGVudGF0aW9uICsgcGFydGlhbEJ5TmxbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWFsQnlObC5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlclBhcnRpYWwgPSBmdW5jdGlvbiByZW5kZXJQYXJ0aWFsICh0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIHRhZ3MpIHtcbiAgICBpZiAoIXBhcnRpYWxzKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSBpc0Z1bmN0aW9uKHBhcnRpYWxzKSA/IHBhcnRpYWxzKHRva2VuWzFdKSA6IHBhcnRpYWxzW3Rva2VuWzFdXTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIGxpbmVIYXNOb25TcGFjZSA9IHRva2VuWzZdO1xuICAgICAgdmFyIHRhZ0luZGV4ID0gdG9rZW5bNV07XG4gICAgICB2YXIgaW5kZW50YXRpb24gPSB0b2tlbls0XTtcbiAgICAgIHZhciBpbmRlbnRlZFZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGFnSW5kZXggPT0gMCAmJiBpbmRlbnRhdGlvbikge1xuICAgICAgICBpbmRlbnRlZFZhbHVlID0gdGhpcy5pbmRlbnRQYXJ0aWFsKHZhbHVlLCBpbmRlbnRhdGlvbiwgbGluZUhhc05vblNwYWNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRva2Vucyh0aGlzLnBhcnNlKGluZGVudGVkVmFsdWUsIHRhZ3MpLCBjb250ZXh0LCBwYXJ0aWFscywgaW5kZW50ZWRWYWx1ZSwgdGFncyk7XG4gICAgfVxuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUudW5lc2NhcGVkVmFsdWUgPSBmdW5jdGlvbiB1bmVzY2FwZWRWYWx1ZSAodG9rZW4sIGNvbnRleHQpIHtcbiAgICB2YXIgdmFsdWUgPSBjb250ZXh0Lmxvb2t1cCh0b2tlblsxXSk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpXG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgV3JpdGVyLnByb3RvdHlwZS5lc2NhcGVkVmFsdWUgPSBmdW5jdGlvbiBlc2NhcGVkVmFsdWUgKHRva2VuLCBjb250ZXh0KSB7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dC5sb29rdXAodG9rZW5bMV0pO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKVxuICAgICAgcmV0dXJuIG11c3RhY2hlLmVzY2FwZSh2YWx1ZSk7XG4gIH07XG5cbiAgV3JpdGVyLnByb3RvdHlwZS5yYXdWYWx1ZSA9IGZ1bmN0aW9uIHJhd1ZhbHVlICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlblsxXTtcbiAgfTtcblxuICB2YXIgbXVzdGFjaGUgPSB7XG4gICAgbmFtZTogJ211c3RhY2hlLmpzJyxcbiAgICB2ZXJzaW9uOiAnNC4wLjEnLFxuICAgIHRhZ3M6IFsgJ3t7JywgJ319JyBdLFxuICAgIGNsZWFyQ2FjaGU6IHVuZGVmaW5lZCxcbiAgICBlc2NhcGU6IHVuZGVmaW5lZCxcbiAgICBwYXJzZTogdW5kZWZpbmVkLFxuICAgIHJlbmRlcjogdW5kZWZpbmVkLFxuICAgIFNjYW5uZXI6IHVuZGVmaW5lZCxcbiAgICBDb250ZXh0OiB1bmRlZmluZWQsXG4gICAgV3JpdGVyOiB1bmRlZmluZWQsXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5LCBieSBwcm92aWRpbmcgYW5cbiAgICAgKiBvYmplY3Qgd2l0aCBzZXQsIGdldCBhbmQgY2xlYXIgbWV0aG9kcy4gVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRpc2FibGVcbiAgICAgKiB0aGUgY2FjaGUgYnkgc2V0dGluZyBpdCB0byB0aGUgbGl0ZXJhbCBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBzZXQgdGVtcGxhdGVDYWNoZSAoY2FjaGUpIHtcbiAgICAgIGRlZmF1bHRXcml0ZXIudGVtcGxhdGVDYWNoZSA9IGNhY2hlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVmYXVsdCBvciBvdmVycmlkZGVuIGNhY2hpbmcgb2JqZWN0IGZyb20gdGhlIGRlZmF1bHQgd3JpdGVyLlxuICAgICAqL1xuICAgIGdldCB0ZW1wbGF0ZUNhY2hlICgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0V3JpdGVyLnRlbXBsYXRlQ2FjaGU7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFsbCBoaWdoLWxldmVsIG11c3RhY2hlLiogZnVuY3Rpb25zIHVzZSB0aGlzIHdyaXRlci5cbiAgdmFyIGRlZmF1bHRXcml0ZXIgPSBuZXcgV3JpdGVyKCk7XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgY2FjaGVkIHRlbXBsYXRlcyBpbiB0aGUgZGVmYXVsdCB3cml0ZXIuXG4gICAqL1xuICBtdXN0YWNoZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gY2xlYXJDYWNoZSAoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRXcml0ZXIuY2xlYXJDYWNoZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW5kIGNhY2hlcyB0aGUgZ2l2ZW4gdGVtcGxhdGUgaW4gdGhlIGRlZmF1bHQgd3JpdGVyIGFuZCByZXR1cm5zIHRoZVxuICAgKiBhcnJheSBvZiB0b2tlbnMgaXQgY29udGFpbnMuIERvaW5nIHRoaXMgYWhlYWQgb2YgdGltZSBhdm9pZHMgdGhlIG5lZWQgdG9cbiAgICogcGFyc2UgdGVtcGxhdGVzIG9uIHRoZSBmbHkgYXMgdGhleSBhcmUgcmVuZGVyZWQuXG4gICAqL1xuICBtdXN0YWNoZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlICh0ZW1wbGF0ZSwgdGFncykge1xuICAgIHJldHVybiBkZWZhdWx0V3JpdGVyLnBhcnNlKHRlbXBsYXRlLCB0YWdzKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYHRlbXBsYXRlYCB3aXRoIHRoZSBnaXZlbiBgdmlld2AgYW5kIGBwYXJ0aWFsc2AgdXNpbmcgdGhlXG4gICAqIGRlZmF1bHQgd3JpdGVyLiBJZiB0aGUgb3B0aW9uYWwgYHRhZ3NgIGFyZ3VtZW50IGlzIGdpdmVuIGhlcmUgaXQgbXVzdCBiZSBhblxuICAgKiBhcnJheSB3aXRoIHR3byBzdHJpbmcgdmFsdWVzOiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIHVzZWQgaW4gdGhlXG4gICAqIHRlbXBsYXRlIChlLmcuIFsgXCI8JVwiLCBcIiU+XCIgXSkuIFRoZSBkZWZhdWx0IGlzIHRvIG11c3RhY2hlLnRhZ3MuXG4gICAqL1xuICBtdXN0YWNoZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIgKHRlbXBsYXRlLCB2aWV3LCBwYXJ0aWFscywgdGFncykge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHRlbXBsYXRlISBUZW1wbGF0ZSBzaG91bGQgYmUgYSBcInN0cmluZ1wiICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYnV0IFwiJyArIHR5cGVTdHIodGVtcGxhdGUpICsgJ1wiIHdhcyBnaXZlbiBhcyB0aGUgZmlyc3QgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmb3IgbXVzdGFjaGUjcmVuZGVyKHRlbXBsYXRlLCB2aWV3LCBwYXJ0aWFscyknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdFdyaXRlci5yZW5kZXIodGVtcGxhdGUsIHZpZXcsIHBhcnRpYWxzLCB0YWdzKTtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIGVzY2FwaW5nIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIHVzZXIgbWF5IG92ZXJyaWRlIGl0LlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phbmwvbXVzdGFjaGUuanMvaXNzdWVzLzI0NFxuICBtdXN0YWNoZS5lc2NhcGUgPSBlc2NhcGVIdG1sO1xuXG4gIC8vIEV4cG9ydCB0aGVzZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBhbHNvIGZvciBhZHZhbmNlZCB1c2FnZS5cbiAgbXVzdGFjaGUuU2Nhbm5lciA9IFNjYW5uZXI7XG4gIG11c3RhY2hlLkNvbnRleHQgPSBDb250ZXh0O1xuICBtdXN0YWNoZS5Xcml0ZXIgPSBXcml0ZXI7XG5cbiAgcmV0dXJuIG11c3RhY2hlO1xuXG59KSkpO1xuIiwiaW1wb3J0IGJyYW5jaEJhciBmcm9tICcuL21vZHVsZXMvYnJhbmNoLWJhcic7IC8vYnJhbmNoIGJhclxuaW1wb3J0IHF1ZXN0aW9ucyBmcm9tICcuL21vZHVsZXMvcXVlc3Rpb25zJztcbmltcG9ydCBhbmltYXRpb25zIGZyb20gJy4vbW9kdWxlcy9hbmltYXRpb25zJztcblxuLy9Jbml0IGJyYW5jaCBiYXJcbmJyYW5jaEJhci5pbml0KCk7XG5cbi8qKlxuICogU2VuZHMgbG9nb3V0IHJlcXVlc3QgdG8gc2VydmVyLlxuICpcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gTG9nb3V0IGJ1dHRvbiB3aGljaCB3YXMgY2xpY2tlZC5cbiAqL1xuZnVuY3Rpb24gbG9nb3V0KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB4aHIub3BlbignUE9TVCcsICcvc3RhZ2UtYWpheC9sb2dvdXQvJywgdHJ1ZSk7XG4gIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgaWYoeGhyLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGV2ZW50LnRhcmdldC5ocmVmO1xuICAgIH1cbiAgfVxuICB4aHIuc2VuZCgndGhlbWU9JyArIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nb3V0JykpO1xufVxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuXG4gIGNvbnN0IGxvZ291dExpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbG9nb3V0XScpO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgbG9nb3V0TGlua3MubGVuZ3RoOyBpKyspIHtcbiAgICBsb2dvdXRMaW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvZ291dCk7XG4gIH1cblxuICBxdWVzdGlvbnMuaW5pdCgpO1xuICBhbmltYXRpb25zLmluaXQoKTtcblxufSk7XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHBhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFnZV9faW5uZXInKTtcblxuICAgIC8vIEZhZGVPdXRSaWdodCBhbmltYXRpb24gd2hlbiBiYWNrIGxpbmsgaXMgY2xpY2tlZFxuICAgIGNvbnN0IGJhY2tMaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhZ2VfX2JhY2tfbGluaycpO1xuICAgIGlmKGJhY2tMaW5rKSB7XG4gICAgICBiYWNrTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgcGFnZS5jbGFzc0xpc3QucmVtb3ZlKCdhbmltYXRlX19mYWRlSW5MZWZ0Jyk7XG4gICAgICAgIHBhZ2UuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZV9fZmFkZUluUmlnaHQnKTtcbiAgICAgICAgcGFnZS5jbGFzc0xpc3QuYWRkKCdhbmltYXRlX19hbmltYXRlZCcpO1xuICAgICAgICBwYWdlLmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGVfX2ZhZGVPdXRSaWdodCcpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRmFkZU91dExlZnQgYW5pbWF0aW9uIHdoZW4gc3ViamVjdC9xdWVzdGlvbiBsaW5rIGlzIGNsaWNrZWRcbiAgICBjb25zdCBmb3J3YXJkTGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWFpbi1saW5rcyBhLCAucXVlc3Rpb25zIGEnKTtcbiAgICBBcnJheS5mcm9tKGZvcndhcmRMaW5rcykuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHBhZ2UuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZV9fZmFkZUluTGVmdCcpO1xuICAgICAgICBwYWdlLmNsYXNzTGlzdC5yZW1vdmUoJ2FuaW1hdGVfX2ZhZGVJblJpZ2h0Jyk7XG4gICAgICAgIHBhZ2UuY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZV9fYW5pbWF0ZWQnKTtcbiAgICAgICAgcGFnZS5jbGFzc0xpc3QuYWRkKCdhbmltYXRlX19mYWRlT3V0TGVmdCcpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJyYW5jaEJhciA9IHtcbiAgX21pbmlmaWVkQ2xhc3M6ICdicmFuY2gtYmFyLS1taW5pZmllZCcsXG4gIF9oaWRkZW5DbGFzczogJ2JyYW5jaC1iYXItLWhpZGRlbicsXG4gIF9zdG9yYWdlU2V0dGluZ3M6IG51bGwsXG4gIF9mb2xkZXJJZDogbnVsbCxcbiAgX3NldHRpbmdzS2V5OiBudWxsLFxuICBfZG9tOiB7XG4gICAgYmFyOiBudWxsLFxuICAgIHRvZ2dsZXM6IG51bGwsXG4gICAgcGFnZVNlbGVjdHM6IG51bGxcbiAgfSxcbiAgX2lzTG9jYWxTdG9yYWdlRW5hYmxlZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRlc3QgPSAnYnJhbmNoLWJhci10ZXN0JztcblxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBfaXNNaW5pZmllZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbS5iYXIuY2xhc3NOYW1lLnNwbGl0KCcgJykuaW5kZXhPZih0aGlzLl9taW5pZmllZENsYXNzKSA+PSAwO1xuICB9LFxuICBfZ2V0U2V0dGluZ3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZXR0aW5ncyA9IG51bGw7XG5cbiAgICBpZighdGhpcy5faXNMb2NhbFN0b3JhZ2VFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9mb2xkZXJJZCA9IHRoaXMuX2RvbS5iYXIuZ2V0QXR0cmlidXRlKCdkYXRhLWZvbGRlci1pZCcpO1xuICAgIHRoaXMuX3NldHRpbmdzS2V5ID0gJ2JyYW5jaC1iYXItLScgKyB0aGlzLl9mb2xkZXJJZDtcbiAgICBpZih0aGlzLl9zZXR0aW5nc0tleSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX3NldHRpbmdzS2V5KSk7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncztcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH0sXG4gIF91cGRhdGVTZXR0aW5nczogZnVuY3Rpb24oKSB7XG4gICAgaWYoIXRoaXMuX2lzTG9jYWxTdG9yYWdlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYoIXRoaXMuX3N0b3JhZ2VTZXR0aW5ncykge1xuICAgICAgdGhpcy5fc3RvcmFnZVNldHRpbmdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmFnZVNldHRpbmdzLm1pbmlmaWVkID0gdGhpcy5faXNNaW5pZmllZCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuX3NldHRpbmdzS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLl9zdG9yYWdlU2V0dGluZ3MpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgX3RvZ2dsZU1pbmlmaWVkOiBmdW5jdGlvbigpIHtcbiAgICBpZih0aGlzLl9pc01pbmlmaWVkKCkpIHtcbiAgICAgIHZhciByZWcgPSBuZXcgUmVnRXhwKCcoXFxcXHN8XiknICsgdGhpcy5fbWluaWZpZWRDbGFzcyArICcoXFxcXHN8JCknKTtcbiAgICAgIHRoaXMuX2RvbS5iYXIuY2xhc3NOYW1lID0gdGhpcy5fZG9tLmJhci5jbGFzc05hbWUucmVwbGFjZShyZWcsICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RvbS5iYXIuY2xhc3NOYW1lICs9ICcgJyArIHRoaXMuX21pbmlmaWVkQ2xhc3M7XG4gICAgfVxuICB9LFxuICBfaW5pdFRvZ2dsZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuX2RvbS50b2dnbGVzID0gdGhpcy5fZG9tLmJhci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy1icmFuY2gtYmFyX190b2dnbGUnKTtcblxuICAgIGZvcih2YXIgaSA9IDAsIGwgPSB0aGlzLl9kb20udG9nZ2xlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXMuX2RvbS50b2dnbGVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3RvZ2dsZU1pbmlmaWVkKCk7XG4gICAgICAgIHNlbGYuX3VwZGF0ZVNldHRpbmdzKCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuICB9LFxuICBfaW5pdFBhZ2VTZWxlY3RzOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9kb20ucGFnZVNlbGVjdHMgPSB0aGlzLl9kb20uYmFyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2pzLWJyYW5jaC1iYXJfX3BhZ2Utc2VsZWN0Jyk7XG5cbiAgICBmb3IodmFyIGkgPSAwLCBsID0gdGhpcy5fZG9tLnBhZ2VTZWxlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpcy5fZG9tLnBhZ2VTZWxlY3RzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHZhbCA9IGUudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmKHZhbCkge1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuICB9LFxuICBfc2hvd0JhcjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoJyhcXFxcc3xeKScgKyB0aGlzLl9oaWRkZW5DbGFzcyArICcoXFxcXHN8JCknKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLl9kb20uYmFyLmNsYXNzTmFtZSA9IHNlbGYuX2RvbS5iYXIuY2xhc3NOYW1lLnJlcGxhY2UocmVnLCAnICcpO1xuICB9LFxuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB0aGF0Ll9kb20uYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLWJyYW5jaC1iYXInKTsgLy8gQXNzdW1lcyBvbmx5IG9uZSBiYXIgcGVyIHBhZ2VcblxuICAgICAgaWYodGhhdC5fZG9tLmJhcikge1xuICAgICAgICB0aGF0Ll9zdG9yYWdlU2V0dGluZ3MgPSB0aGF0Ll9nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8vIElmIHVzZXIgbGVmdCB0aGUgYmFyIG9wZW5cbiAgICAgICAgaWYodGhhdC5fc3RvcmFnZVNldHRpbmdzICYmICF0aGF0Ll9zdG9yYWdlU2V0dGluZ3MubWluaWZpZWQpIHtcbiAgICAgICAgICB0aGF0Ll90b2dnbGVNaW5pZmllZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdC5faW5pdFRvZ2dsZXMoKTtcbiAgICAgICAgdGhhdC5faW5pdFBhZ2VTZWxlY3RzKCk7XG5cbiAgICAgICAgdGhhdC5fc2hvd0JhcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJyYW5jaEJhcjtcbiIsImltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5cbmNvbnN0IHF1ZXN0aW9uID0ge1xuICBfZGF0YTogbnVsbCxcbiAgX3RlbXBsYXRlOiBudWxsLFxuICBfZWw6IHtcbiAgICBxdWVzdGlvbjogbnVsbCxcbiAgICByZXN1bHQ6IG51bGxcbiAgfSxcbiAgX3N0YXRlOiB7XG4gICAgcXVlc3Rpb246IGZhbHNlLFxuICAgIGNob2ljZXM6IFtdLFxuICAgIHJlc3VsdDogJydcbiAgfSxcblxuICAvKipcbiAgICogUmVuZGVycyBxdWVzdGlvbiB0ZW1wbGF0ZS5cbiAgICovXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZWwucXVlc3Rpb24uaW5uZXJIVE1MID0gTXVzdGFjaGUucmVuZGVyKHRoaXMuX3RlbXBsYXRlLCB0aGlzLl9zdGF0ZSk7XG5cbiAgICAvLyBBZGQgbGlzdGVuZXJzXG4gICAgQXJyYXkuZnJvbSh0aGlzLl9lbC5xdWVzdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wcmludF0nKSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgd2luZG93LnByaW50KCkgfSk7XG4gICAgfSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLl9lbC5xdWVzdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1xdWVzdGlvbl0nKSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgdGhpcy5hbnN3ZXIoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXF1ZXN0aW9uJyksIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1hbnN3ZXInKSkgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBxdWVzdGlvbiBmcm9tIGhpZXJhcmNoaWNhbCBxdWVzdGlvbiBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgUXVlc3Rpb24gaWQgdG8gZmluZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgSGllcmFyY2hpY2FsIHF1ZXN0aW9uIGRhdGEuXG4gICAqIEByZXR1cm4ge09iamVjdHxudWxsfSBRdWVzdGlvbiBkYXRhIG9yIG51bGwgaWYgcXVlc3Rpb24gd2l0aCBnaXZlbiBpZCBkb2VzIG5vdCBleGlzdC5cbiAgICovXG4gIGZpbmRRdWVzdGlvbjogZnVuY3Rpb24oaWQsIGRhdGEpIHtcbiAgICBpZihpZCA9PT0gZGF0YS5pZCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgbGV0IHF1ZXN0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGZpbmRSZWN1cnNpdmUgPSAoaXRlbXMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICBpZihyZXN1bHQpIHtcbiAgICAgICAgcXVlc3Rpb24gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBpZihpdGVtLmNob2ljZXMgJiYgaXRlbS5jaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpbmRSZWN1cnNpdmUoaXRlbS5jaG9pY2VzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgZmluZFJlY3Vyc2l2ZShkYXRhLmNob2ljZXMpO1xuXG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGFuc3dlciB0byBnaXZlbiBxdWVzdGlvbiBhbmQgcmVuZGVycyBxdWVzdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXN0aW9uSWQgUXVlc3Rpb24gdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYW5zd2VySWQgQW5zd2VyIGZvciBnaXZlbiBxdWVzdGlvbi4gSWYgZW1wdHksIHJlbW92ZXMgYW5zd2VyIGZvciBnaXZlbiBxdWVzdGlvbi5cbiAgICovXG4gIGFuc3dlcjogZnVuY3Rpb24ocXVlc3Rpb25JZCwgYW5zd2VySWQpIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IHRoaXMuZmluZFF1ZXN0aW9uKHF1ZXN0aW9uSWQsIHRoaXMuX2RhdGEpO1xuICAgIGlmKCFxdWVzdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHF1ZXN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYW5zd2VyZWQsIHJlbW92ZSBhbnN3ZXIgYW5kIGFsbCBzdWJzZXF1ZW50IGFuc3dlcnNcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3N0YXRlLmNob2ljZXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5xdWVzdGlvbklkID09PSBxdWVzdGlvbklkKTtcbiAgICBpZihpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9zdGF0ZS5jaG9pY2VzLnNwbGljZShpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG5ldyBhbnN3ZXJcbiAgICBjb25zdCBhbnN3ZXIgPSBxdWVzdGlvbi5jaG9pY2VzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBhbnN3ZXJJZCk7XG4gICAgaWYoYW5zd2VyKSB7XG4gICAgICB0aGlzLl9zdGF0ZS5jaG9pY2VzLnB1c2goeyBxdWVzdGlvbklkOiBxdWVzdGlvbklkLCBhbnN3ZXJJZDogYW5zd2VySWQsIHF1ZXN0aW9uOiBxdWVzdGlvbi5xdWVzdGlvbiwgYW5zd2VyOiBhbnN3ZXIuYW5zd2VyIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjdXJyZW50bHkgYWN0aXZlIHF1ZXN0aW9uIG9yIHJlc3VsdFxuICAgIGNvbnN0IG5leHRRdWVzdGlvbiA9IGFuc3dlciB8fCBxdWVzdGlvbjtcbiAgICBpZihuZXh0UXVlc3Rpb24uY2hvaWNlcyAmJiBuZXh0UXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zdGF0ZS5yZXN1bHQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3N0YXRlLnF1ZXN0aW9uID0ge1xuICAgICAgICB0ZXh0OiBuZXh0UXVlc3Rpb24ucXVlc3Rpb24sXG4gICAgICAgIGNob2ljZXM6IG5leHRRdWVzdGlvbi5jaG9pY2VzLm1hcChjaG9pY2UgPT4gKHsgcXVlc3Rpb25JZDogbmV4dFF1ZXN0aW9uLmlkLCBhbnN3ZXJJZDogY2hvaWNlLmlkLCBhbnN3ZXI6IGNob2ljZS5hbnN3ZXIgfSkpLFxuICAgICAgICBhbmltYXRlUXVlc3Rpb246ICEhYW5zd2VySWRcbiAgICAgIH07XG4gICAgICB0aGlzLl9lbC5yZXN1bHQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXRlLnJlc3VsdCA9IG5leHRRdWVzdGlvbi5yZXN1bHQ7XG4gICAgICB0aGlzLl9zdGF0ZS5xdWVzdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWwucmVzdWx0LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHF1ZXN0aW9uIGxvZ2ljLlxuICAgKi9cbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZGF0YSA9IHdpbmRvdy5xdWVzdGlvbkRhdGE7XG4gICAgdGhpcy5fdGVtcGxhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG1wbC1xdWVzdGlvbnMnKTtcbiAgICB0aGlzLl90ZW1wbGF0ZSA9IHRoaXMuX3RlbXBsYXRlID8gdGhpcy5fdGVtcGxhdGUuaW5uZXJIVE1MIDogJyc7XG4gICAgdGhpcy5fZWwucXVlc3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVlc3Rpb24nKTtcbiAgICB0aGlzLl9lbC5yZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVlc3Rpb24tcmVzdWx0Jyk7XG4gICAgaWYodGhpcy5fZGF0YSAmJiB0aGlzLl90ZW1wbGF0ZSAmJiB0aGlzLl9lbC5xdWVzdGlvbiAmJiB0aGlzLl9lbC5yZXN1bHQpIHtcbiAgICAgIHRoaXMuYW5zd2VyKHRoaXMuX2RhdGEuaWQpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgcXVlc3Rpb247XG4iXX0="}