{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/array.prototype.flatmap/implementation.js","node_modules/array.prototype.flatmap/index.js","node_modules/array.prototype.flatmap/polyfill.js","node_modules/array.prototype.flatmap/shim.js","node_modules/babel-runtime/core-js/array/from.js","node_modules/babel-runtime/core-js/get-iterator.js","node_modules/babel-runtime/core-js/json/stringify.js","node_modules/babel-runtime/core-js/math/sign.js","node_modules/babel-runtime/core-js/number/is-nan.js","node_modules/babel-runtime/core-js/object/assign.js","node_modules/babel-runtime/core-js/object/define-property.js","node_modules/babel-runtime/core-js/object/entries.js","node_modules/babel-runtime/helpers/classCallCheck.js","node_modules/babel-runtime/helpers/createClass.js","node_modules/browser-resolve/empty.js","node_modules/core-js/library/fn/array/from.js","node_modules/core-js/library/fn/get-iterator.js","node_modules/core-js/library/fn/json/stringify.js","node_modules/core-js/library/fn/math/sign.js","node_modules/core-js/library/fn/number/is-nan.js","node_modules/core-js/library/fn/object/assign.js","node_modules/core-js/library/fn/object/define-property.js","node_modules/core-js/library/fn/object/entries.js","node_modules/core-js/library/modules/_a-function.js","node_modules/core-js/library/modules/_add-to-unscopables.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/_iter-step.js","node_modules/core-js/library/modules/_iterators.js","node_modules/core-js/library/modules/_library.js","node_modules/core-js/library/modules/_math-sign.js","node_modules/core-js/library/modules/_object-assign.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-gops.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/_object-pie.js","node_modules/core-js/library/modules/_object-to-array.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/core.get-iterator.js","node_modules/core-js/library/modules/es6.array.from.js","node_modules/core-js/library/modules/es6.array.iterator.js","node_modules/core-js/library/modules/es6.math.sign.js","node_modules/core-js/library/modules/es6.number.is-nan.js","node_modules/core-js/library/modules/es6.object.assign.js","node_modules/core-js/library/modules/es6.object.define-property.js","node_modules/core-js/library/modules/es6.string.iterator.js","node_modules/core-js/library/modules/es7.object.entries.js","node_modules/core-js/library/modules/web.dom.iterable.js","node_modules/define-properties/index.js","node_modules/define-properties/node_modules/object-keys/implementation.js","node_modules/define-properties/node_modules/object-keys/index.js","node_modules/define-properties/node_modules/object-keys/isArguments.js","node_modules/es-abstract/GetIntrinsic.js","node_modules/es-abstract/es2015.js","node_modules/es-abstract/es2016.js","node_modules/es-abstract/es2017.js","node_modules/es-abstract/es2018.js","node_modules/es-abstract/es2019.js","node_modules/es-abstract/es5.js","node_modules/es-abstract/helpers/assertRecord.js","node_modules/es-abstract/helpers/assign.js","node_modules/es-abstract/helpers/callBind.js","node_modules/es-abstract/helpers/callBound.js","node_modules/es-abstract/helpers/every.js","node_modules/es-abstract/helpers/forEach.js","node_modules/es-abstract/helpers/getInferredName.js","node_modules/es-abstract/helpers/getIteratorMethod.js","node_modules/es-abstract/helpers/getProto.js","node_modules/es-abstract/helpers/getSymbolDescription.js","node_modules/es-abstract/helpers/isFinite.js","node_modules/es-abstract/helpers/isNaN.js","node_modules/es-abstract/helpers/isPrefixOf.js","node_modules/es-abstract/helpers/isPrimitive.js","node_modules/es-abstract/helpers/isPropertyDescriptor.js","node_modules/es-abstract/helpers/isSamePropertyDescriptor.js","node_modules/es-abstract/helpers/maxSafeInteger.js","node_modules/es-abstract/helpers/mod.js","node_modules/es-abstract/helpers/regexTester.js","node_modules/es-abstract/helpers/setProto.js","node_modules/es-abstract/helpers/sign.js","node_modules/es-to-primitive/es2015.js","node_modules/es-to-primitive/es5.js","node_modules/es-to-primitive/es6.js","node_modules/es-to-primitive/helpers/isPrimitive.js","node_modules/eve/eve.js","node_modules/function-bind/implementation.js","node_modules/function-bind/index.js","node_modules/hammerjs/hammer.js","node_modules/has-symbols/index.js","node_modules/has-symbols/shams.js","node_modules/has/src/index.js","node_modules/is-callable/index.js","node_modules/is-date-object/index.js","node_modules/is-regex/index.js","node_modules/is-symbol/index.js","node_modules/object-inspect/index.js","node_modules/snapsvg/dist/snap.svg.js","node_modules/string.prototype.trimleft/implementation.js","node_modules/string.prototype.trimleft/index.js","node_modules/string.prototype.trimleft/polyfill.js","node_modules/string.prototype.trimleft/shim.js","node_modules/string.prototype.trimright/implementation.js","node_modules/string.prototype.trimright/polyfill.js","node_modules/string.prototype.trimright/shim.js","src/js/master.js","src/js/modules/aklsummit-vis.js","src/js/modules/branch-bar.js","src/js/modules/cruxMeters.js","src/js/modules/debounce.js","src/js/modules/focus-outline-detect.js","src/js/modules/hubspotForm.js"],"names":[],"mappings":"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","file":"akl-summit.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 1) {\n\t\tT = arguments[1];\n\t}\n\n\tvar A = ES.ArraySpeciesCreate(O, 0);\n\tES.FlattenIntoArray(A, O, sourceLen, 0, 1, mapperFunction, T);\n\treturn A;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar bind = require('function-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar polyfill = getPolyfill();\nvar shim = require('./shim');\n\nvar boundFlatMap = bind.call(Function.call, polyfill);\n\ndefine(boundFlatMap, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = boundFlatMap;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn Array.prototype.flatMap || implementation;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimFlatMap() {\n\tvar polyfill = getPolyfill();\n\tdefine(\n\t\tArray.prototype,\n\t\t{ flatMap: polyfill },\n\t\t{ flatMap: function () { return Array.prototype.flatMap !== polyfill; } }\n\t);\n\treturn polyfill;\n};\n","module.exports = { \"default\": require(\"core-js/library/fn/array/from\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/get-iterator\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/json/stringify\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/math/sign\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/number/is-nan\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/object/define-property\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/object/entries\"), __esModule: true };","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};","\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();","\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVtcHR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJmaWxlIjoib3V0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIl19","require('../../modules/es6.string.iterator');\nrequire('../../modules/es6.array.from');\nmodule.exports = require('../../modules/_core').Array.from;\n","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n","var core = require('../../modules/_core');\nvar $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });\nmodule.exports = function stringify(it) { // eslint-disable-line no-unused-vars\n return $JSON.stringify.apply($JSON, arguments);\n};\n","require('../../modules/es6.math.sign');\nmodule.exports = require('../../modules/_core').Math.sign;\n","require('../../modules/es6.number.is-nan');\nmodule.exports = require('../../modules/_core').Number.isNaN;\n","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc) {\n return $Object.defineProperty(it, key, desc);\n};\n","require('../../modules/es7.object.entries');\nmodule.exports = require('../../modules/_core').Object.entries;\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","module.exports = function () { /* empty */ };\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// false -> 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.6.9' };\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 = function (done, value) {\n return { value: value, done: !!done };\n};\n","module.exports = {};\n","module.exports = true;\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\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","exports.f = Object.getOwnPropertySymbols;\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","exports.f = {}.propertyIsEnumerable;\n","var DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || isEnum.call(O, key)) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\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 core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\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","var anObject = require('./_an-object');\nvar get = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function (it) {\n var iterFn = get(it);\n if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');\n return anObject(iterFn.call(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 addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\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","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","require('./es6.array.iterator');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar TO_STRING_TAG = require('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n","'use strict';\n\nvar keys = require('object-keys');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\torigDefineProperty(obj, 'x', { enumerable: false, value: obj });\n\t\t// eslint-disable-next-line no-unused-vars, no-restricted-syntax\n\t\tfor (var _ in obj) { // jscs:ignore disallowUnusedVariables\n\t\t\treturn false;\n\t\t}\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","'use strict';\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = require('./isArguments'); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n","'use strict';\n\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","'use strict';\n\n/* globals\n\tAtomics,\n\tSharedArrayBuffer,\n*/\n\nvar undefined; // eslint-disable-line no-shadow-restricted-names\n\nvar $TypeError = TypeError;\n\nvar ThrowTypeError = Object.getOwnPropertyDescriptor\n\t? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())\n\t: function () { throw new $TypeError(); };\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar generator; // = function * () {};\nvar generatorFunction = generator ? getProto(generator) : undefined;\nvar asyncFn; // async function() {};\nvar asyncFunction = asyncFn ? asyncFn.constructor : undefined;\nvar asyncGen; // async function * () {};\nvar asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;\nvar asyncGenIterator = asyncGen ? asyncGen() : undefined;\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'$ %Array%': Array,\n\t'$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,\n\t'$ %ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'$ %ArrayPrototype%': Array.prototype,\n\t'$ %ArrayProto_entries%': Array.prototype.entries,\n\t'$ %ArrayProto_forEach%': Array.prototype.forEach,\n\t'$ %ArrayProto_keys%': Array.prototype.keys,\n\t'$ %ArrayProto_values%': Array.prototype.values,\n\t'$ %AsyncFromSyncIteratorPrototype%': undefined,\n\t'$ %AsyncFunction%': asyncFunction,\n\t'$ %AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,\n\t'$ %AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,\n\t'$ %AsyncGeneratorFunction%': asyncGenFunction,\n\t'$ %AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,\n\t'$ %AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,\n\t'$ %Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'$ %Boolean%': Boolean,\n\t'$ %BooleanPrototype%': Boolean.prototype,\n\t'$ %DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,\n\t'$ %Date%': Date,\n\t'$ %DatePrototype%': Date.prototype,\n\t'$ %decodeURI%': decodeURI,\n\t'$ %decodeURIComponent%': decodeURIComponent,\n\t'$ %encodeURI%': encodeURI,\n\t'$ %encodeURIComponent%': encodeURIComponent,\n\t'$ %Error%': Error,\n\t'$ %ErrorPrototype%': Error.prototype,\n\t'$ %eval%': eval, // eslint-disable-line no-eval\n\t'$ %EvalError%': EvalError,\n\t'$ %EvalErrorPrototype%': EvalError.prototype,\n\t'$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,\n\t'$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,\n\t'$ %Function%': Function,\n\t'$ %FunctionPrototype%': Function.prototype,\n\t'$ %Generator%': generator ? getProto(generator()) : undefined,\n\t'$ %GeneratorFunction%': generatorFunction,\n\t'$ %GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,\n\t'$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,\n\t'$ %isFinite%': isFinite,\n\t'$ %isNaN%': isNaN,\n\t'$ %IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'$ %JSON%': JSON,\n\t'$ %JSONParse%': JSON.parse,\n\t'$ %Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'$ %MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,\n\t'$ %Math%': Math,\n\t'$ %Number%': Number,\n\t'$ %NumberPrototype%': Number.prototype,\n\t'$ %Object%': Object,\n\t'$ %ObjectPrototype%': Object.prototype,\n\t'$ %ObjProto_toString%': Object.prototype.toString,\n\t'$ %ObjProto_valueOf%': Object.prototype.valueOf,\n\t'$ %parseFloat%': parseFloat,\n\t'$ %parseInt%': parseInt,\n\t'$ %Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,\n\t'$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,\n\t'$ %Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,\n\t'$ %Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,\n\t'$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,\n\t'$ %Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'$ %RangeError%': RangeError,\n\t'$ %RangeErrorPrototype%': RangeError.prototype,\n\t'$ %ReferenceError%': ReferenceError,\n\t'$ %ReferenceErrorPrototype%': ReferenceError.prototype,\n\t'$ %Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'$ %RegExp%': RegExp,\n\t'$ %RegExpPrototype%': RegExp.prototype,\n\t'$ %Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'$ %SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,\n\t'$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,\n\t'$ %String%': String,\n\t'$ %StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'$ %StringPrototype%': String.prototype,\n\t'$ %Symbol%': hasSymbols ? Symbol : undefined,\n\t'$ %SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,\n\t'$ %SyntaxError%': SyntaxError,\n\t'$ %SyntaxErrorPrototype%': SyntaxError.prototype,\n\t'$ %ThrowTypeError%': ThrowTypeError,\n\t'$ %TypedArray%': TypedArray,\n\t'$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,\n\t'$ %TypeError%': $TypeError,\n\t'$ %TypeErrorPrototype%': $TypeError.prototype,\n\t'$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,\n\t'$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,\n\t'$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,\n\t'$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,\n\t'$ %URIError%': URIError,\n\t'$ %URIErrorPrototype%': URIError.prototype,\n\t'$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,\n\t'$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\t'$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype\n};\n\nvar bind = require('function-bind');\nvar $replace = bind.call(Function.call, String.prototype.replace);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match);\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar key = '$ ' + name;\n\tif (!(key in INTRINSICS)) {\n\t\tthrow new SyntaxError('intrinsic ' + name + ' does not exist!');\n\t}\n\n\t// istanbul ignore if // hopefully this is impossible to test :-)\n\tif (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {\n\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t}\n\n\treturn INTRINSICS[key];\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\n\tif (parts.length === 0) {\n\t\treturn getBaseIntrinsic(name, allowMissing);\n\t}\n\n\tvar value = getBaseIntrinsic('%' + parts[0] + '%', allowMissing);\n\tfor (var i = 1; i < parts.length; i += 1) {\n\t\tif (value != null) {\n\t\t\tvalue = value[parts[i]];\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar has = require('has');\nvar toPrimitive = require('es-to-primitive/es6');\nvar keys = require('object-keys');\nvar inspect = require('object-inspect');\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $RangeError = GetIntrinsic('%RangeError%');\nvar $SyntaxError = GetIntrinsic('%SyntaxError%');\nvar $Array = GetIntrinsic('%Array%');\nvar $ArrayPrototype = $Array.prototype;\nvar $String = GetIntrinsic('%String%');\nvar $Object = GetIntrinsic('%Object%');\nvar $Number = GetIntrinsic('%Number%');\nvar $Symbol = GetIntrinsic('%Symbol%', true);\nvar $RegExp = GetIntrinsic('%RegExp%');\nvar $Date = GetIntrinsic('%Date%');\nvar $Function = GetIntrinsic('%Function%');\nvar $preventExtensions = $Object.preventExtensions;\n\nvar hasSymbols = require('has-symbols')();\n\nvar assertRecord = require('./helpers/assertRecord');\nvar $isNaN = require('./helpers/isNaN');\nvar $isFinite = require('./helpers/isFinite');\nvar MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;\nvar MAX_SAFE_INTEGER = require('./helpers/maxSafeInteger');\n\nvar assign = require('./helpers/assign');\nvar sign = require('./helpers/sign');\nvar mod = require('./helpers/mod');\nvar isPrimitive = require('./helpers/isPrimitive');\nvar forEach = require('./helpers/forEach');\nvar every = require('./helpers/every');\nvar isSamePropertyDescriptor = require('./helpers/isSamePropertyDescriptor');\nvar isPropertyDescriptor = require('./helpers/isPropertyDescriptor');\nvar parseInteger = parseInt;\nvar callBound = require('./helpers/callBound');\nvar regexTester = require('./helpers/regexTester');\nvar getIteratorMethod = require('./helpers/getIteratorMethod');\nvar getSymbolDescription = require('./helpers/getSymbolDescription');\n\nvar $PromiseThen = callBound('Promise.prototype.then', true);\nvar arraySlice = callBound('Array.prototype.slice');\nvar strSlice = callBound('String.prototype.slice');\nvar $indexOf = callBound('Array.prototype.indexOf');\nvar $push = callBound('Array.prototype.push');\n\nvar isBinary = regexTester(/^0b[01]+$/i);\nvar isOctal = regexTester(/^0o[0-7]+$/i);\nvar isDigit = regexTester(/^[0-9]$/);\nvar regexExec = callBound('RegExp.prototype.exec');\nvar nonWS = ['\\u0085', '\\u200b', '\\ufffe'].join('');\nvar nonWSregex = new $RegExp('[' + nonWS + ']', 'g');\nvar hasNonWS = regexTester(nonWSregex);\nvar isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);\nvar $charCodeAt = callBound('String.prototype.charCodeAt');\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\n\nvar toStr = callBound('Object.prototype.toString');\n\nvar $NumberValueOf = callBound('Number.prototype.valueOf');\nvar $BooleanValueOf = callBound('Boolean.prototype.valueOf');\nvar $StringValueOf = callBound('String.prototype.valueOf');\nvar $DateValueOf = callBound('Date.prototype.valueOf');\nvar $SymbolToString = callBound('Symbol.prototype.toString', true);\n\nvar $floor = Math.floor;\nvar $abs = Math.abs;\n\nvar $ObjectCreate = $Object.create;\nvar $gOPD = $Object.getOwnPropertyDescriptor;\nvar $gOPN = $Object.getOwnPropertyNames;\nvar $gOPS = $Object.getOwnPropertySymbols;\nvar $isExtensible = $Object.isExtensible;\nvar $defineProperty = $Object.defineProperty;\nvar $setProto = require('./helpers/setProto');\n\nvar DefineOwnProperty = function DefineOwnProperty(ES, O, P, desc) {\n\tif (!$defineProperty) {\n\t\tif (!ES.IsDataDescriptor(desc)) {\n\t\t\t// ES3 does not support getters/setters\n\t\t\treturn false;\n\t\t}\n\t\tif (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// fallback for ES3\n\t\tif (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {\n\t\t\t// a non-enumerable existing property\n\t\t\treturn false;\n\t\t}\n\n\t\t// property does not exist at all, or exists but is enumerable\n\t\tvar V = desc['[[Value]]'];\n\t\tO[P] = V; // will use [[Define]]\n\t\treturn ES.SameValue(O[P], V);\n\t}\n\t$defineProperty(O, P, ES.FromPropertyDescriptor(desc));\n\treturn true;\n};\n\n// whitespace from: https://es5.github.io/#x15.5.4.20\n// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324\nvar ws = [\n\t'\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003',\n\t'\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028',\n\t'\\u2029\\uFEFF'\n].join('');\nvar trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');\nvar $replace = callBound('String.prototype.replace');\nvar trim = function (value) {\n\treturn $replace(value, trimRegex, '');\n};\n\nvar ES5 = require('./es5');\n\nvar hasRegExpMatcher = require('is-regex');\n\n// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations\nvar ES6 = assign(assign({}, ES5), {\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args\n\tCall: function Call(F, V) {\n\t\tvar args = arguments.length > 2 ? arguments[2] : [];\n\t\tif (!this.IsCallable(F)) {\n\t\t\tthrow new $TypeError(inspect(F) + ' is not a function');\n\t\t}\n\t\treturn F.apply(V, args);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive\n\tToPrimitive: toPrimitive,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean\n\t// ToBoolean: ES5.ToBoolean,\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-tonumber\n\tToNumber: function ToNumber(argument) {\n\t\tvar value = isPrimitive(argument) ? argument : toPrimitive(argument, $Number);\n\t\tif (typeof value === 'symbol') {\n\t\t\tthrow new $TypeError('Cannot convert a Symbol value to a number');\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\tif (isBinary(value)) {\n\t\t\t\treturn this.ToNumber(parseInteger(strSlice(value, 2), 2));\n\t\t\t} else if (isOctal(value)) {\n\t\t\t\treturn this.ToNumber(parseInteger(strSlice(value, 2), 8));\n\t\t\t} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {\n\t\t\t\treturn NaN;\n\t\t\t} else {\n\t\t\t\tvar trimmed = trim(value);\n\t\t\t\tif (trimmed !== value) {\n\t\t\t\t\treturn this.ToNumber(trimmed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $Number(value);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger\n\t// ToInteger: ES5.ToNumber,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32\n\t// ToInt32: ES5.ToInt32,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32\n\t// ToUint32: ES5.ToUint32,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16\n\tToInt16: function ToInt16(argument) {\n\t\tvar int16bit = this.ToUint16(argument);\n\t\treturn int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16\n\t// ToUint16: ES5.ToUint16,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8\n\tToInt8: function ToInt8(argument) {\n\t\tvar int8bit = this.ToUint8(argument);\n\t\treturn int8bit >= 0x80 ? int8bit - 0x100 : int8bit;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8\n\tToUint8: function ToUint8(argument) {\n\t\tvar number = this.ToNumber(argument);\n\t\tif ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }\n\t\tvar posInt = sign(number) * $floor($abs(number));\n\t\treturn mod(posInt, 0x100);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp\n\tToUint8Clamp: function ToUint8Clamp(argument) {\n\t\tvar number = this.ToNumber(argument);\n\t\tif ($isNaN(number) || number <= 0) { return 0; }\n\t\tif (number >= 0xFF) { return 0xFF; }\n\t\tvar f = $floor(argument);\n\t\tif (f + 0.5 < number) { return f + 1; }\n\t\tif (number < f + 0.5) { return f; }\n\t\tif (f % 2 !== 0) { return f + 1; }\n\t\treturn f;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring\n\tToString: function ToString(argument) {\n\t\tif (typeof argument === 'symbol') {\n\t\t\tthrow new $TypeError('Cannot convert a Symbol value to a string');\n\t\t}\n\t\treturn $String(argument);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject\n\tToObject: function ToObject(value) {\n\t\tthis.RequireObjectCoercible(value);\n\t\treturn $Object(value);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey\n\tToPropertyKey: function ToPropertyKey(argument) {\n\t\tvar key = this.ToPrimitive(argument, $String);\n\t\treturn typeof key === 'symbol' ? key : this.ToString(key);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n\tToLength: function ToLength(argument) {\n\t\tvar len = this.ToInteger(argument);\n\t\tif (len <= 0) { return 0; } // includes converting -0 to +0\n\t\tif (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }\n\t\treturn len;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring\n\tCanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {\n\t\tif (toStr(argument) !== '[object String]') {\n\t\t\tthrow new $TypeError('must be a string');\n\t\t}\n\t\tif (argument === '-0') { return -0; }\n\t\tvar n = this.ToNumber(argument);\n\t\tif (this.SameValue(this.ToString(n), argument)) { return n; }\n\t\treturn void 0;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible\n\tRequireObjectCoercible: ES5.CheckObjectCoercible,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray\n\tIsArray: $Array.isArray || function IsArray(argument) {\n\t\treturn toStr(argument) === '[object Array]';\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable\n\t// IsCallable: ES5.IsCallable,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor\n\tIsConstructor: function IsConstructor(argument) {\n\t\treturn typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument` or Proxy\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o\n\tIsExtensible: $preventExtensions\n\t\t? function IsExtensible(obj) {\n\t\t\tif (isPrimitive(obj)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn $isExtensible(obj);\n\t\t}\n\t\t: function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger\n\tIsInteger: function IsInteger(argument) {\n\t\tif (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {\n\t\t\treturn false;\n\t\t}\n\t\tvar abs = $abs(argument);\n\t\treturn $floor(abs) === abs;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey\n\tIsPropertyKey: function IsPropertyKey(argument) {\n\t\treturn typeof argument === 'string' || typeof argument === 'symbol';\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-isregexp\n\tIsRegExp: function IsRegExp(argument) {\n\t\tif (!argument || typeof argument !== 'object') {\n\t\t\treturn false;\n\t\t}\n\t\tif (hasSymbols) {\n\t\t\tvar isRegExp = argument[$Symbol.match];\n\t\t\tif (typeof isRegExp !== 'undefined') {\n\t\t\t\treturn ES5.ToBoolean(isRegExp);\n\t\t\t}\n\t\t}\n\t\treturn hasRegExpMatcher(argument);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue\n\t// SameValue: ES5.SameValue,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero\n\tSameValueZero: function SameValueZero(x, y) {\n\t\treturn (x === y) || ($isNaN(x) && $isNaN(y));\n\t},\n\n\t/**\n\t * 7.3.2 GetV (V, P)\n\t * 1. Assert: IsPropertyKey(P) is true.\n\t * 2. Let O be ToObject(V).\n\t * 3. ReturnIfAbrupt(O).\n\t * 4. Return O.[[Get]](P, V).\n\t */\n\tGetV: function GetV(V, P) {\n\t\t// 7.3.2.1\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\t// 7.3.2.2-3\n\t\tvar O = this.ToObject(V);\n\n\t\t// 7.3.2.4\n\t\treturn O[P];\n\t},\n\n\t/**\n\t * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod\n\t * 1. Assert: IsPropertyKey(P) is true.\n\t * 2. Let func be GetV(O, P).\n\t * 3. ReturnIfAbrupt(func).\n\t * 4. If func is either undefined or null, return undefined.\n\t * 5. If IsCallable(func) is false, throw a TypeError exception.\n\t * 6. Return func.\n\t */\n\tGetMethod: function GetMethod(O, P) {\n\t\t// 7.3.9.1\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\t// 7.3.9.2\n\t\tvar func = this.GetV(O, P);\n\n\t\t// 7.3.9.4\n\t\tif (func == null) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\t// 7.3.9.5\n\t\tif (!this.IsCallable(func)) {\n\t\t\tthrow new $TypeError(P + 'is not a function');\n\t\t}\n\n\t\t// 7.3.9.6\n\t\treturn func;\n\t},\n\n\t/**\n\t * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p\n\t * 1. Assert: Type(O) is Object.\n\t * 2. Assert: IsPropertyKey(P) is true.\n\t * 3. Return O.[[Get]](P, O).\n\t */\n\tGet: function Get(O, P) {\n\t\t// 7.3.1.1\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\t// 7.3.1.2\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));\n\t\t}\n\t\t// 7.3.1.3\n\t\treturn O[P];\n\t},\n\n\tType: function Type(x) {\n\t\tif (typeof x === 'symbol') {\n\t\t\treturn 'Symbol';\n\t\t}\n\t\treturn ES5.Type(x);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor\n\tSpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tvar C = O.constructor;\n\t\tif (typeof C === 'undefined') {\n\t\t\treturn defaultConstructor;\n\t\t}\n\t\tif (this.Type(C) !== 'Object') {\n\t\t\tthrow new $TypeError('O.constructor is not an Object');\n\t\t}\n\t\tvar S = hasSymbols && $Symbol.species ? C[$Symbol.species] : void 0;\n\t\tif (S == null) {\n\t\t\treturn defaultConstructor;\n\t\t}\n\t\tif (this.IsConstructor(S)) {\n\t\t\treturn S;\n\t\t}\n\t\tthrow new $TypeError('no constructor found');\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor\n\tFromPropertyDescriptor: function FromPropertyDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn Desc;\n\t\t}\n\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tvar obj = {};\n\t\tif ('[[Value]]' in Desc) {\n\t\t\tobj.value = Desc['[[Value]]'];\n\t\t}\n\t\tif ('[[Writable]]' in Desc) {\n\t\t\tobj.writable = Desc['[[Writable]]'];\n\t\t}\n\t\tif ('[[Get]]' in Desc) {\n\t\t\tobj.get = Desc['[[Get]]'];\n\t\t}\n\t\tif ('[[Set]]' in Desc) {\n\t\t\tobj.set = Desc['[[Set]]'];\n\t\t}\n\t\tif ('[[Enumerable]]' in Desc) {\n\t\t\tobj.enumerable = Desc['[[Enumerable]]'];\n\t\t}\n\t\tif ('[[Configurable]]' in Desc) {\n\t\t\tobj.configurable = Desc['[[Configurable]]'];\n\t\t}\n\t\treturn obj;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor\n\tCompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tif (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {\n\t\t\tif (!has(Desc, '[[Value]]')) {\n\t\t\t\tDesc['[[Value]]'] = void 0;\n\t\t\t}\n\t\t\tif (!has(Desc, '[[Writable]]')) {\n\t\t\t\tDesc['[[Writable]]'] = false;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!has(Desc, '[[Get]]')) {\n\t\t\t\tDesc['[[Get]]'] = void 0;\n\t\t\t}\n\t\t\tif (!has(Desc, '[[Set]]')) {\n\t\t\t\tDesc['[[Set]]'] = void 0;\n\t\t\t}\n\t\t}\n\t\tif (!has(Desc, '[[Enumerable]]')) {\n\t\t\tDesc['[[Enumerable]]'] = false;\n\t\t}\n\t\tif (!has(Desc, '[[Configurable]]')) {\n\t\t\tDesc['[[Configurable]]'] = false;\n\t\t}\n\t\treturn Desc;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw\n\tSet: function Set(O, P, V, Throw) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\tif (this.Type(Throw) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Throw must be a Boolean');\n\t\t}\n\t\tif (Throw) {\n\t\t\tO[P] = V;\n\t\t\treturn true;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tO[P] = V;\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty\n\tHasOwnProperty: function HasOwnProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\treturn has(O, P);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty\n\tHasProperty: function HasProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\treturn P in O;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable\n\tIsConcatSpreadable: function IsConcatSpreadable(O) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tif (hasSymbols && typeof $Symbol.isConcatSpreadable === 'symbol') {\n\t\t\tvar spreadable = this.Get(O, Symbol.isConcatSpreadable);\n\t\t\tif (typeof spreadable !== 'undefined') {\n\t\t\t\treturn this.ToBoolean(spreadable);\n\t\t\t}\n\t\t}\n\t\treturn this.IsArray(O);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-invoke\n\tInvoke: function Invoke(O, P) {\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\tvar argumentsList = arraySlice(arguments, 2);\n\t\tvar func = this.GetV(O, P);\n\t\treturn this.Call(func, O, argumentsList);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-getiterator\n\tGetIterator: function GetIterator(obj, method) {\n\t\tvar actualMethod = method;\n\t\tif (arguments.length < 2) {\n\t\t\tactualMethod = getIteratorMethod(this, obj);\n\t\t}\n\t\tvar iterator = this.Call(actualMethod, obj);\n\t\tif (this.Type(iterator) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator must return an object');\n\t\t}\n\n\t\treturn iterator;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext\n\tIteratorNext: function IteratorNext(iterator, value) {\n\t\tvar result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);\n\t\tif (this.Type(result) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator next must return an object');\n\t\t}\n\t\treturn result;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete\n\tIteratorComplete: function IteratorComplete(iterResult) {\n\t\tif (this.Type(iterResult) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterResult) is not Object');\n\t\t}\n\t\treturn this.ToBoolean(this.Get(iterResult, 'done'));\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue\n\tIteratorValue: function IteratorValue(iterResult) {\n\t\tif (this.Type(iterResult) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterResult) is not Object');\n\t\t}\n\t\treturn this.Get(iterResult, 'value');\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep\n\tIteratorStep: function IteratorStep(iterator) {\n\t\tvar result = this.IteratorNext(iterator);\n\t\tvar done = this.IteratorComplete(result);\n\t\treturn done === true ? false : result;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose\n\tIteratorClose: function IteratorClose(iterator, completion) {\n\t\tif (this.Type(iterator) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterator) is not Object');\n\t\t}\n\t\tif (!this.IsCallable(completion)) {\n\t\t\tthrow new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');\n\t\t}\n\t\tvar completionThunk = completion;\n\n\t\tvar iteratorReturn = this.GetMethod(iterator, 'return');\n\n\t\tif (typeof iteratorReturn === 'undefined') {\n\t\t\treturn completionThunk();\n\t\t}\n\n\t\tvar completionRecord;\n\t\ttry {\n\t\t\tvar innerResult = this.Call(iteratorReturn, iterator, []);\n\t\t} catch (e) {\n\t\t\t// if we hit here, then \"e\" is the innerResult completion that needs re-throwing\n\n\t\t\t// if the completion is of type \"throw\", this will throw.\n\t\t\tcompletionRecord = completionThunk();\n\t\t\tcompletionThunk = null; // ensure it's not called twice.\n\n\t\t\t// if not, then return the innerResult completion\n\t\t\tthrow e;\n\t\t}\n\t\tcompletionRecord = completionThunk(); // if innerResult worked, then throw if the completion does\n\t\tcompletionThunk = null; // ensure it's not called twice.\n\n\t\tif (this.Type(innerResult) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator .return must return an object');\n\t\t}\n\n\t\treturn completionRecord;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject\n\tCreateIterResultObject: function CreateIterResultObject(value, done) {\n\t\tif (this.Type(done) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(done) is not Boolean');\n\t\t}\n\t\treturn {\n\t\t\tvalue: value,\n\t\t\tdone: done\n\t\t};\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec\n\tRegExpExec: function RegExpExec(R, S) {\n\t\tif (this.Type(R) !== 'Object') {\n\t\t\tthrow new $TypeError('R must be an Object');\n\t\t}\n\t\tif (this.Type(S) !== 'String') {\n\t\t\tthrow new $TypeError('S must be a String');\n\t\t}\n\t\tvar exec = this.Get(R, 'exec');\n\t\tif (this.IsCallable(exec)) {\n\t\t\tvar result = this.Call(exec, R, [S]);\n\t\t\tif (result === null || this.Type(result) === 'Object') {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tthrow new $TypeError('\"exec\" method must return `null` or an Object');\n\t\t}\n\t\treturn regexExec(R, S);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate\n\tArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {\n\t\tif (!this.IsInteger(length) || length < 0) {\n\t\t\tthrow new $TypeError('Assertion failed: length must be an integer >= 0');\n\t\t}\n\t\tvar len = length === 0 ? 0 : length;\n\t\tvar C;\n\t\tvar isArray = this.IsArray(originalArray);\n\t\tif (isArray) {\n\t\t\tC = this.Get(originalArray, 'constructor');\n\t\t\t// TODO: figure out how to make a cross-realm normal Array, a same-realm Array\n\t\t\t// if (this.IsConstructor(C)) {\n\t\t\t// \tif C is another realm's Array, C = undefined\n\t\t\t// \tObject.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?\n\t\t\t// }\n\t\t\tif (this.Type(C) === 'Object' && hasSymbols && $Symbol.species) {\n\t\t\t\tC = this.Get(C, $Symbol.species);\n\t\t\t\tif (C === null) {\n\t\t\t\t\tC = void 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof C === 'undefined') {\n\t\t\treturn $Array(len);\n\t\t}\n\t\tif (!this.IsConstructor(C)) {\n\t\t\tthrow new $TypeError('C must be a constructor');\n\t\t}\n\t\treturn new C(len); // this.Construct(C, len);\n\t},\n\n\tCreateDataProperty: function CreateDataProperty(O, P, V) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\t\tvar oldDesc = $gOPD(O, P);\n\t\tvar extensible = oldDesc || this.IsExtensible(O);\n\t\tvar immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);\n\t\tif (immutable || !extensible) {\n\t\t\treturn false;\n\t\t}\n\t\treturn DefineOwnProperty(this, O, P, {\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': true,\n\t\t\t'[[Value]]': V,\n\t\t\t'[[Writable]]': true\n\t\t});\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow\n\tCreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\t\tvar success = this.CreateDataProperty(O, P, V);\n\t\tif (!success) {\n\t\t\tthrow new $TypeError('unable to create data property');\n\t\t}\n\t\treturn success;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate\n\tObjectCreate: function ObjectCreate(proto, internalSlotsList) {\n\t\tif (proto !== null && this.Type(proto) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: proto must be null or an object');\n\t\t}\n\t\tvar slots = arguments.length < 2 ? [] : internalSlotsList;\n\t\tif (slots.length > 0) {\n\t\t\tthrow new $SyntaxError('es-abstract does not yet support internal slots');\n\t\t}\n\n\t\tif (proto === null && !$ObjectCreate) {\n\t\t\tthrow new $SyntaxError('native Object.create support is required to create null objects');\n\t\t}\n\n\t\treturn $ObjectCreate(proto);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex\n\tAdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {\n\t\tif (this.Type(S) !== 'String') {\n\t\t\tthrow new $TypeError('S must be a String');\n\t\t}\n\t\tif (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {\n\t\t\tthrow new $TypeError('Assertion failed: length must be an integer >= 0 and <= 2**53');\n\t\t}\n\t\tif (this.Type(unicode) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: unicode must be a Boolean');\n\t\t}\n\t\tif (!unicode) {\n\t\t\treturn index + 1;\n\t\t}\n\t\tvar length = S.length;\n\t\tif ((index + 1) >= length) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\tvar first = $charCodeAt(S, index);\n\t\tif (first < 0xD800 || first > 0xDBFF) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\tvar second = $charCodeAt(S, index + 1);\n\t\tif (second < 0xDC00 || second > 0xDFFF) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\treturn index + 2;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty\n\tCreateMethodProperty: function CreateMethodProperty(O, P, V) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\tvar newDesc = {\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': false,\n\t\t\t'[[Value]]': V,\n\t\t\t'[[Writable]]': true\n\t\t};\n\t\treturn DefineOwnProperty(this, O, P, newDesc);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow\n\tDefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\tvar Desc = isPropertyDescriptor(this, desc) ? desc : this.ToPropertyDescriptor(desc);\n\t\tif (!isPropertyDescriptor(this, Desc)) {\n\t\t\tthrow new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');\n\t\t}\n\n\t\treturn DefineOwnProperty(this, O, P, Desc);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow\n\tDeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\tvar success = delete O[P];\n\t\tif (!success) {\n\t\t\tthrow new TypeError('Attempt to delete property failed.');\n\t\t}\n\t\treturn success;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames\n\tEnumerableOwnNames: function EnumerableOwnNames(O) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\n\t\treturn keys(O);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object\n\tthisNumberValue: function thisNumberValue(value) {\n\t\tif (this.Type(value) === 'Number') {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn $NumberValueOf(value);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object\n\tthisBooleanValue: function thisBooleanValue(value) {\n\t\tif (this.Type(value) === 'Boolean') {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn $BooleanValueOf(value);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object\n\tthisStringValue: function thisStringValue(value) {\n\t\tif (this.Type(value) === 'String') {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn $StringValueOf(value);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object\n\tthisTimeValue: function thisTimeValue(value) {\n\t\treturn $DateValueOf(value);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel\n\tSetIntegrityLevel: function SetIntegrityLevel(O, level) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (level !== 'sealed' && level !== 'frozen') {\n\t\t\tthrow new $TypeError('Assertion failed: `level` must be `\"sealed\"` or `\"frozen\"`');\n\t\t}\n\t\tif (!$preventExtensions) {\n\t\t\tthrow new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');\n\t\t}\n\t\tvar status = $preventExtensions(O);\n\t\tif (!status) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!$gOPN) {\n\t\t\tthrow new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');\n\t\t}\n\t\tvar theKeys = $gOPN(O);\n\t\tvar ES = this;\n\t\tif (level === 'sealed') {\n\t\t\tforEach(theKeys, function (k) {\n\t\t\t\tES.DefinePropertyOrThrow(O, k, { configurable: false });\n\t\t\t});\n\t\t} else if (level === 'frozen') {\n\t\t\tforEach(theKeys, function (k) {\n\t\t\t\tvar currentDesc = $gOPD(O, k);\n\t\t\t\tif (typeof currentDesc !== 'undefined') {\n\t\t\t\t\tvar desc;\n\t\t\t\t\tif (ES.IsAccessorDescriptor(ES.ToPropertyDescriptor(currentDesc))) {\n\t\t\t\t\t\tdesc = { configurable: false };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdesc = { configurable: false, writable: false };\n\t\t\t\t\t}\n\t\t\t\t\tES.DefinePropertyOrThrow(O, k, desc);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel\n\tTestIntegrityLevel: function TestIntegrityLevel(O, level) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (level !== 'sealed' && level !== 'frozen') {\n\t\t\tthrow new $TypeError('Assertion failed: `level` must be `\"sealed\"` or `\"frozen\"`');\n\t\t}\n\t\tvar status = this.IsExtensible(O);\n\t\tif (status) {\n\t\t\treturn false;\n\t\t}\n\t\tvar theKeys = $gOPN(O);\n\t\tvar ES = this;\n\t\treturn theKeys.length === 0 || every(theKeys, function (k) {\n\t\t\tvar currentDesc = $gOPD(O, k);\n\t\t\tif (typeof currentDesc !== 'undefined') {\n\t\t\t\tif (currentDesc.configurable) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (level === 'frozen' && ES.IsDataDescriptor(ES.ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance\n\tOrdinaryHasInstance: function OrdinaryHasInstance(C, O) {\n\t\tif (this.IsCallable(C) === false) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tvar P = this.Get(C, 'prototype');\n\t\tif (this.Type(P) !== 'Object') {\n\t\t\tthrow new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');\n\t\t}\n\t\treturn O instanceof C;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty\n\tOrdinaryHasProperty: function OrdinaryHasProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: P must be a Property Key');\n\t\t}\n\t\treturn P in O;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator\n\tInstanceofOperator: function InstanceofOperator(O, C) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tvar instOfHandler = hasSymbols && $Symbol.hasInstance ? this.GetMethod(C, $Symbol.hasInstance) : void 0;\n\t\tif (typeof instOfHandler !== 'undefined') {\n\t\t\treturn this.ToBoolean(this.Call(instOfHandler, C, [O]));\n\t\t}\n\t\tif (!this.IsCallable(C)) {\n\t\t\tthrow new $TypeError('`C` is not Callable');\n\t\t}\n\t\treturn this.OrdinaryHasInstance(C, O);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise\n\tIsPromise: function IsPromise(x) {\n\t\tif (this.Type(x) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tif (!$PromiseThen) { // Promises are not supported\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\t$PromiseThen(x); // throws if not a promise\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison\n\t'Abstract Equality Comparison': function AbstractEqualityComparison(x, y) {\n\t\tvar xType = this.Type(x);\n\t\tvar yType = this.Type(y);\n\t\tif (xType === yType) {\n\t\t\treturn x === y; // ES6+ specified this shortcut anyways.\n\t\t}\n\t\tif (x == null && y == null) {\n\t\t\treturn true;\n\t\t}\n\t\tif (xType === 'Number' && yType === 'String') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToNumber(y));\n\t\t}\n\t\tif (xType === 'String' && yType === 'Number') {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToNumber(x), y);\n\t\t}\n\t\tif (xType === 'Boolean') {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToNumber(x), y);\n\t\t}\n\t\tif (yType === 'Boolean') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToNumber(y));\n\t\t}\n\t\tif ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToPrimitive(y));\n\t\t}\n\t\tif (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToPrimitive(x), y);\n\t\t}\n\t\treturn false;\n\t},\n\n\t// eslint-disable-next-line max-lines-per-function, max-statements, id-length, max-params\n\tValidateAndApplyPropertyDescriptor: function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {\n\t\t// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.\n\t\tvar oType = this.Type(O);\n\t\tif (oType !== 'Undefined' && oType !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: O must be undefined or an Object');\n\t\t}\n\t\tif (this.Type(extensible) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: extensible must be a Boolean');\n\t\t}\n\t\tif (!isPropertyDescriptor(this, Desc)) {\n\t\t\tthrow new $TypeError('Assertion failed: Desc must be a Property Descriptor');\n\t\t}\n\t\tif (this.Type(current) !== 'Undefined' && !isPropertyDescriptor(this, current)) {\n\t\t\tthrow new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');\n\t\t}\n\t\tif (oType !== 'Undefined' && !this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');\n\t\t}\n\t\tif (this.Type(current) === 'Undefined') {\n\t\t\tif (!extensible) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {\n\t\t\t\tif (oType !== 'Undefined') {\n\t\t\t\t\tDefineOwnProperty(this, O, P, {\n\t\t\t\t\t\t'[[Configurable]]': Desc['[[Configurable]]'],\n\t\t\t\t\t\t'[[Enumerable]]': Desc['[[Enumerable]]'],\n\t\t\t\t\t\t'[[Value]]': Desc['[[Value]]'],\n\t\t\t\t\t\t'[[Writable]]': Desc['[[Writable]]']\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!this.IsAccessorDescriptor(Desc)) {\n\t\t\t\t\tthrow new $TypeError('Assertion failed: Desc is not an accessor descriptor');\n\t\t\t\t}\n\t\t\t\tif (oType !== 'Undefined') {\n\t\t\t\t\treturn DefineOwnProperty(this, O, P, Desc);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tif (this.IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (isSamePropertyDescriptor(this, Desc, current)) {\n\t\t\treturn true; // removed by ES2017, but should still be correct\n\t\t}\n\t\t// \"if every field in Desc is absent, return true\" can't really match the assertion that it's a Property Descriptor\n\t\tif (!current['[[Configurable]]']) {\n\t\t\tif (Desc['[[Configurable]]']) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (this.IsGenericDescriptor(Desc)) {\n\t\t\t// no further validation is required.\n\t\t} else if (this.IsDataDescriptor(current) !== this.IsDataDescriptor(Desc)) {\n\t\t\tif (!current['[[Configurable]]']) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.IsDataDescriptor(current)) {\n\t\t\t\tif (oType !== 'Undefined') {\n\t\t\t\t\tDefineOwnProperty(this, O, P, {\n\t\t\t\t\t\t'[[Configurable]]': current['[[Configurable]]'],\n\t\t\t\t\t\t'[[Enumerable]]': current['[[Enumerable]]'],\n\t\t\t\t\t\t'[[Get]]': undefined\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (oType !== 'Undefined') {\n\t\t\t\tDefineOwnProperty(this, O, P, {\n\t\t\t\t\t'[[Configurable]]': current['[[Configurable]]'],\n\t\t\t\t\t'[[Enumerable]]': current['[[Enumerable]]'],\n\t\t\t\t\t'[[Value]]': undefined\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (this.IsDataDescriptor(current) && this.IsDataDescriptor(Desc)) {\n\t\t\tif (!current['[[Configurable]]'] && !current['[[Writable]]']) {\n\t\t\t\tif ('[[Writable]]' in Desc && Desc['[[Writable]]']) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ('[[Value]]' in Desc && !this.SameValue(Desc['[[Value]]'], current['[[Value]]'])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (this.IsAccessorDescriptor(current) && this.IsAccessorDescriptor(Desc)) {\n\t\t\tif (!current['[[Configurable]]']) {\n\t\t\t\tif ('[[Set]]' in Desc && !this.SameValue(Desc['[[Set]]'], current['[[Set]]'])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ('[[Get]]' in Desc && !this.SameValue(Desc['[[Get]]'], current['[[Get]]'])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');\n\t\t}\n\t\tif (oType !== 'Undefined') {\n\t\t\treturn DefineOwnProperty(this, O, P, Desc);\n\t\t}\n\t\treturn true;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty\n\tOrdinaryDefineOwnProperty: function OrdinaryDefineOwnProperty(O, P, Desc) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: P must be a Property Key');\n\t\t}\n\t\tif (!isPropertyDescriptor(this, Desc)) {\n\t\t\tthrow new $TypeError('Assertion failed: Desc must be a Property Descriptor');\n\t\t}\n\t\tvar desc = $gOPD(O, P);\n\t\tvar current = desc && this.ToPropertyDescriptor(desc);\n\t\tvar extensible = this.IsExtensible(O);\n\t\treturn this.ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty\n\tOrdinaryGetOwnProperty: function OrdinaryGetOwnProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: P must be a Property Key');\n\t\t}\n\t\tif (!has(O, P)) {\n\t\t\treturn void 0;\n\t\t}\n\t\tif (!$gOPD) {\n\t\t\t// ES3 fallback\n\t\t\tvar arrayLength = this.IsArray(O) && P === 'length';\n\t\t\tvar regexLastIndex = this.IsRegExp(O) && P === 'lastIndex';\n\t\t\treturn {\n\t\t\t\t'[[Configurable]]': !(arrayLength || regexLastIndex),\n\t\t\t\t'[[Enumerable]]': $isEnumerable(O, P),\n\t\t\t\t'[[Value]]': O[P],\n\t\t\t\t'[[Writable]]': true\n\t\t\t};\n\t\t}\n\t\treturn this.ToPropertyDescriptor($gOPD(O, P));\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate\n\tArrayCreate: function ArrayCreate(length) {\n\t\tif (!this.IsInteger(length) || length < 0) {\n\t\t\tthrow new $TypeError('Assertion failed: `length` must be an integer Number >= 0');\n\t\t}\n\t\tif (length > MAX_ARRAY_LENGTH) {\n\t\t\tthrow new $RangeError('length is greater than (2**32 - 1)');\n\t\t}\n\t\tvar proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;\n\t\tvar A = []; // steps 5 - 7, and 9\n\t\tif (proto !== $ArrayPrototype) { // step 8\n\t\t\tif (!$setProto) {\n\t\t\t\tthrow new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');\n\t\t\t}\n\t\t\t$setProto(A, proto);\n\t\t}\n\t\tif (length !== 0) { // bypasses the need for step 2\n\t\t\tA.length = length;\n\t\t}\n\t\t/* step 10, the above as a shortcut for the below\n\t\tthis.OrdinaryDefineOwnProperty(A, 'length', {\n\t\t\t'[[Configurable]]': false,\n\t\t\t'[[Enumerable]]': false,\n\t\t\t'[[Value]]': length,\n\t\t\t'[[Writable]]': true\n\t\t});\n\t\t*/\n\t\treturn A;\n\t},\n\n\t// eslint-disable-next-line max-statements, max-lines-per-function\n\tArraySetLength: function ArraySetLength(A, Desc) {\n\t\tif (!this.IsArray(A)) {\n\t\t\tthrow new $TypeError('Assertion failed: A must be an Array');\n\t\t}\n\t\tif (!isPropertyDescriptor(this, Desc)) {\n\t\t\tthrow new $TypeError('Assertion failed: Desc must be a Property Descriptor');\n\t\t}\n\t\tif (!('[[Value]]' in Desc)) {\n\t\t\treturn this.OrdinaryDefineOwnProperty(A, 'length', Desc);\n\t\t}\n\t\tvar newLenDesc = assign({}, Desc);\n\t\tvar newLen = this.ToUint32(Desc['[[Value]]']);\n\t\tvar numberLen = this.ToNumber(Desc['[[Value]]']);\n\t\tif (newLen !== numberLen) {\n\t\t\tthrow new $RangeError('Invalid array length');\n\t\t}\n\t\tnewLenDesc['[[Value]]'] = newLen;\n\t\tvar oldLenDesc = this.OrdinaryGetOwnProperty(A, 'length');\n\t\tif (!this.IsDataDescriptor(oldLenDesc)) {\n\t\t\tthrow new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');\n\t\t}\n\t\tvar oldLen = oldLenDesc['[[Value]]'];\n\t\tif (newLen >= oldLen) {\n\t\t\treturn this.OrdinaryDefineOwnProperty(A, 'length', newLenDesc);\n\t\t}\n\t\tif (!oldLenDesc['[[Writable]]']) {\n\t\t\treturn false;\n\t\t}\n\t\tvar newWritable;\n\t\tif (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {\n\t\t\tnewWritable = true;\n\t\t} else {\n\t\t\tnewWritable = false;\n\t\t\tnewLenDesc['[[Writable]]'] = true;\n\t\t}\n\t\tvar succeeded = this.OrdinaryDefineOwnProperty(A, 'length', newLenDesc);\n\t\tif (!succeeded) {\n\t\t\treturn false;\n\t\t}\n\t\twhile (newLen < oldLen) {\n\t\t\toldLen -= 1;\n\t\t\tvar deleteSucceeded = delete A[this.ToString(oldLen)];\n\t\t\tif (!deleteSucceeded) {\n\t\t\t\tnewLenDesc['[[Value]]'] = oldLen + 1;\n\t\t\t\tif (!newWritable) {\n\t\t\t\t\tnewLenDesc['[[Writable]]'] = false;\n\t\t\t\t\tthis.OrdinaryDefineOwnProperty(A, 'length', newLenDesc);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!newWritable) {\n\t\t\treturn this.OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });\n\t\t}\n\t\treturn true;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml\n\tCreateHTML: function CreateHTML(string, tag, attribute, value) {\n\t\tif (this.Type(tag) !== 'String' || this.Type(attribute) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `tag` and `attribute` must be strings');\n\t\t}\n\t\tvar str = this.RequireObjectCoercible(string);\n\t\tvar S = this.ToString(str);\n\t\tvar p1 = '<' + tag;\n\t\tif (attribute !== '') {\n\t\t\tvar V = this.ToString(value);\n\t\t\tvar escapedV = $replace(V, /\\x22/g, '"');\n\t\t\tp1 += '\\x20' + attribute + '\\x3D\\x22' + escapedV + '\\x22';\n\t\t}\n\t\treturn p1 + '>' + S + '';\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys\n\tGetOwnPropertyKeys: function GetOwnPropertyKeys(O, Type) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (Type === 'Symbol') {\n\t\t\treturn hasSymbols && $gOPS ? $gOPS(O) : [];\n\t\t}\n\t\tif (Type === 'String') {\n\t\t\tif (!$gOPN) {\n\t\t\t\treturn keys(O);\n\t\t\t}\n\t\t\treturn $gOPN(O);\n\t\t}\n\t\tthrow new $TypeError('Assertion failed: `Type` must be `\"String\"` or `\"Symbol\"`');\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring\n\tSymbolDescriptiveString: function SymbolDescriptiveString(sym) {\n\t\tif (this.Type(sym) !== 'Symbol') {\n\t\t\tthrow new $TypeError('Assertion failed: `sym` must be a Symbol');\n\t\t}\n\t\treturn $SymbolToString(sym);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-getsubstitution\n\t// eslint-disable-next-line max-statements, max-params, max-lines-per-function\n\tGetSubstitution: function GetSubstitution(matched, str, position, captures, replacement) {\n\t\tif (this.Type(matched) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `matched` must be a String');\n\t\t}\n\t\tvar matchLength = matched.length;\n\n\t\tif (this.Type(str) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `str` must be a String');\n\t\t}\n\t\tvar stringLength = str.length;\n\n\t\tif (!this.IsInteger(position) || position < 0 || position > stringLength) {\n\t\t\tthrow new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));\n\t\t}\n\n\t\tvar ES = this;\n\t\tvar isStringOrHole = function (capture, index, arr) { return ES.Type(capture) === 'String' || !(index in arr); };\n\t\tif (!this.IsArray(captures) || !every(captures, isStringOrHole)) {\n\t\t\tthrow new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));\n\t\t}\n\n\t\tif (this.Type(replacement) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `replacement` must be a String');\n\t\t}\n\n\t\tvar tailPos = position + matchLength;\n\t\tvar m = captures.length;\n\n\t\tvar result = '';\n\t\tfor (var i = 0; i < replacement.length; i += 1) {\n\t\t\t// if this is a $, and it's not the end of the replacement\n\t\t\tvar current = replacement[i];\n\t\t\tvar isLast = (i + 1) >= replacement.length;\n\t\t\tvar nextIsLast = (i + 2) >= replacement.length;\n\t\t\tif (current === '$' && !isLast) {\n\t\t\t\tvar next = replacement[i + 1];\n\t\t\t\tif (next === '$') {\n\t\t\t\t\tresult += '$';\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === '&') {\n\t\t\t\t\tresult += matched;\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === '`') {\n\t\t\t\t\tresult += position === 0 ? '' : strSlice(str, 0, position - 1);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === \"'\") {\n\t\t\t\t\tresult += tailPos >= stringLength ? '' : strSlice(str, tailPos);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar nextNext = nextIsLast ? null : replacement[i + 2];\n\t\t\t\t\tif (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {\n\t\t\t\t\t\t// $1 through $9, and not followed by a digit\n\t\t\t\t\t\tvar n = parseInteger(next, 10);\n\t\t\t\t\t\t// if (n > m, impl-defined)\n\t\t\t\t\t\tresult += (n <= m && this.Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {\n\t\t\t\t\t\t// $00 through $99\n\t\t\t\t\t\tvar nn = next + nextNext;\n\t\t\t\t\t\tvar nnI = parseInteger(nn, 10) - 1;\n\t\t\t\t\t\t// if nn === '00' or nn > m, impl-defined\n\t\t\t\t\t\tresult += (nn <= m && this.Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult += '$';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// the final $, or else not a $\n\t\t\t\tresult += replacement[i];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-todatestring\n\tToDateString: function ToDateString(tv) {\n\t\tif (this.Type(tv) !== 'Number') {\n\t\t\tthrow new $TypeError('Assertion failed: `tv` must be a Number');\n\t\t}\n\t\tif ($isNaN(tv)) {\n\t\t\treturn 'Invalid Date';\n\t\t}\n\t\treturn $Date(tv);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike\n\tCreateListFromArrayLike: function CreateListFromArrayLike(obj) {\n\t\tvar elementTypes = arguments.length > 1\n\t\t\t? arguments[1]\n\t\t\t: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];\n\n\t\tif (this.Type(obj) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: `obj` must be an Object');\n\t\t}\n\t\tif (!this.IsArray(elementTypes)) {\n\t\t\tthrow new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');\n\t\t}\n\t\tvar len = this.ToLength(this.Get(obj, 'length'));\n\t\tvar list = [];\n\t\tvar index = 0;\n\t\twhile (index < len) {\n\t\t\tvar indexName = this.ToString(index);\n\t\t\tvar next = this.Get(obj, indexName);\n\t\t\tvar nextType = this.Type(next);\n\t\t\tif ($indexOf(elementTypes, nextType) < 0) {\n\t\t\t\tthrow new $TypeError('item type ' + nextType + ' is not a valid elementType');\n\t\t\t}\n\t\t\t$push(list, next);\n\t\t\tindex += 1;\n\t\t}\n\t\treturn list;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor\n\tGetPrototypeFromConstructor: function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {\n\t\tvar intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic\n\t\tif (!this.IsConstructor(constructor)) {\n\t\t\tthrow new $TypeError('Assertion failed: `constructor` must be a constructor');\n\t\t}\n\t\tvar proto = this.Get(constructor, 'prototype');\n\t\tif (this.Type(proto) !== 'Object') {\n\t\t\tif (!(constructor instanceof $Function)) {\n\t\t\t\t// ignore other realms, for now\n\t\t\t\tthrow new $TypeError('cross-realm constructors not currently supported');\n\t\t\t}\n\t\t\tproto = intrinsic;\n\t\t}\n\t\treturn proto;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname\n\tSetFunctionName: function SetFunctionName(F, name) {\n\t\tif (typeof F !== 'function') {\n\t\t\tthrow new $TypeError('Assertion failed: `F` must be a function');\n\t\t}\n\t\tif (!this.IsExtensible(F) || has(F, 'name')) {\n\t\t\tthrow new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');\n\t\t}\n\t\tvar nameType = this.Type(name);\n\t\tif (nameType !== 'Symbol' && nameType !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `name` must be a Symbol or a String');\n\t\t}\n\t\tif (nameType === 'Symbol') {\n\t\t\tvar description = getSymbolDescription(name);\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tname = typeof description === 'undefined' ? '' : '[' + description + ']';\n\t\t}\n\t\tif (arguments.length > 2) {\n\t\t\tvar prefix = arguments[2];\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tname = prefix + ' ' + name;\n\t\t}\n\t\treturn this.DefinePropertyOrThrow(F, 'name', {\n\t\t\t'[[Value]]': name,\n\t\t\t'[[Writable]]': false,\n\t\t\t'[[Enumerable]]': false,\n\t\t\t'[[Configurable]]': true\n\t\t});\n\t}\n});\n\ndelete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible\n\nmodule.exports = ES6;\n","'use strict';\n\nvar ES2015 = require('./es2015');\nvar GetIntrinsic = require('./GetIntrinsic');\nvar assign = require('./helpers/assign');\nvar $setProto = require('./helpers/setProto');\n\nvar callBound = require('./helpers/callBound');\nvar getIteratorMethod = require('./helpers/getIteratorMethod');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $arrayPush = callBound('Array.prototype.push');\nvar $getProto = require('./helpers/getProto');\n\nvar ES2016 = assign(assign({}, ES2015), {\n\t// https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber\n\tSameValueNonNumber: function SameValueNonNumber(x, y) {\n\t\tif (typeof x === 'number' || typeof x !== typeof y) {\n\t\t\tthrow new TypeError('SameValueNonNumber requires two non-number values of the same type.');\n\t\t}\n\t\treturn this.SameValue(x, y);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/7.0/#sec-iterabletoarraylike\n\tIterableToArrayLike: function IterableToArrayLike(items) {\n\t\tvar usingIterator = getIteratorMethod(this, items);\n\t\tif (typeof usingIterator !== 'undefined') {\n\t\t\tvar iterator = this.GetIterator(items, usingIterator);\n\t\t\tvar values = [];\n\t\t\tvar next = true;\n\t\t\twhile (next) {\n\t\t\t\tnext = this.IteratorStep(iterator);\n\t\t\t\tif (next) {\n\t\t\t\t\tvar nextValue = this.IteratorValue(next);\n\t\t\t\t\t$arrayPush(values, nextValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn values;\n\t\t}\n\n\t\treturn this.ToObject(items);\n\t},\n\n\t// https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof\n\tOrdinaryGetPrototypeOf: function (O) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: O must be an Object');\n\t\t}\n\t\tif (!$getProto) {\n\t\t\tthrow new $TypeError('This environment does not support fetching prototypes.');\n\t\t}\n\t\treturn $getProto(O);\n\t},\n\n\t// https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof\n\tOrdinarySetPrototypeOf: function (O, V) {\n\t\tif (this.Type(V) !== 'Object' && this.Type(V) !== 'Null') {\n\t\t\tthrow new $TypeError('Assertion failed: V must be Object or Null');\n\t\t}\n\t\t/*\n\t\tvar extensible = this.IsExtensible(O);\n\t\tvar current = this.OrdinaryGetPrototypeOf(O);\n\t\tif (this.SameValue(V, current)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!extensible) {\n\t\t\treturn false;\n\t\t}\n\t\t*/\n\t\ttry {\n\t\t\t$setProto(O, V);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.OrdinaryGetPrototypeOf(O) === V;\n\t\t/*\n\t\tvar p = V;\n\t\tvar done = false;\n\t\twhile (!done) {\n\t\t\tif (p === null) {\n\t\t\t\tdone = true;\n\t\t\t} else if (this.SameValue(p, O)) {\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tif (wat) {\n\t\t\t\t\tdone = true;\n\t\t\t\t} else {\n\t\t\t\t\tp = p.[[Prototype]];\n\t\t\t\t}\n\t\t\t}\n\t\t }\n\t\t O.[[Prototype]] = V;\n\t\t return true;\n\t\t */\n\t}\n});\n\nmodule.exports = ES2016;\n","'use strict';\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar ES2016 = require('./es2016');\nvar assign = require('./helpers/assign');\nvar forEach = require('./helpers/forEach');\nvar callBind = require('./helpers/callBind');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar callBound = require('./helpers/callBound');\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\nvar $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));\nvar $arrayPush = callBound('Array.prototype.push');\n\nvar ES2017 = assign(assign({}, ES2016), {\n\tToIndex: function ToIndex(value) {\n\t\tif (typeof value === 'undefined') {\n\t\t\treturn 0;\n\t\t}\n\t\tvar integerIndex = this.ToInteger(value);\n\t\tif (integerIndex < 0) {\n\t\t\tthrow new RangeError('index must be >= 0');\n\t\t}\n\t\tvar index = this.ToLength(integerIndex);\n\t\tif (!this.SameValueZero(integerIndex, index)) {\n\t\t\tthrow new RangeError('index must be >= 0 and < 2 ** 53 - 1');\n\t\t}\n\t\treturn index;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties\n\tEnumerableOwnProperties: function EnumerableOwnProperties(O, kind) {\n\t\tvar keys = ES2016.EnumerableOwnNames(O);\n\t\tif (kind === 'key') {\n\t\t\treturn keys;\n\t\t}\n\t\tif (kind === 'value' || kind === 'key+value') {\n\t\t\tvar results = [];\n\t\t\tforEach(keys, function (key) {\n\t\t\t\tif ($isEnumerable(O, key)) {\n\t\t\t\t\t$pushApply(results, [\n\t\t\t\t\t\tkind === 'value' ? O[key] : [key, O[key]]\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn results;\n\t\t}\n\t\tthrow new $TypeError('Assertion failed: \"kind\" is not \"key\", \"value\", or \"key+value\": ' + kind);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/8.0/#sec-iterabletolist\n\tIterableToList: function IterableToList(items, method) {\n\t\tvar iterator = this.GetIterator(items, method);\n\t\tvar values = [];\n\t\tvar next = true;\n\t\twhile (next) {\n\t\t\tnext = this.IteratorStep(iterator);\n\t\t\tif (next) {\n\t\t\t\tvar nextValue = this.IteratorValue(next);\n\t\t\t\t$arrayPush(values, nextValue);\n\t\t\t}\n\t\t}\n\t\treturn values;\n\t}\n});\n\ndelete ES2017.EnumerableOwnNames; // replaced with EnumerableOwnProperties\ndelete ES2017.IterableToArrayLike; // replaced with IterableToList\n\nmodule.exports = ES2017;\n","'use strict';\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar keys = require('object-keys');\nvar inspect = require('object-inspect');\n\nvar ES2017 = require('./es2017');\nvar assign = require('./helpers/assign');\nvar forEach = require('./helpers/forEach');\nvar callBind = require('./helpers/callBind');\nvar every = require('./helpers/every');\nvar isPrefixOf = require('./helpers/isPrefixOf');\n\nvar $String = GetIntrinsic('%String%');\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar callBound = require('./helpers/callBound');\nvar regexTester = require('./helpers/regexTester');\nvar $isNaN = require('./helpers/isNaN');\n\nvar $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);\n// var $charAt = callBound('String.prototype.charAt');\nvar $strSlice = callBound('String.prototype.slice');\nvar $indexOf = callBound('String.prototype.indexOf');\nvar $parseInt = parseInt;\n\nvar isDigit = regexTester(/^[0-9]$/);\n\nvar $PromiseResolve = callBound('Promise.resolve', true);\n\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\nvar $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));\nvar $gOPS = $SymbolValueOf ? GetIntrinsic('%Object.getOwnPropertySymbols%') : null;\n\nvar padTimeComponent = function padTimeComponent(c, count) {\n\treturn $strSlice('00' + c, -(count || 2));\n};\n\nvar weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nvar OwnPropertyKeys = function OwnPropertyKeys(ES, source) {\n\tvar ownKeys = keys(source);\n\tif ($gOPS) {\n\t\t$pushApply(ownKeys, $gOPS(source));\n\t}\n\treturn ownKeys;\n};\n\nvar ES2018 = assign(assign({}, ES2017), {\n\tEnumerableOwnPropertyNames: ES2017.EnumerableOwnProperties,\n\n\t// https://ecma-international.org/ecma-262/9.0/#sec-thissymbolvalue\n\tthisSymbolValue: function thisSymbolValue(value) {\n\t\tif (!$SymbolValueOf) {\n\t\t\tthrow new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');\n\t\t}\n\t\tif (this.Type(value) === 'Symbol') {\n\t\t\treturn value;\n\t\t}\n\t\treturn $SymbolValueOf(value);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/9.0/#sec-isstringprefix\n\tIsStringPrefix: function IsStringPrefix(p, q) {\n\t\tif (this.Type(p) !== 'String') {\n\t\t\tthrow new TypeError('Assertion failed: \"p\" must be a String');\n\t\t}\n\n\t\tif (this.Type(q) !== 'String') {\n\t\t\tthrow new TypeError('Assertion failed: \"q\" must be a String');\n\t\t}\n\n\t\treturn isPrefixOf(p, q);\n\t\t/*\n\t\tif (p === q || p === '') {\n\t\t\treturn true;\n\t\t}\n\n\t\tvar pLength = p.length;\n\t\tvar qLength = q.length;\n\t\tif (pLength >= qLength) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// assert: pLength < qLength\n\n\t\tfor (var i = 0; i < pLength; i += 1) {\n\t\t\tif ($charAt(p, i) !== $charAt(q, i)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t\t*/\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/9.0/#sec-tostring-applied-to-the-number-type\n\tNumberToString: function NumberToString(m) {\n\t\tif (this.Type(m) !== 'Number') {\n\t\t\tthrow new TypeError('Assertion failed: \"m\" must be a String');\n\t\t}\n\n\t\treturn $String(m);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/9.0/#sec-copydataproperties\n\tCopyDataProperties: function CopyDataProperties(target, source, excludedItems) {\n\t\tif (this.Type(target) !== 'Object') {\n\t\t\tthrow new TypeError('Assertion failed: \"target\" must be an Object');\n\t\t}\n\n\t\tif (!this.IsArray(excludedItems)) {\n\t\t\tthrow new TypeError('Assertion failed: \"excludedItems\" must be a List of Property Keys');\n\t\t}\n\t\tfor (var i = 0; i < excludedItems.length; i += 1) {\n\t\t\tif (!this.IsPropertyKey(excludedItems[i])) {\n\t\t\t\tthrow new TypeError('Assertion failed: \"excludedItems\" must be a List of Property Keys');\n\t\t\t}\n\t\t}\n\n\t\tif (typeof source === 'undefined' || source === null) {\n\t\t\treturn target;\n\t\t}\n\n\t\tvar ES = this;\n\n\t\tvar fromObj = ES.ToObject(source);\n\n\t\tvar sourceKeys = OwnPropertyKeys(ES, fromObj);\n\t\tforEach(sourceKeys, function (nextKey) {\n\t\t\tvar excluded = false;\n\n\t\t\tforEach(excludedItems, function (e) {\n\t\t\t\tif (ES.SameValue(e, nextKey) === true) {\n\t\t\t\t\texcluded = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar enumerable = $isEnumerable(fromObj, nextKey) || (\n\t\t\t\t// this is to handle string keys being non-enumerable in older engines\n\t\t\t\ttypeof source === 'string'\n\t\t\t\t&& nextKey >= 0\n\t\t\t\t&& ES.IsInteger(ES.ToNumber(nextKey))\n\t\t\t);\n\t\t\tif (excluded === false && enumerable) {\n\t\t\t\tvar propValue = ES.Get(fromObj, nextKey);\n\t\t\t\tES.CreateDataProperty(target, nextKey, propValue);\n\t\t\t}\n\t\t});\n\n\t\treturn target;\n\t},\n\n\t// https://ecma-international.org/ecma-262/9.0/#sec-promise-resolve\n\tPromiseResolve: function PromiseResolve(C, x) {\n\t\tif (!$PromiseResolve) {\n\t\t\tthrow new SyntaxError('This environment does not support Promises.');\n\t\t}\n\t\treturn $PromiseResolve(C, x);\n\t},\n\n\t// http://www.ecma-international.org/ecma-262/9.0/#sec-getsubstitution\n\t// eslint-disable-next-line max-statements, max-params, max-lines-per-function\n\tGetSubstitution: function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t\tif (this.Type(matched) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `matched` must be a String');\n\t\t}\n\t\tvar matchLength = matched.length;\n\n\t\tif (this.Type(str) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `str` must be a String');\n\t\t}\n\t\tvar stringLength = str.length;\n\n\t\tif (!this.IsInteger(position) || position < 0 || position > stringLength) {\n\t\t\tthrow new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));\n\t\t}\n\n\t\tvar ES = this;\n\t\tvar isStringOrHole = function (capture, index, arr) { return ES.Type(capture) === 'String' || !(index in arr); };\n\t\tif (!this.IsArray(captures) || !every(captures, isStringOrHole)) {\n\t\t\tthrow new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));\n\t\t}\n\n\t\tif (this.Type(replacement) !== 'String') {\n\t\t\tthrow new $TypeError('Assertion failed: `replacement` must be a String');\n\t\t}\n\n\t\tvar tailPos = position + matchLength;\n\t\tvar m = captures.length;\n\t\tif (this.Type(namedCaptures) !== 'Undefined') {\n\t\t\tnamedCaptures = this.ToObject(namedCaptures); // eslint-disable-line no-param-reassign\n\t\t}\n\n\t\tvar result = '';\n\t\tfor (var i = 0; i < replacement.length; i += 1) {\n\t\t\t// if this is a $, and it's not the end of the replacement\n\t\t\tvar current = replacement[i];\n\t\t\tvar isLast = (i + 1) >= replacement.length;\n\t\t\tvar nextIsLast = (i + 2) >= replacement.length;\n\t\t\tif (current === '$' && !isLast) {\n\t\t\t\tvar next = replacement[i + 1];\n\t\t\t\tif (next === '$') {\n\t\t\t\t\tresult += '$';\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === '&') {\n\t\t\t\t\tresult += matched;\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === '`') {\n\t\t\t\t\tresult += position === 0 ? '' : $strSlice(str, 0, position - 1);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (next === \"'\") {\n\t\t\t\t\tresult += tailPos >= stringLength ? '' : $strSlice(str, tailPos);\n\t\t\t\t\ti += 1;\n\t\t\t\t} else {\n\t\t\t\t\tvar nextNext = nextIsLast ? null : replacement[i + 2];\n\t\t\t\t\tif (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {\n\t\t\t\t\t\t// $1 through $9, and not followed by a digit\n\t\t\t\t\t\tvar n = $parseInt(next, 10);\n\t\t\t\t\t\t// if (n > m, impl-defined)\n\t\t\t\t\t\tresult += (n <= m && this.Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {\n\t\t\t\t\t\t// $00 through $99\n\t\t\t\t\t\tvar nn = next + nextNext;\n\t\t\t\t\t\tvar nnI = $parseInt(nn, 10) - 1;\n\t\t\t\t\t\t// if nn === '00' or nn > m, impl-defined\n\t\t\t\t\t\tresult += (nn <= m && this.Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t} else if (next === '<') {\n\t\t\t\t\t\t// eslint-disable-next-line max-depth\n\t\t\t\t\t\tif (this.Type(namedCaptures) === 'Undefined') {\n\t\t\t\t\t\t\tresult += '$<';\n\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar endIndex = $indexOf(replacement, '>', i);\n\t\t\t\t\t\t\t// eslint-disable-next-line max-depth\n\t\t\t\t\t\t\tif (endIndex > -1) {\n\t\t\t\t\t\t\t\tvar groupName = $strSlice(replacement, i, endIndex);\n\t\t\t\t\t\t\t\tvar capture = this.Get(namedCaptures, groupName);\n\t\t\t\t\t\t\t\t// eslint-disable-next-line max-depth\n\t\t\t\t\t\t\t\tif (this.Type(capture) !== 'Undefined') {\n\t\t\t\t\t\t\t\t\tresult += this.ToString(capture);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ti += '$<' + groupName + '>'.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult += '$';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// the final $, or else not a $\n\t\t\t\tresult += replacement[i];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/9.0/#sec-datestring\n\tDateString: function DateString(tv) {\n\t\tif (this.Type(tv) !== 'Number' || $isNaN(tv)) {\n\t\t\tthrow new $TypeError('Assertion failed: `tv` must be a non-NaN Number');\n\t\t}\n\t\tvar weekday = weekdays[this.WeekDay(tv)];\n\t\tvar month = months[this.MonthFromTime(tv)];\n\t\tvar day = padTimeComponent(this.DateFromTime(tv));\n\t\tvar year = padTimeComponent(this.YearFromTime(tv), 4);\n\t\treturn weekday + '\\x20' + month + '\\x20' + day + '\\x20' + year;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/9.0/#sec-timestring\n\tTimeString: function TimeString(tv) {\n\t\tif (this.Type(tv) !== 'Number' || $isNaN(tv)) {\n\t\t\tthrow new $TypeError('Assertion failed: `tv` must be a non-NaN Number');\n\t\t}\n\t\tvar hour = this.HourFromTime(tv);\n\t\tvar minute = this.MinFromTime(tv);\n\t\tvar second = this.SecFromTime(tv);\n\t\treturn padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\\x20GMT';\n\t}\n});\n\ndelete ES2018.EnumerableOwnProperties; // replaced with EnumerableOwnPropertyNames\n\ndelete ES2018.IsPropertyDescriptor; // not an actual abstract operation\n\nmodule.exports = ES2018;\n","'use strict';\n\nvar trimStart = require('string.prototype.trimleft');\nvar trimEnd = require('string.prototype.trimright');\nvar inspect = require('object-inspect');\n\nvar ES2018 = require('./es2018');\nvar assign = require('./helpers/assign');\nvar MAX_SAFE_INTEGER = require('./helpers/maxSafeInteger');\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar ES2019 = assign(assign({}, ES2018), {\n\t// https://tc39.es/ecma262/#sec-add-entries-from-iterable\n\tAddEntriesFromIterable: function AddEntriesFromIterable(target, iterable, adder) {\n\t\tif (!this.IsCallable(adder)) {\n\t\t\tthrow new $TypeError('Assertion failed: `adder` is not callable');\n\t\t}\n\t\tif (iterable == null) {\n\t\t\tthrow new $TypeError('Assertion failed: `iterable` is present, and not nullish');\n\t\t}\n\t\tvar iteratorRecord = this.GetIterator(iterable);\n\t\twhile (true) { // eslint-disable-line no-constant-condition\n\t\t\tvar next = this.IteratorStep(iteratorRecord);\n\t\t\tif (!next) {\n\t\t\t\treturn target;\n\t\t\t}\n\t\t\tvar nextItem = this.IteratorValue(next);\n\t\t\tif (this.Type(nextItem) !== 'Object') {\n\t\t\t\tvar error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));\n\t\t\t\treturn this.IteratorClose(\n\t\t\t\t\titeratorRecord,\n\t\t\t\t\tfunction () { throw error; } // eslint-disable-line no-loop-func\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvar k = this.Get(nextItem, '0');\n\t\t\t\tvar v = this.Get(nextItem, '1');\n\t\t\t\tthis.Call(adder, target, [k, v]);\n\t\t\t} catch (e) {\n\t\t\t\treturn this.IteratorClose(\n\t\t\t\t\titeratorRecord,\n\t\t\t\t\tfunction () { throw e; } // eslint-disable-line no-loop-func\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/10.0/#sec-flattenintoarray\n\t// eslint-disable-next-line max-params, max-statements\n\tFlattenIntoArray: function FlattenIntoArray(target, source, sourceLen, start, depth) {\n\t\tvar mapperFunction;\n\t\tif (arguments.length > 5) {\n\t\t\tmapperFunction = arguments[5];\n\t\t}\n\n\t\tvar targetIndex = start;\n\t\tvar sourceIndex = 0;\n\t\twhile (sourceIndex < sourceLen) {\n\t\t\tvar P = this.ToString(sourceIndex);\n\t\t\tvar exists = this.HasProperty(source, P);\n\t\t\tif (exists === true) {\n\t\t\t\tvar element = this.Get(source, P);\n\t\t\t\tif (typeof mapperFunction !== 'undefined') {\n\t\t\t\t\tif (arguments.length <= 6) {\n\t\t\t\t\t\tthrow new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');\n\t\t\t\t\t}\n\t\t\t\t\telement = this.Call(mapperFunction, arguments[6], [element, sourceIndex, source]);\n\t\t\t\t}\n\t\t\t\tvar shouldFlatten = false;\n\t\t\t\tif (depth > 0) {\n\t\t\t\t\tshouldFlatten = this.IsArray(element);\n\t\t\t\t}\n\t\t\t\tif (shouldFlatten) {\n\t\t\t\t\tvar elementLen = this.ToLength(this.Get(element, 'length'));\n\t\t\t\t\ttargetIndex = this.FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);\n\t\t\t\t} else {\n\t\t\t\t\tif (targetIndex >= MAX_SAFE_INTEGER) {\n\t\t\t\t\t\tthrow new $TypeError('index too large');\n\t\t\t\t\t}\n\t\t\t\t\tthis.CreateDataPropertyOrThrow(target, this.ToString(targetIndex), element);\n\t\t\t\t\ttargetIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsourceIndex += 1;\n\t\t}\n\n\t\treturn targetIndex;\n\t},\n\n\t// https://ecma-international.org/ecma-262/10.0/#sec-trimstring\n\tTrimString: function TrimString(string, where) {\n\t\tvar str = this.RequireObjectCoercible(string);\n\t\tvar S = this.ToString(str);\n\t\tvar T;\n\t\tif (where === 'start') {\n\t\t\tT = trimStart(S);\n\t\t} else if (where === 'end') {\n\t\t\tT = trimEnd(S);\n\t\t} else if (where === 'start+end') {\n\t\t\tT = trimStart(trimEnd(S));\n\t\t} else {\n\t\t\tthrow new $TypeError('Assertion failed: invalid `where` value; must be \"start\", \"end\", or \"start+end\"');\n\t\t}\n\t\treturn T;\n\t}\n});\n\nmodule.exports = ES2019;\n","'use strict';\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar $Object = GetIntrinsic('%Object%');\nvar $EvalError = GetIntrinsic('%EvalError%');\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $String = GetIntrinsic('%String%');\nvar $Date = GetIntrinsic('%Date%');\nvar $Number = GetIntrinsic('%Number%');\nvar $floor = GetIntrinsic('%Math.floor%');\nvar $DateUTC = GetIntrinsic('%Date.UTC%');\nvar $abs = GetIntrinsic('%Math.abs%');\n\nvar assertRecord = require('./helpers/assertRecord');\nvar isPropertyDescriptor = require('./helpers/isPropertyDescriptor');\nvar $isNaN = require('./helpers/isNaN');\nvar $isFinite = require('./helpers/isFinite');\nvar sign = require('./helpers/sign');\nvar mod = require('./helpers/mod');\nvar isPrefixOf = require('./helpers/isPrefixOf');\nvar callBound = require('./helpers/callBound');\n\nvar IsCallable = require('is-callable');\nvar toPrimitive = require('es-to-primitive/es5');\n\nvar has = require('has');\n\nvar $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');\n\nvar HoursPerDay = 24;\nvar MinutesPerHour = 60;\nvar SecondsPerMinute = 60;\nvar msPerSecond = 1e3;\nvar msPerMinute = msPerSecond * SecondsPerMinute;\nvar msPerHour = msPerMinute * MinutesPerHour;\nvar msPerDay = 86400000;\n\n// https://es5.github.io/#x9\nvar ES5 = {\n\tToPrimitive: toPrimitive,\n\n\tToBoolean: function ToBoolean(value) {\n\t\treturn !!value;\n\t},\n\tToNumber: function ToNumber(value) {\n\t\treturn +value; // eslint-disable-line no-implicit-coercion\n\t},\n\tToInteger: function ToInteger(value) {\n\t\tvar number = this.ToNumber(value);\n\t\tif ($isNaN(number)) { return 0; }\n\t\tif (number === 0 || !$isFinite(number)) { return number; }\n\t\treturn sign(number) * Math.floor(Math.abs(number));\n\t},\n\tToInt32: function ToInt32(x) {\n\t\treturn this.ToNumber(x) >> 0;\n\t},\n\tToUint32: function ToUint32(x) {\n\t\treturn this.ToNumber(x) >>> 0;\n\t},\n\tToUint16: function ToUint16(value) {\n\t\tvar number = this.ToNumber(value);\n\t\tif ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }\n\t\tvar posInt = sign(number) * Math.floor(Math.abs(number));\n\t\treturn mod(posInt, 0x10000);\n\t},\n\tToString: function ToString(value) {\n\t\treturn $String(value);\n\t},\n\tToObject: function ToObject(value) {\n\t\tthis.CheckObjectCoercible(value);\n\t\treturn $Object(value);\n\t},\n\tCheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {\n\t\t/* jshint eqnull:true */\n\t\tif (value == null) {\n\t\t\tthrow new $TypeError(optMessage || 'Cannot call method on ' + value);\n\t\t}\n\t\treturn value;\n\t},\n\tIsCallable: IsCallable,\n\tSameValue: function SameValue(x, y) {\n\t\tif (x === y) { // 0 === -0, but they are not identical.\n\t\t\tif (x === 0) { return 1 / x === 1 / y; }\n\t\t\treturn true;\n\t\t}\n\t\treturn $isNaN(x) && $isNaN(y);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8\n\tType: function Type(x) {\n\t\tif (x === null) {\n\t\t\treturn 'Null';\n\t\t}\n\t\tif (typeof x === 'undefined') {\n\t\t\treturn 'Undefined';\n\t\t}\n\t\tif (typeof x === 'function' || typeof x === 'object') {\n\t\t\treturn 'Object';\n\t\t}\n\t\tif (typeof x === 'number') {\n\t\t\treturn 'Number';\n\t\t}\n\t\tif (typeof x === 'boolean') {\n\t\t\treturn 'Boolean';\n\t\t}\n\t\tif (typeof x === 'string') {\n\t\t\treturn 'String';\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type\n\tIsPropertyDescriptor: function IsPropertyDescriptor(Desc) {\n\t\treturn isPropertyDescriptor(this, Desc);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.1\n\tIsAccessorDescriptor: function IsAccessorDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tif (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.2\n\tIsDataDescriptor: function IsDataDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tif (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.3\n\tIsGenericDescriptor: function IsGenericDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tif (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.4\n\tFromPropertyDescriptor: function FromPropertyDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn Desc;\n\t\t}\n\n\t\tassertRecord(this, 'Property Descriptor', 'Desc', Desc);\n\n\t\tif (this.IsDataDescriptor(Desc)) {\n\t\t\treturn {\n\t\t\t\tvalue: Desc['[[Value]]'],\n\t\t\t\twritable: !!Desc['[[Writable]]'],\n\t\t\t\tenumerable: !!Desc['[[Enumerable]]'],\n\t\t\t\tconfigurable: !!Desc['[[Configurable]]']\n\t\t\t};\n\t\t} else if (this.IsAccessorDescriptor(Desc)) {\n\t\t\treturn {\n\t\t\t\tget: Desc['[[Get]]'],\n\t\t\t\tset: Desc['[[Set]]'],\n\t\t\t\tenumerable: !!Desc['[[Enumerable]]'],\n\t\t\t\tconfigurable: !!Desc['[[Configurable]]']\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5\n\tToPropertyDescriptor: function ToPropertyDescriptor(Obj) {\n\t\tif (this.Type(Obj) !== 'Object') {\n\t\t\tthrow new $TypeError('ToPropertyDescriptor requires an object');\n\t\t}\n\n\t\tvar desc = {};\n\t\tif (has(Obj, 'enumerable')) {\n\t\t\tdesc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);\n\t\t}\n\t\tif (has(Obj, 'configurable')) {\n\t\t\tdesc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);\n\t\t}\n\t\tif (has(Obj, 'value')) {\n\t\t\tdesc['[[Value]]'] = Obj.value;\n\t\t}\n\t\tif (has(Obj, 'writable')) {\n\t\t\tdesc['[[Writable]]'] = this.ToBoolean(Obj.writable);\n\t\t}\n\t\tif (has(Obj, 'get')) {\n\t\t\tvar getter = Obj.get;\n\t\t\tif (typeof getter !== 'undefined' && !this.IsCallable(getter)) {\n\t\t\t\tthrow new TypeError('getter must be a function');\n\t\t\t}\n\t\t\tdesc['[[Get]]'] = getter;\n\t\t}\n\t\tif (has(Obj, 'set')) {\n\t\t\tvar setter = Obj.set;\n\t\t\tif (typeof setter !== 'undefined' && !this.IsCallable(setter)) {\n\t\t\t\tthrow new $TypeError('setter must be a function');\n\t\t\t}\n\t\t\tdesc['[[Set]]'] = setter;\n\t\t}\n\n\t\tif ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {\n\t\t\tthrow new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');\n\t\t}\n\t\treturn desc;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-11.9.3\n\t'Abstract Equality Comparison': function AbstractEqualityComparison(x, y) {\n\t\tvar xType = this.Type(x);\n\t\tvar yType = this.Type(y);\n\t\tif (xType === yType) {\n\t\t\treturn x === y; // ES6+ specified this shortcut anyways.\n\t\t}\n\t\tif (x == null && y == null) {\n\t\t\treturn true;\n\t\t}\n\t\tif (xType === 'Number' && yType === 'String') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToNumber(y));\n\t\t}\n\t\tif (xType === 'String' && yType === 'Number') {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToNumber(x), y);\n\t\t}\n\t\tif (xType === 'Boolean') {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToNumber(x), y);\n\t\t}\n\t\tif (yType === 'Boolean') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToNumber(y));\n\t\t}\n\t\tif ((xType === 'String' || xType === 'Number') && yType === 'Object') {\n\t\t\treturn this['Abstract Equality Comparison'](x, this.ToPrimitive(y));\n\t\t}\n\t\tif (xType === 'Object' && (yType === 'String' || yType === 'Number')) {\n\t\t\treturn this['Abstract Equality Comparison'](this.ToPrimitive(x), y);\n\t\t}\n\t\treturn false;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-11.9.6\n\t'Strict Equality Comparison': function StrictEqualityComparison(x, y) {\n\t\tvar xType = this.Type(x);\n\t\tvar yType = this.Type(y);\n\t\tif (xType !== yType) {\n\t\t\treturn false;\n\t\t}\n\t\tif (xType === 'Undefined' || xType === 'Null') {\n\t\t\treturn true;\n\t\t}\n\t\treturn x === y; // shortcut for steps 4-7\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-11.8.5\n\t// eslint-disable-next-line max-statements\n\t'Abstract Relational Comparison': function AbstractRelationalComparison(x, y, LeftFirst) {\n\t\tif (this.Type(LeftFirst) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');\n\t\t}\n\t\tvar px;\n\t\tvar py;\n\t\tif (LeftFirst) {\n\t\t\tpx = this.ToPrimitive(x, $Number);\n\t\t\tpy = this.ToPrimitive(y, $Number);\n\t\t} else {\n\t\t\tpy = this.ToPrimitive(y, $Number);\n\t\t\tpx = this.ToPrimitive(x, $Number);\n\t\t}\n\t\tvar bothStrings = this.Type(px) === 'String' && this.Type(py) === 'String';\n\t\tif (!bothStrings) {\n\t\t\tvar nx = this.ToNumber(px);\n\t\t\tvar ny = this.ToNumber(py);\n\t\t\tif ($isNaN(nx) || $isNaN(ny)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif ($isFinite(nx) && $isFinite(ny) && nx === ny) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (nx === 0 && ny === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (nx === Infinity) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (ny === Infinity) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (ny === -Infinity) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (nx === -Infinity) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn nx < ny; // by now, these are both nonzero, finite, and not equal\n\t\t}\n\t\tif (isPrefixOf(py, px)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (isPrefixOf(px, py)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn px < py; // both strings, neither a prefix of the other. shortcut for steps c-f\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10\n\tmsFromTime: function msFromTime(t) {\n\t\treturn mod(t, msPerSecond);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10\n\tSecFromTime: function SecFromTime(t) {\n\t\treturn mod($floor(t / msPerSecond), SecondsPerMinute);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10\n\tMinFromTime: function MinFromTime(t) {\n\t\treturn mod($floor(t / msPerMinute), MinutesPerHour);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10\n\tHourFromTime: function HourFromTime(t) {\n\t\treturn mod($floor(t / msPerHour), HoursPerDay);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2\n\tDay: function Day(t) {\n\t\treturn $floor(t / msPerDay);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2\n\tTimeWithinDay: function TimeWithinDay(t) {\n\t\treturn mod(t, msPerDay);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3\n\tDayFromYear: function DayFromYear(y) {\n\t\treturn (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3\n\tTimeFromYear: function TimeFromYear(y) {\n\t\treturn msPerDay * this.DayFromYear(y);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3\n\tYearFromTime: function YearFromTime(t) {\n\t\t// largest y such that this.TimeFromYear(y) <= t\n\t\treturn $getUTCFullYear(new $Date(t));\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6\n\tWeekDay: function WeekDay(t) {\n\t\treturn mod(this.Day(t) + 4, 7);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3\n\tDaysInYear: function DaysInYear(y) {\n\t\tif (mod(y, 4) !== 0) {\n\t\t\treturn 365;\n\t\t}\n\t\tif (mod(y, 100) !== 0) {\n\t\t\treturn 366;\n\t\t}\n\t\tif (mod(y, 400) !== 0) {\n\t\t\treturn 365;\n\t\t}\n\t\treturn 366;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3\n\tInLeapYear: function InLeapYear(t) {\n\t\tvar days = this.DaysInYear(this.YearFromTime(t));\n\t\tif (days === 365) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (days === 366) {\n\t\t\treturn 1;\n\t\t}\n\t\tthrow new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4\n\tDayWithinYear: function DayWithinYear(t) {\n\t\treturn this.Day(t) - this.DayFromYear(this.YearFromTime(t));\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4\n\tMonthFromTime: function MonthFromTime(t) {\n\t\tvar day = this.DayWithinYear(t);\n\t\tif (0 <= day && day < 31) {\n\t\t\treturn 0;\n\t\t}\n\t\tvar leap = this.InLeapYear(t);\n\t\tif (31 <= day && day < (59 + leap)) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ((59 + leap) <= day && day < (90 + leap)) {\n\t\t\treturn 2;\n\t\t}\n\t\tif ((90 + leap) <= day && day < (120 + leap)) {\n\t\t\treturn 3;\n\t\t}\n\t\tif ((120 + leap) <= day && day < (151 + leap)) {\n\t\t\treturn 4;\n\t\t}\n\t\tif ((151 + leap) <= day && day < (181 + leap)) {\n\t\t\treturn 5;\n\t\t}\n\t\tif ((181 + leap) <= day && day < (212 + leap)) {\n\t\t\treturn 6;\n\t\t}\n\t\tif ((212 + leap) <= day && day < (243 + leap)) {\n\t\t\treturn 7;\n\t\t}\n\t\tif ((243 + leap) <= day && day < (273 + leap)) {\n\t\t\treturn 8;\n\t\t}\n\t\tif ((273 + leap) <= day && day < (304 + leap)) {\n\t\t\treturn 9;\n\t\t}\n\t\tif ((304 + leap) <= day && day < (334 + leap)) {\n\t\t\treturn 10;\n\t\t}\n\t\tif ((334 + leap) <= day && day < (365 + leap)) {\n\t\t\treturn 11;\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5\n\tDateFromTime: function DateFromTime(t) {\n\t\tvar m = this.MonthFromTime(t);\n\t\tvar d = this.DayWithinYear(t);\n\t\tif (m === 0) {\n\t\t\treturn d + 1;\n\t\t}\n\t\tif (m === 1) {\n\t\t\treturn d - 30;\n\t\t}\n\t\tvar leap = this.InLeapYear(t);\n\t\tif (m === 2) {\n\t\t\treturn d - 58 - leap;\n\t\t}\n\t\tif (m === 3) {\n\t\t\treturn d - 89 - leap;\n\t\t}\n\t\tif (m === 4) {\n\t\t\treturn d - 119 - leap;\n\t\t}\n\t\tif (m === 5) {\n\t\t\treturn d - 150 - leap;\n\t\t}\n\t\tif (m === 6) {\n\t\t\treturn d - 180 - leap;\n\t\t}\n\t\tif (m === 7) {\n\t\t\treturn d - 211 - leap;\n\t\t}\n\t\tif (m === 8) {\n\t\t\treturn d - 242 - leap;\n\t\t}\n\t\tif (m === 9) {\n\t\t\treturn d - 272 - leap;\n\t\t}\n\t\tif (m === 10) {\n\t\t\treturn d - 303 - leap;\n\t\t}\n\t\tif (m === 11) {\n\t\t\treturn d - 333 - leap;\n\t\t}\n\t\tthrow new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12\n\tMakeDay: function MakeDay(year, month, date) {\n\t\tif (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {\n\t\t\treturn NaN;\n\t\t}\n\t\tvar y = this.ToInteger(year);\n\t\tvar m = this.ToInteger(month);\n\t\tvar dt = this.ToInteger(date);\n\t\tvar ym = y + $floor(m / 12);\n\t\tvar mn = mod(m, 12);\n\t\tvar t = $DateUTC(ym, mn, 1);\n\t\tif (this.YearFromTime(t) !== ym || this.MonthFromTime(t) !== mn || this.DateFromTime(t) !== 1) {\n\t\t\treturn NaN;\n\t\t}\n\t\treturn this.Day(t) + dt - 1;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13\n\tMakeDate: function MakeDate(day, time) {\n\t\tif (!$isFinite(day) || !$isFinite(time)) {\n\t\t\treturn NaN;\n\t\t}\n\t\treturn (day * msPerDay) + time;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11\n\tMakeTime: function MakeTime(hour, min, sec, ms) {\n\t\tif (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {\n\t\t\treturn NaN;\n\t\t}\n\t\tvar h = this.ToInteger(hour);\n\t\tvar m = this.ToInteger(min);\n\t\tvar s = this.ToInteger(sec);\n\t\tvar milli = this.ToInteger(ms);\n\t\tvar t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;\n\t\treturn t;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14\n\tTimeClip: function TimeClip(time) {\n\t\tif (!$isFinite(time) || $abs(time) > 8.64e15) {\n\t\t\treturn NaN;\n\t\t}\n\t\treturn $Number(new $Date(this.ToNumber(time)));\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-5.2\n\tmodulo: function modulo(x, y) {\n\t\treturn mod(x, y);\n\t}\n};\n\nmodule.exports = ES5;\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $SyntaxError = GetIntrinsic('%SyntaxError%');\n\nvar has = require('has');\n\nvar predicates = {\n\t// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type\n\t'Property Descriptor': function isPropertyDescriptor(ES, Desc) {\n\t\tif (ES.Type(Desc) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tvar allowed = {\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': true,\n\t\t\t'[[Get]]': true,\n\t\t\t'[[Set]]': true,\n\t\t\t'[[Value]]': true,\n\t\t\t'[[Writable]]': true\n\t\t};\n\n\t\tfor (var key in Desc) { // eslint-disable-line\n\t\t\tif (has(Desc, key) && !allowed[key]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tvar isData = has(Desc, '[[Value]]');\n\t\tvar IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');\n\t\tif (isData && IsAccessor) {\n\t\t\tthrow new $TypeError('Property Descriptors may not be both accessor and data descriptors');\n\t\t}\n\t\treturn true;\n\t}\n};\n\nmodule.exports = function assertRecord(ES, recordType, argumentName, value) {\n\tvar predicate = predicates[recordType];\n\tif (typeof predicate !== 'function') {\n\t\tthrow new $SyntaxError('unknown record type: ' + recordType);\n\t}\n\tif (!predicate(ES, value)) {\n\t\tthrow new $TypeError(argumentName + ' must be a ' + recordType);\n\t}\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar has = require('has');\n\nvar $assign = GetIntrinsic('%Object%').assign;\n\nmodule.exports = function assign(target, source) {\n\tif ($assign) {\n\t\treturn $assign(target, source);\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tfor (var key in source) {\n\t\tif (has(source, key)) {\n\t\t\ttarget[key] = source[key];\n\t\t}\n\t}\n\treturn target;\n};\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Function = GetIntrinsic('%Function%');\nvar $apply = $Function.apply;\nvar $call = $Function.call;\n\nmodule.exports = function callBind() {\n\treturn bind.apply($call, arguments);\n};\n\nmodule.exports.apply = function applyBind() {\n\treturn bind.apply($apply, arguments);\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar callBind = require('./callBind');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nmodule.exports = function every(array, predicate) {\n\tfor (var i = 0; i < array.length; i += 1) {\n\t\tif (!predicate(array[i], i, array)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n","'use strict';\n\nmodule.exports = function forEach(array, callback) {\n\tfor (var i = 0; i < array.length; i += 1) {\n\t\tcallback(array[i], i, array); // eslint-disable-line callback-return\n\t}\n};\n","'use strict';\n\nvar getInferredName;\ntry {\n\t// eslint-disable-next-line no-new-func\n\tgetInferredName = Function('s', 'return { [s]() {} }[s].name;');\n} catch (e) {}\n\nvar inferred = function () {};\nmodule.exports = getInferredName && inferred.name === 'inferred' ? getInferredName : null;\n","'use strict';\n\nvar hasSymbols = require('has-symbols')();\nvar GetIntrinsic = require('../GetIntrinsic');\nvar callBound = require('./callBound');\n\nvar $iterator = GetIntrinsic('%Symbol.iterator%', true);\nvar $arraySlice = callBound('Array.prototype.slice');\nvar $arrayJoin = callBound('Array.prototype.join');\n\nmodule.exports = function getIteratorMethod(ES, iterable) {\n\tvar usingIterator;\n\tif (hasSymbols) {\n\t\tusingIterator = ES.GetMethod(iterable, $iterator);\n\t} else if (ES.IsArray(iterable)) {\n\t\tusingIterator = function () {\n\t\t\tvar i = -1;\n\t\t\tvar arr = this; // eslint-disable-line no-invalid-this\n\t\t\treturn {\n\t\t\t\tnext: function () {\n\t\t\t\t\ti += 1;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: i >= arr.length,\n\t\t\t\t\t\tvalue: arr[i]\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t} else if (ES.Type(iterable) === 'String') {\n\t\tusingIterator = function () {\n\t\t\tvar i = 0;\n\t\t\treturn {\n\t\t\t\tnext: function () {\n\t\t\t\t\tvar nextIndex = ES.AdvanceStringIndex(iterable, i, true);\n\t\t\t\t\tvar value = $arrayJoin($arraySlice(iterable, i, nextIndex), '');\n\t\t\t\t\ti = nextIndex;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: nextIndex > iterable.length,\n\t\t\t\t\t\tvalue: value\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t}\n\treturn usingIterator;\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar originalGetProto = GetIntrinsic('%Object.getPrototypeOf%', true);\nvar $ArrayProto = GetIntrinsic('%Array.prototype%');\n\nmodule.exports = originalGetProto || (\n\t// eslint-disable-next-line no-proto\n\t[].__proto__ === $ArrayProto\n\t\t? function (O) {\n\t\t\treturn O.__proto__; // eslint-disable-line no-proto\n\t\t}\n\t\t: null\n);\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar callBound = require('./callBound');\n\nvar $SyntaxError = GetIntrinsic('%SyntaxError%');\nvar symToStr = callBound('Symbol.prototype.toString', true);\n\nvar getInferredName = require('./getInferredName');\n\nmodule.exports = function getSymbolDescription(symbol) {\n\tif (!symToStr) {\n\t\tthrow new $SyntaxError('Symbols are not supported in this environment');\n\t}\n\tvar str = symToStr(symbol); // will throw if not a symbol\n\n\tif (getInferredName) {\n\t\tvar name = getInferredName(symbol);\n\t\tif (name === '') { return; }\n\t\t// eslint-disable-next-line consistent-return\n\t\treturn name.slice(1, -1); // name.slice('['.length, -']'.length);\n\t}\n\n\tvar desc = str.slice(7, -1); // str.slice('Symbol('.length, -')'.length);\n\tif (desc) {\n\t\t// eslint-disable-next-line consistent-return\n\t\treturn desc;\n\t}\n};\n","'use strict';\n\nvar $isNaN = Number.isNaN || function (a) { return a !== a; };\n\nmodule.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };\n","'use strict';\n\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\nvar $strSlice = require('../helpers/callBound')('String.prototype.slice');\n\nmodule.exports = function isPrefixOf(prefix, string) {\n\tif (prefix === string) {\n\t\treturn true;\n\t}\n\tif (prefix.length > string.length) {\n\t\treturn false;\n\t}\n\treturn $strSlice(string, 0, prefix.length) === prefix;\n};\n","'use strict';\n\nmodule.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar has = require('has');\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nmodule.exports = function IsPropertyDescriptor(ES, Desc) {\n\tif (ES.Type(Desc) !== 'Object') {\n\t\treturn false;\n\t}\n\tvar allowed = {\n\t\t'[[Configurable]]': true,\n\t\t'[[Enumerable]]': true,\n\t\t'[[Get]]': true,\n\t\t'[[Set]]': true,\n\t\t'[[Value]]': true,\n\t\t'[[Writable]]': true\n\t};\n\n for (var key in Desc) { // eslint-disable-line\n\t\tif (has(Desc, key) && !allowed[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {\n\t\tthrow new $TypeError('Property Descriptors may not be both accessor and data descriptors');\n\t}\n\treturn true;\n};\n","'use strict';\n\nvar every = require('./every');\n\nmodule.exports = function isSamePropertyDescriptor(ES, D1, D2) {\n\tvar fields = [\n\t\t'[[Configurable]]',\n\t\t'[[Enumerable]]',\n\t\t'[[Get]]',\n\t\t'[[Set]]',\n\t\t'[[Value]]',\n\t\t'[[Writable]]'\n\t];\n\treturn every(fields, function (field) {\n\t\tif ((field in D1) !== (field in D2)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn ES.SameValue(D1[field], D2[field]);\n\t});\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Math = GetIntrinsic('%Math%');\nvar $Number = GetIntrinsic('%Number%');\n\nmodule.exports = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1;\n","'use strict';\n\nmodule.exports = function mod(number, modulo) {\n\tvar remain = number % modulo;\n\treturn Math.floor(remain >= 0 ? remain : remain + modulo);\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $test = GetIntrinsic('RegExp.prototype.test');\n\nvar callBind = require('./callBind');\n\nmodule.exports = function regexTester(regex) {\n\treturn callBind($test, regex);\n};\n","'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar originalSetProto = GetIntrinsic('%Object.setPrototypeOf%', true);\nvar $ArrayProto = GetIntrinsic('%Array.prototype%');\n\nmodule.exports = originalSetProto || (\n\t// eslint-disable-next-line no-proto, no-negated-condition\n\t[].__proto__ !== $ArrayProto\n\t\t? null\n\t\t: function (O, proto) {\n\t\t\tO.__proto__ = proto; // eslint-disable-line no-proto\n\t\t\treturn O;\n\t\t}\n);\n","'use strict';\n\nmodule.exports = function sign(number) {\n\treturn number >= 0 ? 1 : -1;\n};\n","'use strict';\n\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';\n\nvar isPrimitive = require('./helpers/isPrimitive');\nvar isCallable = require('is-callable');\nvar isDate = require('is-date-object');\nvar isSymbol = require('is-symbol');\n\nvar ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {\n\tif (typeof O === 'undefined' || O === null) {\n\t\tthrow new TypeError('Cannot call method on ' + O);\n\t}\n\tif (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {\n\t\tthrow new TypeError('hint must be \"string\" or \"number\"');\n\t}\n\tvar methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];\n\tvar method, result, i;\n\tfor (i = 0; i < methodNames.length; ++i) {\n\t\tmethod = O[methodNames[i]];\n\t\tif (isCallable(method)) {\n\t\t\tresult = method.call(O);\n\t\t\tif (isPrimitive(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new TypeError('No default value');\n};\n\nvar GetMethod = function GetMethod(O, P) {\n\tvar func = O[P];\n\tif (func !== null && typeof func !== 'undefined') {\n\t\tif (!isCallable(func)) {\n\t\t\tthrow new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');\n\t\t}\n\t\treturn func;\n\t}\n\treturn void 0;\n};\n\n// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive\nmodule.exports = function ToPrimitive(input) {\n\tif (isPrimitive(input)) {\n\t\treturn input;\n\t}\n\tvar hint = 'default';\n\tif (arguments.length > 1) {\n\t\tif (arguments[1] === String) {\n\t\t\thint = 'string';\n\t\t} else if (arguments[1] === Number) {\n\t\t\thint = 'number';\n\t\t}\n\t}\n\n\tvar exoticToPrim;\n\tif (hasSymbols) {\n\t\tif (Symbol.toPrimitive) {\n\t\t\texoticToPrim = GetMethod(input, Symbol.toPrimitive);\n\t\t} else if (isSymbol(input)) {\n\t\t\texoticToPrim = Symbol.prototype.valueOf;\n\t\t}\n\t}\n\tif (typeof exoticToPrim !== 'undefined') {\n\t\tvar result = exoticToPrim.call(input, hint);\n\t\tif (isPrimitive(result)) {\n\t\t\treturn result;\n\t\t}\n\t\tthrow new TypeError('unable to convert exotic object to primitive');\n\t}\n\tif (hint === 'default' && (isDate(input) || isSymbol(input))) {\n\t\thint = 'string';\n\t}\n\treturn ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);\n};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nvar isPrimitive = require('./helpers/isPrimitive');\n\nvar isCallable = require('is-callable');\n\n// http://ecma-international.org/ecma-262/5.1/#sec-8.12.8\nvar ES5internalSlots = {\n\t'[[DefaultValue]]': function (O) {\n\t\tvar actualHint;\n\t\tif (arguments.length > 1) {\n\t\t\tactualHint = arguments[1];\n\t\t} else {\n\t\t\tactualHint = toStr.call(O) === '[object Date]' ? String : Number;\n\t\t}\n\n\t\tif (actualHint === String || actualHint === Number) {\n\t\t\tvar methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];\n\t\t\tvar value, i;\n\t\t\tfor (i = 0; i < methods.length; ++i) {\n\t\t\t\tif (isCallable(O[methods[i]])) {\n\t\t\t\t\tvalue = O[methods[i]]();\n\t\t\t\t\tif (isPrimitive(value)) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new TypeError('No default value');\n\t\t}\n\t\tthrow new TypeError('invalid [[DefaultValue]] hint supplied');\n\t}\n};\n\n// http://ecma-international.org/ecma-262/5.1/#sec-9.1\nmodule.exports = function ToPrimitive(input) {\n\tif (isPrimitive(input)) {\n\t\treturn input;\n\t}\n\tif (arguments.length > 1) {\n\t\treturn ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);\n\t}\n\treturn ES5internalSlots['[[DefaultValue]]'](input);\n};\n","'use strict';\n\nmodule.exports = require('./es2015');\n","module.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n","// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.5.4 - JavaScript Events Library │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n var version = \"0.5.4\",\n has = \"hasOwnProperty\",\n separator = /[\\.\\/]/,\n comaseparator = /\\s*,\\s*/,\n wildcard = \"*\",\n numsort = function (a, b) {\n return a - b;\n },\n current_event,\n stop,\n events = {n: {}},\n firstDefined = function () {\n for (var i = 0, ii = this.length; i < ii; i++) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n lastDefined = function () {\n var i = this.length;\n while (--i) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n objtos = Object.prototype.toString,\n Str = String,\n isArray = Array.isArray || function (ar) {\n return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n },\n /*\\\n * eve\n [ method ]\n\n * Fires event with given `name`, given scope and other parameters.\n\n - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n - scope (object) context for the event handlers\n - varargs (...) the rest of arguments will be sent to event handlers\n\n = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n \\*/\n eve = function (name, scope) {\n var oldstop = stop,\n args = Array.prototype.slice.call(arguments, 2),\n listeners = eve.listeners(name),\n z = 0,\n l,\n indexed = [],\n queue = {},\n out = [],\n ce = current_event;\n out.firstDefined = firstDefined;\n out.lastDefined = lastDefined;\n current_event = name;\n stop = 0;\n for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n indexed.push(listeners[i].zIndex);\n if (listeners[i].zIndex < 0) {\n queue[listeners[i].zIndex] = listeners[i];\n }\n }\n indexed.sort(numsort);\n while (indexed[z] < 0) {\n l = queue[indexed[z++]];\n out.push(l.apply(scope, args));\n if (stop) {\n stop = oldstop;\n return out;\n }\n }\n for (i = 0; i < ii; i++) {\n l = listeners[i];\n if (\"zIndex\" in l) {\n if (l.zIndex == indexed[z]) {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n do {\n z++;\n l = queue[indexed[z]];\n l && out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n } while (l)\n } else {\n queue[l.zIndex] = l;\n }\n } else {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n }\n }\n stop = oldstop;\n current_event = ce;\n return out;\n };\n // Undocumented. Debug only.\n eve._events = events;\n /*\\\n * eve.listeners\n [ method ]\n\n * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n = (array) array of event handlers\n \\*/\n eve.listeners = function (name) {\n var names = isArray(name) ? name : name.split(separator),\n e = events,\n item,\n items,\n k,\n i,\n ii,\n j,\n jj,\n nes,\n es = [e],\n out = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n nes = [];\n for (j = 0, jj = es.length; j < jj; j++) {\n e = es[j].n;\n items = [e[names[i]], e[wildcard]];\n k = 2;\n while (k--) {\n item = items[k];\n if (item) {\n nes.push(item);\n out = out.concat(item.f || []);\n }\n }\n }\n es = nes;\n }\n return out;\n };\n /*\\\n * eve.separator\n [ method ]\n\n * If for some reasons you don’t like default separators (`.` or `/`) you can specify yours\n * here. Be aware that if you pass a string longer than one character it will be treated as\n * a list of characters.\n\n - separator (string) new separator. Empty string resets to default: `.` or `/`.\n \\*/\n eve.separator = function (sep) {\n if (sep) {\n sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n sep = \"[\" + sep + \"]\";\n separator = new RegExp(sep);\n } else {\n separator = /[\\.\\/]/;\n }\n };\n /*\\\n * eve.on\n [ method ]\n **\n * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n | eve.on(\"*.under.*\", f);\n | eve(\"mouse.under.floor\"); // triggers f\n * Use @eve to trigger the listener.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n - name (array) if you don’t want to use separators, you can use array of strings\n - f (function) event handler function\n **\n = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment.\n > Example:\n | eve.on(\"mouse\", eatIt)(2);\n | eve.on(\"mouse\", scream);\n | eve.on(\"mouse\", catchIt)(1);\n * This will ensure that `catchIt` function will be called before `eatIt`.\n *\n * If you want to put your handler before non-indexed handlers, specify a negative value.\n * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n \\*/\n eve.on = function (name, f) {\n if (typeof f != \"function\") {\n return function () {};\n }\n var names = isArray(name) ? isArray(name[0]) ? name : [name] : Str(name).split(comaseparator);\n for (var i = 0, ii = names.length; i < ii; i++) {\n (function (name) {\n var names = isArray(name) ? name : Str(name).split(separator),\n e = events,\n exist;\n for (var i = 0, ii = names.length; i < ii; i++) {\n e = e.n;\n e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n }\n e.f = e.f || [];\n for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n exist = true;\n break;\n }\n !exist && e.f.push(f);\n }(names[i]));\n }\n return function (zIndex) {\n if (+zIndex == +zIndex) {\n f.zIndex = +zIndex;\n }\n };\n };\n /*\\\n * eve.f\n [ method ]\n **\n * Returns function that will fire given event with optional arguments.\n * Arguments that will be passed to the result function will be also\n * concated to the list of final arguments.\n | el.onclick = eve.f(\"click\", 1, 2);\n | eve.on(\"click\", function (a, b, c) {\n | console.log(a, b, c); // 1, 2, [event object]\n | });\n - event (string) event name\n - varargs (…) and any other arguments\n = (function) possible event handler function\n \\*/\n eve.f = function (event) {\n var attrs = [].slice.call(arguments, 1);\n return function () {\n eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n };\n };\n /*\\\n * eve.stop\n [ method ]\n **\n * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n \\*/\n eve.stop = function () {\n stop = 1;\n };\n /*\\\n * eve.nt\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n - subname (string) #optional subname of the event\n **\n = (string) name of the event, if `subname` is not specified\n * or\n = (boolean) `true`, if current event’s name contains `subname`\n \\*/\n eve.nt = function (subname) {\n var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n if (subname) {\n return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n }\n return cur;\n };\n /*\\\n * eve.nts\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n **\n = (array) names of the event\n \\*/\n eve.nts = function () {\n return isArray(current_event) ? current_event : current_event.split(separator);\n };\n /*\\\n * eve.off\n [ method ]\n **\n * Removes given function from the list of event listeners assigned to given name.\n * If no arguments specified all the events will be cleared.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n \\*/\n /*\\\n * eve.unbind\n [ method ]\n **\n * See @eve.off\n \\*/\n eve.off = eve.unbind = function (name, f) {\n if (!name) {\n eve._events = events = {n: {}};\n return;\n }\n var names = isArray(name) ? isArray(name[0]) ? name : [name] : Str(name).split(comaseparator);\n if (names.length > 1) {\n for (var i = 0, ii = names.length; i < ii; i++) {\n eve.off(names[i], f);\n }\n return;\n }\n names = isArray(name) ? name : Str(name).split(separator);\n var e,\n key,\n splice,\n i, ii, j, jj,\n cur = [events],\n inodes = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n for (j = 0; j < cur.length; j += splice.length - 2) {\n splice = [j, 1];\n e = cur[j].n;\n if (names[i] != wildcard) {\n if (e[names[i]]) {\n splice.push(e[names[i]]);\n inodes.unshift({\n n: e,\n name: names[i]\n });\n }\n } else {\n for (key in e) if (e[has](key)) {\n splice.push(e[key]);\n inodes.unshift({\n n: e,\n name: key\n });\n }\n }\n cur.splice.apply(cur, splice);\n }\n }\n for (i = 0, ii = cur.length; i < ii; i++) {\n e = cur[i];\n while (e.n) {\n if (f) {\n if (e.f) {\n for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n e.f.splice(j, 1);\n break;\n }\n !e.f.length && delete e.f;\n }\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n var funcs = e.n[key].f;\n for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n funcs.splice(j, 1);\n break;\n }\n !funcs.length && delete e.n[key].f;\n }\n } else {\n delete e.f;\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n delete e.n[key].f;\n }\n }\n e = e.n;\n }\n }\n // prune inner nodes in path\n prune: for (i = 0, ii = inodes.length; i < ii; i++) {\n e = inodes[i];\n for (key in e.n[e.name].f) {\n // not empty (has listeners)\n continue prune;\n }\n for (key in e.n[e.name].n) {\n // not empty (has children)\n continue prune;\n }\n // is empty\n delete e.n[e.name];\n }\n };\n /*\\\n * eve.once\n [ method ]\n **\n * Binds given event handler with a given name to only run once then unbind itself.\n | eve.once(\"login\", f);\n | eve(\"login\"); // triggers f\n | eve(\"login\"); // no listeners\n * Use @eve to trigger the listener.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n = (function) same return function as @eve.on\n \\*/\n eve.once = function (name, f) {\n var f2 = function () {\n eve.off(name, f2);\n return f.apply(this, arguments);\n };\n return eve.on(name, f2);\n };\n /*\\\n * eve.version\n [ property (string) ]\n **\n * Current version of the library.\n \\*/\n eve.version = version;\n eve.toString = function () {\n return \"You are running Eve \" + version;\n };\n glob.eve = eve;\n typeof module != \"undefined\" && module.exports ? module.exports = eve : typeof define === \"function\" && define.amd ? define(\"eve\", [], function () { return eve; }) : glob.eve = eve;\n})(typeof window != \"undefined\" ? window : this);\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","'use strict';\n\nvar origSymbol = global.Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/* eslint complexity: [2, 17], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n","'use strict';\n\nvar fnToStr = Function.prototype.toString;\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isCallable(value) {\n\tif (!value) { return false; }\n\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\tif (typeof value === 'function' && !value.prototype) { return true; }\n\tif (hasToStringTag) { return tryFunctionObject(value); }\n\tif (isES6ClassFn(value)) { return false; }\n\tvar strClass = toStr.call(value);\n\treturn strClass === fnClass || strClass === genClass;\n};\n","'use strict';\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateObject(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) { return false; }\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n","'use strict';\n\nvar has = require('has');\nvar regexExec = RegExp.prototype.exec;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar tryRegexExecCall = function tryRegexExec(value) {\n\ttry {\n\t\tvar lastIndex = value.lastIndex;\n\t\tvalue.lastIndex = 0;\n\n\t\tregexExec.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\tvalue.lastIndex = lastIndex;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar regexClass = '[object RegExp]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isRegex(value) {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\tif (!hasToStringTag) {\n\t\treturn toStr.call(value) === regexClass;\n\t}\n\n\tvar descriptor = gOPD(value, 'lastIndex');\n\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\tif (!hasLastIndexDataProperty) {\n\t\treturn false;\n\t}\n\n\treturn tryRegexExecCall(value);\n};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\nvar hasSymbols = require('has-symbols')();\n\nif (hasSymbols) {\n\tvar symToStr = Symbol.prototype.toString;\n\tvar symStringRegex = /^Symbol\\(.*\\)$/;\n\tvar isSymbolObject = function isRealSymbolObject(value) {\n\t\tif (typeof value.valueOf() !== 'symbol') {\n\t\t\treturn false;\n\t\t}\n\t\treturn symStringRegex.test(symToStr.call(value));\n\t};\n\n\tmodule.exports = function isSymbol(value) {\n\t\tif (typeof value === 'symbol') {\n\t\t\treturn true;\n\t\t}\n\t\tif (toStr.call(value) !== '[object Symbol]') {\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\treturn isSymbolObject(value);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n} else {\n\n\tmodule.exports = function isSymbol(value) {\n\t\t// this environment does not support Symbols.\n\t\treturn false && value;\n\t};\n}\n","var hasMap = typeof Map === 'function' && Map.prototype;\nvar mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;\nvar mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;\nvar mapForEach = hasMap && Map.prototype.forEach;\nvar hasSet = typeof Set === 'function' && Set.prototype;\nvar setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;\nvar setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;\nvar setForEach = hasSet && Set.prototype.forEach;\nvar booleanValueOf = Boolean.prototype.valueOf;\nvar objectToString = Object.prototype.toString;\nvar bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;\n\nvar inspectCustom = require('./util.inspect').custom;\nvar inspectSymbol = (inspectCustom && isSymbol(inspectCustom)) ? inspectCustom : null;\n\nmodule.exports = function inspect_ (obj, opts, depth, seen) {\n if (!opts) opts = {};\n\n if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {\n throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');\n }\n\n if (typeof obj === 'undefined') {\n return 'undefined';\n }\n if (obj === null) {\n return 'null';\n }\n if (typeof obj === 'boolean') {\n return obj ? 'true' : 'false';\n }\n\n if (typeof obj === 'string') {\n return inspectString(obj, opts);\n }\n if (typeof obj === 'number') {\n if (obj === 0) {\n return Infinity / obj > 0 ? '0' : '-0';\n }\n return String(obj);\n }\n if (typeof obj === 'bigint') {\n return String(obj) + 'n';\n }\n\n var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;\n if (typeof depth === 'undefined') depth = 0;\n if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {\n return '[Object]';\n }\n\n if (typeof seen === 'undefined') seen = [];\n else if (indexOf(seen, obj) >= 0) {\n return '[Circular]';\n }\n\n function inspect (value, from) {\n if (from) {\n seen = seen.slice();\n seen.push(from);\n }\n return inspect_(value, opts, depth + 1, seen);\n }\n\n if (typeof obj === 'function') {\n var name = nameOf(obj);\n return '[Function' + (name ? ': ' + name : '') + ']';\n }\n if (isSymbol(obj)) {\n var symString = Symbol.prototype.toString.call(obj);\n return typeof obj === 'object' ? markBoxed(symString) : symString;\n }\n if (isElement(obj)) {\n var s = '<' + String(obj.nodeName).toLowerCase();\n var attrs = obj.attributes || [];\n for (var i = 0; i < attrs.length; i++) {\n s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);\n }\n s += '>';\n if (obj.childNodes && obj.childNodes.length) s += '...';\n s += '';\n return s;\n }\n if (isArray(obj)) {\n if (obj.length === 0) return '[]';\n return '[ ' + arrObjKeys(obj, inspect).join(', ') + ' ]';\n }\n if (isError(obj)) {\n var parts = arrObjKeys(obj, inspect);\n if (parts.length === 0) return '[' + String(obj) + ']';\n return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }';\n }\n if (typeof obj === 'object') {\n if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {\n return obj[inspectSymbol]();\n } else if (typeof obj.inspect === 'function') {\n return obj.inspect();\n }\n }\n if (isMap(obj)) {\n var parts = [];\n mapForEach.call(obj, function (value, key) {\n parts.push(inspect(key, obj) + ' => ' + inspect(value, obj));\n });\n return collectionOf('Map', mapSize.call(obj), parts);\n }\n if (isSet(obj)) {\n var parts = [];\n setForEach.call(obj, function (value ) {\n parts.push(inspect(value, obj));\n });\n return collectionOf('Set', setSize.call(obj), parts);\n }\n if (isNumber(obj)) {\n return markBoxed(inspect(Number(obj)));\n }\n if (isBigInt(obj)) {\n return markBoxed(inspect(bigIntValueOf.call(obj)));\n }\n if (isBoolean(obj)) {\n return markBoxed(booleanValueOf.call(obj));\n }\n if (isString(obj)) {\n return markBoxed(inspect(String(obj)));\n }\n if (!isDate(obj) && !isRegExp(obj)) {\n var xs = arrObjKeys(obj, inspect);\n if (xs.length === 0) return '{}';\n return '{ ' + xs.join(', ') + ' }';\n }\n return String(obj);\n};\n\nfunction wrapQuotes (s, defaultStyle, opts) {\n var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '\"' : \"'\";\n return quoteChar + s + quoteChar;\n}\n\nfunction quote (s) {\n return String(s).replace(/\"/g, '"');\n}\n\nfunction isArray (obj) { return toStr(obj) === '[object Array]'; }\nfunction isDate (obj) { return toStr(obj) === '[object Date]'; }\nfunction isRegExp (obj) { return toStr(obj) === '[object RegExp]'; }\nfunction isError (obj) { return toStr(obj) === '[object Error]'; }\nfunction isSymbol (obj) { return toStr(obj) === '[object Symbol]'; }\nfunction isString (obj) { return toStr(obj) === '[object String]'; }\nfunction isNumber (obj) { return toStr(obj) === '[object Number]'; }\nfunction isBigInt (obj) { return toStr(obj) === '[object BigInt]'; }\nfunction isBoolean (obj) { return toStr(obj) === '[object Boolean]'; }\n\nvar hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };\nfunction has (obj, key) {\n return hasOwn.call(obj, key);\n}\n\nfunction toStr (obj) {\n return objectToString.call(obj);\n}\n\nfunction nameOf (f) {\n if (f.name) return f.name;\n var m = String(f).match(/^function\\s*([\\w$]+)/);\n if (m) return m[1];\n}\n\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}\n\nfunction isMap (x) {\n if (!mapSize) {\n return false;\n }\n try {\n mapSize.call(x);\n try {\n setSize.call(x);\n } catch (s) {\n return true;\n }\n return x instanceof Map; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isSet (x) {\n if (!setSize) {\n return false;\n }\n try {\n setSize.call(x);\n try {\n mapSize.call(x);\n } catch (m) {\n return true;\n }\n return x instanceof Set; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isElement (x) {\n if (!x || typeof x !== 'object') return false;\n if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {\n return true;\n }\n return typeof x.nodeName === 'string'\n && typeof x.getAttribute === 'function'\n ;\n}\n\nfunction inspectString (str, opts) {\n var s = str.replace(/(['\\\\])/g, '\\\\$1').replace(/[\\x00-\\x1f]/g, lowbyte);\n return wrapQuotes(s, 'single', opts);\n}\n\nfunction lowbyte (c) {\n var n = c.charCodeAt(0);\n var x = { 8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r' }[n];\n if (x) return '\\\\' + x;\n return '\\\\x' + (n < 0x10 ? '0' : '') + n.toString(16);\n}\n\nfunction markBoxed (str) {\n return 'Object(' + str + ')';\n}\n\nfunction collectionOf (type, size, entries) {\n return type + ' (' + size + ') {' + entries.join(', ') + '}';\n}\n\nfunction arrObjKeys (obj, inspect) {\n var isArr = isArray(obj);\n var xs = [];\n if (isArr) {\n xs.length = obj.length;\n for (var i = 0; i < obj.length; i++) {\n xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';\n }\n }\n for (var key in obj) {\n if (!has(obj, key)) continue;\n if (isArr && String(Number(key)) === key && key < obj.length) continue;\n if (/[^\\w$]/.test(key)) {\n xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));\n } else {\n xs.push(key + ': ' + inspect(obj[key], obj));\n }\n }\n return xs;\n}\n","// Snap.svg 0.5.0\n//\n// Copyright (c) 2013 – 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// build: 2017-02-06\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.5.0 - JavaScript Events Library │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n var version = \"0.5.0\",\n has = \"hasOwnProperty\",\n separator = /[\\.\\/]/,\n comaseparator = /\\s*,\\s*/,\n wildcard = \"*\",\n fun = function () {},\n numsort = function (a, b) {\n return a - b;\n },\n current_event,\n stop,\n events = {n: {}},\n firstDefined = function () {\n for (var i = 0, ii = this.length; i < ii; i++) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n lastDefined = function () {\n var i = this.length;\n while (--i) {\n if (typeof this[i] != \"undefined\") {\n return this[i];\n }\n }\n },\n objtos = Object.prototype.toString,\n Str = String,\n isArray = Array.isArray || function (ar) {\n return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n };\n /*\\\n * eve\n [ method ]\n\n * Fires event with given `name`, given scope and other parameters.\n\n > Arguments\n\n - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n - scope (object) context for the event handlers\n - varargs (...) the rest of arguments will be sent to event handlers\n\n = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n \\*/\n eve = function (name, scope) {\n var e = events,\n oldstop = stop,\n args = Array.prototype.slice.call(arguments, 2),\n listeners = eve.listeners(name),\n z = 0,\n f = false,\n l,\n indexed = [],\n queue = {},\n out = [],\n ce = current_event,\n errors = [];\n out.firstDefined = firstDefined;\n out.lastDefined = lastDefined;\n current_event = name;\n stop = 0;\n for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n indexed.push(listeners[i].zIndex);\n if (listeners[i].zIndex < 0) {\n queue[listeners[i].zIndex] = listeners[i];\n }\n }\n indexed.sort(numsort);\n while (indexed[z] < 0) {\n l = queue[indexed[z++]];\n out.push(l.apply(scope, args));\n if (stop) {\n stop = oldstop;\n return out;\n }\n }\n for (i = 0; i < ii; i++) {\n l = listeners[i];\n if (\"zIndex\" in l) {\n if (l.zIndex == indexed[z]) {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n do {\n z++;\n l = queue[indexed[z]];\n l && out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n } while (l)\n } else {\n queue[l.zIndex] = l;\n }\n } else {\n out.push(l.apply(scope, args));\n if (stop) {\n break;\n }\n }\n }\n stop = oldstop;\n current_event = ce;\n return out;\n };\n // Undocumented. Debug only.\n eve._events = events;\n /*\\\n * eve.listeners\n [ method ]\n\n * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n > Arguments\n\n - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n = (array) array of event handlers\n \\*/\n eve.listeners = function (name) {\n var names = isArray(name) ? name : name.split(separator),\n e = events,\n item,\n items,\n k,\n i,\n ii,\n j,\n jj,\n nes,\n es = [e],\n out = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n nes = [];\n for (j = 0, jj = es.length; j < jj; j++) {\n e = es[j].n;\n items = [e[names[i]], e[wildcard]];\n k = 2;\n while (k--) {\n item = items[k];\n if (item) {\n nes.push(item);\n out = out.concat(item.f || []);\n }\n }\n }\n es = nes;\n }\n return out;\n };\n /*\\\n * eve.separator\n [ method ]\n\n * If for some reasons you don’t like default separators (`.` or `/`) you can specify yours\n * here. Be aware that if you pass a string longer than one character it will be treated as\n * a list of characters.\n\n - separator (string) new separator. Empty string resets to default: `.` or `/`.\n \\*/\n eve.separator = function (sep) {\n if (sep) {\n sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n sep = \"[\" + sep + \"]\";\n separator = new RegExp(sep);\n } else {\n separator = /[\\.\\/]/;\n }\n };\n /*\\\n * eve.on\n [ method ]\n **\n * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n | eve.on(\"*.under.*\", f);\n | eve(\"mouse.under.floor\"); // triggers f\n * Use @eve to trigger the listener.\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n - name (array) if you don’t want to use separators, you can use array of strings\n - f (function) event handler function\n **\n = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n > Example:\n | eve.on(\"mouse\", eatIt)(2);\n | eve.on(\"mouse\", scream);\n | eve.on(\"mouse\", catchIt)(1);\n * This will ensure that `catchIt` function will be called before `eatIt`.\n *\n * If you want to put your handler before non-indexed handlers, specify a negative value.\n * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n \\*/\n eve.on = function (name, f) {\n if (typeof f != \"function\") {\n return function () {};\n }\n var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n for (var i = 0, ii = names.length; i < ii; i++) {\n (function (name) {\n var names = isArray(name) ? name : Str(name).split(separator),\n e = events,\n exist;\n for (var i = 0, ii = names.length; i < ii; i++) {\n e = e.n;\n e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n }\n e.f = e.f || [];\n for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n exist = true;\n break;\n }\n !exist && e.f.push(f);\n }(names[i]));\n }\n return function (zIndex) {\n if (+zIndex == +zIndex) {\n f.zIndex = +zIndex;\n }\n };\n };\n /*\\\n * eve.f\n [ method ]\n **\n * Returns function that will fire given event with optional arguments.\n * Arguments that will be passed to the result function will be also\n * concated to the list of final arguments.\n | el.onclick = eve.f(\"click\", 1, 2);\n | eve.on(\"click\", function (a, b, c) {\n | console.log(a, b, c); // 1, 2, [event object]\n | });\n > Arguments\n - event (string) event name\n - varargs (…) and any other arguments\n = (function) possible event handler function\n \\*/\n eve.f = function (event) {\n var attrs = [].slice.call(arguments, 1);\n return function () {\n eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n };\n };\n /*\\\n * eve.stop\n [ method ]\n **\n * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n \\*/\n eve.stop = function () {\n stop = 1;\n };\n /*\\\n * eve.nt\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n > Arguments\n **\n - subname (string) #optional subname of the event\n **\n = (string) name of the event, if `subname` is not specified\n * or\n = (boolean) `true`, if current event’s name contains `subname`\n \\*/\n eve.nt = function (subname) {\n var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n if (subname) {\n return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n }\n return cur;\n };\n /*\\\n * eve.nts\n [ method ]\n **\n * Could be used inside event handler to figure out actual name of the event.\n **\n **\n = (array) names of the event\n \\*/\n eve.nts = function () {\n return isArray(current_event) ? current_event : current_event.split(separator);\n };\n /*\\\n * eve.off\n [ method ]\n **\n * Removes given function from the list of event listeners assigned to given name.\n * If no arguments specified all the events will be cleared.\n **\n > Arguments\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n \\*/\n /*\\\n * eve.unbind\n [ method ]\n **\n * See @eve.off\n \\*/\n eve.off = eve.unbind = function (name, f) {\n if (!name) {\n eve._events = events = {n: {}};\n return;\n }\n var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n if (names.length > 1) {\n for (var i = 0, ii = names.length; i < ii; i++) {\n eve.off(names[i], f);\n }\n return;\n }\n names = isArray(name) ? name : Str(name).split(separator);\n var e,\n key,\n splice,\n i, ii, j, jj,\n cur = [events],\n inodes = [];\n for (i = 0, ii = names.length; i < ii; i++) {\n for (j = 0; j < cur.length; j += splice.length - 2) {\n splice = [j, 1];\n e = cur[j].n;\n if (names[i] != wildcard) {\n if (e[names[i]]) {\n splice.push(e[names[i]]);\n inodes.unshift({\n n: e,\n name: names[i]\n });\n }\n } else {\n for (key in e) if (e[has](key)) {\n splice.push(e[key]);\n inodes.unshift({\n n: e,\n name: key\n });\n }\n }\n cur.splice.apply(cur, splice);\n }\n }\n for (i = 0, ii = cur.length; i < ii; i++) {\n e = cur[i];\n while (e.n) {\n if (f) {\n if (e.f) {\n for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n e.f.splice(j, 1);\n break;\n }\n !e.f.length && delete e.f;\n }\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n var funcs = e.n[key].f;\n for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n funcs.splice(j, 1);\n break;\n }\n !funcs.length && delete e.n[key].f;\n }\n } else {\n delete e.f;\n for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n delete e.n[key].f;\n }\n }\n e = e.n;\n }\n }\n // prune inner nodes in path\n prune: for (i = 0, ii = inodes.length; i < ii; i++) {\n e = inodes[i];\n for (key in e.n[e.name].f) {\n // not empty (has listeners)\n continue prune;\n }\n for (key in e.n[e.name].n) {\n // not empty (has children)\n continue prune;\n }\n // is empty\n delete e.n[e.name];\n }\n };\n /*\\\n * eve.once\n [ method ]\n **\n * Binds given event handler with a given name to only run once then unbind itself.\n | eve.once(\"login\", f);\n | eve(\"login\"); // triggers f\n | eve(\"login\"); // no listeners\n * Use @eve to trigger the listener.\n **\n > Arguments\n **\n - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n - f (function) event handler function\n **\n = (function) same return function as @eve.on\n \\*/\n eve.once = function (name, f) {\n var f2 = function () {\n eve.off(name, f2);\n return f.apply(this, arguments);\n };\n return eve.on(name, f2);\n };\n /*\\\n * eve.version\n [ property (string) ]\n **\n * Current version of the library.\n \\*/\n eve.version = version;\n eve.toString = function () {\n return \"You are running Eve \" + version;\n };\n (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define === \"function\" && define.amd ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n // AMD support\n if (typeof define == \"function\" && define.amd) {\n // Define as an anonymous module\n define([\"eve\"], function (eve) {\n return factory(glob, eve);\n });\n } else if (typeof exports != \"undefined\") {\n // Next for Node.js or CommonJS\n var eve = require(\"eve\");\n module.exports = factory(glob, eve);\n } else {\n // Browser globals (glob is window)\n // Snap adds itself to window\n factory(glob, glob.eve);\n }\n}(window || this, function (window, eve) {\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n var animations = {},\n requestAnimFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function (callback) {\n setTimeout(callback, 16, new Date().getTime());\n return true;\n },\n requestID,\n isArray = Array.isArray || function (a) {\n return a instanceof Array ||\n Object.prototype.toString.call(a) == \"[object Array]\";\n },\n idgen = 0,\n idprefix = \"M\" + (+new Date).toString(36),\n ID = function () {\n return idprefix + (idgen++).toString(36);\n },\n diff = function (a, b, A, B) {\n if (isArray(a)) {\n res = [];\n for (var i = 0, ii = a.length; i < ii; i++) {\n res[i] = diff(a[i], b, A[i], B);\n }\n return res;\n }\n var dif = (A - a) / (B - b);\n return function (bb) {\n return a + dif * (bb - b);\n };\n },\n timer = Date.now || function () {\n return +new Date;\n },\n sta = function (val) {\n var a = this;\n if (val == null) {\n return a.s;\n }\n var ds = a.s - val;\n a.b += a.dur * ds;\n a.B += a.dur * ds;\n a.s = val;\n },\n speed = function (val) {\n var a = this;\n if (val == null) {\n return a.spd;\n }\n a.spd = val;\n },\n duration = function (val) {\n var a = this;\n if (val == null) {\n return a.dur;\n }\n a.s = a.s * val / a.dur;\n a.dur = val;\n },\n stopit = function () {\n var a = this;\n delete animations[a.id];\n a.update();\n eve(\"mina.stop.\" + a.id, a);\n },\n pause = function () {\n var a = this;\n if (a.pdif) {\n return;\n }\n delete animations[a.id];\n a.update();\n a.pdif = a.get() - a.b;\n },\n resume = function () {\n var a = this;\n if (!a.pdif) {\n return;\n }\n a.b = a.get() - a.pdif;\n delete a.pdif;\n animations[a.id] = a;\n frame();\n },\n update = function () {\n var a = this,\n res;\n if (isArray(a.start)) {\n res = [];\n for (var j = 0, jj = a.start.length; j < jj; j++) {\n res[j] = +a.start[j] +\n (a.end[j] - a.start[j]) * a.easing(a.s);\n }\n } else {\n res = +a.start + (a.end - a.start) * a.easing(a.s);\n }\n a.set(res);\n },\n frame = function (timeStamp) {\n // Manual invokation?\n if (!timeStamp) {\n // Frame loop stopped?\n if (!requestID) {\n // Start frame loop...\n requestID = requestAnimFrame(frame);\n }\n return;\n }\n var len = 0;\n for (var i in animations) if (animations.hasOwnProperty(i)) {\n var a = animations[i],\n b = a.get(),\n res;\n len++;\n a.s = (b - a.b) / (a.dur / a.spd);\n if (a.s >= 1) {\n delete animations[i];\n a.s = 1;\n len--;\n (function (a) {\n setTimeout(function () {\n eve(\"mina.finish.\" + a.id, a);\n });\n }(a));\n }\n a.update();\n }\n requestID = len ? requestAnimFrame(frame) : false;\n },\n /*\\\n * mina\n [ method ]\n **\n * Generic animation of numbers\n **\n - a (number) start _slave_ number\n - A (number) end _slave_ number\n - b (number) start _master_ number (start time in general case)\n - B (number) end _master_ number (end time in general case)\n - get (function) getter of _master_ number (see @mina.time)\n - set (function) setter of _slave_ number\n - easing (function) #optional easing function, default is @mina.linear\n = (object) animation descriptor\n o {\n o id (string) animation id,\n o start (number) start _slave_ number,\n o end (number) end _slave_ number,\n o b (number) start _master_ number,\n o s (number) animation status (0..1),\n o dur (number) animation duration,\n o spd (number) animation speed,\n o get (function) getter of _master_ number (see @mina.time),\n o set (function) setter of _slave_ number,\n o easing (function) easing function, default is @mina.linear,\n o status (function) status getter/setter,\n o speed (function) speed getter/setter,\n o duration (function) duration getter/setter,\n o stop (function) animation stopper\n o pause (function) pauses the animation\n o resume (function) resumes the animation\n o update (function) calles setter with the right value of the animation\n o }\n \\*/\n mina = function (a, A, b, B, get, set, easing) {\n var anim = {\n id: ID(),\n start: a,\n end: A,\n b: b,\n s: 0,\n dur: B - b,\n spd: 1,\n get: get,\n set: set,\n easing: easing || mina.linear,\n status: sta,\n speed: speed,\n duration: duration,\n stop: stopit,\n pause: pause,\n resume: resume,\n update: update\n };\n animations[anim.id] = anim;\n var len = 0, i;\n for (i in animations) if (animations.hasOwnProperty(i)) {\n len++;\n if (len == 2) {\n break;\n }\n }\n len == 1 && frame();\n return anim;\n };\n /*\\\n * mina.time\n [ method ]\n **\n * Returns the current time. Equivalent to:\n | function () {\n | return (new Date).getTime();\n | }\n \\*/\n mina.time = timer;\n /*\\\n * mina.getById\n [ method ]\n **\n * Returns an animation by its id\n - id (string) animation's id\n = (object) See @mina\n \\*/\n mina.getById = function (id) {\n return animations[id] || null;\n };\n\n /*\\\n * mina.linear\n [ method ]\n **\n * Default linear easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.linear = function (n) {\n return n;\n };\n /*\\\n * mina.easeout\n [ method ]\n **\n * Easeout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easeout = function (n) {\n return Math.pow(n, 1.7);\n };\n /*\\\n * mina.easein\n [ method ]\n **\n * Easein easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easein = function (n) {\n return Math.pow(n, .48);\n };\n /*\\\n * mina.easeinout\n [ method ]\n **\n * Easeinout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.easeinout = function (n) {\n if (n == 1) {\n return 1;\n }\n if (n == 0) {\n return 0;\n }\n var q = .48 - n / 1.04,\n Q = Math.sqrt(.1734 + q * q),\n x = Q - q,\n X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n y = -Q - q,\n Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n t = X + Y + .5;\n return (1 - t) * 3 * t * t + t * t * t;\n };\n /*\\\n * mina.backin\n [ method ]\n **\n * Backin easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.backin = function (n) {\n if (n == 1) {\n return 1;\n }\n var s = 1.70158;\n return n * n * ((s + 1) * n - s);\n };\n /*\\\n * mina.backout\n [ method ]\n **\n * Backout easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.backout = function (n) {\n if (n == 0) {\n return 0;\n }\n n = n - 1;\n var s = 1.70158;\n return n * n * ((s + 1) * n + s) + 1;\n };\n /*\\\n * mina.elastic\n [ method ]\n **\n * Elastic easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.elastic = function (n) {\n if (n == !!n) {\n return n;\n }\n return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n (2 * Math.PI) / .3) + 1;\n };\n /*\\\n * mina.bounce\n [ method ]\n **\n * Bounce easing\n - n (number) input 0..1\n = (number) output 0..1\n \\*/\n mina.bounce = function (n) {\n var s = 7.5625,\n p = 2.75,\n l;\n if (n < 1 / p) {\n l = s * n * n;\n } else {\n if (n < 2 / p) {\n n -= 1.5 / p;\n l = s * n * n + .75;\n } else {\n if (n < 2.5 / p) {\n n -= 2.25 / p;\n l = s * n * n + .9375;\n } else {\n n -= 2.625 / p;\n l = s * n * n + .984375;\n }\n }\n }\n return l;\n };\n window.mina = mina;\n return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n\n// Copyright (c) 2013 - 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function(root) {\nSnap.version = \"0.5.1\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - array (array) array of elements (will return set of elements)\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n if (w) {\n if (w.nodeType) {\n return wrap(w);\n }\n if (is(w, \"array\") && Snap.set) {\n return Snap.set.apply(Snap, w);\n }\n if (w instanceof Element) {\n return w;\n }\n if (h == null) {\n // try {\n w = glob.doc.querySelector(String(w));\n return wrap(w);\n // } catch (e) {\n // return null;\n // }\n }\n }\n w = w == null ? \"100%\" : w;\n h = h == null ? \"100%\" : h;\n return new Paper(w, h);\n}\nSnap.toString = function () {\n return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n win: root.window,\n doc: root.window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n Str = String,\n toFloat = parseFloat,\n toInt = parseInt,\n math = Math,\n mmax = math.max,\n mmin = math.min,\n abs = math.abs,\n pow = math.pow,\n PI = math.PI,\n round = math.round,\n E = \"\",\n S = \" \",\n objectToString = Object.prototype.toString,\n ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n separator = Snap._.separator = /[,\\s]+/,\n whitespace = /[\\s]/g,\n commaSpaces = /[\\s]*,[\\s]*/,\n hsrg = {hs: 1, rg: 1},\n pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n tCommand = /([rstm])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\s]*,?[\\s]*/ig,\n idgen = 0,\n idprefix = \"S\" + (+new Date).toString(36),\n ID = function (el) {\n return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36);\n },\n xlink = \"http://www.w3.org/1999/xlink\",\n xmlns = \"http://www.w3.org/2000/svg\",\n hub = {},\n /*\\\n * Snap.url\n [ method ]\n **\n * Wraps path into `\"url('')\"`.\n - value (string) path\n = (string) wrapped path\n \\*/\n URL = Snap.url = function (url) {\n return \"url('#\" + url + \"')\";\n };\n\nfunction $(el, attr) {\n if (attr) {\n if (el == \"#text\") {\n el = glob.doc.createTextNode(attr.text || attr[\"#text\"] || \"\");\n }\n if (el == \"#comment\") {\n el = glob.doc.createComment(attr.text || attr[\"#text\"] || \"\");\n }\n if (typeof el == \"string\") {\n el = $(el);\n }\n if (typeof attr == \"string\") {\n if (el.nodeType == 1) {\n if (attr.substring(0, 6) == \"xlink:\") {\n return el.getAttributeNS(xlink, attr.substring(6));\n }\n if (attr.substring(0, 4) == \"xml:\") {\n return el.getAttributeNS(xmlns, attr.substring(4));\n }\n return el.getAttribute(attr);\n } else if (attr == \"text\") {\n return el.nodeValue;\n } else {\n return null;\n }\n }\n if (el.nodeType == 1) {\n for (var key in attr) if (attr[has](key)) {\n var val = Str(attr[key]);\n if (val) {\n if (key.substring(0, 6) == \"xlink:\") {\n el.setAttributeNS(xlink, key.substring(6), val);\n } else if (key.substring(0, 4) == \"xml:\") {\n el.setAttributeNS(xmlns, key.substring(4), val);\n } else {\n el.setAttribute(key, val);\n }\n } else {\n el.removeAttribute(key);\n }\n }\n } else if (\"text\" in attr) {\n el.nodeValue = attr.text;\n }\n } else {\n el = glob.doc.createElementNS(xmlns, el);\n }\n return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n var attrs = el.attributes,\n name,\n out = {};\n for (var i = 0; i < attrs.length; i++) {\n if (attrs[i].namespaceURI == xlink) {\n name = \"xlink:\";\n } else {\n name = \"\";\n }\n name += attrs[i].name;\n out[name] = attrs[i].textContent;\n }\n return out;\n}\nfunction is(o, type) {\n type = Str.prototype.toLowerCase.call(type);\n if (type == \"finite\") {\n return isFinite(o);\n }\n if (type == \"array\" &&\n (o instanceof Array || Array.isArray && Array.isArray(o))) {\n return true;\n }\n return type == \"null\" && o === null ||\n type == typeof o && o !== null ||\n type == \"object\" && o === Object(o) ||\n objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n | x: 10,\n | y: 20,\n | dim: {\n | width: 40,\n | height: 50,\n | \"negative width\": -40\n | }\n | }));\n\\*/\nSnap.format = (function () {\n var tokenRegex = /\\{([^\\}]+)\\}/g,\n objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n replacer = function (all, key, obj) {\n var res = obj;\n key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n name = name || quotedName;\n if (res) {\n if (name in res) {\n res = res[name];\n }\n typeof res == \"function\" && isFunc && (res = res());\n }\n });\n res = (res == null || res == obj ? all : res) + \"\";\n return res;\n };\n return function (str, obj) {\n return Str(str).replace(tokenRegex, function (all, key) {\n return replacer(all, key, obj);\n });\n };\n})();\nfunction clone(obj) {\n if (typeof obj == \"function\" || Object(obj) !== obj) {\n return obj;\n }\n var res = new obj.constructor;\n for (var key in obj) if (obj[has](key)) {\n res[key] = clone(obj[key]);\n }\n return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n return array.push(array.splice(i, 1)[0]);\n }\n}\nfunction cacher(f, scope, postprocessor) {\n function newf() {\n var arg = Array.prototype.slice.call(arguments, 0),\n args = arg.join(\"\\u2400\"),\n cache = newf.cache = newf.cache || {},\n count = newf.count = newf.count || [];\n if (cache[has](args)) {\n repush(count, args);\n return postprocessor ? postprocessor(cache[args]) : cache[args];\n }\n count.length >= 1e3 && delete cache[count.shift()];\n count.push(args);\n cache[args] = f.apply(scope, arg);\n return postprocessor ? postprocessor(cache[args]) : cache[args];\n }\n return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n if (x3 == null) {\n var x = x1 - x2,\n y = y1 - y2;\n if (!x && !y) {\n return 0;\n }\n return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n } else {\n return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n }\n}\nfunction rad(deg) {\n return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n return rad * 180 / PI % 360;\n}\nfunction x_y() {\n return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n/*\\\n * Snap.sin\n [ method ]\n **\n * Equivalent to `Math.sin()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) sin\n\\*/\nSnap.sin = function (angle) {\n return math.sin(Snap.rad(angle));\n};\n/*\\\n * Snap.tan\n [ method ]\n **\n * Equivalent to `Math.tan()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) tan\n\\*/\nSnap.tan = function (angle) {\n return math.tan(Snap.rad(angle));\n};\n/*\\\n * Snap.cos\n [ method ]\n **\n * Equivalent to `Math.cos()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) cos\n\\*/\nSnap.cos = function (angle) {\n return math.cos(Snap.rad(angle));\n};\n/*\\\n * Snap.asin\n [ method ]\n **\n * Equivalent to `Math.asin()` only works with degrees, not radians.\n - num (number) value\n = (number) asin in degrees\n\\*/\nSnap.asin = function (num) {\n return Snap.deg(math.asin(num));\n};\n/*\\\n * Snap.acos\n [ method ]\n **\n * Equivalent to `Math.acos()` only works with degrees, not radians.\n - num (number) value\n = (number) acos in degrees\n\\*/\nSnap.acos = function (num) {\n return Snap.deg(math.acos(num));\n};\n/*\\\n * Snap.atan\n [ method ]\n **\n * Equivalent to `Math.atan()` only works with degrees, not radians.\n - num (number) value\n = (number) atan in degrees\n\\*/\nSnap.atan = function (num) {\n return Snap.deg(math.atan(num));\n};\n/*\\\n * Snap.atan2\n [ method ]\n **\n * Equivalent to `Math.atan2()` only works with degrees, not radians.\n - num (number) value\n = (number) atan2 in degrees\n\\*/\nSnap.atan2 = function (num) {\n return Snap.deg(math.atan2(num));\n};\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.len\n [ method ]\n **\n * Returns distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len = function (x1, y1, x2, y2) {\n return Math.sqrt(Snap.len2(x1, y1, x2, y2));\n};\n/*\\\n * Snap.len2\n [ method ]\n **\n * Returns squared distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len2 = function (x1, y1, x2, y2) {\n return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n};\n/*\\\n * Snap.closestPoint\n [ method ]\n **\n * Returns closest point to a given one on a given path.\n - path (Element) path element\n - x (number) x coord of a point\n - y (number) y coord of a point\n = (object) in format\n {\n x (number) x coord of the point on the path\n y (number) y coord of the point on the path\n length (number) length of the path to the point\n distance (number) distance from the given point to the path\n }\n\\*/\n// Copied from http://bl.ocks.org/mbostock/8027637\nSnap.closestPoint = function (path, x, y) {\n function distance2(p) {\n var dx = p.x - x,\n dy = p.y - y;\n return dx * dx + dy * dy;\n }\n var pathNode = path.node,\n pathLength = pathNode.getTotalLength(),\n precision = pathLength / pathNode.pathSegList.numberOfItems * .125,\n best,\n bestLength,\n bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {\n if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {\n best = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision *= .5;\n while (precision > .5) {\n var before,\n after,\n beforeLength,\n afterLength,\n beforeDistance,\n afterDistance;\n if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {\n best = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {\n best = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision *= .5;\n }\n }\n\n best = {\n x: best.x,\n y: best.y,\n length: bestLength,\n distance: Math.sqrt(bestDistance)\n };\n return best;\n}\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n if (is(values, \"array\")) {\n var i = values.length;\n while (i--) if (abs(values[i] - value) <= tolerance) {\n return values[i];\n }\n } else {\n values = +values;\n var rem = value % values;\n if (rem < tolerance) {\n return value - rem;\n }\n if (rem > values - tolerance) {\n return value - rem + values;\n }\n }\n return value;\n};\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n #
    \n #
  • Color name (red, green, cornflowerblue, etc)
  • \n #
  • #••• — shortened HTML color: (#000, #fc0, etc.)
  • \n #
  • #•••••• — full length HTML color: (#000000, #bd2300)
  • \n #
  • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
  • \n #
  • rgba(•••, •••, •••, •••) — also with opacity
  • \n #
  • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
  • \n #
  • rgba(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
  • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
  • \n #
  • hsba(•••, •••, •••, •••) — also with opacity
  • \n #
  • hsb(•••%, •••%, •••%) — same as above, but in %
  • \n #
  • hsba(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
  • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
  • \n #
  • hsla(•••, •••, •••, •••) — also with opacity
  • \n #
  • hsl(•••%, •••%, •••%) — same as above, but in %
  • \n #
  • hsla(•••%, •••%, •••%, •••%) — also with opacity
  • \n #
\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••,\n o error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n }\n if (colour == \"none\") {\n return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n }\n !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n if (!colour) {\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n }\n var res,\n red,\n green,\n blue,\n opacity,\n t,\n values,\n rgb = colour.match(colourRegExp);\n if (rgb) {\n if (rgb[2]) {\n blue = toInt(rgb[2].substring(5), 16);\n green = toInt(rgb[2].substring(3, 5), 16);\n red = toInt(rgb[2].substring(1, 3), 16);\n }\n if (rgb[3]) {\n blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n green = toInt((t = rgb[3].charAt(2)) + t, 16);\n red = toInt((t = rgb[3].charAt(1)) + t, 16);\n }\n if (rgb[4]) {\n values = rgb[4].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red *= 2.55);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green *= 2.55);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue *= 2.55);\n rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n }\n if (rgb[5]) {\n values = rgb[5].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red /= 100);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green /= 100);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue /= 100);\n (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n return Snap.hsb2rgb(red, green, blue, opacity);\n }\n if (rgb[6]) {\n values = rgb[6].split(commaSpaces);\n red = toFloat(values[0]);\n values[0].slice(-1) == \"%\" && (red /= 100);\n green = toFloat(values[1]);\n values[1].slice(-1) == \"%\" && (green /= 100);\n blue = toFloat(values[2]);\n values[2].slice(-1) == \"%\" && (blue /= 100);\n (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n return Snap.hsl2rgb(red, green, blue, opacity);\n }\n red = mmin(math.round(red), 255);\n green = mmin(math.round(green), 255);\n blue = mmin(math.round(blue), 255);\n opacity = mmin(mmax(opacity, 0), 1);\n rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n rgb.hex = \"#\" + (16777216 | blue | green << 8 | red << 16).toString(16).slice(1);\n rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n return rgb;\n }\n return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n if (is(o, \"finite\")) {\n var round = math.round;\n return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n }\n return \"#\" + (16777216 | b | g << 8 | r << 16).toString(16).slice(1);\n});\nvar toHex = function (color) {\n var i = glob.doc.getElementsByTagName(\"head\")[0] || glob.doc.getElementsByTagName(\"svg\")[0],\n red = \"rgb(255, 0, 0)\";\n toHex = cacher(function (color) {\n if (color.toLowerCase() == \"red\") {\n return red;\n }\n i.style.color = red;\n i.style.color = color;\n var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n return out == red ? null : out;\n });\n return toHex(color);\n},\nhsbtoString = function () {\n return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n return this.opacity == 1 || this.opacity == null ?\n this.hex :\n \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n b = r.b;\n g = r.g;\n r = r.r;\n }\n if (g == null && is(r, string)) {\n var clr = Snap.getRGB(r);\n r = clr.r;\n g = clr.g;\n b = clr.b;\n }\n if (r > 1 || g > 1 || b > 1) {\n r /= 255;\n g /= 255;\n b /= 255;\n }\n\n return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n r = math.round(r * 255);\n g = math.round(g * 255);\n b = math.round(b * 255);\n var rgb = {\n r: r,\n g: g,\n b: b,\n opacity: is(o, \"finite\") ? o : 1,\n hex: Snap.rgb(r, g, b),\n toString: rgbtoString\n };\n is(o, \"finite\") && (rgb.opacity = o);\n return rgb;\n};\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••,\n o error (boolean) `true` if string can't be parsed,\n o h (number) hue,\n o s (number) saturation,\n o v (number) value (brightness),\n o l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n var rgb;\n if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n rgb = Snap.hsb2rgb(clr);\n clr.r = rgb.r;\n clr.g = rgb.g;\n clr.b = rgb.b;\n clr.opacity = 1;\n clr.hex = rgb.hex;\n } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n rgb = Snap.hsl2rgb(clr);\n clr.r = rgb.r;\n clr.g = rgb.g;\n clr.b = rgb.b;\n clr.opacity = 1;\n clr.hex = rgb.hex;\n } else {\n if (is(clr, \"string\")) {\n clr = Snap.getRGB(clr);\n }\n if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n rgb = Snap.rgb2hsl(clr);\n clr.h = rgb.h;\n clr.s = rgb.s;\n clr.l = rgb.l;\n rgb = Snap.rgb2hsb(clr);\n clr.v = rgb.b;\n } else {\n clr = {hex: \"none\"};\n clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n clr.error = 1;\n }\n }\n clr.toString = rgbtoString;\n return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n v = h.b;\n s = h.s;\n o = h.o;\n h = h.h;\n }\n h *= 360;\n var R, G, B, X, C;\n h = h % 360 / 60;\n C = v * s;\n X = C * (1 - abs(h % 2 - 1));\n R = G = B = v - C;\n\n h = ~~h;\n R += [C, X, 0, 0, X, C][h];\n G += [X, C, C, X, 0, 0][h];\n B += [0, 0, X, C, C, X][h];\n return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o r (number) red,\n o g (number) green,\n o b (number) blue,\n o hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n l = h.l;\n s = h.s;\n h = h.h;\n }\n if (h > 1 || s > 1 || l > 1) {\n h /= 360;\n s /= 100;\n l /= 100;\n }\n h *= 360;\n var R, G, B, X, C;\n h = h % 360 / 60;\n C = 2 * s * (l < .5 ? l : 1 - l);\n X = C * (1 - abs(h % 2 - 1));\n R = G = B = l - C / 2;\n\n h = ~~h;\n R += [C, X, 0, 0, X, C][h];\n G += [X, C, C, X, 0, 0][h];\n B += [0, 0, X, C, C, X][h];\n return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o h (number) hue,\n o s (number) saturation,\n o b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n b = prepareRGB(r, g, b);\n r = b[0];\n g = b[1];\n b = b[2];\n\n var H, S, V, C;\n V = mmax(r, g, b);\n C = V - mmin(r, g, b);\n H = C == 0 ? null :\n V == r ? (g - b) / C :\n V == g ? (b - r) / C + 2 :\n (r - g) / C + 4;\n H = (H + 360) % 6 * 60 / 360;\n S = C == 0 ? 0 : C / V;\n return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o h (number) hue,\n o s (number) saturation,\n o l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n b = prepareRGB(r, g, b);\n r = b[0];\n g = b[1];\n b = b[2];\n\n var H, S, L, M, m, C;\n M = mmax(r, g, b);\n m = mmin(r, g, b);\n C = M - m;\n H = C == 0 ? null :\n M == r ? (g - b) / C :\n M == g ? (b - r) / C + 2 :\n (r - g) / C + 4;\n H = (H + 360) % 6 * 60 / 360;\n L = (M + m) / 2;\n S = C == 0 ? 0 :\n L < .5 ? C / (2 * L) :\n C / (2 - 2 * L);\n return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n if (!pathString) {\n return null;\n }\n var pth = Snap.path(pathString);\n if (pth.arr) {\n return Snap.path.clone(pth.arr);\n }\n\n var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n data = [];\n if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n data = Snap.path.clone(pathString);\n }\n if (!data.length) {\n Str(pathString).replace(pathCommand, function (a, b, c) {\n var params = [],\n name = b.toLowerCase();\n c.replace(pathValues, function (a, b) {\n b && params.push(+b);\n });\n if (name == \"m\" && params.length > 2) {\n data.push([b].concat(params.splice(0, 2)));\n name = \"l\";\n b = b == \"m\" ? \"l\" : \"L\";\n }\n if (name == \"o\" && params.length == 1) {\n data.push([b, params[0]]);\n }\n if (name == \"r\") {\n data.push([b].concat(params));\n } else while (params.length >= paramCounts[name]) {\n data.push([b].concat(params.splice(0, paramCounts[name])));\n if (!paramCounts[name]) {\n break;\n }\n }\n });\n }\n data.toString = Snap.path.toString;\n pth.arr = Snap.path.clone(data);\n return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n if (!TString) {\n return null;\n }\n var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n data = [];\n if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n data = Snap.path.clone(TString);\n }\n if (!data.length) {\n Str(TString).replace(tCommand, function (a, b, c) {\n var params = [],\n name = b.toLowerCase();\n c.replace(pathValues, function (a, b) {\n b && params.push(+b);\n });\n data.push([b].concat(params));\n });\n }\n data.toString = Snap.path.toString;\n return data;\n};\nfunction svgTransform2string(tstr) {\n var res = [];\n tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n params = params.split(/\\s*,\\s*|\\s+/);\n if (name == \"rotate\" && params.length == 1) {\n params.push(0, 0);\n }\n if (name == \"scale\") {\n if (params.length > 2) {\n params = params.slice(0, 2);\n } else if (params.length == 2) {\n params.push(0, 0);\n }\n if (params.length == 1) {\n params.push(params[0], 0, 0);\n }\n }\n if (name == \"skewX\") {\n res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n } else if (name == \"skewY\") {\n res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n } else {\n res.push([name.charAt(0)].concat(params));\n }\n return all;\n });\n return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = /^[a-z][\\s]*-?\\.?\\d/i;\nfunction transform2matrix(tstr, bbox) {\n var tdata = parseTransformString(tstr),\n m = new Snap.Matrix;\n if (tdata) {\n for (var i = 0, ii = tdata.length; i < ii; i++) {\n var t = tdata[i],\n tlen = t.length,\n command = Str(t[0]).toLowerCase(),\n absolute = t[0] != command,\n inver = absolute ? m.invert() : 0,\n x1,\n y1,\n x2,\n y2,\n bb;\n if (command == \"t\" && tlen == 2){\n m.translate(t[1], 0);\n } else if (command == \"t\" && tlen == 3) {\n if (absolute) {\n x1 = inver.x(0, 0);\n y1 = inver.y(0, 0);\n x2 = inver.x(t[1], t[2]);\n y2 = inver.y(t[1], t[2]);\n m.translate(x2 - x1, y2 - y1);\n } else {\n m.translate(t[1], t[2]);\n }\n } else if (command == \"r\") {\n if (tlen == 2) {\n bb = bb || bbox;\n m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n } else if (tlen == 4) {\n if (absolute) {\n x2 = inver.x(t[2], t[3]);\n y2 = inver.y(t[2], t[3]);\n m.rotate(t[1], x2, y2);\n } else {\n m.rotate(t[1], t[2], t[3]);\n }\n }\n } else if (command == \"s\") {\n if (tlen == 2 || tlen == 3) {\n bb = bb || bbox;\n m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n } else if (tlen == 4) {\n if (absolute) {\n x2 = inver.x(t[2], t[3]);\n y2 = inver.y(t[2], t[3]);\n m.scale(t[1], t[1], x2, y2);\n } else {\n m.scale(t[1], t[1], t[2], t[3]);\n }\n } else if (tlen == 5) {\n if (absolute) {\n x2 = inver.x(t[3], t[4]);\n y2 = inver.y(t[3], t[4]);\n m.scale(t[1], t[2], x2, y2);\n } else {\n m.scale(t[1], t[2], t[3], t[4]);\n }\n }\n } else if (command == \"m\" && tlen == 7) {\n m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n }\n }\n }\n return m;\n}\nSnap._.transform2matrix = transform2matrix;\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n function (a, b) {\n var adown = a.nodeType == 9 ? a.documentElement : a,\n bup = b && b.parentNode;\n return a == bup || !!(bup && bup.nodeType == 1 && (\n adown.contains ?\n adown.contains(bup) :\n a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n ));\n } :\n function (a, b) {\n if (b) {\n while (b) {\n b = b.parentNode;\n if (b == a) {\n return true;\n }\n }\n }\n return false;\n };\nfunction getSomeDefs(el) {\n var p = el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) ||\n el.node.parentNode && wrap(el.node.parentNode) ||\n Snap.select(\"svg\") ||\n Snap(0, 0),\n pdefs = p.select(\"defs\"),\n defs = pdefs == null ? false : pdefs.node;\n if (!defs) {\n defs = make(\"defs\", p.node).node;\n }\n return defs;\n}\nfunction getSomeSVG(el) {\n return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select(\"svg\");\n}\nSnap._.getSomeDefs = getSomeDefs;\nSnap._.getSomeSVG = getSomeSVG;\nfunction unit2px(el, name, value) {\n var svg = getSomeSVG(el).node,\n out = {},\n mgr = svg.querySelector(\".svg---mgr\");\n if (!mgr) {\n mgr = $(\"rect\");\n $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, \"class\": \"svg---mgr\", fill: \"none\"});\n svg.appendChild(mgr);\n }\n function getW(val) {\n if (val == null) {\n return E;\n }\n if (val == +val) {\n return val;\n }\n $(mgr, {width: val});\n try {\n return mgr.getBBox().width;\n } catch (e) {\n return 0;\n }\n }\n function getH(val) {\n if (val == null) {\n return E;\n }\n if (val == +val) {\n return val;\n }\n $(mgr, {height: val});\n try {\n return mgr.getBBox().height;\n } catch (e) {\n return 0;\n }\n }\n function set(nam, f) {\n if (name == null) {\n out[nam] = f(el.attr(nam) || 0);\n } else if (nam == name) {\n out = f(value == null ? el.attr(nam) || 0 : value);\n }\n }\n switch (el.type) {\n case \"rect\":\n set(\"rx\", getW);\n set(\"ry\", getH);\n case \"image\":\n set(\"width\", getW);\n set(\"height\", getH);\n case \"text\":\n set(\"x\", getW);\n set(\"y\", getH);\n break;\n case \"circle\":\n set(\"cx\", getW);\n set(\"cy\", getH);\n set(\"r\", getW);\n break;\n case \"ellipse\":\n set(\"cx\", getW);\n set(\"cy\", getH);\n set(\"rx\", getW);\n set(\"ry\", getH);\n break;\n case \"line\":\n set(\"x1\", getW);\n set(\"x2\", getW);\n set(\"y1\", getH);\n set(\"y2\", getH);\n break;\n case \"marker\":\n set(\"refX\", getW);\n set(\"markerWidth\", getW);\n set(\"refY\", getH);\n set(\"markerHeight\", getH);\n break;\n case \"radialGradient\":\n set(\"fx\", getW);\n set(\"fy\", getH);\n break;\n case \"tspan\":\n set(\"dx\", getW);\n set(\"dy\", getH);\n break;\n default:\n set(name, getW);\n }\n svg.removeChild(mgr);\n return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n query = Str(query).replace(/([^\\\\]):/g, \"$1\\\\:\");\n return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n var nodelist = glob.doc.querySelectorAll(query),\n set = (Snap.set || Array)();\n for (var i = 0; i < nodelist.length; i++) {\n set.push(wrap(nodelist[i]));\n }\n return set;\n};\n\nfunction add2group(list) {\n if (!is(list, \"array\")) {\n list = Array.prototype.slice.call(arguments, 0);\n }\n var i = 0,\n j = 0,\n node = this.node;\n while (this[i]) delete this[i++];\n for (i = 0; i < list.length; i++) {\n if (list[i].type == \"set\") {\n list[i].forEach(function (el) {\n node.appendChild(el.node);\n });\n } else {\n node.appendChild(list[i].node);\n }\n }\n var children = node.childNodes;\n for (i = 0; i < children.length; i++) {\n this[j++] = wrap(children[i]);\n }\n return this;\n}\n// Hub garbage collector every 10s\nsetInterval(function () {\n for (var key in hub) if (hub[has](key)) {\n var el = hub[key],\n node = el.node;\n if (el.type != \"svg\" && !node.ownerSVGElement || el.type == \"svg\" && (!node.parentNode || \"ownerSVGElement\" in node.parentNode && !node.ownerSVGElement)) {\n delete hub[key];\n }\n }\n}, 1e4);\nfunction Element(el) {\n if (el.snap in hub) {\n return hub[el.snap];\n }\n var svg;\n try {\n svg = el.ownerSVGElement;\n } catch(e) {}\n /*\\\n * Element.node\n [ property (object) ]\n **\n * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n > Usage\n | // draw a circle at coordinate 10,10 with radius of 10\n | var c = paper.circle(10, 10, 10);\n | c.node.onclick = function () {\n | c.attr(\"fill\", \"red\");\n | };\n \\*/\n this.node = el;\n if (svg) {\n this.paper = new Paper(svg);\n }\n /*\\\n * Element.type\n [ property (string) ]\n **\n * SVG tag name of the given element.\n \\*/\n this.type = el.tagName || el.nodeName;\n var id = this.id = ID(this);\n this.anims = {};\n this._ = {\n transform: []\n };\n el.snap = id;\n hub[id] = this;\n if (this.type == \"g\") {\n this.add = add2group;\n }\n if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) {\n for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n this[method] = Paper.prototype[method];\n }\n }\n}\n /*\\\n * Element.attr\n [ method ]\n **\n * Gets or sets given attributes of the element.\n **\n - params (object) contains key-value pairs of attributes you want to set\n * or\n - param (string) name of the attribute\n = (Element) the current element\n * or\n = (string) value of attribute\n > Usage\n | el.attr({\n | fill: \"#fc0\",\n | stroke: \"#000\",\n | strokeWidth: 2, // CamelCase...\n | \"fill-opacity\": 0.5, // or dash-separated names\n | width: \"*=2\" // prefixed values\n | });\n | console.log(el.attr(\"fill\")); // #fc0\n * Prefixed values in format `\"+=10\"` supported. All four operations\n * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+`\n * and `-`: `\"+=2em\"`.\n \\*/\n Element.prototype.attr = function (params, value) {\n var el = this,\n node = el.node;\n if (!params) {\n if (node.nodeType != 1) {\n return {\n text: node.nodeValue\n };\n }\n var attr = node.attributes,\n out = {};\n for (var i = 0, ii = attr.length; i < ii; i++) {\n out[attr[i].nodeName] = attr[i].nodeValue;\n }\n return out;\n }\n if (is(params, \"string\")) {\n if (arguments.length > 1) {\n var json = {};\n json[params] = value;\n params = json;\n } else {\n return eve(\"snap.util.getattr.\" + params, el).firstDefined();\n }\n }\n for (var att in params) {\n if (params[has](att)) {\n eve(\"snap.util.attr.\" + att, el, params[att]);\n }\n }\n return el;\n };\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n var f = glob.doc.createDocumentFragment(),\n full = true,\n div = glob.doc.createElement(\"div\");\n svg = Str(svg);\n if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n svg = \"\" + svg + \"\";\n full = false;\n }\n div.innerHTML = svg;\n svg = div.getElementsByTagName(\"svg\")[0];\n if (svg) {\n if (full) {\n f = svg;\n } else {\n while (svg.firstChild) {\n f.appendChild(svg.firstChild);\n }\n }\n }\n return new Fragment(f);\n};\nfunction Fragment(frag) {\n this.node = frag;\n}\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n var args = Array.prototype.slice.call(arguments, 0),\n f = glob.doc.createDocumentFragment();\n for (var i = 0, ii = args.length; i < ii; i++) {\n var item = args[i];\n if (item.node && item.node.nodeType) {\n f.appendChild(item.node);\n }\n if (item.nodeType) {\n f.appendChild(item);\n }\n if (typeof item == \"string\") {\n f.appendChild(Snap.parse(item).node);\n }\n }\n return new Fragment(f);\n};\n\nfunction make(name, parent) {\n var res = $(name);\n parent.appendChild(res);\n var el = wrap(res);\n return el;\n}\nfunction Paper(w, h) {\n var res,\n desc,\n defs,\n proto = Paper.prototype;\n if (w && w.tagName && w.tagName.toLowerCase() == \"svg\") {\n if (w.snap in hub) {\n return hub[w.snap];\n }\n var doc = w.ownerDocument;\n res = new Element(w);\n desc = w.getElementsByTagName(\"desc\")[0];\n defs = w.getElementsByTagName(\"defs\")[0];\n if (!desc) {\n desc = $(\"desc\");\n desc.appendChild(doc.createTextNode(\"Created with Snap\"));\n res.node.appendChild(desc);\n }\n if (!defs) {\n defs = $(\"defs\");\n res.node.appendChild(defs);\n }\n res.defs = defs;\n for (var key in proto) if (proto[has](key)) {\n res[key] = proto[key];\n }\n res.paper = res.root = res;\n } else {\n res = make(\"svg\", glob.doc.body);\n $(res.node, {\n height: h,\n version: 1.1,\n width: w,\n xmlns: xmlns\n });\n }\n return res;\n}\nfunction wrap(dom) {\n if (!dom) {\n return dom;\n }\n if (dom instanceof Element || dom instanceof Fragment) {\n return dom;\n }\n if (dom.tagName && dom.tagName.toLowerCase() == \"svg\") {\n return new Paper(dom);\n }\n if (dom.tagName && dom.tagName.toLowerCase() == \"object\" && dom.type == \"image/svg+xml\") {\n return new Paper(dom.contentDocument.getElementsByTagName(\"svg\")[0]);\n }\n return new Element(dom);\n}\n\nSnap._.make = make;\nSnap._.wrap = wrap;\n/*\\\n * Paper.el\n [ method ]\n **\n * Creates an element on paper with a given name and no attributes\n **\n - name (string) tag name\n - attr (object) attributes\n = (Element) the current element\n > Usage\n | var c = paper.circle(10, 10, 10); // is the same as...\n | var c = paper.el(\"circle\").attr({\n | cx: 10,\n | cy: 10,\n | r: 10\n | });\n | // and the same as\n | var c = paper.el(\"circle\", {\n | cx: 10,\n | cy: 10,\n | r: 10\n | });\n\\*/\nPaper.prototype.el = function (name, attr) {\n var el = make(name, this.node);\n attr && el.attr(attr);\n return el;\n};\n/*\\\n * Element.children\n [ method ]\n **\n * Returns array of all the children of the element.\n = (array) array of Elements\n\\*/\nElement.prototype.children = function () {\n var out = [],\n ch = this.node.childNodes;\n for (var i = 0, ii = ch.length; i < ii; i++) {\n out[i] = Snap(ch[i]);\n }\n return out;\n};\nfunction jsonFiller(root, o) {\n for (var i = 0, ii = root.length; i < ii; i++) {\n var item = {\n type: root[i].type,\n attr: root[i].attr()\n },\n children = root[i].children();\n o.push(item);\n if (children.length) {\n jsonFiller(children, item.childNodes = []);\n }\n }\n}\n/*\\\n * Element.toJSON\n [ method ]\n **\n * Returns object representation of the given element and all its children.\n = (object) in format\n o {\n o type (string) this.type,\n o attr (object) attributes map,\n o childNodes (array) optional array of children in the same format\n o }\n\\*/\nElement.prototype.toJSON = function () {\n var out = [];\n jsonFiller([this], out);\n return out[0];\n};\n// default\neve.on(\"snap.util.getattr\", function () {\n var att = eve.nt();\n att = att.substring(att.lastIndexOf(\".\") + 1);\n var css = att.replace(/[A-Z]/g, function (letter) {\n return \"-\" + letter.toLowerCase();\n });\n if (cssAttr[has](css)) {\n return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n } else {\n return $(this.node, att);\n }\n});\nvar cssAttr = {\n \"alignment-baseline\": 0,\n \"baseline-shift\": 0,\n \"clip\": 0,\n \"clip-path\": 0,\n \"clip-rule\": 0,\n \"color\": 0,\n \"color-interpolation\": 0,\n \"color-interpolation-filters\": 0,\n \"color-profile\": 0,\n \"color-rendering\": 0,\n \"cursor\": 0,\n \"direction\": 0,\n \"display\": 0,\n \"dominant-baseline\": 0,\n \"enable-background\": 0,\n \"fill\": 0,\n \"fill-opacity\": 0,\n \"fill-rule\": 0,\n \"filter\": 0,\n \"flood-color\": 0,\n \"flood-opacity\": 0,\n \"font\": 0,\n \"font-family\": 0,\n \"font-size\": 0,\n \"font-size-adjust\": 0,\n \"font-stretch\": 0,\n \"font-style\": 0,\n \"font-variant\": 0,\n \"font-weight\": 0,\n \"glyph-orientation-horizontal\": 0,\n \"glyph-orientation-vertical\": 0,\n \"image-rendering\": 0,\n \"kerning\": 0,\n \"letter-spacing\": 0,\n \"lighting-color\": 0,\n \"marker\": 0,\n \"marker-end\": 0,\n \"marker-mid\": 0,\n \"marker-start\": 0,\n \"mask\": 0,\n \"opacity\": 0,\n \"overflow\": 0,\n \"pointer-events\": 0,\n \"shape-rendering\": 0,\n \"stop-color\": 0,\n \"stop-opacity\": 0,\n \"stroke\": 0,\n \"stroke-dasharray\": 0,\n \"stroke-dashoffset\": 0,\n \"stroke-linecap\": 0,\n \"stroke-linejoin\": 0,\n \"stroke-miterlimit\": 0,\n \"stroke-opacity\": 0,\n \"stroke-width\": 0,\n \"text-anchor\": 0,\n \"text-decoration\": 0,\n \"text-rendering\": 0,\n \"unicode-bidi\": 0,\n \"visibility\": 0,\n \"word-spacing\": 0,\n \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n var att = eve.nt(),\n attr = {};\n att = att.substring(att.lastIndexOf(\".\") + 1);\n attr[att] = value;\n var style = att.replace(/-(\\w)/gi, function (all, letter) {\n return letter.toUpperCase();\n }),\n css = att.replace(/[A-Z]/g, function (letter) {\n return \"-\" + letter.toLowerCase();\n });\n if (cssAttr[has](css)) {\n this.node.style[style] = value == null ? E : value;\n } else {\n $(this.node, attr);\n }\n});\n(function (proto) {}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n var req = new XMLHttpRequest,\n id = ID();\n if (req) {\n if (is(postData, \"function\")) {\n scope = callback;\n callback = postData;\n postData = null;\n } else if (is(postData, \"object\")) {\n var pd = [];\n for (var key in postData) if (postData.hasOwnProperty(key)) {\n pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n }\n postData = pd.join(\"&\");\n }\n req.open(postData ? \"POST\" : \"GET\", url, true);\n if (postData) {\n req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n }\n if (callback) {\n eve.once(\"snap.ajax.\" + id + \".0\", callback);\n eve.once(\"snap.ajax.\" + id + \".200\", callback);\n eve.once(\"snap.ajax.\" + id + \".304\", callback);\n }\n req.onreadystatechange = function() {\n if (req.readyState != 4) return;\n eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n };\n if (req.readyState == 4) {\n return req;\n }\n req.send(postData);\n return req;\n }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n Snap.ajax(url, function (req) {\n var f = Snap.parse(req.responseText);\n scope ? callback.call(scope, f) : callback(f);\n });\n};\nvar getOffset = function (elem) {\n var box = elem.getBoundingClientRect(),\n doc = elem.ownerDocument,\n body = doc.body,\n docElem = doc.documentElement,\n clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n return {\n y: top,\n x: left\n };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n var paper = this,\n svg = paper.canvas,\n target = glob.doc.elementFromPoint(x, y);\n if (glob.win.opera && target.tagName == \"svg\") {\n var so = getOffset(target),\n sr = target.createSVGRect();\n sr.x = x - so.x;\n sr.y = y - so.y;\n sr.width = sr.height = 1;\n var hits = target.getIntersectionList(sr, null);\n if (hits.length) {\n target = hits[hits.length - 1];\n }\n }\n if (!target) {\n return null;\n }\n return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with five arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global, Fragment) {\n | Snap.newmethod = function () {};\n | Element.prototype.newmethod = function () {};\n | Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n f(Snap, Element, Paper, glob, Fragment);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}(window || this));\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var elproto = Element.prototype,\n is = Snap.is,\n Str = String,\n unit2px = Snap._unit2px,\n $ = Snap._.$,\n make = Snap._.make,\n getSomeDefs = Snap._.getSomeDefs,\n has = \"hasOwnProperty\",\n wrap = Snap._.wrap;\n /*\\\n * Element.getBBox\n [ method ]\n **\n * Returns the bounding box descriptor for the given element\n **\n = (object) bounding box descriptor:\n o {\n o cx: (number) x of the center,\n o cy: (number) x of the center,\n o h: (number) height,\n o height: (number) height,\n o path: (string) path command for the box,\n o r0: (number) radius of a circle that fully encloses the box,\n o r1: (number) radius of the smallest circle that can be enclosed,\n o r2: (number) radius of the largest circle that can be enclosed,\n o vb: (string) box as a viewbox command,\n o w: (number) width,\n o width: (number) width,\n o x2: (number) x of the right side,\n o x: (number) x of the left side,\n o y2: (number) y of the bottom edge,\n o y: (number) y of the top edge\n o }\n \\*/\n elproto.getBBox = function (isWithoutTransform) {\n if (this.type == \"tspan\") {\n return Snap._.box(this.node.getClientRects().item(0));\n }\n if (!Snap.Matrix || !Snap.path) {\n return this.node.getBBox();\n }\n var el = this,\n m = new Snap.Matrix;\n if (el.removed) {\n return Snap._.box();\n }\n while (el.type == \"use\") {\n if (!isWithoutTransform) {\n m = m.add(el.transform().localMatrix.translate(el.attr(\"x\") || 0, el.attr(\"y\") || 0));\n }\n if (el.original) {\n el = el.original;\n } else {\n var href = el.attr(\"xlink:href\");\n el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf(\"#\") + 1));\n }\n }\n var _ = el._,\n pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt;\n try {\n if (isWithoutTransform) {\n _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox());\n return Snap._.box(_.bboxwt);\n } else {\n el.realPath = pathfinder(el);\n el.matrix = el.transform().localMatrix;\n _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix)));\n return Snap._.box(_.bbox);\n }\n } catch (e) {\n // Firefox doesn’t give you bbox of hidden element\n return Snap._.box();\n }\n };\n var propString = function () {\n return this.string;\n };\n function extractTransform(el, tstr) {\n if (tstr == null) {\n var doReturn = true;\n if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n tstr = el.node.getAttribute(\"gradientTransform\");\n } else if (el.type == \"pattern\") {\n tstr = el.node.getAttribute(\"patternTransform\");\n } else {\n tstr = el.node.getAttribute(\"transform\");\n }\n if (!tstr) {\n return new Snap.Matrix;\n }\n tstr = Snap._.svgTransform2string(tstr);\n } else {\n if (!Snap._.rgTransform.test(tstr)) {\n tstr = Snap._.svgTransform2string(tstr);\n } else {\n tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || \"\");\n }\n if (is(tstr, \"array\")) {\n tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n }\n el._.transform = tstr;\n }\n var m = Snap._.transform2matrix(tstr, el.getBBox(1));\n if (doReturn) {\n return m;\n } else {\n el.matrix = m;\n }\n }\n /*\\\n * Element.transform\n [ method ]\n **\n * Gets or sets transformation of the element\n **\n - tstr (string) transform string in Snap or SVG format\n = (Element) the current element\n * or\n = (object) transformation descriptor:\n o {\n o string (string) transform string,\n o globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n o localMatrix (Matrix) matrix of transformations applied only to the element,\n o diffMatrix (Matrix) matrix of difference between global and local transformations,\n o global (string) global transformation as string,\n o local (string) local transformation as string,\n o toString (function) returns `string` property\n o }\n \\*/\n elproto.transform = function (tstr) {\n var _ = this._;\n if (tstr == null) {\n var papa = this,\n global = new Snap.Matrix(this.node.getCTM()),\n local = extractTransform(this),\n ms = [local],\n m = new Snap.Matrix,\n i,\n localString = local.toTransformString(),\n string = Str(local) == Str(this.matrix) ?\n Str(_.transform) : localString;\n while (papa.type != \"svg\" && (papa = papa.parent())) {\n ms.push(extractTransform(papa));\n }\n i = ms.length;\n while (i--) {\n m.add(ms[i]);\n }\n return {\n string: string,\n globalMatrix: global,\n totalMatrix: m,\n localMatrix: local,\n diffMatrix: global.clone().add(local.invert()),\n global: global.toTransformString(),\n total: m.toTransformString(),\n local: localString,\n toString: propString\n };\n }\n if (tstr instanceof Snap.Matrix) {\n this.matrix = tstr;\n this._.transform = tstr.toTransformString();\n } else {\n extractTransform(this, tstr);\n }\n\n if (this.node) {\n if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n $(this.node, {gradientTransform: this.matrix});\n } else if (this.type == \"pattern\") {\n $(this.node, {patternTransform: this.matrix});\n } else {\n $(this.node, {transform: this.matrix});\n }\n }\n\n return this;\n };\n /*\\\n * Element.parent\n [ method ]\n **\n * Returns the element's parent\n **\n = (Element) the parent element\n \\*/\n elproto.parent = function () {\n return wrap(this.node.parentNode);\n };\n /*\\\n * Element.append\n [ method ]\n **\n * Appends the given element to current one\n **\n - el (Element|Set) element to append\n = (Element) the parent element\n \\*/\n /*\\\n * Element.add\n [ method ]\n **\n * See @Element.append\n \\*/\n elproto.append = elproto.add = function (el) {\n if (el) {\n if (el.type == \"set\") {\n var it = this;\n el.forEach(function (el) {\n it.add(el);\n });\n return this;\n }\n el = wrap(el);\n this.node.appendChild(el.node);\n el.paper = this.paper;\n }\n return this;\n };\n /*\\\n * Element.appendTo\n [ method ]\n **\n * Appends the current element to the given one\n **\n - el (Element) parent element to append to\n = (Element) the child element\n \\*/\n elproto.appendTo = function (el) {\n if (el) {\n el = wrap(el);\n el.append(this);\n }\n return this;\n };\n /*\\\n * Element.prepend\n [ method ]\n **\n * Prepends the given element to the current one\n **\n - el (Element) element to prepend\n = (Element) the parent element\n \\*/\n elproto.prepend = function (el) {\n if (el) {\n if (el.type == \"set\") {\n var it = this,\n first;\n el.forEach(function (el) {\n if (first) {\n first.after(el);\n } else {\n it.prepend(el);\n }\n first = el;\n });\n return this;\n }\n el = wrap(el);\n var parent = el.parent();\n this.node.insertBefore(el.node, this.node.firstChild);\n this.add && this.add();\n el.paper = this.paper;\n this.parent() && this.parent().add();\n parent && parent.add();\n }\n return this;\n };\n /*\\\n * Element.prependTo\n [ method ]\n **\n * Prepends the current element to the given one\n **\n - el (Element) parent element to prepend to\n = (Element) the child element\n \\*/\n elproto.prependTo = function (el) {\n el = wrap(el);\n el.prepend(this);\n return this;\n };\n /*\\\n * Element.before\n [ method ]\n **\n * Inserts given element before the current one\n **\n - el (Element) element to insert\n = (Element) the parent element\n \\*/\n elproto.before = function (el) {\n if (el.type == \"set\") {\n var it = this;\n el.forEach(function (el) {\n var parent = el.parent();\n it.node.parentNode.insertBefore(el.node, it.node);\n parent && parent.add();\n });\n this.parent().add();\n return this;\n }\n el = wrap(el);\n var parent = el.parent();\n this.node.parentNode.insertBefore(el.node, this.node);\n this.parent() && this.parent().add();\n parent && parent.add();\n el.paper = this.paper;\n return this;\n };\n /*\\\n * Element.after\n [ method ]\n **\n * Inserts given element after the current one\n **\n - el (Element) element to insert\n = (Element) the parent element\n \\*/\n elproto.after = function (el) {\n el = wrap(el);\n var parent = el.parent();\n if (this.node.nextSibling) {\n this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n } else {\n this.node.parentNode.appendChild(el.node);\n }\n this.parent() && this.parent().add();\n parent && parent.add();\n el.paper = this.paper;\n return this;\n };\n /*\\\n * Element.insertBefore\n [ method ]\n **\n * Inserts the element after the given one\n **\n - el (Element) element next to whom insert to\n = (Element) the parent element\n \\*/\n elproto.insertBefore = function (el) {\n el = wrap(el);\n var parent = this.parent();\n el.node.parentNode.insertBefore(this.node, el.node);\n this.paper = el.paper;\n parent && parent.add();\n el.parent() && el.parent().add();\n return this;\n };\n /*\\\n * Element.insertAfter\n [ method ]\n **\n * Inserts the element after the given one\n **\n - el (Element) element next to whom insert to\n = (Element) the parent element\n \\*/\n elproto.insertAfter = function (el) {\n el = wrap(el);\n var parent = this.parent();\n el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n this.paper = el.paper;\n parent && parent.add();\n el.parent() && el.parent().add();\n return this;\n };\n /*\\\n * Element.remove\n [ method ]\n **\n * Removes element from the DOM\n = (Element) the detached element\n \\*/\n elproto.remove = function () {\n var parent = this.parent();\n this.node.parentNode && this.node.parentNode.removeChild(this.node);\n delete this.paper;\n this.removed = true;\n parent && parent.add();\n return this;\n };\n /*\\\n * Element.select\n [ method ]\n **\n * Gathers the nested @Element matching the given set of CSS selectors\n **\n - query (string) CSS selector\n = (Element) result of query selection\n \\*/\n elproto.select = function (query) {\n return wrap(this.node.querySelector(query));\n };\n /*\\\n * Element.selectAll\n [ method ]\n **\n * Gathers nested @Element objects matching the given set of CSS selectors\n **\n - query (string) CSS selector\n = (Set|array) result of query selection\n \\*/\n elproto.selectAll = function (query) {\n var nodelist = this.node.querySelectorAll(query),\n set = (Snap.set || Array)();\n for (var i = 0; i < nodelist.length; i++) {\n set.push(wrap(nodelist[i]));\n }\n return set;\n };\n /*\\\n * Element.asPX\n [ method ]\n **\n * Returns given attribute of the element as a `px` value (not %, em, etc.)\n **\n - attr (string) attribute name\n - value (string) #optional attribute value\n = (Element) result of query selection\n \\*/\n elproto.asPX = function (attr, value) {\n if (value == null) {\n value = this.attr(attr);\n }\n return +unit2px(this, attr, value);\n };\n // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n /*\\\n * Element.use\n [ method ]\n **\n * Creates a `` element linked to the current element\n **\n = (Element) the `` element\n \\*/\n elproto.use = function () {\n var use,\n id = this.node.id;\n if (!id) {\n id = this.id;\n $(this.node, {\n id: id\n });\n }\n if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n this.type == \"pattern\") {\n use = make(this.type, this.node.parentNode);\n } else {\n use = make(\"use\", this.node.parentNode);\n }\n $(use.node, {\n \"xlink:href\": \"#\" + id\n });\n use.original = this;\n return use;\n };\n function fixids(el) {\n var els = el.selectAll(\"*\"),\n it,\n url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n ids = [],\n uses = {};\n function urltest(it, name) {\n var val = $(it.node, name);\n val = val && val.match(url);\n val = val && val[2];\n if (val && val.charAt() == \"#\") {\n val = val.substring(1);\n } else {\n return;\n }\n if (val) {\n uses[val] = (uses[val] || []).concat(function (id) {\n var attr = {};\n attr[name] = Snap.url(id);\n $(it.node, attr);\n });\n }\n }\n function linktest(it) {\n var val = $(it.node, \"xlink:href\");\n if (val && val.charAt() == \"#\") {\n val = val.substring(1);\n } else {\n return;\n }\n if (val) {\n uses[val] = (uses[val] || []).concat(function (id) {\n it.attr(\"xlink:href\", \"#\" + id);\n });\n }\n }\n for (var i = 0, ii = els.length; i < ii; i++) {\n it = els[i];\n urltest(it, \"fill\");\n urltest(it, \"stroke\");\n urltest(it, \"filter\");\n urltest(it, \"mask\");\n urltest(it, \"clip-path\");\n linktest(it);\n var oldid = $(it.node, \"id\");\n if (oldid) {\n $(it.node, {id: it.id});\n ids.push({\n old: oldid,\n id: it.id\n });\n }\n }\n for (i = 0, ii = ids.length; i < ii; i++) {\n var fs = uses[ids[i].old];\n if (fs) {\n for (var j = 0, jj = fs.length; j < jj; j++) {\n fs[j](ids[i].id);\n }\n }\n }\n }\n /*\\\n * Element.clone\n [ method ]\n **\n * Creates a clone of the element and inserts it after the element\n **\n = (Element) the clone\n \\*/\n elproto.clone = function () {\n var clone = wrap(this.node.cloneNode(true));\n if ($(clone.node, \"id\")) {\n $(clone.node, {id: clone.id});\n }\n fixids(clone);\n clone.insertAfter(this);\n return clone;\n };\n /*\\\n * Element.toDefs\n [ method ]\n **\n * Moves element to the shared `` area\n **\n = (Element) the element\n \\*/\n elproto.toDefs = function () {\n var defs = getSomeDefs(this);\n defs.appendChild(this.node);\n return this;\n };\n /*\\\n * Element.toPattern\n [ method ]\n **\n * Creates a `` element from the current element\n **\n * To create a pattern you have to specify the pattern rect:\n - x (string|number)\n - y (string|number)\n - width (string|number)\n - height (string|number)\n = (Element) the `` element\n * You can use pattern later on as an argument for `fill` attribute:\n | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n | fill: \"none\",\n | stroke: \"#bada55\",\n | strokeWidth: 5\n | }).pattern(0, 0, 10, 10),\n | c = paper.circle(200, 200, 100);\n | c.attr({\n | fill: p\n | });\n \\*/\n elproto.pattern = elproto.toPattern = function (x, y, width, height) {\n var p = make(\"pattern\", getSomeDefs(this));\n if (x == null) {\n x = this.getBBox();\n }\n if (is(x, \"object\") && \"x\" in x) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n $(p.node, {\n x: x,\n y: y,\n width: width,\n height: height,\n patternUnits: \"userSpaceOnUse\",\n id: p.id,\n viewBox: [x, y, width, height].join(\" \")\n });\n p.node.appendChild(this.node);\n return p;\n };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values. Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where? Couldn't they also be assigned default values?\n /*\\\n * Element.marker\n [ method ]\n **\n * Creates a `` element from the current element\n **\n * To create a marker you have to specify the bounding rect and reference point:\n - x (number)\n - y (number)\n - width (number)\n - height (number)\n - refX (number)\n - refY (number)\n = (Element) the `` element\n * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n \\*/\n // TODO add usage for markers\n elproto.marker = function (x, y, width, height, refX, refY) {\n var p = make(\"marker\", getSomeDefs(this));\n if (x == null) {\n x = this.getBBox();\n }\n if (is(x, \"object\") && \"x\" in x) {\n y = x.y;\n width = x.width;\n height = x.height;\n refX = x.refX || x.cx;\n refY = x.refY || x.cy;\n x = x.x;\n }\n $(p.node, {\n viewBox: [x, y, width, height].join(\" \"),\n markerWidth: width,\n markerHeight: height,\n orient: \"auto\",\n refX: refX || 0,\n refY: refY || 0,\n id: p.id\n });\n p.node.appendChild(this.node);\n return p;\n };\n var eldata = {};\n /*\\\n * Element.data\n [ method ]\n **\n * Adds or retrieves given value associated with given key. (Don’t confuse\n * with `data-` attributes)\n *\n * See also @Element.removeData\n - key (string) key to store data\n - value (any) #optional value to store\n = (object) @Element\n * or, if value is not specified:\n = (any) value\n > Usage\n | for (var i = 0, i < 5, i++) {\n | paper.circle(10 + 15 * i, 10, 10)\n | .attr({fill: \"#000\"})\n | .data(\"i\", i)\n | .click(function () {\n | alert(this.data(\"i\"));\n | });\n | }\n \\*/\n elproto.data = function (key, value) {\n var data = eldata[this.id] = eldata[this.id] || {};\n if (arguments.length == 0){\n eve(\"snap.data.get.\" + this.id, this, data, null);\n return data;\n }\n if (arguments.length == 1) {\n if (Snap.is(key, \"object\")) {\n for (var i in key) if (key[has](i)) {\n this.data(i, key[i]);\n }\n return this;\n }\n eve(\"snap.data.get.\" + this.id, this, data[key], key);\n return data[key];\n }\n data[key] = value;\n eve(\"snap.data.set.\" + this.id, this, value, key);\n return this;\n };\n /*\\\n * Element.removeData\n [ method ]\n **\n * Removes value associated with an element by given key.\n * If key is not provided, removes all the data of the element.\n - key (string) #optional key\n = (object) @Element\n \\*/\n elproto.removeData = function (key) {\n if (key == null) {\n eldata[this.id] = {};\n } else {\n eldata[this.id] && delete eldata[this.id][key];\n }\n return this;\n };\n /*\\\n * Element.outerSVG\n [ method ]\n **\n * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n *\n * See also @Element.innerSVG\n = (string) SVG code for the element\n \\*/\n /*\\\n * Element.toString\n [ method ]\n **\n * See @Element.outerSVG\n \\*/\n elproto.outerSVG = elproto.toString = toString(1);\n /*\\\n * Element.innerSVG\n [ method ]\n **\n * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n = (string) SVG code for the element\n \\*/\n elproto.innerSVG = toString();\n function toString(type) {\n return function () {\n var res = type ? \"<\" + this.type : \"\",\n attr = this.node.attributes,\n chld = this.node.childNodes;\n if (type) {\n for (var i = 0, ii = attr.length; i < ii; i++) {\n res += \" \" + attr[i].name + '=\"' +\n attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n }\n }\n if (chld.length) {\n type && (res += \">\");\n for (i = 0, ii = chld.length; i < ii; i++) {\n if (chld[i].nodeType == 3) {\n res += chld[i].nodeValue;\n } else if (chld[i].nodeType == 1) {\n res += wrap(chld[i]).toString();\n }\n }\n type && (res += \"\");\n } else {\n type && (res += \"/>\");\n }\n return res;\n };\n }\n elproto.toDataURL = function () {\n if (window && window.btoa) {\n var bb = this.getBBox(),\n svg = Snap.format('{contents}', {\n x: +bb.x.toFixed(3),\n y: +bb.y.toFixed(3),\n width: +bb.width.toFixed(3),\n height: +bb.height.toFixed(3),\n contents: this.outerSVG()\n });\n return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svg)));\n }\n };\n /*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n \\*/\n Fragment.prototype.select = elproto.select;\n /*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n \\*/\n Fragment.prototype.selectAll = elproto.selectAll;\n});\n\n// Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var elproto = Element.prototype,\n is = Snap.is,\n Str = String,\n has = \"hasOwnProperty\";\n function slice(from, to, f) {\n return function (arr) {\n var res = arr.slice(from, to);\n if (res.length == 1) {\n res = res[0];\n }\n return f ? f(res) : res;\n };\n }\n var Animation = function (attr, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n this.attr = attr;\n this.dur = ms;\n easing && (this.easing = easing);\n callback && (this.callback = callback);\n };\n Snap._.Animation = Animation;\n /*\\\n * Snap.animation\n [ method ]\n **\n * Creates an animation object\n **\n - attr (object) attributes of final destination\n - duration (number) duration of the animation, in milliseconds\n - easing (function) #optional one of easing functions of @mina or custom one\n - callback (function) #optional callback function that fires when animation ends\n = (object) animation object\n \\*/\n Snap.animation = function (attr, ms, easing, callback) {\n return new Animation(attr, ms, easing, callback);\n };\n /*\\\n * Element.inAnim\n [ method ]\n **\n * Returns a set of animations that may be able to manipulate the current element\n **\n = (object) in format:\n o {\n o anim (object) animation object,\n o mina (object) @mina object,\n o curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n o status (function) gets or sets the status of the animation,\n o stop (function) stops the animation\n o }\n \\*/\n elproto.inAnim = function () {\n var el = this,\n res = [];\n for (var id in el.anims) if (el.anims[has](id)) {\n (function (a) {\n res.push({\n anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n mina: a,\n curStatus: a.status(),\n status: function (val) {\n return a.status(val);\n },\n stop: function () {\n a.stop();\n }\n });\n }(el.anims[id]));\n }\n return res;\n };\n /*\\\n * Snap.animate\n [ method ]\n **\n * Runs generic animation of one number into another with a caring function\n **\n - from (number|array) number or array of numbers\n - to (number|array) number or array of numbers\n - setter (function) caring function that accepts one number argument\n - duration (number) duration, in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function to execute when animation ends\n = (object) animation object in @mina format\n o {\n o id (string) animation id, consider it read-only,\n o duration (function) gets or sets the duration of the animation,\n o easing (function) easing,\n o speed (function) gets or sets the speed of the animation,\n o status (function) gets or sets the status of the animation,\n o stop (function) stops the animation\n o }\n | var rect = Snap().rect(0, 0, 10, 10);\n | Snap.animate(0, 10, function (val) {\n | rect.attr({\n | x: val\n | });\n | }, 1000);\n | // in given context is equivalent to\n | rect.animate({x: 10}, 1000);\n \\*/\n Snap.animate = function (from, to, setter, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n var now = mina.time(),\n anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n callback && eve.once(\"mina.finish.\" + anim.id, callback);\n return anim;\n };\n /*\\\n * Element.stop\n [ method ]\n **\n * Stops all the animations for the current element\n **\n = (Element) the current element\n \\*/\n elproto.stop = function () {\n var anims = this.inAnim();\n for (var i = 0, ii = anims.length; i < ii; i++) {\n anims[i].stop();\n }\n return this;\n };\n /*\\\n * Element.animate\n [ method ]\n **\n * Animates the given attributes of the element\n **\n - attrs (object) key-value pairs of destination attributes\n - duration (number) duration of the animation in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function that executes when the animation ends\n = (Element) the current element\n \\*/\n elproto.animate = function (attrs, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n if (attrs instanceof Animation) {\n callback = attrs.callback;\n easing = attrs.easing;\n ms = attrs.dur;\n attrs = attrs.attr;\n }\n var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n el = this;\n for (var key in attrs) if (attrs[has](key)) {\n if (el.equal) {\n eq = el.equal(key, Str(attrs[key]));\n from = eq.from;\n to = eq.to;\n f = eq.f;\n } else {\n from = +el.attr(key);\n to = +attrs[key];\n }\n var len = is(from, \"array\") ? from.length : 1;\n keys[key] = slice(fkeys.length, fkeys.length + len, f);\n fkeys = fkeys.concat(from);\n tkeys = tkeys.concat(to);\n }\n var now = mina.time(),\n anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n var attr = {};\n for (var key in keys) if (keys[has](key)) {\n attr[key] = keys[key](val);\n }\n el.attr(attr);\n }, easing);\n el.anims[anim.id] = anim;\n anim._attrs = attrs;\n anim._callback = callback;\n eve(\"snap.animcreated.\" + el.id, anim);\n eve.once(\"mina.finish.\" + anim.id, function () {\n eve.off(\"mina.*.\" + anim.id);\n delete el.anims[anim.id];\n callback && callback.call(el);\n });\n eve.once(\"mina.stop.\" + anim.id, function () {\n eve.off(\"mina.*.\" + anim.id);\n delete el.anims[anim.id];\n });\n return el;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var objectToString = Object.prototype.toString,\n Str = String,\n math = Math,\n E = \"\";\n function Matrix(a, b, c, d, e, f) {\n if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n this.a = a.a;\n this.b = a.b;\n this.c = a.c;\n this.d = a.d;\n this.e = a.e;\n this.f = a.f;\n return;\n }\n if (a != null) {\n this.a = +a;\n this.b = +b;\n this.c = +c;\n this.d = +d;\n this.e = +e;\n this.f = +f;\n } else {\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n }\n }\n (function (matrixproto) {\n /*\\\n * Matrix.add\n [ method ]\n **\n * Adds the given matrix to existing one\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - matrix (object) @Matrix\n \\*/\n matrixproto.add = function (a, b, c, d, e, f) {\n if (a && a instanceof Matrix) {\n return this.add(a.a, a.b, a.c, a.d, a.e, a.f);\n }\n var aNew = a * this.a + b * this.c,\n bNew = a * this.b + b * this.d;\n this.e += e * this.a + f * this.c;\n this.f += e * this.b + f * this.d;\n this.c = c * this.a + d * this.c;\n this.d = c * this.b + d * this.d;\n\n this.a = aNew;\n this.b = bNew;\n return this;\n };\n /*\\\n * Matrix.multLeft\n [ method ]\n **\n * Multiplies a passed affine transform to the left: M * this.\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - matrix (object) @Matrix\n \\*/\n Matrix.prototype.multLeft = function (a, b, c, d, e, f) {\n if (a && a instanceof Matrix) {\n return this.multLeft(a.a, a.b, a.c, a.d, a.e, a.f);\n }\n var aNew = a * this.a + c * this.b,\n cNew = a * this.c + c * this.d,\n eNew = a * this.e + c * this.f + e;\n this.b = b * this.a + d * this.b;\n this.d = b * this.c + d * this.d;\n this.f = b * this.e + d * this.f + f;\n\n this.a = aNew;\n this.c = cNew;\n this.e = eNew;\n return this;\n };\n /*\\\n * Matrix.invert\n [ method ]\n **\n * Returns an inverted version of the matrix\n = (object) @Matrix\n \\*/\n matrixproto.invert = function () {\n var me = this,\n x = me.a * me.d - me.b * me.c;\n return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n };\n /*\\\n * Matrix.clone\n [ method ]\n **\n * Returns a copy of the matrix\n = (object) @Matrix\n \\*/\n matrixproto.clone = function () {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n };\n /*\\\n * Matrix.translate\n [ method ]\n **\n * Translate the matrix\n - x (number) horizontal offset distance\n - y (number) vertical offset distance\n \\*/\n matrixproto.translate = function (x, y) {\n this.e += x * this.a + y * this.c;\n this.f += x * this.b + y * this.d;\n return this;\n };\n /*\\\n * Matrix.scale\n [ method ]\n **\n * Scales the matrix\n - x (number) amount to be scaled, with `1` resulting in no change\n - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n - cx (number) #optional horizontal origin point from which to scale\n - cy (number) #optional vertical origin point from which to scale\n * Default cx, cy is the middle point of the element.\n \\*/\n matrixproto.scale = function (x, y, cx, cy) {\n y == null && (y = x);\n (cx || cy) && this.translate(cx, cy);\n this.a *= x;\n this.b *= x;\n this.c *= y;\n this.d *= y;\n (cx || cy) && this.translate(-cx, -cy);\n return this;\n };\n /*\\\n * Matrix.rotate\n [ method ]\n **\n * Rotates the matrix\n - a (number) angle of rotation, in degrees\n - x (number) horizontal origin point from which to rotate\n - y (number) vertical origin point from which to rotate\n \\*/\n matrixproto.rotate = function (a, x, y) {\n a = Snap.rad(a);\n x = x || 0;\n y = y || 0;\n var cos = +math.cos(a).toFixed(9),\n sin = +math.sin(a).toFixed(9);\n this.add(cos, sin, -sin, cos, x, y);\n return this.add(1, 0, 0, 1, -x, -y);\n };\n /*\\\n * Matrix.skewX\n [ method ]\n **\n * Skews the matrix along the x-axis\n - x (number) Angle to skew along the x-axis (in degrees).\n \\*/\n matrixproto.skewX = function (x) {\n return this.skew(x, 0);\n };\n /*\\\n * Matrix.skewY\n [ method ]\n **\n * Skews the matrix along the y-axis\n - y (number) Angle to skew along the y-axis (in degrees).\n \\*/\n matrixproto.skewY = function (y) {\n return this.skew(0, y);\n };\n /*\\\n * Matrix.skew\n [ method ]\n **\n * Skews the matrix\n - y (number) Angle to skew along the y-axis (in degrees).\n - x (number) Angle to skew along the x-axis (in degrees).\n \\*/\n matrixproto.skew = function (x, y) {\n x = x || 0;\n y = y || 0;\n x = Snap.rad(x);\n y = Snap.rad(y);\n var c = math.tan(x).toFixed(9);\n var b = math.tan(y).toFixed(9);\n return this.add(1, b, c, 1, 0, 0);\n };\n /*\\\n * Matrix.x\n [ method ]\n **\n * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n - x (number)\n - y (number)\n = (number) x\n \\*/\n matrixproto.x = function (x, y) {\n return x * this.a + y * this.c + this.e;\n };\n /*\\\n * Matrix.y\n [ method ]\n **\n * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n - x (number)\n - y (number)\n = (number) y\n \\*/\n matrixproto.y = function (x, y) {\n return x * this.b + y * this.d + this.f;\n };\n matrixproto.get = function (i) {\n return +this[Str.fromCharCode(97 + i)].toFixed(4);\n };\n matrixproto.toString = function () {\n return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n };\n matrixproto.offset = function () {\n return [this.e.toFixed(4), this.f.toFixed(4)];\n };\n function norm(a) {\n return a[0] * a[0] + a[1] * a[1];\n }\n function normalize(a) {\n var mag = math.sqrt(norm(a));\n a[0] && (a[0] /= mag);\n a[1] && (a[1] /= mag);\n }\n /*\\\n * Matrix.determinant\n [ method ]\n **\n * Finds determinant of the given matrix.\n = (number) determinant\n \\*/\n matrixproto.determinant = function () {\n return this.a * this.d - this.b * this.c;\n };\n /*\\\n * Matrix.split\n [ method ]\n **\n * Splits matrix into primitive transformations\n = (object) in format:\n o dx (number) translation by x\n o dy (number) translation by y\n o scalex (number) scale by x\n o scaley (number) scale by y\n o shear (number) shear\n o rotate (number) rotation in deg\n o isSimple (boolean) could it be represented via simple transformations\n \\*/\n matrixproto.split = function () {\n var out = {};\n // translation\n out.dx = this.e;\n out.dy = this.f;\n\n // scale and shear\n var row = [[this.a, this.b], [this.c, this.d]];\n out.scalex = math.sqrt(norm(row[0]));\n normalize(row[0]);\n\n out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n out.scaley = math.sqrt(norm(row[1]));\n normalize(row[1]);\n out.shear /= out.scaley;\n\n if (this.determinant() < 0) {\n out.scalex = -out.scalex;\n }\n\n // rotation\n var sin = row[0][1],\n cos = row[1][1];\n if (cos < 0) {\n out.rotate = Snap.deg(math.acos(cos));\n if (sin < 0) {\n out.rotate = 360 - out.rotate;\n }\n } else {\n out.rotate = Snap.deg(math.asin(sin));\n }\n\n out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n return out;\n };\n /*\\\n * Matrix.toTransformString\n [ method ]\n **\n * Returns transform string that represents given matrix\n = (string) transform string\n \\*/\n matrixproto.toTransformString = function (shorter) {\n var s = shorter || this.split();\n if (!+s.shear.toFixed(9)) {\n s.scalex = +s.scalex.toFixed(4);\n s.scaley = +s.scaley.toFixed(4);\n s.rotate = +s.rotate.toFixed(4);\n return (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) +\n (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E) +\n (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E);\n } else {\n return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n }\n };\n })(Matrix.prototype);\n /*\\\n * Snap.Matrix\n [ method ]\n **\n * Matrix constructor, extend on your own risk.\n * To create matrices use @Snap.matrix.\n \\*/\n Snap.Matrix = Matrix;\n /*\\\n * Snap.matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n \\*/\n Snap.matrix = function (a, b, c, d, e, f) {\n return new Matrix(a, b, c, d, e, f);\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var has = \"hasOwnProperty\",\n make = Snap._.make,\n wrap = Snap._.wrap,\n is = Snap.is,\n getSomeDefs = Snap._.getSomeDefs,\n reURLValue = /^url\\((['\"]?)([^)]+)\\1\\)$/,\n $ = Snap._.$,\n URL = Snap.url,\n Str = String,\n separator = Snap._.separator,\n E = \"\";\n /*\\\n * Snap.deurl\n [ method ]\n **\n * Unwraps path from `\"url()\"`.\n - value (string) url path\n = (string) unwrapped path\n \\*/\n Snap.deurl = function (value) {\n var res = String(value).match(reURLValue);\n return res ? res[2] : value;\n }\n // Attributes event handlers\n eve.on(\"snap.util.attr.mask\", function (value) {\n if (value instanceof Element || value instanceof Fragment) {\n eve.stop();\n if (value instanceof Fragment && value.node.childNodes.length == 1) {\n value = value.node.firstChild;\n getSomeDefs(this).appendChild(value);\n value = wrap(value);\n }\n if (value.type == \"mask\") {\n var mask = value;\n } else {\n mask = make(\"mask\", getSomeDefs(this));\n mask.node.appendChild(value.node);\n }\n !mask.node.id && $(mask.node, {\n id: mask.id\n });\n $(this.node, {\n mask: URL(mask.id)\n });\n }\n });\n (function (clipIt) {\n eve.on(\"snap.util.attr.clip\", clipIt);\n eve.on(\"snap.util.attr.clip-path\", clipIt);\n eve.on(\"snap.util.attr.clipPath\", clipIt);\n }(function (value) {\n if (value instanceof Element || value instanceof Fragment) {\n eve.stop();\n var clip,\n node = value.node;\n while (node) {\n if (node.nodeName === \"clipPath\") {\n clip = new Element(node);\n break;\n }\n if (node.nodeName === \"svg\") {\n clip = undefined;\n break;\n }\n node = node.parentNode;\n }\n if (!clip) {\n clip = make(\"clipPath\", getSomeDefs(this));\n clip.node.appendChild(value.node);\n !clip.node.id && $(clip.node, {\n id: clip.id\n });\n }\n $(this.node, {\n \"clip-path\": URL(clip.node.id || clip.id)\n });\n }\n }));\n function fillStroke(name) {\n return function (value) {\n eve.stop();\n if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n (value.node.firstChild.tagName == \"radialGradient\" ||\n value.node.firstChild.tagName == \"linearGradient\" ||\n value.node.firstChild.tagName == \"pattern\")) {\n value = value.node.firstChild;\n getSomeDefs(this).appendChild(value);\n value = wrap(value);\n }\n if (value instanceof Element) {\n if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n || value.type == \"pattern\") {\n if (!value.node.id) {\n $(value.node, {\n id: value.id\n });\n }\n var fill = URL(value.node.id);\n } else {\n fill = value.attr(name);\n }\n } else {\n fill = Snap.color(value);\n if (fill.error) {\n var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value);\n if (grad) {\n if (!grad.node.id) {\n $(grad.node, {\n id: grad.id\n });\n }\n fill = URL(grad.node.id);\n } else {\n fill = value;\n }\n } else {\n fill = Str(fill);\n }\n }\n var attrs = {};\n attrs[name] = fill;\n $(this.node, attrs);\n this.node.style[name] = E;\n };\n }\n eve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\n eve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\n var gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\n eve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n string = Str(string);\n var tokens = string.match(gradrg);\n if (!tokens) {\n return null;\n }\n var type = tokens[1],\n params = tokens[2],\n stops = tokens[3];\n params = params.split(/\\s*,\\s*/).map(function (el) {\n return +el == el ? +el : el;\n });\n if (params.length == 1 && params[0] == 0) {\n params = [];\n }\n stops = stops.split(\"-\");\n stops = stops.map(function (el) {\n el = el.split(\":\");\n var out = {\n color: el[0]\n };\n if (el[1]) {\n out.offset = parseFloat(el[1]);\n }\n return out;\n });\n var len = stops.length,\n start = 0,\n j = 0;\n function seed(i, end) {\n var step = (end - start) / (i - j);\n for (var k = j; k < i; k++) {\n stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n }\n j = i;\n start = end;\n }\n len--;\n for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n seed(i, stops[i].offset);\n }\n stops[len].offset = stops[len].offset || 100;\n seed(len, stops[len].offset);\n return {\n type: type,\n params: params,\n stops: stops\n };\n });\n\n eve.on(\"snap.util.attr.d\", function (value) {\n eve.stop();\n if (is(value, \"array\") && is(value[0], \"array\")) {\n value = Snap.path.toString.call(value);\n }\n value = Str(value);\n if (value.match(/[ruo]/i)) {\n value = Snap.path.toAbsolute(value);\n }\n $(this.node, {d: value});\n })(-1);\n eve.on(\"snap.util.attr.#text\", function (value) {\n eve.stop();\n value = Str(value);\n var txt = glob.doc.createTextNode(value);\n while (this.node.firstChild) {\n this.node.removeChild(this.node.firstChild);\n }\n this.node.appendChild(txt);\n })(-1);\n eve.on(\"snap.util.attr.path\", function (value) {\n eve.stop();\n this.attr({d: value});\n })(-1);\n eve.on(\"snap.util.attr.class\", function (value) {\n eve.stop();\n this.node.className.baseVal = value;\n })(-1);\n eve.on(\"snap.util.attr.viewBox\", function (value) {\n var vb;\n if (is(value, \"object\") && \"x\" in value) {\n vb = [value.x, value.y, value.width, value.height].join(\" \");\n } else if (is(value, \"array\")) {\n vb = value.join(\" \");\n } else {\n vb = value;\n }\n $(this.node, {\n viewBox: vb\n });\n eve.stop();\n })(-1);\n eve.on(\"snap.util.attr.transform\", function (value) {\n this.transform(value);\n eve.stop();\n })(-1);\n eve.on(\"snap.util.attr.r\", function (value) {\n if (this.type == \"rect\") {\n eve.stop();\n $(this.node, {\n rx: value,\n ry: value\n });\n }\n })(-1);\n eve.on(\"snap.util.attr.textpath\", function (value) {\n eve.stop();\n if (this.type == \"text\") {\n var id, tp, node;\n if (!value && this.textPath) {\n tp = this.textPath;\n while (tp.node.firstChild) {\n this.node.appendChild(tp.node.firstChild);\n }\n tp.remove();\n delete this.textPath;\n return;\n }\n if (is(value, \"string\")) {\n var defs = getSomeDefs(this),\n path = wrap(defs.parentNode).path(value);\n defs.appendChild(path.node);\n id = path.id;\n path.attr({id: id});\n } else {\n value = wrap(value);\n if (value instanceof Element) {\n id = value.attr(\"id\");\n if (!id) {\n id = value.id;\n value.attr({id: id});\n }\n }\n }\n if (id) {\n tp = this.textPath;\n node = this.node;\n if (tp) {\n tp.attr({\"xlink:href\": \"#\" + id});\n } else {\n tp = $(\"textPath\", {\n \"xlink:href\": \"#\" + id\n });\n while (node.firstChild) {\n tp.appendChild(node.firstChild);\n }\n node.appendChild(tp);\n this.textPath = wrap(tp);\n }\n }\n }\n })(-1);\n eve.on(\"snap.util.attr.text\", function (value) {\n if (this.type == \"text\") {\n var i = 0,\n node = this.node,\n tuner = function (chunk) {\n var out = $(\"tspan\");\n if (is(chunk, \"array\")) {\n for (var i = 0; i < chunk.length; i++) {\n out.appendChild(tuner(chunk[i]));\n }\n } else {\n out.appendChild(glob.doc.createTextNode(chunk));\n }\n out.normalize && out.normalize();\n return out;\n };\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n var tuned = tuner(value);\n while (tuned.firstChild) {\n node.appendChild(tuned.firstChild);\n }\n }\n eve.stop();\n })(-1);\n function setFontSize(value) {\n eve.stop();\n if (value == +value) {\n value += \"px\";\n }\n this.node.style.fontSize = value;\n }\n eve.on(\"snap.util.attr.fontSize\", setFontSize)(-1);\n eve.on(\"snap.util.attr.font-size\", setFontSize)(-1);\n\n\n eve.on(\"snap.util.getattr.transform\", function () {\n eve.stop();\n return this.transform();\n })(-1);\n eve.on(\"snap.util.getattr.textpath\", function () {\n eve.stop();\n return this.textPath;\n })(-1);\n // Markers\n (function () {\n function getter(end) {\n return function () {\n eve.stop();\n var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n if (style == \"none\") {\n return style;\n } else {\n return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n }\n };\n }\n function setter(end) {\n return function (value) {\n eve.stop();\n var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n if (value == \"\" || !value) {\n this.node.style[name] = \"none\";\n return;\n }\n if (value.type == \"marker\") {\n var id = value.node.id;\n if (!id) {\n $(value.node, {id: value.id});\n }\n this.node.style[name] = URL(id);\n return;\n }\n };\n }\n eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n }());\n eve.on(\"snap.util.getattr.r\", function () {\n if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n eve.stop();\n return $(this.node, \"rx\");\n }\n })(-1);\n function textExtract(node) {\n var out = [];\n var children = node.childNodes;\n for (var i = 0, ii = children.length; i < ii; i++) {\n var chi = children[i];\n if (chi.nodeType == 3) {\n out.push(chi.nodeValue);\n }\n if (chi.tagName == \"tspan\") {\n if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n out.push(chi.firstChild.nodeValue);\n } else {\n out.push(textExtract(chi));\n }\n }\n }\n return out;\n }\n eve.on(\"snap.util.getattr.text\", function () {\n if (this.type == \"text\" || this.type == \"tspan\") {\n eve.stop();\n var out = textExtract(this.node);\n return out.length == 1 ? out[0] : out;\n }\n })(-1);\n eve.on(\"snap.util.getattr.#text\", function () {\n return this.node.textContent;\n })(-1);\n eve.on(\"snap.util.getattr.fill\", function (internal) {\n if (internal) {\n return;\n }\n eve.stop();\n var value = eve(\"snap.util.getattr.fill\", this, true).firstDefined();\n return Snap(Snap.deurl(value)) || value;\n })(-1);\n eve.on(\"snap.util.getattr.stroke\", function (internal) {\n if (internal) {\n return;\n }\n eve.stop();\n var value = eve(\"snap.util.getattr.stroke\", this, true).firstDefined();\n return Snap(Snap.deurl(value)) || value;\n })(-1);\n eve.on(\"snap.util.getattr.viewBox\", function () {\n eve.stop();\n var vb = $(this.node, \"viewBox\");\n if (vb) {\n vb = vb.split(separator);\n return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n } else {\n return;\n }\n })(-1);\n eve.on(\"snap.util.getattr.points\", function () {\n var p = $(this.node, \"points\");\n eve.stop();\n if (p) {\n return p.split(separator);\n } else {\n return;\n }\n })(-1);\n eve.on(\"snap.util.getattr.path\", function () {\n var p = $(this.node, \"d\");\n eve.stop();\n return p;\n })(-1);\n eve.on(\"snap.util.getattr.class\", function () {\n return this.node.className.baseVal;\n })(-1);\n function getFontSize() {\n eve.stop();\n return this.node.style.fontSize;\n }\n eve.on(\"snap.util.getattr.fontSize\", getFontSize)(-1);\n eve.on(\"snap.util.getattr.font-size\", getFontSize)(-1);\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var rgNotSpace = /\\S+/g,\n rgBadSpace = /[\\t\\r\\n\\f]/g,\n rgTrim = /(^\\s+|\\s+$)/g,\n Str = String,\n elproto = Element.prototype;\n /*\\\n * Element.addClass\n [ method ]\n **\n * Adds given class name or list of class names to the element.\n - value (string) class name or space separated list of class names\n **\n = (Element) original element.\n \\*/\n elproto.addClass = function (value) {\n var classes = Str(value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n\n if (classes.length) {\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (!~pos) {\n curClasses.push(clazz);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n }\n return this;\n };\n /*\\\n * Element.removeClass\n [ method ]\n **\n * Removes given class name or list of class names from the element.\n - value (string) class name or space separated list of class names\n **\n = (Element) original element.\n \\*/\n elproto.removeClass = function (value) {\n var classes = Str(value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n if (curClasses.length) {\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (~pos) {\n curClasses.splice(pos, 1);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n }\n return this;\n };\n /*\\\n * Element.hasClass\n [ method ]\n **\n * Checks if the element has a given class name in the list of class names applied to it.\n - value (string) class name\n **\n = (boolean) `true` if the element has given class\n \\*/\n elproto.hasClass = function (value) {\n var elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [];\n return !!~curClasses.indexOf(value);\n };\n /*\\\n * Element.toggleClass\n [ method ]\n **\n * Add or remove one or more classes from the element, depending on either\n * the class’s presence or the value of the `flag` argument.\n - value (string) class name or space separated list of class names\n - flag (boolean) value to determine whether the class should be added or removed\n **\n = (Element) original element.\n \\*/\n elproto.toggleClass = function (value, flag) {\n if (flag != null) {\n if (flag) {\n return this.addClass(value);\n } else {\n return this.removeClass(value);\n }\n }\n var classes = (value || \"\").match(rgNotSpace) || [],\n elem = this.node,\n className = elem.className.baseVal,\n curClasses = className.match(rgNotSpace) || [],\n j,\n pos,\n clazz,\n finalValue;\n j = 0;\n while (clazz = classes[j++]) {\n pos = curClasses.indexOf(clazz);\n if (~pos) {\n curClasses.splice(pos, 1);\n } else {\n curClasses.push(clazz);\n }\n }\n\n finalValue = curClasses.join(\" \");\n if (className != finalValue) {\n elem.className.baseVal = finalValue;\n }\n return this;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var operators = {\n \"+\": function (x, y) {\n return x + y;\n },\n \"-\": function (x, y) {\n return x - y;\n },\n \"/\": function (x, y) {\n return x / y;\n },\n \"*\": function (x, y) {\n return x * y;\n }\n },\n Str = String,\n reUnit = /[a-z]+$/i,\n reAddon = /^\\s*([+\\-\\/*])\\s*=\\s*([\\d.eE+\\-]+)\\s*([^\\d\\s]+)?\\s*$/;\n function getNumber(val) {\n return val;\n }\n function getUnit(unit) {\n return function (val) {\n return +val.toFixed(3) + unit;\n };\n }\n eve.on(\"snap.util.attr\", function (val) {\n var plus = Str(val).match(reAddon);\n if (plus) {\n var evnt = eve.nt(),\n name = evnt.substring(evnt.lastIndexOf(\".\") + 1),\n a = this.attr(name),\n atr = {};\n eve.stop();\n var unit = plus[3] || \"\",\n aUnit = a.match(reUnit),\n op = operators[plus[1]];\n if (aUnit && aUnit == unit) {\n val = op(parseFloat(a), +plus[2]);\n } else {\n a = this.asPX(name);\n val = op(this.asPX(name), this.asPX(name, plus[2] + unit));\n }\n if (isNaN(a) || isNaN(val)) {\n return;\n }\n atr[name] = val;\n this.attr(atr);\n }\n })(-10);\n eve.on(\"snap.util.equal\", function (name, b) {\n var A, B, a = Str(this.attr(name) || \"\"),\n el = this,\n bplus = Str(b).match(reAddon);\n if (bplus) {\n eve.stop();\n var unit = bplus[3] || \"\",\n aUnit = a.match(reUnit),\n op = operators[bplus[1]];\n if (aUnit && aUnit == unit) {\n return {\n from: parseFloat(a),\n to: op(parseFloat(a), +bplus[2]),\n f: getUnit(aUnit)\n };\n } else {\n a = this.asPX(name);\n return {\n from: a,\n to: op(a, this.asPX(name, bplus[2] + unit)),\n f: getNumber\n };\n }\n }\n })(-10);\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var proto = Paper.prototype,\n is = Snap.is;\n /*\\\n * Paper.rect\n [ method ]\n *\n * Draws a rectangle\n **\n - x (number) x coordinate of the top left corner\n - y (number) y coordinate of the top left corner\n - width (number) width\n - height (number) height\n - rx (number) #optional horizontal radius for rounded corners, default is 0\n - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n = (object) the `rect` element\n **\n > Usage\n | // regular rectangle\n | var c = paper.rect(10, 10, 50, 50);\n | // rectangle with rounded corners\n | var c = paper.rect(40, 40, 50, 50, 10);\n \\*/\n proto.rect = function (x, y, w, h, rx, ry) {\n var attr;\n if (ry == null) {\n ry = rx;\n }\n if (is(x, \"object\") && x == \"[object Object]\") {\n attr = x;\n } else if (x != null) {\n attr = {\n x: x,\n y: y,\n width: w,\n height: h\n };\n if (rx != null) {\n attr.rx = rx;\n attr.ry = ry;\n }\n }\n return this.el(\"rect\", attr);\n };\n /*\\\n * Paper.circle\n [ method ]\n **\n * Draws a circle\n **\n - x (number) x coordinate of the centre\n - y (number) y coordinate of the centre\n - r (number) radius\n = (object) the `circle` element\n **\n > Usage\n | var c = paper.circle(50, 50, 40);\n \\*/\n proto.circle = function (cx, cy, r) {\n var attr;\n if (is(cx, \"object\") && cx == \"[object Object]\") {\n attr = cx;\n } else if (cx != null) {\n attr = {\n cx: cx,\n cy: cy,\n r: r\n };\n }\n return this.el(\"circle\", attr);\n };\n\n var preload = (function () {\n function onerror() {\n this.parentNode.removeChild(this);\n }\n return function (src, f) {\n var img = glob.doc.createElement(\"img\"),\n body = glob.doc.body;\n img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n img.onload = function () {\n f.call(img);\n img.onload = img.onerror = null;\n body.removeChild(img);\n };\n img.onerror = onerror;\n body.appendChild(img);\n img.src = src;\n };\n }());\n\n /*\\\n * Paper.image\n [ method ]\n **\n * Places an image on the surface\n **\n - src (string) URI of the source image\n - x (number) x offset position\n - y (number) y offset position\n - width (number) width of the image\n - height (number) height of the image\n = (object) the `image` element\n * or\n = (object) Snap element object with type `image`\n **\n > Usage\n | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n \\*/\n proto.image = function (src, x, y, width, height) {\n var el = this.el(\"image\");\n if (is(src, \"object\") && \"src\" in src) {\n el.attr(src);\n } else if (src != null) {\n var set = {\n \"xlink:href\": src,\n preserveAspectRatio: \"none\"\n };\n if (x != null && y != null) {\n set.x = x;\n set.y = y;\n }\n if (width != null && height != null) {\n set.width = width;\n set.height = height;\n } else {\n preload(src, function () {\n Snap._.$(el.node, {\n width: this.offsetWidth,\n height: this.offsetHeight\n });\n });\n }\n Snap._.$(el.node, set);\n }\n return el;\n };\n /*\\\n * Paper.ellipse\n [ method ]\n **\n * Draws an ellipse\n **\n - x (number) x coordinate of the centre\n - y (number) y coordinate of the centre\n - rx (number) horizontal radius\n - ry (number) vertical radius\n = (object) the `ellipse` element\n **\n > Usage\n | var c = paper.ellipse(50, 50, 40, 20);\n \\*/\n proto.ellipse = function (cx, cy, rx, ry) {\n var attr;\n if (is(cx, \"object\") && cx == \"[object Object]\") {\n attr = cx;\n } else if (cx != null) {\n attr ={\n cx: cx,\n cy: cy,\n rx: rx,\n ry: ry\n };\n }\n return this.el(\"ellipse\", attr);\n };\n // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n /*\\\n * Paper.path\n [ method ]\n **\n * Creates a `` element using the given string as the path's definition\n - pathString (string) #optional path string in SVG format\n * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n | \"M10,20L30,40\"\n * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n *\n #

Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

\n # \n # \n # \n # \n # \n # \n # \n # \n # \n # \n # \n #
CommandNameParameters
Mmoveto(x y)+
Zclosepath(none)
Llineto(x y)+
Hhorizontal linetox+
Vvertical linetoy+
Ccurveto(x1 y1 x2 y2 x y)+
Ssmooth curveto(x2 y2 x y)+
Qquadratic Bézier curveto(x1 y1 x y)+
Tsmooth quadratic Bézier curveto(x y)+
Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
RCatmull-Rom curveto*x1 y1 (x y)+
\n * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n > Usage\n | var c = paper.path(\"M10 10L90 90\");\n | // draw a diagonal line:\n | // move to 10,10, line to 90,90\n \\*/\n proto.path = function (d) {\n var attr;\n if (is(d, \"object\") && !is(d, \"array\")) {\n attr = d;\n } else if (d) {\n attr = {d: d};\n }\n return this.el(\"path\", attr);\n };\n /*\\\n * Paper.g\n [ method ]\n **\n * Creates a group element\n **\n - varargs (…) #optional elements to nest within the group\n = (object) the `g` element\n **\n > Usage\n | var c1 = paper.circle(),\n | c2 = paper.rect(),\n | g = paper.g(c2, c1); // note that the order of elements is different\n * or\n | var c1 = paper.circle(),\n | c2 = paper.rect(),\n | g = paper.g();\n | g.add(c2, c1);\n \\*/\n /*\\\n * Paper.group\n [ method ]\n **\n * See @Paper.g\n \\*/\n proto.group = proto.g = function (first) {\n var attr,\n el = this.el(\"g\");\n if (arguments.length == 1 && first && !first.type) {\n el.attr(first);\n } else if (arguments.length) {\n el.add(Array.prototype.slice.call(arguments, 0));\n }\n return el;\n };\n /*\\\n * Paper.svg\n [ method ]\n **\n * Creates a nested SVG element.\n - x (number) @optional X of the element\n - y (number) @optional Y of the element\n - width (number) @optional width of the element\n - height (number) @optional height of the element\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n **\n = (object) the `svg` element\n **\n \\*/\n proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) {\n var attrs = {};\n if (is(x, \"object\") && y == null) {\n attrs = x;\n } else {\n if (x != null) {\n attrs.x = x;\n }\n if (y != null) {\n attrs.y = y;\n }\n if (width != null) {\n attrs.width = width;\n }\n if (height != null) {\n attrs.height = height;\n }\n if (vbx != null && vby != null && vbw != null && vbh != null) {\n attrs.viewBox = [vbx, vby, vbw, vbh];\n }\n }\n return this.el(\"svg\", attrs);\n };\n /*\\\n * Paper.mask\n [ method ]\n **\n * Equivalent in behaviour to @Paper.g, except it’s a mask.\n **\n = (object) the `mask` element\n **\n \\*/\n proto.mask = function (first) {\n var attr,\n el = this.el(\"mask\");\n if (arguments.length == 1 && first && !first.type) {\n el.attr(first);\n } else if (arguments.length) {\n el.add(Array.prototype.slice.call(arguments, 0));\n }\n return el;\n };\n /*\\\n * Paper.ptrn\n [ method ]\n **\n * Equivalent in behaviour to @Paper.g, except it’s a pattern.\n - x (number) @optional X of the element\n - y (number) @optional Y of the element\n - width (number) @optional width of the element\n - height (number) @optional height of the element\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n **\n = (object) the `pattern` element\n **\n \\*/\n proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) {\n if (is(x, \"object\")) {\n var attr = x;\n } else {\n attr = {patternUnits: \"userSpaceOnUse\"};\n if (x) {\n attr.x = x;\n }\n if (y) {\n attr.y = y;\n }\n if (width != null) {\n attr.width = width;\n }\n if (height != null) {\n attr.height = height;\n }\n if (vx != null && vy != null && vw != null && vh != null) {\n attr.viewBox = [vx, vy, vw, vh];\n } else {\n attr.viewBox = [x || 0, y || 0, width || 0, height || 0];\n }\n }\n return this.el(\"pattern\", attr);\n };\n /*\\\n * Paper.use\n [ method ]\n **\n * Creates a element.\n - id (string) @optional id of element to link\n * or\n - id (Element) @optional element to link\n **\n = (object) the `use` element\n **\n \\*/\n proto.use = function (id) {\n if (id != null) {\n if (id instanceof Element) {\n if (!id.attr(\"id\")) {\n id.attr({id: Snap._.id(id)});\n }\n id = id.attr(\"id\");\n }\n if (String(id).charAt() == \"#\") {\n id = id.substring(1);\n }\n return this.el(\"use\", {\"xlink:href\": \"#\" + id});\n } else {\n return Element.prototype.use.call(this);\n }\n };\n /*\\\n * Paper.symbol\n [ method ]\n **\n * Creates a element.\n - vbx (number) @optional viewbox X\n - vby (number) @optional viewbox Y\n - vbw (number) @optional viewbox width\n - vbh (number) @optional viewbox height\n = (object) the `symbol` element\n **\n \\*/\n proto.symbol = function (vx, vy, vw, vh) {\n var attr = {};\n if (vx != null && vy != null && vw != null && vh != null) {\n attr.viewBox = [vx, vy, vw, vh];\n }\n\n return this.el(\"symbol\", attr);\n };\n /*\\\n * Paper.text\n [ method ]\n **\n * Draws a text string\n **\n - x (number) x coordinate position\n - y (number) y coordinate position\n - text (string|array) The text string to draw or array of strings to nest within separate `` elements\n = (object) the `text` element\n **\n > Usage\n | var t1 = paper.text(50, 50, \"Snap\");\n | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n | // Text path usage\n | t1.attr({textpath: \"M10,10L100,100\"});\n | // or\n | var pth = paper.path(\"M10,10L100,100\");\n | t1.attr({textpath: pth});\n \\*/\n proto.text = function (x, y, text) {\n var attr = {};\n if (is(x, \"object\")) {\n attr = x;\n } else if (x != null) {\n attr = {\n x: x,\n y: y,\n text: text || \"\"\n };\n }\n return this.el(\"text\", attr);\n };\n /*\\\n * Paper.line\n [ method ]\n **\n * Draws a line\n **\n - x1 (number) x coordinate position of the start\n - y1 (number) y coordinate position of the start\n - x2 (number) x coordinate position of the end\n - y2 (number) y coordinate position of the end\n = (object) the `line` element\n **\n > Usage\n | var t1 = paper.line(50, 50, 100, 100);\n \\*/\n proto.line = function (x1, y1, x2, y2) {\n var attr = {};\n if (is(x1, \"object\")) {\n attr = x1;\n } else if (x1 != null) {\n attr = {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n }\n return this.el(\"line\", attr);\n };\n /*\\\n * Paper.polyline\n [ method ]\n **\n * Draws a polyline\n **\n - points (array) array of points\n * or\n - varargs (…) points\n = (object) the `polyline` element\n **\n > Usage\n | var p1 = paper.polyline([10, 10, 100, 100]);\n | var p2 = paper.polyline(10, 10, 100, 100);\n \\*/\n proto.polyline = function (points) {\n if (arguments.length > 1) {\n points = Array.prototype.slice.call(arguments, 0);\n }\n var attr = {};\n if (is(points, \"object\") && !is(points, \"array\")) {\n attr = points;\n } else if (points != null) {\n attr = {points: points};\n }\n return this.el(\"polyline\", attr);\n };\n /*\\\n * Paper.polygon\n [ method ]\n **\n * Draws a polygon. See @Paper.polyline\n \\*/\n proto.polygon = function (points) {\n if (arguments.length > 1) {\n points = Array.prototype.slice.call(arguments, 0);\n }\n var attr = {};\n if (is(points, \"object\") && !is(points, \"array\")) {\n attr = points;\n } else if (points != null) {\n attr = {points: points};\n }\n return this.el(\"polygon\", attr);\n };\n // gradients\n (function () {\n var $ = Snap._.$;\n // gradients' helpers\n /*\\\n * Element.stops\n [ method ]\n **\n * Only for gradients!\n * Returns array of gradient stops elements.\n = (array) the stops array.\n \\*/\n function Gstops() {\n return this.selectAll(\"stop\");\n }\n /*\\\n * Element.addStop\n [ method ]\n **\n * Only for gradients!\n * Adds another stop to the gradient.\n - color (string) stops color\n - offset (number) stops offset 0..100\n = (object) gradient element\n \\*/\n function GaddStop(color, offset) {\n var stop = $(\"stop\"),\n attr = {\n offset: +offset + \"%\"\n };\n color = Snap.color(color);\n attr[\"stop-color\"] = color.hex;\n if (color.opacity < 1) {\n attr[\"stop-opacity\"] = color.opacity;\n }\n $(stop, attr);\n var stops = this.stops(),\n inserted;\n for (var i = 0; i < stops.length; i++) {\n var stopOffset = parseFloat(stops[i].attr(\"offset\"));\n if (stopOffset > offset) {\n this.node.insertBefore(stop, stops[i].node);\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n this.node.appendChild(stop);\n }\n return this;\n }\n function GgetBBox() {\n if (this.type == \"linearGradient\") {\n var x1 = $(this.node, \"x1\") || 0,\n x2 = $(this.node, \"x2\") || 1,\n y1 = $(this.node, \"y1\") || 0,\n y2 = $(this.node, \"y2\") || 0;\n return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n } else {\n var cx = this.node.cx || .5,\n cy = this.node.cy || .5,\n r = this.node.r || 0;\n return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n }\n }\n /*\\\n * Element.setStops\n [ method ]\n **\n * Only for gradients!\n * Updates stops of the gradient based on passed gradient descriptor. See @Ppaer.gradient\n - str (string) gradient descriptor part after `()`.\n = (object) gradient element\n | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n | g.setStops(\"#fff-#000-#f00-#fc0\");\n \\*/\n function GsetStops(str) {\n var grad = str,\n stops = this.stops();\n if (typeof str == \"string\") {\n grad = eve(\"snap.util.grad.parse\", null, \"l(0,0,0,1)\" + str).firstDefined().stops;\n }\n if (!Snap.is(grad, \"array\")) {\n return;\n }\n for (var i = 0; i < stops.length; i++) {\n if (grad[i]) {\n var color = Snap.color(grad[i].color),\n attr = {\"offset\": grad[i].offset + \"%\"};\n attr[\"stop-color\"] = color.hex;\n if (color.opacity < 1) {\n attr[\"stop-opacity\"] = color.opacity;\n }\n stops[i].attr(attr);\n } else {\n stops[i].remove();\n }\n }\n for (i = stops.length; i < grad.length; i++) {\n this.addStop(grad[i].color, grad[i].offset);\n }\n return this;\n }\n function gradient(defs, str) {\n var grad = eve(\"snap.util.grad.parse\", null, str).firstDefined(),\n el;\n if (!grad) {\n return null;\n }\n grad.params.unshift(defs);\n if (grad.type.toLowerCase() == \"l\") {\n el = gradientLinear.apply(0, grad.params);\n } else {\n el = gradientRadial.apply(0, grad.params);\n }\n if (grad.type != grad.type.toLowerCase()) {\n $(el.node, {\n gradientUnits: \"userSpaceOnUse\"\n });\n }\n var stops = grad.stops,\n len = stops.length;\n for (var i = 0; i < len; i++) {\n var stop = stops[i];\n el.addStop(stop.color, stop.offset);\n }\n return el;\n }\n function gradientLinear(defs, x1, y1, x2, y2) {\n var el = Snap._.make(\"linearGradient\", defs);\n el.stops = Gstops;\n el.addStop = GaddStop;\n el.getBBox = GgetBBox;\n el.setStops = GsetStops;\n if (x1 != null) {\n $(el.node, {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n }\n return el;\n }\n function gradientRadial(defs, cx, cy, r, fx, fy) {\n var el = Snap._.make(\"radialGradient\", defs);\n el.stops = Gstops;\n el.addStop = GaddStop;\n el.getBBox = GgetBBox;\n if (cx != null) {\n $(el.node, {\n cx: cx,\n cy: cy,\n r: r\n });\n }\n if (fx != null && fy != null) {\n $(el.node, {\n fx: fx,\n fy: fy\n });\n }\n return el;\n }\n /*\\\n * Paper.gradient\n [ method ]\n **\n * Creates a gradient element\n **\n - gradient (string) gradient descriptor\n > Gradient Descriptor\n * The gradient descriptor is an expression formatted as\n * follows: `()`. The `` can be\n * either linear or radial. The uppercase `L` or `R` letters\n * indicate absolute coordinates offset from the SVG surface.\n * Lowercase `l` or `r` letters indicate coordinates\n * calculated relative to the element to which the gradient is\n * applied. Coordinates specify a linear gradient vector as\n * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n * `r` and optional `fx`, `fy` specifying a focal point away\n * from the center of the circle. Specify `` as a list\n * of dash-separated CSS color values. Each color may be\n * followed by a custom offset value, separated with a colon\n * character.\n > Examples\n * Linear gradient, relative from top-left corner to bottom-right\n * corner, from black through red to white:\n | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n * Linear gradient, absolute from (0, 0) to (100, 100), from black\n * through red at 25% to white:\n | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25-#fff\");\n * Radial gradient, relative from the center of the element with radius\n * half the width, from black to white:\n | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n * To apply the gradient:\n | paper.circle(50, 50, 40).attr({\n | fill: g\n | });\n = (object) the `gradient` element\n \\*/\n proto.gradient = function (str) {\n return gradient(this.defs, str);\n };\n proto.gradientLinear = function (x1, y1, x2, y2) {\n return gradientLinear(this.defs, x1, y1, x2, y2);\n };\n proto.gradientRadial = function (cx, cy, r, fx, fy) {\n return gradientRadial(this.defs, cx, cy, r, fx, fy);\n };\n /*\\\n * Paper.toString\n [ method ]\n **\n * Returns SVG code for the @Paper\n = (string) SVG code for the @Paper\n \\*/\n proto.toString = function () {\n var doc = this.node.ownerDocument,\n f = doc.createDocumentFragment(),\n d = doc.createElement(\"div\"),\n svg = this.node.cloneNode(true),\n res;\n f.appendChild(d);\n d.appendChild(svg);\n Snap._.$(svg, {xmlns: \"http://www.w3.org/2000/svg\"});\n res = d.innerHTML;\n f.removeChild(f.firstChild);\n return res;\n };\n /*\\\n * Paper.toDataURL\n [ method ]\n **\n * Returns SVG code for the @Paper as Data URI string.\n = (string) Data URI string\n \\*/\n proto.toDataURL = function () {\n if (window && window.btoa) {\n return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(this)));\n }\n };\n /*\\\n * Paper.clear\n [ method ]\n **\n * Removes all child nodes of the paper, except .\n \\*/\n proto.clear = function () {\n var node = this.node.firstChild,\n next;\n while (node) {\n next = node.nextSibling;\n if (node.tagName != \"defs\") {\n node.parentNode.removeChild(node);\n } else {\n proto.clear.call({node: node});\n }\n node = next;\n }\n };\n }());\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n is = Snap.is,\n clone = Snap._.clone,\n has = \"hasOwnProperty\",\n p2s = /,?([a-z]),?/gi,\n toFloat = parseFloat,\n math = Math,\n PI = math.PI,\n mmin = math.min,\n mmax = math.max,\n pow = math.pow,\n abs = math.abs;\n function paths(ps) {\n var p = paths.ps = paths.ps || {};\n if (p[ps]) {\n p[ps].sleep = 100;\n } else {\n p[ps] = {\n sleep: 100\n };\n }\n setTimeout(function () {\n for (var key in p) if (p[has](key) && key != ps) {\n p[key].sleep--;\n !p[key].sleep && delete p[key];\n }\n });\n return p[ps];\n }\n function box(x, y, width, height) {\n if (x == null) {\n x = y = width = height = 0;\n }\n if (y == null) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n return {\n x: x,\n y: y,\n width: width,\n w: width,\n height: height,\n h: height,\n x2: x + width,\n y2: y + height,\n cx: x + width / 2,\n cy: y + height / 2,\n r1: math.min(width, height) / 2,\n r2: math.max(width, height) / 2,\n r0: math.sqrt(width * width + height * height) / 2,\n path: rectPath(x, y, width, height),\n vb: [x, y, width, height].join(\" \")\n };\n }\n function toString() {\n return this.join(\",\").replace(p2s, \"$1\");\n }\n function pathClone(pathArray) {\n var res = clone(pathArray);\n res.toString = toString;\n return res;\n }\n function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n if (length == null) {\n return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n } else {\n return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n }\n }\n function getLengthFactory(istotal, subpath) {\n function O(val) {\n return +(+val).toFixed(3);\n }\n return Snap._.cacher(function (path, length, onlystart) {\n if (path instanceof Element) {\n path = path.attr(\"d\");\n }\n path = path2curve(path);\n var x, y, p, l, sp = \"\", subpaths = {}, point,\n len = 0;\n for (var i = 0, ii = path.length; i < ii; i++) {\n p = path[i];\n if (p[0] == \"M\") {\n x = +p[1];\n y = +p[2];\n } else {\n l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n if (len + l > length) {\n if (subpath && !subpaths.start) {\n point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n sp += [\n \"C\" + O(point.start.x),\n O(point.start.y),\n O(point.m.x),\n O(point.m.y),\n O(point.x),\n O(point.y)\n ];\n if (onlystart) {return sp;}\n subpaths.start = sp;\n sp = [\n \"M\" + O(point.x),\n O(point.y) + \"C\" + O(point.n.x),\n O(point.n.y),\n O(point.end.x),\n O(point.end.y),\n O(p[5]),\n O(p[6])\n ].join();\n len += l;\n x = +p[5];\n y = +p[6];\n continue;\n }\n if (!istotal && !subpath) {\n point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n return point;\n }\n }\n len += l;\n x = +p[5];\n y = +p[6];\n }\n sp += p.shift() + p;\n }\n subpaths.end = sp;\n point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n return point;\n }, null, Snap._.clone);\n }\n var getTotalLength = getLengthFactory(1),\n getPointAtLength = getLengthFactory(),\n getSubpathsAtLength = getLengthFactory(0, 1);\n function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t,\n t13 = pow(t1, 3),\n t12 = pow(t1, 2),\n t2 = t * t,\n t3 = t2 * t,\n x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n ax = t1 * p1x + t * c1x,\n ay = t1 * p1y + t * c1y,\n cx = t1 * c2x + t * p2x,\n cy = t1 * c2y + t * p2y,\n alpha = 90 - math.atan2(mx - nx, my - ny) * 180 / PI;\n // (mx > nx || my < ny) && (alpha += 180);\n return {\n x: x,\n y: y,\n m: {x: mx, y: my},\n n: {x: nx, y: ny},\n start: {x: ax, y: ay},\n end: {x: cx, y: cy},\n alpha: alpha\n };\n }\n function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n if (!Snap.is(p1x, \"array\")) {\n p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n }\n var bbox = curveDim.apply(null, p1x);\n return box(\n bbox.min.x,\n bbox.min.y,\n bbox.max.x - bbox.min.x,\n bbox.max.y - bbox.min.y\n );\n }\n function isPointInsideBBox(bbox, x, y) {\n return x >= bbox.x &&\n x <= bbox.x + bbox.width &&\n y >= bbox.y &&\n y <= bbox.y + bbox.height;\n }\n function isBBoxIntersect(bbox1, bbox2) {\n bbox1 = box(bbox1);\n bbox2 = box(bbox2);\n return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n }\n function base3(t, p1, p2, p3, p4) {\n var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n return t * t2 - 3 * p1 + 3 * p2;\n }\n function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n if (z == null) {\n z = 1;\n }\n z = z > 1 ? 1 : z < 0 ? 0 : z;\n var z2 = z / 2,\n n = 12,\n Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n sum = 0;\n for (var i = 0; i < n; i++) {\n var ct = z2 * Tvalues[i] + z2,\n xbase = base3(ct, x1, x2, x3, x4),\n ybase = base3(ct, y1, y2, y3, y4),\n comb = xbase * xbase + ybase * ybase;\n sum += Cvalues[i] * math.sqrt(comb);\n }\n return z2 * sum;\n }\n function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n return;\n }\n var t = 1,\n step = t / 2,\n t2 = t - step,\n l,\n e = .01;\n l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n while (abs(l - ll) > e) {\n step /= 2;\n t2 += (l < ll ? 1 : -1) * step;\n l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n }\n return t2;\n }\n function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n if (\n mmax(x1, x2) < mmin(x3, x4) ||\n mmin(x1, x2) > mmax(x3, x4) ||\n mmax(y1, y2) < mmin(y3, y4) ||\n mmin(y1, y2) > mmax(y3, y4)\n ) {\n return;\n }\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (!denominator) {\n return;\n }\n var px = nx / denominator,\n py = ny / denominator,\n px2 = +px.toFixed(2),\n py2 = +py.toFixed(2);\n if (\n px2 < +mmin(x1, x2).toFixed(2) ||\n px2 > +mmax(x1, x2).toFixed(2) ||\n px2 < +mmin(x3, x4).toFixed(2) ||\n px2 > +mmax(x3, x4).toFixed(2) ||\n py2 < +mmin(y1, y2).toFixed(2) ||\n py2 > +mmax(y1, y2).toFixed(2) ||\n py2 < +mmin(y3, y4).toFixed(2) ||\n py2 > +mmax(y3, y4).toFixed(2)\n ) {\n return;\n }\n return {x: px, y: py};\n }\n function inter(bez1, bez2) {\n return interHelper(bez1, bez2);\n }\n function interCount(bez1, bez2) {\n return interHelper(bez1, bez2, 1);\n }\n function interHelper(bez1, bez2, justCount) {\n var bbox1 = bezierBBox(bez1),\n bbox2 = bezierBBox(bez2);\n if (!isBBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [];\n }\n var l1 = bezlen.apply(0, bez1),\n l2 = bezlen.apply(0, bez2),\n n1 = ~~(l1 / 8),\n n2 = ~~(l2 / 8),\n dots1 = [],\n dots2 = [],\n xy = {},\n res = justCount ? 0 : [];\n for (var i = 0; i < n1 + 1; i++) {\n var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n dots1.push({x: p.x, y: p.y, t: i / n1});\n }\n for (i = 0; i < n2 + 1; i++) {\n p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n dots2.push({x: p.x, y: p.y, t: i / n2});\n }\n for (i = 0; i < n1; i++) {\n for (var j = 0; j < n2; j++) {\n var di = dots1[i],\n di1 = dots1[i + 1],\n dj = dots2[j],\n dj1 = dots2[j + 1],\n ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n if (justCount) {\n res++;\n } else {\n res.push({\n x: is.x,\n y: is.y,\n t1: t1,\n t2: t2\n });\n }\n }\n }\n }\n }\n return res;\n }\n function pathIntersection(path1, path2) {\n return interPathHelper(path1, path2);\n }\n function pathIntersectionNumber(path1, path2) {\n return interPathHelper(path1, path2, 1);\n }\n function interPathHelper(path1, path2, justCount) {\n path1 = path2curve(path1);\n path2 = path2curve(path2);\n var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n res = justCount ? 0 : [];\n for (var i = 0, ii = path1.length; i < ii; i++) {\n var pi = path1[i];\n if (pi[0] == \"M\") {\n x1 = x1m = pi[1];\n y1 = y1m = pi[2];\n } else {\n if (pi[0] == \"C\") {\n bez1 = [x1, y1].concat(pi.slice(1));\n x1 = bez1[6];\n y1 = bez1[7];\n } else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (var j = 0, jj = path2.length; j < jj; j++) {\n var pj = path2[j];\n if (pj[0] == \"M\") {\n x2 = x2m = pj[1];\n y2 = y2m = pj[2];\n } else {\n if (pj[0] == \"C\") {\n bez2 = [x2, y2].concat(pj.slice(1));\n x2 = bez2[6];\n y2 = bez2[7];\n } else {\n bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n x2 = x2m;\n y2 = y2m;\n }\n var intr = interHelper(bez1, bez2, justCount);\n if (justCount) {\n res += intr;\n } else {\n for (var k = 0, kk = intr.length; k < kk; k++) {\n intr[k].segment1 = i;\n intr[k].segment2 = j;\n intr[k].bez1 = bez1;\n intr[k].bez2 = bez2;\n }\n res = res.concat(intr);\n }\n }\n }\n }\n }\n return res;\n }\n function isPointInsidePath(path, x, y) {\n var bbox = pathBBox(path);\n return isPointInsideBBox(bbox, x, y) &&\n interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n }\n function pathBBox(path) {\n var pth = paths(path);\n if (pth.bbox) {\n return clone(pth.bbox);\n }\n if (!path) {\n return box();\n }\n path = path2curve(path);\n var x = 0,\n y = 0,\n X = [],\n Y = [],\n p;\n for (var i = 0, ii = path.length; i < ii; i++) {\n p = path[i];\n if (p[0] == \"M\") {\n x = p[1];\n y = p[2];\n X.push(x);\n Y.push(y);\n } else {\n var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n X = X.concat(dim.min.x, dim.max.x);\n Y = Y.concat(dim.min.y, dim.max.y);\n x = p[5];\n y = p[6];\n }\n }\n var xmin = mmin.apply(0, X),\n ymin = mmin.apply(0, Y),\n xmax = mmax.apply(0, X),\n ymax = mmax.apply(0, Y),\n bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n pth.bbox = clone(bb);\n return bb;\n }\n function rectPath(x, y, w, h, r) {\n if (r) {\n return [\n [\"M\", +x + +r, y],\n [\"l\", w - r * 2, 0],\n [\"a\", r, r, 0, 0, 1, r, r],\n [\"l\", 0, h - r * 2],\n [\"a\", r, r, 0, 0, 1, -r, r],\n [\"l\", r * 2 - w, 0],\n [\"a\", r, r, 0, 0, 1, -r, -r],\n [\"l\", 0, r * 2 - h],\n [\"a\", r, r, 0, 0, 1, r, -r],\n [\"z\"]\n ];\n }\n var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n res.toString = toString;\n return res;\n }\n function ellipsePath(x, y, rx, ry, a) {\n if (a == null && ry == null) {\n ry = rx;\n }\n x = +x;\n y = +y;\n rx = +rx;\n ry = +ry;\n if (a != null) {\n var rad = Math.PI / 180,\n x1 = x + rx * Math.cos(-ry * rad),\n x2 = x + rx * Math.cos(-a * rad),\n y1 = y + rx * Math.sin(-ry * rad),\n y2 = y + rx * Math.sin(-a * rad),\n res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n } else {\n res = [\n [\"M\", x, y],\n [\"m\", 0, -ry],\n [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n [\"z\"]\n ];\n }\n res.toString = toString;\n return res;\n }\n var unit2px = Snap._unit2px,\n getPath = {\n path: function (el) {\n return el.attr(\"path\");\n },\n circle: function (el) {\n var attr = unit2px(el);\n return ellipsePath(attr.cx, attr.cy, attr.r);\n },\n ellipse: function (el) {\n var attr = unit2px(el);\n return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry);\n },\n rect: function (el) {\n var attr = unit2px(el);\n return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry);\n },\n image: function (el) {\n var attr = unit2px(el);\n return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height);\n },\n line: function (el) {\n return \"M\" + [el.attr(\"x1\") || 0, el.attr(\"y1\") || 0, el.attr(\"x2\"), el.attr(\"y2\")];\n },\n polyline: function (el) {\n return \"M\" + el.attr(\"points\");\n },\n polygon: function (el) {\n return \"M\" + el.attr(\"points\") + \"z\";\n },\n deflt: function (el) {\n var bbox = el.node.getBBox();\n return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n }\n };\n function pathToRelative(pathArray) {\n var pth = paths(pathArray),\n lowerCase = String.prototype.toLowerCase;\n if (pth.rel) {\n return pathClone(pth.rel);\n }\n if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n pathArray = Snap.parsePathString(pathArray);\n }\n var res = [],\n x = 0,\n y = 0,\n mx = 0,\n my = 0,\n start = 0;\n if (pathArray[0][0] == \"M\") {\n x = pathArray[0][1];\n y = pathArray[0][2];\n mx = x;\n my = y;\n start++;\n res.push([\"M\", x, y]);\n }\n for (var i = start, ii = pathArray.length; i < ii; i++) {\n var r = res[i] = [],\n pa = pathArray[i];\n if (pa[0] != lowerCase.call(pa[0])) {\n r[0] = lowerCase.call(pa[0]);\n switch (r[0]) {\n case \"a\":\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +(pa[6] - x).toFixed(3);\n r[7] = +(pa[7] - y).toFixed(3);\n break;\n case \"v\":\n r[1] = +(pa[1] - y).toFixed(3);\n break;\n case \"m\":\n mx = pa[1];\n my = pa[2];\n default:\n for (var j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +(pa[j] - (j % 2 ? x : y)).toFixed(3);\n }\n }\n } else {\n r = res[i] = [];\n if (pa[0] == \"m\") {\n mx = pa[1] + x;\n my = pa[2] + y;\n }\n for (var k = 0, kk = pa.length; k < kk; k++) {\n res[i][k] = pa[k];\n }\n }\n var len = res[i].length;\n switch (res[i][0]) {\n case \"z\":\n x = mx;\n y = my;\n break;\n case \"h\":\n x += +res[i][len - 1];\n break;\n case \"v\":\n y += +res[i][len - 1];\n break;\n default:\n x += +res[i][len - 2];\n y += +res[i][len - 1];\n }\n }\n res.toString = toString;\n pth.rel = pathClone(res);\n return res;\n }\n function pathToAbsolute(pathArray) {\n var pth = paths(pathArray);\n if (pth.abs) {\n return pathClone(pth.abs);\n }\n if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n pathArray = Snap.parsePathString(pathArray);\n }\n if (!pathArray || !pathArray.length) {\n return [[\"M\", 0, 0]];\n }\n var res = [],\n x = 0,\n y = 0,\n mx = 0,\n my = 0,\n start = 0,\n pa0;\n if (pathArray[0][0] == \"M\") {\n x = +pathArray[0][1];\n y = +pathArray[0][2];\n mx = x;\n my = y;\n start++;\n res[0] = [\"M\", x, y];\n }\n var crz = pathArray.length == 3 &&\n pathArray[0][0] == \"M\" &&\n pathArray[1][0].toUpperCase() == \"R\" &&\n pathArray[2][0].toUpperCase() == \"Z\";\n for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n res.push(r = []);\n pa = pathArray[i];\n pa0 = pa[0];\n if (pa0 != pa0.toUpperCase()) {\n r[0] = pa0.toUpperCase();\n switch (r[0]) {\n case \"A\":\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +pa[6] + x;\n r[7] = +pa[7] + y;\n break;\n case \"V\":\n r[1] = +pa[1] + y;\n break;\n case \"H\":\n r[1] = +pa[1] + x;\n break;\n case \"R\":\n var dots = [x, y].concat(pa.slice(1));\n for (var j = 2, jj = dots.length; j < jj; j++) {\n dots[j] = +dots[j] + x;\n dots[++j] = +dots[j] + y;\n }\n res.pop();\n res = res.concat(catmullRom2bezier(dots, crz));\n break;\n case \"O\":\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n break;\n case \"U\":\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = [\"U\"].concat(res[res.length - 1].slice(-2));\n break;\n case \"M\":\n mx = +pa[1] + x;\n my = +pa[2] + y;\n default:\n for (j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +pa[j] + (j % 2 ? x : y);\n }\n }\n } else if (pa0 == \"R\") {\n dots = [x, y].concat(pa.slice(1));\n res.pop();\n res = res.concat(catmullRom2bezier(dots, crz));\n r = [\"R\"].concat(pa.slice(-2));\n } else if (pa0 == \"O\") {\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n } else if (pa0 == \"U\") {\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = [\"U\"].concat(res[res.length - 1].slice(-2));\n } else {\n for (var k = 0, kk = pa.length; k < kk; k++) {\n r[k] = pa[k];\n }\n }\n pa0 = pa0.toUpperCase();\n if (pa0 != \"O\") {\n switch (r[0]) {\n case \"Z\":\n x = +mx;\n y = +my;\n break;\n case \"H\":\n x = r[1];\n break;\n case \"V\":\n y = r[1];\n break;\n case \"M\":\n mx = r[r.length - 2];\n my = r[r.length - 1];\n default:\n x = r[r.length - 2];\n y = r[r.length - 1];\n }\n }\n }\n res.toString = toString;\n pth.abs = pathClone(res);\n return res;\n }\n function l2c(x1, y1, x2, y2) {\n return [x1, y1, x2, y2, x2, y2];\n }\n function q2c(x1, y1, ax, ay, x2, y2) {\n var _13 = 1 / 3,\n _23 = 2 / 3;\n return [\n _13 * x1 + _23 * ax,\n _13 * y1 + _23 * ay,\n _13 * x2 + _23 * ax,\n _13 * y2 + _23 * ay,\n x2,\n y2\n ];\n }\n function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n // for more information of where this math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n var _120 = PI * 120 / 180,\n rad = PI / 180 * (+angle || 0),\n res = [],\n xy,\n rotate = Snap._.cacher(function (x, y, rad) {\n var X = x * math.cos(rad) - y * math.sin(rad),\n Y = x * math.sin(rad) + y * math.cos(rad);\n return {x: X, y: Y};\n });\n if (!rx || !ry) {\n return [x1, y1, x2, y2, x2, y2];\n }\n if (!recursive) {\n xy = rotate(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotate(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n var cos = math.cos(PI / 180 * angle),\n sin = math.sin(PI / 180 * angle),\n x = (x1 - x2) / 2,\n y = (y1 - y2) / 2;\n var h = x * x / (rx * rx) + y * y / (ry * ry);\n if (h > 1) {\n h = math.sqrt(h);\n rx = h * rx;\n ry = h * ry;\n }\n var rx2 = rx * rx,\n ry2 = ry * ry,\n k = (large_arc_flag == sweep_flag ? -1 : 1) *\n math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n cx = k * rx * y / ry + (x1 + x2) / 2,\n cy = k * -ry * x / rx + (y1 + y2) / 2,\n f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n f1 = x1 < cx ? PI - f1 : f1;\n f2 = x2 < cx ? PI - f2 : f2;\n f1 < 0 && (f1 = PI * 2 + f1);\n f2 < 0 && (f2 = PI * 2 + f2);\n if (sweep_flag && f1 > f2) {\n f1 = f1 - PI * 2;\n }\n if (!sweep_flag && f2 > f1) {\n f2 = f2 - PI * 2;\n }\n } else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n var df = f2 - f1;\n if (abs(df) > _120) {\n var f2old = f2,\n x2old = x2,\n y2old = y2;\n f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * math.cos(f2);\n y2 = cy + ry * math.sin(f2);\n res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n }\n df = f2 - f1;\n var c1 = math.cos(f1),\n s1 = math.sin(f1),\n c2 = math.cos(f2),\n s2 = math.sin(f2),\n t = math.tan(df / 4),\n hx = 4 / 3 * rx * t,\n hy = 4 / 3 * ry * t,\n m1 = [x1, y1],\n m2 = [x1 + hx * s1, y1 - hy * c1],\n m3 = [x2 + hx * s2, y2 - hy * c2],\n m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2, m3, m4].concat(res);\n } else {\n res = [m2, m3, m4].concat(res).join().split(\",\");\n var newres = [];\n for (var i = 0, ii = res.length; i < ii; i++) {\n newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n }\n return newres;\n }\n }\n function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t;\n return {\n x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n };\n }\n\n // Returns bounding box of cubic bezier curve.\n // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n // Original version: NISHIO Hirokazu\n // Modifications: https://github.com/timo22345\n function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) {\n var tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n for (var i = 0; i < 2; ++i) {\n if (i == 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n } else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n sqrtb2ac = math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length,\n jlen = j,\n mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n\n\n return {\n min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])},\n max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])}\n };\n }\n\n function path2curve(path, path2) {\n var pth = !path2 && paths(path);\n if (!path2 && pth.curve) {\n return pathClone(pth.curve);\n }\n var p = pathToAbsolute(path),\n p2 = path2 && pathToAbsolute(path2),\n attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n processPath = function (path, d, pcom) {\n var nx, ny;\n if (!path) {\n return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n }\n !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null);\n switch (path[0]) {\n case \"M\":\n d.X = path[1];\n d.Y = path[2];\n break;\n case \"A\":\n path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n break;\n case \"S\":\n if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n nx = d.x * 2 - d.bx; // And reflect the previous\n ny = d.y * 2 - d.by; // command's control point relative to the current point.\n }\n else { // or some else or nothing\n nx = d.x;\n ny = d.y;\n }\n path = [\"C\", nx, ny].concat(path.slice(1));\n break;\n case \"T\":\n if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n d.qx = d.x * 2 - d.qx; // And make a reflection similar\n d.qy = d.y * 2 - d.qy; // to case \"S\".\n }\n else { // or something else or nothing\n d.qx = d.x;\n d.qy = d.y;\n }\n path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n break;\n case \"Q\":\n d.qx = path[1];\n d.qy = path[2];\n path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n break;\n case \"L\":\n path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n break;\n case \"H\":\n path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n break;\n case \"V\":\n path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n break;\n case \"Z\":\n path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n break;\n }\n return path;\n },\n fixArc = function (pp, i) {\n if (pp[i].length > 7) {\n pp[i].shift();\n var pi = pp[i];\n while (pi.length) {\n pcoms1[i] = \"A\"; // if created multiple C:s, their original seg is saved\n p2 && (pcoms2[i] = \"A\"); // the same as above\n pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n }\n pp.splice(i, 1);\n ii = mmax(p.length, p2 && p2.length || 0);\n }\n },\n fixM = function (path1, path2, a1, a2, i) {\n if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n a1.bx = 0;\n a1.by = 0;\n a1.x = path1[i][1];\n a1.y = path1[i][2];\n ii = mmax(p.length, p2 && p2.length || 0);\n }\n },\n pcoms1 = [], // path commands of original path p\n pcoms2 = [], // path commands of original path p2\n pfirst = \"\", // temporary holder for original path command\n pcom = \"\"; // holder for previous path command of original path\n for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n p[i] && (pfirst = p[i][0]); // save current path command\n\n if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n {\n pcoms1[i] = pfirst; // Save current path command\n i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom\n }\n p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n // which may produce multiple C:s\n // so we have to make sure that C is also C in original path\n\n fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n if (p2) { // the same procedures is done to p2\n p2[i] && (pfirst = p2[i][0]);\n if (pfirst != \"C\") {\n pcoms2[i] = pfirst;\n i && (pcom = pcoms2[i - 1]);\n }\n p2[i] = processPath(p2[i], attrs2, pcom);\n\n if (pcoms2[i] != \"A\" && pfirst == \"C\") {\n pcoms2[i] = \"C\";\n }\n\n fixArc(p2, i);\n }\n fixM(p, p2, attrs, attrs2, i);\n fixM(p2, p, attrs2, attrs, i);\n var seg = p[i],\n seg2 = p2 && p2[i],\n seglen = seg.length,\n seg2len = p2 && seg2.length;\n attrs.x = seg[seglen - 2];\n attrs.y = seg[seglen - 1];\n attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n attrs2.x = p2 && seg2[seg2len - 2];\n attrs2.y = p2 && seg2[seg2len - 1];\n }\n if (!p2) {\n pth.curve = pathClone(p);\n }\n return p2 ? [p, p2] : p;\n }\n function mapPath(path, matrix) {\n if (!matrix) {\n return path;\n }\n var x, y, i, j, ii, jj, pathi;\n path = path2curve(path);\n for (i = 0, ii = path.length; i < ii; i++) {\n pathi = path[i];\n for (j = 1, jj = pathi.length; j < jj; j += 2) {\n x = matrix.x(pathi[j], pathi[j + 1]);\n y = matrix.y(pathi[j], pathi[j + 1]);\n pathi[j] = x;\n pathi[j + 1] = y;\n }\n }\n return path;\n }\n\n // http://schepers.cc/getting-to-the-point\n function catmullRom2bezier(crp, z) {\n var d = [];\n for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n var p = [\n {x: +crp[i - 2], y: +crp[i - 1]},\n {x: +crp[i], y: +crp[i + 1]},\n {x: +crp[i + 2], y: +crp[i + 3]},\n {x: +crp[i + 4], y: +crp[i + 5]}\n ];\n if (z) {\n if (!i) {\n p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n } else if (iLen - 4 == i) {\n p[3] = {x: +crp[0], y: +crp[1]};\n } else if (iLen - 2 == i) {\n p[2] = {x: +crp[0], y: +crp[1]};\n p[3] = {x: +crp[2], y: +crp[3]};\n }\n } else {\n if (iLen - 4 == i) {\n p[3] = p[2];\n } else if (!i) {\n p[0] = {x: +crp[i], y: +crp[i + 1]};\n }\n }\n d.push([\"C\",\n (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n (p[1].x + 6 * p[2].x - p[3].x) / 6,\n (p[1].y + 6*p[2].y - p[3].y) / 6,\n p[2].x,\n p[2].y\n ]);\n }\n\n return d;\n }\n\n // export\n Snap.path = paths;\n\n /*\\\n * Snap.path.getTotalLength\n [ method ]\n **\n * Returns the length of the given path in pixels\n **\n - path (string) SVG path string\n **\n = (number) length\n \\*/\n Snap.path.getTotalLength = getTotalLength;\n /*\\\n * Snap.path.getPointAtLength\n [ method ]\n **\n * Returns the coordinates of the point located at the given length along the given path\n **\n - path (string) SVG path string\n - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n **\n = (object) representation of the point:\n o {\n o x: (number) x coordinate,\n o y: (number) y coordinate,\n o alpha: (number) angle of derivative\n o }\n \\*/\n Snap.path.getPointAtLength = getPointAtLength;\n /*\\\n * Snap.path.getSubpath\n [ method ]\n **\n * Returns the subpath of a given path between given start and end lengths\n **\n - path (string) SVG path string\n - from (number) length, in pixels, from the start of the path to the start of the segment\n - to (number) length, in pixels, from the start of the path to the end of the segment\n **\n = (string) path string definition for the segment\n \\*/\n Snap.path.getSubpath = function (path, from, to) {\n if (this.getTotalLength(path) - to < 1e-6) {\n return getSubpathsAtLength(path, from).end;\n }\n var a = getSubpathsAtLength(path, to, 1);\n return from ? getSubpathsAtLength(a, from).end : a;\n };\n /*\\\n * Element.getTotalLength\n [ method ]\n **\n * Returns the length of the path in pixels (only works for `path` elements)\n = (number) length\n \\*/\n elproto.getTotalLength = function () {\n if (this.node.getTotalLength) {\n return this.node.getTotalLength();\n }\n };\n // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n /*\\\n * Element.getPointAtLength\n [ method ]\n **\n * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n **\n - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n **\n = (object) representation of the point:\n o {\n o x: (number) x coordinate,\n o y: (number) y coordinate,\n o alpha: (number) angle of derivative\n o }\n \\*/\n elproto.getPointAtLength = function (length) {\n return getPointAtLength(this.attr(\"d\"), length);\n };\n // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n /*\\\n * Element.getSubpath\n [ method ]\n **\n * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n **\n - from (number) length, in pixels, from the start of the path to the start of the segment\n - to (number) length, in pixels, from the start of the path to the end of the segment\n **\n = (string) path string definition for the segment\n \\*/\n elproto.getSubpath = function (from, to) {\n return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n };\n Snap._.box = box;\n /*\\\n * Snap.path.findDotsAtSegment\n [ method ]\n **\n * Utility method\n **\n * Finds dot coordinates on the given cubic beziér curve at the given t\n - p1x (number) x of the first point of the curve\n - p1y (number) y of the first point of the curve\n - c1x (number) x of the first anchor of the curve\n - c1y (number) y of the first anchor of the curve\n - c2x (number) x of the second anchor of the curve\n - c2y (number) y of the second anchor of the curve\n - p2x (number) x of the second point of the curve\n - p2y (number) y of the second point of the curve\n - t (number) position on the curve (0..1)\n = (object) point information in format:\n o {\n o x: (number) x coordinate of the point,\n o y: (number) y coordinate of the point,\n o m: {\n o x: (number) x coordinate of the left anchor,\n o y: (number) y coordinate of the left anchor\n o },\n o n: {\n o x: (number) x coordinate of the right anchor,\n o y: (number) y coordinate of the right anchor\n o },\n o start: {\n o x: (number) x coordinate of the start of the curve,\n o y: (number) y coordinate of the start of the curve\n o },\n o end: {\n o x: (number) x coordinate of the end of the curve,\n o y: (number) y coordinate of the end of the curve\n o },\n o alpha: (number) angle of the curve derivative at the point\n o }\n \\*/\n Snap.path.findDotsAtSegment = findDotsAtSegment;\n /*\\\n * Snap.path.bezierBBox\n [ method ]\n **\n * Utility method\n **\n * Returns the bounding box of a given cubic beziér curve\n - p1x (number) x of the first point of the curve\n - p1y (number) y of the first point of the curve\n - c1x (number) x of the first anchor of the curve\n - c1y (number) y of the first anchor of the curve\n - c2x (number) x of the second anchor of the curve\n - c2y (number) y of the second anchor of the curve\n - p2x (number) x of the second point of the curve\n - p2y (number) y of the second point of the curve\n * or\n - bez (array) array of six points for beziér curve\n = (object) bounding box\n o {\n o x: (number) x coordinate of the left top point of the box,\n o y: (number) y coordinate of the left top point of the box,\n o x2: (number) x coordinate of the right bottom point of the box,\n o y2: (number) y coordinate of the right bottom point of the box,\n o width: (number) width of the box,\n o height: (number) height of the box\n o }\n \\*/\n Snap.path.bezierBBox = bezierBBox;\n /*\\\n * Snap.path.isPointInsideBBox\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if given point is inside bounding box\n - bbox (string) bounding box\n - x (string) x coordinate of the point\n - y (string) y coordinate of the point\n = (boolean) `true` if point is inside\n \\*/\n Snap.path.isPointInsideBBox = isPointInsideBBox;\n Snap.closest = function (x, y, X, Y) {\n var r = 100,\n b = box(x - r / 2, y - r / 2, r, r),\n inside = [],\n getter = X[0].hasOwnProperty(\"x\") ? function (i) {\n return {\n x: X[i].x,\n y: X[i].y\n };\n } : function (i) {\n return {\n x: X[i],\n y: Y[i]\n };\n },\n found = 0;\n while (r <= 1e6 && !found) {\n for (var i = 0, ii = X.length; i < ii; i++) {\n var xy = getter(i);\n if (isPointInsideBBox(b, xy.x, xy.y)) {\n found++;\n inside.push(xy);\n break;\n }\n }\n if (!found) {\n r *= 2;\n b = box(x - r / 2, y - r / 2, r, r)\n }\n }\n if (r == 1e6) {\n return;\n }\n var len = Infinity,\n res;\n for (i = 0, ii = inside.length; i < ii; i++) {\n var l = Snap.len(x, y, inside[i].x, inside[i].y);\n if (len > l) {\n len = l;\n inside[i].len = l;\n res = inside[i];\n }\n }\n return res;\n };\n /*\\\n * Snap.path.isBBoxIntersect\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if two bounding boxes intersect\n - bbox1 (string) first bounding box\n - bbox2 (string) second bounding box\n = (boolean) `true` if bounding boxes intersect\n \\*/\n Snap.path.isBBoxIntersect = isBBoxIntersect;\n /*\\\n * Snap.path.intersection\n [ method ]\n **\n * Utility method\n **\n * Finds intersections of two paths\n - path1 (string) path string\n - path2 (string) path string\n = (array) dots of intersection\n o [\n o {\n o x: (number) x coordinate of the point,\n o y: (number) y coordinate of the point,\n o t1: (number) t value for segment of path1,\n o t2: (number) t value for segment of path2,\n o segment1: (number) order number for segment of path1,\n o segment2: (number) order number for segment of path2,\n o bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n o bez2: (array) eight coordinates representing beziér curve for the segment of path2\n o }\n o ]\n \\*/\n Snap.path.intersection = pathIntersection;\n Snap.path.intersectionNumber = pathIntersectionNumber;\n /*\\\n * Snap.path.isPointInside\n [ method ]\n **\n * Utility method\n **\n * Returns `true` if given point is inside a given closed path.\n *\n * Note: fill mode doesn’t affect the result of this method.\n - path (string) path string\n - x (number) x of the point\n - y (number) y of the point\n = (boolean) `true` if point is inside the path\n \\*/\n Snap.path.isPointInside = isPointInsidePath;\n /*\\\n * Snap.path.getBBox\n [ method ]\n **\n * Utility method\n **\n * Returns the bounding box of a given path\n - path (string) path string\n = (object) bounding box\n o {\n o x: (number) x coordinate of the left top point of the box,\n o y: (number) y coordinate of the left top point of the box,\n o x2: (number) x coordinate of the right bottom point of the box,\n o y2: (number) y coordinate of the right bottom point of the box,\n o width: (number) width of the box,\n o height: (number) height of the box\n o }\n \\*/\n Snap.path.getBBox = pathBBox;\n Snap.path.get = getPath;\n /*\\\n * Snap.path.toRelative\n [ method ]\n **\n * Utility method\n **\n * Converts path coordinates into relative values\n - path (string) path string\n = (array) path string\n \\*/\n Snap.path.toRelative = pathToRelative;\n /*\\\n * Snap.path.toAbsolute\n [ method ]\n **\n * Utility method\n **\n * Converts path coordinates into absolute values\n - path (string) path string\n = (array) path string\n \\*/\n Snap.path.toAbsolute = pathToAbsolute;\n /*\\\n * Snap.path.toCubic\n [ method ]\n **\n * Utility method\n **\n * Converts path to a new path where all segments are cubic beziér curves\n - pathString (string|array) path string or array of segments\n = (array) array of segments\n \\*/\n Snap.path.toCubic = path2curve;\n /*\\\n * Snap.path.map\n [ method ]\n **\n * Transform the path string with the given matrix\n - path (string) path string\n - matrix (object) see @Matrix\n = (string) transformed path string\n \\*/\n Snap.path.map = mapPath;\n Snap.path.toString = toString;\n Snap.path.clone = pathClone;\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var mmax = Math.max,\n mmin = Math.min;\n\n // Set\n var Set = function (items) {\n this.items = [];\n\tthis.bindings = {};\n this.length = 0;\n this.type = \"set\";\n if (items) {\n for (var i = 0, ii = items.length; i < ii; i++) {\n if (items[i]) {\n this[this.items.length] = this.items[this.items.length] = items[i];\n this.length++;\n }\n }\n }\n },\n setproto = Set.prototype;\n /*\\\n * Set.push\n [ method ]\n **\n * Adds each argument to the current set\n = (object) original element\n \\*/\n setproto.push = function () {\n var item,\n len;\n for (var i = 0, ii = arguments.length; i < ii; i++) {\n item = arguments[i];\n if (item) {\n len = this.items.length;\n this[len] = this.items[len] = item;\n this.length++;\n }\n }\n return this;\n };\n /*\\\n * Set.pop\n [ method ]\n **\n * Removes last element and returns it\n = (object) element\n \\*/\n setproto.pop = function () {\n this.length && delete this[this.length--];\n return this.items.pop();\n };\n /*\\\n * Set.forEach\n [ method ]\n **\n * Executes given function for each element in the set\n *\n * If the function returns `false`, the loop stops running.\n **\n - callback (function) function to run\n - thisArg (object) context object for the callback\n = (object) Set object\n \\*/\n setproto.forEach = function (callback, thisArg) {\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n if (callback.call(thisArg, this.items[i], i) === false) {\n return this;\n }\n }\n return this;\n };\n /*\\\n * Set.animate\n [ method ]\n **\n * Animates each element in set in sync.\n *\n **\n - attrs (object) key-value pairs of destination attributes\n - duration (number) duration of the animation in milliseconds\n - easing (function) #optional easing function from @mina or custom\n - callback (function) #optional callback function that executes when the animation ends\n * or\n - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]`\n > Usage\n | // animate all elements in set to radius 10\n | set.animate({r: 10}, 500, mina.easein);\n | // or\n | // animate first element to radius 10, but second to radius 20 and in different time\n | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);\n = (Element) the current element\n \\*/\n setproto.animate = function (attrs, ms, easing, callback) {\n if (typeof easing == \"function\" && !easing.length) {\n callback = easing;\n easing = mina.linear;\n }\n if (attrs instanceof Snap._.Animation) {\n callback = attrs.callback;\n easing = attrs.easing;\n ms = easing.dur;\n attrs = attrs.attr;\n }\n var args = arguments;\n if (Snap.is(attrs, \"array\") && Snap.is(args[args.length - 1], \"array\")) {\n var each = true;\n }\n var begin,\n handler = function () {\n if (begin) {\n this.b = begin;\n } else {\n begin = this.b;\n }\n },\n cb = 0,\n set = this,\n callbacker = callback && function () {\n if (++cb == set.length) {\n callback.call(this);\n }\n };\n return this.forEach(function (el, i) {\n eve.once(\"snap.animcreated.\" + el.id, handler);\n if (each) {\n args[i] && el.animate.apply(el, args[i]);\n } else {\n el.animate(attrs, ms, easing, callbacker);\n }\n });\n };\n /*\\\n * Set.remove\n [ method ]\n **\n * Removes all children of the set.\n *\n = (object) Set object\n \\*/\n setproto.remove = function () {\n while (this.length) {\n this.pop().remove();\n }\n return this;\n };\n /*\\\n * Set.bind\n [ method ]\n **\n * Specifies how to handle a specific attribute when applied\n * to a set.\n *\n **\n - attr (string) attribute name\n - callback (function) function to run\n * or\n - attr (string) attribute name\n - element (Element) specific element in the set to apply the attribute to\n * or\n - attr (string) attribute name\n - element (Element) specific element in the set to apply the attribute to\n - eattr (string) attribute on the element to bind the attribute to\n = (object) Set object\n \\*/\n setproto.bind = function (attr, a, b) {\n var data = {};\n if (typeof a == \"function\") {\n this.bindings[attr] = a;\n } else {\n var aname = b || attr;\n this.bindings[attr] = function (v) {\n data[aname] = v;\n a.attr(data);\n };\n }\n return this;\n };\n /*\\\n * Set.attr\n [ method ]\n **\n * Equivalent of @Element.attr.\n = (object) Set object\n \\*/\n setproto.attr = function (value) {\n var unbound = {};\n for (var k in value) {\n if (this.bindings[k]) {\n this.bindings[k](value[k]);\n } else {\n unbound[k] = value[k];\n }\n }\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n this.items[i].attr(unbound);\n }\n return this;\n };\n /*\\\n * Set.clear\n [ method ]\n **\n * Removes all elements from the set\n \\*/\n setproto.clear = function () {\n while (this.length) {\n this.pop();\n }\n };\n /*\\\n * Set.splice\n [ method ]\n **\n * Removes range of elements from the set\n **\n - index (number) position of the deletion\n - count (number) number of element to remove\n - insertion… (object) #optional elements to insert\n = (object) set elements that were deleted\n \\*/\n setproto.splice = function (index, count, insertion) {\n index = index < 0 ? mmax(this.length + index, 0) : index;\n count = mmax(0, mmin(this.length - index, count));\n var tail = [],\n todel = [],\n args = [],\n i;\n for (i = 2; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n for (i = 0; i < count; i++) {\n todel.push(this[index + i]);\n }\n for (; i < this.length - index; i++) {\n tail.push(this[index + i]);\n }\n var arglen = args.length;\n for (i = 0; i < arglen + tail.length; i++) {\n this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n }\n i = this.items.length = this.length -= count - arglen;\n while (this[i]) {\n delete this[i++];\n }\n return new Set(todel);\n };\n /*\\\n * Set.exclude\n [ method ]\n **\n * Removes given element from the set\n **\n - element (object) element to remove\n = (boolean) `true` if object was found and removed from the set\n \\*/\n setproto.exclude = function (el) {\n for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n this.splice(i, 1);\n return true;\n }\n return false;\n };\n /*\\\n * Set.insertAfter\n [ method ]\n **\n * Inserts set elements after given element.\n **\n - element (object) set will be inserted after this element\n = (object) Set object\n \\*/\n setproto.insertAfter = function (el) {\n var i = this.items.length;\n while (i--) {\n this.items[i].insertAfter(el);\n }\n return this;\n };\n /*\\\n * Set.getBBox\n [ method ]\n **\n * Union of all bboxes of the set. See @Element.getBBox.\n = (object) bounding box descriptor. See @Element.getBBox.\n \\*/\n setproto.getBBox = function () {\n var x = [],\n y = [],\n x2 = [],\n y2 = [];\n for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n var box = this.items[i].getBBox();\n x.push(box.x);\n y.push(box.y);\n x2.push(box.x + box.width);\n y2.push(box.y + box.height);\n }\n x = mmin.apply(0, x);\n y = mmin.apply(0, y);\n x2 = mmax.apply(0, x2);\n y2 = mmax.apply(0, y2);\n return {\n x: x,\n y: y,\n x2: x2,\n y2: y2,\n width: x2 - x,\n height: y2 - y,\n cx: x + (x2 - x) / 2,\n cy: y + (y2 - y) / 2\n };\n };\n /*\\\n * Set.insertAfter\n [ method ]\n **\n * Creates a clone of the set.\n **\n = (object) New Set object\n \\*/\n setproto.clone = function (s) {\n s = new Set;\n for (var i = 0, ii = this.items.length; i < ii; i++) {\n s.push(this.items[i].clone());\n }\n return s;\n };\n setproto.toString = function () {\n return \"Snap\\u2018s set\";\n };\n setproto.type = \"set\";\n // export\n /*\\\n * Snap.Set\n [ property ]\n **\n * Set constructor.\n \\*/\n Snap.Set = Set;\n /*\\\n * Snap.set\n [ method ]\n **\n * Creates a set and fills it with list of arguments.\n **\n = (object) New Set object\n | var r = paper.rect(0, 0, 10, 10),\n | s1 = Snap.set(), // empty set\n | s2 = Snap.set(r, paper.circle(100, 100, 20)); // prefilled set\n \\*/\n Snap.set = function () {\n var set = new Set;\n if (arguments.length) {\n set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n }\n return set;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var names = {},\n reUnit = /[%a-z]+$/i,\n Str = String;\n names.stroke = names.fill = \"colour\";\n function getEmpty(item) {\n var l = item[0];\n switch (l.toLowerCase()) {\n case \"t\": return [l, 0, 0];\n case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n case \"r\": if (item.length == 4) {\n return [l, 0, item[2], item[3]];\n } else {\n return [l, 0];\n }\n case \"s\": if (item.length == 5) {\n return [l, 1, 1, item[3], item[4]];\n } else if (item.length == 3) {\n return [l, 1, 1];\n } else {\n return [l, 1];\n }\n }\n }\n function equaliseTransform(t1, t2, getBBox) {\n t1 = t1 || new Snap.Matrix;\n t2 = t2 || new Snap.Matrix;\n t1 = Snap.parseTransformString(t1.toTransformString()) || [];\n t2 = Snap.parseTransformString(t2.toTransformString()) || [];\n var maxlength = Math.max(t1.length, t2.length),\n from = [],\n to = [],\n i = 0, j, jj,\n tt1, tt2;\n for (; i < maxlength; i++) {\n tt1 = t1[i] || getEmpty(t2[i]);\n tt2 = t2[i] || getEmpty(tt1);\n if (tt1[0] != tt2[0] ||\n tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3]) ||\n tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])\n ) {\n t1 = Snap._.transform2matrix(t1, getBBox());\n t2 = Snap._.transform2matrix(t2, getBBox());\n from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n break;\n }\n from[i] = [];\n to[i] = [];\n for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n j in tt1 && (from[i][j] = tt1[j]);\n j in tt2 && (to[i][j] = tt2[j]);\n }\n }\n return {\n from: path2array(from),\n to: path2array(to),\n f: getPath(from)\n };\n }\n function getNumber(val) {\n return val;\n }\n function getUnit(unit) {\n return function (val) {\n return +val.toFixed(3) + unit;\n };\n }\n function getViewBox(val) {\n return val.join(\" \");\n }\n function getColour(clr) {\n return Snap.rgb(clr[0], clr[1], clr[2], clr[3]);\n }\n function getPath(path) {\n var k = 0, i, ii, j, jj, out, a, b = [];\n for (i = 0, ii = path.length; i < ii; i++) {\n out = \"[\";\n a = ['\"' + path[i][0] + '\"'];\n for (j = 1, jj = path[i].length; j < jj; j++) {\n a[j] = \"val[\" + k++ + \"]\";\n }\n out += a + \"]\";\n b[i] = out;\n }\n return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n }\n function path2array(path) {\n var out = [];\n for (var i = 0, ii = path.length; i < ii; i++) {\n for (var j = 1, jj = path[i].length; j < jj; j++) {\n out.push(path[i][j]);\n }\n }\n return out;\n }\n function isNumeric(obj) {\n return isFinite(obj);\n }\n function arrayEqual(arr1, arr2) {\n if (!Snap.is(arr1, \"array\") || !Snap.is(arr2, \"array\")) {\n return false;\n }\n return arr1.toString() == arr2.toString();\n }\n Element.prototype.equal = function (name, b) {\n return eve(\"snap.util.equal\", this, name, b).firstDefined();\n };\n eve.on(\"snap.util.equal\", function (name, b) {\n var A, B, a = Str(this.attr(name) || \"\"),\n el = this;\n if (names[name] == \"colour\") {\n A = Snap.color(a);\n B = Snap.color(b);\n return {\n from: [A.r, A.g, A.b, A.opacity],\n to: [B.r, B.g, B.b, B.opacity],\n f: getColour\n };\n }\n if (name == \"viewBox\") {\n A = this.attr(name).vb.split(\" \").map(Number);\n B = b.split(\" \").map(Number);\n return {\n from: A,\n to: B,\n f: getViewBox\n };\n }\n if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n if (typeof b == \"string\") {\n b = Str(b).replace(/\\.{3}|\\u2026/g, a);\n }\n a = this.matrix;\n if (!Snap._.rgTransform.test(b)) {\n b = Snap._.transform2matrix(Snap._.svgTransform2string(b), this.getBBox());\n } else {\n b = Snap._.transform2matrix(b, this.getBBox());\n }\n return equaliseTransform(a, b, function () {\n return el.getBBox(1);\n });\n }\n if (name == \"d\" || name == \"path\") {\n A = Snap.path.toCubic(a, b);\n return {\n from: path2array(A[0]),\n to: path2array(A[1]),\n f: getPath(A[0])\n };\n }\n if (name == \"points\") {\n A = Str(a).split(Snap._.separator);\n B = Str(b).split(Snap._.separator);\n return {\n from: A,\n to: B,\n f: function (val) { return val; }\n };\n }\n if (isNumeric(a) && isNumeric(b)) {\n return {\n from: parseFloat(a),\n to: parseFloat(b),\n f: getNumber\n };\n }\n var aUnit = a.match(reUnit),\n bUnit = Str(b).match(reUnit);\n if (aUnit && arrayEqual(aUnit, bUnit)) {\n return {\n from: parseFloat(a),\n to: parseFloat(b),\n f: getUnit(aUnit)\n };\n } else {\n return {\n from: this.asPX(name),\n to: this.asPX(name, b),\n f: getNumber\n };\n }\n });\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n has = \"hasOwnProperty\",\n supportsTouch = \"createTouch\" in glob.doc,\n events = [\n \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n \"touchcancel\"\n ],\n touchMap = {\n mousedown: \"touchstart\",\n mousemove: \"touchmove\",\n mouseup: \"touchend\"\n },\n getScroll = function (xy, el) {\n var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\",\n doc = el && el.node ? el.node.ownerDocument : glob.doc;\n return doc[name in doc.documentElement ? \"documentElement\" : \"body\"][name];\n },\n preventDefault = function () {\n this.returnValue = false;\n },\n preventTouch = function () {\n return this.originalEvent.preventDefault();\n },\n stopPropagation = function () {\n this.cancelBubble = true;\n },\n stopTouch = function () {\n return this.originalEvent.stopPropagation();\n },\n addEvent = function (obj, type, fn, element) {\n var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n f = function (e) {\n var scrollY = getScroll(\"y\", element),\n scrollX = getScroll(\"x\", element);\n if (supportsTouch && touchMap[has](type)) {\n for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\n var olde = e;\n e = e.targetTouches[i];\n e.originalEvent = olde;\n e.preventDefault = preventTouch;\n e.stopPropagation = stopTouch;\n break;\n }\n }\n }\n var x = e.clientX + scrollX,\n y = e.clientY + scrollY;\n return fn.call(element, e, x, y);\n };\n\n if (type !== realName) {\n obj.addEventListener(type, f, false);\n }\n\n obj.addEventListener(realName, f, false);\n\n return function () {\n if (type !== realName) {\n obj.removeEventListener(type, f, false);\n }\n\n obj.removeEventListener(realName, f, false);\n return true;\n };\n },\n drag = [],\n dragMove = function (e) {\n var x = e.clientX,\n y = e.clientY,\n scrollY = getScroll(\"y\"),\n scrollX = getScroll(\"x\"),\n dragi,\n j = drag.length;\n while (j--) {\n dragi = drag[j];\n if (supportsTouch) {\n var i = e.touches && e.touches.length,\n touch;\n while (i--) {\n touch = e.touches[i];\n if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n x = touch.clientX;\n y = touch.clientY;\n (e.originalEvent ? e.originalEvent : e).preventDefault();\n break;\n }\n }\n } else {\n e.preventDefault();\n }\n var node = dragi.el.node,\n o,\n next = node.nextSibling,\n parent = node.parentNode,\n display = node.style.display;\n // glob.win.opera && parent.removeChild(node);\n // node.style.display = \"none\";\n // o = dragi.el.paper.getElementByPoint(x, y);\n // node.style.display = display;\n // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n x += scrollX;\n y += scrollY;\n eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n }\n },\n dragUp = function (e) {\n Snap.unmousemove(dragMove).unmouseup(dragUp);\n var i = drag.length,\n dragi;\n while (i--) {\n dragi = drag[i];\n dragi.el._drag = {};\n eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n eve.off(\"snap.drag.*.\" + dragi.el.id);\n }\n drag = [];\n };\n /*\\\n * Element.click\n [ method ]\n **\n * Adds a click event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unclick\n [ method ]\n **\n * Removes a click event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.dblclick\n [ method ]\n **\n * Adds a double click event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.undblclick\n [ method ]\n **\n * Removes a double click event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mousedown\n [ method ]\n **\n * Adds a mousedown event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmousedown\n [ method ]\n **\n * Removes a mousedown event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mousemove\n [ method ]\n **\n * Adds a mousemove event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmousemove\n [ method ]\n **\n * Removes a mousemove event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseout\n [ method ]\n **\n * Adds a mouseout event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseout\n [ method ]\n **\n * Removes a mouseout event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseover\n [ method ]\n **\n * Adds a mouseover event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseover\n [ method ]\n **\n * Removes a mouseover event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.mouseup\n [ method ]\n **\n * Adds a mouseup event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.unmouseup\n [ method ]\n **\n * Removes a mouseup event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchstart\n [ method ]\n **\n * Adds a touchstart event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchstart\n [ method ]\n **\n * Removes a touchstart event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchmove\n [ method ]\n **\n * Adds a touchmove event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchmove\n [ method ]\n **\n * Removes a touchmove event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchend\n [ method ]\n **\n * Adds a touchend event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchend\n [ method ]\n **\n * Removes a touchend event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n \n /*\\\n * Element.touchcancel\n [ method ]\n **\n * Adds a touchcancel event handler to the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n /*\\\n * Element.untouchcancel\n [ method ]\n **\n * Removes a touchcancel event handler from the element\n - handler (function) handler for the event\n = (object) @Element\n \\*/\n for (var i = events.length; i--;) {\n (function (eventName) {\n Snap[eventName] = elproto[eventName] = function (fn, scope) {\n if (Snap.is(fn, \"function\")) {\n this.events = this.events || [];\n this.events.push({\n name: eventName,\n f: fn,\n unbind: addEvent(this.node || document, eventName, fn, scope || this)\n });\n } else {\n for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) {\n try {\n this.events[i].f.call(this);\n } catch (e) {}\n }\n }\n return this;\n };\n Snap[\"un\" + eventName] =\n elproto[\"un\" + eventName] = function (fn) {\n var events = this.events || [],\n l = events.length;\n while (l--) if (events[l].name == eventName &&\n (events[l].f == fn || !fn)) {\n events[l].unbind();\n events.splice(l, 1);\n !events.length && delete this.events;\n return this;\n }\n return this;\n };\n })(events[i]);\n }\n /*\\\n * Element.hover\n [ method ]\n **\n * Adds hover event handlers to the element\n - f_in (function) handler for hover in\n - f_out (function) handler for hover out\n - icontext (object) #optional context for hover in handler\n - ocontext (object) #optional context for hover out handler\n = (object) @Element\n \\*/\n elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n };\n /*\\\n * Element.unhover\n [ method ]\n **\n * Removes hover event handlers from the element\n - f_in (function) handler for hover in\n - f_out (function) handler for hover out\n = (object) @Element\n \\*/\n elproto.unhover = function (f_in, f_out) {\n return this.unmouseover(f_in).unmouseout(f_out);\n };\n var draggable = [];\n // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start. on start, drag.end. on end and drag.move. on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n /*\\\n * Element.drag\n [ method ]\n **\n * Adds event handlers for an element's drag gesture\n **\n - onmove (function) handler for moving\n - onstart (function) handler for drag start\n - onend (function) handler for drag end\n - mcontext (object) #optional context for moving handler\n - scontext (object) #optional context for drag start handler\n - econtext (object) #optional context for drag end handler\n * Additionaly following `drag` events are triggered: `drag.start.` on start, \n * `drag.end.` on end and `drag.move.` on every move. When element is dragged over another element \n * `drag.over.` fires as well.\n *\n * Start event and start handler are called in specified context or in context of the element with following parameters:\n o x (number) x position of the mouse\n o y (number) y position of the mouse\n o event (object) DOM event object\n * Move event and move handler are called in specified context or in context of the element with following parameters:\n o dx (number) shift by x from the start point\n o dy (number) shift by y from the start point\n o x (number) x position of the mouse\n o y (number) y position of the mouse\n o event (object) DOM event object\n * End event and end handler are called in specified context or in context of the element with following parameters:\n o event (object) DOM event object\n = (object) @Element\n \\*/\n elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n var el = this;\n if (!arguments.length) {\n var origTransform;\n return el.drag(function (dx, dy) {\n this.attr({\n transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n });\n }, function () {\n origTransform = this.transform().local;\n });\n }\n function start(e, x, y) {\n (e.originalEvent || e).preventDefault();\n el._drag.x = x;\n el._drag.y = y;\n el._drag.id = e.identifier;\n !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n onstart && eve.on(\"snap.drag.start.\" + el.id, onstart);\n onmove && eve.on(\"snap.drag.move.\" + el.id, onmove);\n onend && eve.on(\"snap.drag.end.\" + el.id, onend);\n eve(\"snap.drag.start.\" + el.id, start_scope || move_scope || el, x, y, e);\n }\n function init(e, x, y) {\n eve(\"snap.draginit.\" + el.id, el, e, x, y);\n }\n eve.on(\"snap.draginit.\" + el.id, start);\n el._drag = {};\n draggable.push({el: el, start: start, init: init});\n el.mousedown(init);\n return el;\n };\n /*\n * Element.onDragOver\n [ method ]\n **\n * Shortcut to assign event handler for `drag.over.` event, where `id` is the element's `id` (see @Element.id)\n - f (function) handler for event, first argument would be the element you are dragging over\n \\*/\n // elproto.onDragOver = function (f) {\n // f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n // };\n /*\\\n * Element.undrag\n [ method ]\n **\n * Removes all drag event handlers from the given element\n \\*/\n elproto.undrag = function () {\n var i = draggable.length;\n while (i--) if (draggable[i].el == this) {\n this.unmousedown(draggable[i].init);\n draggable.splice(i, 1);\n eve.unbind(\"snap.drag.*.\" + this.id);\n eve.unbind(\"snap.draginit.\" + this.id);\n }\n !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n return this;\n };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n var elproto = Element.prototype,\n pproto = Paper.prototype,\n rgurl = /^\\s*url\\((.+)\\)/,\n Str = String,\n $ = Snap._.$;\n Snap.filter = {};\n /*\\\n * Paper.filter\n [ method ]\n **\n * Creates a `` element\n **\n - filstr (string) SVG fragment of filter provided as a string\n = (object) @Element\n * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n > Usage\n | var f = paper.filter(''),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n pproto.filter = function (filstr) {\n var paper = this;\n if (paper.type != \"svg\") {\n paper = paper.paper;\n }\n var f = Snap.parse(Str(filstr)),\n id = Snap._.id(),\n width = paper.node.offsetWidth,\n height = paper.node.offsetHeight,\n filter = $(\"filter\");\n $(filter, {\n id: id,\n filterUnits: \"userSpaceOnUse\"\n });\n filter.appendChild(f.node);\n paper.defs.appendChild(filter);\n return new Element(filter);\n };\n\n eve.on(\"snap.util.getattr.filter\", function () {\n eve.stop();\n var p = $(this.node, \"filter\");\n if (p) {\n var match = Str(p).match(rgurl);\n return match && Snap.select(match[1]);\n }\n });\n eve.on(\"snap.util.attr.filter\", function (value) {\n if (value instanceof Element && value.type == \"filter\") {\n eve.stop();\n var id = value.node.id;\n if (!id) {\n $(value.node, {id: value.id});\n id = value.id;\n }\n $(this.node, {\n filter: Snap.url(id)\n });\n }\n if (!value || value == \"none\") {\n eve.stop();\n this.node.removeAttribute(\"filter\");\n }\n });\n /*\\\n * Snap.filter.blur\n [ method ]\n **\n * Returns an SVG markup string for the blur filter\n **\n - x (number) amount of horizontal blur, in pixels\n - y (number) #optional amount of vertical blur, in pixels\n = (string) filter representation\n > Usage\n | var f = paper.filter(Snap.filter.blur(5, 10)),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n Snap.filter.blur = function (x, y) {\n if (x == null) {\n x = 2;\n }\n var def = y == null ? x : [x, y];\n return Snap.format('\\', {\n def: def\n });\n };\n Snap.filter.blur.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.shadow\n [ method ]\n **\n * Returns an SVG markup string for the shadow filter\n **\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - blur (number) #optional amount of blur\n - color (string) #optional color of the shadow\n - opacity (number) #optional `0..1` opacity of the shadow\n * or\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - color (string) #optional color of the shadow\n - opacity (number) #optional `0..1` opacity of the shadow\n * which makes blur default to `4`. Or\n - dx (number) #optional horizontal shift of the shadow, in pixels\n - dy (number) #optional vertical shift of the shadow, in pixels\n - opacity (number) #optional `0..1` opacity of the shadow\n = (string) filter representation\n > Usage\n | var f = paper.filter(Snap.filter.shadow(0, 2, .3)),\n | c = paper.circle(10, 10, 10).attr({\n | filter: f\n | });\n \\*/\n Snap.filter.shadow = function (dx, dy, blur, color, opacity) {\n if (opacity == null) {\n if (color == null) {\n opacity = blur;\n blur = 4;\n color = \"#000\";\n } else {\n opacity = color;\n color = blur;\n blur = 4;\n }\n }\n if (blur == null) {\n blur = 4;\n }\n if (opacity == null) {\n opacity = 1;\n }\n if (dx == null) {\n dx = 0;\n dy = 2;\n }\n if (dy == null) {\n dy = dx;\n }\n color = Snap.color(color);\n return Snap.format('', {\n color: color,\n dx: dx,\n dy: dy,\n blur: blur,\n opacity: opacity\n });\n };\n Snap.filter.shadow.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.grayscale\n [ method ]\n **\n * Returns an SVG markup string for the grayscale filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.grayscale = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n a: 0.2126 + 0.7874 * (1 - amount),\n b: 0.7152 - 0.7152 * (1 - amount),\n c: 0.0722 - 0.0722 * (1 - amount),\n d: 0.2126 - 0.2126 * (1 - amount),\n e: 0.7152 + 0.2848 * (1 - amount),\n f: 0.0722 - 0.0722 * (1 - amount),\n g: 0.2126 - 0.2126 * (1 - amount),\n h: 0.0722 + 0.9278 * (1 - amount)\n });\n };\n Snap.filter.grayscale.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.sepia\n [ method ]\n **\n * Returns an SVG markup string for the sepia filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.sepia = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n a: 0.393 + 0.607 * (1 - amount),\n b: 0.769 - 0.769 * (1 - amount),\n c: 0.189 - 0.189 * (1 - amount),\n d: 0.349 - 0.349 * (1 - amount),\n e: 0.686 + 0.314 * (1 - amount),\n f: 0.168 - 0.168 * (1 - amount),\n g: 0.272 - 0.272 * (1 - amount),\n h: 0.534 - 0.534 * (1 - amount),\n i: 0.131 + 0.869 * (1 - amount)\n });\n };\n Snap.filter.sepia.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.saturate\n [ method ]\n **\n * Returns an SVG markup string for the saturate filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.saturate = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: 1 - amount\n });\n };\n Snap.filter.saturate.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.hueRotate\n [ method ]\n **\n * Returns an SVG markup string for the hue-rotate filter\n **\n - angle (number) angle of rotation\n = (string) filter representation\n \\*/\n Snap.filter.hueRotate = function (angle) {\n angle = angle || 0;\n return Snap.format('', {\n angle: angle\n });\n };\n Snap.filter.hueRotate.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.invert\n [ method ]\n **\n * Returns an SVG markup string for the invert filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.invert = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n// \n return Snap.format('', {\n amount: amount,\n amount2: 1 - amount\n });\n };\n Snap.filter.invert.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.brightness\n [ method ]\n **\n * Returns an SVG markup string for the brightness filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.brightness = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: amount\n });\n };\n Snap.filter.brightness.toString = function () {\n return this();\n };\n /*\\\n * Snap.filter.contrast\n [ method ]\n **\n * Returns an SVG markup string for the contrast filter\n **\n - amount (number) amount of filter (`0..1`)\n = (string) filter representation\n \\*/\n Snap.filter.contrast = function (amount) {\n if (amount == null) {\n amount = 1;\n }\n return Snap.format('', {\n amount: amount,\n amount2: .5 - amount / 2\n });\n };\n Snap.filter.contrast.toString = function () {\n return this();\n };\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n var box = Snap._.box,\n is = Snap.is,\n firstLetter = /^[^a-z]*([tbmlrc])/i,\n toString = function () {\n return \"T\" + this.dx + \",\" + this.dy;\n };\n /*\\\n * Element.getAlign\n [ method ]\n **\n * Returns shift needed to align the element relatively to given element.\n * If no elements specified, parent `` container will be used.\n - el (object) @optional alignment element\n - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string\n > Usage\n | el.transform(el.getAlign(el2, \"top\"));\n * or\n | var dy = el.getAlign(el2, \"top\").dy;\n \\*/\n Element.prototype.getAlign = function (el, way) {\n if (way == null && is(el, \"string\")) {\n way = el;\n el = null;\n }\n el = el || this.paper;\n var bx = el.getBBox ? el.getBBox() : box(el),\n bb = this.getBBox(),\n out = {};\n way = way && way.match(firstLetter);\n way = way ? way[1].toLowerCase() : \"c\";\n switch (way) {\n case \"t\":\n out.dx = 0;\n out.dy = bx.y - bb.y;\n break;\n case \"b\":\n out.dx = 0;\n out.dy = bx.y2 - bb.y2;\n break;\n case \"m\":\n out.dx = 0;\n out.dy = bx.cy - bb.cy;\n break;\n case \"l\":\n out.dx = bx.x - bb.x;\n out.dy = 0;\n break;\n case \"r\":\n out.dx = bx.x2 - bb.x2;\n out.dy = 0;\n break;\n default:\n out.dx = bx.cx - bb.cx;\n out.dy = 0;\n break;\n }\n out.toString = toString;\n return out;\n };\n /*\\\n * Element.align\n [ method ]\n **\n * Aligns the element relatively to given one via transformation.\n * If no elements specified, parent `` container will be used.\n - el (object) @optional alignment element\n - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n = (object) this element\n > Usage\n | el.align(el2, \"top\");\n * or\n | el.align(\"middle\");\n \\*/\n Element.prototype.align = function (el, way) {\n return this.transform(\"...\" + this.getAlign(el, way));\n };\n});\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n // Colours are from https://www.materialui.co\n var red = \"#ffebee#ffcdd2#ef9a9a#e57373#ef5350#f44336#e53935#d32f2f#c62828#b71c1c#ff8a80#ff5252#ff1744#d50000\",\n pink = \"#FCE4EC#F8BBD0#F48FB1#F06292#EC407A#E91E63#D81B60#C2185B#AD1457#880E4F#FF80AB#FF4081#F50057#C51162\",\n purple = \"#F3E5F5#E1BEE7#CE93D8#BA68C8#AB47BC#9C27B0#8E24AA#7B1FA2#6A1B9A#4A148C#EA80FC#E040FB#D500F9#AA00FF\",\n deeppurple = \"#EDE7F6#D1C4E9#B39DDB#9575CD#7E57C2#673AB7#5E35B1#512DA8#4527A0#311B92#B388FF#7C4DFF#651FFF#6200EA\",\n indigo = \"#E8EAF6#C5CAE9#9FA8DA#7986CB#5C6BC0#3F51B5#3949AB#303F9F#283593#1A237E#8C9EFF#536DFE#3D5AFE#304FFE\",\n blue = \"#E3F2FD#BBDEFB#90CAF9#64B5F6#64B5F6#2196F3#1E88E5#1976D2#1565C0#0D47A1#82B1FF#448AFF#2979FF#2962FF\",\n lightblue = \"#E1F5FE#B3E5FC#81D4FA#4FC3F7#29B6F6#03A9F4#039BE5#0288D1#0277BD#01579B#80D8FF#40C4FF#00B0FF#0091EA\",\n cyan = \"#E0F7FA#B2EBF2#80DEEA#4DD0E1#26C6DA#00BCD4#00ACC1#0097A7#00838F#006064#84FFFF#18FFFF#00E5FF#00B8D4\",\n teal = \"#E0F2F1#B2DFDB#80CBC4#4DB6AC#26A69A#009688#00897B#00796B#00695C#004D40#A7FFEB#64FFDA#1DE9B6#00BFA5\",\n green = \"#E8F5E9#C8E6C9#A5D6A7#81C784#66BB6A#4CAF50#43A047#388E3C#2E7D32#1B5E20#B9F6CA#69F0AE#00E676#00C853\",\n lightgreen = \"#F1F8E9#DCEDC8#C5E1A5#AED581#9CCC65#8BC34A#7CB342#689F38#558B2F#33691E#CCFF90#B2FF59#76FF03#64DD17\",\n lime = \"#F9FBE7#F0F4C3#E6EE9C#DCE775#D4E157#CDDC39#C0CA33#AFB42B#9E9D24#827717#F4FF81#EEFF41#C6FF00#AEEA00\",\n yellow = \"#FFFDE7#FFF9C4#FFF59D#FFF176#FFEE58#FFEB3B#FDD835#FBC02D#F9A825#F57F17#FFFF8D#FFFF00#FFEA00#FFD600\",\n amber = \"#FFF8E1#FFECB3#FFE082#FFD54F#FFCA28#FFC107#FFB300#FFA000#FF8F00#FF6F00#FFE57F#FFD740#FFC400#FFAB00\",\n orange = \"#FFF3E0#FFE0B2#FFCC80#FFB74D#FFA726#FF9800#FB8C00#F57C00#EF6C00#E65100#FFD180#FFAB40#FF9100#FF6D00\",\n deeporange = \"#FBE9E7#FFCCBC#FFAB91#FF8A65#FF7043#FF5722#F4511E#E64A19#D84315#BF360C#FF9E80#FF6E40#FF3D00#DD2C00\",\n brown = \"#EFEBE9#D7CCC8#BCAAA4#A1887F#8D6E63#795548#6D4C41#5D4037#4E342E#3E2723\",\n grey = \"#FAFAFA#F5F5F5#EEEEEE#E0E0E0#BDBDBD#9E9E9E#757575#616161#424242#212121\",\n bluegrey = \"#ECEFF1#CFD8DC#B0BEC5#90A4AE#78909C#607D8B#546E7A#455A64#37474F#263238\";\n /*\\\n * Snap.mui\n [ property ]\n **\n * Contain Material UI colours.\n | Snap().rect(0, 0, 10, 10).attr({fill: Snap.mui.deeppurple, stroke: Snap.mui.amber[600]});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.mui = {};\n /*\\\n * Snap.flat\n [ property ]\n **\n * Contain Flat UI colours.\n | Snap().rect(0, 0, 10, 10).attr({fill: Snap.flat.carrot, stroke: Snap.flat.wetasphalt});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.flat = {};\n function saveColor(colors) {\n colors = colors.split(/(?=#)/);\n var color = new String(colors[5]);\n color[50] = colors[0];\n color[100] = colors[1];\n color[200] = colors[2];\n color[300] = colors[3];\n color[400] = colors[4];\n color[500] = colors[5];\n color[600] = colors[6];\n color[700] = colors[7];\n color[800] = colors[8];\n color[900] = colors[9];\n if (colors[10]) {\n color.A100 = colors[10];\n color.A200 = colors[11];\n color.A400 = colors[12];\n color.A700 = colors[13];\n }\n return color;\n }\n Snap.mui.red = saveColor(red);\n Snap.mui.pink = saveColor(pink);\n Snap.mui.purple = saveColor(purple);\n Snap.mui.deeppurple = saveColor(deeppurple);\n Snap.mui.indigo = saveColor(indigo);\n Snap.mui.blue = saveColor(blue);\n Snap.mui.lightblue = saveColor(lightblue);\n Snap.mui.cyan = saveColor(cyan);\n Snap.mui.teal = saveColor(teal);\n Snap.mui.green = saveColor(green);\n Snap.mui.lightgreen = saveColor(lightgreen);\n Snap.mui.lime = saveColor(lime);\n Snap.mui.yellow = saveColor(yellow);\n Snap.mui.amber = saveColor(amber);\n Snap.mui.orange = saveColor(orange);\n Snap.mui.deeporange = saveColor(deeporange);\n Snap.mui.brown = saveColor(brown);\n Snap.mui.grey = saveColor(grey);\n Snap.mui.bluegrey = saveColor(bluegrey);\n Snap.flat.turquoise = \"#1abc9c\";\n Snap.flat.greensea = \"#16a085\";\n Snap.flat.sunflower = \"#f1c40f\";\n Snap.flat.orange = \"#f39c12\";\n Snap.flat.emerland = \"#2ecc71\";\n Snap.flat.nephritis = \"#27ae60\";\n Snap.flat.carrot = \"#e67e22\";\n Snap.flat.pumpkin = \"#d35400\";\n Snap.flat.peterriver = \"#3498db\";\n Snap.flat.belizehole = \"#2980b9\";\n Snap.flat.alizarin = \"#e74c3c\";\n Snap.flat.pomegranate = \"#c0392b\";\n Snap.flat.amethyst = \"#9b59b6\";\n Snap.flat.wisteria = \"#8e44ad\";\n Snap.flat.clouds = \"#ecf0f1\";\n Snap.flat.silver = \"#bdc3c7\";\n Snap.flat.wetasphalt = \"#34495e\";\n Snap.flat.midnightblue = \"#2c3e50\";\n Snap.flat.concrete = \"#95a5a6\";\n Snap.flat.asbestos = \"#7f8c8d\";\n /*\\\n * Snap.importMUIColors\n [ method ]\n **\n * Imports Material UI colours into global object.\n | Snap.importMUIColors();\n | Snap().rect(0, 0, 10, 10).attr({fill: deeppurple, stroke: amber[600]});\n # For colour reference: https://www.materialui.co.\n \\*/\n Snap.importMUIColors = function () {\n for (var color in Snap.mui) {\n if (Snap.mui.hasOwnProperty(color)) {\n window[color] = Snap.mui[color];\n }\n }\n };\n});\n\nreturn Snap;\n}));","'use strict';\n\nvar bind = require('function-bind');\nvar replace = bind.call(Function.call, String.prototype.replace);\n\n/* eslint-disable no-control-regex */\nvar leftWhitespace = /^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]*/;\n/* eslint-enable no-control-regex */\n\nmodule.exports = function trimLeft() {\n\treturn replace(this, leftWhitespace, '');\n};\n","'use strict';\n\nvar bind = require('function-bind');\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar bound = bind.call(Function.call, getPolyfill());\n\ndefine(bound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = bound;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (!String.prototype.trimLeft) {\n\t\treturn implementation;\n\t}\n\tvar zeroWidthSpace = '\\u200b';\n\tif (zeroWidthSpace.trimLeft() !== zeroWidthSpace) {\n\t\treturn implementation;\n\t}\n\treturn String.prototype.trimLeft;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimTrimLeft() {\n\tvar polyfill = getPolyfill();\n\tdefine(\n\t\tString.prototype,\n\t\t{ trimLeft: polyfill },\n\t\t{ trimLeft: function () { return String.prototype.trimLeft !== polyfill; } }\n\t);\n\treturn polyfill;\n};\n","'use strict';\n\nvar bind = require('function-bind');\nvar replace = bind.call(Function.call, String.prototype.replace);\n\n/* eslint-disable no-control-regex */\nvar rightWhitespace = /[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]*$/;\n/* eslint-enable no-control-regex */\n\nmodule.exports = function trimRight() {\n\treturn replace(this, rightWhitespace, '');\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (!String.prototype.trimRight) {\n\t\treturn implementation;\n\t}\n\tvar zeroWidthSpace = '\\u200b';\n\tif (zeroWidthSpace.trimRight() !== zeroWidthSpace) {\n\t\treturn implementation;\n\t}\n\treturn String.prototype.trimRight;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimTrimRight() {\n\tvar polyfill = getPolyfill();\n\tdefine(\n\t\tString.prototype,\n\t\t{ trimRight: polyfill },\n\t\t{ trimRight: function () { return String.prototype.trimRight !== polyfill; } }\n\t);\n\treturn polyfill;\n};\n","import AKLSummitVis from './modules/aklsummit-vis';\nimport FocusOutlineDetect from './modules/focus-outline-detect';\nimport branchBar from './modules/branch-bar';\n\n\nconst init = () => {\n new FocusOutlineDetect().init();\n branchBar.init();\n\n if(window.AKLSplanets && window.AKLSdetails && window.cruxData) {\n const vis = new AKLSummitVis(window.AKLSplanets, window.AKLSdetails, window.cruxData);\n const parent = document.getElementById('aklsummit-vis');\n if(parent) vis.attach(parent);\n }\n};\n\nswitch (document.readyState) {\n case 'loading':\n addEventListener('DOMContentLoaded', () => init());\n break;\n default:\n init();\n}\n\nconsole.log(`\n\n\n\n▄████▄ ██▀███ ▄▄▄ ██████ ███▄ ▄███▓ ▄▄▄ ███▄ █\n▒██▀ ▀█ ▓██ ▒ ██▒▒████▄ ▒██ ▒ ▓██▒▀█▀ ██▒ ▒████▄ ██ ▀█ █\n▒▓█ ▄ ▓██ ░▄█ ▒▒██ ▀█▄ ░ ▓██▄ ▓██ ▓██░ ▒██ ▀█▄ ▓██ ▀█ ██▒\n▒▓▓▄ ▄██▒▒██▀▀█▄ ░██▄▄▄▄██ ▒ ██▒ ▒██ ▒██ ░██▄▄▄▄██ ▓██▒ ▐▌██▒\n▒ ▓███▀ ░░██▓ ▒██▒ ▓█ ▓██▒ ▒██████▒▒ ▒██▒ ░██▒ ▓█ ▓██▒▒██░ ▓██░\n░ ░▒ ▒ ░░ ▒▓ ░▒▓░ ▒▒ ▓▒█░ ▒ ▒▓▒ ▒ ░░ ▒░ ░ ░ ▒ ▒ ▓▒█░░ ▒░ ▒ ▒\n ░ ▒ ░▒ ░ ▒░ ▒ ▒▒ ░ ░ ░▒ ░ ░░ ░ ░ ▒ ▒▒ ░░ ░░ ░ ▒░\n░ ░░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░\n░ ░ ░ ░ ░ ░ ░ ░ ░ ░\n░\n`)\n","/**\n * AKL Summit visualization\n *\n * Creates SVG shapes from given data, and provides ways to\n * interact with it.\n *\n * Most operations are performed on the set of created shapes,\n * or a filtered subset of the shapes. References to all the individual\n * subshapes and labels, as well as a copy of the source data,\n * is stored within this.planets array.\n *\n * Each planet is also given x and y coordinates as percentages\n * relative to the viewport. The planets also have a radius1 and radius2\n * property, which refer to the currently selected data metrics.\n *\n * The general procedure for moving/scaling the planets is carried out\n * by first modifying the planets' data within this.planets array.\n * Once the positional/radius data has been changed, the individual\n * SVG shapes should be updated to reflect the new values.\n * For a practical example of this, check out the implementation of\n * methods setGridPosition() and setLinePosition().\n *\n * Mobile users are given a slightly different experience,\n * in that the overview mode is disabled. This is achieved with a\n * preset breakpoint, which (at the time of writing) matches the\n * mobile breakpoint in stylesheets.\n *\n * To anyone who isn't me; sorry about this mess. It all started as\n * prototype code and evolved into the bowl of spaghetti you see here.\n * No time for proper refactoring: \"Next year\" – they said.\n */\n\nimport Snap, { set } from 'snapsvg';\nimport Hammer from 'hammerjs';\nimport flatMap from 'array.prototype.flatmap';\nimport Debounce from './debounce';\nimport CruxMeters from './cruxMeters';\nimport hubspotForm from './hubspotForm';\n//import LineChart from './linechart';\n\n// Math shorthand methods\nconst {\n ceil,\n floor,\n max,\n min,\n sqrt,\n sign\n} = Math;\n\nclass AKLSummitVis {\n constructor(data = [], details = [], cruxData = []) {\n this.width = 0;\n this.height = 0;\n this.animDuration = 500; // ms\n this.snap = Snap(this.width, this.height);\n this._data = data;\n this._details = details;\n this._cruxData = cruxData;\n\n this.gridWidth = ceil(sqrt(data.length));\n\n this.lineYPosition = 50;\n\n this.mobile = true;\n this.mobileBreakpointX = 800;\n this.mobileBreakpointY = 575;\n this.lineYMobile = 50; // Percentage of view height from top\n this.lineYDesktop = 50; // Percentage of view height from top\n\n this.targetIndex = 0;\n\n this.start = 1;\n }\n\n /* Selects elements and attaches event listeners */\n attach(parent) {\n this.parent = parent;\n parent.appendChild(this.snap.node);\n\n addEventListener('resize', () => this.fitViewport());\n\n this.fitViewport(true);\n\n this.activePositionModel = this.setGridPositions;\n this.searchForm = document.getElementById('search-form');\n\n this.filtersForm = document.getElementById('aklsummit-controls');\n this.filterFieldset = document.getElementById('filterByType');\n this.sortFieldset = document.getElementById('sortBy');\n this.searchInput = document.getElementById('searchByGroup');\n this.scale1Select = document.getElementById('radius1ByField');\n this.scale2Select = document.getElementById('radius2ByField');\n this.backToGrid = document.getElementById('backButton');\n this.buttonLeft = document.getElementById('moveLeft');\n this.buttonRight = document.getElementById('moveRight');\n\n this.detailsGroup = document.getElementById('info-group');\n this.detailsTurnover = document.getElementById('info-turnover');\n this.detailsPositionTurnover = document.getElementById('info-position-turnover');\n this.detailsTurnoverChange = document.getElementById('info-turnover_change');\n this.detailsCrasmanIndex = document.getElementById('info-crasman_index');\n this.detailsPositionCrasmanIndex = document.getElementById('info-position-crasman_index');\n this.detailsCrasmanIndexChange = document.getElementById('info-crasman_index_change');\n\n this.detailsSite = document.getElementById('info-site-crasman-index');\n this.detailsSiteCrasmanIndex = document.getElementById('info-site-crasman_index');\n this.detailsSitePositionCrasmanIndex = document.getElementById('info-site-position-crasman_index');\n this.detailsSiteCrasmanIndexChange = document.getElementById('info-site-crasman_index_change')\n this.detailsSiteTarget = document.getElementById('info-site-target');\n\n this.detailsTarget = document.getElementById('info-target');\n this.detailsTargets = document.getElementById('info-site-details');\n\n this.detailsTraffic = document.getElementById('info-site-total_traffic');\n this.detailsTrafficChange = document.getElementById('info-site-total_traffic_change');\n this.detailsPositionTraffic = document.getElementById('info-position-total_traffic');\n this.detailsTotalKeywords = document.getElementById('info-site-total_keywords');\n this.detailsTotalKeywordsChange = document.getElementById('info-site-total_keywords_change');\n this.detailsPositionTotalKeywords = document.getElementById('info-position-total_keywords');\n this.detailsBacklinks = document.getElementById('info-site-total_backlinks');\n this.detailsBacklinksChange = document.getElementById('info-site-total_backlinks_change');\n this.detailsPositionBacklinks = document.getElementById('info-position-total_backlinks');\n\n this.detailsKeywordsYear = document.getElementById('most-valueable-keywords-year');\n this.detailsKeywords = document.getElementById('most-valuable-keywords');\n\n //crux data\n this.cruxDataContainer = document.getElementById('site-crux-data');\n\n this.createPlanets();\n this.setSortSource(this.sortFieldset.querySelector('input:checked').value);\n this.filterBy('type', this.getFilterArray(this.filterFieldset));\n\n\n // Small delay before transitioning planets into formation\n setTimeout(() => this.activePositionModel(), 500);\n\n //show hubspot form after some time\n hubspotForm();\n\n\n this.snap.hover(\n event => this.handleHoverIn(event),\n () => {\n if(this.activePositionModel !== this.setLinePositions) this.hideLabels();\n }\n );\n\n [this.searchForm, this.filtersForm].forEach(formEl => formEl.addEventListener('submit', ev => {\n ev.preventDefault();\n\n\n if(this.currentPlanet && this.activePositionModel === this.setGridPositions) {\n this.activePositionModel = this.setLinePositions;\n } else {\n this.activePositionModel = this.setGridPositions;\n }\n this.activePositionModel();\n }));\n\n this.searchInput.addEventListener('input', (ev) => {\n document.body.classList.add('overview');\n\n if(ev.currentTarget.value === '') {\n this.clearHighlights();\n this.hideLabels();\n this.searchHighlight(false);\n } else {\n this.searchHighlight(ev.currentTarget.value);\n }\n });\n\n this.searchInput.addEventListener('blur', ev => {\n this.scrollToView();\n })\n\n\n this.filterFieldset.addEventListener('change', (ev) => {\n const activeFilters = this.getFilterArray(ev.currentTarget);\n // If only one checkbox is checked, disable it to prevent blank selection\n if(activeFilters.length <= 1) {\n const remainingCheckbox = ev.currentTarget.querySelector('input:checked');\n remainingCheckbox.disabled = true;\n } else {\n const disabledCheckbox = ev.currentTarget.querySelector('input:disabled');\n if(disabledCheckbox) disabledCheckbox.disabled = false;\n }\n this.filterBy('type', activeFilters);\n this.hideHidden();\n\n // Find the new index of the currently selected planet, if possible\n const newIndex = this.getSortedPlanets().indexOf(this.currentPlanet)\n this.targetIndex = newIndex < 0 ? 0 : newIndex;\n this.activePositionModel();\n });\n\n this.sortFieldset.addEventListener('change', ev => {\n const chosenRadio = ev.currentTarget.querySelector('input:checked');\n switch(chosenRadio.value) {\n case 'radius1':\n this.sortSource = 'scale1';\n this.sortField = this.scale1Select.value;\n break;\n case 'radius2':\n this.sortSource = 'scale2';\n this.sortField = this.scale2Select.value;\n break;\n case 'alphanumeric':\n default:\n this.sortSource = 'default';\n this.sortField = 'group';\n }\n this.activePositionModel();\n });\n\n this.scale1Select.addEventListener('change', (ev) => {\n if(this.sortSource === 'scale1') {\n this.sortField = ev.currentTarget.value;\n }\n this.activePositionModel();\n });\n\n this.scale2Select.addEventListener('change', (ev) => {\n if(this.sortSource === 'scale2') {\n this.sortField = ev.currentTarget.value;\n }\n this.activePositionModel();\n });\n\n this.backToGrid.addEventListener('click', ev => {\n document.body.classList.add('overview');\n this.currentPlanet = false;\n this.activePositionModel = this.setGridPositions;\n this.activePositionModel();\n this.fitViewport();\n });\n\n addEventListener('keydown', evt => {\n if(evt.target.tagName.toLowerCase() === 'input') return;\n if(\n (evt.key === 'ArrowLeft' || evt.key === 'ArrowRight')\n ) {\n this.moveLinePos(evt.key === 'ArrowLeft' ? -1 : 1);\n }\n });\n\n const hammer = new Hammer(this.parent);\n hammer.on('swipe', evt => {\n this.moveLinePos(0 - sign(evt.deltaX));\n });\n\n this.buttonLeft.addEventListener('click', evt => {\n this.moveLinePos(-1);\n });\n this.buttonRight.addEventListener('click', evt => {\n this.moveLinePos(1);\n });\n\n this.parent.addEventListener('click', evt => {\n // check if the user clicked a planet\n const clickedPlanet = this.planets.find(planet => planet.area.node === evt.target);\n if(clickedPlanet) {\n // Zoom in, if we're in grid mode\n document.body.classList.remove('overview');\n window.scrollTo(0, 0);\n this.recalculatHeight();\n\n if(\n this.activePositionModel === this.setGridPositions ||\n this.currentPlanet !== clickedPlanet\n ) {\n document.body.classList.remove('overview');\n const clickedPlanetIndex = this.getSortedPlanets().indexOf(clickedPlanet);\n this.currentPlanet = clickedPlanet;\n this.targetIndex = clickedPlanetIndex;\n this.activePositionModel = this.setLinePositions;\n }\n\n this.activePositionModel();\n }\n });\n\n this.detailsTargets.addEventListener('change', evt => {\n const uuid = evt.target.value;\n const site = this._details.find(d => d.uuid === uuid);\n const cruxData = this._cruxData.find(d => d.origin.includes(site.target))\n if(site) {\n this.displaySiteDetails(site, this.getVisiblePlanets(), cruxData);\n }\n });\n\n this.detailsKeywordsYear.addEventListener('change', evt => {\n const detailsUuid = this.detailsTargets.value;\n const selectedDetails = this._details.find(d => d.uuid === detailsUuid);\n console.log({\n planetData: this.currentPlanet.data,\n siteData: selectedDetails\n });\n if(selectedDetails && selectedDetails.group === this.currentPlanet.data.group) {\n this.updateSiteKeywords(selectedDetails);\n } else {\n this.updateSiteKeywords(this.currentPlanet.data);\n }\n });\n }\n\n\n setSortSource(field) {\n switch(field) {\n case 'radius1':\n this.sortSource = 'scale1';\n this.sortField = this.scale1Select.value;\n break;\n case 'radius2':\n this.sortSource = 'scale2';\n this.sortField = this.scale2Select.value;\n break;\n case 'alphanumeric':\n default:\n this.sortSource = 'default';\n this.sortField = 'group';\n }\n }\n\n // Adjust the planet's X-offset in line view mode\n // Takes an offset argument, relative to the currently centered planet\n moveLinePos(offset) {\n if(this.activePositionModel !== this.setLinePositions) return;\n const visiblePlanets = this.getVisiblePlanets();\n this.targetIndex += offset;\n if(this.targetIndex < 0) {\n this.targetIndex = 0;\n } else if(this.targetIndex >= visiblePlanets.length) {\n this.targetIndex = visiblePlanets.length - 1;\n }\n this.activePositionModel(this.targetIndex);\n }\n\n // Returns a sorted list of non-hidden planets\n getSortedPlanets() {\n return this.getVisiblePlanets().sort(this.sortPlanets(this.sortField));\n }\n\n // Returns a list of non-hidden planets\n getVisiblePlanets() {\n return this.planets.filter(p => !p.hidden);\n }\n\n // Returns an array sort function, comparing with the given field name\n sortPlanets(field) {\n return (a, b) => {\n const pA = a.data[field];\n const pB = b.data[field];\n if(typeof pA === 'number' && typeof pB === 'number') {\n return pB - pA;\n }\n if(pA > pB) return 1;\n if(pA < pB) return -1;\n return 0;\n };\n }\n\n /* Scrolls the view so that the canvas is visible */\n scrollToView() {\n const elem = document.querySelector('.highlight');\n if(!elem) {\n document.documentElement.scrollTo({\n top: this.parent.offsetTop,\n left: 0,\n behavior: 'smooth'\n });\n } else {\n elem.scrollIntoView({\n top: this.parent.offsetTop - 100,\n left: 0,\n behavior: 'smooth'\n });\n }\n\n\n }\n\n /* Scales the presentation to screen/container size */\n fitViewport(initial = false) {\n\n document.body.classList.add('overview');\n const [targetWidth, targetHeight] = [\n this.parent.offsetWidth ? this.parent.offsetWidth : innerWidth,\n this.parent.offsetHeight ? this.parent.offsetHeight : innerHeight\n ];\n if(this.height !== targetHeight || this.width !== targetWidth) {\n\n this.height = targetHeight;\n this.width = targetWidth;\n this.snap.paper.attr({\n height: '100%',\n width: this.width\n });\n\n if(!initial) {\n if (this.currentPlanet) {\n this.activePositionModel = this.setLinePositions;\n document.body.classList.remove('overview');\n }\n this.scaleAreas();\n this.showLabel();\n this.recalculatHeight();\n\n }\n }\n\n this.mobile = innerWidth < this.mobileBreakpointX || innerHeight < this.mobileBreakpointY;\n }\n\n recalculatHeight() {\n this.height = this.parent.offsetHeight;\n this.snap.paper.attr({\n height: '100%'\n });\n this.activePositionModel();\n }\n /* Return an array of the values of all checked checkboxes within the given fieldset */\n getFilterArray(fieldsetEl) {\n const checkboxes = Array.from(\n fieldsetEl.querySelectorAll('input[type=\"checkbox\"]')\n );\n\n const values = checkboxes.filter(cb => cb.checked).map(cb => cb.value);\n\n return values;\n }\n\n // Creates the SVG structure for each data point\n createPlanets() {\n const squareSize = this.gridSquareSize();\n this.planets = this._data.map((d, i, data) => {\n const area = this.snap.circle('50%', '50%', squareSize / 2);\n area.addClass('planet-area');\n const circle1 = this.snap.circle('50%', '50%', 1);\n circle1.addClass('planet-circle1');\n const circle2 = this.snap.circle('50%', '50%', 1);\n circle2.addClass('planet-circle2');\n\n const group = this.snap.group(area, circle1, circle2);\n group.addClass('planet-group')\n group.attr('id', d.uuid);\n\n const label = document.querySelector(`[data-planet=\"${ d.uuid }\"]`);\n\n return {\n data: d,\n group, area, circle1, circle2, label,\n x: 50, y: 50\n };\n });\n }\n\n // Determines the size available per planet\n gridSquareSize() {\n return Math.min(this.width, this.height) / this.gridWidth;\n }\n\n // Pushes hidden planets out of the view\n hideHidden() {\n const y = this.mobile ? this.lineYMobile : this.lineYDesktop;\n this.getVisiblePlanets().forEach(p => {\n p.x = -25;\n p.y = y;\n });\n }\n\n // Displays the label for the currently hovered planet\n handleHoverIn(event) {\n if(this.activePositionModel === this.setLinePositions) return;\n const planet = this.planets.find(planet => planet.area.node === event.target);\n if(planet && !planet.label.classList.contains('visible')) {\n this.showLabel(planet);\n }\n }\n\n // Hides all visible labels\n hideLabels() {\n document.querySelectorAll('[data-planet].visible')\n .forEach(el => el.classList.remove('visible'));\n }\n\n // Shows the given planet's associated label\n showLabel(planet = this.currentPlanet) {\n\n if(\n !planet || planet.hidden || // Don't show label if the planet is filtered out\n planet.x < 0 || planet.x > 100 // ...or past the view edges\n ) {\n try {\n planet.label.classList.remove('visible');\n } catch(e) { /* probably missing the planet */ }\n return;\n }\n\n const cx = min(110, max(planet.x, -10));\n\n let { y } = planet.circle2.node.getBBox();\n\n const maxX = this.parent.offsetWidth;\n const maxY = this.parent.offsetHeight;\n\n if(\n cx < 0 || cx > maxX ||\n y < 0 || y > maxY\n ) {\n // Don't show label if it's not within display area\n planet.label.classList.remove('visible');\n return;\n }\n\n // Move the label to planet's position\n planet.label.style.left = cx + '%';\n planet.label.style.top = y + 'px';\n planet.label.classList.add('visible');\n }\n\n // Resets hidden planets to visible state\n clearFilters() {\n this.planets.forEach(planet => planet.hidden = false);\n }\n\n planetMatcher(needle) {\n\n if (needle === '' || needle === false) return;\n\n const searchString = needle.toLowerCase();\n const checkKeys = ['group', 'target'];\n const matchingPlanets = this.getVisiblePlanets().filter(planet => {\n const planetMatches = checkKeys.reduce((matches, key) => {\n return matches || planet.data[key].toLowerCase().includes(searchString)\n }, false);\n const sites = planet.data.target === ''\n ? this._details.filter(detail => detail.group === planet.data.group)\n : [];\n const siteMatches = sites.length > 0\n ? sites.reduce((found, site) => {\n return found || checkKeys.reduce((matches, key) => {\n return matches || site[key].toLowerCase().includes(searchString);\n }, false);\n }, false)\n : false;\n\n return planetMatches || siteMatches;\n });\n\n return matchingPlanets;\n }\n\n // Highlights planets that's given data value (partially) matches the search string\n // TODO: Refactor this bowl of bolognese...\n searchHighlight(search) {\n\n this.currentPlanet = false;\n this.hideLabels();\n this.fitViewport();\n\n this.planets.forEach(planet => {\n planet.group.node.classList.remove('highlight');\n });\n\n\n const matchingPlanets = this.planetMatcher(search);\n\n if (matchingPlanets === undefined) return;\n\n // Highlight matches visually on desktop\n matchingPlanets.forEach(planet => planet.group.node.classList.add('highlight'));\n matchingPlanets.forEach(planet => this.hideLabels());\n\n // Check for exact match\n if(matchingPlanets.length === 1) {\n\n // TODO: pre-select the searched site in the site dropdown\n this.currentPlanet = matchingPlanets[0];\n this.targetIndex = this.getSortedPlanets().indexOf(this.currentPlanet);\n this.showLabel();\n if(this.activePositionModel === this.setLinePositions) {\n this.activePositionModel();\n }\n //this.scrollToView();\n return; // match found, break early\n }\n\n // Check for multiple matches\n if(\n matchingPlanets.length > 1\n ) {\n\n\n //this.scrollToView();\n this.activePositionModel = this.setGridPositions;\n this.activePositionModel();\n\n setTimeout(() => {\n if (!this.mobile) { matchingPlanets.forEach(planet => this.showLabel(planet)); }\n }, this.animDuration - 100);\n\n\n\n } else { // No matches\n this.currentPlanet = false;\n this.hideLabels();\n }\n }\n\n // Resets all highlighted planets\n clearHighlights() {\n document.querySelectorAll('.highlight').forEach(el => el.classList.remove('highlight'));\n }\n\n // Hides planets that don't match the given value\n filterBy(key, values = []) {\n this.planets.forEach(planet => {\n const visible = values.reduce((result, value) => {\n return result || planet.data[key].includes(value);\n }, false);\n planet.hidden = !visible;\n });\n }\n\n // Calculates and sets each planet to their corresponding grid coordinate\n setGridPositions() {\n\n this.gridWidth = ceil(sqrt(this.getVisiblePlanets().length));\n this.getSortedPlanets().forEach((planet, index) => {\n const { x, y } = this.findGridPosition(index);\n planet.x = x;\n planet.y = y;\n });\n this.moveAreasToPositions();\n this.moveCirclesToPositions();\n this.setScalesByValue(\n this.scale1Select.options[this.scale1Select.selectedIndex].value,\n this.scale2Select.options[this.scale2Select.selectedIndex].value\n );\n if(this.currentPlanet) {\n this.showLabel();\n }\n\n }\n\n // Calculates and sets each planet to their corresponding line coordinate\n setLinePositions(targetIndex = this.targetIndex) {\n\n this.clearHighlights();\n this.gridWidth = 3;\n const y = this.mobile ? this.lineYMobile : this.lineYDesktop;\n this.sortedPlanets = this.getSortedPlanets();\n this.sortedPlanets.forEach((planet, index) => {\n planet.y = y;\n planet.x = 50 + (index - targetIndex) * (100 / 3);\n });\n this.moveAreasToPositions();\n this.moveCirclesToPositions();\n this.setScalesByValue(\n this.scale1Select.options[this.scale1Select.selectedIndex].value,\n this.scale2Select.options[this.scale2Select.selectedIndex].value\n );\n this.hideLabels();\n this.currentPlanet = this.sortedPlanets[targetIndex];\n this.displayDetails();\n\n\n //timeout for labels to be visible at correct position\n setTimeout(() => this.showLabel(), this.animDuration - 100);\n\n }\n\n // Source data may contain wacky characters, this attempts to sanitize it\n parseChangeValue(change) {\n if(typeof change === 'number') return change;\n if(change === '') return null;\n let result;\n result = Math.round(change.replace(',', '.').replace('−', '-'));\n if(Number.isNaN(result)) return null;\n return result;\n }\n\n getChangeClass(change) {\n const changeNumber = this.parseChangeValue(change);\n if(typeof changeNumber !== 'number') return '';\n if(changeNumber === 0) return '';\n return changeNumber < 0 ? 'fall' : 'rise';\n }\n\n formatChangeValue(change) {\n if(change === '') return '-';\n return this.parseChangeValue(change) + '%';\n }\n\n // Populate and display a planet's detailed data views\n displayDetails() {\n const {\n group, target,\n crasman_index, crasman_index_change,\n turnover, turnover_change\n } = this.currentPlanet.data;\n\n this.detailsGroup.innerText = group;\n this.detailsTurnover.innerText = turnover;\n this.detailsTurnoverChange.innerText = this.formatChangeValue(turnover_change);\n this.detailsTurnoverChange.className = this.getChangeClass(turnover_change);\n this.detailsCrasmanIndex.innerText = crasman_index;\n this.detailsCrasmanIndexChange.innerText = this.formatChangeValue(crasman_index_change);\n this.detailsCrasmanIndexChange.className = this.getChangeClass(crasman_index_change);\n\n let site = this.currentPlanet.data;\n\n\n let cruxData = [];\n\n\n if(!target || target.length === 0) { // Group planet\n this.detailsTarget.innerText = '';\n const sites = this._details.filter(d => d.group === group);\n const currentSearchTerm = this.searchInput.value.toLowerCase();\n this.currentSite = sites.find(site => site.target.toLowerCase().includes(currentSearchTerm));\n\n //find current crux data for group\n cruxData = this._cruxData.find(d => d.origin.includes(this.currentSite.target))\n\n this.displaySitesOptions(sites, currentSearchTerm);\n this.detailsTargets.parentNode.classList.remove('hidden');\n this.detailsSite.classList.remove('hidden');\n this.displaySiteDetails(this.currentSite ? this.currentSite : sites[0], this.sortedPlanets, cruxData);\n\n } else { // Single site planet\n this.detailsSite.classList.add('hidden');\n this.detailsTargets.parentNode.classList.add('hidden');\n this.detailsTarget.innerText = target.replace(/^www\\./,'');\n\n //find current crux data for single planet\n cruxData = this._cruxData.find(d => d.origin.includes(target))\n\n\n this.displaySiteDetails(this.currentPlanet.data, this.sortedPlanets, cruxData);\n }\n\n const turnoverPosition = this.getPlanetPosition(site.uuid, 'turnover', this.sortedPlanets);\n this.detailsPositionTurnover.innerText = turnoverPosition.current + '/' + turnoverPosition.total;\n\n const crasmanIndexPosition = this.getPlanetPosition(site.uuid, 'crasman_index', this.sortedPlanets);\n this.detailsPositionCrasmanIndex.innerText = crasmanIndexPosition.current + '/' + crasmanIndexPosition.total;\n }\n\n displaySitesOptions(sites, searchTerm) {\n this.detailsTargets.innerHTML = sites.map((site, index) => {\n return ``;\n }).join('');\n }\n\n getPlanetPosition(uuid, key, planets) {\n const sortedPlanets = planets.sort((a, b) => b.data[key] - a.data[key]);\n return {\n current: sortedPlanets.findIndex(p => p.data.uuid === uuid) + 1,\n total: planets.length\n };\n }\n\n getSitePosition(uuid, key, planets) {\n\n const currentSites = flatMap(planets, planet => {\n if(planet.data.target !== '') return planet.data;\n return this._details.filter(detail => detail.group === planet.data.group);\n }).sort((a, b) => b[key] - a[key]);\n return {\n current: currentSites.findIndex(site => site.uuid === uuid) + 1,\n total: currentSites.length\n };\n }\n\n getSiteMetricPosition(uuid, key, target) {\n\n /* sort cruxdata by metrics.key.histrogram[0] value based asc */\n const sortedCruxData = this._cruxData.sort((a, b) => {\n\n if (a.metrics !== undefined && a.metrics[key] && b.metrics !== undefined && b.metrics[key]) {\n const aMetric = a.metrics[key].histogram[0].density;\n const bMetric = b.metrics[key].histogram[0].density;\n return bMetric - aMetric;\n }\n\n });\n\n return {\n current: sortedCruxData.findIndex(cruxData => cruxData.origin.includes(target)) + 1,\n total: sortedCruxData.length\n };\n\n }\n\n\n\n displaySiteDetails(site, planets, cruxData) {\n const {\n total_traffic, total_traffic_change,\n total_keywords, total_keywords_change,\n total_backlinks, total_backlinks_change\n } = site;\n\n\n\n if (cruxData !== undefined) {\n this.cruxDataContainer.parentElement.classList.remove('hidden');\n\n const crux = CruxMeters();\n crux.init(cruxData.metrics, this.cruxDataContainer);\n\n\n } else {\n this.cruxDataContainer.parentElement.classList.add('hidden');\n this.cruxDataContainer.innerHTML = '';\n }\n\n this.detailsTraffic.innerText = total_traffic;\n this.detailsTrafficChange.innerText = this.formatChangeValue(total_traffic_change);\n this.detailsTrafficChange.className = this.getChangeClass(total_traffic_change);\n const positionTotalTraffic = this.getSitePosition(site.uuid, 'total_traffic', planets);\n this.detailsPositionTraffic.innerText = positionTotalTraffic.current + '/' + positionTotalTraffic.total;\n\n this.detailsTotalKeywords.innerText = total_keywords;\n this.detailsTotalKeywordsChange.innerText = this.formatChangeValue(total_keywords_change);\n this.detailsTotalKeywordsChange.className = this.getChangeClass(total_keywords_change);\n const positionTotalKeywords = this.getSitePosition(site.uuid, 'total_keywords', planets);\n this.detailsPositionTotalKeywords.innerText = positionTotalKeywords.current + '/' + positionTotalKeywords.total;\n\n this.detailsBacklinks.innerText = total_backlinks;\n this.detailsBacklinksChange.innerText = this.formatChangeValue(total_backlinks_change);\n this.detailsBacklinksChange.className = this.getChangeClass(total_backlinks_change);\n const positionTotalBacklinks = this.getSitePosition(site.uuid, 'total_backlinks', planets);\n this.detailsPositionBacklinks.innerText = positionTotalBacklinks.current + '/' + positionTotalBacklinks.total;\n\n this.detailsSiteCrasmanIndex.innerText = site.crasman_index;\n this.detailsSiteCrasmanIndexChange.innerText = this.formatChangeValue(site.crasman_index_change);\n this.detailsSiteCrasmanIndexChange.className = this.getChangeClass(site.crasman_index_change);\n const positionSiteCrasmanIndex = this.getSitePosition(site.uuid, 'crasman_index', planets);\n this.detailsSitePositionCrasmanIndex.innerText = positionSiteCrasmanIndex.current + '/' + positionSiteCrasmanIndex.total;\n\n this.detailsSiteTarget.innerText = site.target;\n\n this.updateSiteKeywords(site);\n }\n\n updateSiteKeywords(site) {\n const keywords = this.detailsKeywordsYear.value === 'current'\n ? site.most_valuable_keywords || []\n : site.most_valuable_keywords_prev || [];\n this.detailsKeywords.innerHTML = keywords.map((keyword, index) => index < 5 ? `
  • ${\n keyword[0].toUpperCase() + keyword.slice(1)\n }
  • ` : '').join('');\n }\n\n // Determines the grid position by a planet's index and the desired number of columns\n findGridPosition(index, gridWidth = this.gridWidth) {\n const x = (100 / gridWidth / 2) + ((index % gridWidth) / gridWidth * 100);\n const y = (100 / gridWidth / 2) + (floor(index / gridWidth) / gridWidth * 100);\n return { x, y };\n }\n\n // Moves each planet's hover area to it's current position\n moveAreasToPositions() {\n this.planets.forEach(planet => {\n if(\n planet.x < 0 || planet.x > 100 ||\n planet.y < 0 || planet.y > 100\n ) {\n planet.area.attr({ display: 'none' });\n return;\n }\n planet.area.attr({\n cx: planet.x + '%',\n cy: planet.y + '%',\n display: null\n })\n });\n this.scaleAreas();\n }\n\n // Transitions each planet's circles to it's current position\n moveCirclesToPositions() {\n const y = this.mobile ? this.lineYMobile : this.lineYDesktop;\n this.planets.forEach(planet => {\n // Fade out planets that are positioned beyond the view area\n if(\n planet.x < 0 || planet.x > 100 ||\n planet.y < 0 || planet.y > 100\n ) {\n // clamp x value near view edges\n const tx = min(110, max(planet.x, -10));\n planet.circle1.stop().animate({\n cx: tx + '%', cy: y + '%',\n opacity: 0\n }, this.animDuration / 2, this.easeOut);\n planet.circle2.stop().animate({\n cx: tx + '%', cy: y + '%',\n opacity: 0\n }, this.animDuration / 2, this.easeOut);\n return;\n }\n\n planet.circle1.stop().animate({\n cx: planet.x + '%',\n cy: planet.y + '%',\n opacity: 1\n }, this.animDuration, this.easeOut);\n\n planet.circle2.stop().animate({\n cx: planet.x + '%',\n cy: planet.y + '%',\n opacity: 1\n }, this.animDuration, this.easeOut);\n });\n }\n\n // Determines and sets an appropriate scale for each planet's circles\n setScalesByValue(key1, key2) {\n const valuesRange1 = this.valuesRange(key1);\n const valuesRange2 = this.valuesRange(key2);\n this.planets.forEach(planet => {\n planet.radius1 = planet.hidden ? 0 : 1 + max(\n 0,\n (planet.data[key1] / valuesRange1.max) * (\n 1 / this.gridWidth * Math.min(this.height, this.width) / 2\n )\n );\n planet.radius2 = planet.hidden ? 0 : 1 + max(\n 0,\n (planet.data[key2] / valuesRange2.max) * (\n 1 / this.gridWidth * Math.min(this.height, this.width) / 2\n )\n );\n });\n\n this.scalePlanets();\n }\n\n // Sets an appropriate size for all planets' hit area\n scaleAreas() {\n const squareSize = this.gridSquareSize();\n this.planets.forEach(planet => planet.area.attr({\n r: planet.hidden ? 0 : squareSize / 2\n }));\n }\n\n // Transitions each planet's circles to the current radii\n scalePlanets() {\n this.planets.forEach(planet => {\n planet.circle1.animate({\n r: planet.radius1\n }, this.animDuration, this.easeOut);\n planet.circle2.animate({\n r: planet.radius2\n }, this.animDuration, this.easeOut);\n });\n }\n\n // Finds the min and max values for a given key, excluding hidden planets\n valuesRange(key) {\n const values = this.getVisiblePlanets().map(p => p.data[key] || 0);\n return {\n min: min(...values),\n max: max(1, ...values)\n };\n }\n\n // Math. Not even once.\n easeOut (t) {\n return (--t) * t * t + 1;\n }\n}\n\nexport default AKLSummitVis;\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 this._dom.bar = document.getElementById('js-branch-bar'); // Assumes only one bar per page\n\n if (this._dom.bar) {\n this._storageSettings = this._getSettings();\n\n // If user left the bar open\n if (this._storageSettings && !this._storageSettings.minified) {\n this._toggleMinified();\n }\n\n this._initToggles();\n this._initPageSelects();\n\n this._showBar();\n }\n }\n};\n\nmodule.exports = branchBar;\n","/* crux data calculations */\nimport Snap from 'snapsvg';\n\nfunction CruxMeters(){\n\n //count percentage. If need to chage something with the values, do it here\n const countPercentage = (data) => {\n if (data === undefined) return 0;\n\n const percentage = data.histogram[0].density * 100;\n\n return percentage.toFixed();\n\n };\n\n //get data for speedometer, value and title\n const getSpeedoMeterData = (metrics) => {\n return {\n cls: {\n percentage: countPercentage(metrics.cumulative_layout_shift),\n title: 'Cumulative Layout Shift'\n },\n ettfb: {\n percentage: countPercentage(metrics.experimental_time_to_first_byte),\n title: 'Experimental Time To First Byte'\n },\n fcp: {\n percentage: countPercentage(metrics.first_contentful_paint),\n title: 'First Contentful Paint'\n },\n fid: {\n percentage: countPercentage(metrics.first_input_delay),\n title: 'First Input Delay'\n },\n itnp: {\n percentage: countPercentage(metrics.interaction_to_next_paint),\n title: 'Interaction To Next Paint'\n },\n lcp: {\n percentage: countPercentage(metrics.largest_contentful_paint),\n title: 'Largest Contentful Paint'\n }\n }\n };\n\n\n const polar_to_cartesian = (cx, cy, radius, angle) => {\n let radians;\n radians = (angle - 90) * Math.PI / 180.0;\n return [Math.round((cx + (radius * Math.cos(radians))) * 100) / 100, Math.round((cy + (radius * Math.sin(radians))) * 100) / 100];\n }\n\n const svgPath = (x, y, radius, start_angle, end_angle) => {\n let end_xy, start_xy;\n start_xy = polar_to_cartesian(x, y, radius, end_angle);\n end_xy = polar_to_cartesian(x, y, radius, start_angle);\n return 'M ' + start_xy[0] + ' ' + start_xy[1] + ' A ' + radius + ' ' + radius + ' 0 0 0 ' + end_xy[0] + ' ' + end_xy[1];\n }\n\n const animate_arc = (ratio, svg) => {\n //set as close as 100 to avoid eternal loop in animation\n ratio = (ratio === '100') ? '.99999999' : ratio;\n\n let arc = svg.path('');\n const current = svg;\n return Snap.animate(0, ratio, (function(val) {\n\n var path;\n arc.remove();\n path = svgPath(500, 500, 450, -90, val * 180.0 - 90);\n arc = svg.path(path);\n arc.attr({\n class: 'data-arc'\n });\n }), Math.round(500 * ratio), function() {\n // stop animation\n current.stop();\n });\n\n }\n\n //draw speedometer\n const drawCruxSpeedometer = (value) => {\n\n const ratio = (value.percentage < 100) ? '.'+value.percentage : value.percentage;\n\n //these values are just from my head, if you want to change something, do it here\n let color = 'green'\n color = (value.percentage < 80) ? 'yellow' : color;\n color = (value.percentage < 50) ? 'red' : color;\n\n return `\n
    \n \n \n ${value.percentage}%\n \n

    ${value.title}

    \n
    `;\n }\n\n //draw svg container and speedometers\n const drawSvgContainer = (value) => {\n let htmlToReturn = '
    ';\n for (const [key, value] of Object.entries(value)) {\n htmlToReturn += drawCruxSpeedometer(value);\n }\n htmlToReturn += '
    ';\n return htmlToReturn;\n }\n\n\n //set animation for each speedometer\n const intializeSpeedometers = () => {\n\n const speedometers = document.querySelectorAll('.crux-speedometer svg');\n speedometers.forEach(speedometer => {\n const ratio = speedometer.parentElement.dataset.ratio;\n const svg = Snap(speedometer);\n animate_arc(ratio, svg);\n\n });\n\n }\n\n //init function\n const init = (cruxData, container) => {\n const speedoData = getSpeedoMeterData(cruxData);\n\n container.innerHTML = drawSvgContainer(speedoData);\n\n intializeSpeedometers();\n }\n\n //return public functions\n return {\n init: init,\n }\n}\n\nexport default CruxMeters;\n\n","// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\n//\n// Usage example:\n/*\nvar myEfficientFn = debounce(function() {\n // All the taxing stuff you do\n}, 250);\n\nwindow.addEventListener('resize', myEfficientFn);\n*/\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function() {\n var context = this, args = arguments;\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n timeout = null;\n if (!immediate) func.apply(context, args);\n }, wait);\n if (immediate && !timeout) func.apply(context, args);\n };\n}\n\nexport default debounce;\n","'use strict';\n\n/**\n * Focus outline detection (FOD)\n * @module 'modules/focus-outline-detect'\n *\n * Remove the focus outline if using a pointing/touch device, and re-enables it if a key is pressed.\n */\n\nclass FocusOutlineDetect {\n /**\n * Construct a FOD instance with options.\n *\n * @param {object} [options] - Initialization options\n * @param {string} [options.helperClass='no-focus-outline'] - The className used for disabling focus outline\n * @param {HTMLElement} [options.rootElement=document.documentElement] - The element to which the helper class is added\n * @param {array} [options.disableEvents] - A list of event names that should trigger disabling the focus outline\n * @param {array} [options.enableEvents] - A list of event names that should trigger re-enabling the focus outline\n */\n constructor(options) {\n const defaults = {\n helperClass: 'no-focus-outline',\n rootElement: document.documentElement,\n disableEvents: ['mousemove', 'touchstart'],\n enableEvents: ['keydown']\n }\n this.settings = Object.assign({}, defaults, options);\n this._disabled = false;\n }\n\n /**\n * Initialize FOD.\n */\n init() {\n this.addCSS();\n this.bindEvents();\n }\n\n /**\n * Add CSS rules for removing focus outlines.\n */\n addCSS() {\n let cssEl = document.createElement('style');\n cssEl.innerHTML = this.disableCSS;\n document.head.appendChild(cssEl);\n }\n\n /**\n * Magic getter for CSS rules\n *\n * @returns {string} A CSS rule for disabling focus outlines\n */\n get disableCSS() {\n return `.${this.settings.helperClass} :focus { outline: 0; }`;\n }\n\n /**\n * Creates bound listener functions.\n * Iterates through the event names which disable and enable focus outlines.\n */\n bindEvents() {\n this.disableHandler = this.disableFocusOutline.bind(this);\n this.enableHandler = this.enableFocusOutline.bind(this);\n this.settings.disableEvents.forEach(this.bindDisableEvent, this);\n this.settings.enableEvents.forEach(this.bindEnableEvent, this);\n }\n\n /**\n * Binds an event which when triggered, disables focus outlines\n * @param {string} eventName - The name of the event\n */\n bindDisableEvent(eventName) {\n this.settings.rootElement.addEventListener(\n eventName,\n this.disableHandler,\n { passive: true }\n );\n }\n\n /**\n * Binds an event which when triggered, enbables focus outlines\n * @param {string} eventName - The name of the event\n */\n bindEnableEvent(eventName) {\n this.settings.rootElement.addEventListener(\n eventName,\n this.enableHandler,\n { passive: true }\n );\n }\n\n /**\n * Checks if focus outlines are disabled, and if not,\n * disables them by adding a class to the root element.\n */\n disableFocusOutline() {\n if(!this._disabled) {\n this.settings.rootElement.classList.add(\n this.settings.helperClass\n );\n this._disabled = true;\n }\n }\n\n /**\n * Checks if focus outlines are disabled, and if they are,\n * enables them by removing a class from the root element.\n *\n * @param {object} event - The current event object\n */\n enableFocusOutline(event) {\n if(this._disabled) {\n if(event.type === 'keydown') {\n if(event.key !== 'Tab') {\n return;\n }\n }\n this.settings.rootElement.classList.remove(\n this.settings.helperClass\n );\n this._disabled = false;\n }\n }\n}\n\nmodule.exports = FocusOutlineDetect;\n","/*\nget hubspot form from dom. Add event listener to it. Add popup class to body after 5000ms. Add close button to popup. Add event listener to close button. Remove popup class from body on click.\n*/\n\nconst hubspotForm = () => {\n const form = document.querySelector('.hbspt-form');\n const body = document.querySelector('body');\n const closeBtn = document.createElement('button');\n\n if (form) {\n\n setTimeout(() => {\n body.classList.add('popup');\n closeBtn.classList.add('popup__close');\n closeBtn.innerHTML = 'X';\n form.appendChild(closeBtn);\n\n }, 5000);\n }\n\n if (closeBtn) {\n closeBtn.addEventListener('click', () => {\n body.classList.remove('popup');\n form.remove();\n });\n }\n\n}\n\nexport default hubspotForm;\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXRtYXAvaW1wbGVtZW50YXRpb24uanMiLCJub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXRtYXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXRtYXAvcG9seWZpbGwuanMiLCJub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXRtYXAvc2hpbS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9qc29uL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvbWF0aC9zaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9udW1iZXIvaXMtbmFuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vbWF0aC9zaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9udW1iZXIvaXMtbmFuLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW1wbGVtZW50YXRpb24uanMiLCJub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RlZmluZS1wcm9wZXJ0aWVzL25vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9HZXRJbnRyaW5zaWMuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXMyMDE1LmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzMjAxNi5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczIwMTcuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXMyMDE4LmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzMjAxOS5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczUuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9hc3NlcnRSZWNvcmQuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9jYWxsQmluZC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2NhbGxCb3VuZC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2V2ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvZm9yRWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2dldEluZmVycmVkTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2dldEl0ZXJhdG9yTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvZ2V0UHJvdG8uanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9nZXRTeW1ib2xEZXNjcmlwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzRmluaXRlLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNOYU4uanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc1ByZWZpeE9mLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc1Byb3BlcnR5RGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzU2FtZVByb3BlcnR5RGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL21heFNhZmVJbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvbW9kLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvcmVnZXhUZXN0ZXIuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9zZXRQcm90by5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL3NpZ24uanMiLCJub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2VzMjAxNS5qcyIsIm5vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXM1LmpzIiwibm9kZV9tb2R1bGVzL2VzLXRvLXByaW1pdGl2ZS9lczYuanMiLCJub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvZXZlL2V2ZS5qcyIsIm5vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFtbWVyanMvaGFtbWVyLmpzIiwibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIiwibm9kZV9tb2R1bGVzL2hhcy9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtY2FsbGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtZGF0ZS1vYmplY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NuYXBzdmcvZGlzdC9zbmFwLnN2Zy5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnRyaW1sZWZ0L2ltcGxlbWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3N0cmluZy5wcm90b3R5cGUudHJpbWxlZnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltbGVmdC9wb2x5ZmlsbC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnRyaW1sZWZ0L3NoaW0uanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHQvaW1wbGVtZW50YXRpb24uanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHQvcG9seWZpbGwuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHQvc2hpbS5qcyIsInNyYy9qcy9tYXN0ZXIuanMiLCJzcmMvanMvbW9kdWxlcy9ha2xzdW1taXQtdmlzLmpzIiwic3JjL2pzL21vZHVsZXMvYnJhbmNoLWJhci5qcyIsInNyYy9qcy9tb2R1bGVzL2NydXhNZXRlcnMuanMiLCJzcmMvanMvbW9kdWxlcy9kZWJvdW5jZS5qcyIsInNyYy9qcy9tb2R1bGVzL2ZvY3VzLW91dGxpbmUtZGV0ZWN0LmpzIiwic3JjL2pzL21vZHVsZXMvaHVic3BvdEZvcm0uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxZQUVBLElBQUksSUFBSyxRQUFRLHFCQUVqQixRQUFPLFFBQVUsU0FBaUIsR0FDakMsR0FBSSxHQUFJLEdBQUcsU0FBUyxNQUNoQixFQUFZLEdBQUcsU0FBUyxHQUFHLElBQUksRUFBRyxVQUV0QyxLQUFLLEdBQUcsV0FBVyxHQUNsQixLQUFNLElBQUksV0FBVSxvQ0FHckIsSUFBSSxFQUNBLFdBQVUsT0FBUyxJQUN0QixFQUFJLFVBQVUsR0FHZixJQUFJLEdBQUksR0FBRyxtQkFBbUIsRUFBRyxFQUVqQyxPQURBLElBQUcsaUJBQWlCLEVBQUcsRUFBRyxFQUFXLEVBQUcsRUFBRyxFQUFnQixHQUNwRDs7O0FDbkJSLFlBRUEsSUFBSSxRQUFTLFFBQVEscUJBQ2pCLEtBQU8sUUFBUSxpQkFFZixlQUFpQixRQUFRLG9CQUN6QixZQUFjLFFBQVEsY0FDdEIsU0FBVyxjQUNYLEtBQU8sUUFBUSxVQUVmLGFBQWUsS0FBSyxLQUFLLFNBQVMsS0FBTSxTQUU1QyxRQUFPLGNBQ04sWUFBYSxZQUNiLGVBQWdCLGVBQ2hCLEtBQU0sT0FHUCxPQUFPLFFBQVU7OztBQ2xCakIsWUFFQSxJQUFJLGdCQUFpQixRQUFRLG1CQUU3QixRQUFPLFFBQVUsV0FDaEIsTUFBTyxPQUFNLFVBQVUsU0FBVzs7O0FDTG5DLFlBRUEsSUFBSSxRQUFTLFFBQVEscUJBQ2pCLFlBQWMsUUFBUSxhQUUxQixRQUFPLFFBQVUsV0FDaEIsR0FBSSxHQUFXLGFBTWYsT0FMQSxRQUNDLE1BQU0sV0FDSixRQUFTLElBQ1QsUUFBUyxXQUFjLE1BQU8sT0FBTSxVQUFVLFVBQVksS0FFdEQ7OztBQ1pSLE9BQU8sU0FBWSxRQUFXLFFBQVEsaUNBQWtDLFlBQVk7OztBQ0FwRixPQUFPLFNBQVksUUFBVyxRQUFRLG1DQUFvQyxZQUFZOzs7QUNBdEYsT0FBTyxTQUFZLFFBQVcsUUFBUSxxQ0FBc0MsWUFBWTs7O0FDQXhGLE9BQU8sU0FBWSxRQUFXLFFBQVEsZ0NBQWlDLFlBQVk7OztBQ0FuRixPQUFPLFNBQVksUUFBVyxRQUFRLG9DQUFxQyxZQUFZOzs7QUNBdkYsT0FBTyxTQUFZLFFBQVcsUUFBUSxvQ0FBcUMsWUFBWTs7O0FDQXZGLE9BQU8sU0FBWSxRQUFXLFFBQVEsNkNBQThDLFlBQVk7OztBQ0FoRyxPQUFPLFNBQVksUUFBVyxRQUFRLHFDQUFzQyxZQUFZOzs7QUNBeEYsWUFFQSxTQUFRLFlBQWEsRUFFckIsUUFBUSxRQUFVLFNBQVUsRUFBVSxHQUNwQyxLQUFNLFlBQW9CLElBQ3hCLEtBQU0sSUFBSSxXQUFVOzs7QUNOeEIsWUFRQSxTQUFTLHdCQUF1QixHQUFPLE1BQU8sSUFBTyxFQUFJLFdBQWEsR0FBUSxRQUFTLEdBTnZGLFFBQVEsWUFBYSxDQUVyQixJQUFJLGlCQUFrQixRQUFRLHFDQUUxQixpQkFBbUIsdUJBQXVCLGdCQUk5QyxTQUFRLFFBQVUsV0FDaEIsUUFBUyxHQUFpQixFQUFRLEdBQ2hDLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFNLE9BQVEsSUFBSyxDQUNyQyxHQUFJLEdBQWEsRUFBTSxFQUN2QixHQUFXLFdBQWEsRUFBVyxhQUFjLEVBQ2pELEVBQVcsY0FBZSxFQUN0QixTQUFXLEtBQVksRUFBVyxVQUFXLElBQ2pELEVBQUksaUJBQWlCLFNBQVMsRUFBUSxFQUFXLElBQUssSUFJMUQsTUFBTyxVQUFVLEVBQWEsRUFBWSxHQUd4QyxNQUZJLElBQVksRUFBaUIsRUFBWSxVQUFXLEdBQ3BELEdBQWEsRUFBaUIsRUFBYSxHQUN4Qzs7O0FDeEJYO0FBQ0E7QUFDQSxBQ0ZBLFFBQVEscUNBQ1IsUUFBUSxnQ0FDUixPQUFPLFFBQVUsUUFBUSx1QkFBdUIsTUFBTTs7O0FDRnRELFFBQVEsK0JBQ1IsUUFBUSxrQ0FDUixPQUFPLFFBQVUsUUFBUTs7O0FDRnpCLEdBQUksTUFBTyxRQUFRLHVCQUNmLE1BQVEsS0FBSyxPQUFTLEtBQUssTUFBUyxVQUFXLEtBQUssV0FDeEQsUUFBTyxRQUFVLFNBQW1CLEdBQ2xDLE1BQU8sT0FBTSxVQUFVLE1BQU0sTUFBTzs7O0FDSHRDLFFBQVEsK0JBQ1IsT0FBTyxRQUFVLFFBQVEsdUJBQXVCLEtBQUs7OztBQ0RyRCxRQUFRLG1DQUNSLE9BQU8sUUFBVSxRQUFRLHVCQUF1QixPQUFPOzs7QUNEdkQsUUFBUSxtQ0FDUixPQUFPLFFBQVUsUUFBUSx1QkFBdUIsT0FBTzs7O0FDRHZELFFBQVEsMkNBQ1IsSUFBSSxTQUFVLFFBQVEsdUJBQXVCLE1BQzdDLFFBQU8sUUFBVSxTQUF3QixFQUFJLEVBQUssR0FDaEQsTUFBTyxTQUFRLGVBQWUsRUFBSSxFQUFLOzs7QUNIekMsUUFBUSxvQ0FDUixPQUFPLFFBQVUsUUFBUSx1QkFBdUIsT0FBTzs7O0FDRHZELE9BQU8sUUFBVSxTQUFVLEdBQ3pCLEdBQWlCLGtCQUFOLEdBQWtCLEtBQU0sV0FBVSxFQUFLLHNCQUNsRCxPQUFPOzs7QUNGVCxPQUFPLFFBQVU7OztBQ0FqQixHQUFJLFVBQVcsUUFBUSxlQUN2QixRQUFPLFFBQVUsU0FBVSxHQUN6QixJQUFLLFNBQVMsR0FBSyxLQUFNLFdBQVUsRUFBSyxxQkFDeEMsT0FBTzs7O0FDRFQsR0FBSSxXQUFZLFFBQVEsaUJBQ3BCLFNBQVcsUUFBUSxnQkFDbkIsZ0JBQWtCLFFBQVEsdUJBQzlCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sVUFBVSxFQUFPLEVBQUksR0FDMUIsR0FHSSxHQUhBLEVBQUksVUFBVSxHQUNkLEVBQVMsU0FBUyxFQUFFLFFBQ3BCLEVBQVEsZ0JBQWdCLEVBQVcsRUFJdkMsSUFBSSxHQUFlLEdBQU0sR0FBSSxLQUFPLEVBQVMsR0FHM0MsSUFGQSxFQUFRLEVBQUUsT0FFRyxFQUFPLE9BQU8sTUFFdEIsTUFBTSxFQUFTLEVBQU8sSUFBUyxJQUFJLEdBQWUsSUFBUyxLQUM1RCxFQUFFLEtBQVcsRUFBSSxNQUFPLElBQWUsR0FBUyxDQUNwRCxRQUFRLElBQWdCOzs7QUNuQjlCLEdBQUksS0FBTSxRQUFRLFVBQ2QsSUFBTSxRQUFRLFVBQVUsZUFFeEIsSUFBa0QsYUFBNUMsSUFBSSxXQUFjLE1BQU8sZUFHL0IsT0FBUyxTQUFVLEVBQUksR0FDekIsSUFDRSxNQUFPLEdBQUcsR0FDVixNQUFPLEtBR1gsUUFBTyxRQUFVLFNBQVUsR0FDekIsR0FBSSxHQUFHLEVBQUcsQ0FDVixZQUFjLEtBQVAsRUFBbUIsWUFBcUIsT0FBUCxFQUFjLE9BRU4saUJBQXBDLEVBQUksT0FBTyxFQUFJLE9BQU8sR0FBSyxNQUFvQixFQUV2RCxJQUFNLElBQUksR0FFTSxXQUFmLEVBQUksSUFBSSxLQUFzQyxrQkFBWixHQUFFLE9BQXVCLFlBQWM7OztBQ3JCaEYsR0FBSSxhQUFjLFFBRWxCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sVUFBUyxLQUFLLEdBQUksTUFBTSxHQUFJOzs7QUNIckMsR0FBSSxNQUFPLE9BQU8sU0FBWSxRQUFTLFFBQ3JCLGlCQUFQLE9BQWlCLElBQU07OztBQ0RsQyxZQUNBLElBQUksaUJBQWtCLFFBQVEsZ0JBQzFCLFdBQWEsUUFBUSxtQkFFekIsUUFBTyxRQUFVLFNBQVUsRUFBUSxFQUFPLEdBQ3BDLElBQVMsR0FBUSxnQkFBZ0IsRUFBRSxFQUFRLEVBQU8sV0FBVyxFQUFHLElBQy9ELEVBQU8sR0FBUzs7O0FDTHZCLEdBQUksV0FBWSxRQUFRLGdCQUN4QixRQUFPLFFBQVUsU0FBVSxFQUFJLEVBQU0sR0FFbkMsR0FEQSxVQUFVLE9BQ0csS0FBVCxFQUFvQixNQUFPLEVBQy9CLFFBQVEsR0FDTixJQUFLLEdBQUcsTUFBTyxVQUFVLEdBQ3ZCLE1BQU8sR0FBRyxLQUFLLEVBQU0sR0FFdkIsS0FBSyxHQUFHLE1BQU8sVUFBVSxFQUFHLEdBQzFCLE1BQU8sR0FBRyxLQUFLLEVBQU0sRUFBRyxHQUUxQixLQUFLLEdBQUcsTUFBTyxVQUFVLEVBQUcsRUFBRyxHQUM3QixNQUFPLEdBQUcsS0FBSyxFQUFNLEVBQUcsRUFBRyxJQUcvQixNQUFPLFlBQ0wsTUFBTyxHQUFHLE1BQU0sRUFBTTs7O0FDaEIxQixPQUFPLFFBQVUsU0FBVSxHQUN6QixPQUFVLElBQU4sRUFBaUIsS0FBTSxXQUFVLHlCQUEyQixFQUNoRSxPQUFPOzs7QUNGVCxPQUFPLFNBQVcsUUFBUSxZQUFZLFdBQ3BDLE1BQStFLElBQXhFLE9BQU8sa0JBQW1CLEtBQU8sSUFBSyxXQUFjLE1BQU8sTUFBUTs7O0FDRjVFLEdBQUksVUFBVyxRQUFRLGdCQUNuQixTQUFXLFFBQVEsYUFBYSxTQUVoQyxHQUFLLFNBQVMsV0FBYSxTQUFTLFNBQVMsY0FDakQsUUFBTyxRQUFVLFNBQVUsR0FDekIsTUFBTyxJQUFLLFNBQVMsY0FBYzs7O0FDSnJDLE9BQU8sUUFBVSxnR0FFZixNQUFNOzs7QUNIUixHQUFJLFFBQVMsUUFBUSxhQUNqQixLQUFPLFFBQVEsV0FDZixJQUFNLFFBQVEsVUFDZCxLQUFPLFFBQVEsV0FDZixJQUFNLFFBQVEsVUFDZCxVQUFZLFlBRVosUUFBVSxTQUFVLEVBQU0sRUFBTSxHQUNsQyxHQVNJLEdBQUssRUFBSyxFQVRWLEVBQVksRUFBTyxRQUFRLEVBQzNCLEVBQVksRUFBTyxRQUFRLEVBQzNCLEVBQVksRUFBTyxRQUFRLEVBQzNCLEVBQVcsRUFBTyxRQUFRLEVBQzFCLEVBQVUsRUFBTyxRQUFRLEVBQ3pCLEVBQVUsRUFBTyxRQUFRLEVBQ3pCLEVBQVUsRUFBWSxLQUFPLEtBQUssS0FBVSxLQUFLLE9BQ2pELEVBQVcsRUFBUSxXQUNuQixFQUFTLEVBQVksT0FBUyxFQUFZLE9BQU8sSUFBUyxPQUFPLFFBQWEsVUFFOUUsS0FBVyxFQUFTLEVBQ3hCLEtBQUssSUFBTyxJQUVWLEdBQU8sR0FBYSxPQUEwQixLQUFoQixFQUFPLEtBQzFCLElBQUksRUFBUyxLQUV4QixFQUFNLEVBQU0sRUFBTyxHQUFPLEVBQU8sR0FFakMsRUFBUSxHQUFPLEdBQW1DLGtCQUFmLEdBQU8sR0FBcUIsRUFBTyxHQUVwRSxHQUFXLEVBQU0sSUFBSSxFQUFLLFFBRTFCLEdBQVcsRUFBTyxJQUFRLEVBQU0sU0FBVyxHQUMzQyxHQUFJLEdBQUksU0FBVSxFQUFHLEVBQUcsR0FDdEIsR0FBSSxlQUFnQixHQUFHLENBQ3JCLE9BQVEsVUFBVSxRQUNoQixJQUFLLEdBQUcsTUFBTyxJQUFJLEVBQ25CLEtBQUssR0FBRyxNQUFPLElBQUksR0FBRSxFQUNyQixLQUFLLEdBQUcsTUFBTyxJQUFJLEdBQUUsRUFBRyxHQUN4QixNQUFPLElBQUksR0FBRSxFQUFHLEVBQUcsR0FDckIsTUFBTyxHQUFFLE1BQU0sS0FBTSxXQUd6QixPQURBLEdBQUUsV0FBYSxFQUFFLFdBQ1YsR0FFTixHQUFPLEdBQTBCLGtCQUFQLEdBQW9CLElBQUksU0FBUyxLQUFNLEdBQU8sRUFFdkUsS0FDRCxFQUFRLFVBQVksRUFBUSxhQUFlLEdBQU8sRUFFL0MsRUFBTyxRQUFRLEdBQUssSUFBYSxFQUFTLElBQU0sS0FBSyxFQUFVLEVBQUssS0FLOUUsU0FBUSxFQUFJLEVBQ1osUUFBUSxFQUFJLEVBQ1osUUFBUSxFQUFJLEVBQ1osUUFBUSxFQUFJLEVBQ1osUUFBUSxFQUFJLEdBQ1osUUFBUSxFQUFJLEdBQ1osUUFBUSxFQUFJLEdBQ1osUUFBUSxFQUFJLElBQ1osT0FBTyxRQUFVOzs7QUM3RGpCLE9BQU8sUUFBVSxTQUFVLEdBQ3pCLElBQ0UsUUFBUyxJQUNULE1BQU8sR0FDUCxPQUFPOzs7QUNIWCxHQUFJLFFBQVMsT0FBTyxRQUEyQixtQkFBVixTQUF5QixPQUFPLE1BQVEsS0FDekUsT0FBd0IsbUJBQVIsT0FBdUIsS0FBSyxNQUFRLEtBQU8sS0FFM0QsU0FBUyxnQkFDSyxpQkFBUCxPQUFpQixJQUFNOzs7QUNMbEMsR0FBSSxtQkFBb0IsY0FDeEIsUUFBTyxRQUFVLFNBQVUsRUFBSSxHQUM3QixNQUFPLGdCQUFlLEtBQUssRUFBSTs7O0FDRmpDLEdBQUksSUFBSyxRQUFRLGdCQUNiLFdBQWEsUUFBUSxtQkFDekIsUUFBTyxRQUFVLFFBQVEsa0JBQW9CLFNBQVUsRUFBUSxFQUFLLEdBQ2xFLE1BQU8sSUFBRyxFQUFFLEVBQVEsRUFBSyxXQUFXLEVBQUcsS0FDckMsU0FBVSxFQUFRLEVBQUssR0FFekIsTUFEQSxHQUFPLEdBQU8sRUFDUDs7O0FDTlQsR0FBSSxVQUFXLFFBQVEsYUFBYSxRQUNwQyxRQUFPLFFBQVUsVUFBWSxTQUFTOzs7QUNEdEMsT0FBTyxTQUFXLFFBQVEsb0JBQXNCLFFBQVEsWUFBWSxXQUNsRSxNQUE0RyxJQUFyRyxPQUFPLGVBQWUsUUFBUSxpQkFBaUIsT0FBUSxLQUFPLElBQUssV0FBYyxNQUFPLE1BQVE7OztBQ0F6RyxHQUFJLEtBQU0sUUFBUSxTQUVsQixRQUFPLFFBQVUsT0FBTyxLQUFLLHFCQUFxQixHQUFLLE9BQVMsU0FBVSxHQUN4RSxNQUFrQixVQUFYLElBQUksR0FBa0IsRUFBRyxNQUFNLElBQU0sT0FBTzs7O0FDSHJELEdBQUksV0FBWSxRQUFRLGdCQUNwQixTQUFXLFFBQVEsVUFBVSxZQUM3QixXQUFhLE1BQU0sU0FFdkIsUUFBTyxRQUFVLFNBQVUsR0FDekIsV0FBYyxLQUFQLElBQXFCLFVBQVUsUUFBVSxHQUFNLFdBQVcsWUFBYzs7O0FDTmpGLE9BQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQXFCLGdCQUFQLEdBQXlCLE9BQVAsRUFBNEIsa0JBQVA7OztBQ0F2RCxHQUFJLFVBQVcsUUFBUSxlQUN2QixRQUFPLFFBQVUsU0FBVSxFQUFVLEVBQUksRUFBTyxHQUM5QyxJQUNFLE1BQU8sR0FBVSxFQUFHLFNBQVMsR0FBTyxHQUFJLEVBQU0sSUFBTSxFQUFHLEdBRXZELE1BQU8sR0FDUCxHQUFJLEdBQU0sRUFBaUIsTUFFM0IsV0FEWSxLQUFSLEdBQW1CLFNBQVMsRUFBSSxLQUFLLElBQ25DOzs7QUNUVixZQUNBLElBQUksUUFBUyxRQUFRLG9CQUNqQixXQUFhLFFBQVEsb0JBQ3JCLGVBQWlCLFFBQVEsd0JBQ3pCLG9CQUdKLFNBQVEsV0FBVyxrQkFBbUIsUUFBUSxVQUFVLFlBQWEsV0FBYyxNQUFPLFFBRTFGLE9BQU8sUUFBVSxTQUFVLEVBQWEsRUFBTSxHQUM1QyxFQUFZLFVBQVksT0FBTyxtQkFBcUIsS0FBTSxXQUFXLEVBQUcsS0FDeEUsZUFBZSxFQUFhLEVBQU87OztBQ1hyQyxZQUNBLElBQUksU0FBVSxRQUFRLGNBQ2xCLFFBQVUsUUFBUSxhQUNsQixTQUFXLFFBQVEsZUFDbkIsS0FBTyxRQUFRLFdBQ2YsVUFBWSxRQUFRLGdCQUNwQixZQUFjLFFBQVEsa0JBQ3RCLGVBQWlCLFFBQVEsd0JBQ3pCLGVBQWlCLFFBQVEsaUJBQ3pCLFNBQVcsUUFBUSxVQUFVLFlBQzdCLFdBQWEsTUFBUSxXQUFhLFFBQ2xDLFlBQWMsYUFDZCxLQUFPLE9BQ1AsT0FBUyxTQUVULFdBQWEsV0FBYyxNQUFPLE1BRXRDLFFBQU8sUUFBVSxTQUFVLEVBQU0sRUFBTSxFQUFhLEVBQU0sRUFBUyxFQUFRLEdBQ3pFLFlBQVksRUFBYSxFQUFNLEVBQy9CLElBZUksR0FBUyxFQUFLLEVBZmQsRUFBWSxTQUFVLEdBQ3hCLElBQUssT0FBUyxJQUFRLEdBQU8sTUFBTyxHQUFNLEVBQzFDLFFBQVEsR0FDTixJQUFLLE1BQ0wsSUFBSyxRQUFRLE1BQU8sWUFBb0IsTUFBTyxJQUFJLEdBQVksS0FBTSxJQUNyRSxNQUFPLFlBQXFCLE1BQU8sSUFBSSxHQUFZLEtBQU0sS0FFekQsRUFBTSxFQUFPLFlBQ2IsRUFBYSxHQUFXLE9BQ3hCLEdBQWEsRUFDYixFQUFRLEVBQUssVUFDYixFQUFVLEVBQU0sV0FBYSxFQUFNLGNBQWdCLEdBQVcsRUFBTSxHQUNwRSxFQUFXLEdBQVcsRUFBVSxHQUNoQyxFQUFXLEVBQVcsRUFBd0IsRUFBVSxXQUFyQixNQUFrQyxHQUNyRSxFQUFxQixTQUFSLEVBQWtCLEVBQU0sU0FBVyxFQUFVLENBd0I5RCxJQXJCSSxJQUNGLEVBQW9CLGVBQWUsRUFBVyxLQUFLLEdBQUksUUFDN0IsT0FBTyxXQUFhLEVBQWtCLE9BRTlELGVBQWUsRUFBbUIsR0FBSyxHQUVsQyxTQUFpRCxrQkFBL0IsR0FBa0IsV0FBeUIsS0FBSyxFQUFtQixTQUFVLGFBSXBHLEdBQWMsR0FBVyxFQUFRLE9BQVMsU0FDNUMsR0FBYSxFQUNiLEVBQVcsV0FBb0IsTUFBTyxHQUFRLEtBQUssUUFHL0MsVUFBVyxJQUFZLFFBQVMsR0FBZSxFQUFNLFdBQ3pELEtBQUssRUFBTyxTQUFVLEdBR3hCLFVBQVUsR0FBUSxFQUNsQixVQUFVLEdBQU8sV0FDYixFQU1GLEdBTEEsR0FDRSxPQUFRLEVBQWEsRUFBVyxFQUFVLFFBQzFDLEtBQU0sRUFBUyxFQUFXLEVBQVUsTUFDcEMsUUFBUyxHQUVQLEVBQVEsSUFBSyxJQUFPLEdBQ2hCLElBQU8sSUFBUSxTQUFTLEVBQU8sRUFBSyxFQUFRLFFBQzdDLFNBQVEsUUFBUSxFQUFJLFFBQVEsR0FBSyxPQUFTLEdBQWEsRUFBTSxFQUV0RSxPQUFPOzs7QUNuRVQsR0FBSSxVQUFXLFFBQVEsVUFBVSxZQUM3QixjQUFlLENBRW5CLEtBQ0UsR0FBSSxRQUFTLEdBQUcsV0FDaEIsT0FBYyxPQUFJLFdBQWMsY0FBZSxHQUUvQyxNQUFNLEtBQUssTUFBTyxXQUFjLEtBQU0sS0FDdEMsTUFBTyxJQUVULE9BQU8sUUFBVSxTQUFVLEVBQU0sR0FDL0IsSUFBSyxJQUFnQixhQUFjLE9BQU8sQ0FDMUMsSUFBSSxJQUFPLENBQ1gsS0FDRSxHQUFJLElBQU8sR0FDUCxFQUFPLEVBQUksV0FDZixHQUFLLEtBQU8sV0FBYyxPQUFTLEtBQU0sR0FBTyxJQUNoRCxFQUFJLFVBQVksV0FBYyxNQUFPLElBQ3JDLEVBQUssR0FDTCxNQUFPLElBQ1QsTUFBTzs7O0FDcEJULE9BQU8sUUFBVSxTQUFVLEVBQU0sR0FDL0IsT0FBUyxNQUFPLEVBQU8sT0FBUTs7O0FDRGpDLE9BQU87OztBQ0FQLE9BQU8sU0FBVTs7O0FDQ2pCLE9BQU8sUUFBVSxLQUFLLE1BQVEsU0FBYyxHQUUxQyxNQUFtQixLQUFYLEdBQUssSUFBVyxHQUFLLEVBQUksRUFBSSxFQUFJLEdBQUssRUFBSTs7O0FDSHBELFlBRUEsSUFBSSxhQUFjLFFBQVEsa0JBQ3RCLFFBQVUsUUFBUSxrQkFDbEIsS0FBTyxRQUFRLGtCQUNmLElBQU0sUUFBUSxpQkFDZCxTQUFXLFFBQVEsZ0JBQ25CLFFBQVUsUUFBUSxjQUNsQixRQUFVLE9BQU8sTUFHckIsUUFBTyxTQUFXLFNBQVcsUUFBUSxZQUFZLFdBQy9DLEdBQUksTUFDQSxLQUVBLEVBQUksU0FDSixFQUFJLHNCQUdSLE9BRkEsR0FBRSxHQUFLLEVBQ1AsRUFBRSxNQUFNLElBQUksUUFBUSxTQUFVLEdBQUssRUFBRSxHQUFLLElBQ2QsR0FBckIsV0FBWSxHQUFHLElBQVcsT0FBTyxLQUFLLFdBQVksSUFBSSxLQUFLLEtBQU8sSUFDdEUsU0FBZ0IsRUFBUSxHQU0zQixJQUxBLEdBQUksR0FBSSxTQUFTLEdBQ2IsRUFBTyxVQUFVLE9BQ2pCLEVBQVEsRUFDUixFQUFhLEtBQUssRUFDbEIsRUFBUyxJQUFJLEVBQ1YsRUFBTyxHQU1aLElBTEEsR0FJSSxHQUpBLEVBQUksUUFBUSxVQUFVLE1BQ3RCLEVBQU8sRUFBYSxRQUFRLEdBQUcsT0FBTyxFQUFXLElBQU0sUUFBUSxHQUMvRCxFQUFTLEVBQUssT0FDZCxFQUFJLEVBRUQsRUFBUyxHQUNkLEVBQU0sRUFBSyxLQUNOLGNBQWUsRUFBTyxLQUFLLEVBQUcsS0FBTSxFQUFFLEdBQU8sRUFBRSxHQUV0RCxPQUFPLElBQ1A7OztBQ3BDSixHQUFJLFVBQVcsUUFBUSxnQkFDbkIsSUFBTSxRQUFRLGlCQUNkLFlBQWMsUUFBUSxvQkFDdEIsU0FBVyxRQUFRLGlCQUFpQixZQUNwQyxNQUFRLGFBQ1IsVUFBWSxZQUdaLFdBQWEsV0FFZixHQUlJLEdBSkEsRUFBUyxRQUFRLGlCQUFpQixVQUNsQyxFQUFJLFlBQVksTUFjcEIsS0FWQSxFQUFPLE1BQU0sUUFBVSxPQUN2QixRQUFRLFdBQVcsWUFBWSxHQUMvQixFQUFPLElBQU0sY0FHYixFQUFpQixFQUFPLGNBQWMsU0FDdEMsRUFBZSxPQUNmLEVBQWUsTUFBTSx1Q0FDckIsRUFBZSxRQUNmLFdBQWEsRUFBZSxFQUNyQixXQUFZLFlBQVcsV0FBVyxZQUFZLEdBQ3JELE9BQU8sY0FHVCxRQUFPLFFBQVUsT0FBTyxRQUFVLFNBQWdCLEVBQUcsR0FDbkQsR0FBSSxFQVFKLE9BUFUsUUFBTixHQUNGLE1BQU0sV0FBYSxTQUFTLEdBQzVCLEVBQVMsR0FBSSxPQUNiLE1BQU0sV0FBYSxLQUVuQixFQUFPLFVBQVksR0FDZCxFQUFTLGlCQUNNLEtBQWYsRUFBMkIsRUFBUyxJQUFJLEVBQVE7OztBQ3ZDekQsR0FBSSxVQUFXLFFBQVEsZ0JBQ25CLGVBQWlCLFFBQVEscUJBQ3pCLFlBQWMsUUFBUSxtQkFDdEIsR0FBSyxPQUFPLGNBRWhCLFNBQVEsRUFBSSxRQUFRLGtCQUFvQixPQUFPLGVBQWlCLFNBQXdCLEVBQUcsRUFBRyxHQUk1RixHQUhBLFNBQVMsR0FDVCxFQUFJLFlBQVksR0FBRyxHQUNuQixTQUFTLEdBQ0wsZUFBZ0IsSUFDbEIsTUFBTyxJQUFHLEVBQUcsRUFBRyxHQUNoQixNQUFPLElBQ1QsR0FBSSxPQUFTLElBQWMsT0FBUyxHQUFZLEtBQU0sV0FBVSwyQkFFaEUsT0FESSxTQUFXLEtBQVksRUFBRSxHQUFLLEVBQVcsT0FDdEM7OztBQ2RULEdBQUksSUFBSyxRQUFRLGdCQUNiLFNBQVcsUUFBUSxnQkFDbkIsUUFBVSxRQUFRLGlCQUV0QixRQUFPLFFBQVUsUUFBUSxrQkFBb0IsT0FBTyxpQkFBbUIsU0FBMEIsRUFBRyxHQUNsRyxTQUFTLEVBS1QsS0FKQSxHQUdJLEdBSEEsRUFBTyxRQUFRLEdBQ2YsRUFBUyxFQUFLLE9BQ2QsRUFBSSxFQUVELEVBQVMsR0FBRyxHQUFHLEVBQUUsRUFBRyxFQUFJLEVBQUssS0FBTSxFQUFXLEdBQ3JELE9BQU87OztBQ1hULFFBQVEsRUFBSSxPQUFPOzs7QUNDbkIsR0FBSSxLQUFNLFFBQVEsVUFDZCxTQUFXLFFBQVEsZ0JBQ25CLFNBQVcsUUFBUSxpQkFBaUIsWUFDcEMsWUFBYyxPQUFPLFNBRXpCLFFBQU8sUUFBVSxPQUFPLGdCQUFrQixTQUFVLEdBRWxELE1BREEsR0FBSSxTQUFTLEdBQ1QsSUFBSSxFQUFHLFVBQWtCLEVBQUUsVUFDSCxrQkFBakIsR0FBRSxhQUE2QixZQUFhLEdBQUUsWUFDaEQsRUFBRSxZQUFZLFVBQ2QsWUFBYSxRQUFTLFlBQWM7OztBQ1gvQyxHQUFJLEtBQU0sUUFBUSxVQUNkLFVBQVksUUFBUSxpQkFDcEIsYUFBZSxRQUFRLHNCQUFxQixHQUM1QyxTQUFXLFFBQVEsaUJBQWlCLFdBRXhDLFFBQU8sUUFBVSxTQUFVLEVBQVEsR0FDakMsR0FHSSxHQUhBLEVBQUksVUFBVSxHQUNkLEVBQUksRUFDSixJQUVKLEtBQUssSUFBTyxHQUFPLEdBQU8sVUFBVSxJQUFJLEVBQUcsSUFBUSxFQUFPLEtBQUssRUFFL0QsTUFBTyxFQUFNLE9BQVMsR0FBTyxJQUFJLEVBQUcsRUFBTSxFQUFNLFNBQzdDLGFBQWEsRUFBUSxJQUFRLEVBQU8sS0FBSyxHQUU1QyxPQUFPOzs7QUNkVCxHQUFJLE9BQVEsUUFBUSwyQkFDaEIsWUFBYyxRQUFRLG1CQUUxQixRQUFPLFFBQVUsT0FBTyxNQUFRLFNBQWMsR0FDNUMsTUFBTyxPQUFNLEVBQUc7OztBQ0xsQixRQUFRLEtBQU87OztBQ0FmLEdBQUksYUFBYyxRQUFRLGtCQUN0QixRQUFVLFFBQVEsa0JBQ2xCLFVBQVksUUFBUSxpQkFDcEIsT0FBUyxRQUFRLGlCQUFpQixDQUN0QyxRQUFPLFFBQVUsU0FBVSxHQUN6QixNQUFPLFVBQVUsR0FPZixJQU5BLEdBS0ksR0FMQSxFQUFJLFVBQVUsR0FDZCxFQUFPLFFBQVEsR0FDZixFQUFTLEVBQUssT0FDZCxFQUFJLEVBQ0osS0FFRyxFQUFTLEdBQ2QsRUFBTSxFQUFLLEtBQ04sY0FBZSxPQUFPLEtBQUssRUFBRyxJQUNqQyxFQUFPLEtBQUssR0FBYSxFQUFLLEVBQUUsSUFBUSxFQUFFLEdBRzlDLE9BQU87OztBQ2xCWCxPQUFPLFFBQVUsU0FBVSxFQUFRLEdBQ2pDLE9BQ0UsYUFBdUIsRUFBVCxHQUNkLGVBQXlCLEVBQVQsR0FDaEIsV0FBcUIsRUFBVCxHQUNaLE1BQU87OztBQ0xYLE9BQU8sUUFBVSxRQUFROzs7QUNBekIsR0FBSSxLQUFNLFFBQVEsZ0JBQWdCLEVBQzlCLElBQU0sUUFBUSxVQUNkLElBQU0sUUFBUSxVQUFVLGNBRTVCLFFBQU8sUUFBVSxTQUFVLEVBQUksRUFBSyxHQUM5QixJQUFPLElBQUksRUFBSyxFQUFPLEVBQUssRUFBRyxVQUFXLE1BQU0sSUFBSSxFQUFJLEtBQU8sY0FBYyxFQUFNLE1BQU87OztBQ0xoRyxHQUFJLFFBQVMsUUFBUSxhQUFhLFFBQzlCLElBQU0sUUFBUSxTQUNsQixRQUFPLFFBQVUsU0FBVSxHQUN6QixNQUFPLFFBQU8sS0FBUyxPQUFPLEdBQU8sSUFBSTs7O0FDSDNDLEdBQUksTUFBTyxRQUFRLFdBQ2YsT0FBUyxRQUFRLGFBQ2pCLE9BQVMscUJBQ1QsTUFBUSxPQUFPLFVBQVksT0FBTyxhQUVyQyxPQUFPLFFBQVUsU0FBVSxFQUFLLEdBQy9CLE1BQU8sT0FBTSxLQUFTLE1BQU0sT0FBaUIsS0FBVixFQUFzQixRQUN4RCxlQUFnQixNQUNqQixRQUFTLEtBQUssUUFDZCxLQUFNLFFBQVEsY0FBZ0IsT0FBUyxTQUN2QyxVQUFXOzs7QUNWYixHQUFJLFdBQVksUUFBUSxpQkFDcEIsUUFBVSxRQUFRLGFBR3RCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sVUFBVSxFQUFNLEdBQ3JCLEdBR0ksR0FBRyxFQUhILEVBQUksT0FBTyxRQUFRLElBQ25CLEVBQUksVUFBVSxHQUNkLEVBQUksRUFBRSxNQUVWLE9BQUksR0FBSSxHQUFLLEdBQUssRUFBVSxFQUFZLE9BQUssSUFDN0MsRUFBSSxFQUFFLFdBQVcsR0FDVixFQUFJLE9BQVUsRUFBSSxPQUFVLEVBQUksSUFBTSxJQUFNLEVBQUksRUFBRSxXQUFXLEVBQUksSUFBTSxPQUFVLEVBQUksTUFDeEYsRUFBWSxFQUFFLE9BQU8sR0FBSyxFQUMxQixFQUFZLEVBQUUsTUFBTSxFQUFHLEVBQUksR0FBMkIsRUFBSSxPQUF6QixFQUFJLE9BQVUsSUFBcUI7OztBQ2Q1RSxHQUFJLFdBQVksUUFBUSxpQkFDcEIsSUFBTSxLQUFLLElBQ1gsSUFBTSxLQUFLLEdBQ2YsUUFBTyxRQUFVLFNBQVUsRUFBTyxHQUVoQyxNQURBLEdBQVEsVUFBVSxHQUNYLEVBQVEsRUFBSSxJQUFJLEVBQVEsRUFBUSxHQUFLLElBQUksRUFBTzs7O0FDSnpELEdBQUksTUFBTyxLQUFLLEtBQ1osTUFBUSxLQUFLLEtBQ2pCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sT0FBTSxHQUFNLEdBQU0sR0FBSyxFQUFLLEVBQUksTUFBUSxNQUFNOzs7QUNIdkQsR0FBSSxTQUFVLFFBQVEsY0FDbEIsUUFBVSxRQUFRLGFBQ3RCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sU0FBUSxRQUFROzs7QUNIekIsR0FBSSxXQUFZLFFBQVEsaUJBQ3BCLElBQU0sS0FBSyxHQUNmLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sR0FBSyxFQUFJLElBQUksVUFBVSxHQUFLLGtCQUFvQjs7O0FDSHpELEdBQUksU0FBVSxRQUFRLGFBQ3RCLFFBQU8sUUFBVSxTQUFVLEdBQ3pCLE1BQU8sUUFBTyxRQUFROzs7QUNGeEIsR0FBSSxVQUFXLFFBQVEsZUFHdkIsUUFBTyxRQUFVLFNBQVUsRUFBSSxHQUM3QixJQUFLLFNBQVMsR0FBSyxNQUFPLEVBQzFCLElBQUksR0FBSSxDQUNSLElBQUksR0FBa0MsbUJBQXJCLEVBQUssRUFBRyxZQUE0QixTQUFTLEVBQU0sRUFBRyxLQUFLLElBQU0sTUFBTyxFQUN6RixJQUFnQyxtQkFBcEIsRUFBSyxFQUFHLFdBQTJCLFNBQVMsRUFBTSxFQUFHLEtBQUssSUFBTSxNQUFPLEVBQ25GLEtBQUssR0FBa0MsbUJBQXJCLEVBQUssRUFBRyxZQUE0QixTQUFTLEVBQU0sRUFBRyxLQUFLLElBQU0sTUFBTyxFQUMxRixNQUFNLFdBQVU7OztBQ1ZsQixHQUFJLElBQUssRUFDTCxHQUFLLEtBQUssUUFDZCxRQUFPLFFBQVUsU0FBVSxHQUN6QixNQUFPLFVBQVUsV0FBZSxLQUFSLEVBQW9CLEdBQUssRUFBSyxRQUFTLEdBQUssSUFBSSxTQUFTOzs7QUNIbkYsR0FBSSxPQUFRLFFBQVEsYUFBYSxPQUM3QixJQUFNLFFBQVEsVUFDZCxPQUFTLFFBQVEsYUFBYSxPQUM5QixXQUE4QixrQkFBVixRQUVwQixTQUFXLE9BQU8sUUFBVSxTQUFVLEdBQ3hDLE1BQU8sT0FBTSxLQUFVLE1BQU0sR0FDM0IsWUFBYyxPQUFPLEtBQVUsV0FBYSxPQUFTLEtBQUssVUFBWSxJQUcxRSxVQUFTLE1BQVE7OztBQ1ZqQixHQUFJLFNBQVUsUUFBUSxjQUNsQixTQUFXLFFBQVEsVUFBVSxZQUM3QixVQUFZLFFBQVEsZUFDeEIsUUFBTyxRQUFVLFFBQVEsV0FBVyxrQkFBb0IsU0FBVSxHQUNoRSxPQUFVLElBQU4sRUFBaUIsTUFBTyxHQUFHLFdBQzFCLEVBQUcsZUFDSCxVQUFVLFFBQVE7OztBQ056QixHQUFJLFVBQVcsUUFBUSxnQkFDbkIsSUFBTSxRQUFRLDZCQUNsQixRQUFPLFFBQVUsUUFBUSxXQUFXLFlBQWMsU0FBVSxHQUMxRCxHQUFJLEdBQVMsSUFBSSxFQUNqQixJQUFxQixrQkFBVixHQUFzQixLQUFNLFdBQVUsRUFBSyxvQkFDdEQsT0FBTyxVQUFTLEVBQU8sS0FBSzs7O0FDTDlCLFlBQ0EsSUFBSSxLQUFNLFFBQVEsVUFDZCxRQUFVLFFBQVEsYUFDbEIsU0FBVyxRQUFRLGdCQUNuQixLQUFPLFFBQVEsZ0JBQ2YsWUFBYyxRQUFRLG9CQUN0QixTQUFXLFFBQVEsZ0JBQ25CLGVBQWlCLFFBQVEsc0JBQ3pCLFVBQVksUUFBUSw2QkFFeEIsU0FBUSxRQUFRLEVBQUksUUFBUSxHQUFLLFFBQVEsa0JBQWtCLFNBQVUsR0FBUSxNQUFNLEtBQUssS0FBVyxTQUVqRyxLQUFNLFNBQWMsR0FDbEIsR0FPSSxHQUFRLEVBQVEsRUFBTSxFQVB0QixFQUFJLFNBQVMsR0FDYixFQUFtQixrQkFBUixNQUFxQixLQUFPLE1BQ3ZDLEVBQU8sVUFBVSxPQUNqQixFQUFRLEVBQU8sRUFBSSxVQUFVLE9BQUssR0FDbEMsTUFBb0IsS0FBVixFQUNWLEVBQVEsRUFDUixFQUFTLFVBQVUsRUFJdkIsSUFGSSxJQUFTLEVBQVEsSUFBSSxFQUFPLEVBQU8sRUFBSSxVQUFVLE9BQUssR0FBVyxRQUV2RCxJQUFWLEdBQXlCLEdBQUssT0FBUyxZQUFZLEdBTXJELElBREEsRUFBUyxTQUFTLEVBQUUsUUFDZixFQUFTLEdBQUksR0FBRSxHQUFTLEVBQVMsRUFBTyxJQUMzQyxlQUFlLEVBQVEsRUFBTyxFQUFVLEVBQU0sRUFBRSxHQUFRLEdBQVMsRUFBRSxRQU5yRSxLQUFLLEVBQVcsRUFBTyxLQUFLLEdBQUksRUFBUyxHQUFJLEtBQU8sRUFBTyxFQUFTLFFBQVEsS0FBTSxJQUNoRixlQUFlLEVBQVEsRUFBTyxFQUFVLEtBQUssRUFBVSxHQUFRLEVBQUssTUFBTyxJQUFRLEdBQVEsRUFBSyxNQVNwRyxPQURBLEdBQU8sT0FBUyxFQUNUOzs7QUNsQ1gsWUFDQSxJQUFJLGtCQUFtQixRQUFRLHlCQUMzQixLQUFPLFFBQVEsZ0JBQ2YsVUFBWSxRQUFRLGdCQUNwQixVQUFZLFFBQVEsZ0JBTXhCLFFBQU8sUUFBVSxRQUFRLGtCQUFrQixNQUFPLFFBQVMsU0FBVSxFQUFVLEdBQzdFLEtBQUssR0FBSyxVQUFVLEdBQ3BCLEtBQUssR0FBSyxFQUNWLEtBQUssR0FBSyxHQUVULFdBQ0QsR0FBSSxHQUFJLEtBQUssR0FDVCxFQUFPLEtBQUssR0FDWixFQUFRLEtBQUssSUFDakIsUUFBSyxHQUFLLEdBQVMsRUFBRSxRQUNuQixLQUFLLE9BQUssR0FDSCxLQUFLLElBRUYsUUFBUixFQUF1QixLQUFLLEVBQUcsR0FDdkIsVUFBUixFQUF5QixLQUFLLEVBQUcsRUFBRSxJQUNoQyxLQUFLLEdBQUksRUFBTyxFQUFFLE1BQ3hCLFVBR0gsVUFBVSxVQUFZLFVBQVUsTUFFaEMsaUJBQWlCLFFBQ2pCLGlCQUFpQixVQUNqQixpQkFBaUI7OztBQ2hDakIsR0FBSSxTQUFVLFFBQVEsWUFFdEIsU0FBUSxRQUFRLEVBQUcsUUFBVSxLQUFNLFFBQVE7OztBQ0YzQyxHQUFJLFNBQVUsUUFBUSxZQUV0QixTQUFRLFFBQVEsRUFBRyxVQUNqQixNQUFPLFNBQWUsR0FFcEIsTUFBTyxJQUFVOzs7QUNMckIsR0FBSSxTQUFVLFFBQVEsWUFFdEIsU0FBUSxRQUFRLEVBQUksUUFBUSxFQUFHLFVBQVksT0FBUSxRQUFROzs7QUNIM0QsR0FBSSxTQUFVLFFBQVEsWUFFdEIsU0FBUSxRQUFRLEVBQUksUUFBUSxHQUFLLFFBQVEsa0JBQW1CLFVBQVksZUFBZ0IsUUFBUSxnQkFBZ0I7OztBQ0ZoSCxZQUNBLElBQUksS0FBTSxRQUFRLGlCQUFnQixFQUdsQyxTQUFRLGtCQUFrQixPQUFRLFNBQVUsU0FBVSxHQUNwRCxLQUFLLEdBQUssT0FBTyxHQUNqQixLQUFLLEdBQUssR0FFVCxXQUNELEdBRUksR0FGQSxFQUFJLEtBQUssR0FDVCxFQUFRLEtBQUssRUFFakIsT0FBSSxJQUFTLEVBQUUsUUFBaUIsVUFBTyxHQUFXLE1BQU0sSUFDeEQsRUFBUSxJQUFJLEVBQUcsR0FDZixLQUFLLElBQU0sRUFBTSxRQUNSLE1BQU8sRUFBTyxNQUFNOzs7QUNkL0IsR0FBSSxTQUFVLFFBQVEsYUFDbEIsU0FBVyxRQUFRLHVCQUFzQixFQUU3QyxTQUFRLFFBQVEsRUFBRyxVQUNqQixRQUFTLFNBQWlCLEdBQ3hCLE1BQU8sVUFBUzs7O0FDTnBCLFFBQVEsdUJBWVIsS0FBSyxHQVhELFFBQVMsUUFBUSxhQUNqQixLQUFPLFFBQVEsV0FDZixVQUFZLFFBQVEsZ0JBQ3BCLGNBQWdCLFFBQVEsVUFBVSxlQUVsQyxhQUFlLHdiQUlVLE1BQU0sS0FFMUIsRUFBSSxFQUFHLEVBQUksYUFBYSxPQUFRLElBQUssQ0FDNUMsR0FBSSxNQUFPLGFBQWEsR0FDcEIsV0FBYSxPQUFPLE1BQ3BCLE1BQVEsWUFBYyxXQUFXLFNBQ2pDLFNBQVUsTUFBTSxnQkFBZ0IsS0FBSyxNQUFPLGNBQWUsTUFDL0QsVUFBVSxNQUFRLFVBQVU7OztBQ2pCOUIsWUFFQSxJQUFJLE1BQU8sUUFBUSxlQUNmLFdBQStCLGtCQUFYLFNBQWtELGdCQUFsQixRQUFPLE9BRTNELE1BQVEsT0FBTyxVQUFVLFNBQ3pCLE9BQVMsTUFBTSxVQUFVLE9BQ3pCLG1CQUFxQixPQUFPLGVBRTVCLFdBQWEsU0FBVSxHQUMxQixNQUFxQixrQkFBUCxJQUF3QyxzQkFBbkIsTUFBTSxLQUFLLElBRzNDLGdDQUFrQyxXQUNyQyxHQUFJLEtBQ0osS0FDQyxtQkFBbUIsRUFBSyxLQUFPLFlBQVksRUFBTyxNQUFPLEdBRXpELEtBQUssR0FBSSxLQUFLLEdBQ2IsT0FBTyxDQUVSLE9BQU8sR0FBSSxJQUFNLEVBQ2hCLE1BQU8sR0FDUixPQUFPLElBR0wsb0JBQXNCLG9CQUFzQixrQ0FFNUMsZUFBaUIsU0FBVSxFQUFRLEVBQU0sRUFBTyxNQUMvQyxJQUFRLEtBQVksV0FBVyxJQUFlLE9BRzlDLG9CQUNILG1CQUFtQixFQUFRLEdBQzFCLGNBQWMsRUFDZCxZQUFZLEVBQ1osTUFBTyxFQUNQLFVBQVUsSUFHWCxFQUFPLEdBQVEsSUFJYixpQkFBbUIsU0FBVSxFQUFRLEdBQ3hDLEdBQUksR0FBYSxVQUFVLE9BQVMsRUFBSSxVQUFVLE1BQzlDLEVBQVEsS0FBSyxFQUNiLGNBQ0gsRUFBUSxPQUFPLEtBQUssRUFBTyxPQUFPLHNCQUFzQixJQUV6RCxLQUFLLEdBQUksR0FBSSxFQUFHLEVBQUksRUFBTSxPQUFRLEdBQUssRUFDdEMsZUFBZSxFQUFRLEVBQU0sR0FBSSxFQUFJLEVBQU0sSUFBSyxFQUFXLEVBQU0sS0FJbkUsa0JBQWlCLHNCQUF3QixvQkFFekMsT0FBTyxRQUFVOzs7QUN6RGpCLFlBRUEsSUFBSSxTQUNKLEtBQUssT0FBTyxLQUFNLENBRWpCLEdBQUksS0FBTSxPQUFPLFVBQVUsZUFDdkIsTUFBUSxPQUFPLFVBQVUsU0FDekIsT0FBUyxRQUFRLGlCQUNqQixhQUFlLE9BQU8sVUFBVSxxQkFDaEMsZ0JBQWtCLGFBQWEsTUFBTyxTQUFVLE1BQVEsWUFDeEQsZ0JBQWtCLGFBQWEsS0FBSyxhQUFnQixhQUNwRCxXQUNILFdBQ0EsaUJBQ0EsVUFDQSxpQkFDQSxnQkFDQSx1QkFDQSxlQUVHLDJCQUE2QixTQUFVLEdBQzFDLEdBQUksR0FBTyxFQUFFLFdBQ2IsT0FBTyxJQUFRLEVBQUssWUFBYyxHQUUvQixjQUNILG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEVBQ2YsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixjQUFjLEVBQ2QsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsU0FBUyxFQUNULGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFVBQVUsRUFDVixPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixTQUFTLEdBRU4seUJBQTRCLFdBRS9CLEdBQXNCLG1CQUFYLFFBQTBCLE9BQU8sQ0FDNUMsS0FBSyxHQUFJLEtBQUssUUFDYixJQUNDLElBQUssYUFBYSxJQUFNLElBQU0sSUFBSSxLQUFLLE9BQVEsSUFBb0IsT0FBZCxPQUFPLElBQW9DLGdCQUFkLFFBQU8sR0FDeEYsSUFDQywyQkFBMkIsT0FBTyxJQUNqQyxNQUFPLEdBQ1IsT0FBTyxHQUdSLE1BQU8sR0FDUixPQUFPLEVBR1QsT0FBTyxLQUVKLHFDQUF1QyxTQUFVLEdBRXBELEdBQXNCLG1CQUFYLFVBQTJCLHlCQUNyQyxNQUFPLDRCQUEyQixFQUVuQyxLQUNDLE1BQU8sNEJBQTJCLEdBQ2pDLE1BQU8sR0FDUixPQUFPLEdBSVQsVUFBVyxTQUFjLEdBQ3hCLEdBQUksR0FBc0IsT0FBWCxHQUFxQyxnQkFBWCxHQUNyQyxFQUFvQyxzQkFBdkIsTUFBTSxLQUFLLEdBQ3hCLEVBQWMsT0FBTyxHQUNyQixFQUFXLEdBQW1DLG9CQUF2QixNQUFNLEtBQUssR0FDbEMsSUFFSixLQUFLLElBQWEsSUFBZSxFQUNoQyxLQUFNLElBQUksV0FBVSxxQ0FHckIsSUFBSSxHQUFZLGlCQUFtQixDQUNuQyxJQUFJLEdBQVksRUFBTyxPQUFTLElBQU0sSUFBSSxLQUFLLEVBQVEsR0FDdEQsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFJLEVBQU8sU0FBVSxFQUNwQyxFQUFRLEtBQUssT0FBTyxHQUl0QixJQUFJLEdBQWUsRUFBTyxPQUFTLEVBQ2xDLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFPLFNBQVUsRUFDcEMsRUFBUSxLQUFLLE9BQU8sUUFHckIsS0FBSyxHQUFJLEtBQVEsR0FDVixHQUFzQixjQUFULElBQXlCLElBQUksS0FBSyxFQUFRLElBQzVELEVBQVEsS0FBSyxPQUFPLEdBS3ZCLElBQUksZUFHSCxJQUFLLEdBRkQsR0FBa0IscUNBQXFDLEdBRWxELEVBQUksRUFBRyxFQUFJLFVBQVUsU0FBVSxFQUNqQyxHQUFvQyxnQkFBakIsVUFBVSxLQUF5QixJQUFJLEtBQUssRUFBUSxVQUFVLEtBQ3RGLEVBQVEsS0FBSyxVQUFVLEdBSTFCLE9BQU8sSUFHVCxPQUFPLFFBQVU7OztBQ3pIakIsWUFFQSxJQUFJLE9BQVEsTUFBTSxVQUFVLE1BQ3hCLE9BQVMsUUFBUSxpQkFFakIsU0FBVyxPQUFPLEtBQ2xCLFNBQVcsU0FBVyxTQUFjLEdBQUssTUFBTyxVQUFTLElBQVEsUUFBUSxvQkFFekUsYUFBZSxPQUFPLElBRTFCLFVBQVMsS0FBTyxXQUNmLEdBQUksT0FBTyxLQUFNLEVBQ2MsV0FFN0IsR0FBSSxHQUFPLE9BQU8sS0FBSyxVQUN2QixPQUFPLElBQVEsRUFBSyxTQUFXLFVBQVUsU0FDeEMsRUFBRyxLQUVKLE9BQU8sS0FBTyxTQUFjLEdBQzNCLE1BQ1EsY0FESixPQUFPLEdBQ1UsTUFBTSxLQUFLLEdBRVosU0FJdEIsUUFBTyxLQUFPLFFBRWYsT0FBTyxRQUFPLE1BQVEsVUFHdkIsT0FBTyxRQUFVOzs7QUMvQmpCLFlBRUEsSUFBSSxPQUFRLE9BQU8sVUFBVSxRQUU3QixRQUFPLFFBQVUsU0FBcUIsR0FDckMsR0FBSSxHQUFNLE1BQU0sS0FBSyxHQUNqQixFQUFpQix1QkFBUixDQVNiLE9BUkssS0FDSixFQUFpQixtQkFBUixHQUNFLE9BQVYsR0FDaUIsZ0JBQVYsSUFDaUIsZ0JBQWpCLEdBQU0sUUFDYixFQUFNLFFBQVUsR0FDYSxzQkFBN0IsTUFBTSxLQUFLLEVBQU0sU0FFWjs7O0FDZlIsWUFPQSxJQUFJLFdBRUEsV0FBYSxVQUViLGVBQWlCLE9BQU8seUJBQ3hCLFdBQWMsTUFBTyxRQUFPLHlCQUF5QixVQUFXLFVBQVUsT0FDM0UsV0FBYyxLQUFNLElBQUksYUFFdkIsV0FBYSxRQUFRLGlCQUVyQixTQUFXLE9BQU8sZ0JBQWtCLFNBQVUsR0FBSyxNQUFPLEdBQUUsV0FFNUQsVUFDQSxrQkFBb0IsVUFBWSxTQUFTLFdBQWEsVUFDdEQsUUFDQSxjQUFnQixRQUFVLFFBQVEsWUFBYyxVQUNoRCxTQUNBLGlCQUFtQixTQUFXLFNBQVMsVUFBWSxVQUNuRCxpQkFBbUIsU0FBVyxXQUFhLFVBRTNDLFdBQW1DLG1CQUFmLFlBQTZCLFVBQVksU0FBUyxZQUV0RSxZQUNILFlBQWEsTUFDYixrQkFBMEMsbUJBQWhCLGFBQThCLFVBQVksWUFDcEUsMkJBQW1ELG1CQUFoQixhQUE4QixVQUFZLFlBQVksVUFDekYsNkJBQThCLFdBQWEsWUFBWSxPQUFPLGFBQWUsVUFDN0UscUJBQXNCLE1BQU0sVUFDNUIseUJBQTBCLE1BQU0sVUFBVSxRQUMxQyx5QkFBMEIsTUFBTSxVQUFVLFFBQzFDLHNCQUF1QixNQUFNLFVBQVUsS0FDdkMsd0JBQXlCLE1BQU0sVUFBVSxPQUN6QyxxQ0FBc0MsVUFDdEMsb0JBQXFCLGNBQ3JCLDZCQUE4QixjQUFnQixjQUFjLFVBQVksVUFDeEUscUJBQXNCLFNBQVcsU0FBUyxrQkFBb0IsVUFDOUQsNkJBQThCLGlCQUM5Qiw4QkFBK0IsaUJBQW1CLGlCQUFpQixVQUFZLFVBQy9FLDZCQUE4QixrQkFBb0IsWUFBYyxPQUFPLGNBQWdCLGlCQUFpQixPQUFPLGlCQUFtQixVQUNsSSxjQUFrQyxtQkFBWixTQUEwQixVQUFZLFFBQzVELGNBQWUsUUFDZix1QkFBd0IsUUFBUSxVQUNoQyxlQUFvQyxtQkFBYixVQUEyQixVQUFZLFNBQzlELHdCQUE2QyxtQkFBYixVQUEyQixVQUFZLFNBQVMsVUFDaEYsV0FBWSxLQUNaLG9CQUFxQixLQUFLLFVBQzFCLGdCQUFpQixVQUNqQix5QkFBMEIsbUJBQzFCLGdCQUFpQixVQUNqQix5QkFBMEIsbUJBQzFCLFlBQWEsTUFDYixxQkFBc0IsTUFBTSxVQUM1QixXQUFZLEtBQ1osZ0JBQWlCLFVBQ2pCLHlCQUEwQixVQUFVLFVBQ3BDLG1CQUE0QyxtQkFBakIsY0FBK0IsVUFBWSxhQUN0RSw0QkFBcUQsbUJBQWpCLGNBQStCLFVBQVksYUFBYSxVQUM1RixtQkFBNEMsbUJBQWpCLGNBQStCLFVBQVksYUFDdEUsNEJBQXFELG1CQUFqQixjQUErQixVQUFZLGFBQWEsVUFDNUYsZUFBZ0IsU0FDaEIsd0JBQXlCLFNBQVMsVUFDbEMsZ0JBQWlCLFVBQVksU0FBUyxhQUFlLFVBQ3JELHdCQUF5QixrQkFDekIseUJBQTBCLGtCQUFvQixrQkFBa0IsVUFBWSxVQUM1RSxnQkFBc0MsbUJBQWQsV0FBNEIsVUFBWSxVQUNoRSx5QkFBK0MsbUJBQWQsV0FBNEIsVUFBWSxVQUFVLFVBQ25GLGlCQUF3QyxtQkFBZixZQUE2QixVQUFZLFdBQ2xFLDBCQUFpRCxtQkFBZixZQUE2QixVQUFZLFVBQVUsVUFDckYsaUJBQXdDLG1CQUFmLFlBQTZCLFVBQVksV0FDbEUsMEJBQWlELG1CQUFmLFlBQTZCLFVBQVksV0FBVyxVQUN0RixlQUFnQixTQUNoQixZQUFhLE1BQ2Isd0JBQXlCLFdBQWEsU0FBUyxZQUFZLE9BQU8sY0FBZ0IsVUFDbEYsV0FBWSxLQUNaLGdCQUFpQixLQUFLLE1BQ3RCLFVBQTBCLG1CQUFSLEtBQXNCLFVBQVksSUFDcEQsMkJBQTJDLG1CQUFSLE1BQXdCLFdBQXlCLFVBQVMsR0FBSSxNQUFNLE9BQU8sYUFBdEMsVUFDeEUsbUJBQW1DLG1CQUFSLEtBQXNCLFVBQVksSUFBSSxVQUNqRSxXQUFZLEtBQ1osYUFBYyxPQUNkLHNCQUF1QixPQUFPLFVBQzlCLGFBQWMsT0FDZCxzQkFBdUIsT0FBTyxVQUM5Qix3QkFBeUIsT0FBTyxVQUFVLFNBQzFDLHVCQUF3QixPQUFPLFVBQVUsUUFDekMsaUJBQWtCLFdBQ2xCLGVBQWdCLFNBQ2hCLGNBQWtDLG1CQUFaLFNBQTBCLFVBQVksUUFDNUQsdUJBQTJDLG1CQUFaLFNBQTBCLFVBQVksUUFBUSxVQUM3RSx3QkFBNEMsbUJBQVosU0FBMEIsVUFBWSxRQUFRLFVBQVUsS0FDeEYsa0JBQXNDLG1CQUFaLFNBQTBCLFVBQVksUUFBUSxJQUN4RSxxQkFBeUMsbUJBQVosU0FBMEIsVUFBWSxRQUFRLE9BQzNFLHNCQUEwQyxtQkFBWixTQUEwQixVQUFZLFFBQVEsUUFDNUUsWUFBOEIsbUJBQVYsT0FBd0IsVUFBWSxNQUN4RCxpQkFBa0IsV0FDbEIsMEJBQTJCLFdBQVcsVUFDdEMscUJBQXNCLGVBQ3RCLDhCQUErQixlQUFlLFVBQzlDLGNBQWtDLG1CQUFaLFNBQTBCLFVBQVksUUFDNUQsYUFBYyxPQUNkLHNCQUF1QixPQUFPLFVBQzlCLFVBQTBCLG1CQUFSLEtBQXNCLFVBQVksSUFDcEQsMkJBQTJDLG1CQUFSLE1BQXdCLFdBQXlCLFVBQVMsR0FBSSxNQUFNLE9BQU8sYUFBdEMsVUFDeEUsbUJBQW1DLG1CQUFSLEtBQXNCLFVBQVksSUFBSSxVQUNqRSx3QkFBc0QsbUJBQXRCLG1CQUFvQyxVQUFZLGtCQUNoRixpQ0FBK0QsbUJBQXRCLG1CQUFvQyxVQUFZLGtCQUFrQixVQUMzRyxhQUFjLE9BQ2QsOEJBQStCLFdBQWEsU0FBUyxHQUFHLE9BQU8sYUFBZSxVQUM5RSxzQkFBdUIsT0FBTyxVQUM5QixhQUFjLFdBQWEsT0FBUyxVQUNwQyxzQkFBdUIsV0FBYSxPQUFPLFVBQVksVUFDdkQsa0JBQW1CLFlBQ25CLDJCQUE0QixZQUFZLFVBQ3hDLHFCQUFzQixlQUN0QixpQkFBa0IsV0FDbEIsMEJBQTJCLFdBQWEsV0FBVyxVQUFZLFVBQy9ELGdCQUFpQixXQUNqQix5QkFBMEIsV0FBVyxVQUNyQyxpQkFBd0MsbUJBQWYsWUFBNkIsVUFBWSxXQUNsRSwwQkFBaUQsbUJBQWYsWUFBNkIsVUFBWSxXQUFXLFVBQ3RGLHdCQUFzRCxtQkFBdEIsbUJBQW9DLFVBQVksa0JBQ2hGLGlDQUErRCxtQkFBdEIsbUJBQW9DLFVBQVksa0JBQWtCLFVBQzNHLGtCQUEwQyxtQkFBaEIsYUFBOEIsVUFBWSxZQUNwRSwyQkFBbUQsbUJBQWhCLGFBQThCLFVBQVksWUFBWSxVQUN6RixrQkFBMEMsbUJBQWhCLGFBQThCLFVBQVksWUFDcEUsMkJBQW1ELG1CQUFoQixhQUE4QixVQUFZLFlBQVksVUFDekYsZUFBZ0IsU0FDaEIsd0JBQXlCLFNBQVMsVUFDbEMsY0FBa0MsbUJBQVosU0FBMEIsVUFBWSxRQUM1RCx1QkFBMkMsbUJBQVosU0FBMEIsVUFBWSxRQUFRLFVBQzdFLGNBQWtDLG1CQUFaLFNBQTBCLFVBQVksUUFDNUQsdUJBQTJDLG1CQUFaLFNBQTBCLFVBQVksUUFBUSxXQUcxRSxLQUFPLFFBQVEsaUJBQ2YsU0FBVyxLQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxTQUdyRCxXQUFhLHFHQUNiLGFBQWUsV0FDZixhQUFlLFNBQXNCLEdBQ3hDLEdBQUksS0FJSixPQUhBLFVBQVMsRUFBUSxXQUFZLFNBQVUsRUFBTyxFQUFRLEVBQU8sR0FDNUQsRUFBTyxFQUFPLFFBQVUsRUFBUSxTQUFTLEVBQVcsYUFBYyxNQUFTLEdBQVUsSUFFL0UsR0FJSixpQkFBbUIsU0FBMEIsRUFBTSxHQUN0RCxHQUFJLEdBQU0sS0FBTyxDQUNqQixNQUFNLElBQU8sYUFDWixLQUFNLElBQUksYUFBWSxhQUFlLEVBQU8sbUJBSTdDLFFBQStCLEtBQXBCLFdBQVcsS0FBeUIsRUFDOUMsS0FBTSxJQUFJLFlBQVcsYUFBZSxFQUFPLHVEQUc1QyxPQUFPLFlBQVcsR0FHbkIsUUFBTyxRQUFVLFNBQXNCLEVBQU0sR0FDNUMsR0FBSSxVQUFVLE9BQVMsR0FBNkIsaUJBQWpCLEdBQ2xDLEtBQU0sSUFBSSxXQUFVLDRDQUdyQixJQUFJLEdBQVEsYUFBYSxFQUV6QixJQUFxQixJQUFqQixFQUFNLE9BQ1QsTUFBTyxrQkFBaUIsRUFBTSxFQUkvQixLQUFLLEdBREQsR0FBUSxpQkFBaUIsSUFBTSxFQUFNLEdBQUssSUFBSyxHQUMxQyxFQUFJLEVBQUcsRUFBSSxFQUFNLE9BQVEsR0FBSyxFQUN6QixNQUFULElBQ0gsRUFBUSxFQUFNLEVBQU0sSUFHdEIsT0FBTzs7O0FDM0xSLFlBRUEsSUFBSSxLQUFNLFFBQVEsT0FDZCxZQUFjLFFBQVEsdUJBQ3RCLEtBQU8sUUFBUSxlQUNmLFFBQVUsUUFBUSxrQkFFbEIsYUFBZSxRQUFRLGtCQUV2QixXQUFhLGFBQWEsZUFDMUIsWUFBYyxhQUFhLGdCQUMzQixhQUFlLGFBQWEsaUJBQzVCLE9BQVMsYUFBYSxXQUN0QixnQkFBa0IsT0FBTyxVQUN6QixRQUFVLGFBQWEsWUFDdkIsUUFBVSxhQUFhLFlBQ3ZCLFFBQVUsYUFBYSxZQUN2QixRQUFVLGFBQWEsWUFBWSxHQUNuQyxRQUFVLGFBQWEsWUFDdkIsTUFBUSxhQUFhLFVBQ3JCLFVBQVksYUFBYSxjQUN6QixtQkFBcUIsUUFBUSxrQkFFN0IsV0FBYSxRQUFRLGlCQUVyQixhQUFlLFFBQVEsMEJBQ3ZCLE9BQVMsUUFBUSxtQkFDakIsVUFBWSxRQUFRLHNCQUNwQixpQkFBbUIsS0FBSyxJQUFJLEVBQUcsSUFBTSxFQUNyQyxpQkFBbUIsUUFBUSw0QkFFM0IsT0FBUyxRQUFRLG9CQUNqQixLQUFPLFFBQVEsa0JBQ2YsSUFBTSxRQUFRLGlCQUNkLFlBQWMsUUFBUSx5QkFDdEIsUUFBVSxRQUFRLHFCQUNsQixNQUFRLFFBQVEsbUJBQ2hCLHlCQUEyQixRQUFRLHNDQUNuQyxxQkFBdUIsUUFBUSxrQ0FDL0IsYUFBZSxTQUNmLFVBQVksUUFBUSx1QkFDcEIsWUFBYyxRQUFRLHlCQUN0QixrQkFBb0IsUUFBUSwrQkFDNUIscUJBQXVCLFFBQVEsa0NBRS9CLGFBQWUsVUFBVSwwQkFBMEIsR0FDbkQsV0FBYSxVQUFVLHlCQUN2QixTQUFXLFVBQVUsMEJBQ3JCLFNBQVcsVUFBVSwyQkFDckIsTUFBUSxVQUFVLHdCQUVsQixTQUFXLFlBQVksY0FDdkIsUUFBVSxZQUFZLGVBQ3RCLFFBQVUsWUFBWSxXQUN0QixVQUFZLFVBQVUseUJBQ3RCLE9BQVMsSUFBVSxJQUFVLEtBQVUsS0FBSyxJQUM1QyxXQUFhLEdBQUksU0FBUSxJQUFNLE1BQVEsSUFBSyxLQUM1QyxTQUFXLFlBQVksWUFDdkIsb0JBQXNCLFlBQVksc0JBQ2xDLFlBQWMsVUFBVSwrQkFDeEIsY0FBZ0IsVUFBVSx5Q0FFMUIsTUFBUSxVQUFVLDZCQUVsQixlQUFpQixVQUFVLDRCQUMzQixnQkFBa0IsVUFBVSw2QkFDNUIsZUFBaUIsVUFBVSw0QkFDM0IsYUFBZSxVQUFVLDBCQUN6QixnQkFBa0IsVUFBVSw2QkFBNkIsR0FFekQsT0FBUyxLQUFLLE1BQ2QsS0FBTyxLQUFLLElBRVosY0FBZ0IsUUFBUSxPQUN4QixNQUFRLFFBQVEseUJBQ2hCLE1BQVEsUUFBUSxvQkFDaEIsTUFBUSxRQUFRLHNCQUNoQixjQUFnQixRQUFRLGFBQ3hCLGdCQUFrQixRQUFRLGVBQzFCLFVBQVksUUFBUSxzQkFFcEIsa0JBQW9CLFNBQTJCLEVBQUksRUFBRyxFQUFHLEdBQzVELElBQUssZ0JBQWlCLENBQ3JCLElBQUssRUFBRyxpQkFBaUIsR0FFeEIsT0FBTyxDQUVSLEtBQUssRUFBSyxzQkFBd0IsRUFBSyxnQkFDdEMsT0FBTyxDQUlSLElBQUksSUFBSyxJQUFLLGNBQWMsRUFBRyxPQUFTLEVBQUssa0JBRTVDLE9BQU8sQ0FJUixJQUFJLEdBQUksRUFBSyxZQUViLE9BREEsR0FBRSxHQUFLLEVBQ0EsRUFBRyxVQUFVLEVBQUUsR0FBSSxHQUczQixNQURBLGlCQUFnQixFQUFHLEVBQUcsRUFBRyx1QkFBdUIsS0FDekMsR0FLSixJQUNILHFCQUNBLG1CQUNBLGdCQUNDLEtBQUssSUFDSCxVQUFZLEdBQUksUUFBTyxNQUFRLEdBQUssU0FBVyxHQUFLLE9BQVEsS0FDNUQsU0FBVyxVQUFVLDRCQUNyQixLQUFPLFNBQVUsR0FDcEIsTUFBTyxVQUFTLEVBQU8sVUFBVyxLQUcvQixJQUFNLFFBQVEsU0FFZCxpQkFBbUIsUUFBUSxZQUczQixJQUFNLE9BQU8sVUFBVyxNQUczQixLQUFNLFNBQWMsRUFBRyxHQUN0QixHQUFJLEdBQU8sVUFBVSxPQUFTLEVBQUksVUFBVSxLQUM1QyxLQUFLLEtBQUssV0FBVyxHQUNwQixLQUFNLElBQUksWUFBVyxRQUFRLEdBQUsscUJBRW5DLE9BQU8sR0FBRSxNQUFNLEVBQUcsSUFJbkIsWUFBYSxZQU1iLFNBQVUsU0FBa0IsR0FDM0IsR0FBSSxHQUFRLFlBQVksR0FBWSxFQUFXLFlBQVksRUFBVSxRQUNyRSxJQUFxQixnQkFBVixHQUNWLEtBQU0sSUFBSSxZQUFXLDRDQUV0QixJQUFxQixnQkFBVixHQUFvQixDQUM5QixHQUFJLFNBQVMsR0FDWixNQUFPLE1BQUssU0FBUyxhQUFhLFNBQVMsRUFBTyxHQUFJLEdBQ2hELElBQUksUUFBUSxHQUNsQixNQUFPLE1BQUssU0FBUyxhQUFhLFNBQVMsRUFBTyxHQUFJLEdBQ2hELElBQUksU0FBUyxJQUFVLG9CQUFvQixHQUNqRCxNQUFPLElBRVAsSUFBSSxHQUFVLEtBQUssRUFDbkIsSUFBSSxJQUFZLEVBQ2YsTUFBTyxNQUFLLFNBQVMsR0FJeEIsTUFBTyxTQUFRLElBYWhCLFFBQVMsU0FBaUIsR0FDekIsR0FBSSxHQUFXLEtBQUssU0FBUyxFQUM3QixPQUFPLElBQVksTUFBUyxFQUFXLE1BQVUsR0FPbEQsT0FBUSxTQUFnQixHQUN2QixHQUFJLEdBQVUsS0FBSyxRQUFRLEVBQzNCLE9BQU8sSUFBVyxJQUFPLEVBQVUsSUFBUSxHQUk1QyxRQUFTLFNBQWlCLEdBQ3pCLEdBQUksR0FBUyxLQUFLLFNBQVMsRUFDM0IsSUFBSSxPQUFPLElBQXNCLElBQVgsSUFBaUIsVUFBVSxHQUFXLE1BQU8sRUFDbkUsSUFBSSxHQUFTLEtBQUssR0FBVSxPQUFPLEtBQUssR0FDeEMsT0FBTyxLQUFJLEVBQVEsTUFJcEIsYUFBYyxTQUFzQixHQUNuQyxHQUFJLEdBQVMsS0FBSyxTQUFTLEVBQzNCLElBQUksT0FBTyxJQUFXLEdBQVUsRUFBSyxNQUFPLEVBQzVDLElBQUksR0FBVSxJQUFRLE1BQU8sSUFDN0IsSUFBSSxHQUFJLE9BQU8sRUFDZixPQUFJLEdBQUksR0FBTSxFQUFpQixFQUFJLEVBQy9CLEVBQVMsRUFBSSxHQUFjLEVBQzNCLEVBQUksR0FBTSxFQUFZLEVBQUksRUFDdkIsR0FJUixTQUFVLFNBQWtCLEdBQzNCLEdBQXdCLGdCQUFiLEdBQ1YsS0FBTSxJQUFJLFlBQVcsNENBRXRCLE9BQU8sU0FBUSxJQUloQixTQUFVLFNBQWtCLEdBRTNCLE1BREEsTUFBSyx1QkFBdUIsR0FDckIsUUFBUSxJQUloQixjQUFlLFNBQXVCLEdBQ3JDLEdBQUksR0FBTSxLQUFLLFlBQVksRUFBVSxRQUNyQyxPQUFzQixnQkFBUixHQUFtQixFQUFNLEtBQUssU0FBUyxJQUl0RCxTQUFVLFNBQWtCLEdBQzNCLEdBQUksR0FBTSxLQUFLLFVBQVUsRUFDekIsT0FBSSxJQUFPLEVBQVksRUFDbkIsRUFBTSxpQkFBMkIsaUJBQzlCLEdBSVIsNEJBQTZCLFNBQXFDLEdBQ2pFLEdBQXdCLG9CQUFwQixNQUFNLEdBQ1QsS0FBTSxJQUFJLFlBQVcsbUJBRXRCLElBQWlCLE9BQWIsRUFBcUIsT0FBUSxDQUNqQyxJQUFJLEdBQUksS0FBSyxTQUFTLEVBQ3RCLE9BQUksTUFBSyxVQUFVLEtBQUssU0FBUyxHQUFJLEdBQW9CLE1BQXpELElBS0QsdUJBQXdCLElBQUkscUJBRzVCLFFBQVMsT0FBTyxTQUFXLFNBQWlCLEdBQzNDLE1BQTJCLG1CQUFwQixNQUFNLElBT2QsY0FBZSxTQUF1QixHQUNyQyxNQUEyQixrQkFBYixNQUE2QixFQUFTLFdBSXJELGFBQWMsbUJBQ1gsU0FBc0IsR0FDdkIsT0FBSSxZQUFZLElBR1QsY0FBYyxJQUVwQixTQUFzQixHQUFPLE9BQU8sR0FHdkMsVUFBVyxTQUFtQixHQUM3QixHQUF3QixnQkFBYixJQUF5QixPQUFPLEtBQWMsVUFBVSxHQUNsRSxPQUFPLENBRVIsSUFBSSxHQUFNLEtBQUssRUFDZixPQUFPLFFBQU8sS0FBUyxHQUl4QixjQUFlLFNBQXVCLEdBQ3JDLE1BQTJCLGdCQUFiLElBQTZDLGdCQUFiLElBSS9DLFNBQVUsU0FBa0IsR0FDM0IsSUFBSyxHQUFnQyxnQkFBYixHQUN2QixPQUFPLENBRVIsSUFBSSxXQUFZLENBQ2YsR0FBSSxHQUFXLEVBQVMsUUFBUSxNQUNoQyxRQUF3QixLQUFiLEVBQ1YsTUFBTyxLQUFJLFVBQVUsR0FHdkIsTUFBTyxrQkFBaUIsSUFPekIsY0FBZSxTQUF1QixFQUFHLEdBQ3hDLE1BQVEsS0FBTSxHQUFPLE9BQU8sSUFBTSxPQUFPLElBVTFDLEtBQU0sU0FBYyxFQUFHLEdBRXRCLElBQUssS0FBSyxjQUFjLEdBQ3ZCLEtBQU0sSUFBSSxZQUFXLGlEQU90QixPQUhRLE1BQUssU0FBUyxHQUdiLElBWVYsVUFBVyxTQUFtQixFQUFHLEdBRWhDLElBQUssS0FBSyxjQUFjLEdBQ3ZCLEtBQU0sSUFBSSxZQUFXLGlEQUl0QixJQUFJLEdBQU8sS0FBSyxLQUFLLEVBQUcsRUFHeEIsSUFBWSxNQUFSLEVBQUosQ0FLQSxJQUFLLEtBQUssV0FBVyxHQUNwQixLQUFNLElBQUksWUFBVyxFQUFJLG9CQUkxQixPQUFPLEtBU1IsSUFBSyxTQUFhLEVBQUcsR0FFcEIsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsMENBR3RCLEtBQUssS0FBSyxjQUFjLEdBQ3ZCLEtBQU0sSUFBSSxZQUFXLHVEQUF5RCxRQUFRLEdBR3ZGLE9BQU8sR0FBRSxJQUdWLEtBQU0sU0FBYyxHQUNuQixNQUFpQixnQkFBTixHQUNILFNBRUQsSUFBSSxLQUFLLElBSWpCLG1CQUFvQixTQUE0QixFQUFHLEdBQ2xELEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUV0QixJQUFJLEdBQUksRUFBRSxXQUNWLFFBQWlCLEtBQU4sRUFDVixNQUFPLEVBRVIsSUFBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsaUNBRXRCLElBQUksR0FBSSxZQUFjLFFBQVEsUUFBVSxFQUFFLFFBQVEsYUFBVyxFQUM3RCxJQUFTLE1BQUwsRUFDSCxNQUFPLEVBRVIsSUFBSSxLQUFLLGNBQWMsR0FDdEIsTUFBTyxFQUVSLE1BQU0sSUFBSSxZQUFXLHlCQUl0Qix1QkFBd0IsU0FBZ0MsR0FDdkQsT0FBb0IsS0FBVCxFQUNWLE1BQU8sRUFHUixjQUFhLEtBQU0sc0JBQXVCLE9BQVEsRUFFbEQsSUFBSSxLQW1CSixPQWxCSSxhQUFlLEtBQ2xCLEVBQUksTUFBUSxFQUFLLGNBRWQsZ0JBQWtCLEtBQ3JCLEVBQUksU0FBVyxFQUFLLGlCQUVqQixXQUFhLEtBQ2hCLEVBQUksSUFBTSxFQUFLLFlBRVosV0FBYSxLQUNoQixFQUFJLElBQU0sRUFBSyxZQUVaLGtCQUFvQixLQUN2QixFQUFJLFdBQWEsRUFBSyxtQkFFbkIsb0JBQXNCLEtBQ3pCLEVBQUksYUFBZSxFQUFLLHFCQUVsQixHQUlSLDJCQUE0QixTQUFvQyxHQXdCL0QsTUF2QkEsY0FBYSxLQUFNLHNCQUF1QixPQUFRLEdBRTlDLEtBQUssb0JBQW9CLElBQVMsS0FBSyxpQkFBaUIsSUFDdEQsSUFBSSxFQUFNLGVBQ2QsRUFBSyxpQkFBZSxJQUVoQixJQUFJLEVBQU0sa0JBQ2QsRUFBSyxpQkFBa0IsS0FHbkIsSUFBSSxFQUFNLGFBQ2QsRUFBSyxlQUFhLElBRWQsSUFBSSxFQUFNLGFBQ2QsRUFBSyxlQUFhLEtBR2YsSUFBSSxFQUFNLG9CQUNkLEVBQUssbUJBQW9CLEdBRXJCLElBQUksRUFBTSxzQkFDZCxFQUFLLHFCQUFzQixHQUVyQixHQUlSLElBQUssU0FBYSxFQUFHLEVBQUcsRUFBRyxHQUMxQixHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyxzQkFFdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsMkJBRXRCLElBQXlCLFlBQXJCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBCQUV0QixJQUFJLEVBRUgsTUFEQSxHQUFFLEdBQUssR0FDQSxDQUVQLEtBQ0MsRUFBRSxHQUFLLEVBQ04sTUFBTyxHQUNSLE9BQU8sSUFNVixlQUFnQixTQUF3QixFQUFHLEdBQzFDLEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLHNCQUV0QixLQUFLLEtBQUssY0FBYyxHQUN2QixLQUFNLElBQUksWUFBVywyQkFFdEIsT0FBTyxLQUFJLEVBQUcsSUFJZixZQUFhLFNBQXFCLEVBQUcsR0FDcEMsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsc0JBRXRCLEtBQUssS0FBSyxjQUFjLEdBQ3ZCLEtBQU0sSUFBSSxZQUFXLDJCQUV0QixPQUFPLEtBQUssSUFJYixtQkFBb0IsU0FBNEIsR0FDL0MsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsT0FBTyxDQUVSLElBQUksWUFBb0QsZ0JBQS9CLFNBQVEsbUJBQWlDLENBQ2pFLEdBQUksR0FBYSxLQUFLLElBQUksRUFBRyxPQUFPLG1CQUNwQyxRQUEwQixLQUFmLEVBQ1YsTUFBTyxNQUFLLFVBQVUsR0FHeEIsTUFBTyxNQUFLLFFBQVEsSUFJckIsT0FBUSxTQUFnQixFQUFHLEdBQzFCLElBQUssS0FBSyxjQUFjLEdBQ3ZCLEtBQU0sSUFBSSxZQUFXLDJCQUV0QixJQUFJLEdBQWdCLFdBQVcsVUFBVyxHQUN0QyxFQUFPLEtBQUssS0FBSyxFQUFHLEVBQ3hCLE9BQU8sTUFBSyxLQUFLLEVBQU0sRUFBRyxJQUkzQixZQUFhLFNBQXFCLEVBQUssR0FDdEMsR0FBSSxHQUFlLENBQ2YsV0FBVSxPQUFTLElBQ3RCLEVBQWUsa0JBQWtCLEtBQU0sR0FFeEMsSUFBSSxHQUFXLEtBQUssS0FBSyxFQUFjLEVBQ3ZDLElBQTRCLFdBQXhCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLGlDQUd0QixPQUFPLElBSVIsYUFBYyxTQUFzQixFQUFVLEdBQzdDLEdBQUksR0FBUyxLQUFLLE9BQU8sRUFBVSxPQUFRLFVBQVUsT0FBUyxNQUFVLEdBQ3hFLElBQTBCLFdBQXRCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLHNDQUV0QixPQUFPLElBSVIsaUJBQWtCLFNBQTBCLEdBQzNDLEdBQThCLFdBQTFCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLG1EQUV0QixPQUFPLE1BQUssVUFBVSxLQUFLLElBQUksRUFBWSxVQUk1QyxjQUFlLFNBQXVCLEdBQ3JDLEdBQThCLFdBQTFCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLG1EQUV0QixPQUFPLE1BQUssSUFBSSxFQUFZLFVBSTdCLGFBQWMsU0FBc0IsR0FDbkMsR0FBSSxHQUFTLEtBQUssYUFBYSxFQUUvQixRQUFnQixJQURMLEtBQUssaUJBQWlCLElBQ0YsR0FJaEMsY0FBZSxTQUF1QixFQUFVLEdBQy9DLEdBQTRCLFdBQXhCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLGlEQUV0QixLQUFLLEtBQUssV0FBVyxHQUNwQixLQUFNLElBQUksWUFBVyxzRUFFdEIsSUFBSSxHQUFrQixFQUVsQixFQUFpQixLQUFLLFVBQVUsRUFBVSxTQUU5QyxRQUE4QixLQUFuQixFQUNWLE1BQU8sSUFHUixJQUFJLEVBQ0osS0FDQyxHQUFJLEdBQWMsS0FBSyxLQUFLLEVBQWdCLE1BQzNDLE1BQU8sR0FRUixLQUpBLEdBQW1CLElBQ25CLEVBQWtCLEtBR1osRUFLUCxHQUhBLEVBQW1CLElBQ25CLEVBQWtCLEtBRWEsV0FBM0IsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcseUNBR3RCLE9BQU8sSUFJUix1QkFBd0IsU0FBZ0MsRUFBTyxHQUM5RCxHQUF3QixZQUFwQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyw4Q0FFdEIsUUFDQyxNQUFPLEVBQ1AsS0FBTSxJQUtSLFdBQVksU0FBb0IsRUFBRyxHQUNsQyxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyxzQkFFdEIsSUFBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcscUJBRXRCLElBQUksR0FBTyxLQUFLLElBQUksRUFBRyxPQUN2QixJQUFJLEtBQUssV0FBVyxHQUFPLENBQzFCLEdBQUksR0FBUyxLQUFLLEtBQUssRUFBTSxHQUFJLEdBQ2pDLElBQWUsT0FBWCxHQUF5QyxXQUF0QixLQUFLLEtBQUssR0FDaEMsTUFBTyxFQUVSLE1BQU0sSUFBSSxZQUFXLGlEQUV0QixNQUFPLFdBQVUsRUFBRyxJQUlyQixtQkFBb0IsU0FBNEIsRUFBZSxHQUM5RCxJQUFLLEtBQUssVUFBVSxJQUFXLEVBQVMsRUFDdkMsS0FBTSxJQUFJLFlBQVcsbURBRXRCLElBQ0ksR0FEQSxFQUFpQixJQUFYLEVBQWUsRUFBSSxDQWlCN0IsSUFmYyxLQUFLLFFBQVEsS0FFMUIsRUFBSSxLQUFLLElBQUksRUFBZSxlQU1QLFdBQWpCLEtBQUssS0FBSyxJQUFtQixZQUFjLFFBQVEsU0FFNUMsUUFEVixFQUFJLEtBQUssSUFBSSxFQUFHLFFBQVEsWUFFdkIsTUFBSSxTQUlVLEtBQU4sRUFDVixNQUFPLFFBQU8sRUFFZixLQUFLLEtBQUssY0FBYyxHQUN2QixLQUFNLElBQUksWUFBVywwQkFFdEIsT0FBTyxJQUFJLEdBQUUsSUFHZCxtQkFBb0IsU0FBNEIsRUFBRyxFQUFHLEdBQ3JELEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUV0QixLQUFLLEtBQUssY0FBYyxHQUN2QixLQUFNLElBQUksWUFBVyxpREFFdEIsSUFBSSxHQUFVLE1BQU0sRUFBRyxHQUNuQixFQUFhLEdBQVcsS0FBSyxhQUFhLEVBRTlDLFNBRGdCLEtBQWEsRUFBUSxXQUFhLEVBQVEsZ0JBQ3hDLElBR1gsa0JBQWtCLEtBQU0sRUFBRyxHQUNqQyxvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLFlBQWEsRUFDYixnQkFBZ0IsS0FLbEIsMEJBQTJCLFNBQW1DLEVBQUcsRUFBRyxHQUNuRSxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywwQ0FFdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsaURBRXRCLElBQUksR0FBVSxLQUFLLG1CQUFtQixFQUFHLEVBQUcsRUFDNUMsS0FBSyxFQUNKLEtBQU0sSUFBSSxZQUFXLGlDQUV0QixPQUFPLElBSVIsYUFBYyxTQUFzQixFQUFPLEdBQzFDLEdBQWMsT0FBVixHQUF1QyxXQUFyQixLQUFLLEtBQUssR0FDL0IsS0FBTSxJQUFJLFlBQVcsb0RBR3RCLEtBRFksVUFBVSxPQUFTLEtBQVMsR0FDOUIsT0FBUyxFQUNsQixLQUFNLElBQUksY0FBYSxrREFHeEIsSUFBYyxPQUFWLElBQW1CLGNBQ3RCLEtBQU0sSUFBSSxjQUFhLGtFQUd4QixPQUFPLGVBQWMsSUFJdEIsbUJBQW9CLFNBQTRCLEVBQUcsRUFBTyxHQUN6RCxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyxxQkFFdEIsS0FBSyxLQUFLLFVBQVUsSUFBVSxFQUFRLEdBQUssRUFBUSxpQkFDbEQsS0FBTSxJQUFJLFlBQVcsZ0VBRXRCLElBQTJCLFlBQXZCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDhDQUV0QixLQUFLLEVBQ0osTUFBTyxHQUFRLENBR2hCLElBQUssRUFBUSxHQURBLEVBQUUsT0FFZCxNQUFPLEdBQVEsQ0FHaEIsSUFBSSxHQUFRLFlBQVksRUFBRyxFQUMzQixJQUFJLEVBQVEsT0FBVSxFQUFRLE1BQzdCLE1BQU8sR0FBUSxDQUdoQixJQUFJLEdBQVMsWUFBWSxFQUFHLEVBQVEsRUFDcEMsT0FBSSxHQUFTLE9BQVUsRUFBUyxNQUN4QixFQUFRLEVBR1QsRUFBUSxHQUloQixxQkFBc0IsU0FBOEIsRUFBRyxFQUFHLEdBQ3pELEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUd0QixLQUFLLEtBQUssY0FBYyxHQUN2QixLQUFNLElBQUksWUFBVyxpREFTdEIsT0FBTyxtQkFBa0IsS0FBTSxFQUFHLEdBTGpDLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsWUFBYSxFQUNiLGdCQUFnQixLQU1sQixzQkFBdUIsU0FBK0IsRUFBRyxFQUFHLEdBQzNELEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUd0QixLQUFLLEtBQUssY0FBYyxHQUN2QixLQUFNLElBQUksWUFBVyxpREFHdEIsSUFBSSxHQUFPLHFCQUFxQixLQUFNLEdBQVEsRUFBTyxLQUFLLHFCQUFxQixFQUMvRSxLQUFLLHFCQUFxQixLQUFNLEdBQy9CLEtBQU0sSUFBSSxZQUFXLDREQUd0QixPQUFPLG1CQUFrQixLQUFNLEVBQUcsRUFBRyxJQUl0QyxzQkFBdUIsU0FBK0IsRUFBRyxHQUN4RCxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywwQ0FHdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsaURBR3RCLElBQUksU0FBaUIsR0FBRSxFQUN2QixLQUFLLEVBQ0osS0FBTSxJQUFJLFdBQVUscUNBRXJCLE9BQU8sSUFJUixtQkFBb0IsU0FBNEIsR0FDL0MsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsMENBR3RCLE9BQU8sTUFBSyxJQUliLGdCQUFpQixTQUF5QixHQUN6QyxNQUF5QixXQUFyQixLQUFLLEtBQUssR0FDTixFQUdELGVBQWUsSUFJdkIsaUJBQWtCLFNBQTBCLEdBQzNDLE1BQXlCLFlBQXJCLEtBQUssS0FBSyxHQUNOLEVBR0QsZ0JBQWdCLElBSXhCLGdCQUFpQixTQUF5QixHQUN6QyxNQUF5QixXQUFyQixLQUFLLEtBQUssR0FDTixFQUdELGVBQWUsSUFJdkIsY0FBZSxTQUF1QixHQUNyQyxNQUFPLGNBQWEsSUFJckIsa0JBQW1CLFNBQTJCLEVBQUcsR0FDaEQsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsMENBRXRCLElBQWMsV0FBVixHQUFnQyxXQUFWLEVBQ3pCLEtBQU0sSUFBSSxZQUFXLDZEQUV0QixLQUFLLG1CQUNKLEtBQU0sSUFBSSxjQUFhLHVFQUd4QixLQURhLG1CQUFtQixHQUUvQixPQUFPLENBRVIsS0FBSyxNQUNKLEtBQU0sSUFBSSxjQUFhLHlFQUV4QixJQUFJLEdBQVUsTUFBTSxHQUNoQixFQUFLLElBbUJULE9BbEJjLFdBQVYsRUFDSCxRQUFRLEVBQVMsU0FBVSxHQUMxQixFQUFHLHNCQUFzQixFQUFHLEdBQUssY0FBYyxNQUU1QixXQUFWLEdBQ1YsUUFBUSxFQUFTLFNBQVUsR0FDMUIsR0FBSSxHQUFjLE1BQU0sRUFBRyxFQUMzQixRQUEyQixLQUFoQixFQUE2QixDQUN2QyxHQUFJLEVBRUgsR0FERyxFQUFHLHFCQUFxQixFQUFHLHFCQUFxQixLQUMxQyxjQUFjLElBRWQsY0FBYyxFQUFPLFVBQVUsR0FFekMsRUFBRyxzQkFBc0IsRUFBRyxFQUFHLE9BSTNCLEdBSVIsbUJBQW9CLFNBQTRCLEVBQUcsR0FDbEQsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsMENBRXRCLElBQWMsV0FBVixHQUFnQyxXQUFWLEVBQ3pCLEtBQU0sSUFBSSxZQUFXLDZEQUd0QixJQURhLEtBQUssYUFBYSxHQUU5QixPQUFPLENBRVIsSUFBSSxHQUFVLE1BQU0sR0FDaEIsRUFBSyxJQUNULE9BQTBCLEtBQW5CLEVBQVEsUUFBZ0IsTUFBTSxFQUFTLFNBQVUsR0FDdkQsR0FBSSxHQUFjLE1BQU0sRUFBRyxFQUMzQixRQUEyQixLQUFoQixFQUE2QixDQUN2QyxHQUFJLEVBQVksYUFDZixPQUFPLENBRVIsSUFBYyxXQUFWLEdBQXNCLEVBQUcsaUJBQWlCLEVBQUcscUJBQXFCLEtBQWlCLEVBQVksU0FDbEcsT0FBTyxFQUdULE9BQU8sS0FLVCxvQkFBcUIsU0FBNkIsRUFBRyxHQUNwRCxJQUEyQixJQUF2QixLQUFLLFdBQVcsR0FDbkIsT0FBTyxDQUVSLElBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLE9BQU8sQ0FFUixJQUFJLEdBQUksS0FBSyxJQUFJLEVBQUcsWUFDcEIsSUFBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsOEVBRXRCLE9BQU8sYUFBYSxJQUlyQixvQkFBcUIsU0FBNkIsRUFBRyxHQUNwRCxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywwQ0FFdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsNkNBRXRCLE9BQU8sS0FBSyxJQUliLG1CQUFvQixTQUE0QixFQUFHLEdBQ2xELEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUV0QixJQUFJLEdBQWdCLFlBQWMsUUFBUSxZQUFjLEtBQUssVUFBVSxFQUFHLFFBQVEsaUJBQWUsRUFDakcsUUFBNkIsS0FBbEIsRUFDVixNQUFPLE1BQUssVUFBVSxLQUFLLEtBQUssRUFBZSxHQUFJLElBRXBELEtBQUssS0FBSyxXQUFXLEdBQ3BCLEtBQU0sSUFBSSxZQUFXLHNCQUV0QixPQUFPLE1BQUssb0JBQW9CLEVBQUcsSUFJcEMsVUFBVyxTQUFtQixHQUM3QixHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixPQUFPLENBRVIsS0FBSyxhQUNKLE9BQU8sQ0FFUixLQUNDLGFBQWEsR0FDWixNQUFPLEdBQ1IsT0FBTyxFQUVSLE9BQU8sR0FJUiwrQkFBZ0MsU0FBb0MsRUFBRyxHQUN0RSxHQUFJLEdBQVEsS0FBSyxLQUFLLEdBQ2xCLEVBQVEsS0FBSyxLQUFLLEVBQ3RCLE9BQUksS0FBVSxFQUNOLElBQU0sRUFFTCxNQUFMLEdBQWtCLE1BQUwsSUFHSCxXQUFWLEdBQWdDLFdBQVYsRUFDbEIsS0FBSyxnQ0FBZ0MsRUFBRyxLQUFLLFNBQVMsSUFFaEQsV0FBVixHQUFnQyxXQUFWLEVBQ2xCLEtBQUssZ0NBQWdDLEtBQUssU0FBUyxHQUFJLEdBRWpELFlBQVYsRUFDSSxLQUFLLGdDQUFnQyxLQUFLLFNBQVMsR0FBSSxHQUVqRCxZQUFWLEVBQ0ksS0FBSyxnQ0FBZ0MsRUFBRyxLQUFLLFNBQVMsSUFFL0MsV0FBVixHQUFnQyxXQUFWLEdBQWdDLFdBQVYsR0FBaUMsV0FBVixFQUcxRCxXQUFWLElBQWlDLFdBQVYsR0FBZ0MsV0FBVixHQUFnQyxXQUFWLElBQy9ELEtBQUssZ0NBQWdDLEtBQUssWUFBWSxHQUFJLEdBSDFELEtBQUssZ0NBQWdDLEVBQUcsS0FBSyxZQUFZLE1BU2xFLG1DQUFvQyxTQUE0QyxFQUFHLEVBQUcsRUFBWSxFQUFNLEdBRXZHLEdBQUksR0FBUSxLQUFLLEtBQUssRUFDdEIsSUFBYyxjQUFWLEdBQW1DLFdBQVYsRUFDNUIsS0FBTSxJQUFJLFlBQVcscURBRXRCLElBQThCLFlBQTFCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLGlEQUV0QixLQUFLLHFCQUFxQixLQUFNLEdBQy9CLEtBQU0sSUFBSSxZQUFXLHVEQUV0QixJQUEyQixjQUF2QixLQUFLLEtBQUssS0FBNkIscUJBQXFCLEtBQU0sR0FDckUsS0FBTSxJQUFJLFlBQVcsd0VBRXRCLElBQWMsY0FBVixJQUEwQixLQUFLLGNBQWMsR0FDaEQsS0FBTSxJQUFJLFlBQVcsb0VBRXRCLElBQTJCLGNBQXZCLEtBQUssS0FBSyxHQUEwQixDQUN2QyxJQUFLLEVBQ0osT0FBTyxDQUVSLElBQUksS0FBSyxvQkFBb0IsSUFBUyxLQUFLLGlCQUFpQixHQUM3QyxjQUFWLEdBQ0gsa0JBQWtCLEtBQU0sRUFBRyxHQUMxQixtQkFBb0IsRUFBSyxvQkFDekIsaUJBQWtCLEVBQUssa0JBQ3ZCLFlBQWEsRUFBSyxhQUNsQixlQUFnQixFQUFLLHNCQUdqQixDQUNOLElBQUssS0FBSyxxQkFBcUIsR0FDOUIsS0FBTSxJQUFJLFlBQVcsdURBRXRCLElBQWMsY0FBVixFQUNILE1BQU8sbUJBQWtCLEtBQU0sRUFBRyxFQUFHLEdBR3ZDLE9BQU8sRUFFUixHQUFJLEtBQUssb0JBQW9CLE1BQVcsb0JBQXNCLE9BQVcsa0JBQW9CLElBQzVGLE9BQU8sQ0FFUixJQUFJLHlCQUF5QixLQUFNLEVBQU0sR0FDeEMsT0FBTyxDQUdSLEtBQUssRUFBUSxvQkFBcUIsQ0FDakMsR0FBSSxFQUFLLG9CQUNSLE9BQU8sQ0FFUixJQUFJLGtCQUFvQixLQUFTLEVBQUsscUJBQXdCLEVBQVEsa0JBQ3JFLE9BQU8sRUFHVCxHQUFJLEtBQUssb0JBQW9CLFFBRXRCLElBQUksS0FBSyxpQkFBaUIsS0FBYSxLQUFLLGlCQUFpQixHQUFPLENBQzFFLElBQUssRUFBUSxvQkFDWixPQUFPLENBRUosTUFBSyxpQkFBaUIsR0FDWCxjQUFWLEdBQ0gsa0JBQWtCLEtBQU0sRUFBRyxHQUMxQixtQkFBb0IsRUFBUSxvQkFDNUIsaUJBQWtCLEVBQVEsa0JBQzFCLGNBQVcsS0FHTyxjQUFWLEdBQ1Ysa0JBQWtCLEtBQU0sRUFBRyxHQUMxQixtQkFBb0IsRUFBUSxvQkFDNUIsaUJBQWtCLEVBQVEsa0JBQzFCLGdCQUFhLFNBR1QsSUFBSSxLQUFLLGlCQUFpQixJQUFZLEtBQUssaUJBQWlCLElBQ2xFLElBQUssRUFBUSxzQkFBd0IsRUFBUSxnQkFDNUMsUUFBSSxnQkFBa0IsSUFBUSxFQUFLLG9CQUcvQixhQUFlLEtBQVMsS0FBSyxVQUFVLEVBQUssYUFBYyxFQUFRLG1CQUtqRSxDQUFBLElBQUksS0FBSyxxQkFBcUIsS0FBWSxLQUFLLHFCQUFxQixHQVcxRSxLQUFNLElBQUksWUFBVyxzR0FWckIsS0FBSyxFQUFRLG9CQUNaLFFBQUksV0FBYSxLQUFTLEtBQUssVUFBVSxFQUFLLFdBQVksRUFBUSxnQkFHOUQsV0FBYSxLQUFTLEtBQUssVUFBVSxFQUFLLFdBQVksRUFBUSxhQVFwRSxNQUFjLGNBQVYsR0FDSSxrQkFBa0IsS0FBTSxFQUFHLEVBQUcsSUFNdkMsMEJBQTJCLFNBQW1DLEVBQUcsRUFBRyxHQUNuRSxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyx3Q0FFdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsNkNBRXRCLEtBQUsscUJBQXFCLEtBQU0sR0FDL0IsS0FBTSxJQUFJLFlBQVcsdURBRXRCLElBQUksR0FBTyxNQUFNLEVBQUcsR0FDaEIsRUFBVSxHQUFRLEtBQUsscUJBQXFCLEdBQzVDLEVBQWEsS0FBSyxhQUFhLEVBQ25DLE9BQU8sTUFBSyxtQ0FBbUMsRUFBRyxFQUFHLEVBQVksRUFBTSxJQUl4RSx1QkFBd0IsU0FBZ0MsRUFBRyxHQUMxRCxHQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyx3Q0FFdEIsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsNkNBRXRCLElBQUssSUFBSSxFQUFHLEdBQVosQ0FHQSxJQUFLLE1BQU8sQ0FFWCxHQUFJLEdBQWMsS0FBSyxRQUFRLElBQVksV0FBTixFQUNqQyxFQUFpQixLQUFLLFNBQVMsSUFBWSxjQUFOLENBQ3pDLFFBQ0MscUJBQXNCLEdBQWUsR0FDckMsaUJBQWtCLGNBQWMsRUFBRyxHQUNuQyxZQUFhLEVBQUUsR0FDZixnQkFBZ0IsR0FHbEIsTUFBTyxNQUFLLHFCQUFxQixNQUFNLEVBQUcsTUFJM0MsWUFBYSxTQUFxQixHQUNqQyxJQUFLLEtBQUssVUFBVSxJQUFXLEVBQVMsRUFDdkMsS0FBTSxJQUFJLFlBQVcsNERBRXRCLElBQUksRUFBUyxpQkFDWixLQUFNLElBQUksYUFBWSxxQ0FFdkIsSUFBSSxHQUFRLFVBQVUsT0FBUyxFQUFJLFVBQVUsR0FBSyxnQkFDOUMsSUFDSixJQUFJLElBQVUsZ0JBQWlCLENBQzlCLElBQUssVUFDSixLQUFNLElBQUksY0FBYSxtSkFFeEIsV0FBVSxFQUFHLEdBYWQsTUFYZSxLQUFYLElBQ0gsRUFBRSxPQUFTLEdBVUwsR0FJUixlQUFnQixTQUF3QixFQUFHLEdBQzFDLElBQUssS0FBSyxRQUFRLEdBQ2pCLEtBQU0sSUFBSSxZQUFXLHVDQUV0QixLQUFLLHFCQUFxQixLQUFNLEdBQy9CLEtBQU0sSUFBSSxZQUFXLHVEQUV0QixNQUFNLGFBQWUsSUFDcEIsTUFBTyxNQUFLLDBCQUEwQixFQUFHLFNBQVUsRUFFcEQsSUFBSSxHQUFhLFVBQVcsR0FDeEIsRUFBUyxLQUFLLFNBQVMsRUFBSyxhQUVoQyxJQUFJLElBRFksS0FBSyxTQUFTLEVBQUssY0FFbEMsS0FBTSxJQUFJLGFBQVksdUJBRXZCLEdBQVcsYUFBZSxDQUMxQixJQUFJLEdBQWEsS0FBSyx1QkFBdUIsRUFBRyxTQUNoRCxLQUFLLEtBQUssaUJBQWlCLEdBQzFCLEtBQU0sSUFBSSxZQUFXLG1FQUV0QixJQUFJLEdBQVMsRUFBVyxZQUN4QixJQUFJLEdBQVUsRUFDYixNQUFPLE1BQUssMEJBQTBCLEVBQUcsU0FBVSxFQUVwRCxLQUFLLEVBQVcsZ0JBQ2YsT0FBTyxDQUVSLElBQUksRUFRSixJQVBNLGdCQUFrQixLQUFlLEVBQVcsaUJBR2pELEdBQWMsRUFDZCxFQUFXLGlCQUFrQixHQUg3QixHQUFjLEdBS0MsS0FBSywwQkFBMEIsRUFBRyxTQUFVLEdBRTNELE9BQU8sQ0FFUixNQUFPLEVBQVMsR0FBUSxDQUN2QixHQUFVLENBRVYsV0FENkIsR0FBRSxLQUFLLFNBQVMsTUFFNUMsRUFBVyxhQUFlLEVBQVMsR0FDOUIsR0FHSixNQUZBLEdBQVcsaUJBQWtCLEVBQzdCLEtBQUssMEJBQTBCLEVBQUcsU0FBVSxJQUNyQyxFQUlWLFFBQUssR0FDRyxLQUFLLDBCQUEwQixFQUFHLFVBQVksZ0JBQWdCLEtBTXZFLFdBQVksU0FBb0IsRUFBUSxFQUFLLEVBQVcsR0FDdkQsR0FBdUIsV0FBbkIsS0FBSyxLQUFLLElBQThDLFdBQXpCLEtBQUssS0FBSyxHQUM1QyxLQUFNLElBQUksWUFBVywwREFFdEIsSUFBSSxHQUFNLEtBQUssdUJBQXVCLEdBQ2xDLEVBQUksS0FBSyxTQUFTLEdBQ2xCLEVBQUssSUFBTSxDQUNmLElBQWtCLEtBQWQsRUFBa0IsQ0FDckIsR0FBSSxHQUFJLEtBQUssU0FBUyxFQUV0QixJQUFNLElBQVMsRUFBWSxLQURaLFNBQVMsRUFBRyxRQUFTLFVBQ2UsSUFFcEQsTUFBTyxHQUFLLElBQU0sRUFBSSxLQUFPLEVBQU0sS0FJcEMsbUJBQW9CLFNBQTRCLEVBQUcsR0FDbEQsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsMENBRXRCLElBQWEsV0FBVCxFQUNILE1BQU8sYUFBYyxNQUFRLE1BQU0sS0FFcEMsSUFBYSxXQUFULEVBQ0gsTUFBSyxPQUdFLE1BQU0sR0FGTCxLQUFLLEVBSWQsTUFBTSxJQUFJLFlBQVcsOERBSXRCLHdCQUF5QixTQUFpQyxHQUN6RCxHQUF1QixXQUFuQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywyQ0FFdEIsT0FBTyxpQkFBZ0IsSUFLeEIsZ0JBQWlCLFNBQXlCLEVBQVMsRUFBSyxFQUFVLEVBQVUsR0FDM0UsR0FBMkIsV0FBdkIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsK0NBRXRCLElBQUksR0FBYyxFQUFRLE1BRTFCLElBQXVCLFdBQW5CLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDJDQUV0QixJQUFJLEdBQWUsRUFBSSxNQUV2QixLQUFLLEtBQUssVUFBVSxJQUFhLEVBQVcsR0FBSyxFQUFXLEVBQzNELEtBQU0sSUFBSSxZQUFXLHFIQUF1SCxRQUFRLEdBR3JKLElBQUksR0FBSyxLQUNMLEVBQWlCLFNBQVUsRUFBUyxFQUFPLEdBQU8sTUFBNEIsV0FBckIsRUFBRyxLQUFLLE1BQTJCLElBQVMsSUFDekcsS0FBSyxLQUFLLFFBQVEsS0FBYyxNQUFNLEVBQVUsR0FDL0MsS0FBTSxJQUFJLFlBQVcsK0RBQWlFLFFBQVEsR0FHL0YsSUFBK0IsV0FBM0IsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsbURBT3RCLEtBQUssR0FKRCxHQUFVLEVBQVcsRUFDckIsRUFBSSxFQUFTLE9BRWIsRUFBUyxHQUNKLEVBQUksRUFBRyxFQUFJLEVBQVksT0FBUSxHQUFLLEVBQUcsQ0FFL0MsR0FBSSxHQUFVLEVBQVksR0FDdEIsRUFBVSxFQUFJLEdBQU0sRUFBWSxPQUNoQyxFQUFjLEVBQUksR0FBTSxFQUFZLE1BQ3hDLElBQWdCLE1BQVosR0FBb0IsRUFtQ3ZCLEdBQVUsRUFBWSxPQW5DUyxDQUMvQixHQUFJLEdBQU8sRUFBWSxFQUFJLEVBQzNCLElBQWEsTUFBVCxFQUNILEdBQVUsSUFDVixHQUFLLE1BQ0MsSUFBYSxNQUFULEVBQ1YsR0FBVSxFQUNWLEdBQUssTUFDQyxJQUFhLE1BQVQsRUFDVixHQUF1QixJQUFiLEVBQWlCLEdBQUssU0FBUyxFQUFLLEVBQUcsRUFBVyxHQUM1RCxHQUFLLE1BQ0MsSUFBYSxNQUFULEVBQ1YsR0FBVSxHQUFXLEVBQWUsR0FBSyxTQUFTLEVBQUssR0FDdkQsR0FBSyxNQUNDLENBQ04sR0FBSSxHQUFXLEVBQWEsS0FBTyxFQUFZLEVBQUksRUFDbkQsS0FBSSxRQUFRLElBQWtCLE1BQVQsSUFBaUIsR0FBZSxRQUFRLEdBTXRELEdBQUksUUFBUSxLQUFVLEdBQWMsUUFBUSxJQUFZLENBRTlELEdBQUksR0FBSyxFQUFPLEVBQ1osRUFBTSxhQUFhLEVBQUksSUFBTSxDQUVqQyxJQUFXLEdBQU0sR0FBa0MsY0FBN0IsS0FBSyxLQUFLLEVBQVMsSUFBeUIsR0FBSyxFQUFTLEdBQ2hGLEdBQUssTUFFTCxJQUFVLFFBZDhELENBRXhFLEdBQUksR0FBSSxhQUFhLEVBQU0sR0FFM0IsSUFBVyxHQUFLLEdBQW9DLGNBQS9CLEtBQUssS0FBSyxFQUFTLEVBQUksSUFBdUIsR0FBSyxFQUFTLEVBQUksR0FDckYsR0FBSyxLQWlCVCxNQUFPLElBSVIsYUFBYyxTQUFzQixHQUNuQyxHQUFzQixXQUFsQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywwQ0FFdEIsT0FBSSxRQUFPLEdBQ0gsZUFFRCxNQUFNLElBSWQsd0JBQXlCLFNBQWlDLEdBQ3pELEdBQUksR0FBZSxVQUFVLE9BQVMsRUFDbkMsVUFBVSxJQUNULFlBQWEsT0FBUSxVQUFXLFNBQVUsU0FBVSxTQUFVLFNBRWxFLElBQXVCLFdBQW5CLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDRDQUV0QixLQUFLLEtBQUssUUFBUSxHQUNqQixLQUFNLElBQUksWUFBVyxrRUFLdEIsS0FIQSxHQUFJLEdBQU0sS0FBSyxTQUFTLEtBQUssSUFBSSxFQUFLLFdBQ2xDLEtBQ0EsRUFBUSxFQUNMLEVBQVEsR0FBSyxDQUNuQixHQUFJLEdBQVksS0FBSyxTQUFTLEdBQzFCLEVBQU8sS0FBSyxJQUFJLEVBQUssR0FDckIsRUFBVyxLQUFLLEtBQUssRUFDekIsSUFBSSxTQUFTLEVBQWMsR0FBWSxFQUN0QyxLQUFNLElBQUksWUFBVyxhQUFlLEVBQVcsOEJBRWhELE9BQU0sRUFBTSxHQUNaLEdBQVMsRUFFVixNQUFPLElBSVIsNEJBQTZCLFNBQXFDLEVBQWEsR0FDOUUsR0FBSSxHQUFZLGFBQWEsRUFDN0IsS0FBSyxLQUFLLGNBQWMsR0FDdkIsS0FBTSxJQUFJLFlBQVcsd0RBRXRCLElBQUksR0FBUSxLQUFLLElBQUksRUFBYSxZQUNsQyxJQUF5QixXQUFyQixLQUFLLEtBQUssR0FBcUIsQ0FDbEMsS0FBTSxZQUF1QixZQUU1QixLQUFNLElBQUksWUFBVyxtREFFdEIsR0FBUSxFQUVULE1BQU8sSUFJUixnQkFBaUIsU0FBeUIsRUFBRyxHQUM1QyxHQUFpQixrQkFBTixHQUNWLEtBQU0sSUFBSSxZQUFXLDJDQUV0QixLQUFLLEtBQUssYUFBYSxJQUFNLElBQUksRUFBRyxRQUNuQyxLQUFNLElBQUksWUFBVyxvRkFFdEIsSUFBSSxHQUFXLEtBQUssS0FBSyxFQUN6QixJQUFpQixXQUFiLEdBQXNDLFdBQWIsRUFDNUIsS0FBTSxJQUFJLFlBQVcsd0RBRXRCLElBQWlCLFdBQWIsRUFBdUIsQ0FDMUIsR0FBSSxHQUFjLHFCQUFxQixFQUV2QyxPQUE4QixLQUFoQixFQUE4QixHQUFLLElBQU0sRUFBYyxJQUV0RSxHQUFJLFVBQVUsT0FBUyxFQUFHLENBR3pCLEVBRmEsVUFBVSxHQUVQLElBQU0sRUFFdkIsTUFBTyxNQUFLLHNCQUFzQixFQUFHLFFBQ3BDLFlBQWEsRUFDYixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixhQUtoQixLQUFJLHFCQUVYLE9BQU8sUUFBVTs7O0FDdjdDakIsWUFFQSxJQUFJLFFBQVMsUUFBUSxZQUNqQixhQUFlLFFBQVEsa0JBQ3ZCLE9BQVMsUUFBUSxvQkFDakIsVUFBWSxRQUFRLHNCQUVwQixVQUFZLFFBQVEsdUJBQ3BCLGtCQUFvQixRQUFRLCtCQUU1QixXQUFhLGFBQWEsZUFDMUIsV0FBYSxVQUFVLHdCQUN2QixVQUFZLFFBQVEsc0JBRXBCLE9BQVMsT0FBTyxVQUFXLFNBRTlCLG1CQUFvQixTQUE0QixFQUFHLEdBQ2xELEdBQWlCLGdCQUFOLFVBQXlCLFVBQWEsR0FDaEQsS0FBTSxJQUFJLFdBQVUsc0VBRXJCLE9BQU8sTUFBSyxVQUFVLEVBQUcsSUFJMUIsb0JBQXFCLFNBQTZCLEdBQ2pELEdBQUksR0FBZ0Isa0JBQWtCLEtBQU0sRUFDNUMsUUFBNkIsS0FBbEIsRUFBK0IsQ0FJekMsSUFIQSxHQUFJLEdBQVcsS0FBSyxZQUFZLEVBQU8sR0FDbkMsS0FDQSxHQUFPLEVBQ0osR0FFTixHQURBLEVBQU8sS0FBSyxhQUFhLEdBQ2YsQ0FDVCxHQUFJLEdBQVksS0FBSyxjQUFjLEVBQ25DLFlBQVcsRUFBUSxHQUdyQixNQUFPLEdBR1IsTUFBTyxNQUFLLFNBQVMsSUFJdEIsdUJBQXdCLFNBQVUsR0FDakMsR0FBcUIsV0FBakIsS0FBSyxLQUFLLEdBQ2IsS0FBTSxJQUFJLFlBQVcsd0NBRXRCLEtBQUssVUFDSixLQUFNLElBQUksWUFBVyx5REFFdEIsT0FBTyxXQUFVLElBSWxCLHVCQUF3QixTQUFVLEVBQUcsR0FDcEMsR0FBcUIsV0FBakIsS0FBSyxLQUFLLElBQW9DLFNBQWpCLEtBQUssS0FBSyxHQUMxQyxLQUFNLElBQUksWUFBVyw2Q0FZdEIsS0FDQyxVQUFVLEVBQUcsR0FDWixNQUFPLEdBQ1IsT0FBTyxFQUVSLE1BQU8sTUFBSyx1QkFBdUIsS0FBTyxJQXVCNUMsUUFBTyxRQUFVOzs7QUNqR2pCLFlBRUEsSUFBSSxjQUFlLFFBQVEsa0JBRXZCLE9BQVMsUUFBUSxZQUNqQixPQUFTLFFBQVEsb0JBQ2pCLFFBQVUsUUFBUSxxQkFDbEIsU0FBVyxRQUFRLHNCQUVuQixXQUFhLGFBQWEsZUFDMUIsVUFBWSxRQUFRLHVCQUNwQixjQUFnQixVQUFVLHlDQUMxQixXQUFhLFNBQVMsTUFBTSxhQUFhLDJCQUN6QyxXQUFhLFVBQVUsd0JBRXZCLE9BQVMsT0FBTyxVQUFXLFNBQzlCLFFBQVMsU0FBaUIsR0FDekIsT0FBcUIsS0FBVixFQUNWLE1BQU8sRUFFUixJQUFJLEdBQWUsS0FBSyxVQUFVLEVBQ2xDLElBQUksRUFBZSxFQUNsQixLQUFNLElBQUksWUFBVyxxQkFFdEIsSUFBSSxHQUFRLEtBQUssU0FBUyxFQUMxQixLQUFLLEtBQUssY0FBYyxFQUFjLEdBQ3JDLEtBQU0sSUFBSSxZQUFXLHVDQUV0QixPQUFPLElBSVIsd0JBQXlCLFNBQWlDLEVBQUcsR0FDNUQsR0FBSSxHQUFPLE9BQU8sbUJBQW1CLEVBQ3JDLElBQWEsUUFBVCxFQUNILE1BQU8sRUFFUixJQUFhLFVBQVQsR0FBNkIsY0FBVCxFQUFzQixDQUM3QyxHQUFJLEtBUUosT0FQQSxTQUFRLEVBQU0sU0FBVSxHQUNuQixjQUFjLEVBQUcsSUFDcEIsV0FBVyxHQUNELFVBQVQsRUFBbUIsRUFBRSxJQUFRLEVBQUssRUFBRSxRQUloQyxFQUVSLEtBQU0sSUFBSSxZQUFXLG1FQUFxRSxJQUkzRixlQUFnQixTQUF3QixFQUFPLEdBSTlDLElBSEEsR0FBSSxHQUFXLEtBQUssWUFBWSxFQUFPLEdBQ25DLEtBQ0EsR0FBTyxFQUNKLEdBRU4sR0FEQSxFQUFPLEtBQUssYUFBYSxHQUNmLENBQ1QsR0FBSSxHQUFZLEtBQUssY0FBYyxFQUNuQyxZQUFXLEVBQVEsR0FHckIsTUFBTyxZQUlGLFFBQU8seUJBQ1AsUUFBTyxvQkFFZCxPQUFPLFFBQVU7OztBQ3RFakIsWUFFQSxJQUFJLGNBQWUsUUFBUSxrQkFFdkIsS0FBTyxRQUFRLGVBQ2YsUUFBVSxRQUFRLGtCQUVsQixPQUFTLFFBQVEsWUFDakIsT0FBUyxRQUFRLG9CQUNqQixRQUFVLFFBQVEscUJBQ2xCLFNBQVcsUUFBUSxzQkFDbkIsTUFBUSxRQUFRLG1CQUNoQixXQUFhLFFBQVEsd0JBRXJCLFFBQVUsYUFBYSxZQUN2QixXQUFhLGFBQWEsZUFFMUIsVUFBWSxRQUFRLHVCQUNwQixZQUFjLFFBQVEseUJBQ3RCLE9BQVMsUUFBUSxtQkFFakIsZUFBaUIsVUFBVSw0QkFBNEIsR0FFdkQsVUFBWSxVQUFVLDBCQUN0QixTQUFXLFVBQVUsNEJBQ3JCLFVBQVksU0FFWixRQUFVLFlBQVksV0FFdEIsZ0JBQWtCLFVBQVUsbUJBQW1CLEdBRS9DLGNBQWdCLFVBQVUseUNBQzFCLFdBQWEsU0FBUyxNQUFNLGFBQWEsMkJBQ3pDLE1BQVEsZUFBaUIsYUFBYSxrQ0FBb0MsS0FFMUUsaUJBQW1CLFNBQTBCLEVBQUcsR0FDbkQsTUFBTyxXQUFVLEtBQU8sSUFBSyxHQUFTLEtBR25DLFVBQVksTUFBTyxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sT0FDdEQsUUFBVSxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sT0FFdkYsZ0JBQWtCLFNBQXlCLEVBQUksR0FDbEQsR0FBSSxHQUFVLEtBQUssRUFJbkIsT0FISSxRQUNILFdBQVcsRUFBUyxNQUFNLElBRXBCLEdBR0osT0FBUyxPQUFPLFVBQVcsU0FDOUIsMkJBQTRCLE9BQU8sd0JBR25DLGdCQUFpQixTQUF5QixHQUN6QyxJQUFLLGVBQ0osS0FBTSxJQUFJLGFBQVksa0dBRXZCLE9BQXlCLFdBQXJCLEtBQUssS0FBSyxHQUNOLEVBRUQsZUFBZSxJQUl2QixlQUFnQixTQUF3QixFQUFHLEdBQzFDLEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxXQUFVLHlDQUdyQixJQUFxQixXQUFqQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksV0FBVSx5Q0FHckIsT0FBTyxZQUFXLEVBQUcsSUF3QnRCLGVBQWdCLFNBQXdCLEdBQ3ZDLEdBQXFCLFdBQWpCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxXQUFVLHlDQUdyQixPQUFPLFNBQVEsSUFJaEIsbUJBQW9CLFNBQTRCLEVBQVEsRUFBUSxHQUMvRCxHQUEwQixXQUF0QixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksV0FBVSwrQ0FHckIsS0FBSyxLQUFLLFFBQVEsR0FDakIsS0FBTSxJQUFJLFdBQVUsb0VBRXJCLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFjLE9BQVEsR0FBSyxFQUM5QyxJQUFLLEtBQUssY0FBYyxFQUFjLElBQ3JDLEtBQU0sSUFBSSxXQUFVLG9FQUl0QixRQUFzQixLQUFYLEdBQXFDLE9BQVgsRUFDcEMsTUFBTyxFQUdSLElBQUksR0FBSyxLQUVMLEVBQVUsRUFBRyxTQUFTLEdBRXRCLEVBQWEsZ0JBQWdCLEVBQUksRUFzQnJDLE9BckJBLFNBQVEsRUFBWSxTQUFVLEdBQzdCLEdBQUksSUFBVyxDQUVmLFNBQVEsRUFBZSxTQUFVLElBQ0MsSUFBN0IsRUFBRyxVQUFVLEVBQUcsS0FDbkIsR0FBVyxJQUliLElBQUksR0FBYSxjQUFjLEVBQVMsSUFFckIsZ0JBQVgsSUFDSixHQUFXLEdBQ1gsRUFBRyxVQUFVLEVBQUcsU0FBUyxHQUU3QixLQUFpQixJQUFiLEdBQXNCLEVBQVksQ0FDckMsR0FBSSxHQUFZLEVBQUcsSUFBSSxFQUFTLEVBQ2hDLEdBQUcsbUJBQW1CLEVBQVEsRUFBUyxNQUlsQyxHQUlSLGVBQWdCLFNBQXdCLEVBQUcsR0FDMUMsSUFBSyxnQkFDSixLQUFNLElBQUksYUFBWSw4Q0FFdkIsT0FBTyxpQkFBZ0IsRUFBRyxJQUszQixnQkFBaUIsU0FBeUIsRUFBUyxFQUFLLEVBQVUsRUFBVSxFQUFlLEdBQzFGLEdBQTJCLFdBQXZCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLCtDQUV0QixJQUFJLEdBQWMsRUFBUSxNQUUxQixJQUF1QixXQUFuQixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVywyQ0FFdEIsSUFBSSxHQUFlLEVBQUksTUFFdkIsS0FBSyxLQUFLLFVBQVUsSUFBYSxFQUFXLEdBQUssRUFBVyxFQUMzRCxLQUFNLElBQUksWUFBVyxxSEFBdUgsUUFBUSxHQUdySixJQUFJLEdBQUssS0FDTCxFQUFpQixTQUFVLEVBQVMsRUFBTyxHQUFPLE1BQTRCLFdBQXJCLEVBQUcsS0FBSyxNQUEyQixJQUFTLElBQ3pHLEtBQUssS0FBSyxRQUFRLEtBQWMsTUFBTSxFQUFVLEdBQy9DLEtBQU0sSUFBSSxZQUFXLCtEQUFpRSxRQUFRLEdBRy9GLElBQStCLFdBQTNCLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLG1EQUd0QixJQUFJLEdBQVUsRUFBVyxFQUNyQixFQUFJLEVBQVMsTUFDZ0IsZUFBN0IsS0FBSyxLQUFLLEtBQ2IsRUFBZ0IsS0FBSyxTQUFTLEdBSS9CLEtBQUssR0FERCxHQUFTLEdBQ0osRUFBSSxFQUFHLEVBQUksRUFBWSxPQUFRLEdBQUssRUFBRyxDQUUvQyxHQUFJLEdBQVUsRUFBWSxHQUN0QixFQUFVLEVBQUksR0FBTSxFQUFZLE9BQ2hDLEVBQWMsRUFBSSxHQUFNLEVBQVksTUFDeEMsSUFBZ0IsTUFBWixHQUFvQixFQXFEdkIsR0FBVSxFQUFZLE9BckRTLENBQy9CLEdBQUksR0FBTyxFQUFZLEVBQUksRUFDM0IsSUFBYSxNQUFULEVBQ0gsR0FBVSxJQUNWLEdBQUssTUFDQyxJQUFhLE1BQVQsRUFDVixHQUFVLEVBQ1YsR0FBSyxNQUNDLElBQWEsTUFBVCxFQUNWLEdBQXVCLElBQWIsRUFBaUIsR0FBSyxVQUFVLEVBQUssRUFBRyxFQUFXLEdBQzdELEdBQUssTUFDQyxJQUFhLE1BQVQsRUFDVixHQUFVLEdBQVcsRUFBZSxHQUFLLFVBQVUsRUFBSyxHQUN4RCxHQUFLLE1BQ0MsQ0FDTixHQUFJLEdBQVcsRUFBYSxLQUFPLEVBQVksRUFBSSxFQUNuRCxLQUFJLFFBQVEsSUFBa0IsTUFBVCxJQUFpQixHQUFlLFFBQVEsR0FNdEQsR0FBSSxRQUFRLEtBQVUsR0FBYyxRQUFRLElBQVksQ0FFOUQsR0FBSSxHQUFLLEVBQU8sRUFDWixFQUFNLFVBQVUsRUFBSSxJQUFNLENBRTlCLElBQVcsR0FBTSxHQUFrQyxjQUE3QixLQUFLLEtBQUssRUFBUyxJQUF5QixHQUFLLEVBQVMsR0FDaEYsR0FBSyxNQUNDLElBQWEsTUFBVCxFQUVWLEdBQWlDLGNBQTdCLEtBQUssS0FBSyxHQUNiLEdBQVUsS0FDVixHQUFLLE1BQ0MsQ0FDTixHQUFJLEdBQVcsU0FBUyxFQUFhLElBQUssRUFFMUMsSUFBSSxHQUFZLEVBQUcsQ0FDbEIsR0FBSSxHQUFZLFVBQVUsRUFBYSxFQUFHLEdBQ3RDLEVBQVUsS0FBSyxJQUFJLEVBQWUsRUFFWCxlQUF2QixLQUFLLEtBQUssS0FDYixHQUFVLEtBQUssU0FBUyxJQUV6QixHQUFLLEtBQU8sRUFBWSxJQUFJLFlBSTlCLElBQVUsUUFoQzhELENBRXhFLEdBQUksR0FBSSxVQUFVLEVBQU0sR0FFeEIsSUFBVyxHQUFLLEdBQW9DLGNBQS9CLEtBQUssS0FBSyxFQUFTLEVBQUksSUFBdUIsR0FBSyxFQUFTLEVBQUksR0FDckYsR0FBSyxLQW1DVCxNQUFPLElBSVIsV0FBWSxTQUFvQixHQUMvQixHQUFzQixXQUFsQixLQUFLLEtBQUssSUFBb0IsT0FBTyxHQUN4QyxLQUFNLElBQUksWUFBVyxrREFNdEIsT0FKYyxVQUFTLEtBQUssUUFBUSxJQUluQixJQUhMLE9BQU8sS0FBSyxjQUFjLElBR0osSUFGeEIsaUJBQWlCLEtBQUssYUFBYSxJQUVJLElBRHRDLGlCQUFpQixLQUFLLGFBQWEsR0FBSyxJQUtwRCxXQUFZLFNBQW9CLEdBQy9CLEdBQXNCLFdBQWxCLEtBQUssS0FBSyxJQUFvQixPQUFPLEdBQ3hDLEtBQU0sSUFBSSxZQUFXLGtEQUV0QixJQUFJLEdBQU8sS0FBSyxhQUFhLEdBQ3pCLEVBQVMsS0FBSyxZQUFZLEdBQzFCLEVBQVMsS0FBSyxZQUFZLEVBQzlCLE9BQU8sa0JBQWlCLEdBQVEsSUFBTSxpQkFBaUIsR0FBVSxJQUFNLGlCQUFpQixHQUFVLGdCQUk3RixRQUFPLDhCQUVQLFFBQU8scUJBRWQsT0FBTyxRQUFVOzs7QUNoU2pCLFlBRUEsSUFBSSxXQUFZLFFBQVEsNkJBQ3BCLFFBQVUsUUFBUSw4QkFDbEIsUUFBVSxRQUFRLGtCQUVsQixPQUFTLFFBQVEsWUFDakIsT0FBUyxRQUFRLG9CQUNqQixpQkFBbUIsUUFBUSw0QkFFM0IsYUFBZSxRQUFRLGtCQUV2QixXQUFhLGFBQWEsZUFFMUIsT0FBUyxPQUFPLFVBQVcsU0FFOUIsdUJBQXdCLFNBQWdDLEVBQVEsRUFBVSxHQUN6RSxJQUFLLEtBQUssV0FBVyxHQUNwQixLQUFNLElBQUksWUFBVyw0Q0FFdEIsSUFBZ0IsTUFBWixFQUNILEtBQU0sSUFBSSxZQUFXLDJEQUd0QixLQURBLEdBQUksR0FBaUIsS0FBSyxZQUFZLEtBQ3pCLENBQ1osR0FBSSxHQUFPLEtBQUssYUFBYSxFQUM3QixLQUFLLEVBQ0osTUFBTyxFQUVSLElBQUksR0FBVyxLQUFLLGNBQWMsRUFDbEMsSUFBNEIsV0FBeEIsS0FBSyxLQUFLLEdBQXdCLENBQ3JDLEdBQUksR0FBUSxHQUFJLFlBQVcsNENBQThDLFFBQVEsR0FDakYsT0FBTyxNQUFLLGNBQ1gsRUFDQSxXQUFjLEtBQU0sS0FHdEIsSUFDQyxHQUFJLEdBQUksS0FBSyxJQUFJLEVBQVUsS0FDdkIsRUFBSSxLQUFLLElBQUksRUFBVSxJQUMzQixNQUFLLEtBQUssRUFBTyxHQUFTLEVBQUcsSUFDNUIsTUFBTyxHQUNSLE1BQU8sTUFBSyxjQUNYLEVBQ0EsV0FBYyxLQUFNLFFBUXhCLGlCQUFrQixTQUEwQixFQUFRLEVBQVEsRUFBVyxFQUFPLEdBQzdFLEdBQUksRUFDQSxXQUFVLE9BQVMsSUFDdEIsRUFBaUIsVUFBVSxHQUs1QixLQUZBLEdBQUksR0FBYyxFQUNkLEVBQWMsRUFDWCxFQUFjLEdBQVcsQ0FDL0IsR0FBSSxHQUFJLEtBQUssU0FBUyxFQUV0QixLQUFlLElBREYsS0FBSyxZQUFZLEVBQVEsR0FDakIsQ0FDcEIsR0FBSSxHQUFVLEtBQUssSUFBSSxFQUFRLEVBQy9CLFFBQThCLEtBQW5CLEVBQWdDLENBQzFDLEdBQUksVUFBVSxRQUFVLEVBQ3ZCLEtBQU0sSUFBSSxZQUFXLHdFQUV0QixHQUFVLEtBQUssS0FBSyxFQUFnQixVQUFVLElBQUssRUFBUyxFQUFhLElBRTFFLEdBQUksSUFBZ0IsQ0FJcEIsSUFISSxFQUFRLElBQ1gsRUFBZ0IsS0FBSyxRQUFRLElBRTFCLEVBQWUsQ0FDbEIsR0FBSSxHQUFhLEtBQUssU0FBUyxLQUFLLElBQUksRUFBUyxVQUNqRCxHQUFjLEtBQUssaUJBQWlCLEVBQVEsRUFBUyxFQUFZLEVBQWEsRUFBUSxPQUNoRixDQUNOLEdBQUksR0FBZSxpQkFDbEIsS0FBTSxJQUFJLFlBQVcsa0JBRXRCLE1BQUssMEJBQTBCLEVBQVEsS0FBSyxTQUFTLEdBQWMsR0FDbkUsR0FBZSxHQUdqQixHQUFlLEVBR2hCLE1BQU8sSUFJUixXQUFZLFNBQW9CLEVBQVEsR0FDdkMsR0FFSSxHQUZBLEVBQU0sS0FBSyx1QkFBdUIsR0FDbEMsRUFBSSxLQUFLLFNBQVMsRUFFdEIsSUFBYyxVQUFWLEVBQ0gsRUFBSSxVQUFVLE9BQ1IsSUFBYyxRQUFWLEVBQ1YsRUFBSSxRQUFRLE9BQ04sQ0FBQSxHQUFjLGNBQVYsRUFHVixLQUFNLElBQUksWUFBVyxrRkFGckIsR0FBSSxVQUFVLFFBQVEsSUFJdkIsTUFBTyxLQUlULFFBQU8sUUFBVTs7O0FDOUdqQixZQUVBLElBQUksY0FBZSxRQUFRLGtCQUV2QixRQUFVLGFBQWEsWUFDdkIsV0FBYSxhQUFhLGVBQzFCLFdBQWEsYUFBYSxlQUMxQixRQUFVLGFBQWEsWUFDdkIsTUFBUSxhQUFhLFVBQ3JCLFFBQVUsYUFBYSxZQUN2QixPQUFTLGFBQWEsZ0JBQ3RCLFNBQVcsYUFBYSxjQUN4QixLQUFPLGFBQWEsY0FFcEIsYUFBZSxRQUFRLDBCQUN2QixxQkFBdUIsUUFBUSxrQ0FDL0IsT0FBUyxRQUFRLG1CQUNqQixVQUFZLFFBQVEsc0JBQ3BCLEtBQU8sUUFBUSxrQkFDZixJQUFNLFFBQVEsaUJBQ2QsV0FBYSxRQUFRLHdCQUNyQixVQUFZLFFBQVEsdUJBRXBCLFdBQWEsUUFBUSxlQUNyQixZQUFjLFFBQVEsdUJBRXRCLElBQU0sUUFBUSxPQUVkLGdCQUFrQixVQUFVLGlDQUU1QixZQUFjLEdBQ2QsZUFBaUIsR0FDakIsaUJBQW1CLEdBQ25CLFlBQWMsSUFDZCxZQUFjLFlBQWMsaUJBQzVCLFVBQVksWUFBYyxlQUMxQixTQUFXLE1BR1gsS0FDSCxZQUFhLFlBRWIsVUFBVyxTQUFtQixHQUM3QixRQUFTLEdBRVYsU0FBVSxTQUFrQixHQUMzQixPQUFRLEdBRVQsVUFBVyxTQUFtQixHQUM3QixHQUFJLEdBQVMsS0FBSyxTQUFTLEVBQzNCLE9BQUksUUFBTyxHQUFrQixFQUNkLElBQVgsR0FBaUIsVUFBVSxHQUN4QixLQUFLLEdBQVUsS0FBSyxNQUFNLEtBQUssSUFBSSxJQURPLEdBR2xELFFBQVMsU0FBaUIsR0FDekIsTUFBTyxNQUFLLFNBQVMsSUFBTSxHQUU1QixTQUFVLFNBQWtCLEdBQzNCLE1BQU8sTUFBSyxTQUFTLEtBQU8sR0FFN0IsU0FBVSxTQUFrQixHQUMzQixHQUFJLEdBQVMsS0FBSyxTQUFTLEVBQzNCLElBQUksT0FBTyxJQUFzQixJQUFYLElBQWlCLFVBQVUsR0FBVyxNQUFPLEVBQ25FLElBQUksR0FBUyxLQUFLLEdBQVUsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUNoRCxPQUFPLEtBQUksRUFBUSxRQUVwQixTQUFVLFNBQWtCLEdBQzNCLE1BQU8sU0FBUSxJQUVoQixTQUFVLFNBQWtCLEdBRTNCLE1BREEsTUFBSyxxQkFBcUIsR0FDbkIsUUFBUSxJQUVoQixxQkFBc0IsU0FBOEIsRUFBTyxHQUUxRCxHQUFhLE1BQVQsRUFDSCxLQUFNLElBQUksWUFBVyxHQUFjLHlCQUEyQixFQUUvRCxPQUFPLElBRVIsV0FBWSxXQUNaLFVBQVcsU0FBbUIsRUFBRyxHQUNoQyxNQUFJLEtBQU0sRUFDQyxJQUFOLEdBQWtCLEVBQUksR0FBTSxFQUFJLEVBRzlCLE9BQU8sSUFBTSxPQUFPLElBSTVCLEtBQU0sU0FBYyxHQUNuQixNQUFVLFFBQU4sRUFDSSxXQUVTLEtBQU4sRUFDSCxZQUVTLGtCQUFOLElBQWlDLGdCQUFOLEdBQzlCLFNBRVMsZ0JBQU4sR0FDSCxTQUVTLGlCQUFOLEdBQ0gsVUFFUyxnQkFBTixHQUNILGFBRFIsSUFNRCxxQkFBc0IsU0FBOEIsR0FDbkQsTUFBTyxzQkFBcUIsS0FBTSxJQUluQyxxQkFBc0IsU0FBOEIsR0FDbkQsV0FBb0IsS0FBVCxJQUlYLGFBQWEsS0FBTSxzQkFBdUIsT0FBUSxNQUU3QyxJQUFJLEVBQU0sYUFBZSxJQUFJLEVBQU0sY0FRekMsaUJBQWtCLFNBQTBCLEdBQzNDLFdBQW9CLEtBQVQsSUFJWCxhQUFhLEtBQU0sc0JBQXVCLE9BQVEsTUFFN0MsSUFBSSxFQUFNLGVBQWlCLElBQUksRUFBTSxtQkFRM0Msb0JBQXFCLFNBQTZCLEdBQ2pELFdBQW9CLEtBQVQsSUFJWCxhQUFhLEtBQU0sc0JBQXVCLE9BQVEsSUFFN0MsS0FBSyxxQkFBcUIsS0FBVSxLQUFLLGlCQUFpQixLQVFoRSx1QkFBd0IsU0FBZ0MsR0FDdkQsT0FBb0IsS0FBVCxFQUNWLE1BQU8sRUFLUixJQUZBLGFBQWEsS0FBTSxzQkFBdUIsT0FBUSxHQUU5QyxLQUFLLGlCQUFpQixHQUN6QixPQUNDLE1BQU8sRUFBSyxhQUNaLFdBQVksRUFBSyxnQkFDakIsYUFBYyxFQUFLLGtCQUNuQixlQUFnQixFQUFLLG9CQUVoQixJQUFJLEtBQUsscUJBQXFCLEdBQ3BDLE9BQ0MsSUFBSyxFQUFLLFdBQ1YsSUFBSyxFQUFLLFdBQ1YsYUFBYyxFQUFLLGtCQUNuQixlQUFnQixFQUFLLG9CQUd0QixNQUFNLElBQUksWUFBVyxxRkFLdkIscUJBQXNCLFNBQThCLEdBQ25ELEdBQXVCLFdBQW5CLEtBQUssS0FBSyxHQUNiLEtBQU0sSUFBSSxZQUFXLDBDQUd0QixJQUFJLEtBYUosSUFaSSxJQUFJLEVBQUssZ0JBQ1osRUFBSyxrQkFBb0IsS0FBSyxVQUFVLEVBQUksYUFFekMsSUFBSSxFQUFLLGtCQUNaLEVBQUssb0JBQXNCLEtBQUssVUFBVSxFQUFJLGVBRTNDLElBQUksRUFBSyxXQUNaLEVBQUssYUFBZSxFQUFJLE9BRXJCLElBQUksRUFBSyxjQUNaLEVBQUssZ0JBQWtCLEtBQUssVUFBVSxFQUFJLFdBRXZDLElBQUksRUFBSyxPQUFRLENBQ3BCLEdBQUksR0FBUyxFQUFJLEdBQ2pCLFFBQXNCLEtBQVgsSUFBMkIsS0FBSyxXQUFXLEdBQ3JELEtBQU0sSUFBSSxXQUFVLDRCQUVyQixHQUFLLFdBQWEsRUFFbkIsR0FBSSxJQUFJLEVBQUssT0FBUSxDQUNwQixHQUFJLEdBQVMsRUFBSSxHQUNqQixRQUFzQixLQUFYLElBQTJCLEtBQUssV0FBVyxHQUNyRCxLQUFNLElBQUksWUFBVyw0QkFFdEIsR0FBSyxXQUFhLEVBR25CLElBQUssSUFBSSxFQUFNLFlBQWMsSUFBSSxFQUFNLGNBQWdCLElBQUksRUFBTSxjQUFnQixJQUFJLEVBQU0saUJBQzFGLEtBQU0sSUFBSSxZQUFXLCtGQUV0QixPQUFPLElBSVIsK0JBQWdDLFNBQW9DLEVBQUcsR0FDdEUsR0FBSSxHQUFRLEtBQUssS0FBSyxHQUNsQixFQUFRLEtBQUssS0FBSyxFQUN0QixPQUFJLEtBQVUsRUFDTixJQUFNLEVBRUwsTUFBTCxHQUFrQixNQUFMLElBR0gsV0FBVixHQUFnQyxXQUFWLEVBQ2xCLEtBQUssZ0NBQWdDLEVBQUcsS0FBSyxTQUFTLElBRWhELFdBQVYsR0FBZ0MsV0FBVixFQUNsQixLQUFLLGdDQUFnQyxLQUFLLFNBQVMsR0FBSSxHQUVqRCxZQUFWLEVBQ0ksS0FBSyxnQ0FBZ0MsS0FBSyxTQUFTLEdBQUksR0FFakQsWUFBVixFQUNJLEtBQUssZ0NBQWdDLEVBQUcsS0FBSyxTQUFTLElBRS9DLFdBQVYsR0FBZ0MsV0FBVixHQUFpQyxXQUFWLEVBR3BDLFdBQVYsSUFBaUMsV0FBVixHQUFnQyxXQUFWLElBQ3pDLEtBQUssZ0NBQWdDLEtBQUssWUFBWSxHQUFJLEdBSDFELEtBQUssZ0NBQWdDLEVBQUcsS0FBSyxZQUFZLE1BU2xFLDZCQUE4QixTQUFrQyxFQUFHLEdBQ2xFLEdBQUksR0FBUSxLQUFLLEtBQUssRUFFdEIsT0FBSSxLQURRLEtBQUssS0FBSyxLQUlSLGNBQVYsR0FBbUMsU0FBVixHQUd0QixJQUFNLElBS2QsaUNBQWtDLFNBQXNDLEVBQUcsRUFBRyxHQUM3RSxHQUE2QixZQUF6QixLQUFLLEtBQUssR0FDYixLQUFNLElBQUksWUFBVyx5REFFdEIsSUFBSSxHQUNBLENBU0osSUFSSSxHQUNILEVBQUssS0FBSyxZQUFZLEVBQUcsU0FDekIsRUFBSyxLQUFLLFlBQVksRUFBRyxXQUV6QixFQUFLLEtBQUssWUFBWSxFQUFHLFNBQ3pCLEVBQUssS0FBSyxZQUFZLEVBQUcsWUFFVSxXQUFsQixLQUFLLEtBQUssSUFBc0MsV0FBbEIsS0FBSyxLQUFLLElBQ3hDLENBQ2pCLEdBQUksR0FBSyxLQUFLLFNBQVMsR0FDbkIsRUFBSyxLQUFLLFNBQVMsRUFDdkIsSUFBSSxPQUFPLElBQU8sT0FBTyxHQUN4QixNQUVELFNBQUksVUFBVSxJQUFPLFVBQVUsSUFBTyxJQUFPLEdBR2xDLElBQVAsR0FBbUIsSUFBUCxHQUdaLElBQU8sRUFBQSxLQUdQLElBQU8sRUFBQSxHQUdQLEtBQU8sRUFBQSxJQUdQLEtBQU8sRUFBQSxHQUdKLEVBQUssS0FFYixPQUFJLFdBQVcsRUFBSSxPQUdmLFdBQVcsRUFBSSxJQUdaLEVBQUssSUFJYixXQUFZLFNBQW9CLEdBQy9CLE1BQU8sS0FBSSxFQUFHLGNBSWYsWUFBYSxTQUFxQixHQUNqQyxNQUFPLEtBQUksT0FBTyxFQUFJLGFBQWMsbUJBSXJDLFlBQWEsU0FBcUIsR0FDakMsTUFBTyxLQUFJLE9BQU8sRUFBSSxhQUFjLGlCQUlyQyxhQUFjLFNBQXNCLEdBQ25DLE1BQU8sS0FBSSxPQUFPLEVBQUksV0FBWSxjQUluQyxJQUFLLFNBQWEsR0FDakIsTUFBTyxRQUFPLEVBQUksV0FJbkIsY0FBZSxTQUF1QixHQUNyQyxNQUFPLEtBQUksRUFBRyxXQUlmLFlBQWEsU0FBcUIsR0FDakMsTUFBUSxNQUFPLEVBQUksTUFBUyxRQUFRLEVBQUksTUFBUSxHQUFLLFFBQVEsRUFBSSxNQUFRLEtBQU8sUUFBUSxFQUFJLE1BQVEsTUFJckcsYUFBYyxTQUFzQixHQUNuQyxNQUFPLFVBQVcsS0FBSyxZQUFZLElBSXBDLGFBQWMsU0FBc0IsR0FFbkMsTUFBTyxpQkFBZ0IsR0FBSSxPQUFNLEtBSWxDLFFBQVMsU0FBaUIsR0FDekIsTUFBTyxLQUFJLEtBQUssSUFBSSxHQUFLLEVBQUcsSUFJN0IsV0FBWSxTQUFvQixHQUMvQixNQUFrQixLQUFkLElBQUksRUFBRyxHQUNILElBRVksSUFBaEIsSUFBSSxFQUFHLEtBQ0gsSUFFWSxJQUFoQixJQUFJLEVBQUcsS0FDSCxJQUVELEtBSVIsV0FBWSxTQUFvQixHQUMvQixHQUFJLEdBQU8sS0FBSyxXQUFXLEtBQUssYUFBYSxHQUM3QyxJQUFhLE1BQVQsRUFDSCxNQUFPLEVBRVIsSUFBYSxNQUFULEVBQ0gsTUFBTyxFQUVSLE1BQU0sSUFBSSxZQUFXLG1FQUFxRSxJQUkzRixjQUFlLFNBQXVCLEdBQ3JDLE1BQU8sTUFBSyxJQUFJLEdBQUssS0FBSyxZQUFZLEtBQUssYUFBYSxLQUl6RCxjQUFlLFNBQXVCLEdBQ3JDLEdBQUksR0FBTSxLQUFLLGNBQWMsRUFDN0IsSUFBSSxHQUFLLEdBQU8sRUFBTSxHQUNyQixNQUFPLEVBRVIsSUFBSSxHQUFPLEtBQUssV0FBVyxFQUMzQixPQUFJLEtBQU0sR0FBTyxFQUFPLEdBQUssRUFDckIsRUFFSCxHQUFLLEdBQVMsR0FBTyxFQUFPLEdBQUssRUFDOUIsRUFFSCxHQUFLLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDL0IsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsRUFFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsR0FFSCxJQUFNLEdBQVMsR0FBTyxFQUFPLElBQU0sRUFDaEMsT0FEUixJQU1ELGFBQWMsU0FBc0IsR0FDbkMsR0FBSSxHQUFJLEtBQUssY0FBYyxHQUN2QixFQUFJLEtBQUssY0FBYyxFQUMzQixJQUFVLElBQU4sRUFDSCxNQUFPLEdBQUksQ0FFWixJQUFVLElBQU4sRUFDSCxNQUFPLEdBQUksRUFFWixJQUFJLEdBQU8sS0FBSyxXQUFXLEVBQzNCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxHQUFLLENBRWpCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxHQUFLLENBRWpCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsSUFBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsS0FBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLElBQVUsS0FBTixFQUNILE1BQU8sR0FBSSxJQUFNLENBRWxCLE1BQU0sSUFBSSxZQUFXLGlFQUFtRSxJQUl6RixRQUFTLFNBQWlCLEVBQU0sRUFBTyxHQUN0QyxJQUFLLFVBQVUsS0FBVSxVQUFVLEtBQVcsVUFBVSxHQUN2RCxNQUFPLElBRVIsSUFBSSxHQUFJLEtBQUssVUFBVSxHQUNuQixFQUFJLEtBQUssVUFBVSxHQUNuQixFQUFLLEtBQUssVUFBVSxHQUNwQixFQUFLLEVBQUksT0FBTyxFQUFJLElBQ3BCLEVBQUssSUFBSSxFQUFHLElBQ1osRUFBSSxTQUFTLEVBQUksRUFBSSxFQUN6QixPQUFJLE1BQUssYUFBYSxLQUFPLEdBQU0sS0FBSyxjQUFjLEtBQU8sR0FBK0IsSUFBekIsS0FBSyxhQUFhLEdBQzdFLElBRUQsS0FBSyxJQUFJLEdBQUssRUFBSyxHQUkzQixTQUFVLFNBQWtCLEVBQUssR0FDaEMsTUFBSyxXQUFVLElBQVMsVUFBVSxHQUcxQixFQUFNLFNBQVksRUFGbEIsS0FNVCxTQUFVLFNBQWtCLEVBQU0sRUFBSyxFQUFLLEdBQzNDLEtBQUssVUFBVSxJQUFVLFVBQVUsSUFBUyxVQUFVLElBQVMsVUFBVSxJQUN4RSxNQUFPLElBRVIsSUFBSSxHQUFJLEtBQUssVUFBVSxHQUNuQixFQUFJLEtBQUssVUFBVSxHQUNuQixFQUFJLEtBQUssVUFBVSxHQUNuQixFQUFRLEtBQUssVUFBVSxFQUUzQixPQURTLEdBQUksVUFBYyxFQUFJLFlBQWdCLEVBQUksWUFBZSxHQUtuRSxTQUFVLFNBQWtCLEdBQzNCLE9BQUssVUFBVSxJQUFTLEtBQUssR0FBUSxPQUM3QixJQUVELFFBQVEsR0FBSSxPQUFNLEtBQUssU0FBUyxNQUl4QyxPQUFRLFNBQWdCLEVBQUcsR0FDMUIsTUFBTyxLQUFJLEVBQUcsSUFJaEIsUUFBTyxRQUFVOzs7QUMvaEJqQixZQUVBLElBQUksY0FBZSxRQUFRLG1CQUV2QixXQUFhLGFBQWEsZUFDMUIsYUFBZSxhQUFhLGlCQUU1QixJQUFNLFFBQVEsT0FFZCxZQUVILHNCQUF1QixTQUE4QixFQUFJLEdBQ3hELEdBQXNCLFdBQWxCLEVBQUcsS0FBSyxHQUNYLE9BQU8sQ0FFUixJQUFJLElBQ0gsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixnQkFBZ0IsRUFHakIsS0FBSyxHQUFJLEtBQU8sR0FDZixHQUFJLElBQUksRUFBTSxLQUFTLEVBQVEsR0FDOUIsT0FBTyxDQUlULElBQUksR0FBUyxJQUFJLEVBQU0sYUFDbkIsRUFBYSxJQUFJLEVBQU0sWUFBYyxJQUFJLEVBQU0sVUFDbkQsSUFBSSxHQUFVLEVBQ2IsS0FBTSxJQUFJLFlBQVcscUVBRXRCLFFBQU8sR0FJVCxRQUFPLFFBQVUsU0FBc0IsRUFBSSxFQUFZLEVBQWMsR0FDcEUsR0FBSSxHQUFZLFdBQVcsRUFDM0IsSUFBeUIsa0JBQWQsR0FDVixLQUFNLElBQUksY0FBYSx3QkFBMEIsRUFFbEQsS0FBSyxFQUFVLEVBQUksR0FDbEIsS0FBTSxJQUFJLFlBQVcsRUFBZSxjQUFnQjs7O0FDN0N0RCxZQUVBLElBQUksY0FBZSxRQUFRLG1CQUV2QixJQUFNLFFBQVEsT0FFZCxRQUFVLGFBQWEsWUFBWSxNQUV2QyxRQUFPLFFBQVUsU0FBZ0IsRUFBUSxHQUN4QyxHQUFJLFFBQ0gsTUFBTyxTQUFRLEVBQVEsRUFJeEIsS0FBSyxHQUFJLEtBQU8sR0FDWCxJQUFJLEVBQVEsS0FDZixFQUFPLEdBQU8sRUFBTyxHQUd2QixPQUFPOzs7QUNuQlIsWUFFQSxJQUFJLE1BQU8sUUFBUSxpQkFFZixhQUFlLFFBQVEsbUJBRXZCLFVBQVksYUFBYSxjQUN6QixPQUFTLFVBQVUsTUFDbkIsTUFBUSxVQUFVLElBRXRCLFFBQU8sUUFBVSxXQUNoQixNQUFPLE1BQUssTUFBTSxNQUFPLFlBRzFCLE9BQU8sUUFBUSxNQUFRLFdBQ3RCLE1BQU8sTUFBSyxNQUFNLE9BQVE7OztBQ2YzQixZQUVBLElBQUksY0FBZSxRQUFRLG1CQUV2QixTQUFXLFFBQVEsY0FFbkIsU0FBVyxTQUFTLGFBQWEsNEJBRXJDLFFBQU8sUUFBVSxTQUE0QixFQUFNLEdBQ2xELEdBQUksR0FBWSxhQUFhLElBQVEsRUFDckMsT0FBeUIsa0JBQWQsSUFBNEIsU0FBUyxFQUFNLGVBQzlDLFNBQVMsR0FFVjs7O0FDYlIsWUFFQSxRQUFPLFFBQVUsU0FBZSxFQUFPLEdBQ3RDLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFNLE9BQVEsR0FBSyxFQUN0QyxJQUFLLEVBQVUsRUFBTSxHQUFJLEVBQUcsR0FDM0IsT0FBTyxDQUdULFFBQU87OztBQ1JSLFlBRUEsUUFBTyxRQUFVLFNBQWlCLEVBQU8sR0FDeEMsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxHQUFLLEVBQ3RDLEVBQVMsRUFBTSxHQUFJLEVBQUc7OztBQ0p4QixZQUVBLElBQUksZ0JBQ0osS0FFQyxnQkFBa0IsU0FBUyxJQUFLLGdDQUMvQixNQUFPLElBRVQsR0FBSSxVQUFXLFlBQ2YsUUFBTyxRQUFVLGlCQUFxQyxhQUFsQixTQUFTLEtBQXNCLGdCQUFrQjs7O0FDVHJGLFlBRUEsSUFBSSxZQUFhLFFBQVEsaUJBQ3JCLGFBQWUsUUFBUSxtQkFDdkIsVUFBWSxRQUFRLGVBRXBCLFVBQVksYUFBYSxxQkFBcUIsR0FDOUMsWUFBYyxVQUFVLHlCQUN4QixXQUFhLFVBQVUsdUJBRTNCLFFBQU8sUUFBVSxTQUEyQixFQUFJLEdBQy9DLEdBQUksRUFpQ0osT0FoQ0ksWUFDSCxFQUFnQixFQUFHLFVBQVUsRUFBVSxXQUM3QixFQUFHLFFBQVEsR0FDckIsRUFBZ0IsV0FDZixHQUFJLElBQUssRUFDTCxFQUFNLElBQ1YsUUFDQyxLQUFNLFdBRUwsTUFEQSxJQUFLLEdBRUosS0FBTSxHQUFLLEVBQUksT0FDZixNQUFPLEVBQUksT0FLaUIsV0FBdEIsRUFBRyxLQUFLLEtBQ2xCLEVBQWdCLFdBQ2YsR0FBSSxHQUFJLENBQ1IsUUFDQyxLQUFNLFdBQ0wsR0FBSSxHQUFZLEVBQUcsbUJBQW1CLEVBQVUsR0FBRyxHQUMvQyxFQUFRLFdBQVcsWUFBWSxFQUFVLEVBQUcsR0FBWSxHQUU1RCxPQURBLEdBQUksR0FFSCxLQUFNLEVBQVksRUFBUyxPQUMzQixNQUFPLE9BTUw7OztBQzVDUixZQUVBLElBQUksY0FBZSxRQUFRLG1CQUV2QixpQkFBbUIsYUFBYSwyQkFBMkIsR0FDM0QsWUFBYyxhQUFhLG9CQUUvQixRQUFPLFFBQVUsc0JBRWIsWUFBYyxZQUNkLFNBQVUsR0FDWCxNQUFPLEdBQUUsV0FFUjs7O0FDYkosWUFFQSxJQUFJLGNBQWUsUUFBUSxtQkFFdkIsVUFBWSxRQUFRLGVBRXBCLGFBQWUsYUFBYSxpQkFDNUIsU0FBVyxVQUFVLDZCQUE2QixHQUVsRCxnQkFBa0IsUUFBUSxvQkFFOUIsUUFBTyxRQUFVLFNBQThCLEdBQzlDLElBQUssU0FDSixLQUFNLElBQUksY0FBYSxnREFFeEIsSUFBSSxHQUFNLFNBQVMsRUFFbkIsSUFBSSxnQkFBaUIsQ0FDcEIsR0FBSSxHQUFPLGdCQUFnQixFQUMzQixJQUFhLEtBQVQsRUFBZSxNQUVuQixPQUFPLEdBQUssTUFBTSxHQUFJLEdBR3ZCLEdBQUksR0FBTyxFQUFJLE1BQU0sR0FBSSxFQUN6QixJQUFJLEVBRUgsTUFBTzs7O0FDM0JULFlBRUEsSUFBSSxRQUFTLE9BQU8sT0FBUyxTQUFVLEdBQUssTUFBTyxLQUFNLEVBRXpELFFBQU8sUUFBVSxPQUFPLFVBQVksU0FBVSxHQUFLLE1BQW9CLGdCQUFOLEtBQW1CLE9BQU8sSUFBTSxJQUFNLEVBQUEsR0FBWSxLQUFPLEVBQUE7OztBQ0oxSCxZQUVBLFFBQU8sUUFBVSxPQUFPLE9BQVMsU0FBZSxHQUMvQyxNQUFPLEtBQU07OztBQ0hkLFlBRUEsSUFBSSxXQUFZLFFBQVEsd0JBQXdCLHlCQUVoRCxRQUFPLFFBQVUsU0FBb0IsRUFBUSxHQUM1QyxNQUFJLEtBQVcsS0FHWCxFQUFPLE9BQVMsRUFBTyxTQUdwQixVQUFVLEVBQVEsRUFBRyxFQUFPLFVBQVk7OztBQ1hoRCxZQUVBLFFBQU8sUUFBVSxTQUFxQixHQUNyQyxNQUFpQixRQUFWLEdBQW9DLGtCQUFWLElBQXlDLGdCQUFWOzs7QUNIakUsWUFFQSxJQUFJLGNBQWUsUUFBUSxtQkFFdkIsSUFBTSxRQUFRLE9BQ2QsV0FBYSxhQUFhLGNBRTlCLFFBQU8sUUFBVSxTQUE4QixFQUFJLEdBQ2xELEdBQXNCLFdBQWxCLEVBQUcsS0FBSyxHQUNYLE9BQU8sQ0FFUixJQUFJLElBQ0gsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixnQkFBZ0IsRUFHZCxLQUFLLEdBQUksS0FBTyxHQUNsQixHQUFJLElBQUksRUFBTSxLQUFTLEVBQVEsR0FDOUIsT0FBTyxDQUlULElBQUksRUFBRyxpQkFBaUIsSUFBUyxFQUFHLHFCQUFxQixHQUN4RCxLQUFNLElBQUksWUFBVyxxRUFFdEIsUUFBTzs7O0FDN0JSLFlBRUEsSUFBSSxPQUFRLFFBQVEsVUFFcEIsUUFBTyxRQUFVLFNBQWtDLEVBQUksRUFBSSxHQVMxRCxNQUFPLFFBUE4sbUJBQ0EsaUJBQ0EsVUFDQSxVQUNBLFlBQ0EsZ0JBRW9CLFNBQVUsR0FDOUIsTUFBSyxLQUFTLElBQVMsSUFBUyxJQUd6QixFQUFHLFVBQVUsRUFBRyxHQUFRLEVBQUc7OztBQ2pCcEMsWUFFQSxJQUFJLGNBQWUsUUFBUSxtQkFFdkIsTUFBUSxhQUFhLFVBQ3JCLFFBQVUsYUFBYSxXQUUzQixRQUFPLFFBQVUsUUFBUSxrQkFBb0IsTUFBTSxJQUFJLEVBQUcsSUFBTTs7O0FDUGhFLFlBRUEsUUFBTyxRQUFVLFNBQWEsRUFBUSxHQUNyQyxHQUFJLEdBQVMsRUFBUyxDQUN0QixPQUFPLE1BQUssTUFBTSxHQUFVLEVBQUksRUFBUyxFQUFTOzs7QUNKbkQsWUFFQSxJQUFJLGNBQWUsUUFBUSxtQkFFdkIsTUFBUSxhQUFhLHlCQUVyQixTQUFXLFFBQVEsYUFFdkIsUUFBTyxRQUFVLFNBQXFCLEdBQ3JDLE1BQU8sVUFBUyxNQUFPOzs7QUNUeEIsWUFFQSxJQUFJLGNBQWUsUUFBUSxtQkFFdkIsaUJBQW1CLGFBQWEsMkJBQTJCLEdBQzNELFlBQWMsYUFBYSxvQkFFL0IsUUFBTyxRQUFVLHNCQUViLFlBQWMsWUFDZCxLQUNBLFNBQVUsRUFBRyxHQUVkLE1BREEsR0FBRSxVQUFZLEVBQ1A7OztBQ2JWLFlBRUEsUUFBTyxRQUFVLFNBQWMsR0FDOUIsTUFBTyxJQUFVLEVBQUksR0FBSzs7Ozs7Ozs7O0FDSDNCLFlBRUEsSUFBSSxZQUErQixrQkFBWCxTQUFvRCxnQkFBcEIsUUFBTyxTQUUzRCxZQUFjLFFBQVEseUJBQ3RCLFdBQWEsUUFBUSxlQUNyQixPQUFTLFFBQVEsa0JBQ2pCLFNBQVcsUUFBUSxhQUVuQixvQkFBc0IsU0FBNkIsRUFBRyxHQUN6RCxPQUFpQixLQUFOLEdBQTJCLE9BQU4sRUFDL0IsS0FBTSxJQUFJLFdBQVUseUJBQTJCLEVBRWhELElBQW9CLGdCQUFULElBQStCLFdBQVQsR0FBOEIsV0FBVCxFQUNyRCxLQUFNLElBQUksV0FBVSxvQ0FFckIsSUFDSSxHQUFRLEVBQVEsRUFEaEIsRUFBdUIsV0FBVCxHQUFxQixXQUFZLFlBQWMsVUFBVyxXQUU1RSxLQUFLLEVBQUksRUFBRyxFQUFJLEVBQVksU0FBVSxFQUVyQyxHQURBLEVBQVMsRUFBRSxFQUFZLElBQ25CLFdBQVcsS0FDZCxFQUFTLEVBQU8sS0FBSyxHQUNqQixZQUFZLElBQ2YsTUFBTyxFQUlWLE1BQU0sSUFBSSxXQUFVLHFCQUdqQixVQUFZLFNBQW1CLEVBQUcsR0FDckMsR0FBSSxHQUFPLEVBQUUsRUFDYixJQUFhLE9BQVQsT0FBaUMsS0FBVCxFQUFzQixDQUNqRCxJQUFLLFdBQVcsR0FDZixLQUFNLElBQUksV0FBVSxFQUFPLDBCQUE0QixFQUFJLGNBQWdCLEVBQUkscUJBRWhGLE9BQU8sSUFNVCxRQUFPLFFBQVUsU0FBcUIsR0FDckMsR0FBSSxZQUFZLEdBQ2YsTUFBTyxFQUVSLElBQUksR0FBTyxTQUNQLFdBQVUsT0FBUyxJQUNsQixVQUFVLEtBQU8sT0FDcEIsRUFBTyxTQUNHLFVBQVUsS0FBTyxTQUMzQixFQUFPLFVBSVQsSUFBSSxFQVFKLElBUEksYUFDQyxPQUFPLFlBQ1YsRUFBZSxVQUFVLEVBQU8sT0FBTyxhQUM3QixTQUFTLEtBQ25CLEVBQWUsT0FBTyxVQUFVLGNBR04sS0FBakIsRUFBOEIsQ0FDeEMsR0FBSSxHQUFTLEVBQWEsS0FBSyxFQUFPLEVBQ3RDLElBQUksWUFBWSxHQUNmLE1BQU8sRUFFUixNQUFNLElBQUksV0FBVSxnREFLckIsTUFIYSxZQUFULElBQXVCLE9BQU8sSUFBVSxTQUFTLE1BQ3BELEVBQU8sVUFFRCxvQkFBb0IsRUFBZ0IsWUFBVCxFQUFxQixTQUFXOzs7QUN6RW5FLFlBRUEsSUFBSSxPQUFRLE9BQU8sVUFBVSxTQUV6QixZQUFjLFFBQVEseUJBRXRCLFdBQWEsUUFBUSxlQUdyQixrQkFDSCxtQkFBb0IsU0FBVSxHQUM3QixHQUFJLEVBT0osS0FMQyxFQURHLFVBQVUsT0FBUyxFQUNULFVBQVUsR0FFUSxrQkFBbEIsTUFBTSxLQUFLLEdBQXlCLE9BQVMsVUFHeEMsUUFBVSxJQUFlLE9BQVEsQ0FDbkQsR0FDSSxHQUFPLEVBRFAsRUFBVSxJQUFlLFFBQVUsV0FBWSxZQUFjLFVBQVcsV0FFNUUsS0FBSyxFQUFJLEVBQUcsRUFBSSxFQUFRLFNBQVUsRUFDakMsR0FBSSxXQUFXLEVBQUUsRUFBUSxPQUN4QixFQUFRLEVBQUUsRUFBUSxNQUNkLFlBQVksSUFDZixNQUFPLEVBSVYsTUFBTSxJQUFJLFdBQVUsb0JBRXJCLEtBQU0sSUFBSSxXQUFVLDJDQUt0QixRQUFPLFFBQVUsU0FBcUIsR0FDckMsTUFBSSxhQUFZLEdBQ1IsRUFFSixVQUFVLE9BQVMsRUFDZixpQkFBaUIsb0JBQW9CLEVBQU8sVUFBVSxJQUV2RCxpQkFBaUIsb0JBQW9COzs7QUMzQzdDLFlBRUEsUUFBTyxRQUFVLFFBQVE7OztBQ0Z6QixPQUFPLFFBQVUsU0FBcUIsR0FDckMsTUFBaUIsUUFBVixHQUFvQyxrQkFBVixJQUF5QyxnQkFBVjs7O0NDa0JqRSxTQUFXLEdBQ1AsR0FRSSxHQUNBLEVBUkEsRUFBTSxpQkFDTixFQUFZLFNBQ1osRUFBZ0IsVUFFaEIsRUFBVSxTQUFVLEVBQUcsR0FDbkIsTUFBTyxHQUFJLEdBSWYsR0FBVSxNQUNWLEVBQWUsV0FDWCxJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssS0FBSyxPQUFRLEVBQUksRUFBSSxJQUN0QyxPQUFzQixLQUFYLEtBQUssR0FDWixNQUFPLE1BQUssSUFJeEIsRUFBYyxXQUVWLElBREEsR0FBSSxHQUFJLEtBQUssU0FDSixHQUNMLE9BQXNCLEtBQVgsS0FBSyxHQUNaLE1BQU8sTUFBSyxJQUl4QixFQUFTLE9BQU8sVUFBVSxTQUMxQixFQUFNLE9BQ04sRUFBVSxNQUFNLFNBQVcsU0FBVSxHQUNqQyxNQUFPLGFBQWMsUUFBNEIsa0JBQW5CLEVBQU8sS0FBSyxJQWM5QyxFQUFNLFNBQVUsRUFBTSxHQUNsQixHQUlJLEdBSkEsRUFBVSxFQUNWLEVBQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxVQUFXLEdBQzdDLEVBQVksRUFBSSxVQUFVLEdBQzFCLEVBQUksRUFFSixLQUNBLEtBQ0EsS0FDQSxFQUFLLENBQ1QsR0FBSSxhQUFlLEVBQ25CLEVBQUksWUFBYyxFQUNsQixFQUFnQixFQUNoQixFQUFPLENBQ1AsS0FBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQVUsT0FBUSxFQUFJLEVBQUksSUFBUyxVQUFZLEdBQVUsS0FDMUUsRUFBUSxLQUFLLEVBQVUsR0FBRyxRQUN0QixFQUFVLEdBQUcsT0FBUyxJQUN0QixFQUFNLEVBQVUsR0FBRyxRQUFVLEVBQVUsSUFJL0MsS0FEQSxFQUFRLEtBQUssR0FDTixFQUFRLEdBQUssR0FHaEIsR0FGQSxFQUFJLEVBQU0sRUFBUSxNQUNsQixFQUFJLEtBQUssRUFBRSxNQUFNLEVBQU8sSUFDcEIsRUFFQSxNQURBLEdBQU8sRUFDQSxDQUdmLEtBQUssRUFBSSxFQUFHLEVBQUksRUFBSSxJQUVoQixHQUFJLFdBREosRUFBSSxFQUFVLElBRVYsR0FBSSxFQUFFLFFBQVUsRUFBUSxHQUFJLENBRXhCLEdBREEsRUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFPLElBQ3BCLEVBQ0EsS0FFSixJQUlJLEdBSEEsSUFDQSxFQUFJLEVBQU0sRUFBUSxJQUNsQixHQUFLLEVBQUksS0FBSyxFQUFFLE1BQU0sRUFBTyxJQUN6QixFQUNBLFlBRUMsT0FFVCxHQUFNLEVBQUUsUUFBVSxNQUl0QixJQURBLEVBQUksS0FBSyxFQUFFLE1BQU0sRUFBTyxJQUNwQixFQUNBLEtBTVosT0FGQSxHQUFPLEVBQ1AsRUFBZ0IsRUFDVCxFQUdmLEdBQUksUUFBVSxFQVdkLEVBQUksVUFBWSxTQUFVLEdBQ3RCLEdBRUksR0FDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQVRBLEVBQVEsRUFBUSxHQUFRLEVBQU8sRUFBSyxNQUFNLEdBQzFDLEVBQUksRUFTSixHQUFNLEdBQ04sSUFDSixLQUFLLEVBQUksRUFBRyxFQUFLLEVBQU0sT0FBUSxFQUFJLEVBQUksSUFBSyxDQUV4QyxJQURBLEtBQ0ssRUFBSSxFQUFHLEVBQUssRUFBRyxPQUFRLEVBQUksRUFBSSxJQUloQyxJQUhBLEVBQUksRUFBRyxHQUFHLEVBQ1YsR0FBUyxFQUFFLEVBQU0sSUFBSyxFQS9IbkIsTUFnSUgsRUFBSSxFQUNHLE1BQ0gsRUFBTyxFQUFNLE1BRVQsRUFBSSxLQUFLLEdBQ1QsRUFBTSxFQUFJLE9BQU8sRUFBSyxPQUlsQyxHQUFLLEVBRVQsTUFBTyxJQVlYLEVBQUksVUFBWSxTQUFVLEdBQ2xCLEdBQ0EsRUFBTSxFQUFJLEdBQUssUUFBUSxvQkFBcUIsTUFDNUMsRUFBTSxJQUFNLEVBQU0sSUFDbEIsRUFBWSxHQUFJLFFBQU8sSUFFdkIsRUFBWSxVQTRCcEIsRUFBSSxHQUFLLFNBQVUsRUFBTSxHQUNyQixHQUFnQixrQkFBTCxHQUNQLE1BQU8sYUFHWCxLQUFLLEdBREQsR0FBUSxFQUFRLEdBQVEsRUFBUSxFQUFLLElBQU0sR0FBUSxHQUFRLEVBQUksR0FBTSxNQUFNLEdBQ3RFLEVBQUksRUFBRyxFQUFLLEVBQU0sT0FBUSxFQUFJLEVBQUksS0FDdEMsU0FBVSxHQUlQLElBQUssR0FERCxHQUZBLEVBQVEsRUFBUSxHQUFRLEVBQU8sRUFBSSxHQUFNLE1BQU0sR0FDL0MsRUFBSSxFQUVDLEVBQUksRUFBRyxFQUFLLEVBQU0sT0FBUSxFQUFJLEVBQUksSUFDdkMsRUFBSSxFQUFFLEVBQ04sRUFBSSxFQUFFLGVBQWUsRUFBTSxLQUFPLEVBQUUsRUFBTSxNQUFRLEVBQUUsRUFBTSxLQUFPLE1BR3JFLEtBREEsRUFBRSxFQUFJLEVBQUUsTUFDSCxFQUFJLEVBQUcsRUFBSyxFQUFFLEVBQUUsT0FBUSxFQUFJLEVBQUksSUFBSyxHQUFJLEVBQUUsRUFBRSxJQUFNLEVBQUcsQ0FDdkQsR0FBUSxDQUNSLFFBRUgsR0FBUyxFQUFFLEVBQUUsS0FBSyxJQUNyQixFQUFNLEdBRVosT0FBTyxVQUFVLElBQ1IsSUFBVyxJQUNaLEVBQUUsUUFBVSxLQW1CeEIsRUFBSSxFQUFJLFNBQVUsR0FDZCxHQUFJLE1BQVcsTUFBTSxLQUFLLFVBQVcsRUFDckMsT0FBTyxZQUNILEVBQUksTUFBTSxNQUFPLEVBQU8sTUFBTSxPQUFPLEdBQU8sVUFBVSxNQUFNLEtBQUssVUFBVyxPQVNwRixFQUFJLEtBQU8sV0FDUCxFQUFPLEdBY1gsRUFBSSxHQUFLLFNBQVUsR0FDZixHQUFJLEdBQU0sRUFBUSxHQUFpQixFQUFjLEtBQUssS0FBTyxDQUM3RCxPQUFJLEdBQ08sR0FBSSxRQUFPLGdCQUFrQixFQUFVLGlCQUFpQixLQUFLLEdBRWpFLEdBV1gsRUFBSSxJQUFNLFdBQ04sTUFBTyxHQUFRLEdBQWlCLEVBQWdCLEVBQWMsTUFBTSxJQWtCeEUsRUFBSSxJQUFNLEVBQUksT0FBUyxTQUFVLEVBQU0sR0FDbkMsSUFBSyxFQUVELFlBREEsRUFBSSxRQUFVLEdBQVUsTUFHNUIsSUFBSSxHQUFRLEVBQVEsR0FBUSxFQUFRLEVBQUssSUFBTSxHQUFRLEdBQVEsRUFBSSxHQUFNLE1BQU0sRUFDL0UsSUFBSSxFQUFNLE9BQVMsRUFDZixJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUN2QyxFQUFJLElBQUksRUFBTSxHQUFJLE9BRjFCLENBTUEsRUFBUSxFQUFRLEdBQVEsRUFBTyxFQUFJLEdBQU0sTUFBTSxFQUMvQyxJQUFJLEdBQ0EsRUFDQSxFQUNBLEVBQUcsRUFBSSxFQUFHLEVBQ1YsR0FBTyxHQUNQLElBQ0osS0FBSyxFQUFJLEVBQUcsRUFBSyxFQUFNLE9BQVEsRUFBSSxFQUFJLElBQ25DLElBQUssRUFBSSxFQUFHLEVBQUksRUFBSSxPQUFRLEdBQUssRUFBTyxPQUFTLEVBQUcsQ0FHaEQsR0FGQSxHQUFVLEVBQUcsR0FDYixFQUFJLEVBQUksR0FBRyxFQXhUUixLQXlUQyxFQUFNLEdBQ0YsRUFBRSxFQUFNLE1BQ1IsRUFBTyxLQUFLLEVBQUUsRUFBTSxLQUNwQixFQUFPLFNBQ0gsRUFBRyxFQUNILEtBQU0sRUFBTSxVQUlwQixLQUFLLElBQU8sR0FBTyxFQUFFLEdBQUssS0FDdEIsRUFBTyxLQUFLLEVBQUUsSUFDZCxFQUFPLFNBQ0gsRUFBRyxFQUNILEtBQU0sSUFJbEIsR0FBSSxPQUFPLE1BQU0sRUFBSyxHQUc5QixJQUFLLEVBQUksRUFBRyxFQUFLLEVBQUksT0FBUSxFQUFJLEVBQUksSUFFakMsSUFEQSxFQUFJLEVBQUksR0FDRCxFQUFFLEdBQUcsQ0FDUixHQUFJLEVBQUcsQ0FDSCxHQUFJLEVBQUUsRUFBRyxDQUNMLElBQUssRUFBSSxFQUFHLEVBQUssRUFBRSxFQUFFLE9BQVEsRUFBSSxFQUFJLElBQUssR0FBSSxFQUFFLEVBQUUsSUFBTSxFQUFHLENBQ3ZELEVBQUUsRUFBRSxPQUFPLEVBQUcsRUFDZCxRQUVILEVBQUUsRUFBRSxjQUFpQixHQUFFLEVBRTVCLElBQUssSUFBTyxHQUFFLEVBQUcsR0FBSSxFQUFFLEVBQUUsR0FBSyxJQUFRLEVBQUUsRUFBRSxHQUFLLEVBQUcsQ0FDOUMsR0FBSSxHQUFRLEVBQUUsRUFBRSxHQUFLLENBQ3JCLEtBQUssRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLEdBQUksRUFBTSxJQUFNLEVBQUcsQ0FDM0QsRUFBTSxPQUFPLEVBQUcsRUFDaEIsUUFFSCxFQUFNLGNBQWlCLEdBQUUsRUFBRSxHQUFLLE9BRWxDLE9BQ0ksR0FBRSxDQUNULEtBQUssSUFBTyxHQUFFLEVBQU8sRUFBRSxFQUFFLEdBQUssSUFBUSxFQUFFLEVBQUUsR0FBSyxTQUNwQyxHQUFFLEVBQUUsR0FBSyxFQUd4QixFQUFJLEVBQUUsRUFJZCxFQUFPLElBQUssRUFBSSxFQUFHLEVBQUssRUFBTyxPQUFRLEVBQUksRUFBSSxJQUFLLENBQ2hELEVBQUksRUFBTyxFQUNYLEtBQUssSUFBTyxHQUFFLEVBQUUsRUFBRSxNQUFNLEVBRXBCLFFBQVMsRUFFYixLQUFLLElBQU8sR0FBRSxFQUFFLEVBQUUsTUFBTSxFQUVwQixRQUFTLFNBR04sR0FBRSxFQUFFLEVBQUUsU0FrQnJCLEVBQUksS0FBTyxTQUFVLEVBQU0sR0FDdkIsR0FBSSxHQUFLLFdBRUwsTUFEQSxHQUFJLElBQUksRUFBTSxHQUNQLEVBQUUsTUFBTSxLQUFNLFdBRXpCLE9BQU8sR0FBSSxHQUFHLEVBQU0sSUFReEIsRUFBSSxRQXhaVSxRQXlaZCxFQUFJLFNBQVcsV0FDWCxNQUFPLDZCQUVYLEVBQUssSUFBTSxFQUNNLG1CQUFWLFNBQXlCLE9BQU8sUUFBVSxPQUFPLFFBQVUsRUFBd0Isa0JBQVgsU0FBeUIsT0FBTyxJQUFNLE9BQU8sU0FBVyxXQUFjLE1BQU8sS0FBVSxFQUFLLElBQU0sR0FDakssbUJBQVYsUUFBd0IsT0FBUzs7O0FDbGIzQyxZQUlBLElBQUksZUFBZ0Isa0RBQ2hCLE1BQVEsTUFBTSxVQUFVLE1BQ3hCLE1BQVEsT0FBTyxVQUFVLFNBQ3pCLFNBQVcsbUJBRWYsUUFBTyxRQUFVLFNBQWMsR0FDM0IsR0FBSSxHQUFTLElBQ2IsSUFBc0Isa0JBQVgsSUFBeUIsTUFBTSxLQUFLLEtBQVksU0FDdkQsS0FBTSxJQUFJLFdBQVUsY0FBZ0IsRUF5QnhDLEtBQUssR0FyQkQsR0FGQSxFQUFPLE1BQU0sS0FBSyxVQUFXLEdBRzdCLEVBQVMsV0FDVCxHQUFJLGVBQWdCLEdBQU8sQ0FDdkIsR0FBSSxHQUFTLEVBQU8sTUFDaEIsS0FDQSxFQUFLLE9BQU8sTUFBTSxLQUFLLFlBRTNCLE9BQUksUUFBTyxLQUFZLEVBQ1osRUFFSixLQUVQLE1BQU8sR0FBTyxNQUNWLEVBQ0EsRUFBSyxPQUFPLE1BQU0sS0FBSyxjQUsvQixFQUFjLEtBQUssSUFBSSxFQUFHLEVBQU8sT0FBUyxFQUFLLFFBQy9DLEtBQ0ssRUFBSSxFQUFHLEVBQUksRUFBYSxJQUM3QixFQUFVLEtBQUssSUFBTSxFQUt6QixJQUZBLEVBQVEsU0FBUyxTQUFVLG9CQUFzQixFQUFVLEtBQUssS0FBTyw2Q0FBNkMsR0FFaEgsRUFBTyxVQUFXLENBQ2xCLEdBQUksR0FBUSxZQUNaLEdBQU0sVUFBWSxFQUFPLFVBQ3pCLEVBQU0sVUFBWSxHQUFJLEdBQ3RCLEVBQU0sVUFBWSxLQUd0QixNQUFPOzs7QUNsRFgsWUFFQSxJQUFJLGdCQUFpQixRQUFRLG1CQUU3QixRQUFPLFFBQVUsU0FBUyxVQUFVLE1BQVE7OztDQ0M1QyxTQUFVLEVBQVEsRUFBVSxFQUFZLEdBQ3RDLFlBa0JGLFNBQVMsR0FBa0IsRUFBSSxFQUFTLEdBQ3BDLE1BQU8sWUFBVyxFQUFPLEVBQUksR0FBVSxHQVkzQyxRQUFTLEdBQWUsRUFBSyxFQUFJLEdBQzdCLFFBQUksTUFBTSxRQUFRLEtBQ2QsRUFBSyxFQUFLLEVBQVEsR0FBSyxJQUNoQixHQVdmLFFBQVMsR0FBSyxFQUFLLEVBQVUsR0FDekIsR0FBSSxFQUVKLElBQUssRUFJTCxHQUFJLEVBQUksUUFDSixFQUFJLFFBQVEsRUFBVSxPQUNuQixJQUFJLEVBQUksU0FBVyxFQUV0QixJQURBLEVBQUksRUFDRyxFQUFJLEVBQUksUUFDWCxFQUFTLEtBQUssRUFBUyxFQUFJLEdBQUksRUFBRyxHQUNsQyxRQUdKLEtBQUssSUFBSyxHQUNOLEVBQUksZUFBZSxJQUFNLEVBQVMsS0FBSyxFQUFTLEVBQUksR0FBSSxFQUFHLEdBWXZFLFFBQVMsR0FBVSxFQUFRLEVBQU0sR0FDN0IsR0FBSSxHQUFxQixzQkFBd0IsRUFBTyxLQUFPLEVBQVUsUUFDekUsT0FBTyxZQUNILEdBQUksR0FBSSxHQUFJLE9BQU0sbUJBQ2QsRUFBUSxHQUFLLEVBQUUsTUFBUSxFQUFFLE1BQU0sUUFBUSxrQkFBbUIsSUFDekQsUUFBUSxjQUFlLElBQ3ZCLFFBQVEsNkJBQThCLGtCQUFvQixzQkFFM0QsRUFBTSxFQUFPLFVBQVksRUFBTyxRQUFRLE1BQVEsRUFBTyxRQUFRLElBSW5FLE9BSEksSUFDQSxFQUFJLEtBQUssRUFBTyxRQUFTLEVBQW9CLEdBRTFDLEVBQU8sTUFBTSxLQUFNLFlBd0VsQyxRQUFTLEdBQVEsRUFBTyxFQUFNLEdBQzFCLEdBQ0ksR0FEQSxFQUFRLEVBQUssU0FHakIsR0FBUyxFQUFNLFVBQVksT0FBTyxPQUFPLEdBQ3pDLEVBQU8sWUFBYyxFQUNyQixFQUFPLE9BQVMsRUFFWixHQUNBLEdBQU8sRUFBUSxHQVV2QixRQUFTLEdBQU8sRUFBSSxHQUNoQixNQUFPLFlBQ0gsTUFBTyxHQUFHLE1BQU0sRUFBUyxZQVdqQyxRQUFTLEdBQVMsRUFBSyxHQUNuQixhQUFXLElBQU8sR0FDUCxFQUFJLE1BQU0sRUFBTyxFQUFLLElBQU0sRUFBWSxFQUFXLEdBRXZELEVBU1gsUUFBUyxHQUFZLEVBQU0sR0FDdkIsTUFBUSxLQUFTLEVBQWEsRUFBTyxFQVN6QyxRQUFTLEdBQWtCLEVBQVEsRUFBTyxHQUN0QyxFQUFLLEVBQVMsR0FBUSxTQUFTLEdBQzNCLEVBQU8saUJBQWlCLEVBQU0sR0FBUyxLQVUvQyxRQUFTLEdBQXFCLEVBQVEsRUFBTyxHQUN6QyxFQUFLLEVBQVMsR0FBUSxTQUFTLEdBQzNCLEVBQU8sb0JBQW9CLEVBQU0sR0FBUyxLQVdsRCxRQUFTLEdBQVUsRUFBTSxHQUNyQixLQUFPLEdBQU0sQ0FDVCxHQUFJLEdBQVEsRUFDUixPQUFPLENBRVgsR0FBTyxFQUFLLFdBRWhCLE9BQU8sRUFTWCxRQUFTLEdBQU0sRUFBSyxHQUNoQixNQUFPLEdBQUksUUFBUSxJQUFTLEVBUWhDLFFBQVMsR0FBUyxHQUNkLE1BQU8sR0FBSSxPQUFPLE1BQU0sUUFVNUIsUUFBUyxHQUFRLEVBQUssRUFBTSxHQUN4QixHQUFJLEVBQUksVUFBWSxFQUNoQixNQUFPLEdBQUksUUFBUSxFQUduQixLQURBLEdBQUksR0FBSSxFQUNELEVBQUksRUFBSSxRQUFRLENBQ25CLEdBQUssR0FBYSxFQUFJLEdBQUcsSUFBYyxJQUFXLEdBQWEsRUFBSSxLQUFPLEVBQ3RFLE1BQU8sRUFFWCxLQUVKLE9BQVEsRUFTaEIsUUFBUyxHQUFRLEdBQ2IsTUFBTyxPQUFNLFVBQVUsTUFBTSxLQUFLLEVBQUssR0FVM0MsUUFBUyxHQUFZLEVBQUssRUFBSyxHQUszQixJQUpBLEdBQUksTUFDQSxLQUNBLEVBQUksRUFFRCxFQUFJLEVBQUksUUFBUSxDQUNuQixHQUFJLEdBQU0sRUFBTSxFQUFJLEdBQUcsR0FBTyxFQUFJLEVBQzlCLEdBQVEsRUFBUSxHQUFPLEdBQ3ZCLEVBQVEsS0FBSyxFQUFJLElBRXJCLEVBQU8sR0FBSyxFQUNaLElBYUosTUFWSSxLQUlJLEVBSEMsRUFHUyxFQUFRLEtBQUssU0FBeUIsRUFBRyxHQUMvQyxNQUFPLEdBQUUsR0FBTyxFQUFFLEtBSFosRUFBUSxRQVFuQixFQVNYLFFBQVMsR0FBUyxFQUFLLEdBS25CLElBSkEsR0FBSSxHQUFRLEVBQ1IsRUFBWSxFQUFTLEdBQUcsY0FBZ0IsRUFBUyxNQUFNLEdBRXZELEVBQUksRUFDRCxFQUFJLEdBQWdCLFFBQVEsQ0FJL0IsR0FIQSxFQUFTLEdBQWdCLElBQ3pCLEVBQU8sRUFBVyxFQUFTLEVBQVksSUFFM0IsR0FDUixNQUFPLEVBRVgsS0FFSixNQUFPLEdBUVgsUUFBUyxLQUNMLE1BQU8sTUFRWCxRQUFTLEdBQW9CLEdBQ3pCLEdBQUksR0FBTSxFQUFRLGVBQWlCLENBQ25DLE9BQVEsR0FBSSxhQUFlLEVBQUksY0FBZ0IsRUF5Q25ELFFBQVMsR0FBTSxFQUFTLEdBQ3BCLEdBQUksR0FBTyxJQUNYLE1BQUssUUFBVSxFQUNmLEtBQUssU0FBVyxFQUNoQixLQUFLLFFBQVUsRUFBUSxRQUN2QixLQUFLLE9BQVMsRUFBUSxRQUFRLFlBSTlCLEtBQUssV0FBYSxTQUFTLEdBQ25CLEVBQVMsRUFBUSxRQUFRLFFBQVMsS0FDbEMsRUFBSyxRQUFRLElBSXJCLEtBQUssT0FvQ1QsUUFBUyxHQUFvQixHQUN6QixHQUNJLEdBQWEsRUFBUSxRQUFRLFVBYWpDLE9BQU8sS0FYSCxJQUVPLEdBQ0EsRUFDQSxHQUNBLEVBQ0MsR0FHRCxFQUZBLElBSU8sRUFBUyxHQVMvQixRQUFTLEdBQWEsRUFBUyxFQUFXLEdBQ3RDLEdBQUksR0FBYyxFQUFNLFNBQVMsT0FDN0IsRUFBcUIsRUFBTSxnQkFBZ0IsT0FDM0MsRUFBVyxFQUFZLElBQWdCLEVBQWMsR0FBdUIsRUFDNUUsRUFBVyxHQUFhLEdBQVksS0FBa0IsRUFBYyxHQUF1QixDQUUvRixHQUFNLFVBQVksRUFDbEIsRUFBTSxVQUFZLEVBRWQsSUFDQSxFQUFRLFlBS1osRUFBTSxVQUFZLEVBR2xCLEVBQWlCLEVBQVMsR0FHMUIsRUFBUSxLQUFLLGVBQWdCLEdBRTdCLEVBQVEsVUFBVSxHQUNsQixFQUFRLFFBQVEsVUFBWSxFQVFoQyxRQUFTLEdBQWlCLEVBQVMsR0FDL0IsR0FBSSxHQUFVLEVBQVEsUUFDbEIsRUFBVyxFQUFNLFNBQ2pCLEVBQWlCLEVBQVMsTUFHekIsR0FBUSxhQUNULEVBQVEsV0FBYSxFQUFxQixJQUkxQyxFQUFpQixJQUFNLEVBQVEsY0FDL0IsRUFBUSxjQUFnQixFQUFxQixHQUNuQixJQUFuQixJQUNQLEVBQVEsZUFBZ0IsRUFHNUIsSUFBSSxHQUFhLEVBQVEsV0FDckIsRUFBZ0IsRUFBUSxjQUN4QixFQUFlLEVBQWdCLEVBQWMsT0FBUyxFQUFXLE9BRWpFLEVBQVMsRUFBTSxPQUFTLEVBQVUsRUFDdEMsR0FBTSxVQUFZLEtBQ2xCLEVBQU0sVUFBWSxFQUFNLFVBQVksRUFBVyxVQUUvQyxFQUFNLE1BQVEsRUFBUyxFQUFjLEdBQ3JDLEVBQU0sU0FBVyxFQUFZLEVBQWMsR0FFM0MsRUFBZSxFQUFTLEdBQ3hCLEVBQU0sZ0JBQWtCLEVBQWEsRUFBTSxPQUFRLEVBQU0sT0FFekQsSUFBSSxHQUFrQixFQUFZLEVBQU0sVUFBVyxFQUFNLE9BQVEsRUFBTSxPQUN2RSxHQUFNLGlCQUFtQixFQUFnQixFQUN6QyxFQUFNLGlCQUFtQixFQUFnQixFQUN6QyxFQUFNLGdCQUFtQixHQUFJLEVBQWdCLEdBQUssR0FBSSxFQUFnQixHQUFNLEVBQWdCLEVBQUksRUFBZ0IsRUFFaEgsRUFBTSxNQUFRLEVBQWdCLEVBQVMsRUFBYyxTQUFVLEdBQVksRUFDM0UsRUFBTSxTQUFXLEVBQWdCLEVBQVksRUFBYyxTQUFVLEdBQVksRUFFakYsRUFBTSxZQUFlLEVBQVEsVUFBc0MsRUFBTSxTQUFTLE9BQzlFLEVBQVEsVUFBVSxZQUFlLEVBQU0sU0FBUyxPQUFTLEVBQVEsVUFBVSxZQUR0QyxFQUFNLFNBQVMsT0FHeEQsRUFBeUIsRUFBUyxFQUdsQyxJQUFJLEdBQVMsRUFBUSxPQUNqQixHQUFVLEVBQU0sU0FBUyxPQUFRLEtBQ2pDLEVBQVMsRUFBTSxTQUFTLFFBRTVCLEVBQU0sT0FBUyxFQUduQixRQUFTLEdBQWUsRUFBUyxHQUM3QixHQUFJLEdBQVMsRUFBTSxPQUNmLEVBQVMsRUFBUSxnQkFDakIsRUFBWSxFQUFRLGNBQ3BCLEVBQVksRUFBUSxhQUVwQixHQUFNLFlBQWMsSUFBZSxFQUFVLFlBQWMsS0FDM0QsRUFBWSxFQUFRLFdBQ2hCLEVBQUcsRUFBVSxRQUFVLEVBQ3ZCLEVBQUcsRUFBVSxRQUFVLEdBRzNCLEVBQVMsRUFBUSxhQUNiLEVBQUcsRUFBTyxFQUNWLEVBQUcsRUFBTyxJQUlsQixFQUFNLE9BQVMsRUFBVSxHQUFLLEVBQU8sRUFBSSxFQUFPLEdBQ2hELEVBQU0sT0FBUyxFQUFVLEdBQUssRUFBTyxFQUFJLEVBQU8sR0FRcEQsUUFBUyxHQUF5QixFQUFTLEdBQ3ZDLEdBRUksR0FBVSxFQUFXLEVBQVcsRUFGaEMsRUFBTyxFQUFRLGNBQWdCLEVBQy9CLEVBQVksRUFBTSxVQUFZLEVBQUssU0FHdkMsSUFBSSxFQUFNLFdBQWEsS0FBaUIsRUFBWSxJQUFvQixFQUFLLFdBQWEsR0FBWSxDQUNsRyxHQUFJLEdBQVMsRUFBTSxPQUFTLEVBQUssT0FDN0IsRUFBUyxFQUFNLE9BQVMsRUFBSyxPQUU3QixFQUFJLEVBQVksRUFBVyxFQUFRLEVBQ3ZDLEdBQVksRUFBRSxFQUNkLEVBQVksRUFBRSxFQUNkLEVBQVksR0FBSSxFQUFFLEdBQUssR0FBSSxFQUFFLEdBQU0sRUFBRSxFQUFJLEVBQUUsRUFDM0MsRUFBWSxFQUFhLEVBQVEsR0FFakMsRUFBUSxhQUFlLE1BR3ZCLEdBQVcsRUFBSyxTQUNoQixFQUFZLEVBQUssVUFDakIsRUFBWSxFQUFLLFVBQ2pCLEVBQVksRUFBSyxTQUdyQixHQUFNLFNBQVcsRUFDakIsRUFBTSxVQUFZLEVBQ2xCLEVBQU0sVUFBWSxFQUNsQixFQUFNLFVBQVksRUFRdEIsUUFBUyxHQUFxQixHQUsxQixJQUZBLEdBQUksTUFDQSxFQUFJLEVBQ0QsRUFBSSxFQUFNLFNBQVMsUUFDdEIsRUFBUyxJQUNMLFFBQVMsR0FBTSxFQUFNLFNBQVMsR0FBRyxTQUNqQyxRQUFTLEdBQU0sRUFBTSxTQUFTLEdBQUcsVUFFckMsR0FHSixRQUNJLFVBQVcsS0FDWCxTQUFVLEVBQ1YsT0FBUSxFQUFVLEdBQ2xCLE9BQVEsRUFBTSxPQUNkLE9BQVEsRUFBTSxRQVN0QixRQUFTLEdBQVUsR0FDZixHQUFJLEdBQWlCLEVBQVMsTUFHOUIsSUFBdUIsSUFBbkIsRUFDQSxPQUNJLEVBQUcsR0FBTSxFQUFTLEdBQUcsU0FDckIsRUFBRyxHQUFNLEVBQVMsR0FBRyxTQUs3QixLQURBLEdBQUksR0FBSSxFQUFHLEVBQUksRUFBRyxFQUFJLEVBQ2YsRUFBSSxHQUNQLEdBQUssRUFBUyxHQUFHLFFBQ2pCLEdBQUssRUFBUyxHQUFHLFFBQ2pCLEdBR0osUUFDSSxFQUFHLEdBQU0sRUFBSSxHQUNiLEVBQUcsR0FBTSxFQUFJLElBV3JCLFFBQVMsR0FBWSxFQUFXLEVBQUcsR0FDL0IsT0FDSSxFQUFHLEVBQUksR0FBYSxFQUNwQixFQUFHLEVBQUksR0FBYSxHQVU1QixRQUFTLEdBQWEsRUFBRyxHQUNyQixNQUFJLEtBQU0sRUFDQyxHQUdQLEdBQUksSUFBTSxHQUFJLEdBQ1AsRUFBSSxFQUFJLEdBQWlCLEdBRTdCLEVBQUksRUFBSSxHQUFlLEdBVWxDLFFBQVMsR0FBWSxFQUFJLEVBQUksR0FDcEIsSUFDRCxFQUFRLEdBRVosSUFBSSxHQUFJLEVBQUcsRUFBTSxJQUFNLEVBQUcsRUFBTSxJQUM1QixFQUFJLEVBQUcsRUFBTSxJQUFNLEVBQUcsRUFBTSxHQUVoQyxPQUFPLE1BQUssS0FBTSxFQUFJLEVBQU0sRUFBSSxHQVVwQyxRQUFTLEdBQVMsRUFBSSxFQUFJLEdBQ2pCLElBQ0QsRUFBUSxHQUVaLElBQUksR0FBSSxFQUFHLEVBQU0sSUFBTSxFQUFHLEVBQU0sSUFDNUIsRUFBSSxFQUFHLEVBQU0sSUFBTSxFQUFHLEVBQU0sR0FDaEMsT0FBMEIsS0FBbkIsS0FBSyxNQUFNLEVBQUcsR0FBVyxLQUFLLEdBU3pDLFFBQVMsR0FBWSxFQUFPLEdBQ3hCLE1BQU8sR0FBUyxFQUFJLEdBQUksRUFBSSxHQUFJLElBQW1CLEVBQVMsRUFBTSxHQUFJLEVBQU0sR0FBSSxJQVVwRixRQUFTLEdBQVMsRUFBTyxHQUNyQixNQUFPLEdBQVksRUFBSSxHQUFJLEVBQUksR0FBSSxJQUFtQixFQUFZLEVBQU0sR0FBSSxFQUFNLEdBQUksSUFpQjFGLFFBQVMsS0FDTCxLQUFLLEtBQU8sR0FDWixLQUFLLE1BQVEsR0FFYixLQUFLLFNBQVUsRUFFZixFQUFNLE1BQU0sS0FBTSxXQW9FdEIsUUFBUyxLQUNMLEtBQUssS0FBTyxHQUNaLEtBQUssTUFBUSxHQUViLEVBQU0sTUFBTSxLQUFNLFdBRWxCLEtBQUssTUFBUyxLQUFLLFFBQVEsUUFBUSxpQkFvRXZDLFFBQVMsS0FDTCxLQUFLLFNBQVcsR0FDaEIsS0FBSyxNQUFRLEdBQ2IsS0FBSyxTQUFVLEVBRWYsRUFBTSxNQUFNLEtBQU0sV0FzQ3RCLFFBQVMsR0FBdUIsRUFBSSxHQUNoQyxHQUFJLEdBQU0sRUFBUSxFQUFHLFNBQ2pCLEVBQVUsRUFBUSxFQUFHLGVBTXpCLE9BSkksSUFBUSxHQUFZLE1BQ3BCLEVBQU0sRUFBWSxFQUFJLE9BQU8sR0FBVSxjQUFjLEtBR2pELEVBQUssR0FpQmpCLFFBQVMsS0FDTCxLQUFLLFNBQVcsR0FDaEIsS0FBSyxhQUVMLEVBQU0sTUFBTSxLQUFNLFdBMEJ0QixRQUFTLEdBQVcsRUFBSSxHQUNwQixHQUFJLEdBQWEsRUFBUSxFQUFHLFNBQ3hCLEVBQVksS0FBSyxTQUdyQixJQUFJLEdBQVEsR0FBYyxLQUFxQyxJQUF0QixFQUFXLE9BRWhELE1BREEsR0FBVSxFQUFXLEdBQUcsYUFBYyxHQUM5QixFQUFZLEVBR3hCLElBQUksR0FDQSxFQUNBLEVBQWlCLEVBQVEsRUFBRyxnQkFDNUIsS0FDQSxFQUFTLEtBQUssTUFRbEIsSUFMQSxFQUFnQixFQUFXLE9BQU8sU0FBUyxHQUN2QyxNQUFPLEdBQVUsRUFBTSxPQUFRLEtBSS9CLElBQVMsR0FFVCxJQURBLEVBQUksRUFDRyxFQUFJLEVBQWMsUUFDckIsRUFBVSxFQUFjLEdBQUcsYUFBYyxFQUN6QyxHQU1SLEtBREEsRUFBSSxFQUNHLEVBQUksRUFBZSxRQUNsQixFQUFVLEVBQWUsR0FBRyxhQUM1QixFQUFxQixLQUFLLEVBQWUsSUFJekMsR0FBUSxHQUFZLFdBQ2IsR0FBVSxFQUFlLEdBQUcsWUFFdkMsR0FHSixPQUFLLEdBQXFCLFFBTXRCLEVBQVksRUFBYyxPQUFPLEdBQXVCLGNBQWMsR0FDdEUsT0FQSixHQXdCSixRQUFTLEtBQ0wsRUFBTSxNQUFNLEtBQU0sVUFFbEIsSUFBSSxHQUFVLEVBQU8sS0FBSyxRQUFTLEtBQ25DLE1BQUssTUFBUSxHQUFJLEdBQVcsS0FBSyxRQUFTLEdBQzFDLEtBQUssTUFBUSxHQUFJLEdBQVcsS0FBSyxRQUFTLEdBRTFDLEtBQUssYUFBZSxLQUNwQixLQUFLLGVBcUNULFFBQVMsR0FBYyxFQUFXLEdBQzFCLEVBQVksSUFDWixLQUFLLGFBQWUsRUFBVSxnQkFBZ0IsR0FBRyxXQUNqRCxFQUFhLEtBQUssS0FBTSxJQUNqQixHQUFhLEdBQVksS0FDaEMsRUFBYSxLQUFLLEtBQU0sR0FJaEMsUUFBUyxHQUFhLEdBQ2xCLEdBQUksR0FBUSxFQUFVLGdCQUFnQixFQUV0QyxJQUFJLEVBQU0sYUFBZSxLQUFLLGFBQWMsQ0FDeEMsR0FBSSxJQUFhLEVBQUcsRUFBTSxRQUFTLEVBQUcsRUFBTSxRQUM1QyxNQUFLLFlBQVksS0FBSyxFQUN0QixJQUFJLEdBQU0sS0FBSyxZQUNYLEVBQWtCLFdBQ2xCLEdBQUksR0FBSSxFQUFJLFFBQVEsRUFDaEIsSUFBSyxHQUNMLEVBQUksT0FBTyxFQUFHLEdBR3RCLFlBQVcsRUFBaUIsS0FJcEMsUUFBUyxHQUFpQixHQUV0QixJQUFLLEdBREQsR0FBSSxFQUFVLFNBQVMsUUFBUyxFQUFJLEVBQVUsU0FBUyxRQUNsRCxFQUFJLEVBQUcsRUFBSSxLQUFLLFlBQVksT0FBUSxJQUFLLENBQzlDLEdBQUksR0FBSSxLQUFLLFlBQVksR0FDckIsRUFBSyxLQUFLLElBQUksRUFBSSxFQUFFLEdBQUksRUFBSyxLQUFLLElBQUksRUFBSSxFQUFFLEVBQ2hELElBQUksR0FBTSxJQUFrQixHQUFNLEdBQzlCLE9BQU8sRUFHZixPQUFPLEVBc0JYLFFBQVMsR0FBWSxFQUFTLEdBQzFCLEtBQUssUUFBVSxFQUNmLEtBQUssSUFBSSxHQW1HYixRQUFTLEdBQWtCLEdBRXZCLEdBQUksRUFBTSxFQUFTLElBQ2YsTUFBTyxHQUdYLElBQUksR0FBVSxFQUFNLEVBQVMsSUFDekIsRUFBVSxFQUFNLEVBQVMsR0FNN0IsT0FBSSxJQUFXLEVBQ0osR0FJUCxHQUFXLEVBQ0osRUFBVSxHQUFxQixHQUl0QyxFQUFNLEVBQVMsSUFDUixHQUdKLEdBMkRYLFFBQVMsR0FBVyxHQUNoQixLQUFLLFFBQVUsTUFBVyxLQUFLLFNBQVUsT0FFekMsS0FBSyxHQUFLLElBRVYsS0FBSyxRQUFVLEtBR2YsS0FBSyxRQUFRLE9BQVMsRUFBWSxLQUFLLFFBQVEsUUFBUSxHQUV2RCxLQUFLLE1BQVEsR0FFYixLQUFLLGdCQUNMLEtBQUssZUFxT1QsUUFBUyxHQUFTLEdBQ2QsTUFBSSxHQUFRLEdBQ0QsU0FDQSxFQUFRLEdBQ1IsTUFDQSxFQUFRLEdBQ1IsT0FDQSxFQUFRLEdBQ1IsUUFFSixHQVFYLFFBQVMsR0FBYSxHQUNsQixNQUFJLElBQWEsR0FDTixPQUNBLEdBQWEsR0FDYixLQUNBLEdBQWEsR0FDYixPQUNBLEdBQWEsR0FDYixRQUVKLEdBU1gsUUFBUyxHQUE2QixFQUFpQixHQUNuRCxHQUFJLEdBQVUsRUFBVyxPQUN6QixPQUFJLEdBQ08sRUFBUSxJQUFJLEdBRWhCLEVBUVgsUUFBUyxLQUNMLEVBQVcsTUFBTSxLQUFNLFdBNkQzQixRQUFTLE1BQ0wsRUFBZSxNQUFNLEtBQU0sV0FFM0IsS0FBSyxHQUFLLEtBQ1YsS0FBSyxHQUFLLEtBNEVkLFFBQVMsTUFDTCxFQUFlLE1BQU0sS0FBTSxXQXNDL0IsUUFBUyxNQUNMLEVBQVcsTUFBTSxLQUFNLFdBRXZCLEtBQUssT0FBUyxLQUNkLEtBQUssT0FBUyxLQW1FbEIsUUFBUyxNQUNMLEVBQWUsTUFBTSxLQUFNLFdBOEIvQixRQUFTLE1BQ0wsRUFBZSxNQUFNLEtBQU0sV0EyRC9CLFFBQVMsTUFDTCxFQUFXLE1BQU0sS0FBTSxXQUl2QixLQUFLLE9BQVEsRUFDYixLQUFLLFNBQVUsRUFFZixLQUFLLE9BQVMsS0FDZCxLQUFLLE9BQVMsS0FDZCxLQUFLLE1BQVEsRUFxR2pCLFFBQVMsSUFBTyxFQUFTLEdBR3JCLE1BRkEsR0FBVSxNQUNWLEVBQVEsWUFBYyxFQUFZLEVBQVEsWUFBYSxHQUFPLFNBQVMsUUFDaEUsR0FBSSxJQUFRLEVBQVMsR0FpSWhDLFFBQVMsSUFBUSxFQUFTLEdBQ3RCLEtBQUssUUFBVSxNQUFXLEdBQU8sU0FBVSxPQUUzQyxLQUFLLFFBQVEsWUFBYyxLQUFLLFFBQVEsYUFBZSxFQUV2RCxLQUFLLFlBQ0wsS0FBSyxXQUNMLEtBQUssZUFDTCxLQUFLLGVBRUwsS0FBSyxRQUFVLEVBQ2YsS0FBSyxNQUFRLEVBQW9CLE1BQ2pDLEtBQUssWUFBYyxHQUFJLEdBQVksS0FBTSxLQUFLLFFBQVEsYUFFdEQsR0FBZSxNQUFNLEdBRXJCLEVBQUssS0FBSyxRQUFRLFlBQWEsU0FBUyxHQUNwQyxHQUFJLEdBQWEsS0FBSyxJQUFJLEdBQUssR0FBSyxHQUFJLEVBQUssSUFDN0MsR0FBSyxJQUFNLEVBQVcsY0FBYyxFQUFLLElBQ3pDLEVBQUssSUFBTSxFQUFXLGVBQWUsRUFBSyxLQUMzQyxNQTRQUCxRQUFTLElBQWUsRUFBUyxHQUM3QixHQUFJLEdBQVUsRUFBUSxPQUN0QixJQUFLLEVBQVEsTUFBYixDQUdBLEdBQUksRUFDSixHQUFLLEVBQVEsUUFBUSxTQUFVLFNBQVMsRUFBTyxHQUMzQyxFQUFPLEVBQVMsRUFBUSxNQUFPLEdBQzNCLEdBQ0EsRUFBUSxZQUFZLEdBQVEsRUFBUSxNQUFNLEdBQzFDLEVBQVEsTUFBTSxHQUFRLEdBRXRCLEVBQVEsTUFBTSxHQUFRLEVBQVEsWUFBWSxJQUFTLEtBR3RELElBQ0QsRUFBUSxpQkFTaEIsUUFBUyxJQUFnQixFQUFPLEdBQzVCLEdBQUksR0FBZSxFQUFTLFlBQVksUUFDeEMsR0FBYSxVQUFVLEdBQU8sR0FBTSxHQUNwQyxFQUFhLFFBQVUsRUFDdkIsRUFBSyxPQUFPLGNBQWMsR0FuZ0Y5QixHQStGSSxJQS9GQSxJQUFtQixHQUFJLFNBQVUsTUFBTyxLQUFNLEtBQU0sS0FDcEQsR0FBZSxFQUFTLGNBQWMsT0FFdEMsR0FBZ0IsV0FFaEIsR0FBUSxLQUFLLE1BQ2IsR0FBTSxLQUFLLElBQ1gsR0FBTSxLQUFLLEdBMEZYLElBRHlCLGtCQUFsQixRQUFPLE9BQ0wsU0FBZ0IsR0FDckIsR0FBSSxJQUFXLEdBQXdCLE9BQVgsRUFDeEIsS0FBTSxJQUFJLFdBQVUsNkNBSXhCLEtBQUssR0FERCxHQUFTLE9BQU8sR0FDWCxFQUFRLEVBQUcsRUFBUSxVQUFVLE9BQVEsSUFBUyxDQUNuRCxHQUFJLEdBQVMsVUFBVSxFQUN2QixJQUFJLElBQVcsR0FBd0IsT0FBWCxFQUN4QixJQUFLLEdBQUksS0FBVyxHQUNaLEVBQU8sZUFBZSxLQUN0QixFQUFPLEdBQVcsRUFBTyxJQUt6QyxNQUFPLElBR0YsT0FBTyxNQVdwQixJQUFJLElBQVMsRUFBVSxTQUFnQixFQUFNLEVBQUssR0FHOUMsSUFGQSxHQUFJLEdBQU8sT0FBTyxLQUFLLEdBQ25CLEVBQUksRUFDRCxFQUFJLEVBQUssVUFDUCxHQUFVLEdBQVMsRUFBSyxFQUFLLE1BQVEsS0FDdEMsRUFBSyxFQUFLLElBQU0sRUFBSSxFQUFLLEtBRTdCLEdBRUosT0FBTyxJQUNSLFNBQVUsaUJBU1QsR0FBUSxFQUFVLFNBQWUsRUFBTSxHQUN2QyxNQUFPLElBQU8sRUFBTSxHQUFLLElBQzFCLFFBQVMsaUJBaU5SLEdBQVksRUFlWixHQUFlLHdDQUVmLEdBQWlCLGdCQUFrQixHQUNuQyxHQUF5QixFQUFTLEVBQVEsa0JBQW9CLEVBQzlELEdBQXFCLElBQWlCLEdBQWEsS0FBSyxVQUFVLFdBT2xFLEdBQW1CLEdBRW5CLEdBQWMsRUFDZCxHQUFhLEVBQ2IsR0FBWSxFQUNaLEdBQWUsRUFFZixHQUFpQixFQUNqQixHQUFpQixFQUNqQixHQUFrQixFQUNsQixHQUFlLEVBQ2YsR0FBaUIsR0FFakIsR0FBdUIsR0FBaUIsR0FDeEMsR0FBcUIsR0FBZSxHQUNwQyxHQUFnQixHQUF1QixHQUV2QyxJQUFZLElBQUssS0FDakIsSUFBbUIsVUFBVyxVQTRCbEMsR0FBTSxXQUtGLFFBQVMsYUFLVCxLQUFNLFdBQ0YsS0FBSyxNQUFRLEVBQWtCLEtBQUssUUFBUyxLQUFLLEtBQU0sS0FBSyxZQUM3RCxLQUFLLFVBQVksRUFBa0IsS0FBSyxPQUFRLEtBQUssU0FBVSxLQUFLLFlBQ3BFLEtBQUssT0FBUyxFQUFrQixFQUFvQixLQUFLLFNBQVUsS0FBSyxNQUFPLEtBQUssYUFNeEYsUUFBUyxXQUNMLEtBQUssTUFBUSxFQUFxQixLQUFLLFFBQVMsS0FBSyxLQUFNLEtBQUssWUFDaEUsS0FBSyxVQUFZLEVBQXFCLEtBQUssT0FBUSxLQUFLLFNBQVUsS0FBSyxZQUN2RSxLQUFLLE9BQVMsRUFBcUIsRUFBb0IsS0FBSyxTQUFVLEtBQUssTUFBTyxLQUFLLGFBNFQvRixJQUFJLEtBQ0EsVUFBVyxHQUNYLFVBQVcsR0FDWCxRQUFTLElBR1QsR0FBdUIsWUFDdkIsR0FBc0IsbUJBZ0IxQixHQUFRLEVBQVksR0FLaEIsUUFBUyxTQUFtQixHQUN4QixHQUFJLEdBQVksR0FBZ0IsRUFBRyxLQUcvQixHQUFZLElBQTZCLElBQWQsRUFBRyxTQUM5QixLQUFLLFNBQVUsR0FHZixFQUFZLElBQTJCLElBQWIsRUFBRyxRQUM3QixFQUFZLElBSVgsS0FBSyxVQUlOLEVBQVksS0FDWixLQUFLLFNBQVUsR0FHbkIsS0FBSyxTQUFTLEtBQUssUUFBUyxHQUN4QixVQUFXLEdBQ1gsaUJBQWtCLEdBQ2xCLFlBdmJXLFFBd2JYLFNBQVUsT0FLdEIsSUFBSSxLQUNBLFlBQWEsR0FDYixZQUFhLEdBQ2IsVUFBVyxHQUNYLGNBQWUsR0FDZixXQUFZLElBSVosSUFDQSxFQXpjbUIsUUEwY25CLEVBemNpQixNQTBjakIsRUF6Y21CLFFBMGNuQixFQXpjb0IsVUE0Y3BCLEdBQXlCLGNBQ3pCLEdBQXdCLHFDQUd4QixHQUFPLGlCQUFtQixFQUFPLGVBQ2pDLEdBQXlCLGdCQUN6QixHQUF3Qiw2Q0FpQjVCLEVBQVEsRUFBbUIsR0FLdkIsUUFBUyxTQUFtQixHQUN4QixHQUFJLEdBQVEsS0FBSyxNQUNiLEdBQWdCLEVBRWhCLEVBQXNCLEVBQUcsS0FBSyxjQUFjLFFBQVEsS0FBTSxJQUMxRCxFQUFZLEdBQWtCLEdBQzlCLEVBQWMsR0FBdUIsRUFBRyxjQUFnQixFQUFHLFlBRTNELEVBbmZXLFNBbWZBLEVBR1gsRUFBYSxFQUFRLEVBQU8sRUFBRyxVQUFXLFlBRzFDLEdBQVksS0FBOEIsSUFBZCxFQUFHLFFBQWdCLEdBQzNDLEVBQWEsSUFDYixFQUFNLEtBQUssR0FDWCxFQUFhLEVBQU0sT0FBUyxHQUV6QixHQUFhLEdBQVksTUFDaEMsR0FBZ0IsR0FJaEIsRUFBYSxJQUtqQixFQUFNLEdBQWMsRUFFcEIsS0FBSyxTQUFTLEtBQUssUUFBUyxHQUN4QixTQUFVLEVBQ1YsaUJBQWtCLEdBQ2xCLFlBQWEsRUFDYixTQUFVLElBR1YsR0FFQSxFQUFNLE9BQU8sRUFBWSxNQUtyQyxJQUFJLEtBQ0EsV0FBWSxHQUNaLFVBQVcsR0FDWCxTQUFVLEdBQ1YsWUFBYSxJQUdiLEdBQTZCLGFBQzdCLEdBQTZCLDJDQWVqQyxHQUFRLEVBQWtCLEdBQ3RCLFFBQVMsU0FBbUIsR0FDeEIsR0FBSSxHQUFPLEdBQXVCLEVBQUcsS0FPckMsSUFKSSxJQUFTLEtBQ1QsS0FBSyxTQUFVLEdBR2QsS0FBSyxRQUFWLENBSUEsR0FBSSxHQUFVLEVBQXVCLEtBQUssS0FBTSxFQUFJLEVBR2hELElBQVEsR0FBWSxLQUFpQixFQUFRLEdBQUcsT0FBUyxFQUFRLEdBQUcsUUFBVyxJQUMvRSxLQUFLLFNBQVUsR0FHbkIsS0FBSyxTQUFTLEtBQUssUUFBUyxHQUN4QixTQUFVLEVBQVEsR0FDbEIsZ0JBQWlCLEVBQVEsR0FDekIsWUF0a0JXLFFBdWtCWCxTQUFVLE9Bc0J0QixJQUFJLEtBQ0EsV0FBWSxHQUNaLFVBQVcsR0FDWCxTQUFVLEdBQ1YsWUFBYSxJQUdiLEdBQXNCLDJDQWMxQixHQUFRLEVBQVksR0FDaEIsUUFBUyxTQUFvQixHQUN6QixHQUFJLEdBQU8sR0FBZ0IsRUFBRyxNQUMxQixFQUFVLEVBQVcsS0FBSyxLQUFNLEVBQUksRUFDbkMsSUFJTCxLQUFLLFNBQVMsS0FBSyxRQUFTLEdBQ3hCLFNBQVUsRUFBUSxHQUNsQixnQkFBaUIsRUFBUSxHQUN6QixZQTduQlcsUUE4bkJYLFNBQVUsTUE0RXRCLElBQUksSUFBZ0IsS0FDaEIsR0FBaUIsRUFhckIsR0FBUSxFQUFpQixHQU9yQixRQUFTLFNBQW9CLEVBQVMsRUFBWSxHQUM5QyxHQUFJLEdBaHVCVyxTQWd1QkEsRUFBVSxZQUNyQixFQS90QlcsU0ErdEJBLEVBQVUsV0FFekIsTUFBSSxHQUFXLEVBQVUsb0JBQXNCLEVBQVUsbUJBQW1CLGtCQUE1RSxDQUtBLEdBQUksRUFDQSxFQUFjLEtBQUssS0FBTSxFQUFZLE9BQ2xDLElBQUksR0FBVyxFQUFpQixLQUFLLEtBQU0sR0FDOUMsTUFHSixNQUFLLFNBQVMsRUFBUyxFQUFZLEtBTXZDLFFBQVMsV0FDTCxLQUFLLE1BQU0sVUFDWCxLQUFLLE1BQU0sWUEwQ25CLElBQUksSUFBd0IsRUFBUyxHQUFhLE1BQU8sZUFDckQsR0FBc0IsS0FBMEIsRUFJaEQsR0FBb0IsT0FDcEIsR0FBNEIsZUFDNUIsR0FBb0IsT0FDcEIsR0FBcUIsUUFDckIsR0FBcUIsUUFDckIsR0E0SUosV0FDSSxJQUFLLEdBQ0QsT0FBTyxDQUVYLElBQUksTUFDQSxFQUFjLEVBQU8sS0FBTyxFQUFPLElBQUksUUFPM0MsUUFOQyxPQUFRLGVBQWdCLFFBQVMsUUFBUyxjQUFlLFFBQVEsUUFBUSxTQUFTLEdBSS9FLEVBQVMsSUFBTyxHQUFjLEVBQU8sSUFBSSxTQUFTLGVBQWdCLEtBRS9ELElBMUlYLEdBQVksV0FLUixJQUFLLFNBQVMsR0F6QlMsV0EyQmYsSUFDQSxFQUFRLEtBQUssV0FHYixJQUF1QixLQUFLLFFBQVEsUUFBUSxPQUFTLEdBQWlCLEtBQ3RFLEtBQUssUUFBUSxRQUFRLE1BQU0sSUFBeUIsR0FFeEQsS0FBSyxRQUFVLEVBQU0sY0FBYyxRQU12QyxPQUFRLFdBQ0osS0FBSyxJQUFJLEtBQUssUUFBUSxRQUFRLGNBT2xDLFFBQVMsV0FDTCxHQUFJLEtBTUosT0FMQSxHQUFLLEtBQUssUUFBUSxZQUFhLFNBQVMsR0FDaEMsRUFBUyxFQUFXLFFBQVEsUUFBUyxNQUNyQyxFQUFVLEVBQVEsT0FBTyxFQUFXLHFCQUdyQyxFQUFrQixFQUFRLEtBQUssT0FPMUMsZ0JBQWlCLFNBQVMsR0FDdEIsR0FBSSxHQUFXLEVBQU0sU0FDakIsRUFBWSxFQUFNLGVBR3RCLElBQUksS0FBSyxRQUFRLFFBQVEsVUFFckIsV0FEQSxHQUFTLGdCQUliLElBQUksR0FBVSxLQUFLLFFBQ2YsRUFBVSxFQUFNLEVBQVMsTUFBdUIsR0FBaUIsSUFDakUsRUFBVSxFQUFNLEVBQVMsTUFBd0IsR0FBaUIsSUFDbEUsRUFBVSxFQUFNLEVBQVMsTUFBd0IsR0FBaUIsR0FFdEUsSUFBSSxFQUFTLENBR1QsR0FBSSxHQUF5QyxJQUExQixFQUFNLFNBQVMsT0FDOUIsRUFBZ0IsRUFBTSxTQUFXLEVBQ2pDLEVBQWlCLEVBQU0sVUFBWSxHQUV2QyxJQUFJLEdBQWdCLEdBQWlCLEVBQ2pDLE9BSVIsTUFBSSxJQUFXLE1BQWYsR0FLSSxHQUNDLEdBQVcsRUFBWSxJQUN2QixHQUFXLEVBQVksR0FDakIsS0FBSyxXQUFXLE9BSDNCLElBV0osV0FBWSxTQUFTLEdBQ2pCLEtBQUssUUFBUSxRQUFRLFdBQVksRUFDakMsRUFBUyxrQkFpRmpCLElBQUksSUFBaUIsRUFDakIsR0FBYyxFQUNkLEdBQWdCLEVBQ2hCLEdBQWMsRUFDZCxHQUFtQixHQUNuQixHQUFrQixFQXlCdEIsR0FBVyxXQUtQLFlBT0EsSUFBSyxTQUFTLEdBS1YsTUFKQSxJQUFPLEtBQUssUUFBUyxHQUdyQixLQUFLLFNBQVcsS0FBSyxRQUFRLFlBQVksU0FDbEMsTUFRWCxjQUFlLFNBQVMsR0FDcEIsR0FBSSxFQUFlLEVBQWlCLGdCQUFpQixNQUNqRCxNQUFPLEtBR1gsSUFBSSxHQUFlLEtBQUssWUFNeEIsT0FMQSxHQUFrQixFQUE2QixFQUFpQixNQUMzRCxFQUFhLEVBQWdCLE1BQzlCLEVBQWEsRUFBZ0IsSUFBTSxFQUNuQyxFQUFnQixjQUFjLE9BRTNCLE1BUVgsa0JBQW1CLFNBQVMsR0FDeEIsTUFBSSxHQUFlLEVBQWlCLG9CQUFxQixNQUM5QyxNQUdYLEVBQWtCLEVBQTZCLEVBQWlCLFlBQ3pELE1BQUssYUFBYSxFQUFnQixJQUNsQyxPQVFYLGVBQWdCLFNBQVMsR0FDckIsR0FBSSxFQUFlLEVBQWlCLGlCQUFrQixNQUNsRCxNQUFPLEtBR1gsSUFBSSxHQUFjLEtBQUssV0FNdkIsT0FMQSxHQUFrQixFQUE2QixFQUFpQixPQUNqQixJQUEzQyxFQUFRLEVBQWEsS0FDckIsRUFBWSxLQUFLLEdBQ2pCLEVBQWdCLGVBQWUsT0FFNUIsTUFRWCxtQkFBb0IsU0FBUyxHQUN6QixHQUFJLEVBQWUsRUFBaUIscUJBQXNCLE1BQ3RELE1BQU8sS0FHWCxHQUFrQixFQUE2QixFQUFpQixLQUNoRSxJQUFJLEdBQVEsRUFBUSxLQUFLLFlBQWEsRUFJdEMsT0FISSxJQUFTLEdBQ1QsS0FBSyxZQUFZLE9BQU8sRUFBTyxHQUU1QixNQU9YLG1CQUFvQixXQUNoQixNQUFPLE1BQUssWUFBWSxPQUFTLEdBUXJDLGlCQUFrQixTQUFTLEdBQ3ZCLFFBQVMsS0FBSyxhQUFhLEVBQWdCLEtBUS9DLEtBQU0sU0FBUyxHQUlYLFFBQVMsR0FBSyxHQUNWLEVBQUssUUFBUSxLQUFLLEVBQU8sR0FKN0IsR0FBSSxHQUFPLEtBQ1AsRUFBUSxLQUFLLEtBT2IsR0FBUSxJQUNSLEVBQUssRUFBSyxRQUFRLE1BQVEsRUFBUyxJQUd2QyxFQUFLLEVBQUssUUFBUSxPQUVkLEVBQU0saUJBQ04sRUFBSyxFQUFNLGlCQUlYLEdBQVMsSUFDVCxFQUFLLEVBQUssUUFBUSxNQUFRLEVBQVMsS0FVM0MsUUFBUyxTQUFTLEdBQ2QsR0FBSSxLQUFLLFVBQ0wsTUFBTyxNQUFLLEtBQUssRUFHckIsTUFBSyxNQTdLTSxJQW9MZixRQUFTLFdBRUwsSUFEQSxHQUFJLEdBQUksRUFDRCxFQUFJLEtBQUssWUFBWSxRQUFRLENBQ2hDLEtBQU0sS0FBSyxZQUFZLEdBQUcsT0F2TG5CLEdBdUwyQyxLQUM5QyxPQUFPLENBRVgsS0FFSixPQUFPLEdBT1gsVUFBVyxTQUFTLEdBR2hCLEdBQUksR0FBaUIsTUFBVyxFQUdoQyxLQUFLLEVBQVMsS0FBSyxRQUFRLFFBQVMsS0FBTSxJQUd0QyxNQUZBLE1BQUssYUFDTCxLQUFLLE1BM01FLEdBZ05QLE1BQUssT0FBUyxHQUFtQixHQWhOMUIsTUFpTlAsS0FBSyxNQUFRLElBR2pCLEtBQUssTUFBUSxLQUFLLFFBQVEsR0FJdEIsS0FBSyxPQUFTLEdBQWMsR0FBZ0IsR0FBYyxLQUMxRCxLQUFLLFFBQVEsSUFXckIsUUFBUyxTQUFTLEtBT2xCLGVBQWdCLGFBT2hCLE1BQU8sY0E4RFgsRUFBUSxFQUFnQixHQUtwQixVQUtJLFNBQVUsR0FTZCxTQUFVLFNBQVMsR0FDZixHQUFJLEdBQWlCLEtBQUssUUFBUSxRQUNsQyxPQUEwQixLQUFuQixHQUF3QixFQUFNLFNBQVMsU0FBVyxHQVM3RCxRQUFTLFNBQVMsR0FDZCxHQUFJLEdBQVEsS0FBSyxNQUNiLEVBQVksRUFBTSxVQUVsQixFQUFlLEdBQVMsR0FBYyxJQUN0QyxFQUFVLEtBQUssU0FBUyxFQUc1QixPQUFJLEtBQWlCLEVBQVksS0FBaUIsR0FDdkMsRUFBUSxHQUNSLEdBQWdCLEVBQ25CLEVBQVksR0FDTCxFQUFRLEdBQ04sRUFBUSxHQUdkLEVBQVEsR0FGSixHQTVWSixNQWlYbkIsRUFBUSxHQUFlLEdBS25CLFVBQ0ksTUFBTyxNQUNQLFVBQVcsR0FDWCxTQUFVLEVBQ1YsVUFBVyxJQUdmLGVBQWdCLFdBQ1osR0FBSSxHQUFZLEtBQUssUUFBUSxVQUN6QixJQU9KLE9BTkksR0FBWSxJQUNaLEVBQVEsS0FBSyxJQUViLEVBQVksSUFDWixFQUFRLEtBQUssSUFFVixHQUdYLGNBQWUsU0FBUyxHQUNwQixHQUFJLEdBQVUsS0FBSyxRQUNmLEdBQVcsRUFDWCxFQUFXLEVBQU0sU0FDakIsRUFBWSxFQUFNLFVBQ2xCLEVBQUksRUFBTSxPQUNWLEVBQUksRUFBTSxNQWVkLE9BWk0sR0FBWSxFQUFRLFlBQ2xCLEVBQVEsVUFBWSxJQUNwQixFQUFtQixJQUFOLEVBQVcsR0FBa0IsRUFBSSxFQUFLLEdBQWlCLEdBQ3BFLEVBQVcsR0FBSyxLQUFLLEdBQ3JCLEVBQVcsS0FBSyxJQUFJLEVBQU0sVUFFMUIsRUFBbUIsSUFBTixFQUFXLEdBQWtCLEVBQUksRUFBSyxHQUFlLEdBQ2xFLEVBQVcsR0FBSyxLQUFLLEdBQ3JCLEVBQVcsS0FBSyxJQUFJLEVBQU0sVUFHbEMsRUFBTSxVQUFZLEVBQ1gsR0FBWSxFQUFXLEVBQVEsV0FBYSxFQUFZLEVBQVEsV0FHM0UsU0FBVSxTQUFTLEdBQ2YsTUFBTyxHQUFlLFVBQVUsU0FBUyxLQUFLLEtBQU0sS0FDL0MsS0FBSyxNQUFRLE1BQWtCLEtBQUssTUFBUSxLQUFnQixLQUFLLGNBQWMsS0FHeEYsS0FBTSxTQUFTLEdBRVgsS0FBSyxHQUFLLEVBQU0sT0FDaEIsS0FBSyxHQUFLLEVBQU0sTUFFaEIsSUFBSSxHQUFZLEVBQWEsRUFBTSxVQUUvQixLQUNBLEVBQU0sZ0JBQWtCLEtBQUssUUFBUSxNQUFRLEdBRWpELEtBQUssT0FBTyxLQUFLLEtBQUssS0FBTSxNQWNwQyxFQUFRLEdBQWlCLEdBS3JCLFVBQ0ksTUFBTyxRQUNQLFVBQVcsRUFDWCxTQUFVLEdBR2QsZUFBZ0IsV0FDWixPQUFRLEtBR1osU0FBVSxTQUFTLEdBQ2YsTUFBTyxNQUFLLE9BQU8sU0FBUyxLQUFLLEtBQU0sS0FDbEMsS0FBSyxJQUFJLEVBQU0sTUFBUSxHQUFLLEtBQUssUUFBUSxXQUFhLEtBQUssTUFBUSxLQUc1RSxLQUFNLFNBQVMsR0FDWCxHQUFvQixJQUFoQixFQUFNLE1BQWEsQ0FDbkIsR0FBSSxHQUFRLEVBQU0sTUFBUSxFQUFJLEtBQU8sS0FDckMsR0FBTSxnQkFBa0IsS0FBSyxRQUFRLE1BQVEsRUFFakQsS0FBSyxPQUFPLEtBQUssS0FBSyxLQUFNLE1BaUJwQyxFQUFRLEdBQWlCLEdBS3JCLFVBQ0ksTUFBTyxRQUNQLFNBQVUsRUFDVixLQUFNLElBQ04sVUFBVyxHQUdmLGVBQWdCLFdBQ1osT0FBUSxLQUdaLFFBQVMsU0FBUyxHQUNkLEdBQUksR0FBVSxLQUFLLFFBQ2YsRUFBZ0IsRUFBTSxTQUFTLFNBQVcsRUFBUSxTQUNsRCxFQUFnQixFQUFNLFNBQVcsRUFBUSxVQUN6QyxFQUFZLEVBQU0sVUFBWSxFQUFRLElBTTFDLElBSkEsS0FBSyxPQUFTLEdBSVQsSUFBa0IsR0FBa0IsRUFBTSxXQUFhLEdBQVksTUFBa0IsRUFDdEYsS0FBSyxZQUNGLElBQUksRUFBTSxVQUFZLEdBQ3pCLEtBQUssUUFDTCxLQUFLLE9BQVMsRUFBa0IsV0FDNUIsS0FBSyxNQUFRLEdBQ2IsS0FBSyxXQUNOLEVBQVEsS0FBTSxVQUNkLElBQUksRUFBTSxVQUFZLEdBQ3pCLE1BQU8sR0FFWCxPQTdnQlcsS0FnaEJmLE1BQU8sV0FDSCxhQUFhLEtBQUssU0FHdEIsS0FBTSxTQUFTLEdBQ1AsS0FBSyxRQUFVLEtBSWYsR0FBVSxFQUFNLFVBQVksR0FDNUIsS0FBSyxRQUFRLEtBQUssS0FBSyxRQUFRLE1BQVEsS0FBTSxJQUU3QyxLQUFLLE9BQU8sVUFBWSxLQUN4QixLQUFLLFFBQVEsS0FBSyxLQUFLLFFBQVEsTUFBTyxLQUFLLGFBZXZELEVBQVEsR0FBa0IsR0FLdEIsVUFDSSxNQUFPLFNBQ1AsVUFBVyxFQUNYLFNBQVUsR0FHZCxlQUFnQixXQUNaLE9BQVEsS0FHWixTQUFVLFNBQVMsR0FDZixNQUFPLE1BQUssT0FBTyxTQUFTLEtBQUssS0FBTSxLQUNsQyxLQUFLLElBQUksRUFBTSxVQUFZLEtBQUssUUFBUSxXQUFhLEtBQUssTUFBUSxPQWMvRSxFQUFRLEdBQWlCLEdBS3JCLFVBQ0ksTUFBTyxRQUNQLFVBQVcsR0FDWCxTQUFVLEdBQ1YsVUFBVyxHQUF1QixHQUNsQyxTQUFVLEdBR2QsZUFBZ0IsV0FDWixNQUFPLElBQWMsVUFBVSxlQUFlLEtBQUssT0FHdkQsU0FBVSxTQUFTLEdBQ2YsR0FDSSxHQURBLEVBQVksS0FBSyxRQUFRLFNBVzdCLE9BUkksSUFBYSxHQUF1QixJQUNwQyxFQUFXLEVBQU0sZ0JBQ1YsRUFBWSxHQUNuQixFQUFXLEVBQU0saUJBQ1YsRUFBWSxLQUNuQixFQUFXLEVBQU0sa0JBR2QsS0FBSyxPQUFPLFNBQVMsS0FBSyxLQUFNLElBQ25DLEVBQVksRUFBTSxpQkFDbEIsRUFBTSxTQUFXLEtBQUssUUFBUSxXQUM5QixFQUFNLGFBQWUsS0FBSyxRQUFRLFVBQ2xDLEdBQUksR0FBWSxLQUFLLFFBQVEsVUFBWSxFQUFNLFVBQVksSUFHbkUsS0FBTSxTQUFTLEdBQ1gsR0FBSSxHQUFZLEVBQWEsRUFBTSxnQkFDL0IsSUFDQSxLQUFLLFFBQVEsS0FBSyxLQUFLLFFBQVEsTUFBUSxFQUFXLEdBR3RELEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxNQUFPLE1BMkI5QyxFQUFRLEdBQWUsR0FLbkIsVUFDSSxNQUFPLE1BQ1AsU0FBVSxFQUNWLEtBQU0sRUFDTixTQUFVLElBQ1YsS0FBTSxJQUNOLFVBQVcsRUFDWCxhQUFjLElBR2xCLGVBQWdCLFdBQ1osT0FBUSxLQUdaLFFBQVMsU0FBUyxHQUNkLEdBQUksR0FBVSxLQUFLLFFBRWYsRUFBZ0IsRUFBTSxTQUFTLFNBQVcsRUFBUSxTQUNsRCxFQUFnQixFQUFNLFNBQVcsRUFBUSxVQUN6QyxFQUFpQixFQUFNLFVBQVksRUFBUSxJQUkvQyxJQUZBLEtBQUssUUFFQSxFQUFNLFVBQVksSUFBZ0MsSUFBZixLQUFLLE1BQ3pDLE1BQU8sTUFBSyxhQUtoQixJQUFJLEdBQWlCLEdBQWtCLEVBQWUsQ0FDbEQsR0FBSSxFQUFNLFdBQWEsR0FDbkIsTUFBTyxNQUFLLGFBR2hCLElBQUksSUFBZ0IsS0FBSyxPQUFTLEVBQU0sVUFBWSxLQUFLLE1BQVEsRUFBUSxTQUNyRSxHQUFpQixLQUFLLFNBQVcsRUFBWSxLQUFLLFFBQVMsRUFBTSxRQUFVLEVBQVEsWUFFdkYsTUFBSyxNQUFRLEVBQU0sVUFDbkIsS0FBSyxRQUFVLEVBQU0sT0FFaEIsR0FBa0IsRUFHbkIsS0FBSyxPQUFTLEVBRmQsS0FBSyxNQUFRLEVBS2pCLEtBQUssT0FBUyxDQUtkLElBQWlCLElBREYsS0FBSyxNQUFRLEVBQVEsS0FJaEMsTUFBSyxNQUFLLHNCQUdOLEtBQUssT0FBUyxFQUFrQixXQUM1QixLQUFLLE1BQVEsR0FDYixLQUFLLFdBQ04sRUFBUSxTQUFVLE1BQ2QsSUFOQSxHQVVuQixNQXR0QlcsS0F5dEJmLFlBQWEsV0FJVCxNQUhBLE1BQUssT0FBUyxFQUFrQixXQUM1QixLQUFLLE1BM3RCRSxJQTR0QlIsS0FBSyxRQUFRLFNBQVUsTUE1dEJmLElBZ3VCZixNQUFPLFdBQ0gsYUFBYSxLQUFLLFNBR3RCLEtBQU0sV0FDRSxLQUFLLE9BQVMsS0FDZCxLQUFLLE9BQU8sU0FBVyxLQUFLLE1BQzVCLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxNQUFPLEtBQUssWUFvQnZELEdBQU8sUUFBVSxRQU1qQixHQUFPLFVBT0gsV0FBVyxFQVFYLFlBbDlCdUIsVUF3OUJ2QixRQUFRLEVBU1IsWUFBYSxLQU9iLFdBQVksS0FPWixTQUVLLElBQW1CLFFBQVEsS0FDM0IsSUFBa0IsUUFBUSxJQUFTLFlBQ25DLElBQWtCLFVBQVcsTUFDN0IsSUFBZ0IsVUFBVyxLQUF3QixXQUNuRCxLQUNBLElBQWdCLE1BQU8sWUFBYSxLQUFNLElBQUssU0FDL0MsS0FRTCxVQU1JLFdBQVksT0FPWixZQUFhLE9BU2IsYUFBYyxPQU9kLGVBQWdCLE9BT2hCLFNBQVUsT0FRVixrQkFBbUIsaUJBb0MzQixJQUFRLFdBTUosSUFBSyxTQUFTLEdBYVYsTUFaQSxJQUFPLEtBQUssUUFBUyxHQUdqQixFQUFRLGFBQ1IsS0FBSyxZQUFZLFNBRWpCLEVBQVEsY0FFUixLQUFLLE1BQU0sVUFDWCxLQUFLLE1BQU0sT0FBUyxFQUFRLFlBQzVCLEtBQUssTUFBTSxRQUVSLE1BU1gsS0FBTSxTQUFTLEdBQ1gsS0FBSyxRQUFRLFFBQVUsRUE1RGIsRUFEUCxHQXNFUCxVQUFXLFNBQVMsR0FDaEIsR0FBSSxHQUFVLEtBQUssT0FDbkIsS0FBSSxFQUFRLFFBQVosQ0FLQSxLQUFLLFlBQVksZ0JBQWdCLEVBRWpDLElBQUksR0FDQSxFQUFjLEtBQUssWUFLbkIsRUFBZ0IsRUFBUSxnQkFJdkIsR0FBa0IsR0FBaUIsRUFBYyxNQUFRLE1BQzFELEVBQWdCLEVBQVEsY0FBZ0IsS0FJNUMsS0FEQSxHQUFJLEdBQUksRUFDRCxFQUFJLEVBQVksUUFDbkIsRUFBYSxFQUFZLEdBOUZuQixJQXNHRixFQUFRLFNBQ0gsR0FBaUIsR0FBYyxJQUNoQyxFQUFXLGlCQUFpQixHQUdoQyxFQUFXLFFBRlgsRUFBVyxVQUFVLElBT3BCLEdBQWlCLEVBQVcsT0FBUyxHQUFjLEdBQWdCLE1BQ3BFLEVBQWdCLEVBQVEsY0FBZ0IsR0FFNUMsTUFTUixJQUFLLFNBQVMsR0FDVixHQUFJLFlBQXNCLEdBQ3RCLE1BQU8sRUFJWCxLQUFLLEdBREQsR0FBYyxLQUFLLFlBQ2QsRUFBSSxFQUFHLEVBQUksRUFBWSxPQUFRLElBQ3BDLEdBQUksRUFBWSxHQUFHLFFBQVEsT0FBUyxFQUNoQyxNQUFPLEdBQVksRUFHM0IsT0FBTyxPQVNYLElBQUssU0FBUyxHQUNWLEdBQUksRUFBZSxFQUFZLE1BQU8sTUFDbEMsTUFBTyxLQUlYLElBQUksR0FBVyxLQUFLLElBQUksRUFBVyxRQUFRLE1BUzNDLE9BUkksSUFDQSxLQUFLLE9BQU8sR0FHaEIsS0FBSyxZQUFZLEtBQUssR0FDdEIsRUFBVyxRQUFVLEtBRXJCLEtBQUssWUFBWSxTQUNWLEdBUVgsT0FBUSxTQUFTLEdBQ2IsR0FBSSxFQUFlLEVBQVksU0FBVSxNQUNyQyxNQUFPLEtBTVgsSUFIQSxFQUFhLEtBQUssSUFBSSxHQUdOLENBQ1osR0FBSSxHQUFjLEtBQUssWUFDbkIsRUFBUSxFQUFRLEVBQWEsSUFFbEIsSUFBWCxJQUNBLEVBQVksT0FBTyxFQUFPLEdBQzFCLEtBQUssWUFBWSxVQUl6QixNQUFPLE9BU1gsR0FBSSxTQUFTLEVBQVEsR0FDakIsR0FBSSxJQUFXLEdBR1gsSUFBWSxFQUFoQixDQUlBLEdBQUksR0FBVyxLQUFLLFFBS3BCLE9BSkEsR0FBSyxFQUFTLEdBQVMsU0FBUyxHQUM1QixFQUFTLEdBQVMsRUFBUyxPQUMzQixFQUFTLEdBQU8sS0FBSyxLQUVsQixPQVNYLElBQUssU0FBUyxFQUFRLEdBQ2xCLEdBQUksSUFBVyxFQUFmLENBSUEsR0FBSSxHQUFXLEtBQUssUUFRcEIsT0FQQSxHQUFLLEVBQVMsR0FBUyxTQUFTLEdBQ3ZCLEVBR0QsRUFBUyxJQUFVLEVBQVMsR0FBTyxPQUFPLEVBQVEsRUFBUyxHQUFRLEdBQVUsU0FGdEUsR0FBUyxLQUtqQixPQVFYLEtBQU0sU0FBUyxFQUFPLEdBRWQsS0FBSyxRQUFRLFdBQ2IsR0FBZ0IsRUFBTyxFQUkzQixJQUFJLEdBQVcsS0FBSyxTQUFTLElBQVUsS0FBSyxTQUFTLEdBQU8sT0FDNUQsSUFBSyxHQUFhLEVBQVMsT0FBM0IsQ0FJQSxFQUFLLEtBQU8sRUFDWixFQUFLLGVBQWlCLFdBQ2xCLEVBQUssU0FBUyxpQkFJbEIsS0FEQSxHQUFJLEdBQUksRUFDRCxFQUFJLEVBQVMsUUFDaEIsRUFBUyxHQUFHLEdBQ1osTUFRUixRQUFTLFdBQ0wsS0FBSyxTQUFXLEdBQWUsTUFBTSxHQUVyQyxLQUFLLFlBQ0wsS0FBSyxXQUNMLEtBQUssTUFBTSxVQUNYLEtBQUssUUFBVSxPQXlDdkIsR0FBTyxJQUNILFlBQWEsR0FDYixXQUFZLEdBQ1osVUFBVyxHQUNYLGFBQWMsR0FFZCxlQUFnQixHQUNoQixZQUFhLEdBQ2IsY0FBZSxHQUNmLFlBQWEsR0FDYixpQkFBa0IsR0FDbEIsZ0JBQWlCLEdBQ2pCLGFBbHJDZSxHQW9yQ2YsZUFBZ0IsR0FDaEIsZUFBZ0IsR0FDaEIsZ0JBQWlCLEdBQ2pCLGFBQWMsR0FDZCxlQUFnQixHQUNoQixxQkFBc0IsR0FDdEIsbUJBQW9CLEdBQ3BCLGNBQWUsR0FFZixRQUFTLEdBQ1QsTUFBTyxFQUNQLFlBQWEsRUFFYixXQUFZLEVBQ1osV0FBWSxFQUNaLGtCQUFtQixFQUNuQixnQkFBaUIsRUFDakIsaUJBQWtCLEVBRWxCLFdBQVksRUFDWixlQUFnQixFQUNoQixJQUFLLEdBQ0wsSUFBSyxHQUNMLE1BQU8sR0FDUCxNQUFPLEdBQ1AsT0FBUSxHQUNSLE1BQU8sR0FFUCxHQUFJLEVBQ0osSUFBSyxFQUNMLEtBQU0sRUFDTixNQUFPLEdBQ1AsT0FBUSxHQUNSLE9BQVEsR0FDUixRQUFTLEVBQ1QsT0FBUSxFQUNSLFNBQVUsU0FLc0IsS0FBWCxFQUF5QixFQUEwQixtQkFBVCxNQUF1QixTQUMvRSxPQUFTLEdBRUUsa0JBQVgsU0FBeUIsT0FBTyxJQUN2QyxPQUFPLFdBQ0gsTUFBTyxNQUVhLG1CQUFWLFNBQXlCLE9BQU8sUUFDOUMsT0FBTyxRQUFVLEdBRWpCLEVBQWlCLE9BQUksSUFHdEIsT0FBUTs7OztBQ2xsRlgsWUFFQSxJQUFJLFlBQWEsT0FBTyxPQUNwQixjQUFnQixRQUFRLFVBRTVCLFFBQU8sUUFBVSxXQUNoQixNQUEwQixrQkFBZixjQUNXLGtCQUFYLFVBQ3NCLGdCQUF0QixZQUFXLFNBQ08sZ0JBQWxCLFFBQU8sUUFFWDs7Ozs7QUNYUixZQUdBLFFBQU8sUUFBVSxXQUNoQixHQUFzQixrQkFBWCxTQUFpRSxrQkFBakMsUUFBTyxzQkFBd0MsT0FBTyxDQUNqRyxJQUErQixnQkFBcEIsUUFBTyxTQUF5QixPQUFPLENBRWxELElBQUksTUFDQSxFQUFNLE9BQU8sUUFDYixFQUFTLE9BQU8sRUFDcEIsSUFBbUIsZ0JBQVIsR0FBb0IsT0FBTyxDQUV0QyxJQUE0QyxvQkFBeEMsT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUE4QixPQUFPLENBQ3hFLElBQStDLG9CQUEzQyxPQUFPLFVBQVUsU0FBUyxLQUFLLEdBQWlDLE9BQU8sQ0FXM0UsR0FBSSxHQURTLEVBRWIsS0FBSyxJQUFPLEdBQU8sT0FBTyxDQUMxQixJQUEyQixrQkFBaEIsUUFBTyxNQUFtRCxJQUE1QixPQUFPLEtBQUssR0FBSyxPQUFnQixPQUFPLENBRWpGLElBQTBDLGtCQUEvQixRQUFPLHFCQUFpRixJQUEzQyxPQUFPLG9CQUFvQixHQUFLLE9BQWdCLE9BQU8sQ0FFL0csSUFBSSxHQUFPLE9BQU8sc0JBQXNCLEVBQ3hDLElBQW9CLElBQWhCLEVBQUssUUFBZ0IsRUFBSyxLQUFPLEVBQU8sT0FBTyxDQUVuRCxLQUFLLE9BQU8sVUFBVSxxQkFBcUIsS0FBSyxFQUFLLEdBQVEsT0FBTyxDQUVwRSxJQUErQyxrQkFBcEMsUUFBTyx5QkFBeUMsQ0FDMUQsR0FBSSxHQUFhLE9BQU8seUJBQXlCLEVBQUssRUFDdEQsSUFkWSxLQWNSLEVBQVcsUUFBOEMsSUFBMUIsRUFBVyxXQUF1QixPQUFPLEVBRzdFLE9BQU87OztBQ3hDUixZQUVBLElBQUksTUFBTyxRQUFRLGdCQUVuQixRQUFPLFFBQVUsS0FBSyxLQUFLLFNBQVMsS0FBTSxPQUFPLFVBQVU7OztBQ0ozRCxZQUVBLElBQUksU0FBVSxTQUFTLFVBQVUsU0FFN0IsaUJBQW1CLGNBQ25CLGFBQWUsU0FBNEIsR0FDOUMsSUFDQyxHQUFJLEdBQVEsUUFBUSxLQUFLLEVBQ3pCLE9BQU8sa0JBQWlCLEtBQUssR0FDNUIsTUFBTyxHQUNSLE9BQU8sSUFJTCxrQkFBb0IsU0FBMEIsR0FDakQsSUFDQyxPQUFJLGFBQWEsS0FDakIsUUFBUSxLQUFLLElBQ04sR0FDTixNQUFPLEdBQ1IsT0FBTyxJQUdMLE1BQVEsT0FBTyxVQUFVLFNBQ3pCLFFBQVUsb0JBQ1YsU0FBVyw2QkFDWCxlQUFtQyxrQkFBWCxTQUF1RCxnQkFBdkIsUUFBTyxXQUVuRSxRQUFPLFFBQVUsU0FBb0IsR0FDcEMsSUFBSyxFQUFTLE9BQU8sQ0FDckIsSUFBcUIsa0JBQVYsSUFBeUMsZ0JBQVYsR0FBc0IsT0FBTyxDQUN2RSxJQUFxQixrQkFBVixLQUF5QixFQUFNLFVBQWEsT0FBTyxDQUM5RCxJQUFJLGVBQWtCLE1BQU8sbUJBQWtCLEVBQy9DLElBQUksYUFBYSxHQUFVLE9BQU8sQ0FDbEMsSUFBSSxHQUFXLE1BQU0sS0FBSyxFQUMxQixPQUFPLEtBQWEsU0FBVyxJQUFhOzs7QUNuQzdDLFlBRUEsSUFBSSxRQUFTLEtBQUssVUFBVSxPQUN4QixjQUFnQixTQUF1QixHQUMxQyxJQUVDLE1BREEsUUFBTyxLQUFLLElBQ0wsRUFDTixNQUFPLEdBQ1IsT0FBTyxJQUlMLE1BQVEsT0FBTyxVQUFVLFNBQ3pCLFVBQVksZ0JBQ1osZUFBbUMsa0JBQVgsU0FBdUQsZ0JBQXZCLFFBQU8sV0FFbkUsUUFBTyxRQUFVLFNBQXNCLEdBQ3RDLE1BQXFCLGdCQUFWLElBQWdDLE9BQVYsSUFDMUIsZUFBaUIsY0FBYyxHQUFTLE1BQU0sS0FBSyxLQUFXOzs7QUNsQnRFLFlBRUEsSUFBSSxLQUFNLFFBQVEsT0FDZCxVQUFZLE9BQU8sVUFBVSxLQUM3QixLQUFPLE9BQU8seUJBRWQsaUJBQW1CLFNBQXNCLEdBQzVDLElBQ0MsR0FBSSxHQUFZLEVBQU0sU0FJdEIsT0FIQSxHQUFNLFVBQVksRUFFbEIsVUFBVSxLQUFLLElBQ1IsRUFDTixNQUFPLEdBQ1IsT0FBTyxFQUNOLFFBQ0QsRUFBTSxVQUFZLElBR2hCLE1BQVEsT0FBTyxVQUFVLFNBQ3pCLFdBQWEsa0JBQ2IsZUFBbUMsa0JBQVgsU0FBdUQsZ0JBQXZCLFFBQU8sV0FFbkUsUUFBTyxRQUFVLFNBQWlCLEdBQ2pDLElBQUssR0FBMEIsZ0JBQVYsR0FDcEIsT0FBTyxDQUVSLEtBQUssZUFDSixNQUFPLE9BQU0sS0FBSyxLQUFXLFVBRzlCLElBQUksR0FBYSxLQUFLLEVBQU8sWUFFN0IsVUFEK0IsSUFBYyxJQUFJLEVBQVksV0FLdEQsaUJBQWlCOzs7QUNyQ3pCLFlBRUEsSUFBSSxPQUFRLE9BQU8sVUFBVSxTQUN6QixXQUFhLFFBQVEsZ0JBRXpCLElBQUksV0FBWSxDQUNmLEdBQUksVUFBVyxPQUFPLFVBQVUsU0FDNUIsZUFBaUIsaUJBQ2pCLGVBQWlCLFNBQTRCLEdBQ2hELE1BQStCLGdCQUFwQixHQUFNLFdBR1YsZUFBZSxLQUFLLFNBQVMsS0FBSyxJQUcxQyxRQUFPLFFBQVUsU0FBa0IsR0FDbEMsR0FBcUIsZ0JBQVYsR0FDVixPQUFPLENBRVIsSUFBMEIsb0JBQXRCLE1BQU0sS0FBSyxHQUNkLE9BQU8sQ0FFUixLQUNDLE1BQU8sZ0JBQWUsR0FDckIsTUFBTyxHQUNSLE9BQU8sUUFLVCxRQUFPLFFBQVUsU0FBa0IsR0FFbEMsT0FBTzs7O0FDcUdULFFBQVMsWUFBWSxFQUFHLEVBQWMsR0FDbEMsR0FBSSxHQUFrRCxZQUFyQyxFQUFLLFlBQWMsR0FBNkIsSUFBTSxHQUN2RSxPQUFPLEdBQVksRUFBSSxFQUczQixRQUFTLE9BQU8sR0FDWixNQUFPLFFBQU8sR0FBRyxRQUFRLEtBQU0sVUFHbkMsUUFBUyxTQUFTLEdBQU8sTUFBc0IsbUJBQWYsTUFBTSxHQUN0QyxRQUFTLFFBQVEsR0FBTyxNQUFzQixrQkFBZixNQUFNLEdBQ3JDLFFBQVMsVUFBVSxHQUFPLE1BQXNCLG9CQUFmLE1BQU0sR0FDdkMsUUFBUyxTQUFTLEdBQU8sTUFBc0IsbUJBQWYsTUFBTSxHQUN0QyxRQUFTLFVBQVUsR0FBTyxNQUFzQixvQkFBZixNQUFNLEdBQ3ZDLFFBQVMsVUFBVSxHQUFPLE1BQXNCLG9CQUFmLE1BQU0sR0FDdkMsUUFBUyxVQUFVLEdBQU8sTUFBc0Isb0JBQWYsTUFBTSxHQUN2QyxRQUFTLFVBQVUsR0FBTyxNQUFzQixvQkFBZixNQUFNLEdBQ3ZDLFFBQVMsV0FBVyxHQUFPLE1BQXNCLHFCQUFmLE1BQU0sR0FHeEMsUUFBUyxLQUFLLEVBQUssR0FDZixNQUFPLFFBQU8sS0FBSyxFQUFLLEdBRzVCLFFBQVMsT0FBTyxHQUNaLE1BQU8sZ0JBQWUsS0FBSyxHQUcvQixRQUFTLFFBQVEsR0FDYixHQUFJLEVBQUUsS0FBTSxNQUFPLEdBQUUsSUFDckIsSUFBSSxHQUFJLE9BQU8sR0FBRyxNQUFNLHVCQUN4QixPQUFJLEdBQVUsRUFBRSxPQUFoQixHQUdKLFFBQVMsU0FBUyxFQUFJLEdBQ2xCLEdBQUksRUFBRyxRQUFTLE1BQU8sR0FBRyxRQUFRLEVBQ2xDLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFHLE9BQVEsRUFBSSxFQUFHLElBQ2xDLEdBQUksRUFBRyxLQUFPLEVBQUcsTUFBTyxFQUU1QixRQUFRLEVBR1osUUFBUyxPQUFPLEdBQ1osSUFBSyxRQUNELE9BQU8sQ0FFWCxLQUNJLFFBQVEsS0FBSyxFQUNiLEtBQ0ksUUFBUSxLQUFLLEdBQ2YsTUFBTyxHQUNMLE9BQU8sRUFFWCxNQUFPLGFBQWEsS0FDdEIsTUFBTyxJQUNULE9BQU8sRUFHWCxRQUFTLE9BQU8sR0FDWixJQUFLLFFBQ0QsT0FBTyxDQUVYLEtBQ0ksUUFBUSxLQUFLLEVBQ2IsS0FDSSxRQUFRLEtBQUssR0FDZixNQUFPLEdBQ0wsT0FBTyxFQUVYLE1BQU8sYUFBYSxLQUN0QixNQUFPLElBQ1QsT0FBTyxFQUdYLFFBQVMsV0FBVyxHQUNoQixTQUFLLEdBQWtCLGdCQUFOLE1BQ1UsbUJBQWhCLGNBQStCLFlBQWEsY0FHMUIsZ0JBQWYsR0FBRSxVQUNpQixrQkFBbkIsR0FBRSxjQUlwQixRQUFTLGVBQWUsRUFBSyxHQUV6QixNQUFPLFlBREMsRUFBSSxRQUFRLFdBQVksUUFBUSxRQUFRLGVBQWdCLFNBQzNDLFNBQVUsR0FHbkMsUUFBUyxTQUFTLEdBQ2QsR0FBSSxHQUFJLEVBQUUsV0FBVyxHQUNqQixHQUFNLEVBQUcsSUFBSyxFQUFHLElBQUssR0FBSSxJQUFLLEdBQUksSUFBSyxHQUFJLEtBQU0sRUFDdEQsT0FBSSxHQUFVLEtBQU8sRUFDZCxPQUFTLEVBQUksR0FBTyxJQUFNLElBQU0sRUFBRSxTQUFTLElBR3RELFFBQVMsV0FBVyxHQUNoQixNQUFPLFVBQVksRUFBTSxJQUc3QixRQUFTLGNBQWMsRUFBTSxFQUFNLEdBQy9CLE1BQU8sR0FBTyxLQUFPLEVBQU8sTUFBUSxFQUFRLEtBQUssTUFBUSxJQUc3RCxRQUFTLFlBQVksRUFBSyxHQUN0QixHQUFJLEdBQVEsUUFBUSxHQUNoQixJQUNKLElBQUksRUFBTyxDQUNQLEVBQUcsT0FBUyxFQUFJLE1BQ2hCLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsSUFDNUIsRUFBRyxHQUFLLElBQUksRUFBSyxHQUFLLEVBQVEsRUFBSSxHQUFJLEdBQU8sR0FHckQsSUFBSyxHQUFJLEtBQU8sR0FDUCxJQUFJLEVBQUssS0FDVixHQUFTLE9BQU8sT0FBTyxNQUFVLEdBQU8sRUFBTSxFQUFJLFNBQ2xELFNBQVMsS0FBSyxHQUNkLEVBQUcsS0FBSyxFQUFRLEVBQUssR0FBTyxLQUFPLEVBQVEsRUFBSSxHQUFNLElBRXJELEVBQUcsS0FBSyxFQUFNLEtBQU8sRUFBUSxFQUFJLEdBQU0sS0FHL0MsT0FBTyxHQS9QWCxHQUFJLFFBQXdCLGtCQUFSLE1BQXNCLElBQUksVUFDMUMsa0JBQW9CLE9BQU8sMEJBQTRCLE9BQVMsT0FBTyx5QkFBeUIsSUFBSSxVQUFXLFFBQVUsS0FDekgsUUFBVSxRQUFVLG1CQUFzRCxrQkFBMUIsbUJBQWtCLElBQXFCLGtCQUFrQixJQUFNLEtBQy9HLFdBQWEsUUFBVSxJQUFJLFVBQVUsUUFDckMsT0FBd0Isa0JBQVIsTUFBc0IsSUFBSSxVQUMxQyxrQkFBb0IsT0FBTywwQkFBNEIsT0FBUyxPQUFPLHlCQUF5QixJQUFJLFVBQVcsUUFBVSxLQUN6SCxRQUFVLFFBQVUsbUJBQXNELGtCQUExQixtQkFBa0IsSUFBcUIsa0JBQWtCLElBQU0sS0FDL0csV0FBYSxRQUFVLElBQUksVUFBVSxRQUNyQyxlQUFpQixRQUFRLFVBQVUsUUFDbkMsZUFBaUIsT0FBTyxVQUFVLFNBQ2xDLGNBQWtDLGtCQUFYLFFBQXdCLE9BQU8sVUFBVSxRQUFVLEtBRTFFLGNBQWdCLFFBQVEsa0JBQWtCLE9BQzFDLGNBQWlCLGVBQWlCLFNBQVMsZUFBa0IsY0FBZ0IsSUFFakYsUUFBTyxRQUFVLFFBQVMsR0FBVSxFQUFLLEVBQU0sRUFBTyxHQXlDbEQsUUFBUyxHQUFTLEVBQU8sR0FLckIsTUFKSSxLQUNBLEVBQU8sRUFBSyxRQUNaLEVBQUssS0FBSyxJQUVQLEVBQVMsRUFBTyxFQUFNLEVBQVEsRUFBRyxHQTNDNUMsR0FGSyxJQUFNLE1BRVAsSUFBSSxFQUFNLGVBQXNDLFdBQXBCLEVBQUssWUFBK0MsV0FBcEIsRUFBSyxXQUNqRSxLQUFNLElBQUksV0FBVSxtREFHeEIsUUFBbUIsS0FBUixFQUNQLE1BQU8sV0FFWCxJQUFZLE9BQVIsRUFDQSxNQUFPLE1BRVgsSUFBbUIsaUJBQVIsR0FDUCxNQUFPLEdBQU0sT0FBUyxPQUcxQixJQUFtQixnQkFBUixHQUNQLE1BQU8sZUFBYyxFQUFLLEVBRTlCLElBQW1CLGdCQUFSLEdBQ1QsTUFBWSxLQUFSLEVBQ0ssRUFBQSxFQUFXLEVBQU0sRUFBSSxJQUFNLEtBRTdCLE9BQU8sRUFFaEIsSUFBbUIsZ0JBQVIsR0FDVCxNQUFPLFFBQU8sR0FBTyxHQUd2QixJQUFJLE9BQWlDLEtBQWYsRUFBSyxNQUF3QixFQUFJLEVBQUssS0FFNUQsUUFEcUIsS0FBVixJQUF1QixFQUFRLEdBQ3RDLEdBQVMsR0FBWSxFQUFXLEdBQW9CLGdCQUFSLEdBQzVDLE1BQU8sVUFHWCxRQUFvQixLQUFULEVBQXNCLFNBQzVCLElBQUksUUFBUSxFQUFNLElBQVEsRUFDM0IsTUFBTyxZQVdYLElBQW1CLGtCQUFSLEdBQW9CLENBQzNCLEdBQUksR0FBTyxPQUFPLEVBQ2xCLE9BQU8sYUFBZSxFQUFPLEtBQU8sRUFBTyxJQUFNLElBRXJELEdBQUksU0FBUyxHQUFNLENBQ2YsR0FBSSxHQUFZLE9BQU8sVUFBVSxTQUFTLEtBQUssRUFDL0MsT0FBc0IsZ0JBQVIsR0FBbUIsVUFBVSxHQUFhLEVBRTVELEdBQUksVUFBVSxHQUFNLENBR2hCLElBQUssR0FGRCxHQUFJLElBQU0sT0FBTyxFQUFJLFVBQVUsY0FDL0IsRUFBUSxFQUFJLGVBQ1AsRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQzlCLEdBQUssSUFBTSxFQUFNLEdBQUcsS0FBTyxJQUFNLFdBQVcsTUFBTSxFQUFNLEdBQUcsT0FBUSxTQUFVLEVBS2pGLE9BSEEsSUFBSyxJQUNELEVBQUksWUFBYyxFQUFJLFdBQVcsU0FBUSxHQUFLLE9BQ2xELEdBQUssS0FBTyxPQUFPLEVBQUksVUFBVSxjQUFnQixJQUdyRCxHQUFJLFFBQVEsR0FDUixNQUFtQixLQUFmLEVBQUksT0FBcUIsS0FDdEIsS0FBTyxXQUFXLEVBQUssR0FBUyxLQUFLLE1BQVEsSUFFeEQsSUFBSSxRQUFRLEdBQU0sQ0FDZCxHQUFJLEdBQVEsV0FBVyxFQUFLLEVBQzVCLE9BQXFCLEtBQWpCLEVBQU0sT0FBcUIsSUFBTSxPQUFPLEdBQU8sSUFDNUMsTUFBUSxPQUFPLEdBQU8sS0FBTyxFQUFNLEtBQUssTUFBUSxLQUUzRCxHQUFtQixnQkFBUixHQUFrQixDQUN6QixHQUFJLGVBQStDLGtCQUF2QixHQUFJLGVBQzVCLE1BQU8sR0FBSSxnQkFDUixJQUEyQixrQkFBaEIsR0FBSSxRQUNsQixNQUFPLEdBQUksVUFHbkIsR0FBSSxNQUFNLEdBQU0sQ0FDWixHQUFJLEtBSUosT0FIQSxZQUFXLEtBQUssRUFBSyxTQUFVLEVBQU8sR0FDbEMsRUFBTSxLQUFLLEVBQVEsRUFBSyxHQUFPLE9BQVMsRUFBUSxFQUFPLE1BRXBELGFBQWEsTUFBTyxRQUFRLEtBQUssR0FBTSxHQUVsRCxHQUFJLE1BQU0sR0FBTSxDQUNaLEdBQUksS0FJSixPQUhBLFlBQVcsS0FBSyxFQUFLLFNBQVUsR0FDM0IsRUFBTSxLQUFLLEVBQVEsRUFBTyxNQUV2QixhQUFhLE1BQU8sUUFBUSxLQUFLLEdBQU0sR0FFbEQsR0FBSSxTQUFTLEdBQ1QsTUFBTyxXQUFVLEVBQVEsT0FBTyxJQUVwQyxJQUFJLFNBQVMsR0FDVCxNQUFPLFdBQVUsRUFBUSxjQUFjLEtBQUssSUFFaEQsSUFBSSxVQUFVLEdBQ1YsTUFBTyxXQUFVLGVBQWUsS0FBSyxHQUV6QyxJQUFJLFNBQVMsR0FDVCxNQUFPLFdBQVUsRUFBUSxPQUFPLElBRXBDLEtBQUssT0FBTyxLQUFTLFNBQVMsR0FBTSxDQUNoQyxHQUFJLEdBQUssV0FBVyxFQUFLLEVBQ3pCLE9BQWtCLEtBQWQsRUFBRyxPQUFxQixLQUNyQixLQUFPLEVBQUcsS0FBSyxNQUFRLEtBRWxDLE1BQU8sUUFBTyxHQXNCbEIsSUFBSSxRQUFTLE9BQU8sVUFBVSxnQkFBa0IsU0FBVSxHQUFPLE1BQU8sS0FBTzs7O0NDbkgvRSxTQUFXLEdBQ1AsR0FTSSxHQUNBLEVBVEEsRUFBTSxpQkFDTixFQUFZLFNBQ1osRUFBZ0IsVUFHaEIsRUFBVSxTQUFVLEVBQUcsR0FDbkIsTUFBTyxHQUFJLEdBSWYsR0FBVSxNQUNWLEVBQWUsV0FDWCxJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssS0FBSyxPQUFRLEVBQUksRUFBSSxJQUN0QyxPQUFzQixLQUFYLEtBQUssR0FDWixNQUFPLE1BQUssSUFJeEIsRUFBYyxXQUVWLElBREEsR0FBSSxHQUFJLEtBQUssU0FDSixHQUNMLE9BQXNCLEtBQVgsS0FBSyxHQUNaLE1BQU8sTUFBSyxJQUl4QixFQUFTLE9BQU8sVUFBVSxTQUMxQixFQUFNLE9BQ04sRUFBVSxNQUFNLFNBQVcsU0FBVSxHQUNqQyxNQUFPLGFBQWMsUUFBNEIsa0JBQW5CLEVBQU8sS0FBSyxHQWdCOUMsS0FBTSxTQUFVLEVBQU0sR0FDbEIsR0FNSSxHQUxBLEVBQVUsRUFDVixFQUFPLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVyxHQUM3QyxFQUFZLElBQUksVUFBVSxHQUMxQixFQUFJLEVBR0osS0FDQSxLQUNBLEtBQ0EsRUFBSyxDQUVULEdBQUksYUFBZSxFQUNuQixFQUFJLFlBQWMsRUFDbEIsRUFBZ0IsRUFDaEIsRUFBTyxDQUNQLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxFQUFVLE9BQVEsRUFBSSxFQUFJLElBQVMsVUFBWSxHQUFVLEtBQzFFLEVBQVEsS0FBSyxFQUFVLEdBQUcsUUFDdEIsRUFBVSxHQUFHLE9BQVMsSUFDdEIsRUFBTSxFQUFVLEdBQUcsUUFBVSxFQUFVLElBSS9DLEtBREEsRUFBUSxLQUFLLEdBQ04sRUFBUSxHQUFLLEdBR2hCLEdBRkEsRUFBSSxFQUFNLEVBQVEsTUFDbEIsRUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFPLElBQ3BCLEVBRUEsTUFEQSxHQUFPLEVBQ0EsQ0FHZixLQUFLLEVBQUksRUFBRyxFQUFJLEVBQUksSUFFaEIsR0FBSSxXQURKLEVBQUksRUFBVSxJQUVWLEdBQUksRUFBRSxRQUFVLEVBQVEsR0FBSSxDQUV4QixHQURBLEVBQUksS0FBSyxFQUFFLE1BQU0sRUFBTyxJQUNwQixFQUNBLEtBRUosSUFJSSxHQUhBLElBQ0EsRUFBSSxFQUFNLEVBQVEsSUFDbEIsR0FBSyxFQUFJLEtBQUssRUFBRSxNQUFNLEVBQU8sSUFDekIsRUFDQSxZQUVDLE9BRVQsR0FBTSxFQUFFLFFBQVUsTUFJdEIsSUFEQSxFQUFJLEtBQUssRUFBRSxNQUFNLEVBQU8sSUFDcEIsRUFDQSxLQU1aLE9BRkEsR0FBTyxFQUNQLEVBQWdCLEVBQ1QsR0FHWCxJQUFJLFFBQVUsRUFhbEIsSUFBSSxVQUFZLFNBQVUsR0FDdEIsR0FFSSxHQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBVEEsRUFBUSxFQUFRLEdBQVEsRUFBTyxFQUFLLE1BQU0sR0FDMUMsRUFBSSxFQVNKLEdBQU0sR0FDTixJQUNKLEtBQUssRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLENBRXhDLElBREEsS0FDSyxFQUFJLEVBQUcsRUFBSyxFQUFHLE9BQVEsRUFBSSxFQUFJLElBSWhDLElBSEEsRUFBSSxFQUFHLEdBQUcsRUFDVixHQUFTLEVBQUUsRUFBTSxJQUFLLEVBdkluQixNQXdJSCxFQUFJLEVBQ0csTUFDSCxFQUFPLEVBQU0sTUFFVCxFQUFJLEtBQUssR0FDVCxFQUFNLEVBQUksT0FBTyxFQUFLLE9BSWxDLEdBQUssRUFFVCxNQUFPLElBWVgsSUFBSSxVQUFZLFNBQVUsR0FDbEIsR0FDQSxFQUFNLEVBQUksR0FBSyxRQUFRLG9CQUFxQixNQUM1QyxFQUFNLElBQU0sRUFBTSxJQUNsQixFQUFZLEdBQUksUUFBTyxJQUV2QixFQUFZLFVBNEJwQixJQUFJLEdBQUssU0FBVSxFQUFNLEdBQ3JCLEdBQWdCLGtCQUFMLEdBQ1AsTUFBTyxhQUdYLEtBQUssR0FERCxHQUFRLEVBQVEsR0FBUyxFQUFRLEVBQUssSUFBTSxHQUFRLEdBQVMsRUFBSSxHQUFNLE1BQU0sR0FDeEUsRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxLQUN0QyxTQUFVLEdBSVAsSUFBSyxHQURELEdBRkEsRUFBUSxFQUFRLEdBQVEsRUFBTyxFQUFJLEdBQU0sTUFBTSxHQUMvQyxFQUFJLEVBRUMsRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUN2QyxFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsZUFBZSxFQUFNLEtBQU8sRUFBRSxFQUFNLE1BQVEsRUFBRSxFQUFNLEtBQU8sTUFHckUsS0FEQSxFQUFFLEVBQUksRUFBRSxNQUNILEVBQUksRUFBRyxFQUFLLEVBQUUsRUFBRSxPQUFRLEVBQUksRUFBSSxJQUFLLEdBQUksRUFBRSxFQUFFLElBQU0sRUFBRyxDQUN2RCxHQUFRLENBQ1IsUUFFSCxHQUFTLEVBQUUsRUFBRSxLQUFLLElBQ3JCLEVBQU0sR0FFWixPQUFPLFVBQVUsSUFDUixJQUFXLElBQ1osRUFBRSxRQUFVLEtBb0J4QixJQUFJLEVBQUksU0FBVSxHQUNkLEdBQUksTUFBVyxNQUFNLEtBQUssVUFBVyxFQUNyQyxPQUFPLFlBQ0gsSUFBSSxNQUFNLE1BQU8sRUFBTyxNQUFNLE9BQU8sR0FBTyxVQUFVLE1BQU0sS0FBSyxVQUFXLE9BU3BGLElBQUksS0FBTyxXQUNQLEVBQU8sR0FnQlgsSUFBSSxHQUFLLFNBQVUsR0FDZixHQUFJLEdBQU0sRUFBUSxHQUFpQixFQUFjLEtBQUssS0FBTyxDQUM3RCxPQUFJLEdBQ08sR0FBSSxRQUFPLGdCQUFrQixFQUFVLGlCQUFpQixLQUFLLEdBRWpFLEdBV1gsSUFBSSxJQUFNLFdBQ04sTUFBTyxHQUFRLEdBQWlCLEVBQWdCLEVBQWMsTUFBTSxJQW9CeEUsSUFBSSxJQUFNLElBQUksT0FBUyxTQUFVLEVBQU0sR0FDbkMsSUFBSyxFQUVELFlBREEsSUFBSSxRQUFVLEdBQVUsTUFHNUIsSUFBSSxHQUFRLEVBQVEsR0FBUyxFQUFRLEVBQUssSUFBTSxHQUFRLEdBQVMsRUFBSSxHQUFNLE1BQU0sRUFDakYsSUFBSSxFQUFNLE9BQVMsRUFDZixJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUN2QyxJQUFJLElBQUksRUFBTSxHQUFJLE9BRjFCLENBTUEsRUFBUSxFQUFRLEdBQVEsRUFBTyxFQUFJLEdBQU0sTUFBTSxFQUMvQyxJQUFJLEdBQ0EsRUFDQSxFQUNBLEVBQUcsRUFBSSxFQUFHLEVBQ1YsR0FBTyxHQUNQLElBQ0osS0FBSyxFQUFJLEVBQUcsRUFBSyxFQUFNLE9BQVEsRUFBSSxFQUFJLElBQ25DLElBQUssRUFBSSxFQUFHLEVBQUksRUFBSSxPQUFRLEdBQUssRUFBTyxPQUFTLEVBQUcsQ0FHaEQsR0FGQSxHQUFVLEVBQUcsR0FDYixFQUFJLEVBQUksR0FBRyxFQXJVUixLQXNVQyxFQUFNLEdBQ0YsRUFBRSxFQUFNLE1BQ1IsRUFBTyxLQUFLLEVBQUUsRUFBTSxLQUNwQixFQUFPLFNBQ0gsRUFBRyxFQUNILEtBQU0sRUFBTSxVQUlwQixLQUFLLElBQU8sR0FBTyxFQUFFLEdBQUssS0FDdEIsRUFBTyxLQUFLLEVBQUUsSUFDZCxFQUFPLFNBQ0gsRUFBRyxFQUNILEtBQU0sSUFJbEIsR0FBSSxPQUFPLE1BQU0sRUFBSyxHQUc5QixJQUFLLEVBQUksRUFBRyxFQUFLLEVBQUksT0FBUSxFQUFJLEVBQUksSUFFakMsSUFEQSxFQUFJLEVBQUksR0FDRCxFQUFFLEdBQUcsQ0FDUixHQUFJLEVBQUcsQ0FDSCxHQUFJLEVBQUUsRUFBRyxDQUNMLElBQUssRUFBSSxFQUFHLEVBQUssRUFBRSxFQUFFLE9BQVEsRUFBSSxFQUFJLElBQUssR0FBSSxFQUFFLEVBQUUsSUFBTSxFQUFHLENBQ3ZELEVBQUUsRUFBRSxPQUFPLEVBQUcsRUFDZCxRQUVILEVBQUUsRUFBRSxjQUFpQixHQUFFLEVBRTVCLElBQUssSUFBTyxHQUFFLEVBQUcsR0FBSSxFQUFFLEVBQUUsR0FBSyxJQUFRLEVBQUUsRUFBRSxHQUFLLEVBQUcsQ0FDOUMsR0FBSSxHQUFRLEVBQUUsRUFBRSxHQUFLLENBQ3JCLEtBQUssRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLEdBQUksRUFBTSxJQUFNLEVBQUcsQ0FDM0QsRUFBTSxPQUFPLEVBQUcsRUFDaEIsUUFFSCxFQUFNLGNBQWlCLEdBQUUsRUFBRSxHQUFLLE9BRWxDLE9BQ0ksR0FBRSxDQUNULEtBQUssSUFBTyxHQUFFLEVBQU8sRUFBRSxFQUFFLEdBQUssSUFBUSxFQUFFLEVBQUUsR0FBSyxTQUNwQyxHQUFFLEVBQUUsR0FBSyxFQUd4QixFQUFJLEVBQUUsRUFJZCxFQUFPLElBQUssRUFBSSxFQUFHLEVBQUssRUFBTyxPQUFRLEVBQUksRUFBSSxJQUFLLENBQ2hELEVBQUksRUFBTyxFQUNYLEtBQUssSUFBTyxHQUFFLEVBQUUsRUFBRSxNQUFNLEVBRXBCLFFBQVMsRUFFYixLQUFLLElBQU8sR0FBRSxFQUFFLEVBQUUsTUFBTSxFQUVwQixRQUFTLFNBR04sR0FBRSxFQUFFLEVBQUUsU0FvQnJCLElBQUksS0FBTyxTQUFVLEVBQU0sR0FDdkIsR0FBSSxHQUFLLFdBRUwsTUFEQSxLQUFJLElBQUksRUFBTSxHQUNQLEVBQUUsTUFBTSxLQUFNLFdBRXpCLE9BQU8sS0FBSSxHQUFHLEVBQU0sSUFReEIsSUFBSSxRQXZhVSxRQXdhZCxJQUFJLFNBQVcsV0FDWCxNQUFPLDZCQUVPLG1CQUFWLFNBQXlCLE9BQU8sUUFBWSxPQUFPLFFBQVUsSUFBMEIsa0JBQVgsU0FBeUIsT0FBTyxJQUFPLE9BQU8sU0FBVyxXQUFhLE1BQU8sT0FBWSxFQUFLLElBQU0sS0FDekwsTUFFRixTQUFVLEVBQU0sR0FFYixHQUFxQixrQkFBVixTQUF3QixPQUFPLElBRXRDLFFBQVEsT0FBUSxTQUFVLEdBQ3RCLE1BQU8sR0FBUSxFQUFNLFNBRXRCLElBQXNCLG1CQUFYLFNBQXdCLENBRXRDLEdBQUksR0FBTSxRQUFRLE1BQ2xCLFFBQU8sUUFBVSxFQUFRLEVBQU0sT0FJL0IsR0FBUSxFQUFNLEVBQUssTUFFekIsUUFBVSxLQUFNLFNBQVUsRUFBUSxHQWVwQyxHQUFJLEdBQU8sU0FBVyxHQUNsQixHQVVBLEdBVkksS0FDSixFQUFtQixFQUFPLHVCQUNQLEVBQU8sNkJBQ1AsRUFBTywwQkFDUCxFQUFPLHdCQUNQLEVBQU8seUJBQ1AsU0FBVSxHQUVOLE1BREEsWUFBVyxFQUFVLElBQUksR0FBSSxPQUFPLFlBQzdCLEdBRzlCLEVBQVUsTUFBTSxTQUFXLFNBQVUsR0FDakMsTUFBTyxhQUFhLFFBQ3FCLGtCQUFyQyxPQUFPLFVBQVUsU0FBUyxLQUFLLElBRXZDLEVBQVEsRUFDUixFQUFXLE1BQVEsR0FBSSxPQUFNLFNBQVMsSUFDdEMsRUFBSyxXQUNELE1BQU8sSUFBWSxLQUFTLFNBQVMsS0FlekMsRUFBUSxLQUFLLEtBQU8sV0FDaEIsT0FBUSxHQUFJLE9BRWhCLEVBQU0sU0FBVSxHQUNaLEdBQUksR0FBSSxJQUNSLElBQVcsTUFBUCxFQUNBLE1BQU8sR0FBRSxDQUViLElBQUksR0FBSyxFQUFFLEVBQUksQ0FDZixHQUFFLEdBQUssRUFBRSxJQUFNLEVBQ2YsRUFBRSxHQUFLLEVBQUUsSUFBTSxFQUNmLEVBQUUsRUFBSSxHQUVWLEVBQVEsU0FBVSxHQUNkLEdBQUksR0FBSSxJQUNSLElBQVcsTUFBUCxFQUNBLE1BQU8sR0FBRSxHQUViLEdBQUUsSUFBTSxHQUVaLEVBQVcsU0FBVSxHQUNqQixHQUFJLEdBQUksSUFDUixJQUFXLE1BQVAsRUFDQSxNQUFPLEdBQUUsR0FFYixHQUFFLEVBQUksRUFBRSxFQUFJLEVBQU0sRUFBRSxJQUNwQixFQUFFLElBQU0sR0FFWixFQUFTLFdBQ0wsR0FBSSxHQUFJLFdBQ0QsR0FBVyxFQUFFLElBQ3BCLEVBQUUsU0FDRixFQUFJLGFBQWUsRUFBRSxHQUFJLElBRTdCLEVBQVEsV0FDSixHQUFJLEdBQUksSUFDSixHQUFFLGFBR0MsR0FBVyxFQUFFLElBQ3BCLEVBQUUsU0FDRixFQUFFLEtBQU8sRUFBRSxNQUFRLEVBQUUsSUFFekIsRUFBUyxXQUNMLEdBQUksR0FBSSxJQUNILEdBQUUsT0FHUCxFQUFFLEVBQUksRUFBRSxNQUFRLEVBQUUsV0FDWCxHQUFFLEtBQ1QsRUFBVyxFQUFFLElBQU0sRUFDbkIsTUFFSixFQUFTLFdBQ0wsR0FDSSxHQURBLEVBQUksSUFFUixJQUFJLEVBQVEsRUFBRSxPQUFRLENBQ2xCLElBQ0EsS0FBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUUsTUFBTSxPQUFRLEVBQUksRUFBSSxJQUN6QyxFQUFJLElBQU0sRUFBRSxNQUFNLElBQ2IsRUFBRSxJQUFJLEdBQUssRUFBRSxNQUFNLElBQU0sRUFBRSxPQUFPLEVBQUUsT0FHN0MsSUFBTyxFQUFFLE9BQVMsRUFBRSxJQUFNLEVBQUUsT0FBUyxFQUFFLE9BQU8sRUFBRSxFQUVwRCxHQUFFLElBQUksSUFFVixFQUFRLFNBQVUsR0FFZCxJQUFLLEVBTUQsWUFKSyxJQUVELEVBQVksRUFBaUIsSUFJckMsSUFBSSxHQUFNLENBQ1YsS0FBSyxHQUFJLEtBQUssR0FBWSxHQUFJLEVBQVcsZUFBZSxHQUFJLENBQ3hELEdBQUksR0FBSSxFQUFXLEdBQ2YsRUFBSSxFQUFFLEtBRVYsS0FDQSxFQUFFLEdBQUssRUFBSSxFQUFFLElBQU0sRUFBRSxJQUFNLEVBQUUsS0FDekIsRUFBRSxHQUFLLFVBQ0EsR0FBVyxHQUNsQixFQUFFLEVBQUksRUFDTixJQUNDLFNBQVUsR0FDUCxXQUFXLFdBQ1AsRUFBSSxlQUFpQixFQUFFLEdBQUksTUFFakMsSUFFTixFQUFFLFNBRU4sSUFBWSxHQUFNLEVBQWlCLElBb0N2QyxFQUFPLFNBQVUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFLLEVBQUssR0FDbkMsR0FBSSxJQUNBLEdBQUksSUFDSixNQUFPLEVBQ1AsSUFBSyxFQUNMLEVBQUcsRUFDSCxFQUFHLEVBQ0gsSUFBSyxFQUFJLEVBQ1QsSUFBSyxFQUNMLElBQUssRUFDTCxJQUFLLEVBQ0wsT0FBUSxHQUFVLEVBQUssT0FDdkIsT0FBUSxFQUNSLE1BQU8sRUFDUCxTQUFVLEVBQ1YsS0FBTSxFQUNOLE1BQU8sRUFDUCxPQUFRLEVBQ1IsT0FBUSxFQUVaLEdBQVcsRUFBSyxJQUFNLENBQ3RCLElBQWEsR0FBVCxFQUFNLENBQ1YsS0FBSyxJQUFLLEdBQVksR0FBSSxFQUFXLGVBQWUsSUFFckMsS0FEWCxFQUVJLEtBSVIsT0FETyxJQUFQLEdBQVksSUFDTCxFQThKWCxPQW5KQSxHQUFLLEtBQU8sRUFTWixFQUFLLFFBQVUsU0FBVSxHQUNyQixNQUFPLEdBQVcsSUFBTyxNQVc3QixFQUFLLE9BQVMsU0FBVSxHQUNwQixNQUFPLElBVVgsRUFBSyxRQUFVLFNBQVUsR0FDckIsTUFBTyxNQUFLLElBQUksRUFBRyxNQVV2QixFQUFLLE9BQVMsU0FBVSxHQUNwQixNQUFPLE1BQUssSUFBSSxFQUFHLE1BVXZCLEVBQUssVUFBWSxTQUFVLEdBQ3ZCLEdBQVMsR0FBTCxFQUNBLE1BQU8sRUFFWCxJQUFTLEdBQUwsRUFDQSxNQUFPLEVBRVgsSUFBSSxHQUFJLElBQU0sRUFBSSxLQUNkLEVBQUksS0FBSyxLQUFLLE1BQVEsRUFBSSxHQUMxQixFQUFJLEVBQUksRUFDUixFQUFJLEtBQUssSUFBSSxLQUFLLElBQUksR0FBSSxFQUFJLElBQU0sRUFBSSxHQUFLLEVBQUksR0FDakQsR0FBSyxFQUFJLEVBQ1QsRUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEdBQUksRUFBSSxJQUFNLEVBQUksR0FBSyxFQUFJLEdBQ2pELEVBQUksRUFBSSxFQUFJLEVBQ2hCLE9BQWlCLElBQVQsRUFBSSxHQUFTLEVBQUksRUFBSSxFQUFJLEVBQUksR0FVekMsRUFBSyxPQUFTLFNBQVUsR0FDcEIsR0FBUyxHQUFMLEVBQ0EsTUFBTyxFQUVYLElBQUksR0FBSSxPQUNSLE9BQU8sR0FBSSxJQUFNLEVBQUksR0FBSyxFQUFJLElBVWxDLEVBQUssUUFBVSxTQUFVLEdBQ3JCLEdBQVMsR0FBTCxFQUNBLE1BQU8sRUFFWCxJQUFRLENBQ1IsSUFBSSxHQUFJLE9BQ1IsT0FBTyxHQUFJLElBQU0sRUFBSSxHQUFLLEVBQUksR0FBSyxHQVV2QyxFQUFLLFFBQVUsU0FBVSxHQUNyQixNQUFJLE1BQU8sRUFDQSxFQUVKLEtBQUssSUFBSSxHQUFJLEdBQUssR0FBSyxLQUFLLEtBQUssRUFBSSxPQUN2QyxFQUFJLEtBQUssSUFBTSxJQUFNLEdBVTlCLEVBQUssT0FBUyxTQUFVLEdBQ3BCLEdBRUksR0FGQSxFQUFJLE9BQ0osRUFBSSxJQWtCUixPQWhCSSxHQUFJLEVBQUksRUFDUixFQUFJLEVBQUksRUFBSSxFQUVSLEVBQUksRUFBSSxHQUNSLEdBQUssSUFBTSxFQUNYLEVBQUksRUFBSSxFQUFJLEVBQUksS0FFWixFQUFJLElBQU0sR0FDVixHQUFLLEtBQU8sRUFDWixFQUFJLEVBQUksRUFBSSxFQUFJLFFBRWhCLEdBQUssTUFBUSxFQUNiLEVBQUksRUFBSSxFQUFJLEVBQUksU0FJckIsR0FFWCxFQUFPLEtBQU8sRUFDUCxPQUNNLEtBQVAsRUFBcUIsYUFBaUIsR0FnQjVDLEVBQVEsU0FBUyxHQWtCckIsUUFBUyxHQUFLLEVBQUcsR0FDYixHQUFJLEVBQUcsQ0FDSCxHQUFJLEVBQUUsU0FDRixNQUFPLEdBQUssRUFFaEIsSUFBSSxFQUFHLEVBQUcsVUFBWSxFQUFLLElBQ3ZCLE1BQU8sR0FBSyxJQUFJLE1BQU0sRUFBTSxFQUVoQyxJQUFJLFlBQWEsR0FDYixNQUFPLEVBRVgsSUFBUyxNQUFMLEVBR0ksTUFEQSxHQUFJLEVBQUssSUFBSSxjQUFjLE9BQU8sSUFDM0IsRUFBSyxHQVF4QixNQUZBLEdBQVMsTUFBTCxFQUFZLE9BQVMsRUFDekIsRUFBUyxNQUFMLEVBQVksT0FBUyxFQUNsQixHQUFJLEdBQU0sRUFBRyxHQXVEeEIsUUFBUyxHQUFFLEVBQUksR0FDWCxHQUFJLEVBQU0sQ0FVTixHQVRVLFNBQU4sSUFDQSxFQUFLLEVBQUssSUFBSSxlQUFlLEVBQUssTUFBUSxFQUFLLFVBQVksS0FFckQsWUFBTixJQUNBLEVBQUssRUFBSyxJQUFJLGNBQWMsRUFBSyxNQUFRLEVBQUssVUFBWSxLQUU3QyxnQkFBTixLQUNQLEVBQUssRUFBRSxJQUVRLGdCQUFSLEdBQ1AsTUFBbUIsSUFBZixFQUFHLFNBQ3lCLFVBQXhCLEVBQUssVUFBVSxFQUFHLEdBQ1gsRUFBRyxlQUFlLEVBQU8sRUFBSyxVQUFVLElBRXZCLFFBQXhCLEVBQUssVUFBVSxFQUFHLEdBQ1gsRUFBRyxlQUFlLEVBQU8sRUFBSyxVQUFVLElBRTVDLEVBQUcsYUFBYSxHQUNSLFFBQVIsRUFDQSxFQUFHLFVBRUgsSUFHZixJQUFtQixHQUFmLEVBQUcsVUFDSCxJQUFLLEdBQUksS0FBTyxHQUFNLEdBQUksRUFBSyxHQUFLLEdBQU0sQ0FDdEMsR0FBSSxHQUFNLEVBQUksRUFBSyxHQUNmLEdBQzJCLFVBQXZCLEVBQUksVUFBVSxFQUFHLEdBQ2pCLEVBQUcsZUFBZSxFQUFPLEVBQUksVUFBVSxHQUFJLEdBQ2IsUUFBdkIsRUFBSSxVQUFVLEVBQUcsR0FDeEIsRUFBRyxlQUFlLEVBQU8sRUFBSSxVQUFVLEdBQUksR0FFM0MsRUFBRyxhQUFhLEVBQUssR0FHekIsRUFBRyxnQkFBZ0IsUUFHcEIsUUFBVSxLQUNqQixFQUFHLFVBQVksRUFBSyxVQUd4QixHQUFLLEVBQUssSUFBSSxnQkFBZ0IsRUFBTyxFQUV6QyxPQUFPLEdBbUJYLFFBQVMsR0FBRyxFQUFHLEdBRVgsTUFEQSxHQUFPLEVBQUksVUFBVSxZQUFZLEtBQUssR0FDMUIsVUFBUixFQUNPLFNBQVMsS0FFUixTQUFSLEtBQ0MsWUFBYSxRQUFTLE1BQU0sU0FBVyxNQUFNLFFBQVEsT0FHMUMsUUFBUixHQUF3QixPQUFOLEdBQ2xCLFNBQWUsSUFBVyxPQUFOLEdBQ1osVUFBUixHQUFvQixJQUFNLE9BQU8sSUFDakMsRUFBZSxLQUFLLEdBQUcsTUFBTSxHQUFJLEdBQUcsZUFBaUIsR0E4Q2pFLFFBQVMsR0FBTSxHQUNYLEdBQWtCLGtCQUFQLElBQXFCLE9BQU8sS0FBUyxFQUM1QyxNQUFPLEVBRVgsSUFBSSxHQUFNLEdBQUksR0FBSSxXQUNsQixLQUFLLEdBQUksS0FBTyxHQUFTLEVBQUksR0FBSyxLQUM5QixFQUFJLEdBQU8sRUFBTSxFQUFJLElBRXpCLE9BQU8sR0FHWCxRQUFTLEdBQU8sRUFBTyxHQUNuQixJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLEdBQUksRUFBTSxLQUFPLEVBQzdELE1BQU8sR0FBTSxLQUFLLEVBQU0sT0FBTyxFQUFHLEdBQUcsSUFHN0MsUUFBUyxHQUFPLEVBQUcsRUFBTyxHQUN0QixRQUFTLEtBQ0wsR0FBSSxHQUFNLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVyxHQUM1QyxFQUFPLEVBQUksS0FBSyxLQUNoQixFQUFRLEVBQUssTUFBUSxFQUFLLFVBQzFCLEVBQVEsRUFBSyxNQUFRLEVBQUssU0FDOUIsT0FBSSxHQUFNLEdBQUssSUFDWCxFQUFPLEVBQU8sR0FDUCxFQUFnQixFQUFjLEVBQU0sSUFBUyxFQUFNLEtBRTlELEVBQU0sUUFBVSxXQUFjLEdBQU0sRUFBTSxTQUMxQyxFQUFNLEtBQUssR0FDWCxFQUFNLEdBQVEsRUFBRSxNQUFNLEVBQU8sR0FDdEIsRUFBZ0IsRUFBYyxFQUFNLElBQVMsRUFBTSxJQUU5RCxNQUFPLEdBR1gsUUFBUyxHQUFNLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxHQUMvQixHQUFVLE1BQU4sRUFBWSxDQUNaLEdBQUksR0FBSSxFQUFLLEVBQ1QsRUFBSSxFQUFLLENBQ2IsT0FBSyxJQUFNLEdBR0gsSUFBMkIsSUFBckIsRUFBSyxPQUFPLEdBQUksR0FBVyxFQUFLLEtBQU8sSUFGMUMsRUFJWCxNQUFPLEdBQU0sRUFBSSxFQUFJLEVBQUksR0FBTSxFQUFNLEVBQUksRUFBSSxFQUFJLEdBR3pELFFBQVMsR0FBSSxHQUNULE1BQU8sR0FBTSxJQUFNLEVBQUssSUFFNUIsUUFBUyxHQUFJLEdBQ1QsTUFBYSxLQUFOLEVBQVksRUFBSyxJQW12QjVCLFFBQVMsR0FBb0IsR0FDekIsR0FBSSxLQXlCSixPQXhCQSxHQUFPLEVBQUssUUFBUSw0QkFBNkIsU0FBVSxFQUFLLEVBQU0sR0FzQmxFLE1BckJBLEdBQVMsRUFBTyxNQUFNLGVBQ1YsVUFBUixHQUFxQyxHQUFqQixFQUFPLFFBQzNCLEVBQU8sS0FBSyxFQUFHLEdBRVAsU0FBUixJQUNJLEVBQU8sT0FBUyxFQUNoQixFQUFTLEVBQU8sTUFBTSxFQUFHLEdBQ0QsR0FBakIsRUFBTyxRQUNkLEVBQU8sS0FBSyxFQUFHLEdBRUUsR0FBakIsRUFBTyxRQUNQLEVBQU8sS0FBSyxFQUFPLEdBQUksRUFBRyxJQUd0QixTQUFSLEVBQ0EsRUFBSSxNQUFNLElBQUssRUFBRyxFQUFHLEVBQUssSUFBSSxFQUFJLEVBQU8sS0FBTSxFQUFHLEVBQUcsSUFDdEMsU0FBUixFQUNQLEVBQUksTUFBTSxJQUFLLEVBQUcsRUFBSyxJQUFJLEVBQUksRUFBTyxLQUFNLEVBQUcsRUFBRyxFQUFHLElBRXJELEVBQUksTUFBTSxFQUFLLE9BQU8sSUFBSSxPQUFPLElBRTlCLElBRUosRUFJWCxRQUFTLEdBQWlCLEVBQU0sR0FDNUIsR0FBSSxHQUFRLEdBQXFCLEdBQzdCLEVBQUksR0FBSSxHQUFLLE1BQ2pCLElBQUksRUFDQSxJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLENBQzVDLEdBS0ksR0FDQSxFQUNBLEVBQ0EsRUFDQSxFQVRBLEVBQUksRUFBTSxHQUNWLEVBQU8sRUFBRSxPQUNULEVBQVUsRUFBSSxFQUFFLElBQUksY0FDcEIsRUFBVyxFQUFFLElBQU0sRUFDbkIsRUFBUSxFQUFXLEVBQUUsU0FBVyxDQU1yQixNQUFYLEdBQTBCLEdBQVIsRUFDbEIsRUFBRSxVQUFVLEVBQUUsR0FBSSxHQUNBLEtBQVgsR0FBMEIsR0FBUixFQUNyQixHQUNBLEVBQUssRUFBTSxFQUFFLEVBQUcsR0FDaEIsRUFBSyxFQUFNLEVBQUUsRUFBRyxHQUNoQixFQUFLLEVBQU0sRUFBRSxFQUFFLEdBQUksRUFBRSxJQUNyQixFQUFLLEVBQU0sRUFBRSxFQUFFLEdBQUksRUFBRSxJQUNyQixFQUFFLFVBQVUsRUFBSyxFQUFJLEVBQUssSUFFMUIsRUFBRSxVQUFVLEVBQUUsR0FBSSxFQUFFLElBRU4sS0FBWCxFQUNLLEdBQVIsR0FDQSxFQUFLLEdBQU0sRUFDWCxFQUFFLE9BQU8sRUFBRSxHQUFJLEVBQUcsRUFBSSxFQUFHLE1BQVEsRUFBRyxFQUFHLEVBQUksRUFBRyxPQUFTLElBQ3hDLEdBQVIsSUFDSCxHQUNBLEVBQUssRUFBTSxFQUFFLEVBQUUsR0FBSSxFQUFFLElBQ3JCLEVBQUssRUFBTSxFQUFFLEVBQUUsR0FBSSxFQUFFLElBQ3JCLEVBQUUsT0FBTyxFQUFFLEdBQUksRUFBSSxJQUVuQixFQUFFLE9BQU8sRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEtBR2IsS0FBWCxFQUNLLEdBQVIsR0FBcUIsR0FBUixHQUNiLEVBQUssR0FBTSxFQUNYLEVBQUUsTUFBTSxFQUFFLEdBQUksRUFBRSxFQUFPLEdBQUksRUFBRyxFQUFJLEVBQUcsTUFBUSxFQUFHLEVBQUcsRUFBSSxFQUFHLE9BQVMsSUFDcEQsR0FBUixFQUNILEdBQ0EsRUFBSyxFQUFNLEVBQUUsRUFBRSxHQUFJLEVBQUUsSUFDckIsRUFBSyxFQUFNLEVBQUUsRUFBRSxHQUFJLEVBQUUsSUFDckIsRUFBRSxNQUFNLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBSSxJQUV4QixFQUFFLE1BQU0sRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxJQUVqQixHQUFSLElBQ0gsR0FDQSxFQUFLLEVBQU0sRUFBRSxFQUFFLEdBQUksRUFBRSxJQUNyQixFQUFLLEVBQU0sRUFBRSxFQUFFLEdBQUksRUFBRSxJQUNyQixFQUFFLE1BQU0sRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFJLElBRXhCLEVBQUUsTUFBTSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEtBR2xCLEtBQVgsR0FBMEIsR0FBUixHQUN6QixFQUFFLElBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLElBSWxELE1BQU8sR0F5QlgsUUFBUyxHQUFZLEdBQ2pCLEdBQUksR0FBSSxFQUFHLEtBQUssaUJBQW1CLEVBQUssRUFBRyxLQUFLLGtCQUN4QyxFQUFHLEtBQUssWUFBYyxFQUFLLEVBQUcsS0FBSyxhQUNuQyxFQUFLLE9BQU8sUUFDWixFQUFLLEVBQUcsR0FDWixFQUFRLEVBQUUsT0FBTyxRQUNqQixFQUFpQixNQUFULEdBQXdCLEVBQU0sSUFJMUMsT0FISyxLQUNELEVBQU8sRUFBSyxPQUFRLEVBQUUsTUFBTSxNQUV6QixFQUVYLFFBQVMsR0FBVyxHQUNoQixNQUFPLEdBQUcsS0FBSyxpQkFBbUIsRUFBSyxFQUFHLEtBQUssa0JBQW9CLEVBQUssT0FBTyxPQUluRixRQUFTLEdBQVEsRUFBSSxFQUFNLEdBU3ZCLFFBQVMsR0FBSyxHQUNWLEdBQVcsTUFBUCxFQUNBLE1BQU8sRUFFWCxJQUFJLElBQVEsRUFDUixNQUFPLEVBRVgsR0FBRSxHQUFNLE1BQU8sR0FDZixLQUNJLE1BQU8sR0FBSSxVQUFVLE1BQ3ZCLE1BQU8sR0FDTCxNQUFPLElBR2YsUUFBUyxHQUFLLEdBQ1YsR0FBVyxNQUFQLEVBQ0EsTUFBTyxFQUVYLElBQUksSUFBUSxFQUNSLE1BQU8sRUFFWCxHQUFFLEdBQU0sT0FBUSxHQUNoQixLQUNJLE1BQU8sR0FBSSxVQUFVLE9BQ3ZCLE1BQU8sR0FDTCxNQUFPLElBR2YsUUFBUyxHQUFJLEVBQUssR0FDRixNQUFSLEVBQ0EsRUFBSSxHQUFPLEVBQUUsRUFBRyxLQUFLLElBQVEsR0FDdEIsR0FBTyxJQUNkLEVBQU0sRUFBVyxNQUFULEVBQWdCLEVBQUcsS0FBSyxJQUFRLEVBQUksSUF4Q3BELEdBQUksR0FBTSxFQUFXLEdBQUksS0FDckIsS0FDQSxFQUFNLEVBQUksY0FBYyxhQXlDNUIsUUF4Q0ssSUFDRCxFQUFNLEVBQUUsUUFDUixFQUFFLEdBQU0sR0FBSSxJQUFLLEdBQUksSUFBSyxNQUFPLEdBQUksT0FBUSxHQUFJLE1BQVMsWUFBYSxLQUFNLFNBQzdFLEVBQUksWUFBWSxJQXFDWixFQUFHLE1BQ1AsSUFBSyxPQUNELEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxFQUNkLEtBQUssUUFDRCxFQUFJLFFBQVMsR0FDYixFQUFJLFNBQVUsRUFDbEIsS0FBSyxPQUNELEVBQUksSUFBSyxHQUNULEVBQUksSUFBSyxFQUNiLE1BQ0EsS0FBSyxTQUNELEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxHQUNWLEVBQUksSUFBSyxFQUNiLE1BQ0EsS0FBSyxVQUNELEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxFQUNkLE1BQ0EsS0FBSyxPQUNELEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxHQUNWLEVBQUksS0FBTSxFQUNkLE1BQ0EsS0FBSyxTQUNELEVBQUksT0FBUSxHQUNaLEVBQUksY0FBZSxHQUNuQixFQUFJLE9BQVEsR0FDWixFQUFJLGVBQWdCLEVBQ3hCLE1BQ0EsS0FBSyxpQkFDRCxFQUFJLEtBQU0sR0FDVixFQUFJLEtBQU0sRUFDZCxNQUNBLEtBQUssUUFDRCxFQUFJLEtBQU0sR0FDVixFQUFJLEtBQU0sRUFDZCxNQUNBLFNBQ0ksRUFBSSxFQUFNLEdBR2xCLE1BREEsR0FBSSxZQUFZLEdBQ1QsRUErQlgsUUFBUyxHQUFVLEdBQ1YsRUFBRyxFQUFNLFdBQ1YsRUFBTyxNQUFNLFVBQVUsTUFBTSxLQUFLLFVBQVcsR0FLakQsS0FIQSxHQUFJLEdBQUksRUFDSixFQUFJLEVBQ0osRUFBTyxLQUFLLEtBQ1QsS0FBSyxVQUFXLE1BQUssSUFDNUIsS0FBSyxFQUFJLEVBQUcsRUFBSSxFQUFLLE9BQVEsSUFDTCxPQUFoQixFQUFLLEdBQUcsS0FDUixFQUFLLEdBQUcsUUFBUSxTQUFVLEdBQ3RCLEVBQUssWUFBWSxFQUFHLFFBR3hCLEVBQUssWUFBWSxFQUFLLEdBQUcsS0FHakMsSUFBSSxHQUFXLEVBQUssVUFDcEIsS0FBSyxFQUFJLEVBQUcsRUFBSSxFQUFTLE9BQVEsSUFDN0IsS0FBSyxLQUFPLEVBQUssRUFBUyxHQUU5QixPQUFPLE1BWVgsUUFBUyxHQUFRLEdBQ2IsR0FBSSxFQUFHLE9BQVEsR0FDWCxNQUFPLEdBQUksRUFBRyxLQUVsQixJQUFJLEVBQ0osS0FDSSxFQUFNLEVBQUcsZ0JBQ1gsTUFBTSxJQWFSLEtBQUssS0FBTyxFQUNSLElBQ0EsS0FBSyxNQUFRLEdBQUksR0FBTSxJQVEzQixLQUFLLEtBQU8sRUFBRyxTQUFXLEVBQUcsUUFDN0IsSUFBSSxHQUFLLEtBQUssR0FBSyxFQUFHLEtBVXRCLElBVEEsS0FBSyxTQUNMLEtBQUssR0FDRCxjQUVKLEVBQUcsS0FBTyxFQUNWLEVBQUksR0FBTSxLQUNPLEtBQWIsS0FBSyxPQUNMLEtBQUssSUFBTSxHQUVYLEtBQUssUUFBUyxFQUFHLEVBQUcsS0FBTSxFQUFHLFFBQVMsRUFBRyxPQUFRLEdBQ2pELElBQUssR0FBSSxLQUFVLEdBQU0sVUFBZSxFQUFNLFVBQVUsR0FBSyxLQUN6RCxLQUFLLEdBQVUsRUFBTSxVQUFVLElBNEYzQyxRQUFTLEdBQVMsR0FDZCxLQUFLLEtBQU8sRUE2QmhCLFFBQVMsR0FBSyxFQUFNLEdBQ2hCLEdBQUksR0FBTSxFQUFFLEVBR1osT0FGQSxHQUFPLFlBQVksR0FDVixFQUFLLEdBR2xCLFFBQVMsR0FBTSxFQUFHLEdBQ2QsR0FBSSxHQUNBLEVBQ0EsRUFDQSxFQUFRLEVBQU0sU0FDbEIsSUFBSSxHQUFLLEVBQUUsU0FBc0MsT0FBM0IsRUFBRSxRQUFRLGNBQXdCLENBQ3BELEdBQUksRUFBRSxPQUFRLEdBQ1YsTUFBTyxHQUFJLEVBQUUsS0FFakIsSUFBSSxHQUFNLEVBQUUsYUFDWixHQUFNLEdBQUksR0FBUSxHQUNsQixFQUFPLEVBQUUscUJBQXFCLFFBQVEsR0FDdEMsRUFBTyxFQUFFLHFCQUFxQixRQUFRLEdBQ2pDLElBQ0QsRUFBTyxFQUFFLFFBQ1QsRUFBSyxZQUFZLEVBQUksZUFBZSxzQkFDcEMsRUFBSSxLQUFLLFlBQVksSUFFcEIsSUFDRCxFQUFPLEVBQUUsUUFDVCxFQUFJLEtBQUssWUFBWSxJQUV6QixFQUFJLEtBQU8sQ0FDWCxLQUFLLEdBQUksS0FBTyxHQUFXLEVBQU0sR0FBSyxLQUNsQyxFQUFJLEdBQU8sRUFBTSxHQUVyQixHQUFJLE1BQVEsRUFBSSxLQUFPLE1BRXZCLEdBQU0sRUFBSyxNQUFPLEVBQUssSUFBSSxNQUMzQixFQUFFLEVBQUksTUFDRixPQUFRLEVBQ1IsUUFBUyxJQUNULE1BQU8sRUFDUCxNQUFPLEdBR2YsT0FBTyxHQUVYLFFBQVMsR0FBSyxHQUNWLE1BQUssR0FHRCxZQUFlLElBQVcsWUFBZSxHQUNsQyxFQUVQLEVBQUksU0FBd0MsT0FBN0IsRUFBSSxRQUFRLGNBQ3BCLEdBQUksR0FBTSxHQUVqQixFQUFJLFNBQXdDLFVBQTdCLEVBQUksUUFBUSxlQUF5QyxpQkFBWixFQUFJLEtBQ3JELEdBQUksR0FBTSxFQUFJLGdCQUFnQixxQkFBcUIsT0FBTyxJQUU5RCxHQUFJLEdBQVEsR0FYUixFQTJEZixRQUFTLEdBQVcsRUFBTSxHQUN0QixJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBSyxPQUFRLEVBQUksRUFBSSxJQUFLLENBQzNDLEdBQUksSUFDSSxLQUFNLEVBQUssR0FBRyxLQUNkLEtBQU0sRUFBSyxHQUFHLFFBRWxCLEVBQVcsRUFBSyxHQUFHLFVBQ3ZCLEdBQUUsS0FBSyxHQUNILEVBQVMsUUFDVCxFQUFXLEVBQVUsRUFBSyxnQkExakR0QyxFQUFLLFFBQVUsUUF5Q2YsRUFBSyxTQUFXLFdBQ1osTUFBTyxTQUFXLEtBQUssU0FFM0IsRUFBSyxJQUNMLElBQUksSUFDQSxJQUFLLEVBQUssT0FDVixJQUFLLEVBQUssT0FBTyxTQUVyQixHQUFLLEVBQUUsS0FBTyxDQUNkLElBQUksR0FBTSxpQkFDTixFQUFNLE9BQ04sRUFBVSxXQUNWLEVBQVEsU0FDUixFQUFPLEtBQ1AsRUFBTyxFQUFLLElBQ1osRUFBTyxFQUFLLElBQ1osRUFBTSxFQUFLLElBRVgsR0FETSxFQUFLLElBQ04sRUFBSyxJQUVWLEdBRFEsRUFBSyxNQUNULElBRUosRUFBaUIsT0FBTyxVQUFVLFNBRWxDLEVBQWUsbVRBSWYsR0FGWSxFQUFLLEVBQUUsVUFBWSxTQUVqQixlQUNkLEdBQVEsR0FBSSxFQUFHLEdBQUksR0FDbkIsRUFBYyw2REFDZCxFQUFXLDhEQUNYLEVBQWEsNkNBQ2IsRUFBUSxFQUNSLEVBQVcsTUFBUSxHQUFJLE9BQU0sU0FBUyxJQUN0QyxFQUFLLFNBQVUsR0FDWCxPQUFRLEdBQU0sRUFBRyxLQUFPLEVBQUcsS0FBTyxHQUFLLEdBQVksS0FBUyxTQUFTLEtBRXpFLEVBQVEsK0JBQ1IsRUFBUSw2QkFDUixJQVNNLEdBQUssSUFBTSxTQUFVLEdBQ3ZCLE1BQU8sU0FBVyxFQUFNLEtBb0RoQyxHQUFLLEVBQUUsRUFBSSxFQUNYLEVBQUssRUFBRSxHQUFLLEVBbURaLEVBQUssT0FBUyxXQUNWLEdBQUksR0FBYSxnQkFDYixFQUFtQiwyREFDbkIsRUFBVyxTQUFVLEVBQUssRUFBSyxHQUMzQixHQUFJLEdBQU0sQ0FXVixPQVZBLEdBQUksUUFBUSxFQUFrQixTQUFVLEVBQUssRUFBTSxFQUFPLEVBQVksR0FDbEUsRUFBTyxHQUFRLEVBQ1gsSUFDSSxJQUFRLEtBQ1IsRUFBTSxFQUFJLElBRUEsa0JBQVAsSUFBcUIsSUFBVyxFQUFNLFFBR3JELEdBQWMsTUFBUCxHQUFlLEdBQU8sRUFBTSxFQUFNLEdBQU8sR0FHeEQsT0FBTyxVQUFVLEVBQUssR0FDbEIsTUFBTyxHQUFJLEdBQUssUUFBUSxFQUFZLFNBQVUsRUFBSyxHQUMvQyxNQUFPLEdBQVMsRUFBSyxFQUFLLFNBY3RDLEVBQUssRUFBRSxNQUFRLEVBdUJmLEVBQUssRUFBRSxPQUFTLEVBa0NoQixFQUFLLElBQU0sRUFTWCxFQUFLLElBQU0sRUFTWCxFQUFLLElBQU0sU0FBVSxHQUNqQixNQUFPLEdBQUssSUFBSSxFQUFLLElBQUksS0FVN0IsRUFBSyxJQUFNLFNBQVUsR0FDakIsTUFBTyxHQUFLLElBQUksRUFBSyxJQUFJLEtBVTdCLEVBQUssSUFBTSxTQUFVLEdBQ2pCLE1BQU8sR0FBSyxJQUFJLEVBQUssSUFBSSxLQVU3QixFQUFLLEtBQU8sU0FBVSxHQUNsQixNQUFPLEdBQUssSUFBSSxFQUFLLEtBQUssS0FVOUIsRUFBSyxLQUFPLFNBQVUsR0FDbEIsTUFBTyxHQUFLLElBQUksRUFBSyxLQUFLLEtBVTlCLEVBQUssS0FBTyxTQUFVLEdBQ2xCLE1BQU8sR0FBSyxJQUFJLEVBQUssS0FBSyxLQVU5QixFQUFLLE1BQVEsU0FBVSxHQUNuQixNQUFPLEdBQUssSUFBSSxFQUFLLE1BQU0sS0FlL0IsRUFBSyxNQUFRLEVBWWIsRUFBSyxJQUFNLFNBQVUsRUFBSSxFQUFJLEVBQUksR0FDN0IsTUFBTyxNQUFLLEtBQUssRUFBSyxLQUFLLEVBQUksRUFBSSxFQUFJLEtBYTNDLEVBQUssS0FBTyxTQUFVLEVBQUksRUFBSSxFQUFJLEdBQzlCLE9BQVEsRUFBSyxJQUFPLEVBQUssSUFBTyxFQUFLLElBQU8sRUFBSyxJQW1CckQsRUFBSyxhQUFlLFNBQVUsRUFBTSxFQUFHLEdBQ25DLFFBQVMsR0FBVSxHQUNmLEdBQUksR0FBSyxFQUFFLEVBQUksRUFDWCxFQUFLLEVBQUUsRUFBSSxDQUNmLE9BQU8sR0FBSyxFQUFLLEVBQUssRUFVMUIsSUFBSyxHQUxELEdBQ0EsRUFJSyxFQUFzQixFQVIzQixFQUFXLEVBQUssS0FDaEIsRUFBYSxFQUFTLGlCQUN0QixFQUFZLEVBQWEsRUFBUyxZQUFZLGNBQWdCLEtBRzlELEVBQWUsRUFBQSxFQUdKLEVBQWEsRUFBaUIsR0FBYyxFQUFZLEdBQWMsR0FDNUUsRUFBZSxFQUFVLEVBQU8sRUFBUyxpQkFBaUIsS0FBZ0IsSUFDM0UsRUFBTyxFQUNQLEVBQWEsRUFDYixFQUFlLEVBTXZCLEtBREEsR0FBYSxHQUNOLEVBQVksSUFBSSxDQUNuQixHQUFJLEdBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxHQUNDLEVBQWUsRUFBYSxJQUFjLElBQU0sRUFBaUIsRUFBVSxFQUFTLEVBQVMsaUJBQWlCLEtBQWtCLEdBQ2pJLEVBQU8sRUFDUCxFQUFhLEVBQ2IsRUFBZSxJQUNQLEVBQWMsRUFBYSxJQUFjLElBQWUsRUFBZ0IsRUFBVSxFQUFRLEVBQVMsaUJBQWlCLEtBQWlCLEdBQzdJLEVBQU8sRUFDUCxFQUFhLEVBQ2IsRUFBZSxHQUVmLEdBQWEsR0FVckIsTUFOQSxJQUNJLEVBQUcsRUFBSyxFQUNSLEVBQUcsRUFBSyxFQUNSLE9BQVEsRUFDUixTQUFVLEtBQUssS0FBSyxLQWE1QixFQUFLLEdBQUssRUFXVixFQUFLLE9BQVMsU0FBVSxFQUFRLEVBQU8sR0FFbkMsR0FEQSxFQUFZLEVBQUcsRUFBVyxVQUFZLEVBQVksR0FDOUMsRUFBRyxFQUFRLFVBRVgsSUFEQSxHQUFJLEdBQUksRUFBTyxPQUNSLEtBQUssR0FBSSxFQUFJLEVBQU8sR0FBSyxJQUFVLEVBQ3RDLE1BQU8sR0FBTyxPQUVmLENBQ0gsR0FBVSxDQUNWLElBQUksR0FBTSxFQUFRLENBQ2xCLElBQUksRUFBTSxFQUNOLE1BQU8sR0FBUSxDQUVuQixJQUFJLEVBQU0sRUFBUyxFQUNmLE1BQU8sR0FBUSxFQUFNLEVBRzdCLE1BQU8sSUFvQ1gsRUFBSyxPQUFTLEVBQU8sU0FBVSxHQUMzQixJQUFLLElBQWMsRUFBUyxFQUFJLElBQVMsUUFBUSxLQUFPLEVBQ3BELE9BQVEsR0FBSSxFQUFHLEdBQUksRUFBRyxHQUFJLEVBQUcsSUFBSyxPQUFRLE1BQU8sRUFBRyxTQUFVLEVBRWxFLElBQWMsUUFBVixFQUNBLE9BQVEsR0FBSSxFQUFHLEdBQUksRUFBRyxHQUFJLEVBQUcsSUFBSyxPQUFRLFNBQVUsRUFHeEQsTUFERSxFQUFLLEdBQUssRUFBTyxjQUFjLFVBQVUsRUFBRyxLQUEwQixLQUFuQixFQUFPLFlBQXFCLEVBQVMsRUFBTSxLQUMzRixFQUNELE9BQVEsR0FBSSxFQUFHLEdBQUksRUFBRyxHQUFJLEVBQUcsSUFBSyxPQUFRLE1BQU8sRUFBRyxTQUFVLEVBRWxFLElBQ0ksR0FDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFBTSxFQUFPLE1BQU0sRUFDdkIsT0FBSSxJQUNJLEVBQUksS0FDSixFQUFPLEVBQU0sRUFBSSxHQUFHLFVBQVUsR0FBSSxJQUNsQyxFQUFRLEVBQU0sRUFBSSxHQUFHLFVBQVUsRUFBRyxHQUFJLElBQ3RDLEVBQU0sRUFBTSxFQUFJLEdBQUcsVUFBVSxFQUFHLEdBQUksS0FFcEMsRUFBSSxLQUNKLEVBQU8sR0FBTyxFQUFJLEVBQUksR0FBRyxPQUFPLElBQU0sRUFBRyxJQUN6QyxFQUFRLEdBQU8sRUFBSSxFQUFJLEdBQUcsT0FBTyxJQUFNLEVBQUcsSUFDMUMsRUFBTSxHQUFPLEVBQUksRUFBSSxHQUFHLE9BQU8sSUFBTSxFQUFHLEtBRXhDLEVBQUksS0FDSixFQUFTLEVBQUksR0FBRyxNQUFNLEdBQ3RCLEVBQU0sRUFBUSxFQUFPLElBQ0UsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFPLE1BQ3RDLEVBQVEsRUFBUSxFQUFPLElBQ0EsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFTLE1BQ3hDLEVBQU8sRUFBUSxFQUFPLElBQ0MsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFRLE1BQ0gsUUFBcEMsRUFBSSxHQUFHLGNBQWMsTUFBTSxFQUFHLEtBQWlCLEVBQVUsRUFBUSxFQUFPLEtBQ3hFLEVBQU8sSUFBNkIsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFXLE1BRXZELEVBQUksSUFDSixFQUFTLEVBQUksR0FBRyxNQUFNLEdBQ3RCLEVBQU0sRUFBUSxFQUFPLElBQ0UsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFPLEtBQ3RDLEVBQVEsRUFBUSxFQUFPLElBQ0EsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFTLEtBQ3hDLEVBQU8sRUFBUSxFQUFPLElBQ0MsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFRLE1BQ2YsT0FBdkIsRUFBTyxHQUFHLE9BQU8sSUFBc0MsS0FBdkIsRUFBTyxHQUFHLE9BQU8sTUFBa0IsR0FBTyxLQUN2QyxRQUFwQyxFQUFJLEdBQUcsY0FBYyxNQUFNLEVBQUcsS0FBaUIsRUFBVSxFQUFRLEVBQU8sS0FDeEUsRUFBTyxJQUE2QixLQUF2QixFQUFPLEdBQUcsT0FBTyxLQUFjLEdBQVcsS0FDaEQsRUFBSyxRQUFRLEVBQUssRUFBTyxFQUFNLElBRXRDLEVBQUksSUFDSixFQUFTLEVBQUksR0FBRyxNQUFNLEdBQ3RCLEVBQU0sRUFBUSxFQUFPLElBQ0UsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFPLEtBQ3RDLEVBQVEsRUFBUSxFQUFPLElBQ0EsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFTLEtBQ3hDLEVBQU8sRUFBUSxFQUFPLElBQ0MsS0FBdkIsRUFBTyxHQUFHLE9BQU8sS0FBYyxHQUFRLE1BQ2YsT0FBdkIsRUFBTyxHQUFHLE9BQU8sSUFBc0MsS0FBdkIsRUFBTyxHQUFHLE9BQU8sTUFBa0IsR0FBTyxLQUN2QyxRQUFwQyxFQUFJLEdBQUcsY0FBYyxNQUFNLEVBQUcsS0FBaUIsRUFBVSxFQUFRLEVBQU8sS0FDeEUsRUFBTyxJQUE2QixLQUF2QixFQUFPLEdBQUcsT0FBTyxLQUFjLEdBQVcsS0FDaEQsRUFBSyxRQUFRLEVBQUssRUFBTyxFQUFNLEtBRTFDLEVBQU0sRUFBSyxFQUFLLE1BQU0sR0FBTSxLQUM1QixFQUFRLEVBQUssRUFBSyxNQUFNLEdBQVEsS0FDaEMsRUFBTyxFQUFLLEVBQUssTUFBTSxHQUFPLEtBQzlCLEVBQVUsRUFBSyxFQUFLLEVBQVMsR0FBSSxHQUNqQyxHQUFPLEVBQUcsRUFBSyxFQUFHLEVBQU8sRUFBRyxFQUFNLFNBQVUsR0FDNUMsRUFBSSxJQUFNLEtBQU8sU0FBVyxFQUFPLEdBQVMsRUFBSSxHQUFPLElBQUksU0FBUyxJQUFJLE1BQU0sR0FDOUUsRUFBSSxRQUFVLEVBQUcsRUFBUyxVQUFZLEVBQVUsRUFDekMsS0FFSCxHQUFJLEVBQUcsR0FBSSxFQUFHLEdBQUksRUFBRyxJQUFLLE9BQVEsTUFBTyxFQUFHLFNBQVUsSUFDL0QsR0FXSCxFQUFLLElBQU0sRUFBTyxTQUFVLEVBQUcsRUFBRyxHQUM5QixNQUFPLEdBQUssUUFBUSxFQUFHLEVBQUcsR0FBRyxNQVlqQyxFQUFLLElBQU0sRUFBTyxTQUFVLEVBQUcsRUFBRyxHQUM5QixNQUFPLEdBQUssUUFBUSxFQUFHLEVBQUcsR0FBRyxNQVlqQyxFQUFLLElBQU0sRUFBTyxTQUFVLEVBQUcsRUFBRyxFQUFHLEdBQ2pDLEdBQUksRUFBRyxFQUFHLFVBQVcsQ0FDakIsR0FBSSxHQUFRLEVBQUssS0FDakIsT0FBTyxTQUFXLEVBQU0sR0FBSSxFQUFNLEdBQUksRUFBTSxJQUFLLEVBQUUsUUFBUSxJQUFNLElBRXJFLE1BQU8sS0FBTyxTQUFXLEVBQUksR0FBSyxFQUFJLEdBQUssSUFBSSxTQUFTLElBQUksTUFBTSxJQUV0RSxJQUFJLEdBQVEsU0FBVSxHQUNsQixHQUFJLEdBQUksRUFBSyxJQUFJLHFCQUFxQixRQUFRLElBQU0sRUFBSyxJQUFJLHFCQUFxQixPQUFPLEdBQ3JGLEVBQU0sZ0JBVVYsUUFUQSxFQUFRLEVBQU8sU0FBVSxHQUNyQixHQUEyQixPQUF2QixFQUFNLGNBQ04sTUFBTyxFQUVYLEdBQUUsTUFBTSxNQUFRLEVBQ2hCLEVBQUUsTUFBTSxNQUFRLENBQ2hCLElBQUksR0FBTSxFQUFLLElBQUksWUFBWSxpQkFBaUIsRUFBRyxHQUFHLGlCQUFpQixRQUN2RSxPQUFPLElBQU8sRUFBTSxLQUFPLEtBRWxCLElBRWpCLEVBQWMsV0FDVixNQUFPLFFBQVUsS0FBSyxFQUFHLEtBQUssRUFBRyxLQUFLLEdBQUssS0FFL0MsRUFBYyxXQUNWLE1BQU8sUUFBVSxLQUFLLEVBQUcsS0FBSyxFQUFHLEtBQUssR0FBSyxLQUUvQyxFQUFjLFdBQ1YsTUFBdUIsSUFBaEIsS0FBSyxTQUFnQyxNQUFoQixLQUFLLFFBQ3pCLEtBQUssSUFDTCxTQUFXLEtBQUssRUFBRyxLQUFLLEVBQUcsS0FBSyxFQUFHLEtBQUssU0FBVyxLQUUvRCxFQUFhLFNBQVUsRUFBRyxFQUFHLEdBTXpCLEdBTFMsTUFBTCxHQUFhLEVBQUcsRUFBRyxXQUFhLEtBQU8sSUFBSyxLQUFPLElBQUssS0FBTyxLQUMvRCxFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsR0FFRCxNQUFMLEdBQWEsRUFBRyxFQUFHLFFBQVMsQ0FDNUIsR0FBSSxHQUFNLEVBQUssT0FBTyxFQUN0QixHQUFJLEVBQUksRUFDUixFQUFJLEVBQUksRUFDUixFQUFJLEVBQUksRUFRWixPQU5JLEVBQUksR0FBSyxFQUFJLEdBQUssRUFBSSxLQUN0QixHQUFLLElBQ0wsR0FBSyxJQUNMLEdBQUssTUFHRCxFQUFHLEVBQUcsSUFFbEIsRUFBYSxTQUFVLEVBQUcsRUFBRyxFQUFHLEdBQzVCLEVBQUksRUFBSyxNQUFVLElBQUosR0FDZixFQUFJLEVBQUssTUFBVSxJQUFKLEdBQ2YsRUFBSSxFQUFLLE1BQVUsSUFBSixFQUNmLElBQUksSUFDQSxFQUFHLEVBQ0gsRUFBRyxFQUNILEVBQUcsRUFDSCxRQUFTLEVBQUcsRUFBRyxVQUFZLEVBQUksRUFDL0IsSUFBSyxFQUFLLElBQUksRUFBRyxFQUFHLEdBQ3BCLFNBQVUsRUFHZCxPQURBLEdBQUcsRUFBRyxZQUFjLEVBQUksUUFBVSxHQUMzQixFQXFCWCxHQUFLLE1BQVEsU0FBVSxHQUNuQixHQUFJLEVBaUNKLE9BaENJLEdBQUcsRUFBSyxXQUFhLEtBQU8sSUFBTyxLQUFPLElBQU8sS0FBTyxJQUN4RCxFQUFNLEVBQUssUUFBUSxHQUNuQixFQUFJLEVBQUksRUFBSSxFQUNaLEVBQUksRUFBSSxFQUFJLEVBQ1osRUFBSSxFQUFJLEVBQUksRUFDWixFQUFJLFFBQVUsRUFDZCxFQUFJLElBQU0sRUFBSSxLQUNQLEVBQUcsRUFBSyxXQUFhLEtBQU8sSUFBTyxLQUFPLElBQU8sS0FBTyxJQUMvRCxFQUFNLEVBQUssUUFBUSxHQUNuQixFQUFJLEVBQUksRUFBSSxFQUNaLEVBQUksRUFBSSxFQUFJLEVBQ1osRUFBSSxFQUFJLEVBQUksRUFDWixFQUFJLFFBQVUsRUFDZCxFQUFJLElBQU0sRUFBSSxNQUVWLEVBQUcsRUFBSyxZQUNSLEVBQU0sRUFBSyxPQUFPLElBRWxCLEVBQUcsRUFBSyxXQUFhLEtBQU8sSUFBTyxLQUFPLElBQU8sS0FBTyxNQUFTLFNBQVcsS0FDNUUsRUFBTSxFQUFLLFFBQVEsR0FDbkIsRUFBSSxFQUFJLEVBQUksRUFDWixFQUFJLEVBQUksRUFBSSxFQUNaLEVBQUksRUFBSSxFQUFJLEVBQ1osRUFBTSxFQUFLLFFBQVEsR0FDbkIsRUFBSSxFQUFJLEVBQUksSUFFWixHQUFPLElBQUssUUFDWixFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEdBQUssRUFDekQsRUFBSSxNQUFRLElBR3BCLEVBQUksU0FBVyxFQUNSLEdBa0JYLEVBQUssUUFBVSxTQUFVLEVBQUcsRUFBRyxFQUFHLEdBQzFCLEVBQUcsRUFBRyxXQUFhLEtBQU8sSUFBSyxLQUFPLElBQUssS0FBTyxLQUNsRCxFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsRUFDTixFQUFJLEVBQUUsR0FFVixHQUFLLEdBQ0wsSUFBSSxHQUFHLEVBQUcsRUFBRyxFQUFHLENBVWhCLE9BVEEsR0FBSSxFQUFJLElBQU0sR0FDZCxFQUFJLEVBQUksRUFDUixFQUFJLEdBQUssRUFBSSxFQUFJLEVBQUksRUFBSSxJQUN6QixFQUFJLEVBQUksRUFBSSxFQUFJLEVBRWhCLElBQU0sRUFDTixJQUFNLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFHLEdBQ3hCLElBQU0sRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUcsR0FDeEIsSUFBTSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxHQUNqQixFQUFXLEVBQUcsRUFBRyxFQUFHLElBa0IvQixFQUFLLFFBQVUsU0FBVSxFQUFHLEVBQUcsRUFBRyxHQUMxQixFQUFHLEVBQUcsV0FBYSxLQUFPLElBQUssS0FBTyxJQUFLLEtBQU8sS0FDbEQsRUFBSSxFQUFFLEVBQ04sRUFBSSxFQUFFLEVBQ04sRUFBSSxFQUFFLElBRU4sRUFBSSxHQUFLLEVBQUksR0FBSyxFQUFJLEtBQ3RCLEdBQUssSUFDTCxHQUFLLElBQ0wsR0FBSyxLQUVULEdBQUssR0FDTCxJQUFJLEdBQUcsRUFBRyxFQUFHLEVBQUcsQ0FVaEIsT0FUQSxHQUFJLEVBQUksSUFBTSxHQUNkLEVBQUksRUFBSSxHQUFLLEVBQUksR0FBSyxFQUFJLEVBQUksR0FDOUIsRUFBSSxHQUFLLEVBQUksRUFBSSxFQUFJLEVBQUksSUFDekIsRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBRXBCLElBQU0sRUFDTixJQUFNLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFHLEdBQ3hCLElBQU0sRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUcsR0FDeEIsSUFBTSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxHQUNqQixFQUFXLEVBQUcsRUFBRyxFQUFHLElBaUIvQixFQUFLLFFBQVUsU0FBVSxFQUFHLEVBQUcsR0FDM0IsRUFBSSxFQUFXLEVBQUcsRUFBRyxHQUNyQixFQUFJLEVBQUUsR0FDTixFQUFJLEVBQUUsR0FDTixFQUFJLEVBQUUsRUFFTixJQUFJLEdBQUcsRUFBRyxFQUFHLENBU2IsT0FSQSxHQUFJLEVBQUssRUFBRyxFQUFHLEdBQ2YsRUFBSSxFQUFJLEVBQUssRUFBRyxFQUFHLEdBQ25CLEVBQVMsR0FBTCxFQUFTLEtBQ1QsR0FBSyxHQUFLLEVBQUksR0FBSyxFQUNuQixHQUFLLEdBQUssRUFBSSxHQUFLLEVBQUksR0FDYixFQUFJLEdBQUssRUFBSSxFQUMzQixHQUFLLEVBQUksS0FBTyxFQUFJLEdBQUssSUFDekIsRUFBUyxHQUFMLEVBQVMsRUFBSSxFQUFJLEdBQ2IsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsU0FBVSxJQWlCeEMsRUFBSyxRQUFVLFNBQVUsRUFBRyxFQUFHLEdBQzNCLEVBQUksRUFBVyxFQUFHLEVBQUcsR0FDckIsRUFBSSxFQUFFLEdBQ04sRUFBSSxFQUFFLEdBQ04sRUFBSSxFQUFFLEVBRU4sSUFBSSxHQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsQ0FhbkIsT0FaQSxHQUFJLEVBQUssRUFBRyxFQUFHLEdBQ2YsRUFBSSxFQUFLLEVBQUcsRUFBRyxHQUNmLEVBQUksRUFBSSxFQUNSLEVBQVMsR0FBTCxFQUFTLEtBQ1QsR0FBSyxHQUFLLEVBQUksR0FBSyxFQUNuQixHQUFLLEdBQUssRUFBSSxHQUFLLEVBQUksR0FDYixFQUFJLEdBQUssRUFBSSxFQUMzQixHQUFLLEVBQUksS0FBTyxFQUFJLEdBQUssSUFDekIsR0FBSyxFQUFJLEdBQUssRUFDZCxFQUFTLEdBQUwsRUFBUyxFQUNSLEVBQUksR0FBSyxHQUFLLEVBQUksR0FDVCxHQUFLLEVBQUksRUFBSSxJQUNuQixFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxTQUFVLElBY3hDLEVBQUssZ0JBQWtCLFNBQVUsR0FDN0IsSUFBSyxFQUNELE1BQU8sS0FFWCxJQUFJLEdBQU0sRUFBSyxLQUFLLEVBQ3BCLElBQUksRUFBSSxJQUNKLE1BQU8sR0FBSyxLQUFLLE1BQU0sRUFBSSxJQUcvQixJQUFJLElBQWUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUMxRixJQStCSixPQTlCSSxHQUFHLEVBQVksVUFBWSxFQUFHLEVBQVcsR0FBSSxXQUM3QyxFQUFPLEVBQUssS0FBSyxNQUFNLElBRXRCLEVBQUssUUFDTixFQUFJLEdBQVksUUFBUSxFQUFhLFNBQVUsRUFBRyxFQUFHLEdBQ2pELEdBQUksTUFDQSxFQUFPLEVBQUUsYUFZYixJQVhBLEVBQUUsUUFBUSxFQUFZLFNBQVUsRUFBRyxHQUMvQixHQUFLLEVBQU8sTUFBTSxLQUVWLEtBQVIsR0FBZSxFQUFPLE9BQVMsSUFDL0IsRUFBSyxNQUFNLEdBQUcsT0FBTyxFQUFPLE9BQU8sRUFBRyxLQUN0QyxFQUFPLElBQ1AsRUFBUyxLQUFMLEVBQVcsSUFBTSxLQUViLEtBQVIsR0FBZ0MsR0FBakIsRUFBTyxRQUN0QixFQUFLLE1BQU0sRUFBRyxFQUFPLEtBRWIsS0FBUixFQUNBLEVBQUssTUFBTSxHQUFHLE9BQU8sUUFDbEIsTUFBTyxFQUFPLFFBQVUsRUFBWSxLQUN2QyxFQUFLLE1BQU0sR0FBRyxPQUFPLEVBQU8sT0FBTyxFQUFHLEVBQVksTUFDN0MsRUFBWSxTQU03QixFQUFLLFNBQVcsRUFBSyxLQUFLLFNBQzFCLEVBQUksSUFBTSxFQUFLLEtBQUssTUFBTSxHQUNuQixFQVlYLElBQUksSUFBdUIsRUFBSyxxQkFBdUIsU0FBVSxHQUM3RCxJQUFLLEVBQ0QsTUFBTyxLQUVYLElBQ0ksS0FlSixPQWRJLEdBQUcsRUFBUyxVQUFZLEVBQUcsRUFBUSxHQUFJLFdBQ3ZDLEVBQU8sRUFBSyxLQUFLLE1BQU0sSUFFdEIsRUFBSyxRQUNOLEVBQUksR0FBUyxRQUFRLEVBQVUsU0FBVSxFQUFHLEVBQUcsR0FDM0MsR0FBSSxLQUNPLEdBQUUsYUFDYixHQUFFLFFBQVEsRUFBWSxTQUFVLEVBQUcsR0FDL0IsR0FBSyxFQUFPLE1BQU0sS0FFdEIsRUFBSyxNQUFNLEdBQUcsT0FBTyxNQUc3QixFQUFLLFNBQVcsRUFBSyxLQUFLLFNBQ25CLEVBOEJYLEdBQUssRUFBRSxvQkFBc0IsRUFDN0IsRUFBSyxFQUFFLFlBQWMsc0JBcUVyQixFQUFLLEVBQUUsaUJBQW1CLEVBQzFCLEVBQUssU0FBVyxDQUNELEdBQUssSUFBSSxVQUFZLEVBQUssSUFBSSx1QkFvQzdDLEdBQUssRUFBRSxZQUFjLEVBQ3JCLEVBQUssRUFBRSxXQUFhLEVBcUdwQixFQUFLLE9BQVMsU0FBVSxHQUVwQixNQURBLEdBQVEsRUFBSSxHQUFPLFFBQVEsWUFBYSxTQUNqQyxFQUFLLEVBQUssSUFBSSxjQUFjLEtBVXZDLEVBQUssVUFBWSxTQUFVLEdBR3ZCLElBQUssR0FGRCxHQUFXLEVBQUssSUFBSSxpQkFBaUIsR0FDckMsR0FBTyxFQUFLLEtBQU8sU0FDZCxFQUFJLEVBQUcsRUFBSSxFQUFTLE9BQVEsSUFDakMsRUFBSSxLQUFLLEVBQUssRUFBUyxJQUUzQixPQUFPLElBMkJYLFlBQVksV0FDUixJQUFLLEdBQUksS0FBTyxHQUFLLEdBQUksRUFBSSxHQUFLLEdBQU0sQ0FDcEMsR0FBSSxHQUFLLEVBQUksR0FDVCxFQUFPLEVBQUcsTUFDQyxPQUFYLEVBQUcsT0FBa0IsRUFBSyxpQkFBOEIsT0FBWCxFQUFHLFFBQW1CLEVBQUssWUFBYyxtQkFBcUIsR0FBSyxhQUFlLEVBQUsseUJBQzdILEdBQUksS0FHcEIsS0F5RUMsRUFBUSxVQUFVLEtBQU8sU0FBVSxFQUFRLEdBQ3ZDLEdBQUksR0FBSyxLQUNMLEVBQU8sRUFBRyxJQUNkLEtBQUssRUFBUSxDQUNULEdBQXFCLEdBQWpCLEVBQUssU0FDTCxPQUNJLEtBQU0sRUFBSyxVQUtuQixLQUFLLEdBRkQsR0FBTyxFQUFLLFdBQ1osS0FDSyxFQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBQ3RDLEVBQUksRUFBSyxHQUFHLFVBQVksRUFBSyxHQUFHLFNBRXBDLE9BQU8sR0FFWCxHQUFJLEVBQUcsRUFBUSxVQUFXLENBQ3RCLEtBQUksVUFBVSxPQUFTLEdBS25CLE1BQU8sR0FBSSxxQkFBdUIsRUFBUSxHQUFJLGNBSjlDLElBQUksS0FDSixHQUFLLEdBQVUsRUFDZixFQUFTLEVBS2pCLElBQUssR0FBSSxLQUFPLEdBQ1IsRUFBTyxHQUFLLElBQ1osRUFBSSxrQkFBb0IsRUFBSyxFQUFJLEVBQU8sR0FHaEQsT0FBTyxJQVdmLEVBQUssTUFBUSxTQUFVLEdBQ25CLEdBQUksR0FBSSxFQUFLLElBQUkseUJBQ2IsR0FBTyxFQUNQLEVBQU0sRUFBSyxJQUFJLGNBQWMsTUFRakMsSUFQQSxFQUFNLEVBQUksR0FDTCxFQUFJLE1BQU0seUJBQ1gsRUFBTSxRQUFVLEVBQU0sU0FDdEIsR0FBTyxHQUVYLEVBQUksVUFBWSxFQUNoQixFQUFNLEVBQUkscUJBQXFCLE9BQU8sR0FFbEMsR0FBSSxFQUNBLEVBQUksTUFFSixNQUFPLEVBQUksWUFDUCxFQUFFLFlBQVksRUFBSSxXQUk5QixPQUFPLElBQUksR0FBUyxJQWN4QixFQUFLLFNBQVcsV0FHWixJQUFLLEdBRkQsR0FBTyxNQUFNLFVBQVUsTUFBTSxLQUFLLFVBQVcsR0FDN0MsRUFBSSxFQUFLLElBQUkseUJBQ1IsRUFBSSxFQUFHLEVBQUssRUFBSyxPQUFRLEVBQUksRUFBSSxJQUFLLENBQzNDLEdBQUksR0FBTyxFQUFLLEVBQ1osR0FBSyxNQUFRLEVBQUssS0FBSyxVQUN2QixFQUFFLFlBQVksRUFBSyxNQUVuQixFQUFLLFVBQ0wsRUFBRSxZQUFZLEdBRUMsZ0JBQVIsSUFDUCxFQUFFLFlBQVksRUFBSyxNQUFNLEdBQU0sTUFHdkMsTUFBTyxJQUFJLEdBQVMsSUErRHhCLEVBQUssRUFBRSxLQUFPLEVBQ2QsRUFBSyxFQUFFLEtBQU8sRUF3QmQsRUFBTSxVQUFVLEdBQUssU0FBVSxFQUFNLEdBQ2pDLEdBQUksR0FBSyxFQUFLLEVBQU0sS0FBSyxLQUV6QixPQURBLElBQVEsRUFBRyxLQUFLLEdBQ1QsR0FTWCxFQUFRLFVBQVUsU0FBVyxXQUd6QixJQUFLLEdBRkQsTUFDQSxFQUFLLEtBQUssS0FBSyxXQUNWLEVBQUksRUFBRyxFQUFLLEVBQUcsT0FBUSxFQUFJLEVBQUksSUFDcEMsRUFBSSxHQUFLLEVBQUssRUFBRyxHQUVyQixPQUFPLElBMkJYLEVBQVEsVUFBVSxPQUFTLFdBQ3ZCLEdBQUksS0FFSixPQURBLElBQVksTUFBTyxHQUNaLEVBQUksSUFHZixFQUFJLEdBQUcsb0JBQXFCLFdBQ3hCLEdBQUksR0FBTSxFQUFJLElBQ2QsR0FBTSxFQUFJLFVBQVUsRUFBSSxZQUFZLEtBQU8sRUFDM0MsSUFBSSxHQUFNLEVBQUksUUFBUSxTQUFVLFNBQVUsR0FDdEMsTUFBTyxJQUFNLEVBQU8sZUFFeEIsT0FBSSxJQUFRLEdBQUssR0FDTixLQUFLLEtBQUssY0FBYyxZQUFZLGlCQUFpQixLQUFLLEtBQU0sTUFBTSxpQkFBaUIsR0FFdkYsRUFBRSxLQUFLLEtBQU0sSUFHNUIsSUFBSSxLQUNBLHFCQUFzQixFQUN0QixpQkFBa0IsRUFDbEIsS0FBUSxFQUNSLFlBQWEsRUFDYixZQUFhLEVBQ2IsTUFBUyxFQUNULHNCQUF1QixFQUN2Qiw4QkFBK0IsRUFDL0IsZ0JBQWlCLEVBQ2pCLGtCQUFtQixFQUNuQixPQUFVLEVBQ1YsVUFBYSxFQUNiLFFBQVcsRUFDWCxvQkFBcUIsRUFDckIsb0JBQXFCLEVBQ3JCLEtBQVEsRUFDUixlQUFnQixFQUNoQixZQUFhLEVBQ2IsT0FBVSxFQUNWLGNBQWUsRUFDZixnQkFBaUIsRUFDakIsS0FBUSxFQUNSLGNBQWUsRUFDZixZQUFhLEVBQ2IsbUJBQW9CLEVBQ3BCLGVBQWdCLEVBQ2hCLGFBQWMsRUFDZCxlQUFnQixFQUNoQixjQUFlLEVBQ2YsK0JBQWdDLEVBQ2hDLDZCQUE4QixFQUM5QixrQkFBbUIsRUFDbkIsUUFBVyxFQUNYLGlCQUFrQixFQUNsQixpQkFBa0IsRUFDbEIsT0FBVSxFQUNWLGFBQWMsRUFDZCxhQUFjLEVBQ2QsZUFBZ0IsRUFDaEIsS0FBUSxFQUNSLFFBQVcsRUFDWCxTQUFZLEVBQ1osaUJBQWtCLEVBQ2xCLGtCQUFtQixFQUNuQixhQUFjLEVBQ2QsZUFBZ0IsRUFDaEIsT0FBVSxFQUNWLG1CQUFvQixFQUNwQixvQkFBcUIsRUFDckIsaUJBQWtCLEVBQ2xCLGtCQUFtQixFQUNuQixvQkFBcUIsRUFDckIsaUJBQWtCLEVBQ2xCLGVBQWdCLEVBQ2hCLGNBQWUsRUFDZixrQkFBbUIsRUFDbkIsaUJBQWtCLEVBQ2xCLGVBQWdCLEVBQ2hCLFdBQWMsRUFDZCxlQUFnQixFQUNoQixlQUFnQixFQUdwQixHQUFJLEdBQUcsaUJBQWtCLFNBQVUsR0FDL0IsR0FBSSxHQUFNLEVBQUksS0FDVixJQUNKLEdBQU0sRUFBSSxVQUFVLEVBQUksWUFBWSxLQUFPLEdBQzNDLEVBQUssR0FBTyxDQUNaLElBQUksR0FBUSxFQUFJLFFBQVEsVUFBVyxTQUFVLEVBQUssR0FDMUMsTUFBTyxHQUFPLGdCQUVsQixFQUFNLEVBQUksUUFBUSxTQUFVLFNBQVUsR0FDbEMsTUFBTyxJQUFNLEVBQU8sZUFFeEIsSUFBUSxHQUFLLEdBQ2IsS0FBSyxLQUFLLE1BQU0sR0FBa0IsTUFBVCxFQUFnQixFQUFJLEVBRTdDLEVBQUUsS0FBSyxLQUFNLEtBR0EsRUFBTSxVQW1CM0IsRUFBSyxLQUFPLFNBQVUsRUFBSyxFQUFVLEVBQVUsR0FDM0MsR0FBSSxHQUFNLEdBQUksZ0JBQ1YsRUFBSyxHQUNULElBQUksRUFBSyxDQUNMLEdBQUksRUFBRyxFQUFVLFlBQ2IsRUFBUSxFQUNSLEVBQVcsRUFDWCxFQUFXLFNBQ1IsSUFBSSxFQUFHLEVBQVUsVUFBVyxDQUMvQixHQUFJLEtBQ0osS0FBSyxHQUFJLEtBQU8sR0FBYyxFQUFTLGVBQWUsSUFDbEQsRUFBRyxLQUFLLG1CQUFtQixHQUFPLElBQU0sbUJBQW1CLEVBQVMsSUFFeEUsR0FBVyxFQUFHLEtBQUssS0FnQnZCLE1BZEEsR0FBSSxLQUFLLEVBQVcsT0FBUyxNQUFPLEdBQUssSUFDckMsSUFDQSxFQUFJLGlCQUFpQixtQkFBb0Isa0JBQ3pDLEVBQUksaUJBQWlCLGVBQWdCLHNDQUVyQyxJQUNBLEVBQUksS0FBSyxhQUFlLEVBQUssS0FBTSxHQUNuQyxFQUFJLEtBQUssYUFBZSxFQUFLLE9BQVEsR0FDckMsRUFBSSxLQUFLLGFBQWUsRUFBSyxPQUFRLElBRXpDLEVBQUksbUJBQXFCLFdBQ0MsR0FBbEIsRUFBSSxZQUNSLEVBQUksYUFBZSxFQUFLLElBQU0sRUFBSSxPQUFRLEVBQU8sSUFFL0IsR0FBbEIsRUFBSSxZQUNHLEdBRVgsRUFBSSxLQUFLLEdBQ0YsS0FhZixFQUFLLEtBQU8sU0FBVSxFQUFLLEVBQVUsR0FDakMsRUFBSyxLQUFLLEVBQUssU0FBVSxHQUNyQixHQUFJLEdBQUksRUFBSyxNQUFNLEVBQUksYUFDdkIsR0FBUSxFQUFTLEtBQUssRUFBTyxHQUFLLEVBQVMsS0FHbkQsSUFBSSxJQUFZLFNBQVUsR0FDdEIsR0FBSSxHQUFNLEVBQUssd0JBQ1gsRUFBTSxFQUFLLGNBQ1gsRUFBTyxFQUFJLEtBQ1gsRUFBVSxFQUFJLGdCQUNkLEVBQVksRUFBUSxXQUFhLEVBQUssV0FBYSxFQUFHLEVBQWEsRUFBUSxZQUFjLEVBQUssWUFBYyxDQUdoSCxRQUNJLEVBSE8sRUFBSSxLQUFRLEVBQUUsSUFBSSxhQUFlLEVBQVEsV0FBYSxFQUFLLFdBQWMsRUFJaEYsRUFITyxFQUFJLE1BQVEsRUFBRSxJQUFJLGFBQWUsRUFBUSxZQUFjLEVBQUssWUFBYyxHQXlEekYsT0F2Q0EsR0FBSyxrQkFBb0IsU0FBVSxFQUFHLEdBQ2xDLEdBQUksR0FBUSxLQUVSLEdBRE0sRUFBTSxPQUNILEVBQUssSUFBSSxpQkFBaUIsRUFBRyxHQUMxQyxJQUFJLEVBQUssSUFBSSxPQUEyQixPQUFsQixFQUFPLFFBQWtCLENBQzNDLEdBQUksR0FBSyxHQUFVLEdBQ2YsRUFBSyxFQUFPLGVBQ2hCLEdBQUcsRUFBSSxFQUFJLEVBQUcsRUFDZCxFQUFHLEVBQUksRUFBSSxFQUFHLEVBQ2QsRUFBRyxNQUFRLEVBQUcsT0FBUyxDQUN2QixJQUFJLEdBQU8sRUFBTyxvQkFBb0IsRUFBSSxLQUN0QyxHQUFLLFNBQ0wsRUFBUyxFQUFLLEVBQUssT0FBUyxJQUdwQyxNQUFLLEdBR0UsRUFBSyxHQUZELE1BbUJmLEVBQUssT0FBUyxTQUFVLEdBQ3BCLEVBQUUsRUFBTSxFQUFTLEVBQU8sRUFBTSxJQUVsQyxFQUFLLElBQUksS0FBTyxFQUNULEdBQ0wsR0FBVSxLQXl4TFosT0Exd0xBLEdBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEVBQU0sR0E4RTlDLFFBQVMsR0FBaUIsRUFBSSxHQUMxQixHQUFZLE1BQVIsRUFBYyxDQUNkLEdBQUksSUFBVyxDQVFmLE1BTkksRUFEVyxrQkFBWCxFQUFHLE1BQXVDLGtCQUFYLEVBQUcsS0FDM0IsRUFBRyxLQUFLLGFBQWEscUJBQ1YsV0FBWCxFQUFHLEtBQ0gsRUFBRyxLQUFLLGFBQWEsb0JBRXJCLEVBQUcsS0FBSyxhQUFhLGNBRzVCLE1BQU8sSUFBSSxHQUFLLE1BRXBCLEdBQU8sRUFBSyxFQUFFLG9CQUFvQixPQUs5QixHQUhDLEVBQUssRUFBRSxZQUFZLEtBQUssR0FHbEIsRUFBSSxHQUFNLFFBQVEsZ0JBQWlCLEVBQUcsRUFBRSxXQUFhLElBRnJELEVBQUssRUFBRSxvQkFBb0IsR0FJbEMsRUFBRyxFQUFNLFdBQ1QsRUFBTyxFQUFLLEtBQU8sRUFBSyxLQUFLLFNBQVMsS0FBSyxHQUFRLEVBQUksSUFFM0QsRUFBRyxFQUFFLFVBQVksQ0FFckIsSUFBSSxHQUFJLEVBQUssRUFBRSxpQkFBaUIsRUFBTSxFQUFHLFFBQVEsR0FDakQsSUFBSSxFQUNBLE1BQU8sRUFFUCxHQUFHLE9BQVMsRUFrV3BCLFFBQVMsR0FBTyxHQU1aLFFBQVMsR0FBUSxFQUFJLEdBQ2pCLEdBQUksR0FBTSxFQUFFLEVBQUcsS0FBTSxFQUNyQixHQUFNLEdBQU8sRUFBSSxNQUFNLElBQ3ZCLEVBQU0sR0FBTyxFQUFJLEtBQ1UsS0FBaEIsRUFBSSxXQUNYLEVBQU0sRUFBSSxVQUFVLE1BS3BCLEVBQUssSUFBUSxFQUFLLFFBQVksT0FBTyxTQUFVLEdBQzNDLEdBQUksS0FDSixHQUFLLEdBQVEsRUFBSyxJQUFJLEdBQ3RCLEVBQUUsRUFBRyxLQUFNLE1BaUJ2QixJQUFLLEdBbENELEdBREEsRUFBTSxFQUFHLFVBQVUsS0FFbkIsRUFBTSw4QkFDTixLQUNBLEtBK0JLLEVBQUksRUFBRyxFQUFLLEVBQUksT0FBUSxFQUFJLEVBQUksSUFBSyxDQUMxQyxFQUFLLEVBQUksR0FDVCxFQUFRLEVBQUksUUFDWixFQUFRLEVBQUksVUFDWixFQUFRLEVBQUksVUFDWixFQUFRLEVBQUksUUFDWixFQUFRLEVBQUksYUFuQmhCLFNBQWtCLEdBQ2QsR0FBSSxHQUFNLEVBQUUsRUFBRyxLQUFNLGFBQ2pCLElBQXVCLEtBQWhCLEVBQUksV0FDWCxFQUFNLEVBQUksVUFBVSxNQUtwQixFQUFLLElBQVEsRUFBSyxRQUFZLE9BQU8sU0FBVSxHQUMzQyxFQUFHLEtBQUssYUFBYyxJQUFNLE9BVzNCLEVBQ1QsSUFBSSxHQUFRLEVBQUUsRUFBRyxLQUFNLEtBQ25CLEtBQ0EsRUFBRSxFQUFHLE1BQU8sR0FBSSxFQUFHLEtBQ25CLEVBQUksTUFDQSxJQUFLLEVBQ0wsR0FBSSxFQUFHLE1BSW5CLElBQUssRUFBSSxFQUFHLEVBQUssRUFBSSxPQUFRLEVBQUksRUFBSSxJQUFLLENBQ3RDLEdBQUksR0FBSyxFQUFLLEVBQUksR0FBRyxJQUNyQixJQUFJLEVBQ0EsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUcsT0FBUSxFQUFJLEVBQUksSUFDcEMsRUFBRyxHQUFHLEVBQUksR0FBRyxLQWtON0IsUUFBUyxHQUFTLEdBQ2QsTUFBTyxZQUNILEdBQUksR0FBTSxFQUFPLElBQU0sS0FBSyxLQUFPLEdBQy9CLEVBQU8sS0FBSyxLQUFLLFdBQ2pCLEVBQU8sS0FBSyxLQUFLLFVBQ3JCLElBQUksRUFDQSxJQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBSyxPQUFRLEVBQUksRUFBSSxJQUN0QyxHQUFPLElBQU0sRUFBSyxHQUFHLEtBQU8sS0FDcEIsRUFBSyxHQUFHLE1BQU0sUUFBUSxLQUFNLE9BQVMsR0FHckQsSUFBSSxFQUFLLE9BQVEsQ0FFYixJQURBLElBQVMsR0FBTyxLQUNYLEVBQUksRUFBRyxFQUFLLEVBQUssT0FBUSxFQUFJLEVBQUksSUFDVixHQUFwQixFQUFLLEdBQUcsU0FDUixHQUFPLEVBQUssR0FBRyxVQUNZLEdBQXBCLEVBQUssR0FBRyxXQUNmLEdBQU8sRUFBSyxFQUFLLElBQUksV0FHN0IsS0FBUyxHQUFPLEtBQU8sS0FBSyxLQUFPLFNBRW5DLEtBQVMsR0FBTyxLQUVwQixPQUFPLElBL3VCZixHQUFJLEdBQVUsRUFBUSxVQUNsQixFQUFLLEVBQUssR0FDVixFQUFNLE9BQ04sRUFBVSxFQUFLLFNBQ2YsRUFBSSxFQUFLLEVBQUUsRUFDWCxFQUFPLEVBQUssRUFBRSxLQUNkLEVBQWMsRUFBSyxFQUFFLFlBRXJCLEVBQU8sRUFBSyxFQUFFLElBMEJsQixHQUFRLFFBQVUsU0FBVSxHQUN4QixHQUFpQixTQUFiLEtBQUssS0FDTCxNQUFPLEdBQUssRUFBRSxJQUFJLEtBQUssS0FBSyxpQkFBaUIsS0FBSyxHQUV0RCxLQUFLLEVBQUssU0FBVyxFQUFLLEtBQ3RCLE1BQU8sTUFBSyxLQUFLLFNBRXJCLElBQUksR0FBSyxLQUNMLEVBQUksR0FBSSxHQUFLLE1BQ2pCLElBQUksRUFBRyxRQUNILE1BQU8sR0FBSyxFQUFFLEtBRWxCLE1BQWtCLE9BQVgsRUFBRyxNQUlOLEdBSEssSUFDRCxFQUFJLEVBQUUsSUFBSSxFQUFHLFlBQVksWUFBWSxVQUFVLEVBQUcsS0FBSyxNQUFRLEVBQUcsRUFBRyxLQUFLLE1BQVEsS0FFbEYsRUFBRyxTQUNILEVBQUssRUFBRyxhQUNMLENBQ0gsR0FBSSxHQUFPLEVBQUcsS0FBSyxhQUNuQixHQUFLLEVBQUcsU0FBVyxFQUFHLEtBQUssY0FBYyxlQUFlLEVBQUssVUFBVSxFQUFLLFFBQVEsS0FBTyxJQUduRyxHQUFJLEdBQUksRUFBRyxFQUNQLEVBQWEsRUFBSyxLQUFLLElBQUksRUFBRyxPQUFTLEVBQUssS0FBSyxJQUFJLEtBQ3pELEtBQ0ksTUFBSSxJQUNBLEVBQUUsT0FBUyxFQUFhLEVBQUssS0FBSyxRQUFRLEVBQUcsU0FBVyxFQUFXLElBQU8sRUFBSyxFQUFFLElBQUksRUFBRyxLQUFLLFdBQ3RGLEVBQUssRUFBRSxJQUFJLEVBQUUsVUFFcEIsRUFBRyxTQUFXLEVBQVcsR0FDekIsRUFBRyxPQUFTLEVBQUcsWUFBWSxZQUMzQixFQUFFLEtBQU8sRUFBSyxLQUFLLFFBQVEsRUFBSyxLQUFLLElBQUksRUFBRyxTQUFVLEVBQUUsSUFBSSxFQUFHLFVBQ3hELEVBQUssRUFBRSxJQUFJLEVBQUUsT0FFMUIsTUFBTyxHQUVMLE1BQU8sR0FBSyxFQUFFLE9BR3RCLElBQUksR0FBYSxXQUNiLE1BQU8sTUFBSyxPQXNEaEIsR0FBUSxVQUFZLFNBQVUsR0FDMUIsR0FBSSxHQUFJLEtBQUssQ0FDYixJQUFZLE1BQVIsRUFBYyxDQVVkLElBVEEsR0FLSSxHQUxBLEVBQU8sS0FDUCxFQUFTLEdBQUksR0FBSyxPQUFPLEtBQUssS0FBSyxVQUNuQyxFQUFRLEVBQWlCLE1BQ3pCLEdBQU0sR0FDTixFQUFJLEdBQUksR0FBSyxPQUViLEVBQWMsRUFBTSxvQkFDcEIsRUFBUyxFQUFJLElBQVUsRUFBSSxLQUFLLFFBQ3BCLEVBQUksRUFBRSxXQUFhLEVBQ2YsT0FBYixFQUFLLE9BQWtCLEVBQU8sRUFBSyxXQUN0QyxFQUFHLEtBQUssRUFBaUIsR0FHN0IsS0FEQSxFQUFJLEVBQUcsT0FDQSxLQUNILEVBQUUsSUFBSSxFQUFHLEdBRWIsUUFDSSxPQUFRLEVBQ1IsYUFBYyxFQUNkLFlBQWEsRUFDYixZQUFhLEVBQ2IsV0FBWSxFQUFPLFFBQVEsSUFBSSxFQUFNLFVBQ3JDLE9BQVEsRUFBTyxvQkFDZixNQUFPLEVBQUUsb0JBQ1QsTUFBTyxFQUNQLFNBQVUsR0FvQmxCLE1BakJJLGFBQWdCLEdBQUssUUFDckIsS0FBSyxPQUFTLEVBQ2QsS0FBSyxFQUFFLFVBQVksRUFBSyxxQkFFeEIsRUFBaUIsS0FBTSxHQUd2QixLQUFLLE9BQ1ksa0JBQWIsS0FBSyxNQUF5QyxrQkFBYixLQUFLLEtBQ3RDLEVBQUUsS0FBSyxNQUFPLGtCQUFtQixLQUFLLFNBQ2xCLFdBQWIsS0FBSyxLQUNaLEVBQUUsS0FBSyxNQUFPLGlCQUFrQixLQUFLLFNBRXJDLEVBQUUsS0FBSyxNQUFPLFVBQVcsS0FBSyxVQUkvQixNQVVYLEVBQVEsT0FBUyxXQUNiLE1BQU8sR0FBSyxLQUFLLEtBQUssYUFpQjFCLEVBQVEsT0FBUyxFQUFRLElBQU0sU0FBVSxHQUNyQyxHQUFJLEVBQUksQ0FDSixHQUFlLE9BQVgsRUFBRyxLQUFlLENBQ2xCLEdBQUksR0FBSyxJQUlULE9BSEEsR0FBRyxRQUFRLFNBQVUsR0FDakIsRUFBRyxJQUFJLEtBRUosS0FFWCxFQUFLLEVBQUssR0FDVixLQUFLLEtBQUssWUFBWSxFQUFHLE1BQ3pCLEVBQUcsTUFBUSxLQUFLLE1BRXBCLE1BQU8sT0FXWCxFQUFRLFNBQVcsU0FBVSxHQUt6QixNQUpJLEtBQ0EsRUFBSyxFQUFLLEdBQ1YsRUFBRyxPQUFPLE9BRVAsTUFXWCxFQUFRLFFBQVUsU0FBVSxHQUN4QixHQUFJLEVBQUksQ0FDSixHQUFlLE9BQVgsRUFBRyxLQUFlLENBQ2xCLEdBQ0ksR0FEQSxFQUFLLElBVVQsT0FSQSxHQUFHLFFBQVEsU0FBVSxHQUNiLEVBQ0EsRUFBTSxNQUFNLEdBRVosRUFBRyxRQUFRLEdBRWYsRUFBUSxJQUVMLEtBRVgsRUFBSyxFQUFLLEVBQ1YsSUFBSSxHQUFTLEVBQUcsUUFDaEIsTUFBSyxLQUFLLGFBQWEsRUFBRyxLQUFNLEtBQUssS0FBSyxZQUMxQyxLQUFLLEtBQU8sS0FBSyxNQUNqQixFQUFHLE1BQVEsS0FBSyxNQUNoQixLQUFLLFVBQVksS0FBSyxTQUFTLE1BQy9CLEdBQVUsRUFBTyxNQUVyQixNQUFPLE9BV1gsRUFBUSxVQUFZLFNBQVUsR0FHMUIsTUFGQSxHQUFLLEVBQUssR0FDVixFQUFHLFFBQVEsTUFDSixNQVdYLEVBQVEsT0FBUyxTQUFVLEdBQ3ZCLEdBQWUsT0FBWCxFQUFHLEtBQWUsQ0FDbEIsR0FBSSxHQUFLLElBT1QsT0FOQSxHQUFHLFFBQVEsU0FBVSxHQUNqQixHQUFJLEdBQVMsRUFBRyxRQUNoQixHQUFHLEtBQUssV0FBVyxhQUFhLEVBQUcsS0FBTSxFQUFHLE1BQzVDLEdBQVUsRUFBTyxRQUVyQixLQUFLLFNBQVMsTUFDUCxLQUVYLEVBQUssRUFBSyxFQUNWLElBQUksR0FBUyxFQUFHLFFBS2hCLE9BSkEsTUFBSyxLQUFLLFdBQVcsYUFBYSxFQUFHLEtBQU0sS0FBSyxNQUNoRCxLQUFLLFVBQVksS0FBSyxTQUFTLE1BQy9CLEdBQVUsRUFBTyxNQUNqQixFQUFHLE1BQVEsS0FBSyxNQUNULE1BV1gsRUFBUSxNQUFRLFNBQVUsR0FDdEIsRUFBSyxFQUFLLEVBQ1YsSUFBSSxHQUFTLEVBQUcsUUFTaEIsT0FSSSxNQUFLLEtBQUssWUFDVixLQUFLLEtBQUssV0FBVyxhQUFhLEVBQUcsS0FBTSxLQUFLLEtBQUssYUFFckQsS0FBSyxLQUFLLFdBQVcsWUFBWSxFQUFHLE1BRXhDLEtBQUssVUFBWSxLQUFLLFNBQVMsTUFDL0IsR0FBVSxFQUFPLE1BQ2pCLEVBQUcsTUFBUSxLQUFLLE1BQ1QsTUFXWCxFQUFRLGFBQWUsU0FBVSxHQUM3QixFQUFLLEVBQUssRUFDVixJQUFJLEdBQVMsS0FBSyxRQUtsQixPQUpBLEdBQUcsS0FBSyxXQUFXLGFBQWEsS0FBSyxLQUFNLEVBQUcsTUFDOUMsS0FBSyxNQUFRLEVBQUcsTUFDaEIsR0FBVSxFQUFPLE1BQ2pCLEVBQUcsVUFBWSxFQUFHLFNBQVMsTUFDcEIsTUFXWCxFQUFRLFlBQWMsU0FBVSxHQUM1QixFQUFLLEVBQUssRUFDVixJQUFJLEdBQVMsS0FBSyxRQUtsQixPQUpBLEdBQUcsS0FBSyxXQUFXLGFBQWEsS0FBSyxLQUFNLEVBQUcsS0FBSyxhQUNuRCxLQUFLLE1BQVEsRUFBRyxNQUNoQixHQUFVLEVBQU8sTUFDakIsRUFBRyxVQUFZLEVBQUcsU0FBUyxNQUNwQixNQVNYLEVBQVEsT0FBUyxXQUNiLEdBQUksR0FBUyxLQUFLLFFBS2xCLE9BSkEsTUFBSyxLQUFLLFlBQWMsS0FBSyxLQUFLLFdBQVcsWUFBWSxLQUFLLFlBQ3ZELE1BQUssTUFDWixLQUFLLFNBQVUsRUFDZixHQUFVLEVBQU8sTUFDVixNQVdYLEVBQVEsT0FBUyxTQUFVLEdBQ3ZCLE1BQU8sR0FBSyxLQUFLLEtBQUssY0FBYyxLQVd4QyxFQUFRLFVBQVksU0FBVSxHQUcxQixJQUFLLEdBRkQsR0FBVyxLQUFLLEtBQUssaUJBQWlCLEdBQ3RDLEdBQU8sRUFBSyxLQUFPLFNBQ2QsRUFBSSxFQUFHLEVBQUksRUFBUyxPQUFRLElBQ2pDLEVBQUksS0FBSyxFQUFLLEVBQVMsSUFFM0IsT0FBTyxJQVlYLEVBQVEsS0FBTyxTQUFVLEVBQU0sR0FJM0IsTUFIYSxPQUFULElBQ0EsRUFBUSxLQUFLLEtBQUssS0FFZCxFQUFRLEtBQU0sRUFBTSxJQVdoQyxFQUFRLElBQU0sV0FDVixHQUFJLEdBQ0EsRUFBSyxLQUFLLEtBQUssRUFpQm5CLE9BaEJLLEtBQ0QsRUFBSyxLQUFLLEdBQ1YsRUFBRSxLQUFLLE1BQ0gsR0FBSSxLQUtSLEVBRmEsa0JBQWIsS0FBSyxNQUF5QyxrQkFBYixLQUFLLE1BQ3pCLFdBQWIsS0FBSyxLQUNDLEVBQUssS0FBSyxLQUFNLEtBQUssS0FBSyxZQUUxQixFQUFLLE1BQU8sS0FBSyxLQUFLLFlBRWhDLEVBQUUsRUFBSSxNQUNGLGFBQWMsSUFBTSxJQUV4QixFQUFJLFNBQVcsS0FDUixHQXdFWCxFQUFRLE1BQVEsV0FDWixHQUFJLEdBQVEsRUFBSyxLQUFLLEtBQUssV0FBVSxHQU1yQyxPQUxJLEdBQUUsRUFBTSxLQUFNLE9BQ2QsRUFBRSxFQUFNLE1BQU8sR0FBSSxFQUFNLEtBRTdCLEVBQU8sR0FDUCxFQUFNLFlBQVksTUFDWCxHQVVYLEVBQVEsT0FBUyxXQUdiLE1BRlcsR0FBWSxNQUNsQixZQUFZLEtBQUssTUFDZixNQXlCWCxFQUFRLFFBQVUsRUFBUSxVQUFZLFNBQVUsRUFBRyxFQUFHLEVBQU8sR0FDekQsR0FBSSxHQUFJLEVBQUssVUFBVyxFQUFZLE1Bb0JwQyxPQW5CUyxPQUFMLElBQ0EsRUFBSSxLQUFLLFdBRVQsRUFBRyxFQUFHLFdBQWEsS0FBTyxLQUMxQixFQUFJLEVBQUUsRUFDTixFQUFRLEVBQUUsTUFDVixFQUFTLEVBQUUsT0FDWCxFQUFJLEVBQUUsR0FFVixFQUFFLEVBQUUsTUFDQSxFQUFHLEVBQ0gsRUFBRyxFQUNILE1BQU8sRUFDUCxPQUFRLEVBQ1IsYUFBYyxpQkFDZCxHQUFJLEVBQUUsR0FDTixTQUFVLEVBQUcsRUFBRyxFQUFPLEdBQVEsS0FBSyxPQUV4QyxFQUFFLEtBQUssWUFBWSxLQUFLLE1BQ2pCLEdBcUJYLEVBQVEsT0FBUyxTQUFVLEVBQUcsRUFBRyxFQUFPLEVBQVEsRUFBTSxHQUNsRCxHQUFJLEdBQUksRUFBSyxTQUFVLEVBQVksTUFzQm5DLE9BckJTLE9BQUwsSUFDQSxFQUFJLEtBQUssV0FFVCxFQUFHLEVBQUcsV0FBYSxLQUFPLEtBQzFCLEVBQUksRUFBRSxFQUNOLEVBQVEsRUFBRSxNQUNWLEVBQVMsRUFBRSxPQUNYLEVBQU8sRUFBRSxNQUFRLEVBQUUsR0FDbkIsRUFBTyxFQUFFLE1BQVEsRUFBRSxHQUNuQixFQUFJLEVBQUUsR0FFVixFQUFFLEVBQUUsTUFDQSxTQUFVLEVBQUcsRUFBRyxFQUFPLEdBQVEsS0FBSyxLQUNwQyxZQUFhLEVBQ2IsYUFBYyxFQUNkLE9BQVEsT0FDUixLQUFNLEdBQVEsRUFDZCxLQUFNLEdBQVEsRUFDZCxHQUFJLEVBQUUsS0FFVixFQUFFLEtBQUssWUFBWSxLQUFLLE1BQ2pCLEVBRVgsSUFBSSxLQXdCSixHQUFRLEtBQU8sU0FBVSxFQUFLLEdBQzFCLEdBQUksR0FBTyxFQUFPLEtBQUssSUFBTSxFQUFPLEtBQUssT0FDekMsSUFBd0IsR0FBcEIsVUFBVSxPQUVWLE1BREEsR0FBSSxpQkFBbUIsS0FBSyxHQUFJLEtBQU0sRUFBTSxNQUNyQyxDQUVYLElBQXdCLEdBQXBCLFVBQVUsT0FBYSxDQUN2QixHQUFJLEVBQUssR0FBRyxFQUFLLFVBQVcsQ0FDeEIsSUFBSyxHQUFJLEtBQUssR0FBUyxFQUFPLGVBQUUsSUFDNUIsS0FBSyxLQUFLLEVBQUcsRUFBSSxHQUVyQixPQUFPLE1BR1gsTUFEQSxHQUFJLGlCQUFtQixLQUFLLEdBQUksS0FBTSxFQUFLLEdBQU0sR0FDMUMsRUFBSyxHQUloQixNQUZBLEdBQUssR0FBTyxFQUNaLEVBQUksaUJBQW1CLEtBQUssR0FBSSxLQUFNLEVBQU8sR0FDdEMsTUFXWCxFQUFRLFdBQWEsU0FBVSxHQU0zQixNQUxXLE9BQVAsRUFDQSxFQUFPLEtBQUssT0FFWixFQUFPLEtBQUssV0FBYyxHQUFPLEtBQUssSUFBSSxHQUV2QyxNQWlCWCxFQUFRLFNBQVcsRUFBUSxTQUFXLEVBQVMsR0FRL0MsRUFBUSxTQUFXLElBNEJuQixFQUFRLFVBQVksV0FDaEIsR0FBSSxHQUFVLEVBQU8sS0FBTSxDQUN2QixHQUFJLEdBQUssS0FBSyxVQUNWLEVBQU0sRUFBSyxPQUFPLDBMQUNsQixHQUFJLEVBQUcsRUFBRSxRQUFRLEdBQ2pCLEdBQUksRUFBRyxFQUFFLFFBQVEsR0FDakIsT0FBUSxFQUFHLE1BQU0sUUFBUSxHQUN6QixRQUFTLEVBQUcsT0FBTyxRQUFRLEdBQzNCLFNBQVUsS0FBSyxZQUVuQixPQUFPLDZCQUErQixLQUFLLFNBQVMsbUJBQW1CLE9BUy9FLEVBQVMsVUFBVSxPQUFTLEVBQVEsT0FPcEMsRUFBUyxVQUFVLFVBQVksRUFBUSxZQWdCM0MsRUFBSyxPQUFPLFNBQVUsRUFBTSxFQUFTLEVBQU8sRUFBTSxHQUs5QyxRQUFTLEdBQU0sRUFBTSxFQUFJLEdBQ3JCLE1BQU8sVUFBVSxHQUNiLEdBQUksR0FBTSxFQUFJLE1BQU0sRUFBTSxFQUkxQixPQUhrQixJQUFkLEVBQUksU0FDSixFQUFNLEVBQUksSUFFUCxFQUFJLEVBQUUsR0FBTyxHQVY1QixHQUFJLEdBQVUsRUFBUSxVQUNsQixFQUFLLEVBQUssR0FDVixFQUFNLE9BQ04sRUFBTSxpQkFVTixFQUFZLFNBQVUsRUFBTSxFQUFJLEVBQVEsR0FDbkIsa0JBQVYsSUFBeUIsRUFBTyxTQUN2QyxFQUFXO3FDQUNYLEVBQVMsRUFBSyxRQUVsQixLQUFLLEtBQU8sRUFDWixLQUFLLElBQU0sRUFDWCxJQUFXLEtBQUssT0FBUyxHQUN6QixJQUFhLEtBQUssU0FBVyxHQUVqQyxHQUFLLEVBQUUsVUFBWSxFQWFuQixFQUFLLFVBQVksU0FBVSxFQUFNLEVBQUksRUFBUSxHQUN6QyxNQUFPLElBQUksR0FBVSxFQUFNLEVBQUksRUFBUSxJQWlCM0MsRUFBUSxPQUFTLFdBQ2IsR0FBSSxHQUFLLEtBQ0wsSUFDSixLQUFLLEdBQUksS0FBTSxHQUFHLE1BQVcsRUFBRyxNQUFNLEdBQUssSUFDdEMsU0FBVSxHQUNQLEVBQUksTUFDQSxLQUFNLEdBQUksR0FBVSxFQUFFLE9BQVEsRUFBRSxJQUFLLEVBQUUsT0FBUSxFQUFFLFdBQ2pELEtBQU0sRUFDTixVQUFXLEVBQUUsU0FDYixPQUFRLFNBQVUsR0FDZCxNQUFPLEdBQUUsT0FBTyxJQUVwQixLQUFNLFdBQ0YsRUFBRSxXQUdaLEVBQUcsTUFBTSxHQUVmLE9BQU8sSUFnQ1gsRUFBSyxRQUFVLFNBQVUsRUFBTSxFQUFJLEVBQVEsRUFBSSxFQUFRLEdBQzlCLGtCQUFWLElBQXlCLEVBQU8sU0FDdkMsRUFBVyxFQUNYLEVBQVMsRUFBSyxPQUVsQixJQUFJLEdBQU0sRUFBSyxPQUNYLEVBQU8sRUFBSyxFQUFNLEVBQUksRUFBSyxFQUFNLEVBQUksRUFBSyxLQUFNLEVBQVEsRUFFNUQsT0FEQSxJQUFZLEVBQUksS0FBSyxlQUFpQixFQUFLLEdBQUksR0FDeEMsR0FVWCxFQUFRLEtBQU8sV0FFWCxJQUFLLEdBREQsR0FBUSxLQUFLLFNBQ1IsRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUN2QyxFQUFNLEdBQUcsTUFFYixPQUFPLE9BY1gsRUFBUSxRQUFVLFNBQVUsRUFBTyxFQUFJLEVBQVEsR0FDdEIsa0JBQVYsSUFBeUIsRUFBTyxTQUN2QyxFQUFXLEVBQ1gsRUFBUyxFQUFLLFFBRWQsWUFBaUIsS0FDakIsRUFBVyxFQUFNLFNBQ2pCLEVBQVMsRUFBTSxPQUNmLEVBQUssRUFBTSxJQUNYLEVBQVEsRUFBTSxLQUVsQixJQUF1QyxHQUFNLEVBQUksRUFBRyxFQUFoRCxLQUFZLEtBQVksS0FDeEIsRUFBSyxJQUNULEtBQUssR0FBSSxLQUFPLEdBQU8sR0FBSSxFQUFNLEdBQUssR0FBTSxDQUNwQyxFQUFHLE9BQ0gsRUFBSyxFQUFHLE1BQU0sRUFBSyxFQUFJLEVBQU0sS0FDN0IsRUFBTyxFQUFHLEtBQ1YsRUFBSyxFQUFHLEdBQ1IsRUFBSSxFQUFHLElBRVAsR0FBUSxFQUFHLEtBQUssR0FDaEIsR0FBTSxFQUFNLEdBRWhCLElBQUksR0FBTSxFQUFHLEVBQU0sU0FBVyxFQUFLLE9BQVMsQ0FDNUMsR0FBSyxHQUFPLEVBQU0sRUFBTSxPQUFRLEVBQU0sT0FBUyxFQUFLLEdBQ3BELEVBQVEsRUFBTSxPQUFPLEdBQ3JCLEVBQVEsRUFBTSxPQUFPLEdBRXpCLEdBQUksR0FBTSxFQUFLLE9BQ1gsRUFBTyxFQUFLLEVBQU8sRUFBTyxFQUFLLEVBQU0sRUFBSSxFQUFLLEtBQU0sU0FBVSxHQUMxRCxHQUFJLEtBQ0osS0FBSyxHQUFJLEtBQU8sR0FBVSxFQUFLLEdBQUssS0FDaEMsRUFBSyxHQUFPLEVBQUssR0FBSyxHQUUxQixHQUFHLEtBQUssSUFDVCxFQWNQLE9BYkEsR0FBRyxNQUFNLEVBQUssSUFBTSxFQUNwQixFQUFLLE9BQVMsRUFDZCxFQUFLLFVBQVksRUFDakIsRUFBSSxvQkFBc0IsRUFBRyxHQUFJLEdBQ2pDLEVBQUksS0FBSyxlQUFpQixFQUFLLEdBQUksV0FDL0IsRUFBSSxJQUFJLFVBQVksRUFBSyxVQUNsQixHQUFHLE1BQU0sRUFBSyxJQUNyQixHQUFZLEVBQVMsS0FBSyxLQUU5QixFQUFJLEtBQUssYUFBZSxFQUFLLEdBQUksV0FDN0IsRUFBSSxJQUFJLFVBQVksRUFBSyxVQUNsQixHQUFHLE1BQU0sRUFBSyxNQUVsQixLQWlCZixFQUFLLE9BQU8sU0FBVSxFQUFNLEVBQVMsRUFBTyxFQUFNLEdBSzlDLFFBQVMsR0FBTyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FDM0IsR0FBUyxNQUFMLEdBQXVDLHNCQUExQixFQUFlLEtBQUssR0FPakMsTUFOQSxNQUFLLEVBQUksRUFBRSxFQUNYLEtBQUssRUFBSSxFQUFFLEVBQ1gsS0FBSyxFQUFJLEVBQUUsRUFDWCxLQUFLLEVBQUksRUFBRSxFQUNYLEtBQUssRUFBSSxFQUFFLE9BQ1gsS0FBSyxFQUFJLEVBQUUsRUFHTixPQUFMLEdBQ0EsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLElBRVYsS0FBSyxFQUFJLEVBQ1QsS0FBSyxFQUFJLEVBQ1QsS0FBSyxFQUFJLEVBQ1QsS0FBSyxFQUFJLEVBQ1QsS0FBSyxFQUFJLEVBQ1QsS0FBSyxFQUFJLEdBM0JqQixHQUFJLEdBQWlCLE9BQU8sVUFBVSxTQUNsQyxFQUFNLE9BQ04sRUFBTyxNQTRCWCxTQUFXLEdBNE1QLFFBQVMsR0FBSyxHQUNWLE1BQU8sR0FBRSxHQUFLLEVBQUUsR0FBSyxFQUFFLEdBQUssRUFBRSxHQUVsQyxRQUFTLEdBQVUsR0FDZixHQUFJLEdBQU0sRUFBSyxLQUFLLEVBQUssR0FDekIsR0FBRSxLQUFPLEVBQUUsSUFBTSxHQUNqQixFQUFFLEtBQU8sRUFBRSxJQUFNLEdBbk1yQixFQUFZLElBQU0sU0FBVSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FDdkMsR0FBSSxHQUFLLFlBQWEsR0FDbEIsTUFBTyxNQUFLLElBQUksRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBRS9DLElBQUksR0FBTyxFQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssRUFDN0IsRUFBTyxFQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssQ0FRakMsT0FQQSxNQUFLLEdBQUssRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQ2hDLEtBQUssR0FBSyxFQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssRUFDaEMsS0FBSyxFQUFJLEVBQUksS0FBSyxFQUFJLEVBQUksS0FBSyxFQUMvQixLQUFLLEVBQUksRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBRS9CLEtBQUssRUFBSSxFQUNULEtBQUssRUFBSSxFQUNGLE1BZ0JYLEVBQU8sVUFBVSxTQUFXLFNBQVUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQ2pELEdBQUksR0FBSyxZQUFhLEdBQ2xCLE1BQU8sTUFBSyxTQUFTLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUVwRCxJQUFJLEdBQU8sRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQzdCLEVBQU8sRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQzdCLEVBQU8sRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQUksQ0FRckMsT0FQQSxNQUFLLEVBQUksRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQy9CLEtBQUssRUFBSSxFQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssRUFDL0IsS0FBSyxFQUFJLEVBQUksS0FBSyxFQUFJLEVBQUksS0FBSyxFQUFJLEVBRW5DLEtBQUssRUFBSSxFQUNULEtBQUssRUFBSSxFQUNULEtBQUssRUFBSSxFQUNGLE1BU1gsRUFBWSxPQUFTLFdBQ2pCLEdBQUksR0FBSyxLQUNMLEVBQUksRUFBRyxFQUFJLEVBQUcsRUFBSSxFQUFHLEVBQUksRUFBRyxDQUNoQyxPQUFPLElBQUksR0FBTyxFQUFHLEVBQUksR0FBSSxFQUFHLEVBQUksR0FBSSxFQUFHLEVBQUksRUFBRyxFQUFHLEVBQUksR0FBSSxFQUFHLEVBQUksRUFBRyxFQUFJLEVBQUcsRUFBSSxFQUFHLEdBQUssR0FBSSxFQUFHLEVBQUksRUFBRyxFQUFJLEVBQUcsRUFBSSxFQUFHLEdBQUssSUFTL0gsRUFBWSxNQUFRLFdBQ2hCLE1BQU8sSUFBSSxHQUFPLEtBQUssRUFBRyxLQUFLLEVBQUcsS0FBSyxFQUFHLEtBQUssRUFBRyxLQUFLLEVBQUcsS0FBSyxJQVVuRSxFQUFZLFVBQVksU0FBVSxFQUFHLEdBR2pDLE1BRkEsTUFBSyxHQUFLLEVBQUksS0FBSyxFQUFJLEVBQUksS0FBSyxFQUNoQyxLQUFLLEdBQUssRUFBSSxLQUFLLEVBQUksRUFBSSxLQUFLLEVBQ3pCLE1BYVgsRUFBWSxNQUFRLFNBQVUsRUFBRyxFQUFHLEVBQUksR0FRcEMsTUFQSyxPQUFMLElBQWMsRUFBSSxJQUNqQixHQUFNLElBQU8sS0FBSyxVQUFVLEVBQUksR0FDakMsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEVBQ1YsS0FBSyxHQUFLLEdBQ1QsR0FBTSxJQUFPLEtBQUssV0FBVyxHQUFLLEdBQzVCLE1BV1gsRUFBWSxPQUFTLFNBQVUsRUFBRyxFQUFHLEdBQ2pDLEVBQUksRUFBSyxJQUFJLEdBQ2IsRUFBSSxHQUFLLEVBQ1QsRUFBSSxHQUFLLENBQ1QsSUFBSSxJQUFPLEVBQUssSUFBSSxHQUFHLFFBQVEsR0FDM0IsR0FBTyxFQUFLLElBQUksR0FBRyxRQUFRLEVBRS9CLE9BREEsTUFBSyxJQUFJLEVBQUssR0FBTSxFQUFLLEVBQUssRUFBRyxHQUMxQixLQUFLLElBQUksRUFBRyxFQUFHLEVBQUcsR0FBSSxHQUFJLElBU3JDLEVBQVksTUFBUSxTQUFVLEdBQzFCLE1BQU8sTUFBSyxLQUFLLEVBQUcsSUFTeEIsRUFBWSxNQUFRLFNBQVUsR0FDMUIsTUFBTyxNQUFLLEtBQUssRUFBRyxJQVV4QixFQUFZLEtBQU8sU0FBVSxFQUFHLEdBQzVCLEVBQUksR0FBSyxFQUNULEVBQUksR0FBSyxFQUNULEVBQUksRUFBSyxJQUFJLEdBQ2IsRUFBSSxFQUFLLElBQUksRUFDYixJQUFJLEdBQUksRUFBSyxJQUFJLEdBQUcsUUFBUSxHQUN4QixFQUFJLEVBQUssSUFBSSxHQUFHLFFBQVEsRUFDNUIsT0FBTyxNQUFLLElBQUksRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLElBV25DLEVBQVksRUFBSSxTQUFVLEVBQUcsR0FDekIsTUFBTyxHQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssRUFBSSxLQUFLLEdBVzFDLEVBQVksRUFBSSxTQUFVLEVBQUcsR0FDekIsTUFBTyxHQUFJLEtBQUssRUFBSSxFQUFJLEtBQUssRUFBSSxLQUFLLEdBRTFDLEVBQVksSUFBTSxTQUFVLEdBQ3hCLE9BQVEsS0FBSyxFQUFJLGFBQWEsR0FBSyxJQUFJLFFBQVEsSUFFbkQsRUFBWSxTQUFXLFdBQ25CLE1BQU8sV0FBYSxLQUFLLElBQUksR0FBSSxLQUFLLElBQUksR0FBSSxLQUFLLElBQUksR0FBSSxLQUFLLElBQUksR0FBSSxLQUFLLElBQUksR0FBSSxLQUFLLElBQUksSUFBSSxPQUFTLEtBRS9HLEVBQVksT0FBUyxXQUNqQixPQUFRLEtBQUssRUFBRSxRQUFRLEdBQUksS0FBSyxFQUFFLFFBQVEsS0FpQjlDLEVBQVksWUFBYyxXQUN0QixNQUFPLE1BQUssRUFBSSxLQUFLLEVBQUksS0FBSyxFQUFJLEtBQUssR0FnQjNDLEVBQVksTUFBUSxXQUNoQixHQUFJLEtBRUosR0FBSSxHQUFLLEtBQUssRUFDZCxFQUFJLEdBQUssS0FBSyxDQUdkLElBQUksS0FBUSxLQUFLLEVBQUcsS0FBSyxJQUFLLEtBQUssRUFBRyxLQUFLLEdBQzNDLEdBQUksT0FBUyxFQUFLLEtBQUssRUFBSyxFQUFJLEtBQ2hDLEVBQVUsRUFBSSxJQUVkLEVBQUksTUFBUSxFQUFJLEdBQUcsR0FBSyxFQUFJLEdBQUcsR0FBSyxFQUFJLEdBQUcsR0FBSyxFQUFJLEdBQUcsR0FDdkQsRUFBSSxJQUFNLEVBQUksR0FBRyxHQUFLLEVBQUksR0FBRyxHQUFLLEVBQUksTUFBTyxFQUFJLEdBQUcsR0FBSyxFQUFJLEdBQUcsR0FBSyxFQUFJLE9BRXpFLEVBQUksT0FBUyxFQUFLLEtBQUssRUFBSyxFQUFJLEtBQ2hDLEVBQVUsRUFBSSxJQUNkLEVBQUksT0FBUyxFQUFJLE9BRWIsS0FBSyxjQUFnQixJQUNyQixFQUFJLFFBQVUsRUFBSSxPQUl0QixJQUFJLEdBQU0sRUFBSSxHQUFHLEdBQ2IsRUFBTSxFQUFJLEdBQUcsRUFhakIsT0FaSSxHQUFNLEdBQ04sRUFBSSxPQUFTLEVBQUssSUFBSSxFQUFLLEtBQUssSUFDNUIsRUFBTSxJQUNOLEVBQUksT0FBUyxJQUFNLEVBQUksU0FHM0IsRUFBSSxPQUFTLEVBQUssSUFBSSxFQUFLLEtBQUssSUFHcEMsRUFBSSxZQUFhLEVBQUksTUFBTSxRQUFRLElBQU8sRUFBSSxPQUFPLFFBQVEsSUFBTSxFQUFJLE9BQU8sUUFBUSxJQUFPLEVBQUksUUFDakcsRUFBSSxnQkFBa0IsRUFBSSxNQUFNLFFBQVEsSUFBTSxFQUFJLE9BQU8sUUFBUSxJQUFNLEVBQUksT0FBTyxRQUFRLEtBQU8sRUFBSSxPQUNyRyxFQUFJLGFBQWUsRUFBSSxNQUFNLFFBQVEsS0FBTyxFQUFJLE9BQ3pDLEdBU1gsRUFBWSxrQkFBb0IsU0FBVSxHQUN0QyxHQUFJLEdBQUksR0FBVyxLQUFLLE9BQ3hCLFFBQU0sRUFBRSxNQUFNLFFBQVEsR0FRWCxLQUFPLEtBQUssSUFBSSxHQUFJLEtBQUssSUFBSSxHQUFJLEtBQUssSUFBSSxHQUFJLEtBQUssSUFBSSxHQUFJLEtBQUssSUFBSSxHQUFJLEtBQUssSUFBSSxLQVB4RixFQUFFLFFBQVUsRUFBRSxPQUFPLFFBQVEsR0FDN0IsRUFBRSxRQUFVLEVBQUUsT0FBTyxRQUFRLEdBQzdCLEVBQUUsUUFBVSxFQUFFLE9BQU8sUUFBUSxJQUNwQixFQUFFLElBQU0sRUFBRSxHQUFLLE1BQVEsRUFBRSxHQUFHLFFBQVEsSUFBSyxFQUFFLEdBQUcsUUFBUSxJQTNUbkUsS0E0VGEsRUFBRSxPQUFTLE1BQVEsRUFBRSxPQUFPLFFBQVEsR0FBSSxFQUFHLEdBNVR4RCxLQTZUeUIsR0FBWixFQUFFLFFBQTJCLEdBQVosRUFBRSxPQUFjLEtBQU8sRUFBRSxPQUFRLEVBQUUsT0FBUSxFQUFHLEdBN1Q1RSxPQWtVTCxFQUFPLFdBUVYsRUFBSyxPQUFTLEVBa0JkLEVBQUssT0FBUyxTQUFVLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUNuQyxNQUFPLElBQUksR0FBTyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsTUFpQnpDLEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEVBQU0sR0ErRTlDLFFBQVMsR0FBVyxHQUNoQixNQUFPLFVBQVUsR0FVYixHQVRBLEVBQUksT0FDQSxZQUFpQixJQUE0QyxHQUFoQyxFQUFNLEtBQUssV0FBVyxTQUNqQixrQkFBakMsRUFBTSxLQUFLLFdBQVcsU0FDVSxrQkFBakMsRUFBTSxLQUFLLFdBQVcsU0FDVyxXQUFqQyxFQUFNLEtBQUssV0FBVyxXQUN0QixFQUFRLEVBQU0sS0FBSyxXQUNuQixFQUFZLE1BQU0sWUFBWSxHQUM5QixFQUFRLEVBQUssSUFFYixZQUFpQixHQUNqQixHQUFrQixrQkFBZCxFQUFNLE1BQTBDLGtCQUFkLEVBQU0sTUFDeEIsV0FBZCxFQUFNLEtBQW1CLENBQ3RCLEVBQU0sS0FBSyxJQUNaLEVBQUUsRUFBTSxNQUNKLEdBQUksRUFBTSxJQUdsQixJQUFJLEdBQU8sRUFBSSxFQUFNLEtBQUssUUFFMUIsR0FBTyxFQUFNLEtBQUssT0FJdEIsSUFEQSxFQUFPLEVBQUssTUFBTSxHQUNkLEVBQUssTUFBTyxDQUNaLEdBQUksR0FBTyxFQUFLLEVBQVksTUFBTSxpQkFBaUIsU0FBUyxFQUN4RCxJQUNLLEVBQUssS0FBSyxJQUNYLEVBQUUsRUFBSyxNQUNILEdBQUksRUFBSyxLQUdqQixFQUFPLEVBQUksRUFBSyxLQUFLLEtBRXJCLEVBQU8sTUFHWCxHQUFPLEVBQUksRUFHbkIsSUFBSSxLQUNKLEdBQU0sR0FBUSxFQUNkLEVBQUUsS0FBSyxLQUFNLEdBQ2IsS0FBSyxLQUFLLE1BQU0sR0FBUSxHQXdMaEMsUUFBUyxHQUFZLEdBQ2pCLEVBQUksT0FDQSxJQUFVLElBQ1YsR0FBUyxNQUViLEtBQUssS0FBSyxNQUFNLFNBQVcsRUFnRS9CLFFBQVMsR0FBWSxHQUdqQixJQUFLLEdBRkQsTUFDQSxFQUFXLEVBQUssV0FDWCxFQUFJLEVBQUcsRUFBSyxFQUFTLE9BQVEsRUFBSSxFQUFJLElBQUssQ0FDL0MsR0FBSSxHQUFNLEVBQVMsRUFDQyxJQUFoQixFQUFJLFVBQ0osRUFBSSxLQUFLLEVBQUksV0FFRSxTQUFmLEVBQUksVUFDeUIsR0FBekIsRUFBSSxXQUFXLFFBQTBDLEdBQTNCLEVBQUksV0FBVyxTQUM3QyxFQUFJLEtBQUssRUFBSSxXQUFXLFdBRXhCLEVBQUksS0FBSyxFQUFZLEtBSWpDLE1BQU8sR0F1RFgsUUFBUyxLQUVMLE1BREEsR0FBSSxPQUNHLEtBQUssS0FBSyxNQUFNLFNBaGMzQixHQUNJLEdBQU8sRUFBSyxFQUFFLEtBQ2QsRUFBTyxFQUFLLEVBQUUsS0FDZCxFQUFLLEVBQUssR0FDVixFQUFjLEVBQUssRUFBRSxZQUNyQixFQUFhLDRCQUNiLEVBQUksRUFBSyxFQUFFLEVBQ1gsRUFBTSxFQUFLLElBQ1gsRUFBTSxPQUNOLEVBQVksRUFBSyxFQUFFLFVBQ25CLEVBQUksRUFTUixHQUFLLE1BQVEsU0FBVSxHQUNuQixHQUFJLEdBQU0sT0FBTyxHQUFPLE1BQU0sRUFDOUIsT0FBTyxHQUFNLEVBQUksR0FBSyxHQUcxQixFQUFJLEdBQUcsc0JBQXVCLFNBQVUsR0FDcEMsR0FBSSxZQUFpQixJQUFXLFlBQWlCLEdBQVUsQ0FPdkQsR0FOQSxFQUFJLE9BQ0EsWUFBaUIsSUFBNEMsR0FBaEMsRUFBTSxLQUFLLFdBQVcsU0FDbkQsRUFBUSxFQUFNLEtBQUssV0FDbkIsRUFBWSxNQUFNLFlBQVksR0FDOUIsRUFBUSxFQUFLLElBRUMsUUFBZCxFQUFNLEtBQ04sR0FBSSxHQUFPLE1BRVgsR0FBTyxFQUFLLE9BQVEsRUFBWSxPQUNoQyxFQUFLLEtBQUssWUFBWSxFQUFNLE9BRS9CLEVBQUssS0FBSyxJQUFNLEVBQUUsRUFBSyxNQUNwQixHQUFJLEVBQUssS0FFYixFQUFFLEtBQUssTUFDSCxLQUFNLEVBQUksRUFBSyxTQUkxQixTQUFVLEdBQ1AsRUFBSSxHQUFHLHNCQUF1QixHQUM5QixFQUFJLEdBQUcsMkJBQTRCLEdBQ25DLEVBQUksR0FBRywwQkFBMkIsSUFDcEMsU0FBVSxHQUNSLEdBQUksWUFBaUIsSUFBVyxZQUFpQixHQUFVLENBQ3ZELEVBQUksTUFHSixLQUZBLEdBQUksR0FDQSxFQUFPLEVBQU0sS0FDVixHQUFNLENBQ1QsR0FBc0IsYUFBbEIsRUFBSyxTQUF5QixDQUM5QixFQUFPLEdBQUksR0FBUSxFQUNuQixPQUVKLEdBQXNCLFFBQWxCLEVBQUssU0FBb0IsQ0FDekIsTUFBTyxFQUNQLE9BRUosRUFBTyxFQUFLLFdBRVgsSUFDRCxFQUFPLEVBQUssV0FBWSxFQUFZLE9BQ3BDLEVBQUssS0FBSyxZQUFZLEVBQU0sT0FDM0IsRUFBSyxLQUFLLElBQU0sRUFBRSxFQUFLLE1BQ3BCLEdBQUksRUFBSyxNQUdqQixFQUFFLEtBQUssTUFDSCxZQUFhLEVBQUksRUFBSyxLQUFLLElBQU0sRUFBSyxTQW1EbEQsRUFBSSxHQUFHLHNCQUF1QixFQUFXLFNBQ3pDLEVBQUksR0FBRyx3QkFBeUIsRUFBVyxVQUMzQyxJQUFJLEdBQVMsK0JBQ2IsR0FBSSxHQUFHLHVCQUF3QixTQUFtQixHQTZCOUMsUUFBUyxHQUFLLEVBQUcsR0FFYixJQUFLLEdBREQsSUFBUSxFQUFNLElBQVUsRUFBSSxHQUN2QixFQUFJLEVBQUcsRUFBSSxFQUFHLElBQ25CLEVBQU0sR0FBRyxVQUFZLEVBQVEsR0FBUSxFQUFJLElBQUksUUFBUSxFQUV6RCxHQUFJLEVBQ0osRUFBUSxFQWxDWixFQUFTLEVBQUksRUFDYixJQUFJLEdBQVMsRUFBTyxNQUFNLEVBQzFCLEtBQUssRUFDRCxNQUFPLEtBRVgsSUFBSSxHQUFPLEVBQU8sR0FDZCxFQUFTLEVBQU8sR0FDaEIsRUFBUSxFQUFPLEVBQ25CLEdBQVMsRUFBTyxNQUFNLFdBQVcsSUFBSSxTQUFVLEdBQzNDLE9BQVEsR0FBTSxHQUFNLEVBQUssSUFFUixHQUFqQixFQUFPLFFBQTRCLEdBQWIsRUFBTyxLQUM3QixNQUVKLEVBQVEsRUFBTSxNQUFNLEtBQ3BCLEVBQVEsRUFBTSxJQUFJLFNBQVUsR0FDeEIsRUFBSyxFQUFHLE1BQU0sSUFDZCxJQUFJLElBQ0EsTUFBTyxFQUFHLEdBS2QsT0FISSxHQUFHLEtBQ0gsRUFBSSxPQUFTLFdBQVcsRUFBRyxLQUV4QixHQUVYLElBQUksR0FBTSxFQUFNLE9BQ1osRUFBUSxFQUNSLEVBQUksQ0FTUixJQUNBLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFLLElBQVMsVUFBWSxHQUFNLElBQ2hELEVBQUssRUFBRyxFQUFNLEdBQUcsT0FJckIsT0FGQSxHQUFNLEdBQUssT0FBUyxFQUFNLEdBQUssUUFBVSxJQUN6QyxFQUFLLEVBQUssRUFBTSxHQUFLLFNBRWpCLEtBQU0sRUFDTixPQUFRLEVBQ1IsTUFBTyxLQUlmLEVBQUksR0FBRyxtQkFBb0IsU0FBVSxHQUNqQyxFQUFJLE9BQ0EsRUFBRyxFQUFPLFVBQVksRUFBRyxFQUFNLEdBQUksV0FDbkMsRUFBUSxFQUFLLEtBQUssU0FBUyxLQUFLLElBRXBDLEVBQVEsRUFBSSxHQUNSLEVBQU0sTUFBTSxZQUNaLEVBQVEsRUFBSyxLQUFLLFdBQVcsSUFFakMsRUFBRSxLQUFLLE1BQU8sRUFBRyxPQUNqQixHQUNKLEVBQUksR0FBRyx1QkFBd0IsU0FBVSxHQUNyQyxFQUFJLE9BQ0osRUFBUSxFQUFJLEVBRVosS0FEQSxHQUFJLEdBQU0sRUFBSyxJQUFJLGVBQWUsR0FDM0IsS0FBSyxLQUFLLFlBQ2IsS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLLFdBRXBDLE1BQUssS0FBSyxZQUFZLE1BQ3RCLEdBQ0osRUFBSSxHQUFHLHNCQUF1QixTQUFVLEdBQ3BDLEVBQUksT0FDSixLQUFLLE1BQU0sRUFBRyxPQUNkLEdBQ0osRUFBSSxHQUFHLHVCQUF3QixTQUFVLEdBQ3JDLEVBQUksT0FDSixLQUFLLEtBQUssVUFBVSxRQUFVLEtBQzlCLEdBQ0osRUFBSSxHQUFHLHlCQUEwQixTQUFVLEdBQ3ZDLEdBQUksRUFFQSxHQURBLEVBQUcsRUFBTyxXQUFhLEtBQU8sSUFDeEIsRUFBTSxFQUFHLEVBQU0sRUFBRyxFQUFNLE1BQU8sRUFBTSxRQUFRLEtBQUssS0FDakQsRUFBRyxFQUFPLFNBQ1osRUFBTSxLQUFLLEtBRVgsRUFFVCxFQUFFLEtBQUssTUFDSCxRQUFTLElBRWIsRUFBSSxVQUNKLEdBQ0osRUFBSSxHQUFHLDJCQUE0QixTQUFVLEdBQ3pDLEtBQUssVUFBVSxHQUNmLEVBQUksVUFDSixHQUNKLEVBQUksR0FBRyxtQkFBb0IsU0FBVSxHQUNoQixRQUFiLEtBQUssT0FDTCxFQUFJLE9BQ0osRUFBRSxLQUFLLE1BQ0gsR0FBSSxFQUNKLEdBQUksUUFHWixHQUNKLEVBQUksR0FBRywwQkFBMkIsU0FBVSxHQUV4QyxHQURBLEVBQUksT0FDYSxRQUFiLEtBQUssS0FBZ0IsQ0FDckIsR0FBSSxHQUFJLEVBQUksQ0FDWixLQUFLLEdBQVMsS0FBSyxTQUFVLENBRXpCLElBREEsRUFBSyxLQUFLLFNBQ0gsRUFBRyxLQUFLLFlBQ1gsS0FBSyxLQUFLLFlBQVksRUFBRyxLQUFLLFdBSWxDLE9BRkEsR0FBRyxvQkFDSSxNQUFLLFNBR2hCLEdBQUksRUFBRyxFQUFPLFVBQVcsQ0FDckIsR0FBSSxHQUFPLEVBQVksTUFDbkIsRUFBTyxFQUFLLEVBQUssWUFBWSxLQUFLLEVBQ3RDLEdBQUssWUFBWSxFQUFLLE1BQ3RCLEVBQUssRUFBSyxHQUNWLEVBQUssTUFBTSxHQUFJLFNBRWYsRUFBUSxFQUFLLGFBQ1EsTUFDakIsRUFBSyxFQUFNLEtBQUssU0FFWixFQUFLLEVBQU0sR0FDWCxFQUFNLE1BQU0sR0FBSSxLQUk1QixJQUFJLEVBR0EsR0FGQSxFQUFLLEtBQUssU0FDVixFQUFPLEtBQUssS0FDUixFQUNBLEVBQUcsTUFBTSxhQUFjLElBQU0sUUFDMUIsQ0FJSCxJQUhBLEVBQUssRUFBRSxZQUNILGFBQWMsSUFBTSxJQUVqQixFQUFLLFlBQ1IsRUFBRyxZQUFZLEVBQUssV0FFeEIsR0FBSyxZQUFZLEdBQ2pCLEtBQUssU0FBVyxFQUFLLFFBSWpDLEdBQ0osRUFBSSxHQUFHLHNCQUF1QixTQUFVLEdBQ3BDLEdBQWlCLFFBQWIsS0FBSyxLQUFnQixDQWVyQixJQWRBLEdBQ0ksR0FBTyxLQUFLLEtBQ1osRUFBUSxTQUFVLEdBQ2QsR0FBSSxHQUFNLEVBQUUsUUFDWixJQUFJLEVBQUcsRUFBTyxTQUNWLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFNLE9BQVEsSUFDOUIsRUFBSSxZQUFZLEVBQU0sRUFBTSxTQUdoQyxHQUFJLFlBQVksRUFBSyxJQUFJLGVBQWUsR0FHNUMsT0FEQSxHQUFJLFdBQWEsRUFBSSxZQUNkLEdBRVIsRUFBSyxZQUNSLEVBQUssWUFBWSxFQUFLLFdBRzFCLEtBREEsR0FBSSxHQUFRLEVBQU0sR0FDWCxFQUFNLFlBQ1QsRUFBSyxZQUFZLEVBQU0sWUFHL0IsRUFBSSxVQUNKLEdBUUosRUFBSSxHQUFHLDBCQUEyQixJQUFjLEdBQ2hELEVBQUksR0FBRywyQkFBNEIsSUFBYyxHQUdqRCxFQUFJLEdBQUcsOEJBQStCLFdBRWxDLE1BREEsR0FBSSxPQUNHLEtBQUssZUFDWixHQUNKLEVBQUksR0FBRyw2QkFBOEIsV0FFakMsTUFEQSxHQUFJLE9BQ0csS0FBSyxZQUNaLEdBRUgsV0FDRyxRQUFTLEdBQU8sR0FDWixNQUFPLFlBQ0gsRUFBSSxNQUNKLElBQUksR0FBUSxFQUFLLElBQUksWUFBWSxpQkFBaUIsS0FBSyxLQUFNLE1BQU0saUJBQWlCLFVBQVksRUFDaEcsT0FBYSxRQUFULEVBQ08sRUFFQSxFQUFLLEVBQUssSUFBSSxlQUFlLEVBQU0sTUFBTSxHQUFZLE1BSXhFLFFBQVMsR0FBTyxHQUNaLE1BQU8sVUFBVSxHQUNiLEVBQUksTUFDSixJQUFJLEdBQU8sU0FBVyxFQUFJLE9BQU8sR0FBRyxjQUFnQixFQUFJLFVBQVUsRUFDbEUsSUFBYSxJQUFULElBQWdCLEVBRWhCLFlBREEsS0FBSyxLQUFLLE1BQU0sR0FBUSxPQUc1QixJQUFrQixVQUFkLEVBQU0sS0FBa0IsQ0FDeEIsR0FBSSxHQUFLLEVBQU0sS0FBSyxFQUtwQixPQUpLLElBQ0QsRUFBRSxFQUFNLE1BQU8sR0FBSSxFQUFNLFVBRTdCLEtBQUssS0FBSyxNQUFNLEdBQVEsRUFBSSxNQUt4QyxFQUFJLEdBQUcsK0JBQWdDLEVBQU8sU0FBUyxHQUN2RCxFQUFJLEdBQUcsOEJBQStCLEVBQU8sU0FBUyxHQUN0RCxFQUFJLEdBQUcsaUNBQWtDLEVBQU8sV0FBVyxHQUMzRCxFQUFJLEdBQUcsZ0NBQWlDLEVBQU8sV0FBVyxHQUMxRCxFQUFJLEdBQUcsK0JBQWdDLEVBQU8sU0FBUyxHQUN2RCxFQUFJLEdBQUcsOEJBQStCLEVBQU8sU0FBUyxHQUN0RCxFQUFJLEdBQUcsNEJBQTZCLEVBQU8sU0FBUyxHQUNwRCxFQUFJLEdBQUcsMkJBQTRCLEVBQU8sU0FBUyxHQUNuRCxFQUFJLEdBQUcsOEJBQStCLEVBQU8sV0FBVyxHQUN4RCxFQUFJLEdBQUcsNkJBQThCLEVBQU8sV0FBVyxHQUN2RCxFQUFJLEdBQUcsNEJBQTZCLEVBQU8sU0FBUyxHQUNwRCxFQUFJLEdBQUcsMkJBQTRCLEVBQU8sU0FBUyxNQUV2RCxFQUFJLEdBQUcsc0JBQXVCLFdBQzFCLEdBQWlCLFFBQWIsS0FBSyxNQUFrQixFQUFFLEtBQUssS0FBTSxPQUFTLEVBQUUsS0FBSyxLQUFNLE1BRTFELE1BREEsR0FBSSxPQUNHLEVBQUUsS0FBSyxLQUFNLFNBRXhCLEdBbUJKLEVBQUksR0FBRyx5QkFBMEIsV0FDN0IsR0FBaUIsUUFBYixLQUFLLE1BQStCLFNBQWIsS0FBSyxLQUFpQixDQUM3QyxFQUFJLE1BQ0osSUFBSSxHQUFNLEVBQVksS0FBSyxLQUMzQixPQUFxQixJQUFkLEVBQUksT0FBYyxFQUFJLEdBQUssTUFFdEMsR0FDSixFQUFJLEdBQUcsMEJBQTJCLFdBQzlCLE1BQU8sTUFBSyxLQUFLLGVBQ2pCLEdBQ0osRUFBSSxHQUFHLHlCQUEwQixTQUFVLEdBQ3ZDLElBQUksRUFBSixDQUdBLEVBQUksTUFDSixJQUFJLEdBQVEsRUFBSSx5QkFBMEIsTUFBTSxHQUFNLGNBQ3RELE9BQU8sR0FBSyxFQUFLLE1BQU0sS0FBVyxNQUNsQyxHQUNKLEVBQUksR0FBRywyQkFBNEIsU0FBVSxHQUN6QyxJQUFJLEVBQUosQ0FHQSxFQUFJLE1BQ0osSUFBSSxHQUFRLEVBQUksMkJBQTRCLE1BQU0sR0FBTSxjQUN4RCxPQUFPLEdBQUssRUFBSyxNQUFNLEtBQVcsTUFDbEMsR0FDSixFQUFJLEdBQUcsNEJBQTZCLFdBQ2hDLEVBQUksTUFDSixJQUFJLEdBQUssRUFBRSxLQUFLLEtBQU0sVUFDdEIsT0FBSSxJQUNBLEVBQUssRUFBRyxNQUFNLEdBQ1AsRUFBSyxFQUFFLEtBQUssRUFBRyxJQUFLLEVBQUcsSUFBSyxFQUFHLElBQUssRUFBRyxTQUU5QyxNQUVKLEdBQ0osRUFBSSxHQUFHLDJCQUE0QixXQUMvQixHQUFJLEdBQUksRUFBRSxLQUFLLEtBQU0sU0FFckIsT0FEQSxHQUFJLE9BQ0EsRUFDTyxFQUFFLE1BQU0sT0FFZixNQUVKLEdBQ0osRUFBSSxHQUFHLHlCQUEwQixXQUM3QixHQUFJLEdBQUksRUFBRSxLQUFLLEtBQU0sSUFFckIsT0FEQSxHQUFJLE9BQ0csS0FDUCxHQUNKLEVBQUksR0FBRywwQkFBMkIsV0FDOUIsTUFBTyxNQUFLLEtBQUssVUFBVSxXQUMzQixHQUtKLEVBQUksR0FBRyw2QkFBOEIsSUFBYyxHQUNuRCxFQUFJLEdBQUcsOEJBQStCLElBQWMsS0FnQnhELEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEVBQU0sR0FDOUMsR0FBSSxHQUFhLE9BR2IsRUFBTSxPQUNOLEVBQVUsRUFBUSxTQVV0QixHQUFRLFNBQVcsU0FBVSxHQUN6QixHQUlJLEdBRUEsRUFDQSxFQVBBLEVBQVUsRUFBSSxHQUFTLElBQUksTUFBTSxPQUNqQyxFQUFPLEtBQUssS0FDWixFQUFZLEVBQUssVUFBVSxRQUMzQixFQUFhLEVBQVUsTUFBTSxNQU1qQyxJQUFJLEVBQVEsT0FBUSxDQUVoQixJQURBLEVBQUksRUFDRyxFQUFRLEVBQVEsT0FDYixFQUFXLFFBQVEsSUFFckIsRUFBVyxLQUFLLEVBSXhCLEdBQWEsRUFBVyxLQUFLLEtBQ3pCLEdBQWEsSUFDYixFQUFLLFVBQVUsUUFBVSxHQUdqQyxNQUFPLE9BV1gsRUFBUSxZQUFjLFNBQVUsR0FDNUIsR0FJSSxHQUNBLEVBQ0EsRUFDQSxFQVBBLEVBQVUsRUFBSSxHQUFTLElBQUksTUFBTSxPQUNqQyxFQUFPLEtBQUssS0FDWixFQUFZLEVBQUssVUFBVSxRQUMzQixFQUFhLEVBQVUsTUFBTSxNQUtqQyxJQUFJLEVBQVcsT0FBUSxDQUVuQixJQURBLEVBQUksRUFDRyxFQUFRLEVBQVEsUUFDbkIsRUFBTSxFQUFXLFFBQVEsS0FFckIsRUFBVyxPQUFPLEVBQUssRUFJL0IsR0FBYSxFQUFXLEtBQUssS0FDekIsR0FBYSxJQUNiLEVBQUssVUFBVSxRQUFVLEdBR2pDLE1BQU8sT0FXWCxFQUFRLFNBQVcsU0FBVSxHQUl6QixVQUhXLEtBQUssS0FDSyxVQUFVLFFBQ0osTUFBTSxRQUNaLFFBQVEsSUFhakMsRUFBUSxZQUFjLFNBQVUsRUFBTyxHQUNuQyxHQUFZLE1BQVIsRUFDQSxNQUFJLEdBQ08sS0FBSyxTQUFTLEdBRWQsS0FBSyxZQUFZLEVBR2hDLElBSUksR0FDQSxFQUNBLEVBQ0EsRUFQQSxHQUFXLEdBQVMsSUFBSSxNQUFNLE9BQzlCLEVBQU8sS0FBSyxLQUNaLEVBQVksRUFBSyxVQUFVLFFBQzNCLEVBQWEsRUFBVSxNQUFNLE1BTWpDLEtBREEsRUFBSSxFQUNHLEVBQVEsRUFBUSxNQUNuQixFQUFNLEVBQVcsUUFBUSxJQUNwQixFQUNELEVBQVcsT0FBTyxFQUFLLEdBRXZCLEVBQVcsS0FBSyxFQVF4QixPQUpBLEdBQWEsRUFBVyxLQUFLLEtBQ3pCLEdBQWEsSUFDYixFQUFLLFVBQVUsUUFBVSxHQUV0QixRQWlCZixFQUFLLE9BQU8sU0FBVSxFQUFNLEVBQVMsRUFBTyxFQUFNLEdBa0I5QyxRQUFTLEdBQVUsR0FDZixNQUFPLEdBRVgsUUFBUyxHQUFRLEdBQ2IsTUFBTyxVQUFVLEdBQ2IsT0FBUSxFQUFJLFFBQVEsR0FBSyxHQXRCakMsR0FBSSxJQUNJLElBQUssU0FBVSxFQUFHLEdBQ1YsTUFBTyxHQUFJLEdBRW5CLElBQUssU0FBVSxFQUFHLEdBQ1YsTUFBTyxHQUFJLEdBRW5CLElBQUssU0FBVSxFQUFHLEdBQ1YsTUFBTyxHQUFJLEdBRW5CLElBQUssU0FBVSxFQUFHLEdBQ1YsTUFBTyxHQUFJLElBR3ZCLEVBQU0sT0FDTixFQUFTLFdBQ1QsRUFBVSxzREFTZCxHQUFJLEdBQUcsaUJBQWtCLFNBQVUsR0FDL0IsR0FBSSxHQUFPLEVBQUksR0FBSyxNQUFNLEVBQzFCLElBQUksRUFBTSxDQUNOLEdBQUksR0FBTyxFQUFJLEtBQ1gsRUFBTyxFQUFLLFVBQVUsRUFBSyxZQUFZLEtBQU8sR0FDOUMsRUFBSSxLQUFLLEtBQUssR0FDZCxJQUNKLEdBQUksTUFDSixJQUFJLEdBQU8sRUFBSyxJQUFNLEdBQ2xCLEVBQVEsRUFBRSxNQUFNLEdBQ2hCLEVBQUssRUFBVSxFQUFLLEdBT3hCLElBTkksR0FBUyxHQUFTLEVBQ2xCLEVBQU0sRUFBRyxXQUFXLElBQUssRUFBSyxLQUU5QixFQUFJLEtBQUssS0FBSyxHQUNkLEVBQU0sRUFBRyxLQUFLLEtBQUssR0FBTyxLQUFLLEtBQUssRUFBTSxFQUFLLEdBQUssS0FFcEQsTUFBTSxJQUFNLE1BQU0sR0FDbEIsTUFFSixHQUFJLEdBQVEsRUFDWixLQUFLLEtBQUssT0FFZCxJQUNKLEVBQUksR0FBRyxrQkFBbUIsU0FBVSxFQUFNLEdBQ3RDLEdBQVUsR0FBSSxFQUFJLEtBQUssS0FBSyxJQUFTLElBRWpDLEVBQVEsRUFBSSxHQUFHLE1BQU0sRUFDekIsSUFBSSxFQUFPLENBQ1AsRUFBSSxNQUNKLElBQUksR0FBTyxFQUFNLElBQU0sR0FDbkIsRUFBUSxFQUFFLE1BQU0sR0FDaEIsRUFBSyxFQUFVLEVBQU0sR0FDekIsT0FBSSxJQUFTLEdBQVMsR0FFZCxLQUFNLFdBQVcsR0FDakIsR0FBSSxFQUFHLFdBQVcsSUFBSyxFQUFNLElBQzdCLEVBQUcsRUFBUSxLQUdmLEVBQUksS0FBSyxLQUFLLElBRVYsS0FBTSxFQUNOLEdBQUksRUFBRyxFQUFHLEtBQUssS0FBSyxFQUFNLEVBQU0sR0FBSyxJQUNyQyxFQUFHLFFBSWYsTUFnQlIsRUFBSyxPQUFPLFNBQVUsRUFBTSxFQUFTLEVBQU8sRUFBTSxHQUM5QyxHQUFJLEdBQVEsRUFBTSxVQUNkLEVBQUssRUFBSyxFQXFCZCxHQUFNLEtBQU8sU0FBVSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUksR0FDbkMsR0FBSSxFQWtCSixPQWpCVSxPQUFOLElBQ0EsRUFBSyxHQUVMLEVBQUcsRUFBRyxXQUFrQixtQkFBTCxFQUNuQixFQUFPLEVBQ0ssTUFBTCxJQUNQLEdBQ0ksRUFBRyxFQUNILEVBQUcsRUFDSCxNQUFPLEVBQ1AsT0FBUSxHQUVGLE1BQU4sSUFDQSxFQUFLLEdBQUssRUFDVixFQUFLLEdBQUssSUFHWCxLQUFLLEdBQUcsT0FBUSxJQWdCM0IsRUFBTSxPQUFTLFNBQVUsRUFBSSxFQUFJLEdBQzdCLEdBQUksRUFVSixPQVRJLEdBQUcsRUFBSSxXQUFtQixtQkFBTixFQUNwQixFQUFPLEVBQ00sTUFBTixJQUNQLEdBQ0ksR0FBSSxFQUNKLEdBQUksRUFDSixFQUFHLElBR0osS0FBSyxHQUFHLFNBQVUsR0FHN0IsSUFBSSxHQUFXLFdBQ1gsUUFBUyxLQUNMLEtBQUssV0FBVyxZQUFZLE1BRWhDLE1BQU8sVUFBVSxFQUFLLEdBQ2xCLEdBQUksR0FBTSxFQUFLLElBQUksY0FBYyxPQUM3QixFQUFPLEVBQUssSUFBSSxJQUNwQixHQUFJLE1BQU0sUUFBVSw2Q0FDcEIsRUFBSSxPQUFTLFdBQ1QsRUFBRSxLQUFLLEdBQ1AsRUFBSSxPQUFTLEVBQUksUUFBVSxLQUMzQixFQUFLLFlBQVksSUFFckIsRUFBSSxRQUFVLEVBQ2QsRUFBSyxZQUFZLEdBQ2pCLEVBQUksSUFBTSxLQXNCbEIsR0FBTSxNQUFRLFNBQVUsRUFBSyxFQUFHLEVBQUcsRUFBTyxHQUN0QyxHQUFJLEdBQUssS0FBSyxHQUFHLFFBQ2pCLElBQUksRUFBRyxFQUFLLFdBQWEsT0FBUyxHQUM5QixFQUFHLEtBQUssT0FDTCxJQUFXLE1BQVAsRUFBYSxDQUNwQixHQUFJLElBQ0EsYUFBYyxFQUNkLG9CQUFxQixPQUVoQixPQUFMLEdBQWtCLE1BQUwsSUFDYixFQUFJLEVBQUksRUFDUixFQUFJLEVBQUksR0FFQyxNQUFULEdBQTJCLE1BQVYsR0FDakIsRUFBSSxNQUFRLEVBQ1osRUFBSSxPQUFTLEdBRWIsRUFBUSxFQUFLLFdBQ1QsRUFBSyxFQUFFLEVBQUUsRUFBRyxNQUNSLE1BQU8sS0FBSyxZQUNaLE9BQVEsS0FBSyxpQkFJekIsRUFBSyxFQUFFLEVBQUUsRUFBRyxLQUFNLEdBRXRCLE1BQU8sSUFpQlgsRUFBTSxRQUFVLFNBQVUsRUFBSSxFQUFJLEVBQUksR0FDbEMsR0FBSSxFQVdKLE9BVkksR0FBRyxFQUFJLFdBQW1CLG1CQUFOLEVBQ3BCLEVBQU8sRUFDTSxNQUFOLElBQ1AsR0FDSSxHQUFJLEVBQ0osR0FBSSxFQUNKLEdBQUksRUFDSixHQUFJLElBR0wsS0FBSyxHQUFHLFVBQVcsSUFpQzlCLEVBQU0sS0FBTyxTQUFVLEdBQ25CLEdBQUksRUFNSixPQUxJLEdBQUcsRUFBRyxZQUFjLEVBQUcsRUFBRyxTQUMxQixFQUFPLEVBQ0EsSUFDUCxHQUFRLEVBQUcsSUFFUixLQUFLLEdBQUcsT0FBUSxJQTJCM0IsRUFBTSxNQUFRLEVBQU0sRUFBSSxTQUFVLEdBQzlCLEdBQ0ksR0FBSyxLQUFLLEdBQUcsSUFNakIsT0FMd0IsSUFBcEIsVUFBVSxRQUFlLElBQVUsRUFBTSxLQUN6QyxFQUFHLEtBQUssR0FDRCxVQUFVLFFBQ2pCLEVBQUcsSUFBSSxNQUFNLFVBQVUsTUFBTSxLQUFLLFVBQVcsSUFFMUMsR0FtQlgsRUFBTSxJQUFNLFNBQVUsRUFBRyxFQUFHLEVBQU8sRUFBUSxFQUFLLEVBQUssRUFBSyxHQUN0RCxHQUFJLEtBb0JKLE9BbkJJLEdBQUcsRUFBRyxXQUFrQixNQUFMLEVBQ25CLEVBQVEsR0FFQyxNQUFMLElBQ0EsRUFBTSxFQUFJLEdBRUwsTUFBTCxJQUNBLEVBQU0sRUFBSSxHQUVELE1BQVQsSUFDQSxFQUFNLE1BQVEsR0FFSixNQUFWLElBQ0EsRUFBTSxPQUFTLEdBRVIsTUFBUCxHQUFzQixNQUFQLEdBQXNCLE1BQVAsR0FBc0IsTUFBUCxJQUM3QyxFQUFNLFNBQVcsRUFBSyxFQUFLLEVBQUssS0FHakMsS0FBSyxHQUFHLE1BQU8sSUFXMUIsRUFBTSxLQUFPLFNBQVUsR0FDbkIsR0FDSSxHQUFLLEtBQUssR0FBRyxPQU1qQixPQUx3QixJQUFwQixVQUFVLFFBQWUsSUFBVSxFQUFNLEtBQ3pDLEVBQUcsS0FBSyxHQUNELFVBQVUsUUFDakIsRUFBRyxJQUFJLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVyxJQUUxQyxHQW1CWCxFQUFNLEtBQU8sU0FBVSxFQUFHLEVBQUcsRUFBTyxFQUFRLEVBQUksRUFBSSxFQUFJLEdBQ3BELEdBQUksRUFBRyxFQUFHLFVBQ04sR0FBSSxHQUFPLE1BRVgsSUFBUSxhQUFjLGtCQUNsQixJQUNBLEVBQUssRUFBSSxHQUVULElBQ0EsRUFBSyxFQUFJLEdBRUEsTUFBVCxJQUNBLEVBQUssTUFBUSxHQUVILE1BQVYsSUFDQSxFQUFLLE9BQVMsR0FHZCxFQUFLLFFBREMsTUFBTixHQUFvQixNQUFOLEdBQW9CLE1BQU4sR0FBb0IsTUFBTixHQUMxQixFQUFJLEVBQUksRUFBSSxJQUVaLEdBQUssRUFBRyxHQUFLLEVBQUcsR0FBUyxFQUFHLEdBQVUsRUFHOUQsT0FBTyxNQUFLLEdBQUcsVUFBVyxJQWM5QixFQUFNLElBQU0sU0FBVSxHQUNsQixNQUFVLE9BQU4sR0FDSSxZQUFjLEtBQ1QsRUFBRyxLQUFLLE9BQ1QsRUFBRyxNQUFNLEdBQUksRUFBSyxFQUFFLEdBQUcsS0FFM0IsRUFBSyxFQUFHLEtBQUssT0FFVSxLQUF2QixPQUFPLEdBQUksV0FDWCxFQUFLLEVBQUcsVUFBVSxJQUVmLEtBQUssR0FBRyxPQUFRLGFBQWMsSUFBTSxLQUVwQyxFQUFRLFVBQVUsSUFBSSxLQUFLLE9BZTFDLEVBQU0sT0FBUyxTQUFVLEVBQUksRUFBSSxFQUFJLEdBQ2pDLEdBQUksS0FLSixPQUpVLE9BQU4sR0FBb0IsTUFBTixHQUFvQixNQUFOLEdBQW9CLE1BQU4sSUFDMUMsRUFBSyxTQUFXLEVBQUksRUFBSSxFQUFJLElBR3pCLEtBQUssR0FBRyxTQUFVLElBc0I3QixFQUFNLEtBQU8sU0FBVSxFQUFHLEVBQUcsR0FDekIsR0FBSSxLQVVKLE9BVEksR0FBRyxFQUFHLFVBQ04sRUFBTyxFQUNLLE1BQUwsSUFDUCxHQUNJLEVBQUcsRUFDSCxFQUFHLEVBQ0gsS0FBTSxHQUFRLEtBR2YsS0FBSyxHQUFHLE9BQVEsSUFpQjNCLEVBQU0sS0FBTyxTQUFVLEVBQUksRUFBSSxFQUFJLEdBQy9CLEdBQUksS0FXSixPQVZJLEdBQUcsRUFBSSxVQUNQLEVBQU8sRUFDTSxNQUFOLElBQ1AsR0FDSSxHQUFJLEVBQ0osR0FBSSxFQUNKLEdBQUksRUFDSixHQUFJLElBR0wsS0FBSyxHQUFHLE9BQVEsSUFpQjNCLEVBQU0sU0FBVyxTQUFVLEdBQ25CLFVBQVUsT0FBUyxJQUNuQixFQUFTLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVyxHQUVuRCxJQUFJLEtBTUosT0FMSSxHQUFHLEVBQVEsWUFBYyxFQUFHLEVBQVEsU0FDcEMsRUFBTyxFQUNVLE1BQVYsSUFDUCxHQUFRLE9BQVEsSUFFYixLQUFLLEdBQUcsV0FBWSxJQVEvQixFQUFNLFFBQVUsU0FBVSxHQUNsQixVQUFVLE9BQVMsSUFDbkIsRUFBUyxNQUFNLFVBQVUsTUFBTSxLQUFLLFVBQVcsR0FFbkQsSUFBSSxLQU1KLE9BTEksR0FBRyxFQUFRLFlBQWMsRUFBRyxFQUFRLFNBQ3BDLEVBQU8sRUFDVSxNQUFWLElBQ1AsR0FBUSxPQUFRLElBRWIsS0FBSyxHQUFHLFVBQVcsSUFHN0IsV0FXRyxRQUFTLEtBQ0wsTUFBTyxNQUFLLFVBQVUsUUFZMUIsUUFBUyxHQUFTLEVBQU8sR0FDckIsR0FBSSxHQUFPLEVBQUUsUUFDVCxHQUNJLFFBQVMsRUFBUyxJQUUxQixHQUFRLEVBQUssTUFBTSxHQUNuQixFQUFLLGNBQWdCLEVBQU0sSUFDdkIsRUFBTSxRQUFVLElBQ2hCLEVBQUssZ0JBQWtCLEVBQU0sU0FFakMsRUFBRSxFQUFNLEVBR1IsS0FBSyxHQURELEdBREEsRUFBUSxLQUFLLFFBRVIsRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQUssQ0FFbkMsR0FEaUIsV0FBVyxFQUFNLEdBQUcsS0FBSyxXQUN6QixFQUFRLENBQ3JCLEtBQUssS0FBSyxhQUFhLEVBQU0sRUFBTSxHQUFHLE1BQ3RDLEdBQVcsQ0FDWCxRQU1SLE1BSEssSUFDRCxLQUFLLEtBQUssWUFBWSxHQUVuQixLQUVYLFFBQVMsS0FDTCxHQUFpQixrQkFBYixLQUFLLEtBQTBCLENBQy9CLEdBQUksR0FBSyxFQUFFLEtBQUssS0FBTSxPQUFTLEVBQzNCLEVBQUssRUFBRSxLQUFLLEtBQU0sT0FBUyxFQUMzQixFQUFLLEVBQUUsS0FBSyxLQUFNLE9BQVMsRUFDM0IsRUFBSyxFQUFFLEtBQUssS0FBTSxPQUFTLENBQy9CLE9BQU8sR0FBSyxFQUFFLElBQUksRUFBSSxFQUFJLEtBQUssSUFBSSxFQUFLLEdBQUssS0FBSyxJQUFJLEVBQUssSUFFM0QsR0FBSSxHQUFLLEtBQUssS0FBSyxJQUFNLEdBQ3JCLEVBQUssS0FBSyxLQUFLLElBQU0sR0FDckIsRUFBSSxLQUFLLEtBQUssR0FBSyxDQUN2QixPQUFPLEdBQUssRUFBRSxJQUFJLEVBQUssRUFBRyxFQUFLLEVBQU8sRUFBSixFQUFXLEVBQUosR0FjakQsUUFBUyxHQUFVLEdBQ2YsR0FBSSxHQUFPLEVBQ1AsRUFBUSxLQUFLLE9BSWpCLElBSGtCLGdCQUFQLEtBQ1AsRUFBTyxFQUFJLHVCQUF3QixLQUFNLGFBQWUsR0FBSyxlQUFlLE9BRTNFLEVBQUssR0FBRyxFQUFNLFNBQW5CLENBR0EsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxJQUM5QixHQUFJLEVBQUssR0FBSSxDQUNULEdBQUksR0FBUSxFQUFLLE1BQU0sRUFBSyxHQUFHLE9BQzNCLEdBQVEsT0FBVSxFQUFLLEdBQUcsT0FBUyxJQUN2QyxHQUFLLGNBQWdCLEVBQU0sSUFDdkIsRUFBTSxRQUFVLElBQ2hCLEVBQUssZ0JBQWtCLEVBQU0sU0FFakMsRUFBTSxHQUFHLEtBQUssT0FFZCxHQUFNLEdBQUcsUUFHakIsS0FBSyxFQUFJLEVBQU0sT0FBUSxFQUFJLEVBQUssT0FBUSxJQUNwQyxLQUFLLFFBQVEsRUFBSyxHQUFHLE1BQU8sRUFBSyxHQUFHLE9BRXhDLE9BQU8sT0FFWCxRQUFTLEdBQVMsRUFBTSxHQUNwQixHQUNJLEdBREEsRUFBTyxFQUFJLHVCQUF3QixLQUFNLEdBQUssY0FFbEQsS0FBSyxFQUNELE1BQU8sS0FFWCxHQUFLLE9BQU8sUUFBUSxHQUVoQixFQUQyQixLQUEzQixFQUFLLEtBQUssY0FDTCxFQUFlLE1BQU0sRUFBRyxFQUFLLFFBRTdCLEVBQWUsTUFBTSxFQUFHLEVBQUssUUFFbEMsRUFBSyxNQUFRLEVBQUssS0FBSyxlQUN2QixFQUFFLEVBQUcsTUFDRCxjQUFlLGtCQUt2QixLQUFLLEdBRkQsR0FBUSxFQUFLLE1BQ2IsRUFBTSxFQUFNLE9BQ1AsRUFBSSxFQUFHLEVBQUksRUFBSyxJQUFLLENBQzFCLEdBQUksR0FBTyxFQUFNLEVBQ2pCLEdBQUcsUUFBUSxFQUFLLE1BQU8sRUFBSyxRQUVoQyxNQUFPLEdBRVgsUUFBUyxHQUFlLEVBQU0sRUFBSSxFQUFJLEVBQUksR0FDdEMsR0FBSSxHQUFLLEVBQUssRUFBRSxLQUFLLGlCQUFrQixFQWF2QyxPQVpBLEdBQUcsTUFBUSxFQUNYLEVBQUcsUUFBVSxFQUNiLEVBQUcsUUFBVSxFQUNiLEVBQUcsU0FBVyxFQUNKLE1BQU4sR0FDQSxFQUFFLEVBQUcsTUFDRCxHQUFJLEVBQ0osR0FBSSxFQUNKLEdBQUksRUFDSixHQUFJLElBR0wsRUFFWCxRQUFTLEdBQWUsRUFBTSxFQUFJLEVBQUksRUFBRyxFQUFJLEdBQ3pDLEdBQUksR0FBSyxFQUFLLEVBQUUsS0FBSyxpQkFBa0IsRUFpQnZDLE9BaEJBLEdBQUcsTUFBUSxFQUNYLEVBQUcsUUFBVSxFQUNiLEVBQUcsUUFBVSxFQUNILE1BQU4sR0FDQSxFQUFFLEVBQUcsTUFDRCxHQUFJLEVBQ0osR0FBSSxFQUNKLEVBQUcsSUFHRCxNQUFOLEdBQW9CLE1BQU4sR0FDZCxFQUFFLEVBQUcsTUFDRCxHQUFJLEVBQ0osR0FBSSxJQUdMLEVBaEtYLEdBQUksR0FBSSxFQUFLLEVBQUUsQ0F1TWYsR0FBTSxTQUFXLFNBQVUsR0FDdkIsTUFBTyxHQUFTLEtBQUssS0FBTSxJQUUvQixFQUFNLGVBQWlCLFNBQVUsRUFBSSxFQUFJLEVBQUksR0FDekMsTUFBTyxHQUFlLEtBQUssS0FBTSxFQUFJLEVBQUksRUFBSSxJQUVqRCxFQUFNLGVBQWlCLFNBQVUsRUFBSSxFQUFJLEVBQUcsRUFBSSxHQUM1QyxNQUFPLEdBQWUsS0FBSyxLQUFNLEVBQUksRUFBSSxFQUFHLEVBQUksSUFTcEQsRUFBTSxTQUFXLFdBQ2IsR0FJSSxHQUpBLEVBQU0sS0FBSyxLQUFLLGNBQ2hCLEVBQUksRUFBSSx5QkFDUixFQUFJLEVBQUksY0FBYyxPQUN0QixFQUFNLEtBQUssS0FBSyxXQUFVLEVBTzlCLE9BTEEsR0FBRSxZQUFZLEdBQ2QsRUFBRSxZQUFZLEdBQ2QsRUFBSyxFQUFFLEVBQUUsR0FBTSxNQUFPLCtCQUN0QixFQUFNLEVBQUUsVUFDUixFQUFFLFlBQVksRUFBRSxZQUNULEdBU1gsRUFBTSxVQUFZLFdBQ2QsR0FBSSxHQUFVLEVBQU8sS0FDakIsTUFBTyw2QkFBK0IsS0FBSyxTQUFTLG1CQUFtQixTQVMvRSxFQUFNLE1BQVEsV0FHVixJQUZBLEdBQ0ksR0FEQSxFQUFPLEtBQUssS0FBSyxXQUVkLEdBQ0gsRUFBTyxFQUFLLFlBQ1EsUUFBaEIsRUFBSyxRQUNMLEVBQUssV0FBVyxZQUFZLEdBRTVCLEVBQU0sTUFBTSxNQUFNLEtBQU0sSUFFNUIsRUFBTyxRQW1CdkIsRUFBSyxPQUFPLFNBQVUsRUFBTSxFQUFTLEVBQU8sR0FheEMsUUFBUyxHQUFNLEdBQ1gsR0FBSSxHQUFJLEVBQU0sR0FBSyxFQUFNLE1BY3pCLE9BYkksR0FBRSxHQUNGLEVBQUUsR0FBSSxNQUFRLElBRWQsRUFBRSxJQUNFLE1BQU8sS0FHZixXQUFXLFdBQ1AsSUFBSyxHQUFJLEtBQU8sR0FBTyxFQUFFLEdBQUssSUFBUSxHQUFPLE1BQ3pDLEVBQUUsR0FBSyxhQUNpQixHQUFFLEtBRzNCLEVBQUUsR0FFYixRQUFTLEdBQUksRUFBRyxFQUFHLEVBQU8sR0FVdEIsTUFUUyxPQUFMLElBQ0EsRUFBSSxFQUFJLEVBQVEsRUFBUyxHQUVwQixNQUFMLElBQ0EsRUFBSSxFQUFFLEVBQ04sRUFBUSxFQUFFLE1BQ1YsRUFBUyxFQUFFLE9BQ1gsRUFBSSxFQUFFLElBR04sRUFBRyxFQUNILEVBQUcsRUFDSCxNQUFPLEVBQ1AsRUFBRyxFQUNILE9BQVEsRUFDUixFQUFHLEVBQ0gsR0FBSSxFQUFJLEVBQ1IsR0FBSSxFQUFJLEVBQ1IsR0FBSSxFQUFJLEVBQVEsRUFDaEIsR0FBSSxFQUFJLEVBQVMsRUFDakIsR0FBSSxFQUFLLElBQUksRUFBTyxHQUFVLEVBQzlCLEdBQUksRUFBSyxJQUFJLEVBQU8sR0FBVSxFQUM5QixHQUFJLEVBQUssS0FBSyxFQUFRLEVBQVEsRUFBUyxHQUFVLEVBQ2pELEtBQU0sRUFBUyxFQUFHLEVBQUcsRUFBTyxHQUM1QixJQUFLLEVBQUcsRUFBRyxFQUFPLEdBQVEsS0FBSyxNQUd2QyxRQUFTLEtBQ0wsTUFBTyxNQUFLLEtBQUssS0FBSyxRQUFRLEVBQUssTUFFdkMsUUFBUyxHQUFVLEdBQ2YsR0FBSSxHQUFNLEVBQU0sRUFFaEIsT0FEQSxHQUFJLFNBQVcsRUFDUixFQUVYLFFBQVMsR0FBd0IsRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEdBQ3JFLE1BQWMsT0FBVixFQUNPLEVBQU8sRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxHQUUxQyxFQUFrQixFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQ3hELEVBQVUsRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLElBRzlELFFBQVMsR0FBaUIsRUFBUyxHQUMvQixRQUFTLEdBQUUsR0FDUCxTQUFVLEdBQUssUUFBUSxHQUUzQixNQUFPLEdBQUssRUFBRSxPQUFPLFNBQVUsRUFBTSxFQUFRLEdBQ3JDLFlBQWdCLEtBQ2hCLEVBQU8sRUFBSyxLQUFLLE1BRXJCLEVBQU8sRUFBVyxFQUdsQixLQUFLLEdBRkQsR0FBRyxFQUFHLEVBQUcsRUFBMkIsRUFBeEIsRUFBSyxHQUFJLEtBQ3JCLEVBQU0sRUFDRCxFQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBQUssQ0FFM0MsR0FEQSxFQUFJLEVBQUssR0FDRyxLQUFSLEVBQUUsR0FDRixHQUFLLEVBQUUsR0FDUCxHQUFLLEVBQUUsT0FDSixDQUVILEdBREEsRUFBSSxFQUF3QixFQUFHLEVBQUcsRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLElBQzlELEVBQU0sRUFBSSxFQUFRLENBQ2xCLEdBQUksSUFBWSxFQUFTLE1BQU8sQ0FVNUIsR0FUQSxFQUFRLEVBQXdCLEVBQUcsRUFBRyxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFTLEdBQ25GLElBQ0ksSUFBTSxFQUFFLEVBQU0sTUFBTSxHQUNwQixFQUFFLEVBQU0sTUFBTSxHQUNkLEVBQUUsRUFBTSxFQUFFLEdBQ1YsRUFBRSxFQUFNLEVBQUUsR0FDVixFQUFFLEVBQU0sR0FDUixFQUFFLEVBQU0sSUFFUixFQUFZLE1BQU8sRUFDdkIsR0FBUyxNQUFRLEVBQ2pCLEdBQ0ksSUFBTSxFQUFFLEVBQU0sR0FDZCxFQUFFLEVBQU0sR0FBSyxJQUFNLEVBQUUsRUFBTSxFQUFFLEdBQzdCLEVBQUUsRUFBTSxFQUFFLEdBQ1YsRUFBRSxFQUFNLElBQUksR0FDWixFQUFFLEVBQU0sSUFBSSxHQUNaLEVBQUUsRUFBRSxJQUNKLEVBQUUsRUFBRSxLQUNOLE9BQ0YsR0FBTyxFQUNQLEdBQUssRUFBRSxHQUNQLEdBQUssRUFBRSxFQUNQLFVBRUosSUFBSyxJQUFZLEVBRWIsTUFEQSxHQUFRLEVBQXdCLEVBQUcsRUFBRyxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFTLEdBSTNGLEdBQU8sRUFDUCxHQUFLLEVBQUUsR0FDUCxHQUFLLEVBQUUsR0FFWCxHQUFNLEVBQUUsUUFBVSxFQUl0QixNQUZBLEdBQVMsSUFBTSxFQUNmLEVBQVEsRUFBVSxFQUFNLEVBQVUsRUFBVyxFQUFrQixFQUFHLEVBQUcsRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksSUFFMUcsS0FBTSxFQUFLLEVBQUUsT0FLcEIsUUFBUyxHQUFrQixFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssR0FDL0QsR0FBSSxHQUFLLEVBQUksRUFDVCxFQUFNLEVBQUksRUFBSSxHQUNkLEVBQU0sRUFBSSxFQUFJLEdBQ2QsRUFBSyxFQUFJLEVBQ1QsRUFBSyxFQUFLLEVBQ1YsRUFBSSxFQUFNLEVBQVksRUFBTixFQUFVLEVBQUksRUFBVyxFQUFMLEVBQVMsRUFBSSxFQUFJLEVBQU0sRUFBSyxFQUNoRSxFQUFJLEVBQU0sRUFBWSxFQUFOLEVBQVUsRUFBSSxFQUFXLEVBQUwsRUFBUyxFQUFJLEVBQUksRUFBTSxFQUFLLEVBQ2hFLEVBQUssRUFBTSxFQUFJLEdBQUssRUFBTSxHQUFPLEdBQU0sRUFBTSxFQUFJLEVBQU0sR0FDdkQsRUFBSyxFQUFNLEVBQUksR0FBSyxFQUFNLEdBQU8sR0FBTSxFQUFNLEVBQUksRUFBTSxHQUN2RCxFQUFLLEVBQU0sRUFBSSxHQUFLLEVBQU0sR0FBTyxHQUFNLEVBQU0sRUFBSSxFQUFNLEdBQ3ZELEVBQUssRUFBTSxFQUFJLEdBQUssRUFBTSxHQUFPLEdBQU0sRUFBTSxFQUFJLEVBQU0sRUFPM0QsUUFDSSxFQUFHLEVBQ0gsRUFBRyxFQUNILEdBQUksRUFBRyxFQUFJLEVBQUcsR0FDZCxHQUFJLEVBQUcsRUFBSSxFQUFHLEdBQ2QsT0FBUSxFQVhILEVBQUssRUFBTSxFQUFJLEVBV0wsRUFWVixFQUFLLEVBQU0sRUFBSSxHQVdwQixLQUFNLEVBVkQsRUFBSyxFQUFNLEVBQUksRUFVUCxFQVRSLEVBQUssRUFBTSxFQUFJLEdBVXBCLE1BVFEsR0FBb0MsSUFBL0IsRUFBSyxNQUFNLEVBQUssRUFBSSxFQUFLLEdBQVksR0FZMUQsUUFBUyxHQUFXLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssR0FDOUMsRUFBSyxHQUFHLEVBQUssV0FDZCxHQUFPLEVBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssR0FFOUMsSUFBSSxHQUFPLEVBQVMsTUFBTSxLQUFNLEVBQ2hDLE9BQU8sR0FDSCxFQUFLLElBQUksRUFDVCxFQUFLLElBQUksRUFDVCxFQUFLLElBQUksRUFBSSxFQUFLLElBQUksRUFDdEIsRUFBSyxJQUFJLEVBQUksRUFBSyxJQUFJLEdBRzlCLFFBQVMsR0FBa0IsRUFBTSxFQUFHLEdBQ2hDLE1BQVEsSUFBSyxFQUFLLEdBQ1YsR0FBSyxFQUFLLEVBQUksRUFBSyxPQUNuQixHQUFLLEVBQUssR0FDVixHQUFLLEVBQUssRUFBSSxFQUFLLE9BRS9CLFFBQVMsR0FBZ0IsRUFBTyxHQUc1QixNQUZBLEdBQVEsRUFBSSxHQUNaLEVBQVEsRUFBSSxHQUNMLEVBQWtCLEVBQU8sRUFBTSxFQUFHLEVBQU0sSUFDeEMsRUFBa0IsRUFBTyxFQUFNLEdBQUksRUFBTSxJQUN6QyxFQUFrQixFQUFPLEVBQU0sRUFBRyxFQUFNLEtBQ3hDLEVBQWtCLEVBQU8sRUFBTSxHQUFJLEVBQU0sS0FDekMsRUFBa0IsRUFBTyxFQUFNLEVBQUcsRUFBTSxJQUN4QyxFQUFrQixFQUFPLEVBQU0sR0FBSSxFQUFNLElBQ3pDLEVBQWtCLEVBQU8sRUFBTSxFQUFHLEVBQU0sS0FDeEMsRUFBa0IsRUFBTyxFQUFNLEdBQUksRUFBTSxNQUN4QyxFQUFNLEVBQUksRUFBTSxJQUFNLEVBQU0sRUFBSSxFQUFNLEdBQ25DLEVBQU0sRUFBSSxFQUFNLElBQU0sRUFBTSxFQUFJLEVBQU0sS0FDekMsRUFBTSxFQUFJLEVBQU0sSUFBTSxFQUFNLEVBQUksRUFBTSxHQUNuQyxFQUFNLEVBQUksRUFBTSxJQUFNLEVBQU0sRUFBSSxFQUFNLEdBRXJELFFBQVMsR0FBTSxFQUFHLEVBQUksRUFBSSxFQUFJLEdBRzFCLE1BQU8sSUFERSxJQURDLEVBQUksRUFBSyxFQUFJLEVBQUssRUFBSSxFQUFLLEVBQUksR0FDdkIsRUFBSSxFQUFLLEdBQUssRUFBSyxFQUFJLEdBQ3pCLEVBQUksRUFBSyxFQUFJLEVBRWpDLFFBQVMsR0FBTyxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksR0FDbkMsTUFBTCxJQUNBLEVBQUksR0FFUixFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLENBTTVCLEtBQUssR0FMRCxHQUFLLEVBQUksRUFFVCxJQUFZLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxPQUNuRixHQUFXLE1BQU8sTUFBTyxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sTUFBTyxNQUFPLE1BQU8sTUFBTyxPQUN4RixFQUFNLEVBQ0QsRUFBSSxFQUFHLEVBSlIsR0FJZSxJQUFLLENBQ3hCLEdBQUksR0FBSyxFQUFLLEVBQVEsR0FBSyxFQUN2QixFQUFRLEVBQU0sRUFBSSxFQUFJLEVBQUksRUFBSSxHQUM5QixFQUFRLEVBQU0sRUFBSSxFQUFJLEVBQUksRUFBSSxHQUM5QixFQUFPLEVBQVEsRUFBUSxFQUFRLENBQ25DLElBQU8sRUFBUSxHQUFLLEVBQUssS0FBSyxHQUVsQyxNQUFPLEdBQUssRUFFaEIsUUFBUyxHQUFVLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxHQUMvQyxLQUFJLEVBQUssR0FBSyxFQUFPLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksR0FBTSxHQUF2RCxDQUdBLEdBR0ksR0FGQSxFQUFPLEdBQ1AsRUFGSSxFQUVLLENBSWIsS0FEQSxFQUFJLEVBQU8sRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEdBQ3BDLEVBQUksRUFBSSxHQUZQLEtBR0osR0FBUSxFQUNSLElBQU8sRUFBSSxFQUFLLEdBQUssR0FBSyxFQUMxQixFQUFJLEVBQU8sRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBRS9DLE9BQU8sSUFFWCxRQUFTLEdBQVUsRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxHQUMzQyxLQUNJLEVBQUssRUFBSSxHQUFNLEVBQUssRUFBSSxJQUN4QixFQUFLLEVBQUksR0FBTSxFQUFLLEVBQUksSUFDeEIsRUFBSyxFQUFJLEdBQU0sRUFBSyxFQUFJLElBQ3hCLEVBQUssRUFBSSxHQUFNLEVBQUssRUFBSSxJQUo1QixDQVFBLEdBQUksSUFBTSxFQUFLLEVBQUssRUFBSyxJQUFPLEVBQUssSUFBTyxFQUFLLElBQU8sRUFBSyxFQUFLLEVBQUssR0FDbkUsR0FBTSxFQUFLLEVBQUssRUFBSyxJQUFPLEVBQUssSUFBTyxFQUFLLElBQU8sRUFBSyxFQUFLLEVBQUssR0FDbkUsR0FBZSxFQUFLLElBQU8sRUFBSyxJQUFPLEVBQUssSUFBTyxFQUFLLEVBRTVELElBQUssRUFBTCxDQUdBLEdBQUksR0FBSyxFQUFLLEVBQ1YsRUFBSyxFQUFLLEVBQ1YsR0FBTyxFQUFHLFFBQVEsR0FDbEIsR0FBTyxFQUFHLFFBQVEsRUFDdEIsTUFDSSxHQUFPLEVBQUssRUFBSSxHQUFJLFFBQVEsSUFDNUIsR0FBTyxFQUFLLEVBQUksR0FBSSxRQUFRLElBQzVCLEdBQU8sRUFBSyxFQUFJLEdBQUksUUFBUSxJQUM1QixHQUFPLEVBQUssRUFBSSxHQUFJLFFBQVEsSUFDNUIsR0FBTyxFQUFLLEVBQUksR0FBSSxRQUFRLElBQzVCLEdBQU8sRUFBSyxFQUFJLEdBQUksUUFBUSxJQUM1QixHQUFPLEVBQUssRUFBSSxHQUFJLFFBQVEsSUFDNUIsR0FBTyxFQUFLLEVBQUksR0FBSSxRQUFRLElBSWhDLE9BQVEsRUFBRyxFQUFJLEVBQUcsS0FRdEIsUUFBUyxHQUFZLEVBQU0sRUFBTSxHQUc3QixJQUFLLEVBRk8sRUFBVyxHQUNYLEVBQVcsSUFFbkIsTUFBTyxHQUFZLElBVXZCLEtBQUssR0FSRCxHQUFLLEVBQU8sTUFBTSxFQUFHLEdBQ3JCLEVBQUssRUFBTyxNQUFNLEVBQUcsR0FDckIsS0FBUSxFQUFLLEdBQ2IsS0FBUSxFQUFLLEdBQ2IsS0FDQSxLQUNBLEtBQ0EsRUFBTSxFQUFZLEtBQ2IsRUFBSSxFQUFHLEVBQUksRUFBSyxFQUFHLElBQUssQ0FDN0IsR0FBSSxHQUFJLEVBQWtCLE1BQU0sRUFBRyxFQUFLLE9BQU8sRUFBSSxHQUNuRCxHQUFNLE1BQU0sRUFBRyxFQUFFLEVBQUcsRUFBRyxFQUFFLEVBQUcsRUFBRyxFQUFJLElBRXZDLElBQUssRUFBSSxFQUFHLEVBQUksRUFBSyxFQUFHLElBQ3BCLEVBQUksRUFBa0IsTUFBTSxFQUFHLEVBQUssT0FBTyxFQUFJLElBQy9DLEVBQU0sTUFBTSxFQUFHLEVBQUUsRUFBRyxFQUFHLEVBQUUsRUFBRyxFQUFHLEVBQUksR0FFdkMsS0FBSyxFQUFJLEVBQUcsRUFBSSxFQUFJLElBQ2hCLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxFQUFJLElBQUssQ0FDekIsR0FBSSxHQUFLLEVBQU0sR0FDWCxFQUFNLEVBQU0sRUFBSSxHQUNoQixFQUFLLEVBQU0sR0FDWCxFQUFNLEVBQU0sRUFBSSxHQUNoQixFQUFLLEVBQUksRUFBSSxFQUFJLEVBQUcsR0FBSyxLQUFPLElBQU0sSUFDdEMsRUFBSyxFQUFJLEVBQUksRUFBSSxFQUFHLEdBQUssS0FBTyxJQUFNLElBQ3RDLEVBQUssRUFBVSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUksRUFBRyxFQUFJLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFJLEVBQUcsRUFBSSxFQUNwRSxJQUFJLEVBQUksQ0FDSixHQUFJLEVBQUcsRUFBRyxFQUFFLFFBQVEsS0FBTyxFQUFHLEVBQUUsUUFBUSxHQUNwQyxRQUVKLEdBQUcsRUFBRyxFQUFFLFFBQVEsSUFBTSxFQUFHLEVBQUUsUUFBUSxFQUNuQyxJQUFJLEdBQUssRUFBRyxFQUFJLEdBQUssRUFBRyxHQUFNLEVBQUcsS0FBUSxFQUFJLEdBQU0sRUFBRyxNQUFTLEVBQUksRUFBSSxFQUFHLEdBQ3RFLEVBQUssRUFBRyxFQUFJLEdBQUssRUFBRyxHQUFNLEVBQUcsS0FBUSxFQUFJLEdBQU0sRUFBRyxNQUFTLEVBQUksRUFBSSxFQUFHLEVBQ3RFLElBQU0sR0FBSyxHQUFNLEdBQUssR0FBTSxHQUFLLEdBQU0sSUFDbkMsRUFDQSxJQUVBLEVBQUksTUFDQSxFQUFHLEVBQUcsRUFDTixFQUFHLEVBQUcsRUFDTixHQUFJLEVBQ0osR0FBSSxNQU81QixNQUFPLEdBRVgsUUFBUyxHQUFpQixFQUFPLEdBQzdCLE1BQU8sR0FBZ0IsRUFBTyxHQUVsQyxRQUFTLEdBQXVCLEVBQU8sR0FDbkMsTUFBTyxHQUFnQixFQUFPLEVBQU8sR0FFekMsUUFBUyxHQUFnQixFQUFPLEVBQU8sR0FDbkMsRUFBUSxFQUFXLEdBQ25CLEVBQVEsRUFBVyxFQUduQixLQUFLLEdBRkQsR0FBSSxFQUFJLEVBQUksRUFBSSxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQU0sRUFDMUMsRUFBTSxFQUFZLEtBQ2IsRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLENBQzVDLEdBQUksR0FBSyxFQUFNLEVBQ2YsSUFBYSxLQUFULEVBQUcsR0FDSCxFQUFLLEVBQU0sRUFBRyxHQUNkLEVBQUssRUFBTSxFQUFHLE9BQ1gsQ0FDVSxLQUFULEVBQUcsSUFDSCxHQUFRLEVBQUksR0FBSSxPQUFPLEVBQUcsTUFBTSxJQUNoQyxFQUFLLEVBQUssR0FDVixFQUFLLEVBQUssS0FFVixHQUFRLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSyxFQUFLLEVBQUssR0FDdkMsRUFBSyxFQUNMLEVBQUssRUFFVCxLQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxJQUFLLENBQzVDLEdBQUksR0FBSyxFQUFNLEVBQ2YsSUFBYSxLQUFULEVBQUcsR0FDSCxFQUFLLEVBQU0sRUFBRyxHQUNkLEVBQUssRUFBTSxFQUFHLE9BQ1gsQ0FDVSxLQUFULEVBQUcsSUFDSCxHQUFRLEVBQUksR0FBSSxPQUFPLEVBQUcsTUFBTSxJQUNoQyxFQUFLLEVBQUssR0FDVixFQUFLLEVBQUssS0FFVixHQUFRLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSyxFQUFLLEVBQUssR0FDdkMsRUFBSyxFQUNMLEVBQUssRUFFVCxJQUFJLEdBQU8sRUFBWSxFQUFNLEVBQU0sRUFDbkMsSUFBSSxFQUNBLEdBQU8sTUFDSixDQUNILElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBQ3RDLEVBQUssR0FBRyxTQUFXLEVBQ25CLEVBQUssR0FBRyxTQUFXLEVBQ25CLEVBQUssR0FBRyxLQUFPLEVBQ2YsRUFBSyxHQUFHLEtBQU8sQ0FFbkIsR0FBTSxFQUFJLE9BQU8sT0FNckMsTUFBTyxHQUVYLFFBQVMsR0FBa0IsRUFBTSxFQUFHLEdBQ2hDLEdBQUksR0FBTyxFQUFTLEVBQ3BCLE9BQU8sR0FBa0IsRUFBTSxFQUFHLElBQzNCLEVBQWdCLElBQVEsSUFBSyxFQUFHLElBQUssSUFBSyxFQUFLLEdBQUssS0FBTSxHQUFLLEdBQUssRUFFL0UsUUFBUyxHQUFTLEdBQ2QsR0FBSSxHQUFNLEVBQU0sRUFDaEIsSUFBSSxFQUFJLEtBQ0osTUFBTyxHQUFNLEVBQUksS0FFckIsS0FBSyxFQUNELE1BQU8sSUFFWCxHQUFPLEVBQVcsRUFNbEIsS0FBSyxHQURELEdBSkEsRUFBSSxFQUNKLEVBQUksRUFDSixLQUNBLEtBRUssRUFBSSxFQUFHLEVBQUssRUFBSyxPQUFRLEVBQUksRUFBSSxJQUV0QyxHQURBLEVBQUksRUFBSyxHQUNHLEtBQVIsRUFBRSxHQUNGLEVBQUksRUFBRSxHQUNOLEVBQUksRUFBRSxHQUNOLEVBQUUsS0FBSyxHQUNQLEVBQUUsS0FBSyxPQUNKLENBQ0gsR0FBSSxHQUFNLEVBQVMsRUFBRyxFQUFHLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxHQUN6RCxHQUFJLEVBQUUsT0FBTyxFQUFJLElBQUksRUFBRyxFQUFJLElBQUksR0FDaEMsRUFBSSxFQUFFLE9BQU8sRUFBSSxJQUFJLEVBQUcsRUFBSSxJQUFJLEdBQ2hDLEVBQUksRUFBRSxHQUNOLEVBQUksRUFBRSxHQUdkLEdBQUksR0FBTyxFQUFLLE1BQU0sRUFBRyxHQUNyQixFQUFPLEVBQUssTUFBTSxFQUFHLEdBQ3JCLEVBQU8sRUFBSyxNQUFNLEVBQUcsR0FDckIsRUFBTyxFQUFLLE1BQU0sRUFBRyxHQUNyQixFQUFLLEVBQUksRUFBTSxFQUFNLEVBQU8sRUFBTSxFQUFPLEVBRTdDLE9BREEsR0FBSSxLQUFPLEVBQU0sR0FDVixFQUVYLFFBQVMsR0FBUyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQzFCLEdBQUksRUFDQSxRQUNLLEtBQU0sSUFBSyxFQUFHLElBQ2QsSUFBSyxFQUFRLEVBQUosRUFBTyxJQUNoQixJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLElBQ3ZCLElBQUssRUFBRyxFQUFRLEVBQUosSUFDWixJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLElBQ3hCLElBQVMsRUFBSixFQUFRLEVBQUcsSUFDaEIsSUFBSyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUksR0FBSSxJQUN6QixJQUFLLEVBQU8sRUFBSixFQUFRLElBQ2hCLElBQUssRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUksSUFDeEIsS0FHVCxJQUFJLEtBQVEsSUFBSyxFQUFHLElBQUssSUFBSyxFQUFHLElBQUssSUFBSyxFQUFHLElBQUssS0FBTSxFQUFHLElBQUssS0FFakUsT0FEQSxHQUFJLFNBQVcsRUFDUixFQUVYLFFBQVMsR0FBWSxFQUFHLEVBQUcsRUFBSSxFQUFJLEdBUS9CLEdBUFMsTUFBTCxHQUFtQixNQUFOLElBQ2IsRUFBSyxHQUVULEdBQUssRUFDTCxHQUFLLEVBQ0wsR0FBTSxFQUNOLEdBQU0sRUFDRyxNQUFMLEVBQ0EsR0FBSSxHQUFNLEtBQUssR0FBSyxJQUNoQixFQUFLLEVBQUksRUFBSyxLQUFLLEtBQUssRUFBSyxHQUM3QixFQUFLLEVBQUksRUFBSyxLQUFLLEtBQUssRUFBSSxHQUM1QixFQUFLLEVBQUksRUFBSyxLQUFLLEtBQUssRUFBSyxHQUM3QixFQUFLLEVBQUksRUFBSyxLQUFLLEtBQUssRUFBSSxHQUM1QixJQUFRLElBQUssRUFBSSxJQUFNLElBQUssRUFBSSxFQUFJLElBQUssRUFBSSxFQUFLLEtBQU0sRUFBRyxFQUFJLFFBRW5FLEtBQ0ssSUFBSyxFQUFHLElBQ1IsSUFBSyxHQUFJLElBQ1QsSUFBSyxFQUFJLEVBQUksRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFJLElBQzdCLElBQUssRUFBSSxFQUFJLEVBQUcsRUFBRyxFQUFHLEdBQUksRUFBSSxJQUM5QixLQUlULE9BREEsR0FBSSxTQUFXLEVBQ1IsRUFxQ1gsUUFBUyxHQUFlLEdBQ3BCLEdBQUksR0FBTSxFQUFNLEdBQ1osRUFBWSxPQUFPLFVBQVUsV0FDakMsSUFBSSxFQUFJLElBQ0osTUFBTyxHQUFVLEVBQUksSUFFcEIsR0FBSyxHQUFHLEVBQVcsVUFBYSxFQUFLLEdBQUcsR0FBYSxFQUFVLEdBQUksV0FDcEUsRUFBWSxFQUFLLGdCQUFnQixHQUVyQyxJQUFJLE1BQ0EsRUFBSSxFQUNKLEVBQUksRUFDSixFQUFLLEVBQ0wsRUFBSyxFQUNMLEVBQVEsQ0FDVyxNQUFuQixFQUFVLEdBQUcsS0FDYixFQUFJLEVBQVUsR0FBRyxHQUNqQixFQUFJLEVBQVUsR0FBRyxHQUNqQixFQUFLLEVBQ0wsRUFBSyxFQUNMLElBQ0EsRUFBSSxNQUFNLElBQUssRUFBRyxJQUV0QixLQUFLLEdBQUksR0FBSSxFQUFPLEVBQUssRUFBVSxPQUFRLEVBQUksRUFBSSxJQUFLLENBQ3BELEdBQUksR0FBSSxFQUFJLE1BQ1IsRUFBSyxFQUFVLEVBQ25CLElBQUksRUFBRyxJQUFNLEVBQVUsS0FBSyxFQUFHLElBRTNCLE9BREEsRUFBRSxHQUFLLEVBQVUsS0FBSyxFQUFHLElBQ2pCLEVBQUUsSUFDTixJQUFLLElBQ0QsRUFBRSxHQUFLLEVBQUcsR0FDVixFQUFFLEdBQUssRUFBRyxHQUNWLEVBQUUsR0FBSyxFQUFHLEdBQ1YsRUFBRSxHQUFLLEVBQUcsR0FDVixFQUFFLEdBQUssRUFBRyxHQUNWLEVBQUUsS0FBTyxFQUFHLEdBQUssR0FBRyxRQUFRLEdBQzVCLEVBQUUsS0FBTyxFQUFHLEdBQUssR0FBRyxRQUFRLEVBQzVCLE1BQ0osS0FBSyxJQUNELEVBQUUsS0FBTyxFQUFHLEdBQUssR0FBRyxRQUFRLEVBQzVCLE1BQ0osS0FBSyxJQUNELEVBQUssRUFBRyxHQUNSLEVBQUssRUFBRyxFQUNaLFNBQ0ksSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUcsT0FBUSxFQUFJLEVBQUksSUFDcEMsRUFBRSxLQUFPLEVBQUcsSUFBTSxFQUFJLEVBQUksRUFBSSxJQUFJLFFBQVEsT0FHbkQsQ0FDSCxFQUFJLEVBQUksTUFDSyxLQUFULEVBQUcsS0FDSCxFQUFLLEVBQUcsR0FBSyxFQUNiLEVBQUssRUFBRyxHQUFLLEVBRWpCLEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxFQUFHLE9BQVEsRUFBSSxFQUFJLElBQ3BDLEVBQUksR0FBRyxHQUFLLEVBQUcsR0FHdkIsR0FBSSxHQUFNLEVBQUksR0FBRyxNQUNqQixRQUFRLEVBQUksR0FBRyxJQUNYLElBQUssSUFDRCxFQUFJLEVBQ0osRUFBSSxDQUNKLE1BQ0osS0FBSyxJQUNELElBQU0sRUFBSSxHQUFHLEVBQU0sRUFDbkIsTUFDSixLQUFLLElBQ0QsSUFBTSxFQUFJLEdBQUcsRUFBTSxFQUNuQixNQUNKLFNBQ0ksSUFBTSxFQUFJLEdBQUcsRUFBTSxHQUNuQixJQUFNLEVBQUksR0FBRyxFQUFNLElBSy9CLE1BRkEsR0FBSSxTQUFXLEVBQ2YsRUFBSSxJQUFNLEVBQVUsR0FDYixFQUVYLFFBQVMsR0FBZSxHQUNwQixHQUFJLEdBQU0sRUFBTSxFQUNoQixJQUFJLEVBQUksSUFDSixNQUFPLEdBQVUsRUFBSSxJQUt6QixJQUhLLEVBQUcsRUFBVyxVQUFhLEVBQUcsR0FBYSxFQUFVLEdBQUksV0FDMUQsRUFBWSxFQUFLLGdCQUFnQixLQUVoQyxJQUFjLEVBQVUsT0FDekIsUUFBUyxJQUFLLEVBQUcsR0FFckIsSUFNSSxHQU5BLEtBQ0EsRUFBSSxFQUNKLEVBQUksRUFDSixFQUFLLEVBQ0wsRUFBSyxFQUNMLEVBQVEsQ0FFVyxNQUFuQixFQUFVLEdBQUcsS0FDYixHQUFLLEVBQVUsR0FBRyxHQUNsQixHQUFLLEVBQVUsR0FBRyxHQUNsQixFQUFLLEVBQ0wsRUFBSyxFQUNMLElBQ0EsRUFBSSxJQUFNLElBQUssRUFBRyxHQU10QixLQUFLLEdBQUksR0FBRyxFQUpSLEVBQTBCLEdBQXBCLEVBQVUsUUFDRyxLQUFuQixFQUFVLEdBQUcsSUFDb0IsS0FBakMsRUFBVSxHQUFHLEdBQUcsZUFDaUIsS0FBakMsRUFBVSxHQUFHLEdBQUcsY0FDSixFQUFJLEVBQU8sRUFBSyxFQUFVLE9BQVEsRUFBSSxFQUFJLElBQUssQ0FJM0QsR0FIQSxFQUFJLEtBQUssTUFDVCxFQUFLLEVBQVUsSUFDZixFQUFNLEVBQUcsS0FDRSxFQUFJLGNBRVgsT0FEQSxFQUFFLEdBQUssRUFBSSxjQUNILEVBQUUsSUFDTixJQUFLLElBQ0QsRUFBRSxHQUFLLEVBQUcsR0FDVixFQUFFLEdBQUssRUFBRyxHQUNWLEVBQUUsR0FBSyxFQUFHLEdBQ1YsRUFBRSxHQUFLLEVBQUcsR0FDVixFQUFFLEdBQUssRUFBRyxHQUNWLEVBQUUsSUFBTSxFQUFHLEdBQUssRUFDaEIsRUFBRSxJQUFNLEVBQUcsR0FBSyxDQUNoQixNQUNKLEtBQUssSUFDRCxFQUFFLElBQU0sRUFBRyxHQUFLLENBQ2hCLE1BQ0osS0FBSyxJQUNELEVBQUUsSUFBTSxFQUFHLEdBQUssQ0FDaEIsTUFDSixLQUFLLElBRUQsSUFBSyxHQURELElBQVEsRUFBRyxHQUFHLE9BQU8sRUFBRyxNQUFNLElBQ3pCLEVBQUksRUFBRyxFQUFLLEVBQUssT0FBUSxFQUFJLEVBQUksSUFDdEMsRUFBSyxJQUFNLEVBQUssR0FBSyxFQUNyQixJQUFPLElBQU0sRUFBSyxHQUFLLENBRTNCLEdBQUksTUFDSixFQUFNLEVBQUksT0FBTyxFQUFrQixFQUFNLEdBQ3pDLE1BQ0osS0FBSyxJQUNELEVBQUksTUFDSixFQUFPLEVBQVksRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLElBQ25DLEVBQUssS0FBSyxFQUFLLElBQ2YsRUFBTSxFQUFJLE9BQU8sRUFDakIsTUFDSixLQUFLLElBQ0QsRUFBSSxNQUNKLEVBQU0sRUFBSSxPQUFPLEVBQVksRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLEdBQUksRUFBRyxLQUNwRCxHQUFLLEtBQUssT0FBTyxFQUFJLEVBQUksT0FBUyxHQUFHLE9BQU8sR0FDNUMsTUFDSixLQUFLLElBQ0QsR0FBTSxFQUFHLEdBQUssRUFDZCxHQUFNLEVBQUcsR0FBSyxDQUNsQixTQUNJLElBQUssRUFBSSxFQUFHLEVBQUssRUFBRyxPQUFRLEVBQUksRUFBSSxJQUNoQyxFQUFFLElBQU0sRUFBRyxJQUFNLEVBQUksRUFBSSxFQUFJLE9BR3RDLElBQVcsS0FBUCxFQUNQLEdBQVEsRUFBRyxHQUFHLE9BQU8sRUFBRyxNQUFNLElBQzlCLEVBQUksTUFDSixFQUFNLEVBQUksT0FBTyxFQUFrQixFQUFNLElBQ3pDLEdBQUssS0FBSyxPQUFPLEVBQUcsT0FBTyxRQUN4QixJQUFXLEtBQVAsRUFDUCxFQUFJLE1BQ0osRUFBTyxFQUFZLEVBQUcsRUFBRyxFQUFHLEdBQUksRUFBRyxJQUNuQyxFQUFLLEtBQUssRUFBSyxJQUNmLEVBQU0sRUFBSSxPQUFPLE9BQ2QsSUFBVyxLQUFQLEVBQ1AsRUFBSSxNQUNKLEVBQU0sRUFBSSxPQUFPLEVBQVksRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLEdBQUksRUFBRyxLQUNwRCxHQUFLLEtBQUssT0FBTyxFQUFJLEVBQUksT0FBUyxHQUFHLE9BQU8sUUFFNUMsS0FBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUcsT0FBUSxFQUFJLEVBQUksSUFDcEMsRUFBRSxHQUFLLEVBQUcsRUFJbEIsSUFBVyxNQURYLEVBQU0sRUFBSSxlQUVOLE9BQVEsRUFBRSxJQUNOLElBQUssSUFDRCxHQUFLLEVBQ0wsR0FBSyxDQUNMLE1BQ0osS0FBSyxJQUNELEVBQUksRUFBRSxFQUNOLE1BQ0osS0FBSyxJQUNELEVBQUksRUFBRSxFQUNOLE1BQ0osS0FBSyxJQUNELEVBQUssRUFBRSxFQUFFLE9BQVMsR0FDbEIsRUFBSyxFQUFFLEVBQUUsT0FBUyxFQUN0QixTQUNJLEVBQUksRUFBRSxFQUFFLE9BQVMsR0FDakIsRUFBSSxFQUFFLEVBQUUsT0FBUyxJQU1qQyxNQUZBLEdBQUksU0FBVyxFQUNmLEVBQUksSUFBTSxFQUFVLEdBQ2IsRUFFWCxRQUFTLEdBQUksRUFBSSxFQUFJLEVBQUksR0FDckIsT0FBUSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksR0FFaEMsUUFBUyxHQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxHQUc3QixPQUZVLEVBQUksRUFHQSxFQUZKLEVBQUksRUFFVyxFQUhmLEVBQUksRUFJQSxFQUhKLEVBQUksRUFHVyxFQUpmLEVBQUksRUFLQSxFQUpKLEVBQUksRUFJVyxFQUxmLEVBQUksRUFNQSxFQUxKLEVBQUksRUFLVyxFQUNqQixFQUNBLEdBR1osUUFBUyxHQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBTyxFQUFnQixFQUFZLEVBQUksRUFBSSxHQUdwRSxHQUdJLEdBSEEsRUFBWSxJQUFMLEVBQVcsSUFDbEIsRUFBTSxFQUFLLE1BQVEsR0FBUyxHQUM1QixLQUVBLEVBQVMsRUFBSyxFQUFFLE9BQU8sU0FBVSxFQUFHLEVBQUcsR0FHbkMsT0FBUSxFQUZBLEVBQUksRUFBSyxJQUFJLEdBQU8sRUFBSSxFQUFLLElBQUksR0FFM0IsRUFETixFQUFJLEVBQUssSUFBSSxHQUFPLEVBQUksRUFBSyxJQUFJLEtBR2pELEtBQUssSUFBTyxFQUNSLE9BQVEsRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBRWhDLElBQUssRUFxQ0QsRUFBSyxFQUFVLEdBQ2YsRUFBSyxFQUFVLEdBQ2YsRUFBSyxFQUFVLEdBQ2YsRUFBSyxFQUFVLE9BeENILENBQ1osRUFBSyxFQUFPLEVBQUksR0FBSyxHQUNyQixFQUFLLEVBQUcsRUFDUixFQUFLLEVBQUcsRUFDUixFQUFLLEVBQU8sRUFBSSxHQUFLLEdBQ3JCLEVBQUssRUFBRyxFQUNSLEVBQUssRUFBRyxDQUNSLElBRUksSUFGTSxFQUFLLElBQUksRUFBSyxJQUFNLEdBQ3BCLEVBQUssSUFBSSxFQUFLLElBQU0sSUFDckIsRUFBSyxHQUFNLEdBQ2hCLEdBQUssRUFBSyxHQUFNLEVBQ2hCLEVBQUksRUFBSSxHQUFLLEVBQUssR0FBTSxFQUFJLEdBQUssRUFBSyxFQUN0QyxHQUFJLElBQ0osRUFBSSxFQUFLLEtBQUssR0FDZCxHQUFLLEVBQ0wsR0FBSyxFQUVULElBQUksR0FBTSxFQUFLLEVBQ1gsRUFBTSxFQUFLLEVBQ1gsR0FBSyxHQUFrQixHQUFjLEVBQUksR0FDckMsRUFBSyxLQUFLLEdBQUssRUFBTSxFQUFNLEVBQU0sRUFBSSxFQUFJLEVBQU0sRUFBSSxJQUFNLEVBQU0sRUFBSSxFQUFJLEVBQU0sRUFBSSxLQUNyRixFQUFLLEVBQUksRUFBSyxFQUFJLEdBQU0sRUFBSyxHQUFNLEVBQ25DLEVBQUssR0FBSyxFQUFLLEVBQUksR0FBTSxFQUFLLEdBQU0sRUFDcEMsRUFBSyxFQUFLLE9BQU8sRUFBSyxHQUFNLEdBQUksUUFBUSxJQUN4QyxFQUFLLEVBQUssT0FBTyxFQUFLLEdBQU0sR0FBSSxRQUFRLEdBRTVDLEdBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUN6QixFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUssRUFDekIsRUFBSyxJQUFNLEVBQVUsRUFBTCxFQUFTLEdBQ3pCLEVBQUssSUFBTSxFQUFVLEVBQUwsRUFBUyxHQUNyQixHQUFjLEVBQUssSUFDbkIsR0FBZSxFQUFMLElBRVQsR0FBYyxFQUFLLElBQ3BCLEdBQWUsRUFBTCxHQVFsQixHQUFJLEdBQUssRUFBSyxDQUNkLElBQUksRUFBSSxHQUFNLEVBQU0sQ0FDaEIsR0FBSSxHQUFRLEVBQ1IsRUFBUSxFQUNSLEVBQVEsQ0FDWixHQUFLLEVBQUssR0FBUSxHQUFjLEVBQUssRUFBSyxHQUFLLEdBQy9DLEVBQUssRUFBSyxFQUFLLEVBQUssSUFBSSxHQUN4QixFQUFLLEVBQUssRUFBSyxFQUFLLElBQUksR0FDeEIsRUFBTSxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBTyxFQUFHLEVBQVksRUFBTyxHQUFRLEVBQUksRUFBTyxFQUFJLElBRWxGLEVBQUssRUFBSyxDQUNWLElBQUksR0FBSyxFQUFLLElBQUksR0FDZCxFQUFLLEVBQUssSUFBSSxHQUNkLEVBQUssRUFBSyxJQUFJLEdBQ2QsRUFBSyxFQUFLLElBQUksR0FDZCxFQUFJLEVBQUssSUFBSSxFQUFLLEdBQ2xCLEVBQUssRUFBSSxFQUFJLEVBQUssRUFDbEIsRUFBSyxFQUFJLEVBQUksRUFBSyxFQUNsQixHQUFNLEVBQUksR0FDVixHQUFNLEVBQUssRUFBSyxFQUFJLEVBQUssRUFBSyxHQUM5QixHQUFNLEVBQUssRUFBSyxFQUFJLEVBQUssRUFBSyxHQUM5QixHQUFNLEVBQUksRUFHZCxJQUZBLEVBQUcsR0FBSyxFQUFJLEVBQUcsR0FBSyxFQUFHLEdBQ3ZCLEVBQUcsR0FBSyxFQUFJLEVBQUcsR0FBSyxFQUFHLEdBQ25CLEVBQ0EsT0FBUSxFQUFJLEVBQUksR0FBSSxPQUFPLEVBRTNCLElBQU8sRUFBSSxFQUFJLEdBQUksT0FBTyxHQUFLLE9BQU8sTUFBTSxJQUU1QyxLQUFLLEdBREQsTUFDSyxFQUFJLEVBQUcsRUFBSyxFQUFJLE9BQVEsRUFBSSxFQUFJLElBQ3JDLEVBQU8sR0FBSyxFQUFJLEVBQUksRUFBTyxFQUFJLEVBQUksR0FBSSxFQUFJLEdBQUksR0FBSyxFQUFJLEVBQU8sRUFBSSxHQUFJLEVBQUksRUFBSSxHQUFJLEdBQUssQ0FFNUYsT0FBTyxHQWVmLFFBQVMsR0FBUyxFQUFJLEVBQUksRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFJLEdBSTFDLElBQUssR0FERCxHQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUksRUFBSSxFQUFNLEVBRjFCLEtBQ0EsVUFFSyxFQUFJLEVBQUcsRUFBSSxJQUFLLEVBVXJCLEdBVFMsR0FBTCxHQUNBLEVBQUksRUFBSSxFQUFLLEdBQUssRUFBSyxFQUFJLEVBQzNCLEdBQUssRUFBSSxFQUFLLEVBQUksRUFBSyxFQUFJLEVBQUssRUFBSSxFQUNwQyxFQUFJLEVBQUksRUFBSyxFQUFJLElBRWpCLEVBQUksRUFBSSxFQUFLLEdBQUssRUFBSyxFQUFJLEVBQzNCLEdBQUssRUFBSSxFQUFLLEVBQUksRUFBSyxFQUFJLEVBQUssRUFBSSxFQUNwQyxFQUFJLEVBQUksRUFBSyxFQUFJLEdBRWpCLEVBQUksR0FBSyxNQUFiLENBQ0ksR0FBSSxFQUFJLEdBQUssTUFDVCxRQUdBLElBREosR0FBSyxFQUFJLElBQ0ksRUFBSSxHQUNiLEVBQVEsS0FBSyxPQUlyQixHQUFPLEVBQUksRUFBSSxFQUFJLEVBQUksRUFDdkIsRUFBVyxFQUFLLEtBQUssR0FDakIsRUFBTyxJQUdYLElBQU8sRUFBSSxJQUFhLEVBQUksR0FDeEIsRUFBSSxHQUFNLEVBQUssR0FDZixFQUFRLEtBQUssR0FHYixHQURKLElBQU8sRUFBSSxJQUFhLEVBQUksS0FDZCxFQUFLLEdBQ2YsRUFBUSxLQUFLLEdBT3JCLEtBSEEsR0FFSSxHQUZNLEVBQUksRUFBUSxPQUNsQixFQUFPLEVBRUosS0FDSCxFQUFJLEVBQVEsR0FDWixFQUFLLEVBQUksRUFDVCxFQUFPLEdBQUcsR0FBSyxFQUFLLEVBQUssRUFBSyxFQUFLLEVBQUksRUFBSyxFQUFLLEVBQUksRUFBSyxFQUFJLEVBQUssRUFBSSxFQUFJLEVBQUssRUFBSSxFQUFJLEVBQUksRUFDNUYsRUFBTyxHQUFHLEdBQUssRUFBSyxFQUFLLEVBQUssRUFBSyxFQUFJLEVBQUssRUFBSyxFQUFJLEVBQUssRUFBSSxFQUFLLEVBQUksRUFBSSxFQUFLLEVBQUksRUFBSSxFQUFJLENBVWhHLE9BUEEsR0FBTyxHQUFHLEdBQVEsRUFDbEIsRUFBTyxHQUFHLEdBQVEsRUFDbEIsRUFBTyxHQUFHLEVBQU8sR0FBSyxFQUN0QixFQUFPLEdBQUcsRUFBTyxHQUFLLEVBQ3RCLEVBQU8sR0FBRyxPQUFTLEVBQU8sR0FBRyxPQUFTLEVBQU8sR0FJM0MsS0FBTSxFQUFHLEVBQUssTUFBTSxFQUFHLEVBQU8sSUFBSyxFQUFHLEVBQUssTUFBTSxFQUFHLEVBQU8sS0FDM0QsS0FBTSxFQUFHLEVBQUssTUFBTSxFQUFHLEVBQU8sSUFBSyxFQUFHLEVBQUssTUFBTSxFQUFHLEVBQU8sTUFJakUsUUFBUyxHQUFXLEVBQU0sR0FDdEIsR0FBSSxJQUFPLEdBQVMsRUFBTSxFQUMxQixLQUFLLEdBQVMsRUFBSSxNQUNkLE1BQU8sR0FBVSxFQUFJLE1BeUZ6QixLQUFLLEdBdkZELEdBQUksRUFBZSxHQUNuQixFQUFLLEdBQVMsRUFBZSxHQUM3QixHQUFTLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxFQUFHLEdBQUksRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUksS0FBTSxHQUFJLE1BQzdELEdBQVUsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFJLEVBQUcsR0FBSSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxLQUFNLEdBQUksTUFDOUQsR0FBYyxTQUFVLEVBQU0sRUFBRyxHQUM3QixHQUFJLEdBQUksQ0FDUixLQUFLLEVBQ0QsT0FBUSxJQUFLLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUc1QyxVQURFLEVBQUssS0FBTyxFQUFHLEVBQUcsRUFBRyxNQUFRLEVBQUUsR0FBSyxFQUFFLEdBQUssTUFDckMsRUFBSyxJQUNULElBQUssSUFDRCxFQUFFLEVBQUksRUFBSyxHQUNYLEVBQUUsRUFBSSxFQUFLLEVBQ1gsTUFDSixLQUFLLElBQ0QsR0FBUSxLQUFLLE9BQU8sRUFBSSxNQUFNLEdBQUksRUFBRSxFQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUssTUFBTSxLQUM5RCxNQUNKLEtBQUssSUFDVyxLQUFSLEdBQXVCLEtBQVIsR0FDZixFQUFXLEVBQU4sRUFBRSxFQUFRLEVBQUUsR0FDakIsRUFBVyxFQUFOLEVBQUUsRUFBUSxFQUFFLEtBR2pCLEVBQUssRUFBRSxFQUNQLEVBQUssRUFBRSxHQUVYLEdBQVEsSUFBSyxFQUFJLEdBQUksT0FBTyxFQUFLLE1BQU0sR0FDdkMsTUFDSixLQUFLLElBQ1csS0FBUixHQUF1QixLQUFSLEdBQ2YsRUFBRSxHQUFXLEVBQU4sRUFBRSxFQUFRLEVBQUUsR0FDbkIsRUFBRSxHQUFXLEVBQU4sRUFBRSxFQUFRLEVBQUUsS0FHbkIsRUFBRSxHQUFLLEVBQUUsRUFDVCxFQUFFLEdBQUssRUFBRSxHQUViLEdBQVEsS0FBSyxPQUFPLEVBQUksRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUssR0FBSSxFQUFLLElBQzVELE1BQ0osS0FBSyxJQUNELEVBQUUsR0FBSyxFQUFLLEdBQ1osRUFBRSxHQUFLLEVBQUssR0FDWixHQUFRLEtBQUssT0FBTyxFQUFJLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBSyxHQUFJLEVBQUssR0FBSSxFQUFLLEdBQUksRUFBSyxJQUNsRSxNQUNKLEtBQUssSUFDRCxHQUFRLEtBQUssT0FBTyxFQUFJLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBSyxHQUFJLEVBQUssSUFDaEQsTUFDSixLQUFLLElBQ0QsR0FBUSxLQUFLLE9BQU8sRUFBSSxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUssR0FBSSxFQUFFLEdBQzdDLE1BQ0osS0FBSyxJQUNELEdBQVEsS0FBSyxPQUFPLEVBQUksRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBSyxJQUM1QyxNQUNKLEtBQUssSUFDRCxHQUFRLEtBQUssT0FBTyxFQUFJLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUUsSUFHakQsTUFBTyxLQUVYLEVBQVMsU0FBVSxFQUFJLEdBQ25CLEdBQUksRUFBRyxHQUFHLE9BQVMsRUFBRyxDQUNsQixFQUFHLEdBQUcsT0FFTixLQURBLEdBQUksR0FBSyxFQUFHLEdBQ0wsRUFBRyxRQUNOLEVBQU8sR0FBSyxJQUNaLElBQU8sRUFBTyxHQUFLLEtBQ25CLEVBQUcsT0FBTyxJQUFLLEdBQUksS0FBSyxPQUFPLEVBQUcsT0FBTyxFQUFHLElBRWhELEdBQUcsT0FBTyxFQUFHLEdBQ2IsRUFBSyxFQUFLLEVBQUUsT0FBUSxHQUFNLEVBQUcsUUFBVSxLQUcvQyxFQUFPLFNBQVUsRUFBTyxFQUFPLEVBQUksRUFBSSxHQUMvQixHQUFTLEdBQXdCLEtBQWYsRUFBTSxHQUFHLElBQTRCLEtBQWYsRUFBTSxHQUFHLEtBQ2pELEVBQU0sT0FBTyxFQUFHLEdBQUksSUFBSyxFQUFHLEVBQUcsRUFBRyxJQUNsQyxFQUFHLEdBQUssRUFDUixFQUFHLEdBQUssRUFDUixFQUFHLEVBQUksRUFBTSxHQUFHLEdBQ2hCLEVBQUcsRUFBSSxFQUFNLEdBQUcsR0FDaEIsRUFBSyxFQUFLLEVBQUUsT0FBUSxHQUFNLEVBQUcsUUFBVSxLQUcvQyxLQUNBLEtBQ0EsRUFBUyxHQUNULEVBQU8sR0FDRixFQUFJLEVBQUcsRUFBSyxFQUFLLEVBQUUsT0FBUSxHQUFNLEVBQUcsUUFBVSxHQUFJLEVBQUksRUFBSSxJQUFLLENBQ3BFLEVBQUUsS0FBTyxFQUFTLEVBQUUsR0FBRyxJQUVULEtBQVYsSUFFQSxFQUFPLEdBQUssRUFDWixJQUFPLEVBQU8sRUFBTyxFQUFJLEtBRTdCLEVBQUUsR0FBSyxFQUFZLEVBQUUsR0FBSSxFQUFPLEdBRWYsS0FBYixFQUFPLElBQXVCLEtBQVYsSUFBZSxFQUFPLEdBQUssS0FJbkQsRUFBTyxFQUFHLEdBRU4sSUFDQSxFQUFHLEtBQU8sRUFBUyxFQUFHLEdBQUcsSUFDWCxLQUFWLElBQ0EsRUFBTyxHQUFLLEVBQ1osSUFBTSxFQUFPLEVBQU8sRUFBSSxLQUU1QixFQUFHLEdBQUssRUFBWSxFQUFHLEdBQUksRUFBUSxHQUVsQixLQUFiLEVBQU8sSUFBdUIsS0FBVixJQUNwQixFQUFPLEdBQUssS0FHaEIsRUFBTyxFQUFJLElBRWYsRUFBSyxFQUFHLEVBQUksRUFBTyxFQUFRLEdBQzNCLEVBQUssRUFBSSxFQUFHLEVBQVEsRUFBTyxFQUMzQixJQUFJLEdBQU0sRUFBRSxHQUNSLEVBQU8sR0FBTSxFQUFHLEdBQ2hCLEVBQVMsRUFBSSxPQUNiLEVBQVUsR0FBTSxFQUFLLE1BQ3pCLEdBQU0sRUFBSSxFQUFJLEVBQVMsR0FDdkIsRUFBTSxFQUFJLEVBQUksRUFBUyxHQUN2QixFQUFNLEdBQUssRUFBUSxFQUFJLEVBQVMsS0FBTyxFQUFNLEVBQzdDLEVBQU0sR0FBSyxFQUFRLEVBQUksRUFBUyxLQUFPLEVBQU0sRUFDN0MsRUFBTyxHQUFLLElBQU8sRUFBUSxFQUFLLEVBQVUsS0FBTyxFQUFPLEdBQ3hELEVBQU8sR0FBSyxJQUFPLEVBQVEsRUFBSyxFQUFVLEtBQU8sRUFBTyxHQUN4RCxFQUFPLEVBQUksR0FBTSxFQUFLLEVBQVUsR0FDaEMsRUFBTyxFQUFJLEdBQU0sRUFBSyxFQUFVLEdBS3BDLE1BSEssS0FDRCxFQUFJLE1BQVEsRUFBVSxJQUVuQixHQUFNLEVBQUcsR0FBTSxFQUUxQixRQUFTLEdBQVEsRUFBTSxHQUNuQixJQUFLLEVBQ0QsTUFBTyxFQUVYLElBQUksR0FBRyxFQUFHLEVBQUcsRUFBRyxFQUFJLEVBQUksQ0FFeEIsS0FEQSxFQUFPLEVBQVcsR0FDYixFQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBRWxDLElBREEsRUFBUSxFQUFLLEdBQ1IsRUFBSSxFQUFHLEVBQUssRUFBTSxPQUFRLEVBQUksRUFBSSxHQUFLLEVBQ3hDLEVBQUksRUFBTyxFQUFFLEVBQU0sR0FBSSxFQUFNLEVBQUksSUFDakMsRUFBSSxFQUFPLEVBQUUsRUFBTSxHQUFJLEVBQU0sRUFBSSxJQUNqQyxFQUFNLEdBQUssRUFDWCxFQUFNLEVBQUksR0FBSyxDQUd2QixPQUFPLEdBSVgsUUFBUyxHQUFrQixFQUFLLEdBRTVCLElBQUssR0FERCxNQUNLLEVBQUksRUFBRyxFQUFPLEVBQUksT0FBUSxFQUFPLEdBQUssRUFBSSxFQUFHLEdBQUssRUFBRyxDQUMxRCxHQUFJLEtBQ1MsR0FBSSxFQUFJLEVBQUksR0FBSSxHQUFJLEVBQUksRUFBSSxLQUM1QixHQUFJLEVBQUksR0FBUSxHQUFJLEVBQUksRUFBSSxLQUM1QixHQUFJLEVBQUksRUFBSSxHQUFJLEdBQUksRUFBSSxFQUFJLEtBQzVCLEdBQUksRUFBSSxFQUFJLEdBQUksR0FBSSxFQUFJLEVBQUksSUFFckMsR0FDSyxFQUVNLEVBQU8sR0FBSyxFQUNuQixFQUFFLElBQU0sR0FBSSxFQUFJLEdBQUksR0FBSSxFQUFJLElBQ3JCLEVBQU8sR0FBSyxJQUNuQixFQUFFLElBQU0sR0FBSSxFQUFJLEdBQUksR0FBSSxFQUFJLElBQzVCLEVBQUUsSUFBTSxHQUFJLEVBQUksR0FBSSxHQUFJLEVBQUksS0FMNUIsRUFBRSxJQUFNLEdBQUksRUFBSSxFQUFPLEdBQUksR0FBSSxFQUFJLEVBQU8sSUFRMUMsRUFBTyxHQUFLLEVBQ1osRUFBRSxHQUFLLEVBQUUsR0FDRCxJQUNSLEVBQUUsSUFBTSxHQUFJLEVBQUksR0FBSSxHQUFJLEVBQUksRUFBSSxLQUd4QyxFQUFFLE1BQU0sTUFDQSxFQUFFLEdBQUcsRUFBSSxFQUFJLEVBQUUsR0FBRyxFQUFJLEVBQUUsR0FBRyxHQUFLLElBQ2hDLEVBQUUsR0FBRyxFQUFJLEVBQUksRUFBRSxHQUFHLEVBQUksRUFBRSxHQUFHLEdBQUssR0FDakMsRUFBRSxHQUFHLEVBQUksRUFBSSxFQUFFLEdBQUcsRUFBSSxFQUFFLEdBQUcsR0FBSyxHQUNoQyxFQUFFLEdBQUcsRUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFJLEVBQUUsR0FBRyxHQUFLLEVBQy9CLEVBQUUsR0FBRyxFQUNMLEVBQUUsR0FBRyxJQUlmLE1BQU8sR0Eza0NYLEdBQUksR0FBVSxFQUFRLFVBQ2xCLEVBQUssRUFBSyxHQUNWLEVBQVEsRUFBSyxFQUFFLE1BQ2YsRUFBTSxpQkFDTixFQUFNLGdCQUNOLEVBQVUsV0FDVixFQUFPLEtBQ1AsRUFBSyxFQUFLLEdBQ1YsRUFBTyxFQUFLLElBQ1osRUFBTyxFQUFLLElBQ1osRUFBTSxFQUFLLElBQ1gsRUFBTSxFQUFLLElBMkhYLEVBQWlCLEVBQWlCLEdBQ2xDLEVBQW1CLElBQ25CLEVBQXNCLEVBQWlCLEVBQUcsR0EwVjFDLEVBQVUsRUFBSyxTQUNmLEdBQ0EsS0FBTSxTQUFVLEdBQ1osTUFBTyxHQUFHLEtBQUssU0FFbkIsT0FBUSxTQUFVLEdBQ2QsR0FBSSxHQUFPLEVBQVEsRUFDbkIsT0FBTyxHQUFZLEVBQUssR0FBSSxFQUFLLEdBQUksRUFBSyxJQUU5QyxRQUFTLFNBQVUsR0FDZixHQUFJLEdBQU8sRUFBUSxFQUNuQixPQUFPLEdBQVksRUFBSyxJQUFNLEVBQUcsRUFBSyxJQUFNLEVBQUcsRUFBSyxHQUFJLEVBQUssS0FFakUsS0FBTSxTQUFVLEdBQ1osR0FBSSxHQUFPLEVBQVEsRUFDbkIsT0FBTyxHQUFTLEVBQUssR0FBSyxFQUFHLEVBQUssR0FBSyxFQUFHLEVBQUssTUFBTyxFQUFLLE9BQVEsRUFBSyxHQUFJLEVBQUssS0FFckYsTUFBTyxTQUFVLEdBQ2IsR0FBSSxHQUFPLEVBQVEsRUFDbkIsT0FBTyxHQUFTLEVBQUssR0FBSyxFQUFHLEVBQUssR0FBSyxFQUFHLEVBQUssTUFBTyxFQUFLLFNBRS9ELEtBQU0sU0FBVSxHQUNaLE1BQU8sS0FBTyxFQUFHLEtBQUssT0FBUyxFQUFHLEVBQUcsS0FBSyxPQUFTLEVBQUcsRUFBRyxLQUFLLE1BQU8sRUFBRyxLQUFLLFFBRWpGLFNBQVUsU0FBVSxHQUNoQixNQUFPLElBQU0sRUFBRyxLQUFLLFdBRXpCLFFBQVMsU0FBVSxHQUNmLE1BQU8sSUFBTSxFQUFHLEtBQUssVUFBWSxLQUVyQyxNQUFPLFNBQVUsR0FDYixHQUFJLEdBQU8sRUFBRyxLQUFLLFNBQ25CLE9BQU8sR0FBUyxFQUFLLEVBQUcsRUFBSyxFQUFHLEVBQUssTUFBTyxFQUFLLFNBNmtCekQsR0FBSyxLQUFPLEVBWVosRUFBSyxLQUFLLGVBQWlCLEVBaUIzQixFQUFLLEtBQUssaUJBQW1COzBCQWE3QixFQUFLLEtBQUssV0FBYSxTQUFVLEVBQU0sRUFBTSxHQUN6QyxHQUFJLEtBQUssZUFBZSxHQUFRLEVBQUssS0FDakMsTUFBTyxHQUFvQixFQUFNLEdBQU0sR0FFM0MsSUFBSSxHQUFJLEVBQW9CLEVBQU0sRUFBSSxFQUN0QyxPQUFPLEdBQU8sRUFBb0IsRUFBRyxHQUFNLElBQU0sR0FTckQsRUFBUSxlQUFpQixXQUNyQixHQUFJLEtBQUssS0FBSyxlQUNWLE1BQU8sTUFBSyxLQUFLLGtCQW1CekIsRUFBUSxpQkFBbUIsU0FBVSxHQUNqQyxNQUFPLEdBQWlCLEtBQUssS0FBSyxLQUFNLElBYzVDLEVBQVEsV0FBYSxTQUFVLEVBQU0sR0FDakMsTUFBTyxHQUFLLEtBQUssV0FBVyxLQUFLLEtBQUssS0FBTSxFQUFNLElBRXRELEVBQUssRUFBRSxJQUFNLEVBd0NiLEVBQUssS0FBSyxrQkFBb0IsRUE0QjlCLEVBQUssS0FBSyxXQUFhLEVBYXZCLEVBQUssS0FBSyxrQkFBb0IsRUFDOUIsRUFBSyxRQUFVLFNBQVUsRUFBRyxFQUFHLEVBQUcsR0FnQjlCLElBZkEsR0FBSSxHQUFJLElBQ0osRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFHLEVBQUksRUFBSSxFQUFHLEVBQUcsR0FDakMsS0FDQSxFQUFTLEVBQUUsR0FBRyxlQUFlLEtBQU8sU0FBVSxHQUMxQyxPQUNJLEVBQUcsRUFBRSxHQUFHLEVBQ1IsRUFBRyxFQUFFLEdBQUcsSUFFWixTQUFVLEdBQ1YsT0FDSSxFQUFHLEVBQUUsR0FDTCxFQUFHLEVBQUUsS0FHYixFQUFRLEVBQ0wsR0FBSyxNQUFRLEdBQU8sQ0FDdkIsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUUsT0FBUSxFQUFJLEVBQUksSUFBSyxDQUN4QyxHQUFJLEdBQUssRUFBTyxFQUNoQixJQUFJLEVBQWtCLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBSSxDQUNsQyxJQUNBLEVBQU8sS0FBSyxFQUNaLFFBR0gsSUFDRCxHQUFLLEVBQ0wsRUFBSSxFQUFJLEVBQUksRUFBSSxFQUFHLEVBQUksRUFBSSxFQUFHLEVBQUcsSUFHekMsR0FBUyxLQUFMLEVBQUosQ0FHQSxHQUNJLEdBREEsRUFBTSxFQUFBLENBRVYsS0FBSyxFQUFJLEVBQUcsRUFBSyxFQUFPLE9BQVEsRUFBSSxFQUFJLElBQUssQ0FDekMsR0FBSSxHQUFJLEVBQUssSUFBSSxFQUFHLEVBQUcsRUFBTyxHQUFHLEVBQUcsRUFBTyxHQUFHLEVBQzFDLEdBQU0sSUFDTixFQUFNLEVBQ04sRUFBTyxHQUFHLElBQU0sRUFDaEIsRUFBTSxFQUFPLElBR3JCLE1BQU8sS0FhWCxFQUFLLEtBQUssZ0JBQWtCLEVBd0I1QixFQUFLLEtBQUssYUFBZSxFQUN6QixFQUFLLEtBQUssbUJBQXFCLEVBZS9CLEVBQUssS0FBSyxjQUFnQixFQW1CMUIsRUFBSyxLQUFLLFFBQVUsRUFDcEIsRUFBSyxLQUFLLElBQU0sRUFXaEIsRUFBSyxLQUFLLFdBQWEsRUFXdkIsRUFBSyxLQUFLLFdBQWEsRUFXdkIsRUFBSyxLQUFLLFFBQVUsRUFVcEIsRUFBSyxLQUFLLElBQU0sRUFDaEIsRUFBSyxLQUFLLFNBQVcsRUFDckIsRUFBSyxLQUFLLE1BQVEsSUFnQnRCLEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEdBQ3hDLEdBQUksR0FBTyxLQUFLLElBQ1osRUFBTyxLQUFLLElBR1osRUFBTSxTQUFVLEdBS2hCLEdBSkEsS0FBSyxTQUNaLEtBQUssWUFDRSxLQUFLLE9BQVMsRUFDZCxLQUFLLEtBQU8sTUFDUixFQUNBLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxFQUFNLE9BQVEsRUFBSSxFQUFJLElBQ25DLEVBQU0sS0FDTixLQUFLLEtBQUssTUFBTSxRQUFVLEtBQUssTUFBTSxLQUFLLE1BQU0sUUFBVSxFQUFNLEdBQ2hFLEtBQUssV0FLckIsRUFBVyxFQUFJLFNBUWYsR0FBUyxLQUFPLFdBR1osSUFBSyxHQUZELEdBQ0EsRUFDSyxFQUFJLEVBQUcsRUFBSyxVQUFVLE9BQVEsRUFBSSxFQUFJLEtBQzNDLEVBQU8sVUFBVSxNQUViLEVBQU0sS0FBSyxNQUFNLE9BQ2pCLEtBQUssR0FBTyxLQUFLLE1BQU0sR0FBTyxFQUM5QixLQUFLLFNBR2IsT0FBTyxPQVNYLEVBQVMsSUFBTSxXQUVYLE1BREEsTUFBSyxjQUFpQixNQUFLLEtBQUssVUFDekIsS0FBSyxNQUFNLE9BY3RCLEVBQVMsUUFBVSxTQUFVLEVBQVUsR0FDbkMsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEtBQUssTUFBTSxPQUFRLEVBQUksRUFBSSxJQUM1QyxJQUFpRCxJQUE3QyxFQUFTLEtBQUssRUFBUyxLQUFLLE1BQU0sR0FBSSxHQUN0QyxNQUFPLEtBR2YsT0FBTyxPQXVCWCxFQUFTLFFBQVUsU0FBVSxFQUFPLEVBQUksRUFBUSxHQUN2QixrQkFBVixJQUF5QixFQUFPLFNBQ3ZDLEVBQVcsRUFDWCxFQUFTLEVBQUssUUFFZCxZQUFpQixHQUFLLEVBQUUsWUFDeEIsRUFBVyxFQUFNLFNBQ2pCLEVBQVMsRUFBTSxPQUNmLEVBQUssRUFBTyxJQUNaLEVBQVEsRUFBTSxLQUVsQixJQUFJLEdBQU8sU0FDWCxJQUFJLEVBQUssR0FBRyxFQUFPLFVBQVksRUFBSyxHQUFHLEVBQUssRUFBSyxPQUFTLEdBQUksU0FDMUQsR0FBSSxJQUFPLENBRWYsSUFBSSxHQUNBLEVBQVUsV0FDRixFQUNBLEtBQUssRUFBSSxFQUVULEVBQVEsS0FBSyxHQUdyQixFQUFLLEVBQ0wsRUFBTSxLQUNOLEVBQWEsR0FBWSxhQUNmLEdBQU0sRUFBSSxRQUNaLEVBQVMsS0FBSyxNQUcxQixPQUFPLE1BQUssUUFBUSxTQUFVLEVBQUksR0FDOUIsRUFBSSxLQUFLLG9CQUFzQixFQUFHLEdBQUksR0FDbEMsRUFDQSxFQUFLLElBQU0sRUFBRyxRQUFRLE1BQU0sRUFBSSxFQUFLLElBRXJDLEVBQUcsUUFBUSxFQUFPLEVBQUksRUFBUSxNQVkxQyxFQUFTLE9BQVMsV0FDZCxLQUFPLEtBQUssUUFDUixLQUFLLE1BQU0sUUFFZixPQUFPLE9BcUJYLEVBQVMsS0FBTyxTQUFVLEVBQU0sRUFBRyxHQUMvQixHQUFJLEtBQ0osSUFBZ0Isa0JBQUwsR0FDUCxLQUFLLFNBQVMsR0FBUSxNQUNuQixDQUNILEdBQUksR0FBUSxHQUFLLENBQ2pCLE1BQUssU0FBUyxHQUFRLFNBQVUsR0FDNUIsRUFBSyxHQUFTLEVBQ2QsRUFBRSxLQUFLLElBR2YsTUFBTyxPQVNYLEVBQVMsS0FBTyxTQUFVLEdBQ3RCLEdBQUksS0FDSixLQUFLLEdBQUksS0FBSyxHQUNOLEtBQUssU0FBUyxHQUNkLEtBQUssU0FBUyxHQUFHLEVBQU0sSUFFdkIsRUFBUSxHQUFLLEVBQU0sRUFHM0IsS0FBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEtBQUssTUFBTSxPQUFRLEVBQUksRUFBSSxJQUM1QyxLQUFLLE1BQU0sR0FBRyxLQUFLLEVBRXZCLE9BQU8sT0FRWCxFQUFTLE1BQVEsV0FDYixLQUFPLEtBQUssUUFDUixLQUFLLE9BY2IsRUFBUyxPQUFTLFNBQVUsRUFBTyxFQUFPLEdBQ3RDLEVBQVEsRUFBUSxFQUFJLEVBQUssS0FBSyxPQUFTLEVBQU8sR0FBSyxFQUNuRCxFQUFRLEVBQUssRUFBRyxFQUFLLEtBQUssT0FBUyxFQUFPLEdBQzFDLElBR0ksR0FIQSxLQUNBLEtBQ0EsSUFFSixLQUFLLEVBQUksRUFBRyxFQUFJLFVBQVUsT0FBUSxJQUM5QixFQUFLLEtBQUssVUFBVSxHQUV4QixLQUFLLEVBQUksRUFBRyxFQUFJLEVBQU8sSUFDbkIsRUFBTSxLQUFLLEtBQUssRUFBUSxHQUU1QixNQUFPLEVBQUksS0FBSyxPQUFTLEVBQU8sSUFDNUIsRUFBSyxLQUFLLEtBQUssRUFBUSxHQUUzQixJQUFJLEdBQVMsRUFBSyxNQUNsQixLQUFLLEVBQUksRUFBRyxFQUFJLEVBQVMsRUFBSyxPQUFRLElBQ2xDLEtBQUssTUFBTSxFQUFRLEdBQUssS0FBSyxFQUFRLEdBQUssRUFBSSxFQUFTLEVBQUssR0FBSyxFQUFLLEVBQUksRUFHOUUsS0FEQSxFQUFJLEtBQUssTUFBTSxPQUFTLEtBQUssUUFBVSxFQUFRLEVBQ3hDLEtBQUssVUFDRCxNQUFLLElBRWhCLE9BQU8sSUFBSSxHQUFJLElBV25CLEVBQVMsUUFBVSxTQUFVLEdBQ3pCLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxLQUFLLE9BQVEsRUFBSSxFQUFJLElBQUssR0FBSSxLQUFLLElBQU0sRUFFMUQsTUFEQSxNQUFLLE9BQU8sRUFBRyxJQUNSLENBRVgsUUFBTyxHQVdYLEVBQVMsWUFBYyxTQUFVLEdBRTdCLElBREEsR0FBSSxHQUFJLEtBQUssTUFBTSxPQUNaLEtBQ0gsS0FBSyxNQUFNLEdBQUcsWUFBWSxFQUU5QixPQUFPLE9BU1gsRUFBUyxRQUFVLFdBS2YsSUFBSyxHQUpELE1BQ0EsS0FDQSxLQUNBLEtBQ0ssRUFBSSxLQUFLLE1BQU0sT0FBUSxLQUFNLElBQUssS0FBSyxNQUFNLEdBQUcsUUFBUyxDQUM5RCxHQUFJLEdBQU0sS0FBSyxNQUFNLEdBQUcsU0FDeEIsR0FBRSxLQUFLLEVBQUksR0FDWCxFQUFFLEtBQUssRUFBSSxHQUNYLEVBQUcsS0FBSyxFQUFJLEVBQUksRUFBSSxPQUNwQixFQUFHLEtBQUssRUFBSSxFQUFJLEVBQUksUUFNeEIsTUFKQSxHQUFJLEVBQUssTUFBTSxFQUFHLEdBQ2xCLEVBQUksRUFBSyxNQUFNLEVBQUcsR0FDbEIsRUFBSyxFQUFLLE1BQU0sRUFBRyxHQUNuQixFQUFLLEVBQUssTUFBTSxFQUFHLElBRWYsRUFBRyxFQUNILEVBQUcsRUFDSCxHQUFJLEVBQ0osR0FBSSxFQUNKLE1BQU8sRUFBSyxFQUNaLE9BQVEsRUFBSyxFQUNiLEdBQUksR0FBSyxFQUFLLEdBQUssRUFDbkIsR0FBSSxHQUFLLEVBQUssR0FBSyxJQVczQixFQUFTLE1BQVEsU0FBVSxHQUN2QixFQUFJLEdBQUksRUFDUixLQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssS0FBSyxNQUFNLE9BQVEsRUFBSSxFQUFJLElBQzVDLEVBQUUsS0FBSyxLQUFLLE1BQU0sR0FBRyxRQUV6QixPQUFPLElBRVgsRUFBUyxTQUFXLFdBQ2hCLE1BQU8sY0FFWCxFQUFTLEtBQU8sTUFRaEIsRUFBSyxJQUFNLEVBWVgsRUFBSyxJQUFNLFdBQ1AsR0FBSSxHQUFNLEdBQUksRUFJZCxPQUhJLFdBQVUsUUFDVixFQUFJLEtBQUssTUFBTSxFQUFLLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVyxJQUV2RCxLQWlCZixFQUFLLE9BQU8sU0FBVSxFQUFNLEVBQVMsRUFBTyxHQUt4QyxRQUFTLEdBQVMsR0FDZCxHQUFJLEdBQUksRUFBSyxFQUNiLFFBQVEsRUFBRSxlQUNOLElBQUssSUFBSyxPQUFRLEVBQUcsRUFBRyxFQUN4QixLQUFLLElBQUssT0FBUSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUNwQyxLQUFLLElBQUssTUFBbUIsSUFBZixFQUFLLFFBQ1AsRUFBRyxFQUFHLEVBQUssR0FBSSxFQUFLLEtBRXBCLEVBQUcsRUFFZixLQUFLLElBQUssTUFBbUIsSUFBZixFQUFLLFFBQ1AsRUFBRyxFQUFHLEVBQUcsRUFBSyxHQUFJLEVBQUssSUFDVCxHQUFmLEVBQUssUUFDSixFQUFHLEVBQUcsSUFFTixFQUFHLElBSXZCLFFBQVMsR0FBa0IsRUFBSSxFQUFJLEdBQy9CLEVBQUssR0FBTSxHQUFJLEdBQUssT0FDcEIsRUFBSyxHQUFNLEdBQUksR0FBSyxPQUNwQixFQUFLLEVBQUsscUJBQXFCLEVBQUcseUJBQ2xDLEVBQUssRUFBSyxxQkFBcUIsRUFBRyx3QkFNbEMsS0FMQSxHQUdXLEdBQUcsRUFDVixFQUFLLEVBSkwsRUFBWSxLQUFLLElBQUksRUFBRyxPQUFRLEVBQUcsUUFDbkMsS0FDQSxLQUNBLEVBQUksRUFFRCxFQUFJLEVBQVcsSUFBSyxDQUd2QixHQUZBLEVBQU0sRUFBRyxJQUFNLEVBQVMsRUFBRyxJQUMzQixFQUFNLEVBQUcsSUFBTSxFQUFTLEdBQ3BCLEVBQUksSUFBTSxFQUFJLElBQ1UsS0FBeEIsRUFBSSxHQUFHLGdCQUF5QixFQUFJLElBQU0sRUFBSSxJQUFNLEVBQUksSUFBTSxFQUFJLEtBQzFDLEtBQXhCLEVBQUksR0FBRyxnQkFBeUIsRUFBSSxJQUFNLEVBQUksSUFBTSxFQUFJLElBQU0sRUFBSSxJQUNoRSxDQUNFLEVBQUssRUFBSyxFQUFFLGlCQUFpQixFQUFJLEtBQ2pDLEVBQUssRUFBSyxFQUFFLGlCQUFpQixFQUFJLEtBQ2pDLElBQVMsSUFBSyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsSUFDL0MsSUFBTyxJQUFLLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUM3QyxPQUlSLElBRkEsRUFBSyxNQUNMLEVBQUcsTUFDRSxFQUFJLEVBQUcsRUFBSyxLQUFLLElBQUksRUFBSSxPQUFRLEVBQUksUUFBUyxFQUFJLEVBQUksSUFDdkQsSUFBSyxLQUFRLEVBQUssR0FBRyxHQUFLLEVBQUksSUFDOUIsSUFBSyxLQUFRLEVBQUcsR0FBRyxHQUFLLEVBQUksSUFHcEMsT0FDSSxLQUFNLEVBQVcsR0FDakIsR0FBSSxFQUFXLEdBQ2YsRUFBRyxFQUFRLElBR25CLFFBQVMsR0FBVSxHQUNmLE1BQU8sR0FFWCxRQUFTLEdBQVEsR0FDYixNQUFPLFVBQVUsR0FDYixPQUFRLEVBQUksUUFBUSxHQUFLLEdBR2pDLFFBQVMsR0FBVyxHQUNoQixNQUFPLEdBQUksS0FBSyxLQUVwQixRQUFTLEdBQVUsR0FDZixNQUFPLEdBQUssSUFBSSxFQUFJLEdBQUksRUFBSSxHQUFJLEVBQUksR0FBSSxFQUFJLElBRWhELFFBQVMsR0FBUSxHQUNiLEdBQVcsR0FBRyxFQUFJLEVBQUcsRUFBSSxFQUFLLEVBQTFCLEVBQUksRUFBeUIsSUFDakMsS0FBSyxFQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBQUssQ0FHdkMsSUFGQSxFQUFNLElBQ04sR0FBSyxJQUFNLEVBQUssR0FBRyxHQUFLLEtBQ25CLEVBQUksRUFBRyxFQUFLLEVBQUssR0FBRyxPQUFRLEVBQUksRUFBSSxJQUNyQyxFQUFFLEdBQUssT0FBUyxJQUFNLEdBRTFCLElBQU8sRUFBSSxJQUNYLEVBQUUsR0FBSyxFQUVYLE1BQU8sVUFBUyxNQUFPLG1DQUFxQyxFQUFJLE1BRXBFLFFBQVMsR0FBVyxHQUVoQixJQUFLLEdBREQsTUFDSyxFQUFJLEVBQUcsRUFBSyxFQUFLLE9BQVEsRUFBSSxFQUFJLElBQ3RDLElBQUssR0FBSSxHQUFJLEVBQUcsRUFBSyxFQUFLLEdBQUcsT0FBUSxFQUFJLEVBQUksSUFDekMsRUFBSSxLQUFLLEVBQUssR0FBRyxHQUd6QixPQUFPLEdBRVgsUUFBUyxHQUFVLEdBQ2YsTUFBTyxVQUFTLEdBRXBCLFFBQVMsR0FBVyxFQUFNLEdBQ3RCLFNBQUssRUFBSyxHQUFHLEVBQU0sV0FBYSxFQUFLLEdBQUcsRUFBTSxXQUd2QyxFQUFLLFlBQWMsRUFBSyxXQXRHbkMsR0FBSSxNQUNBLEVBQVMsWUFDVCxFQUFNLE1BQ1YsR0FBTSxPQUFTLEVBQU0sS0FBTyxTQXFHNUIsRUFBUSxVQUFVLE1BQVEsU0FBVSxFQUFNLEdBQ3RDLE1BQU8sR0FBSSxrQkFBbUIsS0FBTSxFQUFNLEdBQUcsZ0JBRWpELEVBQUksR0FBRyxrQkFBbUIsU0FBVSxFQUFNLEdBQ3RDLEdBQUksR0FBRyxFQUFHLEVBQUksRUFBSSxLQUFLLEtBQUssSUFBUyxJQUNqQyxFQUFLLElBQ1QsSUFBbUIsVUFBZixFQUFNLEdBR04sTUFGQSxHQUFJLEVBQUssTUFBTSxHQUNmLEVBQUksRUFBSyxNQUFNLElBRVgsTUFBTyxFQUFFLEVBQUcsRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLFNBQ3hCLElBQUssRUFBRSxFQUFHLEVBQUUsRUFBRyxFQUFFLEVBQUcsRUFBRSxTQUN0QixFQUFHLEVBR1gsSUFBWSxXQUFSLEVBR0EsTUFGQSxHQUFJLEtBQUssS0FBSyxHQUFNLEdBQUcsTUFBTSxLQUFLLElBQUksUUFDdEMsRUFBSSxFQUFFLE1BQU0sS0FBSyxJQUFJLFNBRWpCLEtBQU0sRUFDTixHQUFJLEVBQ0osRUFBRyxFQUdYLElBQVksYUFBUixHQUErQixxQkFBUixHQUF1QyxvQkFBUixFQVV0RCxNQVRnQixnQkFBTCxLQUNQLEVBQUksRUFBSSxHQUFHLFFBQVEsZ0JBQWlCLElBRXhDLEVBQUksS0FBSyxPQUlMLEVBSEMsRUFBSyxFQUFFLFlBQVksS0FBSyxHQUdyQixFQUFLLEVBQUUsaUJBQWlCLEVBQUcsS0FBSyxXQUZoQyxFQUFLLEVBQUUsaUJBQWlCLEVBQUssRUFBRSxvQkFBb0IsR0FBSSxLQUFLLFdBSTdELEVBQWtCLEVBQUcsRUFBRyxXQUMzQixNQUFPLEdBQUcsUUFBUSxJQUcxQixJQUFZLEtBQVIsR0FBdUIsUUFBUixFQUVmLE1BREEsR0FBSSxFQUFLLEtBQUssUUFBUSxFQUFHLElBRXJCLEtBQU0sRUFBVyxFQUFFLElBQ25CLEdBQUksRUFBVyxFQUFFLElBQ2pCLEVBQUcsRUFBUSxFQUFFLElBR3JCLElBQVksVUFBUixFQUdBLE1BRkEsR0FBSSxFQUFJLEdBQUcsTUFBTSxFQUFLLEVBQUUsV0FDeEIsRUFBSSxFQUFJLEdBQUcsTUFBTSxFQUFLLEVBQUUsWUFFcEIsS0FBTSxFQUNOLEdBQUksRUFDSixFQUFHLFNBQVUsR0FBTyxNQUFPLElBR25DLElBQUksRUFBVSxJQUFNLEVBQVUsR0FDMUIsT0FDSSxLQUFNLFdBQVcsR0FDakIsR0FBSSxXQUFXLEdBQ2YsRUFBRyxFQUdYLElBQUksR0FBUSxFQUFFLE1BQU0sR0FDaEIsRUFBUSxFQUFJLEdBQUcsTUFBTSxFQUN6QixPQUFJLElBQVMsRUFBVyxFQUFPLElBRXZCLEtBQU0sV0FBVyxHQUNqQixHQUFJLFdBQVcsR0FDZixFQUFHLEVBQVEsS0FJWCxLQUFNLEtBQUssS0FBSyxHQUNoQixHQUFJLEtBQUssS0FBSyxFQUFNLEdBQ3BCLEVBQUcsT0FtQm5CLEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEdBbVR4QyxJQUFLLEdBbFRELEdBQVUsRUFBUSxVQUV0QixHQUFnQixlQUFpQixHQUFLLEtBQ3RDLEdBQ0ksUUFBUyxXQUFZLFlBQWEsWUFBYSxXQUMvQyxZQUFhLFVBQVcsYUFBYyxZQUFhLFdBQ25ELGVBRUosR0FDSSxVQUFXLGFBQ1gsVUFBVyxZQUNYLFFBQVMsWUFFYixHQUFZLFNBQVUsRUFBSSxHQUN0QixHQUFJLEdBQWEsS0FBTixFQUFZLFlBQWMsYUFDakMsRUFBTSxHQUFNLEVBQUcsS0FBTyxFQUFHLEtBQUssY0FBZ0IsRUFBSyxHQUN2RCxPQUFPLEdBQUksSUFBUSxHQUFJLGdCQUFrQixrQkFBb0IsUUFBUSxLQUt6RSxFQUFlLFdBQ1gsTUFBTyxNQUFLLGNBQWMsa0JBSzlCLEVBQVksV0FDUixNQUFPLE1BQUssY0FBYyxtQkFFOUIsRUFBVyxTQUFVLEVBQUssRUFBTSxFQUFJLEdBQ2hDLEdBQUksR0FBVyxHQUFpQixFQUFTLEdBQVEsRUFBUyxHQUFRLEVBQzlELEVBQUksU0FBVSxHQUNWLEdBQUksR0FBVSxFQUFVLElBQUssR0FDekIsRUFBVSxFQUFVLElBQUssRUFDN0IsSUFBSSxHQUFpQixFQUFZLGVBQUUsR0FDL0IsSUFBSyxHQUFJLEdBQUksRUFBRyxFQUFLLEVBQUUsZUFBaUIsRUFBRSxjQUFjLE9BQVEsRUFBSSxFQUFJLElBQ3BFLEdBQUksRUFBRSxjQUFjLEdBQUcsUUFBVSxHQUFPLEVBQUksU0FBUyxFQUFFLGNBQWMsR0FBRyxRQUFTLENBQzdFLEdBQUksR0FBTyxDQUNYLEdBQUksRUFBRSxjQUFjLEdBQ3BCLEVBQUUsY0FBZ0IsRUFDbEIsRUFBRSxlQUFpQixFQUNuQixFQUFFLGdCQUFrQixDQUNwQixPQUlaLEdBQUksR0FBSSxFQUFFLFFBQVUsRUFDaEIsRUFBSSxFQUFFLFFBQVUsQ0FDcEIsT0FBTyxHQUFHLEtBQUssRUFBUyxFQUFHLEVBQUcsR0FTdEMsT0FOSSxLQUFTLEdBQ1QsRUFBSSxpQkFBaUIsRUFBTSxHQUFHLEdBR2xDLEVBQUksaUJBQWlCLEVBQVUsR0FBRyxHQUUzQixXQU1ILE1BTEksS0FBUyxHQUNULEVBQUksb0JBQW9CLEVBQU0sR0FBRyxHQUdyQyxFQUFJLG9CQUFvQixFQUFVLEdBQUcsSUFDOUIsSUFHZixLQUNBLEVBQVcsU0FBVSxHQU9qQixJQU5BLEdBSUksR0FKQSxFQUFJLEVBQUUsUUFDTixFQUFJLEVBQUUsUUFDTixFQUFVLEVBQVUsS0FDcEIsRUFBVSxFQUFVLEtBRXBCLEVBQUksRUFBSyxPQUNOLEtBQUssQ0FFUixHQURBLEVBQVEsRUFBSyxHQUNULEdBR0EsSUFGQSxHQUNJLEdBREEsRUFBSSxFQUFFLFNBQVcsRUFBRSxRQUFRLE9BRXhCLEtBRUgsR0FEQSxFQUFRLEVBQUUsUUFBUSxHQUNkLEVBQU0sWUFBYyxFQUFNLEdBQUcsTUFBTSxJQUFNLEVBQU0sR0FBRyxLQUFLLFNBQVMsRUFBTSxRQUFTLENBQy9FLEVBQUksRUFBTSxRQUNWLEVBQUksRUFBTSxTQUNULEVBQUUsY0FBZ0IsRUFBRSxjQUFnQixHQUFHLGdCQUN4QyxZQUlSLEdBQUUsZ0JBRU4sSUFBSSxHQUFPLEVBQU0sR0FBRyxJQUVULEdBQUssWUFDSCxFQUFLLFdBQ0osRUFBSyxNQUFNLE9BT3pCLElBQUssRUFDTCxHQUFLLEVBQ0wsRUFBSSxrQkFBb0IsRUFBTSxHQUFHLEdBQUksRUFBTSxZQUFjLEVBQU0sR0FBSSxFQUFJLEVBQU0sR0FBRyxNQUFNLEVBQUcsRUFBSSxFQUFNLEdBQUcsTUFBTSxFQUFHLEVBQUcsRUFBRyxLQUc3SCxFQUFTLFNBQVUsR0FDZixFQUFLLFlBQVksR0FBVSxVQUFVLEVBR3JDLEtBRkEsR0FDSSxHQURBLEVBQUksRUFBSyxPQUVOLEtBQ0gsRUFBUSxFQUFLLEdBQ2IsRUFBTSxHQUFHLFNBQ1QsRUFBSSxpQkFBbUIsRUFBTSxHQUFHLEdBQUksRUFBTSxXQUFhLEVBQU0sYUFBZSxFQUFNLFlBQWMsRUFBTSxHQUFJLEdBQzFHLEVBQUksSUFBSSxlQUFpQixFQUFNLEdBQUcsR0FFdEMsT0E0TEssRUFBSSxFQUFPLE9BQVEsTUFDeEIsU0FBVyxHQUNQLEVBQUssR0FBYSxFQUFRLEdBQWEsU0FBVSxFQUFJLEdBQ2pELEdBQUksRUFBSyxHQUFHLEVBQUksWUFDWixLQUFLLE9BQVMsS0FBSyxXQUNuQixLQUFLLE9BQU8sTUFDUixLQUFNLEVBQ04sRUFBRyxFQUNILE9BQVEsRUFBUyxLQUFLLE1BQVEsU0FBVSxFQUFXLEVBQUksR0FBUyxZQUdwRSxLQUFLLEdBQUksR0FBSSxFQUFHLEVBQUssS0FBSyxPQUFPLE9BQVEsRUFBSSxFQUFJLElBQUssR0FBSSxLQUFLLE9BQU8sR0FBRyxNQUFRLEVBQzdFLElBQ0ksS0FBSyxPQUFPLEdBQUcsRUFBRSxLQUFLLE1BQ3hCLE1BQU8sSUFHakIsTUFBTyxPQUVYLEVBQUssS0FBTyxHQUNaLEVBQVEsS0FBTyxHQUFhLFNBQVUsR0FHbEMsSUFGQSxHQUFJLEdBQVMsS0FBSyxXQUNkLEVBQUksRUFBTyxPQUNSLEtBQUssR0FBSSxFQUFPLEdBQUcsTUFBUSxJQUNsQixFQUFPLEdBQUcsR0FBSyxJQUFPLEdBSWxDLE1BSEEsR0FBTyxHQUFHLFNBQ1YsRUFBTyxPQUFPLEVBQUcsSUFDaEIsRUFBTyxjQUFpQixNQUFLLE9BQ3ZCLElBRVgsT0FBTyxRQUVaLEVBQU8sR0FhZCxHQUFRLE1BQVEsU0FBVSxFQUFNLEVBQU8sRUFBVSxHQUM3QyxNQUFPLE1BQUssVUFBVSxFQUFNLEdBQVUsU0FBUyxFQUFPLEdBQWEsSUFXdkUsRUFBUSxRQUFVLFNBQVUsRUFBTSxHQUM5QixNQUFPLE1BQUssWUFBWSxHQUFNLFdBQVcsR0FFN0MsSUFBSSxLQW1DSixHQUFRLEtBQU8sU0FBVSxFQUFRLEVBQVMsRUFBTyxFQUFZLEVBQWEsR0FZdEUsUUFBUyxHQUFNLEVBQUcsRUFBRyxJQUNoQixFQUFFLGVBQWlCLEdBQUcsaUJBQ3ZCLEVBQUcsTUFBTSxFQUFJLEVBQ2IsRUFBRyxNQUFNLEVBQUksRUFDYixFQUFHLE1BQU0sR0FBSyxFQUFFLFlBQ2YsRUFBSyxRQUFVLEVBQUssVUFBVSxHQUFVLFFBQVEsR0FDakQsRUFBSyxNQUFNLEdBQUksRUFBSSxXQUFZLEVBQVksWUFBYSxFQUFhLFVBQVcsSUFDaEYsR0FBVyxFQUFJLEdBQUcsbUJBQXFCLEVBQUcsR0FBSSxHQUM5QyxHQUFVLEVBQUksR0FBRyxrQkFBb0IsRUFBRyxHQUFJLEdBQzVDLEdBQVMsRUFBSSxHQUFHLGlCQUFtQixFQUFHLEdBQUksR0FDMUMsRUFBSSxtQkFBcUIsRUFBRyxHQUFJLEdBQWUsR0FBYyxFQUFJLEVBQUcsRUFBRyxHQUUzRSxRQUFTLEdBQUssRUFBRyxFQUFHLEdBQ2hCLEVBQUksaUJBQW1CLEVBQUcsR0FBSSxFQUFJLEVBQUcsRUFBRyxHQXhCNUMsR0FBSSxHQUFLLElBQ1QsS0FBSyxVQUFVLE9BQVEsQ0FDbkIsR0FBSSxFQUNKLE9BQU8sR0FBRyxLQUFLLFNBQVUsRUFBSSxHQUN6QixLQUFLLE1BQ0QsVUFBVyxHQUFpQixFQUFnQixJQUFNLE1BQVEsRUFBSSxNQUVuRSxXQUNDLEVBQWdCLEtBQUssWUFBWSxRQXNCekMsTUFKQSxHQUFJLEdBQUcsaUJBQW1CLEVBQUcsR0FBSSxHQUNqQyxFQUFHLFNBQ0gsRUFBVSxNQUFNLEdBQUksRUFBSSxNQUFPLEVBQU8sS0FBTSxJQUM1QyxFQUFHLFVBQVUsR0FDTixHQWtCWCxFQUFRLE9BQVMsV0FFYixJQURBLEdBQUksR0FBSSxFQUFVLE9BQ1gsS0FBUyxFQUFVLEdBQUcsSUFBTSxPQUMvQixLQUFLLFlBQVksRUFBVSxHQUFHLE1BQzlCLEVBQVUsT0FBTyxFQUFHLEdBQ3BCLEVBQUksT0FBTyxlQUFpQixLQUFLLElBQ2pDLEVBQUksT0FBTyxpQkFBbUIsS0FBSyxJQUd2QyxRQURDLEVBQVUsUUFBVSxFQUFLLFlBQVksR0FBVSxVQUFVLEdBQ25ELFFBaUJmLEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEdBQ3hDLEdBQ0ksSUFEVSxFQUFRLFVBQ1QsRUFBTSxXQUNmLEVBQVEsa0JBQ1IsRUFBTSxPQUNOLEVBQUksRUFBSyxFQUFFLENBQ2YsR0FBSyxVQWdCTCxFQUFPLE9BQVMsU0FBVSxHQUN0QixHQUFJLEdBQVEsSUFDTSxRQUFkLEVBQU0sT0FDTixFQUFRLEVBQU0sTUFFbEIsSUFBSSxHQUFJLEVBQUssTUFBTSxFQUFJLElBQ25CLEVBQUssRUFBSyxFQUFFLEtBR1osR0FGUSxFQUFNLEtBQUssWUFDVixFQUFNLEtBQUssYUFDWCxFQUFFLFVBT2YsT0FOQSxHQUFFLEdBQ0UsR0FBSSxFQUNKLFlBQWEsbUJBRWpCLEVBQU8sWUFBWSxFQUFFLE1BQ3JCLEVBQU0sS0FBSyxZQUFZLEdBQ2hCLEdBQUksR0FBUSxJQUd2QixFQUFJLEdBQUcsMkJBQTRCLFdBQy9CLEVBQUksTUFDSixJQUFJLEdBQUksRUFBRSxLQUFLLEtBQU0sU0FDckIsSUFBSSxFQUFHLENBQ0gsR0FBSSxHQUFRLEVBQUksR0FBRyxNQUFNLEVBQ3pCLE9BQU8sSUFBUyxFQUFLLE9BQU8sRUFBTSxPQUcxQyxFQUFJLEdBQUcsd0JBQXlCLFNBQVUsR0FDdEMsR0FBSSxZQUFpQixJQUF5QixVQUFkLEVBQU0sS0FBa0IsQ0FDcEQsRUFBSSxNQUNKLElBQUksR0FBSyxFQUFNLEtBQUssRUFDZixLQUNELEVBQUUsRUFBTSxNQUFPLEdBQUksRUFBTSxLQUN6QixFQUFLLEVBQU0sSUFFZixFQUFFLEtBQUssTUFDSCxPQUFRLEVBQUssSUFBSSxLQUdwQixHQUFrQixRQUFULElBQ1YsRUFBSSxPQUNKLEtBQUssS0FBSyxnQkFBZ0IsYUFrQmxDLEVBQUssT0FBTyxLQUFPLFNBQVUsRUFBRyxHQUNuQixNQUFMLElBQ0EsRUFBSSxFQUVSLElBQUksR0FBVyxNQUFMLEVBQVksR0FBSyxFQUFHLEVBQzlCLE9BQU8sR0FBSyxPQUFPLDBDQUNmLElBQUssS0FHYixFQUFLLE9BQU8sS0FBSyxTQUFXLFdBQ3hCLE1BQU8sU0E2QlgsRUFBSyxPQUFPLE9BQVMsU0FBVSxFQUFJLEVBQUksRUFBTSxFQUFPLEdBMEJoRCxNQXpCZSxPQUFYLElBQ2EsTUFBVCxHQUNBLEVBQVUsRUFDVixFQUFPLEVBQ1AsRUFBUSxTQUVSLEVBQVUsRUFDVixFQUFRLEVBQ1IsRUFBTyxJQUdILE1BQVIsSUFDQSxFQUFPLEdBRUksTUFBWCxJQUNBLEVBQVUsR0FFSixNQUFOLElBQ0EsRUFBSyxFQUNMLEVBQUssR0FFQyxNQUFOLElBQ0EsRUFBSyxHQUVULEVBQVEsRUFBSyxNQUFNLEdBQ1osRUFBSyxPQUFPLG1WQUNmLE1BQU8sRUFDUCxHQUFJLEVBQ0osR0FBSSxFQUNKLEtBQU0sRUFDTixRQUFTLEtBR2pCLEVBQUssT0FBTyxPQUFPLFNBQVcsV0FDMUIsTUFBTyxTQVdYLEVBQUssT0FBTyxVQUFZLFNBQVUsR0FJOUIsTUFIYyxPQUFWLElBQ0EsRUFBUyxHQUVOLEVBQUssT0FBTyxxR0FDZixFQUFHLE1BQVMsT0FBVSxFQUFJLEdBQzFCLEVBQUcsTUFBUyxPQUFVLEVBQUksR0FDMUIsRUFBRyxNQUFTLE9BQVUsRUFBSSxHQUMxQixFQUFHLE1BQVMsT0FBVSxFQUFJLEdBQzFCLEVBQUcsTUFBUyxPQUFVLEVBQUksR0FDMUIsRUFBRyxNQUFTLE9BQVUsRUFBSSxHQUMxQixFQUFHLE1BQVMsT0FBVSxFQUFJLEdBQzFCLEVBQUcsTUFBUyxPQUFVLEVBQUksTUFHbEMsRUFBSyxPQUFPLFVBQVUsU0FBVyxXQUM3QixNQUFPLFNBV1gsRUFBSyxPQUFPLE1BQVEsU0FBVSxHQUkxQixNQUhjLE9BQVYsSUFDQSxFQUFTLEdBRU4sRUFBSyxPQUFPLHFHQUNmLEVBQUcsS0FBUSxNQUFTLEVBQUksR0FDeEIsRUFBRyxLQUFRLE1BQVMsRUFBSSxHQUN4QixFQUFHLEtBQVEsTUFBUyxFQUFJLEdBQ3hCLEVBQUcsS0FBUSxNQUFTLEVBQUksR0FDeEIsRUFBRyxLQUFRLE1BQVMsRUFBSSxHQUN4QixFQUFHLEtBQVEsTUFBUyxFQUFJLEdBQ3hCLEVBQUcsS0FBUSxNQUFTLEVBQUksR0FDeEIsRUFBRyxLQUFRLE1BQVMsRUFBSSxHQUN4QixFQUFHLEtBQVEsTUFBUyxFQUFJLE1BR2hDLEVBQUssT0FBTyxNQUFNLFNBQVcsV0FDekIsTUFBTyxTQVdYLEVBQUssT0FBTyxTQUFXLFNBQVUsR0FJN0IsTUFIYyxPQUFWLElBQ0EsRUFBUyxHQUVOLEVBQUssT0FBTyxzREFDZixPQUFRLEVBQUksS0FHcEIsRUFBSyxPQUFPLFNBQVMsU0FBVyxXQUM1QixNQUFPLFNBV1gsRUFBSyxPQUFPLFVBQVksU0FBVSxHQUU5QixNQURBLEdBQVEsR0FBUyxFQUNWLEVBQUssT0FBTyxzREFDZixNQUFPLEtBR2YsRUFBSyxPQUFPLFVBQVUsU0FBVyxXQUM3QixNQUFPLFNBV1gsRUFBSyxPQUFPLE9BQVMsU0FBVSxHQUszQixNQUpjLE9BQVYsSUFDQSxFQUFTLEdBR04sRUFBSyxPQUFPLHVOQUNmLE9BQVEsRUFDUixRQUFTLEVBQUksS0FHckIsRUFBSyxPQUFPLE9BQU8sU0FBVyxXQUMxQixNQUFPLFNBV1gsRUFBSyxPQUFPLFdBQWEsU0FBVSxHQUkvQixNQUhjLE9BQVYsSUFDQSxFQUFTLEdBRU4sRUFBSyxPQUFPLDBLQUNmLE9BQVEsS0FHaEIsRUFBSyxPQUFPLFdBQVcsU0FBVyxXQUM5QixNQUFPLFNBV1gsRUFBSyxPQUFPLFNBQVcsU0FBVSxHQUk3QixNQUhjLE9BQVYsSUFDQSxFQUFTLEdBRU4sRUFBSyxPQUFPLDRPQUNmLE9BQVEsRUFDUixRQUFTLEdBQUssRUFBUyxLQUcvQixFQUFLLE9BQU8sU0FBUyxTQUFXLFdBQzVCLE1BQU8sV0FpQmYsRUFBSyxPQUFPLFNBQVUsRUFBTSxFQUFTLEVBQU8sRUFBTSxHQUM5QyxHQUFJLEdBQU0sRUFBSyxFQUFFLElBQ2IsRUFBSyxFQUFLLEdBQ1YsRUFBYyxzQkFDZCxFQUFXLFdBQ1AsTUFBTyxJQUFNLEtBQUssR0FBSyxJQUFNLEtBQUssR0FnQjFDLEdBQVEsVUFBVSxTQUFXLFNBQVUsRUFBSSxHQUM1QixNQUFQLEdBQWUsRUFBRyxFQUFJLFlBQ3RCLEVBQU0sRUFDTixFQUFLLE1BRVQsRUFBSyxHQUFNLEtBQUssS0FDaEIsSUFBSSxHQUFLLEVBQUcsUUFBVSxFQUFHLFVBQVksRUFBSSxHQUNyQyxFQUFLLEtBQUssVUFDVixJQUdKLFFBRkEsRUFBTSxHQUFPLEVBQUksTUFBTSxHQUN2QixFQUFNLEVBQU0sRUFBSSxHQUFHLGNBQWdCLEtBRS9CLElBQUssSUFDRCxFQUFJLEdBQUssRUFDVCxFQUFJLEdBQUssRUFBRyxFQUFJLEVBQUcsQ0FDdkIsTUFDQSxLQUFLLElBQ0QsRUFBSSxHQUFLLEVBQ1QsRUFBSSxHQUFLLEVBQUcsR0FBSyxFQUFHLEVBQ3hCLE1BQ0EsS0FBSyxJQUNELEVBQUksR0FBSyxFQUNULEVBQUksR0FBSyxFQUFHLEdBQUssRUFBRyxFQUN4QixNQUNBLEtBQUssSUFDRCxFQUFJLEdBQUssRUFBRyxFQUFJLEVBQUcsRUFDbkIsRUFBSSxHQUFLLENBQ2IsTUFDQSxLQUFLLElBQ0QsRUFBSSxHQUFLLEVBQUcsR0FBSyxFQUFHLEdBQ3BCLEVBQUksR0FBSyxDQUNiLE1BQ0EsU0FDSSxFQUFJLEdBQUssRUFBRyxHQUFLLEVBQUcsR0FDcEIsRUFBSSxHQUFLLEVBSWpCLE1BREEsR0FBSSxTQUFXLEVBQ1IsR0FnQlgsRUFBUSxVQUFVLE1BQVEsU0FBVSxFQUFJLEdBQ3BDLE1BQU8sTUFBSyxVQUFVLE1BQVEsS0FBSyxTQUFTLEVBQUksT0FpQnhELEVBQUssT0FBTyxTQUFVLEVBQU0sRUFBUyxFQUFPLEdBdUN4QyxRQUFTLEdBQVUsR0FDZixFQUFTLEVBQU8sTUFBTSxRQUN0QixJQUFJLEdBQVEsR0FBSSxRQUFPLEVBQU8sR0FpQjlCLE9BaEJBLEdBQU0sSUFBTSxFQUFPLEdBQ25CLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ3BCLEVBQU0sS0FBTyxFQUFPLEdBQ2hCLEVBQU8sTUFDUCxFQUFNLEtBQU8sRUFBTyxJQUNwQixFQUFNLEtBQU8sRUFBTyxJQUNwQixFQUFNLEtBQU8sRUFBTyxJQUNwQixFQUFNLEtBQU8sRUFBTyxLQUVqQixFQTdCWCxFQUFLLE9BU0wsRUFBSyxRQXNCTCxFQUFLLElBQUksSUFBTSxFQTFERyxzR0EyRGxCLEVBQUssSUFBSSxLQUFPLEVBMURFLHNHQTJEbEIsRUFBSyxJQUFJLE9BQVMsRUExREEsc0dBMkRsQixFQUFLLElBQUksV0FBYSxFQTFESixzR0EyRGxCLEVBQUssSUFBSSxPQUFTLEVBMURBLHNHQTJEbEIsRUFBSyxJQUFJLEtBQU8sRUExREUsc0dBMkRsQixFQUFLLElBQUksVUFBWSxFQTFESCxzR0EyRGxCLEVBQUssSUFBSSxLQUFPLEVBMURFLHNHQTJEbEIsRUFBSyxJQUFJLEtBQU8sRUExREUsc0dBMkRsQixFQUFLLElBQUksTUFBUSxFQTFEQyxzR0EyRGxCLEVBQUssSUFBSSxXQUFhLEVBMURKLHNHQTJEbEIsRUFBSyxJQUFJLEtBQU8sRUExREUsc0dBMkRsQixFQUFLLElBQUksT0FBUyxFQTFEQSxzR0EyRGxCLEVBQUssSUFBSSxNQUFRLEVBMURDLHNHQTJEbEIsRUFBSyxJQUFJLE9BQVMsRUExREEsc0dBMkRsQixFQUFLLElBQUksV0FBYSxFQTFESixzR0EyRGxCLEVBQUssSUFBSSxNQUFRLEVBMURDLDBFQTJEbEIsRUFBSyxJQUFJLEtBQU8sRUExREUsMEVBMkRsQixFQUFLLElBQUksU0FBVyxFQTFERiwwRUEyRGxCLEVBQUssS0FBSyxVQUFZLFVBQ3RCLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxVQUFZLFVBQ3RCLEVBQUssS0FBSyxPQUFTLFVBQ25CLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxVQUFZLFVBQ3RCLEVBQUssS0FBSyxPQUFTLFVBQ25CLEVBQUssS0FBSyxRQUFVLFVBQ3BCLEVBQUssS0FBSyxXQUFhLFVBQ3ZCLEVBQUssS0FBSyxXQUFhLFVBQ3ZCLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxZQUFjLFVBQ3hCLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxPQUFTLFVBQ25CLEVBQUssS0FBSyxPQUFTLFVBQ25CLEVBQUssS0FBSyxXQUFhLFVBQ3ZCLEVBQUssS0FBSyxhQUFlLFVBQ3pCLEVBQUssS0FBSyxTQUFXLFVBQ3JCLEVBQUssS0FBSyxTQUFXLFVBVXJCLEVBQUssZ0JBQWtCLFdBQ25CLElBQUssR0FBSSxLQUFTLEdBQUssSUFDZixFQUFLLElBQUksZUFBZSxLQUN4QixFQUFPLEdBQVMsRUFBSyxJQUFJLE9BTWxDOzs7QUNwN1FQLFlBRUEsSUFBSSxNQUFPLFFBQVEsaUJBQ2YsUUFBVSxLQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxTQUdwRCxlQUFpQixvSkFHckIsUUFBTyxRQUFVLFdBQ2hCLE1BQU8sU0FBUSxLQUFNLGVBQWdCOzs7QUNWdEMsWUFFQSxJQUFJLE1BQU8sUUFBUSxpQkFDZixPQUFTLFFBQVEscUJBRWpCLGVBQWlCLFFBQVEsb0JBQ3pCLFlBQWMsUUFBUSxjQUN0QixLQUFPLFFBQVEsVUFFZixNQUFRLEtBQUssS0FBSyxTQUFTLEtBQU0sY0FFckMsUUFBTyxPQUNOLFlBQWEsWUFDYixlQUFnQixlQUNoQixLQUFNLE9BR1AsT0FBTyxRQUFVOzs7QUNqQmpCLFlBRUEsSUFBSSxnQkFBaUIsUUFBUSxtQkFFN0IsUUFBTyxRQUFVLFdBQ2hCLElBQUssT0FBTyxVQUFVLFNBQ3JCLE1BQU8sZUFFUixJQUFJLEdBQWlCLEdBQ3JCLE9BQUksR0FBZSxhQUFlLEVBQzFCLGVBRUQsT0FBTyxVQUFVOzs7QUNaekIsWUFFQSxJQUFJLFFBQVMsUUFBUSxxQkFDakIsWUFBYyxRQUFRLGFBRTFCLFFBQU8sUUFBVSxXQUNoQixHQUFJLEdBQVcsYUFNZixPQUxBLFFBQ0MsT0FBTyxXQUNMLFNBQVUsSUFDVixTQUFVLFdBQWMsTUFBTyxRQUFPLFVBQVUsV0FBYSxLQUV6RDs7O0FDWlIsWUFFQSxJQUFJLE1BQU8sUUFBUSxpQkFDZixRQUFVLEtBQUssS0FBSyxTQUFTLEtBQU0sT0FBTyxVQUFVLFNBR3BELGdCQUFrQixvSkFHdEIsUUFBTyxRQUFVLFdBQ2hCLE1BQU8sU0FBUSxLQUFNLGdCQUFpQjs7Ozs7QUNWdkMsWUFFQSxJQUFJLGdCQUFpQixRQUFRLG1CQUU3QixRQUFPLFFBQVUsV0FDaEIsSUFBSyxPQUFPLFVBQVUsVUFDckIsTUFBTyxlQUVSLElBQUksR0FBaUIsR0FDckIsT0FBSSxHQUFlLGNBQWdCLEVBQzNCLGVBRUQsT0FBTyxVQUFVOzs7QUNaekIsWUFFQSxJQUFJLFFBQVMsUUFBUSxxQkFDakIsWUFBYyxRQUFRLGFBRTFCLFFBQU8sUUFBVSxXQUNoQixHQUFJLEdBQVcsYUFNZixPQUxBLFFBQ0MsT0FBTyxXQUNMLFVBQVcsSUFDWCxVQUFXLFdBQWMsTUFBTyxRQUFPLFVBQVUsWUFBYyxLQUUzRDs7O3FGQ1pSLEdBQUEsZUFBQSxRQUFBLGdGQUNBLG9CQUFBLFFBQUEsbUdBQ0EsV0FBQSxRQUFBLHVFQUdNLEtBQU8sV0FJWCxJQUhBLEdBQUksc0JBQUEsU0FBcUIsT0FDekIsWUFBQSxRQUFVLE9BRVAsT0FBTyxhQUFlLE9BQU8sYUFBZSxPQUFPLFNBQVUsQ0FDOUQsR0FBTSxHQUFNLEdBQUksZ0JBQUEsUUFBYSxPQUFPLFlBQWEsT0FBTyxZQUFhLE9BQU8sVUFDdEUsRUFBUyxTQUFTLGVBQWUsZ0JBQ3BDLElBQVEsRUFBSSxPQUFPLElBSTFCLFFBQVEsU0FBUyxZQUNmLElBQUssVUFDSCxpQkFBaUIsbUJBQW9CLFdBQUEsTUFBTSxTQUMzQyxNQUNGLFNBQ0UsT0FHSixRQUFRLElBQVI7OztvZkNRQSxTQUFBLFFBQUEsc0RBQ0EsVUFBQSxRQUFBLHlEQUNBLGdCQUFBLFFBQUEsb0ZBQ0EsVUFBQSxRQUFBLDJEQUNBLFlBQUEsUUFBQSxpRUFDQSxhQUFBLFFBQUEsb0VBS0UsS0FNRSxLQU5GLEtBQ0EsTUFLRSxLQUxGLE1BQ0EsSUFJRSxLQUpGLElBQ0EsSUFHRSxLQUhGLElBQ0EsS0FFRSxLQUZGLEtBQ0Esb0JBR0ksd0JBQ0osUUFBQSxLQUFvRCxHQUF4QyxHQUF3QyxVQUFBLE9BQUEsT0FBQSxLQUFBLFVBQUEsR0FBQSxVQUFBLE1BQTdCLEVBQTZCLFVBQUEsT0FBQSxPQUFBLEtBQUEsVUFBQSxHQUFBLFVBQUEsTUFBZixFQUFlLFVBQUEsT0FBQSxPQUFBLEtBQUEsVUFBQSxHQUFBLFVBQUEsT0FBQSxFQUFBLGlCQUFBLFNBQUEsS0FBQSxHQUNsRCxLQUFLLE1BQVEsRUFDYixLQUFLLE9BQVMsRUFDZCxLQUFLLGFBQWUsSUFDcEIsS0FBSyxNQUFPLEVBQUEsVUFBQSxTQUFLLEtBQUssTUFBTyxLQUFLLFFBQ2xDLEtBQUssTUFBUSxFQUNiLEtBQUssU0FBVyxFQUNoQixLQUFLLFVBQVksRUFFakIsS0FBSyxVQUFZLEtBQUssS0FBSyxFQUFLLFNBRWhDLEtBQUssY0FBZ0IsR0FFckIsS0FBSyxRQUFTLEVBQ2QsS0FBSyxrQkFBb0IsSUFDekIsS0FBSyxrQkFBb0IsSUFDekIsS0FBSyxZQUFjLEdBQ25CLEtBQUssYUFBZSxHQUVwQixLQUFLLFlBQWMsRUFFbkIsS0FBSyxNQUFRLHFCQUlmLGdCQUFPLEdBQVEsR0FBQSxHQUFBLElBQ2IsTUFBSyxPQUFTLEVBQ2QsRUFBTyxZQUFZLEtBQUssS0FBSyxNQUU3QixpQkFBaUIsU0FBVSxXQUFBLE1BQU0sR0FBSyxnQkFFdEMsS0FBSyxhQUFZLEdBRWpCLEtBQUssb0JBQXNCLEtBQUssaUJBQ2hDLEtBQUssV0FBYSxTQUFTLGVBQWUsZUFFMUMsS0FBSyxZQUFjLFNBQVMsZUFBZSxzQkFDM0MsS0FBSyxlQUFpQixTQUFTLGVBQWUsZ0JBQzlDLEtBQUssYUFBZSxTQUFTLGVBQWUsVUFDNUMsS0FBSyxZQUFjLFNBQVMsZUFBZSxpQkFDM0MsS0FBSyxhQUFlLFNBQVMsZUFBZSxrQkFDNUMsS0FBSyxhQUFlLFNBQVMsZUFBZSxrQkFDNUMsS0FBSyxXQUFhLFNBQVMsZUFBZSxjQUMxQyxLQUFLLFdBQWEsU0FBUyxlQUFlLFlBQzFDLEtBQUssWUFBYyxTQUFTLGVBQWUsYUFFM0MsS0FBSyxhQUFlLFNBQVMsZUFBZSxjQUM1QyxLQUFLLGdCQUFrQixTQUFTLGVBQWUsaUJBQy9DLEtBQUssd0JBQTBCLFNBQVMsZUFBZSwwQkFDdkQsS0FBSyxzQkFBd0IsU0FBUyxlQUFlLHdCQUNyRCxLQUFLLG9CQUFzQixTQUFTLGVBQWUsc0JBQ25ELEtBQUssNEJBQThCLFNBQVMsZUFBZSwrQkFDM0QsS0FBSywwQkFBNEIsU0FBUyxlQUFlLDZCQUV6RCxLQUFLLFlBQWMsU0FBUyxlQUFlLDJCQUMzQyxLQUFLLHdCQUEwQixTQUFTLGVBQWUsMkJBQ3ZELEtBQUssZ0NBQWtDLFNBQVMsZUFBZSxvQ0FDL0QsS0FBSyw4QkFBZ0MsU0FBUyxlQUFlLGtDQUM3RCxLQUFLLGtCQUFvQixTQUFTLGVBQWUsb0JBRWpELEtBQUssY0FBZ0IsU0FBUyxlQUFlLGVBQzdDLEtBQUssZUFBaUIsU0FBUyxlQUFlLHFCQUU5QyxLQUFLLGVBQWlCLFNBQVMsZUFBZSwyQkFDOUMsS0FBSyxxQkFBdUIsU0FBUyxlQUFlLGtDQUNwRCxLQUFLLHVCQUF5QixTQUFTLGVBQWUsK0JBQ3RELEtBQUsscUJBQXVCLFNBQVMsZUFBZSw0QkFDcEQsS0FBSywyQkFBNkIsU0FBUyxlQUFlLG1DQUMxRCxLQUFLLDZCQUErQixTQUFTLGVBQWUsZ0NBQzVELEtBQUssaUJBQW1CLFNBQVMsZUFBZSw2QkFDaEQsS0FBSyx1QkFBeUIsU0FBUyxlQUFlLG9DQUN0RCxLQUFLLHlCQUEyQixTQUFTLGVBQWUsaUNBRXhELEtBQUssb0JBQXNCLFNBQVMsZUFBZSxnQ0FDbkQsS0FBSyxnQkFBa0IsU0FBUyxlQUFlLDBCQUcvQyxLQUFLLGtCQUFvQixTQUFTLGVBQWUsa0JBRWpELEtBQUssZ0JBQ0wsS0FBSyxjQUFjLEtBQUssYUFBYSxjQUFjLGlCQUFpQixPQUNwRSxLQUFLLFNBQVMsT0FBUSxLQUFLLGVBQWUsS0FBSyxpQkFJL0MsV0FBVyxXQUFBLE1BQU0sR0FBSyx1QkFBdUIsTUFHN0MsRUFBQSxjQUFBLFdBR0EsS0FBSyxLQUFLLE1BQ1IsU0FBQSxHQUFBLE1BQVMsR0FBSyxjQUFjLElBQzVCLFdBQ0ssRUFBSyxzQkFBd0IsRUFBSyxrQkFBa0IsRUFBSyxnQkFJL0QsS0FBSyxXQUFZLEtBQUssYUFBYSxRQUFRLFNBQUEsR0FBQSxNQUFVLEdBQU8saUJBQWlCLFNBQVUsU0FBQSxHQUN0RixFQUFHLGlCQUdBLEVBQUssZUFBaUIsRUFBSyxzQkFBd0IsRUFBSyxpQkFDekQsRUFBSyxvQkFBc0IsRUFBSyxpQkFFaEMsRUFBSyxvQkFBc0IsRUFBSyxpQkFFbEMsRUFBSywwQkFHUCxLQUFLLFlBQVksaUJBQWlCLFFBQVMsU0FBQyxHQUMxQyxTQUFTLEtBQUssVUFBVSxJQUFJLFlBRUUsS0FBM0IsRUFBRyxjQUFjLE9BQ2xCLEVBQUssa0JBQ0wsRUFBSyxhQUNMLEVBQUssaUJBQWdCLElBRXJCLEVBQUssZ0JBQWdCLEVBQUcsY0FBYyxTQUkxQyxLQUFLLFlBQVksaUJBQWlCLE9BQVEsU0FBQSxHQUN4QyxFQUFLLGlCQUlQLEtBQUssZUFBZSxpQkFBaUIsU0FBVSxTQUFDLEdBQzlDLEdBQU0sR0FBZ0IsRUFBSyxlQUFlLEVBQUcsY0FFN0MsSUFBRyxFQUFjLFFBQVUsRUFBRyxDQUNGLEVBQUcsY0FBYyxjQUFjLGlCQUN2QyxVQUFXLE1BQ3hCLENBQ0wsR0FBTSxHQUFtQixFQUFHLGNBQWMsY0FBYyxpQkFDckQsS0FBa0IsRUFBaUIsVUFBVyxHQUVuRCxFQUFLLFNBQVMsT0FBUSxHQUN0QixFQUFLLFlBR0wsSUFBTSxHQUFXLEVBQUssbUJBQW1CLFFBQVEsRUFBSyxjQUN0RCxHQUFLLFlBQWMsRUFBVyxFQUFJLEVBQUksRUFDdEMsRUFBSyx3QkFHUCxLQUFLLGFBQWEsaUJBQWlCLFNBQVUsU0FBQSxHQUUzQyxPQURvQixFQUFHLGNBQWMsY0FBYyxpQkFDaEMsT0FDakIsSUFBSyxVQUNILEVBQUssV0FBYSxTQUNsQixFQUFLLFVBQVksRUFBSyxhQUFhLEtBQ25DLE1BQ0YsS0FBSyxVQUNILEVBQUssV0FBYSxTQUNsQixFQUFLLFVBQVksRUFBSyxhQUFhLEtBQ25DLE1BQ0YsS0FBSyxlQUNMLFFBQ0UsRUFBSyxXQUFhLFVBQ2xCLEVBQUssVUFBWSxRQUVyQixFQUFLLHdCQUdQLEtBQUssYUFBYSxpQkFBaUIsU0FBVSxTQUFDLEdBQ3JCLFdBQXBCLEVBQUssYUFDTixFQUFLLFVBQVksRUFBRyxjQUFjLE9BRXBDLEVBQUssd0JBR1AsS0FBSyxhQUFhLGlCQUFpQixTQUFVLFNBQUMsR0FDckIsV0FBcEIsRUFBSyxhQUNOLEVBQUssVUFBWSxFQUFHLGNBQWMsT0FFcEMsRUFBSyx3QkFHUCxLQUFLLFdBQVcsaUJBQWlCLFFBQVMsU0FBQSxHQUN4QyxTQUFTLEtBQUssVUFBVSxJQUFJLFlBQzVCLEVBQUssZUFBZ0IsRUFDckIsRUFBSyxvQkFBc0IsRUFBSyxpQkFDaEMsRUFBSyxzQkFDTCxFQUFLLGdCQUdQLGlCQUFpQixVQUFXLFNBQUEsR0FDYyxVQUFyQyxFQUFJLE9BQU8sUUFBUSxnQkFFUCxjQUFaLEVBQUksS0FBbUMsZUFBWixFQUFJLEtBRWhDLEVBQUssWUFBd0IsY0FBWixFQUFJLEtBQXVCLEVBQUksTUFJckMsR0FBSSxZQUFBLFFBQU8sS0FBSyxRQUN4QixHQUFHLFFBQVMsU0FBQSxHQUNqQixFQUFLLFlBQVksRUFBSSxLQUFLLEVBQUksV0FHaEMsS0FBSyxXQUFXLGlCQUFpQixRQUFTLFNBQUEsR0FDeEMsRUFBSyxhQUFhLEtBRXBCLEtBQUssWUFBWSxpQkFBaUIsUUFBUyxTQUFBLEdBQ3pDLEVBQUssWUFBWSxLQUduQixLQUFLLE9BQU8saUJBQWlCLFFBQVMsU0FBQSxHQUVwQyxHQUFNLEdBQWdCLEVBQUssUUFBUSxLQUFLLFNBQUEsR0FBQSxNQUFVLEdBQU8sS0FBSyxPQUFTLEVBQUksUUFDM0UsSUFBRyxFQUFlLENBTWhCLEdBSkEsU0FBUyxLQUFLLFVBQVUsT0FBTyxZQUMvQixPQUFPLFNBQVMsRUFBRyxHQUNuQixFQUFLLG1CQUdILEVBQUssc0JBQXdCLEVBQUssa0JBQ2xDLEVBQUssZ0JBQWtCLEVBQ3ZCLENBQ0EsU0FBUyxLQUFLLFVBQVUsT0FBTyxXQUMvQixJQUFNLEdBQXFCLEVBQUssbUJBQW1CLFFBQVEsRUFDM0QsR0FBSyxjQUFnQixFQUNyQixFQUFLLFlBQWMsRUFDbkIsRUFBSyxvQkFBc0IsRUFBSyxpQkFHbEMsRUFBSyx5QkFJVCxLQUFLLGVBQWUsaUJBQWlCLFNBQVUsU0FBQSxHQUM3QyxHQUFNLEdBQU8sRUFBSSxPQUFPLE1BQ2xCLEVBQU8sRUFBSyxTQUFTLEtBQUssU0FBQSxHQUFBLE1BQUssR0FBRSxPQUFTLElBQzFDLEVBQVcsRUFBSyxVQUFVLEtBQUssU0FBQSxHQUFBLE1BQUssR0FBRSxPQUFPLFNBQVMsRUFBSyxTQUM5RCxJQUNELEVBQUssbUJBQW1CLEVBQU0sRUFBSyxvQkFBcUIsS0FJNUQsS0FBSyxvQkFBb0IsaUJBQWlCLFNBQVUsU0FBQSxHQUNsRCxHQUFNLEdBQWMsRUFBSyxlQUFlLE1BQ2xDLEVBQWtCLEVBQUssU0FBUyxLQUFLLFNBQUEsR0FBQSxNQUFLLEdBQUUsT0FBUyxHQUMzRCxTQUFRLEtBQ04sV0FBWSxFQUFLLGNBQWMsS0FDL0IsU0FBVSxJQUVULEdBQW1CLEVBQWdCLFFBQVUsRUFBSyxjQUFjLEtBQUssTUFDdEUsRUFBSyxtQkFBbUIsR0FFeEIsRUFBSyxtQkFBbUIsRUFBSyxjQUFjLHFCQU1qRCx1QkFBYyxHQUNaLE9BQU8sR0FDTCxJQUFLLFVBQ0gsS0FBSyxXQUFhLFNBQ2xCLEtBQUssVUFBWSxLQUFLLGFBQWEsS0FDbkMsTUFDRixLQUFLLFVBQ0gsS0FBSyxXQUFhLFNBQ2xCLEtBQUssVUFBWSxLQUFLLGFBQWEsS0FDbkMsTUFDRixLQUFLLGVBQ0wsUUFDRSxLQUFLLFdBQWEsVUFDbEIsS0FBSyxVQUFZLHNCQU12QixxQkFBWSxHQUNWLEdBQUcsS0FBSyxzQkFBd0IsS0FBSyxpQkFBckMsQ0FDQSxHQUFNLEdBQWlCLEtBQUssbUJBQzVCLE1BQUssYUFBZSxFQUNqQixLQUFLLFlBQWMsRUFDcEIsS0FBSyxZQUFjLEVBQ1gsS0FBSyxhQUFlLEVBQWUsU0FDM0MsS0FBSyxZQUFjLEVBQWUsT0FBUyxHQUU3QyxLQUFLLG9CQUFvQixLQUFLLDJCQUloQyw0QkFDRSxNQUFPLE1BQUssb0JBQW9CLEtBQUssS0FBSyxZQUFZLEtBQUsseUJBSTdELDZCQUNFLE1BQU8sTUFBSyxRQUFRLE9BQU8sU0FBQSxHQUFBLE9BQU0sRUFBRSxzQkFJckMscUJBQVksR0FDVixNQUFPLFVBQUMsRUFBRyxHQUNULEdBQU0sR0FBSyxFQUFFLEtBQUssR0FDWixFQUFLLEVBQUUsS0FBSyxFQUNsQixPQUFpQixnQkFBUCxJQUFpQyxnQkFBUCxHQUMzQixFQUFLLEVBRVgsRUFBSyxFQUFXLEVBQ2hCLEVBQUssR0FBWSxFQUNiLGdCQUtYLHdCQUNFLEdBQU0sR0FBTyxTQUFTLGNBQWMsYUFDaEMsR0FPRixFQUFLLGdCQUNILElBQUssS0FBSyxPQUFPLFVBQVksSUFDN0IsS0FBTSxFQUNOLFNBQVUsV0FUWixTQUFTLGdCQUFnQixVQUN2QixJQUFLLEtBQUssT0FBTyxVQUNqQixLQUFNLEVBQ04sU0FBVSx3QkFjaEIsdUJBQTZCLEdBQWpCLEdBQWlCLFVBQUEsT0FBQSxPQUFBLEtBQUEsVUFBQSxJQUFBLFVBQUEsRUFFM0IsVUFBUyxLQUFLLFVBQVUsSUFBSSxXQUZELElBR3BCLEdBQ0wsS0FBSyxPQUFPLFlBQWMsS0FBSyxPQUFPLFlBQWMsV0FEbEMsRUFFbEIsS0FBSyxPQUFPLGFBQWUsS0FBSyxPQUFPLGFBQWUsV0FFckQsTUFBSyxTQUFXLEdBQWdCLEtBQUssUUFBVSxJQUVoRCxLQUFLLE9BQVMsRUFDZCxLQUFLLE1BQVEsRUFDYixLQUFLLEtBQUssTUFBTSxNQUNkLE9BQVMsT0FDVCxNQUFPLEtBQUssUUFHVixJQUNFLEtBQUssZ0JBQ1AsS0FBSyxvQkFBc0IsS0FBSyxpQkFDaEMsU0FBUyxLQUFLLFVBQVUsT0FBTyxhQUVqQyxLQUFLLGFBQ0wsS0FBSyxZQUNMLEtBQUsscUJBS1QsS0FBSyxPQUFTLFdBQWEsS0FBSyxtQkFBcUIsWUFBYyxLQUFLLCtCQUcxRSw0QkFDRSxLQUFLLE9BQVMsS0FBSyxPQUFPLGFBQzFCLEtBQUssS0FBSyxNQUFNLE1BQ2QsT0FBUSxTQUVWLEtBQUssbUNBR1Asd0JBQWUsR0FPYixPQU5tQixFQUFBLE9BQUEsU0FDakIsRUFBVyxpQkFBaUIsMkJBR0osT0FBTyxTQUFBLEdBQUEsTUFBTSxHQUFHLFVBQVMsSUFBSSxTQUFBLEdBQUEsTUFBTSxHQUFHLHFCQU1sRSx5QkFBZ0IsR0FBQSxHQUFBLEtBQ1IsRUFBYSxLQUFLLGdCQUN4QixNQUFLLFFBQVUsS0FBSyxNQUFNLElBQUksU0FBQyxFQUFHLEVBQUcsR0FDbkMsR0FBTSxHQUFPLEVBQUssS0FBSyxPQUFPLE1BQU8sTUFBTyxFQUFhLEVBQ3pELEdBQUssU0FBUyxjQUNkLElBQU0sR0FBVSxFQUFLLEtBQUssT0FBTyxNQUFPLE1BQU8sRUFDL0MsR0FBUSxTQUFTLGlCQUNqQixJQUFNLEdBQVUsRUFBSyxLQUFLLE9BQU8sTUFBTyxNQUFPLEVBQy9DLEdBQVEsU0FBUyxpQkFFakIsSUFBTSxHQUFRLEVBQUssS0FBSyxNQUFNLEVBQU0sRUFBUyxFQU03QyxPQUxBLEdBQU0sU0FBUyxnQkFDZixFQUFNLEtBQUssS0FBTSxFQUFFLE9BS2pCLEtBQU0sRUFDTixNQUFBLEVBQU8sS0FBQSxFQUFNLFFBQUEsRUFBUyxRQUFBLEVBQVMsTUFKbkIsU0FBUyxjQUFULGlCQUF5QyxFQUFFLEtBQTNDLE1BS1osRUFBRyxHQUFJLEVBQUcsbUJBTWhCLDBCQUNFLE1BQU8sTUFBSyxJQUFJLEtBQUssTUFBTyxLQUFLLFFBQVUsS0FBSyx1QkFJbEQsc0JBQ0UsR0FBTSxHQUFJLEtBQUssT0FBUyxLQUFLLFlBQWMsS0FBSyxZQUNoRCxNQUFLLG9CQUFvQixRQUFRLFNBQUEsR0FDL0IsRUFBRSxHQUFLLEdBQ1AsRUFBRSxFQUFJLGlCQUtWLHVCQUFjLEdBQ1osR0FBRyxLQUFLLHNCQUF3QixLQUFLLGlCQUFyQyxDQUNBLEdBQU0sR0FBUyxLQUFLLFFBQVEsS0FBSyxTQUFBLEdBQUEsTUFBVSxHQUFPLEtBQUssT0FBUyxFQUFNLFFBQ25FLEtBQVcsRUFBTyxNQUFNLFVBQVUsU0FBUyxZQUM1QyxLQUFLLFVBQVUsaUJBS25CLHNCQUNFLFNBQVMsaUJBQWlCLHlCQUN2QixRQUFRLFNBQUEsR0FBQSxNQUFNLEdBQUcsVUFBVSxPQUFPLDBCQUl2QyxxQkFBdUMsR0FBN0IsR0FBNkIsVUFBQSxPQUFBLE9BQUEsS0FBQSxVQUFBLEdBQUEsVUFBQSxHQUFwQixLQUFLLGFBRXRCLEtBQ0csR0FBVSxFQUFPLFFBQ2xCLEVBQU8sRUFBSSxHQUFLLEVBQU8sRUFBSSxJQUUzQixJQUNFLEVBQU8sTUFBTSxVQUFVLE9BQU8sV0FDOUIsTUFBTSxRQU5WLENBVUEsR0FBTSxHQUFLLElBQUksSUFBSyxJQUFJLEVBQU8sR0FBSSxLQVpFLEVBY3pCLEVBQU8sUUFBUSxLQUFLLFVBQTFCLEVBZCtCLEVBYy9CLEVBRUEsRUFBTyxLQUFLLE9BQU8sWUFDbkIsRUFBTyxLQUFLLE9BQU8sWUFFekIsSUFDRSxFQUFLLEdBQUssRUFBSyxHQUNmLEVBQUksR0FBSyxFQUFJLEVBSWIsV0FEQSxHQUFPLE1BQU0sVUFBVSxPQUFPLFVBS2hDLEdBQU8sTUFBTSxNQUFNLEtBQU8sRUFBSyxJQUMvQixFQUFPLE1BQU0sTUFBTSxJQUFNLEVBQUksS0FDN0IsRUFBTyxNQUFNLFVBQVUsSUFBSSx5QkFJN0Isd0JBQ0UsS0FBSyxRQUFRLFFBQVEsU0FBQSxHQUFBLE1BQVUsR0FBTyxRQUFTLGlCQUdqRCx1QkFBYyxHQUFRLEdBQUEsR0FBQSxJQUVwQixJQUFlLEtBQVgsSUFBNEIsSUFBWCxFQUFyQixDQUVBLEdBQU0sR0FBZSxFQUFPLGNBQ3RCLEdBQWEsUUFBUyxTQW1CNUIsT0FsQndCLE1BQUssb0JBQW9CLE9BQU8sU0FBQSxHQUN0RCxHQUFNLEdBQWdCLEVBQVUsT0FBTyxTQUFDLEVBQVMsR0FDL0MsTUFBTyxJQUFXLEVBQU8sS0FBSyxHQUFLLGNBQWMsU0FBUyxLQUN6RCxHQUNHLEVBQStCLEtBQXZCLEVBQU8sS0FBSyxPQUN0QixFQUFLLFNBQVMsT0FBTyxTQUFBLEdBQUEsTUFBVSxHQUFPLFFBQVUsRUFBTyxLQUFLLFdBRTFELEVBQWMsRUFBTSxPQUFTLEdBQy9CLEVBQU0sT0FBTyxTQUFDLEVBQU8sR0FDckIsTUFBTyxJQUFTLEVBQVUsT0FBTyxTQUFDLEVBQVMsR0FDekMsTUFBTyxJQUFXLEVBQUssR0FBSyxjQUFjLFNBQVMsS0FDbEQsS0FDRixFQUdMLE9BQU8sSUFBaUIsa0JBUTVCLHlCQUFnQixHQUFRLEdBQUEsR0FBQSxJQUV0QixNQUFLLGVBQWdCLEVBQ3JCLEtBQUssYUFDTCxLQUFLLGNBRUwsS0FBSyxRQUFRLFFBQVEsU0FBQSxHQUNuQixFQUFPLE1BQU0sS0FBSyxVQUFVLE9BQU8sY0FJckMsSUFBTSxHQUFrQixLQUFLLGNBQWMsRUFFM0MsUUFBd0IsS0FBcEIsRUFBSixDQU9BLEdBSkEsRUFBZ0IsUUFBUSxTQUFBLEdBQUEsTUFBVSxHQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksZUFDbEUsRUFBZ0IsUUFBUSxTQUFBLEdBQUEsTUFBVSxHQUFLLGVBR1QsSUFBM0IsRUFBZ0IsT0FVakIsTUFQQSxNQUFLLGNBQWdCLEVBQWdCLEdBQ3JDLEtBQUssWUFBYyxLQUFLLG1CQUFtQixRQUFRLEtBQUssZUFDeEQsS0FBSyxpQkFDRixLQUFLLHNCQUF3QixLQUFLLGtCQUNuQyxLQUFLLHNCQVFQLEdBQWdCLE9BQVMsR0FLekIsS0FBSyxvQkFBc0IsS0FBSyxpQkFDaEMsS0FBSyxzQkFFTCxXQUFXLFdBQ0osRUFBSyxRQUFVLEVBQWdCLFFBQVEsU0FBQSxHQUFBLE1BQVUsR0FBSyxVQUFVLE1BQ3BFLEtBQUssYUFBZSxPQUt2QixLQUFLLGVBQWdCLEVBQ3JCLEtBQUssNEJBS1QsMkJBQ0UsU0FBUyxpQkFBaUIsY0FBYyxRQUFRLFNBQUEsR0FBQSxNQUFNLEdBQUcsVUFBVSxPQUFPLDRCQUk1RSxrQkFBUyxHQUFrQixHQUFiLEdBQWEsVUFBQSxPQUFBLE9BQUEsS0FBQSxVQUFBLEdBQUEsVUFBQSxLQUN6QixNQUFLLFFBQVEsUUFBUSxTQUFBLEdBQ25CLEdBQU0sR0FBVSxFQUFPLE9BQU8sU0FBQyxFQUFRLEdBQ3JDLE1BQU8sSUFBVSxFQUFPLEtBQUssR0FBSyxTQUFTLEtBQzFDLEVBQ0gsR0FBTyxRQUFVLGlCQUtyQiw0QkFBbUIsR0FBQSxHQUFBLElBRWpCLE1BQUssVUFBWSxLQUFLLEtBQUssS0FBSyxvQkFBb0IsU0FDcEQsS0FBSyxtQkFBbUIsUUFBUSxTQUFDLEVBQVEsR0FBVSxHQUFBLEdBQ2hDLEVBQUssaUJBQWlCLEdBQS9CLEVBRHlDLEVBQ3pDLEVBQUcsRUFEc0MsRUFDdEMsQ0FDWCxHQUFPLEVBQUksRUFDWCxFQUFPLEVBQUksSUFFYixLQUFLLHVCQUNMLEtBQUsseUJBQ0wsS0FBSyxpQkFDSCxLQUFLLGFBQWEsUUFBUSxLQUFLLGFBQWEsZUFBZSxNQUMzRCxLQUFLLGFBQWEsUUFBUSxLQUFLLGFBQWEsZUFBZSxPQUUxRCxLQUFLLGVBQ04sS0FBSyx5QkFNVCw0QkFBaUQsR0FBQSxHQUFBLEtBQWhDLEVBQWdDLFVBQUEsT0FBQSxPQUFBLEtBQUEsVUFBQSxHQUFBLFVBQUEsR0FBbEIsS0FBSyxXQUVsQyxNQUFLLGtCQUNMLEtBQUssVUFBWSxDQUNqQixJQUFNLEdBQUksS0FBSyxPQUFTLEtBQUssWUFBYyxLQUFLLFlBQ2hELE1BQUssY0FBZ0IsS0FBSyxtQkFDMUIsS0FBSyxjQUFjLFFBQVEsU0FBQyxFQUFRLEdBQ2xDLEVBQU8sRUFBSSxFQUNYLEVBQU8sRUFBSSxHQUE4QixJQUFNLEdBQTlCLEVBQVEsS0FFM0IsS0FBSyx1QkFDTCxLQUFLLHlCQUNMLEtBQUssaUJBQ0gsS0FBSyxhQUFhLFFBQVEsS0FBSyxhQUFhLGVBQWUsTUFDM0QsS0FBSyxhQUFhLFFBQVEsS0FBSyxhQUFhLGVBQWUsT0FFN0QsS0FBSyxhQUNMLEtBQUssY0FBZ0IsS0FBSyxjQUFjLEdBQ3hDLEtBQUssaUJBSUwsV0FBVyxXQUFBLE1BQU0sR0FBSyxhQUFhLEtBQUssYUFBZSxrQkFLekQsMEJBQWlCLEdBQ2YsR0FBcUIsZ0JBQVgsR0FBcUIsTUFBTyxFQUN0QyxJQUFjLEtBQVgsRUFBZSxNQUFPLEtBQ3pCLElBQUksT0FBQSxFQUVKLE9BREEsR0FBUyxLQUFLLE1BQU0sRUFBTyxRQUFRLElBQUssS0FBSyxRQUFRLElBQUssT0FDdkQsRUFBQSxRQUFBLFNBQWEsR0FBZ0IsS0FDekIsZUFHVCx3QkFBZSxHQUNiLEdBQU0sR0FBZSxLQUFLLGlCQUFpQixFQUMzQyxPQUEyQixnQkFBakIsR0FBa0MsR0FDeEIsSUFBakIsRUFBMkIsR0FDdkIsRUFBZSxFQUFJLE9BQVMsb0JBR3JDLDJCQUFrQixHQUNoQixNQUFjLEtBQVgsRUFBc0IsSUFDbEIsS0FBSyxpQkFBaUIsR0FBVSxpQkFJekMsMEJBQWlCLEdBQUEsR0FBQSxLQUFBLEVBS1gsS0FBSyxjQUFjLEtBSHJCLEVBRmEsRUFFYixNQUFPLEVBRk0sRUFFTixPQUNQLEVBSGEsRUFHYixjQUFlLEVBSEYsRUFHRSxxQkFDZixFQUphLEVBSWIsU0FBVSxFQUpHLEVBSUgsZUFHWixNQUFLLGFBQWEsVUFBWSxFQUM5QixLQUFLLGdCQUFnQixVQUFZLEVBQ2pDLEtBQUssc0JBQXNCLFVBQVksS0FBSyxrQkFBa0IsR0FDOUQsS0FBSyxzQkFBc0IsVUFBWSxLQUFLLGVBQWUsR0FDM0QsS0FBSyxvQkFBb0IsVUFBWSxFQUNyQyxLQUFLLDBCQUEwQixVQUFZLEtBQUssa0JBQWtCLEdBQ2xFLEtBQUssMEJBQTBCLFVBQVksS0FBSyxlQUFlLEVBRS9ELElBQUksR0FBTyxLQUFLLGNBQWMsS0FHMUIsSUFHSixJQUFJLEdBQTRCLElBQWxCLEVBQU8sT0FlbkIsS0FBSyxZQUFZLFVBQVUsSUFBSSxVQUMvQixLQUFLLGVBQWUsV0FBVyxVQUFVLElBQUksVUFDN0MsS0FBSyxjQUFjLFVBQVksRUFBTyxRQUFRLFNBQVMsSUFHdkQsRUFBVyxLQUFLLFVBQVUsS0FBSyxTQUFBLEdBQUEsTUFBSyxHQUFFLE9BQU8sU0FBUyxLQUd0RCxLQUFLLG1CQUFtQixLQUFLLGNBQWMsS0FBTSxLQUFLLGNBQWUsT0F2QnBDLENBQ2pDLEtBQUssY0FBYyxVQUFZLEVBQy9CLElBQU0sR0FBUSxLQUFLLFNBQVMsT0FBTyxTQUFBLEdBQUEsTUFBSyxHQUFFLFFBQVUsSUFDOUMsRUFBb0IsS0FBSyxZQUFZLE1BQU0sYUFDakQsTUFBSyxZQUFjLEVBQU0sS0FBSyxTQUFBLEdBQUEsTUFBUSxHQUFLLE9BQU8sY0FBYyxTQUFTLEtBR3pFLEVBQVcsS0FBSyxVQUFVLEtBQUssU0FBQSxHQUFBLE1BQUssR0FBRSxPQUFPLFNBQVMsRUFBSyxZQUFZLFVBRXZFLEtBQUssb0JBQW9CLEVBQU8sR0FDaEMsS0FBSyxlQUFlLFdBQVcsVUFBVSxPQUFPLFVBQ2hELEtBQUssWUFBWSxVQUFVLE9BQU8sVUFDbEMsS0FBSyxtQkFBbUIsS0FBSyxZQUFjLEtBQUssWUFBYyxFQUFNLEdBQUksS0FBSyxjQUFlLEdBYzlGLEdBQU0sR0FBbUIsS0FBSyxrQkFBa0IsRUFBSyxLQUFNLFdBQVksS0FBSyxjQUM1RSxNQUFLLHdCQUF3QixVQUFZLEVBQWlCLFFBQVUsSUFBTSxFQUFpQixLQUUzRixJQUFNLEdBQXVCLEtBQUssa0JBQWtCLEVBQUssS0FBTSxnQkFBaUIsS0FBSyxjQUNyRixNQUFLLDRCQUE0QixVQUFZLEVBQXFCLFFBQVUsSUFBTSxFQUFxQixtQkFHekcsNkJBQW9CLEVBQU8sR0FDekIsS0FBSyxlQUFlLFVBQVksRUFBTSxJQUFJLFNBQUMsRUFBTSxHQUMvQyxNQUFBLGtCQUNFLEVBQUssS0FEUCxLQUdpQixLQUFmLEdBQXFCLEVBQUssT0FBTyxjQUFjLFNBQVMsR0FBYyxZQUFjLElBSHRGLElBS0UsRUFBSyxPQUFPLFFBQVEsU0FBUyxJQUwvQixjQU9DLEtBQUssaUJBR1YsMkJBQWtCLEVBQU0sRUFBSyxHQUUzQixPQUNFLFFBRm9CLEVBQVEsS0FBSyxTQUFDLEVBQUcsR0FBSixNQUFVLEdBQUUsS0FBSyxHQUFPLEVBQUUsS0FBSyxLQUV6QyxVQUFVLFNBQUEsR0FBQSxNQUFLLEdBQUUsS0FBSyxPQUFTLElBQVEsRUFDOUQsTUFBTyxFQUFRLHFCQUluQix5QkFBZ0IsRUFBTSxFQUFLLEdBQVMsR0FBQSxHQUFBLEtBRTVCLEdBQWUsRUFBQSxpQkFBQSxTQUFRLEVBQVMsU0FBQSxHQUNwQyxNQUEwQixLQUF2QixFQUFPLEtBQUssT0FBc0IsRUFBTyxLQUNyQyxFQUFLLFNBQVMsT0FBTyxTQUFBLEdBQUEsTUFBVSxHQUFPLFFBQVUsRUFBTyxLQUFLLFVBQ2xFLEtBQUssU0FBQyxFQUFHLEdBQUosTUFBVSxHQUFFLEdBQU8sRUFBRSxJQUM3QixRQUNFLFFBQVMsRUFBYSxVQUFVLFNBQUEsR0FBQSxNQUFRLEdBQUssT0FBUyxJQUFRLEVBQzlELE1BQU8sRUFBYSxxQkFJeEIsK0JBQXNCLEVBQU0sRUFBSyxHQUcvQixHQUFNLEdBQWlCLEtBQUssVUFBVSxLQUFLLFNBQUMsRUFBRyxHQUU3QyxPQUFrQixLQUFkLEVBQUUsU0FBeUIsRUFBRSxRQUFRLFFBQXNCLEtBQWQsRUFBRSxTQUF5QixFQUFFLFFBQVEsR0FBTSxDQUMxRixHQUFNLEdBQVUsRUFBRSxRQUFRLEdBQUssVUFBVSxHQUFHLE9BRTVDLE9BRGdCLEdBQUUsUUFBUSxHQUFLLFVBQVUsR0FBRyxRQUMzQixJQUtyQixRQUNFLFFBQVMsRUFBZSxVQUFVLFNBQUEsR0FBQSxNQUFZLEdBQVMsT0FBTyxTQUFTLEtBQVcsRUFDbEYsTUFBTyxFQUFlLHFCQU8xQiw0QkFBbUIsRUFBTSxFQUFTLEdBQVUsR0FFeEMsR0FHRSxFQUhGLGNBQWUsRUFHYixFQUhhLHFCQUNmLEVBRUUsRUFGRixlQUFnQixFQUVkLEVBRmMsc0JBQ2hCLEVBQ0UsRUFERixnQkFBaUIsRUFDZixFQURlLHNCQUtuQixRQUFpQixLQUFiLEVBQXdCLENBQzFCLEtBQUssa0JBQWtCLGNBQWMsVUFBVSxPQUFPLFdBRXpDLEVBQUEsYUFBQSxXQUNSLEtBQUssRUFBUyxRQUFTLEtBQUssdUJBSWpDLE1BQUssa0JBQWtCLGNBQWMsVUFBVSxJQUFJLFVBQ25ELEtBQUssa0JBQWtCLFVBQVksRUFHckMsTUFBSyxlQUFlLFVBQVksRUFDaEMsS0FBSyxxQkFBcUIsVUFBWSxLQUFLLGtCQUFrQixHQUM3RCxLQUFLLHFCQUFxQixVQUFZLEtBQUssZUFBZSxFQUMxRCxJQUFNLEdBQXVCLEtBQUssZ0JBQWdCLEVBQUssS0FBTSxnQkFBaUIsRUFDOUUsTUFBSyx1QkFBdUIsVUFBWSxFQUFxQixRQUFVLElBQU0sRUFBcUIsTUFFbEcsS0FBSyxxQkFBcUIsVUFBWSxFQUN0QyxLQUFLLDJCQUEyQixVQUFZLEtBQUssa0JBQWtCLEdBQ25FLEtBQUssMkJBQTJCLFVBQVksS0FBSyxlQUFlLEVBQ2hFLElBQU0sR0FBd0IsS0FBSyxnQkFBZ0IsRUFBSyxLQUFNLGlCQUFrQixFQUNoRixNQUFLLDZCQUE2QixVQUFZLEVBQXNCLFFBQVUsSUFBTSxFQUFzQixNQUUxRyxLQUFLLGlCQUFpQixVQUFZLEVBQ2xDLEtBQUssdUJBQXVCLFVBQVksS0FBSyxrQkFBa0IsR0FDL0QsS0FBSyx1QkFBdUIsVUFBWSxLQUFLLGVBQWUsRUFDNUQsSUFBTSxHQUF5QixLQUFLLGdCQUFnQixFQUFLLEtBQU0sa0JBQW1CLEVBQ2xGLE1BQUsseUJBQXlCLFVBQVksRUFBdUIsUUFBVSxJQUFNLEVBQXVCLE1BRXhHLEtBQUssd0JBQXdCLFVBQVksRUFBSyxjQUM5QyxLQUFLLDhCQUE4QixVQUFZLEtBQUssa0JBQWtCLEVBQUssc0JBQzNFLEtBQUssOEJBQThCLFVBQVksS0FBSyxlQUFlLEVBQUsscUJBQ3hFLElBQU0sR0FBMkIsS0FBSyxnQkFBZ0IsRUFBSyxLQUFNLGdCQUFpQixFQUNsRixNQUFLLGdDQUFnQyxVQUFZLEVBQXlCLFFBQVUsSUFBTSxFQUF5QixNQUVuSCxLQUFLLGtCQUFrQixVQUFZLEVBQUssT0FFeEMsS0FBSyxtQkFBbUIsZ0JBRzFCLDRCQUFtQixHQUNqQixHQUFNLEdBQThDLFlBQW5DLEtBQUssb0JBQW9CLE1BQ3RDLEVBQUssMkJBQ0wsRUFBSywrQkFDVCxNQUFLLGdCQUFnQixVQUFZLEVBQVMsSUFBSSxTQUFDLEVBQVMsR0FBVixNQUFvQixHQUFRLEVBQVIsUUFDaEUsRUFBUSxHQUFHLGNBQWdCLEVBQVEsTUFBTSxJQUR1QixRQUV4RCxLQUFJLEtBQUssaUJBSXJCLDBCQUFpQixHQUFtQyxHQUE1QixHQUE0QixVQUFBLE9BQUEsT0FBQSxLQUFBLFVBQUEsR0FBQSxVQUFBLEdBQWhCLEtBQUssU0FHdkMsUUFBUyxFQUZFLElBQU0sRUFBWSxFQUFPLEVBQVEsRUFBYSxFQUFZLElBRXpELEVBREQsSUFBTSxFQUFZLEVBQU0sTUFBTSxFQUFRLEdBQWEsRUFBWSxrQkFLNUUsZ0NBQ0UsS0FBSyxRQUFRLFFBQVEsU0FBQSxHQUNuQixHQUNFLEVBQU8sRUFBSSxHQUFLLEVBQU8sRUFBSSxLQUMzQixFQUFPLEVBQUksR0FBSyxFQUFPLEVBQUksSUFHM0IsV0FEQSxHQUFPLEtBQUssTUFBTyxRQUFTLFFBRzlCLEdBQU8sS0FBSyxNQUNWLEdBQUksRUFBTyxFQUFJLElBQ2YsR0FBSSxFQUFPLEVBQUksSUFDZixRQUFTLFNBR2IsS0FBSywwQkFJUCxrQ0FBeUIsR0FBQSxHQUFBLEtBQ2pCLEVBQUksS0FBSyxPQUFTLEtBQUssWUFBYyxLQUFLLFlBQ2hELE1BQUssUUFBUSxRQUFRLFNBQUEsR0FFbkIsR0FDRSxFQUFPLEVBQUksR0FBSyxFQUFPLEVBQUksS0FDM0IsRUFBTyxFQUFJLEdBQUssRUFBTyxFQUFJLElBQ3pCLENBRUYsR0FBTSxHQUFLLElBQUksSUFBSyxJQUFJLEVBQU8sR0FBSSxJQVNuQyxPQVJBLEdBQU8sUUFBUSxPQUFPLFNBQ3BCLEdBQUksRUFBSyxJQUFLLEdBQUksRUFBSSxJQUN0QixRQUFTLEdBQ1IsRUFBSyxhQUFlLEVBQUcsRUFBSyxhQUMvQixHQUFPLFFBQVEsT0FBTyxTQUNwQixHQUFJLEVBQUssSUFBSyxHQUFJLEVBQUksSUFDdEIsUUFBUyxHQUNSLEVBQUssYUFBZSxFQUFHLEVBQUssU0FJakMsRUFBTyxRQUFRLE9BQU8sU0FDcEIsR0FBSSxFQUFPLEVBQUksSUFDZixHQUFJLEVBQU8sRUFBSSxJQUNmLFFBQVMsR0FDUixFQUFLLGFBQWMsRUFBSyxTQUUzQixFQUFPLFFBQVEsT0FBTyxTQUNwQixHQUFJLEVBQU8sRUFBSSxJQUNmLEdBQUksRUFBTyxFQUFJLElBQ2YsUUFBUyxHQUNSLEVBQUssYUFBYyxFQUFLLHdCQUsvQiwwQkFBaUIsRUFBTSxHQUFNLEdBQUEsR0FBQSxLQUNyQixFQUFlLEtBQUssWUFBWSxHQUNoQyxFQUFlLEtBQUssWUFBWSxFQUN0QyxNQUFLLFFBQVEsUUFBUSxTQUFBLEdBQ25CLEVBQU8sUUFBVSxFQUFPLE9BQVMsRUFBSSxFQUFJLElBQ3ZDLEVBQ0MsRUFBTyxLQUFLLEdBQVEsRUFBYSxLQUNoQyxFQUFJLEVBQUssVUFBWSxLQUFLLElBQUksRUFBSyxPQUFRLEVBQUssT0FBUyxJQUc3RCxFQUFPLFFBQVUsRUFBTyxPQUFTLEVBQUksRUFBSSxJQUN2QyxFQUNDLEVBQU8sS0FBSyxHQUFRLEVBQWEsS0FDaEMsRUFBSSxFQUFLLFVBQVksS0FBSyxJQUFJLEVBQUssT0FBUSxFQUFLLE9BQVMsTUFLL0QsS0FBSyw0QkFJUCxzQkFDRSxHQUFNLEdBQWEsS0FBSyxnQkFDeEIsTUFBSyxRQUFRLFFBQVEsU0FBQSxHQUFBLE1BQVUsR0FBTyxLQUFLLE1BQ3pDLEVBQUcsRUFBTyxPQUFTLEVBQUksRUFBYSxtQkFLeEMsd0JBQWUsR0FBQSxHQUFBLElBQ2IsTUFBSyxRQUFRLFFBQVEsU0FBQSxHQUNuQixFQUFPLFFBQVEsU0FDYixFQUFHLEVBQU8sU0FDVCxFQUFLLGFBQWMsRUFBSyxTQUMzQixFQUFPLFFBQVEsU0FDYixFQUFHLEVBQU8sU0FDVCxFQUFLLGFBQWMsRUFBSyx3QkFLL0IscUJBQVksR0FDVixHQUFNLEdBQVMsS0FBSyxvQkFBb0IsSUFBSSxTQUFBLEdBQUEsTUFBSyxHQUFFLEtBQUssSUFBUSxHQUNoRSxRQUNFLElBQUssSUFBQSxVQUFBLEdBQU8sR0FDWixJQUFLLElBQUEsVUFBQSxJQUFJLEdBQUosT0FBVSxrQkFLbkIsaUJBQVMsR0FDUCxRQUFVLEVBQUssRUFBSSxFQUFJLHdCQUlaOzs7QUN2OUJmLG1NQUVJLFdBQ0YsZUFBZ0IsdUJBQ2hCLGFBQWMscUJBQ2QsaUJBQWtCLEtBQ2xCLFVBQVcsS0FDWCxhQUFjLEtBQ2QsTUFDRSxJQUFLLEtBQ0wsUUFBUyxLQUNULFlBQWEsTUFFZix1QkFBd0IsV0FDdEIsR0FBSSxHQUFPLGlCQUVYLEtBR0UsTUFGQSxjQUFhLFFBQVEsRUFBTSxHQUMzQixhQUFhLFdBQVcsSUFDakIsRUFDUCxNQUFPLEdBQ1AsT0FBTyxJQUdYLFlBQWEsV0FDWCxNQUFPLE1BQUssS0FBSyxJQUFJLFVBQVUsTUFBTSxLQUFLLFFBQVEsS0FBSyxpQkFBbUIsR0FFNUUsYUFBYyxXQUNaLEdBQUksR0FBVyxJQUVmLEtBQUssS0FBSyx5QkFDUixNQUFPLEtBSVQsSUFGQSxLQUFLLFVBQVksS0FBSyxLQUFLLElBQUksYUFBYSxrQkFDNUMsS0FBSyxhQUFlLGVBQWlCLEtBQUssVUFDdEMsS0FBSyxhQUNQLElBRUUsTUFEQSxHQUFXLEtBQUssTUFBTSxhQUFhLFFBQVEsS0FBSyxlQUVoRCxNQUFPLEdBQ1AsTUFBTyxNQUlYLE1BQU8sSUFFVCxnQkFBaUIsV0FDZixJQUFLLEtBQUsseUJBQ1IsT0FBTyxDQUdKLE1BQUssbUJBQ1IsS0FBSyxxQkFHUCxLQUFLLGlCQUFpQixTQUFXLEtBQUssYUFFdEMsS0FFRSxNQURBLGNBQWEsUUFBUSxLQUFLLGNBQWMsRUFBQSxZQUFBLFNBQWUsS0FBSyxvQkFDckQsRUFDUCxNQUFPLEdBQ1AsT0FBTyxJQUdYLGdCQUFpQixXQUNmLEdBQUksS0FBSyxjQUFlLENBQ3RCLEdBQUksR0FBTSxHQUFJLFFBQU8sVUFBWSxLQUFLLGVBQWlCLFVBQ3ZELE1BQUssS0FBSyxJQUFJLFVBQVksS0FBSyxLQUFLLElBQUksVUFBVSxRQUFRLEVBQUssU0FFL0QsTUFBSyxLQUFLLElBQUksV0FBYSxJQUFNLEtBQUssZ0JBRzFDLGFBQWMsV0FDWixHQUFJLEdBQU8sSUFFWCxNQUFLLEtBQUssUUFBVSxLQUFLLEtBQUssSUFBSSx1QkFBdUIsd0JBRXpELEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxLQUFLLEtBQUssUUFBUSxPQUFRLEVBQUksRUFBRyxJQUNuRCxLQUFLLEtBQUssUUFBUSxHQUFHLGlCQUFpQixRQUFTLFdBQzdDLEVBQUssa0JBQ0wsRUFBSyxvQkFDSixJQUdQLGlCQUFrQixXQUNoQixLQUFLLEtBQUssWUFBYyxLQUFLLEtBQUssSUFBSSx1QkFBdUIsNkJBRTdELEtBQUssR0FBSSxHQUFJLEVBQUcsRUFBSSxLQUFLLEtBQUssWUFBWSxPQUFRLEVBQUksRUFBRyxJQUN2RCxLQUFLLEtBQUssWUFBWSxHQUFHLGlCQUFpQixTQUFVLFNBQVUsR0FDNUQsR0FBSSxHQUFNLEVBQUUsT0FBTyxLQUVmLEtBQ0YsT0FBTyxTQUFTLEtBQU8sS0FFeEIsSUFHUCxTQUFVLFdBQ1IsR0FBSSxHQUFNLEdBQUksUUFBTyxVQUFZLEtBQUssYUFBZSxXQUNqRCxFQUFPLElBRVgsR0FBSyxLQUFLLElBQUksVUFBWSxFQUFLLEtBQUssSUFBSSxVQUFVLFFBQVEsRUFBSyxNQUVqRSxLQUFNLFdBQ0osS0FBSyxLQUFLLElBQU0sU0FBUyxlQUFlLGlCQUVwQyxLQUFLLEtBQUssTUFDWixLQUFLLGlCQUFtQixLQUFLLGVBR3pCLEtBQUssbUJBQXFCLEtBQUssaUJBQWlCLFVBQ2xELEtBQUssa0JBR1AsS0FBSyxlQUNMLEtBQUssbUJBRUwsS0FBSyxhQUtYLFFBQU8sUUFBVTs7O3FGQ3ZIakIsUUFBUyxjQUdQLEdBQU0sR0FBa0IsU0FBQyxHQUN2QixXQUFhLEtBQVQsRUFBMkIsR0FFZ0IsSUFBNUIsRUFBSyxVQUFVLEdBQUcsU0FFbkIsV0FLZCxFQUFxQixTQUFDLEdBQzFCLE9BQ0UsS0FDRSxXQUFZLEVBQWdCLEVBQVEseUJBQ3BDLE1BQU8sMkJBRVQsT0FDRSxXQUFZLEVBQWdCLEVBQVEsaUNBQ3BDLE1BQU8sbUNBRVQsS0FDRSxXQUFZLEVBQWdCLEVBQVEsd0JBQ3BDLE1BQU8sMEJBRVQsS0FDRSxXQUFZLEVBQWdCLEVBQVEsbUJBQ3BDLE1BQU8scUJBRVQsTUFDRSxXQUFZLEVBQWdCLEVBQVEsMkJBQ3BDLE1BQU8sNkJBRVQsS0FDRSxXQUFZLEVBQWdCLEVBQVEsMEJBQ3BDLE1BQU8sOEJBTVAsRUFBcUIsU0FBQyxFQUFJLEVBQUksRUFBUSxHQUMxQyxHQUFJLE9BQUEsRUFFSixPQURBLElBQVcsRUFBUSxJQUFNLEtBQUssR0FBSyxLQUMzQixLQUFLLE1BQTRDLEtBQXJDLEVBQU0sRUFBUyxLQUFLLElBQUksS0FBb0IsSUFBSyxLQUFLLE1BQTRDLEtBQXJDLEVBQU0sRUFBUyxLQUFLLElBQUksS0FBb0IsTUFHekgsRUFBVSxTQUFDLEVBQUcsRUFBRyxFQUFRLEVBQWEsR0FDMUMsR0FBSSxPQUFBLEdBQVEsTUFBQSxFQUdaLE9BRkEsR0FBVyxFQUFtQixFQUFHLEVBQUcsRUFBUSxHQUM1QyxFQUFTLEVBQW1CLEVBQUcsRUFBRyxFQUFRLEdBQ25DLEtBQU8sRUFBUyxHQUFLLElBQU0sRUFBUyxHQUFLLE1BQVEsRUFBUyxJQUFNLEVBQVMsVUFBWSxFQUFPLEdBQUssSUFBTSxFQUFPLElBR2pILEVBQWMsU0FBQyxFQUFPLEdBRTFCLEVBQW1CLFFBQVYsRUFBbUIsWUFBYyxDQUUxQyxJQUFJLEdBQU0sRUFBSSxLQUFLLElBQ2IsRUFBVSxDQUNoQixPQUFPLFdBQUEsUUFBSyxRQUFRLEVBQUcsRUFBUSxTQUFTLEdBRXRDLEdBQUksRUFDSixHQUFJLFNBQ0osRUFBTyxFQUFRLElBQUssSUFBSyxLQUFNLEdBQVUsSUFBTixFQUFjLElBQ2pELEVBQU0sRUFBSSxLQUFLLEdBQ2YsRUFBSSxNQUNGLE1BQU8sY0FFUCxLQUFLLE1BQU0sSUFBTSxHQUFRLFdBRTNCLEVBQVEsVUFNTixFQUFzQixTQUFDLEdBRTNCLEdBQU0sR0FBUyxFQUFNLFdBQWEsSUFBTyxJQUFJLEVBQU0sV0FBYSxFQUFNLFdBR2xFLEVBQVEsT0FJWixPQUhBLEdBQVMsRUFBTSxXQUFhLEdBQU0sU0FBVyxFQUc3QywrQ0FGQSxFQUFTLEVBQU0sV0FBYSxHQUFNLE1BQVEsR0FFMUMsaUJBQzZELEVBRDdELDBQQUl1SSxFQUFNLFdBSjdJLDRDQU1XLEVBQU0sTUFOakIseUJBV0ksRUFBbUIsU0FBQyxHQUV4QixJQUFBLEdBREksR0FBZSxtREFDbkIsR0FBMkIsRUFBQSxVQUFBLFNBQWUsR0FBMUMsRUFBQSxNQUFBLFFBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxjQUFBLFNBQUEsS0FBa0QsQ0FBQSxHQUFBLEVBQUEsSUFBQSxFQUFBLENBQUEsR0FBQSxHQUFBLEVBQUEsT0FBQSxLQUFBLEdBQUEsRUFBQSxTQUFBLENBQUEsR0FBQSxFQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsS0FBQSxHQUFBLEVBQUEsTUFBQSxHQUFBLEdBQUEsRUFBakMsR0FBaUMsRUFBQSxHQUFBLEVBQUEsR0FDaEQsSUFBZ0IsRUFBb0IsR0FHdEMsTUFEQSxJQUFnQixnQkFNWixFQUF3QixXQUVQLFNBQVMsaUJBQWlCLHlCQUNsQyxRQUFRLFNBQUEsR0FDbkIsR0FBTSxHQUFRLEVBQVksY0FBYyxRQUFRLE1BQzFDLEdBQU0sRUFBQSxVQUFBLFNBQUssRUFDakIsR0FBWSxFQUFPLEtBZ0J2QixRQUNFLEtBVlcsU0FBQyxFQUFVLEdBQ3RCLEdBQU0sR0FBYSxFQUFtQixFQUV0QyxHQUFVLFVBQVksRUFBaUIsR0FFdkMsb1BBbElKLFNBQUEsUUFBQSxzRUEySWU7OztZQzlIZixTQUFTLFVBQVMsRUFBTSxFQUFNLEdBQzVCLEdBQUksRUFDSixPQUFPLFlBQ0wsR0FBSSxHQUFVLEtBQU0sRUFBTyxTQUMzQixjQUFhLEdBQ2IsRUFBVSxXQUFXLFdBQ25CLEVBQVUsS0FDTCxHQUFXLEVBQUssTUFBTSxFQUFTLElBQ25DLEdBQ0MsSUFBYyxHQUFTLEVBQUssTUFBTSxFQUFTLDBDQUlwQzs7O0FDM0JmLG1hQVNNLDhCQVVKLFFBQUEsR0FBWSxJQUFTLEVBQUEsaUJBQUEsU0FBQSxLQUFBLEVBQ25CLElBQU0sSUFDSixZQUFhLG1CQUNiLFlBQWEsU0FBUyxnQkFDdEIsZUFBZ0IsWUFBYSxjQUM3QixjQUFlLFdBRWpCLE1BQUssVUFBVyxFQUFBLFNBQUEsWUFBa0IsRUFBVSxHQUM1QyxLQUFLLFdBQVkscUJBTW5CLGdCQUNFLEtBQUssU0FDTCxLQUFLLDBCQU1QLGtCQUNFLEdBQUksR0FBUSxTQUFTLGNBQWMsUUFDbkMsR0FBTSxVQUFZLEtBQUssV0FDdkIsU0FBUyxLQUFLLFlBQVksZ0JBZ0I1QixzQkFDRSxLQUFLLGVBQWlCLEtBQUssb0JBQW9CLEtBQUssTUFDcEQsS0FBSyxjQUFnQixLQUFLLG1CQUFtQixLQUFLLE1BQ2xELEtBQUssU0FBUyxjQUFjLFFBQVEsS0FBSyxpQkFBa0IsTUFDM0QsS0FBSyxTQUFTLGFBQWEsUUFBUSxLQUFLLGdCQUFpQixtQkFPM0QsMEJBQWlCLEdBQ2YsS0FBSyxTQUFTLFlBQVksaUJBQ3hCLEVBQ0EsS0FBSyxnQkFDSCxTQUFTLGlCQVFmLHlCQUFnQixHQUNkLEtBQUssU0FBUyxZQUFZLGlCQUN4QixFQUNBLEtBQUssZUFDSCxTQUFTLGlCQVFmLCtCQUNNLEtBQUssWUFDUCxLQUFLLFNBQVMsWUFBWSxVQUFVLElBQ2xDLEtBQUssU0FBUyxhQUVoQixLQUFLLFdBQVksZ0JBVXJCLDRCQUFtQixHQUNqQixHQUFHLEtBQUssVUFBVyxDQUNqQixHQUFrQixZQUFmLEVBQU0sTUFDVSxRQUFkLEVBQU0sSUFDUCxNQUdKLE1BQUssU0FBUyxZQUFZLFVBQVUsT0FDbEMsS0FBSyxTQUFTLGFBRWhCLEtBQUssV0FBWSxrRUFuRW5CLE1BQUEsSUFBVyxLQUFLLFNBQVMsWUFBekIsa0NBd0VKLFFBQU8sUUFBVTs7O2tDQ3pIakIsSUFBTSxhQUFjLFdBQ2xCLEdBQU0sR0FBTyxTQUFTLGNBQWMsZUFDOUIsRUFBTyxTQUFTLGNBQWMsUUFDOUIsRUFBVyxTQUFTLGNBQWMsU0FFcEMsSUFFRixXQUFXLFdBQ1QsRUFBSyxVQUFVLElBQUksU0FDbkIsRUFBUyxVQUFVLElBQUksZ0JBQ3ZCLEVBQVMsVUFBWSxJQUNyQixFQUFLLFlBQVksSUFFaEIsS0FHRCxHQUNGLEVBQVMsaUJBQWlCLFFBQVMsV0FDakMsRUFBSyxVQUFVLE9BQU8sU0FDdEIsRUFBSyw0QkFNSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXMyMDE5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmxhdE1hcChtYXBwZXJGdW5jdGlvbikge1xuXHR2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuXHR2YXIgc291cmNlTGVuID0gRVMuVG9MZW5ndGgoRVMuR2V0KE8sICdsZW5ndGgnKSk7XG5cblx0aWYgKCFFUy5Jc0NhbGxhYmxlKG1hcHBlckZ1bmN0aW9uKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ21hcHBlckZ1bmN0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHR9XG5cblx0dmFyIFQ7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFQgPSBhcmd1bWVudHNbMV07XG5cdH1cblxuXHR2YXIgQSA9IEVTLkFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcblx0RVMuRmxhdHRlbkludG9BcnJheShBLCBPLCBzb3VyY2VMZW4sIDAsIDEsIG1hcHBlckZ1bmN0aW9uLCBUKTtcblx0cmV0dXJuIEE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGJvdW5kRmxhdE1hcCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBwb2x5ZmlsbCk7XG5cbmRlZmluZShib3VuZEZsYXRNYXAsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJvdW5kRmxhdE1hcDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZsYXRNYXAgfHwgaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRmxhdE1hcCgpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKFxuXHRcdEFycmF5LnByb3RvdHlwZSxcblx0XHR7IGZsYXRNYXA6IHBvbHlmaWxsIH0sXG5cdFx0eyBmbGF0TWFwOiBmdW5jdGlvbiAoKSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuZmxhdE1hcCAhPT0gcG9seWZpbGw7IH0gfVxuXHQpO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb21cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5XCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hdGgvc2lnblwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9udW1iZXIvaXMtbmFuXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ25cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTsiLCJcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltVnRjSFI1TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJaUxDSm1hV3hsSWpvaWIzVjBMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUlsMTkiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmZyb207XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yJyk7XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKTtcbnZhciAkSlNPTiA9IGNvcmUuSlNPTiB8fCAoY29yZS5KU09OID0geyBzdHJpbmdpZnk6IEpTT04uc3RyaW5naWZ5IH0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gJEpTT04uc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmd1bWVudHMpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuTWF0aC5zaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuTnVtYmVyLmlzTmFOO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmVudHJpZXM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi45JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgSVNfV1JBUCA9IHR5cGUgJiAkZXhwb3J0Llc7XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXTtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBrZXksIG93biwgb3V0O1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChvd24gJiYgaGFzKGV4cG9ydHMsIGtleSkpIGNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24gKEMpIHtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDKSB7XG4gICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQygpO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZiAoSVNfUFJPVE8pIHtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZiAodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSkgaGlkZShleHBQcm90bywga2V5LCBvdXQpO1xuICAgIH1cbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuIiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24gc2lnbih4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIFMgPSBTeW1ib2woKTtcbiAgdmFyIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgd2hpbGUgKGFMZW4gPiBpbmRleCkge1xuICAgIHZhciBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgaXNFbnVtLmNhbGwoUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgaXNFbnVtID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpc0VudHJpZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IGdldEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBpc0VudW0uY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0ID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyRm4gPSBnZXQoaXQpO1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikgeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKG1hcHBpbmcpIG1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDKCk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvciAocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ246IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpIH0pO1xuIiwiLy8gMjAuMS4yLjQgTnVtYmVyLmlzTmFOKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpIHtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIG9iaiA9IHt9O1xuXHR0cnkge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmosICd4JywgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IG9iaiB9KTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdFx0Zm9yICh2YXIgXyBpbiBvYmopIHsgLy8ganNjczppZ25vcmUgZGlzYWxsb3dVbnVzZWRWYXJpYWJsZXNcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIG9iai54ID09PSBvYmo7XG5cdH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBJRSA4LiAqL1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmplY3RbbmFtZV0gPSB2YWx1ZTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG5cbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHsgcmV0dXJuIG9yaWdLZXlzKG8pOyB9IDogcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcblx0aWYgKE9iamVjdC5rZXlzKSB7XG5cdFx0dmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gU2FmYXJpIDUuMCBidWdcblx0XHRcdHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcblx0XHRcdHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdH0oMSwgMikpO1xuXHRcdGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuXHRcdFx0XHRpZiAoaXNBcmdzKG9iamVjdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbHNcblx0QXRvbWljcyxcblx0U2hhcmVkQXJyYXlCdWZmZXIsXG4qL1xuXG52YXIgdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvdy1yZXN0cmljdGVkLW5hbWVzXG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgVGhyb3dUeXBlRXJyb3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXG5cdD8gKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0OyB9KCkpXG5cdDogZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgJFR5cGVFcnJvcigpOyB9O1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXG52YXIgZ2VuZXJhdG9yOyAvLyA9IGZ1bmN0aW9uICogKCkge307XG52YXIgZ2VuZXJhdG9yRnVuY3Rpb24gPSBnZW5lcmF0b3IgPyBnZXRQcm90byhnZW5lcmF0b3IpIDogdW5kZWZpbmVkO1xudmFyIGFzeW5jRm47IC8vIGFzeW5jIGZ1bmN0aW9uKCkge307XG52YXIgYXN5bmNGdW5jdGlvbiA9IGFzeW5jRm4gPyBhc3luY0ZuLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkO1xudmFyIGFzeW5jR2VuOyAvLyBhc3luYyBmdW5jdGlvbiAqICgpIHt9O1xudmFyIGFzeW5jR2VuRnVuY3Rpb24gPSBhc3luY0dlbiA/IGdldFByb3RvKGFzeW5jR2VuKSA6IHVuZGVmaW5lZDtcbnZhciBhc3luY0dlbkl0ZXJhdG9yID0gYXN5bmNHZW4gPyBhc3luY0dlbigpIDogdW5kZWZpbmVkO1xuXG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0JyQgJUFycmF5JSc6IEFycmF5LFxuXHQnJCAlQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJCAlQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLnByb3RvdHlwZSxcblx0JyQgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCckICVBcnJheVByb3RvdHlwZSUnOiBBcnJheS5wcm90b3R5cGUsXG5cdCckICVBcnJheVByb3RvX2VudHJpZXMlJzogQXJyYXkucHJvdG90eXBlLmVudHJpZXMsXG5cdCckICVBcnJheVByb3RvX2ZvckVhY2glJzogQXJyYXkucHJvdG90eXBlLmZvckVhY2gsXG5cdCckICVBcnJheVByb3RvX2tleXMlJzogQXJyYXkucHJvdG90eXBlLmtleXMsXG5cdCckICVBcnJheVByb3RvX3ZhbHVlcyUnOiBBcnJheS5wcm90b3R5cGUudmFsdWVzLFxuXHQnJCAlQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyQgJUFzeW5jRnVuY3Rpb24lJzogYXN5bmNGdW5jdGlvbixcblx0JyQgJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogYXN5bmNGdW5jdGlvbiA/IGFzeW5jRnVuY3Rpb24ucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlQXN5bmNHZW5lcmF0b3IlJzogYXN5bmNHZW4gPyBnZXRQcm90byhhc3luY0dlbkl0ZXJhdG9yKSA6IHVuZGVmaW5lZCxcblx0JyQgJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogYXN5bmNHZW5GdW5jdGlvbixcblx0JyQgJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IGFzeW5jR2VuRnVuY3Rpb24gPyBhc3luY0dlbkZ1bmN0aW9uLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogYXN5bmNHZW5JdGVyYXRvciAmJiBoYXNTeW1ib2xzICYmIFN5bWJvbC5hc3luY0l0ZXJhdG9yID8gYXN5bmNHZW5JdGVyYXRvcltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSA6IHVuZGVmaW5lZCxcblx0JyQgJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyQgJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyQgJUJvb2xlYW5Qcm90b3R5cGUlJzogQm9vbGVhbi5wcm90b3R5cGUsXG5cdCckICVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCckICVEYXRhVmlld1Byb3RvdHlwZSUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcucHJvdG90eXBlLFxuXHQnJCAlRGF0ZSUnOiBEYXRlLFxuXHQnJCAlRGF0ZVByb3RvdHlwZSUnOiBEYXRlLnByb3RvdHlwZSxcblx0JyQgJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCckICVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJCAlZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyQgJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCckICVFcnJvciUnOiBFcnJvcixcblx0JyQgJUVycm9yUHJvdG90eXBlJSc6IEVycm9yLnByb3RvdHlwZSxcblx0JyQgJWV2YWwlJzogZXZhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG5cdCckICVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJCAlRXZhbEVycm9yUHJvdG90eXBlJSc6IEV2YWxFcnJvci5wcm90b3R5cGUsXG5cdCckICVGbG9hdDMyQXJyYXklJzogdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDMyQXJyYXksXG5cdCckICVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDMyQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlRmxvYXQ2NEFycmF5JSc6IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQ2NEFycmF5LFxuXHQnJCAlRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQ2NEFycmF5LnByb3RvdHlwZSxcblx0JyQgJUZ1bmN0aW9uJSc6IEZ1bmN0aW9uLFxuXHQnJCAlRnVuY3Rpb25Qcm90b3R5cGUlJzogRnVuY3Rpb24ucHJvdG90eXBlLFxuXHQnJCAlR2VuZXJhdG9yJSc6IGdlbmVyYXRvciA/IGdldFByb3RvKGdlbmVyYXRvcigpKSA6IHVuZGVmaW5lZCxcblx0JyQgJUdlbmVyYXRvckZ1bmN0aW9uJSc6IGdlbmVyYXRvckZ1bmN0aW9uLFxuXHQnJCAlR2VuZXJhdG9yUHJvdG90eXBlJSc6IGdlbmVyYXRvckZ1bmN0aW9uID8gZ2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJCAlSW50OEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LnByb3RvdHlwZSxcblx0JyQgJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyQgJUludDE2QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LnByb3RvdHlwZSxcblx0JyQgJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyQgJUludDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheS5wcm90b3R5cGUsXG5cdCckICVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyQgJWlzTmFOJSc6IGlzTmFOLFxuXHQnJCAlSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJCAlSlNPTiUnOiBKU09OLFxuXHQnJCAlSlNPTlBhcnNlJSc6IEpTT04ucGFyc2UsXG5cdCckICVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCckICVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJCAlTWFwUHJvdG90eXBlJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTWFwLnByb3RvdHlwZSxcblx0JyQgJU1hdGglJzogTWF0aCxcblx0JyQgJU51bWJlciUnOiBOdW1iZXIsXG5cdCckICVOdW1iZXJQcm90b3R5cGUlJzogTnVtYmVyLnByb3RvdHlwZSxcblx0JyQgJU9iamVjdCUnOiBPYmplY3QsXG5cdCckICVPYmplY3RQcm90b3R5cGUlJzogT2JqZWN0LnByb3RvdHlwZSxcblx0JyQgJU9ialByb3RvX3RvU3RyaW5nJSc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG5cdCckICVPYmpQcm90b192YWx1ZU9mJSc6IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZixcblx0JyQgJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyQgJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuXHQnJCAlUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJCAlUHJvbWlzZVByb3RvdHlwZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnByb3RvdHlwZSxcblx0JyQgJVByb21pc2VQcm90b190aGVuJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UucHJvdG90eXBlLnRoZW4sXG5cdCckICVQcm9taXNlX2FsbCUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLmFsbCxcblx0JyQgJVByb21pc2VfcmVqZWN0JSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UucmVqZWN0LFxuXHQnJCAlUHJvbWlzZV9yZXNvbHZlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UucmVzb2x2ZSxcblx0JyQgJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyQgJVJhbmdlRXJyb3IlJzogUmFuZ2VFcnJvcixcblx0JyQgJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogUmFuZ2VFcnJvci5wcm90b3R5cGUsXG5cdCckICVSZWZlcmVuY2VFcnJvciUnOiBSZWZlcmVuY2VFcnJvcixcblx0JyQgJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFJlZmVyZW5jZUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyQgJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCckICVSZWdFeHBQcm90b3R5cGUlJzogUmVnRXhwLnByb3RvdHlwZSxcblx0JyQgJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyQgJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCckICVTZXRQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQucHJvdG90eXBlLFxuXHQnJCAlU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJCAlU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLnByb3RvdHlwZSxcblx0JyQgJVN0cmluZyUnOiBTdHJpbmcsXG5cdCckICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyQgJVN0cmluZ1Byb3RvdHlwZSUnOiBTdHJpbmcucHJvdG90eXBlLFxuXHQnJCAlU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCckICVTeW1ib2xQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVTeW50YXhFcnJvciUnOiBTeW50YXhFcnJvcixcblx0JyQgJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFN5bnRheEVycm9yLnByb3RvdHlwZSxcblx0JyQgJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJCAlVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJCAlVHlwZWRBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5ID8gVHlwZWRBcnJheS5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyQgJVR5cGVFcnJvclByb3RvdHlwZSUnOiAkVHlwZUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyQgJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCckICVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJCAlVWludDE2QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyQgJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheS5wcm90b3R5cGUsXG5cdCckICVVUklFcnJvciUnOiBVUklFcnJvcixcblx0JyQgJVVSSUVycm9yUHJvdG90eXBlJSc6IFVSSUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyQgJVdlYWtNYXBQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcC5wcm90b3R5cGUsXG5cdCckICVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQsXG5cdCckICVXZWFrU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQucHJvdG90eXBlXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGtleSA9ICckICcgKyBuYW1lO1xuXHRpZiAoIShrZXkgaW4gSU5UUklOU0lDUykpIHtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG5cdH1cblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgaWYgLy8gaG9wZWZ1bGx5IHRoaXMgaXMgaW1wb3NzaWJsZSB0byB0ZXN0IDotKVxuXHRpZiAodHlwZW9mIElOVFJJTlNJQ1Nba2V5XSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHR9XG5cblx0cmV0dXJuIElOVFJJTlNJQ1Nba2V5XTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXG5cdGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpO1xuXHR9XG5cblx0dmFyIHZhbHVlID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBwYXJ0c1swXSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0Zm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRzW2ldXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzNicpO1xudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFJhbmdlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVSYW5nZUVycm9yJScpO1xudmFyICRTeW50YXhFcnJvciA9IEdldEludHJpbnNpYygnJVN5bnRheEVycm9yJScpO1xudmFyICRBcnJheSA9IEdldEludHJpbnNpYygnJUFycmF5JScpO1xudmFyICRBcnJheVByb3RvdHlwZSA9ICRBcnJheS5wcm90b3R5cGU7XG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xudmFyICROdW1iZXIgPSBHZXRJbnRyaW5zaWMoJyVOdW1iZXIlJyk7XG52YXIgJFN5bWJvbCA9IEdldEludHJpbnNpYygnJVN5bWJvbCUnLCB0cnVlKTtcbnZhciAkUmVnRXhwID0gR2V0SW50cmluc2ljKCclUmVnRXhwJScpO1xudmFyICREYXRlID0gR2V0SW50cmluc2ljKCclRGF0ZSUnKTtcbnZhciAkRnVuY3Rpb24gPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbiUnKTtcbnZhciAkcHJldmVudEV4dGVuc2lvbnMgPSAkT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIGFzc2VydFJlY29yZCA9IHJlcXVpcmUoJy4vaGVscGVycy9hc3NlcnRSZWNvcmQnKTtcbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNOYU4nKTtcbnZhciAkaXNGaW5pdGUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNGaW5pdGUnKTtcbnZhciBNQVhfQVJSQVlfTEVOR1RIID0gTWF0aC5wb3coMiwgMzIpIC0gMTtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gcmVxdWlyZSgnLi9oZWxwZXJzL21heFNhZmVJbnRlZ2VyJyk7XG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9zaWduJyk7XG52YXIgbW9kID0gcmVxdWlyZSgnLi9oZWxwZXJzL21vZCcpO1xudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4vaGVscGVycy9mb3JFYWNoJyk7XG52YXIgZXZlcnkgPSByZXF1aXJlKCcuL2hlbHBlcnMvZXZlcnknKTtcbnZhciBpc1NhbWVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNTYW1lUHJvcGVydHlEZXNjcmlwdG9yJyk7XG52YXIgaXNQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNQcm9wZXJ0eURlc2NyaXB0b3InKTtcbnZhciBwYXJzZUludGVnZXIgPSBwYXJzZUludDtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJvdW5kJyk7XG52YXIgcmVnZXhUZXN0ZXIgPSByZXF1aXJlKCcuL2hlbHBlcnMvcmVnZXhUZXN0ZXInKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4vaGVscGVycy9nZXRJdGVyYXRvck1ldGhvZCcpO1xudmFyIGdldFN5bWJvbERlc2NyaXB0aW9uID0gcmVxdWlyZSgnLi9oZWxwZXJzL2dldFN5bWJvbERlc2NyaXB0aW9uJyk7XG5cbnZhciAkUHJvbWlzZVRoZW4gPSBjYWxsQm91bmQoJ1Byb21pc2UucHJvdG90eXBlLnRoZW4nLCB0cnVlKTtcbnZhciBhcnJheVNsaWNlID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciBzdHJTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xudmFyICRpbmRleE9mID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUuaW5kZXhPZicpO1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xuXG52YXIgaXNCaW5hcnkgPSByZWdleFRlc3RlcigvXjBiWzAxXSskL2kpO1xudmFyIGlzT2N0YWwgPSByZWdleFRlc3RlcigvXjBvWzAtN10rJC9pKTtcbnZhciBpc0RpZ2l0ID0gcmVnZXhUZXN0ZXIoL15bMC05XSQvKTtcbnZhciByZWdleEV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyIG5vbldTID0gWydcXHUwMDg1JywgJ1xcdTIwMGInLCAnXFx1ZmZmZSddLmpvaW4oJycpO1xudmFyIG5vbldTcmVnZXggPSBuZXcgJFJlZ0V4cCgnWycgKyBub25XUyArICddJywgJ2cnKTtcbnZhciBoYXNOb25XUyA9IHJlZ2V4VGVzdGVyKG5vbldTcmVnZXgpO1xudmFyIGlzSW52YWxpZEhleExpdGVyYWwgPSByZWdleFRlc3RlcigvXlstK10weFswLTlhLWZdKyQvaSk7XG52YXIgJGNoYXJDb2RlQXQgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdCcpO1xudmFyICRpc0VudW1lcmFibGUgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUnKTtcblxudmFyIHRvU3RyID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciAkTnVtYmVyVmFsdWVPZiA9IGNhbGxCb3VuZCgnTnVtYmVyLnByb3RvdHlwZS52YWx1ZU9mJyk7XG52YXIgJEJvb2xlYW5WYWx1ZU9mID0gY2FsbEJvdW5kKCdCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mJyk7XG52YXIgJFN0cmluZ1ZhbHVlT2YgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUudmFsdWVPZicpO1xudmFyICREYXRlVmFsdWVPZiA9IGNhbGxCb3VuZCgnRGF0ZS5wcm90b3R5cGUudmFsdWVPZicpO1xudmFyICRTeW1ib2xUb1N0cmluZyA9IGNhbGxCb3VuZCgnU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZycsIHRydWUpO1xuXG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciAkYWJzID0gTWF0aC5hYnM7XG5cbnZhciAkT2JqZWN0Q3JlYXRlID0gJE9iamVjdC5jcmVhdGU7XG52YXIgJGdPUEQgPSAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciAkZ09QTiA9ICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciAkZ09QUyA9ICRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyICRpc0V4dGVuc2libGUgPSAkT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSAkT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyICRzZXRQcm90byA9IHJlcXVpcmUoJy4vaGVscGVycy9zZXRQcm90bycpO1xuXG52YXIgRGVmaW5lT3duUHJvcGVydHkgPSBmdW5jdGlvbiBEZWZpbmVPd25Qcm9wZXJ0eShFUywgTywgUCwgZGVzYykge1xuXHRpZiAoISRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdGlmICghRVMuSXNEYXRhRGVzY3JpcHRvcihkZXNjKSkge1xuXHRcdFx0Ly8gRVMzIGRvZXMgbm90IHN1cHBvcnQgZ2V0dGVycy9zZXR0ZXJzXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghZGVzY1snW1tDb25maWd1cmFibGVdXSddIHx8ICFkZXNjWydbW1dyaXRhYmxlXV0nXSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGZhbGxiYWNrIGZvciBFUzNcblx0XHRpZiAoUCBpbiBPICYmICRpc0VudW1lcmFibGUoTywgUCkgIT09ICEhZGVzY1snW1tFbnVtZXJhYmxlXV0nXSkge1xuXHRcdFx0Ly8gYSBub24tZW51bWVyYWJsZSBleGlzdGluZyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0IGF0IGFsbCwgb3IgZXhpc3RzIGJ1dCBpcyBlbnVtZXJhYmxlXG5cdFx0dmFyIFYgPSBkZXNjWydbW1ZhbHVlXV0nXTtcblx0XHRPW1BdID0gVjsgLy8gd2lsbCB1c2UgW1tEZWZpbmVdXVxuXHRcdHJldHVybiBFUy5TYW1lVmFsdWUoT1tQXSwgVik7XG5cdH1cblx0JGRlZmluZVByb3BlcnR5KE8sIFAsIEVTLkZyb21Qcm9wZXJ0eURlc2NyaXB0b3IoZGVzYykpO1xuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIHdoaXRlc3BhY2UgZnJvbTogaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNS40LjIwXG4vLyBpbXBsZW1lbnRhdGlvbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9ibG9iL3YzLjQuMC9lczUtc2hpbS5qcyNMMTMwNC1MMTMyNFxudmFyIHdzID0gW1xuXHQnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDMnLFxuXHQnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjgnLFxuXHQnXFx1MjAyOVxcdUZFRkYnXG5dLmpvaW4oJycpO1xudmFyIHRyaW1SZWdleCA9IG5ldyBSZWdFeHAoJyheWycgKyB3cyArICddKyl8KFsnICsgd3MgKyAnXSskKScsICdnJyk7XG52YXIgJHJlcGxhY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUucmVwbGFjZScpO1xudmFyIHRyaW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuICRyZXBsYWNlKHZhbHVlLCB0cmltUmVnZXgsICcnKTtcbn07XG5cbnZhciBFUzUgPSByZXF1aXJlKCcuL2VzNScpO1xuXG52YXIgaGFzUmVnRXhwTWF0Y2hlciA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG5cbi8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1hYnN0cmFjdC1vcGVyYXRpb25zXG52YXIgRVM2ID0gYXNzaWduKGFzc2lnbih7fSwgRVM1KSwge1xuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1jYWxsLWYtdi1hcmdzXG5cdENhbGw6IGZ1bmN0aW9uIENhbGwoRiwgVikge1xuXHRcdHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBbXTtcblx0XHRpZiAoIXRoaXMuSXNDYWxsYWJsZShGKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoaW5zcGVjdChGKSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHR9XG5cdFx0cmV0dXJuIEYuYXBwbHkoViwgYXJncyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvcHJpbWl0aXZlXG5cdFRvUHJpbWl0aXZlOiB0b1ByaW1pdGl2ZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9ib29sZWFuXG5cdC8vIFRvQm9vbGVhbjogRVM1LlRvQm9vbGVhbixcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9udW1iZXJcblx0VG9OdW1iZXI6IGZ1bmN0aW9uIFRvTnVtYmVyKGFyZ3VtZW50KSB7XG5cdFx0dmFyIHZhbHVlID0gaXNQcmltaXRpdmUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJE51bWJlcik7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIG51bWJlcicpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKGlzQmluYXJ5KHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcihwYXJzZUludGVnZXIoc3RyU2xpY2UodmFsdWUsIDIpLCAyKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzT2N0YWwodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHBhcnNlSW50ZWdlcihzdHJTbGljZSh2YWx1ZSwgMiksIDgpKTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzTm9uV1ModmFsdWUpIHx8IGlzSW52YWxpZEhleExpdGVyYWwodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBOYU47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgdHJpbW1lZCA9IHRyaW0odmFsdWUpO1xuXHRcdFx0XHRpZiAodHJpbW1lZCAhPT0gdmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih0cmltbWVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gJE51bWJlcih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvaW50ZWdlclxuXHQvLyBUb0ludGVnZXI6IEVTNS5Ub051bWJlcixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnQzMlxuXHQvLyBUb0ludDMyOiBFUzUuVG9JbnQzMixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG91aW50MzJcblx0Ly8gVG9VaW50MzI6IEVTNS5Ub1VpbnQzMixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnQxNlxuXHRUb0ludDE2OiBmdW5jdGlvbiBUb0ludDE2KGFyZ3VtZW50KSB7XG5cdFx0dmFyIGludDE2Yml0ID0gdGhpcy5Ub1VpbnQxNihhcmd1bWVudCk7XG5cdFx0cmV0dXJuIGludDE2Yml0ID49IDB4ODAwMCA/IGludDE2Yml0IC0gMHgxMDAwMCA6IGludDE2Yml0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQxNlxuXHQvLyBUb1VpbnQxNjogRVM1LlRvVWludDE2LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDhcblx0VG9JbnQ4OiBmdW5jdGlvbiBUb0ludDgoYXJndW1lbnQpIHtcblx0XHR2YXIgaW50OGJpdCA9IHRoaXMuVG9VaW50OChhcmd1bWVudCk7XG5cdFx0cmV0dXJuIGludDhiaXQgPj0gMHg4MCA/IGludDhiaXQgLSAweDEwMCA6IGludDhiaXQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDhcblx0VG9VaW50ODogZnVuY3Rpb24gVG9VaW50OChhcmd1bWVudCkge1xuXHRcdHZhciBudW1iZXIgPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09PSAwIHx8ICEkaXNGaW5pdGUobnVtYmVyKSkgeyByZXR1cm4gMDsgfVxuXHRcdHZhciBwb3NJbnQgPSBzaWduKG51bWJlcikgKiAkZmxvb3IoJGFicyhudW1iZXIpKTtcblx0XHRyZXR1cm4gbW9kKHBvc0ludCwgMHgxMDApO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQ4Y2xhbXBcblx0VG9VaW50OENsYW1wOiBmdW5jdGlvbiBUb1VpbnQ4Q2xhbXAoYXJndW1lbnQpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcihhcmd1bWVudCk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA8PSAwKSB7IHJldHVybiAwOyB9XG5cdFx0aWYgKG51bWJlciA+PSAweEZGKSB7IHJldHVybiAweEZGOyB9XG5cdFx0dmFyIGYgPSAkZmxvb3IoYXJndW1lbnQpO1xuXHRcdGlmIChmICsgMC41IDwgbnVtYmVyKSB7IHJldHVybiBmICsgMTsgfVxuXHRcdGlmIChudW1iZXIgPCBmICsgMC41KSB7IHJldHVybiBmOyB9XG5cdFx0aWYgKGYgJSAyICE9PSAwKSB7IHJldHVybiBmICsgMTsgfVxuXHRcdHJldHVybiBmO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3N0cmluZ1xuXHRUb1N0cmluZzogZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3ltYm9sJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9vYmplY3Rcblx0VG9PYmplY3Q6IGZ1bmN0aW9uIFRvT2JqZWN0KHZhbHVlKSB7XG5cdFx0dGhpcy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHZhbHVlKTtcblx0XHRyZXR1cm4gJE9iamVjdCh2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvcHJvcGVydHlrZXlcblx0VG9Qcm9wZXJ0eUtleTogZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuXHRcdHZhciBrZXkgPSB0aGlzLlRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkU3RyaW5nKTtcblx0XHRyZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgPyBrZXkgOiB0aGlzLlRvU3RyaW5nKGtleSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG5cdFRvTGVuZ3RoOiBmdW5jdGlvbiBUb0xlbmd0aChhcmd1bWVudCkge1xuXHRcdHZhciBsZW4gPSB0aGlzLlRvSW50ZWdlcihhcmd1bWVudCk7XG5cdFx0aWYgKGxlbiA8PSAwKSB7IHJldHVybiAwOyB9IC8vIGluY2x1ZGVzIGNvbnZlcnRpbmcgLTAgdG8gKzBcblx0XHRpZiAobGVuID4gTUFYX1NBRkVfSU5URUdFUikgeyByZXR1cm4gTUFYX1NBRkVfSU5URUdFUjsgfVxuXHRcdHJldHVybiBsZW47XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNhbm9uaWNhbG51bWVyaWNpbmRleHN0cmluZ1xuXHRDYW5vbmljYWxOdW1lcmljSW5kZXhTdHJpbmc6IGZ1bmN0aW9uIENhbm9uaWNhbE51bWVyaWNJbmRleFN0cmluZyhhcmd1bWVudCkge1xuXHRcdGlmICh0b1N0cihhcmd1bWVudCkgIT09ICdbb2JqZWN0IFN0cmluZ10nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignbXVzdCBiZSBhIHN0cmluZycpO1xuXHRcdH1cblx0XHRpZiAoYXJndW1lbnQgPT09ICctMCcpIHsgcmV0dXJuIC0wOyB9XG5cdFx0dmFyIG4gPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAodGhpcy5TYW1lVmFsdWUodGhpcy5Ub1N0cmluZyhuKSwgYXJndW1lbnQpKSB7IHJldHVybiBuOyB9XG5cdFx0cmV0dXJuIHZvaWQgMDtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlOiBFUzUuQ2hlY2tPYmplY3RDb2VyY2libGUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzYXJyYXlcblx0SXNBcnJheTogJEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gSXNBcnJheShhcmd1bWVudCkge1xuXHRcdHJldHVybiB0b1N0cihhcmd1bWVudCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzY2FsbGFibGVcblx0Ly8gSXNDYWxsYWJsZTogRVM1LklzQ2FsbGFibGUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzY29uc3RydWN0b3Jcblx0SXNDb25zdHJ1Y3RvcjogZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuXHRcdHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicgJiYgISFhcmd1bWVudC5wcm90b3R5cGU7IC8vIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBubyB3YXkgdG8gdHJ1bHkgY2hlY2sgdGhpcyB3aXRob3V0IHRyeS9jYXRjaCBgbmV3IGFyZ3VtZW50YCBvciBQcm94eVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1pc2V4dGVuc2libGUtb1xuXHRJc0V4dGVuc2libGU6ICRwcmV2ZW50RXh0ZW5zaW9uc1xuXHRcdD8gZnVuY3Rpb24gSXNFeHRlbnNpYmxlKG9iaikge1xuXHRcdFx0aWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICRpc0V4dGVuc2libGUob2JqKTtcblx0XHR9XG5cdFx0OiBmdW5jdGlvbiBpc0V4dGVuc2libGUob2JqKSB7IHJldHVybiB0cnVlOyB9LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzaW50ZWdlclxuXHRJc0ludGVnZXI6IGZ1bmN0aW9uIElzSW50ZWdlcihhcmd1bWVudCkge1xuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgIT09ICdudW1iZXInIHx8ICRpc05hTihhcmd1bWVudCkgfHwgISRpc0Zpbml0ZShhcmd1bWVudCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dmFyIGFicyA9ICRhYnMoYXJndW1lbnQpO1xuXHRcdHJldHVybiAkZmxvb3IoYWJzKSA9PT0gYWJzO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1pc3Byb3BlcnR5a2V5XG5cdElzUHJvcGVydHlLZXk6IGZ1bmN0aW9uIElzUHJvcGVydHlLZXkoYXJndW1lbnQpIHtcblx0XHRyZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc3JlZ2V4cFxuXHRJc1JlZ0V4cDogZnVuY3Rpb24gSXNSZWdFeHAoYXJndW1lbnQpIHtcblx0XHRpZiAoIWFyZ3VtZW50IHx8IHR5cGVvZiBhcmd1bWVudCAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGhhc1N5bWJvbHMpIHtcblx0XHRcdHZhciBpc1JlZ0V4cCA9IGFyZ3VtZW50WyRTeW1ib2wubWF0Y2hdO1xuXHRcdFx0aWYgKHR5cGVvZiBpc1JlZ0V4cCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuIEVTNS5Ub0Jvb2xlYW4oaXNSZWdFeHApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaGFzUmVnRXhwTWF0Y2hlcihhcmd1bWVudCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXNhbWV2YWx1ZVxuXHQvLyBTYW1lVmFsdWU6IEVTNS5TYW1lVmFsdWUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXNhbWV2YWx1ZXplcm9cblx0U2FtZVZhbHVlWmVybzogZnVuY3Rpb24gU2FtZVZhbHVlWmVybyh4LCB5KSB7XG5cdFx0cmV0dXJuICh4ID09PSB5KSB8fCAoJGlzTmFOKHgpICYmICRpc05hTih5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy4yIEdldFYgKFYsIFApXG5cdCAqIDEuIEFzc2VydDogSXNQcm9wZXJ0eUtleShQKSBpcyB0cnVlLlxuXHQgKiAyLiBMZXQgTyBiZSBUb09iamVjdChWKS5cblx0ICogMy4gUmV0dXJuSWZBYnJ1cHQoTykuXG5cdCAqIDQuIFJldHVybiBPLltbR2V0XV0oUCwgVikuXG5cdCAqL1xuXHRHZXRWOiBmdW5jdGlvbiBHZXRWKFYsIFApIHtcblx0XHQvLyA3LjMuMi4xXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjIuMi0zXG5cdFx0dmFyIE8gPSB0aGlzLlRvT2JqZWN0KFYpO1xuXG5cdFx0Ly8gNy4zLjIuNFxuXHRcdHJldHVybiBPW1BdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiA3LjMuOSAtIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRtZXRob2Rcblx0ICogMS4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDIuIExldCBmdW5jIGJlIEdldFYoTywgUCkuXG5cdCAqIDMuIFJldHVybklmQWJydXB0KGZ1bmMpLlxuXHQgKiA0LiBJZiBmdW5jIGlzIGVpdGhlciB1bmRlZmluZWQgb3IgbnVsbCwgcmV0dXJuIHVuZGVmaW5lZC5cblx0ICogNS4gSWYgSXNDYWxsYWJsZShmdW5jKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuXHQgKiA2LiBSZXR1cm4gZnVuYy5cblx0ICovXG5cdEdldE1ldGhvZDogZnVuY3Rpb24gR2V0TWV0aG9kKE8sIFApIHtcblx0XHQvLyA3LjMuOS4xXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuMlxuXHRcdHZhciBmdW5jID0gdGhpcy5HZXRWKE8sIFApO1xuXG5cdFx0Ly8gNy4zLjkuNFxuXHRcdGlmIChmdW5jID09IG51bGwpIHtcblx0XHRcdHJldHVybiB2b2lkIDA7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuNVxuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKGZ1bmMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcihQICsgJ2lzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuNlxuXHRcdHJldHVybiBmdW5jO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiA3LjMuMSBHZXQgKE8sIFApIC0gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldC1vLXBcblx0ICogMS4gQXNzZXJ0OiBUeXBlKE8pIGlzIE9iamVjdC5cblx0ICogMi4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDMuIFJldHVybiBPLltbR2V0XV0oUCwgTykuXG5cdCAqL1xuXHRHZXQ6IGZ1bmN0aW9uIEdldChPLCBQKSB7XG5cdFx0Ly8gNy4zLjEuMVxuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdC8vIDcuMy4xLjJcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUsIGdvdCAnICsgaW5zcGVjdChQKSk7XG5cdFx0fVxuXHRcdC8vIDcuMy4xLjNcblx0XHRyZXR1cm4gT1tQXTtcblx0fSxcblxuXHRUeXBlOiBmdW5jdGlvbiBUeXBlKHgpIHtcblx0XHRpZiAodHlwZW9mIHggPT09ICdzeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gJ1N5bWJvbCc7XG5cdFx0fVxuXHRcdHJldHVybiBFUzUuVHlwZSh4KTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5cdFNwZWNpZXNDb25zdHJ1Y3RvcjogZnVuY3Rpb24gU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHZhciBDID0gTy5jb25zdHJ1Y3Rvcjtcblx0XHRpZiAodHlwZW9mIEMgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdENvbnN0cnVjdG9yO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKEMpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ08uY29uc3RydWN0b3IgaXMgbm90IGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgUyA9IGhhc1N5bWJvbHMgJiYgJFN5bWJvbC5zcGVjaWVzID8gQ1skU3ltYm9sLnNwZWNpZXNdIDogdm9pZCAwO1xuXHRcdGlmIChTID09IG51bGwpIHtcblx0XHRcdHJldHVybiBkZWZhdWx0Q29uc3RydWN0b3I7XG5cdFx0fVxuXHRcdGlmICh0aGlzLklzQ29uc3RydWN0b3IoUykpIHtcblx0XHRcdHJldHVybiBTO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignbm8gY29uc3RydWN0b3IgZm91bmQnKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWZyb21wcm9wZXJ0eWRlc2NyaXB0b3Jcblx0RnJvbVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gRnJvbVByb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIERlc2M7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdHZhciBvYmogPSB7fTtcblx0XHRpZiAoJ1tbVmFsdWVdXScgaW4gRGVzYykge1xuXHRcdFx0b2JqLnZhbHVlID0gRGVzY1snW1tWYWx1ZV1dJ107XG5cdFx0fVxuXHRcdGlmICgnW1tXcml0YWJsZV1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmoud3JpdGFibGUgPSBEZXNjWydbW1dyaXRhYmxlXV0nXTtcblx0XHR9XG5cdFx0aWYgKCdbW0dldF1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmouZ2V0ID0gRGVzY1snW1tHZXRdXSddO1xuXHRcdH1cblx0XHRpZiAoJ1tbU2V0XV0nIGluIERlc2MpIHtcblx0XHRcdG9iai5zZXQgPSBEZXNjWydbW1NldF1dJ107XG5cdFx0fVxuXHRcdGlmICgnW1tFbnVtZXJhYmxlXV0nIGluIERlc2MpIHtcblx0XHRcdG9iai5lbnVtZXJhYmxlID0gRGVzY1snW1tFbnVtZXJhYmxlXV0nXTtcblx0XHR9XG5cdFx0aWYgKCdbW0NvbmZpZ3VyYWJsZV1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmouY29uZmlndXJhYmxlID0gRGVzY1snW1tDb25maWd1cmFibGVdXSddO1xuXHRcdH1cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jb21wbGV0ZXByb3BlcnR5ZGVzY3JpcHRvclxuXHRDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykge1xuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAodGhpcy5Jc0dlbmVyaWNEZXNjcmlwdG9yKERlc2MpIHx8IHRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbVmFsdWVdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbVmFsdWVdXSddID0gdm9pZCAwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbV3JpdGFibGVdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbV3JpdGFibGVdXSddID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghaGFzKERlc2MsICdbW0dldF1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tHZXRdXSddID0gdm9pZCAwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbU2V0XV0nKSkge1xuXHRcdFx0XHREZXNjWydbW1NldF1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghaGFzKERlc2MsICdbW0VudW1lcmFibGVdXScpKSB7XG5cdFx0XHREZXNjWydbW0VudW1lcmFibGVdXSddID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghaGFzKERlc2MsICdbW0NvbmZpZ3VyYWJsZV1dJykpIHtcblx0XHRcdERlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXSA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gRGVzYztcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2V0LW8tcC12LXRocm93XG5cdFNldDogZnVuY3Rpb24gU2V0KE8sIFAsIFYsIFRocm93KSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUoVGhyb3cpICE9PSAnQm9vbGVhbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdUaHJvdyBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHRcdH1cblx0XHRpZiAoVGhyb3cpIHtcblx0XHRcdE9bUF0gPSBWO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdE9bUF0gPSBWO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1oYXNvd25wcm9wZXJ0eVxuXHRIYXNPd25Qcm9wZXJ0eTogZnVuY3Rpb24gSGFzT3duUHJvcGVydHkoTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignTyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRyZXR1cm4gaGFzKE8sIFApO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1oYXNwcm9wZXJ0eVxuXHRIYXNQcm9wZXJ0eTogZnVuY3Rpb24gSGFzUHJvcGVydHkoTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignTyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRyZXR1cm4gUCBpbiBPO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc2NvbmNhdHNwcmVhZGFibGVcblx0SXNDb25jYXRTcHJlYWRhYmxlOiBmdW5jdGlvbiBJc0NvbmNhdFNwcmVhZGFibGUoTykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChoYXNTeW1ib2xzICYmIHR5cGVvZiAkU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRcdHZhciBzcHJlYWRhYmxlID0gdGhpcy5HZXQoTywgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSk7XG5cdFx0XHRpZiAodHlwZW9mIHNwcmVhZGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvQm9vbGVhbihzcHJlYWRhYmxlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuSXNBcnJheShPKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaW52b2tlXG5cdEludm9rZTogZnVuY3Rpb24gSW52b2tlKE8sIFApIHtcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHR2YXIgYXJndW1lbnRzTGlzdCA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAyKTtcblx0XHR2YXIgZnVuYyA9IHRoaXMuR2V0VihPLCBQKTtcblx0XHRyZXR1cm4gdGhpcy5DYWxsKGZ1bmMsIE8sIGFyZ3VtZW50c0xpc3QpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRpdGVyYXRvclxuXHRHZXRJdGVyYXRvcjogZnVuY3Rpb24gR2V0SXRlcmF0b3Iob2JqLCBtZXRob2QpIHtcblx0XHR2YXIgYWN0dWFsTWV0aG9kID0gbWV0aG9kO1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdFx0YWN0dWFsTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QodGhpcywgb2JqKTtcblx0XHR9XG5cdFx0dmFyIGl0ZXJhdG9yID0gdGhpcy5DYWxsKGFjdHVhbE1ldGhvZCwgb2JqKTtcblx0XHRpZiAodGhpcy5UeXBlKGl0ZXJhdG9yKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IHJldHVybiBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlcmF0b3I7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9ybmV4dFxuXHRJdGVyYXRvck5leHQ6IGZ1bmN0aW9uIEl0ZXJhdG9yTmV4dChpdGVyYXRvciwgdmFsdWUpIHtcblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5JbnZva2UoaXRlcmF0b3IsICduZXh0JywgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBbXSA6IFt2YWx1ZV0pO1xuXHRcdGlmICh0aGlzLlR5cGUocmVzdWx0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpdGVyYXRvciBuZXh0IG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pdGVyYXRvcmNvbXBsZXRlXG5cdEl0ZXJhdG9yQ29tcGxldGU6IGZ1bmN0aW9uIEl0ZXJhdG9yQ29tcGxldGUoaXRlclJlc3VsdCkge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlclJlc3VsdCkgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShpdGVyUmVzdWx0KSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLlRvQm9vbGVhbih0aGlzLkdldChpdGVyUmVzdWx0LCAnZG9uZScpKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3J2YWx1ZVxuXHRJdGVyYXRvclZhbHVlOiBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcblx0XHRpZiAodGhpcy5UeXBlKGl0ZXJSZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoaXRlclJlc3VsdCkgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5HZXQoaXRlclJlc3VsdCwgJ3ZhbHVlJyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yc3RlcFxuXHRJdGVyYXRvclN0ZXA6IGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuXHRcdHZhciByZXN1bHQgPSB0aGlzLkl0ZXJhdG9yTmV4dChpdGVyYXRvcik7XG5cdFx0dmFyIGRvbmUgPSB0aGlzLkl0ZXJhdG9yQ29tcGxldGUocmVzdWx0KTtcblx0XHRyZXR1cm4gZG9uZSA9PT0gdHJ1ZSA/IGZhbHNlIDogcmVzdWx0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pdGVyYXRvcmNsb3NlXG5cdEl0ZXJhdG9yQ2xvc2U6IGZ1bmN0aW9uIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pIHtcblx0XHRpZiAodGhpcy5UeXBlKGl0ZXJhdG9yKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKGl0ZXJhdG9yKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKGNvbXBsZXRpb24pKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogY29tcGxldGlvbiBpcyBub3QgYSB0aHVuayBmb3IgYSBDb21wbGV0aW9uIFJlY29yZCcpO1xuXHRcdH1cblx0XHR2YXIgY29tcGxldGlvblRodW5rID0gY29tcGxldGlvbjtcblxuXHRcdHZhciBpdGVyYXRvclJldHVybiA9IHRoaXMuR2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG5cblx0XHRpZiAodHlwZW9mIGl0ZXJhdG9yUmV0dXJuID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGNvbXBsZXRpb25UaHVuaygpO1xuXHRcdH1cblxuXHRcdHZhciBjb21wbGV0aW9uUmVjb3JkO1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgaW5uZXJSZXN1bHQgPSB0aGlzLkNhbGwoaXRlcmF0b3JSZXR1cm4sIGl0ZXJhdG9yLCBbXSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Ly8gaWYgd2UgaGl0IGhlcmUsIHRoZW4gXCJlXCIgaXMgdGhlIGlubmVyUmVzdWx0IGNvbXBsZXRpb24gdGhhdCBuZWVkcyByZS10aHJvd2luZ1xuXG5cdFx0XHQvLyBpZiB0aGUgY29tcGxldGlvbiBpcyBvZiB0eXBlIFwidGhyb3dcIiwgdGhpcyB3aWxsIHRocm93LlxuXHRcdFx0Y29tcGxldGlvblJlY29yZCA9IGNvbXBsZXRpb25UaHVuaygpO1xuXHRcdFx0Y29tcGxldGlvblRodW5rID0gbnVsbDsgLy8gZW5zdXJlIGl0J3Mgbm90IGNhbGxlZCB0d2ljZS5cblxuXHRcdFx0Ly8gaWYgbm90LCB0aGVuIHJldHVybiB0aGUgaW5uZXJSZXN1bHQgY29tcGxldGlvblxuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdFx0Y29tcGxldGlvblJlY29yZCA9IGNvbXBsZXRpb25UaHVuaygpOyAvLyBpZiBpbm5lclJlc3VsdCB3b3JrZWQsIHRoZW4gdGhyb3cgaWYgdGhlIGNvbXBsZXRpb24gZG9lc1xuXHRcdGNvbXBsZXRpb25UaHVuayA9IG51bGw7IC8vIGVuc3VyZSBpdCdzIG5vdCBjYWxsZWQgdHdpY2UuXG5cblx0XHRpZiAodGhpcy5UeXBlKGlubmVyUmVzdWx0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpdGVyYXRvciAucmV0dXJuIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wbGV0aW9uUmVjb3JkO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jcmVhdGVpdGVycmVzdWx0b2JqZWN0XG5cdENyZWF0ZUl0ZXJSZXN1bHRPYmplY3Q6IGZ1bmN0aW9uIENyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodmFsdWUsIGRvbmUpIHtcblx0XHRpZiAodGhpcy5UeXBlKGRvbmUpICE9PSAnQm9vbGVhbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKGRvbmUpIGlzIG5vdCBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRkb25lOiBkb25lXG5cdFx0fTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcmVnZXhwZXhlY1xuXHRSZWdFeHBFeGVjOiBmdW5jdGlvbiBSZWdFeHBFeGVjKFIsIFMpIHtcblx0XHRpZiAodGhpcy5UeXBlKFIpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1IgbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShTKSAhPT0gJ1N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdFx0dmFyIGV4ZWMgPSB0aGlzLkdldChSLCAnZXhlYycpO1xuXHRcdGlmICh0aGlzLklzQ2FsbGFibGUoZXhlYykpIHtcblx0XHRcdHZhciByZXN1bHQgPSB0aGlzLkNhbGwoZXhlYywgUiwgW1NdKTtcblx0XHRcdGlmIChyZXN1bHQgPT09IG51bGwgfHwgdGhpcy5UeXBlKHJlc3VsdCkgPT09ICdPYmplY3QnKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJleGVjXCIgbWV0aG9kIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2V4RXhlYyhSLCBTKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5cdEFycmF5U3BlY2llc0NyZWF0ZTogZnVuY3Rpb24gQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIobGVuZ3RoKSB8fCBsZW5ndGggPCAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAwJyk7XG5cdFx0fVxuXHRcdHZhciBsZW4gPSBsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoO1xuXHRcdHZhciBDO1xuXHRcdHZhciBpc0FycmF5ID0gdGhpcy5Jc0FycmF5KG9yaWdpbmFsQXJyYXkpO1xuXHRcdGlmIChpc0FycmF5KSB7XG5cdFx0XHRDID0gdGhpcy5HZXQob3JpZ2luYWxBcnJheSwgJ2NvbnN0cnVjdG9yJyk7XG5cdFx0XHQvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY3Jvc3MtcmVhbG0gbm9ybWFsIEFycmF5LCBhIHNhbWUtcmVhbG0gQXJyYXlcblx0XHRcdC8vIGlmICh0aGlzLklzQ29uc3RydWN0b3IoQykpIHtcblx0XHRcdC8vIFx0aWYgQyBpcyBhbm90aGVyIHJlYWxtJ3MgQXJyYXksIEMgPSB1bmRlZmluZWRcblx0XHRcdC8vIFx0T2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXJyYXkpKSkgPT09IG51bGwgP1xuXHRcdFx0Ly8gfVxuXHRcdFx0aWYgKHRoaXMuVHlwZShDKSA9PT0gJ09iamVjdCcgJiYgaGFzU3ltYm9scyAmJiAkU3ltYm9sLnNwZWNpZXMpIHtcblx0XHRcdFx0QyA9IHRoaXMuR2V0KEMsICRTeW1ib2wuc3BlY2llcyk7XG5cdFx0XHRcdGlmIChDID09PSBudWxsKSB7XG5cdFx0XHRcdFx0QyA9IHZvaWQgMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodHlwZW9mIEMgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gJEFycmF5KGxlbik7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0NvbnN0cnVjdG9yKEMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQyBtdXN0IGJlIGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBDKGxlbik7IC8vIHRoaXMuQ29uc3RydWN0KEMsIGxlbik7XG5cdH0sXG5cblx0Q3JlYXRlRGF0YVByb3BlcnR5OiBmdW5jdGlvbiBDcmVhdGVEYXRhUHJvcGVydHkoTywgUCwgVikge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblx0XHR2YXIgb2xkRGVzYyA9ICRnT1BEKE8sIFApO1xuXHRcdHZhciBleHRlbnNpYmxlID0gb2xkRGVzYyB8fCB0aGlzLklzRXh0ZW5zaWJsZShPKTtcblx0XHR2YXIgaW1tdXRhYmxlID0gb2xkRGVzYyAmJiAoIW9sZERlc2Mud3JpdGFibGUgfHwgIW9sZERlc2MuY29uZmlndXJhYmxlKTtcblx0XHRpZiAoaW1tdXRhYmxlIHx8ICFleHRlbnNpYmxlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBEZWZpbmVPd25Qcm9wZXJ0eSh0aGlzLCBPLCBQLCB7XG5cdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IHRydWUsXG5cdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiB0cnVlLFxuXHRcdFx0J1tbVmFsdWVdXSc6IFYsXG5cdFx0XHQnW1tXcml0YWJsZV1dJzogdHJ1ZVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jcmVhdGVkYXRhcHJvcGVydHlvcnRocm93XG5cdENyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3c6IGZ1bmN0aW9uIENyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3coTywgUCwgVikge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblx0XHR2YXIgc3VjY2VzcyA9IHRoaXMuQ3JlYXRlRGF0YVByb3BlcnR5KE8sIFAsIFYpO1xuXHRcdGlmICghc3VjY2Vzcykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ3VuYWJsZSB0byBjcmVhdGUgZGF0YSBwcm9wZXJ0eScpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3VjY2Vzcztcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdGNyZWF0ZVxuXHRPYmplY3RDcmVhdGU6IGZ1bmN0aW9uIE9iamVjdENyZWF0ZShwcm90bywgaW50ZXJuYWxTbG90c0xpc3QpIHtcblx0XHRpZiAocHJvdG8gIT09IG51bGwgJiYgdGhpcy5UeXBlKHByb3RvKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBwcm90byBtdXN0IGJlIG51bGwgb3IgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHZhciBzbG90cyA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gW10gOiBpbnRlcm5hbFNsb3RzTGlzdDtcblx0XHRpZiAoc2xvdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignZXMtYWJzdHJhY3QgZG9lcyBub3QgeWV0IHN1cHBvcnQgaW50ZXJuYWwgc2xvdHMnKTtcblx0XHR9XG5cblx0XHRpZiAocHJvdG8gPT09IG51bGwgJiYgISRPYmplY3RDcmVhdGUpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ25hdGl2ZSBPYmplY3QuY3JlYXRlIHN1cHBvcnQgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG51bGwgb2JqZWN0cycpO1xuXHRcdH1cblxuXHRcdHJldHVybiAkT2JqZWN0Q3JlYXRlKHByb3RvKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5cdEFkdmFuY2VTdHJpbmdJbmRleDogZnVuY3Rpb24gQWR2YW5jZVN0cmluZ0luZGV4KFMsIGluZGV4LCB1bmljb2RlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShTKSAhPT0gJ1N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzSW50ZWdlcihpbmRleCkgfHwgaW5kZXggPCAwIHx8IGluZGV4ID4gTUFYX1NBRkVfSU5URUdFUikge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMCBhbmQgPD0gMioqNTMnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZSh1bmljb2RlKSAhPT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogdW5pY29kZSBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHRcdH1cblx0XHRpZiAoIXVuaWNvZGUpIHtcblx0XHRcdHJldHVybiBpbmRleCArIDE7XG5cdFx0fVxuXHRcdHZhciBsZW5ndGggPSBTLmxlbmd0aDtcblx0XHRpZiAoKGluZGV4ICsgMSkgPj0gbGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBmaXJzdCA9ICRjaGFyQ29kZUF0KFMsIGluZGV4KTtcblx0XHRpZiAoZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYpIHtcblx0XHRcdHJldHVybiBpbmRleCArIDE7XG5cdFx0fVxuXG5cdFx0dmFyIHNlY29uZCA9ICRjaGFyQ29kZUF0KFMsIGluZGV4ICsgMSk7XG5cdFx0aWYgKHNlY29uZCA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkYpIHtcblx0XHRcdHJldHVybiBpbmRleCArIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluZGV4ICsgMjtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNyZWF0ZW1ldGhvZHByb3BlcnR5XG5cdENyZWF0ZU1ldGhvZFByb3BlcnR5OiBmdW5jdGlvbiBDcmVhdGVNZXRob2RQcm9wZXJ0eShPLCBQLCBWKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHR2YXIgbmV3RGVzYyA9IHtcblx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogdHJ1ZSxcblx0XHRcdCdbW0VudW1lcmFibGVdXSc6IGZhbHNlLFxuXHRcdFx0J1tbVmFsdWVdXSc6IFYsXG5cdFx0XHQnW1tXcml0YWJsZV1dJzogdHJ1ZVxuXHRcdH07XG5cdFx0cmV0dXJuIERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIG5ld0Rlc2MpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZGVmaW5lcHJvcGVydHlvcnRocm93XG5cdERlZmluZVByb3BlcnR5T3JUaHJvdzogZnVuY3Rpb24gRGVmaW5lUHJvcGVydHlPclRocm93KE8sIFAsIGRlc2MpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblxuXHRcdHZhciBEZXNjID0gaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgZGVzYykgPyBkZXNjIDogdGhpcy5Ub1Byb3BlcnR5RGVzY3JpcHRvcihkZXNjKTtcblx0XHRpZiAoIWlzUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIERlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogRGVzYyBpcyBub3QgYSB2YWxpZCBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIERlc2MpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZGVsZXRlcHJvcGVydHlvcnRocm93XG5cdERlbGV0ZVByb3BlcnR5T3JUaHJvdzogZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlPclRocm93KE8sIFApIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblxuXHRcdHZhciBzdWNjZXNzID0gZGVsZXRlIE9bUF07XG5cdFx0aWYgKCFzdWNjZXNzKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdBdHRlbXB0IHRvIGRlbGV0ZSBwcm9wZXJ0eSBmYWlsZWQuJyk7XG5cdFx0fVxuXHRcdHJldHVybiBzdWNjZXNzO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZW51bWVyYWJsZW93bm5hbWVzXG5cdEVudW1lcmFibGVPd25OYW1lczogZnVuY3Rpb24gRW51bWVyYWJsZU93bk5hbWVzKE8pIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBrZXlzKE8pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1udW1iZXItcHJvdG90eXBlLW9iamVjdFxuXHR0aGlzTnVtYmVyVmFsdWU6IGZ1bmN0aW9uIHRoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkge1xuXHRcdGlmICh0aGlzLlR5cGUodmFsdWUpID09PSAnTnVtYmVyJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkTnVtYmVyVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWJvb2xlYW4tcHJvdG90eXBlLW9iamVjdFxuXHR0aGlzQm9vbGVhblZhbHVlOiBmdW5jdGlvbiB0aGlzQm9vbGVhblZhbHVlKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdCb29sZWFuJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkQm9vbGVhblZhbHVlT2YodmFsdWUpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1zdHJpbmctcHJvdG90eXBlLW9iamVjdFxuXHR0aGlzU3RyaW5nVmFsdWU6IGZ1bmN0aW9uIHRoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkge1xuXHRcdGlmICh0aGlzLlR5cGUodmFsdWUpID09PSAnU3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiAkU3RyaW5nVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWRhdGUtcHJvdG90eXBlLW9iamVjdFxuXHR0aGlzVGltZVZhbHVlOiBmdW5jdGlvbiB0aGlzVGltZVZhbHVlKHZhbHVlKSB7XG5cdFx0cmV0dXJuICREYXRlVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zZXRpbnRlZ3JpdHlsZXZlbFxuXHRTZXRJbnRlZ3JpdHlMZXZlbDogZnVuY3Rpb24gU2V0SW50ZWdyaXR5TGV2ZWwoTywgbGV2ZWwpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAobGV2ZWwgIT09ICdzZWFsZWQnICYmIGxldmVsICE9PSAnZnJvemVuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBsZXZlbGAgbXVzdCBiZSBgXCJzZWFsZWRcImAgb3IgYFwiZnJvemVuXCJgJyk7XG5cdFx0fVxuXHRcdGlmICghJHByZXZlbnRFeHRlbnNpb25zKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdTZXRJbnRlZ3JpdHlMZXZlbCByZXF1aXJlcyBuYXRpdmUgYE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc2Agc3VwcG9ydCcpO1xuXHRcdH1cblx0XHR2YXIgc3RhdHVzID0gJHByZXZlbnRFeHRlbnNpb25zKE8pO1xuXHRcdGlmICghc3RhdHVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghJGdPUE4pIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ1NldEludGVncml0eUxldmVsIHJlcXVpcmVzIG5hdGl2ZSBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIHN1cHBvcnQnKTtcblx0XHR9XG5cdFx0dmFyIHRoZUtleXMgPSAkZ09QTihPKTtcblx0XHR2YXIgRVMgPSB0aGlzO1xuXHRcdGlmIChsZXZlbCA9PT0gJ3NlYWxlZCcpIHtcblx0XHRcdGZvckVhY2godGhlS2V5cywgZnVuY3Rpb24gKGspIHtcblx0XHRcdFx0RVMuRGVmaW5lUHJvcGVydHlPclRocm93KE8sIGssIHsgY29uZmlndXJhYmxlOiBmYWxzZSB9KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAobGV2ZWwgPT09ICdmcm96ZW4nKSB7XG5cdFx0XHRmb3JFYWNoKHRoZUtleXMsIGZ1bmN0aW9uIChrKSB7XG5cdFx0XHRcdHZhciBjdXJyZW50RGVzYyA9ICRnT1BEKE8sIGspO1xuXHRcdFx0XHRpZiAodHlwZW9mIGN1cnJlbnREZXNjICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHZhciBkZXNjO1xuXHRcdFx0XHRcdGlmIChFUy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihFUy5Ub1Byb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50RGVzYykpKSB7XG5cdFx0XHRcdFx0XHRkZXNjID0geyBjb25maWd1cmFibGU6IGZhbHNlIH07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRlc2MgPSB7IGNvbmZpZ3VyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiBmYWxzZSB9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRFUy5EZWZpbmVQcm9wZXJ0eU9yVGhyb3coTywgaywgZGVzYyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRlc3RpbnRlZ3JpdHlsZXZlbFxuXHRUZXN0SW50ZWdyaXR5TGV2ZWw6IGZ1bmN0aW9uIFRlc3RJbnRlZ3JpdHlMZXZlbChPLCBsZXZlbCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmIChsZXZlbCAhPT0gJ3NlYWxlZCcgJiYgbGV2ZWwgIT09ICdmcm96ZW4nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYGxldmVsYCBtdXN0IGJlIGBcInNlYWxlZFwiYCBvciBgXCJmcm96ZW5cImAnKTtcblx0XHR9XG5cdFx0dmFyIHN0YXR1cyA9IHRoaXMuSXNFeHRlbnNpYmxlKE8pO1xuXHRcdGlmIChzdGF0dXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dmFyIHRoZUtleXMgPSAkZ09QTihPKTtcblx0XHR2YXIgRVMgPSB0aGlzO1xuXHRcdHJldHVybiB0aGVLZXlzLmxlbmd0aCA9PT0gMCB8fCBldmVyeSh0aGVLZXlzLCBmdW5jdGlvbiAoaykge1xuXHRcdFx0dmFyIGN1cnJlbnREZXNjID0gJGdPUEQoTywgayk7XG5cdFx0XHRpZiAodHlwZW9mIGN1cnJlbnREZXNjICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRpZiAoY3VycmVudERlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChsZXZlbCA9PT0gJ2Zyb3plbicgJiYgRVMuSXNEYXRhRGVzY3JpcHRvcihFUy5Ub1Byb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50RGVzYykpICYmIGN1cnJlbnREZXNjLndyaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9KTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9yZGluYXJ5aGFzaW5zdGFuY2Vcblx0T3JkaW5hcnlIYXNJbnN0YW5jZTogZnVuY3Rpb24gT3JkaW5hcnlIYXNJbnN0YW5jZShDLCBPKSB7XG5cdFx0aWYgKHRoaXMuSXNDYWxsYWJsZShDKSA9PT0gZmFsc2UpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dmFyIFAgPSB0aGlzLkdldChDLCAncHJvdG90eXBlJyk7XG5cdFx0aWYgKHRoaXMuVHlwZShQKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPcmRpbmFyeUhhc0luc3RhbmNlIGNhbGxlZCBvbiBhbiBvYmplY3Qgd2l0aCBhbiBpbnZhbGlkIHByb3RvdHlwZSBwcm9wZXJ0eS4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIE8gaW5zdGFuY2VvZiBDO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb3JkaW5hcnloYXNwcm9wZXJ0eVxuXHRPcmRpbmFyeUhhc1Byb3BlcnR5OiBmdW5jdGlvbiBPcmRpbmFyeUhhc1Byb3BlcnR5KE8sIFApIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFAgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRyZXR1cm4gUCBpbiBPO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaW5zdGFuY2VvZm9wZXJhdG9yXG5cdEluc3RhbmNlb2ZPcGVyYXRvcjogZnVuY3Rpb24gSW5zdGFuY2VvZk9wZXJhdG9yKE8sIEMpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgaW5zdE9mSGFuZGxlciA9IGhhc1N5bWJvbHMgJiYgJFN5bWJvbC5oYXNJbnN0YW5jZSA/IHRoaXMuR2V0TWV0aG9kKEMsICRTeW1ib2wuaGFzSW5zdGFuY2UpIDogdm9pZCAwO1xuXHRcdGlmICh0eXBlb2YgaW5zdE9mSGFuZGxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiB0aGlzLlRvQm9vbGVhbih0aGlzLkNhbGwoaW5zdE9mSGFuZGxlciwgQywgW09dKSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKEMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYENgIGlzIG5vdCBDYWxsYWJsZScpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5PcmRpbmFyeUhhc0luc3RhbmNlKEMsIE8pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXNwcm9taXNlXG5cdElzUHJvbWlzZTogZnVuY3Rpb24gSXNQcm9taXNlKHgpIHtcblx0XHRpZiAodGhpcy5UeXBlKHgpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoISRQcm9taXNlVGhlbikgeyAvLyBQcm9taXNlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0JFByb21pc2VUaGVuKHgpOyAvLyB0aHJvd3MgaWYgbm90IGEgcHJvbWlzZVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hYnN0cmFjdC1lcXVhbGl0eS1jb21wYXJpc29uXG5cdCdBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJzogZnVuY3Rpb24gQWJzdHJhY3RFcXVhbGl0eUNvbXBhcmlzb24oeCwgeSkge1xuXHRcdHZhciB4VHlwZSA9IHRoaXMuVHlwZSh4KTtcblx0XHR2YXIgeVR5cGUgPSB0aGlzLlR5cGUoeSk7XG5cdFx0aWYgKHhUeXBlID09PSB5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHggPT09IHk7IC8vIEVTNisgc3BlY2lmaWVkIHRoaXMgc2hvcnRjdXQgYW55d2F5cy5cblx0XHR9XG5cdFx0aWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdOdW1iZXInICYmIHlUeXBlID09PSAnU3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvTnVtYmVyKHkpKTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnU3RyaW5nJyAmJiB5VHlwZSA9PT0gJ051bWJlcicpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10odGhpcy5Ub051bWJlcih4KSwgeSk7XG5cdFx0fVxuXHRcdGlmICh4VHlwZSA9PT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHRoaXMuVG9OdW1iZXIoeCksIHkpO1xuXHRcdH1cblx0XHRpZiAoeVR5cGUgPT09ICdCb29sZWFuJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvTnVtYmVyKHkpKTtcblx0XHR9XG5cdFx0aWYgKCh4VHlwZSA9PT0gJ1N0cmluZycgfHwgeFR5cGUgPT09ICdOdW1iZXInIHx8IHhUeXBlID09PSAnU3ltYm9sJykgJiYgeVR5cGUgPT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHgsIHRoaXMuVG9QcmltaXRpdmUoeSkpO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdPYmplY3QnICYmICh5VHlwZSA9PT0gJ1N0cmluZycgfHwgeVR5cGUgPT09ICdOdW1iZXInIHx8IHlUeXBlID09PSAnU3ltYm9sJykpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10odGhpcy5Ub1ByaW1pdGl2ZSh4KSwgeSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxpbmVzLXBlci1mdW5jdGlvbiwgbWF4LXN0YXRlbWVudHMsIGlkLWxlbmd0aCwgbWF4LXBhcmFtc1xuXHRWYWxpZGF0ZUFuZEFwcGx5UHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBWYWxpZGF0ZUFuZEFwcGx5UHJvcGVydHlEZXNjcmlwdG9yKE8sIFAsIGV4dGVuc2libGUsIERlc2MsIGN1cnJlbnQpIHtcblx0XHQvLyB0aGlzIHVzZXMgdGhlIEVTMjAxNysgbG9naWMsIHNpbmNlIGl0IGZpeGVzIGEgbnVtYmVyIG9mIGJ1Z3MgaW4gdGhlIEVTMjAxNSBsb2dpYy5cblx0XHR2YXIgb1R5cGUgPSB0aGlzLlR5cGUoTyk7XG5cdFx0aWYgKG9UeXBlICE9PSAnVW5kZWZpbmVkJyAmJiBvVHlwZSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBPIG11c3QgYmUgdW5kZWZpbmVkIG9yIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKGV4dGVuc2libGUpICE9PSAnQm9vbGVhbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBleHRlbnNpYmxlIG11c3QgYmUgYSBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdGlmICghaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUoY3VycmVudCkgIT09ICdVbmRlZmluZWQnICYmICFpc1Byb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBjdXJyZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGN1cnJlbnQgbXVzdCBiZSBhIFByb3BlcnR5IERlc2NyaXB0b3IsIG9yIHVuZGVmaW5lZCcpO1xuXHRcdH1cblx0XHRpZiAob1R5cGUgIT09ICdVbmRlZmluZWQnICYmICF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBpZiBPIGlzIG5vdCB1bmRlZmluZWQsIFAgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKGN1cnJlbnQpID09PSAnVW5kZWZpbmVkJykge1xuXHRcdFx0aWYgKCFleHRlbnNpYmxlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLklzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykgfHwgdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRcdGlmIChvVHlwZSAhPT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHREZWZpbmVPd25Qcm9wZXJ0eSh0aGlzLCBPLCBQLCB7XG5cdFx0XHRcdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IERlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXSxcblx0XHRcdFx0XHRcdCdbW0VudW1lcmFibGVdXSc6IERlc2NbJ1tbRW51bWVyYWJsZV1dJ10sXG5cdFx0XHRcdFx0XHQnW1tWYWx1ZV1dJzogRGVzY1snW1tWYWx1ZV1dJ10sXG5cdFx0XHRcdFx0XHQnW1tXcml0YWJsZV1dJzogRGVzY1snW1tXcml0YWJsZV1dJ11cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCF0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IERlc2MgaXMgbm90IGFuIGFjY2Vzc29yIGRlc2NyaXB0b3InKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1R5cGUgIT09ICdVbmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIERlc2MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuSXNHZW5lcmljRGVzY3JpcHRvcihEZXNjKSAmJiAhKCdbW0NvbmZpZ3VyYWJsZV1dJyBpbiBEZXNjKSAmJiAhKCdbW0VudW1lcmFibGVdXScgaW4gRGVzYykpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoaXNTYW1lUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIERlc2MsIGN1cnJlbnQpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gcmVtb3ZlZCBieSBFUzIwMTcsIGJ1dCBzaG91bGQgc3RpbGwgYmUgY29ycmVjdFxuXHRcdH1cblx0XHQvLyBcImlmIGV2ZXJ5IGZpZWxkIGluIERlc2MgaXMgYWJzZW50LCByZXR1cm4gdHJ1ZVwiIGNhbid0IHJlYWxseSBtYXRjaCB0aGUgYXNzZXJ0aW9uIHRoYXQgaXQncyBhIFByb3BlcnR5IERlc2NyaXB0b3Jcblx0XHRpZiAoIWN1cnJlbnRbJ1tbQ29uZmlndXJhYmxlXV0nXSkge1xuXHRcdFx0aWYgKERlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJ1tbRW51bWVyYWJsZV1dJyBpbiBEZXNjICYmICFEZXNjWydbW0VudW1lcmFibGVdXSddID09PSAhIWN1cnJlbnRbJ1tbRW51bWVyYWJsZV1dJ10pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGhpcy5Jc0dlbmVyaWNEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHQvLyBubyBmdXJ0aGVyIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuXG5cdFx0fSBlbHNlIGlmICh0aGlzLklzRGF0YURlc2NyaXB0b3IoY3VycmVudCkgIT09IHRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0aWYgKCFjdXJyZW50WydbW0NvbmZpZ3VyYWJsZV1dJ10pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuSXNEYXRhRGVzY3JpcHRvcihjdXJyZW50KSkge1xuXHRcdFx0XHRpZiAob1R5cGUgIT09ICdVbmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0RGVmaW5lT3duUHJvcGVydHkodGhpcywgTywgUCwge1xuXHRcdFx0XHRcdFx0J1tbQ29uZmlndXJhYmxlXV0nOiBjdXJyZW50WydbW0NvbmZpZ3VyYWJsZV1dJ10sXG5cdFx0XHRcdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiBjdXJyZW50WydbW0VudW1lcmFibGVdXSddLFxuXHRcdFx0XHRcdFx0J1tbR2V0XV0nOiB1bmRlZmluZWRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvVHlwZSAhPT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdFx0RGVmaW5lT3duUHJvcGVydHkodGhpcywgTywgUCwge1xuXHRcdFx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogY3VycmVudFsnW1tDb25maWd1cmFibGVdXSddLFxuXHRcdFx0XHRcdCdbW0VudW1lcmFibGVdXSc6IGN1cnJlbnRbJ1tbRW51bWVyYWJsZV1dJ10sXG5cdFx0XHRcdFx0J1tbVmFsdWVdXSc6IHVuZGVmaW5lZFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRoaXMuSXNEYXRhRGVzY3JpcHRvcihjdXJyZW50KSAmJiB0aGlzLklzRGF0YURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdGlmICghY3VycmVudFsnW1tDb25maWd1cmFibGVdXSddICYmICFjdXJyZW50WydbW1dyaXRhYmxlXV0nXSkge1xuXHRcdFx0XHRpZiAoJ1tbV3JpdGFibGVdXScgaW4gRGVzYyAmJiBEZXNjWydbW1dyaXRhYmxlXV0nXSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJ1tbVmFsdWVdXScgaW4gRGVzYyAmJiAhdGhpcy5TYW1lVmFsdWUoRGVzY1snW1tWYWx1ZV1dJ10sIGN1cnJlbnRbJ1tbVmFsdWVdXSddKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRoaXMuSXNBY2Nlc3NvckRlc2NyaXB0b3IoY3VycmVudCkgJiYgdGhpcy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0aWYgKCFjdXJyZW50WydbW0NvbmZpZ3VyYWJsZV1dJ10pIHtcblx0XHRcdFx0aWYgKCdbW1NldF1dJyBpbiBEZXNjICYmICF0aGlzLlNhbWVWYWx1ZShEZXNjWydbW1NldF1dJ10sIGN1cnJlbnRbJ1tbU2V0XV0nXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCdbW0dldF1dJyBpbiBEZXNjICYmICF0aGlzLlNhbWVWYWx1ZShEZXNjWydbW0dldF1dJ10sIGN1cnJlbnRbJ1tbR2V0XV0nXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBjdXJyZW50IGFuZCBEZXNjIGFyZSBub3QgYm90aCBkYXRhLCBib3RoIGFjY2Vzc29ycywgb3Igb25lIGFjY2Vzc29yIGFuZCBvbmUgZGF0YS4nKTtcblx0XHR9XG5cdFx0aWYgKG9UeXBlICE9PSAnVW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIERlc2MpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9yZGluYXJ5ZGVmaW5lb3ducHJvcGVydHlcblx0T3JkaW5hcnlEZWZpbmVPd25Qcm9wZXJ0eTogZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25Qcm9wZXJ0eShPLCBQLCBEZXNjKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdGlmICghaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXHRcdHZhciBkZXNjID0gJGdPUEQoTywgUCk7XG5cdFx0dmFyIGN1cnJlbnQgPSBkZXNjICYmIHRoaXMuVG9Qcm9wZXJ0eURlc2NyaXB0b3IoZGVzYyk7XG5cdFx0dmFyIGV4dGVuc2libGUgPSB0aGlzLklzRXh0ZW5zaWJsZShPKTtcblx0XHRyZXR1cm4gdGhpcy5WYWxpZGF0ZUFuZEFwcGx5UHJvcGVydHlEZXNjcmlwdG9yKE8sIFAsIGV4dGVuc2libGUsIERlc2MsIGN1cnJlbnQpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb3JkaW5hcnlnZXRvd25wcm9wZXJ0eVxuXHRPcmRpbmFyeUdldE93blByb3BlcnR5OiBmdW5jdGlvbiBPcmRpbmFyeUdldE93blByb3BlcnR5KE8sIFApIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IE8gbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBQIG11c3QgYmUgYSBQcm9wZXJ0eSBLZXknKTtcblx0XHR9XG5cdFx0aWYgKCFoYXMoTywgUCkpIHtcblx0XHRcdHJldHVybiB2b2lkIDA7XG5cdFx0fVxuXHRcdGlmICghJGdPUEQpIHtcblx0XHRcdC8vIEVTMyBmYWxsYmFja1xuXHRcdFx0dmFyIGFycmF5TGVuZ3RoID0gdGhpcy5Jc0FycmF5KE8pICYmIFAgPT09ICdsZW5ndGgnO1xuXHRcdFx0dmFyIHJlZ2V4TGFzdEluZGV4ID0gdGhpcy5Jc1JlZ0V4cChPKSAmJiBQID09PSAnbGFzdEluZGV4Jztcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogIShhcnJheUxlbmd0aCB8fCByZWdleExhc3RJbmRleCksXG5cdFx0XHRcdCdbW0VudW1lcmFibGVdXSc6ICRpc0VudW1lcmFibGUoTywgUCksXG5cdFx0XHRcdCdbW1ZhbHVlXV0nOiBPW1BdLFxuXHRcdFx0XHQnW1tXcml0YWJsZV1dJzogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuVG9Qcm9wZXJ0eURlc2NyaXB0b3IoJGdPUEQoTywgUCkpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYXJyYXljcmVhdGVcblx0QXJyYXlDcmVhdGU6IGZ1bmN0aW9uIEFycmF5Q3JlYXRlKGxlbmd0aCkge1xuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIobGVuZ3RoKSB8fCBsZW5ndGggPCAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYGxlbmd0aGAgbXVzdCBiZSBhbiBpbnRlZ2VyIE51bWJlciA+PSAwJyk7XG5cdFx0fVxuXHRcdGlmIChsZW5ndGggPiBNQVhfQVJSQVlfTEVOR1RIKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFJhbmdlRXJyb3IoJ2xlbmd0aCBpcyBncmVhdGVyIHRoYW4gKDIqKjMyIC0gMSknKTtcblx0XHR9XG5cdFx0dmFyIHByb3RvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAkQXJyYXlQcm90b3R5cGU7XG5cdFx0dmFyIEEgPSBbXTsgLy8gc3RlcHMgNSAtIDcsIGFuZCA5XG5cdFx0aWYgKHByb3RvICE9PSAkQXJyYXlQcm90b3R5cGUpIHsgLy8gc3RlcCA4XG5cdFx0XHRpZiAoISRzZXRQcm90bykge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdBcnJheUNyZWF0ZTogYSBgcHJvdG9gIGFyZ3VtZW50IHRoYXQgaXMgbm90IGBBcnJheS5wcm90b3R5cGVgIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgdGhlIFtbUHJvdG90eXBlXV0nKTtcblx0XHRcdH1cblx0XHRcdCRzZXRQcm90byhBLCBwcm90byk7XG5cdFx0fVxuXHRcdGlmIChsZW5ndGggIT09IDApIHsgLy8gYnlwYXNzZXMgdGhlIG5lZWQgZm9yIHN0ZXAgMlxuXHRcdFx0QS5sZW5ndGggPSBsZW5ndGg7XG5cdFx0fVxuXHRcdC8qIHN0ZXAgMTAsIHRoZSBhYm92ZSBhcyBhIHNob3J0Y3V0IGZvciB0aGUgYmVsb3dcblx0XHR0aGlzLk9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHkoQSwgJ2xlbmd0aCcsIHtcblx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogZmFsc2UsXG5cdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiBmYWxzZSxcblx0XHRcdCdbW1ZhbHVlXV0nOiBsZW5ndGgsXG5cdFx0XHQnW1tXcml0YWJsZV1dJzogdHJ1ZVxuXHRcdH0pO1xuXHRcdCovXG5cdFx0cmV0dXJuIEE7XG5cdH0sXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBtYXgtbGluZXMtcGVyLWZ1bmN0aW9uXG5cdEFycmF5U2V0TGVuZ3RoOiBmdW5jdGlvbiBBcnJheVNldExlbmd0aChBLCBEZXNjKSB7XG5cdFx0aWYgKCF0aGlzLklzQXJyYXkoQSkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBBIG11c3QgYmUgYW4gQXJyYXknKTtcblx0XHR9XG5cdFx0aWYgKCFpc1Byb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBEZXNjKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IERlc2MgbXVzdCBiZSBhIFByb3BlcnR5IERlc2NyaXB0b3InKTtcblx0XHR9XG5cdFx0aWYgKCEoJ1tbVmFsdWVdXScgaW4gRGVzYykpIHtcblx0XHRcdHJldHVybiB0aGlzLk9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHkoQSwgJ2xlbmd0aCcsIERlc2MpO1xuXHRcdH1cblx0XHR2YXIgbmV3TGVuRGVzYyA9IGFzc2lnbih7fSwgRGVzYyk7XG5cdFx0dmFyIG5ld0xlbiA9IHRoaXMuVG9VaW50MzIoRGVzY1snW1tWYWx1ZV1dJ10pO1xuXHRcdHZhciBudW1iZXJMZW4gPSB0aGlzLlRvTnVtYmVyKERlc2NbJ1tbVmFsdWVdXSddKTtcblx0XHRpZiAobmV3TGVuICE9PSBudW1iZXJMZW4pIHtcblx0XHRcdHRocm93IG5ldyAkUmFuZ2VFcnJvcignSW52YWxpZCBhcnJheSBsZW5ndGgnKTtcblx0XHR9XG5cdFx0bmV3TGVuRGVzY1snW1tWYWx1ZV1dJ10gPSBuZXdMZW47XG5cdFx0dmFyIG9sZExlbkRlc2MgPSB0aGlzLk9yZGluYXJ5R2V0T3duUHJvcGVydHkoQSwgJ2xlbmd0aCcpO1xuXHRcdGlmICghdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKG9sZExlbkRlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYW4gYXJyYXkgaGFkIGEgbm9uLWRhdGEgZGVzY3JpcHRvciBvbiBgbGVuZ3RoYCcpO1xuXHRcdH1cblx0XHR2YXIgb2xkTGVuID0gb2xkTGVuRGVzY1snW1tWYWx1ZV1dJ107XG5cdFx0aWYgKG5ld0xlbiA+PSBvbGRMZW4pIHtcblx0XHRcdHJldHVybiB0aGlzLk9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHkoQSwgJ2xlbmd0aCcsIG5ld0xlbkRlc2MpO1xuXHRcdH1cblx0XHRpZiAoIW9sZExlbkRlc2NbJ1tbV3JpdGFibGVdXSddKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHZhciBuZXdXcml0YWJsZTtcblx0XHRpZiAoISgnW1tXcml0YWJsZV1dJyBpbiBuZXdMZW5EZXNjKSB8fCBuZXdMZW5EZXNjWydbW1dyaXRhYmxlXV0nXSkge1xuXHRcdFx0bmV3V3JpdGFibGUgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdXcml0YWJsZSA9IGZhbHNlO1xuXHRcdFx0bmV3TGVuRGVzY1snW1tXcml0YWJsZV1dJ10gPSB0cnVlO1xuXHRcdH1cblx0XHR2YXIgc3VjY2VlZGVkID0gdGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCBuZXdMZW5EZXNjKTtcblx0XHRpZiAoIXN1Y2NlZWRlZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR3aGlsZSAobmV3TGVuIDwgb2xkTGVuKSB7XG5cdFx0XHRvbGRMZW4gLT0gMTtcblx0XHRcdHZhciBkZWxldGVTdWNjZWVkZWQgPSBkZWxldGUgQVt0aGlzLlRvU3RyaW5nKG9sZExlbildO1xuXHRcdFx0aWYgKCFkZWxldGVTdWNjZWVkZWQpIHtcblx0XHRcdFx0bmV3TGVuRGVzY1snW1tWYWx1ZV1dJ10gPSBvbGRMZW4gKyAxO1xuXHRcdFx0XHRpZiAoIW5ld1dyaXRhYmxlKSB7XG5cdFx0XHRcdFx0bmV3TGVuRGVzY1snW1tXcml0YWJsZV1dJ10gPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLk9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHkoQSwgJ2xlbmd0aCcsIG5ld0xlbkRlc2MpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIW5ld1dyaXRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCB7ICdbW1dyaXRhYmxlXV0nOiBmYWxzZSB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jcmVhdGVodG1sXG5cdENyZWF0ZUhUTUw6IGZ1bmN0aW9uIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcblx0XHRpZiAodGhpcy5UeXBlKHRhZykgIT09ICdTdHJpbmcnIHx8IHRoaXMuVHlwZShhdHRyaWJ1dGUpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGB0YWdgIGFuZCBgYXR0cmlidXRlYCBtdXN0IGJlIHN0cmluZ3MnKTtcblx0XHR9XG5cdFx0dmFyIHN0ciA9IHRoaXMuUmVxdWlyZU9iamVjdENvZXJjaWJsZShzdHJpbmcpO1xuXHRcdHZhciBTID0gdGhpcy5Ub1N0cmluZyhzdHIpO1xuXHRcdHZhciBwMSA9ICc8JyArIHRhZztcblx0XHRpZiAoYXR0cmlidXRlICE9PSAnJykge1xuXHRcdFx0dmFyIFYgPSB0aGlzLlRvU3RyaW5nKHZhbHVlKTtcblx0XHRcdHZhciBlc2NhcGVkViA9ICRyZXBsYWNlKFYsIC9cXHgyMi9nLCAnJnF1b3Q7Jyk7XG5cdFx0XHRwMSArPSAnXFx4MjAnICsgYXR0cmlidXRlICsgJ1xceDNEXFx4MjInICsgZXNjYXBlZFYgKyAnXFx4MjInO1xuXHRcdH1cblx0XHRyZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldG93bnByb3BlcnR5a2V5c1xuXHRHZXRPd25Qcm9wZXJ0eUtleXM6IGZ1bmN0aW9uIEdldE93blByb3BlcnR5S2V5cyhPLCBUeXBlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKFR5cGUgPT09ICdTeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gaGFzU3ltYm9scyAmJiAkZ09QUyA/ICRnT1BTKE8pIDogW107XG5cdFx0fVxuXHRcdGlmIChUeXBlID09PSAnU3RyaW5nJykge1xuXHRcdFx0aWYgKCEkZ09QTikge1xuXHRcdFx0XHRyZXR1cm4ga2V5cyhPKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiAkZ09QTihPKTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBUeXBlYCBtdXN0IGJlIGBcIlN0cmluZ1wiYCBvciBgXCJTeW1ib2xcImAnKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXN5bWJvbGRlc2NyaXB0aXZlc3RyaW5nXG5cdFN5bWJvbERlc2NyaXB0aXZlU3RyaW5nOiBmdW5jdGlvbiBTeW1ib2xEZXNjcmlwdGl2ZVN0cmluZyhzeW0pIHtcblx0XHRpZiAodGhpcy5UeXBlKHN5bSkgIT09ICdTeW1ib2wnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHN5bWAgbXVzdCBiZSBhIFN5bWJvbCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gJFN5bWJvbFRvU3RyaW5nKHN5bSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRzdWJzdGl0dXRpb25cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBtYXgtcGFyYW1zLCBtYXgtbGluZXMtcGVyLWZ1bmN0aW9uXG5cdEdldFN1YnN0aXR1dGlvbjogZnVuY3Rpb24gR2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuXHRcdGlmICh0aGlzLlR5cGUobWF0Y2hlZCkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYG1hdGNoZWRgIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdFx0dmFyIG1hdGNoTGVuZ3RoID0gbWF0Y2hlZC5sZW5ndGg7XG5cblx0XHRpZiAodGhpcy5UeXBlKHN0cikgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHN0cmAgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgc3RyaW5nTGVuZ3RoID0gc3RyLmxlbmd0aDtcblxuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIocG9zaXRpb24pIHx8IHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IHN0cmluZ0xlbmd0aCkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBwb3NpdGlvbmAgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIsIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBgc3RyaW5nYCwgZ290ICcgKyBpbnNwZWN0KHBvc2l0aW9uKSk7XG5cdFx0fVxuXG5cdFx0dmFyIEVTID0gdGhpcztcblx0XHR2YXIgaXNTdHJpbmdPckhvbGUgPSBmdW5jdGlvbiAoY2FwdHVyZSwgaW5kZXgsIGFycikgeyByZXR1cm4gRVMuVHlwZShjYXB0dXJlKSA9PT0gJ1N0cmluZycgfHwgIShpbmRleCBpbiBhcnIpOyB9O1xuXHRcdGlmICghdGhpcy5Jc0FycmF5KGNhcHR1cmVzKSB8fCAhZXZlcnkoY2FwdHVyZXMsIGlzU3RyaW5nT3JIb2xlKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBjYXB0dXJlc2AgbXVzdCBiZSBhIExpc3Qgb2YgU3RyaW5ncywgZ290ICcgKyBpbnNwZWN0KGNhcHR1cmVzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuVHlwZShyZXBsYWNlbWVudCkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHJlcGxhY2VtZW50YCBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0dmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoTGVuZ3RoO1xuXHRcdHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuXG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmVwbGFjZW1lbnQubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdC8vIGlmIHRoaXMgaXMgYSAkLCBhbmQgaXQncyBub3QgdGhlIGVuZCBvZiB0aGUgcmVwbGFjZW1lbnRcblx0XHRcdHZhciBjdXJyZW50ID0gcmVwbGFjZW1lbnRbaV07XG5cdFx0XHR2YXIgaXNMYXN0ID0gKGkgKyAxKSA+PSByZXBsYWNlbWVudC5sZW5ndGg7XG5cdFx0XHR2YXIgbmV4dElzTGFzdCA9IChpICsgMikgPj0gcmVwbGFjZW1lbnQubGVuZ3RoO1xuXHRcdFx0aWYgKGN1cnJlbnQgPT09ICckJyAmJiAhaXNMYXN0KSB7XG5cdFx0XHRcdHZhciBuZXh0ID0gcmVwbGFjZW1lbnRbaSArIDFdO1xuXHRcdFx0XHRpZiAobmV4dCA9PT0gJyQnKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9ICckJztcblx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAobmV4dCA9PT0gJyYnKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IG1hdGNoZWQ7XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG5leHQgPT09ICdgJykge1xuXHRcdFx0XHRcdHJlc3VsdCArPSBwb3NpdGlvbiA9PT0gMCA/ICcnIDogc3RyU2xpY2Uoc3RyLCAwLCBwb3NpdGlvbiAtIDEpO1xuXHRcdFx0XHRcdGkgKz0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChuZXh0ID09PSBcIidcIikge1xuXHRcdFx0XHRcdHJlc3VsdCArPSB0YWlsUG9zID49IHN0cmluZ0xlbmd0aCA/ICcnIDogc3RyU2xpY2Uoc3RyLCB0YWlsUG9zKTtcblx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG5leHROZXh0ID0gbmV4dElzTGFzdCA/IG51bGwgOiByZXBsYWNlbWVudFtpICsgMl07XG5cdFx0XHRcdFx0aWYgKGlzRGlnaXQobmV4dCkgJiYgbmV4dCAhPT0gJzAnICYmIChuZXh0SXNMYXN0IHx8ICFpc0RpZ2l0KG5leHROZXh0KSkpIHtcblx0XHRcdFx0XHRcdC8vICQxIHRocm91Z2ggJDksIGFuZCBub3QgZm9sbG93ZWQgYnkgYSBkaWdpdFxuXHRcdFx0XHRcdFx0dmFyIG4gPSBwYXJzZUludGVnZXIobmV4dCwgMTApO1xuXHRcdFx0XHRcdFx0Ly8gaWYgKG4gPiBtLCBpbXBsLWRlZmluZWQpXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gKG4gPD0gbSAmJiB0aGlzLlR5cGUoY2FwdHVyZXNbbiAtIDFdKSA9PT0gJ1VuZGVmaW5lZCcpID8gJycgOiBjYXB0dXJlc1tuIC0gMV07XG5cdFx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpc0RpZ2l0KG5leHQpICYmIChuZXh0SXNMYXN0IHx8IGlzRGlnaXQobmV4dE5leHQpKSkge1xuXHRcdFx0XHRcdFx0Ly8gJDAwIHRocm91Z2ggJDk5XG5cdFx0XHRcdFx0XHR2YXIgbm4gPSBuZXh0ICsgbmV4dE5leHQ7XG5cdFx0XHRcdFx0XHR2YXIgbm5JID0gcGFyc2VJbnRlZ2VyKG5uLCAxMCkgLSAxO1xuXHRcdFx0XHRcdFx0Ly8gaWYgbm4gPT09ICcwMCcgb3Igbm4gPiBtLCBpbXBsLWRlZmluZWRcblx0XHRcdFx0XHRcdHJlc3VsdCArPSAobm4gPD0gbSAmJiB0aGlzLlR5cGUoY2FwdHVyZXNbbm5JXSkgPT09ICdVbmRlZmluZWQnKSA/ICcnIDogY2FwdHVyZXNbbm5JXTtcblx0XHRcdFx0XHRcdGkgKz0gMjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0ICs9ICckJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHRoZSBmaW5hbCAkLCBvciBlbHNlIG5vdCBhICRcblx0XHRcdFx0cmVzdWx0ICs9IHJlcGxhY2VtZW50W2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2RhdGVzdHJpbmdcblx0VG9EYXRlU3RyaW5nOiBmdW5jdGlvbiBUb0RhdGVTdHJpbmcodHYpIHtcblx0XHRpZiAodGhpcy5UeXBlKHR2KSAhPT0gJ051bWJlcicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgdHZgIG11c3QgYmUgYSBOdW1iZXInKTtcblx0XHR9XG5cdFx0aWYgKCRpc05hTih0dikpIHtcblx0XHRcdHJldHVybiAnSW52YWxpZCBEYXRlJztcblx0XHR9XG5cdFx0cmV0dXJuICREYXRlKHR2KTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY3JlYXRlbGlzdGZyb21hcnJheWxpa2Vcblx0Q3JlYXRlTGlzdEZyb21BcnJheUxpa2U6IGZ1bmN0aW9uIENyZWF0ZUxpc3RGcm9tQXJyYXlMaWtlKG9iaikge1xuXHRcdHZhciBlbGVtZW50VHlwZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMVxuXHRcdFx0PyBhcmd1bWVudHNbMV1cblx0XHRcdDogWydVbmRlZmluZWQnLCAnTnVsbCcsICdCb29sZWFuJywgJ1N0cmluZycsICdTeW1ib2wnLCAnTnVtYmVyJywgJ09iamVjdCddO1xuXG5cdFx0aWYgKHRoaXMuVHlwZShvYmopICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBvYmpgIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0FycmF5KGVsZW1lbnRUeXBlcykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgZWxlbWVudFR5cGVzYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYW4gYXJyYXknKTtcblx0XHR9XG5cdFx0dmFyIGxlbiA9IHRoaXMuVG9MZW5ndGgodGhpcy5HZXQob2JqLCAnbGVuZ3RoJykpO1xuXHRcdHZhciBsaXN0ID0gW107XG5cdFx0dmFyIGluZGV4ID0gMDtcblx0XHR3aGlsZSAoaW5kZXggPCBsZW4pIHtcblx0XHRcdHZhciBpbmRleE5hbWUgPSB0aGlzLlRvU3RyaW5nKGluZGV4KTtcblx0XHRcdHZhciBuZXh0ID0gdGhpcy5HZXQob2JqLCBpbmRleE5hbWUpO1xuXHRcdFx0dmFyIG5leHRUeXBlID0gdGhpcy5UeXBlKG5leHQpO1xuXHRcdFx0aWYgKCRpbmRleE9mKGVsZW1lbnRUeXBlcywgbmV4dFR5cGUpIDwgMCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaXRlbSB0eXBlICcgKyBuZXh0VHlwZSArICcgaXMgbm90IGEgdmFsaWQgZWxlbWVudFR5cGUnKTtcblx0XHRcdH1cblx0XHRcdCRwdXNoKGxpc3QsIG5leHQpO1xuXHRcdFx0aW5kZXggKz0gMTtcblx0XHR9XG5cdFx0cmV0dXJuIGxpc3Q7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldHByb3RvdHlwZWZyb21jb25zdHJ1Y3RvclxuXHRHZXRQcm90b3R5cGVGcm9tQ29uc3RydWN0b3I6IGZ1bmN0aW9uIEdldFByb3RvdHlwZUZyb21Db25zdHJ1Y3Rvcihjb25zdHJ1Y3RvciwgaW50cmluc2ljRGVmYXVsdFByb3RvKSB7XG5cdFx0dmFyIGludHJpbnNpYyA9IEdldEludHJpbnNpYyhpbnRyaW5zaWNEZWZhdWx0UHJvdG8pOyAvLyB0aHJvd3MgaWYgbm90IGEgdmFsaWQgaW50cmluc2ljXG5cdFx0aWYgKCF0aGlzLklzQ29uc3RydWN0b3IoY29uc3RydWN0b3IpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYGNvbnN0cnVjdG9yYCBtdXN0IGJlIGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0dmFyIHByb3RvID0gdGhpcy5HZXQoY29uc3RydWN0b3IsICdwcm90b3R5cGUnKTtcblx0XHRpZiAodGhpcy5UeXBlKHByb3RvKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdGlmICghKGNvbnN0cnVjdG9yIGluc3RhbmNlb2YgJEZ1bmN0aW9uKSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgb3RoZXIgcmVhbG1zLCBmb3Igbm93XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdjcm9zcy1yZWFsbSBjb25zdHJ1Y3RvcnMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQnKTtcblx0XHRcdH1cblx0XHRcdHByb3RvID0gaW50cmluc2ljO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJvdG87XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNldGZ1bmN0aW9ubmFtZVxuXHRTZXRGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uIFNldEZ1bmN0aW9uTmFtZShGLCBuYW1lKSB7XG5cdFx0aWYgKHR5cGVvZiBGICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYEZgIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNFeHRlbnNpYmxlKEYpIHx8IGhhcyhGLCAnbmFtZScpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYEZgIG11c3QgYmUgZXh0ZW5zaWJsZSwgYW5kIG11c3Qgbm90IGhhdmUgYSBgbmFtZWAgb3duIHByb3BlcnR5Jyk7XG5cdFx0fVxuXHRcdHZhciBuYW1lVHlwZSA9IHRoaXMuVHlwZShuYW1lKTtcblx0XHRpZiAobmFtZVR5cGUgIT09ICdTeW1ib2wnICYmIG5hbWVUeXBlICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBuYW1lYCBtdXN0IGJlIGEgU3ltYm9sIG9yIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHRcdGlmIChuYW1lVHlwZSA9PT0gJ1N5bWJvbCcpIHtcblx0XHRcdHZhciBkZXNjcmlwdGlvbiA9IGdldFN5bWJvbERlc2NyaXB0aW9uKG5hbWUpO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdFx0XHRuYW1lID0gdHlwZW9mIGRlc2NyaXB0aW9uID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1snICsgZGVzY3JpcHRpb24gKyAnXSc7XG5cdFx0fVxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdFx0dmFyIHByZWZpeCA9IGFyZ3VtZW50c1syXTtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0bmFtZSA9IHByZWZpeCArICcgJyArIG5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLkRlZmluZVByb3BlcnR5T3JUaHJvdyhGLCAnbmFtZScsIHtcblx0XHRcdCdbW1ZhbHVlXV0nOiBuYW1lLFxuXHRcdFx0J1tbV3JpdGFibGVdXSc6IGZhbHNlLFxuXHRcdFx0J1tbRW51bWVyYWJsZV1dJzogZmFsc2UsXG5cdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IHRydWVcblx0XHR9KTtcblx0fVxufSk7XG5cbmRlbGV0ZSBFUzYuQ2hlY2tPYmplY3RDb2VyY2libGU7IC8vIHJlbmFtZWQgaW4gRVM2IHRvIFJlcXVpcmVPYmplY3RDb2VyY2libGVcblxubW9kdWxlLmV4cG9ydHMgPSBFUzY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUzIwMTUgPSByZXF1aXJlKCcuL2VzMjAxNScpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9oZWxwZXJzL2Fzc2lnbicpO1xudmFyICRzZXRQcm90byA9IHJlcXVpcmUoJy4vaGVscGVycy9zZXRQcm90bycpO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2NhbGxCb3VuZCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2dldEl0ZXJhdG9yTWV0aG9kJyk7XG5cbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRhcnJheVB1c2ggPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5wdXNoJyk7XG52YXIgJGdldFByb3RvID0gcmVxdWlyZSgnLi9oZWxwZXJzL2dldFByb3RvJyk7XG5cbnZhciBFUzIwMTYgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzIwMTUpLCB7XG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlbm9ubnVtYmVyXG5cdFNhbWVWYWx1ZU5vbk51bWJlcjogZnVuY3Rpb24gU2FtZVZhbHVlTm9uTnVtYmVyKHgsIHkpIHtcblx0XHRpZiAodHlwZW9mIHggPT09ICdudW1iZXInIHx8IHR5cGVvZiB4ICE9PSB0eXBlb2YgeSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignU2FtZVZhbHVlTm9uTnVtYmVyIHJlcXVpcmVzIHR3byBub24tbnVtYmVyIHZhbHVlcyBvZiB0aGUgc2FtZSB0eXBlLicpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5TYW1lVmFsdWUoeCwgeSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1pdGVyYWJsZXRvYXJyYXlsaWtlXG5cdEl0ZXJhYmxlVG9BcnJheUxpa2U6IGZ1bmN0aW9uIEl0ZXJhYmxlVG9BcnJheUxpa2UoaXRlbXMpIHtcblx0XHR2YXIgdXNpbmdJdGVyYXRvciA9IGdldEl0ZXJhdG9yTWV0aG9kKHRoaXMsIGl0ZW1zKTtcblx0XHRpZiAodHlwZW9mIHVzaW5nSXRlcmF0b3IgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLkdldEl0ZXJhdG9yKGl0ZW1zLCB1c2luZ0l0ZXJhdG9yKTtcblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdHZhciBuZXh0ID0gdHJ1ZTtcblx0XHRcdHdoaWxlIChuZXh0KSB7XG5cdFx0XHRcdG5leHQgPSB0aGlzLkl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0dmFyIG5leHRWYWx1ZSA9IHRoaXMuSXRlcmF0b3JWYWx1ZShuZXh0KTtcblx0XHRcdFx0XHQkYXJyYXlQdXNoKHZhbHVlcywgbmV4dFZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5Ub09iamVjdChpdGVtcyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2Zcblx0T3JkaW5hcnlHZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gKE8pIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IE8gbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCEkZ2V0UHJvdG8pIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZmV0Y2hpbmcgcHJvdG90eXBlcy4nKTtcblx0XHR9XG5cdFx0cmV0dXJuICRnZXRQcm90byhPKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb3JkaW5hcnlzZXRwcm90b3R5cGVvZlxuXHRPcmRpbmFyeVNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiAoTywgVikge1xuXHRcdGlmICh0aGlzLlR5cGUoVikgIT09ICdPYmplY3QnICYmIHRoaXMuVHlwZShWKSAhPT0gJ051bGwnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogViBtdXN0IGJlIE9iamVjdCBvciBOdWxsJyk7XG5cdFx0fVxuXHRcdC8qXG5cdFx0dmFyIGV4dGVuc2libGUgPSB0aGlzLklzRXh0ZW5zaWJsZShPKTtcblx0XHR2YXIgY3VycmVudCA9IHRoaXMuT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcblx0XHRpZiAodGhpcy5TYW1lVmFsdWUoViwgY3VycmVudCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIWV4dGVuc2libGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ki9cblx0XHR0cnkge1xuXHRcdFx0JHNldFByb3RvKE8sIFYpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSA9PT0gVjtcblx0XHQvKlxuXHRcdHZhciBwID0gVjtcblx0XHR2YXIgZG9uZSA9IGZhbHNlO1xuXHRcdHdoaWxlICghZG9uZSkge1xuXHRcdFx0aWYgKHAgPT09IG51bGwpIHtcblx0XHRcdFx0ZG9uZSA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuU2FtZVZhbHVlKHAsIE8pKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh3YXQpIHtcblx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwID0gcC5bW1Byb3RvdHlwZV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0IH1cblx0XHQgTy5bW1Byb3RvdHlwZV1dID0gVjtcblx0XHQgcmV0dXJuIHRydWU7XG5cdFx0ICovXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVTMjAxNjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciBFUzIwMTYgPSByZXF1aXJlKCcuL2VzMjAxNicpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9hc3NpZ24nKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi9oZWxwZXJzL2ZvckVhY2gnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9jYWxsQmluZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJvdW5kJyk7XG52YXIgJGlzRW51bWVyYWJsZSA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZScpO1xudmFyICRwdXNoQXBwbHkgPSBjYWxsQmluZC5hcHBseShHZXRJbnRyaW5zaWMoJyVBcnJheS5wcm90b3R5cGUucHVzaCUnKSk7XG52YXIgJGFycmF5UHVzaCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnB1c2gnKTtcblxudmFyIEVTMjAxNyA9IGFzc2lnbihhc3NpZ24oe30sIEVTMjAxNiksIHtcblx0VG9JbmRleDogZnVuY3Rpb24gVG9JbmRleCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0dmFyIGludGVnZXJJbmRleCA9IHRoaXMuVG9JbnRlZ2VyKHZhbHVlKTtcblx0XHRpZiAoaW50ZWdlckluZGV4IDwgMCkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG11c3QgYmUgPj0gMCcpO1xuXHRcdH1cblx0XHR2YXIgaW5kZXggPSB0aGlzLlRvTGVuZ3RoKGludGVnZXJJbmRleCk7XG5cdFx0aWYgKCF0aGlzLlNhbWVWYWx1ZVplcm8oaW50ZWdlckluZGV4LCBpbmRleCkpIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBtdXN0IGJlID49IDAgYW5kIDwgMiAqKiA1MyAtIDEnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluZGV4O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNzZWMtZW51bWVyYWJsZW93bnByb3BlcnRpZXNcblx0RW51bWVyYWJsZU93blByb3BlcnRpZXM6IGZ1bmN0aW9uIEVudW1lcmFibGVPd25Qcm9wZXJ0aWVzKE8sIGtpbmQpIHtcblx0XHR2YXIga2V5cyA9IEVTMjAxNi5FbnVtZXJhYmxlT3duTmFtZXMoTyk7XG5cdFx0aWYgKGtpbmQgPT09ICdrZXknKSB7XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9XG5cdFx0aWYgKGtpbmQgPT09ICd2YWx1ZScgfHwga2luZCA9PT0gJ2tleSt2YWx1ZScpIHtcblx0XHRcdHZhciByZXN1bHRzID0gW107XG5cdFx0XHRmb3JFYWNoKGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKCRpc0VudW1lcmFibGUoTywga2V5KSkge1xuXHRcdFx0XHRcdCRwdXNoQXBwbHkocmVzdWx0cywgW1xuXHRcdFx0XHRcdFx0a2luZCA9PT0gJ3ZhbHVlJyA/IE9ba2V5XSA6IFtrZXksIE9ba2V5XV1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwia2luZFwiIGlzIG5vdCBcImtleVwiLCBcInZhbHVlXCIsIG9yIFwia2V5K3ZhbHVlXCI6ICcgKyBraW5kKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jc2VjLWl0ZXJhYmxldG9saXN0XG5cdEl0ZXJhYmxlVG9MaXN0OiBmdW5jdGlvbiBJdGVyYWJsZVRvTGlzdChpdGVtcywgbWV0aG9kKSB7XG5cdFx0dmFyIGl0ZXJhdG9yID0gdGhpcy5HZXRJdGVyYXRvcihpdGVtcywgbWV0aG9kKTtcblx0XHR2YXIgdmFsdWVzID0gW107XG5cdFx0dmFyIG5leHQgPSB0cnVlO1xuXHRcdHdoaWxlIChuZXh0KSB7XG5cdFx0XHRuZXh0ID0gdGhpcy5JdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuXHRcdFx0aWYgKG5leHQpIHtcblx0XHRcdFx0dmFyIG5leHRWYWx1ZSA9IHRoaXMuSXRlcmF0b3JWYWx1ZShuZXh0KTtcblx0XHRcdFx0JGFycmF5UHVzaCh2YWx1ZXMsIG5leHRWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH1cbn0pO1xuXG5kZWxldGUgRVMyMDE3LkVudW1lcmFibGVPd25OYW1lczsgLy8gcmVwbGFjZWQgd2l0aCBFbnVtZXJhYmxlT3duUHJvcGVydGllc1xuZGVsZXRlIEVTMjAxNy5JdGVyYWJsZVRvQXJyYXlMaWtlOyAvLyByZXBsYWNlZCB3aXRoIEl0ZXJhYmxlVG9MaXN0XG5cbm1vZHVsZS5leHBvcnRzID0gRVMyMDE3O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgRVMyMDE3ID0gcmVxdWlyZSgnLi9lczIwMTcnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4vaGVscGVycy9mb3JFYWNoJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJpbmQnKTtcbnZhciBldmVyeSA9IHJlcXVpcmUoJy4vaGVscGVycy9ldmVyeScpO1xudmFyIGlzUHJlZml4T2YgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNQcmVmaXhPZicpO1xuXG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2NhbGxCb3VuZCcpO1xudmFyIHJlZ2V4VGVzdGVyID0gcmVxdWlyZSgnLi9oZWxwZXJzL3JlZ2V4VGVzdGVyJyk7XG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzTmFOJyk7XG5cbnZhciAkU3ltYm9sVmFsdWVPZiA9IGNhbGxCb3VuZCgnU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mJywgdHJ1ZSk7XG4vLyB2YXIgJGNoYXJBdCA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5jaGFyQXQnKTtcbnZhciAkc3RyU2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciAkaW5kZXhPZiA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJyk7XG52YXIgJHBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbnZhciBpc0RpZ2l0ID0gcmVnZXhUZXN0ZXIoL15bMC05XSQvKTtcblxudmFyICRQcm9taXNlUmVzb2x2ZSA9IGNhbGxCb3VuZCgnUHJvbWlzZS5yZXNvbHZlJywgdHJ1ZSk7XG5cbnZhciAkaXNFbnVtZXJhYmxlID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlJyk7XG52YXIgJHB1c2hBcHBseSA9IGNhbGxCaW5kLmFwcGx5KEdldEludHJpbnNpYygnJUFycmF5LnByb3RvdHlwZS5wdXNoJScpKTtcbnZhciAkZ09QUyA9ICRTeW1ib2xWYWx1ZU9mID8gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyUnKSA6IG51bGw7XG5cbnZhciBwYWRUaW1lQ29tcG9uZW50ID0gZnVuY3Rpb24gcGFkVGltZUNvbXBvbmVudChjLCBjb3VudCkge1xuXHRyZXR1cm4gJHN0clNsaWNlKCcwMCcgKyBjLCAtKGNvdW50IHx8IDIpKTtcbn07XG5cbnZhciB3ZWVrZGF5cyA9IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J107XG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG52YXIgT3duUHJvcGVydHlLZXlzID0gZnVuY3Rpb24gT3duUHJvcGVydHlLZXlzKEVTLCBzb3VyY2UpIHtcblx0dmFyIG93bktleXMgPSBrZXlzKHNvdXJjZSk7XG5cdGlmICgkZ09QUykge1xuXHRcdCRwdXNoQXBwbHkob3duS2V5cywgJGdPUFMoc291cmNlKSk7XG5cdH1cblx0cmV0dXJuIG93bktleXM7XG59O1xuXG52YXIgRVMyMDE4ID0gYXNzaWduKGFzc2lnbih7fSwgRVMyMDE3KSwge1xuXHRFbnVtZXJhYmxlT3duUHJvcGVydHlOYW1lczogRVMyMDE3LkVudW1lcmFibGVPd25Qcm9wZXJ0aWVzLFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvI3NlYy10aGlzc3ltYm9sdmFsdWVcblx0dGhpc1N5bWJvbFZhbHVlOiBmdW5jdGlvbiB0aGlzU3ltYm9sVmFsdWUodmFsdWUpIHtcblx0XHRpZiAoISRTeW1ib2xWYWx1ZU9mKSB7XG5cdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N5bWJvbHMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHRoaXNTeW1ib2xWYWx1ZSByZXF1aXJlcyB0aGF0IGB2YWx1ZWAgYmUgYSBTeW1ib2wgb3IgYSBTeW1ib2wgb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUodmFsdWUpID09PSAnU3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0XHRyZXR1cm4gJFN5bWJvbFZhbHVlT2YodmFsdWUpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wLyNzZWMtaXNzdHJpbmdwcmVmaXhcblx0SXNTdHJpbmdQcmVmaXg6IGZ1bmN0aW9uIElzU3RyaW5nUHJlZml4KHAsIHEpIHtcblx0XHRpZiAodGhpcy5UeXBlKHApICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogXCJwXCIgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLlR5cGUocSkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBcInFcIiBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlzUHJlZml4T2YocCwgcSk7XG5cdFx0Lypcblx0XHRpZiAocCA9PT0gcSB8fCBwID09PSAnJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIHBMZW5ndGggPSBwLmxlbmd0aDtcblx0XHR2YXIgcUxlbmd0aCA9IHEubGVuZ3RoO1xuXHRcdGlmIChwTGVuZ3RoID49IHFMZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBhc3NlcnQ6IHBMZW5ndGggPCBxTGVuZ3RoXG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHBMZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0aWYgKCRjaGFyQXQocCwgaSkgIT09ICRjaGFyQXQocSwgaSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0XHQqL1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wLyNzZWMtdG9zdHJpbmctYXBwbGllZC10by10aGUtbnVtYmVyLXR5cGVcblx0TnVtYmVyVG9TdHJpbmc6IGZ1bmN0aW9uIE51bWJlclRvU3RyaW5nKG0pIHtcblx0XHRpZiAodGhpcy5UeXBlKG0pICE9PSAnTnVtYmVyJykge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogXCJtXCIgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdHJldHVybiAkU3RyaW5nKG0pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wLyNzZWMtY29weWRhdGFwcm9wZXJ0aWVzXG5cdENvcHlEYXRhUHJvcGVydGllczogZnVuY3Rpb24gQ29weURhdGFQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlLCBleGNsdWRlZEl0ZW1zKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh0YXJnZXQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogXCJ0YXJnZXRcIiBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5Jc0FycmF5KGV4Y2x1ZGVkSXRlbXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBcImV4Y2x1ZGVkSXRlbXNcIiBtdXN0IGJlIGEgTGlzdCBvZiBQcm9wZXJ0eSBLZXlzJyk7XG5cdFx0fVxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZXhjbHVkZWRJdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoZXhjbHVkZWRJdGVtc1tpXSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogXCJleGNsdWRlZEl0ZW1zXCIgbXVzdCBiZSBhIExpc3Qgb2YgUHJvcGVydHkgS2V5cycpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJyB8fCBzb3VyY2UgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0dmFyIEVTID0gdGhpcztcblxuXHRcdHZhciBmcm9tT2JqID0gRVMuVG9PYmplY3Qoc291cmNlKTtcblxuXHRcdHZhciBzb3VyY2VLZXlzID0gT3duUHJvcGVydHlLZXlzKEVTLCBmcm9tT2JqKTtcblx0XHRmb3JFYWNoKHNvdXJjZUtleXMsIGZ1bmN0aW9uIChuZXh0S2V5KSB7XG5cdFx0XHR2YXIgZXhjbHVkZWQgPSBmYWxzZTtcblxuXHRcdFx0Zm9yRWFjaChleGNsdWRlZEl0ZW1zLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRpZiAoRVMuU2FtZVZhbHVlKGUsIG5leHRLZXkpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0ZXhjbHVkZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dmFyIGVudW1lcmFibGUgPSAkaXNFbnVtZXJhYmxlKGZyb21PYmosIG5leHRLZXkpIHx8IChcblx0XHRcdFx0Ly8gdGhpcyBpcyB0byBoYW5kbGUgc3RyaW5nIGtleXMgYmVpbmcgbm9uLWVudW1lcmFibGUgaW4gb2xkZXIgZW5naW5lc1xuXHRcdFx0XHR0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJ1xuXHRcdFx0XHQmJiBuZXh0S2V5ID49IDBcblx0XHRcdFx0JiYgRVMuSXNJbnRlZ2VyKEVTLlRvTnVtYmVyKG5leHRLZXkpKVxuXHRcdFx0KTtcblx0XHRcdGlmIChleGNsdWRlZCA9PT0gZmFsc2UgJiYgZW51bWVyYWJsZSkge1xuXHRcdFx0XHR2YXIgcHJvcFZhbHVlID0gRVMuR2V0KGZyb21PYmosIG5leHRLZXkpO1xuXHRcdFx0XHRFUy5DcmVhdGVEYXRhUHJvcGVydHkodGFyZ2V0LCBuZXh0S2V5LCBwcm9wVmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wLyNzZWMtcHJvbWlzZS1yZXNvbHZlXG5cdFByb21pc2VSZXNvbHZlOiBmdW5jdGlvbiBQcm9taXNlUmVzb2x2ZShDLCB4KSB7XG5cdFx0aWYgKCEkUHJvbWlzZVJlc29sdmUpIHtcblx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFByb21pc2VzLicpO1xuXHRcdH1cblx0XHRyZXR1cm4gJFByb21pc2VSZXNvbHZlKEMsIHgpO1xuXHR9LFxuXG5cdC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvI3NlYy1nZXRzdWJzdGl0dXRpb25cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBtYXgtcGFyYW1zLCBtYXgtbGluZXMtcGVyLWZ1bmN0aW9uXG5cdEdldFN1YnN0aXR1dGlvbjogZnVuY3Rpb24gR2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuXHRcdGlmICh0aGlzLlR5cGUobWF0Y2hlZCkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYG1hdGNoZWRgIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdFx0dmFyIG1hdGNoTGVuZ3RoID0gbWF0Y2hlZC5sZW5ndGg7XG5cblx0XHRpZiAodGhpcy5UeXBlKHN0cikgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHN0cmAgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgc3RyaW5nTGVuZ3RoID0gc3RyLmxlbmd0aDtcblxuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIocG9zaXRpb24pIHx8IHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IHN0cmluZ0xlbmd0aCkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBwb3NpdGlvbmAgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIsIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBgc3RyaW5nYCwgZ290ICcgKyBpbnNwZWN0KHBvc2l0aW9uKSk7XG5cdFx0fVxuXG5cdFx0dmFyIEVTID0gdGhpcztcblx0XHR2YXIgaXNTdHJpbmdPckhvbGUgPSBmdW5jdGlvbiAoY2FwdHVyZSwgaW5kZXgsIGFycikgeyByZXR1cm4gRVMuVHlwZShjYXB0dXJlKSA9PT0gJ1N0cmluZycgfHwgIShpbmRleCBpbiBhcnIpOyB9O1xuXHRcdGlmICghdGhpcy5Jc0FycmF5KGNhcHR1cmVzKSB8fCAhZXZlcnkoY2FwdHVyZXMsIGlzU3RyaW5nT3JIb2xlKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBjYXB0dXJlc2AgbXVzdCBiZSBhIExpc3Qgb2YgU3RyaW5ncywgZ290ICcgKyBpbnNwZWN0KGNhcHR1cmVzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuVHlwZShyZXBsYWNlbWVudCkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHJlcGxhY2VtZW50YCBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0dmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoTGVuZ3RoO1xuXHRcdHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuXHRcdGlmICh0aGlzLlR5cGUobmFtZWRDYXB0dXJlcykgIT09ICdVbmRlZmluZWQnKSB7XG5cdFx0XHRuYW1lZENhcHR1cmVzID0gdGhpcy5Ub09iamVjdChuYW1lZENhcHR1cmVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdH1cblxuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJlcGxhY2VtZW50Lmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHQvLyBpZiB0aGlzIGlzIGEgJCwgYW5kIGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHJlcGxhY2VtZW50XG5cdFx0XHR2YXIgY3VycmVudCA9IHJlcGxhY2VtZW50W2ldO1xuXHRcdFx0dmFyIGlzTGFzdCA9IChpICsgMSkgPj0gcmVwbGFjZW1lbnQubGVuZ3RoO1xuXHRcdFx0dmFyIG5leHRJc0xhc3QgPSAoaSArIDIpID49IHJlcGxhY2VtZW50Lmxlbmd0aDtcblx0XHRcdGlmIChjdXJyZW50ID09PSAnJCcgJiYgIWlzTGFzdCkge1xuXHRcdFx0XHR2YXIgbmV4dCA9IHJlcGxhY2VtZW50W2kgKyAxXTtcblx0XHRcdFx0aWYgKG5leHQgPT09ICckJykge1xuXHRcdFx0XHRcdHJlc3VsdCArPSAnJCc7XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG5leHQgPT09ICcmJykge1xuXHRcdFx0XHRcdHJlc3VsdCArPSBtYXRjaGVkO1xuXHRcdFx0XHRcdGkgKz0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChuZXh0ID09PSAnYCcpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gcG9zaXRpb24gPT09IDAgPyAnJyA6ICRzdHJTbGljZShzdHIsIDAsIHBvc2l0aW9uIC0gMSk7XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG5leHQgPT09IFwiJ1wiKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHRhaWxQb3MgPj0gc3RyaW5nTGVuZ3RoID8gJycgOiAkc3RyU2xpY2Uoc3RyLCB0YWlsUG9zKTtcblx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG5leHROZXh0ID0gbmV4dElzTGFzdCA/IG51bGwgOiByZXBsYWNlbWVudFtpICsgMl07XG5cdFx0XHRcdFx0aWYgKGlzRGlnaXQobmV4dCkgJiYgbmV4dCAhPT0gJzAnICYmIChuZXh0SXNMYXN0IHx8ICFpc0RpZ2l0KG5leHROZXh0KSkpIHtcblx0XHRcdFx0XHRcdC8vICQxIHRocm91Z2ggJDksIGFuZCBub3QgZm9sbG93ZWQgYnkgYSBkaWdpdFxuXHRcdFx0XHRcdFx0dmFyIG4gPSAkcGFyc2VJbnQobmV4dCwgMTApO1xuXHRcdFx0XHRcdFx0Ly8gaWYgKG4gPiBtLCBpbXBsLWRlZmluZWQpXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gKG4gPD0gbSAmJiB0aGlzLlR5cGUoY2FwdHVyZXNbbiAtIDFdKSA9PT0gJ1VuZGVmaW5lZCcpID8gJycgOiBjYXB0dXJlc1tuIC0gMV07XG5cdFx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpc0RpZ2l0KG5leHQpICYmIChuZXh0SXNMYXN0IHx8IGlzRGlnaXQobmV4dE5leHQpKSkge1xuXHRcdFx0XHRcdFx0Ly8gJDAwIHRocm91Z2ggJDk5XG5cdFx0XHRcdFx0XHR2YXIgbm4gPSBuZXh0ICsgbmV4dE5leHQ7XG5cdFx0XHRcdFx0XHR2YXIgbm5JID0gJHBhcnNlSW50KG5uLCAxMCkgLSAxO1xuXHRcdFx0XHRcdFx0Ly8gaWYgbm4gPT09ICcwMCcgb3Igbm4gPiBtLCBpbXBsLWRlZmluZWRcblx0XHRcdFx0XHRcdHJlc3VsdCArPSAobm4gPD0gbSAmJiB0aGlzLlR5cGUoY2FwdHVyZXNbbm5JXSkgPT09ICdVbmRlZmluZWQnKSA/ICcnIDogY2FwdHVyZXNbbm5JXTtcblx0XHRcdFx0XHRcdGkgKz0gMjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5leHQgPT09ICc8Jykge1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1kZXB0aFxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuVHlwZShuYW1lZENhcHR1cmVzKSA9PT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0ICs9ICckPCc7XG5cdFx0XHRcdFx0XHRcdGkgKz0gMjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHZhciBlbmRJbmRleCA9ICRpbmRleE9mKHJlcGxhY2VtZW50LCAnPicsIGkpO1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRcdFx0XHRcdGlmIChlbmRJbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwTmFtZSA9ICRzdHJTbGljZShyZXBsYWNlbWVudCwgaSwgZW5kSW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRcdHZhciBjYXB0dXJlID0gdGhpcy5HZXQobmFtZWRDYXB0dXJlcywgZ3JvdXBOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuVHlwZShjYXB0dXJlKSAhPT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdCArPSB0aGlzLlRvU3RyaW5nKGNhcHR1cmUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpICs9ICckPCcgKyBncm91cE5hbWUgKyAnPicubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc3VsdCArPSAnJCc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgZmluYWwgJCwgb3IgZWxzZSBub3QgYSAkXG5cdFx0XHRcdHJlc3VsdCArPSByZXBsYWNlbWVudFtpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLWRhdGVzdHJpbmdcblx0RGF0ZVN0cmluZzogZnVuY3Rpb24gRGF0ZVN0cmluZyh0dikge1xuXHRcdGlmICh0aGlzLlR5cGUodHYpICE9PSAnTnVtYmVyJyB8fCAkaXNOYU4odHYpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHR2YCBtdXN0IGJlIGEgbm9uLU5hTiBOdW1iZXInKTtcblx0XHR9XG5cdFx0dmFyIHdlZWtkYXkgPSB3ZWVrZGF5c1t0aGlzLldlZWtEYXkodHYpXTtcblx0XHR2YXIgbW9udGggPSBtb250aHNbdGhpcy5Nb250aEZyb21UaW1lKHR2KV07XG5cdFx0dmFyIGRheSA9IHBhZFRpbWVDb21wb25lbnQodGhpcy5EYXRlRnJvbVRpbWUodHYpKTtcblx0XHR2YXIgeWVhciA9IHBhZFRpbWVDb21wb25lbnQodGhpcy5ZZWFyRnJvbVRpbWUodHYpLCA0KTtcblx0XHRyZXR1cm4gd2Vla2RheSArICdcXHgyMCcgKyBtb250aCArICdcXHgyMCcgKyBkYXkgKyAnXFx4MjAnICsgeWVhcjtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLXRpbWVzdHJpbmdcblx0VGltZVN0cmluZzogZnVuY3Rpb24gVGltZVN0cmluZyh0dikge1xuXHRcdGlmICh0aGlzLlR5cGUodHYpICE9PSAnTnVtYmVyJyB8fCAkaXNOYU4odHYpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYHR2YCBtdXN0IGJlIGEgbm9uLU5hTiBOdW1iZXInKTtcblx0XHR9XG5cdFx0dmFyIGhvdXIgPSB0aGlzLkhvdXJGcm9tVGltZSh0dik7XG5cdFx0dmFyIG1pbnV0ZSA9IHRoaXMuTWluRnJvbVRpbWUodHYpO1xuXHRcdHZhciBzZWNvbmQgPSB0aGlzLlNlY0Zyb21UaW1lKHR2KTtcblx0XHRyZXR1cm4gcGFkVGltZUNvbXBvbmVudChob3VyKSArICc6JyArIHBhZFRpbWVDb21wb25lbnQobWludXRlKSArICc6JyArIHBhZFRpbWVDb21wb25lbnQoc2Vjb25kKSArICdcXHgyMEdNVCc7XG5cdH1cbn0pO1xuXG5kZWxldGUgRVMyMDE4LkVudW1lcmFibGVPd25Qcm9wZXJ0aWVzOyAvLyByZXBsYWNlZCB3aXRoIEVudW1lcmFibGVPd25Qcm9wZXJ0eU5hbWVzXG5cbmRlbGV0ZSBFUzIwMTguSXNQcm9wZXJ0eURlc2NyaXB0b3I7IC8vIG5vdCBhbiBhY3R1YWwgYWJzdHJhY3Qgb3BlcmF0aW9uXG5cbm1vZHVsZS5leHBvcnRzID0gRVMyMDE4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJpbVN0YXJ0ID0gcmVxdWlyZSgnc3RyaW5nLnByb3RvdHlwZS50cmltbGVmdCcpO1xudmFyIHRyaW1FbmQgPSByZXF1aXJlKCdzdHJpbmcucHJvdG90eXBlLnRyaW1yaWdodCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgRVMyMDE4ID0gcmVxdWlyZSgnLi9lczIwMTgnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IHJlcXVpcmUoJy4vaGVscGVycy9tYXhTYWZlSW50ZWdlcicpO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG5cbnZhciBFUzIwMTkgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzIwMTgpLCB7XG5cdC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWRkLWVudHJpZXMtZnJvbS1pdGVyYWJsZVxuXHRBZGRFbnRyaWVzRnJvbUl0ZXJhYmxlOiBmdW5jdGlvbiBBZGRFbnRyaWVzRnJvbUl0ZXJhYmxlKHRhcmdldCwgaXRlcmFibGUsIGFkZGVyKSB7XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoYWRkZXIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYGFkZGVyYCBpcyBub3QgY2FsbGFibGUnKTtcblx0XHR9XG5cdFx0aWYgKGl0ZXJhYmxlID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgaXRlcmFibGVgIGlzIHByZXNlbnQsIGFuZCBub3QgbnVsbGlzaCcpO1xuXHRcdH1cblx0XHR2YXIgaXRlcmF0b3JSZWNvcmQgPSB0aGlzLkdldEl0ZXJhdG9yKGl0ZXJhYmxlKTtcblx0XHR3aGlsZSAodHJ1ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuXHRcdFx0dmFyIG5leHQgPSB0aGlzLkl0ZXJhdG9yU3RlcChpdGVyYXRvclJlY29yZCk7XG5cdFx0XHRpZiAoIW5leHQpIHtcblx0XHRcdFx0cmV0dXJuIHRhcmdldDtcblx0XHRcdH1cblx0XHRcdHZhciBuZXh0SXRlbSA9IHRoaXMuSXRlcmF0b3JWYWx1ZShuZXh0KTtcblx0XHRcdGlmICh0aGlzLlR5cGUobmV4dEl0ZW0pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0XHR2YXIgZXJyb3IgPSBuZXcgJFR5cGVFcnJvcignaXRlcmF0b3IgbmV4dCBtdXN0IHJldHVybiBhbiBPYmplY3QsIGdvdCAnICsgaW5zcGVjdChuZXh0SXRlbSkpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5JdGVyYXRvckNsb3NlKFxuXHRcdFx0XHRcdGl0ZXJhdG9yUmVjb3JkLFxuXHRcdFx0XHRcdGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyb3I7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb29wLWZ1bmNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciBrID0gdGhpcy5HZXQobmV4dEl0ZW0sICcwJyk7XG5cdFx0XHRcdHZhciB2ID0gdGhpcy5HZXQobmV4dEl0ZW0sICcxJyk7XG5cdFx0XHRcdHRoaXMuQ2FsbChhZGRlciwgdGFyZ2V0LCBbaywgdl0pO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5JdGVyYXRvckNsb3NlKFxuXHRcdFx0XHRcdGl0ZXJhdG9yUmVjb3JkLFxuXHRcdFx0XHRcdGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvb3AtZnVuY1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvMTAuMC8jc2VjLWZsYXR0ZW5pbnRvYXJyYXlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXMsIG1heC1zdGF0ZW1lbnRzXG5cdEZsYXR0ZW5JbnRvQXJyYXk6IGZ1bmN0aW9uIEZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZUxlbiwgc3RhcnQsIGRlcHRoKSB7XG5cdFx0dmFyIG1hcHBlckZ1bmN0aW9uO1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNSkge1xuXHRcdFx0bWFwcGVyRnVuY3Rpb24gPSBhcmd1bWVudHNbNV07XG5cdFx0fVxuXG5cdFx0dmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7XG5cdFx0dmFyIHNvdXJjZUluZGV4ID0gMDtcblx0XHR3aGlsZSAoc291cmNlSW5kZXggPCBzb3VyY2VMZW4pIHtcblx0XHRcdHZhciBQID0gdGhpcy5Ub1N0cmluZyhzb3VyY2VJbmRleCk7XG5cdFx0XHR2YXIgZXhpc3RzID0gdGhpcy5IYXNQcm9wZXJ0eShzb3VyY2UsIFApO1xuXHRcdFx0aWYgKGV4aXN0cyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHR2YXIgZWxlbWVudCA9IHRoaXMuR2V0KHNvdXJjZSwgUCk7XG5cdFx0XHRcdGlmICh0eXBlb2YgbWFwcGVyRnVuY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gNikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHRoaXNBcmcgaXMgcmVxdWlyZWQgd2hlbiBtYXBwZXJGdW5jdGlvbiBpcyBwcm92aWRlZCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtZW50ID0gdGhpcy5DYWxsKG1hcHBlckZ1bmN0aW9uLCBhcmd1bWVudHNbNl0sIFtlbGVtZW50LCBzb3VyY2VJbmRleCwgc291cmNlXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIHNob3VsZEZsYXR0ZW4gPSBmYWxzZTtcblx0XHRcdFx0aWYgKGRlcHRoID4gMCkge1xuXHRcdFx0XHRcdHNob3VsZEZsYXR0ZW4gPSB0aGlzLklzQXJyYXkoZWxlbWVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNob3VsZEZsYXR0ZW4pIHtcblx0XHRcdFx0XHR2YXIgZWxlbWVudExlbiA9IHRoaXMuVG9MZW5ndGgodGhpcy5HZXQoZWxlbWVudCwgJ2xlbmd0aCcpKTtcblx0XHRcdFx0XHR0YXJnZXRJbmRleCA9IHRoaXMuRmxhdHRlbkludG9BcnJheSh0YXJnZXQsIGVsZW1lbnQsIGVsZW1lbnRMZW4sIHRhcmdldEluZGV4LCBkZXB0aCAtIDEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh0YXJnZXRJbmRleCA+PSBNQVhfU0FGRV9JTlRFR0VSKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW5kZXggdG9vIGxhcmdlJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyh0YXJnZXQsIHRoaXMuVG9TdHJpbmcodGFyZ2V0SW5kZXgpLCBlbGVtZW50KTtcblx0XHRcdFx0XHR0YXJnZXRJbmRleCArPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRzb3VyY2VJbmRleCArPSAxO1xuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRJbmRleDtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvMTAuMC8jc2VjLXRyaW1zdHJpbmdcblx0VHJpbVN0cmluZzogZnVuY3Rpb24gVHJpbVN0cmluZyhzdHJpbmcsIHdoZXJlKSB7XG5cdFx0dmFyIHN0ciA9IHRoaXMuUmVxdWlyZU9iamVjdENvZXJjaWJsZShzdHJpbmcpO1xuXHRcdHZhciBTID0gdGhpcy5Ub1N0cmluZyhzdHIpO1xuXHRcdHZhciBUO1xuXHRcdGlmICh3aGVyZSA9PT0gJ3N0YXJ0Jykge1xuXHRcdFx0VCA9IHRyaW1TdGFydChTKTtcblx0XHR9IGVsc2UgaWYgKHdoZXJlID09PSAnZW5kJykge1xuXHRcdFx0VCA9IHRyaW1FbmQoUyk7XG5cdFx0fSBlbHNlIGlmICh3aGVyZSA9PT0gJ3N0YXJ0K2VuZCcpIHtcblx0XHRcdFQgPSB0cmltU3RhcnQodHJpbUVuZChTKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBpbnZhbGlkIGB3aGVyZWAgdmFsdWU7IG11c3QgYmUgXCJzdGFydFwiLCBcImVuZFwiLCBvciBcInN0YXJ0K2VuZFwiJyk7XG5cdFx0fVxuXHRcdHJldHVybiBUO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFUzIwMTk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuL0dldEludHJpbnNpYycpO1xuXG52YXIgJE9iamVjdCA9IEdldEludHJpbnNpYygnJU9iamVjdCUnKTtcbnZhciAkRXZhbEVycm9yID0gR2V0SW50cmluc2ljKCclRXZhbEVycm9yJScpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcbnZhciAkRGF0ZSA9IEdldEludHJpbnNpYygnJURhdGUlJyk7XG52YXIgJE51bWJlciA9IEdldEludHJpbnNpYygnJU51bWJlciUnKTtcbnZhciAkZmxvb3IgPSBHZXRJbnRyaW5zaWMoJyVNYXRoLmZsb29yJScpO1xudmFyICREYXRlVVRDID0gR2V0SW50cmluc2ljKCclRGF0ZS5VVEMlJyk7XG52YXIgJGFicyA9IEdldEludHJpbnNpYygnJU1hdGguYWJzJScpO1xuXG52YXIgYXNzZXJ0UmVjb3JkID0gcmVxdWlyZSgnLi9oZWxwZXJzL2Fzc2VydFJlY29yZCcpO1xudmFyIGlzUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJvcGVydHlEZXNjcmlwdG9yJyk7XG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzTmFOJyk7XG52YXIgJGlzRmluaXRlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzRmluaXRlJyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9zaWduJyk7XG52YXIgbW9kID0gcmVxdWlyZSgnLi9oZWxwZXJzL21vZCcpO1xudmFyIGlzUHJlZml4T2YgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNQcmVmaXhPZicpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJy4vaGVscGVycy9jYWxsQm91bmQnKTtcblxudmFyIElzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzNScpO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG5cbnZhciAkZ2V0VVRDRnVsbFllYXIgPSBjYWxsQm91bmQoJ0RhdGUucHJvdG90eXBlLmdldFVUQ0Z1bGxZZWFyJyk7XG5cbnZhciBIb3Vyc1BlckRheSA9IDI0O1xudmFyIE1pbnV0ZXNQZXJIb3VyID0gNjA7XG52YXIgU2Vjb25kc1Blck1pbnV0ZSA9IDYwO1xudmFyIG1zUGVyU2Vjb25kID0gMWUzO1xudmFyIG1zUGVyTWludXRlID0gbXNQZXJTZWNvbmQgKiBTZWNvbmRzUGVyTWludXRlO1xudmFyIG1zUGVySG91ciA9IG1zUGVyTWludXRlICogTWludXRlc1BlckhvdXI7XG52YXIgbXNQZXJEYXkgPSA4NjQwMDAwMDtcblxuLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OVxudmFyIEVTNSA9IHtcblx0VG9QcmltaXRpdmU6IHRvUHJpbWl0aXZlLFxuXG5cdFRvQm9vbGVhbjogZnVuY3Rpb24gVG9Cb29sZWFuKHZhbHVlKSB7XG5cdFx0cmV0dXJuICEhdmFsdWU7XG5cdH0sXG5cdFRvTnVtYmVyOiBmdW5jdGlvbiBUb051bWJlcih2YWx1ZSkge1xuXHRcdHJldHVybiArdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0fSxcblx0VG9JbnRlZ2VyOiBmdW5jdGlvbiBUb0ludGVnZXIodmFsdWUpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcih2YWx1ZSk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0aWYgKG51bWJlciA9PT0gMCB8fCAhJGlzRmluaXRlKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuXHRcdHJldHVybiBzaWduKG51bWJlcikgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuXHR9LFxuXHRUb0ludDMyOiBmdW5jdGlvbiBUb0ludDMyKHgpIHtcblx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih4KSA+PiAwO1xuXHR9LFxuXHRUb1VpbnQzMjogZnVuY3Rpb24gVG9VaW50MzIoeCkge1xuXHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHgpID4+PiAwO1xuXHR9LFxuXHRUb1VpbnQxNjogZnVuY3Rpb24gVG9VaW50MTYodmFsdWUpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcih2YWx1ZSk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gMCB8fCAhJGlzRmluaXRlKG51bWJlcikpIHsgcmV0dXJuIDA7IH1cblx0XHR2YXIgcG9zSW50ID0gc2lnbihudW1iZXIpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcblx0XHRyZXR1cm4gbW9kKHBvc0ludCwgMHgxMDAwMCk7XG5cdH0sXG5cdFRvU3RyaW5nOiBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSkge1xuXHRcdHJldHVybiAkU3RyaW5nKHZhbHVlKTtcblx0fSxcblx0VG9PYmplY3Q6IGZ1bmN0aW9uIFRvT2JqZWN0KHZhbHVlKSB7XG5cdFx0dGhpcy5DaGVja09iamVjdENvZXJjaWJsZSh2YWx1ZSk7XG5cdFx0cmV0dXJuICRPYmplY3QodmFsdWUpO1xuXHR9LFxuXHRDaGVja09iamVjdENvZXJjaWJsZTogZnVuY3Rpb24gQ2hlY2tPYmplY3RDb2VyY2libGUodmFsdWUsIG9wdE1lc3NhZ2UpIHtcblx0XHQvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0XHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3Iob3B0TWVzc2FnZSB8fCAnQ2Fubm90IGNhbGwgbWV0aG9kIG9uICcgKyB2YWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0SXNDYWxsYWJsZTogSXNDYWxsYWJsZSxcblx0U2FtZVZhbHVlOiBmdW5jdGlvbiBTYW1lVmFsdWUoeCwgeSkge1xuXHRcdGlmICh4ID09PSB5KSB7IC8vIDAgPT09IC0wLCBidXQgdGhleSBhcmUgbm90IGlkZW50aWNhbC5cblx0XHRcdGlmICh4ID09PSAwKSB7IHJldHVybiAxIC8geCA9PT0gMSAvIHk7IH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gJGlzTmFOKHgpICYmICRpc05hTih5KTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOFxuXHRUeXBlOiBmdW5jdGlvbiBUeXBlKHgpIHtcblx0XHRpZiAoeCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuICdOdWxsJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuICdVbmRlZmluZWQnO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gJ09iamVjdCc7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiAnTnVtYmVyJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHJldHVybiAnQm9vbGVhbic7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiAnU3RyaW5nJztcblx0XHR9XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnR5LWRlc2NyaXB0b3Itc3BlY2lmaWNhdGlvbi10eXBlXG5cdElzUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBJc1Byb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0cmV0dXJuIGlzUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIERlc2MpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjFcblx0SXNBY2Nlc3NvckRlc2NyaXB0b3I6IGZ1bmN0aW9uIElzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodHlwZW9mIERlc2MgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdGlmICghaGFzKERlc2MsICdbW0dldF1dJykgJiYgIWhhcyhEZXNjLCAnW1tTZXRdXScpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTAuMlxuXHRJc0RhdGFEZXNjcmlwdG9yOiBmdW5jdGlvbiBJc0RhdGFEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodHlwZW9mIERlc2MgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdGlmICghaGFzKERlc2MsICdbW1ZhbHVlXV0nKSAmJiAhaGFzKERlc2MsICdbW1dyaXRhYmxlXV0nKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjNcblx0SXNHZW5lcmljRGVzY3JpcHRvcjogZnVuY3Rpb24gSXNHZW5lcmljRGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAoIXRoaXMuSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykgJiYgIXRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjRcblx0RnJvbVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gRnJvbVByb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIERlc2M7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdGlmICh0aGlzLklzRGF0YURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHZhbHVlOiBEZXNjWydbW1ZhbHVlXV0nXSxcblx0XHRcdFx0d3JpdGFibGU6ICEhRGVzY1snW1tXcml0YWJsZV1dJ10sXG5cdFx0XHRcdGVudW1lcmFibGU6ICEhRGVzY1snW1tFbnVtZXJhYmxlXV0nXSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiAhIURlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldDogRGVzY1snW1tHZXRdXSddLFxuXHRcdFx0XHRzZXQ6IERlc2NbJ1tbU2V0XV0nXSxcblx0XHRcdFx0ZW51bWVyYWJsZTogISFEZXNjWydbW0VudW1lcmFibGVdXSddLFxuXHRcdFx0XHRjb25maWd1cmFibGU6ICEhRGVzY1snW1tDb25maWd1cmFibGVdXSddXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignRnJvbVByb3BlcnR5RGVzY3JpcHRvciBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVsbHkgcG9wdWxhdGVkIFByb3BlcnR5IERlc2NyaXB0b3InKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTAuNVxuXHRUb1Byb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gVG9Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPYmopICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1RvUHJvcGVydHlEZXNjcmlwdG9yIHJlcXVpcmVzIGFuIG9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHZhciBkZXNjID0ge307XG5cdFx0aWYgKGhhcyhPYmosICdlbnVtZXJhYmxlJykpIHtcblx0XHRcdGRlc2NbJ1tbRW51bWVyYWJsZV1dJ10gPSB0aGlzLlRvQm9vbGVhbihPYmouZW51bWVyYWJsZSk7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnY29uZmlndXJhYmxlJykpIHtcblx0XHRcdGRlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXSA9IHRoaXMuVG9Cb29sZWFuKE9iai5jb25maWd1cmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ3ZhbHVlJykpIHtcblx0XHRcdGRlc2NbJ1tbVmFsdWVdXSddID0gT2JqLnZhbHVlO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ3dyaXRhYmxlJykpIHtcblx0XHRcdGRlc2NbJ1tbV3JpdGFibGVdXSddID0gdGhpcy5Ub0Jvb2xlYW4oT2JqLndyaXRhYmxlKTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICdnZXQnKSkge1xuXHRcdFx0dmFyIGdldHRlciA9IE9iai5nZXQ7XG5cdFx0XHRpZiAodHlwZW9mIGdldHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuSXNDYWxsYWJsZShnZXR0ZXIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2dldHRlciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0XHRcdH1cblx0XHRcdGRlc2NbJ1tbR2V0XV0nXSA9IGdldHRlcjtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICdzZXQnKSkge1xuXHRcdFx0dmFyIHNldHRlciA9IE9iai5zZXQ7XG5cdFx0XHRpZiAodHlwZW9mIHNldHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuSXNDYWxsYWJsZShzZXR0ZXIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdzZXR0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0XHR9XG5cdFx0XHRkZXNjWydbW1NldF1dJ10gPSBzZXR0ZXI7XG5cdFx0fVxuXG5cdFx0aWYgKChoYXMoZGVzYywgJ1tbR2V0XV0nKSB8fCBoYXMoZGVzYywgJ1tbU2V0XV0nKSkgJiYgKGhhcyhkZXNjLCAnW1tWYWx1ZV1dJykgfHwgaGFzKGRlc2MsICdbW1dyaXRhYmxlXV0nKSkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdJbnZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3IuIENhbm5vdCBib3RoIHNwZWNpZnkgYWNjZXNzb3JzIGFuZCBhIHZhbHVlIG9yIHdyaXRhYmxlIGF0dHJpYnV0ZScpO1xuXHRcdH1cblx0XHRyZXR1cm4gZGVzYztcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTEuOS4zXG5cdCdBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJzogZnVuY3Rpb24gQWJzdHJhY3RFcXVhbGl0eUNvbXBhcmlzb24oeCwgeSkge1xuXHRcdHZhciB4VHlwZSA9IHRoaXMuVHlwZSh4KTtcblx0XHR2YXIgeVR5cGUgPSB0aGlzLlR5cGUoeSk7XG5cdFx0aWYgKHhUeXBlID09PSB5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHggPT09IHk7IC8vIEVTNisgc3BlY2lmaWVkIHRoaXMgc2hvcnRjdXQgYW55d2F5cy5cblx0XHR9XG5cdFx0aWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdOdW1iZXInICYmIHlUeXBlID09PSAnU3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvTnVtYmVyKHkpKTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnU3RyaW5nJyAmJiB5VHlwZSA9PT0gJ051bWJlcicpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10odGhpcy5Ub051bWJlcih4KSwgeSk7XG5cdFx0fVxuXHRcdGlmICh4VHlwZSA9PT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHRoaXMuVG9OdW1iZXIoeCksIHkpO1xuXHRcdH1cblx0XHRpZiAoeVR5cGUgPT09ICdCb29sZWFuJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvTnVtYmVyKHkpKTtcblx0XHR9XG5cdFx0aWYgKCh4VHlwZSA9PT0gJ1N0cmluZycgfHwgeFR5cGUgPT09ICdOdW1iZXInKSAmJiB5VHlwZSA9PT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10oeCwgdGhpcy5Ub1ByaW1pdGl2ZSh5KSk7XG5cdFx0fVxuXHRcdGlmICh4VHlwZSA9PT0gJ09iamVjdCcgJiYgKHlUeXBlID09PSAnU3RyaW5nJyB8fCB5VHlwZSA9PT0gJ051bWJlcicpKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHRoaXMuVG9QcmltaXRpdmUoeCksIHkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTExLjkuNlxuXHQnU3RyaWN0IEVxdWFsaXR5IENvbXBhcmlzb24nOiBmdW5jdGlvbiBTdHJpY3RFcXVhbGl0eUNvbXBhcmlzb24oeCwgeSkge1xuXHRcdHZhciB4VHlwZSA9IHRoaXMuVHlwZSh4KTtcblx0XHR2YXIgeVR5cGUgPSB0aGlzLlR5cGUoeSk7XG5cdFx0aWYgKHhUeXBlICE9PSB5VHlwZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdVbmRlZmluZWQnIHx8IHhUeXBlID09PSAnTnVsbCcpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4geCA9PT0geTsgLy8gc2hvcnRjdXQgZm9yIHN0ZXBzIDQtN1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xMS44LjVcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG5cdCdBYnN0cmFjdCBSZWxhdGlvbmFsIENvbXBhcmlzb24nOiBmdW5jdGlvbiBBYnN0cmFjdFJlbGF0aW9uYWxDb21wYXJpc29uKHgsIHksIExlZnRGaXJzdCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTGVmdEZpcnN0KSAhPT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogTGVmdEZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdHZhciBweDtcblx0XHR2YXIgcHk7XG5cdFx0aWYgKExlZnRGaXJzdCkge1xuXHRcdFx0cHggPSB0aGlzLlRvUHJpbWl0aXZlKHgsICROdW1iZXIpO1xuXHRcdFx0cHkgPSB0aGlzLlRvUHJpbWl0aXZlKHksICROdW1iZXIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRweSA9IHRoaXMuVG9QcmltaXRpdmUoeSwgJE51bWJlcik7XG5cdFx0XHRweCA9IHRoaXMuVG9QcmltaXRpdmUoeCwgJE51bWJlcik7XG5cdFx0fVxuXHRcdHZhciBib3RoU3RyaW5ncyA9IHRoaXMuVHlwZShweCkgPT09ICdTdHJpbmcnICYmIHRoaXMuVHlwZShweSkgPT09ICdTdHJpbmcnO1xuXHRcdGlmICghYm90aFN0cmluZ3MpIHtcblx0XHRcdHZhciBueCA9IHRoaXMuVG9OdW1iZXIocHgpO1xuXHRcdFx0dmFyIG55ID0gdGhpcy5Ub051bWJlcihweSk7XG5cdFx0XHRpZiAoJGlzTmFOKG54KSB8fCAkaXNOYU4obnkpKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGlzRmluaXRlKG54KSAmJiAkaXNGaW5pdGUobnkpICYmIG54ID09PSBueSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnggPT09IDAgJiYgbnkgPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG54ID09PSBJbmZpbml0eSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnkgPT09IEluZmluaXR5KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG55ID09PSAtSW5maW5pdHkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG54ID09PSAtSW5maW5pdHkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnggPCBueTsgLy8gYnkgbm93LCB0aGVzZSBhcmUgYm90aCBub256ZXJvLCBmaW5pdGUsIGFuZCBub3QgZXF1YWxcblx0XHR9XG5cdFx0aWYgKGlzUHJlZml4T2YocHksIHB4KSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaXNQcmVmaXhPZihweCwgcHkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIHB4IDwgcHk7IC8vIGJvdGggc3RyaW5ncywgbmVpdGhlciBhIHByZWZpeCBvZiB0aGUgb3RoZXIuIHNob3J0Y3V0IGZvciBzdGVwcyBjLWZcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjEwXG5cdG1zRnJvbVRpbWU6IGZ1bmN0aW9uIG1zRnJvbVRpbWUodCkge1xuXHRcdHJldHVybiBtb2QodCwgbXNQZXJTZWNvbmQpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMTBcblx0U2VjRnJvbVRpbWU6IGZ1bmN0aW9uIFNlY0Zyb21UaW1lKHQpIHtcblx0XHRyZXR1cm4gbW9kKCRmbG9vcih0IC8gbXNQZXJTZWNvbmQpLCBTZWNvbmRzUGVyTWludXRlKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjEwXG5cdE1pbkZyb21UaW1lOiBmdW5jdGlvbiBNaW5Gcm9tVGltZSh0KSB7XG5cdFx0cmV0dXJuIG1vZCgkZmxvb3IodCAvIG1zUGVyTWludXRlKSwgTWludXRlc1BlckhvdXIpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMTBcblx0SG91ckZyb21UaW1lOiBmdW5jdGlvbiBIb3VyRnJvbVRpbWUodCkge1xuXHRcdHJldHVybiBtb2QoJGZsb29yKHQgLyBtc1BlckhvdXIpLCBIb3Vyc1BlckRheSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjkuMS4yXG5cdERheTogZnVuY3Rpb24gRGF5KHQpIHtcblx0XHRyZXR1cm4gJGZsb29yKHQgLyBtc1BlckRheSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjkuMS4yXG5cdFRpbWVXaXRoaW5EYXk6IGZ1bmN0aW9uIFRpbWVXaXRoaW5EYXkodCkge1xuXHRcdHJldHVybiBtb2QodCwgbXNQZXJEYXkpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuM1xuXHREYXlGcm9tWWVhcjogZnVuY3Rpb24gRGF5RnJvbVllYXIoeSkge1xuXHRcdHJldHVybiAoMzY1ICogKHkgLSAxOTcwKSkgKyAkZmxvb3IoKHkgLSAxOTY5KSAvIDQpIC0gJGZsb29yKCh5IC0gMTkwMSkgLyAxMDApICsgJGZsb29yKCh5IC0gMTYwMSkgLyA0MDApO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuM1xuXHRUaW1lRnJvbVllYXI6IGZ1bmN0aW9uIFRpbWVGcm9tWWVhcih5KSB7XG5cdFx0cmV0dXJuIG1zUGVyRGF5ICogdGhpcy5EYXlGcm9tWWVhcih5KTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjNcblx0WWVhckZyb21UaW1lOiBmdW5jdGlvbiBZZWFyRnJvbVRpbWUodCkge1xuXHRcdC8vIGxhcmdlc3QgeSBzdWNoIHRoYXQgdGhpcy5UaW1lRnJvbVllYXIoeSkgPD0gdFxuXHRcdHJldHVybiAkZ2V0VVRDRnVsbFllYXIobmV3ICREYXRlKHQpKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjZcblx0V2Vla0RheTogZnVuY3Rpb24gV2Vla0RheSh0KSB7XG5cdFx0cmV0dXJuIG1vZCh0aGlzLkRheSh0KSArIDQsIDcpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuM1xuXHREYXlzSW5ZZWFyOiBmdW5jdGlvbiBEYXlzSW5ZZWFyKHkpIHtcblx0XHRpZiAobW9kKHksIDQpICE9PSAwKSB7XG5cdFx0XHRyZXR1cm4gMzY1O1xuXHRcdH1cblx0XHRpZiAobW9kKHksIDEwMCkgIT09IDApIHtcblx0XHRcdHJldHVybiAzNjY7XG5cdFx0fVxuXHRcdGlmIChtb2QoeSwgNDAwKSAhPT0gMCkge1xuXHRcdFx0cmV0dXJuIDM2NTtcblx0XHR9XG5cdFx0cmV0dXJuIDM2Njtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjNcblx0SW5MZWFwWWVhcjogZnVuY3Rpb24gSW5MZWFwWWVhcih0KSB7XG5cdFx0dmFyIGRheXMgPSB0aGlzLkRheXNJblllYXIodGhpcy5ZZWFyRnJvbVRpbWUodCkpO1xuXHRcdGlmIChkYXlzID09PSAzNjUpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAoZGF5cyA9PT0gMzY2KSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRFdmFsRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHRoZXJlIGFyZSBub3QgMzY1IG9yIDM2NiBkYXlzIGluIGEgeWVhciwgZ290OiAnICsgZGF5cyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjkuMS40XG5cdERheVdpdGhpblllYXI6IGZ1bmN0aW9uIERheVdpdGhpblllYXIodCkge1xuXHRcdHJldHVybiB0aGlzLkRheSh0KSAtIHRoaXMuRGF5RnJvbVllYXIodGhpcy5ZZWFyRnJvbVRpbWUodCkpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuNFxuXHRNb250aEZyb21UaW1lOiBmdW5jdGlvbiBNb250aEZyb21UaW1lKHQpIHtcblx0XHR2YXIgZGF5ID0gdGhpcy5EYXlXaXRoaW5ZZWFyKHQpO1xuXHRcdGlmICgwIDw9IGRheSAmJiBkYXkgPCAzMSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdHZhciBsZWFwID0gdGhpcy5JbkxlYXBZZWFyKHQpO1xuXHRcdGlmICgzMSA8PSBkYXkgJiYgZGF5IDwgKDU5ICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoKDU5ICsgbGVhcCkgPD0gZGF5ICYmIGRheSA8ICg5MCArIGxlYXApKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdFx0aWYgKCg5MCArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMTIwICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblx0XHRpZiAoKDEyMCArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMTUxICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA0O1xuXHRcdH1cblx0XHRpZiAoKDE1MSArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMTgxICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA1O1xuXHRcdH1cblx0XHRpZiAoKDE4MSArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMjEyICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA2O1xuXHRcdH1cblx0XHRpZiAoKDIxMiArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMjQzICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA3O1xuXHRcdH1cblx0XHRpZiAoKDI0MyArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMjczICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA4O1xuXHRcdH1cblx0XHRpZiAoKDI3MyArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMzA0ICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiA5O1xuXHRcdH1cblx0XHRpZiAoKDMwNCArIGxlYXApIDw9IGRheSAmJiBkYXkgPCAoMzM0ICsgbGVhcCkpIHtcblx0XHRcdHJldHVybiAxMDtcblx0XHR9XG5cdFx0aWYgKCgzMzQgKyBsZWFwKSA8PSBkYXkgJiYgZGF5IDwgKDM2NSArIGxlYXApKSB7XG5cdFx0XHRyZXR1cm4gMTE7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuNVxuXHREYXRlRnJvbVRpbWU6IGZ1bmN0aW9uIERhdGVGcm9tVGltZSh0KSB7XG5cdFx0dmFyIG0gPSB0aGlzLk1vbnRoRnJvbVRpbWUodCk7XG5cdFx0dmFyIGQgPSB0aGlzLkRheVdpdGhpblllYXIodCk7XG5cdFx0aWYgKG0gPT09IDApIHtcblx0XHRcdHJldHVybiBkICsgMTtcblx0XHR9XG5cdFx0aWYgKG0gPT09IDEpIHtcblx0XHRcdHJldHVybiBkIC0gMzA7XG5cdFx0fVxuXHRcdHZhciBsZWFwID0gdGhpcy5JbkxlYXBZZWFyKHQpO1xuXHRcdGlmIChtID09PSAyKSB7XG5cdFx0XHRyZXR1cm4gZCAtIDU4IC0gbGVhcDtcblx0XHR9XG5cdFx0aWYgKG0gPT09IDMpIHtcblx0XHRcdHJldHVybiBkIC0gODkgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gNCkge1xuXHRcdFx0cmV0dXJuIGQgLSAxMTkgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gNSkge1xuXHRcdFx0cmV0dXJuIGQgLSAxNTAgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gNikge1xuXHRcdFx0cmV0dXJuIGQgLSAxODAgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gNykge1xuXHRcdFx0cmV0dXJuIGQgLSAyMTEgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gOCkge1xuXHRcdFx0cmV0dXJuIGQgLSAyNDIgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gOSkge1xuXHRcdFx0cmV0dXJuIGQgLSAyNzIgLSBsZWFwO1xuXHRcdH1cblx0XHRpZiAobSA9PT0gMTApIHtcblx0XHRcdHJldHVybiBkIC0gMzAzIC0gbGVhcDtcblx0XHR9XG5cdFx0aWYgKG0gPT09IDExKSB7XG5cdFx0XHRyZXR1cm4gZCAtIDMzMyAtIGxlYXA7XG5cdFx0fVxuXHRcdHRocm93IG5ldyAkRXZhbEVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBNb250aEZyb21UaW1lIHJldHVybmVkIGFuIGltcG9zc2libGUgdmFsdWU6ICcgKyBtKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjEyXG5cdE1ha2VEYXk6IGZ1bmN0aW9uIE1ha2VEYXkoeWVhciwgbW9udGgsIGRhdGUpIHtcblx0XHRpZiAoISRpc0Zpbml0ZSh5ZWFyKSB8fCAhJGlzRmluaXRlKG1vbnRoKSB8fCAhJGlzRmluaXRlKGRhdGUpKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblx0XHR2YXIgeSA9IHRoaXMuVG9JbnRlZ2VyKHllYXIpO1xuXHRcdHZhciBtID0gdGhpcy5Ub0ludGVnZXIobW9udGgpO1xuXHRcdHZhciBkdCA9IHRoaXMuVG9JbnRlZ2VyKGRhdGUpO1xuXHRcdHZhciB5bSA9IHkgKyAkZmxvb3IobSAvIDEyKTtcblx0XHR2YXIgbW4gPSBtb2QobSwgMTIpO1xuXHRcdHZhciB0ID0gJERhdGVVVEMoeW0sIG1uLCAxKTtcblx0XHRpZiAodGhpcy5ZZWFyRnJvbVRpbWUodCkgIT09IHltIHx8IHRoaXMuTW9udGhGcm9tVGltZSh0KSAhPT0gbW4gfHwgdGhpcy5EYXRlRnJvbVRpbWUodCkgIT09IDEpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLkRheSh0KSArIGR0IC0gMTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjEzXG5cdE1ha2VEYXRlOiBmdW5jdGlvbiBNYWtlRGF0ZShkYXksIHRpbWUpIHtcblx0XHRpZiAoISRpc0Zpbml0ZShkYXkpIHx8ICEkaXNGaW5pdGUodGltZSkpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdHJldHVybiAoZGF5ICogbXNQZXJEYXkpICsgdGltZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjExXG5cdE1ha2VUaW1lOiBmdW5jdGlvbiBNYWtlVGltZShob3VyLCBtaW4sIHNlYywgbXMpIHtcblx0XHRpZiAoISRpc0Zpbml0ZShob3VyKSB8fCAhJGlzRmluaXRlKG1pbikgfHwgISRpc0Zpbml0ZShzZWMpIHx8ICEkaXNGaW5pdGUobXMpKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblx0XHR2YXIgaCA9IHRoaXMuVG9JbnRlZ2VyKGhvdXIpO1xuXHRcdHZhciBtID0gdGhpcy5Ub0ludGVnZXIobWluKTtcblx0XHR2YXIgcyA9IHRoaXMuVG9JbnRlZ2VyKHNlYyk7XG5cdFx0dmFyIG1pbGxpID0gdGhpcy5Ub0ludGVnZXIobXMpO1xuXHRcdHZhciB0ID0gKGggKiBtc1BlckhvdXIpICsgKG0gKiBtc1Blck1pbnV0ZSkgKyAocyAqIG1zUGVyU2Vjb25kKSArIG1pbGxpO1xuXHRcdHJldHVybiB0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMTRcblx0VGltZUNsaXA6IGZ1bmN0aW9uIFRpbWVDbGlwKHRpbWUpIHtcblx0XHRpZiAoISRpc0Zpbml0ZSh0aW1lKSB8fCAkYWJzKHRpbWUpID4gOC42NGUxNSkge1xuXHRcdFx0cmV0dXJuIE5hTjtcblx0XHR9XG5cdFx0cmV0dXJuICROdW1iZXIobmV3ICREYXRlKHRoaXMuVG9OdW1iZXIodGltZSkpKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtNS4yXG5cdG1vZHVsbzogZnVuY3Rpb24gbW9kdWxvKHgsIHkpIHtcblx0XHRyZXR1cm4gbW9kKHgsIHkpO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVTNTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkU3ludGF4RXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVTeW50YXhFcnJvciUnKTtcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xuXG52YXIgcHJlZGljYXRlcyA9IHtcblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnR5LWRlc2NyaXB0b3Itc3BlY2lmaWNhdGlvbi10eXBlXG5cdCdQcm9wZXJ0eSBEZXNjcmlwdG9yJzogZnVuY3Rpb24gaXNQcm9wZXJ0eURlc2NyaXB0b3IoRVMsIERlc2MpIHtcblx0XHRpZiAoRVMuVHlwZShEZXNjKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dmFyIGFsbG93ZWQgPSB7XG5cdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IHRydWUsXG5cdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiB0cnVlLFxuXHRcdFx0J1tbR2V0XV0nOiB0cnVlLFxuXHRcdFx0J1tbU2V0XV0nOiB0cnVlLFxuXHRcdFx0J1tbVmFsdWVdXSc6IHRydWUsXG5cdFx0XHQnW1tXcml0YWJsZV1dJzogdHJ1ZVxuXHRcdH07XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gRGVzYykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0XHRpZiAoaGFzKERlc2MsIGtleSkgJiYgIWFsbG93ZWRba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGlzRGF0YSA9IGhhcyhEZXNjLCAnW1tWYWx1ZV1dJyk7XG5cdFx0dmFyIElzQWNjZXNzb3IgPSBoYXMoRGVzYywgJ1tbR2V0XV0nKSB8fCBoYXMoRGVzYywgJ1tbU2V0XV0nKTtcblx0XHRpZiAoaXNEYXRhICYmIElzQWNjZXNzb3IpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdQcm9wZXJ0eSBEZXNjcmlwdG9ycyBtYXkgbm90IGJlIGJvdGggYWNjZXNzb3IgYW5kIGRhdGEgZGVzY3JpcHRvcnMnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXNzZXJ0UmVjb3JkKEVTLCByZWNvcmRUeXBlLCBhcmd1bWVudE5hbWUsIHZhbHVlKSB7XG5cdHZhciBwcmVkaWNhdGUgPSBwcmVkaWNhdGVzW3JlY29yZFR5cGVdO1xuXHRpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Vua25vd24gcmVjb3JkIHR5cGU6ICcgKyByZWNvcmRUeXBlKTtcblx0fVxuXHRpZiAoIXByZWRpY2F0ZShFUywgdmFsdWUpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoYXJndW1lbnROYW1lICsgJyBtdXN0IGJlIGEgJyArIHJlY29yZFR5cGUpO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi4vR2V0SW50cmluc2ljJyk7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcblxudmFyICRhc3NpZ24gPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QlJykuYXNzaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuXHRpZiAoJGFzc2lnbikge1xuXHRcdHJldHVybiAkYXNzaWduKHRhcmdldCwgc291cmNlKTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuXHRmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG5cdFx0aWYgKGhhcyhzb3VyY2UsIGtleSkpIHtcblx0XHRcdHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xuXG52YXIgJEZ1bmN0aW9uID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24lJyk7XG52YXIgJGFwcGx5ID0gJEZ1bmN0aW9uLmFwcGx5O1xudmFyICRjYWxsID0gJEZ1bmN0aW9uLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmQoKSB7XG5cdHJldHVybiBiaW5kLmFwcGx5KCRjYWxsLCBhcmd1bWVudHMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiBiaW5kLmFwcGx5KCRhcHBseSwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnLi9jYWxsQmluZCcpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSkge1xuXHRcdHJldHVybiBjYWxsQmluZChpbnRyaW5zaWMpO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmICghcHJlZGljYXRlKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRjYWxsYmFjayhhcnJheVtpXSwgaSwgYXJyYXkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbGxiYWNrLXJldHVyblxuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0SW5mZXJyZWROYW1lO1xudHJ5IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG5cdGdldEluZmVycmVkTmFtZSA9IEZ1bmN0aW9uKCdzJywgJ3JldHVybiB7IFtzXSgpIHt9IH1bc10ubmFtZTsnKTtcbn0gY2F0Y2ggKGUpIHt9XG5cbnZhciBpbmZlcnJlZCA9IGZ1bmN0aW9uICgpIHt9O1xubW9kdWxlLmV4cG9ydHMgPSBnZXRJbmZlcnJlZE5hbWUgJiYgaW5mZXJyZWQubmFtZSA9PT0gJ2luZmVycmVkJyA/IGdldEluZmVycmVkTmFtZSA6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJy4vY2FsbEJvdW5kJyk7XG5cbnZhciAkaXRlcmF0b3IgPSBHZXRJbnRyaW5zaWMoJyVTeW1ib2wuaXRlcmF0b3IlJywgdHJ1ZSk7XG52YXIgJGFycmF5U2xpY2UgPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5zbGljZScpO1xudmFyICRhcnJheUpvaW4gPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5qb2luJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0SXRlcmF0b3JNZXRob2QoRVMsIGl0ZXJhYmxlKSB7XG5cdHZhciB1c2luZ0l0ZXJhdG9yO1xuXHRpZiAoaGFzU3ltYm9scykge1xuXHRcdHVzaW5nSXRlcmF0b3IgPSBFUy5HZXRNZXRob2QoaXRlcmFibGUsICRpdGVyYXRvcik7XG5cdH0gZWxzZSBpZiAoRVMuSXNBcnJheShpdGVyYWJsZSkpIHtcblx0XHR1c2luZ0l0ZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGkgPSAtMTtcblx0XHRcdHZhciBhcnIgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWludmFsaWQtdGhpc1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bmV4dDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGkgKz0gMTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZG9uZTogaSA+PSBhcnIubGVuZ3RoLFxuXHRcdFx0XHRcdFx0dmFsdWU6IGFycltpXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0fSBlbHNlIGlmIChFUy5UeXBlKGl0ZXJhYmxlKSA9PT0gJ1N0cmluZycpIHtcblx0XHR1c2luZ0l0ZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bmV4dDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBuZXh0SW5kZXggPSBFUy5BZHZhbmNlU3RyaW5nSW5kZXgoaXRlcmFibGUsIGksIHRydWUpO1xuXHRcdFx0XHRcdHZhciB2YWx1ZSA9ICRhcnJheUpvaW4oJGFycmF5U2xpY2UoaXRlcmFibGUsIGksIG5leHRJbmRleCksICcnKTtcblx0XHRcdFx0XHRpID0gbmV4dEluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBuZXh0SW5kZXggPiBpdGVyYWJsZS5sZW5ndGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVzaW5nSXRlcmF0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi4vR2V0SW50cmluc2ljJyk7XG5cbnZhciBvcmlnaW5hbEdldFByb3RvID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldFByb3RvdHlwZU9mJScsIHRydWUpO1xudmFyICRBcnJheVByb3RvID0gR2V0SW50cmluc2ljKCclQXJyYXkucHJvdG90eXBlJScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9yaWdpbmFsR2V0UHJvdG8gfHwgKFxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG9cblx0W10uX19wcm90b19fID09PSAkQXJyYXlQcm90b1xuXHRcdD8gZnVuY3Rpb24gKE8pIHtcblx0XHRcdHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXHRcdH1cblx0XHQ6IG51bGxcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJy4vY2FsbEJvdW5kJyk7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVTeW50YXhFcnJvciUnKTtcbnZhciBzeW1Ub1N0ciA9IGNhbGxCb3VuZCgnU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZycsIHRydWUpO1xuXG52YXIgZ2V0SW5mZXJyZWROYW1lID0gcmVxdWlyZSgnLi9nZXRJbmZlcnJlZE5hbWUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRTeW1ib2xEZXNjcmlwdGlvbihzeW1ib2wpIHtcblx0aWYgKCFzeW1Ub1N0cikge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ1N5bWJvbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuXHR9XG5cdHZhciBzdHIgPSBzeW1Ub1N0cihzeW1ib2wpOyAvLyB3aWxsIHRocm93IGlmIG5vdCBhIHN5bWJvbFxuXG5cdGlmIChnZXRJbmZlcnJlZE5hbWUpIHtcblx0XHR2YXIgbmFtZSA9IGdldEluZmVycmVkTmFtZShzeW1ib2wpO1xuXHRcdGlmIChuYW1lID09PSAnJykgeyByZXR1cm47IH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRyZXR1cm4gbmFtZS5zbGljZSgxLCAtMSk7IC8vIG5hbWUuc2xpY2UoJ1snLmxlbmd0aCwgLSddJy5sZW5ndGgpO1xuXHR9XG5cblx0dmFyIGRlc2MgPSBzdHIuc2xpY2UoNywgLTEpOyAvLyBzdHIuc2xpY2UoJ1N5bWJvbCgnLmxlbmd0aCwgLScpJy5sZW5ndGgpO1xuXHRpZiAoZGVzYykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRcdHJldHVybiBkZXNjO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICE9PSBhOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmICEkaXNOYU4oeCkgJiYgeCAhPT0gSW5maW5pdHkgJiYgeCAhPT0gLUluZmluaXR5OyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc05hTihhKSB7XG5cdHJldHVybiBhICE9PSBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRzdHJTbGljZSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvY2FsbEJvdW5kJykoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1ByZWZpeE9mKHByZWZpeCwgc3RyaW5nKSB7XG5cdGlmIChwcmVmaXggPT09IHN0cmluZykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmIChwcmVmaXgubGVuZ3RoID4gc3RyaW5nLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gJHN0clNsaWNlKHN0cmluZywgMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi4vR2V0SW50cmluc2ljJyk7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIElzUHJvcGVydHlEZXNjcmlwdG9yKEVTLCBEZXNjKSB7XG5cdGlmIChFUy5UeXBlKERlc2MpICE9PSAnT2JqZWN0Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR2YXIgYWxsb3dlZCA9IHtcblx0XHQnW1tDb25maWd1cmFibGVdXSc6IHRydWUsXG5cdFx0J1tbRW51bWVyYWJsZV1dJzogdHJ1ZSxcblx0XHQnW1tHZXRdXSc6IHRydWUsXG5cdFx0J1tbU2V0XV0nOiB0cnVlLFxuXHRcdCdbW1ZhbHVlXV0nOiB0cnVlLFxuXHRcdCdbW1dyaXRhYmxlXV0nOiB0cnVlXG5cdH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gRGVzYykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0aWYgKGhhcyhEZXNjLCBrZXkpICYmICFhbGxvd2VkW2tleV0pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoRVMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSAmJiBFUy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdQcm9wZXJ0eSBEZXNjcmlwdG9ycyBtYXkgbm90IGJlIGJvdGggYWNjZXNzb3IgYW5kIGRhdGEgZGVzY3JpcHRvcnMnKTtcblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBldmVyeSA9IHJlcXVpcmUoJy4vZXZlcnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1NhbWVQcm9wZXJ0eURlc2NyaXB0b3IoRVMsIEQxLCBEMikge1xuXHR2YXIgZmllbGRzID0gW1xuXHRcdCdbW0NvbmZpZ3VyYWJsZV1dJyxcblx0XHQnW1tFbnVtZXJhYmxlXV0nLFxuXHRcdCdbW0dldF1dJyxcblx0XHQnW1tTZXRdXScsXG5cdFx0J1tbVmFsdWVdXScsXG5cdFx0J1tbV3JpdGFibGVdXSdcblx0XTtcblx0cmV0dXJuIGV2ZXJ5KGZpZWxkcywgZnVuY3Rpb24gKGZpZWxkKSB7XG5cdFx0aWYgKChmaWVsZCBpbiBEMSkgIT09IChmaWVsZCBpbiBEMikpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIEVTLlNhbWVWYWx1ZShEMVtmaWVsZF0sIEQyW2ZpZWxkXSk7XG5cdH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xuXG52YXIgJE1hdGggPSBHZXRJbnRyaW5zaWMoJyVNYXRoJScpO1xudmFyICROdW1iZXIgPSBHZXRJbnRyaW5zaWMoJyVOdW1iZXIlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gJE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8ICRNYXRoLnBvdygyLCA1MykgLSAxO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1vZChudW1iZXIsIG1vZHVsbykge1xuXHR2YXIgcmVtYWluID0gbnVtYmVyICUgbW9kdWxvO1xuXHRyZXR1cm4gTWF0aC5mbG9vcihyZW1haW4gPj0gMCA/IHJlbWFpbiA6IHJlbWFpbiArIG1vZHVsbyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnLi4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkdGVzdCA9IEdldEludHJpbnNpYygnUmVnRXhwLnByb3RvdHlwZS50ZXN0Jyk7XG5cbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJy4vY2FsbEJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZWdleFRlc3RlcihyZWdleCkge1xuXHRyZXR1cm4gY2FsbEJpbmQoJHRlc3QsIHJlZ2V4KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyIG9yaWdpbmFsU2V0UHJvdG8gPSBHZXRJbnRyaW5zaWMoJyVPYmplY3Quc2V0UHJvdG90eXBlT2YlJywgdHJ1ZSk7XG52YXIgJEFycmF5UHJvdG8gPSBHZXRJbnRyaW5zaWMoJyVBcnJheS5wcm90b3R5cGUlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JpZ2luYWxTZXRQcm90byB8fCAoXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90bywgbm8tbmVnYXRlZC1jb25kaXRpb25cblx0W10uX19wcm90b19fICE9PSAkQXJyYXlQcm90b1xuXHRcdD8gbnVsbFxuXHRcdDogZnVuY3Rpb24gKE8sIHByb3RvKSB7XG5cdFx0XHRPLl9fcHJvdG9fXyA9IHByb3RvOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cdFx0XHRyZXR1cm4gTztcblx0XHR9XG4pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNpZ24obnVtYmVyKSB7XG5cdHJldHVybiBudW1iZXIgPj0gMCA/IDEgOiAtMTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJ2lzLXN5bWJvbCcpO1xuXG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuXHRpZiAodHlwZW9mIE8gPT09ICd1bmRlZmluZWQnIHx8IE8gPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIE8pO1xuXHR9XG5cdGlmICh0eXBlb2YgaGludCAhPT0gJ3N0cmluZycgfHwgKGhpbnQgIT09ICdudW1iZXInICYmIGhpbnQgIT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2hpbnQgbXVzdCBiZSBcInN0cmluZ1wiIG9yIFwibnVtYmVyXCInKTtcblx0fVxuXHR2YXIgbWV0aG9kTmFtZXMgPSBoaW50ID09PSAnc3RyaW5nJyA/IFsndG9TdHJpbmcnLCAndmFsdWVPZiddIDogWyd2YWx1ZU9mJywgJ3RvU3RyaW5nJ107XG5cdHZhciBtZXRob2QsIHJlc3VsdCwgaTtcblx0Zm9yIChpID0gMDsgaSA8IG1ldGhvZE5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0bWV0aG9kID0gT1ttZXRob2ROYW1lc1tpXV07XG5cdFx0aWYgKGlzQ2FsbGFibGUobWV0aG9kKSkge1xuXHRcdFx0cmVzdWx0ID0gbWV0aG9kLmNhbGwoTyk7XG5cdFx0XHRpZiAoaXNQcmltaXRpdmUocmVzdWx0KSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG59O1xuXG52YXIgR2V0TWV0aG9kID0gZnVuY3Rpb24gR2V0TWV0aG9kKE8sIFApIHtcblx0dmFyIGZ1bmMgPSBPW1BdO1xuXHRpZiAoZnVuYyAhPT0gbnVsbCAmJiB0eXBlb2YgZnVuYyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZiAoIWlzQ2FsbGFibGUoZnVuYykpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoZnVuYyArICcgcmV0dXJuZWQgZm9yIHByb3BlcnR5ICcgKyBQICsgJyBvZiBvYmplY3QgJyArIE8gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXHRcdHJldHVybiBmdW5jO1xuXHR9XG5cdHJldHVybiB2b2lkIDA7XG59O1xuXG4vLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQpIHtcblx0aWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXHR2YXIgaGludCA9ICdkZWZhdWx0Jztcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGFyZ3VtZW50c1sxXSA9PT0gU3RyaW5nKSB7XG5cdFx0XHRoaW50ID0gJ3N0cmluZyc7XG5cdFx0fSBlbHNlIGlmIChhcmd1bWVudHNbMV0gPT09IE51bWJlcikge1xuXHRcdFx0aGludCA9ICdudW1iZXInO1xuXHRcdH1cblx0fVxuXG5cdHZhciBleG90aWNUb1ByaW07XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0aWYgKFN5bWJvbC50b1ByaW1pdGl2ZSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gR2V0TWV0aG9kKGlucHV0LCBTeW1ib2wudG9QcmltaXRpdmUpO1xuXHRcdH0gZWxzZSBpZiAoaXNTeW1ib2woaW5wdXQpKSB7XG5cdFx0XHRleG90aWNUb1ByaW0gPSBTeW1ib2wucHJvdG90eXBlLnZhbHVlT2Y7XG5cdFx0fVxuXHR9XG5cdGlmICh0eXBlb2YgZXhvdGljVG9QcmltICE9PSAndW5kZWZpbmVkJykge1xuXHRcdHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG5cdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuYWJsZSB0byBjb252ZXJ0IGV4b3RpYyBvYmplY3QgdG8gcHJpbWl0aXZlJyk7XG5cdH1cblx0aWYgKGhpbnQgPT09ICdkZWZhdWx0JyAmJiAoaXNEYXRlKGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpKSB7XG5cdFx0aGludCA9ICdzdHJpbmcnO1xuXHR9XG5cdHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBoaW50ID09PSAnZGVmYXVsdCcgPyAnbnVtYmVyJyA6IGhpbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG5cbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnaXMtY2FsbGFibGUnKTtcblxuLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMi44XG52YXIgRVM1aW50ZXJuYWxTbG90cyA9IHtcblx0J1tbRGVmYXVsdFZhbHVlXV0nOiBmdW5jdGlvbiAoTykge1xuXHRcdHZhciBhY3R1YWxIaW50O1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YWN0dWFsSGludCA9IGFyZ3VtZW50c1sxXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWN0dWFsSGludCA9IHRvU3RyLmNhbGwoTykgPT09ICdbb2JqZWN0IERhdGVdJyA/IFN0cmluZyA6IE51bWJlcjtcblx0XHR9XG5cblx0XHRpZiAoYWN0dWFsSGludCA9PT0gU3RyaW5nIHx8IGFjdHVhbEhpbnQgPT09IE51bWJlcikge1xuXHRcdFx0dmFyIG1ldGhvZHMgPSBhY3R1YWxIaW50ID09PSBTdHJpbmcgPyBbJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXSA6IFsndmFsdWVPZicsICd0b1N0cmluZyddO1xuXHRcdFx0dmFyIHZhbHVlLCBpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0aWYgKGlzQ2FsbGFibGUoT1ttZXRob2RzW2ldXSkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IE9bbWV0aG9kc1tpXV0oKTtcblx0XHRcdFx0XHRpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgW1tEZWZhdWx0VmFsdWVdXSBoaW50IHN1cHBsaWVkJyk7XG5cdH1cbn07XG5cbi8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTkuMVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCkge1xuXHRpZiAoaXNQcmltaXRpdmUoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdHJldHVybiBFUzVpbnRlcm5hbFNsb3RzWydbW0RlZmF1bHRWYWx1ZV1dJ10oaW5wdXQsIGFyZ3VtZW50c1sxXSk7XG5cdH1cblx0cmV0dXJuIEVTNWludGVybmFsU2xvdHNbJ1tbRGVmYXVsdFZhbHVlXV0nXShpbnB1dCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZXMyMDE1Jyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpO1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgMjAxNyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbi8vIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCBcXFxcXG4vLyDilIIgRXZlIDAuNS40IC0gSmF2YVNjcmlwdCBFdmVudHMgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICDilIIgXFxcXFxuLy8g4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkIFxcXFxcbi8vIOKUgiBBdXRob3IgRG1pdHJ5IEJhcmFub3Zza2l5IChodHRwOi8vZG1pdHJ5LmJhcmFub3Zza2l5LmNvbS8pIOKUgiBcXFxcXG4vLyDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggXFxcXFxuXG4oZnVuY3Rpb24gKGdsb2IpIHtcbiAgICB2YXIgdmVyc2lvbiA9IFwiMC41LjRcIixcbiAgICAgICAgaGFzID0gXCJoYXNPd25Qcm9wZXJ0eVwiLFxuICAgICAgICBzZXBhcmF0b3IgPSAvW1xcLlxcL10vLFxuICAgICAgICBjb21hc2VwYXJhdG9yID0gL1xccyosXFxzKi8sXG4gICAgICAgIHdpbGRjYXJkID0gXCIqXCIsXG4gICAgICAgIG51bXNvcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50X2V2ZW50LFxuICAgICAgICBzdG9wLFxuICAgICAgICBldmVudHMgPSB7bjoge319LFxuICAgICAgICBmaXJzdERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxhc3REZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgtLWkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ianRvcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICAgIFN0ciA9IFN0cmluZyxcbiAgICAgICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXIgaW5zdGFuY2VvZiBBcnJheSB8fCBvYmp0b3MuY2FsbChhcikgPT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9LFxuICAgIC8qXFxcbiAgICAgKiBldmVcbiAgICAgWyBtZXRob2QgXVxuXG4gICAgICogRmlyZXMgZXZlbnQgd2l0aCBnaXZlbiBgbmFtZWAsIGdpdmVuIHNjb3BlIGFuZCBvdGhlciBwYXJhbWV0ZXJzLlxuXG4gICAgIC0gbmFtZSAoc3RyaW5nKSBuYW1lIG9mIHRoZSAqZXZlbnQqLCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkXG4gICAgIC0gc2NvcGUgKG9iamVjdCkgY29udGV4dCBmb3IgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgIC0gdmFyYXJncyAoLi4uKSB0aGUgcmVzdCBvZiBhcmd1bWVudHMgd2lsbCBiZSBzZW50IHRvIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgPSAob2JqZWN0KSBhcnJheSBvZiByZXR1cm5lZCB2YWx1ZXMgZnJvbSB0aGUgbGlzdGVuZXJzLiBBcnJheSBoYXMgdHdvIG1ldGhvZHMgYC5maXJzdERlZmluZWQoKWAgYW5kIGAubGFzdERlZmluZWQoKWAgdG8gZ2V0IGZpcnN0IG9yIGxhc3Qgbm90IGB1bmRlZmluZWRgIHZhbHVlLlxuICAgIFxcKi9cbiAgICAgICAgZXZlID0gZnVuY3Rpb24gKG5hbWUsIHNjb3BlKSB7XG4gICAgICAgICAgICB2YXIgb2xkc3RvcCA9IHN0b3AsXG4gICAgICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzID0gZXZlLmxpc3RlbmVycyhuYW1lKSxcbiAgICAgICAgICAgICAgICB6ID0gMCxcbiAgICAgICAgICAgICAgICBsLFxuICAgICAgICAgICAgICAgIGluZGV4ZWQgPSBbXSxcbiAgICAgICAgICAgICAgICBxdWV1ZSA9IHt9LFxuICAgICAgICAgICAgICAgIG91dCA9IFtdLFxuICAgICAgICAgICAgICAgIGNlID0gY3VycmVudF9ldmVudDtcbiAgICAgICAgICAgIG91dC5maXJzdERlZmluZWQgPSBmaXJzdERlZmluZWQ7XG4gICAgICAgICAgICBvdXQubGFzdERlZmluZWQgPSBsYXN0RGVmaW5lZDtcbiAgICAgICAgICAgIGN1cnJlbnRfZXZlbnQgPSBuYW1lO1xuICAgICAgICAgICAgc3RvcCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgaWYgKFwiekluZGV4XCIgaW4gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhlZC5wdXNoKGxpc3RlbmVyc1tpXS56SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0uekluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZVtsaXN0ZW5lcnNbaV0uekluZGV4XSA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleGVkLnNvcnQobnVtc29ydCk7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXhlZFt6XSA8IDApIHtcbiAgICAgICAgICAgICAgICBsID0gcXVldWVbaW5kZXhlZFt6KytdXTtcbiAgICAgICAgICAgICAgICBvdXQucHVzaChsLmFwcGx5KHNjb3BlLCBhcmdzKSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcCA9IG9sZHN0b3A7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChcInpJbmRleFwiIGluIGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGwuekluZGV4ID09IGluZGV4ZWRbel0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGwuYXBwbHkoc2NvcGUsIGFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBxdWV1ZVtpbmRleGVkW3pdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICYmIG91dC5wdXNoKGwuYXBwbHkoc2NvcGUsIGFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVbbC56SW5kZXhdID0gbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGwuYXBwbHkoc2NvcGUsIGFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcCA9IG9sZHN0b3A7XG4gICAgICAgICAgICBjdXJyZW50X2V2ZW50ID0gY2U7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgIC8vIFVuZG9jdW1lbnRlZC4gRGVidWcgb25seS5cbiAgICBldmUuX2V2ZW50cyA9IGV2ZW50cztcbiAgICAvKlxcXG4gICAgICogZXZlLmxpc3RlbmVyc1xuICAgICBbIG1ldGhvZCBdXG5cbiAgICAgKiBJbnRlcm5hbCBtZXRob2Qgd2hpY2ggZ2l2ZXMgeW91IGFycmF5IG9mIGFsbCBldmVudCBoYW5kbGVycyB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG5cbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkXG5cbiAgICAgPSAoYXJyYXkpIGFycmF5IG9mIGV2ZW50IGhhbmRsZXJzXG4gICAgXFwqL1xuICAgIGV2ZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IG5hbWUuc3BsaXQoc2VwYXJhdG9yKSxcbiAgICAgICAgICAgIGUgPSBldmVudHMsXG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIGpqLFxuICAgICAgICAgICAgbmVzLFxuICAgICAgICAgICAgZXMgPSBbZV0sXG4gICAgICAgICAgICBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBuZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gZXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIGUgPSBlc1tqXS5uO1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gW2VbbmFtZXNbaV1dLCBlW3dpbGRjYXJkXV07XG4gICAgICAgICAgICAgICAgayA9IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGstLSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbXNba107XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQoaXRlbS5mIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVzID0gbmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogZXZlLnNlcGFyYXRvclxuICAgICBbIG1ldGhvZCBdXG5cbiAgICAgKiBJZiBmb3Igc29tZSByZWFzb25zIHlvdSBkb27igJl0IGxpa2UgZGVmYXVsdCBzZXBhcmF0b3JzIChgLmAgb3IgYC9gKSB5b3UgY2FuIHNwZWNpZnkgeW91cnNcbiAgICAgKiBoZXJlLiBCZSBhd2FyZSB0aGF0IGlmIHlvdSBwYXNzIGEgc3RyaW5nIGxvbmdlciB0aGFuIG9uZSBjaGFyYWN0ZXIgaXQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgICogYSBsaXN0IG9mIGNoYXJhY3RlcnMuXG5cbiAgICAgLSBzZXBhcmF0b3IgKHN0cmluZykgbmV3IHNlcGFyYXRvci4gRW1wdHkgc3RyaW5nIHJlc2V0cyB0byBkZWZhdWx0OiBgLmAgb3IgYC9gLlxuICAgIFxcKi9cbiAgICBldmUuc2VwYXJhdG9yID0gZnVuY3Rpb24gKHNlcCkge1xuICAgICAgICBpZiAoc2VwKSB7XG4gICAgICAgICAgICBzZXAgPSBTdHIoc2VwKS5yZXBsYWNlKC8oPz1bXFwuXFxeXFxdXFxbXFwtXSkvZywgXCJcXFxcXCIpO1xuICAgICAgICAgICAgc2VwID0gXCJbXCIgKyBzZXAgKyBcIl1cIjtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IG5ldyBSZWdFeHAoc2VwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IC9bXFwuXFwvXS87XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBldmUub25cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEJpbmRzIGdpdmVuIGV2ZW50IGhhbmRsZXIgd2l0aCBhIGdpdmVuIG5hbWUuIFlvdSBjYW4gdXNlIHdpbGRjYXJkcyDigJxgKmDigJ0gZm9yIHRoZSBuYW1lczpcbiAgICAgfCBldmUub24oXCIqLnVuZGVyLipcIiwgZik7XG4gICAgIHwgZXZlKFwibW91c2UudW5kZXIuZmxvb3JcIik7IC8vIHRyaWdnZXJzIGZcbiAgICAgKiBVc2UgQGV2ZSB0byB0cmlnZ2VyIHRoZSBsaXN0ZW5lci5cbiAgICAgKipcbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkLCB3aXRoIG9wdGlvbmFsIHdpbGRjYXJkc1xuICAgICAtIGYgKGZ1bmN0aW9uKSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICoqXG4gICAgIC0gbmFtZSAoYXJyYXkpIGlmIHlvdSBkb27igJl0IHdhbnQgdG8gdXNlIHNlcGFyYXRvcnMsIHlvdSBjYW4gdXNlIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgLSBmIChmdW5jdGlvbikgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqKlxuICAgICA9IChmdW5jdGlvbikgcmV0dXJuZWQgZnVuY3Rpb24gYWNjZXB0cyBhIHNpbmdsZSBudW1lcmljIHBhcmFtZXRlciB0aGF0IHJlcHJlc2VudHMgei1pbmRleCBvZiB0aGUgaGFuZGxlci4gSXQgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBhbmQgb25seSB1c2VkIHdoZW4geW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgc29tZSBzdWJzZXQgb2YgaGFuZGxlcnMgd2lsbCBiZSBpbnZva2VkIGluIGEgZ2l2ZW4gb3JkZXIsIGRlc3BpdGUgb2YgdGhlIG9yZGVyIG9mIGFzc2lnbm1lbnQuXG4gICAgID4gRXhhbXBsZTpcbiAgICAgfCBldmUub24oXCJtb3VzZVwiLCBlYXRJdCkoMik7XG4gICAgIHwgZXZlLm9uKFwibW91c2VcIiwgc2NyZWFtKTtcbiAgICAgfCBldmUub24oXCJtb3VzZVwiLCBjYXRjaEl0KSgxKTtcbiAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgYGNhdGNoSXRgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBgZWF0SXRgLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gcHV0IHlvdXIgaGFuZGxlciBiZWZvcmUgbm9uLWluZGV4ZWQgaGFuZGxlcnMsIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZS5cbiAgICAgKiBOb3RlOiBJIGFzc3VtZSBtb3N0IG9mIHRoZSB0aW1lIHlvdSBkb27igJl0IG5lZWQgdG8gd29ycnkgYWJvdXQgei1pbmRleCwgYnV0IGl04oCZcyBuaWNlIHRvIGhhdmUgdGhpcyBmZWF0dXJlIOKAnGp1c3QgaW4gY2FzZeKAnS5cbiAgICBcXCovXG4gICAgZXZlLm9uID0gZnVuY3Rpb24gKG5hbWUsIGYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lcyA9IGlzQXJyYXkobmFtZSkgPyBpc0FycmF5KG5hbWVbMF0pID8gbmFtZSA6IFtuYW1lXSA6IFN0cihuYW1lKS5zcGxpdChjb21hc2VwYXJhdG9yKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVzID0gaXNBcnJheShuYW1lKSA/IG5hbWUgOiBTdHIobmFtZSkuc3BsaXQoc2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3Q7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBlID0gZS5uO1xuICAgICAgICAgICAgICAgICAgICBlID0gZS5oYXNPd25Qcm9wZXJ0eShuYW1lc1tpXSkgJiYgZVtuYW1lc1tpXV0gfHwgKGVbbmFtZXNbaV1dID0ge246IHt9fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUuZiA9IGUuZiB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGUuZi5sZW5ndGg7IGkgPCBpaTsgaSsrKSBpZiAoZS5mW2ldID09IGYpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIWV4aXN0ICYmIGUuZi5wdXNoKGYpO1xuICAgICAgICAgICAgfShuYW1lc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoekluZGV4KSB7XG4gICAgICAgICAgICBpZiAoK3pJbmRleCA9PSArekluZGV4KSB7XG4gICAgICAgICAgICAgICAgZi56SW5kZXggPSArekluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5mXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBmaXJlIGdpdmVuIGV2ZW50IHdpdGggb3B0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqIEFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZXN1bHQgZnVuY3Rpb24gd2lsbCBiZSBhbHNvXG4gICAgICogY29uY2F0ZWQgdG8gdGhlIGxpc3Qgb2YgZmluYWwgYXJndW1lbnRzLlxuICAgICB8IGVsLm9uY2xpY2sgPSBldmUuZihcImNsaWNrXCIsIDEsIDIpO1xuICAgICB8IGV2ZS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgIHwgICAgIGNvbnNvbGUubG9nKGEsIGIsIGMpOyAvLyAxLCAyLCBbZXZlbnQgb2JqZWN0XVxuICAgICB8IH0pO1xuICAgICAtIGV2ZW50IChzdHJpbmcpIGV2ZW50IG5hbWVcbiAgICAgLSB2YXJhcmdzICjigKYpIGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzXG4gICAgID0gKGZ1bmN0aW9uKSBwb3NzaWJsZSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgXFwqL1xuICAgIGV2ZS5mID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBhdHRycyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV2ZS5hcHBseShudWxsLCBbZXZlbnQsIG51bGxdLmNvbmNhdChhdHRycykuY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSkpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5zdG9wXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBJcyB1c2VkIGluc2lkZSBhbiBldmVudCBoYW5kbGVyIHRvIHN0b3AgdGhlIGV2ZW50LCBwcmV2ZW50aW5nIGFueSBzdWJzZXF1ZW50IGxpc3RlbmVycyBmcm9tIGZpcmluZy5cbiAgICBcXCovXG4gICAgZXZlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3AgPSAxO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5udFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQ291bGQgYmUgdXNlZCBpbnNpZGUgZXZlbnQgaGFuZGxlciB0byBmaWd1cmUgb3V0IGFjdHVhbCBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKipcbiAgICAgLSBzdWJuYW1lIChzdHJpbmcpICNvcHRpb25hbCBzdWJuYW1lIG9mIHRoZSBldmVudFxuICAgICAqKlxuICAgICA9IChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBpZiBgc3VibmFtZWAgaXMgbm90IHNwZWNpZmllZFxuICAgICAqIG9yXG4gICAgID0gKGJvb2xlYW4pIGB0cnVlYCwgaWYgY3VycmVudCBldmVudOKAmXMgbmFtZSBjb250YWlucyBgc3VibmFtZWBcbiAgICBcXCovXG4gICAgZXZlLm50ID0gZnVuY3Rpb24gKHN1Ym5hbWUpIHtcbiAgICAgICAgdmFyIGN1ciA9IGlzQXJyYXkoY3VycmVudF9ldmVudCkgPyBjdXJyZW50X2V2ZW50LmpvaW4oXCIuXCIpIDogY3VycmVudF9ldmVudDtcbiAgICAgICAgaWYgKHN1Ym5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86XFxcXC58XFxcXC98XilcIiArIHN1Ym5hbWUgKyBcIig/OlxcXFwufFxcXFwvfCQpXCIpLnRlc3QoY3VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5udHNcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENvdWxkIGJlIHVzZWQgaW5zaWRlIGV2ZW50IGhhbmRsZXIgdG8gZmlndXJlIG91dCBhY3R1YWwgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICoqXG4gICAgICoqXG4gICAgID0gKGFycmF5KSBuYW1lcyBvZiB0aGUgZXZlbnRcbiAgICBcXCovXG4gICAgZXZlLm50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudF9ldmVudCkgPyBjdXJyZW50X2V2ZW50IDogY3VycmVudF9ldmVudC5zcGxpdChzZXBhcmF0b3IpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5vZmZcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgZ2l2ZW4gZnVuY3Rpb24gZnJvbSB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgYXNzaWduZWQgdG8gZ2l2ZW4gbmFtZS5cbiAgICAgKiBJZiBubyBhcmd1bWVudHMgc3BlY2lmaWVkIGFsbCB0aGUgZXZlbnRzIHdpbGwgYmUgY2xlYXJlZC5cbiAgICAgKipcbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkLCB3aXRoIG9wdGlvbmFsIHdpbGRjYXJkc1xuICAgICAtIGYgKGZ1bmN0aW9uKSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBldmUudW5iaW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBTZWUgQGV2ZS5vZmZcbiAgICBcXCovXG4gICAgZXZlLm9mZiA9IGV2ZS51bmJpbmQgPSBmdW5jdGlvbiAobmFtZSwgZikge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIGV2ZS5fZXZlbnRzID0gZXZlbnRzID0ge246IHt9fTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gaXNBcnJheShuYW1lWzBdKSA/IG5hbWUgOiBbbmFtZV0gOiBTdHIobmFtZSkuc3BsaXQoY29tYXNlcGFyYXRvcik7XG4gICAgICAgIGlmIChuYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXZlLm9mZihuYW1lc1tpXSwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IFN0cihuYW1lKS5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHNwbGljZSxcbiAgICAgICAgICAgIGksIGlpLCBqLCBqaixcbiAgICAgICAgICAgIGN1ciA9IFtldmVudHNdLFxuICAgICAgICAgICAgaW5vZGVzID0gW107XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1ci5sZW5ndGg7IGogKz0gc3BsaWNlLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpY2UgPSBbaiwgMV07XG4gICAgICAgICAgICAgICAgZSA9IGN1cltqXS5uO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lc1tpXSAhPSB3aWxkY2FyZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZVtuYW1lc1tpXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZS5wdXNoKGVbbmFtZXNbaV1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlub2Rlcy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWVzW2ldXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGUpIGlmIChlW2hhc10oa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlLnB1c2goZVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlub2Rlcy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VyLnNwbGljZS5hcHBseShjdXIsIHNwbGljZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBjdXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgZSA9IGN1cltpXTtcbiAgICAgICAgICAgIHdoaWxlIChlLm4pIHtcbiAgICAgICAgICAgICAgICBpZiAoZikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGUuZi5sZW5ndGg7IGogPCBqajsgaisrKSBpZiAoZS5mW2pdID09IGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmYuc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgIWUuZi5sZW5ndGggJiYgZGVsZXRlIGUuZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBlLm4pIGlmIChlLm5baGFzXShrZXkpICYmIGUubltrZXldLmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jcyA9IGUubltrZXldLmY7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqaiA9IGZ1bmNzLmxlbmd0aDsgaiA8IGpqOyBqKyspIGlmIChmdW5jc1tqXSA9PSBmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Muc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmNzLmxlbmd0aCAmJiBkZWxldGUgZS5uW2tleV0uZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlLmY7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGUubikgaWYgKGUubltoYXNdKGtleSkgJiYgZS5uW2tleV0uZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUubltrZXldLmY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZSA9IGUubjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBwcnVuZSBpbm5lciBub2RlcyBpbiBwYXRoXG4gICAgICAgIHBydW5lOiBmb3IgKGkgPSAwLCBpaSA9IGlub2Rlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBlID0gaW5vZGVzW2ldO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gZS5uW2UubmFtZV0uZikge1xuICAgICAgICAgICAgICAgIC8vIG5vdCBlbXB0eSAoaGFzIGxpc3RlbmVycylcbiAgICAgICAgICAgICAgICBjb250aW51ZSBwcnVuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoa2V5IGluIGUubltlLm5hbWVdLm4pIHtcbiAgICAgICAgICAgICAgICAvLyBub3QgZW1wdHkgKGhhcyBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjb250aW51ZSBwcnVuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlzIGVtcHR5XG4gICAgICAgICAgICBkZWxldGUgZS5uW2UubmFtZV07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBldmUub25jZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQmluZHMgZ2l2ZW4gZXZlbnQgaGFuZGxlciB3aXRoIGEgZ2l2ZW4gbmFtZSB0byBvbmx5IHJ1biBvbmNlIHRoZW4gdW5iaW5kIGl0c2VsZi5cbiAgICAgfCBldmUub25jZShcImxvZ2luXCIsIGYpO1xuICAgICB8IGV2ZShcImxvZ2luXCIpOyAvLyB0cmlnZ2VycyBmXG4gICAgIHwgZXZlKFwibG9naW5cIik7IC8vIG5vIGxpc3RlbmVyc1xuICAgICAqIFVzZSBAZXZlIHRvIHRyaWdnZXIgdGhlIGxpc3RlbmVyLlxuICAgICAqKlxuICAgICAtIG5hbWUgKHN0cmluZykgbmFtZSBvZiB0aGUgZXZlbnQsIGRvdCAoYC5gKSBvciBzbGFzaCAoYC9gKSBzZXBhcmF0ZWQsIHdpdGggb3B0aW9uYWwgd2lsZGNhcmRzXG4gICAgIC0gZiAoZnVuY3Rpb24pIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgKipcbiAgICAgPSAoZnVuY3Rpb24pIHNhbWUgcmV0dXJuIGZ1bmN0aW9uIGFzIEBldmUub25cbiAgICBcXCovXG4gICAgZXZlLm9uY2UgPSBmdW5jdGlvbiAobmFtZSwgZikge1xuICAgICAgICB2YXIgZjIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBldmUub2ZmKG5hbWUsIGYyKTtcbiAgICAgICAgICAgIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBldmUub24obmFtZSwgZjIpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS52ZXJzaW9uXG4gICAgIFsgcHJvcGVydHkgKHN0cmluZykgXVxuICAgICAqKlxuICAgICAqIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS5cbiAgICBcXCovXG4gICAgZXZlLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGV2ZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiWW91IGFyZSBydW5uaW5nIEV2ZSBcIiArIHZlcnNpb247XG4gICAgfTtcbiAgICBnbG9iLmV2ZSA9IGV2ZTtcbiAgICB0eXBlb2YgbW9kdWxlICE9IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMgPyBtb2R1bGUuZXhwb3J0cyA9IGV2ZSA6IHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFwiZXZlXCIsIFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBldmU7IH0pIDogZ2xvYi5ldmUgPSBldmU7XG59KSh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiLyohIEhhbW1lci5KUyAtIHYyLjAuNyAtIDIwMTYtMDQtMjJcbiAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjtcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqL1xuKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbnZhciBWRU5ET1JfUFJFRklYRVMgPSBbJycsICd3ZWJraXQnLCAnTW96JywgJ01TJywgJ21zJywgJ28nXTtcbnZhciBURVNUX0VMRU1FTlQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxudmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIG5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIHNldCBhIHRpbWVvdXQgd2l0aCBhIGdpdmVuIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xufVxuXG4vKipcbiAqIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSwgd2Ugd2FudCB0byBleGVjdXRlIHRoZSBmbiBvbiBlYWNoIGVudHJ5XG4gKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAqIHRoaXMgaXMgdXNlZCBieSBhbGwgdGhlIG1ldGhvZHMgdGhhdCBhY2NlcHQgYSBzaW5nbGUgYW5kIGFycmF5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfEFycmF5fSBhcmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIGVhY2goYXJnLCBjb250ZXh0W2ZuXSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogd2FsayBvYmplY3RzIGFuZCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgaTtcblxuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLmZvckVhY2gpIHtcbiAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IG9iai5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIHdyYXAgYSBtZXRob2Qgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHN0YWNrIHRyYWNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyB0aGUgc3VwcGxpZWQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignZ2V0LXN0YWNrLXRyYWNlJyk7XG4gICAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzK2F0XFxzKy9nbSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxccypcXCgvZ20sICd7YW5vbnltb3VzfSgpQCcpIDogJ1Vua25vd24gU3RhY2sgVHJhY2UnO1xuXG4gICAgICAgIHZhciBsb2cgPSB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUud2FybiB8fCB3aW5kb3cuY29uc29sZS5sb2cpO1xuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHNfdG9fYXNzaWduXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0YXJnZXRcbiAqL1xudmFyIGFzc2lnbjtcbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xufSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xufVxuXG4vKipcbiAqIGV4dGVuZCBvYmplY3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIGV4dGVuZCA9IGRlcHJlY2F0ZShmdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjLCBtZXJnZSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc3JjKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIW1lcmdlIHx8IChtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBkZXN0W2tleXNbaV1dID0gc3JjW2tleXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcblxuLyoqXG4gKiBtZXJnZSB0aGUgdmFsdWVzIGZyb20gc3JjIGluIHRoZSBkZXN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZGVzdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSBzcmNcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbnZhciBtZXJnZSA9IGRlcHJlY2F0ZShmdW5jdGlvbiBtZXJnZShkZXN0LCBzcmMpIHtcbiAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIHNyYywgdHJ1ZSk7XG59LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIHNpbXBsZSBjbGFzcyBpbmhlcml0YW5jZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hpbGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAqL1xuZnVuY3Rpb24gaW5oZXJpdChjaGlsZCwgYmFzZSwgcHJvcGVydGllcykge1xuICAgIHZhciBiYXNlUCA9IGJhc2UucHJvdG90eXBlLFxuICAgICAgICBjaGlsZFA7XG5cbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBhc3NpZ24oY2hpbGRQLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbi8qKlxuICogc2ltcGxlIGZ1bmN0aW9uIGJpbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBiaW5kRm4oZm4sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYm91bmRGbigpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICogdGhpcyBmaXJzdCBpdGVtIGluIGFyZ3Mgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge0Jvb2xlYW58RnVuY3Rpb259IHZhbFxuICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gYm9vbE9yRm4odmFsLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gVFlQRV9GVU5DVElPTikge1xuICAgICAgICByZXR1cm4gdmFsLmFwcGx5KGFyZ3MgPyBhcmdzWzBdIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59XG5cbi8qKlxuICogdXNlIHRoZSB2YWwyIHdoZW4gdmFsMSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsMVxuICogQHBhcmFtIHsqfSB2YWwyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gaWZVbmRlZmluZWQodmFsMSwgdmFsMikge1xuICAgIHJldHVybiAodmFsMSA9PT0gdW5kZWZpbmVkKSA/IHZhbDIgOiB2YWwxO1xufVxuXG4vKipcbiAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiByZW1vdmVFdmVudExpc3RlbmVyIHdpdGggbXVsdGlwbGUgZXZlbnRzIGF0IG9uY2VcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRhcmdldCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBlYWNoKHNwbGl0U3RyKHR5cGVzKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogZmluZCBpZiBhIG5vZGUgaXMgaW4gdGhlIGdpdmVuIHBhcmVudFxuICogQG1ldGhvZCBoYXNQYXJlbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIHBhcmVudCkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBpblN0cihzdHIsIGZpbmQpIHtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoZmluZCkgPiAtMTtcbn1cblxuLyoqXG4gKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybnMge0FycmF5fSB3b3Jkc1xuICovXG5mdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdCB1c2luZyBpbmRleE9mIG9yIGEgc2ltcGxlIHBvbHlGaWxsXG4gKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZpbmRCeUtleV1cbiAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kLCBmaW5kQnlLZXkpIHtcbiAgICBpZiAoc3JjLmluZGV4T2YgJiYgIWZpbmRCeUtleSkge1xuICAgICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICgoZmluZEJ5S2V5ICYmIHNyY1tpXVtmaW5kQnlLZXldID09IGZpbmQpIHx8ICghZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIHJlYWwgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG59XG5cbi8qKlxuICogdW5pcXVlIGFycmF5IHdpdGggb2JqZWN0cyBiYXNlZCBvbiBhIGtleSAobGlrZSAnaWQnKSBvciBqdXN0IGJ5IHRoZSBhcnJheSdzIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBzcmMgW3tpZDoxfSx7aWQ6Mn0se2lkOjF9XVxuICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtzb3J0PUZhbHNlXVxuICogQHJldHVybnMge0FycmF5fSBbe2lkOjF9LHtpZDoyfV1cbiAqL1xuZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbCA9IGtleSA/IHNyY1tpXVtrZXldIDogc3JjW2ldO1xuICAgICAgICBpZiAoaW5BcnJheSh2YWx1ZXMsIHZhbCkgPCAwKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbaV0gPSB2YWw7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoc29ydCkge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydChmdW5jdGlvbiBzb3J0VW5pcXVlQXJyYXkoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhW2tleV0gPiBiW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gKi9cbmZ1bmN0aW9uIHByZWZpeGVkKG9iaiwgcHJvcGVydHkpIHtcbiAgICB2YXIgcHJlZml4LCBwcm9wO1xuICAgIHZhciBjYW1lbFByb3AgPSBwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBWRU5ET1JfUFJFRklYRVMubGVuZ3RoKSB7XG4gICAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgICAgcHJvcCA9IChwcmVmaXgpID8gcHJlZml4ICsgY2FtZWxQcm9wIDogcHJvcGVydHk7XG5cbiAgICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogZ2V0IGEgdW5pcXVlIGlkXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWVJZFxuICovXG52YXIgX3VuaXF1ZUlkID0gMTtcbmZ1bmN0aW9uIHVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBfdW5pcXVlSWQrKztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0RvY3VtZW50Vmlld3xXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IHx8IHdpbmRvdyk7XG59XG5cbnZhciBNT0JJTEVfUkVHRVggPSAvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2k7XG5cbnZhciBTVVBQT1JUX1RPVUNIID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7XG52YXIgU1VQUE9SVF9QT0lOVEVSX0VWRU5UUyA9IHByZWZpeGVkKHdpbmRvdywgJ1BvaW50ZXJFdmVudCcpICE9PSB1bmRlZmluZWQ7XG52YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xudmFyIElOUFVUX1RZUEVfUEVOID0gJ3Blbic7XG52YXIgSU5QVVRfVFlQRV9NT1VTRSA9ICdtb3VzZSc7XG52YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcblxudmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcblxudmFyIElOUFVUX1NUQVJUID0gMTtcbnZhciBJTlBVVF9NT1ZFID0gMjtcbnZhciBJTlBVVF9FTkQgPSA0O1xudmFyIElOUFVUX0NBTkNFTCA9IDg7XG5cbnZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG52YXIgRElSRUNUSU9OX0xFRlQgPSAyO1xudmFyIERJUkVDVElPTl9SSUdIVCA9IDQ7XG52YXIgRElSRUNUSU9OX1VQID0gODtcbnZhciBESVJFQ1RJT05fRE9XTiA9IDE2O1xuXG52YXIgRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fTEVGVCB8IERJUkVDVElPTl9SSUdIVDtcbnZhciBESVJFQ1RJT05fVkVSVElDQUwgPSBESVJFQ1RJT05fVVAgfCBESVJFQ1RJT05fRE9XTjtcbnZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG5cbnZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG52YXIgUFJPUFNfQ0xJRU5UX1hZID0gWydjbGllbnRYJywgJ2NsaWVudFknXTtcblxuLyoqXG4gKiBjcmVhdGUgbmV3IGlucHV0IHR5cGUgbWFuYWdlclxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0lucHV0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDtcblxuICAgIC8vIHNtYWxsZXIgd3JhcHBlciBhcm91bmQgdGhlIGhhbmRsZXIsIGZvciB0aGUgc2NvcGUgYW5kIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBtYW5hZ2VyLFxuICAgIC8vIHNvIHdoZW4gZGlzYWJsZWQgdGhlIGlucHV0IGV2ZW50cyBhcmUgY29tcGxldGVseSBieXBhc3NlZC5cbiAgICB0aGlzLmRvbUhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuICAgICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVyKGV2KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcblxufVxuXG5JbnB1dC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2hvdWxkIGhhbmRsZSB0aGUgaW5wdXRFdmVudCBkYXRhIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIGFkZEV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBjYWxsZWQgYnkgdGhlIE1hbmFnZXIgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0SW5zdGFuY2UobWFuYWdlcikge1xuICAgIHZhciBUeXBlO1xuICAgIHZhciBpbnB1dENsYXNzID0gbWFuYWdlci5vcHRpb25zLmlucHV0Q2xhc3M7XG5cbiAgICBpZiAoaW5wdXRDbGFzcykge1xuICAgICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgICAgVHlwZSA9IFBvaW50ZXJFdmVudElucHV0O1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9PTkxZX1RPVUNIKSB7XG4gICAgICAgIFR5cGUgPSBUb3VjaElucHV0O1xuICAgIH0gZWxzZSBpZiAoIVNVUFBPUlRfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoTW91c2VJbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyAoVHlwZSkobWFuYWdlciwgaW5wdXRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBoYW5kbGUgaW5wdXQgZXZlbnRzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBpbnB1dEhhbmRsZXIobWFuYWdlciwgZXZlbnRUeXBlLCBpbnB1dCkge1xuICAgIHZhciBwb2ludGVyc0xlbiA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgY2hhbmdlZFBvaW50ZXJzTGVuID0gaW5wdXQuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgaXNGaXJzdCA9IChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcbiAgICB2YXIgaXNGaW5hbCA9IChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcblxuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgIG1hbmFnZXIuc2Vzc2lvbiA9IHt9O1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG4gICAgaW5wdXQuZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuXG4gICAgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG4gICAgY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCk7XG5cbiAgICAvLyBlbWl0IHNlY3JldCBldmVudFxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuXG4gICAgbWFuYWdlci5yZWNvZ25pemUoaW5wdXQpO1xuICAgIG1hbmFnZXIuc2Vzc2lvbi5wcmV2SW5wdXQgPSBpbnB1dDtcbn1cblxuLyoqXG4gKiBleHRlbmQgdGhlIGRhdGEgd2l0aCBzb21lIHVzYWJsZSBwcm9wZXJ0aWVzIGxpa2Ugc2NhbGUsIHJvdGF0ZSwgdmVsb2NpdHkgZXRjXG4gKiBAcGFyYW0ge09iamVjdH0gbWFuYWdlclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpIHtcbiAgICB2YXIgc2Vzc2lvbiA9IG1hbmFnZXIuc2Vzc2lvbjtcbiAgICB2YXIgcG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycztcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBzdG9yZSB0aGUgZmlyc3QgaW5wdXQgdG8gY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBhbmQgZGlyZWN0aW9uXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdElucHV0ID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPiAxICYmICFzZXNzaW9uLmZpcnN0TXVsdGlwbGUpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuXG4gICAgdmFyIGNlbnRlciA9IGlucHV0LmNlbnRlciA9IGdldENlbnRlcihwb2ludGVycyk7XG4gICAgaW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gICAgaW5wdXQuZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gZmlyc3RJbnB1dC50aW1lU3RhbXA7XG5cbiAgICBpbnB1dC5hbmdsZSA9IGdldEFuZ2xlKG9mZnNldENlbnRlciwgY2VudGVyKTtcbiAgICBpbnB1dC5kaXN0YW5jZSA9IGdldERpc3RhbmNlKG9mZnNldENlbnRlciwgY2VudGVyKTtcblxuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuXG4gICAgdmFyIG92ZXJhbGxWZWxvY2l0eSA9IGdldFZlbG9jaXR5KGlucHV0LmRlbHRhVGltZSwgaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVggPSBvdmVyYWxsVmVsb2NpdHkueDtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZID0gb3ZlcmFsbFZlbG9jaXR5Lnk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5ID0gKGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpKSA/IG92ZXJhbGxWZWxvY2l0eS54IDogb3ZlcmFsbFZlbG9jaXR5Lnk7XG5cbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG5cbiAgICBpbnB1dC5tYXhQb2ludGVycyA9ICFzZXNzaW9uLnByZXZJbnB1dCA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6ICgoaW5wdXQucG9pbnRlcnMubGVuZ3RoID5cbiAgICAgICAgc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpO1xuXG4gICAgY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KTtcblxuICAgIC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICBpZiAoaGFzUGFyZW50KGlucHV0LnNyY0V2ZW50LnRhcmdldCwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBpbnB1dC5zcmNFdmVudC50YXJnZXQ7XG4gICAgfVxuICAgIGlucHV0LnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyO1xuICAgIHZhciBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSB8fCB7fTtcbiAgICB2YXIgcHJldklucHV0ID0gc2Vzc2lvbi5wcmV2SW5wdXQgfHwge307XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9TVEFSVCB8fCBwcmV2SW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9FTkQpIHtcbiAgICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBwcmV2SW5wdXQuZGVsdGFYIHx8IDAsXG4gICAgICAgICAgICB5OiBwcmV2SW5wdXQuZGVsdGFZIHx8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhID0ge1xuICAgICAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgICAgICB5OiBjZW50ZXIueVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xufVxuXG4vKipcbiAqIHZlbG9jaXR5IGlzIGNhbGN1bGF0ZWQgZXZlcnkgeCBtc1xuICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgbGFzdCA9IHNlc3Npb24ubGFzdEludGVydmFsIHx8IGlucHV0LFxuICAgICAgICBkZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBsYXN0LnRpbWVTdGFtcCxcbiAgICAgICAgdmVsb2NpdHksIHZlbG9jaXR5WCwgdmVsb2NpdHlZLCBkaXJlY3Rpb247XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0NBTkNFTCAmJiAoZGVsdGFUaW1lID4gQ09NUFVURV9JTlRFUlZBTCB8fCBsYXN0LnZlbG9jaXR5ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHZhciBkZWx0YVggPSBpbnB1dC5kZWx0YVggLSBsYXN0LmRlbHRhWDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuXG4gICAgICAgIHZhciB2ID0gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgICAgdmVsb2NpdHlZID0gdi55O1xuICAgICAgICB2ZWxvY2l0eSA9IChhYnModi54KSA+IGFicyh2LnkpKSA/IHYueCA6IHYueTtcbiAgICAgICAgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGRlbHRhWCwgZGVsdGFZKTtcblxuICAgICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXRlc3QgdmVsb2NpdHkgaW5mbyBpZiBpdCBkb2Vzbid0IG92ZXJ0YWtlIGEgbWluaW11bSBwZXJpb2RcbiAgICAgICAgdmVsb2NpdHkgPSBsYXN0LnZlbG9jaXR5O1xuICAgICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgICAgdmVsb2NpdHlZID0gbGFzdC52ZWxvY2l0eVk7XG4gICAgICAgIGRpcmVjdGlvbiA9IGxhc3QuZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIGlucHV0LnZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gICAgaW5wdXQudmVsb2NpdHlYID0gdmVsb2NpdHlYO1xuICAgIGlucHV0LnZlbG9jaXR5WSA9IHZlbG9jaXR5WTtcbiAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG59XG5cbi8qKlxuICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjbG9uZWRJbnB1dERhdGFcbiAqL1xuZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBpbnB1dC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgICAgICBjbGllbnRYOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRYKSxcbiAgICAgICAgICAgIGNsaWVudFk6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lU3RhbXA6IG5vdygpLFxuICAgICAgICBwb2ludGVyczogcG9pbnRlcnMsXG4gICAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgICAgZGVsdGFYOiBpbnB1dC5kZWx0YVgsXG4gICAgICAgIGRlbHRhWTogaW5wdXQuZGVsdGFZXG4gICAgfTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBwb2ludGVyc1xuICogQHJldHVybiB7T2JqZWN0fSBjZW50ZXIgY29udGFpbnMgYHhgIGFuZCBgeWAgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcm91bmQocG9pbnRlcnNbMF0uY2xpZW50WCksXG4gICAgICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB4ID0gMCwgeSA9IDAsIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgICAgeCArPSBwb2ludGVyc1tpXS5jbGllbnRYO1xuICAgICAgICB5ICs9IHBvaW50ZXJzW2ldLmNsaWVudFk7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZCh4IC8gcG9pbnRlcnNMZW5ndGgpLFxuICAgICAgICB5OiByb3VuZCh5IC8gcG9pbnRlcnNMZW5ndGgpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge09iamVjdH0gdmVsb2NpdHkgYHhgIGFuZCBgeWBcbiAqL1xuZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCB4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAvIGRlbHRhVGltZSB8fCAwLFxuICAgICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpcmVjdGlvblxuICovXG5mdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAgIHJldHVybiBESVJFQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICBpZiAoYWJzKHgpID49IGFicyh5KSkge1xuICAgICAgICByZXR1cm4geCA8IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICB9XG4gICAgcmV0dXJuIHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSB7eCwgeX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgICB9XG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gcDFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMlxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICovXG5mdW5jdGlvbiBnZXRBbmdsZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJvdGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0sIFBST1BTX0NMSUVOVF9YWSkgKyBnZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIG5vIHNjYWxlIGlzIDEsIGFuZCBnb2VzIGRvd24gdG8gMCB3aGVuIHBpbmNoZWQgdG9nZXRoZXIsIGFuZCBiaWdnZXIgd2hlbiBwaW5jaGVkIG91dFxuICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICovXG5mdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGVuZFswXSwgZW5kWzFdLCBQUk9QU19DTElFTlRfWFkpIC8gZ2V0RGlzdGFuY2Uoc3RhcnRbMF0sIHN0YXJ0WzFdLCBQUk9QU19DTElFTlRfWFkpO1xufVxuXG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICAgIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gICAgbW91c2Vtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxudmFyIE1PVVNFX0VMRU1FTlRfRVZFTlRTID0gJ21vdXNlZG93bic7XG52YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG5cbi8qKlxuICogTW91c2UgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG5cbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTsgLy8gbW91c2Vkb3duIHN0YXRlXG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIE1FaGFuZGxlcihldikge1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIG9uIHN0YXJ0IHdlIHdhbnQgdG8gaGF2ZSB0aGUgbGVmdCBtb3VzZSBidXR0b24gZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggIT09IDEpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX01PVVNFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG52YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbn07XG5cbi8vIGluIElFMTAgdGhlIHBvaW50ZXIgdHlwZXMgaXMgZGVmaW5lZCBhcyBhbiBlbnVtXG52YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG59O1xuXG52YXIgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdwb2ludGVyZG93bic7XG52YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJztcblxuLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5pZiAod2luZG93Lk1TUG9pbnRlckV2ZW50ICYmICF3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdNU1BvaW50ZXJEb3duJztcbiAgICBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAnTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwnO1xufVxuXG4vKipcbiAqIFBvaW50ZXIgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFBvaW50ZXJFdmVudElucHV0KCkge1xuICAgIHRoaXMuZXZFbCA9IFBPSU5URVJfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFBPSU5URVJfV0lORE9XX0VWRU5UUztcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnN0b3JlID0gKHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXSk7XG59XG5cbmluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBldmVudFR5cGVOb3JtYWxpemVkID0gZXYudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ21zJywgJycpO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gUE9JTlRFUl9JTlBVVF9NQVBbZXZlbnRUeXBlTm9ybWFsaXplZF07XG4gICAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuXG4gICAgICAgIHZhciBpc1RvdWNoID0gKHBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfVE9VQ0gpO1xuXG4gICAgICAgIC8vIGdldCBpbmRleCBvZiB0aGUgZXZlbnQgaW4gdGhlIHN0b3JlXG4gICAgICAgIHZhciBzdG9yZUluZGV4ID0gaW5BcnJheShzdG9yZSwgZXYucG9pbnRlcklkLCAncG9pbnRlcklkJyk7XG5cbiAgICAgICAgLy8gc3RhcnQgYW5kIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgKGV2LmJ1dHRvbiA9PT0gMCB8fCBpc1RvdWNoKSkge1xuICAgICAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChldik7XG4gICAgICAgICAgICAgICAgc3RvcmVJbmRleCA9IHN0b3JlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXQgbm90IGZvdW5kLCBzbyB0aGUgcG9pbnRlciBoYXNuJ3QgYmVlbiBkb3duIChzbyBpdCdzIHByb2JhYmx5IGEgaG92ZXIpXG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgc3RvcmVbc3RvcmVJbmRleF0gPSBldjtcblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogc3RvcmUsXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlbW92ZVBvaW50ZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICAgICAgc3RvcmUuc3BsaWNlKHN0b3JlSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbnZhciBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBTSU5HTEVfVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0JztcbnZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG5cbi8qKlxuICogVG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU2luZ2xlVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBURWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIHNob3VsZCB3ZSBoYW5kbGUgdGhlIHRvdWNoIGV2ZW50cz9cbiAgICAgICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcblxuICAgICAgICAvLyB3aGVuIGRvbmUsIHJlc2V0IHRoZSBzdGFydGVkIHN0YXRlXG4gICAgICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgdG91Y2hlc1swXS5sZW5ndGggLSB0b3VjaGVzWzFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgZmxhZ1xuICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGFsbCA9IHVuaXF1ZUFycmF5KGFsbC5jb25jYXQoY2hhbmdlZCksICdpZGVudGlmaWVyJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFthbGwsIGNoYW5nZWRdO1xufVxuXG52YXIgVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBUT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBUb3VjaElucHV0KCkge1xuICAgIHRoaXMuZXZUYXJnZXQgPSBUT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMudGFyZ2V0SWRzID0ge307XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgdHlwZSA9IFRPVUNIX0lOUFVUX01BUFtldi50eXBlXTtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBnZXRUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuICAgICAgICBpZiAoIXRvdWNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBnZXRUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbFRvdWNoZXMgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciB0YXJnZXRJZHMgPSB0aGlzLnRhcmdldElkcztcblxuICAgIC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfU1RBUlQgfCBJTlBVVF9NT1ZFKSAmJiBhbGxUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBbYWxsVG91Y2hlcywgYWxsVG91Y2hlc107XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICAgIHRhcmdldFRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzID0gW10sXG4gICAgICAgIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuXG4gICAgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuICAgIHRhcmdldFRvdWNoZXMgPSBhbGxUb3VjaGVzLmZpbHRlcihmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICByZXR1cm4gaGFzUGFyZW50KHRvdWNoLnRhcmdldCwgdGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIGNvbGxlY3QgdG91Y2hlc1xuICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0SWRzW3RhcmdldFRvdWNoZXNbaV0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIGNoYW5nZWQgdG91Y2hlcyB0byBvbmx5IGNvbnRhaW4gdG91Y2hlcyB0aGF0IGV4aXN0IGluIHRoZSBjb2xsZWN0ZWQgdGFyZ2V0IGlkc1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzLnB1c2goY2hhbmdlZFRvdWNoZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgaWYgKCFjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAgIC8vIG1lcmdlIHRhcmdldFRvdWNoZXMgd2l0aCBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyBzbyBpdCBjb250YWlucyBBTEwgdG91Y2hlcywgaW5jbHVkaW5nICdlbmQnIGFuZCAnY2FuY2VsJ1xuICAgICAgICB1bmlxdWVBcnJheSh0YXJnZXRUb3VjaGVzLmNvbmNhdChjaGFuZ2VkVGFyZ2V0VG91Y2hlcyksICdpZGVudGlmaWVyJywgdHJ1ZSksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb21iaW5lZCB0b3VjaCBhbmQgbW91c2UgaW5wdXRcbiAqXG4gKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAqIFRoaXMgYmVjYXVzZSB0b3VjaCBkZXZpY2VzIGFsc28gZW1pdCBtb3VzZSBldmVudHMgd2hpbGUgZG9pbmcgYSB0b3VjaC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cblxudmFyIERFRFVQX1RJTUVPVVQgPSAyNTAwO1xudmFyIERFRFVQX0RJU1RBTkNFID0gMjU7XG5cbmZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBiaW5kRm4odGhpcy5oYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLnRvdWNoID0gbmV3IFRvdWNoSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcblxuICAgIHRoaXMucHJpbWFyeVRvdWNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gW107XG59XG5cbmluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgICB2YXIgaXNUb3VjaCA9IChpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCksXG4gICAgICAgICAgICBpc01vdXNlID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKTtcblxuICAgICAgICBpZiAoaXNNb3VzZSAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICAgIHJlY29yZFRvdWNoZXMuY2FsbCh0aGlzLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW91c2UgJiYgaXNTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGlucHV0RGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRvdWNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZS5kZXN0cm95KCk7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0TGFzdFRvdWNoKGV2ZW50RGF0YSkge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF07XG5cbiAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5wcmltYXJ5VG91Y2gpIHtcbiAgICAgICAgdmFyIGxhc3RUb3VjaCA9IHt4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZfTtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICAgIHZhciBsdHMgPSB0aGlzLmxhc3RUb3VjaGVzO1xuICAgICAgICB2YXIgcmVtb3ZlTGFzdFRvdWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGx0cy5pbmRleE9mKGxhc3RUb3VjaCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbHRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dChyZW1vdmVMYXN0VG91Y2gsIERFRFVQX1RJTUVPVVQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLCB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgICAgdmFyIGR4ID0gTWF0aC5hYnMoeCAtIHQueCksIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG4gICAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbnZhciBOQVRJVkVfVE9VQ0hfQUNUSU9OID0gUFJFRklYRURfVE9VQ0hfQUNUSU9OICE9PSB1bmRlZmluZWQ7XG5cbi8vIG1hZ2ljYWwgdG91Y2hBY3Rpb24gdmFsdWVcbnZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbnZhciBUT1VDSF9BQ1RJT05fQVVUTyA9ICdhdXRvJztcbnZhciBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OID0gJ21hbmlwdWxhdGlvbic7IC8vIG5vdCBpbXBsZW1lbnRlZFxudmFyIFRPVUNIX0FDVElPTl9OT05FID0gJ25vbmUnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWCA9ICdwYW4teCc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbnZhciBUT1VDSF9BQ1RJT05fTUFQID0gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpO1xuXG4vKipcbiAqIFRvdWNoIEFjdGlvblxuICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbn1cblxuVG91Y2hBY3Rpb24ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWUgb24gdGhlIGVsZW1lbnQgb3IgZW5hYmxlIHRoZSBwb2x5ZmlsbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgaWYgKHZhbHVlID09IFRPVUNIX0FDVElPTl9DT01QVVRFKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE5BVElWRV9UT1VDSF9BQ1RJT04gJiYgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUgJiYgVE9VQ0hfQUNUSU9OX01BUFt2YWx1ZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW1BSRUZJWEVEX1RPVUNIX0FDVElPTl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICoganVzdCByZS1zZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSByZWNvZ25pemVyJ3Mgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIGNvbXB1dGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBlYWNoKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywgZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICAgICAgaWYgKGJvb2xPckZuKHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUsIFtyZWNvZ25pemVyXSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5jb25jYXQocmVjb2duaXplci5nZXRUb3VjaEFjdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gaW5wdXQuc3JjRXZlbnQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247XG5cbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGFjdGlvbiBkaWQgcHJldmVudGVkIG9uY2UgdGhpcyBzZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgdmFyIGhhc05vbmUgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWF07XG5cbiAgICAgICAgaWYgKGhhc05vbmUpIHtcbiAgICAgICAgICAgIC8vZG8gbm90IHByZXZlbnQgZGVmYXVsdHMgaWYgdGhpcyBpcyBhIHRhcCBnZXN0dXJlXG5cbiAgICAgICAgICAgIHZhciBpc1RhcFBvaW50ZXIgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgICAgIHZhciBpc1RhcFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IDI1MDtcblxuICAgICAgICAgICAgaWYgKGlzVGFwUG9pbnRlciAmJiBpc1RhcE1vdmVtZW50ICYmIGlzVGFwVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICAgICAgLy8gYHBhbi14IHBhbi15YCBtZWFucyBicm93c2VyIGhhbmRsZXMgYWxsIHNjcm9sbGluZy9wYW5uaW5nLCBkbyBub3QgcHJldmVudFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc05vbmUgfHxcbiAgICAgICAgICAgIChoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB8fFxuICAgICAgICAgICAgKGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudFNyYyhzcmNFdmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCB0byBwcmV2ZW50IHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvciAoc2Nyb2xsaW5nIGluIG1vc3QgY2FzZXMpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNyY0V2ZW50XG4gICAgICovXG4gICAgcHJldmVudFNyYzogZnVuY3Rpb24oc3JjRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHdoZW4gdGhlIHRvdWNoQWN0aW9ucyBhcmUgY29sbGVjdGVkIHRoZXkgYXJlIG5vdCBhIHZhbGlkIHZhbHVlLCBzbyB3ZSBuZWVkIHRvIGNsZWFuIHRoaW5ncyB1cC4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zKSB7XG4gICAgLy8gbm9uZVxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7XG5cbiAgICAvLyBpZiBib3RoIHBhbi14IGFuZCBwYW4teSBhcmUgc2V0IChkaWZmZXJlbnQgcmVjb2duaXplcnNcbiAgICAvLyBmb3IgZGlmZmVyZW50IGRpcmVjdGlvbnMsIGUuZy4gaG9yaXpvbnRhbCBwYW4gYnV0IHZlcnRpY2FsIHN3aXBlPylcbiAgICAvLyB3ZSBuZWVkIG5vbmUgKGFzIG90aGVyd2lzZSB3aXRoIHBhbi14IHBhbi15IGNvbWJpbmVkIG5vbmUgb2YgdGhlc2VcbiAgICAvLyByZWNvZ25pemVycyB3aWxsIHdvcmssIHNpbmNlIHRoZSBicm93c2VyIHdvdWxkIGhhbmRsZSBhbGwgcGFubmluZ1xuICAgIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIC8vIHBhbi14IE9SIHBhbi15XG4gICAgaWYgKGhhc1BhblggfHwgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9XG5cbiAgICAvLyBtYW5pcHVsYXRpb25cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT047XG4gICAgfVxuXG4gICAgcmV0dXJuIFRPVUNIX0FDVElPTl9BVVRPO1xufVxuXG5mdW5jdGlvbiBnZXRUb3VjaEFjdGlvblByb3BzKCkge1xuICAgIGlmICghTkFUSVZFX1RPVUNIX0FDVElPTikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0b3VjaE1hcCA9IHt9O1xuICAgIHZhciBjc3NTdXBwb3J0cyA9IHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5zdXBwb3J0cztcbiAgICBbJ2F1dG8nLCAnbWFuaXB1bGF0aW9uJywgJ3Bhbi15JywgJ3Bhbi14JywgJ3Bhbi14IHBhbi15JywgJ25vbmUnXS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCkge1xuXG4gICAgICAgIC8vIElmIGNzcy5zdXBwb3J0cyBpcyBub3Qgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBuYXRpdmUgdG91Y2gtYWN0aW9uIGFzc3VtZSBpdCBzdXBwb3J0c1xuICAgICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICAgIHRvdWNoTWFwW3ZhbF0gPSBjc3NTdXBwb3J0cyA/IHdpbmRvdy5DU1Muc3VwcG9ydHMoJ3RvdWNoLWFjdGlvbicsIHZhbCkgOiB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaE1hcDtcbn1cblxuLyoqXG4gKiBSZWNvZ25pemVyIGZsb3cgZXhwbGFpbmVkOyAqXG4gKiBBbGwgcmVjb2duaXplcnMgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBQT1NTSUJMRSB3aGVuIGEgaW5wdXQgc2Vzc2lvbiBzdGFydHMuXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAqIEV4YW1wbGUgc2Vzc2lvbiBmb3IgbW91c2UtaW5wdXQ6IG1vdXNlZG93biAtPiBtb3VzZW1vdmUgLT4gbW91c2V1cFxuICpcbiAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAqIHdoaWNoIGRldGVybWluZXMgd2l0aCBzdGF0ZSBpdCBzaG91bGQgYmUuXG4gKlxuICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICogUE9TU0lCTEUgdG8gZ2l2ZSBpdCBhbm90aGVyIGNoYW5nZSBvbiB0aGUgbmV4dCBjeWNsZS5cbiAqXG4gKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gKiAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLStcbiAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgKy0tLS0tKy0tLS0tKyAgICAgICAgICAgICAgIHxcbiAqICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHxcbiAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kZWQvUmVjb2duaXplZFxuICovXG52YXIgU1RBVEVfUE9TU0lCTEUgPSAxO1xudmFyIFNUQVRFX0JFR0FOID0gMjtcbnZhciBTVEFURV9DSEFOR0VEID0gNDtcbnZhciBTVEFURV9FTkRFRCA9IDg7XG52YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xudmFyIFNUQVRFX0NBTkNFTExFRCA9IDE2O1xudmFyIFNUQVRFX0ZBSUxFRCA9IDMyO1xuXG4vKipcbiAqIFJlY29nbml6ZXJcbiAqIEV2ZXJ5IHJlY29nbml6ZXIgbmVlZHMgdG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMuaWQgPSB1bmlxdWVJZCgpO1xuXG4gICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcblxuICAgIC8vIGRlZmF1bHQgaXMgZW5hYmxlIHRydWVcbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG5cbiAgICB0aGlzLnNpbXVsdGFuZW91cyA9IHt9O1xuICAgIHRoaXMucmVxdWlyZUZhaWwgPSBbXTtcbn1cblxuUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuICAgICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaW11bHRhbmVvdXMgPSB0aGlzLnNpbXVsdGFuZW91cztcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSA9IG90aGVyUmVjb2duaXplcjtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZWNvZ25pemVXaXRoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSBzaW11bHRhbmVvdXMgbGluay4gaXQgZG9lc250IHJlbW92ZSB0aGUgbGluayBvbiB0aGUgb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgZHJvcFJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlcXVpcmVGYWlsID0gdGhpcy5yZXF1aXJlRmFpbDtcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlcXVpcmVGYWlsLnB1c2gob3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZXF1aXJlRmFpbHVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZHJvcCB0aGUgcmVxdWlyZUZhaWx1cmUgbGluay4gaXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGUgcmVjb2duaXplciBjYW4gcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNhblJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBZb3Ugc2hvdWxkIHVzZSBgdHJ5RW1pdGAgaW5zdGVhZCBvZiBgZW1pdGAgZGlyZWN0bHkgdG8gY2hlY2tcbiAgICAgKiB0aGF0IGFsbCB0aGUgbmVlZGVkIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQgYmVmb3JlIGVtaXR0aW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ3BhbnN0YXJ0JyBhbmQgJ3Bhbm1vdmUnXG4gICAgICAgIGlmIChzdGF0ZSA8IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCk7IC8vIHNpbXBsZSAnZXZlbnROYW1lJyBldmVudHNcblxuICAgICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7IC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICAgICAgZW1pdChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuZW5kIGFuZCBwYW5jYW5jZWxcbiAgICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbiB3ZSBlbWl0P1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNhbkVtaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMucmVxdWlyZUZhaWxbaV0uc3RhdGUgJiAoU1RBVEVfRkFJTEVEIHwgU1RBVEVfUE9TU0lCTEUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSByZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIC8vIG1ha2UgYSBuZXcgY29weSBvZiB0aGUgaW5wdXREYXRhXG4gICAgICAgIC8vIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIGlucHV0RGF0YSB3aXRob3V0IG1lc3NpbmcgdXAgdGhlIG90aGVyIHJlY29nbml6ZXJzXG4gICAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTtcblxuICAgICAgICAvLyBpcyBpcyBlbmFibGVkIGFuZCBhbGxvdyByZWNvZ25pemluZz9cbiAgICAgICAgaWYgKCFib29sT3JGbih0aGlzLm9wdGlvbnMuZW5hYmxlLCBbdGhpcywgaW5wdXREYXRhQ2xvbmVdKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX1JFQ09HTklaRUQgfCBTVEFURV9DQU5DRUxMRUQgfCBTVEFURV9GQUlMRUQpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTtcblxuICAgICAgICAvLyB0aGUgcmVjb2duaXplciBoYXMgcmVjb2duaXplZCBhIGdlc3R1cmVcbiAgICAgICAgLy8gc28gdHJpZ2dlciBhbiBldmVudFxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCB8IFNUQVRFX0NBTkNFTExFRCkpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5RW1pdChpbnB1dERhdGFDbG9uZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcmVjb2duaXplclxuICAgICAqIHRoZSBhY3R1YWwgcmVjb2duaXppbmcgaGFwcGVucyBpbiB0aGlzIG1ldGhvZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqIEByZXR1cm5zIHtDb25zdH0gU1RBVEVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dERhdGEpIHsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHByZWZlcnJlZCB0b3VjaC1hY3Rpb25cbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZ2VzdHVyZSBpc24ndCBhbGxvd2VkIHRvIHJlY29nbml6ZVxuICAgICAqIGxpa2Ugd2hlbiBhbm90aGVyIGlzIGJlaW5nIHJlY29nbml6ZWQgb3IgaXQgaXMgZGlzYWJsZWRcbiAgICAgKiBAdmlydHVhbFxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpIHsgfVxufTtcblxuLyoqXG4gKiBnZXQgYSB1c2FibGUgc3RyaW5nLCB1c2VkIGFzIGV2ZW50IHBvc3RmaXhcbiAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICovXG5mdW5jdGlvbiBzdGF0ZVN0cihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZSAmIFNUQVRFX0NBTkNFTExFRCkge1xuICAgICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICAgIHJldHVybiAnZW5kJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQ0hBTkdFRCkge1xuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9CRUdBTikge1xuICAgICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICogQHBhcmFtIHtDb25zdH0gZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgICByZXR1cm4gJ2Rvd24nO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCkge1xuICAgICAgICByZXR1cm4gJ3VwJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fTEVGVCkge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGdldCBhIHJlY29nbml6ZXIgYnkgbmFtZSBpZiBpdCBpcyBib3VuZCB0byBhIG1hbmFnZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gKiBAcmV0dXJucyB7UmVjb2duaXplcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcbiAgICBpZiAobWFuYWdlcikge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG90aGVyUmVjb2duaXplcjtcbn1cblxuLyoqXG4gKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KEF0dHJSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvblBvaW50ZXJzID0gdGhpcy5vcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICByZXR1cm4gb3B0aW9uUG9pbnRlcnMgPT09IDAgfHwgaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25Qb2ludGVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgaW5wdXQgYW5kIHJldHVybiB0aGUgc3RhdGUgZm9yIHRoZSByZWNvZ25pemVyXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMgeyp9IFN0YXRlXG4gICAgICovXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcblxuICAgICAgICB2YXIgaXNSZWNvZ25pemVkID0gc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEKTtcbiAgICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTtcblxuICAgICAgICAvLyBvbiBjYW5jZWwgaW5wdXQgYW5kIHdlJ3ZlIHJlY29nbml6ZWQgYmVmb3JlLCByZXR1cm4gU1RBVEVfQ0FOQ0VMTEVEXG4gICAgICAgIGlmIChpc1JlY29nbml6ZWQgJiYgKGV2ZW50VHlwZSAmIElOUFVUX0NBTkNFTCB8fCAhaXNWYWxpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlY29nbml6ZWQgfHwgaXNWYWxpZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKHN0YXRlICYgU1RBVEVfQkVHQU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0hBTkdFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFBhblxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGFuUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5wWCA9IG51bGw7XG4gICAgdGhpcy5wWSA9IG51bGw7XG59XG5cbmluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BhbicsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9BTExcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICB9LFxuXG4gICAgZGlyZWN0aW9uVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IGlucHV0LmRpc3RhbmNlO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5wdXQuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdmFyIHkgPSBpbnB1dC5kZWx0YVk7XG5cbiAgICAgICAgLy8gbG9jayB0byBheGlzP1xuICAgICAgICBpZiAoIShkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKHggPT09IDApID8gRElSRUNUSU9OX05PTkUgOiAoeCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeSA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh5IDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHkgIT0gdGhpcy5wWTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICByZXR1cm4gaGFzTW92ZWQgJiYgZGlzdGFuY2UgPiBvcHRpb25zLnRocmVzaG9sZCAmJiBkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBBdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgKCEodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKSAmJiB0aGlzLmRpcmVjdGlvblRlc3QoaW5wdXQpKSk7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cbiAgICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdGhpcy5wWSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGluY2hcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVycyBhcmUgbW92aW5nIHRvd2FyZCAoem9vbS1pbikgb3IgYXdheSBmcm9tIGVhY2ggb3RoZXIgKHpvb20tb3V0KS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGluY2hSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwaW5jaCcsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5zY2FsZSAhPT0gMSkge1xuICAgICAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgaW5PdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQcmVzc1xuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUHJlc3NSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG59XG5cbmluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3ByZXNzJyxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIHRpbWU6IDI1MSwgLy8gbWluaW1hbCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIHByZXNzZWRcbiAgICAgICAgdGhyZXNob2xkOiA5IC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB2YXIgdmFsaWRUaW1lID0gaW5wdXQuZGVsdGFUaW1lID4gb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAoIXZhbGlkTW92ZW1lbnQgfHwgIXZhbGlkUG9pbnRlcnMgfHwgKGlucHV0LmV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmICF2YWxpZFRpbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWUsIHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogUm90YXRlXG4gKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBSb3RhdGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUm90YXRlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFJvdGF0ZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnJvdGF0aW9uKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBTd2lwZVxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIG1vdmluZyBmYXN0ICh2ZWxvY2l0eSksIHdpdGggZW5vdWdoIGRpc3RhbmNlIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU3dpcGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgU3dpcGVSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdzd2lwZScsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHZlbG9jaXR5OiAwLjMsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFBhblJlY29nbml6ZXIucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyk7XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHZlbG9jaXR5O1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiZcbiAgICAgICAgICAgIGlucHV0LmRpc3RhbmNlID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCAmJlxuICAgICAgICAgICAgaW5wdXQubWF4UG9pbnRlcnMgPT0gdGhpcy5vcHRpb25zLnBvaW50ZXJzICYmXG4gICAgICAgICAgICBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5vZmZzZXREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAqIGJldHdlZW4gdGhlIGdpdmVuIGludGVydmFsIGFuZCBwb3NpdGlvbi4gVGhlIGRlbGF5IG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgbXVsdGktdGFwcyB3aXRob3V0IGZpcmluZ1xuICogYSBzaW5nbGUgdGFwLlxuICpcbiAqIFRoZSBldmVudERhdGEgZnJvbSB0aGUgZW1pdHRlZCBldmVudCBjb250YWlucyB0aGUgcHJvcGVydHkgYHRhcENvdW50YCwgd2hpY2ggY29udGFpbnMgdGhlIGFtb3VudCBvZlxuICogbXVsdGktdGFwcyBiZWluZyByZWNvZ25pemVkLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFRhcFJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gcHJldmlvdXMgdGltZSBhbmQgY2VudGVyLFxuICAgIC8vIHVzZWQgZm9yIHRhcCBjb3VudGluZ1xuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgdGhpcy5jb3VudCA9IDA7XG59XG5cbmluaGVyaXQoVGFwUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGFwczogMSxcbiAgICAgICAgaW50ZXJ2YWw6IDMwMCwgLy8gbWF4IHRpbWUgYmV0d2VlbiB0aGUgbXVsdGktdGFwIHRhcHNcbiAgICAgICAgdGltZTogMjUwLCAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgICB0aHJlc2hvbGQ6IDksIC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTl07XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkgJiYgKHRoaXMuY291bnQgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IChpbnB1dC50aW1lU3RhbXAgLSB0aGlzLnBUaW1lIDwgb3B0aW9ucy5pbnRlcnZhbCkgOiB0cnVlO1xuICAgICAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuXG4gICAgICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5wQ2VudGVyID0gaW5wdXQuY2VudGVyO1xuXG4gICAgICAgICAgICBpZiAoIXZhbGlkTXVsdGlUYXAgfHwgIXZhbGlkSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgICAgICAvLyBpZiB0YXAgY291bnQgbWF0Y2hlcyB3ZSBoYXZlIHJlY29nbml6ZWQgaXQsXG4gICAgICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuICAgICAgICAgICAgdmFyIHRhcENvdW50ID0gdGhpcy5jb3VudCAlIG9wdGlvbnMudGFwcztcbiAgICAgICAgICAgIGlmICh0YXBDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGZhaWxpbmcgcmVxdWlyZW1lbnRzLCBpbW1lZGlhdGVseSB0cmlnZ2VyIHRoZSB0YXAgZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBvciB3YWl0IGFzIGxvbmcgYXMgdGhlIG11bHRpdGFwIGludGVydmFsIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMuaW50ZXJ2YWwsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRhcENvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKi9cbkhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzXG4gKiBAbmFtZXNwYWNlXG4gKi9cbkhhbW1lci5kZWZhdWx0cyA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgaWYgRE9NIGV2ZW50cyBhcmUgYmVpbmcgdHJpZ2dlcmVkLlxuICAgICAqIEJ1dCB0aGlzIGlzIHNsb3dlciBhbmQgdW51c2VkIGJ5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMsIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBkb21FdmVudHM6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkvZmFsbGJhY2suXG4gICAgICogV2hlbiBzZXQgdG8gYGNvbXB1dGVgIGl0IHdpbGwgbWFnaWNhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZSBiYXNlZCBvbiB0aGUgYWRkZWQgcmVjb2duaXplcnMuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCBjb21wdXRlXG4gICAgICovXG4gICAgdG91Y2hBY3Rpb246IFRPVUNIX0FDVElPTl9DT01QVVRFLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZTogdHJ1ZSxcblxuICAgIC8qKlxuICAgICAqIEVYUEVSSU1FTlRBTCBGRUFUVVJFIC0tIGNhbiBiZSByZW1vdmVkL2NoYW5nZWRcbiAgICAgKiBDaGFuZ2UgdGhlIHBhcmVudCBpbnB1dCB0YXJnZXQgZWxlbWVudC5cbiAgICAgKiBJZiBOdWxsLCB0aGVuIGl0IGlzIGJlaW5nIHNldCB0aGUgdG8gbWFpbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtOdWxsfEV2ZW50VGFyZ2V0fVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dFRhcmdldDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIGZvcmNlIGFuIGlucHV0IGNsYXNzXG4gICAgICogQHR5cGUge051bGx8RnVuY3Rpb259XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0Q2xhc3M6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHJlY29nbml6ZXIgc2V0dXAgd2hlbiBjYWxsaW5nIGBIYW1tZXIoKWBcbiAgICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIgdGhlc2Ugd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKi9cbiAgICBwcmVzZXQ6IFtcbiAgICAgICAgLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgICAgIFtSb3RhdGVSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX1dLFxuICAgICAgICBbUGluY2hSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX0sIFsncm90YXRlJ11dLFxuICAgICAgICBbU3dpcGVSZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH1dLFxuICAgICAgICBbUGFuUmVjb2duaXplciwge2RpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUx9LCBbJ3N3aXBlJ11dLFxuICAgICAgICBbVGFwUmVjb2duaXplcl0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyLCB7ZXZlbnQ6ICdkb3VibGV0YXAnLCB0YXBzOiAyfSwgWyd0YXAnXV0sXG4gICAgICAgIFtQcmVzc1JlY29nbml6ZXJdXG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgd29ya2luZyBvZiBIYW1tZXIuXG4gICAgICogQWRkIHRoZW0gdG8gdGhpcyBtZXRob2QgYW5kIHRoZXkgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyLlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBjc3NQcm9wczoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAgICogT24gaU9TLCB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldCBzdWNoIGFzIGEgbGluaywgU2FmYXJpIGRpc3BsYXlzXG4gICAgICAgICAqIGEgY2FsbG91dCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGNhbGxvdXQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHpvb21pbmcgaXMgZW5hYmxlZC4gVXNlZCBieSBJRTEwPlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGFuIGVudGlyZSBlbGVtZW50IHNob3VsZCBiZSBkcmFnZ2FibGUgaW5zdGVhZCBvZiBpdHMgY29udGVudHMuIE1haW5seSBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPdmVycmlkZXMgdGhlIGhpZ2hsaWdodCBjb2xvciBzaG93biB3aGVuIHRoZSB1c2VyIHRhcHMgYSBsaW5rIG9yIGEgSmF2YVNjcmlwdFxuICAgICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdyZ2JhKDAsMCwwLDApJ1xuICAgICAgICAgKi9cbiAgICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsMCwwLDApJ1xuICAgIH1cbn07XG5cbnZhciBTVE9QID0gMTtcbnZhciBGT1JDRURfU1RPUCA9IDI7XG5cbi8qKlxuICogTWFuYWdlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgSGFtbWVyLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCA9IHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCB8fCBlbGVtZW50O1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBjcmVhdGVJbnB1dEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMudG91Y2hBY3Rpb24gPSBuZXcgVG91Y2hBY3Rpb24odGhpcywgdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKTtcblxuICAgIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIHRydWUpO1xuXG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLmFkZChuZXcgKGl0ZW1bMF0pKGl0ZW1bMV0pKTtcbiAgICAgICAgaXRlbVsyXSAmJiByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgoaXRlbVsyXSk7XG4gICAgICAgIGl0ZW1bM10gJiYgcmVjb2duaXplci5yZXF1aXJlRmFpbHVyZShpdGVtWzNdKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG4gICAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBldmVudCBsaXN0ZW5lcnMgYW5kIHJlaW5pdGlhbGl6ZVxuICAgICAgICAgICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyhpbnB1dERhdGEpO1xuXG4gICAgICAgIHZhciByZWNvZ25pemVyO1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICAgIC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgICAvLyBzbyB0aGUgcmVjb2duaXplcidzIHN0YXRlIG5lZWRzIHRvIGJlIEJFR0FOLCBDSEFOR0VELCBFTkRFRCBvciBSRUNPR05JWkVEXG4gICAgICAgIC8vIGlmIG5vIHJlY29nbml6ZXIgaXMgZGV0ZWN0aW5nIGEgdGhpbmcsIGl0IGlzIHNldCB0byBgbnVsbGBcbiAgICAgICAgdmFyIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXI7XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgICAgLy8gb3Igd2hlbiB3ZSdyZSBpbiBhIG5ldyBzZXNzaW9uXG4gICAgICAgIGlmICghY3VyUmVjb2duaXplciB8fCAoY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkpIHtcbiAgICAgICAgICAgIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVjb2duaXplciA9IHJlY29nbml6ZXJzW2ldO1xuXG4gICAgICAgICAgICAvLyBmaW5kIG91dCBpZiB3ZSBhcmUgYWxsb3dlZCB0cnkgdG8gcmVjb2duaXplIHRoZSBpbnB1dCBmb3IgdGhpcyBvbmUuXG4gICAgICAgICAgICAvLyAxLiAgIGFsbG93IGlmIHRoZSBzZXNzaW9uIGlzIE5PVCBmb3JjZWQgc3RvcHBlZCAoc2VlIHRoZSAuc3RvcCgpIG1ldGhvZClcbiAgICAgICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAgICAgLy8gICAgICB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgICAgICAvLyAzLiAgIGFsbG93IGlmIHRoZSByZWNvZ25pemVyIGlzIGFsbG93ZWQgdG8gcnVuIHNpbXVsdGFuZW91cyB3aXRoIHRoZSBjdXJyZW50IHJlY29nbml6ZWQgcmVjb2duaXplci5cbiAgICAgICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuICAgICAgICAgICAgaWYgKHNlc3Npb24uc3RvcHBlZCAhPT0gRk9SQ0VEX1NUT1AgJiYgKCAvLyAxXG4gICAgICAgICAgICAgICAgICAgICFjdXJSZWNvZ25pemVyIHx8IHJlY29nbml6ZXIgPT0gY3VyUmVjb2duaXplciB8fCAvLyAyXG4gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXIuY2FuUmVjb2duaXplV2l0aChjdXJSZWNvZ25pemVyKSkpIHsgLy8gM1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29nbml6ZXIgaGFzIGJlZW4gcmVjb2duaXppbmcgdGhlIGlucHV0IGFzIGEgdmFsaWQgZ2VzdHVyZSwgd2Ugd2FudCB0byBzdG9yZSB0aGlzIG9uZSBhcyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuICAgICAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IGEgcmVjb2duaXplciBieSBpdHMgZXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TnVsbH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdhZGQnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmdcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5nZXQocmVjb2duaXplci5vcHRpb25zLmV2ZW50KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShleGlzdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICAgIHJlY29nbml6ZXIubWFuYWdlciA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhIHJlY29nbml6ZXIgYnkgbmFtZSBvciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvZ25pemVyID0gdGhpcy5nZXQocmVjb2duaXplcik7XG5cbiAgICAgICAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoaXMgcmVjb2duaXplciBleGlzdHNcbiAgICAgICAgaWYgKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgZXZlbnQsIGxlYXZlIGVtaXQgYmxhbmsgdG8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaGFuZGxlcl1cbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gJiYgaGFuZGxlcnNbZXZlbnRdLnNwbGljZShpbkFycmF5KGhhbmRsZXJzW2V2ZW50XSwgaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGVtaXQgZXZlbnQgdG8gdGhlIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gd2UgYWxzbyB3YW50IHRvIHRyaWdnZXIgZG9tIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICAgICAgdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGhhbmRsZXJzLCBzbyBza2lwIGl0IGFsbFxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuICAgICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEudHlwZSA9IGV2ZW50O1xuICAgICAgICBkYXRhLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBkYXRhLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGFuZGxlcnNbaV0oZGF0YSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZGVzdHJveSB0aGUgbWFuYWdlciBhbmQgdW5iaW5kcyBhbGwgZXZlbnRzXG4gICAgICogaXQgZG9lc24ndCB1bmJpbmQgZG9tIGV2ZW50cywgdGhhdCBpcyB0aGUgdXNlciBvd24gcmVzcG9uc2liaWxpdHlcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ICYmIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIGFkZC9yZW1vdmUgdGhlIGNzcyBwcm9wZXJ0aWVzIGFzIGRlZmluZWQgaW4gbWFuYWdlci5vcHRpb25zLmNzc1Byb3BzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmICghZWxlbWVudC5zdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcm9wO1xuICAgIGVhY2gobWFuYWdlci5vcHRpb25zLmNzc1Byb3BzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBwcm9wID0gcHJlZml4ZWQoZWxlbWVudC5zdHlsZSwgbmFtZSk7XG4gICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWFkZCkge1xuICAgICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIHRyaWdnZXIgZG9tIGV2ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSkge1xuICAgIHZhciBnZXN0dXJlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBnZXN0dXJlRXZlbnQuaW5pdEV2ZW50KGV2ZW50LCB0cnVlLCB0cnVlKTtcbiAgICBnZXN0dXJlRXZlbnQuZ2VzdHVyZSA9IGRhdGE7XG4gICAgZGF0YS50YXJnZXQuZGlzcGF0Y2hFdmVudChnZXN0dXJlRXZlbnQpO1xufVxuXG5hc3NpZ24oSGFtbWVyLCB7XG4gICAgSU5QVVRfU1RBUlQ6IElOUFVUX1NUQVJULFxuICAgIElOUFVUX01PVkU6IElOUFVUX01PVkUsXG4gICAgSU5QVVRfRU5EOiBJTlBVVF9FTkQsXG4gICAgSU5QVVRfQ0FOQ0VMOiBJTlBVVF9DQU5DRUwsXG5cbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG5cbiAgICBESVJFQ1RJT05fTk9ORTogRElSRUNUSU9OX05PTkUsXG4gICAgRElSRUNUSU9OX0xFRlQ6IERJUkVDVElPTl9MRUZULFxuICAgIERJUkVDVElPTl9SSUdIVDogRElSRUNUSU9OX1JJR0hULFxuICAgIERJUkVDVElPTl9VUDogRElSRUNUSU9OX1VQLFxuICAgIERJUkVDVElPTl9ET1dOOiBESVJFQ1RJT05fRE9XTixcbiAgICBESVJFQ1RJT05fSE9SSVpPTlRBTDogRElSRUNUSU9OX0hPUklaT05UQUwsXG4gICAgRElSRUNUSU9OX1ZFUlRJQ0FMOiBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgRElSRUNUSU9OX0FMTDogRElSRUNUSU9OX0FMTCxcblxuICAgIE1hbmFnZXI6IE1hbmFnZXIsXG4gICAgSW5wdXQ6IElucHV0LFxuICAgIFRvdWNoQWN0aW9uOiBUb3VjaEFjdGlvbixcblxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcblxuICAgIFJlY29nbml6ZXI6IFJlY29nbml6ZXIsXG4gICAgQXR0clJlY29nbml6ZXI6IEF0dHJSZWNvZ25pemVyLFxuICAgIFRhcDogVGFwUmVjb2duaXplcixcbiAgICBQYW46IFBhblJlY29nbml6ZXIsXG4gICAgU3dpcGU6IFN3aXBlUmVjb2duaXplcixcbiAgICBQaW5jaDogUGluY2hSZWNvZ25pemVyLFxuICAgIFJvdGF0ZTogUm90YXRlUmVjb2duaXplcixcbiAgICBQcmVzczogUHJlc3NSZWNvZ25pemVyLFxuXG4gICAgb246IGFkZEV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZjogcmVtb3ZlRXZlbnRMaXN0ZW5lcnMsXG4gICAgZWFjaDogZWFjaCxcbiAgICBtZXJnZTogbWVyZ2UsXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgaW5oZXJpdDogaW5oZXJpdCxcbiAgICBiaW5kRm46IGJpbmRGbixcbiAgICBwcmVmaXhlZDogcHJlZml4ZWRcbn0pO1xuXG4vLyB0aGlzIHByZXZlbnRzIGVycm9ycyB3aGVuIEhhbW1lciBpcyBsb2FkZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRFxuLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG52YXIgZnJlZUdsb2JhbCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6ICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5mcmVlR2xvYmFsLkhhbW1lciA9IEhhbW1lcjtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbW1lcjtcbiAgICB9KTtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gSGFtbWVyO1xufSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG59XG5cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9yaWdTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMTddLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0dmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cblx0fVxufTtcblxudmFyIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25Ub1N0cih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZuQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xudmFyIGdlbkNsYXNzID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNDYWxsYWJsZSh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnByb3RvdHlwZSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRpZiAoaGFzVG9TdHJpbmdUYWcpIHsgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTsgfVxuXHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0dmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHJldHVybiBzdHJDbGFzcyA9PT0gZm5DbGFzcyB8fCBzdHJDbGFzcyA9PT0gZ2VuQ2xhc3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0Z2V0RGF5LmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNEYXRlT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgcmVnZXhFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgdHJ5UmVnZXhFeGVjQ2FsbCA9IGZ1bmN0aW9uIHRyeVJlZ2V4RXhlYyh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBsYXN0SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXg7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gMDtcblxuXHRcdHJlZ2V4RXhlYy5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHR2YWx1ZS5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKCFoYXNUb1N0cmluZ1RhZykge1xuXHRcdHJldHVybiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcblx0fVxuXG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRCh2YWx1ZSwgJ2xhc3RJbmRleCcpO1xuXHR2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHRyeVJlZ2V4RXhlY0NhbGwodmFsdWUpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG5pZiAoaGFzU3ltYm9scykge1xuXHR2YXIgc3ltVG9TdHIgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nO1xuXHR2YXIgc3ltU3RyaW5nUmVnZXggPSAvXlN5bWJvbFxcKC4qXFwpJC87XG5cdHZhciBpc1N5bWJvbE9iamVjdCA9IGZ1bmN0aW9uIGlzUmVhbFN5bWJvbE9iamVjdCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUudmFsdWVPZigpICE9PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3ltU3RyaW5nUmVnZXgudGVzdChzeW1Ub1N0ci5jYWxsKHZhbHVlKSk7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHRvU3RyLmNhbGwodmFsdWUpICE9PSAnW29iamVjdCBTeW1ib2xdJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGlzU3ltYm9sT2JqZWN0KHZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG5cdFx0Ly8gdGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFN5bWJvbHMuXG5cdFx0cmV0dXJuIGZhbHNlICYmIHZhbHVlO1xuXHR9O1xufVxuIiwidmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgTWFwLnByb3RvdHlwZTtcbnZhciBtYXBTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzTWFwID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNYXAucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBtYXBTaXplID0gaGFzTWFwICYmIG1hcFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBtYXBTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBtYXBTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIG1hcEZvckVhY2ggPSBoYXNNYXAgJiYgTWFwLnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgU2V0LnByb3RvdHlwZTtcbnZhciBzZXRTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzU2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTZXQucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBzZXRTaXplID0gaGFzU2V0ICYmIHNldFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBzZXRTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBzZXRTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIHNldEZvckVhY2ggPSBoYXNTZXQgJiYgU2V0LnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xuXG52YXIgaW5zcGVjdEN1c3RvbSA9IHJlcXVpcmUoJy4vdXRpbC5pbnNwZWN0JykuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSAoaW5zcGVjdEN1c3RvbSAmJiBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSkgPyBpbnNwZWN0Q3VzdG9tIDogbnVsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnNwZWN0XyAob2JqLCBvcHRzLCBkZXB0aCwgc2Vlbikge1xuICAgIGlmICghb3B0cykgb3B0cyA9IHt9O1xuXG4gICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpICYmIChvcHRzLnF1b3RlU3R5bGUgIT09ICdzaW5nbGUnICYmIG9wdHMucXVvdGVTdHlsZSAhPT0gJ2RvdWJsZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcInF1b3RlU3R5bGVcIiBtdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJkb3VibGVcIicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gb2JqID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcob2JqLCBvcHRzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgIHJldHVybiBJbmZpbml0eSAvIG9iaiA+IDAgPyAnMCcgOiAnLTAnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyhvYmopO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcob2JqKSArICduJztcbiAgICB9XG5cbiAgICB2YXIgbWF4RGVwdGggPSB0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyA1IDogb3B0cy5kZXB0aDtcbiAgICBpZiAodHlwZW9mIGRlcHRoID09PSAndW5kZWZpbmVkJykgZGVwdGggPSAwO1xuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCAmJiBtYXhEZXB0aCA+IDAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuICdbT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWVuID09PSAndW5kZWZpbmVkJykgc2VlbiA9IFtdO1xuICAgIGVsc2UgaWYgKGluZGV4T2Yoc2Vlbiwgb2JqKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdCAodmFsdWUsIGZyb20pIHtcbiAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgIHNlZW4gPSBzZWVuLnNsaWNlKCk7XG4gICAgICAgICAgICBzZWVuLnB1c2goZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHJldHVybiAnW0Z1bmN0aW9uJyArIChuYW1lID8gJzogJyArIG5hbWUgOiAnJykgKyAnXSc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnID8gbWFya0JveGVkKHN5bVN0cmluZykgOiBzeW1TdHJpbmc7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQob2JqKSkge1xuICAgICAgICB2YXIgcyA9ICc8JyArIFN0cmluZyhvYmoubm9kZU5hbWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSBzICs9ICcuLi4nO1xuICAgICAgICBzICs9ICc8LycgKyBTdHJpbmcob2JqLm5vZGVOYW1lKS50b0xvd2VyQ2FzZSgpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgICAgIHJldHVybiAnWyAnICsgYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpLmpvaW4oJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbJyArIFN0cmluZyhvYmopICsgJ10nO1xuICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyBwYXJ0cy5qb2luKCcsICcpICsgJyB9JztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpbnNwZWN0U3ltYm9sICYmIHR5cGVvZiBvYmpbaW5zcGVjdFN5bWJvbF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmpbaW5zcGVjdFN5bWJvbF0oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqLmluc3BlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouaW5zcGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc01hcChvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChpbnNwZWN0KGtleSwgb2JqKSArICcgPT4gJyArIGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignTWFwJywgbWFwU2l6ZS5jYWxsKG9iaiksIHBhcnRzKTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gW107XG4gICAgICAgIHNldEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSApIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdTZXQnLCBzZXRTaXplLmNhbGwob2JqKSwgcGFydHMpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB4cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICd7fSc7XG4gICAgICAgIHJldHVybiAneyAnICsgeHMuam9pbignLCAnKSArICcgfSc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBRdW90ZXMgKHMsIGRlZmF1bHRTdHlsZSwgb3B0cykge1xuICAgIHZhciBxdW90ZUNoYXIgPSAob3B0cy5xdW90ZVN0eWxlIHx8IGRlZmF1bHRTdHlsZSkgPT09ICdkb3VibGUnID8gJ1wiJyA6IFwiJ1wiO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZSAocykge1xuICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5IChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7IH1cbmZ1bmN0aW9uIGlzRGF0ZSAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXSc7IH1cbmZ1bmN0aW9uIGlzUmVnRXhwIChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nOyB9XG5mdW5jdGlvbiBpc0Vycm9yIChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXSc7IH1cbmZ1bmN0aW9uIGlzU3ltYm9sIChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN5bWJvbF0nOyB9XG5mdW5jdGlvbiBpc1N0cmluZyAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBTdHJpbmddJzsgfVxuZnVuY3Rpb24gaXNOdW1iZXIgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7IH1cbmZ1bmN0aW9uIGlzQmlnSW50IChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJpZ0ludF0nOyB9XG5mdW5jdGlvbiBpc0Jvb2xlYW4gKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nOyB9XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5IHx8IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiB0aGlzOyB9O1xuZnVuY3Rpb24gaGFzIChvYmosIGtleSkge1xuICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIGtleSk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyIChvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YgKGYpIHtcbiAgICBpZiAoZi5uYW1lKSByZXR1cm4gZi5uYW1lO1xuICAgIHZhciBtID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb25cXHMqKFtcXHckXSspLyk7XG4gICAgaWYgKG0pIHJldHVybiBtWzFdO1xufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICAgIGlmICh4cy5pbmRleE9mKSByZXR1cm4geHMuaW5kZXhPZih4KTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwICh4KSB7XG4gICAgaWYgKCFtYXBTaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0ICh4KSB7XG4gICAgaWYgKCFzZXRTaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoeCkge1xuICAgIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgeC5ub2RlTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgJiYgdHlwZW9mIHguZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nXG4gICAgO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgcyA9IHN0ci5yZXBsYWNlKC8oWydcXFxcXSkvZywgJ1xcXFwkMScpLnJlcGxhY2UoL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlIChjKSB7XG4gICAgdmFyIG4gPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHggPSB7IDg6ICdiJywgOTogJ3QnLCAxMDogJ24nLCAxMjogJ2YnLCAxMzogJ3InIH1bbl07XG4gICAgaWYgKHgpIHJldHVybiAnXFxcXCcgKyB4O1xuICAgIHJldHVybiAnXFxcXHgnICsgKG4gPCAweDEwID8gJzAnIDogJycpICsgbi50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZCAoc3RyKSB7XG4gICAgcmV0dXJuICdPYmplY3QoJyArIHN0ciArICcpJztcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbk9mICh0eXBlLCBzaXplLCBlbnRyaWVzKSB7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgZW50cmllcy5qb2luKCcsICcpICsgJ30nO1xufVxuXG5mdW5jdGlvbiBhcnJPYmpLZXlzIChvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghaGFzKG9iaiwga2V5KSkgY29udGludWU7XG4gICAgICAgIGlmIChpc0FyciAmJiBTdHJpbmcoTnVtYmVyKGtleSkpID09PSBrZXkgJiYga2V5IDwgb2JqLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgIGlmICgvW15cXHckXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHhzO1xufVxuIiwiLy8gU25hcC5zdmcgMC41LjBcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMg4oCTIDIwMTcgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4vL1xuLy8gYnVpbGQ6IDIwMTctMDItMDZcblxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vLyBcbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy8gXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIFxcXFxcbi8vIOKUgiBFdmUgMC41LjAgLSBKYXZhU2NyaXB0IEV2ZW50cyBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgIOKUgiBcXFxcXG4vLyDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQgXFxcXFxuLy8g4pSCIEF1dGhvciBEbWl0cnkgQmFyYW5vdnNraXkgKGh0dHA6Ly9kbWl0cnkuYmFyYW5vdnNraXkuY29tLykg4pSCIFxcXFxcbi8vIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCBcXFxcXG5cbihmdW5jdGlvbiAoZ2xvYikge1xuICAgIHZhciB2ZXJzaW9uID0gXCIwLjUuMFwiLFxuICAgICAgICBoYXMgPSBcImhhc093blByb3BlcnR5XCIsXG4gICAgICAgIHNlcGFyYXRvciA9IC9bXFwuXFwvXS8sXG4gICAgICAgIGNvbWFzZXBhcmF0b3IgPSAvXFxzKixcXHMqLyxcbiAgICAgICAgd2lsZGNhcmQgPSBcIipcIixcbiAgICAgICAgZnVuID0gZnVuY3Rpb24gKCkge30sXG4gICAgICAgIG51bXNvcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50X2V2ZW50LFxuICAgICAgICBzdG9wLFxuICAgICAgICBldmVudHMgPSB7bjoge319LFxuICAgICAgICBmaXJzdERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxhc3REZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgtLWkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbaV0gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ianRvcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICAgIFN0ciA9IFN0cmluZyxcbiAgICAgICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXIgaW5zdGFuY2VvZiBBcnJheSB8fCBvYmp0b3MuY2FsbChhcikgPT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBldmVcbiAgICAgWyBtZXRob2QgXVxuXG4gICAgICogRmlyZXMgZXZlbnQgd2l0aCBnaXZlbiBgbmFtZWAsIGdpdmVuIHNjb3BlIGFuZCBvdGhlciBwYXJhbWV0ZXJzLlxuXG4gICAgID4gQXJndW1lbnRzXG5cbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlICpldmVudCosIGRvdCAoYC5gKSBvciBzbGFzaCAoYC9gKSBzZXBhcmF0ZWRcbiAgICAgLSBzY29wZSAob2JqZWN0KSBjb250ZXh0IGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgLSB2YXJhcmdzICguLi4pIHRoZSByZXN0IG9mIGFyZ3VtZW50cyB3aWxsIGJlIHNlbnQgdG8gZXZlbnQgaGFuZGxlcnNcblxuICAgICA9IChvYmplY3QpIGFycmF5IG9mIHJldHVybmVkIHZhbHVlcyBmcm9tIHRoZSBsaXN0ZW5lcnMuIEFycmF5IGhhcyB0d28gbWV0aG9kcyBgLmZpcnN0RGVmaW5lZCgpYCBhbmQgYC5sYXN0RGVmaW5lZCgpYCB0byBnZXQgZmlyc3Qgb3IgbGFzdCBub3QgYHVuZGVmaW5lZGAgdmFsdWUuXG4gICAgXFwqL1xuICAgICAgICBldmUgPSBmdW5jdGlvbiAobmFtZSwgc2NvcGUpIHtcbiAgICAgICAgICAgIHZhciBlID0gZXZlbnRzLFxuICAgICAgICAgICAgICAgIG9sZHN0b3AgPSBzdG9wLFxuICAgICAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgICAgICAgICAgIGxpc3RlbmVycyA9IGV2ZS5saXN0ZW5lcnMobmFtZSksXG4gICAgICAgICAgICAgICAgeiA9IDAsXG4gICAgICAgICAgICAgICAgZiA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIGwsXG4gICAgICAgICAgICAgICAgaW5kZXhlZCA9IFtdLFxuICAgICAgICAgICAgICAgIHF1ZXVlID0ge30sXG4gICAgICAgICAgICAgICAgb3V0ID0gW10sXG4gICAgICAgICAgICAgICAgY2UgPSBjdXJyZW50X2V2ZW50LFxuICAgICAgICAgICAgICAgIGVycm9ycyA9IFtdO1xuICAgICAgICAgICAgb3V0LmZpcnN0RGVmaW5lZCA9IGZpcnN0RGVmaW5lZDtcbiAgICAgICAgICAgIG91dC5sYXN0RGVmaW5lZCA9IGxhc3REZWZpbmVkO1xuICAgICAgICAgICAgY3VycmVudF9ldmVudCA9IG5hbWU7XG4gICAgICAgICAgICBzdG9wID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSBpZiAoXCJ6SW5kZXhcIiBpbiBsaXN0ZW5lcnNbaV0pIHtcbiAgICAgICAgICAgICAgICBpbmRleGVkLnB1c2gobGlzdGVuZXJzW2ldLnpJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS56SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlW2xpc3RlbmVyc1tpXS56SW5kZXhdID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4ZWQuc29ydChudW1zb3J0KTtcbiAgICAgICAgICAgIHdoaWxlIChpbmRleGVkW3pdIDwgMCkge1xuICAgICAgICAgICAgICAgIGwgPSBxdWV1ZVtpbmRleGVkW3orK11dO1xuICAgICAgICAgICAgICAgIG91dC5wdXNoKGwuYXBwbHkoc2NvcGUsIGFyZ3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9wID0gb2xkc3RvcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIGwgPSBsaXN0ZW5lcnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKFwiekluZGV4XCIgaW4gbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobC56SW5kZXggPT0gaW5kZXhlZFt6XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2gobC5hcHBseShzY29wZSwgYXJncykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHF1ZXVlW2luZGV4ZWRbel1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgJiYgb3V0LnB1c2gobC5hcHBseShzY29wZSwgYXJncykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGwpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZVtsLnpJbmRleF0gPSBsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2gobC5hcHBseShzY29wZSwgYXJncykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9wID0gb2xkc3RvcDtcbiAgICAgICAgICAgIGN1cnJlbnRfZXZlbnQgPSBjZTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFVuZG9jdW1lbnRlZC4gRGVidWcgb25seS5cbiAgICAgICAgZXZlLl9ldmVudHMgPSBldmVudHM7XG4gICAgLypcXFxuICAgICAqIGV2ZS5saXN0ZW5lcnNcbiAgICAgWyBtZXRob2QgXVxuXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHdoaWNoIGdpdmVzIHlvdSBhcnJheSBvZiBhbGwgZXZlbnQgaGFuZGxlcnMgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBieSB0aGUgZ2l2ZW4gYG5hbWVgLlxuXG4gICAgID4gQXJndW1lbnRzXG5cbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkXG5cbiAgICAgPSAoYXJyYXkpIGFycmF5IG9mIGV2ZW50IGhhbmRsZXJzXG4gICAgXFwqL1xuICAgIGV2ZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IG5hbWUuc3BsaXQoc2VwYXJhdG9yKSxcbiAgICAgICAgICAgIGUgPSBldmVudHMsXG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIGpqLFxuICAgICAgICAgICAgbmVzLFxuICAgICAgICAgICAgZXMgPSBbZV0sXG4gICAgICAgICAgICBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBuZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gZXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIGUgPSBlc1tqXS5uO1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gW2VbbmFtZXNbaV1dLCBlW3dpbGRjYXJkXV07XG4gICAgICAgICAgICAgICAgayA9IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGstLSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbXNba107XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQoaXRlbS5mIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVzID0gbmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogZXZlLnNlcGFyYXRvclxuICAgICBbIG1ldGhvZCBdXG5cbiAgICAgKiBJZiBmb3Igc29tZSByZWFzb25zIHlvdSBkb27igJl0IGxpa2UgZGVmYXVsdCBzZXBhcmF0b3JzIChgLmAgb3IgYC9gKSB5b3UgY2FuIHNwZWNpZnkgeW91cnNcbiAgICAgKiBoZXJlLiBCZSBhd2FyZSB0aGF0IGlmIHlvdSBwYXNzIGEgc3RyaW5nIGxvbmdlciB0aGFuIG9uZSBjaGFyYWN0ZXIgaXQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgICogYSBsaXN0IG9mIGNoYXJhY3RlcnMuXG5cbiAgICAgLSBzZXBhcmF0b3IgKHN0cmluZykgbmV3IHNlcGFyYXRvci4gRW1wdHkgc3RyaW5nIHJlc2V0cyB0byBkZWZhdWx0OiBgLmAgb3IgYC9gLlxuICAgIFxcKi9cbiAgICBldmUuc2VwYXJhdG9yID0gZnVuY3Rpb24gKHNlcCkge1xuICAgICAgICBpZiAoc2VwKSB7XG4gICAgICAgICAgICBzZXAgPSBTdHIoc2VwKS5yZXBsYWNlKC8oPz1bXFwuXFxeXFxdXFxbXFwtXSkvZywgXCJcXFxcXCIpO1xuICAgICAgICAgICAgc2VwID0gXCJbXCIgKyBzZXAgKyBcIl1cIjtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IG5ldyBSZWdFeHAoc2VwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IC9bXFwuXFwvXS87XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBldmUub25cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEJpbmRzIGdpdmVuIGV2ZW50IGhhbmRsZXIgd2l0aCBhIGdpdmVuIG5hbWUuIFlvdSBjYW4gdXNlIHdpbGRjYXJkcyDigJxgKmDigJ0gZm9yIHRoZSBuYW1lczpcbiAgICAgfCBldmUub24oXCIqLnVuZGVyLipcIiwgZik7XG4gICAgIHwgZXZlKFwibW91c2UudW5kZXIuZmxvb3JcIik7IC8vIHRyaWdnZXJzIGZcbiAgICAgKiBVc2UgQGV2ZSB0byB0cmlnZ2VyIHRoZSBsaXN0ZW5lci5cbiAgICAgKipcbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkLCB3aXRoIG9wdGlvbmFsIHdpbGRjYXJkc1xuICAgICAtIGYgKGZ1bmN0aW9uKSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICoqXG4gICAgIC0gbmFtZSAoYXJyYXkpIGlmIHlvdSBkb27igJl0IHdhbnQgdG8gdXNlIHNlcGFyYXRvcnMsIHlvdSBjYW4gdXNlIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgLSBmIChmdW5jdGlvbikgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqKlxuICAgICA9IChmdW5jdGlvbikgcmV0dXJuZWQgZnVuY3Rpb24gYWNjZXB0cyBhIHNpbmdsZSBudW1lcmljIHBhcmFtZXRlciB0aGF0IHJlcHJlc2VudHMgei1pbmRleCBvZiB0aGUgaGFuZGxlci4gSXQgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBhbmQgb25seSB1c2VkIHdoZW4geW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgc29tZSBzdWJzZXQgb2YgaGFuZGxlcnMgd2lsbCBiZSBpbnZva2VkIGluIGEgZ2l2ZW4gb3JkZXIsIGRlc3BpdGUgb2YgdGhlIG9yZGVyIG9mIGFzc2lnbm1lbnQuIFxuICAgICA+IEV4YW1wbGU6XG4gICAgIHwgZXZlLm9uKFwibW91c2VcIiwgZWF0SXQpKDIpO1xuICAgICB8IGV2ZS5vbihcIm1vdXNlXCIsIHNjcmVhbSk7XG4gICAgIHwgZXZlLm9uKFwibW91c2VcIiwgY2F0Y2hJdCkoMSk7XG4gICAgICogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IGBjYXRjaEl0YCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYGVhdEl0YC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIHB1dCB5b3VyIGhhbmRsZXIgYmVmb3JlIG5vbi1pbmRleGVkIGhhbmRsZXJzLCBzcGVjaWZ5IGEgbmVnYXRpdmUgdmFsdWUuXG4gICAgICogTm90ZTogSSBhc3N1bWUgbW9zdCBvZiB0aGUgdGltZSB5b3UgZG9u4oCZdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHotaW5kZXgsIGJ1dCBpdOKAmXMgbmljZSB0byBoYXZlIHRoaXMgZmVhdHVyZSDigJxqdXN0IGluIGNhc2XigJ0uXG4gICAgXFwqL1xuICAgIGV2ZS5vbiA9IGZ1bmN0aW9uIChuYW1lLCBmKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZiAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gKGlzQXJyYXkobmFtZVswXSkgPyBuYW1lIDogW25hbWVdKSA6IFN0cihuYW1lKS5zcGxpdChjb21hc2VwYXJhdG9yKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVzID0gaXNBcnJheShuYW1lKSA/IG5hbWUgOiBTdHIobmFtZSkuc3BsaXQoc2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3Q7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmFtZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBlID0gZS5uO1xuICAgICAgICAgICAgICAgICAgICBlID0gZS5oYXNPd25Qcm9wZXJ0eShuYW1lc1tpXSkgJiYgZVtuYW1lc1tpXV0gfHwgKGVbbmFtZXNbaV1dID0ge246IHt9fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUuZiA9IGUuZiB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGUuZi5sZW5ndGg7IGkgPCBpaTsgaSsrKSBpZiAoZS5mW2ldID09IGYpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIWV4aXN0ICYmIGUuZi5wdXNoKGYpO1xuICAgICAgICAgICAgfShuYW1lc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoekluZGV4KSB7XG4gICAgICAgICAgICBpZiAoK3pJbmRleCA9PSArekluZGV4KSB7XG4gICAgICAgICAgICAgICAgZi56SW5kZXggPSArekluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5mXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBmaXJlIGdpdmVuIGV2ZW50IHdpdGggb3B0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqIEFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZXN1bHQgZnVuY3Rpb24gd2lsbCBiZSBhbHNvXG4gICAgICogY29uY2F0ZWQgdG8gdGhlIGxpc3Qgb2YgZmluYWwgYXJndW1lbnRzLlxuICAgICB8IGVsLm9uY2xpY2sgPSBldmUuZihcImNsaWNrXCIsIDEsIDIpO1xuICAgICB8IGV2ZS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgIHwgICAgIGNvbnNvbGUubG9nKGEsIGIsIGMpOyAvLyAxLCAyLCBbZXZlbnQgb2JqZWN0XVxuICAgICB8IH0pO1xuICAgICA+IEFyZ3VtZW50c1xuICAgICAtIGV2ZW50IChzdHJpbmcpIGV2ZW50IG5hbWVcbiAgICAgLSB2YXJhcmdzICjigKYpIGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzXG4gICAgID0gKGZ1bmN0aW9uKSBwb3NzaWJsZSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgXFwqL1xuICAgIGV2ZS5mID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBhdHRycyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV2ZS5hcHBseShudWxsLCBbZXZlbnQsIG51bGxdLmNvbmNhdChhdHRycykuY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSkpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5zdG9wXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBJcyB1c2VkIGluc2lkZSBhbiBldmVudCBoYW5kbGVyIHRvIHN0b3AgdGhlIGV2ZW50LCBwcmV2ZW50aW5nIGFueSBzdWJzZXF1ZW50IGxpc3RlbmVycyBmcm9tIGZpcmluZy5cbiAgICBcXCovXG4gICAgZXZlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3AgPSAxO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5udFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQ291bGQgYmUgdXNlZCBpbnNpZGUgZXZlbnQgaGFuZGxlciB0byBmaWd1cmUgb3V0IGFjdHVhbCBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKipcbiAgICAgPiBBcmd1bWVudHNcbiAgICAgKipcbiAgICAgLSBzdWJuYW1lIChzdHJpbmcpICNvcHRpb25hbCBzdWJuYW1lIG9mIHRoZSBldmVudFxuICAgICAqKlxuICAgICA9IChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBpZiBgc3VibmFtZWAgaXMgbm90IHNwZWNpZmllZFxuICAgICAqIG9yXG4gICAgID0gKGJvb2xlYW4pIGB0cnVlYCwgaWYgY3VycmVudCBldmVudOKAmXMgbmFtZSBjb250YWlucyBgc3VibmFtZWBcbiAgICBcXCovXG4gICAgZXZlLm50ID0gZnVuY3Rpb24gKHN1Ym5hbWUpIHtcbiAgICAgICAgdmFyIGN1ciA9IGlzQXJyYXkoY3VycmVudF9ldmVudCkgPyBjdXJyZW50X2V2ZW50LmpvaW4oXCIuXCIpIDogY3VycmVudF9ldmVudDtcbiAgICAgICAgaWYgKHN1Ym5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86XFxcXC58XFxcXC98XilcIiArIHN1Ym5hbWUgKyBcIig/OlxcXFwufFxcXFwvfCQpXCIpLnRlc3QoY3VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5udHNcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENvdWxkIGJlIHVzZWQgaW5zaWRlIGV2ZW50IGhhbmRsZXIgdG8gZmlndXJlIG91dCBhY3R1YWwgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICoqXG4gICAgICoqXG4gICAgID0gKGFycmF5KSBuYW1lcyBvZiB0aGUgZXZlbnRcbiAgICBcXCovXG4gICAgZXZlLm50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkoY3VycmVudF9ldmVudCkgPyBjdXJyZW50X2V2ZW50IDogY3VycmVudF9ldmVudC5zcGxpdChzZXBhcmF0b3IpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5vZmZcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgZ2l2ZW4gZnVuY3Rpb24gZnJvbSB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgYXNzaWduZWQgdG8gZ2l2ZW4gbmFtZS5cbiAgICAgKiBJZiBubyBhcmd1bWVudHMgc3BlY2lmaWVkIGFsbCB0aGUgZXZlbnRzIHdpbGwgYmUgY2xlYXJlZC5cbiAgICAgKipcbiAgICAgPiBBcmd1bWVudHNcbiAgICAgKipcbiAgICAgLSBuYW1lIChzdHJpbmcpIG5hbWUgb2YgdGhlIGV2ZW50LCBkb3QgKGAuYCkgb3Igc2xhc2ggKGAvYCkgc2VwYXJhdGVkLCB3aXRoIG9wdGlvbmFsIHdpbGRjYXJkc1xuICAgICAtIGYgKGZ1bmN0aW9uKSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBldmUudW5iaW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBTZWUgQGV2ZS5vZmZcbiAgICBcXCovXG4gICAgZXZlLm9mZiA9IGV2ZS51bmJpbmQgPSBmdW5jdGlvbiAobmFtZSwgZikge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIGV2ZS5fZXZlbnRzID0gZXZlbnRzID0ge246IHt9fTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gKGlzQXJyYXkobmFtZVswXSkgPyBuYW1lIDogW25hbWVdKSA6IFN0cihuYW1lKS5zcGxpdChjb21hc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBldmUub2ZmKG5hbWVzW2ldLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBuYW1lcyA9IGlzQXJyYXkobmFtZSkgPyBuYW1lIDogU3RyKG5hbWUpLnNwbGl0KHNlcGFyYXRvcik7XG4gICAgICAgIHZhciBlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc3BsaWNlLFxuICAgICAgICAgICAgaSwgaWksIGosIGpqLFxuICAgICAgICAgICAgY3VyID0gW2V2ZW50c10sXG4gICAgICAgICAgICBpbm9kZXMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3VyLmxlbmd0aDsgaiArPSBzcGxpY2UubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgIHNwbGljZSA9IFtqLCAxXTtcbiAgICAgICAgICAgICAgICBlID0gY3VyW2pdLm47XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVzW2ldICE9IHdpbGRjYXJkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlW25hbWVzW2ldXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlLnB1c2goZVtuYW1lc1tpXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGVzLnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG46IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZXNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gZSkgaWYgKGVbaGFzXShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UucHVzaChlW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGVzLnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG46IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXIuc3BsaWNlLmFwcGx5KGN1ciwgc3BsaWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGN1ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBlID0gY3VyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGUubikge1xuICAgICAgICAgICAgICAgIGlmIChmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gZS5mLmxlbmd0aDsgaiA8IGpqOyBqKyspIGlmIChlLmZbal0gPT0gZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZi5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAhZS5mLmxlbmd0aCAmJiBkZWxldGUgZS5mO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGUubikgaWYgKGUubltoYXNdKGtleSkgJiYgZS5uW2tleV0uZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gZS5uW2tleV0uZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gZnVuY3MubGVuZ3RoOyBqIDwgamo7IGorKykgaWYgKGZ1bmNzW2pdID09IGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3MubGVuZ3RoICYmIGRlbGV0ZSBlLm5ba2V5XS5mO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUuZjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gZS5uKSBpZiAoZS5uW2hhc10oa2V5KSAmJiBlLm5ba2V5XS5mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZS5uW2tleV0uZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlID0gZS5uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHBydW5lIGlubmVyIG5vZGVzIGluIHBhdGhcbiAgICAgICAgcHJ1bmU6IGZvciAoaSA9IDAsIGlpID0gaW5vZGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGUgPSBpbm9kZXNbaV07XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBlLm5bZS5uYW1lXS5mKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90IGVtcHR5IChoYXMgbGlzdGVuZXJzKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlIHBydW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChrZXkgaW4gZS5uW2UubmFtZV0ubikge1xuICAgICAgICAgICAgICAgIC8vIG5vdCBlbXB0eSAoaGFzIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlIHBydW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaXMgZW1wdHlcbiAgICAgICAgICAgIGRlbGV0ZSBlLm5bZS5uYW1lXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLypcXFxuICAgICAqIGV2ZS5vbmNlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBCaW5kcyBnaXZlbiBldmVudCBoYW5kbGVyIHdpdGggYSBnaXZlbiBuYW1lIHRvIG9ubHkgcnVuIG9uY2UgdGhlbiB1bmJpbmQgaXRzZWxmLlxuICAgICB8IGV2ZS5vbmNlKFwibG9naW5cIiwgZik7XG4gICAgIHwgZXZlKFwibG9naW5cIik7IC8vIHRyaWdnZXJzIGZcbiAgICAgfCBldmUoXCJsb2dpblwiKTsgLy8gbm8gbGlzdGVuZXJzXG4gICAgICogVXNlIEBldmUgdG8gdHJpZ2dlciB0aGUgbGlzdGVuZXIuXG4gICAgICoqXG4gICAgID4gQXJndW1lbnRzXG4gICAgICoqXG4gICAgIC0gbmFtZSAoc3RyaW5nKSBuYW1lIG9mIHRoZSBldmVudCwgZG90IChgLmApIG9yIHNsYXNoIChgL2ApIHNlcGFyYXRlZCwgd2l0aCBvcHRpb25hbCB3aWxkY2FyZHNcbiAgICAgLSBmIChmdW5jdGlvbikgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqKlxuICAgICA9IChmdW5jdGlvbikgc2FtZSByZXR1cm4gZnVuY3Rpb24gYXMgQGV2ZS5vblxuICAgIFxcKi9cbiAgICBldmUub25jZSA9IGZ1bmN0aW9uIChuYW1lLCBmKSB7XG4gICAgICAgIHZhciBmMiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV2ZS5vZmYobmFtZSwgZjIpO1xuICAgICAgICAgICAgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGV2ZS5vbihuYW1lLCBmMik7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogZXZlLnZlcnNpb25cbiAgICAgWyBwcm9wZXJ0eSAoc3RyaW5nKSBdXG4gICAgICoqXG4gICAgICogQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LlxuICAgIFxcKi9cbiAgICBldmUudmVyc2lvbiA9IHZlcnNpb247XG4gICAgZXZlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJZb3UgYXJlIHJ1bm5pbmcgRXZlIFwiICsgdmVyc2lvbjtcbiAgICB9O1xuICAgICh0eXBlb2YgbW9kdWxlICE9IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpID8gKG1vZHVsZS5leHBvcnRzID0gZXZlKSA6ICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCA/IChkZWZpbmUoXCJldmVcIiwgW10sIGZ1bmN0aW9uKCkgeyByZXR1cm4gZXZlOyB9KSkgOiAoZ2xvYi5ldmUgPSBldmUpKTtcbn0pKHRoaXMpO1xuXG4oZnVuY3Rpb24gKGdsb2IsIGZhY3RvcnkpIHtcbiAgICAvLyBBTUQgc3VwcG9ydFxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIERlZmluZSBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlXG4gICAgICAgIGRlZmluZShbXCJldmVcIl0sIGZ1bmN0aW9uIChldmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KGdsb2IsIGV2ZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBOZXh0IGZvciBOb2RlLmpzIG9yIENvbW1vbkpTXG4gICAgICAgIHZhciBldmUgPSByZXF1aXJlKFwiZXZlXCIpO1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoZ2xvYiwgZXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKGdsb2IgaXMgd2luZG93KVxuICAgICAgICAvLyBTbmFwIGFkZHMgaXRzZWxmIHRvIHdpbmRvd1xuICAgICAgICBmYWN0b3J5KGdsb2IsIGdsb2IuZXZlKTtcbiAgICB9XG59KHdpbmRvdyB8fCB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBldmUpIHtcblxuLy8gQ29weXJpZ2h0IChjKSAyMDE3IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxudmFyIG1pbmEgPSAoZnVuY3Rpb24gKGV2ZSkge1xuICAgIHZhciBhbmltYXRpb25zID0ge30sXG4gICAgcmVxdWVzdEFuaW1GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgICAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICB8fFxuICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDE2LCBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICByZXF1ZXN0SUQsXG4gICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpID09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICB9LFxuICAgIGlkZ2VuID0gMCxcbiAgICBpZHByZWZpeCA9IFwiTVwiICsgKCtuZXcgRGF0ZSkudG9TdHJpbmcoMzYpLFxuICAgIElEID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaWRwcmVmaXggKyAoaWRnZW4rKykudG9TdHJpbmcoMzYpO1xuICAgIH0sXG4gICAgZGlmZiA9IGZ1bmN0aW9uIChhLCBiLCBBLCBCKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGEpKSB7XG4gICAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc1tpXSA9IGRpZmYoYVtpXSwgYiwgQVtpXSwgQik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWYgPSAoQSAtIGEpIC8gKEIgLSBiKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChiYikge1xuICAgICAgICAgICAgcmV0dXJuIGEgKyBkaWYgKiAoYmIgLSBiKTtcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHRpbWVyID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gK25ldyBEYXRlO1xuICAgIH0sXG4gICAgc3RhID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YXIgYSA9IHRoaXM7XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGEucztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHMgPSBhLnMgLSB2YWw7XG4gICAgICAgIGEuYiArPSBhLmR1ciAqIGRzO1xuICAgICAgICBhLkIgKz0gYS5kdXIgKiBkcztcbiAgICAgICAgYS5zID0gdmFsO1xuICAgIH0sXG4gICAgc3BlZWQgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHZhciBhID0gdGhpcztcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5zcGQ7XG4gICAgICAgIH1cbiAgICAgICAgYS5zcGQgPSB2YWw7XG4gICAgfSxcbiAgICBkdXJhdGlvbiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzO1xuICAgICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmR1cjtcbiAgICAgICAgfVxuICAgICAgICBhLnMgPSBhLnMgKiB2YWwgLyBhLmR1cjtcbiAgICAgICAgYS5kdXIgPSB2YWw7XG4gICAgfSxcbiAgICBzdG9waXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhID0gdGhpcztcbiAgICAgICAgZGVsZXRlIGFuaW1hdGlvbnNbYS5pZF07XG4gICAgICAgIGEudXBkYXRlKCk7XG4gICAgICAgIGV2ZShcIm1pbmEuc3RvcC5cIiArIGEuaWQsIGEpO1xuICAgIH0sXG4gICAgcGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhID0gdGhpcztcbiAgICAgICAgaWYgKGEucGRpZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBhbmltYXRpb25zW2EuaWRdO1xuICAgICAgICBhLnVwZGF0ZSgpO1xuICAgICAgICBhLnBkaWYgPSBhLmdldCgpIC0gYS5iO1xuICAgIH0sXG4gICAgcmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYSA9IHRoaXM7XG4gICAgICAgIGlmICghYS5wZGlmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYS5iID0gYS5nZXQoKSAtIGEucGRpZjtcbiAgICAgICAgZGVsZXRlIGEucGRpZjtcbiAgICAgICAgYW5pbWF0aW9uc1thLmlkXSA9IGE7XG4gICAgICAgIGZyYW1lKCk7XG4gICAgfSxcbiAgICB1cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhID0gdGhpcyxcbiAgICAgICAgICAgIHJlcztcbiAgICAgICAgaWYgKGlzQXJyYXkoYS5zdGFydCkpIHtcbiAgICAgICAgICAgIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gYS5zdGFydC5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICAgICAgcmVzW2pdID0gK2Euc3RhcnRbal0gK1xuICAgICAgICAgICAgICAgICAgICAoYS5lbmRbal0gLSBhLnN0YXJ0W2pdKSAqIGEuZWFzaW5nKGEucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSArYS5zdGFydCArIChhLmVuZCAtIGEuc3RhcnQpICogYS5lYXNpbmcoYS5zKTtcbiAgICAgICAgfVxuICAgICAgICBhLnNldChyZXMpO1xuICAgIH0sXG4gICAgZnJhbWUgPSBmdW5jdGlvbiAodGltZVN0YW1wKSB7XG4gICAgICAgIC8vIE1hbnVhbCBpbnZva2F0aW9uP1xuICAgICAgICBpZiAoIXRpbWVTdGFtcCkge1xuICAgICAgICAgICAgLy8gRnJhbWUgbG9vcCBzdG9wcGVkP1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0SUQpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBmcmFtZSBsb29wLi4uXG4gICAgICAgICAgICAgICAgcmVxdWVzdElEID0gcmVxdWVzdEFuaW1GcmFtZShmcmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYW5pbWF0aW9ucykgaWYgKGFuaW1hdGlvbnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIHZhciBhID0gYW5pbWF0aW9uc1tpXSxcbiAgICAgICAgICAgICAgICBiID0gYS5nZXQoKSxcbiAgICAgICAgICAgICAgICByZXM7XG4gICAgICAgICAgICBsZW4rKztcbiAgICAgICAgICAgIGEucyA9IChiIC0gYS5iKSAvIChhLmR1ciAvIGEuc3BkKTtcbiAgICAgICAgICAgIGlmIChhLnMgPj0gMSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhbmltYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgIGEucyA9IDE7XG4gICAgICAgICAgICAgICAgbGVuLS07XG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlKFwibWluYS5maW5pc2guXCIgKyBhLmlkLCBhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfShhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RJRCA9IGxlbiA/IHJlcXVlc3RBbmltRnJhbWUoZnJhbWUpIDogZmFsc2U7XG4gICAgfSxcbiAgICAvKlxcXG4gICAgICogbWluYVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogR2VuZXJpYyBhbmltYXRpb24gb2YgbnVtYmVyc1xuICAgICAqKlxuICAgICAtIGEgKG51bWJlcikgc3RhcnQgX3NsYXZlXyBudW1iZXJcbiAgICAgLSBBIChudW1iZXIpIGVuZCBfc2xhdmVfIG51bWJlclxuICAgICAtIGIgKG51bWJlcikgc3RhcnQgX21hc3Rlcl8gbnVtYmVyIChzdGFydCB0aW1lIGluIGdlbmVyYWwgY2FzZSlcbiAgICAgLSBCIChudW1iZXIpIGVuZCBfbWFzdGVyXyBudW1iZXIgKGVuZCB0aW1lIGluIGdlbmVyYWwgY2FzZSlcbiAgICAgLSBnZXQgKGZ1bmN0aW9uKSBnZXR0ZXIgb2YgX21hc3Rlcl8gbnVtYmVyIChzZWUgQG1pbmEudGltZSlcbiAgICAgLSBzZXQgKGZ1bmN0aW9uKSBzZXR0ZXIgb2YgX3NsYXZlXyBudW1iZXJcbiAgICAgLSBlYXNpbmcgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0IGlzIEBtaW5hLmxpbmVhclxuICAgICA9IChvYmplY3QpIGFuaW1hdGlvbiBkZXNjcmlwdG9yXG4gICAgIG8ge1xuICAgICBvICAgICAgICAgaWQgKHN0cmluZykgYW5pbWF0aW9uIGlkLFxuICAgICBvICAgICAgICAgc3RhcnQgKG51bWJlcikgc3RhcnQgX3NsYXZlXyBudW1iZXIsXG4gICAgIG8gICAgICAgICBlbmQgKG51bWJlcikgZW5kIF9zbGF2ZV8gbnVtYmVyLFxuICAgICBvICAgICAgICAgYiAobnVtYmVyKSBzdGFydCBfbWFzdGVyXyBudW1iZXIsXG4gICAgIG8gICAgICAgICBzIChudW1iZXIpIGFuaW1hdGlvbiBzdGF0dXMgKDAuLjEpLFxuICAgICBvICAgICAgICAgZHVyIChudW1iZXIpIGFuaW1hdGlvbiBkdXJhdGlvbixcbiAgICAgbyAgICAgICAgIHNwZCAobnVtYmVyKSBhbmltYXRpb24gc3BlZWQsXG4gICAgIG8gICAgICAgICBnZXQgKGZ1bmN0aW9uKSBnZXR0ZXIgb2YgX21hc3Rlcl8gbnVtYmVyIChzZWUgQG1pbmEudGltZSksXG4gICAgIG8gICAgICAgICBzZXQgKGZ1bmN0aW9uKSBzZXR0ZXIgb2YgX3NsYXZlXyBudW1iZXIsXG4gICAgIG8gICAgICAgICBlYXNpbmcgKGZ1bmN0aW9uKSBlYXNpbmcgZnVuY3Rpb24sIGRlZmF1bHQgaXMgQG1pbmEubGluZWFyLFxuICAgICBvICAgICAgICAgc3RhdHVzIChmdW5jdGlvbikgc3RhdHVzIGdldHRlci9zZXR0ZXIsXG4gICAgIG8gICAgICAgICBzcGVlZCAoZnVuY3Rpb24pIHNwZWVkIGdldHRlci9zZXR0ZXIsXG4gICAgIG8gICAgICAgICBkdXJhdGlvbiAoZnVuY3Rpb24pIGR1cmF0aW9uIGdldHRlci9zZXR0ZXIsXG4gICAgIG8gICAgICAgICBzdG9wIChmdW5jdGlvbikgYW5pbWF0aW9uIHN0b3BwZXJcbiAgICAgbyAgICAgICAgIHBhdXNlIChmdW5jdGlvbikgcGF1c2VzIHRoZSBhbmltYXRpb25cbiAgICAgbyAgICAgICAgIHJlc3VtZSAoZnVuY3Rpb24pIHJlc3VtZXMgdGhlIGFuaW1hdGlvblxuICAgICBvICAgICAgICAgdXBkYXRlIChmdW5jdGlvbikgY2FsbGVzIHNldHRlciB3aXRoIHRoZSByaWdodCB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uXG4gICAgIG8gfVxuICAgIFxcKi9cbiAgICBtaW5hID0gZnVuY3Rpb24gKGEsIEEsIGIsIEIsIGdldCwgc2V0LCBlYXNpbmcpIHtcbiAgICAgICAgdmFyIGFuaW0gPSB7XG4gICAgICAgICAgICBpZDogSUQoKSxcbiAgICAgICAgICAgIHN0YXJ0OiBhLFxuICAgICAgICAgICAgZW5kOiBBLFxuICAgICAgICAgICAgYjogYixcbiAgICAgICAgICAgIHM6IDAsXG4gICAgICAgICAgICBkdXI6IEIgLSBiLFxuICAgICAgICAgICAgc3BkOiAxLFxuICAgICAgICAgICAgZ2V0OiBnZXQsXG4gICAgICAgICAgICBzZXQ6IHNldCxcbiAgICAgICAgICAgIGVhc2luZzogZWFzaW5nIHx8IG1pbmEubGluZWFyLFxuICAgICAgICAgICAgc3RhdHVzOiBzdGEsXG4gICAgICAgICAgICBzcGVlZDogc3BlZWQsXG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICBzdG9wOiBzdG9waXQsXG4gICAgICAgICAgICBwYXVzZTogcGF1c2UsXG4gICAgICAgICAgICByZXN1bWU6IHJlc3VtZSxcbiAgICAgICAgICAgIHVwZGF0ZTogdXBkYXRlXG4gICAgICAgIH07XG4gICAgICAgIGFuaW1hdGlvbnNbYW5pbS5pZF0gPSBhbmltO1xuICAgICAgICB2YXIgbGVuID0gMCwgaTtcbiAgICAgICAgZm9yIChpIGluIGFuaW1hdGlvbnMpIGlmIChhbmltYXRpb25zLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBsZW4rKztcbiAgICAgICAgICAgIGlmIChsZW4gPT0gMikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxlbiA9PSAxICYmIGZyYW1lKCk7XG4gICAgICAgIHJldHVybiBhbmltO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIG1pbmEudGltZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lLiBFcXVpdmFsZW50IHRvOlxuICAgICB8IGZ1bmN0aW9uICgpIHtcbiAgICAgfCAgICAgcmV0dXJuIChuZXcgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICB8IH1cbiAgICBcXCovXG4gICAgbWluYS50aW1lID0gdGltZXI7XG4gICAgLypcXFxuICAgICAqIG1pbmEuZ2V0QnlJZFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBhbiBhbmltYXRpb24gYnkgaXRzIGlkXG4gICAgIC0gaWQgKHN0cmluZykgYW5pbWF0aW9uJ3MgaWRcbiAgICAgPSAob2JqZWN0KSBTZWUgQG1pbmFcbiAgICBcXCovXG4gICAgbWluYS5nZXRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiBhbmltYXRpb25zW2lkXSB8fCBudWxsO1xuICAgIH07XG5cbiAgICAvKlxcXG4gICAgICogbWluYS5saW5lYXJcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIERlZmF1bHQgbGluZWFyIGVhc2luZ1xuICAgICAtIG4gKG51bWJlcikgaW5wdXQgMC4uMVxuICAgICA9IChudW1iZXIpIG91dHB1dCAwLi4xXG4gICAgXFwqL1xuICAgIG1pbmEubGluZWFyID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogbWluYS5lYXNlb3V0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBFYXNlb3V0IGVhc2luZ1xuICAgICAtIG4gKG51bWJlcikgaW5wdXQgMC4uMVxuICAgICA9IChudW1iZXIpIG91dHB1dCAwLi4xXG4gICAgXFwqL1xuICAgIG1pbmEuZWFzZW91dCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdyhuLCAxLjcpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIG1pbmEuZWFzZWluXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBFYXNlaW4gZWFzaW5nXG4gICAgIC0gbiAobnVtYmVyKSBpbnB1dCAwLi4xXG4gICAgID0gKG51bWJlcikgb3V0cHV0IDAuLjFcbiAgICBcXCovXG4gICAgbWluYS5lYXNlaW4gPSBmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gTWF0aC5wb3cobiwgLjQ4KTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBtaW5hLmVhc2Vpbm91dFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRWFzZWlub3V0IGVhc2luZ1xuICAgICAtIG4gKG51bWJlcikgaW5wdXQgMC4uMVxuICAgICA9IChudW1iZXIpIG91dHB1dCAwLi4xXG4gICAgXFwqL1xuICAgIG1pbmEuZWFzZWlub3V0ID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKG4gPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHEgPSAuNDggLSBuIC8gMS4wNCxcbiAgICAgICAgICAgIFEgPSBNYXRoLnNxcnQoLjE3MzQgKyBxICogcSksXG4gICAgICAgICAgICB4ID0gUSAtIHEsXG4gICAgICAgICAgICBYID0gTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKSAqICh4IDwgMCA/IC0xIDogMSksXG4gICAgICAgICAgICB5ID0gLVEgLSBxLFxuICAgICAgICAgICAgWSA9IE1hdGgucG93KE1hdGguYWJzKHkpLCAxIC8gMykgKiAoeSA8IDAgPyAtMSA6IDEpLFxuICAgICAgICAgICAgdCA9IFggKyBZICsgLjU7XG4gICAgICAgIHJldHVybiAoMSAtIHQpICogMyAqIHQgKiB0ICsgdCAqIHQgKiB0O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIG1pbmEuYmFja2luXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBCYWNraW4gZWFzaW5nXG4gICAgIC0gbiAobnVtYmVyKSBpbnB1dCAwLi4xXG4gICAgID0gKG51bWJlcikgb3V0cHV0IDAuLjFcbiAgICBcXCovXG4gICAgbWluYS5iYWNraW4gPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAobiA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiBuICogbiAqICgocyArIDEpICogbiAtIHMpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIG1pbmEuYmFja291dFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQmFja291dCBlYXNpbmdcbiAgICAgLSBuIChudW1iZXIpIGlucHV0IDAuLjFcbiAgICAgPSAobnVtYmVyKSBvdXRwdXQgMC4uMVxuICAgIFxcKi9cbiAgICBtaW5hLmJhY2tvdXQgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAobiA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBuID0gbiAtIDE7XG4gICAgICAgIHZhciBzID0gMS43MDE1ODtcbiAgICAgICAgcmV0dXJuIG4gKiBuICogKChzICsgMSkgKiBuICsgcykgKyAxO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIG1pbmEuZWxhc3RpY1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRWxhc3RpYyBlYXNpbmdcbiAgICAgLSBuIChudW1iZXIpIGlucHV0IDAuLjFcbiAgICAgPSAobnVtYmVyKSBvdXRwdXQgMC4uMVxuICAgIFxcKi9cbiAgICBtaW5hLmVsYXN0aWMgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAobiA9PSAhIW4pIHtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCAtMTAgKiBuKSAqIE1hdGguc2luKChuIC0gLjA3NSkgKlxuICAgICAgICAgICAgKDIgKiBNYXRoLlBJKSAvIC4zKSArIDE7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogbWluYS5ib3VuY2VcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEJvdW5jZSBlYXNpbmdcbiAgICAgLSBuIChudW1iZXIpIGlucHV0IDAuLjFcbiAgICAgPSAobnVtYmVyKSBvdXRwdXQgMC4uMVxuICAgIFxcKi9cbiAgICBtaW5hLmJvdW5jZSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHZhciBzID0gNy41NjI1LFxuICAgICAgICAgICAgcCA9IDIuNzUsXG4gICAgICAgICAgICBsO1xuICAgICAgICBpZiAobiA8IDEgLyBwKSB7XG4gICAgICAgICAgICBsID0gcyAqIG4gKiBuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG4gPCAyIC8gcCkge1xuICAgICAgICAgICAgICAgIG4gLT0gMS41IC8gcDtcbiAgICAgICAgICAgICAgICBsID0gcyAqIG4gKiBuICsgLjc1O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobiA8IDIuNSAvIHApIHtcbiAgICAgICAgICAgICAgICAgICAgbiAtPSAyLjI1IC8gcDtcbiAgICAgICAgICAgICAgICAgICAgbCA9IHMgKiBuICogbiArIC45Mzc1O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG4gLT0gMi42MjUgLyBwO1xuICAgICAgICAgICAgICAgICAgICBsID0gcyAqIG4gKiBuICsgLjk4NDM3NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGw7XG4gICAgfTtcbiAgICB3aW5kb3cubWluYSA9IG1pbmE7XG4gICAgcmV0dXJuIG1pbmE7XG59KSh0eXBlb2YgZXZlID09IFwidW5kZWZpbmVkXCIgPyBmdW5jdGlvbiAoKSB7fSA6IGV2ZSk7XG5cbi8vIENvcHlyaWdodCAoYykgMjAxMyAtIDIwMTcgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbnZhciBTbmFwID0gKGZ1bmN0aW9uKHJvb3QpIHtcblNuYXAudmVyc2lvbiA9IFwiMC41LjFcIjtcbi8qXFxcbiAqIFNuYXBcbiBbIG1ldGhvZCBdXG4gKipcbiAqIENyZWF0ZXMgYSBkcmF3aW5nIHN1cmZhY2Ugb3Igd3JhcHMgZXhpc3RpbmcgU1ZHIGVsZW1lbnQuXG4gKipcbiAtIHdpZHRoIChudW1iZXJ8c3RyaW5nKSB3aWR0aCBvZiBzdXJmYWNlXG4gLSBoZWlnaHQgKG51bWJlcnxzdHJpbmcpIGhlaWdodCBvZiBzdXJmYWNlXG4gKiBvclxuIC0gRE9NIChTVkdFbGVtZW50KSBlbGVtZW50IHRvIGJlIHdyYXBwZWQgaW50byBTbmFwIHN0cnVjdHVyZVxuICogb3JcbiAtIGFycmF5IChhcnJheSkgYXJyYXkgb2YgZWxlbWVudHMgKHdpbGwgcmV0dXJuIHNldCBvZiBlbGVtZW50cylcbiAqIG9yXG4gLSBxdWVyeSAoc3RyaW5nKSBDU1MgcXVlcnkgc2VsZWN0b3JcbiA9IChvYmplY3QpIEBFbGVtZW50XG5cXCovXG5mdW5jdGlvbiBTbmFwKHcsIGgpIHtcbiAgICBpZiAodykge1xuICAgICAgICBpZiAody5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXAodyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKHcsIFwiYXJyYXlcIikgJiYgU25hcC5zZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBTbmFwLnNldC5hcHBseShTbmFwLCB3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodyBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICB9XG4gICAgICAgIGlmIChoID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHRyeSB7XG4gICAgICAgICAgICAgICAgdyA9IGdsb2IuZG9jLnF1ZXJ5U2VsZWN0b3IoU3RyaW5nKHcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcCh3KTtcbiAgICAgICAgICAgIC8vIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB3ID0gdyA9PSBudWxsID8gXCIxMDAlXCIgOiB3O1xuICAgIGggPSBoID09IG51bGwgPyBcIjEwMCVcIiA6IGg7XG4gICAgcmV0dXJuIG5ldyBQYXBlcih3LCBoKTtcbn1cblNuYXAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwiU25hcCB2XCIgKyB0aGlzLnZlcnNpb247XG59O1xuU25hcC5fID0ge307XG52YXIgZ2xvYiA9IHtcbiAgICB3aW46IHJvb3Qud2luZG93LFxuICAgIGRvYzogcm9vdC53aW5kb3cuZG9jdW1lbnRcbn07XG5TbmFwLl8uZ2xvYiA9IGdsb2I7XG52YXIgaGFzID0gXCJoYXNPd25Qcm9wZXJ0eVwiLFxuICAgIFN0ciA9IFN0cmluZyxcbiAgICB0b0Zsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICB0b0ludCA9IHBhcnNlSW50LFxuICAgIG1hdGggPSBNYXRoLFxuICAgIG1tYXggPSBtYXRoLm1heCxcbiAgICBtbWluID0gbWF0aC5taW4sXG4gICAgYWJzID0gbWF0aC5hYnMsXG4gICAgcG93ID0gbWF0aC5wb3csXG4gICAgUEkgPSBtYXRoLlBJLFxuICAgIHJvdW5kID0gbWF0aC5yb3VuZCxcbiAgICBFID0gXCJcIixcbiAgICBTID0gXCIgXCIsXG4gICAgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxuICAgIElTVVJMID0gL151cmxcXChbJ1wiXT8oW15cXCldKz8pWydcIl0/XFwpJC9pLFxuICAgIGNvbG91clJlZ0V4cCA9IC9eXFxzKigoI1thLWZcXGRdezZ9KXwoI1thLWZcXGRdezN9KXxyZ2JhP1xcKFxccyooW1xcZFxcLl0rJT9cXHMqLFxccypbXFxkXFwuXSslP1xccyosXFxzKltcXGRcXC5dKyU/KD86XFxzKixcXHMqW1xcZFxcLl0rJT8pPylcXHMqXFwpfGhzYmE/XFwoXFxzKihbXFxkXFwuXSsoPzpkZWd8XFx4YjB8JSk/XFxzKixcXHMqW1xcZFxcLl0rJT9cXHMqLFxccypbXFxkXFwuXSsoPzolP1xccyosXFxzKltcXGRcXC5dKyk/JT8pXFxzKlxcKXxoc2xhP1xcKFxccyooW1xcZFxcLl0rKD86ZGVnfFxceGIwfCUpP1xccyosXFxzKltcXGRcXC5dKyU/XFxzKixcXHMqW1xcZFxcLl0rKD86JT9cXHMqLFxccypbXFxkXFwuXSspPyU/KVxccypcXCkpXFxzKiQvaSxcbiAgICBiZXppZXJyZyA9IC9eKD86Y3ViaWMtKT9iZXppZXJcXCgoW14sXSspLChbXixdKyksKFteLF0rKSwoW15cXCldKylcXCkvLFxuICAgIHNlcGFyYXRvciA9IFNuYXAuXy5zZXBhcmF0b3IgPSAvWyxcXHNdKy8sXG4gICAgd2hpdGVzcGFjZSA9IC9bXFxzXS9nLFxuICAgIGNvbW1hU3BhY2VzID0gL1tcXHNdKixbXFxzXSovLFxuICAgIGhzcmcgPSB7aHM6IDEsIHJnOiAxfSxcbiAgICBwYXRoQ29tbWFuZCA9IC8oW2Etel0pW1xccyxdKigoLT9cXGQqXFwuP1xcZCooPzplW1xcLStdP1xcZCspP1tcXHNdKiw/W1xcc10qKSspL2lnLFxuICAgIHRDb21tYW5kID0gLyhbcnN0bV0pW1xccyxdKigoLT9cXGQqXFwuP1xcZCooPzplW1xcLStdP1xcZCspP1tcXHNdKiw/W1xcc10qKSspL2lnLFxuICAgIHBhdGhWYWx1ZXMgPSAvKC0/XFxkKlxcLj9cXGQqKD86ZVtcXC0rXT9cXGQrKT8pW1xcc10qLD9bXFxzXSovaWcsXG4gICAgaWRnZW4gPSAwLFxuICAgIGlkcHJlZml4ID0gXCJTXCIgKyAoK25ldyBEYXRlKS50b1N0cmluZygzNiksXG4gICAgSUQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgcmV0dXJuIChlbCAmJiBlbC50eXBlID8gZWwudHlwZSA6IEUpICsgaWRwcmVmaXggKyAoaWRnZW4rKykudG9TdHJpbmcoMzYpO1xuICAgIH0sXG4gICAgeGxpbmsgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgICB4bWxucyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBodWIgPSB7fSxcbiAgICAvKlxcXG4gICAgICogU25hcC51cmxcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFdyYXBzIHBhdGggaW50byBgXCJ1cmwoJzxwYXRoPicpXCJgLlxuICAgICAtIHZhbHVlIChzdHJpbmcpIHBhdGhcbiAgICAgPSAoc3RyaW5nKSB3cmFwcGVkIHBhdGhcbiAgICBcXCovXG4gICAgVVJMID0gU25hcC51cmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiBcInVybCgnI1wiICsgdXJsICsgXCInKVwiO1xuICAgIH07XG5cbmZ1bmN0aW9uICQoZWwsIGF0dHIpIHtcbiAgICBpZiAoYXR0cikge1xuICAgICAgICBpZiAoZWwgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICBlbCA9IGdsb2IuZG9jLmNyZWF0ZVRleHROb2RlKGF0dHIudGV4dCB8fCBhdHRyW1wiI3RleHRcIl0gfHwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsID09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgZWwgPSBnbG9iLmRvYy5jcmVhdGVDb21tZW50KGF0dHIudGV4dCB8fCBhdHRyW1wiI3RleHRcIl0gfHwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbCA9ICQoZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXR0ciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWwubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLnN1YnN0cmluZygwLCA2KSA9PSBcInhsaW5rOlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGVOUyh4bGluaywgYXR0ci5zdWJzdHJpbmcoNikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5zdWJzdHJpbmcoMCwgNCkgPT0gXCJ4bWw6XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZU5TKHhtbG5zLCBhdHRyLnN1YnN0cmluZyg0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGF0dHIpIGlmIChhdHRyW2hhc10oa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBTdHIoYXR0cltrZXldKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyaW5nKDAsIDYpID09IFwieGxpbms6XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rLCBrZXkuc3Vic3RyaW5nKDYpLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5zdWJzdHJpbmcoMCwgNCkgPT0gXCJ4bWw6XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhtbG5zLCBrZXkuc3Vic3RyaW5nKDQpLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcInRleHRcIiBpbiBhdHRyKSB7XG4gICAgICAgICAgICBlbC5ub2RlVmFsdWUgPSBhdHRyLnRleHQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBlbCA9IGdsb2IuZG9jLmNyZWF0ZUVsZW1lbnROUyh4bWxucywgZWwpO1xuICAgIH1cbiAgICByZXR1cm4gZWw7XG59XG5TbmFwLl8uJCA9ICQ7XG5TbmFwLl8uaWQgPSBJRDtcbmZ1bmN0aW9uIGdldEF0dHJzKGVsKSB7XG4gICAgdmFyIGF0dHJzID0gZWwuYXR0cmlidXRlcyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3V0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXR0cnNbaV0ubmFtZXNwYWNlVVJJID09IHhsaW5rKSB7XG4gICAgICAgICAgICBuYW1lID0gXCJ4bGluazpcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgKz0gYXR0cnNbaV0ubmFtZTtcbiAgICAgICAgb3V0W25hbWVdID0gYXR0cnNbaV0udGV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBpcyhvLCB0eXBlKSB7XG4gICAgdHlwZSA9IFN0ci5wcm90b3R5cGUudG9Mb3dlckNhc2UuY2FsbCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PSBcImZpbml0ZVwiKSB7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShvKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gXCJhcnJheVwiICYmXG4gICAgICAgIChvIGluc3RhbmNlb2YgQXJyYXkgfHwgQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KG8pKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICB0eXBlID09IFwibnVsbFwiICYmIG8gPT09IG51bGwgfHxcbiAgICAgICAgICAgIHR5cGUgPT0gdHlwZW9mIG8gJiYgbyAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZSA9PSBcIm9iamVjdFwiICYmIG8gPT09IE9iamVjdChvKSB8fFxuICAgICAgICAgICAgb2JqZWN0VG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSA9PSB0eXBlO1xufVxuLypcXFxuICogU25hcC5mb3JtYXRcbiBbIG1ldGhvZCBdXG4gKipcbiAqIFJlcGxhY2VzIGNvbnN0cnVjdGlvbiBvZiB0eXBlIGB7PG5hbWU+fWAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRcbiAqKlxuIC0gdG9rZW4gKHN0cmluZykgc3RyaW5nIHRvIGZvcm1hdFxuIC0ganNvbiAob2JqZWN0KSBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyBhcmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50XG4gPSAoc3RyaW5nKSBmb3JtYXR0ZWQgc3RyaW5nXG4gPiBVc2FnZVxuIHwgLy8gdGhpcyBkcmF3cyBhIHJlY3Rhbmd1bGFyIHNoYXBlIGVxdWl2YWxlbnQgdG8gXCJNMTAsMjBoNDB2NTBoLTQwelwiXG4gfCBwYXBlci5wYXRoKFNuYXAuZm9ybWF0KFwiTXt4fSx7eX1oe2RpbS53aWR0aH12e2RpbS5oZWlnaHR9aHtkaW1bJ25lZ2F0aXZlIHdpZHRoJ119elwiLCB7XG4gfCAgICAgeDogMTAsXG4gfCAgICAgeTogMjAsXG4gfCAgICAgZGltOiB7XG4gfCAgICAgICAgIHdpZHRoOiA0MCxcbiB8ICAgICAgICAgaGVpZ2h0OiA1MCxcbiB8ICAgICAgICAgXCJuZWdhdGl2ZSB3aWR0aFwiOiAtNDBcbiB8ICAgICB9XG4gfCB9KSk7XG5cXCovXG5TbmFwLmZvcm1hdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuUmVnZXggPSAvXFx7KFteXFx9XSspXFx9L2csXG4gICAgICAgIG9iak5vdGF0aW9uUmVnZXggPSAvKD86KD86XnxcXC4pKC4rPykoPz1cXFt8XFwufCR8XFwoKXxcXFsoJ3xcIikoLis/KVxcMlxcXSkoXFwoXFwpKT8vZywgLy8gbWF0Y2hlcyAueHh4eHggb3IgW1wieHh4eHhcIl0gdG8gcnVuIG92ZXIgb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgcmVwbGFjZXIgPSBmdW5jdGlvbiAoYWxsLCBrZXksIG9iaikge1xuICAgICAgICAgICAgdmFyIHJlcyA9IG9iajtcbiAgICAgICAgICAgIGtleS5yZXBsYWNlKG9iak5vdGF0aW9uUmVnZXgsIGZ1bmN0aW9uIChhbGwsIG5hbWUsIHF1b3RlLCBxdW90ZWROYW1lLCBpc0Z1bmMpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSB8fCBxdW90ZWROYW1lO1xuICAgICAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcyA9PSBcImZ1bmN0aW9uXCIgJiYgaXNGdW5jICYmIChyZXMgPSByZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMgPSAocmVzID09IG51bGwgfHwgcmVzID09IG9iaiA/IGFsbCA6IHJlcykgKyBcIlwiO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0ciwgb2JqKSB7XG4gICAgICAgIHJldHVybiBTdHIoc3RyKS5yZXBsYWNlKHRva2VuUmVnZXgsIGZ1bmN0aW9uIChhbGwsIGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGFsbCwga2V5LCBvYmopO1xuICAgICAgICB9KTtcbiAgICB9O1xufSkoKTtcbmZ1bmN0aW9uIGNsb25lKG9iaikge1xuICAgIGlmICh0eXBlb2Ygb2JqID09IFwiZnVuY3Rpb25cIiB8fCBPYmplY3Qob2JqKSAhPT0gb2JqKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIHZhciByZXMgPSBuZXcgb2JqLmNvbnN0cnVjdG9yO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChvYmpbaGFzXShrZXkpKSB7XG4gICAgICAgIHJlc1trZXldID0gY2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuU25hcC5fLmNsb25lID0gY2xvbmU7XG5mdW5jdGlvbiByZXB1c2goYXJyYXksIGl0ZW0pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBhcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5LnB1c2goYXJyYXkuc3BsaWNlKGksIDEpWzBdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjYWNoZXIoZiwgc2NvcGUsIHBvc3Rwcm9jZXNzb3IpIHtcbiAgICBmdW5jdGlvbiBuZXdmKCkge1xuICAgICAgICB2YXIgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSxcbiAgICAgICAgICAgIGFyZ3MgPSBhcmcuam9pbihcIlxcdTI0MDBcIiksXG4gICAgICAgICAgICBjYWNoZSA9IG5ld2YuY2FjaGUgPSBuZXdmLmNhY2hlIHx8IHt9LFxuICAgICAgICAgICAgY291bnQgPSBuZXdmLmNvdW50ID0gbmV3Zi5jb3VudCB8fCBbXTtcbiAgICAgICAgaWYgKGNhY2hlW2hhc10oYXJncykpIHtcbiAgICAgICAgICAgIHJlcHVzaChjb3VudCwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gcG9zdHByb2Nlc3NvciA/IHBvc3Rwcm9jZXNzb3IoY2FjaGVbYXJnc10pIDogY2FjaGVbYXJnc107XG4gICAgICAgIH1cbiAgICAgICAgY291bnQubGVuZ3RoID49IDFlMyAmJiBkZWxldGUgY2FjaGVbY291bnQuc2hpZnQoKV07XG4gICAgICAgIGNvdW50LnB1c2goYXJncyk7XG4gICAgICAgIGNhY2hlW2FyZ3NdID0gZi5hcHBseShzY29wZSwgYXJnKTtcbiAgICAgICAgcmV0dXJuIHBvc3Rwcm9jZXNzb3IgPyBwb3N0cHJvY2Vzc29yKGNhY2hlW2FyZ3NdKSA6IGNhY2hlW2FyZ3NdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Zjtcbn1cblNuYXAuXy5jYWNoZXIgPSBjYWNoZXI7XG5mdW5jdGlvbiBhbmdsZSh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gICAgaWYgKHgzID09IG51bGwpIHtcbiAgICAgICAgdmFyIHggPSB4MSAtIHgyLFxuICAgICAgICAgICAgeSA9IHkxIC0geTI7XG4gICAgICAgIGlmICgheCAmJiAheSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgxODAgKyBtYXRoLmF0YW4yKC15LCAteCkgKiAxODAgLyBQSSArIDM2MCkgJSAzNjA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFuZ2xlKHgxLCB5MSwgeDMsIHkzKSAtIGFuZ2xlKHgyLCB5MiwgeDMsIHkzKTtcbiAgICB9XG59XG5mdW5jdGlvbiByYWQoZGVnKSB7XG4gICAgcmV0dXJuIGRlZyAlIDM2MCAqIFBJIC8gMTgwO1xufVxuZnVuY3Rpb24gZGVnKHJhZCkge1xuICAgIHJldHVybiByYWQgKiAxODAgLyBQSSAlIDM2MDtcbn1cbmZ1bmN0aW9uIHhfeSgpIHtcbiAgICByZXR1cm4gdGhpcy54ICsgUyArIHRoaXMueTtcbn1cbmZ1bmN0aW9uIHhfeV93X2goKSB7XG4gICAgcmV0dXJuIHRoaXMueCArIFMgKyB0aGlzLnkgKyBTICsgdGhpcy53aWR0aCArIFwiIFxceGQ3IFwiICsgdGhpcy5oZWlnaHQ7XG59XG5cbi8qXFxcbiAqIFNuYXAucmFkXG4gWyBtZXRob2QgXVxuICoqXG4gKiBUcmFuc2Zvcm0gYW5nbGUgdG8gcmFkaWFuc1xuIC0gZGVnIChudW1iZXIpIGFuZ2xlIGluIGRlZ3JlZXNcbiA9IChudW1iZXIpIGFuZ2xlIGluIHJhZGlhbnNcblxcKi9cblNuYXAucmFkID0gcmFkO1xuLypcXFxuICogU25hcC5kZWdcbiBbIG1ldGhvZCBdXG4gKipcbiAqIFRyYW5zZm9ybSBhbmdsZSB0byBkZWdyZWVzXG4gLSByYWQgKG51bWJlcikgYW5nbGUgaW4gcmFkaWFuc1xuID0gKG51bWJlcikgYW5nbGUgaW4gZGVncmVlc1xuXFwqL1xuU25hcC5kZWcgPSBkZWc7XG4vKlxcXG4gKiBTbmFwLnNpblxuIFsgbWV0aG9kIF1cbiAqKlxuICogRXF1aXZhbGVudCB0byBgTWF0aC5zaW4oKWAgb25seSB3b3JrcyB3aXRoIGRlZ3JlZXMsIG5vdCByYWRpYW5zLlxuIC0gYW5nbGUgKG51bWJlcikgYW5nbGUgaW4gZGVncmVlc1xuID0gKG51bWJlcikgc2luXG5cXCovXG5TbmFwLnNpbiA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgIHJldHVybiBtYXRoLnNpbihTbmFwLnJhZChhbmdsZSkpO1xufTtcbi8qXFxcbiAqIFNuYXAudGFuXG4gWyBtZXRob2QgXVxuICoqXG4gKiBFcXVpdmFsZW50IHRvIGBNYXRoLnRhbigpYCBvbmx5IHdvcmtzIHdpdGggZGVncmVlcywgbm90IHJhZGlhbnMuXG4gLSBhbmdsZSAobnVtYmVyKSBhbmdsZSBpbiBkZWdyZWVzXG4gPSAobnVtYmVyKSB0YW5cblxcKi9cblNuYXAudGFuID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgcmV0dXJuIG1hdGgudGFuKFNuYXAucmFkKGFuZ2xlKSk7XG59O1xuLypcXFxuICogU25hcC5jb3NcbiBbIG1ldGhvZCBdXG4gKipcbiAqIEVxdWl2YWxlbnQgdG8gYE1hdGguY29zKClgIG9ubHkgd29ya3Mgd2l0aCBkZWdyZWVzLCBub3QgcmFkaWFucy5cbiAtIGFuZ2xlIChudW1iZXIpIGFuZ2xlIGluIGRlZ3JlZXNcbiA9IChudW1iZXIpIGNvc1xuXFwqL1xuU25hcC5jb3MgPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICByZXR1cm4gbWF0aC5jb3MoU25hcC5yYWQoYW5nbGUpKTtcbn07XG4vKlxcXG4gKiBTbmFwLmFzaW5cbiBbIG1ldGhvZCBdXG4gKipcbiAqIEVxdWl2YWxlbnQgdG8gYE1hdGguYXNpbigpYCBvbmx5IHdvcmtzIHdpdGggZGVncmVlcywgbm90IHJhZGlhbnMuXG4gLSBudW0gKG51bWJlcikgdmFsdWVcbiA9IChudW1iZXIpIGFzaW4gaW4gZGVncmVlc1xuXFwqL1xuU25hcC5hc2luID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBTbmFwLmRlZyhtYXRoLmFzaW4obnVtKSk7XG59O1xuLypcXFxuICogU25hcC5hY29zXG4gWyBtZXRob2QgXVxuICoqXG4gKiBFcXVpdmFsZW50IHRvIGBNYXRoLmFjb3MoKWAgb25seSB3b3JrcyB3aXRoIGRlZ3JlZXMsIG5vdCByYWRpYW5zLlxuIC0gbnVtIChudW1iZXIpIHZhbHVlXG4gPSAobnVtYmVyKSBhY29zIGluIGRlZ3JlZXNcblxcKi9cblNuYXAuYWNvcyA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gU25hcC5kZWcobWF0aC5hY29zKG51bSkpO1xufTtcbi8qXFxcbiAqIFNuYXAuYXRhblxuIFsgbWV0aG9kIF1cbiAqKlxuICogRXF1aXZhbGVudCB0byBgTWF0aC5hdGFuKClgIG9ubHkgd29ya3Mgd2l0aCBkZWdyZWVzLCBub3QgcmFkaWFucy5cbiAtIG51bSAobnVtYmVyKSB2YWx1ZVxuID0gKG51bWJlcikgYXRhbiBpbiBkZWdyZWVzXG5cXCovXG5TbmFwLmF0YW4gPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIFNuYXAuZGVnKG1hdGguYXRhbihudW0pKTtcbn07XG4vKlxcXG4gKiBTbmFwLmF0YW4yXG4gWyBtZXRob2QgXVxuICoqXG4gKiBFcXVpdmFsZW50IHRvIGBNYXRoLmF0YW4yKClgIG9ubHkgd29ya3Mgd2l0aCBkZWdyZWVzLCBub3QgcmFkaWFucy5cbiAtIG51bSAobnVtYmVyKSB2YWx1ZVxuID0gKG51bWJlcikgYXRhbjIgaW4gZGVncmVlc1xuXFwqL1xuU25hcC5hdGFuMiA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gU25hcC5kZWcobWF0aC5hdGFuMihudW0pKTtcbn07XG4vKlxcXG4gKiBTbmFwLmFuZ2xlXG4gWyBtZXRob2QgXVxuICoqXG4gKiBSZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gdHdvIG9yIHRocmVlIHBvaW50c1xuIC0geDEgKG51bWJlcikgeCBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geTEgKG51bWJlcikgeSBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geDIgKG51bWJlcikgeCBjb29yZCBvZiBzZWNvbmQgcG9pbnRcbiAtIHkyIChudW1iZXIpIHkgY29vcmQgb2Ygc2Vjb25kIHBvaW50XG4gLSB4MyAobnVtYmVyKSAjb3B0aW9uYWwgeCBjb29yZCBvZiB0aGlyZCBwb2ludFxuIC0geTMgKG51bWJlcikgI29wdGlvbmFsIHkgY29vcmQgb2YgdGhpcmQgcG9pbnRcbiA9IChudW1iZXIpIGFuZ2xlIGluIGRlZ3JlZXNcblxcKi9cblNuYXAuYW5nbGUgPSBhbmdsZTtcbi8qXFxcbiAqIFNuYXAubGVuXG4gWyBtZXRob2QgXVxuICoqXG4gKiBSZXR1cm5zIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuIC0geDEgKG51bWJlcikgeCBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geTEgKG51bWJlcikgeSBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geDIgKG51bWJlcikgeCBjb29yZCBvZiBzZWNvbmQgcG9pbnRcbiAtIHkyIChudW1iZXIpIHkgY29vcmQgb2Ygc2Vjb25kIHBvaW50XG4gPSAobnVtYmVyKSBkaXN0YW5jZVxuXFwqL1xuU25hcC5sZW4gPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFNuYXAubGVuMih4MSwgeTEsIHgyLCB5MikpO1xufTtcbi8qXFxcbiAqIFNuYXAubGVuMlxuIFsgbWV0aG9kIF1cbiAqKlxuICogUmV0dXJucyBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuIC0geDEgKG51bWJlcikgeCBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geTEgKG51bWJlcikgeSBjb29yZCBvZiBmaXJzdCBwb2ludFxuIC0geDIgKG51bWJlcikgeCBjb29yZCBvZiBzZWNvbmQgcG9pbnRcbiAtIHkyIChudW1iZXIpIHkgY29vcmQgb2Ygc2Vjb25kIHBvaW50XG4gPSAobnVtYmVyKSBkaXN0YW5jZVxuXFwqL1xuU25hcC5sZW4yID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuICh4MSAtIHgyKSAqICh4MSAtIHgyKSArICh5MSAtIHkyKSAqICh5MSAtIHkyKTtcbn07XG4vKlxcXG4gKiBTbmFwLmNsb3Nlc3RQb2ludFxuIFsgbWV0aG9kIF1cbiAqKlxuICogUmV0dXJucyBjbG9zZXN0IHBvaW50IHRvIGEgZ2l2ZW4gb25lIG9uIGEgZ2l2ZW4gcGF0aC5cbiAtIHBhdGggKEVsZW1lbnQpIHBhdGggZWxlbWVudFxuIC0geCAobnVtYmVyKSB4IGNvb3JkIG9mIGEgcG9pbnRcbiAtIHkgKG51bWJlcikgeSBjb29yZCBvZiBhIHBvaW50XG4gPSAob2JqZWN0KSBpbiBmb3JtYXRcbiB7XG4gICAgeCAobnVtYmVyKSB4IGNvb3JkIG9mIHRoZSBwb2ludCBvbiB0aGUgcGF0aFxuICAgIHkgKG51bWJlcikgeSBjb29yZCBvZiB0aGUgcG9pbnQgb24gdGhlIHBhdGhcbiAgICBsZW5ndGggKG51bWJlcikgbGVuZ3RoIG9mIHRoZSBwYXRoIHRvIHRoZSBwb2ludFxuICAgIGRpc3RhbmNlIChudW1iZXIpIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHBvaW50IHRvIHRoZSBwYXRoXG4gfVxuXFwqL1xuLy8gQ29waWVkIGZyb20gaHR0cDovL2JsLm9ja3Mub3JnL21ib3N0b2NrLzgwMjc2MzdcblNuYXAuY2xvc2VzdFBvaW50ID0gZnVuY3Rpb24gKHBhdGgsIHgsIHkpIHtcbiAgICBmdW5jdGlvbiBkaXN0YW5jZTIocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB4LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB5O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfVxuICAgIHZhciBwYXRoTm9kZSA9IHBhdGgubm9kZSxcbiAgICAgICAgcGF0aExlbmd0aCA9IHBhdGhOb2RlLmdldFRvdGFsTGVuZ3RoKCksXG4gICAgICAgIHByZWNpc2lvbiA9IHBhdGhMZW5ndGggLyBwYXRoTm9kZS5wYXRoU2VnTGlzdC5udW1iZXJPZkl0ZW1zICogLjEyNSxcbiAgICAgICAgYmVzdCxcbiAgICAgICAgYmVzdExlbmd0aCxcbiAgICAgICAgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAvLyBsaW5lYXIgc2NhbiBmb3IgY29hcnNlIGFwcHJveGltYXRpb25cbiAgICBmb3IgKHZhciBzY2FuLCBzY2FuTGVuZ3RoID0gMCwgc2NhbkRpc3RhbmNlOyBzY2FuTGVuZ3RoIDw9IHBhdGhMZW5ndGg7IHNjYW5MZW5ndGggKz0gcHJlY2lzaW9uKSB7XG4gICAgICAgIGlmICgoc2NhbkRpc3RhbmNlID0gZGlzdGFuY2UyKHNjYW4gPSBwYXRoTm9kZS5nZXRQb2ludEF0TGVuZ3RoKHNjYW5MZW5ndGgpKSkgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3QgPSBzY2FuO1xuICAgICAgICAgICAgYmVzdExlbmd0aCA9IHNjYW5MZW5ndGg7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBzY2FuRGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBiaW5hcnkgc2VhcmNoIGZvciBwcmVjaXNlIGVzdGltYXRlXG4gICAgcHJlY2lzaW9uICo9IC41O1xuICAgIHdoaWxlIChwcmVjaXNpb24gPiAuNSkge1xuICAgICAgICB2YXIgYmVmb3JlLFxuICAgICAgICAgICAgYWZ0ZXIsXG4gICAgICAgICAgICBiZWZvcmVMZW5ndGgsXG4gICAgICAgICAgICBhZnRlckxlbmd0aCxcbiAgICAgICAgICAgIGJlZm9yZURpc3RhbmNlLFxuICAgICAgICAgICAgYWZ0ZXJEaXN0YW5jZTtcbiAgICAgICAgaWYgKChiZWZvcmVMZW5ndGggPSBiZXN0TGVuZ3RoIC0gcHJlY2lzaW9uKSA+PSAwICYmIChiZWZvcmVEaXN0YW5jZSA9IGRpc3RhbmNlMihiZWZvcmUgPSBwYXRoTm9kZS5nZXRQb2ludEF0TGVuZ3RoKGJlZm9yZUxlbmd0aCkpKSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdCA9IGJlZm9yZTtcbiAgICAgICAgICAgIGJlc3RMZW5ndGggPSBiZWZvcmVMZW5ndGg7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBiZWZvcmVEaXN0YW5jZTtcbiAgICAgICAgfSBlbHNlIGlmICgoYWZ0ZXJMZW5ndGggPSBiZXN0TGVuZ3RoICsgcHJlY2lzaW9uKSA8PSBwYXRoTGVuZ3RoICYmIChhZnRlckRpc3RhbmNlID0gZGlzdGFuY2UyKGFmdGVyID0gcGF0aE5vZGUuZ2V0UG9pbnRBdExlbmd0aChhZnRlckxlbmd0aCkpKSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdCA9IGFmdGVyO1xuICAgICAgICAgICAgYmVzdExlbmd0aCA9IGFmdGVyTGVuZ3RoO1xuICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gYWZ0ZXJEaXN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiAqPSAuNTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJlc3QgPSB7XG4gICAgICAgIHg6IGJlc3QueCxcbiAgICAgICAgeTogYmVzdC55LFxuICAgICAgICBsZW5ndGg6IGJlc3RMZW5ndGgsXG4gICAgICAgIGRpc3RhbmNlOiBNYXRoLnNxcnQoYmVzdERpc3RhbmNlKVxuICAgIH07XG4gICAgcmV0dXJuIGJlc3Q7XG59XG4vKlxcXG4gKiBTbmFwLmlzXG4gWyBtZXRob2QgXVxuICoqXG4gKiBIYW5keSByZXBsYWNlbWVudCBmb3IgdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gLSBvICjigKYpIGFueSBvYmplY3Qgb3IgcHJpbWl0aXZlXG4gLSB0eXBlIChzdHJpbmcpIG5hbWUgb2YgdGhlIHR5cGUsIGUuZy4sIGBzdHJpbmdgLCBgZnVuY3Rpb25gLCBgbnVtYmVyYCwgZXRjLlxuID0gKGJvb2xlYW4pIGB0cnVlYCBpZiBnaXZlbiB2YWx1ZSBpcyBvZiBnaXZlbiB0eXBlXG5cXCovXG5TbmFwLmlzID0gaXM7XG4vKlxcXG4gKiBTbmFwLnNuYXBUb1xuIFsgbWV0aG9kIF1cbiAqKlxuICogU25hcHMgZ2l2ZW4gdmFsdWUgdG8gZ2l2ZW4gZ3JpZFxuIC0gdmFsdWVzIChhcnJheXxudW1iZXIpIGdpdmVuIGFycmF5IG9mIHZhbHVlcyBvciBzdGVwIG9mIHRoZSBncmlkXG4gLSB2YWx1ZSAobnVtYmVyKSB2YWx1ZSB0byBhZGp1c3RcbiAtIHRvbGVyYW5jZSAobnVtYmVyKSAjb3B0aW9uYWwgbWF4aW11bSBkaXN0YW5jZSB0byB0aGUgdGFyZ2V0IHZhbHVlIHRoYXQgd291bGQgdHJpZ2dlciB0aGUgc25hcC4gRGVmYXVsdCBpcyBgMTBgLlxuID0gKG51bWJlcikgYWRqdXN0ZWQgdmFsdWVcblxcKi9cblNuYXAuc25hcFRvID0gZnVuY3Rpb24gKHZhbHVlcywgdmFsdWUsIHRvbGVyYW5jZSkge1xuICAgIHRvbGVyYW5jZSA9IGlzKHRvbGVyYW5jZSwgXCJmaW5pdGVcIikgPyB0b2xlcmFuY2UgOiAxMDtcbiAgICBpZiAoaXModmFsdWVzLCBcImFycmF5XCIpKSB7XG4gICAgICAgIHZhciBpID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkgaWYgKGFicyh2YWx1ZXNbaV0gLSB2YWx1ZSkgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzW2ldO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gK3ZhbHVlcztcbiAgICAgICAgdmFyIHJlbSA9IHZhbHVlICUgdmFsdWVzO1xuICAgICAgICBpZiAocmVtIDwgdG9sZXJhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgLSByZW07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbSA+IHZhbHVlcyAtIHRvbGVyYW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIC0gcmVtICsgdmFsdWVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG4vLyBDb2xvdXJcbi8qXFxcbiAqIFNuYXAuZ2V0UkdCXG4gWyBtZXRob2QgXVxuICoqXG4gKiBQYXJzZXMgY29sb3Igc3RyaW5nIGFzIFJHQiBvYmplY3RcbiAtIGNvbG9yIChzdHJpbmcpIGNvbG9yIHN0cmluZyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOlxuICMgPHVsPlxuICMgICAgIDxsaT5Db2xvciBuYW1lICg8Y29kZT5yZWQ8L2NvZGU+LCA8Y29kZT5ncmVlbjwvY29kZT4sIDxjb2RlPmNvcm5mbG93ZXJibHVlPC9jb2RlPiwgZXRjKTwvbGk+XG4gIyAgICAgPGxpPiPigKLigKLigKIg4oCUIHNob3J0ZW5lZCBIVE1MIGNvbG9yOiAoPGNvZGU+IzAwMDwvY29kZT4sIDxjb2RlPiNmYzA8L2NvZGU+LCBldGMuKTwvbGk+XG4gIyAgICAgPGxpPiPigKLigKLigKLigKLigKLigKIg4oCUIGZ1bGwgbGVuZ3RoIEhUTUwgY29sb3I6ICg8Y29kZT4jMDAwMDAwPC9jb2RlPiwgPGNvZGU+I2JkMjMwMDwvY29kZT4pPC9saT5cbiAjICAgICA8bGk+cmdiKOKAouKAouKAoiwg4oCi4oCi4oCiLCDigKLigKLigKIpIOKAlCByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzIHZhbHVlczogKDxjb2RlPnJnYigyMDAsJm5ic3A7MTAwLCZuYnNwOzApPC9jb2RlPik8L2xpPlxuICMgICAgIDxsaT5yZ2JhKOKAouKAouKAoiwg4oCi4oCi4oCiLCDigKLigKLigKIsIOKAouKAouKAoikg4oCUIGFsc28gd2l0aCBvcGFjaXR5PC9saT5cbiAjICAgICA8bGk+cmdiKOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUpIOKAlCBzYW1lIGFzIGFib3ZlLCBidXQgaW4gJTogKDxjb2RlPnJnYigxMDAlLCZuYnNwOzE3NSUsJm5ic3A7MCUpPC9jb2RlPik8L2xpPlxuICMgICAgIDxsaT5yZ2JhKOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUpIOKAlCBhbHNvIHdpdGggb3BhY2l0eTwvbGk+XG4gIyAgICAgPGxpPmhzYijigKLigKLigKIsIOKAouKAouKAoiwg4oCi4oCi4oCiKSDigJQgaHVlLCBzYXR1cmF0aW9uIGFuZCBicmlnaHRuZXNzIHZhbHVlczogKDxjb2RlPmhzYigwLjUsJm5ic3A7MC4yNSwmbmJzcDsxKTwvY29kZT4pPC9saT5cbiAjICAgICA8bGk+aHNiYSjigKLigKLigKIsIOKAouKAouKAoiwg4oCi4oCi4oCiLCDigKLigKLigKIpIOKAlCBhbHNvIHdpdGggb3BhY2l0eTwvbGk+XG4gIyAgICAgPGxpPmhzYijigKLigKLigKIlLCDigKLigKLigKIlLCDigKLigKLigKIlKSDigJQgc2FtZSBhcyBhYm92ZSwgYnV0IGluICU8L2xpPlxuICMgICAgIDxsaT5oc2JhKOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUpIOKAlCBhbHNvIHdpdGggb3BhY2l0eTwvbGk+XG4gIyAgICAgPGxpPmhzbCjigKLigKLigKIsIOKAouKAouKAoiwg4oCi4oCi4oCiKSDigJQgaHVlLCBzYXR1cmF0aW9uIGFuZCBsdW1pbm9zaXR5IHZhbHVlczogKDxjb2RlPmhzYigwLjUsJm5ic3A7MC4yNSwmbmJzcDswLjUpPC9jb2RlPik8L2xpPlxuICMgICAgIDxsaT5oc2xhKOKAouKAouKAoiwg4oCi4oCi4oCiLCDigKLigKLigKIsIOKAouKAouKAoikg4oCUIGFsc28gd2l0aCBvcGFjaXR5PC9saT5cbiAjICAgICA8bGk+aHNsKOKAouKAouKAoiUsIOKAouKAouKAoiUsIOKAouKAouKAoiUpIOKAlCBzYW1lIGFzIGFib3ZlLCBidXQgaW4gJTwvbGk+XG4gIyAgICAgPGxpPmhzbGEo4oCi4oCi4oCiJSwg4oCi4oCi4oCiJSwg4oCi4oCi4oCiJSwg4oCi4oCi4oCiJSkg4oCUIGFsc28gd2l0aCBvcGFjaXR5PC9saT5cbiAjIDwvdWw+XG4gKiBOb3RlIHRoYXQgYCVgIGNhbiBiZSB1c2VkIGFueSB0aW1lOiBgcmdiKDIwJSwgMjU1LCA1MCUpYC5cbiA9IChvYmplY3QpIFJHQiBvYmplY3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gbyB7XG4gbyAgICAgciAobnVtYmVyKSByZWQsXG4gbyAgICAgZyAobnVtYmVyKSBncmVlbixcbiBvICAgICBiIChudW1iZXIpIGJsdWUsXG4gbyAgICAgaGV4IChzdHJpbmcpIGNvbG9yIGluIEhUTUwvQ1NTIGZvcm1hdDogI+KAouKAouKAouKAouKAouKAoixcbiBvICAgICBlcnJvciAoYm9vbGVhbikgdHJ1ZSBpZiBzdHJpbmcgY2FuJ3QgYmUgcGFyc2VkXG4gbyB9XG5cXCovXG5TbmFwLmdldFJHQiA9IGNhY2hlcihmdW5jdGlvbiAoY29sb3VyKSB7XG4gICAgaWYgKCFjb2xvdXIgfHwgISEoKGNvbG91ciA9IFN0cihjb2xvdXIpKS5pbmRleE9mKFwiLVwiKSArIDEpKSB7XG4gICAgICAgIHJldHVybiB7cjogLTEsIGc6IC0xLCBiOiAtMSwgaGV4OiBcIm5vbmVcIiwgZXJyb3I6IDEsIHRvU3RyaW5nOiByZ2J0b1N0cmluZ307XG4gICAgfVxuICAgIGlmIChjb2xvdXIgPT0gXCJub25lXCIpIHtcbiAgICAgICAgcmV0dXJuIHtyOiAtMSwgZzogLTEsIGI6IC0xLCBoZXg6IFwibm9uZVwiLCB0b1N0cmluZzogcmdidG9TdHJpbmd9O1xuICAgIH1cbiAgICAhKGhzcmdbaGFzXShjb2xvdXIudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwgMikpIHx8IGNvbG91ci5jaGFyQXQoKSA9PSBcIiNcIikgJiYgKGNvbG91ciA9IHRvSGV4KGNvbG91cikpO1xuICAgIGlmICghY29sb3VyKSB7XG4gICAgICAgIHJldHVybiB7cjogLTEsIGc6IC0xLCBiOiAtMSwgaGV4OiBcIm5vbmVcIiwgZXJyb3I6IDEsIHRvU3RyaW5nOiByZ2J0b1N0cmluZ307XG4gICAgfVxuICAgIHZhciByZXMsXG4gICAgICAgIHJlZCxcbiAgICAgICAgZ3JlZW4sXG4gICAgICAgIGJsdWUsXG4gICAgICAgIG9wYWNpdHksXG4gICAgICAgIHQsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgcmdiID0gY29sb3VyLm1hdGNoKGNvbG91clJlZ0V4cCk7XG4gICAgaWYgKHJnYikge1xuICAgICAgICBpZiAocmdiWzJdKSB7XG4gICAgICAgICAgICBibHVlID0gdG9JbnQocmdiWzJdLnN1YnN0cmluZyg1KSwgMTYpO1xuICAgICAgICAgICAgZ3JlZW4gPSB0b0ludChyZ2JbMl0uc3Vic3RyaW5nKDMsIDUpLCAxNik7XG4gICAgICAgICAgICByZWQgPSB0b0ludChyZ2JbMl0uc3Vic3RyaW5nKDEsIDMpLCAxNik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJnYlszXSkge1xuICAgICAgICAgICAgYmx1ZSA9IHRvSW50KCh0ID0gcmdiWzNdLmNoYXJBdCgzKSkgKyB0LCAxNik7XG4gICAgICAgICAgICBncmVlbiA9IHRvSW50KCh0ID0gcmdiWzNdLmNoYXJBdCgyKSkgKyB0LCAxNik7XG4gICAgICAgICAgICByZWQgPSB0b0ludCgodCA9IHJnYlszXS5jaGFyQXQoMSkpICsgdCwgMTYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZ2JbNF0pIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHJnYls0XS5zcGxpdChjb21tYVNwYWNlcyk7XG4gICAgICAgICAgICByZWQgPSB0b0Zsb2F0KHZhbHVlc1swXSk7XG4gICAgICAgICAgICB2YWx1ZXNbMF0uc2xpY2UoLTEpID09IFwiJVwiICYmIChyZWQgKj0gMi41NSk7XG4gICAgICAgICAgICBncmVlbiA9IHRvRmxvYXQodmFsdWVzWzFdKTtcbiAgICAgICAgICAgIHZhbHVlc1sxXS5zbGljZSgtMSkgPT0gXCIlXCIgJiYgKGdyZWVuICo9IDIuNTUpO1xuICAgICAgICAgICAgYmx1ZSA9IHRvRmxvYXQodmFsdWVzWzJdKTtcbiAgICAgICAgICAgIHZhbHVlc1syXS5zbGljZSgtMSkgPT0gXCIlXCIgJiYgKGJsdWUgKj0gMi41NSk7XG4gICAgICAgICAgICByZ2JbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLCA0KSA9PSBcInJnYmFcIiAmJiAob3BhY2l0eSA9IHRvRmxvYXQodmFsdWVzWzNdKSk7XG4gICAgICAgICAgICB2YWx1ZXNbM10gJiYgdmFsdWVzWzNdLnNsaWNlKC0xKSA9PSBcIiVcIiAmJiAob3BhY2l0eSAvPSAxMDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZ2JbNV0pIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHJnYls1XS5zcGxpdChjb21tYVNwYWNlcyk7XG4gICAgICAgICAgICByZWQgPSB0b0Zsb2F0KHZhbHVlc1swXSk7XG4gICAgICAgICAgICB2YWx1ZXNbMF0uc2xpY2UoLTEpID09IFwiJVwiICYmIChyZWQgLz0gMTAwKTtcbiAgICAgICAgICAgIGdyZWVuID0gdG9GbG9hdCh2YWx1ZXNbMV0pO1xuICAgICAgICAgICAgdmFsdWVzWzFdLnNsaWNlKC0xKSA9PSBcIiVcIiAmJiAoZ3JlZW4gLz0gMTAwKTtcbiAgICAgICAgICAgIGJsdWUgPSB0b0Zsb2F0KHZhbHVlc1syXSk7XG4gICAgICAgICAgICB2YWx1ZXNbMl0uc2xpY2UoLTEpID09IFwiJVwiICYmIChibHVlIC89IDEwMCk7XG4gICAgICAgICAgICAodmFsdWVzWzBdLnNsaWNlKC0zKSA9PSBcImRlZ1wiIHx8IHZhbHVlc1swXS5zbGljZSgtMSkgPT0gXCJcXHhiMFwiKSAmJiAocmVkIC89IDM2MCk7XG4gICAgICAgICAgICByZ2JbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLCA0KSA9PSBcImhzYmFcIiAmJiAob3BhY2l0eSA9IHRvRmxvYXQodmFsdWVzWzNdKSk7XG4gICAgICAgICAgICB2YWx1ZXNbM10gJiYgdmFsdWVzWzNdLnNsaWNlKC0xKSA9PSBcIiVcIiAmJiAob3BhY2l0eSAvPSAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIFNuYXAuaHNiMnJnYihyZWQsIGdyZWVuLCBibHVlLCBvcGFjaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmdiWzZdKSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSByZ2JbNl0uc3BsaXQoY29tbWFTcGFjZXMpO1xuICAgICAgICAgICAgcmVkID0gdG9GbG9hdCh2YWx1ZXNbMF0pO1xuICAgICAgICAgICAgdmFsdWVzWzBdLnNsaWNlKC0xKSA9PSBcIiVcIiAmJiAocmVkIC89IDEwMCk7XG4gICAgICAgICAgICBncmVlbiA9IHRvRmxvYXQodmFsdWVzWzFdKTtcbiAgICAgICAgICAgIHZhbHVlc1sxXS5zbGljZSgtMSkgPT0gXCIlXCIgJiYgKGdyZWVuIC89IDEwMCk7XG4gICAgICAgICAgICBibHVlID0gdG9GbG9hdCh2YWx1ZXNbMl0pO1xuICAgICAgICAgICAgdmFsdWVzWzJdLnNsaWNlKC0xKSA9PSBcIiVcIiAmJiAoYmx1ZSAvPSAxMDApO1xuICAgICAgICAgICAgKHZhbHVlc1swXS5zbGljZSgtMykgPT0gXCJkZWdcIiB8fCB2YWx1ZXNbMF0uc2xpY2UoLTEpID09IFwiXFx4YjBcIikgJiYgKHJlZCAvPSAzNjApO1xuICAgICAgICAgICAgcmdiWzFdLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNCkgPT0gXCJoc2xhXCIgJiYgKG9wYWNpdHkgPSB0b0Zsb2F0KHZhbHVlc1szXSkpO1xuICAgICAgICAgICAgdmFsdWVzWzNdICYmIHZhbHVlc1szXS5zbGljZSgtMSkgPT0gXCIlXCIgJiYgKG9wYWNpdHkgLz0gMTAwKTtcbiAgICAgICAgICAgIHJldHVybiBTbmFwLmhzbDJyZ2IocmVkLCBncmVlbiwgYmx1ZSwgb3BhY2l0eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVkID0gbW1pbihtYXRoLnJvdW5kKHJlZCksIDI1NSk7XG4gICAgICAgIGdyZWVuID0gbW1pbihtYXRoLnJvdW5kKGdyZWVuKSwgMjU1KTtcbiAgICAgICAgYmx1ZSA9IG1taW4obWF0aC5yb3VuZChibHVlKSwgMjU1KTtcbiAgICAgICAgb3BhY2l0eSA9IG1taW4obW1heChvcGFjaXR5LCAwKSwgMSk7XG4gICAgICAgIHJnYiA9IHtyOiByZWQsIGc6IGdyZWVuLCBiOiBibHVlLCB0b1N0cmluZzogcmdidG9TdHJpbmd9O1xuICAgICAgICByZ2IuaGV4ID0gXCIjXCIgKyAoMTY3NzcyMTYgfCBibHVlIHwgZ3JlZW4gPDwgOCB8IHJlZCA8PCAxNikudG9TdHJpbmcoMTYpLnNsaWNlKDEpO1xuICAgICAgICByZ2Iub3BhY2l0eSA9IGlzKG9wYWNpdHksIFwiZmluaXRlXCIpID8gb3BhY2l0eSA6IDE7XG4gICAgICAgIHJldHVybiByZ2I7XG4gICAgfVxuICAgIHJldHVybiB7cjogLTEsIGc6IC0xLCBiOiAtMSwgaGV4OiBcIm5vbmVcIiwgZXJyb3I6IDEsIHRvU3RyaW5nOiByZ2J0b1N0cmluZ307XG59LCBTbmFwKTtcbi8qXFxcbiAqIFNuYXAuaHNiXG4gWyBtZXRob2QgXVxuICoqXG4gKiBDb252ZXJ0cyBIU0IgdmFsdWVzIHRvIGEgaGV4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvclxuIC0gaCAobnVtYmVyKSBodWVcbiAtIHMgKG51bWJlcikgc2F0dXJhdGlvblxuIC0gYiAobnVtYmVyKSB2YWx1ZSBvciBicmlnaHRuZXNzXG4gPSAoc3RyaW5nKSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yXG5cXCovXG5TbmFwLmhzYiA9IGNhY2hlcihmdW5jdGlvbiAoaCwgcywgYikge1xuICAgIHJldHVybiBTbmFwLmhzYjJyZ2IoaCwgcywgYikuaGV4O1xufSk7XG4vKlxcXG4gKiBTbmFwLmhzbFxuIFsgbWV0aG9kIF1cbiAqKlxuICogQ29udmVydHMgSFNMIHZhbHVlcyB0byBhIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sb3JcbiAtIGggKG51bWJlcikgaHVlXG4gLSBzIChudW1iZXIpIHNhdHVyYXRpb25cbiAtIGwgKG51bWJlcikgbHVtaW5vc2l0eVxuID0gKHN0cmluZykgaGV4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvclxuXFwqL1xuU25hcC5oc2wgPSBjYWNoZXIoZnVuY3Rpb24gKGgsIHMsIGwpIHtcbiAgICByZXR1cm4gU25hcC5oc2wycmdiKGgsIHMsIGwpLmhleDtcbn0pO1xuLypcXFxuICogU25hcC5yZ2JcbiBbIG1ldGhvZCBdXG4gKipcbiAqIENvbnZlcnRzIFJHQiB2YWx1ZXMgdG8gYSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yXG4gLSByIChudW1iZXIpIHJlZFxuIC0gZyAobnVtYmVyKSBncmVlblxuIC0gYiAobnVtYmVyKSBibHVlXG4gPSAoc3RyaW5nKSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yXG5cXCovXG5TbmFwLnJnYiA9IGNhY2hlcihmdW5jdGlvbiAociwgZywgYiwgbykge1xuICAgIGlmIChpcyhvLCBcImZpbml0ZVwiKSkge1xuICAgICAgICB2YXIgcm91bmQgPSBtYXRoLnJvdW5kO1xuICAgICAgICByZXR1cm4gXCJyZ2JhKFwiICsgW3JvdW5kKHIpLCByb3VuZChnKSwgcm91bmQoYiksICtvLnRvRml4ZWQoMildICsgXCIpXCI7XG4gICAgfVxuICAgIHJldHVybiBcIiNcIiArICgxNjc3NzIxNiB8IGIgfCBnIDw8IDggfCByIDw8IDE2KS50b1N0cmluZygxNikuc2xpY2UoMSk7XG59KTtcbnZhciB0b0hleCA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHZhciBpID0gZ2xvYi5kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdIHx8IGdsb2IuZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3ZnXCIpWzBdLFxuICAgICAgICByZWQgPSBcInJnYigyNTUsIDAsIDApXCI7XG4gICAgdG9IZXggPSBjYWNoZXIoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIGlmIChjb2xvci50b0xvd2VyQ2FzZSgpID09IFwicmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaS5zdHlsZS5jb2xvciA9IHJlZDtcbiAgICAgICAgaS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgICAgICB2YXIgb3V0ID0gZ2xvYi5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShpLCBFKS5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sb3JcIik7XG4gICAgICAgIHJldHVybiBvdXQgPT0gcmVkID8gbnVsbCA6IG91dDtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9IZXgoY29sb3IpO1xufSxcbmhzYnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcImhzYihcIiArIFt0aGlzLmgsIHRoaXMucywgdGhpcy5iXSArIFwiKVwiO1xufSxcbmhzbHRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcImhzbChcIiArIFt0aGlzLmgsIHRoaXMucywgdGhpcy5sXSArIFwiKVwiO1xufSxcbnJnYnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wYWNpdHkgPT0gMSB8fCB0aGlzLm9wYWNpdHkgPT0gbnVsbCA/XG4gICAgICAgICAgICB0aGlzLmhleCA6XG4gICAgICAgICAgICBcInJnYmEoXCIgKyBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5vcGFjaXR5XSArIFwiKVwiO1xufSxcbnByZXBhcmVSR0IgPSBmdW5jdGlvbiAociwgZywgYikge1xuICAgIGlmIChnID09IG51bGwgJiYgaXMociwgXCJvYmplY3RcIikgJiYgXCJyXCIgaW4gciAmJiBcImdcIiBpbiByICYmIFwiYlwiIGluIHIpIHtcbiAgICAgICAgYiA9IHIuYjtcbiAgICAgICAgZyA9IHIuZztcbiAgICAgICAgciA9IHIucjtcbiAgICB9XG4gICAgaWYgKGcgPT0gbnVsbCAmJiBpcyhyLCBzdHJpbmcpKSB7XG4gICAgICAgIHZhciBjbHIgPSBTbmFwLmdldFJHQihyKTtcbiAgICAgICAgciA9IGNsci5yO1xuICAgICAgICBnID0gY2xyLmc7XG4gICAgICAgIGIgPSBjbHIuYjtcbiAgICB9XG4gICAgaWYgKHIgPiAxIHx8IGcgPiAxIHx8IGIgPiAxKSB7XG4gICAgICAgIHIgLz0gMjU1O1xuICAgICAgICBnIC89IDI1NTtcbiAgICAgICAgYiAvPSAyNTU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyLCBnLCBiXTtcbn0sXG5wYWNrYWdlUkdCID0gZnVuY3Rpb24gKHIsIGcsIGIsIG8pIHtcbiAgICByID0gbWF0aC5yb3VuZChyICogMjU1KTtcbiAgICBnID0gbWF0aC5yb3VuZChnICogMjU1KTtcbiAgICBiID0gbWF0aC5yb3VuZChiICogMjU1KTtcbiAgICB2YXIgcmdiID0ge1xuICAgICAgICByOiByLFxuICAgICAgICBnOiBnLFxuICAgICAgICBiOiBiLFxuICAgICAgICBvcGFjaXR5OiBpcyhvLCBcImZpbml0ZVwiKSA/IG8gOiAxLFxuICAgICAgICBoZXg6IFNuYXAucmdiKHIsIGcsIGIpLFxuICAgICAgICB0b1N0cmluZzogcmdidG9TdHJpbmdcbiAgICB9O1xuICAgIGlzKG8sIFwiZmluaXRlXCIpICYmIChyZ2Iub3BhY2l0eSA9IG8pO1xuICAgIHJldHVybiByZ2I7XG59O1xuLypcXFxuICogU25hcC5jb2xvclxuIFsgbWV0aG9kIF1cbiAqKlxuICogUGFyc2VzIHRoZSBjb2xvciBzdHJpbmcgYW5kIHJldHVybnMgYW4gb2JqZWN0IGZlYXR1cmluZyB0aGUgY29sb3IncyBjb21wb25lbnQgdmFsdWVzXG4gLSBjbHIgKHN0cmluZykgY29sb3Igc3RyaW5nIGluIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGZvcm1hdHMgKHNlZSBAU25hcC5nZXRSR0IpXG4gPSAob2JqZWN0KSBDb21iaW5lZCBSR0IvSFNCIG9iamVjdCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiBvIHtcbiBvICAgICByIChudW1iZXIpIHJlZCxcbiBvICAgICBnIChudW1iZXIpIGdyZWVuLFxuIG8gICAgIGIgKG51bWJlcikgYmx1ZSxcbiBvICAgICBoZXggKHN0cmluZykgY29sb3IgaW4gSFRNTC9DU1MgZm9ybWF0OiAj4oCi4oCi4oCi4oCi4oCi4oCiLFxuIG8gICAgIGVycm9yIChib29sZWFuKSBgdHJ1ZWAgaWYgc3RyaW5nIGNhbid0IGJlIHBhcnNlZCxcbiBvICAgICBoIChudW1iZXIpIGh1ZSxcbiBvICAgICBzIChudW1iZXIpIHNhdHVyYXRpb24sXG4gbyAgICAgdiAobnVtYmVyKSB2YWx1ZSAoYnJpZ2h0bmVzcyksXG4gbyAgICAgbCAobnVtYmVyKSBsaWdodG5lc3NcbiBvIH1cblxcKi9cblNuYXAuY29sb3IgPSBmdW5jdGlvbiAoY2xyKSB7XG4gICAgdmFyIHJnYjtcbiAgICBpZiAoaXMoY2xyLCBcIm9iamVjdFwiKSAmJiBcImhcIiBpbiBjbHIgJiYgXCJzXCIgaW4gY2xyICYmIFwiYlwiIGluIGNscikge1xuICAgICAgICByZ2IgPSBTbmFwLmhzYjJyZ2IoY2xyKTtcbiAgICAgICAgY2xyLnIgPSByZ2IucjtcbiAgICAgICAgY2xyLmcgPSByZ2IuZztcbiAgICAgICAgY2xyLmIgPSByZ2IuYjtcbiAgICAgICAgY2xyLm9wYWNpdHkgPSAxO1xuICAgICAgICBjbHIuaGV4ID0gcmdiLmhleDtcbiAgICB9IGVsc2UgaWYgKGlzKGNsciwgXCJvYmplY3RcIikgJiYgXCJoXCIgaW4gY2xyICYmIFwic1wiIGluIGNsciAmJiBcImxcIiBpbiBjbHIpIHtcbiAgICAgICAgcmdiID0gU25hcC5oc2wycmdiKGNscik7XG4gICAgICAgIGNsci5yID0gcmdiLnI7XG4gICAgICAgIGNsci5nID0gcmdiLmc7XG4gICAgICAgIGNsci5iID0gcmdiLmI7XG4gICAgICAgIGNsci5vcGFjaXR5ID0gMTtcbiAgICAgICAgY2xyLmhleCA9IHJnYi5oZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzKGNsciwgXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgIGNsciA9IFNuYXAuZ2V0UkdCKGNscik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKGNsciwgXCJvYmplY3RcIikgJiYgXCJyXCIgaW4gY2xyICYmIFwiZ1wiIGluIGNsciAmJiBcImJcIiBpbiBjbHIgJiYgIShcImVycm9yXCIgaW4gY2xyKSkge1xuICAgICAgICAgICAgcmdiID0gU25hcC5yZ2IyaHNsKGNscik7XG4gICAgICAgICAgICBjbHIuaCA9IHJnYi5oO1xuICAgICAgICAgICAgY2xyLnMgPSByZ2IucztcbiAgICAgICAgICAgIGNsci5sID0gcmdiLmw7XG4gICAgICAgICAgICByZ2IgPSBTbmFwLnJnYjJoc2IoY2xyKTtcbiAgICAgICAgICAgIGNsci52ID0gcmdiLmI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbHIgPSB7aGV4OiBcIm5vbmVcIn07XG4gICAgICAgICAgICBjbHIuciA9IGNsci5nID0gY2xyLmIgPSBjbHIuaCA9IGNsci5zID0gY2xyLnYgPSBjbHIubCA9IC0xO1xuICAgICAgICAgICAgY2xyLmVycm9yID0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbHIudG9TdHJpbmcgPSByZ2J0b1N0cmluZztcbiAgICByZXR1cm4gY2xyO1xufTtcbi8qXFxcbiAqIFNuYXAuaHNiMnJnYlxuIFsgbWV0aG9kIF1cbiAqKlxuICogQ29udmVydHMgSFNCIHZhbHVlcyB0byBhbiBSR0Igb2JqZWN0XG4gLSBoIChudW1iZXIpIGh1ZVxuIC0gcyAobnVtYmVyKSBzYXR1cmF0aW9uXG4gLSB2IChudW1iZXIpIHZhbHVlIG9yIGJyaWdodG5lc3NcbiA9IChvYmplY3QpIFJHQiBvYmplY3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gbyB7XG4gbyAgICAgciAobnVtYmVyKSByZWQsXG4gbyAgICAgZyAobnVtYmVyKSBncmVlbixcbiBvICAgICBiIChudW1iZXIpIGJsdWUsXG4gbyAgICAgaGV4IChzdHJpbmcpIGNvbG9yIGluIEhUTUwvQ1NTIGZvcm1hdDogI+KAouKAouKAouKAouKAouKAolxuIG8gfVxuXFwqL1xuU25hcC5oc2IycmdiID0gZnVuY3Rpb24gKGgsIHMsIHYsIG8pIHtcbiAgICBpZiAoaXMoaCwgXCJvYmplY3RcIikgJiYgXCJoXCIgaW4gaCAmJiBcInNcIiBpbiBoICYmIFwiYlwiIGluIGgpIHtcbiAgICAgICAgdiA9IGguYjtcbiAgICAgICAgcyA9IGgucztcbiAgICAgICAgbyA9IGgubztcbiAgICAgICAgaCA9IGguaDtcbiAgICB9XG4gICAgaCAqPSAzNjA7XG4gICAgdmFyIFIsIEcsIEIsIFgsIEM7XG4gICAgaCA9IGggJSAzNjAgLyA2MDtcbiAgICBDID0gdiAqIHM7XG4gICAgWCA9IEMgKiAoMSAtIGFicyhoICUgMiAtIDEpKTtcbiAgICBSID0gRyA9IEIgPSB2IC0gQztcblxuICAgIGggPSB+fmg7XG4gICAgUiArPSBbQywgWCwgMCwgMCwgWCwgQ11baF07XG4gICAgRyArPSBbWCwgQywgQywgWCwgMCwgMF1baF07XG4gICAgQiArPSBbMCwgMCwgWCwgQywgQywgWF1baF07XG4gICAgcmV0dXJuIHBhY2thZ2VSR0IoUiwgRywgQiwgbyk7XG59O1xuLypcXFxuICogU25hcC5oc2wycmdiXG4gWyBtZXRob2QgXVxuICoqXG4gKiBDb252ZXJ0cyBIU0wgdmFsdWVzIHRvIGFuIFJHQiBvYmplY3RcbiAtIGggKG51bWJlcikgaHVlXG4gLSBzIChudW1iZXIpIHNhdHVyYXRpb25cbiAtIGwgKG51bWJlcikgbHVtaW5vc2l0eVxuID0gKG9iamVjdCkgUkdCIG9iamVjdCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiBvIHtcbiBvICAgICByIChudW1iZXIpIHJlZCxcbiBvICAgICBnIChudW1iZXIpIGdyZWVuLFxuIG8gICAgIGIgKG51bWJlcikgYmx1ZSxcbiBvICAgICBoZXggKHN0cmluZykgY29sb3IgaW4gSFRNTC9DU1MgZm9ybWF0OiAj4oCi4oCi4oCi4oCi4oCi4oCiXG4gbyB9XG5cXCovXG5TbmFwLmhzbDJyZ2IgPSBmdW5jdGlvbiAoaCwgcywgbCwgbykge1xuICAgIGlmIChpcyhoLCBcIm9iamVjdFwiKSAmJiBcImhcIiBpbiBoICYmIFwic1wiIGluIGggJiYgXCJsXCIgaW4gaCkge1xuICAgICAgICBsID0gaC5sO1xuICAgICAgICBzID0gaC5zO1xuICAgICAgICBoID0gaC5oO1xuICAgIH1cbiAgICBpZiAoaCA+IDEgfHwgcyA+IDEgfHwgbCA+IDEpIHtcbiAgICAgICAgaCAvPSAzNjA7XG4gICAgICAgIHMgLz0gMTAwO1xuICAgICAgICBsIC89IDEwMDtcbiAgICB9XG4gICAgaCAqPSAzNjA7XG4gICAgdmFyIFIsIEcsIEIsIFgsIEM7XG4gICAgaCA9IGggJSAzNjAgLyA2MDtcbiAgICBDID0gMiAqIHMgKiAobCA8IC41ID8gbCA6IDEgLSBsKTtcbiAgICBYID0gQyAqICgxIC0gYWJzKGggJSAyIC0gMSkpO1xuICAgIFIgPSBHID0gQiA9IGwgLSBDIC8gMjtcblxuICAgIGggPSB+fmg7XG4gICAgUiArPSBbQywgWCwgMCwgMCwgWCwgQ11baF07XG4gICAgRyArPSBbWCwgQywgQywgWCwgMCwgMF1baF07XG4gICAgQiArPSBbMCwgMCwgWCwgQywgQywgWF1baF07XG4gICAgcmV0dXJuIHBhY2thZ2VSR0IoUiwgRywgQiwgbyk7XG59O1xuLypcXFxuICogU25hcC5yZ2IyaHNiXG4gWyBtZXRob2QgXVxuICoqXG4gKiBDb252ZXJ0cyBSR0IgdmFsdWVzIHRvIGFuIEhTQiBvYmplY3RcbiAtIHIgKG51bWJlcikgcmVkXG4gLSBnIChudW1iZXIpIGdyZWVuXG4gLSBiIChudW1iZXIpIGJsdWVcbiA9IChvYmplY3QpIEhTQiBvYmplY3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gbyB7XG4gbyAgICAgaCAobnVtYmVyKSBodWUsXG4gbyAgICAgcyAobnVtYmVyKSBzYXR1cmF0aW9uLFxuIG8gICAgIGIgKG51bWJlcikgYnJpZ2h0bmVzc1xuIG8gfVxuXFwqL1xuU25hcC5yZ2IyaHNiID0gZnVuY3Rpb24gKHIsIGcsIGIpIHtcbiAgICBiID0gcHJlcGFyZVJHQihyLCBnLCBiKTtcbiAgICByID0gYlswXTtcbiAgICBnID0gYlsxXTtcbiAgICBiID0gYlsyXTtcblxuICAgIHZhciBILCBTLCBWLCBDO1xuICAgIFYgPSBtbWF4KHIsIGcsIGIpO1xuICAgIEMgPSBWIC0gbW1pbihyLCBnLCBiKTtcbiAgICBIID0gQyA9PSAwID8gbnVsbCA6XG4gICAgICAgIFYgPT0gciA/IChnIC0gYikgLyBDIDpcbiAgICAgICAgViA9PSBnID8gKGIgLSByKSAvIEMgKyAyIDpcbiAgICAgICAgICAgICAgICAgKHIgLSBnKSAvIEMgKyA0O1xuICAgIEggPSAoSCArIDM2MCkgJSA2ICogNjAgLyAzNjA7XG4gICAgUyA9IEMgPT0gMCA/IDAgOiBDIC8gVjtcbiAgICByZXR1cm4ge2g6IEgsIHM6IFMsIGI6IFYsIHRvU3RyaW5nOiBoc2J0b1N0cmluZ307XG59O1xuLypcXFxuICogU25hcC5yZ2IyaHNsXG4gWyBtZXRob2QgXVxuICoqXG4gKiBDb252ZXJ0cyBSR0IgdmFsdWVzIHRvIGFuIEhTTCBvYmplY3RcbiAtIHIgKG51bWJlcikgcmVkXG4gLSBnIChudW1iZXIpIGdyZWVuXG4gLSBiIChudW1iZXIpIGJsdWVcbiA9IChvYmplY3QpIEhTTCBvYmplY3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gbyB7XG4gbyAgICAgaCAobnVtYmVyKSBodWUsXG4gbyAgICAgcyAobnVtYmVyKSBzYXR1cmF0aW9uLFxuIG8gICAgIGwgKG51bWJlcikgbHVtaW5vc2l0eVxuIG8gfVxuXFwqL1xuU25hcC5yZ2IyaHNsID0gZnVuY3Rpb24gKHIsIGcsIGIpIHtcbiAgICBiID0gcHJlcGFyZVJHQihyLCBnLCBiKTtcbiAgICByID0gYlswXTtcbiAgICBnID0gYlsxXTtcbiAgICBiID0gYlsyXTtcblxuICAgIHZhciBILCBTLCBMLCBNLCBtLCBDO1xuICAgIE0gPSBtbWF4KHIsIGcsIGIpO1xuICAgIG0gPSBtbWluKHIsIGcsIGIpO1xuICAgIEMgPSBNIC0gbTtcbiAgICBIID0gQyA9PSAwID8gbnVsbCA6XG4gICAgICAgIE0gPT0gciA/IChnIC0gYikgLyBDIDpcbiAgICAgICAgTSA9PSBnID8gKGIgLSByKSAvIEMgKyAyIDpcbiAgICAgICAgICAgICAgICAgKHIgLSBnKSAvIEMgKyA0O1xuICAgIEggPSAoSCArIDM2MCkgJSA2ICogNjAgLyAzNjA7XG4gICAgTCA9IChNICsgbSkgLyAyO1xuICAgIFMgPSBDID09IDAgPyAwIDpcbiAgICAgICAgIEwgPCAuNSA/IEMgLyAoMiAqIEwpIDpcbiAgICAgICAgICAgICAgICAgIEMgLyAoMiAtIDIgKiBMKTtcbiAgICByZXR1cm4ge2g6IEgsIHM6IFMsIGw6IEwsIHRvU3RyaW5nOiBoc2x0b1N0cmluZ307XG59O1xuXG4vLyBUcmFuc2Zvcm1hdGlvbnNcbi8qXFxcbiAqIFNuYXAucGFyc2VQYXRoU3RyaW5nXG4gWyBtZXRob2QgXVxuICoqXG4gKiBVdGlsaXR5IG1ldGhvZFxuICoqXG4gKiBQYXJzZXMgZ2l2ZW4gcGF0aCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGF0aCBzZWdtZW50c1xuIC0gcGF0aFN0cmluZyAoc3RyaW5nfGFycmF5KSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBzZWdtZW50cyAoaW4gdGhlIGxhc3QgY2FzZSBpdCBpcyByZXR1cm5lZCBzdHJhaWdodCBhd2F5KVxuID0gKGFycmF5KSBhcnJheSBvZiBzZWdtZW50c1xuXFwqL1xuU25hcC5wYXJzZVBhdGhTdHJpbmcgPSBmdW5jdGlvbiAocGF0aFN0cmluZykge1xuICAgIGlmICghcGF0aFN0cmluZykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHB0aCA9IFNuYXAucGF0aChwYXRoU3RyaW5nKTtcbiAgICBpZiAocHRoLmFycikge1xuICAgICAgICByZXR1cm4gU25hcC5wYXRoLmNsb25lKHB0aC5hcnIpO1xuICAgIH1cblxuICAgIHZhciBwYXJhbUNvdW50cyA9IHthOiA3LCBjOiA2LCBvOiAyLCBoOiAxLCBsOiAyLCBtOiAyLCByOiA0LCBxOiA0LCBzOiA0LCB0OiAyLCB2OiAxLCB1OiAzLCB6OiAwfSxcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgIGlmIChpcyhwYXRoU3RyaW5nLCBcImFycmF5XCIpICYmIGlzKHBhdGhTdHJpbmdbMF0sIFwiYXJyYXlcIikpIHsgLy8gcm91Z2ggYXNzdW1wdGlvblxuICAgICAgICBkYXRhID0gU25hcC5wYXRoLmNsb25lKHBhdGhTdHJpbmcpO1xuICAgIH1cbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgIFN0cihwYXRoU3RyaW5nKS5yZXBsYWNlKHBhdGhDb21tYW5kLCBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IFtdLFxuICAgICAgICAgICAgICAgIG5hbWUgPSBiLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjLnJlcGxhY2UocGF0aFZhbHVlcywgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBiICYmIHBhcmFtcy5wdXNoKCtiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJtXCIgJiYgcGFyYW1zLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goW2JdLmNvbmNhdChwYXJhbXMuc3BsaWNlKDAsIDIpKSk7XG4gICAgICAgICAgICAgICAgbmFtZSA9IFwibFwiO1xuICAgICAgICAgICAgICAgIGIgPSBiID09IFwibVwiID8gXCJsXCIgOiBcIkxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lID09IFwib1wiICYmIHBhcmFtcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChbYiwgcGFyYW1zWzBdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSA9PSBcInJcIikge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChbYl0uY29uY2F0KHBhcmFtcykpO1xuICAgICAgICAgICAgfSBlbHNlIHdoaWxlIChwYXJhbXMubGVuZ3RoID49IHBhcmFtQ291bnRzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKFtiXS5jb25jYXQocGFyYW1zLnNwbGljZSgwLCBwYXJhbUNvdW50c1tuYW1lXSkpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtQ291bnRzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRhdGEudG9TdHJpbmcgPSBTbmFwLnBhdGgudG9TdHJpbmc7XG4gICAgcHRoLmFyciA9IFNuYXAucGF0aC5jbG9uZShkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbn07XG4vKlxcXG4gKiBTbmFwLnBhcnNlVHJhbnNmb3JtU3RyaW5nXG4gWyBtZXRob2QgXVxuICoqXG4gKiBVdGlsaXR5IG1ldGhvZFxuICoqXG4gKiBQYXJzZXMgZ2l2ZW4gdHJhbnNmb3JtIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHRyYW5zZm9ybWF0aW9uc1xuIC0gVFN0cmluZyAoc3RyaW5nfGFycmF5KSB0cmFuc2Zvcm0gc3RyaW5nIG9yIGFycmF5IG9mIHRyYW5zZm9ybWF0aW9ucyAoaW4gdGhlIGxhc3QgY2FzZSBpdCBpcyByZXR1cm5lZCBzdHJhaWdodCBhd2F5KVxuID0gKGFycmF5KSBhcnJheSBvZiB0cmFuc2Zvcm1hdGlvbnNcblxcKi9cbnZhciBwYXJzZVRyYW5zZm9ybVN0cmluZyA9IFNuYXAucGFyc2VUcmFuc2Zvcm1TdHJpbmcgPSBmdW5jdGlvbiAoVFN0cmluZykge1xuICAgIGlmICghVFN0cmluZykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHBhcmFtQ291bnRzID0ge3I6IDMsIHM6IDQsIHQ6IDIsIG06IDZ9LFxuICAgICAgICBkYXRhID0gW107XG4gICAgaWYgKGlzKFRTdHJpbmcsIFwiYXJyYXlcIikgJiYgaXMoVFN0cmluZ1swXSwgXCJhcnJheVwiKSkgeyAvLyByb3VnaCBhc3N1bXB0aW9uXG4gICAgICAgIGRhdGEgPSBTbmFwLnBhdGguY2xvbmUoVFN0cmluZyk7XG4gICAgfVxuICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgU3RyKFRTdHJpbmcpLnJlcGxhY2UodENvbW1hbmQsIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gW10sXG4gICAgICAgICAgICAgICAgbmFtZSA9IGIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGMucmVwbGFjZShwYXRoVmFsdWVzLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIGIgJiYgcGFyYW1zLnB1c2goK2IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLnB1c2goW2JdLmNvbmNhdChwYXJhbXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRhdGEudG9TdHJpbmcgPSBTbmFwLnBhdGgudG9TdHJpbmc7XG4gICAgcmV0dXJuIGRhdGE7XG59O1xuZnVuY3Rpb24gc3ZnVHJhbnNmb3JtMnN0cmluZyh0c3RyKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHRzdHIgPSB0c3RyLnJlcGxhY2UoLyg/Ol58XFxzKShcXHcrKVxcKChbXildKylcXCkvZywgZnVuY3Rpb24gKGFsbCwgbmFtZSwgcGFyYW1zKSB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJyb3RhdGVcIiAmJiBwYXJhbXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwic2NhbGVcIikge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNsaWNlKDAsIDIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaCgwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChwYXJhbXNbMF0sIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwic2tld1hcIikge1xuICAgICAgICAgICAgcmVzLnB1c2goW1wibVwiLCAxLCAwLCBtYXRoLnRhbihyYWQocGFyYW1zWzBdKSksIDEsIDAsIDBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09IFwic2tld1lcIikge1xuICAgICAgICAgICAgcmVzLnB1c2goW1wibVwiLCAxLCBtYXRoLnRhbihyYWQocGFyYW1zWzBdKSksIDAsIDEsIDAsIDBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKFtuYW1lLmNoYXJBdCgwKV0uY29uY2F0KHBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbn1cblNuYXAuXy5zdmdUcmFuc2Zvcm0yc3RyaW5nID0gc3ZnVHJhbnNmb3JtMnN0cmluZztcblNuYXAuXy5yZ1RyYW5zZm9ybSA9IC9eW2Etel1bXFxzXSotP1xcLj9cXGQvaTtcbmZ1bmN0aW9uIHRyYW5zZm9ybTJtYXRyaXgodHN0ciwgYmJveCkge1xuICAgIHZhciB0ZGF0YSA9IHBhcnNlVHJhbnNmb3JtU3RyaW5nKHRzdHIpLFxuICAgICAgICBtID0gbmV3IFNuYXAuTWF0cml4O1xuICAgIGlmICh0ZGF0YSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0ZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRkYXRhW2ldLFxuICAgICAgICAgICAgICAgIHRsZW4gPSB0Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gU3RyKHRbMF0pLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgYWJzb2x1dGUgPSB0WzBdICE9IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgaW52ZXIgPSBhYnNvbHV0ZSA/IG0uaW52ZXJ0KCkgOiAwLFxuICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgICAgIHgyLFxuICAgICAgICAgICAgICAgIHkyLFxuICAgICAgICAgICAgICAgIGJiO1xuICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gXCJ0XCIgJiYgdGxlbiA9PSAyKXtcbiAgICAgICAgICAgICAgICBtLnRyYW5zbGF0ZSh0WzFdLCAwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInRcIiAmJiB0bGVuID09IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgeDEgPSBpbnZlci54KDAsIDApO1xuICAgICAgICAgICAgICAgICAgICB5MSA9IGludmVyLnkoMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHgyID0gaW52ZXIueCh0WzFdLCB0WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgeTIgPSBpbnZlci55KHRbMV0sIHRbMl0pO1xuICAgICAgICAgICAgICAgICAgICBtLnRyYW5zbGF0ZSh4MiAtIHgxLCB5MiAtIHkxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtLnRyYW5zbGF0ZSh0WzFdLCB0WzJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGxlbiA9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJiID0gYmIgfHwgYmJveDtcbiAgICAgICAgICAgICAgICAgICAgbS5yb3RhdGUodFsxXSwgYmIueCArIGJiLndpZHRoIC8gMiwgYmIueSArIGJiLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGxlbiA9PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDIgPSBpbnZlci54KHRbMl0sIHRbM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBpbnZlci55KHRbMl0sIHRbM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbS5yb3RhdGUodFsxXSwgeDIsIHkyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0ucm90YXRlKHRbMV0sIHRbMl0sIHRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRsZW4gPT0gMiB8fCB0bGVuID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmIgPSBiYiB8fCBiYm94O1xuICAgICAgICAgICAgICAgICAgICBtLnNjYWxlKHRbMV0sIHRbdGxlbiAtIDFdLCBiYi54ICsgYmIud2lkdGggLyAyLCBiYi55ICsgYmIuaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bGVuID09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFic29sdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4MiA9IGludmVyLngodFsyXSwgdFszXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MiA9IGludmVyLnkodFsyXSwgdFszXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtLnNjYWxlKHRbMV0sIHRbMV0sIHgyLCB5Mik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtLnNjYWxlKHRbMV0sIHRbMV0sIHRbMl0sIHRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bGVuID09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFic29sdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4MiA9IGludmVyLngodFszXSwgdFs0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MiA9IGludmVyLnkodFszXSwgdFs0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtLnNjYWxlKHRbMV0sIHRbMl0sIHgyLCB5Mik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtLnNjYWxlKHRbMV0sIHRbMl0sIHRbM10sIHRbNF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwibVwiICYmIHRsZW4gPT0gNykge1xuICAgICAgICAgICAgICAgIG0uYWRkKHRbMV0sIHRbMl0sIHRbM10sIHRbNF0sIHRbNV0sIHRbNl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtO1xufVxuU25hcC5fLnRyYW5zZm9ybTJtYXRyaXggPSB0cmFuc2Zvcm0ybWF0cml4O1xuU25hcC5fdW5pdDJweCA9IHVuaXQycHg7XG52YXIgY29udGFpbnMgPSBnbG9iLmRvYy5jb250YWlucyB8fCBnbG9iLmRvYy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuICAgICAgICAgICAgYnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gYSA9PSBidXAgfHwgISEoYnVwICYmIGJ1cC5ub2RlVHlwZSA9PSAxICYmIChcbiAgICAgICAgICAgICAgICBhZG93bi5jb250YWlucyA/XG4gICAgICAgICAgICAgICAgICAgIGFkb3duLmNvbnRhaW5zKGJ1cCkgOlxuICAgICAgICAgICAgICAgICAgICBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYnVwKSAmIDE2XG4gICAgICAgICAgICApKTtcbiAgICB9IDpcbiAgICBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBpZiAoYikge1xuICAgICAgICAgICAgd2hpbGUgKGIpIHtcbiAgICAgICAgICAgICAgICBiID0gYi5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChiID09IGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuZnVuY3Rpb24gZ2V0U29tZURlZnMoZWwpIHtcbiAgICB2YXIgcCA9IGVsLm5vZGUub3duZXJTVkdFbGVtZW50ICYmIHdyYXAoZWwubm9kZS5vd25lclNWR0VsZW1lbnQpIHx8XG4gICAgICAgICAgICBlbC5ub2RlLnBhcmVudE5vZGUgJiYgd3JhcChlbC5ub2RlLnBhcmVudE5vZGUpIHx8XG4gICAgICAgICAgICBTbmFwLnNlbGVjdChcInN2Z1wiKSB8fFxuICAgICAgICAgICAgU25hcCgwLCAwKSxcbiAgICAgICAgcGRlZnMgPSBwLnNlbGVjdChcImRlZnNcIiksXG4gICAgICAgIGRlZnMgID0gcGRlZnMgPT0gbnVsbCA/IGZhbHNlIDogcGRlZnMubm9kZTtcbiAgICBpZiAoIWRlZnMpIHtcbiAgICAgICAgZGVmcyA9IG1ha2UoXCJkZWZzXCIsIHAubm9kZSkubm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZnM7XG59XG5mdW5jdGlvbiBnZXRTb21lU1ZHKGVsKSB7XG4gICAgcmV0dXJuIGVsLm5vZGUub3duZXJTVkdFbGVtZW50ICYmIHdyYXAoZWwubm9kZS5vd25lclNWR0VsZW1lbnQpIHx8IFNuYXAuc2VsZWN0KFwic3ZnXCIpO1xufVxuU25hcC5fLmdldFNvbWVEZWZzID0gZ2V0U29tZURlZnM7XG5TbmFwLl8uZ2V0U29tZVNWRyA9IGdldFNvbWVTVkc7XG5mdW5jdGlvbiB1bml0MnB4KGVsLCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBzdmcgPSBnZXRTb21lU1ZHKGVsKS5ub2RlLFxuICAgICAgICBvdXQgPSB7fSxcbiAgICAgICAgbWdyID0gc3ZnLnF1ZXJ5U2VsZWN0b3IoXCIuc3ZnLS0tbWdyXCIpO1xuICAgIGlmICghbWdyKSB7XG4gICAgICAgIG1nciA9ICQoXCJyZWN0XCIpO1xuICAgICAgICAkKG1nciwge3g6IC05ZTksIHk6IC05ZTksIHdpZHRoOiAxMCwgaGVpZ2h0OiAxMCwgXCJjbGFzc1wiOiBcInN2Zy0tLW1nclwiLCBmaWxsOiBcIm5vbmVcIn0pO1xuICAgICAgICBzdmcuYXBwZW5kQ2hpbGQobWdyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Vyh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsID09ICt2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgJChtZ3IsIHt3aWR0aDogdmFsfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbWdyLmdldEJCb3goKS53aWR0aDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0SCh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsID09ICt2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgJChtZ3IsIHtoZWlnaHQ6IHZhbH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG1nci5nZXRCQm94KCkuaGVpZ2h0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZXQobmFtLCBmKSB7XG4gICAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIG91dFtuYW1dID0gZihlbC5hdHRyKG5hbSkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtID09IG5hbWUpIHtcbiAgICAgICAgICAgIG91dCA9IGYodmFsdWUgPT0gbnVsbCA/IGVsLmF0dHIobmFtKSB8fCAwIDogdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoZWwudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVjdFwiOlxuICAgICAgICAgICAgc2V0KFwicnhcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJyeVwiLCBnZXRIKTtcbiAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICBzZXQoXCJ3aWR0aFwiLCBnZXRXKTtcbiAgICAgICAgICAgIHNldChcImhlaWdodFwiLCBnZXRIKTtcbiAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgIHNldChcInhcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJ5XCIsIGdldEgpO1xuICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNpcmNsZVwiOlxuICAgICAgICAgICAgc2V0KFwiY3hcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJjeVwiLCBnZXRIKTtcbiAgICAgICAgICAgIHNldChcInJcIiwgZ2V0Vyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgICAgICAgc2V0KFwiY3hcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJjeVwiLCBnZXRIKTtcbiAgICAgICAgICAgIHNldChcInJ4XCIsIGdldFcpO1xuICAgICAgICAgICAgc2V0KFwicnlcIiwgZ2V0SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibGluZVwiOlxuICAgICAgICAgICAgc2V0KFwieDFcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJ4MlwiLCBnZXRXKTtcbiAgICAgICAgICAgIHNldChcInkxXCIsIGdldEgpO1xuICAgICAgICAgICAgc2V0KFwieTJcIiwgZ2V0SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWFya2VyXCI6XG4gICAgICAgICAgICBzZXQoXCJyZWZYXCIsIGdldFcpO1xuICAgICAgICAgICAgc2V0KFwibWFya2VyV2lkdGhcIiwgZ2V0Vyk7XG4gICAgICAgICAgICBzZXQoXCJyZWZZXCIsIGdldEgpO1xuICAgICAgICAgICAgc2V0KFwibWFya2VySGVpZ2h0XCIsIGdldEgpO1xuICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInJhZGlhbEdyYWRpZW50XCI6XG4gICAgICAgICAgICBzZXQoXCJmeFwiLCBnZXRXKTtcbiAgICAgICAgICAgIHNldChcImZ5XCIsIGdldEgpO1xuICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRzcGFuXCI6XG4gICAgICAgICAgICBzZXQoXCJkeFwiLCBnZXRXKTtcbiAgICAgICAgICAgIHNldChcImR5XCIsIGdldEgpO1xuICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldChuYW1lLCBnZXRXKTtcbiAgICB9XG4gICAgc3ZnLnJlbW92ZUNoaWxkKG1ncik7XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qXFxcbiAqIFNuYXAuc2VsZWN0XG4gWyBtZXRob2QgXVxuICoqXG4gKiBXcmFwcyBhIERPTSBlbGVtZW50IHNwZWNpZmllZCBieSBDU1Mgc2VsZWN0b3IgYXMgQEVsZW1lbnRcbiAtIHF1ZXJ5IChzdHJpbmcpIENTUyBzZWxlY3RvciBvZiB0aGUgZWxlbWVudFxuID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcblxcKi9cblNuYXAuc2VsZWN0ID0gZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBTdHIocXVlcnkpLnJlcGxhY2UoLyhbXlxcXFxdKTovZywgXCIkMVxcXFw6XCIpO1xuICAgIHJldHVybiB3cmFwKGdsb2IuZG9jLnF1ZXJ5U2VsZWN0b3IocXVlcnkpKTtcbn07XG4vKlxcXG4gKiBTbmFwLnNlbGVjdEFsbFxuIFsgbWV0aG9kIF1cbiAqKlxuICogV3JhcHMgRE9NIGVsZW1lbnRzIHNwZWNpZmllZCBieSBDU1Mgc2VsZWN0b3IgYXMgc2V0IG9yIGFycmF5IG9mIEBFbGVtZW50XG4gLSBxdWVyeSAoc3RyaW5nKSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGVsZW1lbnRcbiA9IChFbGVtZW50KSB0aGUgY3VycmVudCBlbGVtZW50XG5cXCovXG5TbmFwLnNlbGVjdEFsbCA9IGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHZhciBub2RlbGlzdCA9IGdsb2IuZG9jLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLFxuICAgICAgICBzZXQgPSAoU25hcC5zZXQgfHwgQXJyYXkpKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZXQucHVzaCh3cmFwKG5vZGVsaXN0W2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBzZXQ7XG59O1xuXG5mdW5jdGlvbiBhZGQyZ3JvdXAobGlzdCkge1xuICAgIGlmICghaXMobGlzdCwgXCJhcnJheVwiKSkge1xuICAgICAgICBsaXN0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICB9XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgbm9kZSA9IHRoaXMubm9kZTtcbiAgICB3aGlsZSAodGhpc1tpXSkgZGVsZXRlIHRoaXNbaSsrXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09IFwic2V0XCIpIHtcbiAgICAgICAgICAgIGxpc3RbaV0uZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGVsLm5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGxpc3RbaV0ubm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzW2orK10gPSB3cmFwKGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG4vLyBIdWIgZ2FyYmFnZSBjb2xsZWN0b3IgZXZlcnkgMTBzXG5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGh1YikgaWYgKGh1YltoYXNdKGtleSkpIHtcbiAgICAgICAgdmFyIGVsID0gaHViW2tleV0sXG4gICAgICAgICAgICBub2RlID0gZWwubm9kZTtcbiAgICAgICAgaWYgKGVsLnR5cGUgIT0gXCJzdmdcIiAmJiAhbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgZWwudHlwZSA9PSBcInN2Z1wiICYmICghbm9kZS5wYXJlbnROb2RlIHx8IFwib3duZXJTVkdFbGVtZW50XCIgaW4gbm9kZS5wYXJlbnROb2RlICYmICFub2RlLm93bmVyU1ZHRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBodWJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn0sIDFlNCk7XG5mdW5jdGlvbiBFbGVtZW50KGVsKSB7XG4gICAgaWYgKGVsLnNuYXAgaW4gaHViKSB7XG4gICAgICAgIHJldHVybiBodWJbZWwuc25hcF07XG4gICAgfVxuICAgIHZhciBzdmc7XG4gICAgdHJ5IHtcbiAgICAgICAgc3ZnID0gZWwub3duZXJTVkdFbGVtZW50O1xuICAgIH0gY2F0Y2goZSkge31cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5ub2RlXG4gICAgIFsgcHJvcGVydHkgKG9iamVjdCkgXVxuICAgICAqKlxuICAgICAqIEdpdmVzIHlvdSBhIHJlZmVyZW5jZSB0byB0aGUgRE9NIG9iamVjdCwgc28geW91IGNhbiBhc3NpZ24gZXZlbnQgaGFuZGxlcnMgb3IganVzdCBtZXNzIGFyb3VuZC5cbiAgICAgPiBVc2FnZVxuICAgICB8IC8vIGRyYXcgYSBjaXJjbGUgYXQgY29vcmRpbmF0ZSAxMCwxMCB3aXRoIHJhZGl1cyBvZiAxMFxuICAgICB8IHZhciBjID0gcGFwZXIuY2lyY2xlKDEwLCAxMCwgMTApO1xuICAgICB8IGMubm9kZS5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICB8ICAgICBjLmF0dHIoXCJmaWxsXCIsIFwicmVkXCIpO1xuICAgICB8IH07XG4gICAgXFwqL1xuICAgIHRoaXMubm9kZSA9IGVsO1xuICAgIGlmIChzdmcpIHtcbiAgICAgICAgdGhpcy5wYXBlciA9IG5ldyBQYXBlcihzdmcpO1xuICAgIH1cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC50eXBlXG4gICAgIFsgcHJvcGVydHkgKHN0cmluZykgXVxuICAgICAqKlxuICAgICAqIFNWRyB0YWcgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICBcXCovXG4gICAgdGhpcy50eXBlID0gZWwudGFnTmFtZSB8fCBlbC5ub2RlTmFtZTtcbiAgICB2YXIgaWQgPSB0aGlzLmlkID0gSUQodGhpcyk7XG4gICAgdGhpcy5hbmltcyA9IHt9O1xuICAgIHRoaXMuXyA9IHtcbiAgICAgICAgdHJhbnNmb3JtOiBbXVxuICAgIH07XG4gICAgZWwuc25hcCA9IGlkO1xuICAgIGh1YltpZF0gPSB0aGlzO1xuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJnXCIpIHtcbiAgICAgICAgdGhpcy5hZGQgPSBhZGQyZ3JvdXA7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgaW4ge2c6IDEsIG1hc2s6IDEsIHBhdHRlcm46IDEsIHN5bWJvbDogMX0pIHtcbiAgICAgICAgZm9yICh2YXIgbWV0aG9kIGluIFBhcGVyLnByb3RvdHlwZSkgaWYgKFBhcGVyLnByb3RvdHlwZVtoYXNdKG1ldGhvZCkpIHtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kXSA9IFBhcGVyLnByb3RvdHlwZVttZXRob2RdO1xuICAgICAgICB9XG4gICAgfVxufVxuICAgLypcXFxuICAgICAqIEVsZW1lbnQuYXR0clxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogR2V0cyBvciBzZXRzIGdpdmVuIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQuXG4gICAgICoqXG4gICAgIC0gcGFyYW1zIChvYmplY3QpIGNvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiBhdHRyaWJ1dGVzIHlvdSB3YW50IHRvIHNldFxuICAgICAqIG9yXG4gICAgIC0gcGFyYW0gKHN0cmluZykgbmFtZSBvZiB0aGUgYXR0cmlidXRlXG4gICAgID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgKiBvclxuICAgICA9IChzdHJpbmcpIHZhbHVlIG9mIGF0dHJpYnV0ZVxuICAgICA+IFVzYWdlXG4gICAgIHwgZWwuYXR0cih7XG4gICAgIHwgICAgIGZpbGw6IFwiI2ZjMFwiLFxuICAgICB8ICAgICBzdHJva2U6IFwiIzAwMFwiLFxuICAgICB8ICAgICBzdHJva2VXaWR0aDogMiwgLy8gQ2FtZWxDYXNlLi4uXG4gICAgIHwgICAgIFwiZmlsbC1vcGFjaXR5XCI6IDAuNSwgLy8gb3IgZGFzaC1zZXBhcmF0ZWQgbmFtZXNcbiAgICAgfCAgICAgd2lkdGg6IFwiKj0yXCIgLy8gcHJlZml4ZWQgdmFsdWVzXG4gICAgIHwgfSk7XG4gICAgIHwgY29uc29sZS5sb2coZWwuYXR0cihcImZpbGxcIikpOyAvLyAjZmMwXG4gICAgICogUHJlZml4ZWQgdmFsdWVzIGluIGZvcm1hdCBgXCIrPTEwXCJgIHN1cHBvcnRlZC4gQWxsIGZvdXIgb3BlcmF0aW9uc1xuICAgICAqIChgK2AsIGAtYCwgYCpgIGFuZCBgL2ApIGNvdWxkIGJlIHVzZWQuIE9wdGlvbmFsbHkgeW91IGNhbiB1c2UgdW5pdHMgZm9yIGArYFxuICAgICAqIGFuZCBgLWA6IGBcIis9MmVtXCJgLlxuICAgIFxcKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5hdHRyID0gZnVuY3Rpb24gKHBhcmFtcywgdmFsdWUpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcyxcbiAgICAgICAgICAgIG5vZGUgPSBlbC5ub2RlO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IG5vZGUubm9kZVZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhdHRyID0gbm9kZS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIG91dCA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYXR0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0W2F0dHJbaV0ubm9kZU5hbWVdID0gYXR0cltpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcyhwYXJhbXMsIFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IHt9O1xuICAgICAgICAgICAgICAgIGpzb25bcGFyYW1zXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IGpzb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmUoXCJzbmFwLnV0aWwuZ2V0YXR0ci5cIiArIHBhcmFtcywgZWwpLmZpcnN0RGVmaW5lZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGF0dCBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmIChwYXJhbXNbaGFzXShhdHQpKSB7XG4gICAgICAgICAgICAgICAgZXZlKFwic25hcC51dGlsLmF0dHIuXCIgKyBhdHQsIGVsLCBwYXJhbXNbYXR0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4vKlxcXG4gKiBTbmFwLnBhcnNlXG4gWyBtZXRob2QgXVxuICoqXG4gKiBQYXJzZXMgU1ZHIGZyYWdtZW50IGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgQEZyYWdtZW50XG4gKipcbiAtIHN2ZyAoc3RyaW5nKSBTVkcgc3RyaW5nXG4gPSAoRnJhZ21lbnQpIHRoZSBARnJhZ21lbnRcblxcKi9cblNuYXAucGFyc2UgPSBmdW5jdGlvbiAoc3ZnKSB7XG4gICAgdmFyIGYgPSBnbG9iLmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgIGZ1bGwgPSB0cnVlLFxuICAgICAgICBkaXYgPSBnbG9iLmRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHN2ZyA9IFN0cihzdmcpO1xuICAgIGlmICghc3ZnLm1hdGNoKC9eXFxzKjxcXHMqc3ZnKD86XFxzfD4pLykpIHtcbiAgICAgICAgc3ZnID0gXCI8c3ZnPlwiICsgc3ZnICsgXCI8L3N2Zz5cIjtcbiAgICAgICAgZnVsbCA9IGZhbHNlO1xuICAgIH1cbiAgICBkaXYuaW5uZXJIVE1MID0gc3ZnO1xuICAgIHN2ZyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcInN2Z1wiKVswXTtcbiAgICBpZiAoc3ZnKSB7XG4gICAgICAgIGlmIChmdWxsKSB7XG4gICAgICAgICAgICBmID0gc3ZnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHN2Zy5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgZi5hcHBlbmRDaGlsZChzdmcuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChmKTtcbn07XG5mdW5jdGlvbiBGcmFnbWVudChmcmFnKSB7XG4gICAgdGhpcy5ub2RlID0gZnJhZztcbn1cbi8qXFxcbiAqIFNuYXAuZnJhZ21lbnRcbiBbIG1ldGhvZCBdXG4gKipcbiAqIENyZWF0ZXMgYSBET00gZnJhZ21lbnQgZnJvbSBhIGdpdmVuIGxpc3Qgb2YgZWxlbWVudHMgb3Igc3RyaW5nc1xuICoqXG4gLSB2YXJhcmdzICjigKYpIFNWRyBzdHJpbmdcbiA9IChGcmFnbWVudCkgdGhlIEBGcmFnbWVudFxuXFwqL1xuU25hcC5mcmFnbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCksXG4gICAgICAgIGYgPSBnbG9iLmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gYXJnc1tpXTtcbiAgICAgICAgaWYgKGl0ZW0ubm9kZSAmJiBpdGVtLm5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIGYuYXBwZW5kQ2hpbGQoaXRlbS5ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5ub2RlVHlwZSkge1xuICAgICAgICAgICAgZi5hcHBlbmRDaGlsZChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZi5hcHBlbmRDaGlsZChTbmFwLnBhcnNlKGl0ZW0pLm5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoZik7XG59O1xuXG5mdW5jdGlvbiBtYWtlKG5hbWUsIHBhcmVudCkge1xuICAgIHZhciByZXMgPSAkKG5hbWUpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChyZXMpO1xuICAgIHZhciBlbCA9IHdyYXAocmVzKTtcbiAgICByZXR1cm4gZWw7XG59XG5mdW5jdGlvbiBQYXBlcih3LCBoKSB7XG4gICAgdmFyIHJlcyxcbiAgICAgICAgZGVzYyxcbiAgICAgICAgZGVmcyxcbiAgICAgICAgcHJvdG8gPSBQYXBlci5wcm90b3R5cGU7XG4gICAgaWYgKHcgJiYgdy50YWdOYW1lICYmIHcudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3ZnXCIpIHtcbiAgICAgICAgaWYgKHcuc25hcCBpbiBodWIpIHtcbiAgICAgICAgICAgIHJldHVybiBodWJbdy5zbmFwXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZG9jID0gdy5vd25lckRvY3VtZW50O1xuICAgICAgICByZXMgPSBuZXcgRWxlbWVudCh3KTtcbiAgICAgICAgZGVzYyA9IHcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkZXNjXCIpWzBdO1xuICAgICAgICBkZWZzID0gdy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRlZnNcIilbMF07XG4gICAgICAgIGlmICghZGVzYykge1xuICAgICAgICAgICAgZGVzYyA9ICQoXCJkZXNjXCIpO1xuICAgICAgICAgICAgZGVzYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoXCJDcmVhdGVkIHdpdGggU25hcFwiKSk7XG4gICAgICAgICAgICByZXMubm9kZS5hcHBlbmRDaGlsZChkZXNjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlZnMpIHtcbiAgICAgICAgICAgIGRlZnMgPSAkKFwiZGVmc1wiKTtcbiAgICAgICAgICAgIHJlcy5ub2RlLmFwcGVuZENoaWxkKGRlZnMpO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5kZWZzID0gZGVmcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHByb3RvKSBpZiAocHJvdG9baGFzXShrZXkpKSB7XG4gICAgICAgICAgICByZXNba2V5XSA9IHByb3RvW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnBhcGVyID0gcmVzLnJvb3QgPSByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbWFrZShcInN2Z1wiLCBnbG9iLmRvYy5ib2R5KTtcbiAgICAgICAgJChyZXMubm9kZSwge1xuICAgICAgICAgICAgaGVpZ2h0OiBoLFxuICAgICAgICAgICAgdmVyc2lvbjogMS4xLFxuICAgICAgICAgICAgd2lkdGg6IHcsXG4gICAgICAgICAgICB4bWxuczogeG1sbnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB3cmFwKGRvbSkge1xuICAgIGlmICghZG9tKSB7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGlmIChkb20gaW5zdGFuY2VvZiBFbGVtZW50IHx8IGRvbSBpbnN0YW5jZW9mIEZyYWdtZW50KSB7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGlmIChkb20udGFnTmFtZSAmJiBkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3ZnXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXBlcihkb20pO1xuICAgIH1cbiAgICBpZiAoZG9tLnRhZ05hbWUgJiYgZG9tLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBcIm9iamVjdFwiICYmIGRvbS50eXBlID09IFwiaW1hZ2Uvc3ZnK3htbFwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFwZXIoZG9tLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInN2Z1wiKVswXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRWxlbWVudChkb20pO1xufVxuXG5TbmFwLl8ubWFrZSA9IG1ha2U7XG5TbmFwLl8ud3JhcCA9IHdyYXA7XG4vKlxcXG4gKiBQYXBlci5lbFxuIFsgbWV0aG9kIF1cbiAqKlxuICogQ3JlYXRlcyBhbiBlbGVtZW50IG9uIHBhcGVyIHdpdGggYSBnaXZlbiBuYW1lIGFuZCBubyBhdHRyaWJ1dGVzXG4gKipcbiAtIG5hbWUgKHN0cmluZykgdGFnIG5hbWVcbiAtIGF0dHIgKG9iamVjdCkgYXR0cmlidXRlc1xuID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcbiA+IFVzYWdlXG4gfCB2YXIgYyA9IHBhcGVyLmNpcmNsZSgxMCwgMTAsIDEwKTsgLy8gaXMgdGhlIHNhbWUgYXMuLi5cbiB8IHZhciBjID0gcGFwZXIuZWwoXCJjaXJjbGVcIikuYXR0cih7XG4gfCAgICAgY3g6IDEwLFxuIHwgICAgIGN5OiAxMCxcbiB8ICAgICByOiAxMFxuIHwgfSk7XG4gfCAvLyBhbmQgdGhlIHNhbWUgYXNcbiB8IHZhciBjID0gcGFwZXIuZWwoXCJjaXJjbGVcIiwge1xuIHwgICAgIGN4OiAxMCxcbiB8ICAgICBjeTogMTAsXG4gfCAgICAgcjogMTBcbiB8IH0pO1xuXFwqL1xuUGFwZXIucHJvdG90eXBlLmVsID0gZnVuY3Rpb24gKG5hbWUsIGF0dHIpIHtcbiAgICB2YXIgZWwgPSBtYWtlKG5hbWUsIHRoaXMubm9kZSk7XG4gICAgYXR0ciAmJiBlbC5hdHRyKGF0dHIpO1xuICAgIHJldHVybiBlbDtcbn07XG4vKlxcXG4gKiBFbGVtZW50LmNoaWxkcmVuXG4gWyBtZXRob2QgXVxuICoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuXG4gPSAoYXJyYXkpIGFycmF5IG9mIEVsZW1lbnRzXG5cXCovXG5FbGVtZW50LnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3V0ID0gW10sXG4gICAgICAgIGNoID0gdGhpcy5ub2RlLmNoaWxkTm9kZXM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2gubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBvdXRbaV0gPSBTbmFwKGNoW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5mdW5jdGlvbiBqc29uRmlsbGVyKHJvb3QsIG8pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByb290Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogcm9vdFtpXS50eXBlLFxuICAgICAgICAgICAgICAgIGF0dHI6IHJvb3RbaV0uYXR0cigpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW4gPSByb290W2ldLmNoaWxkcmVuKCk7XG4gICAgICAgIG8ucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAganNvbkZpbGxlcihjaGlsZHJlbiwgaXRlbS5jaGlsZE5vZGVzID0gW10pO1xuICAgICAgICB9XG4gICAgfVxufVxuLypcXFxuICogRWxlbWVudC50b0pTT05cbiBbIG1ldGhvZCBdXG4gKipcbiAqIFJldHVybnMgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCBhbGwgaXRzIGNoaWxkcmVuLlxuID0gKG9iamVjdCkgaW4gZm9ybWF0XG4gbyB7XG4gbyAgICAgdHlwZSAoc3RyaW5nKSB0aGlzLnR5cGUsXG4gbyAgICAgYXR0ciAob2JqZWN0KSBhdHRyaWJ1dGVzIG1hcCxcbiBvICAgICBjaGlsZE5vZGVzIChhcnJheSkgb3B0aW9uYWwgYXJyYXkgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbWUgZm9ybWF0XG4gbyB9XG5cXCovXG5FbGVtZW50LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIGpzb25GaWxsZXIoW3RoaXNdLCBvdXQpO1xuICAgIHJldHVybiBvdXRbMF07XG59O1xuLy8gZGVmYXVsdFxuZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHJcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBhdHQgPSBldmUubnQoKTtcbiAgICBhdHQgPSBhdHQuc3Vic3RyaW5nKGF0dC5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcbiAgICB2YXIgY3NzID0gYXR0LnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uIChsZXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiLVwiICsgbGV0dGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG4gICAgaWYgKGNzc0F0dHJbaGFzXShjc3MpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShjc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMubm9kZSwgYXR0KTtcbiAgICB9XG59KTtcbnZhciBjc3NBdHRyID0ge1xuICAgIFwiYWxpZ25tZW50LWJhc2VsaW5lXCI6IDAsXG4gICAgXCJiYXNlbGluZS1zaGlmdFwiOiAwLFxuICAgIFwiY2xpcFwiOiAwLFxuICAgIFwiY2xpcC1wYXRoXCI6IDAsXG4gICAgXCJjbGlwLXJ1bGVcIjogMCxcbiAgICBcImNvbG9yXCI6IDAsXG4gICAgXCJjb2xvci1pbnRlcnBvbGF0aW9uXCI6IDAsXG4gICAgXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIjogMCxcbiAgICBcImNvbG9yLXByb2ZpbGVcIjogMCxcbiAgICBcImNvbG9yLXJlbmRlcmluZ1wiOiAwLFxuICAgIFwiY3Vyc29yXCI6IDAsXG4gICAgXCJkaXJlY3Rpb25cIjogMCxcbiAgICBcImRpc3BsYXlcIjogMCxcbiAgICBcImRvbWluYW50LWJhc2VsaW5lXCI6IDAsXG4gICAgXCJlbmFibGUtYmFja2dyb3VuZFwiOiAwLFxuICAgIFwiZmlsbFwiOiAwLFxuICAgIFwiZmlsbC1vcGFjaXR5XCI6IDAsXG4gICAgXCJmaWxsLXJ1bGVcIjogMCxcbiAgICBcImZpbHRlclwiOiAwLFxuICAgIFwiZmxvb2QtY29sb3JcIjogMCxcbiAgICBcImZsb29kLW9wYWNpdHlcIjogMCxcbiAgICBcImZvbnRcIjogMCxcbiAgICBcImZvbnQtZmFtaWx5XCI6IDAsXG4gICAgXCJmb250LXNpemVcIjogMCxcbiAgICBcImZvbnQtc2l6ZS1hZGp1c3RcIjogMCxcbiAgICBcImZvbnQtc3RyZXRjaFwiOiAwLFxuICAgIFwiZm9udC1zdHlsZVwiOiAwLFxuICAgIFwiZm9udC12YXJpYW50XCI6IDAsXG4gICAgXCJmb250LXdlaWdodFwiOiAwLFxuICAgIFwiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbFwiOiAwLFxuICAgIFwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWxcIjogMCxcbiAgICBcImltYWdlLXJlbmRlcmluZ1wiOiAwLFxuICAgIFwia2VybmluZ1wiOiAwLFxuICAgIFwibGV0dGVyLXNwYWNpbmdcIjogMCxcbiAgICBcImxpZ2h0aW5nLWNvbG9yXCI6IDAsXG4gICAgXCJtYXJrZXJcIjogMCxcbiAgICBcIm1hcmtlci1lbmRcIjogMCxcbiAgICBcIm1hcmtlci1taWRcIjogMCxcbiAgICBcIm1hcmtlci1zdGFydFwiOiAwLFxuICAgIFwibWFza1wiOiAwLFxuICAgIFwib3BhY2l0eVwiOiAwLFxuICAgIFwib3ZlcmZsb3dcIjogMCxcbiAgICBcInBvaW50ZXItZXZlbnRzXCI6IDAsXG4gICAgXCJzaGFwZS1yZW5kZXJpbmdcIjogMCxcbiAgICBcInN0b3AtY29sb3JcIjogMCxcbiAgICBcInN0b3Atb3BhY2l0eVwiOiAwLFxuICAgIFwic3Ryb2tlXCI6IDAsXG4gICAgXCJzdHJva2UtZGFzaGFycmF5XCI6IDAsXG4gICAgXCJzdHJva2UtZGFzaG9mZnNldFwiOiAwLFxuICAgIFwic3Ryb2tlLWxpbmVjYXBcIjogMCxcbiAgICBcInN0cm9rZS1saW5lam9pblwiOiAwLFxuICAgIFwic3Ryb2tlLW1pdGVybGltaXRcIjogMCxcbiAgICBcInN0cm9rZS1vcGFjaXR5XCI6IDAsXG4gICAgXCJzdHJva2Utd2lkdGhcIjogMCxcbiAgICBcInRleHQtYW5jaG9yXCI6IDAsXG4gICAgXCJ0ZXh0LWRlY29yYXRpb25cIjogMCxcbiAgICBcInRleHQtcmVuZGVyaW5nXCI6IDAsXG4gICAgXCJ1bmljb2RlLWJpZGlcIjogMCxcbiAgICBcInZpc2liaWxpdHlcIjogMCxcbiAgICBcIndvcmQtc3BhY2luZ1wiOiAwLFxuICAgIFwid3JpdGluZy1tb2RlXCI6IDBcbn07XG5cbmV2ZS5vbihcInNuYXAudXRpbC5hdHRyXCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBhdHQgPSBldmUubnQoKSxcbiAgICAgICAgYXR0ciA9IHt9O1xuICAgIGF0dCA9IGF0dC5zdWJzdHJpbmcoYXR0Lmxhc3RJbmRleE9mKFwiLlwiKSArIDEpO1xuICAgIGF0dHJbYXR0XSA9IHZhbHVlO1xuICAgIHZhciBzdHlsZSA9IGF0dC5yZXBsYWNlKC8tKFxcdykvZ2ksIGZ1bmN0aW9uIChhbGwsIGxldHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB9KSxcbiAgICAgICAgY3NzID0gYXR0LnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uIChsZXR0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi1cIiArIGxldHRlci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICBpZiAoY3NzQXR0cltoYXNdKGNzcykpIHtcbiAgICAgICAgdGhpcy5ub2RlLnN0eWxlW3N0eWxlXSA9IHZhbHVlID09IG51bGwgPyBFIDogdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgJCh0aGlzLm5vZGUsIGF0dHIpO1xuICAgIH1cbn0pO1xuKGZ1bmN0aW9uIChwcm90bykge30oUGFwZXIucHJvdG90eXBlKSk7XG5cbi8vIHNpbXBsZSBhamF4XG4vKlxcXG4gKiBTbmFwLmFqYXhcbiBbIG1ldGhvZCBdXG4gKipcbiAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBBamF4XG4gKipcbiAtIHVybCAoc3RyaW5nKSBVUkxcbiAtIHBvc3REYXRhIChvYmplY3R8c3RyaW5nKSBkYXRhIGZvciBwb3N0IHJlcXVlc3RcbiAtIGNhbGxiYWNrIChmdW5jdGlvbikgY2FsbGJhY2tcbiAtIHNjb3BlIChvYmplY3QpICNvcHRpb25hbCBzY29wZSBvZiBjYWxsYmFja1xuICogb3JcbiAtIHVybCAoc3RyaW5nKSBVUkxcbiAtIGNhbGxiYWNrIChmdW5jdGlvbikgY2FsbGJhY2tcbiAtIHNjb3BlIChvYmplY3QpICNvcHRpb25hbCBzY29wZSBvZiBjYWxsYmFja1xuID0gKFhNTEh0dHBSZXF1ZXN0KSB0aGUgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LCBqdXN0IGluIGNhc2VcblxcKi9cblNuYXAuYWpheCA9IGZ1bmN0aW9uICh1cmwsIHBvc3REYXRhLCBjYWxsYmFjaywgc2NvcGUpe1xuICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGlkID0gSUQoKTtcbiAgICBpZiAocmVxKSB7XG4gICAgICAgIGlmIChpcyhwb3N0RGF0YSwgXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgICAgc2NvcGUgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIGNhbGxiYWNrID0gcG9zdERhdGE7XG4gICAgICAgICAgICBwb3N0RGF0YSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoaXMocG9zdERhdGEsIFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICB2YXIgcGQgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwb3N0RGF0YSkgaWYgKHBvc3REYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBwZC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQocG9zdERhdGFba2V5XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zdERhdGEgPSBwZC5qb2luKFwiJlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXEub3Blbihwb3N0RGF0YSA/IFwiUE9TVFwiIDogXCJHRVRcIiwgdXJsLCB0cnVlKTtcbiAgICAgICAgaWYgKHBvc3REYXRhKSB7XG4gICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIlgtUmVxdWVzdGVkLVdpdGhcIiwgXCJYTUxIdHRwUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgZXZlLm9uY2UoXCJzbmFwLmFqYXguXCIgKyBpZCArIFwiLjBcIiwgY2FsbGJhY2spO1xuICAgICAgICAgICAgZXZlLm9uY2UoXCJzbmFwLmFqYXguXCIgKyBpZCArIFwiLjIwMFwiLCBjYWxsYmFjayk7XG4gICAgICAgICAgICBldmUub25jZShcInNuYXAuYWpheC5cIiArIGlkICsgXCIuMzA0XCIsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAocmVxLnJlYWR5U3RhdGUgIT0gNCkgcmV0dXJuO1xuICAgICAgICAgICAgZXZlKFwic25hcC5hamF4LlwiICsgaWQgKyBcIi5cIiArIHJlcS5zdGF0dXMsIHNjb3BlLCByZXEpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcTtcbiAgICAgICAgfVxuICAgICAgICByZXEuc2VuZChwb3N0RGF0YSk7XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgfVxufTtcbi8qXFxcbiAqIFNuYXAubG9hZFxuIFsgbWV0aG9kIF1cbiAqKlxuICogTG9hZHMgZXh0ZXJuYWwgU1ZHIGZpbGUgYXMgYSBARnJhZ21lbnQgKHNlZSBAU25hcC5hamF4IGZvciBtb3JlIGFkdmFuY2VkIEFKQVgpXG4gKipcbiAtIHVybCAoc3RyaW5nKSBVUkxcbiAtIGNhbGxiYWNrIChmdW5jdGlvbikgY2FsbGJhY2tcbiAtIHNjb3BlIChvYmplY3QpICNvcHRpb25hbCBzY29wZSBvZiBjYWxsYmFja1xuXFwqL1xuU25hcC5sb2FkID0gZnVuY3Rpb24gKHVybCwgY2FsbGJhY2ssIHNjb3BlKSB7XG4gICAgU25hcC5hamF4KHVybCwgZnVuY3Rpb24gKHJlcSkge1xuICAgICAgICB2YXIgZiA9IFNuYXAucGFyc2UocmVxLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIHNjb3BlID8gY2FsbGJhY2suY2FsbChzY29wZSwgZikgOiBjYWxsYmFjayhmKTtcbiAgICB9KTtcbn07XG52YXIgZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gKGVsZW0pIHtcbiAgICB2YXIgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuICAgICAgICBib2R5ID0gZG9jLmJvZHksXG4gICAgICAgIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICBjbGllbnRUb3AgPSBkb2NFbGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwLCBjbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLFxuICAgICAgICB0b3AgID0gYm94LnRvcCAgKyAoZy53aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3AgKSAtIGNsaWVudFRvcCxcbiAgICAgICAgbGVmdCA9IGJveC5sZWZ0ICsgKGcud2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDtcbiAgICByZXR1cm4ge1xuICAgICAgICB5OiB0b3AsXG4gICAgICAgIHg6IGxlZnRcbiAgICB9O1xufTtcbi8qXFxcbiAqIFNuYXAuZ2V0RWxlbWVudEJ5UG9pbnRcbiBbIG1ldGhvZCBdXG4gKipcbiAqIFJldHVybnMgeW91IHRvcG1vc3QgZWxlbWVudCB1bmRlciBnaXZlbiBwb2ludC5cbiAqKlxuID0gKG9iamVjdCkgU25hcCBlbGVtZW50IG9iamVjdFxuIC0geCAobnVtYmVyKSB4IGNvb3JkaW5hdGUgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3dcbiAtIHkgKG51bWJlcikgeSBjb29yZGluYXRlIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93XG4gPiBVc2FnZVxuIHwgU25hcC5nZXRFbGVtZW50QnlQb2ludChtb3VzZVgsIG1vdXNlWSkuYXR0cih7c3Ryb2tlOiBcIiNmMDBcIn0pO1xuXFwqL1xuU25hcC5nZXRFbGVtZW50QnlQb2ludCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIHBhcGVyID0gdGhpcyxcbiAgICAgICAgc3ZnID0gcGFwZXIuY2FudmFzLFxuICAgICAgICB0YXJnZXQgPSBnbG9iLmRvYy5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgIGlmIChnbG9iLndpbi5vcGVyYSAmJiB0YXJnZXQudGFnTmFtZSA9PSBcInN2Z1wiKSB7XG4gICAgICAgIHZhciBzbyA9IGdldE9mZnNldCh0YXJnZXQpLFxuICAgICAgICAgICAgc3IgPSB0YXJnZXQuY3JlYXRlU1ZHUmVjdCgpO1xuICAgICAgICBzci54ID0geCAtIHNvLng7XG4gICAgICAgIHNyLnkgPSB5IC0gc28ueTtcbiAgICAgICAgc3Iud2lkdGggPSBzci5oZWlnaHQgPSAxO1xuICAgICAgICB2YXIgaGl0cyA9IHRhcmdldC5nZXRJbnRlcnNlY3Rpb25MaXN0KHNyLCBudWxsKTtcbiAgICAgICAgaWYgKGhpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSBoaXRzW2hpdHMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB3cmFwKHRhcmdldCk7XG59O1xuLypcXFxuICogU25hcC5wbHVnaW5cbiBbIG1ldGhvZCBdXG4gKipcbiAqIExldCB5b3Ugd3JpdGUgcGx1Z2lucy4gWW91IHBhc3MgaW4gYSBmdW5jdGlvbiB3aXRoIGZpdmUgYXJndW1lbnRzLCBsaWtlIHRoaXM6XG4gfCBTbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2JhbCwgRnJhZ21lbnQpIHtcbiB8ICAgICBTbmFwLm5ld21ldGhvZCA9IGZ1bmN0aW9uICgpIHt9O1xuIHwgICAgIEVsZW1lbnQucHJvdG90eXBlLm5ld21ldGhvZCA9IGZ1bmN0aW9uICgpIHt9O1xuIHwgICAgIFBhcGVyLnByb3RvdHlwZS5uZXdtZXRob2QgPSBmdW5jdGlvbiAoKSB7fTtcbiB8IH0pO1xuICogSW5zaWRlIHRoZSBmdW5jdGlvbiB5b3UgaGF2ZSBhY2Nlc3MgdG8gYWxsIG1haW4gb2JqZWN0cyAoYW5kIHRoZWlyXG4gKiBwcm90b3R5cGVzKS4gVGhpcyBhbGxvdyB5b3UgdG8gZXh0ZW5kIGFueXRoaW5nIHlvdSB3YW50LlxuICoqXG4gLSBmIChmdW5jdGlvbikgeW91ciBwbHVnaW4gYm9keVxuXFwqL1xuU25hcC5wbHVnaW4gPSBmdW5jdGlvbiAoZikge1xuICAgIGYoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KTtcbn07XG5nbG9iLndpbi5TbmFwID0gU25hcDtcbnJldHVybiBTbmFwO1xufSh3aW5kb3cgfHwgdGhpcykpO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KSB7XG4gICAgdmFyIGVscHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgaXMgPSBTbmFwLmlzLFxuICAgICAgICBTdHIgPSBTdHJpbmcsXG4gICAgICAgIHVuaXQycHggPSBTbmFwLl91bml0MnB4LFxuICAgICAgICAkID0gU25hcC5fLiQsXG4gICAgICAgIG1ha2UgPSBTbmFwLl8ubWFrZSxcbiAgICAgICAgZ2V0U29tZURlZnMgPSBTbmFwLl8uZ2V0U29tZURlZnMsXG4gICAgICAgIGhhcyA9IFwiaGFzT3duUHJvcGVydHlcIixcbiAgICAgICAgd3JhcCA9IFNuYXAuXy53cmFwO1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmdldEJCb3hcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqKlxuICAgICA9IChvYmplY3QpIGJvdW5kaW5nIGJveCBkZXNjcmlwdG9yOlxuICAgICBvIHtcbiAgICAgbyAgICAgY3g6IChudW1iZXIpIHggb2YgdGhlIGNlbnRlcixcbiAgICAgbyAgICAgY3k6IChudW1iZXIpIHggb2YgdGhlIGNlbnRlcixcbiAgICAgbyAgICAgaDogKG51bWJlcikgaGVpZ2h0LFxuICAgICBvICAgICBoZWlnaHQ6IChudW1iZXIpIGhlaWdodCxcbiAgICAgbyAgICAgcGF0aDogKHN0cmluZykgcGF0aCBjb21tYW5kIGZvciB0aGUgYm94LFxuICAgICBvICAgICByMDogKG51bWJlcikgcmFkaXVzIG9mIGEgY2lyY2xlIHRoYXQgZnVsbHkgZW5jbG9zZXMgdGhlIGJveCxcbiAgICAgbyAgICAgcjE6IChudW1iZXIpIHJhZGl1cyBvZiB0aGUgc21hbGxlc3QgY2lyY2xlIHRoYXQgY2FuIGJlIGVuY2xvc2VkLFxuICAgICBvICAgICByMjogKG51bWJlcikgcmFkaXVzIG9mIHRoZSBsYXJnZXN0IGNpcmNsZSB0aGF0IGNhbiBiZSBlbmNsb3NlZCxcbiAgICAgbyAgICAgdmI6IChzdHJpbmcpIGJveCBhcyBhIHZpZXdib3ggY29tbWFuZCxcbiAgICAgbyAgICAgdzogKG51bWJlcikgd2lkdGgsXG4gICAgIG8gICAgIHdpZHRoOiAobnVtYmVyKSB3aWR0aCxcbiAgICAgbyAgICAgeDI6IChudW1iZXIpIHggb2YgdGhlIHJpZ2h0IHNpZGUsXG4gICAgIG8gICAgIHg6IChudW1iZXIpIHggb2YgdGhlIGxlZnQgc2lkZSxcbiAgICAgbyAgICAgeTI6IChudW1iZXIpIHkgb2YgdGhlIGJvdHRvbSBlZGdlLFxuICAgICBvICAgICB5OiAobnVtYmVyKSB5IG9mIHRoZSB0b3AgZWRnZVxuICAgICBvIH1cbiAgICBcXCovXG4gICAgZWxwcm90by5nZXRCQm94ID0gZnVuY3Rpb24gKGlzV2l0aG91dFRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09IFwidHNwYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIFNuYXAuXy5ib3godGhpcy5ub2RlLmdldENsaWVudFJlY3RzKCkuaXRlbSgwKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFTbmFwLk1hdHJpeCB8fCAhU25hcC5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmdldEJCb3goKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWwgPSB0aGlzLFxuICAgICAgICAgICAgbSA9IG5ldyBTbmFwLk1hdHJpeDtcbiAgICAgICAgaWYgKGVsLnJlbW92ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBTbmFwLl8uYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGVsLnR5cGUgPT0gXCJ1c2VcIikge1xuICAgICAgICAgICAgaWYgKCFpc1dpdGhvdXRUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgICAgICBtID0gbS5hZGQoZWwudHJhbnNmb3JtKCkubG9jYWxNYXRyaXgudHJhbnNsYXRlKGVsLmF0dHIoXCJ4XCIpIHx8IDAsIGVsLmF0dHIoXCJ5XCIpIHx8IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbC5vcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgIGVsID0gZWwub3JpZ2luYWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBocmVmID0gZWwuYXR0cihcInhsaW5rOmhyZWZcIik7XG4gICAgICAgICAgICAgICAgZWwgPSBlbC5vcmlnaW5hbCA9IGVsLm5vZGUub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChocmVmLnN1YnN0cmluZyhocmVmLmluZGV4T2YoXCIjXCIpICsgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBfID0gZWwuXyxcbiAgICAgICAgICAgIHBhdGhmaW5kZXIgPSBTbmFwLnBhdGguZ2V0W2VsLnR5cGVdIHx8IFNuYXAucGF0aC5nZXQuZGVmbHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNXaXRob3V0VHJhbnNmb3JtKSB7XG4gICAgICAgICAgICAgICAgXy5iYm94d3QgPSBwYXRoZmluZGVyID8gU25hcC5wYXRoLmdldEJCb3goZWwucmVhbFBhdGggPSBwYXRoZmluZGVyKGVsKSkgOiBTbmFwLl8uYm94KGVsLm5vZGUuZ2V0QkJveCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU25hcC5fLmJveChfLmJib3h3dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsLnJlYWxQYXRoID0gcGF0aGZpbmRlcihlbCk7XG4gICAgICAgICAgICAgICAgZWwubWF0cml4ID0gZWwudHJhbnNmb3JtKCkubG9jYWxNYXRyaXg7XG4gICAgICAgICAgICAgICAgXy5iYm94ID0gU25hcC5wYXRoLmdldEJCb3goU25hcC5wYXRoLm1hcChlbC5yZWFsUGF0aCwgbS5hZGQoZWwubWF0cml4KSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBTbmFwLl8uYm94KF8uYmJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc27igJl0IGdpdmUgeW91IGJib3ggb2YgaGlkZGVuIGVsZW1lbnRcbiAgICAgICAgICAgIHJldHVybiBTbmFwLl8uYm94KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBwcm9wU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBleHRyYWN0VHJhbnNmb3JtKGVsLCB0c3RyKSB7XG4gICAgICAgIGlmICh0c3RyID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkb1JldHVybiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZWwudHlwZSA9PSBcImxpbmVhckdyYWRpZW50XCIgfHwgZWwudHlwZSA9PSBcInJhZGlhbEdyYWRpZW50XCIpIHtcbiAgICAgICAgICAgICAgICB0c3RyID0gZWwubm9kZS5nZXRBdHRyaWJ1dGUoXCJncmFkaWVudFRyYW5zZm9ybVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSA9PSBcInBhdHRlcm5cIikge1xuICAgICAgICAgICAgICAgIHRzdHIgPSBlbC5ub2RlLmdldEF0dHJpYnV0ZShcInBhdHRlcm5UcmFuc2Zvcm1cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRzdHIgPSBlbC5ub2RlLmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHN0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU25hcC5NYXRyaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0c3RyID0gU25hcC5fLnN2Z1RyYW5zZm9ybTJzdHJpbmcodHN0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIVNuYXAuXy5yZ1RyYW5zZm9ybS50ZXN0KHRzdHIpKSB7XG4gICAgICAgICAgICAgICAgdHN0ciA9IFNuYXAuXy5zdmdUcmFuc2Zvcm0yc3RyaW5nKHRzdHIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0c3RyID0gU3RyKHRzdHIpLnJlcGxhY2UoL1xcLnszfXxcXHUyMDI2L2csIGVsLl8udHJhbnNmb3JtIHx8IFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzKHRzdHIsIFwiYXJyYXlcIikpIHtcbiAgICAgICAgICAgICAgICB0c3RyID0gU25hcC5wYXRoID8gU25hcC5wYXRoLnRvU3RyaW5nLmNhbGwodHN0cikgOiBTdHIodHN0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbC5fLnRyYW5zZm9ybSA9IHRzdHI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG0gPSBTbmFwLl8udHJhbnNmb3JtMm1hdHJpeCh0c3RyLCBlbC5nZXRCQm94KDEpKTtcbiAgICAgICAgaWYgKGRvUmV0dXJuKSB7XG4gICAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLm1hdHJpeCA9IG07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudHJhbnNmb3JtXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBHZXRzIG9yIHNldHMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICAgKipcbiAgICAgLSB0c3RyIChzdHJpbmcpIHRyYW5zZm9ybSBzdHJpbmcgaW4gU25hcCBvciBTVkcgZm9ybWF0XG4gICAgID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgKiBvclxuICAgICA9IChvYmplY3QpIHRyYW5zZm9ybWF0aW9uIGRlc2NyaXB0b3I6XG4gICAgIG8ge1xuICAgICBvICAgICBzdHJpbmcgKHN0cmluZykgdHJhbnNmb3JtIHN0cmluZyxcbiAgICAgbyAgICAgZ2xvYmFsTWF0cml4IChNYXRyaXgpIG1hdHJpeCBvZiBhbGwgdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgdG8gZWxlbWVudCBvciBpdHMgcGFyZW50cyxcbiAgICAgbyAgICAgbG9jYWxNYXRyaXggKE1hdHJpeCkgbWF0cml4IG9mIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIG9ubHkgdG8gdGhlIGVsZW1lbnQsXG4gICAgIG8gICAgIGRpZmZNYXRyaXggKE1hdHJpeCkgbWF0cml4IG9mIGRpZmZlcmVuY2UgYmV0d2VlbiBnbG9iYWwgYW5kIGxvY2FsIHRyYW5zZm9ybWF0aW9ucyxcbiAgICAgbyAgICAgZ2xvYmFsIChzdHJpbmcpIGdsb2JhbCB0cmFuc2Zvcm1hdGlvbiBhcyBzdHJpbmcsXG4gICAgIG8gICAgIGxvY2FsIChzdHJpbmcpIGxvY2FsIHRyYW5zZm9ybWF0aW9uIGFzIHN0cmluZyxcbiAgICAgbyAgICAgdG9TdHJpbmcgKGZ1bmN0aW9uKSByZXR1cm5zIGBzdHJpbmdgIHByb3BlcnR5XG4gICAgIG8gfVxuICAgIFxcKi9cbiAgICBlbHByb3RvLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0c3RyKSB7XG4gICAgICAgIHZhciBfID0gdGhpcy5fO1xuICAgICAgICBpZiAodHN0ciA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFwYSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgZ2xvYmFsID0gbmV3IFNuYXAuTWF0cml4KHRoaXMubm9kZS5nZXRDVE0oKSksXG4gICAgICAgICAgICAgICAgbG9jYWwgPSBleHRyYWN0VHJhbnNmb3JtKHRoaXMpLFxuICAgICAgICAgICAgICAgIG1zID0gW2xvY2FsXSxcbiAgICAgICAgICAgICAgICBtID0gbmV3IFNuYXAuTWF0cml4LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgbG9jYWxTdHJpbmcgPSBsb2NhbC50b1RyYW5zZm9ybVN0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0cmluZyA9IFN0cihsb2NhbCkgPT0gU3RyKHRoaXMubWF0cml4KSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyKF8udHJhbnNmb3JtKSA6IGxvY2FsU3RyaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHBhcGEudHlwZSAhPSBcInN2Z1wiICYmIChwYXBhID0gcGFwYS5wYXJlbnQoKSkpIHtcbiAgICAgICAgICAgICAgICBtcy5wdXNoKGV4dHJhY3RUcmFuc2Zvcm0ocGFwYSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IG1zLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgICAgICBtLmFkZChtc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0cmluZzogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGdsb2JhbE1hdHJpeDogZ2xvYmFsLFxuICAgICAgICAgICAgICAgIHRvdGFsTWF0cml4OiBtLFxuICAgICAgICAgICAgICAgIGxvY2FsTWF0cml4OiBsb2NhbCxcbiAgICAgICAgICAgICAgICBkaWZmTWF0cml4OiBnbG9iYWwuY2xvbmUoKS5hZGQobG9jYWwuaW52ZXJ0KCkpLFxuICAgICAgICAgICAgICAgIGdsb2JhbDogZ2xvYmFsLnRvVHJhbnNmb3JtU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdG90YWw6IG0udG9UcmFuc2Zvcm1TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBsb2NhbDogbG9jYWxTdHJpbmcsXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IHByb3BTdHJpbmdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzdHIgaW5zdGFuY2VvZiBTbmFwLk1hdHJpeCkge1xuICAgICAgICAgICAgdGhpcy5tYXRyaXggPSB0c3RyO1xuICAgICAgICAgICAgdGhpcy5fLnRyYW5zZm9ybSA9IHRzdHIudG9UcmFuc2Zvcm1TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhY3RUcmFuc2Zvcm0odGhpcywgdHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwibGluZWFyR3JhZGllbnRcIiB8fCB0aGlzLnR5cGUgPT0gXCJyYWRpYWxHcmFkaWVudFwiKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLm5vZGUsIHtncmFkaWVudFRyYW5zZm9ybTogdGhpcy5tYXRyaXh9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09IFwicGF0dGVyblwiKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLm5vZGUsIHtwYXR0ZXJuVHJhbnNmb3JtOiB0aGlzLm1hdHJpeH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMubm9kZSwge3RyYW5zZm9ybTogdGhpcy5tYXRyaXh9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQucGFyZW50XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50J3MgcGFyZW50XG4gICAgICoqXG4gICAgID0gKEVsZW1lbnQpIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgIFxcKi9cbiAgICBlbHByb3RvLnBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAodGhpcy5ub2RlLnBhcmVudE5vZGUpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuYXBwZW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBcHBlbmRzIHRoZSBnaXZlbiBlbGVtZW50IHRvIGN1cnJlbnQgb25lXG4gICAgICoqXG4gICAgIC0gZWwgKEVsZW1lbnR8U2V0KSBlbGVtZW50IHRvIGFwcGVuZFxuICAgICA9IChFbGVtZW50KSB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICBcXCovXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuYWRkXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBTZWUgQEVsZW1lbnQuYXBwZW5kXG4gICAgXFwqL1xuICAgIGVscHJvdG8uYXBwZW5kID0gZWxwcm90by5hZGQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwudHlwZSA9PSBcInNldFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ID0gdGhpcztcbiAgICAgICAgICAgICAgICBlbC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgICAgICBpdC5hZGQoZWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWwgPSB3cmFwKGVsKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5hcHBlbmRDaGlsZChlbC5ub2RlKTtcbiAgICAgICAgICAgIGVsLnBhcGVyID0gdGhpcy5wYXBlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmFwcGVuZFRvXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBcHBlbmRzIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gdGhlIGdpdmVuIG9uZVxuICAgICAqKlxuICAgICAtIGVsIChFbGVtZW50KSBwYXJlbnQgZWxlbWVudCB0byBhcHBlbmQgdG9cbiAgICAgPSAoRWxlbWVudCkgdGhlIGNoaWxkIGVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5hcHBlbmRUbyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIGVsID0gd3JhcChlbCk7XG4gICAgICAgICAgICBlbC5hcHBlbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5wcmVwZW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBQcmVwZW5kcyB0aGUgZ2l2ZW4gZWxlbWVudCB0byB0aGUgY3VycmVudCBvbmVcbiAgICAgKipcbiAgICAgLSBlbCAoRWxlbWVudCkgZWxlbWVudCB0byBwcmVwZW5kXG4gICAgID0gKEVsZW1lbnQpIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgIFxcKi9cbiAgICBlbHByb3RvLnByZXBlbmQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBpZiAoZWwudHlwZSA9PSBcInNldFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3Q7XG4gICAgICAgICAgICAgICAgZWwuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC5hZnRlcihlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5wcmVwZW5kKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGVsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWwgPSB3cmFwKGVsKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnQoKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoZWwubm9kZSwgdGhpcy5ub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgdGhpcy5hZGQgJiYgdGhpcy5hZGQoKTtcbiAgICAgICAgICAgIGVsLnBhcGVyID0gdGhpcy5wYXBlcjtcbiAgICAgICAgICAgIHRoaXMucGFyZW50KCkgJiYgdGhpcy5wYXJlbnQoKS5hZGQoKTtcbiAgICAgICAgICAgIHBhcmVudCAmJiBwYXJlbnQuYWRkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5wcmVwZW5kVG9cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFByZXBlbmRzIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gdGhlIGdpdmVuIG9uZVxuICAgICAqKlxuICAgICAtIGVsIChFbGVtZW50KSBwYXJlbnQgZWxlbWVudCB0byBwcmVwZW5kIHRvXG4gICAgID0gKEVsZW1lbnQpIHRoZSBjaGlsZCBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8ucHJlcGVuZFRvID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGVsID0gd3JhcChlbCk7XG4gICAgICAgIGVsLnByZXBlbmQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuYmVmb3JlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBJbnNlcnRzIGdpdmVuIGVsZW1lbnQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZVxuICAgICAqKlxuICAgICAtIGVsIChFbGVtZW50KSBlbGVtZW50IHRvIGluc2VydFxuICAgICA9IChFbGVtZW50KSB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5iZWZvcmUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgaWYgKGVsLnR5cGUgPT0gXCJzZXRcIikge1xuICAgICAgICAgICAgdmFyIGl0ID0gdGhpcztcbiAgICAgICAgICAgIGVsLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIGl0Lm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWwubm9kZSwgaXQubm9kZSk7XG4gICAgICAgICAgICAgICAgcGFyZW50ICYmIHBhcmVudC5hZGQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQoKS5hZGQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gd3JhcChlbCk7XG4gICAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnQoKTtcbiAgICAgICAgdGhpcy5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLm5vZGUsIHRoaXMubm9kZSk7XG4gICAgICAgIHRoaXMucGFyZW50KCkgJiYgdGhpcy5wYXJlbnQoKS5hZGQoKTtcbiAgICAgICAgcGFyZW50ICYmIHBhcmVudC5hZGQoKTtcbiAgICAgICAgZWwucGFwZXIgPSB0aGlzLnBhcGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmFmdGVyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBJbnNlcnRzIGdpdmVuIGVsZW1lbnQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lXG4gICAgICoqXG4gICAgIC0gZWwgKEVsZW1lbnQpIGVsZW1lbnQgdG8gaW5zZXJ0XG4gICAgID0gKEVsZW1lbnQpIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgIFxcKi9cbiAgICBlbHByb3RvLmFmdGVyID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGVsID0gd3JhcChlbCk7XG4gICAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnQoKTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgdGhpcy5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLm5vZGUsIHRoaXMubm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbC5ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudCgpICYmIHRoaXMucGFyZW50KCkuYWRkKCk7XG4gICAgICAgIHBhcmVudCAmJiBwYXJlbnQuYWRkKCk7XG4gICAgICAgIGVsLnBhcGVyID0gdGhpcy5wYXBlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5pbnNlcnRCZWZvcmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEluc2VydHMgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGdpdmVuIG9uZVxuICAgICAqKlxuICAgICAtIGVsIChFbGVtZW50KSBlbGVtZW50IG5leHQgdG8gd2hvbSBpbnNlcnQgdG9cbiAgICAgPSAoRWxlbWVudCkgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8uaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGVsID0gd3JhcChlbCk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgICBlbC5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZSwgZWwubm9kZSk7XG4gICAgICAgIHRoaXMucGFwZXIgPSBlbC5wYXBlcjtcbiAgICAgICAgcGFyZW50ICYmIHBhcmVudC5hZGQoKTtcbiAgICAgICAgZWwucGFyZW50KCkgJiYgZWwucGFyZW50KCkuYWRkKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuaW5zZXJ0QWZ0ZXJcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEluc2VydHMgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGdpdmVuIG9uZVxuICAgICAqKlxuICAgICAtIGVsIChFbGVtZW50KSBlbGVtZW50IG5leHQgdG8gd2hvbSBpbnNlcnQgdG9cbiAgICAgPSAoRWxlbWVudCkgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8uaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgZWwgPSB3cmFwKGVsKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50KCk7XG4gICAgICAgIGVsLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLCBlbC5ub2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5wYXBlciA9IGVsLnBhcGVyO1xuICAgICAgICBwYXJlbnQgJiYgcGFyZW50LmFkZCgpO1xuICAgICAgICBlbC5wYXJlbnQoKSAmJiBlbC5wYXJlbnQoKS5hZGQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5yZW1vdmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICAgPSAoRWxlbWVudCkgdGhlIGRldGFjaGVkIGVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgICB0aGlzLm5vZGUucGFyZW50Tm9kZSAmJiB0aGlzLm5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpO1xuICAgICAgICBkZWxldGUgdGhpcy5wYXBlcjtcbiAgICAgICAgdGhpcy5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgcGFyZW50ICYmIHBhcmVudC5hZGQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5zZWxlY3RcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEdhdGhlcnMgdGhlIG5lc3RlZCBARWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2V0IG9mIENTUyBzZWxlY3RvcnNcbiAgICAgKipcbiAgICAgLSBxdWVyeSAoc3RyaW5nKSBDU1Mgc2VsZWN0b3JcbiAgICAgPSAoRWxlbWVudCkgcmVzdWx0IG9mIHF1ZXJ5IHNlbGVjdGlvblxuICAgIFxcKi9cbiAgICBlbHByb3RvLnNlbGVjdCA9IGZ1bmN0aW9uIChxdWVyeSkge1xuICAgICAgICByZXR1cm4gd3JhcCh0aGlzLm5vZGUucXVlcnlTZWxlY3RvcihxdWVyeSkpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuc2VsZWN0QWxsXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBHYXRoZXJzIG5lc3RlZCBARWxlbWVudCBvYmplY3RzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZXQgb2YgQ1NTIHNlbGVjdG9yc1xuICAgICAqKlxuICAgICAtIHF1ZXJ5IChzdHJpbmcpIENTUyBzZWxlY3RvclxuICAgICA9IChTZXR8YXJyYXkpIHJlc3VsdCBvZiBxdWVyeSBzZWxlY3Rpb25cbiAgICBcXCovXG4gICAgZWxwcm90by5zZWxlY3RBbGwgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICAgICAgdmFyIG5vZGVsaXN0ID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLFxuICAgICAgICAgICAgc2V0ID0gKFNuYXAuc2V0IHx8IEFycmF5KSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZXQucHVzaCh3cmFwKG5vZGVsaXN0W2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmFzUFhcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgZ2l2ZW4gYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50IGFzIGEgYHB4YCB2YWx1ZSAobm90ICUsIGVtLCBldGMuKVxuICAgICAqKlxuICAgICAtIGF0dHIgKHN0cmluZykgYXR0cmlidXRlIG5hbWVcbiAgICAgLSB2YWx1ZSAoc3RyaW5nKSAjb3B0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgID0gKEVsZW1lbnQpIHJlc3VsdCBvZiBxdWVyeSBzZWxlY3Rpb25cbiAgICBcXCovXG4gICAgZWxwcm90by5hc1BYID0gZnVuY3Rpb24gKGF0dHIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXR0cihhdHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gK3VuaXQycHgodGhpcywgYXR0ciwgdmFsdWUpO1xuICAgIH07XG4gICAgLy8gU0lFUlJBIEVsZW1lbnQudXNlKCk6IEkgc3VnZ2VzdCBhZGRpbmcgYSBub3RlIGFib3V0IGhvdyB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhlIHJldHVybmVkIDx1c2U+IGluc3RhbnRpYXRlcy4gSXQncyBhIHBhcnQgb2YgU1ZHIHdpdGggd2hpY2ggb3JkaW5hcnkgd2ViIGRldmVsb3BlcnMgbWF5IGJlIGxlYXN0IGZhbWlsaWFyLlxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVzZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQ3JlYXRlcyBhIGA8dXNlPmAgZWxlbWVudCBsaW5rZWQgdG8gdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAqKlxuICAgICA9IChFbGVtZW50KSB0aGUgYDx1c2U+YCBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8udXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdXNlLFxuICAgICAgICAgICAgaWQgPSB0aGlzLm5vZGUuaWQ7XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5pZDtcbiAgICAgICAgICAgICQodGhpcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50eXBlID09IFwibGluZWFyR3JhZGllbnRcIiB8fCB0aGlzLnR5cGUgPT0gXCJyYWRpYWxHcmFkaWVudFwiIHx8XG4gICAgICAgICAgICB0aGlzLnR5cGUgPT0gXCJwYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgIHVzZSA9IG1ha2UodGhpcy50eXBlLCB0aGlzLm5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2UgPSBtYWtlKFwidXNlXCIsIHRoaXMubm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAkKHVzZS5ub2RlLCB7XG4gICAgICAgICAgICBcInhsaW5rOmhyZWZcIjogXCIjXCIgKyBpZFxuICAgICAgICB9KTtcbiAgICAgICAgdXNlLm9yaWdpbmFsID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHVzZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGZpeGlkcyhlbCkge1xuICAgICAgICB2YXIgZWxzID0gZWwuc2VsZWN0QWxsKFwiKlwiKSxcbiAgICAgICAgICAgIGl0LFxuICAgICAgICAgICAgdXJsID0gL15cXHMqdXJsXFwoKFwifCd8KSguKilcXDFcXClcXHMqJC8sXG4gICAgICAgICAgICBpZHMgPSBbXSxcbiAgICAgICAgICAgIHVzZXMgPSB7fTtcbiAgICAgICAgZnVuY3Rpb24gdXJsdGVzdChpdCwgbmFtZSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9ICQoaXQubm9kZSwgbmFtZSk7XG4gICAgICAgICAgICB2YWwgPSB2YWwgJiYgdmFsLm1hdGNoKHVybCk7XG4gICAgICAgICAgICB2YWwgPSB2YWwgJiYgdmFsWzJdO1xuICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwuY2hhckF0KCkgPT0gXCIjXCIpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgdXNlc1t2YWxdID0gKHVzZXNbdmFsXSB8fCBbXSkuY29uY2F0KGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBhdHRyW25hbWVdID0gU25hcC51cmwoaWQpO1xuICAgICAgICAgICAgICAgICAgICAkKGl0Lm5vZGUsIGF0dHIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGxpbmt0ZXN0KGl0KSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gJChpdC5ub2RlLCBcInhsaW5rOmhyZWZcIik7XG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbC5jaGFyQXQoKSA9PSBcIiNcIikge1xuICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICB1c2VzW3ZhbF0gPSAodXNlc1t2YWxdIHx8IFtdKS5jb25jYXQoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0LmF0dHIoXCJ4bGluazpocmVmXCIsIFwiI1wiICsgaWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGVscy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBpdCA9IGVsc1tpXTtcbiAgICAgICAgICAgIHVybHRlc3QoaXQsIFwiZmlsbFwiKTtcbiAgICAgICAgICAgIHVybHRlc3QoaXQsIFwic3Ryb2tlXCIpO1xuICAgICAgICAgICAgdXJsdGVzdChpdCwgXCJmaWx0ZXJcIik7XG4gICAgICAgICAgICB1cmx0ZXN0KGl0LCBcIm1hc2tcIik7XG4gICAgICAgICAgICB1cmx0ZXN0KGl0LCBcImNsaXAtcGF0aFwiKTtcbiAgICAgICAgICAgIGxpbmt0ZXN0KGl0KTtcbiAgICAgICAgICAgIHZhciBvbGRpZCA9ICQoaXQubm9kZSwgXCJpZFwiKTtcbiAgICAgICAgICAgIGlmIChvbGRpZCkge1xuICAgICAgICAgICAgICAgICQoaXQubm9kZSwge2lkOiBpdC5pZH0pO1xuICAgICAgICAgICAgICAgIGlkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb2xkOiBvbGRpZCxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0LmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBpZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZzID0gdXNlc1tpZHNbaV0ub2xkXTtcbiAgICAgICAgICAgIGlmIChmcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGZzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZnNbal0oaWRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuY2xvbmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgZWxlbWVudCBhbmQgaW5zZXJ0cyBpdCBhZnRlciB0aGUgZWxlbWVudFxuICAgICAqKlxuICAgICA9IChFbGVtZW50KSB0aGUgY2xvbmVcbiAgICBcXCovXG4gICAgZWxwcm90by5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNsb25lID0gd3JhcCh0aGlzLm5vZGUuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgaWYgKCQoY2xvbmUubm9kZSwgXCJpZFwiKSkge1xuICAgICAgICAgICAgJChjbG9uZS5ub2RlLCB7aWQ6IGNsb25lLmlkfSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4aWRzKGNsb25lKTtcbiAgICAgICAgY2xvbmUuaW5zZXJ0QWZ0ZXIodGhpcyk7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnRvRGVmc1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogTW92ZXMgZWxlbWVudCB0byB0aGUgc2hhcmVkIGA8ZGVmcz5gIGFyZWFcbiAgICAgKipcbiAgICAgPSAoRWxlbWVudCkgdGhlIGVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by50b0RlZnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZWZzID0gZ2V0U29tZURlZnModGhpcyk7XG4gICAgICAgIGRlZnMuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC50b1BhdHRlcm5cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENyZWF0ZXMgYSBgPHBhdHRlcm4+YCBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAqKlxuICAgICAqIFRvIGNyZWF0ZSBhIHBhdHRlcm4geW91IGhhdmUgdG8gc3BlY2lmeSB0aGUgcGF0dGVybiByZWN0OlxuICAgICAtIHggKHN0cmluZ3xudW1iZXIpXG4gICAgIC0geSAoc3RyaW5nfG51bWJlcilcbiAgICAgLSB3aWR0aCAoc3RyaW5nfG51bWJlcilcbiAgICAgLSBoZWlnaHQgKHN0cmluZ3xudW1iZXIpXG4gICAgID0gKEVsZW1lbnQpIHRoZSBgPHBhdHRlcm4+YCBlbGVtZW50XG4gICAgICogWW91IGNhbiB1c2UgcGF0dGVybiBsYXRlciBvbiBhcyBhbiBhcmd1bWVudCBmb3IgYGZpbGxgIGF0dHJpYnV0ZTpcbiAgICAgfCB2YXIgcCA9IHBhcGVyLnBhdGgoXCJNMTAtNS0xMCwxNU0xNSwwLDAsMTVNMC01LTIwLDE1XCIpLmF0dHIoe1xuICAgICB8ICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgIHwgICAgICAgICBzdHJva2U6IFwiI2JhZGE1NVwiLFxuICAgICB8ICAgICAgICAgc3Ryb2tlV2lkdGg6IDVcbiAgICAgfCAgICAgfSkucGF0dGVybigwLCAwLCAxMCwgMTApLFxuICAgICB8ICAgICBjID0gcGFwZXIuY2lyY2xlKDIwMCwgMjAwLCAxMDApO1xuICAgICB8IGMuYXR0cih7XG4gICAgIHwgICAgIGZpbGw6IHBcbiAgICAgfCB9KTtcbiAgICBcXCovXG4gICAgZWxwcm90by5wYXR0ZXJuID0gZWxwcm90by50b1BhdHRlcm4gPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgcCA9IG1ha2UoXCJwYXR0ZXJuXCIsIGdldFNvbWVEZWZzKHRoaXMpKTtcbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgeCA9IHRoaXMuZ2V0QkJveCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcyh4LCBcIm9iamVjdFwiKSAmJiBcInhcIiBpbiB4KSB7XG4gICAgICAgICAgICB5ID0geC55O1xuICAgICAgICAgICAgd2lkdGggPSB4LndpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0geC5oZWlnaHQ7XG4gICAgICAgICAgICB4ID0geC54O1xuICAgICAgICB9XG4gICAgICAgICQocC5ub2RlLCB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgcGF0dGVyblVuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCIsXG4gICAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICAgIHZpZXdCb3g6IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XS5qb2luKFwiIFwiKVxuICAgICAgICB9KTtcbiAgICAgICAgcC5ub2RlLmFwcGVuZENoaWxkKHRoaXMubm9kZSk7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH07XG4vLyBTSUVSUkEgRWxlbWVudC5tYXJrZXIoKTogY2xhcmlmeSB3aGF0IGEgcmVmZXJlbmNlIHBvaW50IGlzLiBFLmcuLCBoZWxwcyB5b3Ugb2Zmc2V0IHRoZSBvYmplY3QgZnJvbSBpdHMgZWRnZSBzdWNoIGFzIHdoZW4gY2VudGVyaW5nIGl0IG92ZXIgYSBwYXRoLlxuLy8gU0lFUlJBIEVsZW1lbnQubWFya2VyKCk6IEkgc3VnZ2VzdCB0aGUgbWV0aG9kIHNob3VsZCBhY2NlcHQgZGVmYXVsdCByZWZlcmVuY2UgcG9pbnQgdmFsdWVzLiAgUGVyaGFwcyBjZW50ZXJlZCB3aXRoIChyZWZYID0gd2lkdGgvMikgYW5kIChyZWZZID0gaGVpZ2h0LzIpPyBBbHNvLCBjb3VsZG4ndCBpdCBhc3N1bWUgdGhlIGVsZW1lbnQncyBjdXJyZW50IF93aWR0aF8gYW5kIF9oZWlnaHRfPyBBbmQgcGxlYXNlIHNwZWNpZnkgd2hhdCBfeF8gYW5kIF95XyBtZWFuOiBvZmZzZXRzPyBJZiBzbywgZnJvbSB3aGVyZT8gIENvdWxkbid0IHRoZXkgYWxzbyBiZSBhc3NpZ25lZCBkZWZhdWx0IHZhbHVlcz9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5tYXJrZXJcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENyZWF0ZXMgYSBgPG1hcmtlcj5gIGVsZW1lbnQgZnJvbSB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgICoqXG4gICAgICogVG8gY3JlYXRlIGEgbWFya2VyIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIGJvdW5kaW5nIHJlY3QgYW5kIHJlZmVyZW5jZSBwb2ludDpcbiAgICAgLSB4IChudW1iZXIpXG4gICAgIC0geSAobnVtYmVyKVxuICAgICAtIHdpZHRoIChudW1iZXIpXG4gICAgIC0gaGVpZ2h0IChudW1iZXIpXG4gICAgIC0gcmVmWCAobnVtYmVyKVxuICAgICAtIHJlZlkgKG51bWJlcilcbiAgICAgPSAoRWxlbWVudCkgdGhlIGA8bWFya2VyPmAgZWxlbWVudFxuICAgICAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgbWFya2VyIGxhdGVyIGFzIGFuIGFyZ3VtZW50IGZvciBgbWFya2VyLXN0YXJ0YCwgYG1hcmtlci1lbmRgLCBgbWFya2VyLW1pZGAsIGFuZCBgbWFya2VyYCBhdHRyaWJ1dGVzLiBUaGUgYG1hcmtlcmAgYXR0cmlidXRlIHBsYWNlcyB0aGUgbWFya2VyIGF0IGV2ZXJ5IHBvaW50IGFsb25nIHRoZSBwYXRoLCBhbmQgYG1hcmtlci1taWRgIHBsYWNlcyB0aGVtIGF0IGV2ZXJ5IHBvaW50IGV4Y2VwdCB0aGUgc3RhcnQgYW5kIGVuZC5cbiAgICBcXCovXG4gICAgLy8gVE9ETyBhZGQgdXNhZ2UgZm9yIG1hcmtlcnNcbiAgICBlbHByb3RvLm1hcmtlciA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCByZWZYLCByZWZZKSB7XG4gICAgICAgIHZhciBwID0gbWFrZShcIm1hcmtlclwiLCBnZXRTb21lRGVmcyh0aGlzKSk7XG4gICAgICAgIGlmICh4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHggPSB0aGlzLmdldEJCb3goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXMoeCwgXCJvYmplY3RcIikgJiYgXCJ4XCIgaW4geCkge1xuICAgICAgICAgICAgeSA9IHgueTtcbiAgICAgICAgICAgIHdpZHRoID0geC53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IHguaGVpZ2h0O1xuICAgICAgICAgICAgcmVmWCA9IHgucmVmWCB8fCB4LmN4O1xuICAgICAgICAgICAgcmVmWSA9IHgucmVmWSB8fCB4LmN5O1xuICAgICAgICAgICAgeCA9IHgueDtcbiAgICAgICAgfVxuICAgICAgICAkKHAubm9kZSwge1xuICAgICAgICAgICAgdmlld0JveDogW3gsIHksIHdpZHRoLCBoZWlnaHRdLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgbWFya2VyV2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgbWFya2VySGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICBvcmllbnQ6IFwiYXV0b1wiLFxuICAgICAgICAgICAgcmVmWDogcmVmWCB8fCAwLFxuICAgICAgICAgICAgcmVmWTogcmVmWSB8fCAwLFxuICAgICAgICAgICAgaWQ6IHAuaWRcbiAgICAgICAgfSk7XG4gICAgICAgIHAubm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9O1xuICAgIHZhciBlbGRhdGEgPSB7fTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5kYXRhXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIG9yIHJldHJpZXZlcyBnaXZlbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ga2V5LiAoRG9u4oCZdCBjb25mdXNlXG4gICAgICogd2l0aCBgZGF0YS1gIGF0dHJpYnV0ZXMpXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbyBARWxlbWVudC5yZW1vdmVEYXRhXG4gICAgIC0ga2V5IChzdHJpbmcpIGtleSB0byBzdG9yZSBkYXRhXG4gICAgIC0gdmFsdWUgKGFueSkgI29wdGlvbmFsIHZhbHVlIHRvIHN0b3JlXG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICAgKiBvciwgaWYgdmFsdWUgaXMgbm90IHNwZWNpZmllZDpcbiAgICAgPSAoYW55KSB2YWx1ZVxuICAgICA+IFVzYWdlXG4gICAgIHwgZm9yICh2YXIgaSA9IDAsIGkgPCA1LCBpKyspIHtcbiAgICAgfCAgICAgcGFwZXIuY2lyY2xlKDEwICsgMTUgKiBpLCAxMCwgMTApXG4gICAgIHwgICAgICAgICAgLmF0dHIoe2ZpbGw6IFwiIzAwMFwifSlcbiAgICAgfCAgICAgICAgICAuZGF0YShcImlcIiwgaSlcbiAgICAgfCAgICAgICAgICAuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICB8ICAgICAgICAgICAgIGFsZXJ0KHRoaXMuZGF0YShcImlcIikpO1xuICAgICB8ICAgICAgICAgIH0pO1xuICAgICB8IH1cbiAgICBcXCovXG4gICAgZWxwcm90by5kYXRhID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBlbGRhdGFbdGhpcy5pZF0gPSBlbGRhdGFbdGhpcy5pZF0gfHwge307XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgZXZlKFwic25hcC5kYXRhLmdldC5cIiArIHRoaXMuaWQsIHRoaXMsIGRhdGEsIG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgaWYgKFNuYXAuaXMoa2V5LCBcIm9iamVjdFwiKSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4ga2V5KSBpZiAoa2V5W2hhc10oaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhKGksIGtleVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlKFwic25hcC5kYXRhLmdldC5cIiArIHRoaXMuaWQsIHRoaXMsIGRhdGFba2V5XSwga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIGV2ZShcInNuYXAuZGF0YS5zZXQuXCIgKyB0aGlzLmlkLCB0aGlzLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5yZW1vdmVEYXRhXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGJ5IGdpdmVuIGtleS5cbiAgICAgKiBJZiBrZXkgaXMgbm90IHByb3ZpZGVkLCByZW1vdmVzIGFsbCB0aGUgZGF0YSBvZiB0aGUgZWxlbWVudC5cbiAgICAgLSBrZXkgKHN0cmluZykgI29wdGlvbmFsIGtleVxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8ucmVtb3ZlRGF0YSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbGRhdGFbdGhpcy5pZF0gPSB7fTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZGF0YVt0aGlzLmlkXSAmJiBkZWxldGUgZWxkYXRhW3RoaXMuaWRdW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5vdXRlclNWR1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBTVkcgY29kZSBmb3IgdGhlIGVsZW1lbnQsIGVxdWl2YWxlbnQgdG8gSFRNTCdzIGBvdXRlckhUTUxgLlxuICAgICAqXG4gICAgICogU2VlIGFsc28gQEVsZW1lbnQuaW5uZXJTVkdcbiAgICAgPSAoc3RyaW5nKSBTVkcgY29kZSBmb3IgdGhlIGVsZW1lbnRcbiAgICBcXCovXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudG9TdHJpbmdcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFNlZSBARWxlbWVudC5vdXRlclNWR1xuICAgIFxcKi9cbiAgICBlbHByb3RvLm91dGVyU1ZHID0gZWxwcm90by50b1N0cmluZyA9IHRvU3RyaW5nKDEpO1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmlubmVyU1ZHXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIFNWRyBjb2RlIGZvciB0aGUgZWxlbWVudCdzIGNvbnRlbnRzLCBlcXVpdmFsZW50IHRvIEhUTUwncyBgaW5uZXJIVE1MYFxuICAgICA9IChzdHJpbmcpIFNWRyBjb2RlIGZvciB0aGUgZWxlbWVudFxuICAgIFxcKi9cbiAgICBlbHByb3RvLmlubmVyU1ZHID0gdG9TdHJpbmcoKTtcbiAgICBmdW5jdGlvbiB0b1N0cmluZyh0eXBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gdHlwZSA/IFwiPFwiICsgdGhpcy50eXBlIDogXCJcIixcbiAgICAgICAgICAgICAgICBhdHRyID0gdGhpcy5ub2RlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgY2hsZCA9IHRoaXMubm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBhdHRyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IFwiIFwiICsgYXR0cltpXS5uYW1lICsgJz1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJbaV0udmFsdWUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hsZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0eXBlICYmIChyZXMgKz0gXCI+XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gY2hsZC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGxkW2ldLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBjaGxkW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGxkW2ldLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSB3cmFwKGNobGRbaV0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHlwZSAmJiAocmVzICs9IFwiPC9cIiArIHRoaXMudHlwZSArIFwiPlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHlwZSAmJiAocmVzICs9IFwiLz5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHByb3RvLnRvRGF0YVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuYnRvYSkge1xuICAgICAgICAgICAgdmFyIGJiID0gdGhpcy5nZXRCQm94KCksXG4gICAgICAgICAgICAgICAgc3ZnID0gU25hcC5mb3JtYXQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cInt3aWR0aH1cIiBoZWlnaHQ9XCJ7aGVpZ2h0fVwiIHZpZXdCb3g9XCJ7eH0ge3l9IHt3aWR0aH0ge2hlaWdodH1cIj57Y29udGVudHN9PC9zdmc+Jywge1xuICAgICAgICAgICAgICAgIHg6ICtiYi54LnRvRml4ZWQoMyksXG4gICAgICAgICAgICAgICAgeTogK2JiLnkudG9GaXhlZCgzKSxcbiAgICAgICAgICAgICAgICB3aWR0aDogK2JiLndpZHRoLnRvRml4ZWQoMyksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiArYmIuaGVpZ2h0LnRvRml4ZWQoMyksXG4gICAgICAgICAgICAgICAgY29udGVudHM6IHRoaXMub3V0ZXJTVkcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3ZnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRnJhZ21lbnQuc2VsZWN0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBTZWUgQEVsZW1lbnQuc2VsZWN0XG4gICAgXFwqL1xuICAgIEZyYWdtZW50LnByb3RvdHlwZS5zZWxlY3QgPSBlbHByb3RvLnNlbGVjdDtcbiAgICAvKlxcXG4gICAgICogRnJhZ21lbnQuc2VsZWN0QWxsXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBTZWUgQEVsZW1lbnQuc2VsZWN0QWxsXG4gICAgXFwqL1xuICAgIEZyYWdtZW50LnByb3RvdHlwZS5zZWxlY3RBbGwgPSBlbHByb3RvLnNlbGVjdEFsbDtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTYgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KSB7XG4gICAgdmFyIGVscHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgaXMgPSBTbmFwLmlzLFxuICAgICAgICBTdHIgPSBTdHJpbmcsXG4gICAgICAgIGhhcyA9IFwiaGFzT3duUHJvcGVydHlcIjtcbiAgICBmdW5jdGlvbiBzbGljZShmcm9tLCB0bywgZikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgdmFyIHJlcyA9IGFyci5zbGljZShmcm9tLCB0byk7XG4gICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGYgPyBmKHJlcykgOiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBBbmltYXRpb24gPSBmdW5jdGlvbiAoYXR0ciwgbXMsIGVhc2luZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlYXNpbmcgPT0gXCJmdW5jdGlvblwiICYmICFlYXNpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGVhc2luZztcbiAgICAgICAgICAgIGVhc2luZyA9IG1pbmEubGluZWFyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMuZHVyID0gbXM7XG4gICAgICAgIGVhc2luZyAmJiAodGhpcy5lYXNpbmcgPSBlYXNpbmcpO1xuICAgICAgICBjYWxsYmFjayAmJiAodGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIFNuYXAuXy5BbmltYXRpb24gPSBBbmltYXRpb247XG4gICAgLypcXFxuICAgICAqIFNuYXAuYW5pbWF0aW9uXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGFuIGFuaW1hdGlvbiBvYmplY3RcbiAgICAgKipcbiAgICAgLSBhdHRyIChvYmplY3QpIGF0dHJpYnV0ZXMgb2YgZmluYWwgZGVzdGluYXRpb25cbiAgICAgLSBkdXJhdGlvbiAobnVtYmVyKSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHNcbiAgICAgLSBlYXNpbmcgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgb25lIG9mIGVhc2luZyBmdW5jdGlvbnMgb2YgQG1pbmEgb3IgY3VzdG9tIG9uZVxuICAgICAtIGNhbGxiYWNrIChmdW5jdGlvbikgI29wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlyZXMgd2hlbiBhbmltYXRpb24gZW5kc1xuICAgICA9IChvYmplY3QpIGFuaW1hdGlvbiBvYmplY3RcbiAgICBcXCovXG4gICAgU25hcC5hbmltYXRpb24gPSBmdW5jdGlvbiAoYXR0ciwgbXMsIGVhc2luZywgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb24oYXR0ciwgbXMsIGVhc2luZywgY2FsbGJhY2spO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuaW5BbmltXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIGFuaW1hdGlvbnMgdGhhdCBtYXkgYmUgYWJsZSB0byBtYW5pcHVsYXRlIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgKipcbiAgICAgPSAob2JqZWN0KSBpbiBmb3JtYXQ6XG4gICAgIG8ge1xuICAgICBvICAgICBhbmltIChvYmplY3QpIGFuaW1hdGlvbiBvYmplY3QsXG4gICAgIG8gICAgIG1pbmEgKG9iamVjdCkgQG1pbmEgb2JqZWN0LFxuICAgICBvICAgICBjdXJTdGF0dXMgKG51bWJlcikgMC4uMSDigJQgc3RhdHVzIG9mIHRoZSBhbmltYXRpb246IDAg4oCUIGp1c3Qgc3RhcnRlZCwgMSDigJQganVzdCBmaW5pc2hlZCxcbiAgICAgbyAgICAgc3RhdHVzIChmdW5jdGlvbikgZ2V0cyBvciBzZXRzIHRoZSBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbixcbiAgICAgbyAgICAgc3RvcCAoZnVuY3Rpb24pIHN0b3BzIHRoZSBhbmltYXRpb25cbiAgICAgbyB9XG4gICAgXFwqL1xuICAgIGVscHJvdG8uaW5BbmltID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLFxuICAgICAgICAgICAgcmVzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkIGluIGVsLmFuaW1zKSBpZiAoZWwuYW5pbXNbaGFzXShpZCkpIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgYW5pbTogbmV3IEFuaW1hdGlvbihhLl9hdHRycywgYS5kdXIsIGEuZWFzaW5nLCBhLl9jYWxsYmFjayksXG4gICAgICAgICAgICAgICAgICAgIG1pbmE6IGEsXG4gICAgICAgICAgICAgICAgICAgIGN1clN0YXR1czogYS5zdGF0dXMoKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5zdGF0dXModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0oZWwuYW5pbXNbaWRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLmFuaW1hdGVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJ1bnMgZ2VuZXJpYyBhbmltYXRpb24gb2Ygb25lIG51bWJlciBpbnRvIGFub3RoZXIgd2l0aCBhIGNhcmluZyBmdW5jdGlvblxuICAgICAqKlxuICAgICAtIGZyb20gKG51bWJlcnxhcnJheSkgbnVtYmVyIG9yIGFycmF5IG9mIG51bWJlcnNcbiAgICAgLSB0byAobnVtYmVyfGFycmF5KSBudW1iZXIgb3IgYXJyYXkgb2YgbnVtYmVyc1xuICAgICAtIHNldHRlciAoZnVuY3Rpb24pIGNhcmluZyBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG51bWJlciBhcmd1bWVudFxuICAgICAtIGR1cmF0aW9uIChudW1iZXIpIGR1cmF0aW9uLCBpbiBtaWxsaXNlY29uZHNcbiAgICAgLSBlYXNpbmcgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgZWFzaW5nIGZ1bmN0aW9uIGZyb20gQG1pbmEgb3IgY3VzdG9tXG4gICAgIC0gY2FsbGJhY2sgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIGFuaW1hdGlvbiBlbmRzXG4gICAgID0gKG9iamVjdCkgYW5pbWF0aW9uIG9iamVjdCBpbiBAbWluYSBmb3JtYXRcbiAgICAgbyB7XG4gICAgIG8gICAgIGlkIChzdHJpbmcpIGFuaW1hdGlvbiBpZCwgY29uc2lkZXIgaXQgcmVhZC1vbmx5LFxuICAgICBvICAgICBkdXJhdGlvbiAoZnVuY3Rpb24pIGdldHMgb3Igc2V0cyB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbixcbiAgICAgbyAgICAgZWFzaW5nIChmdW5jdGlvbikgZWFzaW5nLFxuICAgICBvICAgICBzcGVlZCAoZnVuY3Rpb24pIGdldHMgb3Igc2V0cyB0aGUgc3BlZWQgb2YgdGhlIGFuaW1hdGlvbixcbiAgICAgbyAgICAgc3RhdHVzIChmdW5jdGlvbikgZ2V0cyBvciBzZXRzIHRoZSBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbixcbiAgICAgbyAgICAgc3RvcCAoZnVuY3Rpb24pIHN0b3BzIHRoZSBhbmltYXRpb25cbiAgICAgbyB9XG4gICAgIHwgdmFyIHJlY3QgPSBTbmFwKCkucmVjdCgwLCAwLCAxMCwgMTApO1xuICAgICB8IFNuYXAuYW5pbWF0ZSgwLCAxMCwgZnVuY3Rpb24gKHZhbCkge1xuICAgICB8ICAgICByZWN0LmF0dHIoe1xuICAgICB8ICAgICAgICAgeDogdmFsXG4gICAgIHwgICAgIH0pO1xuICAgICB8IH0sIDEwMDApO1xuICAgICB8IC8vIGluIGdpdmVuIGNvbnRleHQgaXMgZXF1aXZhbGVudCB0b1xuICAgICB8IHJlY3QuYW5pbWF0ZSh7eDogMTB9LCAxMDAwKTtcbiAgICBcXCovXG4gICAgU25hcC5hbmltYXRlID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzZXR0ZXIsIG1zLCBlYXNpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWFzaW5nID09IFwiZnVuY3Rpb25cIiAmJiAhZWFzaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBlYXNpbmc7XG4gICAgICAgICAgICBlYXNpbmcgPSBtaW5hLmxpbmVhcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm93ID0gbWluYS50aW1lKCksXG4gICAgICAgICAgICBhbmltID0gbWluYShmcm9tLCB0bywgbm93LCBub3cgKyBtcywgbWluYS50aW1lLCBzZXR0ZXIsIGVhc2luZyk7XG4gICAgICAgIGNhbGxiYWNrICYmIGV2ZS5vbmNlKFwibWluYS5maW5pc2guXCIgKyBhbmltLmlkLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBhbmltO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuc3RvcFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogU3RvcHMgYWxsIHRoZSBhbmltYXRpb25zIGZvciB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgICoqXG4gICAgID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYW5pbXMgPSB0aGlzLmluQW5pbSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBhbmltcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBhbmltc1tpXS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5hbmltYXRlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBbmltYXRlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudFxuICAgICAqKlxuICAgICAtIGF0dHJzIChvYmplY3QpIGtleS12YWx1ZSBwYWlycyBvZiBkZXN0aW5hdGlvbiBhdHRyaWJ1dGVzXG4gICAgIC0gZHVyYXRpb24gKG51bWJlcikgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgICAgLSBlYXNpbmcgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgZWFzaW5nIGZ1bmN0aW9uIGZyb20gQG1pbmEgb3IgY3VzdG9tXG4gICAgIC0gY2FsbGJhY2sgKGZ1bmN0aW9uKSAjb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB3aGVuIHRoZSBhbmltYXRpb24gZW5kc1xuICAgICA9IChFbGVtZW50KSB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8uYW5pbWF0ZSA9IGZ1bmN0aW9uIChhdHRycywgbXMsIGVhc2luZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlYXNpbmcgPT0gXCJmdW5jdGlvblwiICYmICFlYXNpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGVhc2luZztcbiAgICAgICAgICAgIGVhc2luZyA9IG1pbmEubGluZWFyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRycyBpbnN0YW5jZW9mIEFuaW1hdGlvbikge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBhdHRycy5jYWxsYmFjaztcbiAgICAgICAgICAgIGVhc2luZyA9IGF0dHJzLmVhc2luZztcbiAgICAgICAgICAgIG1zID0gYXR0cnMuZHVyO1xuICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5hdHRyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBma2V5cyA9IFtdLCB0a2V5cyA9IFtdLCBrZXlzID0ge30sIGZyb20sIHRvLCBmLCBlcSxcbiAgICAgICAgICAgIGVsID0gdGhpcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGF0dHJzKSBpZiAoYXR0cnNbaGFzXShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoZWwuZXF1YWwpIHtcbiAgICAgICAgICAgICAgICBlcSA9IGVsLmVxdWFsKGtleSwgU3RyKGF0dHJzW2tleV0pKTtcbiAgICAgICAgICAgICAgICBmcm9tID0gZXEuZnJvbTtcbiAgICAgICAgICAgICAgICB0byA9IGVxLnRvO1xuICAgICAgICAgICAgICAgIGYgPSBlcS5mO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gK2VsLmF0dHIoa2V5KTtcbiAgICAgICAgICAgICAgICB0byA9ICthdHRyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxlbiA9IGlzKGZyb20sIFwiYXJyYXlcIikgPyBmcm9tLmxlbmd0aCA6IDE7XG4gICAgICAgICAgICBrZXlzW2tleV0gPSBzbGljZShma2V5cy5sZW5ndGgsIGZrZXlzLmxlbmd0aCArIGxlbiwgZik7XG4gICAgICAgICAgICBma2V5cyA9IGZrZXlzLmNvbmNhdChmcm9tKTtcbiAgICAgICAgICAgIHRrZXlzID0gdGtleXMuY29uY2F0KHRvKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm93ID0gbWluYS50aW1lKCksXG4gICAgICAgICAgICBhbmltID0gbWluYShma2V5cywgdGtleXMsIG5vdywgbm93ICsgbXMsIG1pbmEudGltZSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyID0ge307XG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGtleXMpIGlmIChrZXlzW2hhc10oa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyW2tleV0gPSBrZXlzW2tleV0odmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWwuYXR0cihhdHRyKTtcbiAgICAgICAgICAgIH0sIGVhc2luZyk7XG4gICAgICAgIGVsLmFuaW1zW2FuaW0uaWRdID0gYW5pbTtcbiAgICAgICAgYW5pbS5fYXR0cnMgPSBhdHRycztcbiAgICAgICAgYW5pbS5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgZXZlKFwic25hcC5hbmltY3JlYXRlZC5cIiArIGVsLmlkLCBhbmltKTtcbiAgICAgICAgZXZlLm9uY2UoXCJtaW5hLmZpbmlzaC5cIiArIGFuaW0uaWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV2ZS5vZmYoXCJtaW5hLiouXCIgKyBhbmltLmlkKTtcbiAgICAgICAgICAgIGRlbGV0ZSBlbC5hbmltc1thbmltLmlkXTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwoZWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlLm9uY2UoXCJtaW5hLnN0b3AuXCIgKyBhbmltLmlkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBldmUub2ZmKFwibWluYS4qLlwiICsgYW5pbS5pZCk7XG4gICAgICAgICAgICBkZWxldGUgZWwuYW5pbXNbYW5pbS5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KSB7XG4gICAgdmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbiAgICAgICAgU3RyID0gU3RyaW5nLFxuICAgICAgICBtYXRoID0gTWF0aCxcbiAgICAgICAgRSA9IFwiXCI7XG4gICAgZnVuY3Rpb24gTWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCAmJiBvYmplY3RUb1N0cmluZy5jYWxsKGEpID09IFwiW29iamVjdCBTVkdNYXRyaXhdXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYSA9IGEuYTtcbiAgICAgICAgICAgIHRoaXMuYiA9IGEuYjtcbiAgICAgICAgICAgIHRoaXMuYyA9IGEuYztcbiAgICAgICAgICAgIHRoaXMuZCA9IGEuZDtcbiAgICAgICAgICAgIHRoaXMuZSA9IGEuZTtcbiAgICAgICAgICAgIHRoaXMuZiA9IGEuZjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmEgPSArYTtcbiAgICAgICAgICAgIHRoaXMuYiA9ICtiO1xuICAgICAgICAgICAgdGhpcy5jID0gK2M7XG4gICAgICAgICAgICB0aGlzLmQgPSArZDtcbiAgICAgICAgICAgIHRoaXMuZSA9ICtlO1xuICAgICAgICAgICAgdGhpcy5mID0gK2Y7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmEgPSAxO1xuICAgICAgICAgICAgdGhpcy5iID0gMDtcbiAgICAgICAgICAgIHRoaXMuYyA9IDA7XG4gICAgICAgICAgICB0aGlzLmQgPSAxO1xuICAgICAgICAgICAgdGhpcy5lID0gMDtcbiAgICAgICAgICAgIHRoaXMuZiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKGZ1bmN0aW9uIChtYXRyaXhwcm90bykge1xuICAgICAgICAvKlxcXG4gICAgICAgICAqIE1hdHJpeC5hZGRcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIEFkZHMgdGhlIGdpdmVuIG1hdHJpeCB0byBleGlzdGluZyBvbmVcbiAgICAgICAgIC0gYSAobnVtYmVyKVxuICAgICAgICAgLSBiIChudW1iZXIpXG4gICAgICAgICAtIGMgKG51bWJlcilcbiAgICAgICAgIC0gZCAobnVtYmVyKVxuICAgICAgICAgLSBlIChudW1iZXIpXG4gICAgICAgICAtIGYgKG51bWJlcilcbiAgICAgICAgICogb3JcbiAgICAgICAgIC0gbWF0cml4IChvYmplY3QpIEBNYXRyaXhcbiAgICAgICAgXFwqL1xuICAgICAgICBtYXRyaXhwcm90by5hZGQgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgICAgICAgaWYgKGEgJiYgYSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChhLmEsIGEuYiwgYS5jLCBhLmQsIGEuZSwgYS5mKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhTmV3ID0gYSAqIHRoaXMuYSArIGIgKiB0aGlzLmMsXG4gICAgICAgICAgICAgICAgYk5ldyA9IGEgKiB0aGlzLmIgKyBiICogdGhpcy5kO1xuICAgICAgICAgICAgdGhpcy5lICs9IGUgKiB0aGlzLmEgKyBmICogdGhpcy5jO1xuICAgICAgICAgICAgdGhpcy5mICs9IGUgKiB0aGlzLmIgKyBmICogdGhpcy5kO1xuICAgICAgICAgICAgdGhpcy5jID0gYyAqIHRoaXMuYSArIGQgKiB0aGlzLmM7XG4gICAgICAgICAgICB0aGlzLmQgPSBjICogdGhpcy5iICsgZCAqIHRoaXMuZDtcblxuICAgICAgICAgICAgdGhpcy5hID0gYU5ldztcbiAgICAgICAgICAgIHRoaXMuYiA9IGJOZXc7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXgubXVsdExlZnRcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIE11bHRpcGxpZXMgYSBwYXNzZWQgYWZmaW5lIHRyYW5zZm9ybSB0byB0aGUgbGVmdDogTSAqIHRoaXMuXG4gICAgICAgICAtIGEgKG51bWJlcilcbiAgICAgICAgIC0gYiAobnVtYmVyKVxuICAgICAgICAgLSBjIChudW1iZXIpXG4gICAgICAgICAtIGQgKG51bWJlcilcbiAgICAgICAgIC0gZSAobnVtYmVyKVxuICAgICAgICAgLSBmIChudW1iZXIpXG4gICAgICAgICAqIG9yXG4gICAgICAgICAtIG1hdHJpeCAob2JqZWN0KSBATWF0cml4XG4gICAgICAgIFxcKi9cbiAgICAgICAgTWF0cml4LnByb3RvdHlwZS5tdWx0TGVmdCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAgICAgICBpZiAoYSAmJiBhIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdExlZnQoYS5hLCBhLmIsIGEuYywgYS5kLCBhLmUsIGEuZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYU5ldyA9IGEgKiB0aGlzLmEgKyBjICogdGhpcy5iLFxuICAgICAgICAgICAgICAgIGNOZXcgPSBhICogdGhpcy5jICsgYyAqIHRoaXMuZCxcbiAgICAgICAgICAgICAgICBlTmV3ID0gYSAqIHRoaXMuZSArIGMgKiB0aGlzLmYgKyBlO1xuICAgICAgICAgICAgdGhpcy5iID0gYiAqIHRoaXMuYSArIGQgKiB0aGlzLmI7XG4gICAgICAgICAgICB0aGlzLmQgPSBiICogdGhpcy5jICsgZCAqIHRoaXMuZDtcbiAgICAgICAgICAgIHRoaXMuZiA9IGIgKiB0aGlzLmUgKyBkICogdGhpcy5mICsgZjtcblxuICAgICAgICAgICAgdGhpcy5hID0gYU5ldztcbiAgICAgICAgICAgIHRoaXMuYyA9IGNOZXc7XG4gICAgICAgICAgICB0aGlzLmUgPSBlTmV3O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgIC8qXFxcbiAgICAgICAgICogTWF0cml4LmludmVydFxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogUmV0dXJucyBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoZSBtYXRyaXhcbiAgICAgICAgID0gKG9iamVjdCkgQE1hdHJpeFxuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLmludmVydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeCA9IG1lLmEgKiBtZS5kIC0gbWUuYiAqIG1lLmM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeChtZS5kIC8geCwgLW1lLmIgLyB4LCAtbWUuYyAvIHgsIG1lLmEgLyB4LCAobWUuYyAqIG1lLmYgLSBtZS5kICogbWUuZSkgLyB4LCAobWUuYiAqIG1lLmUgLSBtZS5hICogbWUuZikgLyB4KTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXguY2xvbmVcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBtYXRyaXhcbiAgICAgICAgID0gKG9iamVjdCkgQE1hdHJpeFxuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGhpcy5kLCB0aGlzLmUsIHRoaXMuZik7XG4gICAgICAgIH07XG4gICAgICAgIC8qXFxcbiAgICAgICAgICogTWF0cml4LnRyYW5zbGF0ZVxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogVHJhbnNsYXRlIHRoZSBtYXRyaXhcbiAgICAgICAgIC0geCAobnVtYmVyKSBob3Jpem9udGFsIG9mZnNldCBkaXN0YW5jZVxuICAgICAgICAgLSB5IChudW1iZXIpIHZlcnRpY2FsIG9mZnNldCBkaXN0YW5jZVxuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICB0aGlzLmUgKz0geCAqIHRoaXMuYSArIHkgKiB0aGlzLmM7XG4gICAgICAgICAgICB0aGlzLmYgKz0geCAqIHRoaXMuYiArIHkgKiB0aGlzLmQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXguc2NhbGVcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFNjYWxlcyB0aGUgbWF0cml4XG4gICAgICAgICAtIHggKG51bWJlcikgYW1vdW50IHRvIGJlIHNjYWxlZCwgd2l0aCBgMWAgcmVzdWx0aW5nIGluIG5vIGNoYW5nZVxuICAgICAgICAgLSB5IChudW1iZXIpICNvcHRpb25hbCBhbW91bnQgdG8gc2NhbGUgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMuIChPdGhlcndpc2UgYHhgIGFwcGxpZXMgdG8gYm90aCBheGVzLilcbiAgICAgICAgIC0gY3ggKG51bWJlcikgI29wdGlvbmFsIGhvcml6b250YWwgb3JpZ2luIHBvaW50IGZyb20gd2hpY2ggdG8gc2NhbGVcbiAgICAgICAgIC0gY3kgKG51bWJlcikgI29wdGlvbmFsIHZlcnRpY2FsIG9yaWdpbiBwb2ludCBmcm9tIHdoaWNoIHRvIHNjYWxlXG4gICAgICAgICAqIERlZmF1bHQgY3gsIGN5IGlzIHRoZSBtaWRkbGUgcG9pbnQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgIFxcKi9cbiAgICAgICAgbWF0cml4cHJvdG8uc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSwgY3gsIGN5KSB7XG4gICAgICAgICAgICB5ID09IG51bGwgJiYgKHkgPSB4KTtcbiAgICAgICAgICAgIChjeCB8fCBjeSkgJiYgdGhpcy50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgICAgIHRoaXMuYSAqPSB4O1xuICAgICAgICAgICAgdGhpcy5iICo9IHg7XG4gICAgICAgICAgICB0aGlzLmMgKj0geTtcbiAgICAgICAgICAgIHRoaXMuZCAqPSB5O1xuICAgICAgICAgICAgKGN4IHx8IGN5KSAmJiB0aGlzLnRyYW5zbGF0ZSgtY3gsIC1jeSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXgucm90YXRlXG4gICAgICAgICBbIG1ldGhvZCBdXG4gICAgICAgICAqKlxuICAgICAgICAgKiBSb3RhdGVzIHRoZSBtYXRyaXhcbiAgICAgICAgIC0gYSAobnVtYmVyKSBhbmdsZSBvZiByb3RhdGlvbiwgaW4gZGVncmVlc1xuICAgICAgICAgLSB4IChudW1iZXIpIGhvcml6b250YWwgb3JpZ2luIHBvaW50IGZyb20gd2hpY2ggdG8gcm90YXRlXG4gICAgICAgICAtIHkgKG51bWJlcikgdmVydGljYWwgb3JpZ2luIHBvaW50IGZyb20gd2hpY2ggdG8gcm90YXRlXG4gICAgICAgIFxcKi9cbiAgICAgICAgbWF0cml4cHJvdG8ucm90YXRlID0gZnVuY3Rpb24gKGEsIHgsIHkpIHtcbiAgICAgICAgICAgIGEgPSBTbmFwLnJhZChhKTtcbiAgICAgICAgICAgIHggPSB4IHx8IDA7XG4gICAgICAgICAgICB5ID0geSB8fCAwO1xuICAgICAgICAgICAgdmFyIGNvcyA9ICttYXRoLmNvcyhhKS50b0ZpeGVkKDkpLFxuICAgICAgICAgICAgICAgIHNpbiA9ICttYXRoLnNpbihhKS50b0ZpeGVkKDkpO1xuICAgICAgICAgICAgdGhpcy5hZGQoY29zLCBzaW4sIC1zaW4sIGNvcywgeCwgeSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoMSwgMCwgMCwgMSwgLXgsIC15KTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXguc2tld1hcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFNrZXdzIHRoZSBtYXRyaXggYWxvbmcgdGhlIHgtYXhpc1xuICAgICAgICAgLSB4IChudW1iZXIpIEFuZ2xlIHRvIHNrZXcgYWxvbmcgdGhlIHgtYXhpcyAoaW4gZGVncmVlcykuXG4gICAgICAgIFxcKi9cbiAgICAgICAgbWF0cml4cHJvdG8uc2tld1ggPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tldyh4LCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXguc2tld1lcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFNrZXdzIHRoZSBtYXRyaXggYWxvbmcgdGhlIHktYXhpc1xuICAgICAgICAgLSB5IChudW1iZXIpIEFuZ2xlIHRvIHNrZXcgYWxvbmcgdGhlIHktYXhpcyAoaW4gZGVncmVlcykuXG4gICAgICAgIFxcKi9cbiAgICAgICAgbWF0cml4cHJvdG8uc2tld1kgPSBmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tldygwLCB5KTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXguc2tld1xuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogU2tld3MgdGhlIG1hdHJpeFxuICAgICAgICAgLSB5IChudW1iZXIpIEFuZ2xlIHRvIHNrZXcgYWxvbmcgdGhlIHktYXhpcyAoaW4gZGVncmVlcykuXG4gICAgICAgICAtIHggKG51bWJlcikgQW5nbGUgdG8gc2tldyBhbG9uZyB0aGUgeC1heGlzIChpbiBkZWdyZWVzKS5cbiAgICAgICAgXFwqL1xuICAgICAgICBtYXRyaXhwcm90by5za2V3ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHggPSB4IHx8IDA7XG4gICAgICAgICAgICB5ID0geSB8fCAwO1xuICAgICAgICAgICAgeCA9IFNuYXAucmFkKHgpO1xuICAgICAgICAgICAgeSA9IFNuYXAucmFkKHkpO1xuICAgICAgICAgICAgdmFyIGMgPSBtYXRoLnRhbih4KS50b0ZpeGVkKDkpO1xuICAgICAgICAgICAgdmFyIGIgPSBtYXRoLnRhbih5KS50b0ZpeGVkKDkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKDEsIGIsIGMsIDEsIDAsIDApO1xuICAgICAgICB9O1xuICAgICAgICAvKlxcXG4gICAgICAgICAqIE1hdHJpeC54XG4gICAgICAgICBbIG1ldGhvZCBdXG4gICAgICAgICAqKlxuICAgICAgICAgKiBSZXR1cm5zIHggY29vcmRpbmF0ZSBmb3IgZ2l2ZW4gcG9pbnQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24gZGVzY3JpYmVkIGJ5IHRoZSBtYXRyaXguIFNlZSBhbHNvIEBNYXRyaXgueVxuICAgICAgICAgLSB4IChudW1iZXIpXG4gICAgICAgICAtIHkgKG51bWJlcilcbiAgICAgICAgID0gKG51bWJlcikgeFxuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLnggPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggKiB0aGlzLmEgKyB5ICogdGhpcy5jICsgdGhpcy5lO1xuICAgICAgICB9O1xuICAgICAgICAvKlxcXG4gICAgICAgICAqIE1hdHJpeC55XG4gICAgICAgICBbIG1ldGhvZCBdXG4gICAgICAgICAqKlxuICAgICAgICAgKiBSZXR1cm5zIHkgY29vcmRpbmF0ZSBmb3IgZ2l2ZW4gcG9pbnQgYWZ0ZXIgdHJhbnNmb3JtYXRpb24gZGVzY3JpYmVkIGJ5IHRoZSBtYXRyaXguIFNlZSBhbHNvIEBNYXRyaXgueFxuICAgICAgICAgLSB4IChudW1iZXIpXG4gICAgICAgICAtIHkgKG51bWJlcilcbiAgICAgICAgID0gKG51bWJlcikgeVxuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLnkgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggKiB0aGlzLmIgKyB5ICogdGhpcy5kICsgdGhpcy5mO1xuICAgICAgICB9O1xuICAgICAgICBtYXRyaXhwcm90by5nZXQgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzW1N0ci5mcm9tQ2hhckNvZGUoOTcgKyBpKV0udG9GaXhlZCg0KTtcbiAgICAgICAgfTtcbiAgICAgICAgbWF0cml4cHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJtYXRyaXgoXCIgKyBbdGhpcy5nZXQoMCksIHRoaXMuZ2V0KDEpLCB0aGlzLmdldCgyKSwgdGhpcy5nZXQoMyksIHRoaXMuZ2V0KDQpLCB0aGlzLmdldCg1KV0uam9pbigpICsgXCIpXCI7XG4gICAgICAgIH07XG4gICAgICAgIG1hdHJpeHByb3RvLm9mZnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5lLnRvRml4ZWQoNCksIHRoaXMuZi50b0ZpeGVkKDQpXTtcbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gbm9ybShhKSB7XG4gICAgICAgICAgICByZXR1cm4gYVswXSAqIGFbMF0gKyBhWzFdICogYVsxXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUoYSkge1xuICAgICAgICAgICAgdmFyIG1hZyA9IG1hdGguc3FydChub3JtKGEpKTtcbiAgICAgICAgICAgIGFbMF0gJiYgKGFbMF0gLz0gbWFnKTtcbiAgICAgICAgICAgIGFbMV0gJiYgKGFbMV0gLz0gbWFnKTtcbiAgICAgICAgfVxuICAgICAgICAvKlxcXG4gICAgICAgICAqIE1hdHJpeC5kZXRlcm1pbmFudFxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogRmluZHMgZGV0ZXJtaW5hbnQgb2YgdGhlIGdpdmVuIG1hdHJpeC5cbiAgICAgICAgID0gKG51bWJlcikgZGV0ZXJtaW5hbnRcbiAgICAgICAgXFwqL1xuICAgICAgICBtYXRyaXhwcm90by5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmEgKiB0aGlzLmQgLSB0aGlzLmIgKiB0aGlzLmM7XG4gICAgICAgIH07XG4gICAgICAgIC8qXFxcbiAgICAgICAgICogTWF0cml4LnNwbGl0XG4gICAgICAgICBbIG1ldGhvZCBdXG4gICAgICAgICAqKlxuICAgICAgICAgKiBTcGxpdHMgbWF0cml4IGludG8gcHJpbWl0aXZlIHRyYW5zZm9ybWF0aW9uc1xuICAgICAgICAgPSAob2JqZWN0KSBpbiBmb3JtYXQ6XG4gICAgICAgICBvIGR4IChudW1iZXIpIHRyYW5zbGF0aW9uIGJ5IHhcbiAgICAgICAgIG8gZHkgKG51bWJlcikgdHJhbnNsYXRpb24gYnkgeVxuICAgICAgICAgbyBzY2FsZXggKG51bWJlcikgc2NhbGUgYnkgeFxuICAgICAgICAgbyBzY2FsZXkgKG51bWJlcikgc2NhbGUgYnkgeVxuICAgICAgICAgbyBzaGVhciAobnVtYmVyKSBzaGVhclxuICAgICAgICAgbyByb3RhdGUgKG51bWJlcikgcm90YXRpb24gaW4gZGVnXG4gICAgICAgICBvIGlzU2ltcGxlIChib29sZWFuKSBjb3VsZCBpdCBiZSByZXByZXNlbnRlZCB2aWEgc2ltcGxlIHRyYW5zZm9ybWF0aW9uc1xuICAgICAgICBcXCovXG4gICAgICAgIG1hdHJpeHByb3RvLnNwbGl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG91dCA9IHt9O1xuICAgICAgICAgICAgLy8gdHJhbnNsYXRpb25cbiAgICAgICAgICAgIG91dC5keCA9IHRoaXMuZTtcbiAgICAgICAgICAgIG91dC5keSA9IHRoaXMuZjtcblxuICAgICAgICAgICAgLy8gc2NhbGUgYW5kIHNoZWFyXG4gICAgICAgICAgICB2YXIgcm93ID0gW1t0aGlzLmEsIHRoaXMuYl0sIFt0aGlzLmMsIHRoaXMuZF1dO1xuICAgICAgICAgICAgb3V0LnNjYWxleCA9IG1hdGguc3FydChub3JtKHJvd1swXSkpO1xuICAgICAgICAgICAgbm9ybWFsaXplKHJvd1swXSk7XG5cbiAgICAgICAgICAgIG91dC5zaGVhciA9IHJvd1swXVswXSAqIHJvd1sxXVswXSArIHJvd1swXVsxXSAqIHJvd1sxXVsxXTtcbiAgICAgICAgICAgIHJvd1sxXSA9IFtyb3dbMV1bMF0gLSByb3dbMF1bMF0gKiBvdXQuc2hlYXIsIHJvd1sxXVsxXSAtIHJvd1swXVsxXSAqIG91dC5zaGVhcl07XG5cbiAgICAgICAgICAgIG91dC5zY2FsZXkgPSBtYXRoLnNxcnQobm9ybShyb3dbMV0pKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZShyb3dbMV0pO1xuICAgICAgICAgICAgb3V0LnNoZWFyIC89IG91dC5zY2FsZXk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRldGVybWluYW50KCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgb3V0LnNjYWxleCA9IC1vdXQuc2NhbGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByb3RhdGlvblxuICAgICAgICAgICAgdmFyIHNpbiA9IHJvd1swXVsxXSxcbiAgICAgICAgICAgICAgICBjb3MgPSByb3dbMV1bMV07XG4gICAgICAgICAgICBpZiAoY29zIDwgMCkge1xuICAgICAgICAgICAgICAgIG91dC5yb3RhdGUgPSBTbmFwLmRlZyhtYXRoLmFjb3MoY29zKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNpbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnJvdGF0ZSA9IDM2MCAtIG91dC5yb3RhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQucm90YXRlID0gU25hcC5kZWcobWF0aC5hc2luKHNpbikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXQuaXNTaW1wbGUgPSAhK291dC5zaGVhci50b0ZpeGVkKDkpICYmIChvdXQuc2NhbGV4LnRvRml4ZWQoOSkgPT0gb3V0LnNjYWxleS50b0ZpeGVkKDkpIHx8ICFvdXQucm90YXRlKTtcbiAgICAgICAgICAgIG91dC5pc1N1cGVyU2ltcGxlID0gIStvdXQuc2hlYXIudG9GaXhlZCg5KSAmJiBvdXQuc2NhbGV4LnRvRml4ZWQoOSkgPT0gb3V0LnNjYWxleS50b0ZpeGVkKDkpICYmICFvdXQucm90YXRlO1xuICAgICAgICAgICAgb3V0Lm5vUm90YXRpb24gPSAhK291dC5zaGVhci50b0ZpeGVkKDkpICYmICFvdXQucm90YXRlO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBNYXRyaXgudG9UcmFuc2Zvcm1TdHJpbmdcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFJldHVybnMgdHJhbnNmb3JtIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgZ2l2ZW4gbWF0cml4XG4gICAgICAgICA9IChzdHJpbmcpIHRyYW5zZm9ybSBzdHJpbmdcbiAgICAgICAgXFwqL1xuICAgICAgICBtYXRyaXhwcm90by50b1RyYW5zZm9ybVN0cmluZyA9IGZ1bmN0aW9uIChzaG9ydGVyKSB7XG4gICAgICAgICAgICB2YXIgcyA9IHNob3J0ZXIgfHwgdGhpcy5zcGxpdCgpO1xuICAgICAgICAgICAgaWYgKCErcy5zaGVhci50b0ZpeGVkKDkpKSB7XG4gICAgICAgICAgICAgICAgcy5zY2FsZXggPSArcy5zY2FsZXgudG9GaXhlZCg0KTtcbiAgICAgICAgICAgICAgICBzLnNjYWxleSA9ICtzLnNjYWxleS50b0ZpeGVkKDQpO1xuICAgICAgICAgICAgICAgIHMucm90YXRlID0gK3Mucm90YXRlLnRvRml4ZWQoNCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICAocy5keCB8fCBzLmR5ID8gXCJ0XCIgKyBbK3MuZHgudG9GaXhlZCg0KSwgK3MuZHkudG9GaXhlZCg0KV0gOiBFKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAocy5yb3RhdGUgPyBcInJcIiArIFsrcy5yb3RhdGUudG9GaXhlZCg0KSwgMCwgMF0gOiBFKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAocy5zY2FsZXggIT0gMSB8fCBzLnNjYWxleSAhPSAxID8gXCJzXCIgKyBbcy5zY2FsZXgsIHMuc2NhbGV5LCAwLCAwXSA6IEUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtXCIgKyBbdGhpcy5nZXQoMCksIHRoaXMuZ2V0KDEpLCB0aGlzLmdldCgyKSwgdGhpcy5nZXQoMyksIHRoaXMuZ2V0KDQpLCB0aGlzLmdldCg1KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSkoTWF0cml4LnByb3RvdHlwZSk7XG4gICAgLypcXFxuICAgICAqIFNuYXAuTWF0cml4XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBNYXRyaXggY29uc3RydWN0b3IsIGV4dGVuZCBvbiB5b3VyIG93biByaXNrLlxuICAgICAqIFRvIGNyZWF0ZSBtYXRyaWNlcyB1c2UgQFNuYXAubWF0cml4LlxuICAgIFxcKi9cbiAgICBTbmFwLk1hdHJpeCA9IE1hdHJpeDtcbiAgICAvKlxcXG4gICAgICogU25hcC5tYXRyaXhcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFV0aWxpdHkgbWV0aG9kXG4gICAgICoqXG4gICAgICogUmV0dXJucyBhIG1hdHJpeCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xuICAgICAtIGEgKG51bWJlcilcbiAgICAgLSBiIChudW1iZXIpXG4gICAgIC0gYyAobnVtYmVyKVxuICAgICAtIGQgKG51bWJlcilcbiAgICAgLSBlIChudW1iZXIpXG4gICAgIC0gZiAobnVtYmVyKVxuICAgICAqIG9yXG4gICAgIC0gc3ZnTWF0cml4IChTVkdNYXRyaXgpXG4gICAgID0gKG9iamVjdCkgQE1hdHJpeFxuICAgIFxcKi9cbiAgICBTbmFwLm1hdHJpeCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIH07XG59KTtcblxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuU25hcC5wbHVnaW4oZnVuY3Rpb24gKFNuYXAsIEVsZW1lbnQsIFBhcGVyLCBnbG9iLCBGcmFnbWVudCkge1xuICAgIHZhciBoYXMgPSBcImhhc093blByb3BlcnR5XCIsXG4gICAgICAgIG1ha2UgPSBTbmFwLl8ubWFrZSxcbiAgICAgICAgd3JhcCA9IFNuYXAuXy53cmFwLFxuICAgICAgICBpcyA9IFNuYXAuaXMsXG4gICAgICAgIGdldFNvbWVEZWZzID0gU25hcC5fLmdldFNvbWVEZWZzLFxuICAgICAgICByZVVSTFZhbHVlID0gL151cmxcXCgoWydcIl0/KShbXildKylcXDFcXCkkLyxcbiAgICAgICAgJCA9IFNuYXAuXy4kLFxuICAgICAgICBVUkwgPSBTbmFwLnVybCxcbiAgICAgICAgU3RyID0gU3RyaW5nLFxuICAgICAgICBzZXBhcmF0b3IgPSBTbmFwLl8uc2VwYXJhdG9yLFxuICAgICAgICBFID0gXCJcIjtcbiAgICAvKlxcXG4gICAgICogU25hcC5kZXVybFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogVW53cmFwcyBwYXRoIGZyb20gYFwidXJsKDxwYXRoPilcImAuXG4gICAgIC0gdmFsdWUgKHN0cmluZykgdXJsIHBhdGhcbiAgICAgPSAoc3RyaW5nKSB1bndyYXBwZWQgcGF0aFxuICAgIFxcKi9cbiAgICBTbmFwLmRldXJsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXMgPSBTdHJpbmcodmFsdWUpLm1hdGNoKHJlVVJMVmFsdWUpO1xuICAgICAgICByZXR1cm4gcmVzID8gcmVzWzJdIDogdmFsdWU7XG4gICAgfVxuICAgIC8vIEF0dHJpYnV0ZXMgZXZlbnQgaGFuZGxlcnNcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5tYXNrXCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHZhbHVlIGluc3RhbmNlb2YgRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcmFnbWVudCAmJiB2YWx1ZS5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBnZXRTb21lRGVmcyh0aGlzKS5hcHBlbmRDaGlsZCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09IFwibWFza1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hc2sgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFzayA9IG1ha2UoXCJtYXNrXCIsIGdldFNvbWVEZWZzKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBtYXNrLm5vZGUuYXBwZW5kQ2hpbGQodmFsdWUubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAhbWFzay5ub2RlLmlkICYmICQobWFzay5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWQ6IG1hc2suaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJCh0aGlzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXNrOiBVUkwobWFzay5pZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgKGZ1bmN0aW9uIChjbGlwSXQpIHtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuY2xpcFwiLCBjbGlwSXQpO1xuICAgICAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5jbGlwLXBhdGhcIiwgY2xpcEl0KTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuY2xpcFBhdGhcIiwgY2xpcEl0KTtcbiAgICB9KGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHZhbHVlIGluc3RhbmNlb2YgRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgICAgICB2YXIgY2xpcCxcbiAgICAgICAgICAgICAgICBub2RlID0gdmFsdWUubm9kZTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09IFwiY2xpcFBhdGhcIikge1xuICAgICAgICAgICAgICAgICAgICBjbGlwID0gbmV3IEVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgICAgICAgICBjbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xpcCkge1xuICAgICAgICAgICAgICAgIGNsaXAgPSBtYWtlKFwiY2xpcFBhdGhcIiwgZ2V0U29tZURlZnModGhpcykpO1xuICAgICAgICAgICAgICAgIGNsaXAubm9kZS5hcHBlbmRDaGlsZCh2YWx1ZS5ub2RlKTtcbiAgICAgICAgICAgICAgICAhY2xpcC5ub2RlLmlkICYmICQoY2xpcC5ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjbGlwLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKHRoaXMubm9kZSwge1xuICAgICAgICAgICAgICAgIFwiY2xpcC1wYXRoXCI6IFVSTChjbGlwLm5vZGUuaWQgfHwgY2xpcC5pZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGZ1bmN0aW9uIGZpbGxTdHJva2UobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnJhZ21lbnQgJiYgdmFsdWUubm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLm5vZGUuZmlyc3RDaGlsZC50YWdOYW1lID09IFwicmFkaWFsR3JhZGllbnRcIiB8fFxuICAgICAgICAgICAgICAgIHZhbHVlLm5vZGUuZmlyc3RDaGlsZC50YWdOYW1lID09IFwibGluZWFyR3JhZGllbnRcIiB8fFxuICAgICAgICAgICAgICAgIHZhbHVlLm5vZGUuZmlyc3RDaGlsZC50YWdOYW1lID09IFwicGF0dGVyblwiKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGdldFNvbWVEZWZzKHRoaXMpLmFwcGVuZENoaWxkKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09IFwicmFkaWFsR3JhZGllbnRcIiB8fCB2YWx1ZS50eXBlID09IFwibGluZWFyR3JhZGllbnRcIlxuICAgICAgICAgICAgICAgICAgIHx8IHZhbHVlLnR5cGUgPT0gXCJwYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5ub2RlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHZhbHVlLm5vZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxsID0gVVJMKHZhbHVlLm5vZGUuaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGwgPSB2YWx1ZS5hdHRyKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlsbCA9IFNuYXAuY29sb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWxsLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBncmFkID0gU25hcChnZXRTb21lRGVmcyh0aGlzKS5vd25lclNWR0VsZW1lbnQpLmdyYWRpZW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZC5ub2RlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChncmFkLm5vZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdyYWQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBVUkwoZ3JhZC5ub2RlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTdHIoZmlsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGF0dHJzID0ge307XG4gICAgICAgICAgICBhdHRyc1tuYW1lXSA9IGZpbGw7XG4gICAgICAgICAgICAkKHRoaXMubm9kZSwgYXR0cnMpO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnN0eWxlW25hbWVdID0gRTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuZmlsbFwiLCBmaWxsU3Ryb2tlKFwiZmlsbFwiKSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuc3Ryb2tlXCIsIGZpbGxTdHJva2UoXCJzdHJva2VcIikpO1xuICAgIHZhciBncmFkcmcgPSAvXihbbHJdKSg/OlxcKChbXildKilcXCkpPyguKikkL2k7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdyYWQucGFyc2VcIiwgZnVuY3Rpb24gcGFyc2VHcmFkKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBTdHIoc3RyaW5nKTtcbiAgICAgICAgdmFyIHRva2VucyA9IHN0cmluZy5tYXRjaChncmFkcmcpO1xuICAgICAgICBpZiAoIXRva2Vucykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHR5cGUgPSB0b2tlbnNbMV0sXG4gICAgICAgICAgICBwYXJhbXMgPSB0b2tlbnNbMl0sXG4gICAgICAgICAgICBzdG9wcyA9IHRva2Vuc1szXTtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNwbGl0KC9cXHMqLFxccyovKS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gK2VsID09IGVsID8gK2VsIDogZWw7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAxICYmIHBhcmFtc1swXSA9PSAwKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wcyA9IHN0b3BzLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgc3RvcHMgPSBzdG9wcy5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICBlbCA9IGVsLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciBvdXQgPSB7XG4gICAgICAgICAgICAgICAgY29sb3I6IGVsWzBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGVsWzFdKSB7XG4gICAgICAgICAgICAgICAgb3V0Lm9mZnNldCA9IHBhcnNlRmxvYXQoZWxbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBsZW4gPSBzdG9wcy5sZW5ndGgsXG4gICAgICAgICAgICBzdGFydCA9IDAsXG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgZnVuY3Rpb24gc2VlZChpLCBlbmQpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gKGVuZCAtIHN0YXJ0KSAvIChpIC0gaik7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gajsgayA8IGk7IGsrKykge1xuICAgICAgICAgICAgICAgIHN0b3BzW2tdLm9mZnNldCA9ICsoK3N0YXJ0ICsgc3RlcCAqIChrIC0gaikpLnRvRml4ZWQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqID0gaTtcbiAgICAgICAgICAgIHN0YXJ0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGxlbi0tO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBpZiAoXCJvZmZzZXRcIiBpbiBzdG9wc1tpXSkge1xuICAgICAgICAgICAgc2VlZChpLCBzdG9wc1tpXS5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3BzW2xlbl0ub2Zmc2V0ID0gc3RvcHNbbGVuXS5vZmZzZXQgfHwgMTAwO1xuICAgICAgICBzZWVkKGxlbiwgc3RvcHNbbGVuXS5vZmZzZXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgc3RvcHM6IHN0b3BzXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5kXCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICBpZiAoaXModmFsdWUsIFwiYXJyYXlcIikgJiYgaXModmFsdWVbMF0sIFwiYXJyYXlcIikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gU25hcC5wYXRoLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gU3RyKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbHVlLm1hdGNoKC9bcnVvXS9pKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBTbmFwLnBhdGgudG9BYnNvbHV0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm5vZGUsIHtkOiB2YWx1ZX0pO1xuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci4jdGV4dFwiLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgdmFsdWUgPSBTdHIodmFsdWUpO1xuICAgICAgICB2YXIgdHh0ID0gZ2xvYi5kb2MuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgICAgICB3aGlsZSAodGhpcy5ub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHR4dCk7XG4gICAgfSkoLTEpO1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5hdHRyLnBhdGhcIiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHRoaXMuYXR0cih7ZDogdmFsdWV9KTtcbiAgICB9KSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuY2xhc3NcIiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHRoaXMubm9kZS5jbGFzc05hbWUuYmFzZVZhbCA9IHZhbHVlO1xuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci52aWV3Qm94XCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgdmI7XG4gICAgICAgIGlmIChpcyh2YWx1ZSwgXCJvYmplY3RcIikgJiYgXCJ4XCIgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHZiID0gW3ZhbHVlLngsIHZhbHVlLnksIHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHRdLmpvaW4oXCIgXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzKHZhbHVlLCBcImFycmF5XCIpKSB7XG4gICAgICAgICAgICB2YiA9IHZhbHVlLmpvaW4oXCIgXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmIgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMubm9kZSwge1xuICAgICAgICAgICAgdmlld0JveDogdmJcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgfSkoLTEpO1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5hdHRyLnRyYW5zZm9ybVwiLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odmFsdWUpO1xuICAgICAgICBldmUuc3RvcCgpO1xuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5yXCIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09IFwicmVjdFwiKSB7XG4gICAgICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICAgICAgJCh0aGlzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICByeDogdmFsdWUsXG4gICAgICAgICAgICAgICAgcnk6IHZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci50ZXh0cGF0aFwiLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInRleHRcIikge1xuICAgICAgICAgICAgdmFyIGlkLCB0cCwgbm9kZTtcbiAgICAgICAgICAgIGlmICghdmFsdWUgJiYgdGhpcy50ZXh0UGF0aCkge1xuICAgICAgICAgICAgICAgIHRwID0gdGhpcy50ZXh0UGF0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHAubm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5hcHBlbmRDaGlsZCh0cC5ub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50ZXh0UGF0aDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXModmFsdWUsIFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlZnMgPSBnZXRTb21lRGVmcyh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHdyYXAoZGVmcy5wYXJlbnROb2RlKS5wYXRoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWZzLmFwcGVuZENoaWxkKHBhdGgubm9kZSk7XG4gICAgICAgICAgICAgICAgaWQgPSBwYXRoLmlkO1xuICAgICAgICAgICAgICAgIHBhdGguYXR0cih7aWQ6IGlkfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gd3JhcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZCA9IHZhbHVlLmF0dHIoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB2YWx1ZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmF0dHIoe2lkOiBpZH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgdHAgPSB0aGlzLnRleHRQYXRoO1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKHRwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRwLmF0dHIoe1wieGxpbms6aHJlZlwiOiBcIiNcIiArIGlkfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHAgPSAkKFwidGV4dFBhdGhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ4bGluazpocmVmXCI6IFwiI1wiICsgaWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRwLmFwcGVuZENoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0cCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dFBhdGggPSB3cmFwKHRwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIudGV4dFwiLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInRleHRcIikge1xuICAgICAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLm5vZGUsXG4gICAgICAgICAgICAgICAgdHVuZXIgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG91dCA9ICQoXCJ0c3BhblwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzKGNodW5rLCBcImFycmF5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZENoaWxkKHR1bmVyKGNodW5rW2ldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kQ2hpbGQoZ2xvYi5kb2MuY3JlYXRlVGV4dE5vZGUoY2h1bmspKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXQubm9ybWFsaXplICYmIG91dC5ub3JtYWxpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0dW5lZCA9IHR1bmVyKHZhbHVlKTtcbiAgICAgICAgICAgIHdoaWxlICh0dW5lZC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0dW5lZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBldmUuc3RvcCgpO1xuICAgIH0pKC0xKTtcbiAgICBmdW5jdGlvbiBzZXRGb250U2l6ZSh2YWx1ZSkge1xuICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICBpZiAodmFsdWUgPT0gK3ZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBcInB4XCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlLnN0eWxlLmZvbnRTaXplID0gdmFsdWU7XG4gICAgfVxuICAgIGV2ZS5vbihcInNuYXAudXRpbC5hdHRyLmZvbnRTaXplXCIsIHNldEZvbnRTaXplKSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIuZm9udC1zaXplXCIsIHNldEZvbnRTaXplKSgtMSk7XG5cblxuICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLnRyYW5zZm9ybVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybSgpO1xuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuZ2V0YXR0ci50ZXh0cGF0aFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRQYXRoO1xuICAgIH0pKC0xKTtcbiAgICAvLyBNYXJrZXJzXG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gZ2V0dGVyKGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGdsb2IuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFya2VyLVwiICsgZW5kKTtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTbmFwKGdsb2IuZG9jLmdldEVsZW1lbnRCeUlkKHN0eWxlLm1hdGNoKHJlVVJMVmFsdWUpWzFdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXR0ZXIoZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IFwibWFya2VyXCIgKyBlbmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBlbmQuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiIHx8ICF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUuc3R5bGVbbmFtZV0gPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBcIm1hcmtlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHZhbHVlLm5vZGUuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodmFsdWUubm9kZSwge2lkOiB2YWx1ZS5pZH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5zdHlsZVtuYW1lXSA9IFVSTChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlci1lbmRcIiwgZ2V0dGVyKFwiZW5kXCIpKSgtMSk7XG4gICAgICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlckVuZFwiLCBnZXR0ZXIoXCJlbmRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIubWFya2VyLXN0YXJ0XCIsIGdldHRlcihcInN0YXJ0XCIpKSgtMSk7XG4gICAgICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlclN0YXJ0XCIsIGdldHRlcihcInN0YXJ0XCIpKSgtMSk7XG4gICAgICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlci1taWRcIiwgZ2V0dGVyKFwibWlkXCIpKSgtMSk7XG4gICAgICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLm1hcmtlck1pZFwiLCBnZXR0ZXIoXCJtaWRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIubWFya2VyLWVuZFwiLCBzZXR0ZXIoXCJlbmRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIubWFya2VyRW5kXCIsIHNldHRlcihcImVuZFwiKSkoLTEpO1xuICAgICAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5tYXJrZXItc3RhcnRcIiwgc2V0dGVyKFwic3RhcnRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIubWFya2VyU3RhcnRcIiwgc2V0dGVyKFwic3RhcnRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIubWFya2VyLW1pZFwiLCBzZXR0ZXIoXCJtaWRcIikpKC0xKTtcbiAgICAgICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHIubWFya2VyTWlkXCIsIHNldHRlcihcIm1pZFwiKSkoLTEpO1xuICAgIH0oKSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIuclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJyZWN0XCIgJiYgJCh0aGlzLm5vZGUsIFwicnhcIikgPT0gJCh0aGlzLm5vZGUsIFwicnlcIikpIHtcbiAgICAgICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzLm5vZGUsIFwicnhcIik7XG4gICAgICAgIH1cbiAgICB9KSgtMSk7XG4gICAgZnVuY3Rpb24gdGV4dEV4dHJhY3Qobm9kZSkge1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaSA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgb3V0LnB1c2goY2hpLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hpLnRhZ05hbWUgPT0gXCJ0c3BhblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIGNoaS5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goY2hpLmZpcnN0Q2hpbGQubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaCh0ZXh0RXh0cmFjdChjaGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIudGV4dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJ0ZXh0XCIgfHwgdGhpcy50eXBlID09IFwidHNwYW5cIikge1xuICAgICAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgICAgIHZhciBvdXQgPSB0ZXh0RXh0cmFjdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5sZW5ndGggPT0gMSA/IG91dFswXSA6IG91dDtcbiAgICAgICAgfVxuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuZ2V0YXR0ci4jdGV4dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUudGV4dENvbnRlbnQ7XG4gICAgfSkoLTEpO1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLmZpbGxcIiwgZnVuY3Rpb24gKGludGVybmFsKSB7XG4gICAgICAgIGlmIChpbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGV2ZShcInNuYXAudXRpbC5nZXRhdHRyLmZpbGxcIiwgdGhpcywgdHJ1ZSkuZmlyc3REZWZpbmVkKCk7XG4gICAgICAgIHJldHVybiBTbmFwKFNuYXAuZGV1cmwodmFsdWUpKSB8fCB2YWx1ZTtcbiAgICB9KSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIuc3Ryb2tlXCIsIGZ1bmN0aW9uIChpbnRlcm5hbCkge1xuICAgICAgICBpZiAoaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBldmUoXCJzbmFwLnV0aWwuZ2V0YXR0ci5zdHJva2VcIiwgdGhpcywgdHJ1ZSkuZmlyc3REZWZpbmVkKCk7XG4gICAgICAgIHJldHVybiBTbmFwKFNuYXAuZGV1cmwodmFsdWUpKSB8fCB2YWx1ZTtcbiAgICB9KSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIudmlld0JveFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHZhciB2YiA9ICQodGhpcy5ub2RlLCBcInZpZXdCb3hcIik7XG4gICAgICAgIGlmICh2Yikge1xuICAgICAgICAgICAgdmIgPSB2Yi5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIFNuYXAuXy5ib3goK3ZiWzBdLCArdmJbMV0sICt2YlsyXSwgK3ZiWzNdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0pKC0xKTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuZ2V0YXR0ci5wb2ludHNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcCA9ICQodGhpcy5ub2RlLCBcInBvaW50c1wiKTtcbiAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHJldHVybiBwLnNwbGl0KHNlcGFyYXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9KSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIucGF0aFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwID0gJCh0aGlzLm5vZGUsIFwiZFwiKTtcbiAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfSkoLTEpO1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLmNsYXNzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5jbGFzc05hbWUuYmFzZVZhbDtcbiAgICB9KSgtMSk7XG4gICAgZnVuY3Rpb24gZ2V0Rm9udFNpemUoKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuc3R5bGUuZm9udFNpemU7XG4gICAgfVxuICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLmZvbnRTaXplXCIsIGdldEZvbnRTaXplKSgtMSk7XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmdldGF0dHIuZm9udC1zaXplXCIsIGdldEZvbnRTaXplKSgtMSk7XG59KTtcblxuLy8gQ29weXJpZ2h0IChjKSAyMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuU25hcC5wbHVnaW4oZnVuY3Rpb24gKFNuYXAsIEVsZW1lbnQsIFBhcGVyLCBnbG9iLCBGcmFnbWVudCkge1xuICAgIHZhciByZ05vdFNwYWNlID0gL1xcUysvZyxcbiAgICAgICAgcmdCYWRTcGFjZSA9IC9bXFx0XFxyXFxuXFxmXS9nLFxuICAgICAgICByZ1RyaW0gPSAvKF5cXHMrfFxccyskKS9nLFxuICAgICAgICBTdHIgPSBTdHJpbmcsXG4gICAgICAgIGVscHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5hZGRDbGFzc1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQWRkcyBnaXZlbiBjbGFzcyBuYW1lIG9yIGxpc3Qgb2YgY2xhc3MgbmFtZXMgdG8gdGhlIGVsZW1lbnQuXG4gICAgIC0gdmFsdWUgKHN0cmluZykgY2xhc3MgbmFtZSBvciBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lc1xuICAgICAqKlxuICAgICA9IChFbGVtZW50KSBvcmlnaW5hbCBlbGVtZW50LlxuICAgIFxcKi9cbiAgICBlbHByb3RvLmFkZENsYXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBjbGFzc2VzID0gU3RyKHZhbHVlIHx8IFwiXCIpLm1hdGNoKHJnTm90U3BhY2UpIHx8IFtdLFxuICAgICAgICAgICAgZWxlbSA9IHRoaXMubm9kZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IGVsZW0uY2xhc3NOYW1lLmJhc2VWYWwsXG4gICAgICAgICAgICBjdXJDbGFzc2VzID0gY2xhc3NOYW1lLm1hdGNoKHJnTm90U3BhY2UpIHx8IFtdLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgZmluYWxWYWx1ZTtcblxuICAgICAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSB7XG4gICAgICAgICAgICAgICAgcG9zID0gY3VyQ2xhc3Nlcy5pbmRleE9mKGNsYXp6KTtcbiAgICAgICAgICAgICAgICBpZiAoIX5wb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyQ2xhc3Nlcy5wdXNoKGNsYXp6KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBjdXJDbGFzc2VzLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZWxlbS5jbGFzc05hbWUuYmFzZVZhbCA9IGZpbmFsVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5yZW1vdmVDbGFzc1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyBnaXZlbiBjbGFzcyBuYW1lIG9yIGxpc3Qgb2YgY2xhc3MgbmFtZXMgZnJvbSB0aGUgZWxlbWVudC5cbiAgICAgLSB2YWx1ZSAoc3RyaW5nKSBjbGFzcyBuYW1lIG9yIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG5hbWVzXG4gICAgICoqXG4gICAgID0gKEVsZW1lbnQpIG9yaWdpbmFsIGVsZW1lbnQuXG4gICAgXFwqL1xuICAgIGVscHJvdG8ucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGNsYXNzZXMgPSBTdHIodmFsdWUgfHwgXCJcIikubWF0Y2gocmdOb3RTcGFjZSkgfHwgW10sXG4gICAgICAgICAgICBlbGVtID0gdGhpcy5ub2RlLFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gZWxlbS5jbGFzc05hbWUuYmFzZVZhbCxcbiAgICAgICAgICAgIGN1ckNsYXNzZXMgPSBjbGFzc05hbWUubWF0Y2gocmdOb3RTcGFjZSkgfHwgW10sXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgY2xhenosXG4gICAgICAgICAgICBmaW5hbFZhbHVlO1xuICAgICAgICBpZiAoY3VyQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSB7XG4gICAgICAgICAgICAgICAgcG9zID0gY3VyQ2xhc3Nlcy5pbmRleE9mKGNsYXp6KTtcbiAgICAgICAgICAgICAgICBpZiAofnBvcykge1xuICAgICAgICAgICAgICAgICAgICBjdXJDbGFzc2VzLnNwbGljZShwb3MsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmluYWxWYWx1ZSA9IGN1ckNsYXNzZXMuam9pbihcIiBcIik7XG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IGZpbmFsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBlbGVtLmNsYXNzTmFtZS5iYXNlVmFsID0gZmluYWxWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50Lmhhc0NsYXNzXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaGFzIGEgZ2l2ZW4gY2xhc3MgbmFtZSBpbiB0aGUgbGlzdCBvZiBjbGFzcyBuYW1lcyBhcHBsaWVkIHRvIGl0LlxuICAgICAtIHZhbHVlIChzdHJpbmcpIGNsYXNzIG5hbWVcbiAgICAgKipcbiAgICAgPSAoYm9vbGVhbikgYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyBnaXZlbiBjbGFzc1xuICAgIFxcKi9cbiAgICBlbHByb3RvLmhhc0NsYXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBlbGVtID0gdGhpcy5ub2RlLFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gZWxlbS5jbGFzc05hbWUuYmFzZVZhbCxcbiAgICAgICAgICAgIGN1ckNsYXNzZXMgPSBjbGFzc05hbWUubWF0Y2gocmdOb3RTcGFjZSkgfHwgW107XG4gICAgICAgIHJldHVybiAhIX5jdXJDbGFzc2VzLmluZGV4T2YodmFsdWUpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudG9nZ2xlQ2xhc3NcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFkZCBvciByZW1vdmUgb25lIG9yIG1vcmUgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50LCBkZXBlbmRpbmcgb24gZWl0aGVyXG4gICAgICogdGhlIGNsYXNz4oCZcyBwcmVzZW5jZSBvciB0aGUgdmFsdWUgb2YgdGhlIGBmbGFnYCBhcmd1bWVudC5cbiAgICAgLSB2YWx1ZSAoc3RyaW5nKSBjbGFzcyBuYW1lIG9yIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG5hbWVzXG4gICAgIC0gZmxhZyAoYm9vbGVhbikgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNsYXNzIHNob3VsZCBiZSBhZGRlZCBvciByZW1vdmVkXG4gICAgICoqXG4gICAgID0gKEVsZW1lbnQpIG9yaWdpbmFsIGVsZW1lbnQuXG4gICAgXFwqL1xuICAgIGVscHJvdG8udG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWcpIHtcbiAgICAgICAgaWYgKGZsYWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRDbGFzcyh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUNsYXNzKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY2xhc3NlcyA9ICh2YWx1ZSB8fCBcIlwiKS5tYXRjaChyZ05vdFNwYWNlKSB8fCBbXSxcbiAgICAgICAgICAgIGVsZW0gPSB0aGlzLm5vZGUsXG4gICAgICAgICAgICBjbGFzc05hbWUgPSBlbGVtLmNsYXNzTmFtZS5iYXNlVmFsLFxuICAgICAgICAgICAgY3VyQ2xhc3NlcyA9IGNsYXNzTmFtZS5tYXRjaChyZ05vdFNwYWNlKSB8fCBbXSxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBwb3MsXG4gICAgICAgICAgICBjbGF6eixcbiAgICAgICAgICAgIGZpbmFsVmFsdWU7XG4gICAgICAgIGogPSAwO1xuICAgICAgICB3aGlsZSAoY2xhenogPSBjbGFzc2VzW2orK10pIHtcbiAgICAgICAgICAgIHBvcyA9IGN1ckNsYXNzZXMuaW5kZXhPZihjbGF6eik7XG4gICAgICAgICAgICBpZiAofnBvcykge1xuICAgICAgICAgICAgICAgIGN1ckNsYXNzZXMuc3BsaWNlKHBvcywgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1ckNsYXNzZXMucHVzaChjbGF6eik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbFZhbHVlID0gY3VyQ2xhc3Nlcy5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgICBlbGVtLmNsYXNzTmFtZS5iYXNlVmFsID0gZmluYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufSk7XG5cbi8vIENvcHlyaWdodCAoYykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblNuYXAucGx1Z2luKGZ1bmN0aW9uIChTbmFwLCBFbGVtZW50LCBQYXBlciwgZ2xvYiwgRnJhZ21lbnQpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCIrXCI6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCItXCI6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4IC0geTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIvXCI6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4IC8geTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIqXCI6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICogeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFN0ciA9IFN0cmluZyxcbiAgICAgICAgcmVVbml0ID0gL1thLXpdKyQvaSxcbiAgICAgICAgcmVBZGRvbiA9IC9eXFxzKihbK1xcLVxcLypdKVxccyo9XFxzKihbXFxkLmVFK1xcLV0rKVxccyooW15cXGRcXHNdKyk/XFxzKiQvO1xuICAgIGZ1bmN0aW9uIGdldE51bWJlcih2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VW5pdCh1bml0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gK3ZhbC50b0ZpeGVkKDMpICsgdW5pdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZXZlLm9uKFwic25hcC51dGlsLmF0dHJcIiwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YXIgcGx1cyA9IFN0cih2YWwpLm1hdGNoKHJlQWRkb24pO1xuICAgICAgICBpZiAocGx1cykge1xuICAgICAgICAgICAgdmFyIGV2bnQgPSBldmUubnQoKSxcbiAgICAgICAgICAgICAgICBuYW1lID0gZXZudC5zdWJzdHJpbmcoZXZudC5sYXN0SW5kZXhPZihcIi5cIikgKyAxKSxcbiAgICAgICAgICAgICAgICBhID0gdGhpcy5hdHRyKG5hbWUpLFxuICAgICAgICAgICAgICAgIGF0ciA9IHt9O1xuICAgICAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgICAgIHZhciB1bml0ID0gcGx1c1szXSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIGFVbml0ID0gYS5tYXRjaChyZVVuaXQpLFxuICAgICAgICAgICAgICAgIG9wID0gb3BlcmF0b3JzW3BsdXNbMV1dO1xuICAgICAgICAgICAgaWYgKGFVbml0ICYmIGFVbml0ID09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvcChwYXJzZUZsb2F0KGEpLCArcGx1c1syXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEgPSB0aGlzLmFzUFgobmFtZSk7XG4gICAgICAgICAgICAgICAgdmFsID0gb3AodGhpcy5hc1BYKG5hbWUpLCB0aGlzLmFzUFgobmFtZSwgcGx1c1syXSArIHVuaXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05hTihhKSB8fCBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXRyW25hbWVdID0gdmFsO1xuICAgICAgICAgICAgdGhpcy5hdHRyKGF0cik7XG4gICAgICAgIH1cbiAgICB9KSgtMTApO1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5lcXVhbFwiLCBmdW5jdGlvbiAobmFtZSwgYikge1xuICAgICAgICB2YXIgQSwgQiwgYSA9IFN0cih0aGlzLmF0dHIobmFtZSkgfHwgXCJcIiksXG4gICAgICAgICAgICBlbCA9IHRoaXMsXG4gICAgICAgICAgICBicGx1cyA9IFN0cihiKS5tYXRjaChyZUFkZG9uKTtcbiAgICAgICAgaWYgKGJwbHVzKSB7XG4gICAgICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICAgICAgdmFyIHVuaXQgPSBicGx1c1szXSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIGFVbml0ID0gYS5tYXRjaChyZVVuaXQpLFxuICAgICAgICAgICAgICAgIG9wID0gb3BlcmF0b3JzW2JwbHVzWzFdXTtcbiAgICAgICAgICAgIGlmIChhVW5pdCAmJiBhVW5pdCA9PSB1bml0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogcGFyc2VGbG9hdChhKSxcbiAgICAgICAgICAgICAgICAgICAgdG86IG9wKHBhcnNlRmxvYXQoYSksICticGx1c1syXSksXG4gICAgICAgICAgICAgICAgICAgIGY6IGdldFVuaXQoYVVuaXQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYSA9IHRoaXMuYXNQWChuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBhLFxuICAgICAgICAgICAgICAgICAgICB0bzogb3AoYSwgdGhpcy5hc1BYKG5hbWUsIGJwbHVzWzJdICsgdW5pdCkpLFxuICAgICAgICAgICAgICAgICAgICBmOiBnZXROdW1iZXJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkoLTEwKTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KSB7XG4gICAgdmFyIHByb3RvID0gUGFwZXIucHJvdG90eXBlLFxuICAgICAgICBpcyA9IFNuYXAuaXM7XG4gICAgLypcXFxuICAgICAqIFBhcGVyLnJlY3RcbiAgICAgWyBtZXRob2QgXVxuICAgICAqXG4gICAgICogRHJhd3MgYSByZWN0YW5nbGVcbiAgICAgKipcbiAgICAgLSB4IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyXG4gICAgIC0geSAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lclxuICAgICAtIHdpZHRoIChudW1iZXIpIHdpZHRoXG4gICAgIC0gaGVpZ2h0IChudW1iZXIpIGhlaWdodFxuICAgICAtIHJ4IChudW1iZXIpICNvcHRpb25hbCBob3Jpem9udGFsIHJhZGl1cyBmb3Igcm91bmRlZCBjb3JuZXJzLCBkZWZhdWx0IGlzIDBcbiAgICAgLSByeSAobnVtYmVyKSAjb3B0aW9uYWwgdmVydGljYWwgcmFkaXVzIGZvciByb3VuZGVkIGNvcm5lcnMsIGRlZmF1bHQgaXMgcnggb3IgMFxuICAgICA9IChvYmplY3QpIHRoZSBgcmVjdGAgZWxlbWVudFxuICAgICAqKlxuICAgICA+IFVzYWdlXG4gICAgIHwgLy8gcmVndWxhciByZWN0YW5nbGVcbiAgICAgfCB2YXIgYyA9IHBhcGVyLnJlY3QoMTAsIDEwLCA1MCwgNTApO1xuICAgICB8IC8vIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVyc1xuICAgICB8IHZhciBjID0gcGFwZXIucmVjdCg0MCwgNDAsIDUwLCA1MCwgMTApO1xuICAgIFxcKi9cbiAgICBwcm90by5yZWN0ID0gZnVuY3Rpb24gKHgsIHksIHcsIGgsIHJ4LCByeSkge1xuICAgICAgICB2YXIgYXR0cjtcbiAgICAgICAgaWYgKHJ5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJ5ID0gcng7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKHgsIFwib2JqZWN0XCIpICYmIHggPT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgICAgICAgYXR0ciA9IHg7XG4gICAgICAgIH0gZWxzZSBpZiAoeCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyID0ge1xuICAgICAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocnggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHIucnggPSByeDtcbiAgICAgICAgICAgICAgICBhdHRyLnJ5ID0gcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJyZWN0XCIsIGF0dHIpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFBhcGVyLmNpcmNsZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRHJhd3MgYSBjaXJjbGVcbiAgICAgKipcbiAgICAgLSB4IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudHJlXG4gICAgIC0geSAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRyZVxuICAgICAtIHIgKG51bWJlcikgcmFkaXVzXG4gICAgID0gKG9iamVjdCkgdGhlIGBjaXJjbGVgIGVsZW1lbnRcbiAgICAgKipcbiAgICAgPiBVc2FnZVxuICAgICB8IHZhciBjID0gcGFwZXIuY2lyY2xlKDUwLCA1MCwgNDApO1xuICAgIFxcKi9cbiAgICBwcm90by5jaXJjbGUgPSBmdW5jdGlvbiAoY3gsIGN5LCByKSB7XG4gICAgICAgIHZhciBhdHRyO1xuICAgICAgICBpZiAoaXMoY3gsIFwib2JqZWN0XCIpICYmIGN4ID09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgICAgICAgIGF0dHIgPSBjeDtcbiAgICAgICAgfSBlbHNlIGlmIChjeCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyID0ge1xuICAgICAgICAgICAgICAgIGN4OiBjeCxcbiAgICAgICAgICAgICAgICBjeTogY3ksXG4gICAgICAgICAgICAgICAgcjogclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbChcImNpcmNsZVwiLCBhdHRyKTtcbiAgICB9O1xuXG4gICAgdmFyIHByZWxvYWQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBvbmVycm9yKCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3JjLCBmKSB7XG4gICAgICAgICAgICB2YXIgaW1nID0gZ2xvYi5kb2MuY3JlYXRlRWxlbWVudChcImltZ1wiKSxcbiAgICAgICAgICAgICAgICBib2R5ID0gZ2xvYi5kb2MuYm9keTtcbiAgICAgICAgICAgIGltZy5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW1cIjtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZi5jYWxsKGltZyk7XG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGltZy5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKGltZyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBvbmVycm9yO1xuICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgICAgICAgaW1nLnNyYyA9IHNyYztcbiAgICAgICAgfTtcbiAgICB9KCkpO1xuXG4gICAgLypcXFxuICAgICAqIFBhcGVyLmltYWdlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBQbGFjZXMgYW4gaW1hZ2Ugb24gdGhlIHN1cmZhY2VcbiAgICAgKipcbiAgICAgLSBzcmMgKHN0cmluZykgVVJJIG9mIHRoZSBzb3VyY2UgaW1hZ2VcbiAgICAgLSB4IChudW1iZXIpIHggb2Zmc2V0IHBvc2l0aW9uXG4gICAgIC0geSAobnVtYmVyKSB5IG9mZnNldCBwb3NpdGlvblxuICAgICAtIHdpZHRoIChudW1iZXIpIHdpZHRoIG9mIHRoZSBpbWFnZVxuICAgICAtIGhlaWdodCAobnVtYmVyKSBoZWlnaHQgb2YgdGhlIGltYWdlXG4gICAgID0gKG9iamVjdCkgdGhlIGBpbWFnZWAgZWxlbWVudFxuICAgICAqIG9yXG4gICAgID0gKG9iamVjdCkgU25hcCBlbGVtZW50IG9iamVjdCB3aXRoIHR5cGUgYGltYWdlYFxuICAgICAqKlxuICAgICA+IFVzYWdlXG4gICAgIHwgdmFyIGMgPSBwYXBlci5pbWFnZShcImFwcGxlLnBuZ1wiLCAxMCwgMTAsIDgwLCA4MCk7XG4gICAgXFwqL1xuICAgIHByb3RvLmltYWdlID0gZnVuY3Rpb24gKHNyYywgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsKFwiaW1hZ2VcIik7XG4gICAgICAgIGlmIChpcyhzcmMsIFwib2JqZWN0XCIpICYmIFwic3JjXCIgaW4gc3JjKSB7XG4gICAgICAgICAgICBlbC5hdHRyKHNyYyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBzZXQgPSB7XG4gICAgICAgICAgICAgICAgXCJ4bGluazpocmVmXCI6IHNyYyxcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiBcIm5vbmVcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh4ICE9IG51bGwgJiYgeSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0LnggPSB4O1xuICAgICAgICAgICAgICAgIHNldC55ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3aWR0aCAhPSBudWxsICYmIGhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0LndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgc2V0LmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlbG9hZChzcmMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgU25hcC5fLiQoZWwubm9kZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMub2Zmc2V0SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU25hcC5fLiQoZWwubm9kZSwgc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogUGFwZXIuZWxsaXBzZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRHJhd3MgYW4gZWxsaXBzZVxuICAgICAqKlxuICAgICAtIHggKG51bWJlcikgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50cmVcbiAgICAgLSB5IChudW1iZXIpIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudHJlXG4gICAgIC0gcnggKG51bWJlcikgaG9yaXpvbnRhbCByYWRpdXNcbiAgICAgLSByeSAobnVtYmVyKSB2ZXJ0aWNhbCByYWRpdXNcbiAgICAgPSAob2JqZWN0KSB0aGUgYGVsbGlwc2VgIGVsZW1lbnRcbiAgICAgKipcbiAgICAgPiBVc2FnZVxuICAgICB8IHZhciBjID0gcGFwZXIuZWxsaXBzZSg1MCwgNTAsIDQwLCAyMCk7XG4gICAgXFwqL1xuICAgIHByb3RvLmVsbGlwc2UgPSBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnkpIHtcbiAgICAgICAgdmFyIGF0dHI7XG4gICAgICAgIGlmIChpcyhjeCwgXCJvYmplY3RcIikgJiYgY3ggPT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgICAgICAgYXR0ciA9IGN4O1xuICAgICAgICB9IGVsc2UgaWYgKGN4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHIgPXtcbiAgICAgICAgICAgICAgICBjeDogY3gsXG4gICAgICAgICAgICAgICAgY3k6IGN5LFxuICAgICAgICAgICAgICAgIHJ4OiByeCxcbiAgICAgICAgICAgICAgICByeTogcnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJlbGxpcHNlXCIsIGF0dHIpO1xuICAgIH07XG4gICAgLy8gU0lFUlJBIFBhcGVyLnBhdGgoKTogVW5jbGVhciBmcm9tIHRoZSBsaW5rIHdoYXQgYSBDYXRtdWxsLVJvbSBjdXJ2ZXRvIGlzLCBhbmQgd2h5IGl0IHdvdWxkIG1ha2UgbGlmZSBhbnkgZWFzaWVyLlxuICAgIC8qXFxcbiAgICAgKiBQYXBlci5wYXRoXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGEgYDxwYXRoPmAgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIHRoZSBwYXRoJ3MgZGVmaW5pdGlvblxuICAgICAtIHBhdGhTdHJpbmcgKHN0cmluZykgI29wdGlvbmFsIHBhdGggc3RyaW5nIGluIFNWRyBmb3JtYXRcbiAgICAgKiBQYXRoIHN0cmluZyBjb25zaXN0cyBvZiBvbmUtbGV0dGVyIGNvbW1hbmRzLCBmb2xsb3dlZCBieSBjb21tYSBzZXByYXJhdGVkIGFyZ3VtZW50cyBpbiBudW1lcmljYWwgZm9ybS4gRXhhbXBsZTpcbiAgICAgfCBcIk0xMCwyMEwzMCw0MFwiXG4gICAgICogVGhpcyBleGFtcGxlIGZlYXR1cmVzIHR3byBjb21tYW5kczogYE1gLCB3aXRoIGFyZ3VtZW50cyBgKDEwLCAyMClgIGFuZCBgTGAgd2l0aCBhcmd1bWVudHMgYCgzMCwgNDApYC4gVXBwZXJjYXNlIGxldHRlciBjb21tYW5kcyBleHByZXNzIGNvb3JkaW5hdGVzIGluIGFic29sdXRlIHRlcm1zLCB3aGlsZSBsb3dlcmNhc2UgY29tbWFuZHMgZXhwcmVzcyB0aGVtIGluIHJlbGF0aXZlIHRlcm1zIGZyb20gdGhlIG1vc3QgcmVjZW50bHkgZGVjbGFyZWQgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgIyA8cD5IZXJlIGlzIHNob3J0IGxpc3Qgb2YgY29tbWFuZHMgYXZhaWxhYmxlLCBmb3IgbW9yZSBkZXRhaWxzIHNlZSA8YSBocmVmPVwiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3BhdGhzLmh0bWwjUGF0aERhdGFcIiB0aXRsZT1cIkRldGFpbHMgb2YgYSBwYXRoJ3MgZGF0YSBhdHRyaWJ1dGUncyBmb3JtYXQgYXJlIGRlc2NyaWJlZCBpbiB0aGUgU1ZHIHNwZWNpZmljYXRpb24uXCI+U1ZHIHBhdGggc3RyaW5nIGZvcm1hdDwvYT4gb3IgPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NWRy9UdXRvcmlhbC9QYXRoc1wiPmFydGljbGUgYWJvdXQgcGF0aCBzdHJpbmdzIGF0IE1ETjwvYT4uPC9wPlxuICAgICAjIDx0YWJsZT48dGhlYWQ+PHRyPjx0aD5Db21tYW5kPC90aD48dGg+TmFtZTwvdGg+PHRoPlBhcmFtZXRlcnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+XG4gICAgICMgPHRyPjx0ZD5NPC90ZD48dGQ+bW92ZXRvPC90ZD48dGQ+KHggeSkrPC90ZD48L3RyPlxuICAgICAjIDx0cj48dGQ+WjwvdGQ+PHRkPmNsb3NlcGF0aDwvdGQ+PHRkPihub25lKTwvdGQ+PC90cj5cbiAgICAgIyA8dHI+PHRkPkw8L3RkPjx0ZD5saW5ldG88L3RkPjx0ZD4oeCB5KSs8L3RkPjwvdHI+XG4gICAgICMgPHRyPjx0ZD5IPC90ZD48dGQ+aG9yaXpvbnRhbCBsaW5ldG88L3RkPjx0ZD54KzwvdGQ+PC90cj5cbiAgICAgIyA8dHI+PHRkPlY8L3RkPjx0ZD52ZXJ0aWNhbCBsaW5ldG88L3RkPjx0ZD55KzwvdGQ+PC90cj5cbiAgICAgIyA8dHI+PHRkPkM8L3RkPjx0ZD5jdXJ2ZXRvPC90ZD48dGQ+KHgxIHkxIHgyIHkyIHggeSkrPC90ZD48L3RyPlxuICAgICAjIDx0cj48dGQ+UzwvdGQ+PHRkPnNtb290aCBjdXJ2ZXRvPC90ZD48dGQ+KHgyIHkyIHggeSkrPC90ZD48L3RyPlxuICAgICAjIDx0cj48dGQ+UTwvdGQ+PHRkPnF1YWRyYXRpYyBCw6l6aWVyIGN1cnZldG88L3RkPjx0ZD4oeDEgeTEgeCB5KSs8L3RkPjwvdHI+XG4gICAgICMgPHRyPjx0ZD5UPC90ZD48dGQ+c21vb3RoIHF1YWRyYXRpYyBCw6l6aWVyIGN1cnZldG88L3RkPjx0ZD4oeCB5KSs8L3RkPjwvdHI+XG4gICAgICMgPHRyPjx0ZD5BPC90ZD48dGQ+ZWxsaXB0aWNhbCBhcmM8L3RkPjx0ZD4ocnggcnkgeC1heGlzLXJvdGF0aW9uIGxhcmdlLWFyYy1mbGFnIHN3ZWVwLWZsYWcgeCB5KSs8L3RkPjwvdHI+XG4gICAgICMgPHRyPjx0ZD5SPC90ZD48dGQ+PGEgaHJlZj1cImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2F0bXVsbOKAk1JvbV9zcGxpbmUjQ2F0bXVsbC5FMi44MC45M1JvbV9zcGxpbmVcIj5DYXRtdWxsLVJvbSBjdXJ2ZXRvPC9hPio8L3RkPjx0ZD54MSB5MSAoeCB5KSs8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPlxuICAgICAqICogX0NhdG11bGwtUm9tIGN1cnZldG9fIGlzIGEgbm90IHN0YW5kYXJkIFNWRyBjb21tYW5kIGFuZCBhZGRlZCB0byBtYWtlIGxpZmUgZWFzaWVyLlxuICAgICAqIE5vdGU6IHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoZW4gYSBwYXRoIGNvbnNpc3RzIG9mIG9ubHkgdGhyZWUgY29tbWFuZHM6IGBNMTAsMTBS4oCmemAuIEluIHRoaXMgY2FzZSB0aGUgcGF0aCBjb25uZWN0cyBiYWNrIHRvIGl0cyBzdGFydGluZyBwb2ludC5cbiAgICAgPiBVc2FnZVxuICAgICB8IHZhciBjID0gcGFwZXIucGF0aChcIk0xMCAxMEw5MCA5MFwiKTtcbiAgICAgfCAvLyBkcmF3IGEgZGlhZ29uYWwgbGluZTpcbiAgICAgfCAvLyBtb3ZlIHRvIDEwLDEwLCBsaW5lIHRvIDkwLDkwXG4gICAgXFwqL1xuICAgIHByb3RvLnBhdGggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICB2YXIgYXR0cjtcbiAgICAgICAgaWYgKGlzKGQsIFwib2JqZWN0XCIpICYmICFpcyhkLCBcImFycmF5XCIpKSB7XG4gICAgICAgICAgICBhdHRyID0gZDtcbiAgICAgICAgfSBlbHNlIGlmIChkKSB7XG4gICAgICAgICAgICBhdHRyID0ge2Q6IGR9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsKFwicGF0aFwiLCBhdHRyKTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci5nXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGEgZ3JvdXAgZWxlbWVudFxuICAgICAqKlxuICAgICAtIHZhcmFyZ3MgKOKApikgI29wdGlvbmFsIGVsZW1lbnRzIHRvIG5lc3Qgd2l0aGluIHRoZSBncm91cFxuICAgICA9IChvYmplY3QpIHRoZSBgZ2AgZWxlbWVudFxuICAgICAqKlxuICAgICA+IFVzYWdlXG4gICAgIHwgdmFyIGMxID0gcGFwZXIuY2lyY2xlKCksXG4gICAgIHwgICAgIGMyID0gcGFwZXIucmVjdCgpLFxuICAgICB8ICAgICBnID0gcGFwZXIuZyhjMiwgYzEpOyAvLyBub3RlIHRoYXQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGlzIGRpZmZlcmVudFxuICAgICAqIG9yXG4gICAgIHwgdmFyIGMxID0gcGFwZXIuY2lyY2xlKCksXG4gICAgIHwgICAgIGMyID0gcGFwZXIucmVjdCgpLFxuICAgICB8ICAgICBnID0gcGFwZXIuZygpO1xuICAgICB8IGcuYWRkKGMyLCBjMSk7XG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci5ncm91cFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogU2VlIEBQYXBlci5nXG4gICAgXFwqL1xuICAgIHByb3RvLmdyb3VwID0gcHJvdG8uZyA9IGZ1bmN0aW9uIChmaXJzdCkge1xuICAgICAgICB2YXIgYXR0cixcbiAgICAgICAgICAgIGVsID0gdGhpcy5lbChcImdcIik7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEgJiYgZmlyc3QgJiYgIWZpcnN0LnR5cGUpIHtcbiAgICAgICAgICAgIGVsLmF0dHIoZmlyc3QpO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsLmFkZChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogUGFwZXIuc3ZnXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIFNWRyBlbGVtZW50LlxuICAgICAtIHggKG51bWJlcikgQG9wdGlvbmFsIFggb2YgdGhlIGVsZW1lbnRcbiAgICAgLSB5IChudW1iZXIpIEBvcHRpb25hbCBZIG9mIHRoZSBlbGVtZW50XG4gICAgIC0gd2lkdGggKG51bWJlcikgQG9wdGlvbmFsIHdpZHRoIG9mIHRoZSBlbGVtZW50XG4gICAgIC0gaGVpZ2h0IChudW1iZXIpIEBvcHRpb25hbCBoZWlnaHQgb2YgdGhlIGVsZW1lbnRcbiAgICAgLSB2YnggKG51bWJlcikgQG9wdGlvbmFsIHZpZXdib3ggWFxuICAgICAtIHZieSAobnVtYmVyKSBAb3B0aW9uYWwgdmlld2JveCBZXG4gICAgIC0gdmJ3IChudW1iZXIpIEBvcHRpb25hbCB2aWV3Ym94IHdpZHRoXG4gICAgIC0gdmJoIChudW1iZXIpIEBvcHRpb25hbCB2aWV3Ym94IGhlaWdodFxuICAgICAqKlxuICAgICA9IChvYmplY3QpIHRoZSBgc3ZnYCBlbGVtZW50XG4gICAgICoqXG4gICAgXFwqL1xuICAgIHByb3RvLnN2ZyA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB2YngsIHZieSwgdmJ3LCB2YmgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0ge307XG4gICAgICAgIGlmIChpcyh4LCBcIm9iamVjdFwiKSAmJiB5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHJzID0geDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdHRycy54ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdHRycy55ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHJzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YnggIT0gbnVsbCAmJiB2YnkgIT0gbnVsbCAmJiB2YncgIT0gbnVsbCAmJiB2YmggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHJzLnZpZXdCb3ggPSBbdmJ4LCB2YnksIHZidywgdmJoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbChcInN2Z1wiLCBhdHRycyk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogUGFwZXIubWFza1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRXF1aXZhbGVudCBpbiBiZWhhdmlvdXIgdG8gQFBhcGVyLmcsIGV4Y2VwdCBpdOKAmXMgYSBtYXNrLlxuICAgICAqKlxuICAgICA9IChvYmplY3QpIHRoZSBgbWFza2AgZWxlbWVudFxuICAgICAqKlxuICAgIFxcKi9cbiAgICBwcm90by5tYXNrID0gZnVuY3Rpb24gKGZpcnN0KSB7XG4gICAgICAgIHZhciBhdHRyLFxuICAgICAgICAgICAgZWwgPSB0aGlzLmVsKFwibWFza1wiKTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiBmaXJzdCAmJiAhZmlyc3QudHlwZSkge1xuICAgICAgICAgICAgZWwuYXR0cihmaXJzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZWwuYWRkKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci5wdHJuXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBFcXVpdmFsZW50IGluIGJlaGF2aW91ciB0byBAUGFwZXIuZywgZXhjZXB0IGl04oCZcyBhIHBhdHRlcm4uXG4gICAgIC0geCAobnVtYmVyKSBAb3B0aW9uYWwgWCBvZiB0aGUgZWxlbWVudFxuICAgICAtIHkgKG51bWJlcikgQG9wdGlvbmFsIFkgb2YgdGhlIGVsZW1lbnRcbiAgICAgLSB3aWR0aCAobnVtYmVyKSBAb3B0aW9uYWwgd2lkdGggb2YgdGhlIGVsZW1lbnRcbiAgICAgLSBoZWlnaHQgKG51bWJlcikgQG9wdGlvbmFsIGhlaWdodCBvZiB0aGUgZWxlbWVudFxuICAgICAtIHZieCAobnVtYmVyKSBAb3B0aW9uYWwgdmlld2JveCBYXG4gICAgIC0gdmJ5IChudW1iZXIpIEBvcHRpb25hbCB2aWV3Ym94IFlcbiAgICAgLSB2YncgKG51bWJlcikgQG9wdGlvbmFsIHZpZXdib3ggd2lkdGhcbiAgICAgLSB2YmggKG51bWJlcikgQG9wdGlvbmFsIHZpZXdib3ggaGVpZ2h0XG4gICAgICoqXG4gICAgID0gKG9iamVjdCkgdGhlIGBwYXR0ZXJuYCBlbGVtZW50XG4gICAgICoqXG4gICAgXFwqL1xuICAgIHByb3RvLnB0cm4gPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgdngsIHZ5LCB2dywgdmgpIHtcbiAgICAgICAgaWYgKGlzKHgsIFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdHRyID0ge3BhdHRlcm5Vbml0czogXCJ1c2VyU3BhY2VPblVzZVwifTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgYXR0ci54ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgYXR0ci55ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXR0ci53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXR0ci5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodnggIT0gbnVsbCAmJiB2eSAhPSBudWxsICYmIHZ3ICE9IG51bGwgJiYgdmggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHIudmlld0JveCA9IFt2eCwgdnksIHZ3LCB2aF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHIudmlld0JveCA9IFt4IHx8IDAsIHkgfHwgMCwgd2lkdGggfHwgMCwgaGVpZ2h0IHx8IDBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsKFwicGF0dGVyblwiLCBhdHRyKTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci51c2VcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENyZWF0ZXMgYSA8dXNlPiBlbGVtZW50LlxuICAgICAtIGlkIChzdHJpbmcpIEBvcHRpb25hbCBpZCBvZiBlbGVtZW50IHRvIGxpbmtcbiAgICAgKiBvclxuICAgICAtIGlkIChFbGVtZW50KSBAb3B0aW9uYWwgZWxlbWVudCB0byBsaW5rXG4gICAgICoqXG4gICAgID0gKG9iamVjdCkgdGhlIGB1c2VgIGVsZW1lbnRcbiAgICAgKipcbiAgICBcXCovXG4gICAgcHJvdG8udXNlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZC5hdHRyKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWQuYXR0cih7aWQ6IFNuYXAuXy5pZChpZCl9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWQgPSBpZC5hdHRyKFwiaWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU3RyaW5nKGlkKS5jaGFyQXQoKSA9PSBcIiNcIikge1xuICAgICAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJ1c2VcIiwge1wieGxpbms6aHJlZlwiOiBcIiNcIiArIGlkfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudC5wcm90b3R5cGUudXNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci5zeW1ib2xcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIENyZWF0ZXMgYSA8c3ltYm9sPiBlbGVtZW50LlxuICAgICAtIHZieCAobnVtYmVyKSBAb3B0aW9uYWwgdmlld2JveCBYXG4gICAgIC0gdmJ5IChudW1iZXIpIEBvcHRpb25hbCB2aWV3Ym94IFlcbiAgICAgLSB2YncgKG51bWJlcikgQG9wdGlvbmFsIHZpZXdib3ggd2lkdGhcbiAgICAgLSB2YmggKG51bWJlcikgQG9wdGlvbmFsIHZpZXdib3ggaGVpZ2h0XG4gICAgID0gKG9iamVjdCkgdGhlIGBzeW1ib2xgIGVsZW1lbnRcbiAgICAgKipcbiAgICBcXCovXG4gICAgcHJvdG8uc3ltYm9sID0gZnVuY3Rpb24gKHZ4LCB2eSwgdncsIHZoKSB7XG4gICAgICAgIHZhciBhdHRyID0ge307XG4gICAgICAgIGlmICh2eCAhPSBudWxsICYmIHZ5ICE9IG51bGwgJiYgdncgIT0gbnVsbCAmJiB2aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyLnZpZXdCb3ggPSBbdngsIHZ5LCB2dywgdmhdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJzeW1ib2xcIiwgYXR0cik7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogUGFwZXIudGV4dFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogRHJhd3MgYSB0ZXh0IHN0cmluZ1xuICAgICAqKlxuICAgICAtIHggKG51bWJlcikgeCBjb29yZGluYXRlIHBvc2l0aW9uXG4gICAgIC0geSAobnVtYmVyKSB5IGNvb3JkaW5hdGUgcG9zaXRpb25cbiAgICAgLSB0ZXh0IChzdHJpbmd8YXJyYXkpIFRoZSB0ZXh0IHN0cmluZyB0byBkcmF3IG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gbmVzdCB3aXRoaW4gc2VwYXJhdGUgYDx0c3Bhbj5gIGVsZW1lbnRzXG4gICAgID0gKG9iamVjdCkgdGhlIGB0ZXh0YCBlbGVtZW50XG4gICAgICoqXG4gICAgID4gVXNhZ2VcbiAgICAgfCB2YXIgdDEgPSBwYXBlci50ZXh0KDUwLCA1MCwgXCJTbmFwXCIpO1xuICAgICB8IHZhciB0MiA9IHBhcGVyLnRleHQoNTAsIDUwLCBbXCJTXCIsXCJuXCIsXCJhXCIsXCJwXCJdKTtcbiAgICAgfCAvLyBUZXh0IHBhdGggdXNhZ2VcbiAgICAgfCB0MS5hdHRyKHt0ZXh0cGF0aDogXCJNMTAsMTBMMTAwLDEwMFwifSk7XG4gICAgIHwgLy8gb3JcbiAgICAgfCB2YXIgcHRoID0gcGFwZXIucGF0aChcIk0xMCwxMEwxMDAsMTAwXCIpO1xuICAgICB8IHQxLmF0dHIoe3RleHRwYXRoOiBwdGh9KTtcbiAgICBcXCovXG4gICAgcHJvdG8udGV4dCA9IGZ1bmN0aW9uICh4LCB5LCB0ZXh0KSB7XG4gICAgICAgIHZhciBhdHRyID0ge307XG4gICAgICAgIGlmIChpcyh4LCBcIm9iamVjdFwiKSkge1xuICAgICAgICAgICAgYXR0ciA9IHg7XG4gICAgICAgIH0gZWxzZSBpZiAoeCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyID0ge1xuICAgICAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0IHx8IFwiXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJ0ZXh0XCIsIGF0dHIpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFBhcGVyLmxpbmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIERyYXdzIGEgbGluZVxuICAgICAqKlxuICAgICAtIHgxIChudW1iZXIpIHggY29vcmRpbmF0ZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRcbiAgICAgLSB5MSAobnVtYmVyKSB5IGNvb3JkaW5hdGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0XG4gICAgIC0geDIgKG51bWJlcikgeCBjb29yZGluYXRlIHBvc2l0aW9uIG9mIHRoZSBlbmRcbiAgICAgLSB5MiAobnVtYmVyKSB5IGNvb3JkaW5hdGUgcG9zaXRpb24gb2YgdGhlIGVuZFxuICAgICA9IChvYmplY3QpIHRoZSBgbGluZWAgZWxlbWVudFxuICAgICAqKlxuICAgICA+IFVzYWdlXG4gICAgIHwgdmFyIHQxID0gcGFwZXIubGluZSg1MCwgNTAsIDEwMCwgMTAwKTtcbiAgICBcXCovXG4gICAgcHJvdG8ubGluZSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICAgICAgICB2YXIgYXR0ciA9IHt9O1xuICAgICAgICBpZiAoaXMoeDEsIFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICBhdHRyID0geDE7XG4gICAgICAgIH0gZWxzZSBpZiAoeDEgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0ciA9IHtcbiAgICAgICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICAgICAgeDI6IHgyLFxuICAgICAgICAgICAgICAgIHkxOiB5MSxcbiAgICAgICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJsaW5lXCIsIGF0dHIpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFBhcGVyLnBvbHlsaW5lXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBEcmF3cyBhIHBvbHlsaW5lXG4gICAgICoqXG4gICAgIC0gcG9pbnRzIChhcnJheSkgYXJyYXkgb2YgcG9pbnRzXG4gICAgICogb3JcbiAgICAgLSB2YXJhcmdzICjigKYpIHBvaW50c1xuICAgICA9IChvYmplY3QpIHRoZSBgcG9seWxpbmVgIGVsZW1lbnRcbiAgICAgKipcbiAgICAgPiBVc2FnZVxuICAgICB8IHZhciBwMSA9IHBhcGVyLnBvbHlsaW5lKFsxMCwgMTAsIDEwMCwgMTAwXSk7XG4gICAgIHwgdmFyIHAyID0gcGFwZXIucG9seWxpbmUoMTAsIDEwLCAxMDAsIDEwMCk7XG4gICAgXFwqL1xuICAgIHByb3RvLnBvbHlsaW5lID0gZnVuY3Rpb24gKHBvaW50cykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHBvaW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF0dHIgPSB7fTtcbiAgICAgICAgaWYgKGlzKHBvaW50cywgXCJvYmplY3RcIikgJiYgIWlzKHBvaW50cywgXCJhcnJheVwiKSkge1xuICAgICAgICAgICAgYXR0ciA9IHBvaW50cztcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0ciA9IHtwb2ludHM6IHBvaW50c307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwoXCJwb2x5bGluZVwiLCBhdHRyKTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBQYXBlci5wb2x5Z29uXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBEcmF3cyBhIHBvbHlnb24uIFNlZSBAUGFwZXIucG9seWxpbmVcbiAgICBcXCovXG4gICAgcHJvdG8ucG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRyID0ge307XG4gICAgICAgIGlmIChpcyhwb2ludHMsIFwib2JqZWN0XCIpICYmICFpcyhwb2ludHMsIFwiYXJyYXlcIikpIHtcbiAgICAgICAgICAgIGF0dHIgPSBwb2ludHM7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHIgPSB7cG9pbnRzOiBwb2ludHN9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsKFwicG9seWdvblwiLCBhdHRyKTtcbiAgICB9O1xuICAgIC8vIGdyYWRpZW50c1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkID0gU25hcC5fLiQ7XG4gICAgICAgIC8vIGdyYWRpZW50cycgaGVscGVyc1xuICAgICAgICAvKlxcXG4gICAgICAgICAqIEVsZW1lbnQuc3RvcHNcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIE9ubHkgZm9yIGdyYWRpZW50cyFcbiAgICAgICAgICogUmV0dXJucyBhcnJheSBvZiBncmFkaWVudCBzdG9wcyBlbGVtZW50cy5cbiAgICAgICAgID0gKGFycmF5KSB0aGUgc3RvcHMgYXJyYXkuXG4gICAgICAgIFxcKi9cbiAgICAgICAgZnVuY3Rpb24gR3N0b3BzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKFwic3RvcFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvKlxcXG4gICAgICAgICAqIEVsZW1lbnQuYWRkU3RvcFxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogT25seSBmb3IgZ3JhZGllbnRzIVxuICAgICAgICAgKiBBZGRzIGFub3RoZXIgc3RvcCB0byB0aGUgZ3JhZGllbnQuXG4gICAgICAgICAtIGNvbG9yIChzdHJpbmcpIHN0b3BzIGNvbG9yXG4gICAgICAgICAtIG9mZnNldCAobnVtYmVyKSBzdG9wcyBvZmZzZXQgMC4uMTAwXG4gICAgICAgICA9IChvYmplY3QpIGdyYWRpZW50IGVsZW1lbnRcbiAgICAgICAgXFwqL1xuICAgICAgICBmdW5jdGlvbiBHYWRkU3RvcChjb2xvciwgb2Zmc2V0KSB7XG4gICAgICAgICAgICB2YXIgc3RvcCA9ICQoXCJzdG9wXCIpLFxuICAgICAgICAgICAgICAgIGF0dHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogK29mZnNldCArIFwiJVwiXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbG9yID0gU25hcC5jb2xvcihjb2xvcik7XG4gICAgICAgICAgICBhdHRyW1wic3RvcC1jb2xvclwiXSA9IGNvbG9yLmhleDtcbiAgICAgICAgICAgIGlmIChjb2xvci5vcGFjaXR5IDwgMSkge1xuICAgICAgICAgICAgICAgIGF0dHJbXCJzdG9wLW9wYWNpdHlcIl0gPSBjb2xvci5vcGFjaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJChzdG9wLCBhdHRyKTtcbiAgICAgICAgICAgIHZhciBzdG9wcyA9IHRoaXMuc3RvcHMoKSxcbiAgICAgICAgICAgICAgICBpbnNlcnRlZDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcE9mZnNldCA9IHBhcnNlRmxvYXQoc3RvcHNbaV0uYXR0cihcIm9mZnNldFwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3BPZmZzZXQgPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLmluc2VydEJlZm9yZShzdG9wLCBzdG9wc1tpXS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWluc2VydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHN0b3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gR2dldEJCb3goKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwibGluZWFyR3JhZGllbnRcIikge1xuICAgICAgICAgICAgICAgIHZhciB4MSA9ICQodGhpcy5ub2RlLCBcIngxXCIpIHx8IDAsXG4gICAgICAgICAgICAgICAgICAgIHgyID0gJCh0aGlzLm5vZGUsIFwieDJcIikgfHwgMSxcbiAgICAgICAgICAgICAgICAgICAgeTEgPSAkKHRoaXMubm9kZSwgXCJ5MVwiKSB8fCAwLFxuICAgICAgICAgICAgICAgICAgICB5MiA9ICQodGhpcy5ub2RlLCBcInkyXCIpIHx8IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNuYXAuXy5ib3goeDEsIHkxLCBtYXRoLmFicyh4MiAtIHgxKSwgbWF0aC5hYnMoeTIgLSB5MSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY3ggPSB0aGlzLm5vZGUuY3ggfHwgLjUsXG4gICAgICAgICAgICAgICAgICAgIGN5ID0gdGhpcy5ub2RlLmN5IHx8IC41LFxuICAgICAgICAgICAgICAgICAgICByID0gdGhpcy5ub2RlLnIgfHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU25hcC5fLmJveChjeCAtIHIsIGN5IC0gciwgciAqIDIsIHIgKiAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKlxcXG4gICAgICAgICAqIEVsZW1lbnQuc2V0U3RvcHNcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIE9ubHkgZm9yIGdyYWRpZW50cyFcbiAgICAgICAgICogVXBkYXRlcyBzdG9wcyBvZiB0aGUgZ3JhZGllbnQgYmFzZWQgb24gcGFzc2VkIGdyYWRpZW50IGRlc2NyaXB0b3IuIFNlZSBAUHBhZXIuZ3JhZGllbnRcbiAgICAgICAgIC0gc3RyIChzdHJpbmcpIGdyYWRpZW50IGRlc2NyaXB0b3IgcGFydCBhZnRlciBgKClgLlxuICAgICAgICAgPSAob2JqZWN0KSBncmFkaWVudCBlbGVtZW50XG4gICAgICAgICB8IHZhciBnID0gcGFwZXIuZ3JhZGllbnQoXCJsKDAsIDAsIDEsIDEpIzAwMC0jZjAwLSNmZmZcIik7XG4gICAgICAgICB8IGcuc2V0U3RvcHMoXCIjZmZmLSMwMDAtI2YwMC0jZmMwXCIpO1xuICAgICAgICBcXCovXG4gICAgICAgIGZ1bmN0aW9uIEdzZXRTdG9wcyhzdHIpIHtcbiAgICAgICAgICAgIHZhciBncmFkID0gc3RyLFxuICAgICAgICAgICAgICAgIHN0b3BzID0gdGhpcy5zdG9wcygpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGdyYWQgPSBldmUoXCJzbmFwLnV0aWwuZ3JhZC5wYXJzZVwiLCBudWxsLCBcImwoMCwwLDAsMSlcIiArIHN0cikuZmlyc3REZWZpbmVkKCkuc3RvcHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIVNuYXAuaXMoZ3JhZCwgXCJhcnJheVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBTbmFwLmNvbG9yKGdyYWRbaV0uY29sb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciA9IHtcIm9mZnNldFwiOiBncmFkW2ldLm9mZnNldCArIFwiJVwifTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cltcInN0b3AtY29sb3JcIl0gPSBjb2xvci5oZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvci5vcGFjaXR5IDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cltcInN0b3Atb3BhY2l0eVwiXSA9IGNvbG9yLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RvcHNbaV0uYXR0cihhdHRyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdG9wc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSBzdG9wcy5sZW5ndGg7IGkgPCBncmFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTdG9wKGdyYWRbaV0uY29sb3IsIGdyYWRbaV0ub2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdyYWRpZW50KGRlZnMsIHN0cikge1xuICAgICAgICAgICAgdmFyIGdyYWQgPSBldmUoXCJzbmFwLnV0aWwuZ3JhZC5wYXJzZVwiLCBudWxsLCBzdHIpLmZpcnN0RGVmaW5lZCgpLFxuICAgICAgICAgICAgICAgIGVsO1xuICAgICAgICAgICAgaWYgKCFncmFkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncmFkLnBhcmFtcy51bnNoaWZ0KGRlZnMpO1xuICAgICAgICAgICAgaWYgKGdyYWQudHlwZS50b0xvd2VyQ2FzZSgpID09IFwibFwiKSB7XG4gICAgICAgICAgICAgICAgZWwgPSBncmFkaWVudExpbmVhci5hcHBseSgwLCBncmFkLnBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsID0gZ3JhZGllbnRSYWRpYWwuYXBwbHkoMCwgZ3JhZC5wYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdyYWQudHlwZSAhPSBncmFkLnR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICQoZWwubm9kZSwge1xuICAgICAgICAgICAgICAgICAgICBncmFkaWVudFVuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdG9wcyA9IGdyYWQuc3RvcHMsXG4gICAgICAgICAgICAgICAgbGVuID0gc3RvcHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBzdG9wID0gc3RvcHNbaV07XG4gICAgICAgICAgICAgICAgZWwuYWRkU3RvcChzdG9wLmNvbG9yLCBzdG9wLm9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ3JhZGllbnRMaW5lYXIoZGVmcywgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IFNuYXAuXy5tYWtlKFwibGluZWFyR3JhZGllbnRcIiwgZGVmcyk7XG4gICAgICAgICAgICBlbC5zdG9wcyA9IEdzdG9wcztcbiAgICAgICAgICAgIGVsLmFkZFN0b3AgPSBHYWRkU3RvcDtcbiAgICAgICAgICAgIGVsLmdldEJCb3ggPSBHZ2V0QkJveDtcbiAgICAgICAgICAgIGVsLnNldFN0b3BzID0gR3NldFN0b3BzO1xuICAgICAgICAgICAgaWYgKHgxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAkKGVsLm5vZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgeDE6IHgxLFxuICAgICAgICAgICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICAgICAgICAgIHgyOiB4MixcbiAgICAgICAgICAgICAgICAgICAgeTI6IHkyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ3JhZGllbnRSYWRpYWwoZGVmcywgY3gsIGN5LCByLCBmeCwgZnkpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IFNuYXAuXy5tYWtlKFwicmFkaWFsR3JhZGllbnRcIiwgZGVmcyk7XG4gICAgICAgICAgICBlbC5zdG9wcyA9IEdzdG9wcztcbiAgICAgICAgICAgIGVsLmFkZFN0b3AgPSBHYWRkU3RvcDtcbiAgICAgICAgICAgIGVsLmdldEJCb3ggPSBHZ2V0QkJveDtcbiAgICAgICAgICAgIGlmIChjeCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgJChlbC5ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgIGN4OiBjeCxcbiAgICAgICAgICAgICAgICAgICAgY3k6IGN5LFxuICAgICAgICAgICAgICAgICAgICByOiByXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZnggIT0gbnVsbCAmJiBmeSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgJChlbC5ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgIGZ4OiBmeCxcbiAgICAgICAgICAgICAgICAgICAgZnk6IGZ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgLypcXFxuICAgICAgICAgKiBQYXBlci5ncmFkaWVudFxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGdyYWRpZW50IGVsZW1lbnRcbiAgICAgICAgICoqXG4gICAgICAgICAtIGdyYWRpZW50IChzdHJpbmcpIGdyYWRpZW50IGRlc2NyaXB0b3JcbiAgICAgICAgID4gR3JhZGllbnQgRGVzY3JpcHRvclxuICAgICAgICAgKiBUaGUgZ3JhZGllbnQgZGVzY3JpcHRvciBpcyBhbiBleHByZXNzaW9uIGZvcm1hdHRlZCBhc1xuICAgICAgICAgKiBmb2xsb3dzOiBgPHR5cGU+KDxjb29yZHM+KTxjb2xvcnM+YC4gIFRoZSBgPHR5cGU+YCBjYW4gYmVcbiAgICAgICAgICogZWl0aGVyIGxpbmVhciBvciByYWRpYWwuICBUaGUgdXBwZXJjYXNlIGBMYCBvciBgUmAgbGV0dGVyc1xuICAgICAgICAgKiBpbmRpY2F0ZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBvZmZzZXQgZnJvbSB0aGUgU1ZHIHN1cmZhY2UuXG4gICAgICAgICAqIExvd2VyY2FzZSBgbGAgb3IgYHJgIGxldHRlcnMgaW5kaWNhdGUgY29vcmRpbmF0ZXNcbiAgICAgICAgICogY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZ3JhZGllbnQgaXNcbiAgICAgICAgICogYXBwbGllZC4gIENvb3JkaW5hdGVzIHNwZWNpZnkgYSBsaW5lYXIgZ3JhZGllbnQgdmVjdG9yIGFzXG4gICAgICAgICAqIGB4MWAsIGB5MWAsIGB4MmAsIGB5MmAsIG9yIGEgcmFkaWFsIGdyYWRpZW50IGFzIGBjeGAsIGBjeWAsXG4gICAgICAgICAqIGByYCBhbmQgb3B0aW9uYWwgYGZ4YCwgYGZ5YCBzcGVjaWZ5aW5nIGEgZm9jYWwgcG9pbnQgYXdheVxuICAgICAgICAgKiBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4gU3BlY2lmeSBgPGNvbG9ycz5gIGFzIGEgbGlzdFxuICAgICAgICAgKiBvZiBkYXNoLXNlcGFyYXRlZCBDU1MgY29sb3IgdmFsdWVzLiAgRWFjaCBjb2xvciBtYXkgYmVcbiAgICAgICAgICogZm9sbG93ZWQgYnkgYSBjdXN0b20gb2Zmc2V0IHZhbHVlLCBzZXBhcmF0ZWQgd2l0aCBhIGNvbG9uXG4gICAgICAgICAqIGNoYXJhY3Rlci5cbiAgICAgICAgID4gRXhhbXBsZXNcbiAgICAgICAgICogTGluZWFyIGdyYWRpZW50LCByZWxhdGl2ZSBmcm9tIHRvcC1sZWZ0IGNvcm5lciB0byBib3R0b20tcmlnaHRcbiAgICAgICAgICogY29ybmVyLCBmcm9tIGJsYWNrIHRocm91Z2ggcmVkIHRvIHdoaXRlOlxuICAgICAgICAgfCB2YXIgZyA9IHBhcGVyLmdyYWRpZW50KFwibCgwLCAwLCAxLCAxKSMwMDAtI2YwMC0jZmZmXCIpO1xuICAgICAgICAgKiBMaW5lYXIgZ3JhZGllbnQsIGFic29sdXRlIGZyb20gKDAsIDApIHRvICgxMDAsIDEwMCksIGZyb20gYmxhY2tcbiAgICAgICAgICogdGhyb3VnaCByZWQgYXQgMjUlIHRvIHdoaXRlOlxuICAgICAgICAgfCB2YXIgZyA9IHBhcGVyLmdyYWRpZW50KFwiTCgwLCAwLCAxMDAsIDEwMCkjMDAwLSNmMDA6MjUtI2ZmZlwiKTtcbiAgICAgICAgICogUmFkaWFsIGdyYWRpZW50LCByZWxhdGl2ZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQgd2l0aCByYWRpdXNcbiAgICAgICAgICogaGFsZiB0aGUgd2lkdGgsIGZyb20gYmxhY2sgdG8gd2hpdGU6XG4gICAgICAgICB8IHZhciBnID0gcGFwZXIuZ3JhZGllbnQoXCJyKDAuNSwgMC41LCAwLjUpIzAwMC0jZmZmXCIpO1xuICAgICAgICAgKiBUbyBhcHBseSB0aGUgZ3JhZGllbnQ6XG4gICAgICAgICB8IHBhcGVyLmNpcmNsZSg1MCwgNTAsIDQwKS5hdHRyKHtcbiAgICAgICAgIHwgICAgIGZpbGw6IGdcbiAgICAgICAgIHwgfSk7XG4gICAgICAgICA9IChvYmplY3QpIHRoZSBgZ3JhZGllbnRgIGVsZW1lbnRcbiAgICAgICAgXFwqL1xuICAgICAgICBwcm90by5ncmFkaWVudCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBncmFkaWVudCh0aGlzLmRlZnMsIHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHByb3RvLmdyYWRpZW50TGluZWFyID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZGllbnRMaW5lYXIodGhpcy5kZWZzLCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgIH07XG4gICAgICAgIHByb3RvLmdyYWRpZW50UmFkaWFsID0gZnVuY3Rpb24gKGN4LCBjeSwgciwgZngsIGZ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ3JhZGllbnRSYWRpYWwodGhpcy5kZWZzLCBjeCwgY3ksIHIsIGZ4LCBmeSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qXFxcbiAgICAgICAgICogUGFwZXIudG9TdHJpbmdcbiAgICAgICAgIFsgbWV0aG9kIF1cbiAgICAgICAgICoqXG4gICAgICAgICAqIFJldHVybnMgU1ZHIGNvZGUgZm9yIHRoZSBAUGFwZXJcbiAgICAgICAgID0gKHN0cmluZykgU1ZHIGNvZGUgZm9yIHRoZSBAUGFwZXJcbiAgICAgICAgXFwqL1xuICAgICAgICBwcm90by50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkb2MgPSB0aGlzLm5vZGUub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBmID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgICAgICBkID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICAgICAgc3ZnID0gdGhpcy5ub2RlLmNsb25lTm9kZSh0cnVlKSxcbiAgICAgICAgICAgICAgICByZXM7XG4gICAgICAgICAgICBmLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgZC5hcHBlbmRDaGlsZChzdmcpO1xuICAgICAgICAgICAgU25hcC5fLiQoc3ZnLCB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIn0pO1xuICAgICAgICAgICAgcmVzID0gZC5pbm5lckhUTUw7XG4gICAgICAgICAgICBmLnJlbW92ZUNoaWxkKGYuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgICAgICAvKlxcXG4gICAgICAgICAqIFBhcGVyLnRvRGF0YVVSTFxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogUmV0dXJucyBTVkcgY29kZSBmb3IgdGhlIEBQYXBlciBhcyBEYXRhIFVSSSBzdHJpbmcuXG4gICAgICAgICA9IChzdHJpbmcpIERhdGEgVVJJIHN0cmluZ1xuICAgICAgICBcXCovXG4gICAgICAgIHByb3RvLnRvRGF0YVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmJ0b2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGhpcykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLypcXFxuICAgICAgICAgKiBQYXBlci5jbGVhclxuICAgICAgICAgWyBtZXRob2QgXVxuICAgICAgICAgKipcbiAgICAgICAgICogUmVtb3ZlcyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIHBhcGVyLCBleGNlcHQgPGRlZnM+LlxuICAgICAgICBcXCovXG4gICAgICAgIHByb3RvLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICBuZXh0O1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50YWdOYW1lICE9IFwiZGVmc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm90by5jbGVhci5jYWxsKHtub2RlOiBub2RlfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0oKSk7XG59KTtcblxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuU25hcC5wbHVnaW4oZnVuY3Rpb24gKFNuYXAsIEVsZW1lbnQsIFBhcGVyLCBnbG9iKSB7XG4gICAgdmFyIGVscHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZSxcbiAgICAgICAgaXMgPSBTbmFwLmlzLFxuICAgICAgICBjbG9uZSA9IFNuYXAuXy5jbG9uZSxcbiAgICAgICAgaGFzID0gXCJoYXNPd25Qcm9wZXJ0eVwiLFxuICAgICAgICBwMnMgPSAvLD8oW2Etel0pLD8vZ2ksXG4gICAgICAgIHRvRmxvYXQgPSBwYXJzZUZsb2F0LFxuICAgICAgICBtYXRoID0gTWF0aCxcbiAgICAgICAgUEkgPSBtYXRoLlBJLFxuICAgICAgICBtbWluID0gbWF0aC5taW4sXG4gICAgICAgIG1tYXggPSBtYXRoLm1heCxcbiAgICAgICAgcG93ID0gbWF0aC5wb3csXG4gICAgICAgIGFicyA9IG1hdGguYWJzO1xuICAgIGZ1bmN0aW9uIHBhdGhzKHBzKSB7XG4gICAgICAgIHZhciBwID0gcGF0aHMucHMgPSBwYXRocy5wcyB8fCB7fTtcbiAgICAgICAgaWYgKHBbcHNdKSB7XG4gICAgICAgICAgICBwW3BzXS5zbGVlcCA9IDEwMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBbcHNdID0ge1xuICAgICAgICAgICAgICAgIHNsZWVwOiAxMDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcCkgaWYgKHBbaGFzXShrZXkpICYmIGtleSAhPSBwcykge1xuICAgICAgICAgICAgICAgIHBba2V5XS5zbGVlcC0tO1xuICAgICAgICAgICAgICAgICFwW2tleV0uc2xlZXAgJiYgZGVsZXRlIHBba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwW3BzXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYm94KHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgeCA9IHkgPSB3aWR0aCA9IGhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgeSA9IHgueTtcbiAgICAgICAgICAgIHdpZHRoID0geC53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IHguaGVpZ2h0O1xuICAgICAgICAgICAgeCA9IHgueDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgaDogaGVpZ2h0LFxuICAgICAgICAgICAgeDI6IHggKyB3aWR0aCxcbiAgICAgICAgICAgIHkyOiB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgY3g6IHggKyB3aWR0aCAvIDIsXG4gICAgICAgICAgICBjeTogeSArIGhlaWdodCAvIDIsXG4gICAgICAgICAgICByMTogbWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyLFxuICAgICAgICAgICAgcjI6IG1hdGgubWF4KHdpZHRoLCBoZWlnaHQpIC8gMixcbiAgICAgICAgICAgIHIwOiBtYXRoLnNxcnQod2lkdGggKiB3aWR0aCArIGhlaWdodCAqIGhlaWdodCkgLyAyLFxuICAgICAgICAgICAgcGF0aDogcmVjdFBhdGgoeCwgeSwgd2lkdGgsIGhlaWdodCksXG4gICAgICAgICAgICB2YjogW3gsIHksIHdpZHRoLCBoZWlnaHRdLmpvaW4oXCIgXCIpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luKFwiLFwiKS5yZXBsYWNlKHAycywgXCIkMVwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0aENsb25lKHBhdGhBcnJheSkge1xuICAgICAgICB2YXIgcmVzID0gY2xvbmUocGF0aEFycmF5KTtcbiAgICAgICAgcmVzLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFBvaW50QXRTZWdtZW50TGVuZ3RoKHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYmV6bGVuKHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5kRG90c0F0U2VnbWVudChwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSxcbiAgICAgICAgICAgICAgICBnZXRUb3RMZW4ocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIGxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldExlbmd0aEZhY3RvcnkoaXN0b3RhbCwgc3VicGF0aCkge1xuICAgICAgICBmdW5jdGlvbiBPKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuICsoK3ZhbCkudG9GaXhlZCgzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU25hcC5fLmNhY2hlcihmdW5jdGlvbiAocGF0aCwgbGVuZ3RoLCBvbmx5c3RhcnQpIHtcbiAgICAgICAgICAgIGlmIChwYXRoIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmF0dHIoXCJkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgyY3VydmUocGF0aCk7XG4gICAgICAgICAgICB2YXIgeCwgeSwgcCwgbCwgc3AgPSBcIlwiLCBzdWJwYXRocyA9IHt9LCBwb2ludCxcbiAgICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGF0aC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHBhdGhbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBbMF0gPT0gXCJNXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgeCA9ICtwWzFdO1xuICAgICAgICAgICAgICAgICAgICB5ID0gK3BbMl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGdldFBvaW50QXRTZWdtZW50TGVuZ3RoKHgsIHksIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIHBbNl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVuICsgbCA+IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnBhdGggJiYgIXN1YnBhdGhzLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBnZXRQb2ludEF0U2VnbWVudExlbmd0aCh4LCB5LCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdLCBsZW5ndGggLSBsZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwICs9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDXCIgKyBPKHBvaW50LnN0YXJ0LngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKHBvaW50LnN0YXJ0LnkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKHBvaW50Lm0ueCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ocG9pbnQubS55KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyhwb2ludC54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyhwb2ludC55KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlzdGFydCkge3JldHVybiBzcDt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0aHMuc3RhcnQgPSBzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJNXCIgKyBPKHBvaW50LngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKHBvaW50LnkpICsgXCJDXCIgKyBPKHBvaW50Lm4ueCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ocG9pbnQubi55KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyhwb2ludC5lbmQueCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ocG9pbnQuZW5kLnkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKHBbNV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKHBbNl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICtwWzVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSArcFs2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXN0b3RhbCAmJiAhc3VicGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ID0gZ2V0UG9pbnRBdFNlZ21lbnRMZW5ndGgoeCwgeSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgbGVuZ3RoIC0gbGVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGVuICs9IGw7XG4gICAgICAgICAgICAgICAgICAgIHggPSArcFs1XTtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICtwWzZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzcCArPSBwLnNoaWZ0KCkgKyBwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VicGF0aHMuZW5kID0gc3A7XG4gICAgICAgICAgICBwb2ludCA9IGlzdG90YWwgPyBsZW4gOiBzdWJwYXRoID8gc3VicGF0aHMgOiBmaW5kRG90c0F0U2VnbWVudCh4LCB5LCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCAxKTtcbiAgICAgICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgICAgfSwgbnVsbCwgU25hcC5fLmNsb25lKTtcbiAgICB9XG4gICAgdmFyIGdldFRvdGFsTGVuZ3RoID0gZ2V0TGVuZ3RoRmFjdG9yeSgxKSxcbiAgICAgICAgZ2V0UG9pbnRBdExlbmd0aCA9IGdldExlbmd0aEZhY3RvcnkoKSxcbiAgICAgICAgZ2V0U3VicGF0aHNBdExlbmd0aCA9IGdldExlbmd0aEZhY3RvcnkoMCwgMSk7XG4gICAgZnVuY3Rpb24gZmluZERvdHNBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQpIHtcbiAgICAgICAgdmFyIHQxID0gMSAtIHQsXG4gICAgICAgICAgICB0MTMgPSBwb3codDEsIDMpLFxuICAgICAgICAgICAgdDEyID0gcG93KHQxLCAyKSxcbiAgICAgICAgICAgIHQyID0gdCAqIHQsXG4gICAgICAgICAgICB0MyA9IHQyICogdCxcbiAgICAgICAgICAgIHggPSB0MTMgKiBwMXggKyB0MTIgKiAzICogdCAqIGMxeCArIHQxICogMyAqIHQgKiB0ICogYzJ4ICsgdDMgKiBwMngsXG4gICAgICAgICAgICB5ID0gdDEzICogcDF5ICsgdDEyICogMyAqIHQgKiBjMXkgKyB0MSAqIDMgKiB0ICogdCAqIGMyeSArIHQzICogcDJ5LFxuICAgICAgICAgICAgbXggPSBwMXggKyAyICogdCAqIChjMXggLSBwMXgpICsgdDIgKiAoYzJ4IC0gMiAqIGMxeCArIHAxeCksXG4gICAgICAgICAgICBteSA9IHAxeSArIDIgKiB0ICogKGMxeSAtIHAxeSkgKyB0MiAqIChjMnkgLSAyICogYzF5ICsgcDF5KSxcbiAgICAgICAgICAgIG54ID0gYzF4ICsgMiAqIHQgKiAoYzJ4IC0gYzF4KSArIHQyICogKHAyeCAtIDIgKiBjMnggKyBjMXgpLFxuICAgICAgICAgICAgbnkgPSBjMXkgKyAyICogdCAqIChjMnkgLSBjMXkpICsgdDIgKiAocDJ5IC0gMiAqIGMyeSArIGMxeSksXG4gICAgICAgICAgICBheCA9IHQxICogcDF4ICsgdCAqIGMxeCxcbiAgICAgICAgICAgIGF5ID0gdDEgKiBwMXkgKyB0ICogYzF5LFxuICAgICAgICAgICAgY3ggPSB0MSAqIGMyeCArIHQgKiBwMngsXG4gICAgICAgICAgICBjeSA9IHQxICogYzJ5ICsgdCAqIHAyeSxcbiAgICAgICAgICAgIGFscGhhID0gOTAgLSBtYXRoLmF0YW4yKG14IC0gbngsIG15IC0gbnkpICogMTgwIC8gUEk7XG4gICAgICAgIC8vIChteCA+IG54IHx8IG15IDwgbnkpICYmIChhbHBoYSArPSAxODApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICBtOiB7eDogbXgsIHk6IG15fSxcbiAgICAgICAgICAgIG46IHt4OiBueCwgeTogbnl9LFxuICAgICAgICAgICAgc3RhcnQ6IHt4OiBheCwgeTogYXl9LFxuICAgICAgICAgICAgZW5kOiB7eDogY3gsIHk6IGN5fSxcbiAgICAgICAgICAgIGFscGhhOiBhbHBoYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBiZXppZXJCQm94KHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5KSB7XG4gICAgICAgIGlmICghU25hcC5pcyhwMXgsIFwiYXJyYXlcIikpIHtcbiAgICAgICAgICAgIHAxeCA9IFtwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJib3ggPSBjdXJ2ZURpbS5hcHBseShudWxsLCBwMXgpO1xuICAgICAgICByZXR1cm4gYm94KFxuICAgICAgICAgICAgYmJveC5taW4ueCxcbiAgICAgICAgICAgIGJib3gubWluLnksXG4gICAgICAgICAgICBiYm94Lm1heC54IC0gYmJveC5taW4ueCxcbiAgICAgICAgICAgIGJib3gubWF4LnkgLSBiYm94Lm1pbi55XG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVCQm94KGJib3gsIHgsIHkpIHtcbiAgICAgICAgcmV0dXJuICB4ID49IGJib3gueCAmJlxuICAgICAgICAgICAgICAgIHggPD0gYmJveC54ICsgYmJveC53aWR0aCAmJlxuICAgICAgICAgICAgICAgIHkgPj0gYmJveC55ICYmXG4gICAgICAgICAgICAgICAgeSA8PSBiYm94LnkgKyBiYm94LmhlaWdodDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNCQm94SW50ZXJzZWN0KGJib3gxLCBiYm94Mikge1xuICAgICAgICBiYm94MSA9IGJveChiYm94MSk7XG4gICAgICAgIGJib3gyID0gYm94KGJib3gyKTtcbiAgICAgICAgcmV0dXJuIGlzUG9pbnRJbnNpZGVCQm94KGJib3gyLCBiYm94MS54LCBiYm94MS55KVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDIsIGJib3gxLngyLCBiYm94MS55KVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDIsIGJib3gxLngsIGJib3gxLnkyKVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDIsIGJib3gxLngyLCBiYm94MS55MilcbiAgICAgICAgICAgIHx8IGlzUG9pbnRJbnNpZGVCQm94KGJib3gxLCBiYm94Mi54LCBiYm94Mi55KVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDEsIGJib3gyLngyLCBiYm94Mi55KVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDEsIGJib3gyLngsIGJib3gyLnkyKVxuICAgICAgICAgICAgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDEsIGJib3gyLngyLCBiYm94Mi55MilcbiAgICAgICAgICAgIHx8IChiYm94MS54IDwgYmJveDIueDIgJiYgYmJveDEueCA+IGJib3gyLnhcbiAgICAgICAgICAgICAgICB8fCBiYm94Mi54IDwgYmJveDEueDIgJiYgYmJveDIueCA+IGJib3gxLngpXG4gICAgICAgICAgICAmJiAoYmJveDEueSA8IGJib3gyLnkyICYmIGJib3gxLnkgPiBiYm94Mi55XG4gICAgICAgICAgICAgICAgfHwgYmJveDIueSA8IGJib3gxLnkyICYmIGJib3gyLnkgPiBiYm94MS55KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmFzZTModCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgdmFyIHQxID0gLTMgKiBwMSArIDkgKiBwMiAtIDkgKiBwMyArIDMgKiBwNCxcbiAgICAgICAgICAgIHQyID0gdCAqIHQxICsgNiAqIHAxIC0gMTIgKiBwMiArIDYgKiBwMztcbiAgICAgICAgcmV0dXJuIHQgKiB0MiAtIDMgKiBwMSArIDMgKiBwMjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmV6bGVuKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgeikge1xuICAgICAgICBpZiAoeiA9PSBudWxsKSB7XG4gICAgICAgICAgICB6ID0gMTtcbiAgICAgICAgfVxuICAgICAgICB6ID0geiA+IDEgPyAxIDogeiA8IDAgPyAwIDogejtcbiAgICAgICAgdmFyIHoyID0geiAvIDIsXG4gICAgICAgICAgICBuID0gMTIsXG4gICAgICAgICAgICBUdmFsdWVzID0gWy0uMTI1MiwuMTI1MiwtLjM2NzgsLjM2NzgsLS41ODczLC41ODczLC0uNzY5OSwuNzY5OSwtLjkwNDEsLjkwNDEsLS45ODE2LC45ODE2XSxcbiAgICAgICAgICAgIEN2YWx1ZXMgPSBbMC4yNDkxLDAuMjQ5MSwwLjIzMzUsMC4yMzM1LDAuMjAzMiwwLjIwMzIsMC4xNjAxLDAuMTYwMSwwLjEwNjksMC4xMDY5LDAuMDQ3MiwwLjA0NzJdLFxuICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjdCA9IHoyICogVHZhbHVlc1tpXSArIHoyLFxuICAgICAgICAgICAgICAgIHhiYXNlID0gYmFzZTMoY3QsIHgxLCB4MiwgeDMsIHg0KSxcbiAgICAgICAgICAgICAgICB5YmFzZSA9IGJhc2UzKGN0LCB5MSwgeTIsIHkzLCB5NCksXG4gICAgICAgICAgICAgICAgY29tYiA9IHhiYXNlICogeGJhc2UgKyB5YmFzZSAqIHliYXNlO1xuICAgICAgICAgICAgc3VtICs9IEN2YWx1ZXNbaV0gKiBtYXRoLnNxcnQoY29tYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHoyICogc3VtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRUb3RMZW4oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBsbCkge1xuICAgICAgICBpZiAobGwgPCAwIHx8IGJlemxlbih4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIDwgbGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IDEsXG4gICAgICAgICAgICBzdGVwID0gdCAvIDIsXG4gICAgICAgICAgICB0MiA9IHQgLSBzdGVwLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGUgPSAuMDE7XG4gICAgICAgIGwgPSBiZXpsZW4oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0Mik7XG4gICAgICAgIHdoaWxlIChhYnMobCAtIGxsKSA+IGUpIHtcbiAgICAgICAgICAgIHN0ZXAgLz0gMjtcbiAgICAgICAgICAgIHQyICs9IChsIDwgbGwgPyAxIDogLTEpICogc3RlcDtcbiAgICAgICAgICAgIGwgPSBiZXpsZW4oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0Mik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG1tYXgoeDEsIHgyKSA8IG1taW4oeDMsIHg0KSB8fFxuICAgICAgICAgICAgbW1pbih4MSwgeDIpID4gbW1heCh4MywgeDQpIHx8XG4gICAgICAgICAgICBtbWF4KHkxLCB5MikgPCBtbWluKHkzLCB5NCkgfHxcbiAgICAgICAgICAgIG1taW4oeTEsIHkyKSA+IG1tYXgoeTMsIHk0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbnggPSAoeDEgKiB5MiAtIHkxICogeDIpICogKHgzIC0geDQpIC0gKHgxIC0geDIpICogKHgzICogeTQgLSB5MyAqIHg0KSxcbiAgICAgICAgICAgIG55ID0gKHgxICogeTIgLSB5MSAqIHgyKSAqICh5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MyAqIHk0IC0geTMgKiB4NCksXG4gICAgICAgICAgICBkZW5vbWluYXRvciA9ICh4MSAtIHgyKSAqICh5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MyAtIHg0KTtcblxuICAgICAgICBpZiAoIWRlbm9taW5hdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHB4ID0gbnggLyBkZW5vbWluYXRvcixcbiAgICAgICAgICAgIHB5ID0gbnkgLyBkZW5vbWluYXRvcixcbiAgICAgICAgICAgIHB4MiA9ICtweC50b0ZpeGVkKDIpLFxuICAgICAgICAgICAgcHkyID0gK3B5LnRvRml4ZWQoMik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHB4MiA8ICttbWluKHgxLCB4MikudG9GaXhlZCgyKSB8fFxuICAgICAgICAgICAgcHgyID4gK21tYXgoeDEsIHgyKS50b0ZpeGVkKDIpIHx8XG4gICAgICAgICAgICBweDIgPCArbW1pbih4MywgeDQpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgICAgIHB4MiA+ICttbWF4KHgzLCB4NCkudG9GaXhlZCgyKSB8fFxuICAgICAgICAgICAgcHkyIDwgK21taW4oeTEsIHkyKS50b0ZpeGVkKDIpIHx8XG4gICAgICAgICAgICBweTIgPiArbW1heCh5MSwgeTIpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgICAgIHB5MiA8ICttbWluKHkzLCB5NCkudG9GaXhlZCgyKSB8fFxuICAgICAgICAgICAgcHkyID4gK21tYXgoeTMsIHk0KS50b0ZpeGVkKDIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7eDogcHgsIHk6IHB5fTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW50ZXIoYmV6MSwgYmV6Mikge1xuICAgICAgICByZXR1cm4gaW50ZXJIZWxwZXIoYmV6MSwgYmV6Mik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludGVyQ291bnQoYmV6MSwgYmV6Mikge1xuICAgICAgICByZXR1cm4gaW50ZXJIZWxwZXIoYmV6MSwgYmV6MiwgMSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludGVySGVscGVyKGJlejEsIGJlejIsIGp1c3RDb3VudCkge1xuICAgICAgICB2YXIgYmJveDEgPSBiZXppZXJCQm94KGJlejEpLFxuICAgICAgICAgICAgYmJveDIgPSBiZXppZXJCQm94KGJlejIpO1xuICAgICAgICBpZiAoIWlzQkJveEludGVyc2VjdChiYm94MSwgYmJveDIpKSB7XG4gICAgICAgICAgICByZXR1cm4ganVzdENvdW50ID8gMCA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsMSA9IGJlemxlbi5hcHBseSgwLCBiZXoxKSxcbiAgICAgICAgICAgIGwyID0gYmV6bGVuLmFwcGx5KDAsIGJlejIpLFxuICAgICAgICAgICAgbjEgPSB+fihsMSAvIDgpLFxuICAgICAgICAgICAgbjIgPSB+fihsMiAvIDgpLFxuICAgICAgICAgICAgZG90czEgPSBbXSxcbiAgICAgICAgICAgIGRvdHMyID0gW10sXG4gICAgICAgICAgICB4eSA9IHt9LFxuICAgICAgICAgICAgcmVzID0ganVzdENvdW50ID8gMCA6IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG4xICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IGZpbmREb3RzQXRTZWdtZW50LmFwcGx5KDAsIGJlejEuY29uY2F0KGkgLyBuMSkpO1xuICAgICAgICAgICAgZG90czEucHVzaCh7eDogcC54LCB5OiBwLnksIHQ6IGkgLyBuMX0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuMiArIDE7IGkrKykge1xuICAgICAgICAgICAgcCA9IGZpbmREb3RzQXRTZWdtZW50LmFwcGx5KDAsIGJlejIuY29uY2F0KGkgLyBuMikpO1xuICAgICAgICAgICAgZG90czIucHVzaCh7eDogcC54LCB5OiBwLnksIHQ6IGkgLyBuMn0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuMTsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZGkgPSBkb3RzMVtpXSxcbiAgICAgICAgICAgICAgICAgICAgZGkxID0gZG90czFbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICBkaiA9IGRvdHMyW2pdLFxuICAgICAgICAgICAgICAgICAgICBkajEgPSBkb3RzMltqICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIGNpID0gYWJzKGRpMS54IC0gZGkueCkgPCAuMDAxID8gXCJ5XCIgOiBcInhcIixcbiAgICAgICAgICAgICAgICAgICAgY2ogPSBhYnMoZGoxLnggLSBkai54KSA8IC4wMDEgPyBcInlcIiA6IFwieFwiLFxuICAgICAgICAgICAgICAgICAgICBpcyA9IGludGVyc2VjdChkaS54LCBkaS55LCBkaTEueCwgZGkxLnksIGRqLngsIGRqLnksIGRqMS54LCBkajEueSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4eVtpcy54LnRvRml4ZWQoNCldID09IGlzLnkudG9GaXhlZCg0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeHlbaXMueC50b0ZpeGVkKDQpXSA9IGlzLnkudG9GaXhlZCg0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQxID0gZGkudCArIGFicygoaXNbY2ldIC0gZGlbY2ldKSAvIChkaTFbY2ldIC0gZGlbY2ldKSkgKiAoZGkxLnQgLSBkaS50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHQyID0gZGoudCArIGFicygoaXNbY2pdIC0gZGpbY2pdKSAvIChkajFbY2pdIC0gZGpbY2pdKSkgKiAoZGoxLnQgLSBkai50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSAmJiB0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqdXN0Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBpcy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpcy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MTogdDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyOiB0MlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhdGhJbnRlcnNlY3Rpb24ocGF0aDEsIHBhdGgyKSB7XG4gICAgICAgIHJldHVybiBpbnRlclBhdGhIZWxwZXIocGF0aDEsIHBhdGgyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0aEludGVyc2VjdGlvbk51bWJlcihwYXRoMSwgcGF0aDIpIHtcbiAgICAgICAgcmV0dXJuIGludGVyUGF0aEhlbHBlcihwYXRoMSwgcGF0aDIsIDEpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnRlclBhdGhIZWxwZXIocGF0aDEsIHBhdGgyLCBqdXN0Q291bnQpIHtcbiAgICAgICAgcGF0aDEgPSBwYXRoMmN1cnZlKHBhdGgxKTtcbiAgICAgICAgcGF0aDIgPSBwYXRoMmN1cnZlKHBhdGgyKTtcbiAgICAgICAgdmFyIHgxLCB5MSwgeDIsIHkyLCB4MW0sIHkxbSwgeDJtLCB5Mm0sIGJlejEsIGJlejIsXG4gICAgICAgICAgICByZXMgPSBqdXN0Q291bnQgPyAwIDogW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdGgxLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwaSA9IHBhdGgxW2ldO1xuICAgICAgICAgICAgaWYgKHBpWzBdID09IFwiTVwiKSB7XG4gICAgICAgICAgICAgICAgeDEgPSB4MW0gPSBwaVsxXTtcbiAgICAgICAgICAgICAgICB5MSA9IHkxbSA9IHBpWzJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGlbMF0gPT0gXCJDXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYmV6MSA9IFt4MSwgeTFdLmNvbmNhdChwaS5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgICAgIHgxID0gYmV6MVs2XTtcbiAgICAgICAgICAgICAgICAgICAgeTEgPSBiZXoxWzddO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlejEgPSBbeDEsIHkxLCB4MSwgeTEsIHgxbSwgeTFtLCB4MW0sIHkxbV07XG4gICAgICAgICAgICAgICAgICAgIHgxID0geDFtO1xuICAgICAgICAgICAgICAgICAgICB5MSA9IHkxbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gcGF0aDIubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGogPSBwYXRoMltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBqWzBdID09IFwiTVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4MiA9IHgybSA9IHBqWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB5Mm0gPSBwalsyXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwalswXSA9PSBcIkNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlejIgPSBbeDIsIHkyXS5jb25jYXQocGouc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gYmV6Mls2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MiA9IGJlejJbN107XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlejIgPSBbeDIsIHkyLCB4MiwgeTIsIHgybSwgeTJtLCB4Mm0sIHkybV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDIgPSB4Mm07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB5Mm07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW50ciA9IGludGVySGVscGVyKGJlejEsIGJlejIsIGp1c3RDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanVzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IGludHI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwLCBrayA9IGludHIubGVuZ3RoOyBrIDwga2s7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyW2tdLnNlZ21lbnQxID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cltrXS5zZWdtZW50MiA9IGo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uYmV6MSA9IGJlejE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uYmV6MiA9IGJlejI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoaW50cik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNQb2ludEluc2lkZVBhdGgocGF0aCwgeCwgeSkge1xuICAgICAgICB2YXIgYmJveCA9IHBhdGhCQm94KHBhdGgpO1xuICAgICAgICByZXR1cm4gaXNQb2ludEluc2lkZUJCb3goYmJveCwgeCwgeSkgJiZcbiAgICAgICAgICAgICAgIGludGVyUGF0aEhlbHBlcihwYXRoLCBbW1wiTVwiLCB4LCB5XSwgW1wiSFwiLCBiYm94LngyICsgMTBdXSwgMSkgJSAyID09IDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhdGhCQm94KHBhdGgpIHtcbiAgICAgICAgdmFyIHB0aCA9IHBhdGhzKHBhdGgpO1xuICAgICAgICBpZiAocHRoLmJib3gpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZShwdGguYmJveCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IHBhdGgyY3VydmUocGF0aCk7XG4gICAgICAgIHZhciB4ID0gMCxcbiAgICAgICAgICAgIHkgPSAwLFxuICAgICAgICAgICAgWCA9IFtdLFxuICAgICAgICAgICAgWSA9IFtdLFxuICAgICAgICAgICAgcDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGF0aC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBwID0gcGF0aFtpXTtcbiAgICAgICAgICAgIGlmIChwWzBdID09IFwiTVwiKSB7XG4gICAgICAgICAgICAgICAgeCA9IHBbMV07XG4gICAgICAgICAgICAgICAgeSA9IHBbMl07XG4gICAgICAgICAgICAgICAgWC5wdXNoKHgpO1xuICAgICAgICAgICAgICAgIFkucHVzaCh5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpbSA9IGN1cnZlRGltKHgsIHksIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIHBbNl0pO1xuICAgICAgICAgICAgICAgIFggPSBYLmNvbmNhdChkaW0ubWluLngsIGRpbS5tYXgueCk7XG4gICAgICAgICAgICAgICAgWSA9IFkuY29uY2F0KGRpbS5taW4ueSwgZGltLm1heC55KTtcbiAgICAgICAgICAgICAgICB4ID0gcFs1XTtcbiAgICAgICAgICAgICAgICB5ID0gcFs2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgeG1pbiA9IG1taW4uYXBwbHkoMCwgWCksXG4gICAgICAgICAgICB5bWluID0gbW1pbi5hcHBseSgwLCBZKSxcbiAgICAgICAgICAgIHhtYXggPSBtbWF4LmFwcGx5KDAsIFgpLFxuICAgICAgICAgICAgeW1heCA9IG1tYXguYXBwbHkoMCwgWSksXG4gICAgICAgICAgICBiYiA9IGJveCh4bWluLCB5bWluLCB4bWF4IC0geG1pbiwgeW1heCAtIHltaW4pO1xuICAgICAgICBwdGguYmJveCA9IGNsb25lKGJiKTtcbiAgICAgICAgcmV0dXJuIGJiO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN0UGF0aCh4LCB5LCB3LCBoLCByKSB7XG4gICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIFtcIk1cIiwgK3ggKyArciwgeV0sXG4gICAgICAgICAgICAgICAgW1wibFwiLCB3IC0gciAqIDIsIDBdLFxuICAgICAgICAgICAgICAgIFtcImFcIiwgciwgciwgMCwgMCwgMSwgciwgcl0sXG4gICAgICAgICAgICAgICAgW1wibFwiLCAwLCBoIC0gciAqIDJdLFxuICAgICAgICAgICAgICAgIFtcImFcIiwgciwgciwgMCwgMCwgMSwgLXIsIHJdLFxuICAgICAgICAgICAgICAgIFtcImxcIiwgciAqIDIgLSB3LCAwXSxcbiAgICAgICAgICAgICAgICBbXCJhXCIsIHIsIHIsIDAsIDAsIDEsIC1yLCAtcl0sXG4gICAgICAgICAgICAgICAgW1wibFwiLCAwLCByICogMiAtIGhdLFxuICAgICAgICAgICAgICAgIFtcImFcIiwgciwgciwgMCwgMCwgMSwgciwgLXJdLFxuICAgICAgICAgICAgICAgIFtcInpcIl1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcyA9IFtbXCJNXCIsIHgsIHldLCBbXCJsXCIsIHcsIDBdLCBbXCJsXCIsIDAsIGhdLCBbXCJsXCIsIC13LCAwXSwgW1wielwiXV07XG4gICAgICAgIHJlcy50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbGxpcHNlUGF0aCh4LCB5LCByeCwgcnksIGEpIHtcbiAgICAgICAgaWYgKGEgPT0gbnVsbCAmJiByeSA9PSBudWxsKSB7XG4gICAgICAgICAgICByeSA9IHJ4O1xuICAgICAgICB9XG4gICAgICAgIHggPSAreDtcbiAgICAgICAgeSA9ICt5O1xuICAgICAgICByeCA9ICtyeDtcbiAgICAgICAgcnkgPSArcnk7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciByYWQgPSBNYXRoLlBJIC8gMTgwLFxuICAgICAgICAgICAgICAgIHgxID0geCArIHJ4ICogTWF0aC5jb3MoLXJ5ICogcmFkKSxcbiAgICAgICAgICAgICAgICB4MiA9IHggKyByeCAqIE1hdGguY29zKC1hICogcmFkKSxcbiAgICAgICAgICAgICAgICB5MSA9IHkgKyByeCAqIE1hdGguc2luKC1yeSAqIHJhZCksXG4gICAgICAgICAgICAgICAgeTIgPSB5ICsgcnggKiBNYXRoLnNpbigtYSAqIHJhZCksXG4gICAgICAgICAgICAgICAgcmVzID0gW1tcIk1cIiwgeDEsIHkxXSwgW1wiQVwiLCByeCwgcngsIDAsICsoYSAtIHJ5ID4gMTgwKSwgMCwgeDIsIHkyXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBbXG4gICAgICAgICAgICAgICAgW1wiTVwiLCB4LCB5XSxcbiAgICAgICAgICAgICAgICBbXCJtXCIsIDAsIC1yeV0sXG4gICAgICAgICAgICAgICAgW1wiYVwiLCByeCwgcnksIDAsIDEsIDEsIDAsIDIgKiByeV0sXG4gICAgICAgICAgICAgICAgW1wiYVwiLCByeCwgcnksIDAsIDEsIDEsIDAsIC0yICogcnldLFxuICAgICAgICAgICAgICAgIFtcInpcIl1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHZhciB1bml0MnB4ID0gU25hcC5fdW5pdDJweCxcbiAgICAgICAgZ2V0UGF0aCA9IHtcbiAgICAgICAgcGF0aDogZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuYXR0cihcInBhdGhcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGNpcmNsZTogZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHVuaXQycHgoZWwpO1xuICAgICAgICAgICAgcmV0dXJuIGVsbGlwc2VQYXRoKGF0dHIuY3gsIGF0dHIuY3ksIGF0dHIucik7XG4gICAgICAgIH0sXG4gICAgICAgIGVsbGlwc2U6IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB1bml0MnB4KGVsKTtcbiAgICAgICAgICAgIHJldHVybiBlbGxpcHNlUGF0aChhdHRyLmN4IHx8IDAsIGF0dHIuY3kgfHwgMCwgYXR0ci5yeCwgYXR0ci5yeSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY3Q6IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB1bml0MnB4KGVsKTtcbiAgICAgICAgICAgIHJldHVybiByZWN0UGF0aChhdHRyLnggfHwgMCwgYXR0ci55IHx8IDAsIGF0dHIud2lkdGgsIGF0dHIuaGVpZ2h0LCBhdHRyLnJ4LCBhdHRyLnJ5KTtcbiAgICAgICAgfSxcbiAgICAgICAgaW1hZ2U6IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB1bml0MnB4KGVsKTtcbiAgICAgICAgICAgIHJldHVybiByZWN0UGF0aChhdHRyLnggfHwgMCwgYXR0ci55IHx8IDAsIGF0dHIud2lkdGgsIGF0dHIuaGVpZ2h0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbGluZTogZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJNXCIgKyBbZWwuYXR0cihcIngxXCIpIHx8IDAsIGVsLmF0dHIoXCJ5MVwiKSB8fCAwLCBlbC5hdHRyKFwieDJcIiksIGVsLmF0dHIoXCJ5MlwiKV07XG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlsaW5lOiBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk1cIiArIGVsLmF0dHIoXCJwb2ludHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlnb246IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTVwiICsgZWwuYXR0cihcInBvaW50c1wiKSArIFwielwiO1xuICAgICAgICB9LFxuICAgICAgICBkZWZsdDogZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICB2YXIgYmJveCA9IGVsLm5vZGUuZ2V0QkJveCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlY3RQYXRoKGJib3gueCwgYmJveC55LCBiYm94LndpZHRoLCBiYm94LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHBhdGhUb1JlbGF0aXZlKHBhdGhBcnJheSkge1xuICAgICAgICB2YXIgcHRoID0gcGF0aHMocGF0aEFycmF5KSxcbiAgICAgICAgICAgIGxvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG4gICAgICAgIGlmIChwdGgucmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aENsb25lKHB0aC5yZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghU25hcC5pcyhwYXRoQXJyYXksIFwiYXJyYXlcIikgfHwgIVNuYXAuaXMocGF0aEFycmF5ICYmIHBhdGhBcnJheVswXSwgXCJhcnJheVwiKSkge1xuICAgICAgICAgICAgcGF0aEFycmF5ID0gU25hcC5wYXJzZVBhdGhTdHJpbmcocGF0aEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzID0gW10sXG4gICAgICAgICAgICB4ID0gMCxcbiAgICAgICAgICAgIHkgPSAwLFxuICAgICAgICAgICAgbXggPSAwLFxuICAgICAgICAgICAgbXkgPSAwLFxuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBpZiAocGF0aEFycmF5WzBdWzBdID09IFwiTVwiKSB7XG4gICAgICAgICAgICB4ID0gcGF0aEFycmF5WzBdWzFdO1xuICAgICAgICAgICAgeSA9IHBhdGhBcnJheVswXVsyXTtcbiAgICAgICAgICAgIG14ID0geDtcbiAgICAgICAgICAgIG15ID0geTtcbiAgICAgICAgICAgIHN0YXJ0Kys7XG4gICAgICAgICAgICByZXMucHVzaChbXCJNXCIsIHgsIHldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQsIGlpID0gcGF0aEFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByID0gcmVzW2ldID0gW10sXG4gICAgICAgICAgICAgICAgcGEgPSBwYXRoQXJyYXlbaV07XG4gICAgICAgICAgICBpZiAocGFbMF0gIT0gbG93ZXJDYXNlLmNhbGwocGFbMF0pKSB7XG4gICAgICAgICAgICAgICAgclswXSA9IGxvd2VyQ2FzZS5jYWxsKHBhWzBdKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHJbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbMV0gPSBwYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSBwYVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbM10gPSBwYVszXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNF0gPSBwYVs0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNV0gPSBwYVs1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNl0gPSArKHBhWzZdIC0geCkudG9GaXhlZCgzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbN10gPSArKHBhWzddIC0geSkudG9GaXhlZCgzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgclsxXSA9ICsocGFbMV0gLSB5KS50b0ZpeGVkKDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBteCA9IHBhWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBwYVsyXTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxLCBqaiA9IHBhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByW2pdID0gKyhwYVtqXSAtIChqICUgMiA/IHggOiB5KSkudG9GaXhlZCgzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHIgPSByZXNbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAocGFbMF0gPT0gXCJtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbXggPSBwYVsxXSArIHg7XG4gICAgICAgICAgICAgICAgICAgIG15ID0gcGFbMl0gKyB5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBwYS5sZW5ndGg7IGsgPCBrazsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1tpXVtrXSA9IHBhW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZW4gPSByZXNbaV0ubGVuZ3RoO1xuICAgICAgICAgICAgc3dpdGNoIChyZXNbaV1bMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgICAgICAgICB4ID0gbXg7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBteTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgICAgICAgICAgeCArPSArcmVzW2ldW2xlbiAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidlwiOlxuICAgICAgICAgICAgICAgICAgICB5ICs9ICtyZXNbaV1bbGVuIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHggKz0gK3Jlc1tpXVtsZW4gLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgeSArPSArcmVzW2ldW2xlbiAtIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcy50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgICAgICBwdGgucmVsID0gcGF0aENsb25lKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhdGhUb0Fic29sdXRlKHBhdGhBcnJheSkge1xuICAgICAgICB2YXIgcHRoID0gcGF0aHMocGF0aEFycmF5KTtcbiAgICAgICAgaWYgKHB0aC5hYnMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoQ2xvbmUocHRoLmFicyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpcyhwYXRoQXJyYXksIFwiYXJyYXlcIikgfHwgIWlzKHBhdGhBcnJheSAmJiBwYXRoQXJyYXlbMF0sIFwiYXJyYXlcIikpIHsgLy8gcm91Z2ggYXNzdW1wdGlvblxuICAgICAgICAgICAgcGF0aEFycmF5ID0gU25hcC5wYXJzZVBhdGhTdHJpbmcocGF0aEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhdGhBcnJheSB8fCAhcGF0aEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFtbXCJNXCIsIDAsIDBdXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzID0gW10sXG4gICAgICAgICAgICB4ID0gMCxcbiAgICAgICAgICAgIHkgPSAwLFxuICAgICAgICAgICAgbXggPSAwLFxuICAgICAgICAgICAgbXkgPSAwLFxuICAgICAgICAgICAgc3RhcnQgPSAwLFxuICAgICAgICAgICAgcGEwO1xuICAgICAgICBpZiAocGF0aEFycmF5WzBdWzBdID09IFwiTVwiKSB7XG4gICAgICAgICAgICB4ID0gK3BhdGhBcnJheVswXVsxXTtcbiAgICAgICAgICAgIHkgPSArcGF0aEFycmF5WzBdWzJdO1xuICAgICAgICAgICAgbXggPSB4O1xuICAgICAgICAgICAgbXkgPSB5O1xuICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgICAgIHJlc1swXSA9IFtcIk1cIiwgeCwgeV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNyeiA9IHBhdGhBcnJheS5sZW5ndGggPT0gMyAmJlxuICAgICAgICAgICAgcGF0aEFycmF5WzBdWzBdID09IFwiTVwiICYmXG4gICAgICAgICAgICBwYXRoQXJyYXlbMV1bMF0udG9VcHBlckNhc2UoKSA9PSBcIlJcIiAmJlxuICAgICAgICAgICAgcGF0aEFycmF5WzJdWzBdLnRvVXBwZXJDYXNlKCkgPT0gXCJaXCI7XG4gICAgICAgIGZvciAodmFyIHIsIHBhLCBpID0gc3RhcnQsIGlpID0gcGF0aEFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKHIgPSBbXSk7XG4gICAgICAgICAgICBwYSA9IHBhdGhBcnJheVtpXTtcbiAgICAgICAgICAgIHBhMCA9IHBhWzBdO1xuICAgICAgICAgICAgaWYgKHBhMCAhPSBwYTAudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIHJbMF0gPSBwYTAudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHJbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbMV0gPSBwYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSBwYVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbM10gPSBwYVszXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNF0gPSBwYVs0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNV0gPSBwYVs1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbNl0gPSArcGFbNl0gKyB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgcls3XSA9ICtwYVs3XSArIHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJbMV0gPSArcGFbMV0gKyB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByWzFdID0gK3BhWzFdICsgeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvdHMgPSBbeCwgeV0uY29uY2F0KHBhLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAyLCBqaiA9IGRvdHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdHNbal0gPSArZG90c1tqXSArIHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90c1srK2pdID0gK2RvdHNbal0gKyB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChjYXRtdWxsUm9tMmJlemllcihkb3RzLCBjcnopKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG90cyA9IGVsbGlwc2VQYXRoKHgsIHksIHBhWzFdLCBwYVsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzLnB1c2goZG90c1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGRvdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGVsbGlwc2VQYXRoKHgsIHksIHBhWzFdLCBwYVsyXSwgcGFbM10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBbXCJVXCJdLmNvbmNhdChyZXNbcmVzLmxlbmd0aCAtIDFdLnNsaWNlKC0yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gK3BhWzFdICsgeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gK3BhWzJdICsgeTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDEsIGpqID0gcGEubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbal0gPSArcGFbal0gKyAoaiAlIDIgPyB4IDogeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYTAgPT0gXCJSXCIpIHtcbiAgICAgICAgICAgICAgICBkb3RzID0gW3gsIHldLmNvbmNhdChwYS5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgcmVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoY2F0bXVsbFJvbTJiZXppZXIoZG90cywgY3J6KSk7XG4gICAgICAgICAgICAgICAgciA9IFtcIlJcIl0uY29uY2F0KHBhLnNsaWNlKC0yKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhMCA9PSBcIk9cIikge1xuICAgICAgICAgICAgICAgIHJlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBkb3RzID0gZWxsaXBzZVBhdGgoeCwgeSwgcGFbMV0sIHBhWzJdKTtcbiAgICAgICAgICAgICAgICBkb3RzLnB1c2goZG90c1swXSk7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChkb3RzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGEwID09IFwiVVwiKSB7XG4gICAgICAgICAgICAgICAgcmVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZWxsaXBzZVBhdGgoeCwgeSwgcGFbMV0sIHBhWzJdLCBwYVszXSkpO1xuICAgICAgICAgICAgICAgIHIgPSBbXCJVXCJdLmNvbmNhdChyZXNbcmVzLmxlbmd0aCAtIDFdLnNsaWNlKC0yKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwLCBrayA9IHBhLmxlbmd0aDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcltrXSA9IHBhW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhMCA9IHBhMC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHBhMCAhPSBcIk9cIikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoclswXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICtteDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSArbXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSByWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJWXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbXggPSByW3IubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBteSA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSByW3IubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gcltyLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXMudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICAgICAgcHRoLmFicyA9IHBhdGhDbG9uZShyZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsMmMoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICAgICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgeDIsIHkyXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcTJjKHgxLCB5MSwgYXgsIGF5LCB4MiwgeTIpIHtcbiAgICAgICAgdmFyIF8xMyA9IDEgLyAzLFxuICAgICAgICAgICAgXzIzID0gMiAvIDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgXzEzICogeDEgKyBfMjMgKiBheCxcbiAgICAgICAgICAgICAgICBfMTMgKiB5MSArIF8yMyAqIGF5LFxuICAgICAgICAgICAgICAgIF8xMyAqIHgyICsgXzIzICogYXgsXG4gICAgICAgICAgICAgICAgXzEzICogeTIgKyBfMjMgKiBheSxcbiAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICB5MlxuICAgICAgICAgICAgXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYTJjKHgxLCB5MSwgcngsIHJ5LCBhbmdsZSwgbGFyZ2VfYXJjX2ZsYWcsIHN3ZWVwX2ZsYWcsIHgyLCB5MiwgcmVjdXJzaXZlKSB7XG4gICAgICAgIC8vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9mIHdoZXJlIHRoaXMgbWF0aCBjYW1lIGZyb20gdmlzaXQ6XG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ltcGxub3RlLmh0bWwjQXJjSW1wbGVtZW50YXRpb25Ob3Rlc1xuICAgICAgICB2YXIgXzEyMCA9IFBJICogMTIwIC8gMTgwLFxuICAgICAgICAgICAgcmFkID0gUEkgLyAxODAgKiAoK2FuZ2xlIHx8IDApLFxuICAgICAgICAgICAgcmVzID0gW10sXG4gICAgICAgICAgICB4eSxcbiAgICAgICAgICAgIHJvdGF0ZSA9IFNuYXAuXy5jYWNoZXIoZnVuY3Rpb24gKHgsIHksIHJhZCkge1xuICAgICAgICAgICAgICAgIHZhciBYID0geCAqIG1hdGguY29zKHJhZCkgLSB5ICogbWF0aC5zaW4ocmFkKSxcbiAgICAgICAgICAgICAgICAgICAgWSA9IHggKiBtYXRoLnNpbihyYWQpICsgeSAqIG1hdGguY29zKHJhZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt4OiBYLCB5OiBZfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJ4IHx8ICFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgeDIsIHkyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgeHkgPSByb3RhdGUoeDEsIHkxLCAtcmFkKTtcbiAgICAgICAgICAgIHgxID0geHkueDtcbiAgICAgICAgICAgIHkxID0geHkueTtcbiAgICAgICAgICAgIHh5ID0gcm90YXRlKHgyLCB5MiwgLXJhZCk7XG4gICAgICAgICAgICB4MiA9IHh5Lng7XG4gICAgICAgICAgICB5MiA9IHh5Lnk7XG4gICAgICAgICAgICB2YXIgY29zID0gbWF0aC5jb3MoUEkgLyAxODAgKiBhbmdsZSksXG4gICAgICAgICAgICAgICAgc2luID0gbWF0aC5zaW4oUEkgLyAxODAgKiBhbmdsZSksXG4gICAgICAgICAgICAgICAgeCA9ICh4MSAtIHgyKSAvIDIsXG4gICAgICAgICAgICAgICAgeSA9ICh5MSAtIHkyKSAvIDI7XG4gICAgICAgICAgICB2YXIgaCA9IHggKiB4IC8gKHJ4ICogcngpICsgeSAqIHkgLyAocnkgKiByeSk7XG4gICAgICAgICAgICBpZiAoaCA+IDEpIHtcbiAgICAgICAgICAgICAgICBoID0gbWF0aC5zcXJ0KGgpO1xuICAgICAgICAgICAgICAgIHJ4ID0gaCAqIHJ4O1xuICAgICAgICAgICAgICAgIHJ5ID0gaCAqIHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJ4MiA9IHJ4ICogcngsXG4gICAgICAgICAgICAgICAgcnkyID0gcnkgKiByeSxcbiAgICAgICAgICAgICAgICBrID0gKGxhcmdlX2FyY19mbGFnID09IHN3ZWVwX2ZsYWcgPyAtMSA6IDEpICpcbiAgICAgICAgICAgICAgICAgICAgbWF0aC5zcXJ0KGFicygocngyICogcnkyIC0gcngyICogeSAqIHkgLSByeTIgKiB4ICogeCkgLyAocngyICogeSAqIHkgKyByeTIgKiB4ICogeCkpKSxcbiAgICAgICAgICAgICAgICBjeCA9IGsgKiByeCAqIHkgLyByeSArICh4MSArIHgyKSAvIDIsXG4gICAgICAgICAgICAgICAgY3kgPSBrICogLXJ5ICogeCAvIHJ4ICsgKHkxICsgeTIpIC8gMixcbiAgICAgICAgICAgICAgICBmMSA9IG1hdGguYXNpbigoKHkxIC0gY3kpIC8gcnkpLnRvRml4ZWQoOSkpLFxuICAgICAgICAgICAgICAgIGYyID0gbWF0aC5hc2luKCgoeTIgLSBjeSkgLyByeSkudG9GaXhlZCg5KSk7XG5cbiAgICAgICAgICAgIGYxID0geDEgPCBjeCA/IFBJIC0gZjEgOiBmMTtcbiAgICAgICAgICAgIGYyID0geDIgPCBjeCA/IFBJIC0gZjIgOiBmMjtcbiAgICAgICAgICAgIGYxIDwgMCAmJiAoZjEgPSBQSSAqIDIgKyBmMSk7XG4gICAgICAgICAgICBmMiA8IDAgJiYgKGYyID0gUEkgKiAyICsgZjIpO1xuICAgICAgICAgICAgaWYgKHN3ZWVwX2ZsYWcgJiYgZjEgPiBmMikge1xuICAgICAgICAgICAgICAgIGYxID0gZjEgLSBQSSAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN3ZWVwX2ZsYWcgJiYgZjIgPiBmMSkge1xuICAgICAgICAgICAgICAgIGYyID0gZjIgLSBQSSAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmMSA9IHJlY3Vyc2l2ZVswXTtcbiAgICAgICAgICAgIGYyID0gcmVjdXJzaXZlWzFdO1xuICAgICAgICAgICAgY3ggPSByZWN1cnNpdmVbMl07XG4gICAgICAgICAgICBjeSA9IHJlY3Vyc2l2ZVszXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGYgPSBmMiAtIGYxO1xuICAgICAgICBpZiAoYWJzKGRmKSA+IF8xMjApIHtcbiAgICAgICAgICAgIHZhciBmMm9sZCA9IGYyLFxuICAgICAgICAgICAgICAgIHgyb2xkID0geDIsXG4gICAgICAgICAgICAgICAgeTJvbGQgPSB5MjtcbiAgICAgICAgICAgIGYyID0gZjEgKyBfMTIwICogKHN3ZWVwX2ZsYWcgJiYgZjIgPiBmMSA/IDEgOiAtMSk7XG4gICAgICAgICAgICB4MiA9IGN4ICsgcnggKiBtYXRoLmNvcyhmMik7XG4gICAgICAgICAgICB5MiA9IGN5ICsgcnkgKiBtYXRoLnNpbihmMik7XG4gICAgICAgICAgICByZXMgPSBhMmMoeDIsIHkyLCByeCwgcnksIGFuZ2xlLCAwLCBzd2VlcF9mbGFnLCB4Mm9sZCwgeTJvbGQsIFtmMiwgZjJvbGQsIGN4LCBjeV0pO1xuICAgICAgICB9XG4gICAgICAgIGRmID0gZjIgLSBmMTtcbiAgICAgICAgdmFyIGMxID0gbWF0aC5jb3MoZjEpLFxuICAgICAgICAgICAgczEgPSBtYXRoLnNpbihmMSksXG4gICAgICAgICAgICBjMiA9IG1hdGguY29zKGYyKSxcbiAgICAgICAgICAgIHMyID0gbWF0aC5zaW4oZjIpLFxuICAgICAgICAgICAgdCA9IG1hdGgudGFuKGRmIC8gNCksXG4gICAgICAgICAgICBoeCA9IDQgLyAzICogcnggKiB0LFxuICAgICAgICAgICAgaHkgPSA0IC8gMyAqIHJ5ICogdCxcbiAgICAgICAgICAgIG0xID0gW3gxLCB5MV0sXG4gICAgICAgICAgICBtMiA9IFt4MSArIGh4ICogczEsIHkxIC0gaHkgKiBjMV0sXG4gICAgICAgICAgICBtMyA9IFt4MiArIGh4ICogczIsIHkyIC0gaHkgKiBjMl0sXG4gICAgICAgICAgICBtNCA9IFt4MiwgeTJdO1xuICAgICAgICBtMlswXSA9IDIgKiBtMVswXSAtIG0yWzBdO1xuICAgICAgICBtMlsxXSA9IDIgKiBtMVsxXSAtIG0yWzFdO1xuICAgICAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gW20yLCBtMywgbTRdLmNvbmNhdChyZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gW20yLCBtMywgbTRdLmNvbmNhdChyZXMpLmpvaW4oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICB2YXIgbmV3cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIG5ld3Jlc1tpXSA9IGkgJSAyID8gcm90YXRlKHJlc1tpIC0gMV0sIHJlc1tpXSwgcmFkKS55IDogcm90YXRlKHJlc1tpXSwgcmVzW2kgKyAxXSwgcmFkKS54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld3JlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kRG90QXRTZWdtZW50KHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCB0KSB7XG4gICAgICAgIHZhciB0MSA9IDEgLSB0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG93KHQxLCAzKSAqIHAxeCArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeCArIHQxICogMyAqIHQgKiB0ICogYzJ4ICsgcG93KHQsIDMpICogcDJ4LFxuICAgICAgICAgICAgeTogcG93KHQxLCAzKSAqIHAxeSArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeSArIHQxICogMyAqIHQgKiB0ICogYzJ5ICsgcG93KHQsIDMpICogcDJ5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib3VuZGluZyBib3ggb2YgY3ViaWMgYmV6aWVyIGN1cnZlLlxuICAgIC8vIFNvdXJjZTogaHR0cDovL2Jsb2cuaGFja2Vycy1jYWZlLm5ldC8yMDA5LzA2L2hvdy10by1jYWxjdWxhdGUtYmV6aWVyLWN1cnZlcy1ib3VuZGluZy5odG1sXG4gICAgLy8gT3JpZ2luYWwgdmVyc2lvbjogTklTSElPIEhpcm9rYXp1XG4gICAgLy8gTW9kaWZpY2F0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3RpbW8yMjM0NVxuICAgIGZ1bmN0aW9uIGN1cnZlRGltKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuICAgICAgICB2YXIgdHZhbHVlcyA9IFtdLFxuICAgICAgICAgICAgYm91bmRzID0gW1tdLCBbXV0sXG4gICAgICAgICAgICBhLCBiLCBjLCB0LCB0MSwgdDIsIGIyYWMsIHNxcnRiMmFjO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgICAgIGIgPSA2ICogeDAgLSAxMiAqIHgxICsgNiAqIHgyO1xuICAgICAgICAgICAgICAgIGEgPSAtMyAqIHgwICsgOSAqIHgxIC0gOSAqIHgyICsgMyAqIHgzO1xuICAgICAgICAgICAgICAgIGMgPSAzICogeDEgLSAzICogeDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGIgPSA2ICogeTAgLSAxMiAqIHkxICsgNiAqIHkyO1xuICAgICAgICAgICAgICAgIGEgPSAtMyAqIHkwICsgOSAqIHkxIC0gOSAqIHkyICsgMyAqIHkzO1xuICAgICAgICAgICAgICAgIGMgPSAzICogeTEgLSAzICogeTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWJzKGEpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWJzKGIpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHQgPSAtYyAvIGI7XG4gICAgICAgICAgICAgICAgaWYgKDAgPCB0ICYmIHQgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHR2YWx1ZXMucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiMmFjID0gYiAqIGIgLSA0ICogYyAqIGE7XG4gICAgICAgICAgICBzcXJ0YjJhYyA9IG1hdGguc3FydChiMmFjKTtcbiAgICAgICAgICAgIGlmIChiMmFjIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdDEgPSAoLWIgKyBzcXJ0YjJhYykgLyAoMiAqIGEpO1xuICAgICAgICAgICAgaWYgKDAgPCB0MSAmJiB0MSA8IDEpIHtcbiAgICAgICAgICAgICAgICB0dmFsdWVzLnB1c2godDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdDIgPSAoLWIgLSBzcXJ0YjJhYykgLyAoMiAqIGEpO1xuICAgICAgICAgICAgaWYgKDAgPCB0MiAmJiB0MiA8IDEpIHtcbiAgICAgICAgICAgICAgICB0dmFsdWVzLnB1c2godDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHgsIHksIGogPSB0dmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGpsZW4gPSBqLFxuICAgICAgICAgICAgbXQ7XG4gICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICAgIHQgPSB0dmFsdWVzW2pdO1xuICAgICAgICAgICAgbXQgPSAxIC0gdDtcbiAgICAgICAgICAgIGJvdW5kc1swXVtqXSA9IG10ICogbXQgKiBtdCAqIHgwICsgMyAqIG10ICogbXQgKiB0ICogeDEgKyAzICogbXQgKiB0ICogdCAqIHgyICsgdCAqIHQgKiB0ICogeDM7XG4gICAgICAgICAgICBib3VuZHNbMV1bal0gPSBtdCAqIG10ICogbXQgKiB5MCArIDMgKiBtdCAqIG10ICogdCAqIHkxICsgMyAqIG10ICogdCAqIHQgKiB5MiArIHQgKiB0ICogdCAqIHkzO1xuICAgICAgICB9XG5cbiAgICAgICAgYm91bmRzWzBdW2psZW5dID0geDA7XG4gICAgICAgIGJvdW5kc1sxXVtqbGVuXSA9IHkwO1xuICAgICAgICBib3VuZHNbMF1bamxlbiArIDFdID0geDM7XG4gICAgICAgIGJvdW5kc1sxXVtqbGVuICsgMV0gPSB5MztcbiAgICAgICAgYm91bmRzWzBdLmxlbmd0aCA9IGJvdW5kc1sxXS5sZW5ndGggPSBqbGVuICsgMjtcblxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWluOiB7eDogbW1pbi5hcHBseSgwLCBib3VuZHNbMF0pLCB5OiBtbWluLmFwcGx5KDAsIGJvdW5kc1sxXSl9LFxuICAgICAgICAgIG1heDoge3g6IG1tYXguYXBwbHkoMCwgYm91bmRzWzBdKSwgeTogbW1heC5hcHBseSgwLCBib3VuZHNbMV0pfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhdGgyY3VydmUocGF0aCwgcGF0aDIpIHtcbiAgICAgICAgdmFyIHB0aCA9ICFwYXRoMiAmJiBwYXRocyhwYXRoKTtcbiAgICAgICAgaWYgKCFwYXRoMiAmJiBwdGguY3VydmUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoQ2xvbmUocHRoLmN1cnZlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcCA9IHBhdGhUb0Fic29sdXRlKHBhdGgpLFxuICAgICAgICAgICAgcDIgPSBwYXRoMiAmJiBwYXRoVG9BYnNvbHV0ZShwYXRoMiksXG4gICAgICAgICAgICBhdHRycyA9IHt4OiAwLCB5OiAwLCBieDogMCwgYnk6IDAsIFg6IDAsIFk6IDAsIHF4OiBudWxsLCBxeTogbnVsbH0sXG4gICAgICAgICAgICBhdHRyczIgPSB7eDogMCwgeTogMCwgYng6IDAsIGJ5OiAwLCBYOiAwLCBZOiAwLCBxeDogbnVsbCwgcXk6IG51bGx9LFxuICAgICAgICAgICAgcHJvY2Vzc1BhdGggPSBmdW5jdGlvbiAocGF0aCwgZCwgcGNvbSkge1xuICAgICAgICAgICAgICAgIHZhciBueCwgbnk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXCJDXCIsIGQueCwgZC55LCBkLngsIGQueSwgZC54LCBkLnldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAhKHBhdGhbMF0gaW4ge1Q6IDEsIFE6IDF9KSAmJiAoZC5xeCA9IGQucXkgPSBudWxsKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGhbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuWCA9IHBhdGhbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkLlkgPSBwYXRoWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gW1wiQ1wiXS5jb25jYXQoYTJjLmFwcGx5KDAsIFtkLngsIGQueV0uY29uY2F0KHBhdGguc2xpY2UoMSkpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY29tID09IFwiQ1wiIHx8IHBjb20gPT0gXCJTXCIpIHsgLy8gSW4gXCJTXCIgY2FzZSB3ZSBoYXZlIHRvIHRha2UgaW50byBhY2NvdW50LCBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBDL1MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBkLnggKiAyIC0gZC5ieDsgICAgICAgICAgLy8gQW5kIHJlZmxlY3QgdGhlIHByZXZpb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnkgPSBkLnkgKiAyIC0gZC5ieTsgICAgICAgICAgLy8gY29tbWFuZCdzIGNvbnRyb2wgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igc29tZSBlbHNlIG9yIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBueCA9IGQueDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBueSA9IGQueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBbXCJDXCIsIG54LCBueV0uY29uY2F0KHBhdGguc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJUXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNvbSA9PSBcIlFcIiB8fCBwY29tID09IFwiVFwiKSB7IC8vIEluIFwiVFwiIGNhc2Ugd2UgaGF2ZSB0byB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgUS9ULlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucXggPSBkLnggKiAyIC0gZC5xeDsgICAgICAgIC8vIEFuZCBtYWtlIGEgcmVmbGVjdGlvbiBzaW1pbGFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5xeSA9IGQueSAqIDIgLSBkLnF5OyAgICAgICAgLy8gdG8gY2FzZSBcIlNcIi5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBzb21ldGhpbmcgZWxzZSBvciBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5xeCA9IGQueDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnF5ID0gZC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFtcIkNcIl0uY29uY2F0KHEyYyhkLngsIGQueSwgZC5xeCwgZC5xeSwgcGF0aFsxXSwgcGF0aFsyXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJRXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBkLnF4ID0gcGF0aFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucXkgPSBwYXRoWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFtcIkNcIl0uY29uY2F0KHEyYyhkLngsIGQueSwgcGF0aFsxXSwgcGF0aFsyXSwgcGF0aFszXSwgcGF0aFs0XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gW1wiQ1wiXS5jb25jYXQobDJjKGQueCwgZC55LCBwYXRoWzFdLCBwYXRoWzJdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBbXCJDXCJdLmNvbmNhdChsMmMoZC54LCBkLnksIHBhdGhbMV0sIGQueSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJWXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gW1wiQ1wiXS5jb25jYXQobDJjKGQueCwgZC55LCBkLngsIHBhdGhbMV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFtcIkNcIl0uY29uY2F0KGwyYyhkLngsIGQueSwgZC5YLCBkLlkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaXhBcmMgPSBmdW5jdGlvbiAocHAsIGkpIHtcbiAgICAgICAgICAgICAgICBpZiAocHBbaV0ubGVuZ3RoID4gNykge1xuICAgICAgICAgICAgICAgICAgICBwcFtpXS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGkgPSBwcFtpXTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGNvbXMxW2ldID0gXCJBXCI7IC8vIGlmIGNyZWF0ZWQgbXVsdGlwbGUgQzpzLCB0aGVpciBvcmlnaW5hbCBzZWcgaXMgc2F2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHAyICYmIChwY29tczJbaV0gPSBcIkFcIik7IC8vIHRoZSBzYW1lIGFzIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcC5zcGxpY2UoaSsrLCAwLCBbXCJDXCJdLmNvbmNhdChwaS5zcGxpY2UoMCwgNikpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlpID0gbW1heChwLmxlbmd0aCwgcDIgJiYgcDIubGVuZ3RoIHx8IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaXhNID0gZnVuY3Rpb24gKHBhdGgxLCBwYXRoMiwgYTEsIGEyLCBpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGgxICYmIHBhdGgyICYmIHBhdGgxW2ldWzBdID09IFwiTVwiICYmIHBhdGgyW2ldWzBdICE9IFwiTVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgyLnNwbGljZShpLCAwLCBbXCJNXCIsIGEyLngsIGEyLnldKTtcbiAgICAgICAgICAgICAgICAgICAgYTEuYnggPSAwO1xuICAgICAgICAgICAgICAgICAgICBhMS5ieSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGExLnggPSBwYXRoMVtpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgYTEueSA9IHBhdGgxW2ldWzJdO1xuICAgICAgICAgICAgICAgICAgICBpaSA9IG1tYXgocC5sZW5ndGgsIHAyICYmIHAyLmxlbmd0aCB8fCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGNvbXMxID0gW10sIC8vIHBhdGggY29tbWFuZHMgb2Ygb3JpZ2luYWwgcGF0aCBwXG4gICAgICAgICAgICBwY29tczIgPSBbXSwgLy8gcGF0aCBjb21tYW5kcyBvZiBvcmlnaW5hbCBwYXRoIHAyXG4gICAgICAgICAgICBwZmlyc3QgPSBcIlwiLCAvLyB0ZW1wb3JhcnkgaG9sZGVyIGZvciBvcmlnaW5hbCBwYXRoIGNvbW1hbmRcbiAgICAgICAgICAgIHBjb20gPSBcIlwiOyAvLyBob2xkZXIgZm9yIHByZXZpb3VzIHBhdGggY29tbWFuZCBvZiBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG1tYXgocC5sZW5ndGgsIHAyICYmIHAyLmxlbmd0aCB8fCAwKTsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHBbaV0gJiYgKHBmaXJzdCA9IHBbaV1bMF0pOyAvLyBzYXZlIGN1cnJlbnQgcGF0aCBjb21tYW5kXG5cbiAgICAgICAgICAgIGlmIChwZmlyc3QgIT0gXCJDXCIpIC8vIEMgaXMgbm90IHNhdmVkIHlldCwgYmVjYXVzZSBpdCBtYXkgYmUgcmVzdWx0IG9mIGNvbnZlcnNpb25cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwY29tczFbaV0gPSBwZmlyc3Q7IC8vIFNhdmUgY3VycmVudCBwYXRoIGNvbW1hbmRcbiAgICAgICAgICAgICAgICBpICYmICggcGNvbSA9IHBjb21zMVtpIC0gMV0pOyAvLyBHZXQgcHJldmlvdXMgcGF0aCBjb21tYW5kIHBjb21cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBbaV0gPSBwcm9jZXNzUGF0aChwW2ldLCBhdHRycywgcGNvbSk7IC8vIFByZXZpb3VzIHBhdGggY29tbWFuZCBpcyBpbnB1dHRlZCB0byBwcm9jZXNzUGF0aFxuXG4gICAgICAgICAgICBpZiAocGNvbXMxW2ldICE9IFwiQVwiICYmIHBmaXJzdCA9PSBcIkNcIikgcGNvbXMxW2ldID0gXCJDXCI7IC8vIEEgaXMgdGhlIG9ubHkgY29tbWFuZFxuICAgICAgICAgICAgLy8gd2hpY2ggbWF5IHByb2R1Y2UgbXVsdGlwbGUgQzpzXG4gICAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IEMgaXMgYWxzbyBDIGluIG9yaWdpbmFsIHBhdGhcblxuICAgICAgICAgICAgZml4QXJjKHAsIGkpOyAvLyBmaXhBcmMgYWRkcyBhbHNvIHRoZSByaWdodCBhbW91bnQgb2YgQTpzIHRvIHBjb21zMVxuXG4gICAgICAgICAgICBpZiAocDIpIHsgLy8gdGhlIHNhbWUgcHJvY2VkdXJlcyBpcyBkb25lIHRvIHAyXG4gICAgICAgICAgICAgICAgcDJbaV0gJiYgKHBmaXJzdCA9IHAyW2ldWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAocGZpcnN0ICE9IFwiQ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBjb21zMltpXSA9IHBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaSAmJiAocGNvbSA9IHBjb21zMltpIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwMltpXSA9IHByb2Nlc3NQYXRoKHAyW2ldLCBhdHRyczIsIHBjb20pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBjb21zMltpXSAhPSBcIkFcIiAmJiBwZmlyc3QgPT0gXCJDXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGNvbXMyW2ldID0gXCJDXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZml4QXJjKHAyLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpeE0ocCwgcDIsIGF0dHJzLCBhdHRyczIsIGkpO1xuICAgICAgICAgICAgZml4TShwMiwgcCwgYXR0cnMyLCBhdHRycywgaSk7XG4gICAgICAgICAgICB2YXIgc2VnID0gcFtpXSxcbiAgICAgICAgICAgICAgICBzZWcyID0gcDIgJiYgcDJbaV0sXG4gICAgICAgICAgICAgICAgc2VnbGVuID0gc2VnLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBzZWcybGVuID0gcDIgJiYgc2VnMi5sZW5ndGg7XG4gICAgICAgICAgICBhdHRycy54ID0gc2VnW3NlZ2xlbiAtIDJdO1xuICAgICAgICAgICAgYXR0cnMueSA9IHNlZ1tzZWdsZW4gLSAxXTtcbiAgICAgICAgICAgIGF0dHJzLmJ4ID0gdG9GbG9hdChzZWdbc2VnbGVuIC0gNF0pIHx8IGF0dHJzLng7XG4gICAgICAgICAgICBhdHRycy5ieSA9IHRvRmxvYXQoc2VnW3NlZ2xlbiAtIDNdKSB8fCBhdHRycy55O1xuICAgICAgICAgICAgYXR0cnMyLmJ4ID0gcDIgJiYgKHRvRmxvYXQoc2VnMltzZWcybGVuIC0gNF0pIHx8IGF0dHJzMi54KTtcbiAgICAgICAgICAgIGF0dHJzMi5ieSA9IHAyICYmICh0b0Zsb2F0KHNlZzJbc2VnMmxlbiAtIDNdKSB8fCBhdHRyczIueSk7XG4gICAgICAgICAgICBhdHRyczIueCA9IHAyICYmIHNlZzJbc2VnMmxlbiAtIDJdO1xuICAgICAgICAgICAgYXR0cnMyLnkgPSBwMiAmJiBzZWcyW3NlZzJsZW4gLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXAyKSB7XG4gICAgICAgICAgICBwdGguY3VydmUgPSBwYXRoQ2xvbmUocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHAyID8gW3AsIHAyXSA6IHA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hcFBhdGgocGF0aCwgbWF0cml4KSB7XG4gICAgICAgIGlmICghbWF0cml4KSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeCwgeSwgaSwgaiwgaWksIGpqLCBwYXRoaTtcbiAgICAgICAgcGF0aCA9IHBhdGgyY3VydmUocGF0aCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gcGF0aC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICBwYXRoaSA9IHBhdGhbaV07XG4gICAgICAgICAgICBmb3IgKGogPSAxLCBqaiA9IHBhdGhpLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHtcbiAgICAgICAgICAgICAgICB4ID0gbWF0cml4LngocGF0aGlbal0sIHBhdGhpW2ogKyAxXSk7XG4gICAgICAgICAgICAgICAgeSA9IG1hdHJpeC55KHBhdGhpW2pdLCBwYXRoaVtqICsgMV0pO1xuICAgICAgICAgICAgICAgIHBhdGhpW2pdID0geDtcbiAgICAgICAgICAgICAgICBwYXRoaVtqICsgMV0gPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIC8vIGh0dHA6Ly9zY2hlcGVycy5jYy9nZXR0aW5nLXRvLXRoZS1wb2ludFxuICAgIGZ1bmN0aW9uIGNhdG11bGxSb20yYmV6aWVyKGNycCwgeikge1xuICAgICAgICB2YXIgZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IGNycC5sZW5ndGg7IGlMZW4gLSAyICogIXogPiBpOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBwID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAge3g6ICtjcnBbaSAtIDJdLCB5OiArY3JwW2kgLSAxXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7eDogK2NycFtpXSwgICAgIHk6ICtjcnBbaSArIDFdfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt4OiArY3JwW2kgKyAyXSwgeTogK2NycFtpICsgM119LFxuICAgICAgICAgICAgICAgICAgICAgICAge3g6ICtjcnBbaSArIDRdLCB5OiArY3JwW2kgKyA1XX1cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmICh6KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBbMF0gPSB7eDogK2NycFtpTGVuIC0gMl0sIHk6ICtjcnBbaUxlbiAtIDFdfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlMZW4gLSA0ID09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcFszXSA9IHt4OiArY3JwWzBdLCB5OiArY3JwWzFdfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlMZW4gLSAyID09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcFsyXSA9IHt4OiArY3JwWzBdLCB5OiArY3JwWzFdfTtcbiAgICAgICAgICAgICAgICAgICAgcFszXSA9IHt4OiArY3JwWzJdLCB5OiArY3JwWzNdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpTGVuIC0gNCA9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBbM10gPSBwWzJdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWkpIHtcbiAgICAgICAgICAgICAgICAgICAgcFswXSA9IHt4OiArY3JwW2ldLCB5OiArY3JwW2kgKyAxXX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZC5wdXNoKFtcIkNcIixcbiAgICAgICAgICAgICAgICAgICgtcFswXS54ICsgNiAqIHBbMV0ueCArIHBbMl0ueCkgLyA2LFxuICAgICAgICAgICAgICAgICAgKC1wWzBdLnkgKyA2ICogcFsxXS55ICsgcFsyXS55KSAvIDYsXG4gICAgICAgICAgICAgICAgICAocFsxXS54ICsgNiAqIHBbMl0ueCAtIHBbM10ueCkgLyA2LFxuICAgICAgICAgICAgICAgICAgKHBbMV0ueSArIDYqcFsyXS55IC0gcFszXS55KSAvIDYsXG4gICAgICAgICAgICAgICAgICBwWzJdLngsXG4gICAgICAgICAgICAgICAgICBwWzJdLnlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgLy8gZXhwb3J0XG4gICAgU25hcC5wYXRoID0gcGF0aHM7XG5cbiAgICAvKlxcXG4gICAgICogU25hcC5wYXRoLmdldFRvdGFsTGVuZ3RoXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHBhdGggaW4gcGl4ZWxzXG4gICAgICoqXG4gICAgIC0gcGF0aCAoc3RyaW5nKSBTVkcgcGF0aCBzdHJpbmdcbiAgICAgKipcbiAgICAgPSAobnVtYmVyKSBsZW5ndGhcbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmdldFRvdGFsTGVuZ3RoID0gZ2V0VG90YWxMZW5ndGg7XG4gICAgLypcXFxuICAgICAqIFNuYXAucGF0aC5nZXRQb2ludEF0TGVuZ3RoXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gbGVuZ3RoIGFsb25nIHRoZSBnaXZlbiBwYXRoXG4gICAgICoqXG4gICAgIC0gcGF0aCAoc3RyaW5nKSBTVkcgcGF0aCBzdHJpbmdcbiAgICAgLSBsZW5ndGggKG51bWJlcikgbGVuZ3RoLCBpbiBwaXhlbHMsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYXRoLCBleGNsdWRpbmcgbm9uLXJlbmRlcmluZyBqdW1wc1xuICAgICAqKlxuICAgICA9IChvYmplY3QpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwb2ludDpcbiAgICAgbyB7XG4gICAgIG8gICAgIHg6IChudW1iZXIpIHggY29vcmRpbmF0ZSxcbiAgICAgbyAgICAgeTogKG51bWJlcikgeSBjb29yZGluYXRlLFxuICAgICBvICAgICBhbHBoYTogKG51bWJlcikgYW5nbGUgb2YgZGVyaXZhdGl2ZVxuICAgICBvIH1cbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmdldFBvaW50QXRMZW5ndGggPSBnZXRQb2ludEF0TGVuZ3RoO1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGguZ2V0U3VicGF0aFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyB0aGUgc3VicGF0aCBvZiBhIGdpdmVuIHBhdGggYmV0d2VlbiBnaXZlbiBzdGFydCBhbmQgZW5kIGxlbmd0aHNcbiAgICAgKipcbiAgICAgLSBwYXRoIChzdHJpbmcpIFNWRyBwYXRoIHN0cmluZ1xuICAgICAtIGZyb20gKG51bWJlcikgbGVuZ3RoLCBpbiBwaXhlbHMsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYXRoIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VnbWVudFxuICAgICAtIHRvIChudW1iZXIpIGxlbmd0aCwgaW4gcGl4ZWxzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBzZWdtZW50XG4gICAgICoqXG4gICAgID0gKHN0cmluZykgcGF0aCBzdHJpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIHNlZ21lbnRcbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmdldFN1YnBhdGggPSBmdW5jdGlvbiAocGF0aCwgZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0VG90YWxMZW5ndGgocGF0aCkgLSB0byA8IDFlLTYpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRTdWJwYXRoc0F0TGVuZ3RoKHBhdGgsIGZyb20pLmVuZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYSA9IGdldFN1YnBhdGhzQXRMZW5ndGgocGF0aCwgdG8sIDEpO1xuICAgICAgICByZXR1cm4gZnJvbSA/IGdldFN1YnBhdGhzQXRMZW5ndGgoYSwgZnJvbSkuZW5kIDogYTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmdldFRvdGFsTGVuZ3RoXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHBhdGggaW4gcGl4ZWxzIChvbmx5IHdvcmtzIGZvciBgcGF0aGAgZWxlbWVudHMpXG4gICAgID0gKG51bWJlcikgbGVuZ3RoXG4gICAgXFwqL1xuICAgIGVscHJvdG8uZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gU0lFUlJBIEVsZW1lbnQuZ2V0UG9pbnRBdExlbmd0aCgpL0VsZW1lbnQuZ2V0VG90YWxMZW5ndGgoKTogSWYgYSA8cGF0aD4gaXMgYnJva2VuIGludG8gZGlmZmVyZW50IHNlZ21lbnRzLCBpcyB0aGUganVtcCBkaXN0YW5jZSB0byB0aGUgbmV3IGNvb3JkaW5hdGVzIHNldCBieSB0aGUgX01fIG9yIF9tXyBjb21tYW5kcyBjYWxjdWxhdGVkIGFzIHBhcnQgb2YgdGhlIHBhdGgncyB0b3RhbCBsZW5ndGg/XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuZ2V0UG9pbnRBdExlbmd0aFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gbGVuZ3RoIG9uIHRoZSBnaXZlbiBwYXRoIChvbmx5IHdvcmtzIGZvciBgcGF0aGAgZWxlbWVudHMpXG4gICAgICoqXG4gICAgIC0gbGVuZ3RoIChudW1iZXIpIGxlbmd0aCwgaW4gcGl4ZWxzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGF0aCwgZXhjbHVkaW5nIG5vbi1yZW5kZXJpbmcganVtcHNcbiAgICAgKipcbiAgICAgPSAob2JqZWN0KSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcG9pbnQ6XG4gICAgIG8ge1xuICAgICBvICAgICB4OiAobnVtYmVyKSB4IGNvb3JkaW5hdGUsXG4gICAgIG8gICAgIHk6IChudW1iZXIpIHkgY29vcmRpbmF0ZSxcbiAgICAgbyAgICAgYWxwaGE6IChudW1iZXIpIGFuZ2xlIG9mIGRlcml2YXRpdmVcbiAgICAgbyB9XG4gICAgXFwqL1xuICAgIGVscHJvdG8uZ2V0UG9pbnRBdExlbmd0aCA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBvaW50QXRMZW5ndGgodGhpcy5hdHRyKFwiZFwiKSwgbGVuZ3RoKTtcbiAgICB9O1xuICAgIC8vIFNJRVJSQSBFbGVtZW50LmdldFN1YnBhdGgoKTogU2ltaWxhciB0byB0aGUgcHJvYmxlbSBmb3IgRWxlbWVudC5nZXRQb2ludEF0TGVuZ3RoKCkuIFVuY2xlYXIgaG93IHRoaXMgd291bGQgd29yayBmb3IgYSBzZWdtZW50ZWQgcGF0aC4gT3ZlcmFsbCwgdGhlIGNvbmNlcHQgb2YgX3N1YnBhdGhfIGFuZCB3aGF0IEknbSBjYWxsaW5nIGEgX3NlZ21lbnRfIChzZXJpZXMgb2Ygbm9uLV9NXyBvciBfWl8gY29tbWFuZHMpIGlzIHVuY2xlYXIuXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuZ2V0U3VicGF0aFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBzdWJwYXRoIG9mIGEgZ2l2ZW4gZWxlbWVudCBmcm9tIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbGVuZ3RocyAob25seSB3b3JrcyBmb3IgYHBhdGhgIGVsZW1lbnRzKVxuICAgICAqKlxuICAgICAtIGZyb20gKG51bWJlcikgbGVuZ3RoLCBpbiBwaXhlbHMsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYXRoIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VnbWVudFxuICAgICAtIHRvIChudW1iZXIpIGxlbmd0aCwgaW4gcGl4ZWxzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBzZWdtZW50XG4gICAgICoqXG4gICAgID0gKHN0cmluZykgcGF0aCBzdHJpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIHNlZ21lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5nZXRTdWJwYXRoID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBTbmFwLnBhdGguZ2V0U3VicGF0aCh0aGlzLmF0dHIoXCJkXCIpLCBmcm9tLCB0byk7XG4gICAgfTtcbiAgICBTbmFwLl8uYm94ID0gYm94O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGguZmluZERvdHNBdFNlZ21lbnRcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFV0aWxpdHkgbWV0aG9kXG4gICAgICoqXG4gICAgICogRmluZHMgZG90IGNvb3JkaW5hdGVzIG9uIHRoZSBnaXZlbiBjdWJpYyBiZXppw6lyIGN1cnZlIGF0IHRoZSBnaXZlbiB0XG4gICAgIC0gcDF4IChudW1iZXIpIHggb2YgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBjdXJ2ZVxuICAgICAtIHAxeSAobnVtYmVyKSB5IG9mIHRoZSBmaXJzdCBwb2ludCBvZiB0aGUgY3VydmVcbiAgICAgLSBjMXggKG51bWJlcikgeCBvZiB0aGUgZmlyc3QgYW5jaG9yIG9mIHRoZSBjdXJ2ZVxuICAgICAtIGMxeSAobnVtYmVyKSB5IG9mIHRoZSBmaXJzdCBhbmNob3Igb2YgdGhlIGN1cnZlXG4gICAgIC0gYzJ4IChudW1iZXIpIHggb2YgdGhlIHNlY29uZCBhbmNob3Igb2YgdGhlIGN1cnZlXG4gICAgIC0gYzJ5IChudW1iZXIpIHkgb2YgdGhlIHNlY29uZCBhbmNob3Igb2YgdGhlIGN1cnZlXG4gICAgIC0gcDJ4IChudW1iZXIpIHggb2YgdGhlIHNlY29uZCBwb2ludCBvZiB0aGUgY3VydmVcbiAgICAgLSBwMnkgKG51bWJlcikgeSBvZiB0aGUgc2Vjb25kIHBvaW50IG9mIHRoZSBjdXJ2ZVxuICAgICAtIHQgKG51bWJlcikgcG9zaXRpb24gb24gdGhlIGN1cnZlICgwLi4xKVxuICAgICA9IChvYmplY3QpIHBvaW50IGluZm9ybWF0aW9uIGluIGZvcm1hdDpcbiAgICAgbyB7XG4gICAgIG8gICAgIHg6IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsXG4gICAgIG8gICAgIHk6IChudW1iZXIpIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsXG4gICAgIG8gICAgIG06IHtcbiAgICAgbyAgICAgICAgIHg6IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBhbmNob3IsXG4gICAgIG8gICAgICAgICB5OiAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxlZnQgYW5jaG9yXG4gICAgIG8gICAgIH0sXG4gICAgIG8gICAgIG46IHtcbiAgICAgbyAgICAgICAgIHg6IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQgYW5jaG9yLFxuICAgICBvICAgICAgICAgeTogKG51bWJlcikgeSBjb29yZGluYXRlIG9mIHRoZSByaWdodCBhbmNob3JcbiAgICAgbyAgICAgfSxcbiAgICAgbyAgICAgc3RhcnQ6IHtcbiAgICAgbyAgICAgICAgIHg6IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnZlLFxuICAgICBvICAgICAgICAgeTogKG51bWJlcikgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VydmVcbiAgICAgbyAgICAgfSxcbiAgICAgbyAgICAgZW5kOiB7XG4gICAgIG8gICAgICAgICB4OiAobnVtYmVyKSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgY3VydmUsXG4gICAgIG8gICAgICAgICB5OiAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgY3VydmVcbiAgICAgbyAgICAgfSxcbiAgICAgbyAgICAgYWxwaGE6IChudW1iZXIpIGFuZ2xlIG9mIHRoZSBjdXJ2ZSBkZXJpdmF0aXZlIGF0IHRoZSBwb2ludFxuICAgICBvIH1cbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmZpbmREb3RzQXRTZWdtZW50ID0gZmluZERvdHNBdFNlZ21lbnQ7XG4gICAgLypcXFxuICAgICAqIFNuYXAucGF0aC5iZXppZXJCQm94XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBVdGlsaXR5IG1ldGhvZFxuICAgICAqKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiBhIGdpdmVuIGN1YmljIGJlemnDqXIgY3VydmVcbiAgICAgLSBwMXggKG51bWJlcikgeCBvZiB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIGN1cnZlXG4gICAgIC0gcDF5IChudW1iZXIpIHkgb2YgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBjdXJ2ZVxuICAgICAtIGMxeCAobnVtYmVyKSB4IG9mIHRoZSBmaXJzdCBhbmNob3Igb2YgdGhlIGN1cnZlXG4gICAgIC0gYzF5IChudW1iZXIpIHkgb2YgdGhlIGZpcnN0IGFuY2hvciBvZiB0aGUgY3VydmVcbiAgICAgLSBjMnggKG51bWJlcikgeCBvZiB0aGUgc2Vjb25kIGFuY2hvciBvZiB0aGUgY3VydmVcbiAgICAgLSBjMnkgKG51bWJlcikgeSBvZiB0aGUgc2Vjb25kIGFuY2hvciBvZiB0aGUgY3VydmVcbiAgICAgLSBwMnggKG51bWJlcikgeCBvZiB0aGUgc2Vjb25kIHBvaW50IG9mIHRoZSBjdXJ2ZVxuICAgICAtIHAyeSAobnVtYmVyKSB5IG9mIHRoZSBzZWNvbmQgcG9pbnQgb2YgdGhlIGN1cnZlXG4gICAgICogb3JcbiAgICAgLSBiZXogKGFycmF5KSBhcnJheSBvZiBzaXggcG9pbnRzIGZvciBiZXppw6lyIGN1cnZlXG4gICAgID0gKG9iamVjdCkgYm91bmRpbmcgYm94XG4gICAgIG8ge1xuICAgICBvICAgICB4OiAobnVtYmVyKSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxlZnQgdG9wIHBvaW50IG9mIHRoZSBib3gsXG4gICAgIG8gICAgIHk6IChudW1iZXIpIHkgY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCB0b3AgcG9pbnQgb2YgdGhlIGJveCxcbiAgICAgbyAgICAgeDI6IChudW1iZXIpIHggY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQgYm90dG9tIHBvaW50IG9mIHRoZSBib3gsXG4gICAgIG8gICAgIHkyOiAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0IGJvdHRvbSBwb2ludCBvZiB0aGUgYm94LFxuICAgICBvICAgICB3aWR0aDogKG51bWJlcikgd2lkdGggb2YgdGhlIGJveCxcbiAgICAgbyAgICAgaGVpZ2h0OiAobnVtYmVyKSBoZWlnaHQgb2YgdGhlIGJveFxuICAgICBvIH1cbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmJlemllckJCb3ggPSBiZXppZXJCQm94O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGguaXNQb2ludEluc2lkZUJCb3hcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFV0aWxpdHkgbWV0aG9kXG4gICAgICoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlIGJvdW5kaW5nIGJveFxuICAgICAtIGJib3ggKHN0cmluZykgYm91bmRpbmcgYm94XG4gICAgIC0geCAoc3RyaW5nKSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50XG4gICAgIC0geSAoc3RyaW5nKSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50XG4gICAgID0gKGJvb2xlYW4pIGB0cnVlYCBpZiBwb2ludCBpcyBpbnNpZGVcbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmlzUG9pbnRJbnNpZGVCQm94ID0gaXNQb2ludEluc2lkZUJCb3g7XG4gICAgU25hcC5jbG9zZXN0ID0gZnVuY3Rpb24gKHgsIHksIFgsIFkpIHtcbiAgICAgICAgdmFyIHIgPSAxMDAsXG4gICAgICAgICAgICBiID0gYm94KHggLSByIC8gMiwgeSAtIHIgLyAyLCByLCByKSxcbiAgICAgICAgICAgIGluc2lkZSA9IFtdLFxuICAgICAgICAgICAgZ2V0dGVyID0gWFswXS5oYXNPd25Qcm9wZXJ0eShcInhcIikgPyBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IFhbaV0ueCxcbiAgICAgICAgICAgICAgICAgICAgeTogWFtpXS55XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IFhbaV0sXG4gICAgICAgICAgICAgICAgICAgIHk6IFlbaV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvdW5kID0gMDtcbiAgICAgICAgd2hpbGUgKHIgPD0gMWU2ICYmICFmb3VuZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gWC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHh5ID0gZ2V0dGVyKGkpO1xuICAgICAgICAgICAgICAgIGlmIChpc1BvaW50SW5zaWRlQkJveChiLCB4eS54LCB4eS55KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCsrO1xuICAgICAgICAgICAgICAgICAgICBpbnNpZGUucHVzaCh4eSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICByICo9IDI7XG4gICAgICAgICAgICAgICAgYiA9IGJveCh4IC0gciAvIDIsIHkgLSByIC8gMiwgciwgcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAociA9PSAxZTYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuID0gSW5maW5pdHksXG4gICAgICAgICAgICByZXM7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gaW5zaWRlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBsID0gU25hcC5sZW4oeCwgeSwgaW5zaWRlW2ldLngsIGluc2lkZVtpXS55KTtcbiAgICAgICAgICAgIGlmIChsZW4gPiBsKSB7XG4gICAgICAgICAgICAgICAgbGVuID0gbDtcbiAgICAgICAgICAgICAgICBpbnNpZGVbaV0ubGVuID0gbDtcbiAgICAgICAgICAgICAgICByZXMgPSBpbnNpZGVbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGguaXNCQm94SW50ZXJzZWN0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBVdGlsaXR5IG1ldGhvZFxuICAgICAqKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHR3byBib3VuZGluZyBib3hlcyBpbnRlcnNlY3RcbiAgICAgLSBiYm94MSAoc3RyaW5nKSBmaXJzdCBib3VuZGluZyBib3hcbiAgICAgLSBiYm94MiAoc3RyaW5nKSBzZWNvbmQgYm91bmRpbmcgYm94XG4gICAgID0gKGJvb2xlYW4pIGB0cnVlYCBpZiBib3VuZGluZyBib3hlcyBpbnRlcnNlY3RcbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmlzQkJveEludGVyc2VjdCA9IGlzQkJveEludGVyc2VjdDtcbiAgICAvKlxcXG4gICAgICogU25hcC5wYXRoLmludGVyc2VjdGlvblxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogVXRpbGl0eSBtZXRob2RcbiAgICAgKipcbiAgICAgKiBGaW5kcyBpbnRlcnNlY3Rpb25zIG9mIHR3byBwYXRoc1xuICAgICAtIHBhdGgxIChzdHJpbmcpIHBhdGggc3RyaW5nXG4gICAgIC0gcGF0aDIgKHN0cmluZykgcGF0aCBzdHJpbmdcbiAgICAgPSAoYXJyYXkpIGRvdHMgb2YgaW50ZXJzZWN0aW9uXG4gICAgIG8gW1xuICAgICBvICAgICB7XG4gICAgIG8gICAgICAgICB4OiAobnVtYmVyKSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LFxuICAgICBvICAgICAgICAgeTogKG51bWJlcikgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCxcbiAgICAgbyAgICAgICAgIHQxOiAobnVtYmVyKSB0IHZhbHVlIGZvciBzZWdtZW50IG9mIHBhdGgxLFxuICAgICBvICAgICAgICAgdDI6IChudW1iZXIpIHQgdmFsdWUgZm9yIHNlZ21lbnQgb2YgcGF0aDIsXG4gICAgIG8gICAgICAgICBzZWdtZW50MTogKG51bWJlcikgb3JkZXIgbnVtYmVyIGZvciBzZWdtZW50IG9mIHBhdGgxLFxuICAgICBvICAgICAgICAgc2VnbWVudDI6IChudW1iZXIpIG9yZGVyIG51bWJlciBmb3Igc2VnbWVudCBvZiBwYXRoMixcbiAgICAgbyAgICAgICAgIGJlejE6IChhcnJheSkgZWlnaHQgY29vcmRpbmF0ZXMgcmVwcmVzZW50aW5nIGJlemnDqXIgY3VydmUgZm9yIHRoZSBzZWdtZW50IG9mIHBhdGgxLFxuICAgICBvICAgICAgICAgYmV6MjogKGFycmF5KSBlaWdodCBjb29yZGluYXRlcyByZXByZXNlbnRpbmcgYmV6acOpciBjdXJ2ZSBmb3IgdGhlIHNlZ21lbnQgb2YgcGF0aDJcbiAgICAgbyAgICAgfVxuICAgICBvIF1cbiAgICBcXCovXG4gICAgU25hcC5wYXRoLmludGVyc2VjdGlvbiA9IHBhdGhJbnRlcnNlY3Rpb247XG4gICAgU25hcC5wYXRoLmludGVyc2VjdGlvbk51bWJlciA9IHBhdGhJbnRlcnNlY3Rpb25OdW1iZXI7XG4gICAgLypcXFxuICAgICAqIFNuYXAucGF0aC5pc1BvaW50SW5zaWRlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBVdGlsaXR5IG1ldGhvZFxuICAgICAqKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGdpdmVuIHBvaW50IGlzIGluc2lkZSBhIGdpdmVuIGNsb3NlZCBwYXRoLlxuICAgICAqXG4gICAgICogTm90ZTogZmlsbCBtb2RlIGRvZXNu4oCZdCBhZmZlY3QgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZC5cbiAgICAgLSBwYXRoIChzdHJpbmcpIHBhdGggc3RyaW5nXG4gICAgIC0geCAobnVtYmVyKSB4IG9mIHRoZSBwb2ludFxuICAgICAtIHkgKG51bWJlcikgeSBvZiB0aGUgcG9pbnRcbiAgICAgPSAoYm9vbGVhbikgYHRydWVgIGlmIHBvaW50IGlzIGluc2lkZSB0aGUgcGF0aFxuICAgIFxcKi9cbiAgICBTbmFwLnBhdGguaXNQb2ludEluc2lkZSA9IGlzUG9pbnRJbnNpZGVQYXRoO1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGguZ2V0QkJveFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogVXRpbGl0eSBtZXRob2RcbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgYSBnaXZlbiBwYXRoXG4gICAgIC0gcGF0aCAoc3RyaW5nKSBwYXRoIHN0cmluZ1xuICAgICA9IChvYmplY3QpIGJvdW5kaW5nIGJveFxuICAgICBvIHtcbiAgICAgbyAgICAgeDogKG51bWJlcikgeCBjb29yZGluYXRlIG9mIHRoZSBsZWZ0IHRvcCBwb2ludCBvZiB0aGUgYm94LFxuICAgICBvICAgICB5OiAobnVtYmVyKSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxlZnQgdG9wIHBvaW50IG9mIHRoZSBib3gsXG4gICAgIG8gICAgIHgyOiAobnVtYmVyKSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0IGJvdHRvbSBwb2ludCBvZiB0aGUgYm94LFxuICAgICBvICAgICB5MjogKG51bWJlcikgeSBjb29yZGluYXRlIG9mIHRoZSByaWdodCBib3R0b20gcG9pbnQgb2YgdGhlIGJveCxcbiAgICAgbyAgICAgd2lkdGg6IChudW1iZXIpIHdpZHRoIG9mIHRoZSBib3gsXG4gICAgIG8gICAgIGhlaWdodDogKG51bWJlcikgaGVpZ2h0IG9mIHRoZSBib3hcbiAgICAgbyB9XG4gICAgXFwqL1xuICAgIFNuYXAucGF0aC5nZXRCQm94ID0gcGF0aEJCb3g7XG4gICAgU25hcC5wYXRoLmdldCA9IGdldFBhdGg7XG4gICAgLypcXFxuICAgICAqIFNuYXAucGF0aC50b1JlbGF0aXZlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBVdGlsaXR5IG1ldGhvZFxuICAgICAqKlxuICAgICAqIENvbnZlcnRzIHBhdGggY29vcmRpbmF0ZXMgaW50byByZWxhdGl2ZSB2YWx1ZXNcbiAgICAgLSBwYXRoIChzdHJpbmcpIHBhdGggc3RyaW5nXG4gICAgID0gKGFycmF5KSBwYXRoIHN0cmluZ1xuICAgIFxcKi9cbiAgICBTbmFwLnBhdGgudG9SZWxhdGl2ZSA9IHBhdGhUb1JlbGF0aXZlO1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnBhdGgudG9BYnNvbHV0ZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogVXRpbGl0eSBtZXRob2RcbiAgICAgKipcbiAgICAgKiBDb252ZXJ0cyBwYXRoIGNvb3JkaW5hdGVzIGludG8gYWJzb2x1dGUgdmFsdWVzXG4gICAgIC0gcGF0aCAoc3RyaW5nKSBwYXRoIHN0cmluZ1xuICAgICA9IChhcnJheSkgcGF0aCBzdHJpbmdcbiAgICBcXCovXG4gICAgU25hcC5wYXRoLnRvQWJzb2x1dGUgPSBwYXRoVG9BYnNvbHV0ZTtcbiAgICAvKlxcXG4gICAgICogU25hcC5wYXRoLnRvQ3ViaWNcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFV0aWxpdHkgbWV0aG9kXG4gICAgICoqXG4gICAgICogQ29udmVydHMgcGF0aCB0byBhIG5ldyBwYXRoIHdoZXJlIGFsbCBzZWdtZW50cyBhcmUgY3ViaWMgYmV6acOpciBjdXJ2ZXNcbiAgICAgLSBwYXRoU3RyaW5nIChzdHJpbmd8YXJyYXkpIHBhdGggc3RyaW5nIG9yIGFycmF5IG9mIHNlZ21lbnRzXG4gICAgID0gKGFycmF5KSBhcnJheSBvZiBzZWdtZW50c1xuICAgIFxcKi9cbiAgICBTbmFwLnBhdGgudG9DdWJpYyA9IHBhdGgyY3VydmU7XG4gICAgLypcXFxuICAgICAqIFNuYXAucGF0aC5tYXBcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgcGF0aCBzdHJpbmcgd2l0aCB0aGUgZ2l2ZW4gbWF0cml4XG4gICAgIC0gcGF0aCAoc3RyaW5nKSBwYXRoIHN0cmluZ1xuICAgICAtIG1hdHJpeCAob2JqZWN0KSBzZWUgQE1hdHJpeFxuICAgICA9IChzdHJpbmcpIHRyYW5zZm9ybWVkIHBhdGggc3RyaW5nXG4gICAgXFwqL1xuICAgIFNuYXAucGF0aC5tYXAgPSBtYXBQYXRoO1xuICAgIFNuYXAucGF0aC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIFNuYXAucGF0aC5jbG9uZSA9IHBhdGhDbG9uZTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IpIHtcbiAgICB2YXIgbW1heCA9IE1hdGgubWF4LFxuICAgICAgICBtbWluID0gTWF0aC5taW47XG5cbiAgICAvLyBTZXRcbiAgICB2YXIgU2V0ID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblx0dGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMudHlwZSA9IFwic2V0XCI7XG4gICAgICAgIGlmIChpdGVtcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaXRlbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3RoaXMuaXRlbXMubGVuZ3RoXSA9IHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGhdID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRwcm90byA9IFNldC5wcm90b3R5cGU7XG4gICAgLypcXFxuICAgICAqIFNldC5wdXNoXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGVhY2ggYXJndW1lbnQgdG8gdGhlIGN1cnJlbnQgc2V0XG4gICAgID0gKG9iamVjdCkgb3JpZ2luYWwgZWxlbWVudFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5wdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlbSxcbiAgICAgICAgICAgIGxlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGl0ZW0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXNbbGVuXSA9IHRoaXMuaXRlbXNbbGVuXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBTZXQucG9wXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGxhc3QgZWxlbWVudCBhbmQgcmV0dXJucyBpdFxuICAgICA9IChvYmplY3QpIGVsZW1lbnRcbiAgICBcXCovXG4gICAgc2V0cHJvdG8ucG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCAmJiBkZWxldGUgdGhpc1t0aGlzLmxlbmd0aC0tXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMucG9wKCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LmZvckVhY2hcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEV4ZWN1dGVzIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldFxuICAgICAqXG4gICAgICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYCwgdGhlIGxvb3Agc3RvcHMgcnVubmluZy5cbiAgICAgKipcbiAgICAgLSBjYWxsYmFjayAoZnVuY3Rpb24pIGZ1bmN0aW9uIHRvIHJ1blxuICAgICAtIHRoaXNBcmcgKG9iamVjdCkgY29udGV4dCBvYmplY3QgZm9yIHRoZSBjYWxsYmFja1xuICAgICA9IChvYmplY3QpIFNldCBvYmplY3RcbiAgICBcXCovXG4gICAgc2V0cHJvdG8uZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMuaXRlbXNbaV0sIGkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNldC5hbmltYXRlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBbmltYXRlcyBlYWNoIGVsZW1lbnQgaW4gc2V0IGluIHN5bmMuXG4gICAgICpcbiAgICAgKipcbiAgICAgLSBhdHRycyAob2JqZWN0KSBrZXktdmFsdWUgcGFpcnMgb2YgZGVzdGluYXRpb24gYXR0cmlidXRlc1xuICAgICAtIGR1cmF0aW9uIChudW1iZXIpIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gICAgIC0gZWFzaW5nIChmdW5jdGlvbikgI29wdGlvbmFsIGVhc2luZyBmdW5jdGlvbiBmcm9tIEBtaW5hIG9yIGN1c3RvbVxuICAgICAtIGNhbGxiYWNrIChmdW5jdGlvbikgI29wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgd2hlbiB0aGUgYW5pbWF0aW9uIGVuZHNcbiAgICAgKiBvclxuICAgICAtIGFuaW1hdGlvbiAoYXJyYXkpIGFycmF5IG9mIGFuaW1hdGlvbiBwYXJhbWV0ZXIgZm9yIGVhY2ggZWxlbWVudCBpbiBzZXQgaW4gZm9ybWF0IGBbYXR0cnMsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrXWBcbiAgICAgPiBVc2FnZVxuICAgICB8IC8vIGFuaW1hdGUgYWxsIGVsZW1lbnRzIGluIHNldCB0byByYWRpdXMgMTBcbiAgICAgfCBzZXQuYW5pbWF0ZSh7cjogMTB9LCA1MDAsIG1pbmEuZWFzZWluKTtcbiAgICAgfCAvLyBvclxuICAgICB8IC8vIGFuaW1hdGUgZmlyc3QgZWxlbWVudCB0byByYWRpdXMgMTAsIGJ1dCBzZWNvbmQgdG8gcmFkaXVzIDIwIGFuZCBpbiBkaWZmZXJlbnQgdGltZVxuICAgICB8IHNldC5hbmltYXRlKFt7cjogMTB9LCA1MDAsIG1pbmEuZWFzZWluXSwgW3tyOiAyMH0sIDE1MDAsIG1pbmEuZWFzZWluXSk7XG4gICAgID0gKEVsZW1lbnQpIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICBcXCovXG4gICAgc2V0cHJvdG8uYW5pbWF0ZSA9IGZ1bmN0aW9uIChhdHRycywgbXMsIGVhc2luZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlYXNpbmcgPT0gXCJmdW5jdGlvblwiICYmICFlYXNpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGVhc2luZztcbiAgICAgICAgICAgIGVhc2luZyA9IG1pbmEubGluZWFyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRycyBpbnN0YW5jZW9mIFNuYXAuXy5BbmltYXRpb24pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gYXR0cnMuY2FsbGJhY2s7XG4gICAgICAgICAgICBlYXNpbmcgPSBhdHRycy5lYXNpbmc7XG4gICAgICAgICAgICBtcyA9IGVhc2luZy5kdXI7XG4gICAgICAgICAgICBhdHRycyA9IGF0dHJzLmF0dHI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChTbmFwLmlzKGF0dHJzLCBcImFycmF5XCIpICYmIFNuYXAuaXMoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBcImFycmF5XCIpKSB7XG4gICAgICAgICAgICB2YXIgZWFjaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJlZ2luLFxuICAgICAgICAgICAgaGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmVnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iID0gYmVnaW47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSB0aGlzLmI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNiID0gMCxcbiAgICAgICAgICAgIHNldCA9IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja2VyID0gY2FsbGJhY2sgJiYgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgrK2NiID09IHNldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaSkge1xuICAgICAgICAgICAgZXZlLm9uY2UoXCJzbmFwLmFuaW1jcmVhdGVkLlwiICsgZWwuaWQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKGVhY2gpIHtcbiAgICAgICAgICAgICAgICBhcmdzW2ldICYmIGVsLmFuaW1hdGUuYXBwbHkoZWwsIGFyZ3NbaV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbC5hbmltYXRlKGF0dHJzLCBtcywgZWFzaW5nLCBjYWxsYmFja2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LnJlbW92ZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyBhbGwgY2hpbGRyZW4gb2YgdGhlIHNldC5cbiAgICAgKlxuICAgICA9IChvYmplY3QpIFNldCBvYmplY3RcbiAgICBcXCovXG4gICAgc2V0cHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucG9wKCkucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LmJpbmRcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gaGFuZGxlIGEgc3BlY2lmaWMgYXR0cmlidXRlIHdoZW4gYXBwbGllZFxuICAgICAqIHRvIGEgc2V0LlxuICAgICAqXG4gICAgICoqXG4gICAgIC0gYXR0ciAoc3RyaW5nKSBhdHRyaWJ1dGUgbmFtZVxuICAgICAtIGNhbGxiYWNrIChmdW5jdGlvbikgZnVuY3Rpb24gdG8gcnVuXG4gICAgICogb3JcbiAgICAgLSBhdHRyIChzdHJpbmcpIGF0dHJpYnV0ZSBuYW1lXG4gICAgIC0gZWxlbWVudCAoRWxlbWVudCkgc3BlY2lmaWMgZWxlbWVudCBpbiB0aGUgc2V0IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGUgdG9cbiAgICAgKiBvclxuICAgICAtIGF0dHIgKHN0cmluZykgYXR0cmlidXRlIG5hbWVcbiAgICAgLSBlbGVtZW50IChFbGVtZW50KSBzcGVjaWZpYyBlbGVtZW50IGluIHRoZSBzZXQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZSB0b1xuICAgICAtIGVhdHRyIChzdHJpbmcpIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCB0byBiaW5kIHRoZSBhdHRyaWJ1dGUgdG9cbiAgICAgPSAob2JqZWN0KSBTZXQgb2JqZWN0XG4gICAgXFwqL1xuICAgIHNldHByb3RvLmJpbmQgPSBmdW5jdGlvbiAoYXR0ciwgYSwgYikge1xuICAgICAgICB2YXIgZGF0YSA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW2F0dHJdID0gYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBhbmFtZSA9IGIgfHwgYXR0cjtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbYXR0cl0gPSBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgIGRhdGFbYW5hbWVdID0gdjtcbiAgICAgICAgICAgICAgICBhLmF0dHIoZGF0YSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNldC5hdHRyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBFcXVpdmFsZW50IG9mIEBFbGVtZW50LmF0dHIuXG4gICAgID0gKG9iamVjdCkgU2V0IG9iamVjdFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5hdHRyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB1bmJvdW5kID0ge307XG4gICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW2tdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1trXSh2YWx1ZVtrXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuYm91bmRba10gPSB2YWx1ZVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0uYXR0cih1bmJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBTZXQuY2xlYXJcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHNldFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LnNwbGljZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyByYW5nZSBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXRcbiAgICAgKipcbiAgICAgLSBpbmRleCAobnVtYmVyKSBwb3NpdGlvbiBvZiB0aGUgZGVsZXRpb25cbiAgICAgLSBjb3VudCAobnVtYmVyKSBudW1iZXIgb2YgZWxlbWVudCB0byByZW1vdmVcbiAgICAgLSBpbnNlcnRpb27igKYgKG9iamVjdCkgI29wdGlvbmFsIGVsZW1lbnRzIHRvIGluc2VydFxuICAgICA9IChvYmplY3QpIHNldCBlbGVtZW50cyB0aGF0IHdlcmUgZGVsZXRlZFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5zcGxpY2UgPSBmdW5jdGlvbiAoaW5kZXgsIGNvdW50LCBpbnNlcnRpb24pIHtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBtbWF4KHRoaXMubGVuZ3RoICsgaW5kZXgsIDApIDogaW5kZXg7XG4gICAgICAgIGNvdW50ID0gbW1heCgwLCBtbWluKHRoaXMubGVuZ3RoIC0gaW5kZXgsIGNvdW50KSk7XG4gICAgICAgIHZhciB0YWlsID0gW10sXG4gICAgICAgICAgICB0b2RlbCA9IFtdLFxuICAgICAgICAgICAgYXJncyA9IFtdLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHRvZGVsLnB1c2godGhpc1tpbmRleCArIGldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoIC0gaW5kZXg7IGkrKykge1xuICAgICAgICAgICAgdGFpbC5wdXNoKHRoaXNbaW5kZXggKyBpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ2xlbiA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnbGVuICsgdGFpbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpbmRleCArIGldID0gdGhpc1tpbmRleCArIGldID0gaSA8IGFyZ2xlbiA/IGFyZ3NbaV0gOiB0YWlsW2kgLSBhcmdsZW5dO1xuICAgICAgICB9XG4gICAgICAgIGkgPSB0aGlzLml0ZW1zLmxlbmd0aCA9IHRoaXMubGVuZ3RoIC09IGNvdW50IC0gYXJnbGVuO1xuICAgICAgICB3aGlsZSAodGhpc1tpXSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXNbaSsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNldCh0b2RlbCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LmV4Y2x1ZGVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoZSBzZXRcbiAgICAgKipcbiAgICAgLSBlbGVtZW50IChvYmplY3QpIGVsZW1lbnQgdG8gcmVtb3ZlXG4gICAgID0gKGJvb2xlYW4pIGB0cnVlYCBpZiBvYmplY3Qgd2FzIGZvdW5kIGFuZCByZW1vdmVkIGZyb20gdGhlIHNldFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5leGNsdWRlID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgaWYgKHRoaXNbaV0gPT0gZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNldC5pbnNlcnRBZnRlclxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogSW5zZXJ0cyBzZXQgZWxlbWVudHMgYWZ0ZXIgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKipcbiAgICAgLSBlbGVtZW50IChvYmplY3QpIHNldCB3aWxsIGJlIGluc2VydGVkIGFmdGVyIHRoaXMgZWxlbWVudFxuICAgICA9IChvYmplY3QpIFNldCBvYmplY3RcbiAgICBcXCovXG4gICAgc2V0cHJvdG8uaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5pbnNlcnRBZnRlcihlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0LmdldEJCb3hcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFVuaW9uIG9mIGFsbCBiYm94ZXMgb2YgdGhlIHNldC4gU2VlIEBFbGVtZW50LmdldEJCb3guXG4gICAgID0gKG9iamVjdCkgYm91bmRpbmcgYm94IGRlc2NyaXB0b3IuIFNlZSBARWxlbWVudC5nZXRCQm94LlxuICAgIFxcKi9cbiAgICBzZXRwcm90by5nZXRCQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeCA9IFtdLFxuICAgICAgICAgICAgeSA9IFtdLFxuICAgICAgICAgICAgeDIgPSBbXSxcbiAgICAgICAgICAgIHkyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLml0ZW1zLmxlbmd0aDsgaS0tOykgaWYgKCF0aGlzLml0ZW1zW2ldLnJlbW92ZWQpIHtcbiAgICAgICAgICAgIHZhciBib3ggPSB0aGlzLml0ZW1zW2ldLmdldEJCb3goKTtcbiAgICAgICAgICAgIHgucHVzaChib3gueCk7XG4gICAgICAgICAgICB5LnB1c2goYm94LnkpO1xuICAgICAgICAgICAgeDIucHVzaChib3gueCArIGJveC53aWR0aCk7XG4gICAgICAgICAgICB5Mi5wdXNoKGJveC55ICsgYm94LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgeCA9IG1taW4uYXBwbHkoMCwgeCk7XG4gICAgICAgIHkgPSBtbWluLmFwcGx5KDAsIHkpO1xuICAgICAgICB4MiA9IG1tYXguYXBwbHkoMCwgeDIpO1xuICAgICAgICB5MiA9IG1tYXguYXBwbHkoMCwgeTIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTIsXG4gICAgICAgICAgICB3aWR0aDogeDIgLSB4LFxuICAgICAgICAgICAgaGVpZ2h0OiB5MiAtIHksXG4gICAgICAgICAgICBjeDogeCArICh4MiAtIHgpIC8gMixcbiAgICAgICAgICAgIGN5OiB5ICsgKHkyIC0geSkgLyAyXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU2V0Lmluc2VydEFmdGVyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHNldC5cbiAgICAgKipcbiAgICAgPSAob2JqZWN0KSBOZXcgU2V0IG9iamVjdFxuICAgIFxcKi9cbiAgICBzZXRwcm90by5jbG9uZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHMgPSBuZXcgU2V0O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHMucHVzaCh0aGlzLml0ZW1zW2ldLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH07XG4gICAgc2V0cHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlNuYXBcXHUyMDE4cyBzZXRcIjtcbiAgICB9O1xuICAgIHNldHByb3RvLnR5cGUgPSBcInNldFwiO1xuICAgIC8vIGV4cG9ydFxuICAgIC8qXFxcbiAgICAgKiBTbmFwLlNldFxuICAgICBbIHByb3BlcnR5IF1cbiAgICAgKipcbiAgICAgKiBTZXQgY29uc3RydWN0b3IuXG4gICAgXFwqL1xuICAgIFNuYXAuU2V0ID0gU2V0O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLnNldFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBhbmQgZmlsbHMgaXQgd2l0aCBsaXN0IG9mIGFyZ3VtZW50cy5cbiAgICAgKipcbiAgICAgPSAob2JqZWN0KSBOZXcgU2V0IG9iamVjdFxuICAgICB8IHZhciByID0gcGFwZXIucmVjdCgwLCAwLCAxMCwgMTApLFxuICAgICB8ICAgICBzMSA9IFNuYXAuc2V0KCksIC8vIGVtcHR5IHNldFxuICAgICB8ICAgICBzMiA9IFNuYXAuc2V0KHIsIHBhcGVyLmNpcmNsZSgxMDAsIDEwMCwgMjApKTsgLy8gcHJlZmlsbGVkIHNldFxuICAgIFxcKi9cbiAgICBTbmFwLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNldCA9IG5ldyBTZXQ7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXQucHVzaC5hcHBseShzZXQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IpIHtcbiAgICB2YXIgbmFtZXMgPSB7fSxcbiAgICAgICAgcmVVbml0ID0gL1slYS16XSskL2ksXG4gICAgICAgIFN0ciA9IFN0cmluZztcbiAgICBuYW1lcy5zdHJva2UgPSBuYW1lcy5maWxsID0gXCJjb2xvdXJcIjtcbiAgICBmdW5jdGlvbiBnZXRFbXB0eShpdGVtKSB7XG4gICAgICAgIHZhciBsID0gaXRlbVswXTtcbiAgICAgICAgc3dpdGNoIChsLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0XCI6IHJldHVybiBbbCwgMCwgMF07XG4gICAgICAgICAgICBjYXNlIFwibVwiOiByZXR1cm4gW2wsIDEsIDAsIDAsIDEsIDAsIDBdO1xuICAgICAgICAgICAgY2FzZSBcInJcIjogaWYgKGl0ZW0ubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2wsIDAsIGl0ZW1bMl0sIGl0ZW1bM11dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2wsIDBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNcIjogaWYgKGl0ZW0ubGVuZ3RoID09IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2wsIDEsIDEsIGl0ZW1bM10sIGl0ZW1bNF1dO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmxlbmd0aCA9PSAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtsLCAxLCAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtsLCAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlcXVhbGlzZVRyYW5zZm9ybSh0MSwgdDIsIGdldEJCb3gpIHtcbiAgICAgICAgdDEgPSB0MSB8fCBuZXcgU25hcC5NYXRyaXg7XG4gICAgICAgIHQyID0gdDIgfHwgbmV3IFNuYXAuTWF0cml4O1xuICAgICAgICB0MSA9IFNuYXAucGFyc2VUcmFuc2Zvcm1TdHJpbmcodDEudG9UcmFuc2Zvcm1TdHJpbmcoKSkgfHwgW107XG4gICAgICAgIHQyID0gU25hcC5wYXJzZVRyYW5zZm9ybVN0cmluZyh0Mi50b1RyYW5zZm9ybVN0cmluZygpKSB8fCBbXTtcbiAgICAgICAgdmFyIG1heGxlbmd0aCA9IE1hdGgubWF4KHQxLmxlbmd0aCwgdDIubGVuZ3RoKSxcbiAgICAgICAgICAgIGZyb20gPSBbXSxcbiAgICAgICAgICAgIHRvID0gW10sXG4gICAgICAgICAgICBpID0gMCwgaiwgamosXG4gICAgICAgICAgICB0dDEsIHR0MjtcbiAgICAgICAgZm9yICg7IGkgPCBtYXhsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHQxID0gdDFbaV0gfHwgZ2V0RW1wdHkodDJbaV0pO1xuICAgICAgICAgICAgdHQyID0gdDJbaV0gfHwgZ2V0RW1wdHkodHQxKTtcbiAgICAgICAgICAgIGlmICh0dDFbMF0gIT0gdHQyWzBdIHx8XG4gICAgICAgICAgICAgICAgdHQxWzBdLnRvTG93ZXJDYXNlKCkgPT0gXCJyXCIgJiYgKHR0MVsyXSAhPSB0dDJbMl0gfHwgdHQxWzNdICE9IHR0MlszXSkgfHxcbiAgICAgICAgICAgICAgICB0dDFbMF0udG9Mb3dlckNhc2UoKSA9PSBcInNcIiAmJiAodHQxWzNdICE9IHR0MlszXSB8fCB0dDFbNF0gIT0gdHQyWzRdKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0MSA9IFNuYXAuXy50cmFuc2Zvcm0ybWF0cml4KHQxLCBnZXRCQm94KCkpO1xuICAgICAgICAgICAgICAgICAgICB0MiA9IFNuYXAuXy50cmFuc2Zvcm0ybWF0cml4KHQyLCBnZXRCQm94KCkpO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gW1tcIm1cIiwgdDEuYSwgdDEuYiwgdDEuYywgdDEuZCwgdDEuZSwgdDEuZl1dO1xuICAgICAgICAgICAgICAgICAgICB0byA9IFtbXCJtXCIsIHQyLmEsIHQyLmIsIHQyLmMsIHQyLmQsIHQyLmUsIHQyLmZdXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tW2ldID0gW107XG4gICAgICAgICAgICB0b1tpXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChqID0gMCwgamogPSBNYXRoLm1heCh0dDEubGVuZ3RoLCB0dDIubGVuZ3RoKTsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgICBqIGluIHR0MSAmJiAoZnJvbVtpXVtqXSA9IHR0MVtqXSk7XG4gICAgICAgICAgICAgICAgaiBpbiB0dDIgJiYgKHRvW2ldW2pdID0gdHQyW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnJvbTogcGF0aDJhcnJheShmcm9tKSxcbiAgICAgICAgICAgIHRvOiBwYXRoMmFycmF5KHRvKSxcbiAgICAgICAgICAgIGY6IGdldFBhdGgoZnJvbSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TnVtYmVyKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRVbml0KHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiArdmFsLnRvRml4ZWQoMykgKyB1bml0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRWaWV3Qm94KHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb2xvdXIoY2xyKSB7XG4gICAgICAgIHJldHVybiBTbmFwLnJnYihjbHJbMF0sIGNsclsxXSwgY2xyWzJdLCBjbHJbM10pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRQYXRoKHBhdGgpIHtcbiAgICAgICAgdmFyIGsgPSAwLCBpLCBpaSwgaiwgamosIG91dCwgYSwgYiA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBhdGgubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgb3V0ID0gXCJbXCI7XG4gICAgICAgICAgICBhID0gWydcIicgKyBwYXRoW2ldWzBdICsgJ1wiJ107XG4gICAgICAgICAgICBmb3IgKGogPSAxLCBqaiA9IHBhdGhbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIGFbal0gPSBcInZhbFtcIiArIGsrKyArIFwiXVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9IGEgKyBcIl1cIjtcbiAgICAgICAgICAgIGJbaV0gPSBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwidmFsXCIsIFwicmV0dXJuIFNuYXAucGF0aC50b1N0cmluZy5jYWxsKFtcIiArIGIgKyBcIl0pXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXRoMmFycmF5KHBhdGgpIHtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxLCBqaiA9IHBhdGhbaV0ubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICAgIG91dC5wdXNoKHBhdGhbaV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzTnVtZXJpYyhvYmopIHtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG9iaik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICAgICAgICBpZiAoIVNuYXAuaXMoYXJyMSwgXCJhcnJheVwiKSB8fCAhU25hcC5pcyhhcnIyLCBcImFycmF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjEudG9TdHJpbmcoKSA9PSBhcnIyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmVxdWFsID0gZnVuY3Rpb24gKG5hbWUsIGIpIHtcbiAgICAgICAgcmV0dXJuIGV2ZShcInNuYXAudXRpbC5lcXVhbFwiLCB0aGlzLCBuYW1lLCBiKS5maXJzdERlZmluZWQoKTtcbiAgICB9O1xuICAgIGV2ZS5vbihcInNuYXAudXRpbC5lcXVhbFwiLCBmdW5jdGlvbiAobmFtZSwgYikge1xuICAgICAgICB2YXIgQSwgQiwgYSA9IFN0cih0aGlzLmF0dHIobmFtZSkgfHwgXCJcIiksXG4gICAgICAgICAgICBlbCA9IHRoaXM7XG4gICAgICAgIGlmIChuYW1lc1tuYW1lXSA9PSBcImNvbG91clwiKSB7XG4gICAgICAgICAgICBBID0gU25hcC5jb2xvcihhKTtcbiAgICAgICAgICAgIEIgPSBTbmFwLmNvbG9yKGIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBbQS5yLCBBLmcsIEEuYiwgQS5vcGFjaXR5XSxcbiAgICAgICAgICAgICAgICB0bzogW0IuciwgQi5nLCBCLmIsIEIub3BhY2l0eV0sXG4gICAgICAgICAgICAgICAgZjogZ2V0Q29sb3VyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwidmlld0JveFwiKSB7XG4gICAgICAgICAgICBBID0gdGhpcy5hdHRyKG5hbWUpLnZiLnNwbGl0KFwiIFwiKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIEIgPSBiLnNwbGl0KFwiIFwiKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogQSxcbiAgICAgICAgICAgICAgICB0bzogQixcbiAgICAgICAgICAgICAgICBmOiBnZXRWaWV3Qm94XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwidHJhbnNmb3JtXCIgfHwgbmFtZSA9PSBcImdyYWRpZW50VHJhbnNmb3JtXCIgfHwgbmFtZSA9PSBcInBhdHRlcm5UcmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBiID0gU3RyKGIpLnJlcGxhY2UoL1xcLnszfXxcXHUyMDI2L2csIGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYSA9IHRoaXMubWF0cml4O1xuICAgICAgICAgICAgaWYgKCFTbmFwLl8ucmdUcmFuc2Zvcm0udGVzdChiKSkge1xuICAgICAgICAgICAgICAgIGIgPSBTbmFwLl8udHJhbnNmb3JtMm1hdHJpeChTbmFwLl8uc3ZnVHJhbnNmb3JtMnN0cmluZyhiKSwgdGhpcy5nZXRCQm94KCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiID0gU25hcC5fLnRyYW5zZm9ybTJtYXRyaXgoYiwgdGhpcy5nZXRCQm94KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVxdWFsaXNlVHJhbnNmb3JtKGEsIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwuZ2V0QkJveCgxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwiZFwiIHx8IG5hbWUgPT0gXCJwYXRoXCIpIHtcbiAgICAgICAgICAgIEEgPSBTbmFwLnBhdGgudG9DdWJpYyhhLCBiKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogcGF0aDJhcnJheShBWzBdKSxcbiAgICAgICAgICAgICAgICB0bzogcGF0aDJhcnJheShBWzFdKSxcbiAgICAgICAgICAgICAgICBmOiBnZXRQYXRoKEFbMF0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09IFwicG9pbnRzXCIpIHtcbiAgICAgICAgICAgIEEgPSBTdHIoYSkuc3BsaXQoU25hcC5fLnNlcGFyYXRvcik7XG4gICAgICAgICAgICBCID0gU3RyKGIpLnNwbGl0KFNuYXAuXy5zZXBhcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBBLFxuICAgICAgICAgICAgICAgIHRvOiBCLFxuICAgICAgICAgICAgICAgIGY6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIHZhbDsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1lcmljKGEpICYmIGlzTnVtZXJpYyhiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBwYXJzZUZsb2F0KGEpLFxuICAgICAgICAgICAgICAgIHRvOiBwYXJzZUZsb2F0KGIpLFxuICAgICAgICAgICAgICAgIGY6IGdldE51bWJlclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYVVuaXQgPSBhLm1hdGNoKHJlVW5pdCksXG4gICAgICAgICAgICBiVW5pdCA9IFN0cihiKS5tYXRjaChyZVVuaXQpO1xuICAgICAgICBpZiAoYVVuaXQgJiYgYXJyYXlFcXVhbChhVW5pdCwgYlVuaXQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZyb206IHBhcnNlRmxvYXQoYSksXG4gICAgICAgICAgICAgICAgdG86IHBhcnNlRmxvYXQoYiksXG4gICAgICAgICAgICAgICAgZjogZ2V0VW5pdChhVW5pdClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZyb206IHRoaXMuYXNQWChuYW1lKSxcbiAgICAgICAgICAgICAgICB0bzogdGhpcy5hc1BYKG5hbWUsIGIpLFxuICAgICAgICAgICAgICAgIGY6IGdldE51bWJlclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbi8vIENvcHlyaWdodCAoYykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIFxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy8gXG4vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vIFxuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblNuYXAucGx1Z2luKGZ1bmN0aW9uIChTbmFwLCBFbGVtZW50LCBQYXBlciwgZ2xvYikge1xuICAgIHZhciBlbHByb3RvID0gRWxlbWVudC5wcm90b3R5cGUsXG4gICAgaGFzID0gXCJoYXNPd25Qcm9wZXJ0eVwiLFxuICAgIHN1cHBvcnRzVG91Y2ggPSBcImNyZWF0ZVRvdWNoXCIgaW4gZ2xvYi5kb2MsXG4gICAgZXZlbnRzID0gW1xuICAgICAgICBcImNsaWNrXCIsIFwiZGJsY2xpY2tcIiwgXCJtb3VzZWRvd25cIiwgXCJtb3VzZW1vdmVcIiwgXCJtb3VzZW91dFwiLFxuICAgICAgICBcIm1vdXNlb3ZlclwiLCBcIm1vdXNldXBcIiwgXCJ0b3VjaHN0YXJ0XCIsIFwidG91Y2htb3ZlXCIsIFwidG91Y2hlbmRcIixcbiAgICAgICAgXCJ0b3VjaGNhbmNlbFwiXG4gICAgXSxcbiAgICB0b3VjaE1hcCA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBcInRvdWNoc3RhcnRcIixcbiAgICAgICAgbW91c2Vtb3ZlOiBcInRvdWNobW92ZVwiLFxuICAgICAgICBtb3VzZXVwOiBcInRvdWNoZW5kXCJcbiAgICB9LFxuICAgIGdldFNjcm9sbCA9IGZ1bmN0aW9uICh4eSwgZWwpIHtcbiAgICAgICAgdmFyIG5hbWUgPSB4eSA9PSBcInlcIiA/IFwic2Nyb2xsVG9wXCIgOiBcInNjcm9sbExlZnRcIixcbiAgICAgICAgICAgIGRvYyA9IGVsICYmIGVsLm5vZGUgPyBlbC5ub2RlLm93bmVyRG9jdW1lbnQgOiBnbG9iLmRvYztcbiAgICAgICAgcmV0dXJuIGRvY1tuYW1lIGluIGRvYy5kb2N1bWVudEVsZW1lbnQgPyBcImRvY3VtZW50RWxlbWVudFwiIDogXCJib2R5XCJdW25hbWVdO1xuICAgIH0sXG4gICAgcHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICB9LFxuICAgIHByZXZlbnRUb3VjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgfSxcbiAgICBzdG9wVG91Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBhZGRFdmVudCA9IGZ1bmN0aW9uIChvYmosIHR5cGUsIGZuLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciByZWFsTmFtZSA9IHN1cHBvcnRzVG91Y2ggJiYgdG91Y2hNYXBbdHlwZV0gPyB0b3VjaE1hcFt0eXBlXSA6IHR5cGUsXG4gICAgICAgICAgICBmID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsWSA9IGdldFNjcm9sbChcInlcIiwgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFggPSBnZXRTY3JvbGwoXCJ4XCIsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c1RvdWNoICYmIHRvdWNoTWFwW2hhc10odHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZS50YXJnZXRUb3VjaGVzICYmIGUudGFyZ2V0VG91Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzW2ldLnRhcmdldCA9PSBvYmogfHwgb2JqLmNvbnRhaW5zKGUudGFyZ2V0VG91Y2hlc1tpXS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZGUgPSBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnRhcmdldFRvdWNoZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5vcmlnaW5hbEV2ZW50ID0gb2xkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0ID0gcHJldmVudFRvdWNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uID0gc3RvcFRvdWNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4ID0gZS5jbGllbnRYICsgc2Nyb2xsWCxcbiAgICAgICAgICAgICAgICAgICAgeSA9IGUuY2xpZW50WSArIHNjcm9sbFk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuLmNhbGwoZWxlbWVudCwgZSwgeCwgeSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlICE9PSByZWFsTmFtZSkge1xuICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIocmVhbE5hbWUsIGYsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgIT09IHJlYWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihyZWFsTmFtZSwgZiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBkcmFnID0gW10sXG4gICAgZHJhZ01vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgeCA9IGUuY2xpZW50WCxcbiAgICAgICAgICAgIHkgPSBlLmNsaWVudFksXG4gICAgICAgICAgICBzY3JvbGxZID0gZ2V0U2Nyb2xsKFwieVwiKSxcbiAgICAgICAgICAgIHNjcm9sbFggPSBnZXRTY3JvbGwoXCJ4XCIpLFxuICAgICAgICAgICAgZHJhZ2ksXG4gICAgICAgICAgICBqID0gZHJhZy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICAgIGRyYWdpID0gZHJhZ1tqXTtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgdG91Y2g7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgICAgICAgICB0b3VjaCA9IGUudG91Y2hlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdWNoLmlkZW50aWZpZXIgPT0gZHJhZ2kuZWwuX2RyYWcuaWQgfHwgZHJhZ2kuZWwubm9kZS5jb250YWlucyh0b3VjaC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gdG91Y2guY2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0b3VjaC5jbGllbnRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGUub3JpZ2luYWxFdmVudCA/IGUub3JpZ2luYWxFdmVudCA6IGUpLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5vZGUgPSBkcmFnaS5lbC5ub2RlLFxuICAgICAgICAgICAgICAgIG8sXG4gICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgIGRpc3BsYXkgPSBub2RlLnN0eWxlLmRpc3BsYXk7XG4gICAgICAgICAgICAvLyBnbG9iLndpbi5vcGVyYSAmJiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICAvLyBub2RlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIC8vIG8gPSBkcmFnaS5lbC5wYXBlci5nZXRFbGVtZW50QnlQb2ludCh4LCB5KTtcbiAgICAgICAgICAgIC8vIG5vZGUuc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgICAgICAgICAvLyBnbG9iLndpbi5vcGVyYSAmJiAobmV4dCA/IHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCkgOiBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSkpO1xuICAgICAgICAgICAgLy8gbyAmJiBldmUoXCJzbmFwLmRyYWcub3Zlci5cIiArIGRyYWdpLmVsLmlkLCBkcmFnaS5lbCwgbyk7XG4gICAgICAgICAgICB4ICs9IHNjcm9sbFg7XG4gICAgICAgICAgICB5ICs9IHNjcm9sbFk7XG4gICAgICAgICAgICBldmUoXCJzbmFwLmRyYWcubW92ZS5cIiArIGRyYWdpLmVsLmlkLCBkcmFnaS5tb3ZlX3Njb3BlIHx8IGRyYWdpLmVsLCB4IC0gZHJhZ2kuZWwuX2RyYWcueCwgeSAtIGRyYWdpLmVsLl9kcmFnLnksIHgsIHksIGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkcmFnVXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBTbmFwLnVubW91c2Vtb3ZlKGRyYWdNb3ZlKS51bm1vdXNldXAoZHJhZ1VwKTtcbiAgICAgICAgdmFyIGkgPSBkcmFnLmxlbmd0aCxcbiAgICAgICAgICAgIGRyYWdpO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBkcmFnaSA9IGRyYWdbaV07XG4gICAgICAgICAgICBkcmFnaS5lbC5fZHJhZyA9IHt9O1xuICAgICAgICAgICAgZXZlKFwic25hcC5kcmFnLmVuZC5cIiArIGRyYWdpLmVsLmlkLCBkcmFnaS5lbmRfc2NvcGUgfHwgZHJhZ2kuc3RhcnRfc2NvcGUgfHwgZHJhZ2kubW92ZV9zY29wZSB8fCBkcmFnaS5lbCwgZSk7XG4gICAgICAgICAgICBldmUub2ZmKFwic25hcC5kcmFnLiouXCIgKyBkcmFnaS5lbC5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZHJhZyA9IFtdO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuY2xpY2tcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFkZHMgYSBjbGljayBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVuY2xpY2tcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgYSBjbGljayBldmVudCBoYW5kbGVyIGZyb20gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuZGJsY2xpY2tcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFkZHMgYSBkb3VibGUgY2xpY2sgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC51bmRibGNsaWNrXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgZG91YmxlIGNsaWNrIGV2ZW50IGhhbmRsZXIgZnJvbSB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICBcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5tb3VzZWRvd25cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFkZHMgYSBtb3VzZWRvd24gZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC51bm1vdXNlZG93blxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyBhIG1vdXNlZG93biBldmVudCBoYW5kbGVyIGZyb20gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQubW91c2Vtb3ZlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgbW91c2Vtb3ZlIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudW5tb3VzZW1vdmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgYSBtb3VzZW1vdmUgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIFxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50Lm1vdXNlb3V0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgbW91c2VvdXQgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC51bm1vdXNlb3V0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgbW91c2VvdXQgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIFxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50Lm1vdXNlb3ZlclxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogQWRkcyBhIG1vdXNlb3ZlciBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVubW91c2VvdmVyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgbW91c2VvdmVyIGV2ZW50IGhhbmRsZXIgZnJvbSB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICBcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5tb3VzZXVwXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgbW91c2V1cCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVubW91c2V1cFxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyBhIG1vdXNldXAgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIFxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnRvdWNoc3RhcnRcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFkZHMgYSB0b3VjaHN0YXJ0IGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudW50b3VjaHN0YXJ0XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgdG91Y2hzdGFydCBldmVudCBoYW5kbGVyIGZyb20gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudG91Y2htb3ZlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgdG91Y2htb3ZlIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnRcbiAgICAgLSBoYW5kbGVyIChmdW5jdGlvbikgaGFuZGxlciBmb3IgdGhlIGV2ZW50XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQudW50b3VjaG1vdmVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgYSB0b3VjaG1vdmUgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIFxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnRvdWNoZW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgdG91Y2hlbmQgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC51bnRvdWNoZW5kXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgdG91Y2hlbmQgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIFxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnRvdWNoY2FuY2VsXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGEgdG91Y2hjYW5jZWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxuICAgICAtIGhhbmRsZXIgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciB0aGUgZXZlbnRcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgIFxcKi9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC51bnRvdWNoY2FuY2VsXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZW1vdmVzIGEgdG91Y2hjYW5jZWwgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50XG4gICAgIC0gaGFuZGxlciAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIHRoZSBldmVudFxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIGZvciAodmFyIGkgPSBldmVudHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBTbmFwW2V2ZW50TmFtZV0gPSBlbHByb3RvW2V2ZW50TmFtZV0gPSBmdW5jdGlvbiAoZm4sIHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFNuYXAuaXMoZm4sIFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmOiBmbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYmluZDogYWRkRXZlbnQodGhpcy5ub2RlIHx8IGRvY3VtZW50LCBldmVudE5hbWUsIGZuLCBzY29wZSB8fCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmV2ZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSBpZiAodGhpcy5ldmVudHNbaV0ubmFtZSA9PSBldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbaV0uZi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBTbmFwW1widW5cIiArIGV2ZW50TmFtZV0gPVxuICAgICAgICAgICAgZWxwcm90b1tcInVuXCIgKyBldmVudE5hbWVdID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZXZlbnRzIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICBsID0gZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSBpZiAoZXZlbnRzW2xdLm5hbWUgPT0gZXZlbnROYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50c1tsXS5mID09IGZuIHx8ICFmbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzW2xdLnVuYmluZCgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKGwsIDEpO1xuICAgICAgICAgICAgICAgICAgICAhZXZlbnRzLmxlbmd0aCAmJiBkZWxldGUgdGhpcy5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKGV2ZW50c1tpXSk7XG4gICAgfVxuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LmhvdmVyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGhvdmVyIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSBlbGVtZW50XG4gICAgIC0gZl9pbiAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIGhvdmVyIGluXG4gICAgIC0gZl9vdXQgKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciBob3ZlciBvdXRcbiAgICAgLSBpY29udGV4dCAob2JqZWN0KSAjb3B0aW9uYWwgY29udGV4dCBmb3IgaG92ZXIgaW4gaGFuZGxlclxuICAgICAtIG9jb250ZXh0IChvYmplY3QpICNvcHRpb25hbCBjb250ZXh0IGZvciBob3ZlciBvdXQgaGFuZGxlclxuICAgICA9IChvYmplY3QpIEBFbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8uaG92ZXIgPSBmdW5jdGlvbiAoZl9pbiwgZl9vdXQsIHNjb3BlX2luLCBzY29wZV9vdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW91c2VvdmVyKGZfaW4sIHNjb3BlX2luKS5tb3VzZW91dChmX291dCwgc2NvcGVfb3V0IHx8IHNjb3BlX2luKTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVuaG92ZXJcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJlbW92ZXMgaG92ZXIgZXZlbnQgaGFuZGxlcnMgZnJvbSB0aGUgZWxlbWVudFxuICAgICAtIGZfaW4gKGZ1bmN0aW9uKSBoYW5kbGVyIGZvciBob3ZlciBpblxuICAgICAtIGZfb3V0IChmdW5jdGlvbikgaGFuZGxlciBmb3IgaG92ZXIgb3V0XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by51bmhvdmVyID0gZnVuY3Rpb24gKGZfaW4sIGZfb3V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVubW91c2VvdmVyKGZfaW4pLnVubW91c2VvdXQoZl9vdXQpO1xuICAgIH07XG4gICAgdmFyIGRyYWdnYWJsZSA9IFtdO1xuICAgIC8vIFNJRVJSQSB1bmNsZWFyIHdoYXQgX2NvbnRleHRfIHJlZmVycyB0byBmb3Igc3RhcnRpbmcsIGVuZGluZywgbW92aW5nIHRoZSBkcmFnIGdlc3R1cmUuXG4gICAgLy8gU0lFUlJBIEVsZW1lbnQuZHJhZygpOiBfeCBwb3NpdGlvbiBvZiB0aGUgbW91c2VfOiBXaGVyZSBhcmUgdGhlIHgveSB2YWx1ZXMgb2Zmc2V0IGZyb20/XG4gICAgLy8gU0lFUlJBIEVsZW1lbnQuZHJhZygpOiBtdWNoIG9mIHRoaXMgbWVtYmVyJ3MgZG9jIGFwcGVhcnMgdG8gYmUgZHVwbGljYXRlZCBmb3Igc29tZSByZWFzb24uXG4gICAgLy8gU0lFUlJBIFVuY2xlYXIgYWJvdXQgdGhpcyBzZW50ZW5jZTogX0FkZGl0aW9uYWxseSBmb2xsb3dpbmcgZHJhZyBldmVudHMgd2lsbCBiZSB0cmlnZ2VyZWQ6IGRyYWcuc3RhcnQuPGlkPiBvbiBzdGFydCwgZHJhZy5lbmQuPGlkPiBvbiBlbmQgYW5kIGRyYWcubW92ZS48aWQ+IG9uIGV2ZXJ5IG1vdmUuXyBJcyB0aGVyZSBhIGdsb2JhbCBfZHJhZ18gb2JqZWN0IHRvIHdoaWNoIHlvdSBjYW4gYXNzaWduIGhhbmRsZXJzIGtleWVkIGJ5IGFuIGVsZW1lbnQncyBJRD9cbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5kcmFnXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIGZvciBhbiBlbGVtZW50J3MgZHJhZyBnZXN0dXJlXG4gICAgICoqXG4gICAgIC0gb25tb3ZlIChmdW5jdGlvbikgaGFuZGxlciBmb3IgbW92aW5nXG4gICAgIC0gb25zdGFydCAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIGRyYWcgc3RhcnRcbiAgICAgLSBvbmVuZCAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIGRyYWcgZW5kXG4gICAgIC0gbWNvbnRleHQgKG9iamVjdCkgI29wdGlvbmFsIGNvbnRleHQgZm9yIG1vdmluZyBoYW5kbGVyXG4gICAgIC0gc2NvbnRleHQgKG9iamVjdCkgI29wdGlvbmFsIGNvbnRleHQgZm9yIGRyYWcgc3RhcnQgaGFuZGxlclxuICAgICAtIGVjb250ZXh0IChvYmplY3QpICNvcHRpb25hbCBjb250ZXh0IGZvciBkcmFnIGVuZCBoYW5kbGVyXG4gICAgICogQWRkaXRpb25hbHkgZm9sbG93aW5nIGBkcmFnYCBldmVudHMgYXJlIHRyaWdnZXJlZDogYGRyYWcuc3RhcnQuPGlkPmAgb24gc3RhcnQsIFxuICAgICAqIGBkcmFnLmVuZC48aWQ+YCBvbiBlbmQgYW5kIGBkcmFnLm1vdmUuPGlkPmAgb24gZXZlcnkgbW92ZS4gV2hlbiBlbGVtZW50IGlzIGRyYWdnZWQgb3ZlciBhbm90aGVyIGVsZW1lbnQgXG4gICAgICogYGRyYWcub3Zlci48aWQ+YCBmaXJlcyBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogU3RhcnQgZXZlbnQgYW5kIHN0YXJ0IGhhbmRsZXIgYXJlIGNhbGxlZCBpbiBzcGVjaWZpZWQgY29udGV4dCBvciBpbiBjb250ZXh0IG9mIHRoZSBlbGVtZW50IHdpdGggZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gICAgIG8geCAobnVtYmVyKSB4IHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICBvIHkgKG51bWJlcikgeSBwb3NpdGlvbiBvZiB0aGUgbW91c2VcbiAgICAgbyBldmVudCAob2JqZWN0KSBET00gZXZlbnQgb2JqZWN0XG4gICAgICogTW92ZSBldmVudCBhbmQgbW92ZSBoYW5kbGVyIGFyZSBjYWxsZWQgaW4gc3BlY2lmaWVkIGNvbnRleHQgb3IgaW4gY29udGV4dCBvZiB0aGUgZWxlbWVudCB3aXRoIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICAgICBvIGR4IChudW1iZXIpIHNoaWZ0IGJ5IHggZnJvbSB0aGUgc3RhcnQgcG9pbnRcbiAgICAgbyBkeSAobnVtYmVyKSBzaGlmdCBieSB5IGZyb20gdGhlIHN0YXJ0IHBvaW50XG4gICAgIG8geCAobnVtYmVyKSB4IHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICBvIHkgKG51bWJlcikgeSBwb3NpdGlvbiBvZiB0aGUgbW91c2VcbiAgICAgbyBldmVudCAob2JqZWN0KSBET00gZXZlbnQgb2JqZWN0XG4gICAgICogRW5kIGV2ZW50IGFuZCBlbmQgaGFuZGxlciBhcmUgY2FsbGVkIGluIHNwZWNpZmllZCBjb250ZXh0IG9yIGluIGNvbnRleHQgb2YgdGhlIGVsZW1lbnQgd2l0aCBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICAgbyBldmVudCAob2JqZWN0KSBET00gZXZlbnQgb2JqZWN0XG4gICAgID0gKG9iamVjdCkgQEVsZW1lbnRcbiAgICBcXCovXG4gICAgZWxwcm90by5kcmFnID0gZnVuY3Rpb24gKG9ubW92ZSwgb25zdGFydCwgb25lbmQsIG1vdmVfc2NvcGUsIHN0YXJ0X3Njb3BlLCBlbmRfc2NvcGUpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcztcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ1RyYW5zZm9ybTtcbiAgICAgICAgICAgIHJldHVybiBlbC5kcmFnKGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IG9yaWdUcmFuc2Zvcm0gKyAob3JpZ1RyYW5zZm9ybSA/IFwiVFwiIDogXCJ0XCIpICsgW2R4LCBkeV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBvcmlnVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0oKS5sb2NhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0KGUsIHgsIHkpIHtcbiAgICAgICAgICAgIChlLm9yaWdpbmFsRXZlbnQgfHwgZSkucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGVsLl9kcmFnLnggPSB4O1xuICAgICAgICAgICAgZWwuX2RyYWcueSA9IHk7XG4gICAgICAgICAgICBlbC5fZHJhZy5pZCA9IGUuaWRlbnRpZmllcjtcbiAgICAgICAgICAgICFkcmFnLmxlbmd0aCAmJiBTbmFwLm1vdXNlbW92ZShkcmFnTW92ZSkubW91c2V1cChkcmFnVXApO1xuICAgICAgICAgICAgZHJhZy5wdXNoKHtlbDogZWwsIG1vdmVfc2NvcGU6IG1vdmVfc2NvcGUsIHN0YXJ0X3Njb3BlOiBzdGFydF9zY29wZSwgZW5kX3Njb3BlOiBlbmRfc2NvcGV9KTtcbiAgICAgICAgICAgIG9uc3RhcnQgJiYgZXZlLm9uKFwic25hcC5kcmFnLnN0YXJ0LlwiICsgZWwuaWQsIG9uc3RhcnQpO1xuICAgICAgICAgICAgb25tb3ZlICYmIGV2ZS5vbihcInNuYXAuZHJhZy5tb3ZlLlwiICsgZWwuaWQsIG9ubW92ZSk7XG4gICAgICAgICAgICBvbmVuZCAmJiBldmUub24oXCJzbmFwLmRyYWcuZW5kLlwiICsgZWwuaWQsIG9uZW5kKTtcbiAgICAgICAgICAgIGV2ZShcInNuYXAuZHJhZy5zdGFydC5cIiArIGVsLmlkLCBzdGFydF9zY29wZSB8fCBtb3ZlX3Njb3BlIHx8IGVsLCB4LCB5LCBlKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbml0KGUsIHgsIHkpIHtcbiAgICAgICAgICAgIGV2ZShcInNuYXAuZHJhZ2luaXQuXCIgKyBlbC5pZCwgZWwsIGUsIHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZS5vbihcInNuYXAuZHJhZ2luaXQuXCIgKyBlbC5pZCwgc3RhcnQpO1xuICAgICAgICBlbC5fZHJhZyA9IHt9O1xuICAgICAgICBkcmFnZ2FibGUucHVzaCh7ZWw6IGVsLCBzdGFydDogc3RhcnQsIGluaXQ6IGluaXR9KTtcbiAgICAgICAgZWwubW91c2Vkb3duKGluaXQpO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIEVsZW1lbnQub25EcmFnT3ZlclxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogU2hvcnRjdXQgdG8gYXNzaWduIGV2ZW50IGhhbmRsZXIgZm9yIGBkcmFnLm92ZXIuPGlkPmAgZXZlbnQsIHdoZXJlIGBpZGAgaXMgdGhlIGVsZW1lbnQncyBgaWRgIChzZWUgQEVsZW1lbnQuaWQpXG4gICAgIC0gZiAoZnVuY3Rpb24pIGhhbmRsZXIgZm9yIGV2ZW50LCBmaXJzdCBhcmd1bWVudCB3b3VsZCBiZSB0aGUgZWxlbWVudCB5b3UgYXJlIGRyYWdnaW5nIG92ZXJcbiAgICBcXCovXG4gICAgLy8gZWxwcm90by5vbkRyYWdPdmVyID0gZnVuY3Rpb24gKGYpIHtcbiAgICAvLyAgICAgZiA/IGV2ZS5vbihcInNuYXAuZHJhZy5vdmVyLlwiICsgdGhpcy5pZCwgZikgOiBldmUudW5iaW5kKFwic25hcC5kcmFnLm92ZXIuXCIgKyB0aGlzLmlkKTtcbiAgICAvLyB9O1xuICAgIC8qXFxcbiAgICAgKiBFbGVtZW50LnVuZHJhZ1xuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmVtb3ZlcyBhbGwgZHJhZyBldmVudCBoYW5kbGVycyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgXFwqL1xuICAgIGVscHJvdG8udW5kcmFnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaSA9IGRyYWdnYWJsZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChpLS0pIGlmIChkcmFnZ2FibGVbaV0uZWwgPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy51bm1vdXNlZG93bihkcmFnZ2FibGVbaV0uaW5pdCk7XG4gICAgICAgICAgICBkcmFnZ2FibGUuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgZXZlLnVuYmluZChcInNuYXAuZHJhZy4qLlwiICsgdGhpcy5pZCk7XG4gICAgICAgICAgICBldmUudW5iaW5kKFwic25hcC5kcmFnaW5pdC5cIiArIHRoaXMuaWQpO1xuICAgICAgICB9XG4gICAgICAgICFkcmFnZ2FibGUubGVuZ3RoICYmIFNuYXAudW5tb3VzZW1vdmUoZHJhZ01vdmUpLnVubW91c2V1cChkcmFnVXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufSk7XG5cbi8vIENvcHlyaWdodCAoYykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblNuYXAucGx1Z2luKGZ1bmN0aW9uIChTbmFwLCBFbGVtZW50LCBQYXBlciwgZ2xvYikge1xuICAgIHZhciBlbHByb3RvID0gRWxlbWVudC5wcm90b3R5cGUsXG4gICAgICAgIHBwcm90byA9IFBhcGVyLnByb3RvdHlwZSxcbiAgICAgICAgcmd1cmwgPSAvXlxccyp1cmxcXCgoLispXFwpLyxcbiAgICAgICAgU3RyID0gU3RyaW5nLFxuICAgICAgICAkID0gU25hcC5fLiQ7XG4gICAgU25hcC5maWx0ZXIgPSB7fTtcbiAgICAvKlxcXG4gICAgICogUGFwZXIuZmlsdGVyXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBDcmVhdGVzIGEgYDxmaWx0ZXI+YCBlbGVtZW50XG4gICAgICoqXG4gICAgIC0gZmlsc3RyIChzdHJpbmcpIFNWRyBmcmFnbWVudCBvZiBmaWx0ZXIgcHJvdmlkZWQgYXMgYSBzdHJpbmdcbiAgICAgPSAob2JqZWN0KSBARWxlbWVudFxuICAgICAqIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBmaWx0ZXJzIGVtYmVkZGVkIGludG8gdGhlIHBhZ2UgaW5zaWRlIGFuIGVtcHR5IFNWRyBlbGVtZW50LlxuICAgICA+IFVzYWdlXG4gICAgIHwgdmFyIGYgPSBwYXBlci5maWx0ZXIoJzxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIyXCIvPicpLFxuICAgICB8ICAgICBjID0gcGFwZXIuY2lyY2xlKDEwLCAxMCwgMTApLmF0dHIoe1xuICAgICB8ICAgICAgICAgZmlsdGVyOiBmXG4gICAgIHwgICAgIH0pO1xuICAgIFxcKi9cbiAgICBwcHJvdG8uZmlsdGVyID0gZnVuY3Rpb24gKGZpbHN0cikge1xuICAgICAgICB2YXIgcGFwZXIgPSB0aGlzO1xuICAgICAgICBpZiAocGFwZXIudHlwZSAhPSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBwYXBlciA9IHBhcGVyLnBhcGVyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmID0gU25hcC5wYXJzZShTdHIoZmlsc3RyKSksXG4gICAgICAgICAgICBpZCA9IFNuYXAuXy5pZCgpLFxuICAgICAgICAgICAgd2lkdGggPSBwYXBlci5ub2RlLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0ID0gcGFwZXIubm9kZS5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgICBmaWx0ZXIgPSAkKFwiZmlsdGVyXCIpO1xuICAgICAgICAkKGZpbHRlciwge1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgZmlsdGVyVW5pdHM6IFwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgICB9KTtcbiAgICAgICAgZmlsdGVyLmFwcGVuZENoaWxkKGYubm9kZSk7XG4gICAgICAgIHBhcGVyLmRlZnMuYXBwZW5kQ2hpbGQoZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGZpbHRlcik7XG4gICAgfTtcblxuICAgIGV2ZS5vbihcInNuYXAudXRpbC5nZXRhdHRyLmZpbHRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV2ZS5zdG9wKCk7XG4gICAgICAgIHZhciBwID0gJCh0aGlzLm5vZGUsIFwiZmlsdGVyXCIpO1xuICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gU3RyKHApLm1hdGNoKHJndXJsKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBTbmFwLnNlbGVjdChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBldmUub24oXCJzbmFwLnV0aWwuYXR0ci5maWx0ZXJcIiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdmFsdWUudHlwZSA9PSBcImZpbHRlclwiKSB7XG4gICAgICAgICAgICBldmUuc3RvcCgpO1xuICAgICAgICAgICAgdmFyIGlkID0gdmFsdWUubm9kZS5pZDtcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICAkKHZhbHVlLm5vZGUsIHtpZDogdmFsdWUuaWR9KTtcbiAgICAgICAgICAgICAgICBpZCA9IHZhbHVlLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IFNuYXAudXJsKGlkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgZXZlLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVBdHRyaWJ1dGUoXCJmaWx0ZXJcIik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvKlxcXG4gICAgICogU25hcC5maWx0ZXIuYmx1clxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBhbiBTVkcgbWFya3VwIHN0cmluZyBmb3IgdGhlIGJsdXIgZmlsdGVyXG4gICAgICoqXG4gICAgIC0geCAobnVtYmVyKSBhbW91bnQgb2YgaG9yaXpvbnRhbCBibHVyLCBpbiBwaXhlbHNcbiAgICAgLSB5IChudW1iZXIpICNvcHRpb25hbCBhbW91bnQgb2YgdmVydGljYWwgYmx1ciwgaW4gcGl4ZWxzXG4gICAgID0gKHN0cmluZykgZmlsdGVyIHJlcHJlc2VudGF0aW9uXG4gICAgID4gVXNhZ2VcbiAgICAgfCB2YXIgZiA9IHBhcGVyLmZpbHRlcihTbmFwLmZpbHRlci5ibHVyKDUsIDEwKSksXG4gICAgIHwgICAgIGMgPSBwYXBlci5jaXJjbGUoMTAsIDEwLCAxMCkuYXR0cih7XG4gICAgIHwgICAgICAgICBmaWx0ZXI6IGZcbiAgICAgfCAgICAgfSk7XG4gICAgXFwqL1xuICAgIFNuYXAuZmlsdGVyLmJsdXIgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBpZiAoeCA9PSBudWxsKSB7XG4gICAgICAgICAgICB4ID0gMjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVmID0geSA9PSBudWxsID8geCA6IFt4LCB5XTtcbiAgICAgICAgcmV0dXJuIFNuYXAuZm9ybWF0KCdcXDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCJ7ZGVmfVwiLz4nLCB7XG4gICAgICAgICAgICBkZWY6IGRlZlxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNuYXAuZmlsdGVyLmJsdXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzKCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU25hcC5maWx0ZXIuc2hhZG93XG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGFuIFNWRyBtYXJrdXAgc3RyaW5nIGZvciB0aGUgc2hhZG93IGZpbHRlclxuICAgICAqKlxuICAgICAtIGR4IChudW1iZXIpICNvcHRpb25hbCBob3Jpem9udGFsIHNoaWZ0IG9mIHRoZSBzaGFkb3csIGluIHBpeGVsc1xuICAgICAtIGR5IChudW1iZXIpICNvcHRpb25hbCB2ZXJ0aWNhbCBzaGlmdCBvZiB0aGUgc2hhZG93LCBpbiBwaXhlbHNcbiAgICAgLSBibHVyIChudW1iZXIpICNvcHRpb25hbCBhbW91bnQgb2YgYmx1clxuICAgICAtIGNvbG9yIChzdHJpbmcpICNvcHRpb25hbCBjb2xvciBvZiB0aGUgc2hhZG93XG4gICAgIC0gb3BhY2l0eSAobnVtYmVyKSAjb3B0aW9uYWwgYDAuLjFgIG9wYWNpdHkgb2YgdGhlIHNoYWRvd1xuICAgICAqIG9yXG4gICAgIC0gZHggKG51bWJlcikgI29wdGlvbmFsIGhvcml6b250YWwgc2hpZnQgb2YgdGhlIHNoYWRvdywgaW4gcGl4ZWxzXG4gICAgIC0gZHkgKG51bWJlcikgI29wdGlvbmFsIHZlcnRpY2FsIHNoaWZ0IG9mIHRoZSBzaGFkb3csIGluIHBpeGVsc1xuICAgICAtIGNvbG9yIChzdHJpbmcpICNvcHRpb25hbCBjb2xvciBvZiB0aGUgc2hhZG93XG4gICAgIC0gb3BhY2l0eSAobnVtYmVyKSAjb3B0aW9uYWwgYDAuLjFgIG9wYWNpdHkgb2YgdGhlIHNoYWRvd1xuICAgICAqIHdoaWNoIG1ha2VzIGJsdXIgZGVmYXVsdCB0byBgNGAuIE9yXG4gICAgIC0gZHggKG51bWJlcikgI29wdGlvbmFsIGhvcml6b250YWwgc2hpZnQgb2YgdGhlIHNoYWRvdywgaW4gcGl4ZWxzXG4gICAgIC0gZHkgKG51bWJlcikgI29wdGlvbmFsIHZlcnRpY2FsIHNoaWZ0IG9mIHRoZSBzaGFkb3csIGluIHBpeGVsc1xuICAgICAtIG9wYWNpdHkgKG51bWJlcikgI29wdGlvbmFsIGAwLi4xYCBvcGFjaXR5IG9mIHRoZSBzaGFkb3dcbiAgICAgPSAoc3RyaW5nKSBmaWx0ZXIgcmVwcmVzZW50YXRpb25cbiAgICAgPiBVc2FnZVxuICAgICB8IHZhciBmID0gcGFwZXIuZmlsdGVyKFNuYXAuZmlsdGVyLnNoYWRvdygwLCAyLCAuMykpLFxuICAgICB8ICAgICBjID0gcGFwZXIuY2lyY2xlKDEwLCAxMCwgMTApLmF0dHIoe1xuICAgICB8ICAgICAgICAgZmlsdGVyOiBmXG4gICAgIHwgICAgIH0pO1xuICAgIFxcKi9cbiAgICBTbmFwLmZpbHRlci5zaGFkb3cgPSBmdW5jdGlvbiAoZHgsIGR5LCBibHVyLCBjb2xvciwgb3BhY2l0eSkge1xuICAgICAgICBpZiAob3BhY2l0eSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHkgPSBibHVyO1xuICAgICAgICAgICAgICAgIGJsdXIgPSA0O1xuICAgICAgICAgICAgICAgIGNvbG9yID0gXCIjMDAwXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wYWNpdHkgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICBjb2xvciA9IGJsdXI7XG4gICAgICAgICAgICAgICAgYmx1ciA9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsdXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYmx1ciA9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wYWNpdHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgb3BhY2l0eSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGR4ID0gMDtcbiAgICAgICAgICAgIGR5ID0gMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgZHkgPSBkeDtcbiAgICAgICAgfVxuICAgICAgICBjb2xvciA9IFNuYXAuY29sb3IoY29sb3IpO1xuICAgICAgICByZXR1cm4gU25hcC5mb3JtYXQoJzxmZUdhdXNzaWFuQmx1ciBpbj1cIlNvdXJjZUFscGhhXCIgc3RkRGV2aWF0aW9uPVwie2JsdXJ9XCIvPjxmZU9mZnNldCBkeD1cIntkeH1cIiBkeT1cIntkeX1cIiByZXN1bHQ9XCJvZmZzZXRibHVyXCIvPjxmZUZsb29kIGZsb29kLWNvbG9yPVwie2NvbG9yfVwiLz48ZmVDb21wb3NpdGUgaW4yPVwib2Zmc2V0Ymx1clwiIG9wZXJhdG9yPVwiaW5cIi8+PGZlQ29tcG9uZW50VHJhbnNmZXI+PGZlRnVuY0EgdHlwZT1cImxpbmVhclwiIHNsb3BlPVwie29wYWNpdHl9XCIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj48ZmVNZXJnZT48ZmVNZXJnZU5vZGUvPjxmZU1lcmdlTm9kZSBpbj1cIlNvdXJjZUdyYXBoaWNcIi8+PC9mZU1lcmdlPicsIHtcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgICAgICAgIGR4OiBkeCxcbiAgICAgICAgICAgIGR5OiBkeSxcbiAgICAgICAgICAgIGJsdXI6IGJsdXIsXG4gICAgICAgICAgICBvcGFjaXR5OiBvcGFjaXR5XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuc2hhZG93LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcygpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNuYXAuZmlsdGVyLmdyYXlzY2FsZVxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBhbiBTVkcgbWFya3VwIHN0cmluZyBmb3IgdGhlIGdyYXlzY2FsZSBmaWx0ZXJcbiAgICAgKipcbiAgICAgLSBhbW91bnQgKG51bWJlcikgYW1vdW50IG9mIGZpbHRlciAoYDAuLjFgKVxuICAgICA9IChzdHJpbmcpIGZpbHRlciByZXByZXNlbnRhdGlvblxuICAgIFxcKi9cbiAgICBTbmFwLmZpbHRlci5ncmF5c2NhbGUgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYW1vdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU25hcC5mb3JtYXQoJzxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCJ7YX0ge2J9IHtjfSAwIDAge2R9IHtlfSB7Zn0gMCAwIHtnfSB7Yn0ge2h9IDAgMCAwIDAgMCAxIDBcIi8+Jywge1xuICAgICAgICAgICAgYTogMC4yMTI2ICsgMC43ODc0ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgYjogMC43MTUyIC0gMC43MTUyICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgYzogMC4wNzIyIC0gMC4wNzIyICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZDogMC4yMTI2IC0gMC4yMTI2ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZTogMC43MTUyICsgMC4yODQ4ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZjogMC4wNzIyIC0gMC4wNzIyICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZzogMC4yMTI2IC0gMC4yMTI2ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgaDogMC4wNzIyICsgMC45Mjc4ICogKDEgLSBhbW91bnQpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuZ3JheXNjYWxlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcygpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNuYXAuZmlsdGVyLnNlcGlhXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGFuIFNWRyBtYXJrdXAgc3RyaW5nIGZvciB0aGUgc2VwaWEgZmlsdGVyXG4gICAgICoqXG4gICAgIC0gYW1vdW50IChudW1iZXIpIGFtb3VudCBvZiBmaWx0ZXIgKGAwLi4xYClcbiAgICAgPSAoc3RyaW5nKSBmaWx0ZXIgcmVwcmVzZW50YXRpb25cbiAgICBcXCovXG4gICAgU25hcC5maWx0ZXIuc2VwaWEgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYW1vdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU25hcC5mb3JtYXQoJzxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCJ7YX0ge2J9IHtjfSAwIDAge2R9IHtlfSB7Zn0gMCAwIHtnfSB7aH0ge2l9IDAgMCAwIDAgMCAxIDBcIi8+Jywge1xuICAgICAgICAgICAgYTogMC4zOTMgKyAwLjYwNyAqICgxIC0gYW1vdW50KSxcbiAgICAgICAgICAgIGI6IDAuNzY5IC0gMC43NjkgKiAoMSAtIGFtb3VudCksXG4gICAgICAgICAgICBjOiAwLjE4OSAtIDAuMTg5ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZDogMC4zNDkgLSAwLjM0OSAqICgxIC0gYW1vdW50KSxcbiAgICAgICAgICAgIGU6IDAuNjg2ICsgMC4zMTQgKiAoMSAtIGFtb3VudCksXG4gICAgICAgICAgICBmOiAwLjE2OCAtIDAuMTY4ICogKDEgLSBhbW91bnQpLFxuICAgICAgICAgICAgZzogMC4yNzIgLSAwLjI3MiAqICgxIC0gYW1vdW50KSxcbiAgICAgICAgICAgIGg6IDAuNTM0IC0gMC41MzQgKiAoMSAtIGFtb3VudCksXG4gICAgICAgICAgICBpOiAwLjEzMSArIDAuODY5ICogKDEgLSBhbW91bnQpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuc2VwaWEudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzKCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU25hcC5maWx0ZXIuc2F0dXJhdGVcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgYW4gU1ZHIG1hcmt1cCBzdHJpbmcgZm9yIHRoZSBzYXR1cmF0ZSBmaWx0ZXJcbiAgICAgKipcbiAgICAgLSBhbW91bnQgKG51bWJlcikgYW1vdW50IG9mIGZpbHRlciAoYDAuLjFgKVxuICAgICA9IChzdHJpbmcpIGZpbHRlciByZXByZXNlbnRhdGlvblxuICAgIFxcKi9cbiAgICBTbmFwLmZpbHRlci5zYXR1cmF0ZSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhbW91bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTbmFwLmZvcm1hdCgnPGZlQ29sb3JNYXRyaXggdHlwZT1cInNhdHVyYXRlXCIgdmFsdWVzPVwie2Ftb3VudH1cIi8+Jywge1xuICAgICAgICAgICAgYW1vdW50OiAxIC0gYW1vdW50XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuc2F0dXJhdGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzKCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU25hcC5maWx0ZXIuaHVlUm90YXRlXG4gICAgIFsgbWV0aG9kIF1cbiAgICAgKipcbiAgICAgKiBSZXR1cm5zIGFuIFNWRyBtYXJrdXAgc3RyaW5nIGZvciB0aGUgaHVlLXJvdGF0ZSBmaWx0ZXJcbiAgICAgKipcbiAgICAgLSBhbmdsZSAobnVtYmVyKSBhbmdsZSBvZiByb3RhdGlvblxuICAgICA9IChzdHJpbmcpIGZpbHRlciByZXByZXNlbnRhdGlvblxuICAgIFxcKi9cbiAgICBTbmFwLmZpbHRlci5odWVSb3RhdGUgPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICAgICAgYW5nbGUgPSBhbmdsZSB8fCAwO1xuICAgICAgICByZXR1cm4gU25hcC5mb3JtYXQoJzxmZUNvbG9yTWF0cml4IHR5cGU9XCJodWVSb3RhdGVcIiB2YWx1ZXM9XCJ7YW5nbGV9XCIvPicsIHtcbiAgICAgICAgICAgIGFuZ2xlOiBhbmdsZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNuYXAuZmlsdGVyLmh1ZVJvdGF0ZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMoKTtcbiAgICB9O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLmZpbHRlci5pbnZlcnRcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgYW4gU1ZHIG1hcmt1cCBzdHJpbmcgZm9yIHRoZSBpbnZlcnQgZmlsdGVyXG4gICAgICoqXG4gICAgIC0gYW1vdW50IChudW1iZXIpIGFtb3VudCBvZiBmaWx0ZXIgKGAwLi4xYClcbiAgICAgPSAoc3RyaW5nKSBmaWx0ZXIgcmVwcmVzZW50YXRpb25cbiAgICBcXCovXG4gICAgU25hcC5maWx0ZXIuaW52ZXJ0ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGFtb3VudCA9IDE7XG4gICAgICAgIH1cbi8vICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiLTEgMCAwIDAgMSAgMCAtMSAwIDAgMSAgMCAwIC0xIDAgMSAgMCAwIDAgMSAwXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiLz5cbiAgICAgICAgcmV0dXJuIFNuYXAuZm9ybWF0KCc8ZmVDb21wb25lbnRUcmFuc2Zlcj48ZmVGdW5jUiB0eXBlPVwidGFibGVcIiB0YWJsZVZhbHVlcz1cInthbW91bnR9IHthbW91bnQyfVwiLz48ZmVGdW5jRyB0eXBlPVwidGFibGVcIiB0YWJsZVZhbHVlcz1cInthbW91bnR9IHthbW91bnQyfVwiLz48ZmVGdW5jQiB0eXBlPVwidGFibGVcIiB0YWJsZVZhbHVlcz1cInthbW91bnR9IHthbW91bnQyfVwiLz48L2ZlQ29tcG9uZW50VHJhbnNmZXI+Jywge1xuICAgICAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgICAgICBhbW91bnQyOiAxIC0gYW1vdW50XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuaW52ZXJ0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcygpO1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIFNuYXAuZmlsdGVyLmJyaWdodG5lc3NcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgYW4gU1ZHIG1hcmt1cCBzdHJpbmcgZm9yIHRoZSBicmlnaHRuZXNzIGZpbHRlclxuICAgICAqKlxuICAgICAtIGFtb3VudCAobnVtYmVyKSBhbW91bnQgb2YgZmlsdGVyIChgMC4uMWApXG4gICAgID0gKHN0cmluZykgZmlsdGVyIHJlcHJlc2VudGF0aW9uXG4gICAgXFwqL1xuICAgIFNuYXAuZmlsdGVyLmJyaWdodG5lc3MgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYW1vdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU25hcC5mb3JtYXQoJzxmZUNvbXBvbmVudFRyYW5zZmVyPjxmZUZ1bmNSIHR5cGU9XCJsaW5lYXJcIiBzbG9wZT1cInthbW91bnR9XCIvPjxmZUZ1bmNHIHR5cGU9XCJsaW5lYXJcIiBzbG9wZT1cInthbW91bnR9XCIvPjxmZUZ1bmNCIHR5cGU9XCJsaW5lYXJcIiBzbG9wZT1cInthbW91bnR9XCIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj4nLCB7XG4gICAgICAgICAgICBhbW91bnQ6IGFtb3VudFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNuYXAuZmlsdGVyLmJyaWdodG5lc3MudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzKCk7XG4gICAgfTtcbiAgICAvKlxcXG4gICAgICogU25hcC5maWx0ZXIuY29udHJhc3RcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIFJldHVybnMgYW4gU1ZHIG1hcmt1cCBzdHJpbmcgZm9yIHRoZSBjb250cmFzdCBmaWx0ZXJcbiAgICAgKipcbiAgICAgLSBhbW91bnQgKG51bWJlcikgYW1vdW50IG9mIGZpbHRlciAoYDAuLjFgKVxuICAgICA9IChzdHJpbmcpIGZpbHRlciByZXByZXNlbnRhdGlvblxuICAgIFxcKi9cbiAgICBTbmFwLmZpbHRlci5jb250cmFzdCA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhbW91bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTbmFwLmZvcm1hdCgnPGZlQ29tcG9uZW50VHJhbnNmZXI+PGZlRnVuY1IgdHlwZT1cImxpbmVhclwiIHNsb3BlPVwie2Ftb3VudH1cIiBpbnRlcmNlcHQ9XCJ7YW1vdW50Mn1cIi8+PGZlRnVuY0cgdHlwZT1cImxpbmVhclwiIHNsb3BlPVwie2Ftb3VudH1cIiBpbnRlcmNlcHQ9XCJ7YW1vdW50Mn1cIi8+PGZlRnVuY0IgdHlwZT1cImxpbmVhclwiIHNsb3BlPVwie2Ftb3VudH1cIiBpbnRlcmNlcHQ9XCJ7YW1vdW50Mn1cIi8+PC9mZUNvbXBvbmVudFRyYW5zZmVyPicsIHtcbiAgICAgICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICAgICAgYW1vdW50MjogLjUgLSBhbW91bnQgLyAyXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU25hcC5maWx0ZXIuY29udHJhc3QudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzKCk7XG4gICAgfTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IsIEZyYWdtZW50KSB7XG4gICAgdmFyIGJveCA9IFNuYXAuXy5ib3gsXG4gICAgICAgIGlzID0gU25hcC5pcyxcbiAgICAgICAgZmlyc3RMZXR0ZXIgPSAvXlteYS16XSooW3RibWxyY10pL2ksXG4gICAgICAgIHRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiVFwiICsgdGhpcy5keCArIFwiLFwiICsgdGhpcy5keTtcbiAgICAgICAgfTtcbiAgICAvKlxcXG4gICAgICogRWxlbWVudC5nZXRBbGlnblxuICAgICBbIG1ldGhvZCBdXG4gICAgICoqXG4gICAgICogUmV0dXJucyBzaGlmdCBuZWVkZWQgdG8gYWxpZ24gdGhlIGVsZW1lbnQgcmVsYXRpdmVseSB0byBnaXZlbiBlbGVtZW50LlxuICAgICAqIElmIG5vIGVsZW1lbnRzIHNwZWNpZmllZCwgcGFyZW50IGA8c3ZnPmAgY29udGFpbmVyIHdpbGwgYmUgdXNlZC5cbiAgICAgLSBlbCAob2JqZWN0KSBAb3B0aW9uYWwgYWxpZ25tZW50IGVsZW1lbnRcbiAgICAgLSB3YXkgKHN0cmluZykgb25lIG9mIHNpeCB2YWx1ZXM6IGBcInRvcFwiYCwgYFwibWlkZGxlXCJgLCBgXCJib3R0b21cImAsIGBcImxlZnRcImAsIGBcImNlbnRlclwiYCwgYFwicmlnaHRcImBcbiAgICAgPSAob2JqZWN0fHN0cmluZykgT2JqZWN0IGluIGZvcm1hdCBge2R4OiAsIGR5OiB9YCBhbHNvIGhhcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyBhIHRyYW5zZm9ybWF0aW9uIHN0cmluZ1xuICAgICA+IFVzYWdlXG4gICAgIHwgZWwudHJhbnNmb3JtKGVsLmdldEFsaWduKGVsMiwgXCJ0b3BcIikpO1xuICAgICAqIG9yXG4gICAgIHwgdmFyIGR5ID0gZWwuZ2V0QWxpZ24oZWwyLCBcInRvcFwiKS5keTtcbiAgICBcXCovXG4gICAgRWxlbWVudC5wcm90b3R5cGUuZ2V0QWxpZ24gPSBmdW5jdGlvbiAoZWwsIHdheSkge1xuICAgICAgICBpZiAod2F5ID09IG51bGwgJiYgaXMoZWwsIFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICB3YXkgPSBlbDtcbiAgICAgICAgICAgIGVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbCA9IGVsIHx8IHRoaXMucGFwZXI7XG4gICAgICAgIHZhciBieCA9IGVsLmdldEJCb3ggPyBlbC5nZXRCQm94KCkgOiBib3goZWwpLFxuICAgICAgICAgICAgYmIgPSB0aGlzLmdldEJCb3goKSxcbiAgICAgICAgICAgIG91dCA9IHt9O1xuICAgICAgICB3YXkgPSB3YXkgJiYgd2F5Lm1hdGNoKGZpcnN0TGV0dGVyKTtcbiAgICAgICAgd2F5ID0gd2F5ID8gd2F5WzFdLnRvTG93ZXJDYXNlKCkgOiBcImNcIjtcbiAgICAgICAgc3dpdGNoICh3YXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgb3V0LmR4ID0gMDtcbiAgICAgICAgICAgICAgICBvdXQuZHkgPSBieC55IC0gYmIueTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJcIjpcbiAgICAgICAgICAgICAgICBvdXQuZHggPSAwO1xuICAgICAgICAgICAgICAgIG91dC5keSA9IGJ4LnkyIC0gYmIueTI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICAgICAgb3V0LmR4ID0gMDtcbiAgICAgICAgICAgICAgICBvdXQuZHkgPSBieC5jeSAtIGJiLmN5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibFwiOlxuICAgICAgICAgICAgICAgIG91dC5keCA9IGJ4LnggLSBiYi54O1xuICAgICAgICAgICAgICAgIG91dC5keSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgICAgICAgb3V0LmR4ID0gYngueDIgLSBiYi54MjtcbiAgICAgICAgICAgICAgICBvdXQuZHkgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dC5keCA9IGJ4LmN4IC0gYmIuY3g7XG4gICAgICAgICAgICAgICAgb3V0LmR5ID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG91dC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH07XG4gICAgLypcXFxuICAgICAqIEVsZW1lbnQuYWxpZ25cbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEFsaWducyB0aGUgZWxlbWVudCByZWxhdGl2ZWx5IHRvIGdpdmVuIG9uZSB2aWEgdHJhbnNmb3JtYXRpb24uXG4gICAgICogSWYgbm8gZWxlbWVudHMgc3BlY2lmaWVkLCBwYXJlbnQgYDxzdmc+YCBjb250YWluZXIgd2lsbCBiZSB1c2VkLlxuICAgICAtIGVsIChvYmplY3QpIEBvcHRpb25hbCBhbGlnbm1lbnQgZWxlbWVudFxuICAgICAtIHdheSAoc3RyaW5nKSBvbmUgb2Ygc2l4IHZhbHVlczogYFwidG9wXCJgLCBgXCJtaWRkbGVcImAsIGBcImJvdHRvbVwiYCwgYFwibGVmdFwiYCwgYFwiY2VudGVyXCJgLCBgXCJyaWdodFwiYFxuICAgICA9IChvYmplY3QpIHRoaXMgZWxlbWVudFxuICAgICA+IFVzYWdlXG4gICAgIHwgZWwuYWxpZ24oZWwyLCBcInRvcFwiKTtcbiAgICAgKiBvclxuICAgICB8IGVsLmFsaWduKFwibWlkZGxlXCIpO1xuICAgIFxcKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5hbGlnbiA9IGZ1bmN0aW9uIChlbCwgd2F5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShcIi4uLlwiICsgdGhpcy5nZXRBbGlnbihlbCwgd2F5KSk7XG4gICAgfTtcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTcgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5TbmFwLnBsdWdpbihmdW5jdGlvbiAoU25hcCwgRWxlbWVudCwgUGFwZXIsIGdsb2IpIHtcbiAgICAvLyBDb2xvdXJzIGFyZSBmcm9tIGh0dHBzOi8vd3d3Lm1hdGVyaWFsdWkuY29cbiAgICB2YXIgcmVkICAgICAgICAgPSBcIiNmZmViZWUjZmZjZGQyI2VmOWE5YSNlNTczNzMjZWY1MzUwI2Y0NDMzNiNlNTM5MzUjZDMyZjJmI2M2MjgyOCNiNzFjMWMjZmY4YTgwI2ZmNTI1MiNmZjE3NDQjZDUwMDAwXCIsXG4gICAgICAgIHBpbmsgICAgICAgID0gXCIjRkNFNEVDI0Y4QkJEMCNGNDhGQjEjRjA2MjkyI0VDNDA3QSNFOTFFNjMjRDgxQjYwI0MyMTg1QiNBRDE0NTcjODgwRTRGI0ZGODBBQiNGRjQwODEjRjUwMDU3I0M1MTE2MlwiLFxuICAgICAgICBwdXJwbGUgICAgICA9IFwiI0YzRTVGNSNFMUJFRTcjQ0U5M0Q4I0JBNjhDOCNBQjQ3QkMjOUMyN0IwIzhFMjRBQSM3QjFGQTIjNkExQjlBIzRBMTQ4QyNFQTgwRkMjRTA0MEZCI0Q1MDBGOSNBQTAwRkZcIixcbiAgICAgICAgZGVlcHB1cnBsZSAgPSBcIiNFREU3RjYjRDFDNEU5I0IzOUREQiM5NTc1Q0QjN0U1N0MyIzY3M0FCNyM1RTM1QjEjNTEyREE4IzQ1MjdBMCMzMTFCOTIjQjM4OEZGIzdDNERGRiM2NTFGRkYjNjIwMEVBXCIsXG4gICAgICAgIGluZGlnbyAgICAgID0gXCIjRThFQUY2I0M1Q0FFOSM5RkE4REEjNzk4NkNCIzVDNkJDMCMzRjUxQjUjMzk0OUFCIzMwM0Y5RiMyODM1OTMjMUEyMzdFIzhDOUVGRiM1MzZERkUjM0Q1QUZFIzMwNEZGRVwiLFxuICAgICAgICBibHVlICAgICAgICA9IFwiI0UzRjJGRCNCQkRFRkIjOTBDQUY5IzY0QjVGNiM2NEI1RjYjMjE5NkYzIzFFODhFNSMxOTc2RDIjMTU2NUMwIzBENDdBMSM4MkIxRkYjNDQ4QUZGIzI5NzlGRiMyOTYyRkZcIixcbiAgICAgICAgbGlnaHRibHVlICAgPSBcIiNFMUY1RkUjQjNFNUZDIzgxRDRGQSM0RkMzRjcjMjlCNkY2IzAzQTlGNCMwMzlCRTUjMDI4OEQxIzAyNzdCRCMwMTU3OUIjODBEOEZGIzQwQzRGRiMwMEIwRkYjMDA5MUVBXCIsXG4gICAgICAgIGN5YW4gICAgICAgID0gXCIjRTBGN0ZBI0IyRUJGMiM4MERFRUEjNEREMEUxIzI2QzZEQSMwMEJDRDQjMDBBQ0MxIzAwOTdBNyMwMDgzOEYjMDA2MDY0Izg0RkZGRiMxOEZGRkYjMDBFNUZGIzAwQjhENFwiLFxuICAgICAgICB0ZWFsICAgICAgICA9IFwiI0UwRjJGMSNCMkRGREIjODBDQkM0IzREQjZBQyMyNkE2OUEjMDA5Njg4IzAwODk3QiMwMDc5NkIjMDA2OTVDIzAwNEQ0MCNBN0ZGRUIjNjRGRkRBIzFERTlCNiMwMEJGQTVcIixcbiAgICAgICAgZ3JlZW4gICAgICAgPSBcIiNFOEY1RTkjQzhFNkM5I0E1RDZBNyM4MUM3ODQjNjZCQjZBIzRDQUY1MCM0M0EwNDcjMzg4RTNDIzJFN0QzMiMxQjVFMjAjQjlGNkNBIzY5RjBBRSMwMEU2NzYjMDBDODUzXCIsXG4gICAgICAgIGxpZ2h0Z3JlZW4gID0gXCIjRjFGOEU5I0RDRURDOCNDNUUxQTUjQUVENTgxIzlDQ0M2NSM4QkMzNEEjN0NCMzQyIzY4OUYzOCM1NThCMkYjMzM2OTFFI0NDRkY5MCNCMkZGNTkjNzZGRjAzIzY0REQxN1wiLFxuICAgICAgICBsaW1lICAgICAgICA9IFwiI0Y5RkJFNyNGMEY0QzMjRTZFRTlDI0RDRTc3NSNENEUxNTcjQ0REQzM5I0MwQ0EzMyNBRkI0MkIjOUU5RDI0IzgyNzcxNyNGNEZGODEjRUVGRjQxI0M2RkYwMCNBRUVBMDBcIixcbiAgICAgICAgeWVsbG93ICAgICAgPSBcIiNGRkZERTcjRkZGOUM0I0ZGRjU5RCNGRkYxNzYjRkZFRTU4I0ZGRUIzQiNGREQ4MzUjRkJDMDJEI0Y5QTgyNSNGNTdGMTcjRkZGRjhEI0ZGRkYwMCNGRkVBMDAjRkZENjAwXCIsXG4gICAgICAgIGFtYmVyICAgICAgID0gXCIjRkZGOEUxI0ZGRUNCMyNGRkUwODIjRkZENTRGI0ZGQ0EyOCNGRkMxMDcjRkZCMzAwI0ZGQTAwMCNGRjhGMDAjRkY2RjAwI0ZGRTU3RiNGRkQ3NDAjRkZDNDAwI0ZGQUIwMFwiLFxuICAgICAgICBvcmFuZ2UgICAgICA9IFwiI0ZGRjNFMCNGRkUwQjIjRkZDQzgwI0ZGQjc0RCNGRkE3MjYjRkY5ODAwI0ZCOEMwMCNGNTdDMDAjRUY2QzAwI0U2NTEwMCNGRkQxODAjRkZBQjQwI0ZGOTEwMCNGRjZEMDBcIixcbiAgICAgICAgZGVlcG9yYW5nZSAgPSBcIiNGQkU5RTcjRkZDQ0JDI0ZGQUI5MSNGRjhBNjUjRkY3MDQzI0ZGNTcyMiNGNDUxMUUjRTY0QTE5I0Q4NDMxNSNCRjM2MEMjRkY5RTgwI0ZGNkU0MCNGRjNEMDAjREQyQzAwXCIsXG4gICAgICAgIGJyb3duICAgICAgID0gXCIjRUZFQkU5I0Q3Q0NDOCNCQ0FBQTQjQTE4ODdGIzhENkU2MyM3OTU1NDgjNkQ0QzQxIzVENDAzNyM0RTM0MkUjM0UyNzIzXCIsXG4gICAgICAgIGdyZXkgICAgICAgID0gXCIjRkFGQUZBI0Y1RjVGNSNFRUVFRUUjRTBFMEUwI0JEQkRCRCM5RTlFOUUjNzU3NTc1IzYxNjE2MSM0MjQyNDIjMjEyMTIxXCIsXG4gICAgICAgIGJsdWVncmV5ICAgID0gXCIjRUNFRkYxI0NGRDhEQyNCMEJFQzUjOTBBNEFFIzc4OTA5QyM2MDdEOEIjNTQ2RTdBIzQ1NUE2NCMzNzQ3NEYjMjYzMjM4XCI7XG4gICAgLypcXFxuICAgICAqIFNuYXAubXVpXG4gICAgIFsgcHJvcGVydHkgXVxuICAgICAqKlxuICAgICAqIENvbnRhaW4gTWF0ZXJpYWwgVUkgY29sb3Vycy5cbiAgICAgfCBTbmFwKCkucmVjdCgwLCAwLCAxMCwgMTApLmF0dHIoe2ZpbGw6IFNuYXAubXVpLmRlZXBwdXJwbGUsIHN0cm9rZTogU25hcC5tdWkuYW1iZXJbNjAwXX0pO1xuICAgICAjIEZvciBjb2xvdXIgcmVmZXJlbmNlOiA8YSBocmVmPVwiaHR0cHM6Ly93d3cubWF0ZXJpYWx1aS5jb1wiPmh0dHBzOi8vd3d3Lm1hdGVyaWFsdWkuY288L2E+LlxuICAgIFxcKi9cbiAgICBTbmFwLm11aSA9IHt9O1xuICAgIC8qXFxcbiAgICAgKiBTbmFwLmZsYXRcbiAgICAgWyBwcm9wZXJ0eSBdXG4gICAgICoqXG4gICAgICogQ29udGFpbiBGbGF0IFVJIGNvbG91cnMuXG4gICAgIHwgU25hcCgpLnJlY3QoMCwgMCwgMTAsIDEwKS5hdHRyKHtmaWxsOiBTbmFwLmZsYXQuY2Fycm90LCBzdHJva2U6IFNuYXAuZmxhdC53ZXRhc3BoYWx0fSk7XG4gICAgICMgRm9yIGNvbG91ciByZWZlcmVuY2U6IDxhIGhyZWY9XCJodHRwczovL3d3dy5tYXRlcmlhbHVpLmNvXCI+aHR0cHM6Ly93d3cubWF0ZXJpYWx1aS5jbzwvYT4uXG4gICAgXFwqL1xuICAgIFNuYXAuZmxhdCA9IHt9O1xuICAgIGZ1bmN0aW9uIHNhdmVDb2xvcihjb2xvcnMpIHtcbiAgICAgICAgY29sb3JzID0gY29sb3JzLnNwbGl0KC8oPz0jKS8pO1xuICAgICAgICB2YXIgY29sb3IgPSBuZXcgU3RyaW5nKGNvbG9yc1s1XSk7XG4gICAgICAgIGNvbG9yWzUwXSA9IGNvbG9yc1swXTtcbiAgICAgICAgY29sb3JbMTAwXSA9IGNvbG9yc1sxXTtcbiAgICAgICAgY29sb3JbMjAwXSA9IGNvbG9yc1syXTtcbiAgICAgICAgY29sb3JbMzAwXSA9IGNvbG9yc1szXTtcbiAgICAgICAgY29sb3JbNDAwXSA9IGNvbG9yc1s0XTtcbiAgICAgICAgY29sb3JbNTAwXSA9IGNvbG9yc1s1XTtcbiAgICAgICAgY29sb3JbNjAwXSA9IGNvbG9yc1s2XTtcbiAgICAgICAgY29sb3JbNzAwXSA9IGNvbG9yc1s3XTtcbiAgICAgICAgY29sb3JbODAwXSA9IGNvbG9yc1s4XTtcbiAgICAgICAgY29sb3JbOTAwXSA9IGNvbG9yc1s5XTtcbiAgICAgICAgaWYgKGNvbG9yc1sxMF0pIHtcbiAgICAgICAgICAgIGNvbG9yLkExMDAgPSBjb2xvcnNbMTBdO1xuICAgICAgICAgICAgY29sb3IuQTIwMCA9IGNvbG9yc1sxMV07XG4gICAgICAgICAgICBjb2xvci5BNDAwID0gY29sb3JzWzEyXTtcbiAgICAgICAgICAgIGNvbG9yLkE3MDAgPSBjb2xvcnNbMTNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG4gICAgU25hcC5tdWkucmVkID0gc2F2ZUNvbG9yKHJlZCk7XG4gICAgU25hcC5tdWkucGluayA9IHNhdmVDb2xvcihwaW5rKTtcbiAgICBTbmFwLm11aS5wdXJwbGUgPSBzYXZlQ29sb3IocHVycGxlKTtcbiAgICBTbmFwLm11aS5kZWVwcHVycGxlID0gc2F2ZUNvbG9yKGRlZXBwdXJwbGUpO1xuICAgIFNuYXAubXVpLmluZGlnbyA9IHNhdmVDb2xvcihpbmRpZ28pO1xuICAgIFNuYXAubXVpLmJsdWUgPSBzYXZlQ29sb3IoYmx1ZSk7XG4gICAgU25hcC5tdWkubGlnaHRibHVlID0gc2F2ZUNvbG9yKGxpZ2h0Ymx1ZSk7XG4gICAgU25hcC5tdWkuY3lhbiA9IHNhdmVDb2xvcihjeWFuKTtcbiAgICBTbmFwLm11aS50ZWFsID0gc2F2ZUNvbG9yKHRlYWwpO1xuICAgIFNuYXAubXVpLmdyZWVuID0gc2F2ZUNvbG9yKGdyZWVuKTtcbiAgICBTbmFwLm11aS5saWdodGdyZWVuID0gc2F2ZUNvbG9yKGxpZ2h0Z3JlZW4pO1xuICAgIFNuYXAubXVpLmxpbWUgPSBzYXZlQ29sb3IobGltZSk7XG4gICAgU25hcC5tdWkueWVsbG93ID0gc2F2ZUNvbG9yKHllbGxvdyk7XG4gICAgU25hcC5tdWkuYW1iZXIgPSBzYXZlQ29sb3IoYW1iZXIpO1xuICAgIFNuYXAubXVpLm9yYW5nZSA9IHNhdmVDb2xvcihvcmFuZ2UpO1xuICAgIFNuYXAubXVpLmRlZXBvcmFuZ2UgPSBzYXZlQ29sb3IoZGVlcG9yYW5nZSk7XG4gICAgU25hcC5tdWkuYnJvd24gPSBzYXZlQ29sb3IoYnJvd24pO1xuICAgIFNuYXAubXVpLmdyZXkgPSBzYXZlQ29sb3IoZ3JleSk7XG4gICAgU25hcC5tdWkuYmx1ZWdyZXkgPSBzYXZlQ29sb3IoYmx1ZWdyZXkpO1xuICAgIFNuYXAuZmxhdC50dXJxdW9pc2UgPSBcIiMxYWJjOWNcIjtcbiAgICBTbmFwLmZsYXQuZ3JlZW5zZWEgPSBcIiMxNmEwODVcIjtcbiAgICBTbmFwLmZsYXQuc3VuZmxvd2VyID0gXCIjZjFjNDBmXCI7XG4gICAgU25hcC5mbGF0Lm9yYW5nZSA9IFwiI2YzOWMxMlwiO1xuICAgIFNuYXAuZmxhdC5lbWVybGFuZCA9IFwiIzJlY2M3MVwiO1xuICAgIFNuYXAuZmxhdC5uZXBocml0aXMgPSBcIiMyN2FlNjBcIjtcbiAgICBTbmFwLmZsYXQuY2Fycm90ID0gXCIjZTY3ZTIyXCI7XG4gICAgU25hcC5mbGF0LnB1bXBraW4gPSBcIiNkMzU0MDBcIjtcbiAgICBTbmFwLmZsYXQucGV0ZXJyaXZlciA9IFwiIzM0OThkYlwiO1xuICAgIFNuYXAuZmxhdC5iZWxpemVob2xlID0gXCIjMjk4MGI5XCI7XG4gICAgU25hcC5mbGF0LmFsaXphcmluID0gXCIjZTc0YzNjXCI7XG4gICAgU25hcC5mbGF0LnBvbWVncmFuYXRlID0gXCIjYzAzOTJiXCI7XG4gICAgU25hcC5mbGF0LmFtZXRoeXN0ID0gXCIjOWI1OWI2XCI7XG4gICAgU25hcC5mbGF0Lndpc3RlcmlhID0gXCIjOGU0NGFkXCI7XG4gICAgU25hcC5mbGF0LmNsb3VkcyA9IFwiI2VjZjBmMVwiO1xuICAgIFNuYXAuZmxhdC5zaWx2ZXIgPSBcIiNiZGMzYzdcIjtcbiAgICBTbmFwLmZsYXQud2V0YXNwaGFsdCA9IFwiIzM0NDk1ZVwiO1xuICAgIFNuYXAuZmxhdC5taWRuaWdodGJsdWUgPSBcIiMyYzNlNTBcIjtcbiAgICBTbmFwLmZsYXQuY29uY3JldGUgPSBcIiM5NWE1YTZcIjtcbiAgICBTbmFwLmZsYXQuYXNiZXN0b3MgPSBcIiM3ZjhjOGRcIjtcbiAgICAvKlxcXG4gICAgICogU25hcC5pbXBvcnRNVUlDb2xvcnNcbiAgICAgWyBtZXRob2QgXVxuICAgICAqKlxuICAgICAqIEltcG9ydHMgTWF0ZXJpYWwgVUkgY29sb3VycyBpbnRvIGdsb2JhbCBvYmplY3QuXG4gICAgIHwgU25hcC5pbXBvcnRNVUlDb2xvcnMoKTtcbiAgICAgfCBTbmFwKCkucmVjdCgwLCAwLCAxMCwgMTApLmF0dHIoe2ZpbGw6IGRlZXBwdXJwbGUsIHN0cm9rZTogYW1iZXJbNjAwXX0pO1xuICAgICAjIEZvciBjb2xvdXIgcmVmZXJlbmNlOiA8YSBocmVmPVwiaHR0cHM6Ly93d3cubWF0ZXJpYWx1aS5jb1wiPmh0dHBzOi8vd3d3Lm1hdGVyaWFsdWkuY288L2E+LlxuICAgIFxcKi9cbiAgICBTbmFwLmltcG9ydE1VSUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgY29sb3IgaW4gU25hcC5tdWkpIHtcbiAgICAgICAgICAgIGlmIChTbmFwLm11aS5oYXNPd25Qcm9wZXJ0eShjb2xvcikpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3dbY29sb3JdID0gU25hcC5tdWlbY29sb3JdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pO1xuXG5yZXR1cm4gU25hcDtcbn0pKTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIHJlcGxhY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tY29udHJvbC1yZWdleCAqL1xudmFyIGxlZnRXaGl0ZXNwYWNlID0gL15bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSovO1xuLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJpbUxlZnQoKSB7XG5cdHJldHVybiByZXBsYWNlKHRoaXMsIGxlZnRXaGl0ZXNwYWNlLCAnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgYm91bmQgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgZ2V0UG9seWZpbGwoKSk7XG5cbmRlZmluZShib3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0KSB7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xuXHR9XG5cdHZhciB6ZXJvV2lkdGhTcGFjZSA9ICdcXHUyMDBiJztcblx0aWYgKHplcm9XaWR0aFNwYWNlLnRyaW1MZWZ0KCkgIT09IHplcm9XaWR0aFNwYWNlKSB7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xuXHR9XG5cdHJldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVRyaW1MZWZ0KCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0U3RyaW5nLnByb3RvdHlwZSxcblx0XHR7IHRyaW1MZWZ0OiBwb2x5ZmlsbCB9LFxuXHRcdHsgdHJpbUxlZnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUudHJpbUxlZnQgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgcmVwbGFjZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG52YXIgcmlnaHRXaGl0ZXNwYWNlID0gL1tcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkZdKiQvO1xuLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJpbVJpZ2h0KCkge1xuXHRyZXR1cm4gcmVwbGFjZSh0aGlzLCByaWdodFdoaXRlc3BhY2UsICcnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW1SaWdodCkge1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcblx0fVxuXHR2YXIgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwYic7XG5cdGlmICh6ZXJvV2lkdGhTcGFjZS50cmltUmlnaHQoKSAhPT0gemVyb1dpZHRoU3BhY2UpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0cmV0dXJuIFN0cmluZy5wcm90b3R5cGUudHJpbVJpZ2h0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVRyaW1SaWdodCgpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKFxuXHRcdFN0cmluZy5wcm90b3R5cGUsXG5cdFx0eyB0cmltUmlnaHQ6IHBvbHlmaWxsIH0sXG5cdFx0eyB0cmltUmlnaHQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUudHJpbVJpZ2h0ICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCJpbXBvcnQgQUtMU3VtbWl0VmlzIGZyb20gJy4vbW9kdWxlcy9ha2xzdW1taXQtdmlzJztcbmltcG9ydCBGb2N1c091dGxpbmVEZXRlY3QgZnJvbSAnLi9tb2R1bGVzL2ZvY3VzLW91dGxpbmUtZGV0ZWN0JztcbmltcG9ydCBicmFuY2hCYXIgZnJvbSAnLi9tb2R1bGVzL2JyYW5jaC1iYXInO1xuXG5cbmNvbnN0IGluaXQgPSAoKSA9PiB7XG4gIG5ldyBGb2N1c091dGxpbmVEZXRlY3QoKS5pbml0KCk7XG4gIGJyYW5jaEJhci5pbml0KCk7XG5cbiAgaWYod2luZG93LkFLTFNwbGFuZXRzICYmIHdpbmRvdy5BS0xTZGV0YWlscyAmJiB3aW5kb3cuY3J1eERhdGEpIHtcbiAgICBjb25zdCB2aXMgPSBuZXcgQUtMU3VtbWl0VmlzKHdpbmRvdy5BS0xTcGxhbmV0cywgd2luZG93LkFLTFNkZXRhaWxzLCB3aW5kb3cuY3J1eERhdGEpO1xuICAgIGNvbnN0IHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdha2xzdW1taXQtdmlzJyk7XG4gICAgaWYocGFyZW50KSB2aXMuYXR0YWNoKHBhcmVudCk7XG4gIH1cbn07XG5cbnN3aXRjaCAoZG9jdW1lbnQucmVhZHlTdGF0ZSkge1xuICBjYXNlICdsb2FkaW5nJzpcbiAgICBhZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gaW5pdCgpKTtcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICBpbml0KCk7XG59XG5cbmNvbnNvbGUubG9nKGBcblxuXG5cbuKWhOKWiOKWiOKWiOKWiOKWhCAgIOKWiOKWiOKWgOKWiOKWiOKWiCAgIOKWhOKWhOKWhCAgICAgICAgIOKWiOKWiOKWiOKWiOKWiOKWiCAgIOKWiOKWiOKWiOKWhCDiloTilojilojilojilpMgIOKWhOKWhOKWhCAgICAgICDilojilojilojiloQgICAg4paIXG7ilpLilojilojiloAg4paA4paIICDilpPilojilogg4paSIOKWiOKWiOKWkuKWkuKWiOKWiOKWiOKWiOKWhCAgICAg4paS4paI4paIICAgIOKWkiAg4paT4paI4paI4paS4paA4paI4paAIOKWiOKWiOKWkiDilpLilojilojilojilojiloQgICAgIOKWiOKWiCDiloDiloggICDilohcbuKWkuKWk+KWiCAgICDiloQg4paT4paI4paIIOKWkeKWhOKWiCDilpLilpLilojiloggIOKWgOKWiOKWhCAgIOKWkSDilpPilojilojiloQgICAg4paT4paI4paIICAgIOKWk+KWiOKWiOKWkSDilpLilojiloggIOKWgOKWiOKWhCAg4paT4paI4paIICDiloDilogg4paI4paI4paSXG7ilpLilpPilpPiloQg4paE4paI4paI4paS4paS4paI4paI4paA4paA4paI4paEICDilpHilojilojiloTiloTiloTiloTilojiloggICAg4paSICAg4paI4paI4paSIOKWkuKWiOKWiCAgICDilpLilojiloggIOKWkeKWiOKWiOKWhOKWhOKWhOKWhOKWiOKWiCDilpPilojilojilpIgIOKWkOKWjOKWiOKWiOKWklxu4paSIOKWk+KWiOKWiOKWiOKWgCDilpHilpHilojilojilpMg4paS4paI4paI4paSIOKWk+KWiCAgIOKWk+KWiOKWiOKWkiDilpLilojilojilojilojilojilojilpLilpIg4paS4paI4paI4paSICAg4paR4paI4paI4paSICDilpPiloggICDilpPilojilojilpLilpLilojilojilpEgICDilpPilojilojilpFcbuKWkSDilpHilpIg4paSICDilpHilpEg4paS4paTIOKWkeKWkuKWk+KWkSDilpLilpIgICDilpPilpLilojilpEg4paSIOKWkuKWk+KWkiDilpIg4paR4paRIOKWkuKWkSAgIOKWkSAg4paRIOKWkiDilpIgICDilpPilpLilojilpHilpEg4paS4paRICAg4paSIOKWklxuICDilpEgIOKWkiAgICAg4paR4paSIOKWkSDilpLilpEgIOKWkiAgIOKWkuKWkiDilpEg4paRIOKWkeKWkiAg4paRIOKWkeKWkSAg4paRICAgICAg4paRICAg4paSICAg4paS4paSIOKWkeKWkSDilpHilpEgICDilpEg4paS4paRXG7ilpEgICAgICAgICAg4paR4paRICAg4paRICAg4paRICAg4paSICAgIOKWkSAg4paRICDilpEgIOKWkSAgICAgIOKWkSAgICAgIOKWkSAgIOKWkiAgICAgIOKWkSAgIOKWkSDilpFcbuKWkSDilpEgICAgICAgICDilpEgICAgICAgICAgIOKWkSAg4paRICAgICAg4paRICAgICAgICAg4paRICAgICAgICAg4paRICDilpEgICAgICAgICDilpFcbuKWkVxuYClcbiIsIi8qKlxuICogQUtMIFN1bW1pdCB2aXN1YWxpemF0aW9uXG4gKlxuICogQ3JlYXRlcyBTVkcgc2hhcGVzIGZyb20gZ2l2ZW4gZGF0YSwgYW5kIHByb3ZpZGVzIHdheXMgdG9cbiAqIGludGVyYWN0IHdpdGggaXQuXG4gKlxuICogTW9zdCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIHNldCBvZiBjcmVhdGVkIHNoYXBlcyxcbiAqIG9yIGEgZmlsdGVyZWQgc3Vic2V0IG9mIHRoZSBzaGFwZXMuIFJlZmVyZW5jZXMgdG8gYWxsIHRoZSBpbmRpdmlkdWFsXG4gKiBzdWJzaGFwZXMgYW5kIGxhYmVscywgYXMgd2VsbCBhcyBhIGNvcHkgb2YgdGhlIHNvdXJjZSBkYXRhLFxuICogaXMgc3RvcmVkIHdpdGhpbiB0aGlzLnBsYW5ldHMgYXJyYXkuXG4gKlxuICogRWFjaCBwbGFuZXQgaXMgYWxzbyBnaXZlbiB4IGFuZCB5IGNvb3JkaW5hdGVzIGFzIHBlcmNlbnRhZ2VzXG4gKiByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQuIFRoZSBwbGFuZXRzIGFsc28gaGF2ZSBhIHJhZGl1czEgYW5kIHJhZGl1czJcbiAqIHByb3BlcnR5LCB3aGljaCByZWZlciB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGEgbWV0cmljcy5cbiAqXG4gKiBUaGUgZ2VuZXJhbCBwcm9jZWR1cmUgZm9yIG1vdmluZy9zY2FsaW5nIHRoZSBwbGFuZXRzIGlzIGNhcnJpZWQgb3V0XG4gKiBieSBmaXJzdCBtb2RpZnlpbmcgdGhlIHBsYW5ldHMnIGRhdGEgd2l0aGluIHRoaXMucGxhbmV0cyBhcnJheS5cbiAqIE9uY2UgdGhlIHBvc2l0aW9uYWwvcmFkaXVzIGRhdGEgaGFzIGJlZW4gY2hhbmdlZCwgdGhlIGluZGl2aWR1YWxcbiAqIFNWRyBzaGFwZXMgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVlcy5cbiAqIEZvciBhIHByYWN0aWNhbCBleGFtcGxlIG9mIHRoaXMsIGNoZWNrIG91dCB0aGUgaW1wbGVtZW50YXRpb24gb2ZcbiAqIG1ldGhvZHMgc2V0R3JpZFBvc2l0aW9uKCkgYW5kIHNldExpbmVQb3NpdGlvbigpLlxuICpcbiAqIE1vYmlsZSB1c2VycyBhcmUgZ2l2ZW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgZXhwZXJpZW5jZSxcbiAqIGluIHRoYXQgdGhlIG92ZXJ2aWV3IG1vZGUgaXMgZGlzYWJsZWQuIFRoaXMgaXMgYWNoaWV2ZWQgd2l0aCBhXG4gKiBwcmVzZXQgYnJlYWtwb2ludCwgd2hpY2ggKGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcpIG1hdGNoZXMgdGhlXG4gKiBtb2JpbGUgYnJlYWtwb2ludCBpbiBzdHlsZXNoZWV0cy5cbiAqXG4gKiBUbyBhbnlvbmUgd2hvIGlzbid0IG1lOyBzb3JyeSBhYm91dCB0aGlzIG1lc3MuIEl0IGFsbCBzdGFydGVkIGFzXG4gKiBwcm90b3R5cGUgY29kZSBhbmQgZXZvbHZlZCBpbnRvIHRoZSBib3dsIG9mIHNwYWdoZXR0aSB5b3Ugc2VlIGhlcmUuXG4gKiBObyB0aW1lIGZvciBwcm9wZXIgcmVmYWN0b3Jpbmc6IFwiTmV4dCB5ZWFyXCIg4oCTIHRoZXkgc2FpZC5cbiAqL1xuXG5pbXBvcnQgU25hcCwgeyBzZXQgfSBmcm9tICdzbmFwc3ZnJztcbmltcG9ydCBIYW1tZXIgZnJvbSAnaGFtbWVyanMnO1xuaW1wb3J0IGZsYXRNYXAgZnJvbSAnYXJyYXkucHJvdG90eXBlLmZsYXRtYXAnO1xuaW1wb3J0IERlYm91bmNlIGZyb20gJy4vZGVib3VuY2UnO1xuaW1wb3J0IENydXhNZXRlcnMgZnJvbSAnLi9jcnV4TWV0ZXJzJztcbmltcG9ydCBodWJzcG90Rm9ybSBmcm9tICcuL2h1YnNwb3RGb3JtJztcbi8vaW1wb3J0IExpbmVDaGFydCBmcm9tICcuL2xpbmVjaGFydCc7XG5cbi8vIE1hdGggc2hvcnRoYW5kIG1ldGhvZHNcbmNvbnN0IHtcbiAgY2VpbCxcbiAgZmxvb3IsXG4gIG1heCxcbiAgbWluLFxuICBzcXJ0LFxuICBzaWduXG59ID0gTWF0aDtcblxuY2xhc3MgQUtMU3VtbWl0VmlzIHtcbiAgY29uc3RydWN0b3IoZGF0YSA9IFtdLCBkZXRhaWxzID0gW10sIGNydXhEYXRhID0gW10pIHtcbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5hbmltRHVyYXRpb24gPSA1MDA7IC8vIG1zXG4gICAgdGhpcy5zbmFwID0gU25hcCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5fZGV0YWlscyA9IGRldGFpbHM7XG4gICAgdGhpcy5fY3J1eERhdGEgPSBjcnV4RGF0YTtcblxuICAgIHRoaXMuZ3JpZFdpZHRoID0gY2VpbChzcXJ0KGRhdGEubGVuZ3RoKSk7XG5cbiAgICB0aGlzLmxpbmVZUG9zaXRpb24gPSA1MDtcblxuICAgIHRoaXMubW9iaWxlID0gdHJ1ZTtcbiAgICB0aGlzLm1vYmlsZUJyZWFrcG9pbnRYID0gODAwO1xuICAgIHRoaXMubW9iaWxlQnJlYWtwb2ludFkgPSA1NzU7XG4gICAgdGhpcy5saW5lWU1vYmlsZSA9IDUwOyAvLyBQZXJjZW50YWdlIG9mIHZpZXcgaGVpZ2h0IGZyb20gdG9wXG4gICAgdGhpcy5saW5lWURlc2t0b3AgPSA1MDsgLy8gUGVyY2VudGFnZSBvZiB2aWV3IGhlaWdodCBmcm9tIHRvcFxuXG4gICAgdGhpcy50YXJnZXRJbmRleCA9IDA7XG5cbiAgICB0aGlzLnN0YXJ0ID0gMTtcbiAgfVxuXG4gIC8qIFNlbGVjdHMgZWxlbWVudHMgYW5kIGF0dGFjaGVzIGV2ZW50IGxpc3RlbmVycyAqL1xuICBhdHRhY2gocGFyZW50KSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMuc25hcC5ub2RlKTtcblxuICAgIGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuZml0Vmlld3BvcnQoKSk7XG5cbiAgICB0aGlzLmZpdFZpZXdwb3J0KHRydWUpO1xuXG4gICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsID0gdGhpcy5zZXRHcmlkUG9zaXRpb25zO1xuICAgIHRoaXMuc2VhcmNoRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2gtZm9ybScpO1xuXG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdha2xzdW1taXQtY29udHJvbHMnKTtcbiAgICB0aGlzLmZpbHRlckZpZWxkc2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbHRlckJ5VHlwZScpO1xuICAgIHRoaXMuc29ydEZpZWxkc2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NvcnRCeScpO1xuICAgIHRoaXMuc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoQnlHcm91cCcpO1xuICAgIHRoaXMuc2NhbGUxU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhZGl1czFCeUZpZWxkJyk7XG4gICAgdGhpcy5zY2FsZTJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFkaXVzMkJ5RmllbGQnKTtcbiAgICB0aGlzLmJhY2tUb0dyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja0J1dHRvbicpO1xuICAgIHRoaXMuYnV0dG9uTGVmdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3ZlTGVmdCcpO1xuICAgIHRoaXMuYnV0dG9uUmlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92ZVJpZ2h0Jyk7XG5cbiAgICB0aGlzLmRldGFpbHNHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLWdyb3VwJyk7XG4gICAgdGhpcy5kZXRhaWxzVHVybm92ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby10dXJub3ZlcicpO1xuICAgIHRoaXMuZGV0YWlsc1Bvc2l0aW9uVHVybm92ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1wb3NpdGlvbi10dXJub3ZlcicpO1xuICAgIHRoaXMuZGV0YWlsc1R1cm5vdmVyQ2hhbmdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tdHVybm92ZXJfY2hhbmdlJyk7XG4gICAgdGhpcy5kZXRhaWxzQ3Jhc21hbkluZGV4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tY3Jhc21hbl9pbmRleCcpO1xuICAgIHRoaXMuZGV0YWlsc1Bvc2l0aW9uQ3Jhc21hbkluZGV4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tcG9zaXRpb24tY3Jhc21hbl9pbmRleCcpO1xuICAgIHRoaXMuZGV0YWlsc0NyYXNtYW5JbmRleENoYW5nZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLWNyYXNtYW5faW5kZXhfY2hhbmdlJyk7XG5cbiAgICB0aGlzLmRldGFpbHNTaXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tc2l0ZS1jcmFzbWFuLWluZGV4Jyk7XG4gICAgdGhpcy5kZXRhaWxzU2l0ZUNyYXNtYW5JbmRleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXNpdGUtY3Jhc21hbl9pbmRleCcpO1xuICAgIHRoaXMuZGV0YWlsc1NpdGVQb3NpdGlvbkNyYXNtYW5JbmRleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXNpdGUtcG9zaXRpb24tY3Jhc21hbl9pbmRleCcpO1xuICAgIHRoaXMuZGV0YWlsc1NpdGVDcmFzbWFuSW5kZXhDaGFuZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1zaXRlLWNyYXNtYW5faW5kZXhfY2hhbmdlJylcbiAgICB0aGlzLmRldGFpbHNTaXRlVGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tc2l0ZS10YXJnZXQnKTtcblxuICAgIHRoaXMuZGV0YWlsc1RhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXRhcmdldCcpO1xuICAgIHRoaXMuZGV0YWlsc1RhcmdldHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1zaXRlLWRldGFpbHMnKTtcblxuICAgIHRoaXMuZGV0YWlsc1RyYWZmaWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1zaXRlLXRvdGFsX3RyYWZmaWMnKTtcbiAgICB0aGlzLmRldGFpbHNUcmFmZmljQ2hhbmdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tc2l0ZS10b3RhbF90cmFmZmljX2NoYW5nZScpO1xuICAgIHRoaXMuZGV0YWlsc1Bvc2l0aW9uVHJhZmZpYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXBvc2l0aW9uLXRvdGFsX3RyYWZmaWMnKTtcbiAgICB0aGlzLmRldGFpbHNUb3RhbEtleXdvcmRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tc2l0ZS10b3RhbF9rZXl3b3JkcycpO1xuICAgIHRoaXMuZGV0YWlsc1RvdGFsS2V5d29yZHNDaGFuZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1zaXRlLXRvdGFsX2tleXdvcmRzX2NoYW5nZScpO1xuICAgIHRoaXMuZGV0YWlsc1Bvc2l0aW9uVG90YWxLZXl3b3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXBvc2l0aW9uLXRvdGFsX2tleXdvcmRzJyk7XG4gICAgdGhpcy5kZXRhaWxzQmFja2xpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tc2l0ZS10b3RhbF9iYWNrbGlua3MnKTtcbiAgICB0aGlzLmRldGFpbHNCYWNrbGlua3NDaGFuZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1zaXRlLXRvdGFsX2JhY2tsaW5rc19jaGFuZ2UnKTtcbiAgICB0aGlzLmRldGFpbHNQb3NpdGlvbkJhY2tsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvLXBvc2l0aW9uLXRvdGFsX2JhY2tsaW5rcycpO1xuXG4gICAgdGhpcy5kZXRhaWxzS2V5d29yZHNZZWFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vc3QtdmFsdWVhYmxlLWtleXdvcmRzLXllYXInKTtcbiAgICB0aGlzLmRldGFpbHNLZXl3b3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3N0LXZhbHVhYmxlLWtleXdvcmRzJyk7XG5cbiAgICAvL2NydXggZGF0YVxuICAgIHRoaXMuY3J1eERhdGFDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2l0ZS1jcnV4LWRhdGEnKTtcblxuICAgIHRoaXMuY3JlYXRlUGxhbmV0cygpO1xuICAgIHRoaXMuc2V0U29ydFNvdXJjZSh0aGlzLnNvcnRGaWVsZHNldC5xdWVyeVNlbGVjdG9yKCdpbnB1dDpjaGVja2VkJykudmFsdWUpO1xuICAgIHRoaXMuZmlsdGVyQnkoJ3R5cGUnLCB0aGlzLmdldEZpbHRlckFycmF5KHRoaXMuZmlsdGVyRmllbGRzZXQpKTtcblxuXG4gICAgLy8gU21hbGwgZGVsYXkgYmVmb3JlIHRyYW5zaXRpb25pbmcgcGxhbmV0cyBpbnRvIGZvcm1hdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsKCksIDUwMCk7XG5cbiAgICAgLy9zaG93IGh1YnNwb3QgZm9ybSBhZnRlciBzb21lIHRpbWVcbiAgICBodWJzcG90Rm9ybSgpO1xuXG5cbiAgICB0aGlzLnNuYXAuaG92ZXIoXG4gICAgICBldmVudCA9PiB0aGlzLmhhbmRsZUhvdmVySW4oZXZlbnQpLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZih0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgIT09IHRoaXMuc2V0TGluZVBvc2l0aW9ucykgdGhpcy5oaWRlTGFiZWxzKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIFt0aGlzLnNlYXJjaEZvcm0sIHRoaXMuZmlsdGVyc0Zvcm1dLmZvckVhY2goZm9ybUVsID0+IGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBldiA9PiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cbiAgICAgIGlmKHRoaXMuY3VycmVudFBsYW5ldCAmJiB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgPT09IHRoaXMuc2V0R3JpZFBvc2l0aW9ucykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgPSB0aGlzLnNldExpbmVQb3NpdGlvbnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgPSB0aGlzLnNldEdyaWRQb3NpdGlvbnM7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGV2KSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ292ZXJ2aWV3Jyk7XG5cbiAgICAgIGlmKGV2LmN1cnJlbnRUYXJnZXQudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHRzKCk7XG4gICAgICAgIHRoaXMuaGlkZUxhYmVscygpO1xuICAgICAgICB0aGlzLnNlYXJjaEhpZ2hsaWdodChmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlYXJjaEhpZ2hsaWdodChldi5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9WaWV3KCk7XG4gICAgfSlcblxuXG4gICAgdGhpcy5maWx0ZXJGaWVsZHNldC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXYpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLmdldEZpbHRlckFycmF5KGV2LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgLy8gSWYgb25seSBvbmUgY2hlY2tib3ggaXMgY2hlY2tlZCwgZGlzYWJsZSBpdCB0byBwcmV2ZW50IGJsYW5rIHNlbGVjdGlvblxuICAgICAgaWYoYWN0aXZlRmlsdGVycy5sZW5ndGggPD0gMSkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdDaGVja2JveCA9IGV2LmN1cnJlbnRUYXJnZXQucXVlcnlTZWxlY3RvcignaW5wdXQ6Y2hlY2tlZCcpO1xuICAgICAgICByZW1haW5pbmdDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXNhYmxlZENoZWNrYm94ID0gZXYuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dDpkaXNhYmxlZCcpO1xuICAgICAgICBpZihkaXNhYmxlZENoZWNrYm94KSBkaXNhYmxlZENoZWNrYm94LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlckJ5KCd0eXBlJywgYWN0aXZlRmlsdGVycyk7XG4gICAgICB0aGlzLmhpZGVIaWRkZW4oKTtcblxuICAgICAgLy8gRmluZCB0aGUgbmV3IGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhbmV0LCBpZiBwb3NzaWJsZVxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmdldFNvcnRlZFBsYW5ldHMoKS5pbmRleE9mKHRoaXMuY3VycmVudFBsYW5ldClcbiAgICAgIHRoaXMudGFyZ2V0SW5kZXggPSBuZXdJbmRleCA8IDAgPyAwIDogbmV3SW5kZXg7XG4gICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ydEZpZWxkc2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ID0+IHtcbiAgICAgIGNvbnN0IGNob3NlblJhZGlvID0gZXYuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dDpjaGVja2VkJyk7XG4gICAgICBzd2l0Y2goY2hvc2VuUmFkaW8udmFsdWUpIHtcbiAgICAgICAgY2FzZSAncmFkaXVzMSc6XG4gICAgICAgICAgdGhpcy5zb3J0U291cmNlID0gJ3NjYWxlMSc7XG4gICAgICAgICAgdGhpcy5zb3J0RmllbGQgPSB0aGlzLnNjYWxlMVNlbGVjdC52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmFkaXVzMic6XG4gICAgICAgICAgdGhpcy5zb3J0U291cmNlID0gJ3NjYWxlMic7XG4gICAgICAgICAgdGhpcy5zb3J0RmllbGQgPSB0aGlzLnNjYWxlMlNlbGVjdC52YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWxwaGFudW1lcmljJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnNvcnRTb3VyY2UgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgdGhpcy5zb3J0RmllbGQgPSAnZ3JvdXAnO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjYWxlMVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXYpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ydFNvdXJjZSA9PT0gJ3NjYWxlMScpIHtcbiAgICAgICAgdGhpcy5zb3J0RmllbGQgPSBldi5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjYWxlMlNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXYpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ydFNvdXJjZSA9PT0gJ3NjYWxlMicpIHtcbiAgICAgICAgdGhpcy5zb3J0RmllbGQgPSBldi5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmJhY2tUb0dyaWQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldiA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ292ZXJ2aWV3Jyk7XG4gICAgICB0aGlzLmN1cnJlbnRQbGFuZXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCA9IHRoaXMuc2V0R3JpZFBvc2l0aW9ucztcbiAgICAgIHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCgpO1xuICAgICAgdGhpcy5maXRWaWV3cG9ydCgpO1xuICAgIH0pO1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2dCA9PiB7XG4gICAgICBpZihldnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JykgcmV0dXJuO1xuICAgICAgaWYoXG4gICAgICAgIChldnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldnQua2V5ID09PSAnQXJyb3dSaWdodCcpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5tb3ZlTGluZVBvcyhldnQua2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMucGFyZW50KTtcbiAgICBoYW1tZXIub24oJ3N3aXBlJywgZXZ0ID0+IHtcbiAgICAgIHRoaXMubW92ZUxpbmVQb3MoMCAtIHNpZ24oZXZ0LmRlbHRhWCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5idXR0b25MZWZ0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZ0ID0+IHtcbiAgICAgIHRoaXMubW92ZUxpbmVQb3MoLTEpO1xuICAgIH0pO1xuICAgIHRoaXMuYnV0dG9uUmlnaHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldnQgPT4ge1xuICAgICAgdGhpcy5tb3ZlTGluZVBvcygxKTtcbiAgICB9KTtcblxuICAgIHRoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZ0ID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSB1c2VyIGNsaWNrZWQgYSBwbGFuZXRcbiAgICAgIGNvbnN0IGNsaWNrZWRQbGFuZXQgPSB0aGlzLnBsYW5ldHMuZmluZChwbGFuZXQgPT4gcGxhbmV0LmFyZWEubm9kZSA9PT0gZXZ0LnRhcmdldCk7XG4gICAgICBpZihjbGlja2VkUGxhbmV0KSB7XG4gICAgICAgIC8vIFpvb20gaW4sIGlmIHdlJ3JlIGluIGdyaWQgbW9kZVxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJ2aWV3Jyk7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0SGVpZ2h0KCk7XG5cbiAgICAgICAgaWYoXG4gICAgICAgICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsID09PSB0aGlzLnNldEdyaWRQb3NpdGlvbnMgfHxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQbGFuZXQgIT09IGNsaWNrZWRQbGFuZXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdvdmVydmlldycpO1xuICAgICAgICAgIGNvbnN0IGNsaWNrZWRQbGFuZXRJbmRleCA9IHRoaXMuZ2V0U29ydGVkUGxhbmV0cygpLmluZGV4T2YoY2xpY2tlZFBsYW5ldCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UGxhbmV0ID0gY2xpY2tlZFBsYW5ldDtcbiAgICAgICAgICB0aGlzLnRhcmdldEluZGV4ID0gY2xpY2tlZFBsYW5ldEluZGV4O1xuICAgICAgICAgIHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCA9IHRoaXMuc2V0TGluZVBvc2l0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXRhaWxzVGFyZ2V0cy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldnQgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9IGV2dC50YXJnZXQudmFsdWU7XG4gICAgICBjb25zdCBzaXRlID0gdGhpcy5fZGV0YWlscy5maW5kKGQgPT4gZC51dWlkID09PSB1dWlkKTtcbiAgICAgIGNvbnN0IGNydXhEYXRhID0gdGhpcy5fY3J1eERhdGEuZmluZChkID0+IGQub3JpZ2luLmluY2x1ZGVzKHNpdGUudGFyZ2V0KSlcbiAgICAgIGlmKHNpdGUpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l0ZURldGFpbHMoc2l0ZSwgdGhpcy5nZXRWaXNpYmxlUGxhbmV0cygpLCBjcnV4RGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRldGFpbHNLZXl3b3Jkc1llYXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZ0ID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbHNVdWlkID0gdGhpcy5kZXRhaWxzVGFyZ2V0cy52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGV0YWlscyA9IHRoaXMuX2RldGFpbHMuZmluZChkID0+IGQudXVpZCA9PT0gZGV0YWlsc1V1aWQpO1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBwbGFuZXREYXRhOiB0aGlzLmN1cnJlbnRQbGFuZXQuZGF0YSxcbiAgICAgICAgc2l0ZURhdGE6IHNlbGVjdGVkRGV0YWlsc1xuICAgICAgfSk7XG4gICAgICBpZihzZWxlY3RlZERldGFpbHMgJiYgc2VsZWN0ZWREZXRhaWxzLmdyb3VwID09PSB0aGlzLmN1cnJlbnRQbGFuZXQuZGF0YS5ncm91cCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNpdGVLZXl3b3JkcyhzZWxlY3RlZERldGFpbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVTaXRlS2V5d29yZHModGhpcy5jdXJyZW50UGxhbmV0LmRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBzZXRTb3J0U291cmNlKGZpZWxkKSB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyYWRpdXMxJzpcbiAgICAgICAgdGhpcy5zb3J0U291cmNlID0gJ3NjYWxlMSc7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkID0gdGhpcy5zY2FsZTFTZWxlY3QudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmFkaXVzMic6XG4gICAgICAgIHRoaXMuc29ydFNvdXJjZSA9ICdzY2FsZTInO1xuICAgICAgICB0aGlzLnNvcnRGaWVsZCA9IHRoaXMuc2NhbGUyU2VsZWN0LnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FscGhhbnVtZXJpYyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnNvcnRTb3VyY2UgPSAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkID0gJ2dyb3VwJztcbiAgICB9XG4gIH1cblxuICAvLyBBZGp1c3QgdGhlIHBsYW5ldCdzIFgtb2Zmc2V0IGluIGxpbmUgdmlldyBtb2RlXG4gIC8vIFRha2VzIGFuIG9mZnNldCBhcmd1bWVudCwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnRseSBjZW50ZXJlZCBwbGFuZXRcbiAgbW92ZUxpbmVQb3Mob2Zmc2V0KSB7XG4gICAgaWYodGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsICE9PSB0aGlzLnNldExpbmVQb3NpdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCB2aXNpYmxlUGxhbmV0cyA9IHRoaXMuZ2V0VmlzaWJsZVBsYW5ldHMoKTtcbiAgICB0aGlzLnRhcmdldEluZGV4ICs9IG9mZnNldDtcbiAgICBpZih0aGlzLnRhcmdldEluZGV4IDwgMCkge1xuICAgICAgdGhpcy50YXJnZXRJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmKHRoaXMudGFyZ2V0SW5kZXggPj0gdmlzaWJsZVBsYW5ldHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRhcmdldEluZGV4ID0gdmlzaWJsZVBsYW5ldHMubGVuZ3RoIC0gMTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsKHRoaXMudGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIG5vbi1oaWRkZW4gcGxhbmV0c1xuICBnZXRTb3J0ZWRQbGFuZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVQbGFuZXRzKCkuc29ydCh0aGlzLnNvcnRQbGFuZXRzKHRoaXMuc29ydEZpZWxkKSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgbGlzdCBvZiBub24taGlkZGVuIHBsYW5ldHNcbiAgZ2V0VmlzaWJsZVBsYW5ldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxhbmV0cy5maWx0ZXIocCA9PiAhcC5oaWRkZW4pO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhbiBhcnJheSBzb3J0IGZ1bmN0aW9uLCBjb21wYXJpbmcgd2l0aCB0aGUgZ2l2ZW4gZmllbGQgbmFtZVxuICBzb3J0UGxhbmV0cyhmaWVsZCkge1xuICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcEEgPSBhLmRhdGFbZmllbGRdO1xuICAgICAgY29uc3QgcEIgPSBiLmRhdGFbZmllbGRdO1xuICAgICAgaWYodHlwZW9mIHBBID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcEIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBwQiAtIHBBO1xuICAgICAgfVxuICAgICAgaWYocEEgPiBwQikgcmV0dXJuIDE7XG4gICAgICBpZihwQSA8IHBCKSByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9O1xuICB9XG5cbiAgLyogU2Nyb2xscyB0aGUgdmlldyBzbyB0aGF0IHRoZSBjYW52YXMgaXMgdmlzaWJsZSAqL1xuICBzY3JvbGxUb1ZpZXcoKSB7XG4gICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQnKTtcbiAgICBpZighZWxlbSkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvKHtcbiAgICAgICAgdG9wOiB0aGlzLnBhcmVudC5vZmZzZXRUb3AsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW0uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICB0b3A6IHRoaXMucGFyZW50Lm9mZnNldFRvcCAtIDEwMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICB9KTtcbiAgICB9XG5cblxuICB9XG5cbiAgLyogU2NhbGVzIHRoZSBwcmVzZW50YXRpb24gdG8gc2NyZWVuL2NvbnRhaW5lciBzaXplICovXG4gIGZpdFZpZXdwb3J0KGluaXRpYWwgPSBmYWxzZSkge1xuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdvdmVydmlldycpO1xuICAgIGNvbnN0IFt0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0XSA9IFtcbiAgICAgIHRoaXMucGFyZW50Lm9mZnNldFdpZHRoID8gdGhpcy5wYXJlbnQub2Zmc2V0V2lkdGggOiBpbm5lcldpZHRoLFxuICAgICAgdGhpcy5wYXJlbnQub2Zmc2V0SGVpZ2h0ID8gdGhpcy5wYXJlbnQub2Zmc2V0SGVpZ2h0IDogaW5uZXJIZWlnaHRcbiAgICBdO1xuICAgIGlmKHRoaXMuaGVpZ2h0ICE9PSB0YXJnZXRIZWlnaHQgfHwgdGhpcy53aWR0aCAhPT0gdGFyZ2V0V2lkdGgpIHtcblxuICAgICAgdGhpcy5oZWlnaHQgPSB0YXJnZXRIZWlnaHQ7XG4gICAgICB0aGlzLndpZHRoID0gdGFyZ2V0V2lkdGg7XG4gICAgICB0aGlzLnNuYXAucGFwZXIuYXR0cih7XG4gICAgICAgIGhlaWdodDogICcxMDAlJyxcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGhcbiAgICAgIH0pO1xuXG4gICAgICBpZighaW5pdGlhbCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxhbmV0KSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVQb3NpdGlvbk1vZGVsID0gdGhpcy5zZXRMaW5lUG9zaXRpb25zO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcnZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjYWxlQXJlYXMoKTtcbiAgICAgICAgdGhpcy5zaG93TGFiZWwoKTtcbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0SGVpZ2h0KCk7XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1vYmlsZSA9IGlubmVyV2lkdGggPCB0aGlzLm1vYmlsZUJyZWFrcG9pbnRYIHx8IGlubmVySGVpZ2h0IDwgdGhpcy5tb2JpbGVCcmVha3BvaW50WTtcbiAgfVxuXG4gIHJlY2FsY3VsYXRIZWlnaHQoKSB7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLnBhcmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgdGhpcy5zbmFwLnBhcGVyLmF0dHIoe1xuICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICB9KTtcbiAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwoKTtcbiAgfVxuICAvKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBvZiBhbGwgY2hlY2tlZCBjaGVja2JveGVzIHdpdGhpbiB0aGUgZ2l2ZW4gZmllbGRzZXQgKi9cbiAgZ2V0RmlsdGVyQXJyYXkoZmllbGRzZXRFbCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBBcnJheS5mcm9tKFxuICAgICAgZmllbGRzZXRFbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKVxuICAgICk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBjaGVja2JveGVzLmZpbHRlcihjYiA9PiBjYi5jaGVja2VkKS5tYXAoY2IgPT4gY2IudmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8vIENyZWF0ZXMgdGhlIFNWRyBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGF0YSBwb2ludFxuICBjcmVhdGVQbGFuZXRzKCkge1xuICAgIGNvbnN0IHNxdWFyZVNpemUgPSB0aGlzLmdyaWRTcXVhcmVTaXplKCk7XG4gICAgdGhpcy5wbGFuZXRzID0gdGhpcy5fZGF0YS5tYXAoKGQsIGksIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLnNuYXAuY2lyY2xlKCc1MCUnLCAnNTAlJywgc3F1YXJlU2l6ZSAvIDIpO1xuICAgICAgYXJlYS5hZGRDbGFzcygncGxhbmV0LWFyZWEnKTtcbiAgICAgIGNvbnN0IGNpcmNsZTEgPSB0aGlzLnNuYXAuY2lyY2xlKCc1MCUnLCAnNTAlJywgMSk7XG4gICAgICBjaXJjbGUxLmFkZENsYXNzKCdwbGFuZXQtY2lyY2xlMScpO1xuICAgICAgY29uc3QgY2lyY2xlMiA9IHRoaXMuc25hcC5jaXJjbGUoJzUwJScsICc1MCUnLCAxKTtcbiAgICAgIGNpcmNsZTIuYWRkQ2xhc3MoJ3BsYW5ldC1jaXJjbGUyJyk7XG5cbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5zbmFwLmdyb3VwKGFyZWEsIGNpcmNsZTEsIGNpcmNsZTIpO1xuICAgICAgZ3JvdXAuYWRkQ2xhc3MoJ3BsYW5ldC1ncm91cCcpXG4gICAgICBncm91cC5hdHRyKCdpZCcsIGQudXVpZCk7XG5cbiAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtcGxhbmV0PVwiJHsgZC51dWlkIH1cIl1gKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogZCxcbiAgICAgICAgZ3JvdXAsIGFyZWEsIGNpcmNsZTEsIGNpcmNsZTIsIGxhYmVsLFxuICAgICAgICB4OiA1MCwgeTogNTBcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmVzIHRoZSBzaXplIGF2YWlsYWJsZSBwZXIgcGxhbmV0XG4gIGdyaWRTcXVhcmVTaXplKCkge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkgLyB0aGlzLmdyaWRXaWR0aDtcbiAgfVxuXG4gIC8vIFB1c2hlcyBoaWRkZW4gcGxhbmV0cyBvdXQgb2YgdGhlIHZpZXdcbiAgaGlkZUhpZGRlbigpIHtcbiAgICBjb25zdCB5ID0gdGhpcy5tb2JpbGUgPyB0aGlzLmxpbmVZTW9iaWxlIDogdGhpcy5saW5lWURlc2t0b3A7XG4gICAgdGhpcy5nZXRWaXNpYmxlUGxhbmV0cygpLmZvckVhY2gocCA9PiB7XG4gICAgICBwLnggPSAtMjU7XG4gICAgICBwLnkgPSB5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRGlzcGxheXMgdGhlIGxhYmVsIGZvciB0aGUgY3VycmVudGx5IGhvdmVyZWQgcGxhbmV0XG4gIGhhbmRsZUhvdmVySW4oZXZlbnQpIHtcbiAgICBpZih0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgPT09IHRoaXMuc2V0TGluZVBvc2l0aW9ucykgcmV0dXJuO1xuICAgIGNvbnN0IHBsYW5ldCA9IHRoaXMucGxhbmV0cy5maW5kKHBsYW5ldCA9PiBwbGFuZXQuYXJlYS5ub2RlID09PSBldmVudC50YXJnZXQpO1xuICAgIGlmKHBsYW5ldCAmJiAhcGxhbmV0LmxhYmVsLmNsYXNzTGlzdC5jb250YWlucygndmlzaWJsZScpKSB7XG4gICAgICB0aGlzLnNob3dMYWJlbChwbGFuZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhpZGVzIGFsbCB2aXNpYmxlIGxhYmVsc1xuICBoaWRlTGFiZWxzKCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBsYW5ldF0udmlzaWJsZScpXG4gICAgICAuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJykpO1xuICB9XG5cbiAgLy8gU2hvd3MgdGhlIGdpdmVuIHBsYW5ldCdzIGFzc29jaWF0ZWQgbGFiZWxcbiAgc2hvd0xhYmVsKHBsYW5ldCA9IHRoaXMuY3VycmVudFBsYW5ldCkge1xuXG4gICAgaWYoXG4gICAgICAhcGxhbmV0IHx8IHBsYW5ldC5oaWRkZW4gfHwgLy8gRG9uJ3Qgc2hvdyBsYWJlbCBpZiB0aGUgcGxhbmV0IGlzIGZpbHRlcmVkIG91dFxuICAgICAgcGxhbmV0LnggPCAwIHx8IHBsYW5ldC54ID4gMTAwIC8vIC4uLm9yIHBhc3QgdGhlIHZpZXcgZWRnZXNcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBsYW5ldC5sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICB9IGNhdGNoKGUpIHsgLyogcHJvYmFibHkgbWlzc2luZyB0aGUgcGxhbmV0ICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjeCA9IG1pbigxMTAsIG1heChwbGFuZXQueCwgLTEwKSk7XG5cbiAgICBsZXQgeyB5IH0gPSBwbGFuZXQuY2lyY2xlMi5ub2RlLmdldEJCb3goKTtcblxuICAgIGNvbnN0IG1heFggPSB0aGlzLnBhcmVudC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBtYXhZID0gdGhpcy5wYXJlbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgaWYoXG4gICAgICBjeCA8IDAgfHwgY3ggPiBtYXhYIHx8XG4gICAgICB5IDwgMCB8fCB5ID4gbWF4WVxuICAgICkge1xuICAgICAgLy8gRG9uJ3Qgc2hvdyBsYWJlbCBpZiBpdCdzIG5vdCB3aXRoaW4gZGlzcGxheSBhcmVhXG4gICAgICBwbGFuZXQubGFiZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdGhlIGxhYmVsIHRvIHBsYW5ldCdzIHBvc2l0aW9uXG4gICAgcGxhbmV0LmxhYmVsLnN0eWxlLmxlZnQgPSBjeCArICclJztcbiAgICBwbGFuZXQubGFiZWwuc3R5bGUudG9wID0geSArICdweCc7XG4gICAgcGxhbmV0LmxhYmVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgfVxuXG4gIC8vIFJlc2V0cyBoaWRkZW4gcGxhbmV0cyB0byB2aXNpYmxlIHN0YXRlXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLnBsYW5ldHMuZm9yRWFjaChwbGFuZXQgPT4gcGxhbmV0LmhpZGRlbiA9IGZhbHNlKTtcbiAgfVxuXG4gIHBsYW5ldE1hdGNoZXIobmVlZGxlKSB7XG5cbiAgICBpZiAobmVlZGxlID09PSAnJyB8fCBuZWVkbGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWFyY2hTdHJpbmcgPSBuZWVkbGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjaGVja0tleXMgPSBbJ2dyb3VwJywgJ3RhcmdldCddO1xuICAgIGNvbnN0IG1hdGNoaW5nUGxhbmV0cyA9IHRoaXMuZ2V0VmlzaWJsZVBsYW5ldHMoKS5maWx0ZXIocGxhbmV0ID0+IHtcbiAgICAgIGNvbnN0IHBsYW5ldE1hdGNoZXMgPSBjaGVja0tleXMucmVkdWNlKChtYXRjaGVzLCBrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMgfHwgcGxhbmV0LmRhdGFba2V5XS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZylcbiAgICAgIH0sIGZhbHNlKTtcbiAgICAgIGNvbnN0IHNpdGVzID0gcGxhbmV0LmRhdGEudGFyZ2V0ID09PSAnJ1xuICAgICAgICA/IHRoaXMuX2RldGFpbHMuZmlsdGVyKGRldGFpbCA9PiBkZXRhaWwuZ3JvdXAgPT09IHBsYW5ldC5kYXRhLmdyb3VwKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3Qgc2l0ZU1hdGNoZXMgPSBzaXRlcy5sZW5ndGggPiAwXG4gICAgICAgID8gc2l0ZXMucmVkdWNlKChmb3VuZCwgc2l0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmb3VuZCB8fCBjaGVja0tleXMucmVkdWNlKChtYXRjaGVzLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzIHx8IHNpdGVba2V5XS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZyk7XG4gICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICB9LCBmYWxzZSlcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHBsYW5ldE1hdGNoZXMgfHwgc2l0ZU1hdGNoZXM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdQbGFuZXRzO1xuICB9XG5cbiAgLy8gSGlnaGxpZ2h0cyBwbGFuZXRzIHRoYXQncyBnaXZlbiBkYXRhIHZhbHVlIChwYXJ0aWFsbHkpIG1hdGNoZXMgdGhlIHNlYXJjaCBzdHJpbmdcbiAgLy8gVE9ETzogUmVmYWN0b3IgdGhpcyBib3dsIG9mIGJvbG9nbmVzZS4uLlxuICBzZWFyY2hIaWdobGlnaHQoc2VhcmNoKSB7XG5cbiAgICB0aGlzLmN1cnJlbnRQbGFuZXQgPSBmYWxzZTtcbiAgICB0aGlzLmhpZGVMYWJlbHMoKTtcbiAgICB0aGlzLmZpdFZpZXdwb3J0KCk7XG5cbiAgICB0aGlzLnBsYW5ldHMuZm9yRWFjaChwbGFuZXQgPT4ge1xuICAgICAgcGxhbmV0Lmdyb3VwLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0Jyk7XG4gICAgfSk7XG5cblxuICAgIGNvbnN0IG1hdGNoaW5nUGxhbmV0cyA9IHRoaXMucGxhbmV0TWF0Y2hlcihzZWFyY2gpO1xuXG4gICAgaWYgKG1hdGNoaW5nUGxhbmV0cyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAvLyBIaWdobGlnaHQgbWF0Y2hlcyB2aXN1YWxseSBvbiBkZXNrdG9wXG4gICAgbWF0Y2hpbmdQbGFuZXRzLmZvckVhY2gocGxhbmV0ID0+IHBsYW5ldC5ncm91cC5ub2RlLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodCcpKTtcbiAgICBtYXRjaGluZ1BsYW5ldHMuZm9yRWFjaChwbGFuZXQgPT4gdGhpcy5oaWRlTGFiZWxzKCkpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoXG4gICAgaWYobWF0Y2hpbmdQbGFuZXRzLmxlbmd0aCA9PT0gMSkge1xuXG4gICAgICAvLyBUT0RPOiBwcmUtc2VsZWN0IHRoZSBzZWFyY2hlZCBzaXRlIGluIHRoZSBzaXRlIGRyb3Bkb3duXG4gICAgICB0aGlzLmN1cnJlbnRQbGFuZXQgPSBtYXRjaGluZ1BsYW5ldHNbMF07XG4gICAgICB0aGlzLnRhcmdldEluZGV4ID0gdGhpcy5nZXRTb3J0ZWRQbGFuZXRzKCkuaW5kZXhPZih0aGlzLmN1cnJlbnRQbGFuZXQpO1xuICAgICAgdGhpcy5zaG93TGFiZWwoKTtcbiAgICAgIGlmKHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCA9PT0gdGhpcy5zZXRMaW5lUG9zaXRpb25zKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUG9zaXRpb25Nb2RlbCgpO1xuICAgICAgfVxuICAgICAgLy90aGlzLnNjcm9sbFRvVmlldygpO1xuICAgICAgcmV0dXJuOyAvLyBtYXRjaCBmb3VuZCwgYnJlYWsgZWFybHlcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbXVsdGlwbGUgbWF0Y2hlc1xuICAgIGlmKFxuICAgICAgbWF0Y2hpbmdQbGFuZXRzLmxlbmd0aCA+IDFcbiAgICApIHtcblxuXG4gICAgICAvL3RoaXMuc2Nyb2xsVG9WaWV3KCk7XG4gICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwgPSB0aGlzLnNldEdyaWRQb3NpdGlvbnM7XG4gICAgICB0aGlzLmFjdGl2ZVBvc2l0aW9uTW9kZWwoKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUpIHsgbWF0Y2hpbmdQbGFuZXRzLmZvckVhY2gocGxhbmV0ID0+IHRoaXMuc2hvd0xhYmVsKHBsYW5ldCkpOyB9XG4gICAgICB9LCB0aGlzLmFuaW1EdXJhdGlvbiAtIDEwMCk7XG5cblxuXG4gICAgfSBlbHNlIHsgLy8gTm8gbWF0Y2hlc1xuICAgICAgdGhpcy5jdXJyZW50UGxhbmV0ID0gZmFsc2U7XG4gICAgICB0aGlzLmhpZGVMYWJlbHMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNldHMgYWxsIGhpZ2hsaWdodGVkIHBsYW5ldHNcbiAgY2xlYXJIaWdobGlnaHRzKCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQnKS5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodCcpKTtcbiAgfVxuXG4gIC8vIEhpZGVzIHBsYW5ldHMgdGhhdCBkb24ndCBtYXRjaCB0aGUgZ2l2ZW4gdmFsdWVcbiAgZmlsdGVyQnkoa2V5LCB2YWx1ZXMgPSBbXSkge1xuICAgIHRoaXMucGxhbmV0cy5mb3JFYWNoKHBsYW5ldCA9PiB7XG4gICAgICBjb25zdCB2aXNpYmxlID0gdmFsdWVzLnJlZHVjZSgocmVzdWx0LCB2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IHBsYW5ldC5kYXRhW2tleV0uaW5jbHVkZXModmFsdWUpO1xuICAgICAgfSwgZmFsc2UpO1xuICAgICAgcGxhbmV0LmhpZGRlbiA9ICF2aXNpYmxlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlcyBhbmQgc2V0cyBlYWNoIHBsYW5ldCB0byB0aGVpciBjb3JyZXNwb25kaW5nIGdyaWQgY29vcmRpbmF0ZVxuICBzZXRHcmlkUG9zaXRpb25zKCkge1xuXG4gICAgdGhpcy5ncmlkV2lkdGggPSBjZWlsKHNxcnQodGhpcy5nZXRWaXNpYmxlUGxhbmV0cygpLmxlbmd0aCkpO1xuICAgIHRoaXMuZ2V0U29ydGVkUGxhbmV0cygpLmZvckVhY2goKHBsYW5ldCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5maW5kR3JpZFBvc2l0aW9uKGluZGV4KTtcbiAgICAgIHBsYW5ldC54ID0geDtcbiAgICAgIHBsYW5ldC55ID0geTtcbiAgICB9KTtcbiAgICB0aGlzLm1vdmVBcmVhc1RvUG9zaXRpb25zKCk7XG4gICAgdGhpcy5tb3ZlQ2lyY2xlc1RvUG9zaXRpb25zKCk7XG4gICAgdGhpcy5zZXRTY2FsZXNCeVZhbHVlKFxuICAgICAgdGhpcy5zY2FsZTFTZWxlY3Qub3B0aW9uc1t0aGlzLnNjYWxlMVNlbGVjdC5zZWxlY3RlZEluZGV4XS52YWx1ZSxcbiAgICAgIHRoaXMuc2NhbGUyU2VsZWN0Lm9wdGlvbnNbdGhpcy5zY2FsZTJTZWxlY3Quc2VsZWN0ZWRJbmRleF0udmFsdWVcbiAgICApO1xuICAgIGlmKHRoaXMuY3VycmVudFBsYW5ldCkge1xuICAgICAgdGhpcy5zaG93TGFiZWwoKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8vIENhbGN1bGF0ZXMgYW5kIHNldHMgZWFjaCBwbGFuZXQgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBsaW5lIGNvb3JkaW5hdGVcbiAgc2V0TGluZVBvc2l0aW9ucyh0YXJnZXRJbmRleCA9IHRoaXMudGFyZ2V0SW5kZXgpIHtcblxuICAgIHRoaXMuY2xlYXJIaWdobGlnaHRzKCk7XG4gICAgdGhpcy5ncmlkV2lkdGggPSAzO1xuICAgIGNvbnN0IHkgPSB0aGlzLm1vYmlsZSA/IHRoaXMubGluZVlNb2JpbGUgOiB0aGlzLmxpbmVZRGVza3RvcDtcbiAgICB0aGlzLnNvcnRlZFBsYW5ldHMgPSB0aGlzLmdldFNvcnRlZFBsYW5ldHMoKTtcbiAgICB0aGlzLnNvcnRlZFBsYW5ldHMuZm9yRWFjaCgocGxhbmV0LCBpbmRleCkgPT4ge1xuICAgICAgcGxhbmV0LnkgPSB5O1xuICAgICAgcGxhbmV0LnggPSA1MCArIChpbmRleCAtIHRhcmdldEluZGV4KSAqICgxMDAgLyAzKTtcbiAgICB9KTtcbiAgICB0aGlzLm1vdmVBcmVhc1RvUG9zaXRpb25zKCk7XG4gICAgdGhpcy5tb3ZlQ2lyY2xlc1RvUG9zaXRpb25zKCk7XG4gICAgdGhpcy5zZXRTY2FsZXNCeVZhbHVlKFxuICAgICAgdGhpcy5zY2FsZTFTZWxlY3Qub3B0aW9uc1t0aGlzLnNjYWxlMVNlbGVjdC5zZWxlY3RlZEluZGV4XS52YWx1ZSxcbiAgICAgIHRoaXMuc2NhbGUyU2VsZWN0Lm9wdGlvbnNbdGhpcy5zY2FsZTJTZWxlY3Quc2VsZWN0ZWRJbmRleF0udmFsdWVcbiAgICApO1xuICAgIHRoaXMuaGlkZUxhYmVscygpO1xuICAgIHRoaXMuY3VycmVudFBsYW5ldCA9IHRoaXMuc29ydGVkUGxhbmV0c1t0YXJnZXRJbmRleF07XG4gICAgdGhpcy5kaXNwbGF5RGV0YWlscygpO1xuXG5cbiAgICAvL3RpbWVvdXQgZm9yIGxhYmVscyB0byBiZSB2aXNpYmxlIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvd0xhYmVsKCksIHRoaXMuYW5pbUR1cmF0aW9uIC0gMTAwKTtcblxuICB9XG5cbiAgLy8gU291cmNlIGRhdGEgbWF5IGNvbnRhaW4gd2Fja3kgY2hhcmFjdGVycywgdGhpcyBhdHRlbXB0cyB0byBzYW5pdGl6ZSBpdFxuICBwYXJzZUNoYW5nZVZhbHVlKGNoYW5nZSkge1xuICAgIGlmKHR5cGVvZiBjaGFuZ2UgPT09ICdudW1iZXInKSByZXR1cm4gY2hhbmdlO1xuICAgIGlmKGNoYW5nZSA9PT0gJycpIHJldHVybiBudWxsO1xuICAgIGxldCByZXN1bHQ7XG4gICAgcmVzdWx0ID0gTWF0aC5yb3VuZChjaGFuZ2UucmVwbGFjZSgnLCcsICcuJykucmVwbGFjZSgn4oiSJywgJy0nKSk7XG4gICAgaWYoTnVtYmVyLmlzTmFOKHJlc3VsdCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRDaGFuZ2VDbGFzcyhjaGFuZ2UpIHtcbiAgICBjb25zdCBjaGFuZ2VOdW1iZXIgPSB0aGlzLnBhcnNlQ2hhbmdlVmFsdWUoY2hhbmdlKTtcbiAgICBpZih0eXBlb2YgY2hhbmdlTnVtYmVyICE9PSAnbnVtYmVyJykgcmV0dXJuICcnO1xuICAgIGlmKGNoYW5nZU51bWJlciA9PT0gMCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBjaGFuZ2VOdW1iZXIgPCAwID8gJ2ZhbGwnIDogJ3Jpc2UnO1xuICB9XG5cbiAgZm9ybWF0Q2hhbmdlVmFsdWUoY2hhbmdlKSB7XG4gICAgaWYoY2hhbmdlID09PSAnJykgcmV0dXJuICctJztcbiAgICByZXR1cm4gdGhpcy5wYXJzZUNoYW5nZVZhbHVlKGNoYW5nZSkgKyAnJSc7XG4gIH1cblxuICAvLyBQb3B1bGF0ZSBhbmQgZGlzcGxheSBhIHBsYW5ldCdzIGRldGFpbGVkIGRhdGEgdmlld3NcbiAgZGlzcGxheURldGFpbHMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZ3JvdXAsIHRhcmdldCxcbiAgICAgIGNyYXNtYW5faW5kZXgsIGNyYXNtYW5faW5kZXhfY2hhbmdlLFxuICAgICAgdHVybm92ZXIsIHR1cm5vdmVyX2NoYW5nZVxuICAgIH0gPSB0aGlzLmN1cnJlbnRQbGFuZXQuZGF0YTtcblxuICAgIHRoaXMuZGV0YWlsc0dyb3VwLmlubmVyVGV4dCA9IGdyb3VwO1xuICAgIHRoaXMuZGV0YWlsc1R1cm5vdmVyLmlubmVyVGV4dCA9IHR1cm5vdmVyO1xuICAgIHRoaXMuZGV0YWlsc1R1cm5vdmVyQ2hhbmdlLmlubmVyVGV4dCA9IHRoaXMuZm9ybWF0Q2hhbmdlVmFsdWUodHVybm92ZXJfY2hhbmdlKTtcbiAgICB0aGlzLmRldGFpbHNUdXJub3ZlckNoYW5nZS5jbGFzc05hbWUgPSB0aGlzLmdldENoYW5nZUNsYXNzKHR1cm5vdmVyX2NoYW5nZSk7XG4gICAgdGhpcy5kZXRhaWxzQ3Jhc21hbkluZGV4LmlubmVyVGV4dCA9IGNyYXNtYW5faW5kZXg7XG4gICAgdGhpcy5kZXRhaWxzQ3Jhc21hbkluZGV4Q2hhbmdlLmlubmVyVGV4dCA9IHRoaXMuZm9ybWF0Q2hhbmdlVmFsdWUoY3Jhc21hbl9pbmRleF9jaGFuZ2UpO1xuICAgIHRoaXMuZGV0YWlsc0NyYXNtYW5JbmRleENoYW5nZS5jbGFzc05hbWUgPSB0aGlzLmdldENoYW5nZUNsYXNzKGNyYXNtYW5faW5kZXhfY2hhbmdlKTtcblxuICAgIGxldCBzaXRlID0gdGhpcy5jdXJyZW50UGxhbmV0LmRhdGE7XG5cblxuICAgIGxldCBjcnV4RGF0YSA9IFtdO1xuXG5cbiAgICBpZighdGFyZ2V0IHx8IHRhcmdldC5sZW5ndGggPT09IDApIHsgLy8gR3JvdXAgcGxhbmV0XG4gICAgICB0aGlzLmRldGFpbHNUYXJnZXQuaW5uZXJUZXh0ID0gJyc7XG4gICAgICBjb25zdCBzaXRlcyA9IHRoaXMuX2RldGFpbHMuZmlsdGVyKGQgPT4gZC5ncm91cCA9PT0gZ3JvdXApO1xuICAgICAgY29uc3QgY3VycmVudFNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaElucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmN1cnJlbnRTaXRlID0gc2l0ZXMuZmluZChzaXRlID0+IHNpdGUudGFyZ2V0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY3VycmVudFNlYXJjaFRlcm0pKTtcblxuICAgICAgLy9maW5kIGN1cnJlbnQgY3J1eCBkYXRhIGZvciBncm91cFxuICAgICAgY3J1eERhdGEgPSB0aGlzLl9jcnV4RGF0YS5maW5kKGQgPT4gZC5vcmlnaW4uaW5jbHVkZXModGhpcy5jdXJyZW50U2l0ZS50YXJnZXQpKVxuXG4gICAgICB0aGlzLmRpc3BsYXlTaXRlc09wdGlvbnMoc2l0ZXMsIGN1cnJlbnRTZWFyY2hUZXJtKTtcbiAgICAgIHRoaXMuZGV0YWlsc1RhcmdldHMucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICAgIHRoaXMuZGV0YWlsc1NpdGUuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICB0aGlzLmRpc3BsYXlTaXRlRGV0YWlscyh0aGlzLmN1cnJlbnRTaXRlID8gdGhpcy5jdXJyZW50U2l0ZSA6IHNpdGVzWzBdLCB0aGlzLnNvcnRlZFBsYW5ldHMsIGNydXhEYXRhKTtcblxuICAgIH0gZWxzZSB7IC8vIFNpbmdsZSBzaXRlIHBsYW5ldFxuICAgICAgdGhpcy5kZXRhaWxzU2l0ZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHRoaXMuZGV0YWlsc1RhcmdldHMucGFyZW50Tm9kZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHRoaXMuZGV0YWlsc1RhcmdldC5pbm5lclRleHQgPSB0YXJnZXQucmVwbGFjZSgvXnd3d1xcLi8sJycpO1xuXG4gICAgICAvL2ZpbmQgY3VycmVudCBjcnV4IGRhdGEgZm9yIHNpbmdsZSBwbGFuZXRcbiAgICAgIGNydXhEYXRhID0gdGhpcy5fY3J1eERhdGEuZmluZChkID0+IGQub3JpZ2luLmluY2x1ZGVzKHRhcmdldCkpXG5cblxuICAgICAgdGhpcy5kaXNwbGF5U2l0ZURldGFpbHModGhpcy5jdXJyZW50UGxhbmV0LmRhdGEsIHRoaXMuc29ydGVkUGxhbmV0cywgY3J1eERhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5vdmVyUG9zaXRpb24gPSB0aGlzLmdldFBsYW5ldFBvc2l0aW9uKHNpdGUudXVpZCwgJ3R1cm5vdmVyJywgdGhpcy5zb3J0ZWRQbGFuZXRzKTtcbiAgICB0aGlzLmRldGFpbHNQb3NpdGlvblR1cm5vdmVyLmlubmVyVGV4dCA9IHR1cm5vdmVyUG9zaXRpb24uY3VycmVudCArICcvJyArIHR1cm5vdmVyUG9zaXRpb24udG90YWw7XG5cbiAgICBjb25zdCBjcmFzbWFuSW5kZXhQb3NpdGlvbiA9IHRoaXMuZ2V0UGxhbmV0UG9zaXRpb24oc2l0ZS51dWlkLCAnY3Jhc21hbl9pbmRleCcsIHRoaXMuc29ydGVkUGxhbmV0cyk7XG4gICAgdGhpcy5kZXRhaWxzUG9zaXRpb25DcmFzbWFuSW5kZXguaW5uZXJUZXh0ID0gY3Jhc21hbkluZGV4UG9zaXRpb24uY3VycmVudCArICcvJyArIGNyYXNtYW5JbmRleFBvc2l0aW9uLnRvdGFsO1xuICB9XG5cbiAgZGlzcGxheVNpdGVzT3B0aW9ucyhzaXRlcywgc2VhcmNoVGVybSkge1xuICAgIHRoaXMuZGV0YWlsc1RhcmdldHMuaW5uZXJIVE1MID0gc2l0ZXMubWFwKChzaXRlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGA8b3B0aW9uIHZhbHVlPVwiJHtcbiAgICAgICAgc2l0ZS51dWlkXG4gICAgICB9XCIke1xuICAgICAgICBzZWFyY2hUZXJtICE9PSAnJyAmJiBzaXRlLnRhcmdldC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pID8gJyBzZWxlY3RlZCcgOiAnJ1xuICAgICAgfT4ke1xuICAgICAgICBzaXRlLnRhcmdldC5yZXBsYWNlKC9ed3d3XFwuLywnJylcbiAgICAgIH08L29wdGlvbj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgZ2V0UGxhbmV0UG9zaXRpb24odXVpZCwga2V5LCBwbGFuZXRzKSB7XG4gICAgY29uc3Qgc29ydGVkUGxhbmV0cyA9IHBsYW5ldHMuc29ydCgoYSwgYikgPT4gYi5kYXRhW2tleV0gLSBhLmRhdGFba2V5XSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHNvcnRlZFBsYW5ldHMuZmluZEluZGV4KHAgPT4gcC5kYXRhLnV1aWQgPT09IHV1aWQpICsgMSxcbiAgICAgIHRvdGFsOiBwbGFuZXRzLmxlbmd0aFxuICAgIH07XG4gIH1cblxuICBnZXRTaXRlUG9zaXRpb24odXVpZCwga2V5LCBwbGFuZXRzKSB7XG5cbiAgICBjb25zdCBjdXJyZW50U2l0ZXMgPSBmbGF0TWFwKHBsYW5ldHMsIHBsYW5ldCA9PiB7XG4gICAgICBpZihwbGFuZXQuZGF0YS50YXJnZXQgIT09ICcnKSByZXR1cm4gcGxhbmV0LmRhdGE7XG4gICAgICByZXR1cm4gdGhpcy5fZGV0YWlscy5maWx0ZXIoZGV0YWlsID0+IGRldGFpbC5ncm91cCA9PT0gcGxhbmV0LmRhdGEuZ3JvdXApO1xuICAgIH0pLnNvcnQoKGEsIGIpID0+IGJba2V5XSAtIGFba2V5XSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IGN1cnJlbnRTaXRlcy5maW5kSW5kZXgoc2l0ZSA9PiBzaXRlLnV1aWQgPT09IHV1aWQpICsgMSxcbiAgICAgIHRvdGFsOiBjdXJyZW50U2l0ZXMubGVuZ3RoXG4gICAgfTtcbiAgfVxuXG4gIGdldFNpdGVNZXRyaWNQb3NpdGlvbih1dWlkLCBrZXksIHRhcmdldCkge1xuXG4gICAgLyogc29ydCBjcnV4ZGF0YSBieSBtZXRyaWNzLmtleS5oaXN0cm9ncmFtWzBdIHZhbHVlIGJhc2VkIGFzYyAqL1xuICAgIGNvbnN0IHNvcnRlZENydXhEYXRhID0gdGhpcy5fY3J1eERhdGEuc29ydCgoYSwgYikgPT4ge1xuXG4gICAgICBpZiAoYS5tZXRyaWNzICE9PSB1bmRlZmluZWQgJiYgYS5tZXRyaWNzW2tleV0gJiYgYi5tZXRyaWNzICE9PSB1bmRlZmluZWQgJiYgYi5tZXRyaWNzW2tleV0pIHtcbiAgICAgICAgY29uc3QgYU1ldHJpYyA9IGEubWV0cmljc1trZXldLmhpc3RvZ3JhbVswXS5kZW5zaXR5O1xuICAgICAgICBjb25zdCBiTWV0cmljID0gYi5tZXRyaWNzW2tleV0uaGlzdG9ncmFtWzBdLmRlbnNpdHk7XG4gICAgICAgIHJldHVybiBiTWV0cmljIC0gYU1ldHJpYztcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHNvcnRlZENydXhEYXRhLmZpbmRJbmRleChjcnV4RGF0YSA9PiBjcnV4RGF0YS5vcmlnaW4uaW5jbHVkZXModGFyZ2V0KSkgKyAxLFxuICAgICAgdG90YWw6IHNvcnRlZENydXhEYXRhLmxlbmd0aFxuICAgIH07XG5cbiAgfVxuXG5cblxuICBkaXNwbGF5U2l0ZURldGFpbHMoc2l0ZSwgcGxhbmV0cywgY3J1eERhdGEpIHtcbiAgICBjb25zdCB7XG4gICAgICB0b3RhbF90cmFmZmljLCB0b3RhbF90cmFmZmljX2NoYW5nZSxcbiAgICAgIHRvdGFsX2tleXdvcmRzLCB0b3RhbF9rZXl3b3Jkc19jaGFuZ2UsXG4gICAgICB0b3RhbF9iYWNrbGlua3MsIHRvdGFsX2JhY2tsaW5rc19jaGFuZ2VcbiAgICB9ID0gc2l0ZTtcblxuXG5cbiAgICBpZiAoY3J1eERhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jcnV4RGF0YUNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuXG4gICAgICBjb25zdCBjcnV4ID0gQ3J1eE1ldGVycygpO1xuICAgICAgY3J1eC5pbml0KGNydXhEYXRhLm1ldHJpY3MsIHRoaXMuY3J1eERhdGFDb250YWluZXIpO1xuXG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcnV4RGF0YUNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgdGhpcy5jcnV4RGF0YUNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLmRldGFpbHNUcmFmZmljLmlubmVyVGV4dCA9IHRvdGFsX3RyYWZmaWM7XG4gICAgdGhpcy5kZXRhaWxzVHJhZmZpY0NoYW5nZS5pbm5lclRleHQgPSB0aGlzLmZvcm1hdENoYW5nZVZhbHVlKHRvdGFsX3RyYWZmaWNfY2hhbmdlKTtcbiAgICB0aGlzLmRldGFpbHNUcmFmZmljQ2hhbmdlLmNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2hhbmdlQ2xhc3ModG90YWxfdHJhZmZpY19jaGFuZ2UpO1xuICAgIGNvbnN0IHBvc2l0aW9uVG90YWxUcmFmZmljID0gdGhpcy5nZXRTaXRlUG9zaXRpb24oc2l0ZS51dWlkLCAndG90YWxfdHJhZmZpYycsIHBsYW5ldHMpO1xuICAgIHRoaXMuZGV0YWlsc1Bvc2l0aW9uVHJhZmZpYy5pbm5lclRleHQgPSBwb3NpdGlvblRvdGFsVHJhZmZpYy5jdXJyZW50ICsgJy8nICsgcG9zaXRpb25Ub3RhbFRyYWZmaWMudG90YWw7XG5cbiAgICB0aGlzLmRldGFpbHNUb3RhbEtleXdvcmRzLmlubmVyVGV4dCA9IHRvdGFsX2tleXdvcmRzO1xuICAgIHRoaXMuZGV0YWlsc1RvdGFsS2V5d29yZHNDaGFuZ2UuaW5uZXJUZXh0ID0gdGhpcy5mb3JtYXRDaGFuZ2VWYWx1ZSh0b3RhbF9rZXl3b3Jkc19jaGFuZ2UpO1xuICAgIHRoaXMuZGV0YWlsc1RvdGFsS2V5d29yZHNDaGFuZ2UuY2xhc3NOYW1lID0gdGhpcy5nZXRDaGFuZ2VDbGFzcyh0b3RhbF9rZXl3b3Jkc19jaGFuZ2UpO1xuICAgIGNvbnN0IHBvc2l0aW9uVG90YWxLZXl3b3JkcyA9IHRoaXMuZ2V0U2l0ZVBvc2l0aW9uKHNpdGUudXVpZCwgJ3RvdGFsX2tleXdvcmRzJywgcGxhbmV0cyk7XG4gICAgdGhpcy5kZXRhaWxzUG9zaXRpb25Ub3RhbEtleXdvcmRzLmlubmVyVGV4dCA9IHBvc2l0aW9uVG90YWxLZXl3b3Jkcy5jdXJyZW50ICsgJy8nICsgcG9zaXRpb25Ub3RhbEtleXdvcmRzLnRvdGFsO1xuXG4gICAgdGhpcy5kZXRhaWxzQmFja2xpbmtzLmlubmVyVGV4dCA9IHRvdGFsX2JhY2tsaW5rcztcbiAgICB0aGlzLmRldGFpbHNCYWNrbGlua3NDaGFuZ2UuaW5uZXJUZXh0ID0gdGhpcy5mb3JtYXRDaGFuZ2VWYWx1ZSh0b3RhbF9iYWNrbGlua3NfY2hhbmdlKTtcbiAgICB0aGlzLmRldGFpbHNCYWNrbGlua3NDaGFuZ2UuY2xhc3NOYW1lID0gdGhpcy5nZXRDaGFuZ2VDbGFzcyh0b3RhbF9iYWNrbGlua3NfY2hhbmdlKTtcbiAgICBjb25zdCBwb3NpdGlvblRvdGFsQmFja2xpbmtzID0gdGhpcy5nZXRTaXRlUG9zaXRpb24oc2l0ZS51dWlkLCAndG90YWxfYmFja2xpbmtzJywgcGxhbmV0cyk7XG4gICAgdGhpcy5kZXRhaWxzUG9zaXRpb25CYWNrbGlua3MuaW5uZXJUZXh0ID0gcG9zaXRpb25Ub3RhbEJhY2tsaW5rcy5jdXJyZW50ICsgJy8nICsgcG9zaXRpb25Ub3RhbEJhY2tsaW5rcy50b3RhbDtcblxuICAgIHRoaXMuZGV0YWlsc1NpdGVDcmFzbWFuSW5kZXguaW5uZXJUZXh0ID0gc2l0ZS5jcmFzbWFuX2luZGV4O1xuICAgIHRoaXMuZGV0YWlsc1NpdGVDcmFzbWFuSW5kZXhDaGFuZ2UuaW5uZXJUZXh0ID0gdGhpcy5mb3JtYXRDaGFuZ2VWYWx1ZShzaXRlLmNyYXNtYW5faW5kZXhfY2hhbmdlKTtcbiAgICB0aGlzLmRldGFpbHNTaXRlQ3Jhc21hbkluZGV4Q2hhbmdlLmNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2hhbmdlQ2xhc3Moc2l0ZS5jcmFzbWFuX2luZGV4X2NoYW5nZSk7XG4gICAgY29uc3QgcG9zaXRpb25TaXRlQ3Jhc21hbkluZGV4ID0gdGhpcy5nZXRTaXRlUG9zaXRpb24oc2l0ZS51dWlkLCAnY3Jhc21hbl9pbmRleCcsIHBsYW5ldHMpO1xuICAgIHRoaXMuZGV0YWlsc1NpdGVQb3NpdGlvbkNyYXNtYW5JbmRleC5pbm5lclRleHQgPSBwb3NpdGlvblNpdGVDcmFzbWFuSW5kZXguY3VycmVudCArICcvJyArIHBvc2l0aW9uU2l0ZUNyYXNtYW5JbmRleC50b3RhbDtcblxuICAgIHRoaXMuZGV0YWlsc1NpdGVUYXJnZXQuaW5uZXJUZXh0ID0gc2l0ZS50YXJnZXQ7XG5cbiAgICB0aGlzLnVwZGF0ZVNpdGVLZXl3b3JkcyhzaXRlKTtcbiAgfVxuXG4gIHVwZGF0ZVNpdGVLZXl3b3JkcyhzaXRlKSB7XG4gICAgY29uc3Qga2V5d29yZHMgPSB0aGlzLmRldGFpbHNLZXl3b3Jkc1llYXIudmFsdWUgPT09ICdjdXJyZW50J1xuICAgICAgPyBzaXRlLm1vc3RfdmFsdWFibGVfa2V5d29yZHMgfHwgW11cbiAgICAgIDogc2l0ZS5tb3N0X3ZhbHVhYmxlX2tleXdvcmRzX3ByZXYgfHwgW107XG4gICAgdGhpcy5kZXRhaWxzS2V5d29yZHMuaW5uZXJIVE1MID0ga2V5d29yZHMubWFwKChrZXl3b3JkLCBpbmRleCkgPT4gaW5kZXggPCA1ID8gYDxsaT4ke1xuICAgICAga2V5d29yZFswXS50b1VwcGVyQ2FzZSgpICsga2V5d29yZC5zbGljZSgxKVxuICAgIH08L2xpPmAgOiAnJykuam9pbignJyk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmVzIHRoZSBncmlkIHBvc2l0aW9uIGJ5IGEgcGxhbmV0J3MgaW5kZXggYW5kIHRoZSBkZXNpcmVkIG51bWJlciBvZiBjb2x1bW5zXG4gIGZpbmRHcmlkUG9zaXRpb24oaW5kZXgsIGdyaWRXaWR0aCA9IHRoaXMuZ3JpZFdpZHRoKSB7XG4gICAgY29uc3QgeCA9ICgxMDAgLyBncmlkV2lkdGggLyAyKSArICgoaW5kZXggJSBncmlkV2lkdGgpIC8gZ3JpZFdpZHRoICogMTAwKTtcbiAgICBjb25zdCB5ID0gKDEwMCAvIGdyaWRXaWR0aCAvIDIpICsgKGZsb29yKGluZGV4IC8gZ3JpZFdpZHRoKSAvIGdyaWRXaWR0aCAqIDEwMCk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgLy8gTW92ZXMgZWFjaCBwbGFuZXQncyBob3ZlciBhcmVhIHRvIGl0J3MgY3VycmVudCBwb3NpdGlvblxuICBtb3ZlQXJlYXNUb1Bvc2l0aW9ucygpIHtcbiAgICB0aGlzLnBsYW5ldHMuZm9yRWFjaChwbGFuZXQgPT4ge1xuICAgICAgaWYoXG4gICAgICAgIHBsYW5ldC54IDwgMCB8fCBwbGFuZXQueCA+IDEwMCB8fFxuICAgICAgICBwbGFuZXQueSA8IDAgfHwgcGxhbmV0LnkgPiAxMDBcbiAgICAgICkge1xuICAgICAgICBwbGFuZXQuYXJlYS5hdHRyKHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwbGFuZXQuYXJlYS5hdHRyKHtcbiAgICAgICAgY3g6IHBsYW5ldC54ICsgJyUnLFxuICAgICAgICBjeTogcGxhbmV0LnkgKyAnJScsXG4gICAgICAgIGRpc3BsYXk6IG51bGxcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5zY2FsZUFyZWFzKCk7XG4gIH1cblxuICAvLyBUcmFuc2l0aW9ucyBlYWNoIHBsYW5ldCdzIGNpcmNsZXMgdG8gaXQncyBjdXJyZW50IHBvc2l0aW9uXG4gIG1vdmVDaXJjbGVzVG9Qb3NpdGlvbnMoKSB7XG4gICAgY29uc3QgeSA9IHRoaXMubW9iaWxlID8gdGhpcy5saW5lWU1vYmlsZSA6IHRoaXMubGluZVlEZXNrdG9wO1xuICAgIHRoaXMucGxhbmV0cy5mb3JFYWNoKHBsYW5ldCA9PiB7XG4gICAgICAvLyBGYWRlIG91dCBwbGFuZXRzIHRoYXQgYXJlIHBvc2l0aW9uZWQgYmV5b25kIHRoZSB2aWV3IGFyZWFcbiAgICAgIGlmKFxuICAgICAgICBwbGFuZXQueCA8IDAgfHwgcGxhbmV0LnggPiAxMDAgfHxcbiAgICAgICAgcGxhbmV0LnkgPCAwIHx8IHBsYW5ldC55ID4gMTAwXG4gICAgICAgICkge1xuICAgICAgICAvLyBjbGFtcCB4IHZhbHVlIG5lYXIgdmlldyBlZGdlc1xuICAgICAgICBjb25zdCB0eCA9IG1pbigxMTAsIG1heChwbGFuZXQueCwgLTEwKSk7XG4gICAgICAgIHBsYW5ldC5jaXJjbGUxLnN0b3AoKS5hbmltYXRlKHtcbiAgICAgICAgICBjeDogdHggKyAnJScsIGN5OiB5ICsgJyUnLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSwgdGhpcy5hbmltRHVyYXRpb24gLyAyLCB0aGlzLmVhc2VPdXQpO1xuICAgICAgICBwbGFuZXQuY2lyY2xlMi5zdG9wKCkuYW5pbWF0ZSh7XG4gICAgICAgICAgY3g6IHR4ICsgJyUnLCBjeTogeSArICclJyxcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0sIHRoaXMuYW5pbUR1cmF0aW9uIC8gMiwgdGhpcy5lYXNlT3V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwbGFuZXQuY2lyY2xlMS5zdG9wKCkuYW5pbWF0ZSh7XG4gICAgICAgIGN4OiBwbGFuZXQueCArICclJyxcbiAgICAgICAgY3k6IHBsYW5ldC55ICsgJyUnLFxuICAgICAgICBvcGFjaXR5OiAxXG4gICAgICB9LCB0aGlzLmFuaW1EdXJhdGlvbiwgdGhpcy5lYXNlT3V0KTtcblxuICAgICAgcGxhbmV0LmNpcmNsZTIuc3RvcCgpLmFuaW1hdGUoe1xuICAgICAgICBjeDogcGxhbmV0LnggKyAnJScsXG4gICAgICAgIGN5OiBwbGFuZXQueSArICclJyxcbiAgICAgICAgb3BhY2l0eTogMVxuICAgICAgfSwgdGhpcy5hbmltRHVyYXRpb24sIHRoaXMuZWFzZU91dCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmVzIGFuZCBzZXRzIGFuIGFwcHJvcHJpYXRlIHNjYWxlIGZvciBlYWNoIHBsYW5ldCdzIGNpcmNsZXNcbiAgc2V0U2NhbGVzQnlWYWx1ZShrZXkxLCBrZXkyKSB7XG4gICAgY29uc3QgdmFsdWVzUmFuZ2UxID0gdGhpcy52YWx1ZXNSYW5nZShrZXkxKTtcbiAgICBjb25zdCB2YWx1ZXNSYW5nZTIgPSB0aGlzLnZhbHVlc1JhbmdlKGtleTIpO1xuICAgIHRoaXMucGxhbmV0cy5mb3JFYWNoKHBsYW5ldCA9PiB7XG4gICAgICBwbGFuZXQucmFkaXVzMSA9IHBsYW5ldC5oaWRkZW4gPyAwIDogMSArIG1heChcbiAgICAgICAgMCxcbiAgICAgICAgKHBsYW5ldC5kYXRhW2tleTFdIC8gdmFsdWVzUmFuZ2UxLm1heCkgKiAoXG4gICAgICAgICAgMSAvIHRoaXMuZ3JpZFdpZHRoICogTWF0aC5taW4odGhpcy5oZWlnaHQsIHRoaXMud2lkdGgpIC8gMlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcGxhbmV0LnJhZGl1czIgPSBwbGFuZXQuaGlkZGVuID8gMCA6IDEgKyBtYXgoXG4gICAgICAgIDAsXG4gICAgICAgIChwbGFuZXQuZGF0YVtrZXkyXSAvIHZhbHVlc1JhbmdlMi5tYXgpICogKFxuICAgICAgICAgIDEgLyB0aGlzLmdyaWRXaWR0aCAqIE1hdGgubWluKHRoaXMuaGVpZ2h0LCB0aGlzLndpZHRoKSAvIDJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2NhbGVQbGFuZXRzKCk7XG4gIH1cblxuICAvLyBTZXRzIGFuIGFwcHJvcHJpYXRlIHNpemUgZm9yIGFsbCBwbGFuZXRzJyBoaXQgYXJlYVxuICBzY2FsZUFyZWFzKCkge1xuICAgIGNvbnN0IHNxdWFyZVNpemUgPSB0aGlzLmdyaWRTcXVhcmVTaXplKCk7XG4gICAgdGhpcy5wbGFuZXRzLmZvckVhY2gocGxhbmV0ID0+IHBsYW5ldC5hcmVhLmF0dHIoe1xuICAgICAgcjogcGxhbmV0LmhpZGRlbiA/IDAgOiBzcXVhcmVTaXplIC8gMlxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIFRyYW5zaXRpb25zIGVhY2ggcGxhbmV0J3MgY2lyY2xlcyB0byB0aGUgY3VycmVudCByYWRpaVxuICBzY2FsZVBsYW5ldHMoKSB7XG4gICAgdGhpcy5wbGFuZXRzLmZvckVhY2gocGxhbmV0ID0+IHtcbiAgICAgIHBsYW5ldC5jaXJjbGUxLmFuaW1hdGUoe1xuICAgICAgICByOiBwbGFuZXQucmFkaXVzMVxuICAgICAgfSwgdGhpcy5hbmltRHVyYXRpb24sIHRoaXMuZWFzZU91dCk7XG4gICAgICBwbGFuZXQuY2lyY2xlMi5hbmltYXRlKHtcbiAgICAgICAgcjogcGxhbmV0LnJhZGl1czJcbiAgICAgIH0sIHRoaXMuYW5pbUR1cmF0aW9uLCB0aGlzLmVhc2VPdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZHMgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBmb3IgYSBnaXZlbiBrZXksIGV4Y2x1ZGluZyBoaWRkZW4gcGxhbmV0c1xuICB2YWx1ZXNSYW5nZShrZXkpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZpc2libGVQbGFuZXRzKCkubWFwKHAgPT4gcC5kYXRhW2tleV0gfHwgMCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbjogbWluKC4uLnZhbHVlcyksXG4gICAgICBtYXg6IG1heCgxLCAuLi52YWx1ZXMpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE1hdGguIE5vdCBldmVuIG9uY2UuXG4gIGVhc2VPdXQgKHQpIHtcbiAgICByZXR1cm4gKC0tdCkgKiB0ICogdCArIDE7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQUtMU3VtbWl0VmlzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnJhbmNoQmFyID0ge1xuICBfbWluaWZpZWRDbGFzczogJ2JyYW5jaC1iYXItLW1pbmlmaWVkJyxcbiAgX2hpZGRlbkNsYXNzOiAnYnJhbmNoLWJhci0taGlkZGVuJyxcbiAgX3N0b3JhZ2VTZXR0aW5nczogbnVsbCxcbiAgX2ZvbGRlcklkOiBudWxsLFxuICBfc2V0dGluZ3NLZXk6IG51bGwsXG4gIF9kb206IHtcbiAgICBiYXI6IG51bGwsXG4gICAgdG9nZ2xlczogbnVsbCxcbiAgICBwYWdlU2VsZWN0czogbnVsbFxuICB9LFxuICBfaXNMb2NhbFN0b3JhZ2VFbmFibGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSAnYnJhbmNoLWJhci10ZXN0JztcblxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgX2lzTWluaWZpZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tLmJhci5jbGFzc05hbWUuc3BsaXQoJyAnKS5pbmRleE9mKHRoaXMuX21pbmlmaWVkQ2xhc3MpID49IDA7XG4gIH0sXG4gIF9nZXRTZXR0aW5nczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZXR0aW5ncyA9IG51bGw7XG5cbiAgICBpZiAoIXRoaXMuX2lzTG9jYWxTdG9yYWdlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fZm9sZGVySWQgPSB0aGlzLl9kb20uYmFyLmdldEF0dHJpYnV0ZSgnZGF0YS1mb2xkZXItaWQnKTtcbiAgICB0aGlzLl9zZXR0aW5nc0tleSA9ICdicmFuY2gtYmFyLS0nICsgdGhpcy5fZm9sZGVySWQ7XG4gICAgaWYgKHRoaXMuX3NldHRpbmdzS2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXR0aW5ncyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5fc2V0dGluZ3NLZXkpKTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH0sXG4gIF91cGRhdGVTZXR0aW5nczogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5faXNMb2NhbFN0b3JhZ2VFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2VTZXR0aW5ncykge1xuICAgICAgdGhpcy5fc3RvcmFnZVNldHRpbmdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmFnZVNldHRpbmdzLm1pbmlmaWVkID0gdGhpcy5faXNNaW5pZmllZCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuX3NldHRpbmdzS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLl9zdG9yYWdlU2V0dGluZ3MpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIF90b2dnbGVNaW5pZmllZDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9pc01pbmlmaWVkKCkpIHtcbiAgICAgIHZhciByZWcgPSBuZXcgUmVnRXhwKCcoXFxcXHN8XiknICsgdGhpcy5fbWluaWZpZWRDbGFzcyArICcoXFxcXHN8JCknKTtcbiAgICAgIHRoaXMuX2RvbS5iYXIuY2xhc3NOYW1lID0gdGhpcy5fZG9tLmJhci5jbGFzc05hbWUucmVwbGFjZShyZWcsICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RvbS5iYXIuY2xhc3NOYW1lICs9ICcgJyArIHRoaXMuX21pbmlmaWVkQ2xhc3M7XG4gICAgfVxuICB9LFxuICBfaW5pdFRvZ2dsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLl9kb20udG9nZ2xlcyA9IHRoaXMuX2RvbS5iYXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtYnJhbmNoLWJhcl9fdG9nZ2xlJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX2RvbS50b2dnbGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpcy5fZG9tLnRvZ2dsZXNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX3RvZ2dsZU1pbmlmaWVkKCk7XG4gICAgICAgIHNlbGYuX3VwZGF0ZVNldHRpbmdzKCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuICB9LFxuICBfaW5pdFBhZ2VTZWxlY3RzOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fZG9tLnBhZ2VTZWxlY3RzID0gdGhpcy5fZG9tLmJhci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy1icmFuY2gtYmFyX19wYWdlLXNlbGVjdCcpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLl9kb20ucGFnZVNlbGVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLl9kb20ucGFnZVNlbGVjdHNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHZhbCA9IGUudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cbiAgfSxcbiAgX3Nob3dCYXI6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgnKFxcXFxzfF4pJyArIHRoaXMuX2hpZGRlbkNsYXNzICsgJyhcXFxcc3wkKScpO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHNlbGYuX2RvbS5iYXIuY2xhc3NOYW1lID0gc2VsZi5fZG9tLmJhci5jbGFzc05hbWUucmVwbGFjZShyZWcsICcgJyk7XG4gIH0sXG4gIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9kb20uYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLWJyYW5jaC1iYXInKTsgLy8gQXNzdW1lcyBvbmx5IG9uZSBiYXIgcGVyIHBhZ2VcblxuICAgIGlmICh0aGlzLl9kb20uYmFyKSB7XG4gICAgICB0aGlzLl9zdG9yYWdlU2V0dGluZ3MgPSB0aGlzLl9nZXRTZXR0aW5ncygpO1xuXG4gICAgICAvLyBJZiB1c2VyIGxlZnQgdGhlIGJhciBvcGVuXG4gICAgICBpZiAodGhpcy5fc3RvcmFnZVNldHRpbmdzICYmICF0aGlzLl9zdG9yYWdlU2V0dGluZ3MubWluaWZpZWQpIHtcbiAgICAgICAgdGhpcy5fdG9nZ2xlTWluaWZpZWQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdFRvZ2dsZXMoKTtcbiAgICAgIHRoaXMuX2luaXRQYWdlU2VsZWN0cygpO1xuXG4gICAgICB0aGlzLl9zaG93QmFyKCk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJyYW5jaEJhcjtcbiIsIi8qIGNydXggZGF0YSBjYWxjdWxhdGlvbnMgKi9cbmltcG9ydCBTbmFwIGZyb20gJ3NuYXBzdmcnO1xuXG5mdW5jdGlvbiBDcnV4TWV0ZXJzKCl7XG5cbiAgLy9jb3VudCBwZXJjZW50YWdlLiBJZiBuZWVkIHRvIGNoYWdlIHNvbWV0aGluZyB3aXRoIHRoZSB2YWx1ZXMsIGRvIGl0IGhlcmVcbiAgY29uc3QgY291bnRQZXJjZW50YWdlID0gKGRhdGEpID0+IHtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBkYXRhLmhpc3RvZ3JhbVswXS5kZW5zaXR5ICogMTAwO1xuXG4gICAgcmV0dXJuIHBlcmNlbnRhZ2UudG9GaXhlZCgpO1xuXG4gIH07XG5cbiAgLy9nZXQgZGF0YSBmb3Igc3BlZWRvbWV0ZXIsIHZhbHVlIGFuZCB0aXRsZVxuICBjb25zdCBnZXRTcGVlZG9NZXRlckRhdGEgPSAobWV0cmljcykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBjbHM6IHtcbiAgICAgICAgcGVyY2VudGFnZTogY291bnRQZXJjZW50YWdlKG1ldHJpY3MuY3VtdWxhdGl2ZV9sYXlvdXRfc2hpZnQpLFxuICAgICAgICB0aXRsZTogJ0N1bXVsYXRpdmUgTGF5b3V0IFNoaWZ0J1xuICAgICAgfSxcbiAgICAgIGV0dGZiOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IGNvdW50UGVyY2VudGFnZShtZXRyaWNzLmV4cGVyaW1lbnRhbF90aW1lX3RvX2ZpcnN0X2J5dGUpLFxuICAgICAgICB0aXRsZTogJ0V4cGVyaW1lbnRhbCBUaW1lIFRvIEZpcnN0IEJ5dGUnXG4gICAgICB9LFxuICAgICAgZmNwOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IGNvdW50UGVyY2VudGFnZShtZXRyaWNzLmZpcnN0X2NvbnRlbnRmdWxfcGFpbnQpLFxuICAgICAgICB0aXRsZTogJ0ZpcnN0IENvbnRlbnRmdWwgUGFpbnQnXG4gICAgICB9LFxuICAgICAgZmlkOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IGNvdW50UGVyY2VudGFnZShtZXRyaWNzLmZpcnN0X2lucHV0X2RlbGF5KSxcbiAgICAgICAgdGl0bGU6ICdGaXJzdCBJbnB1dCBEZWxheSdcbiAgICAgIH0sXG4gICAgICBpdG5wOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IGNvdW50UGVyY2VudGFnZShtZXRyaWNzLmludGVyYWN0aW9uX3RvX25leHRfcGFpbnQpLFxuICAgICAgICB0aXRsZTogJ0ludGVyYWN0aW9uIFRvIE5leHQgUGFpbnQnXG4gICAgICB9LFxuICAgICAgbGNwOiB7XG4gICAgICAgIHBlcmNlbnRhZ2U6IGNvdW50UGVyY2VudGFnZShtZXRyaWNzLmxhcmdlc3RfY29udGVudGZ1bF9wYWludCksXG4gICAgICAgIHRpdGxlOiAnTGFyZ2VzdCBDb250ZW50ZnVsIFBhaW50J1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuXG4gIGNvbnN0IHBvbGFyX3RvX2NhcnRlc2lhbiA9IChjeCwgY3ksIHJhZGl1cywgYW5nbGUpID0+IHtcbiAgICBsZXQgcmFkaWFucztcbiAgICByYWRpYW5zID0gKGFuZ2xlIC0gOTApICogTWF0aC5QSSAvIDE4MC4wO1xuICAgIHJldHVybiBbTWF0aC5yb3VuZCgoY3ggKyAocmFkaXVzICogTWF0aC5jb3MocmFkaWFucykpKSAqIDEwMCkgLyAxMDAsIE1hdGgucm91bmQoKGN5ICsgKHJhZGl1cyAqIE1hdGguc2luKHJhZGlhbnMpKSkgKiAxMDApIC8gMTAwXTtcbiAgfVxuXG4gIGNvbnN0IHN2Z1BhdGggPSAoeCwgeSwgcmFkaXVzLCBzdGFydF9hbmdsZSwgZW5kX2FuZ2xlKSA9PiB7XG4gICAgbGV0IGVuZF94eSwgc3RhcnRfeHk7XG4gICAgc3RhcnRfeHkgPSBwb2xhcl90b19jYXJ0ZXNpYW4oeCwgeSwgcmFkaXVzLCBlbmRfYW5nbGUpO1xuICAgIGVuZF94eSA9IHBvbGFyX3RvX2NhcnRlc2lhbih4LCB5LCByYWRpdXMsIHN0YXJ0X2FuZ2xlKTtcbiAgICByZXR1cm4gJ00gJyArIHN0YXJ0X3h5WzBdICsgJyAnICsgc3RhcnRfeHlbMV0gKyAnIEEgJyArIHJhZGl1cyArICcgJyArIHJhZGl1cyArICcgMCAwIDAgJyArIGVuZF94eVswXSArICcgJyArIGVuZF94eVsxXTtcbiAgfVxuXG4gIGNvbnN0IGFuaW1hdGVfYXJjID0gKHJhdGlvLCBzdmcpID0+IHtcbiAgICAvL3NldCBhcyBjbG9zZSBhcyAxMDAgdG8gYXZvaWQgZXRlcm5hbCBsb29wIGluIGFuaW1hdGlvblxuICAgIHJhdGlvID0gKHJhdGlvID09PSAnMTAwJykgPyAnLjk5OTk5OTk5JyA6IHJhdGlvO1xuXG4gICAgbGV0IGFyYyA9IHN2Zy5wYXRoKCcnKTtcbiAgICBjb25zdCBjdXJyZW50ID0gc3ZnO1xuICAgIHJldHVybiBTbmFwLmFuaW1hdGUoMCwgcmF0aW8sIChmdW5jdGlvbih2YWwpIHtcblxuICAgICAgdmFyIHBhdGg7XG4gICAgICBhcmMucmVtb3ZlKCk7XG4gICAgICBwYXRoID0gc3ZnUGF0aCg1MDAsIDUwMCwgNDUwLCAtOTAsIHZhbCAqIDE4MC4wIC0gOTApO1xuICAgICAgYXJjID0gc3ZnLnBhdGgocGF0aCk7XG4gICAgICBhcmMuYXR0cih7XG4gICAgICAgIGNsYXNzOiAnZGF0YS1hcmMnXG4gICAgICB9KTtcbiAgICB9KSwgTWF0aC5yb3VuZCg1MDAgKiByYXRpbyksIGZ1bmN0aW9uKCkge1xuICAgICAgLy8gc3RvcCBhbmltYXRpb25cbiAgICAgIGN1cnJlbnQuc3RvcCgpO1xuICAgIH0pO1xuXG4gIH1cblxuICAvL2RyYXcgc3BlZWRvbWV0ZXJcbiAgY29uc3QgZHJhd0NydXhTcGVlZG9tZXRlciA9ICh2YWx1ZSkgPT4ge1xuXG4gICAgY29uc3QgcmF0aW8gPSAodmFsdWUucGVyY2VudGFnZSA8IDEwMCkgPyAnLicrdmFsdWUucGVyY2VudGFnZSA6IHZhbHVlLnBlcmNlbnRhZ2U7XG5cbiAgICAvL3RoZXNlIHZhbHVlcyBhcmUganVzdCBmcm9tIG15IGhlYWQsIGlmIHlvdSB3YW50IHRvIGNoYW5nZSBzb21ldGhpbmcsIGRvIGl0IGhlcmVcbiAgICBsZXQgY29sb3IgPSAnZ3JlZW4nXG4gICAgY29sb3IgPSAodmFsdWUucGVyY2VudGFnZSA8IDgwKSA/ICd5ZWxsb3cnIDogY29sb3I7XG4gICAgY29sb3IgPSAodmFsdWUucGVyY2VudGFnZSA8IDUwKSA/ICdyZWQnIDogY29sb3I7XG5cbiAgICByZXR1cm4gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljIHBhcnRpY2lwYXRpb24gJHtjb2xvcn1cIiBkYXRhLXJhdGlvPVwiJHtyYXRpb31cIj5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTAwMCA1MDBcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNIDk1MCA1MDAgQSA0NTAgNDUwIDAgMCAwIDUwIDUwMFwiPjwvcGF0aD5cbiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSdwZXJjZW50YWdlJyB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGFsaWdubWVudC1iYXNlbGluZT1cIm1pZGRsZVwiIHg9XCI1MDBcIiB5PVwiMzUwXCIgZm9udC1zaXplPVwiMTQwXCIgZm9udC13ZWlnaHQ9XCJib2xkXCI+JHt2YWx1ZS5wZXJjZW50YWdlfSU8L3RleHQ+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHA+JHt2YWx1ZS50aXRsZX08L3A+XG4gICAgICAgIDwvZGl2PiBgO1xuICB9XG5cbiAgLy9kcmF3IHN2ZyBjb250YWluZXIgYW5kIHNwZWVkb21ldGVyc1xuICBjb25zdCBkcmF3U3ZnQ29udGFpbmVyID0gKHZhbHVlKSA9PiB7XG4gICAgbGV0IGh0bWxUb1JldHVybiA9ICc8ZGl2IGNsYXNzPVwiY3J1eC1zcGVlZG9tZXRlclwiPjxkaXYgY2xhc3M9XCJncmlkXCI+JztcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGh0bWxUb1JldHVybiArPSBkcmF3Q3J1eFNwZWVkb21ldGVyKHZhbHVlKTtcbiAgICB9XG4gICAgaHRtbFRvUmV0dXJuICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgIHJldHVybiBodG1sVG9SZXR1cm47XG4gIH1cblxuXG4gIC8vc2V0IGFuaW1hdGlvbiBmb3IgZWFjaCBzcGVlZG9tZXRlclxuICBjb25zdCBpbnRpYWxpemVTcGVlZG9tZXRlcnMgPSAoKSA9PiB7XG5cbiAgICBjb25zdCBzcGVlZG9tZXRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY3J1eC1zcGVlZG9tZXRlciBzdmcnKTtcbiAgICBzcGVlZG9tZXRlcnMuZm9yRWFjaChzcGVlZG9tZXRlciA9PiB7XG4gICAgICBjb25zdCByYXRpbyA9IHNwZWVkb21ldGVyLnBhcmVudEVsZW1lbnQuZGF0YXNldC5yYXRpbztcbiAgICAgIGNvbnN0IHN2ZyA9IFNuYXAoc3BlZWRvbWV0ZXIpO1xuICAgICAgYW5pbWF0ZV9hcmMocmF0aW8sIHN2Zyk7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLy9pbml0IGZ1bmN0aW9uXG4gIGNvbnN0IGluaXQgPSAoY3J1eERhdGEsIGNvbnRhaW5lcikgPT4ge1xuICAgIGNvbnN0IHNwZWVkb0RhdGEgPSBnZXRTcGVlZG9NZXRlckRhdGEoY3J1eERhdGEpO1xuXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGRyYXdTdmdDb250YWluZXIoc3BlZWRvRGF0YSk7XG5cbiAgICBpbnRpYWxpemVTcGVlZG9tZXRlcnMoKTtcbiAgfVxuXG4gIC8vcmV0dXJuIHB1YmxpYyBmdW5jdGlvbnNcbiAgcmV0dXJuIHtcbiAgICBpbml0OiBpbml0LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENydXhNZXRlcnM7XG5cbiIsIi8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3Rcbi8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3Jcbi8vIE4gbWlsbGlzZWNvbmRzLiBJZiBgaW1tZWRpYXRlYCBpcyBwYXNzZWQsIHRyaWdnZXIgdGhlIGZ1bmN0aW9uIG9uIHRoZVxuLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy5cbi8vXG4vLyBVc2FnZSBleGFtcGxlOlxuLypcbnZhciBteUVmZmljaWVudEZuID0gZGVib3VuY2UoZnVuY3Rpb24oKSB7XG4gIC8vIEFsbCB0aGUgdGF4aW5nIHN0dWZmIHlvdSBkb1xufSwgMjUwKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG15RWZmaWNpZW50Rm4pO1xuKi9cblxuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gIHZhciB0aW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKCFpbW1lZGlhdGUpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG4gICAgaWYgKGltbWVkaWF0ZSAmJiAhdGltZW91dCkgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVib3VuY2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRm9jdXMgb3V0bGluZSBkZXRlY3Rpb24gKEZPRClcbiAqIEBtb2R1bGUgJ21vZHVsZXMvZm9jdXMtb3V0bGluZS1kZXRlY3QnXG4gKlxuICogUmVtb3ZlIHRoZSBmb2N1cyBvdXRsaW5lIGlmIHVzaW5nIGEgcG9pbnRpbmcvdG91Y2ggZGV2aWNlLCBhbmQgcmUtZW5hYmxlcyBpdCBpZiBhIGtleSBpcyBwcmVzc2VkLlxuICovXG5cbmNsYXNzIEZvY3VzT3V0bGluZURldGVjdCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBGT0QgaW5zdGFuY2Ugd2l0aCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gSW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaGVscGVyQ2xhc3M9J25vLWZvY3VzLW91dGxpbmUnXSAtIFRoZSBjbGFzc05hbWUgdXNlZCBmb3IgZGlzYWJsaW5nIGZvY3VzIG91dGxpbmVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMucm9vdEVsZW1lbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBoZWxwZXIgY2xhc3MgaXMgYWRkZWRcbiAgICogQHBhcmFtIHthcnJheX0gW29wdGlvbnMuZGlzYWJsZUV2ZW50c10gLSBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBkaXNhYmxpbmcgdGhlIGZvY3VzIG91dGxpbmVcbiAgICogQHBhcmFtIHthcnJheX0gW29wdGlvbnMuZW5hYmxlRXZlbnRzXSAtIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0aGF0IHNob3VsZCB0cmlnZ2VyIHJlLWVuYWJsaW5nIHRoZSBmb2N1cyBvdXRsaW5lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBoZWxwZXJDbGFzczogJ25vLWZvY3VzLW91dGxpbmUnLFxuICAgICAgcm9vdEVsZW1lbnQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIGRpc2FibGVFdmVudHM6IFsnbW91c2Vtb3ZlJywgJ3RvdWNoc3RhcnQnXSxcbiAgICAgIGVuYWJsZUV2ZW50czogWydrZXlkb3duJ11cbiAgICB9XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgRk9ELlxuICAgKi9cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmFkZENTUygpO1xuICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBDU1MgcnVsZXMgZm9yIHJlbW92aW5nIGZvY3VzIG91dGxpbmVzLlxuICAgKi9cbiAgYWRkQ1NTKCkge1xuICAgIGxldCBjc3NFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY3NzRWwuaW5uZXJIVE1MID0gdGhpcy5kaXNhYmxlQ1NTO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY3NzRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hZ2ljIGdldHRlciBmb3IgQ1NTIHJ1bGVzXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIHJ1bGUgZm9yIGRpc2FibGluZyBmb2N1cyBvdXRsaW5lc1xuICAgKi9cbiAgZ2V0IGRpc2FibGVDU1MoKSB7XG4gICAgcmV0dXJuIGAuJHt0aGlzLnNldHRpbmdzLmhlbHBlckNsYXNzfSA6Zm9jdXMgeyBvdXRsaW5lOiAwOyB9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGJvdW5kIGxpc3RlbmVyIGZ1bmN0aW9ucy5cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZXZlbnQgbmFtZXMgd2hpY2ggZGlzYWJsZSBhbmQgZW5hYmxlIGZvY3VzIG91dGxpbmVzLlxuICAgKi9cbiAgYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLmRpc2FibGVIYW5kbGVyID0gdGhpcy5kaXNhYmxlRm9jdXNPdXRsaW5lLmJpbmQodGhpcyk7XG4gICAgdGhpcy5lbmFibGVIYW5kbGVyID0gdGhpcy5lbmFibGVGb2N1c091dGxpbmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldHRpbmdzLmRpc2FibGVFdmVudHMuZm9yRWFjaCh0aGlzLmJpbmREaXNhYmxlRXZlbnQsIHRoaXMpO1xuICAgIHRoaXMuc2V0dGluZ3MuZW5hYmxlRXZlbnRzLmZvckVhY2godGhpcy5iaW5kRW5hYmxlRXZlbnQsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGFuIGV2ZW50IHdoaWNoIHdoZW4gdHJpZ2dlcmVkLCBkaXNhYmxlcyBmb2N1cyBvdXRsaW5lc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqL1xuICBiaW5kRGlzYWJsZUV2ZW50KGV2ZW50TmFtZSkge1xuICAgIHRoaXMuc2V0dGluZ3Mucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50TmFtZSxcbiAgICAgIHRoaXMuZGlzYWJsZUhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYW4gZXZlbnQgd2hpY2ggd2hlbiB0cmlnZ2VyZWQsIGVuYmFibGVzIGZvY3VzIG91dGxpbmVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICovXG4gIGJpbmRFbmFibGVFdmVudChldmVudE5hbWUpIHtcbiAgICB0aGlzLnNldHRpbmdzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICB0aGlzLmVuYWJsZUhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGZvY3VzIG91dGxpbmVzIGFyZSBkaXNhYmxlZCwgYW5kIGlmIG5vdCxcbiAgICogZGlzYWJsZXMgdGhlbSBieSBhZGRpbmcgYSBjbGFzcyB0byB0aGUgcm9vdCBlbGVtZW50LlxuICAgKi9cbiAgZGlzYWJsZUZvY3VzT3V0bGluZSgpIHtcbiAgICBpZighdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3Mucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5oZWxwZXJDbGFzc1xuICAgICAgKTtcbiAgICAgIHRoaXMuX2Rpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGZvY3VzIG91dGxpbmVzIGFyZSBkaXNhYmxlZCwgYW5kIGlmIHRoZXkgYXJlLFxuICAgKiBlbmFibGVzIHRoZW0gYnkgcmVtb3ZpbmcgYSBjbGFzcyBmcm9tIHRoZSByb290IGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBjdXJyZW50IGV2ZW50IG9iamVjdFxuICAgKi9cbiAgZW5hYmxlRm9jdXNPdXRsaW5lKGV2ZW50KSB7XG4gICAgaWYodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICBpZihldmVudC5rZXkgIT09ICdUYWInKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldHRpbmdzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuaGVscGVyQ2xhc3NcbiAgICAgICk7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZvY3VzT3V0bGluZURldGVjdDtcbiIsIi8qXG5nZXQgaHVic3BvdCBmb3JtIGZyb20gZG9tLiBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gaXQuIEFkZCBwb3B1cCBjbGFzcyB0byBib2R5IGFmdGVyIDUwMDBtcy4gQWRkIGNsb3NlIGJ1dHRvbiB0byBwb3B1cC4gQWRkIGV2ZW50IGxpc3RlbmVyIHRvIGNsb3NlIGJ1dHRvbi4gUmVtb3ZlIHBvcHVwIGNsYXNzIGZyb20gYm9keSBvbiBjbGljay5cbiovXG5cbmNvbnN0IGh1YnNwb3RGb3JtID0gKCkgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhic3B0LWZvcm0nKTtcbiAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICBpZiAoZm9ybSkge1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ3BvcHVwJyk7XG4gICAgICBjbG9zZUJ0bi5jbGFzc0xpc3QuYWRkKCdwb3B1cF9fY2xvc2UnKTtcbiAgICAgIGNsb3NlQnRuLmlubmVySFRNTCA9ICdYJztcbiAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xuXG4gICAgfSwgNTAwMCk7XG4gIH1cblxuICBpZiAoY2xvc2VCdG4pIHtcbiAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncG9wdXAnKTtcbiAgICAgIGZvcm0ucmVtb3ZlKCk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBodWJzcG90Rm9ybTtcbiJdfQ=="}