From 06d5772970e9c7fe7e0615f1c004a6a28cd88b4c Mon Sep 17 00:00:00 2001 From: Booteille Date: Thu, 5 Dec 2024 11:36:32 +0100 Subject: [PATCH] Remove minified files from git tracking --- .gitignore | 1 + .../public/js/minified/download.min.js | 2765 --------------- .../default/public/js/minified/files.min.js | 191 -- .../js/minified/list-invitations.min.js | 235 -- .../default/public/js/minified/upload.min.js | 2976 ----------------- .../public/js/minified/worker/archive.js | 0 .../public/js/minified/worker/cancel.js | 2133 ------------ .../public/js/minified/worker/compress.js | 1391 -------- .../public/js/minified/worker/decompress.js | 1161 ------- .../public/js/minified/worker/download.js | 2822 ---------------- .../public/js/minified/worker/encrypt.js | 1930 ----------- .../public/js/minified/worker/infos.js | 2132 ------------ .../default/public/js/minified/worker/main.js | 1 - .../public/js/minified/worker/remove.js | 925 ----- .../public/js/minified/worker/shared.js | 443 --- .../public/js/minified/worker/upload.js | 2963 ---------------- 16 files changed, 1 insertion(+), 22068 deletions(-) delete mode 100644 themes/default/public/js/minified/download.min.js delete mode 100644 themes/default/public/js/minified/files.min.js delete mode 100644 themes/default/public/js/minified/list-invitations.min.js delete mode 100644 themes/default/public/js/minified/upload.min.js delete mode 100644 themes/default/public/js/minified/worker/archive.js delete mode 100644 themes/default/public/js/minified/worker/cancel.js delete mode 100644 themes/default/public/js/minified/worker/compress.js delete mode 100644 themes/default/public/js/minified/worker/decompress.js delete mode 100644 themes/default/public/js/minified/worker/download.js delete mode 100644 themes/default/public/js/minified/worker/encrypt.js delete mode 100644 themes/default/public/js/minified/worker/infos.js delete mode 100644 themes/default/public/js/minified/worker/main.js delete mode 100644 themes/default/public/js/minified/worker/remove.js delete mode 100644 themes/default/public/js/minified/worker/shared.js delete mode 100644 themes/default/public/js/minified/worker/upload.js diff --git a/.gitignore b/.gitignore index b066e93..d079652 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ stop-upload themes/* !themes/default !themes/default/* +themes/default/public/js/minified .stignore .stfolder/ TODO diff --git a/themes/default/public/js/minified/download.min.js b/themes/default/public/js/minified/download.min.js deleted file mode 100644 index a95f762..0000000 --- a/themes/default/public/js/minified/download.min.js +++ /dev/null @@ -1,2765 +0,0 @@ -var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x2, { - get: (a2, b2) => (typeof require !== "undefined" ? require : a2)[b2] -}) : x2)(function(x2) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x2 + '" is not supported'); -}); - -// themes/default/public/js/lib/lufi.js -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require2 = /* @__PURE__ */ ((x2) => typeof __require !== "undefined" ? __require : typeof Proxy !== "undefined" ? new Proxy(x2, { - get: (a2, b2) => (typeof __require !== "undefined" ? __require : a2)[b2] -}) : x2)(function(x2) { - if (typeof __require !== "undefined") return __require.apply(this, arguments); - throw Error('Dynamic require of "' + x2 + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require22() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter3() { - EventEmitter3.init.call(this); - } - module.exports = EventEmitter3; - module.exports.once = once; - EventEmitter3.EventEmitter = EventEmitter3; - EventEmitter3.prototype._events = void 0; - EventEmitter3.prototype._eventsCount = 0; - EventEmitter3.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter3, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter3.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter3.prototype.setMaxListeners = function setMaxListeners(n2) { - if (typeof n2 !== "number" || n2 < 0 || NumberIsNaN(n2)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n2 + "."); - } - this._maxListeners = n2; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter3.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter3.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter3.prototype.emit = function emit(type) { - var args = []; - for (var i2 = 1; i2 < arguments.length; i2++) args.push(arguments[i2]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i2 = 0; i2 < len; ++i2) - ReflectApply(listeners[i2], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m2; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m2 = _getMaxListeners(target); - if (m2 > 0 && existing.length > m2 && !existing.warned) { - existing.warned = true; - var w2 = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w2.name = "MaxListenersExceededWarning"; - w2.emitter = target; - w2.type = type; - w2.count = existing.length; - ProcessEmitWarning(w2); - } - } - return target; - } - EventEmitter3.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter3.prototype.on = EventEmitter3.prototype.addListener; - EventEmitter3.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter3.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i2, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i2 = list.length - 1; i2 >= 0; i2--) { - if (list[i2] === listener || list[i2].listener === listener) { - originalListener = list[i2].listener; - position = i2; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter3.prototype.off = EventEmitter3.prototype.removeListener; - EventEmitter3.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i2; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i2 = 0; i2 < keys.length; ++i2) { - key = keys[i2]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i2 = listeners.length - 1; i2 >= 0; i2--) { - this.removeListener(type, listeners[i2]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter3.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter3.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter3.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter3.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter3.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n2) { - var copy = new Array(n2); - for (var i2 = 0; i2 < n2; ++i2) - copy[i2] = arr[i2]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i2 = 0; i2 < ret.length; ++i2) { - ret[i2] = arr[i2].listener || arr[i2]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a2) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a2; - }, invalid: function(a2) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a2; - }, bug: function(a2) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a2; - }, notReady: function(a2) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a2; - } } }; - sjcl2.cipher.aes = function(a2) { - this.w[0][0][0] || this.C(); - var b2, c2, d2, e2, f2 = this.w[0][4], g2 = this.w[1]; - b2 = a2.length; - var h2 = 1; - if (4 !== b2 && 6 !== b2 && 8 !== b2) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d2 = a2.slice(0), e2 = []]; - for (a2 = b2; a2 < 4 * b2 + 28; a2++) { - c2 = d2[a2 - 1]; - if (0 === a2 % b2 || 8 === b2 && 4 === a2 % b2) c2 = f2[c2 >>> 24] << 24 ^ f2[c2 >> 16 & 255] << 16 ^ f2[c2 >> 8 & 255] << 8 ^ f2[c2 & 255], 0 === a2 % b2 && (c2 = c2 << 8 ^ c2 >>> 24 ^ h2 << 24, h2 = h2 << 1 ^ 283 * (h2 >> 7)); - d2[a2] = d2[a2 - b2] ^ c2; - } - for (b2 = 0; a2; b2++, a2--) c2 = d2[b2 & 3 ? a2 : a2 - 4], e2[b2] = 4 >= a2 || 4 > b2 ? c2 : g2[0][f2[c2 >>> 24]] ^ g2[1][f2[c2 >> 16 & 255]] ^ g2[2][f2[c2 >> 8 & 255]] ^ g2[3][f2[c2 & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a2) { - return aa(this, a2, 0); - }, decrypt: function(a2) { - return aa(this, a2, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a2 = this.w[0], b2 = this.w[1], c2 = a2[4], d2 = b2[4], e2, f2, g2, h2 = [], k = [], n2, l2, m2, p2; - for (e2 = 0; 256 > e2; e2++) k[(h2[e2] = e2 << 1 ^ 283 * (e2 >> 7)) ^ e2] = e2; - for (f2 = g2 = 0; !c2[f2]; f2 ^= n2 || 1, g2 = k[g2] || 1) for (m2 = g2 ^ g2 << 1 ^ g2 << 2 ^ g2 << 3 ^ g2 << 4, m2 = m2 >> 8 ^ m2 & 255 ^ 99, c2[f2] = m2, d2[m2] = f2, l2 = h2[e2 = h2[n2 = h2[f2]]], p2 = 16843009 * l2 ^ 65537 * e2 ^ 257 * n2 ^ 16843008 * f2, l2 = 257 * h2[m2] ^ 16843008 * m2, e2 = 0; 4 > e2; e2++) a2[e2][f2] = l2 = l2 << 24 ^ l2 >>> 8, b2[e2][m2] = p2 = p2 << 24 ^ p2 >>> 8; - for (e2 = 0; 5 > e2; e2++) a2[e2] = a2[e2].slice(0), b2[e2] = b2[e2].slice(0); - } }; - function aa(a2, b2, c2) { - if (4 !== b2.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d2 = a2.b[c2], e2 = b2[0] ^ d2[0], f2 = b2[c2 ? 3 : 1] ^ d2[1], g2 = b2[2] ^ d2[2]; - b2 = b2[c2 ? 1 : 3] ^ d2[3]; - var h2, k, n2, l2 = d2.length / 4 - 2, m2, p2 = 4, z = [0, 0, 0, 0]; - h2 = a2.w[c2]; - a2 = h2[0]; - var A = h2[1], C = h2[2], B2 = h2[3], D = h2[4]; - for (m2 = 0; m2 < l2; m2++) h2 = a2[e2 >>> 24] ^ A[f2 >> 16 & 255] ^ C[g2 >> 8 & 255] ^ B2[b2 & 255] ^ d2[p2], k = a2[f2 >>> 24] ^ A[g2 >> 16 & 255] ^ C[b2 >> 8 & 255] ^ B2[e2 & 255] ^ d2[p2 + 1], n2 = a2[g2 >>> 24] ^ A[b2 >> 16 & 255] ^ C[e2 >> 8 & 255] ^ B2[f2 & 255] ^ d2[p2 + 2], b2 = a2[b2 >>> 24] ^ A[e2 >> 16 & 255] ^ C[f2 >> 8 & 255] ^ B2[g2 & 255] ^ d2[p2 + 3], p2 += 4, e2 = h2, f2 = k, g2 = n2; - for (m2 = 0; 4 > m2; m2++) z[c2 ? 3 & -m2 : m2] = D[e2 >>> 24] << 24 ^ D[f2 >> 16 & 255] << 16 ^ D[g2 >> 8 & 255] << 8 ^ D[b2 & 255] ^ d2[p2++], h2 = e2, e2 = f2, f2 = g2, g2 = b2, b2 = h2; - return z; - } - sjcl2.bitArray = { bitSlice: function(a2, b2, c2) { - a2 = sjcl2.bitArray.Y(a2.slice(b2 / 32), 32 - (b2 & 31)).slice(1); - return void 0 === c2 ? a2 : sjcl2.bitArray.clamp(a2, c2 - b2); - }, extract: function(a2, b2, c2) { - var d2 = Math.floor(-b2 - c2 & 31); - return ((b2 + c2 - 1 ^ b2) & -32 ? a2[b2 / 32 | 0] << 32 - d2 ^ a2[b2 / 32 + 1 | 0] >>> d2 : a2[b2 / 32 | 0] >>> d2) & (1 << c2) - 1; - }, concat: function(a2, b2) { - if (0 === a2.length || 0 === b2.length) return a2.concat(b2); - var c2 = a2[a2.length - 1], d2 = sjcl2.bitArray.getPartial(c2); - return 32 === d2 ? a2.concat(b2) : sjcl2.bitArray.Y(b2, d2, c2 | 0, a2.slice(0, a2.length - 1)); - }, bitLength: function(a2) { - var b2 = a2.length; - return 0 === b2 ? 0 : 32 * (b2 - 1) + sjcl2.bitArray.getPartial(a2[b2 - 1]); - }, clamp: function(a2, b2) { - if (32 * a2.length < b2) return a2; - a2 = a2.slice(0, Math.ceil(b2 / 32)); - var c2 = a2.length; - b2 = b2 & 31; - 0 < c2 && b2 && (a2[c2 - 1] = sjcl2.bitArray.partial(b2, a2[c2 - 1] & 2147483648 >> b2 - 1, 1)); - return a2; - }, partial: function(a2, b2, c2) { - return 32 === a2 ? b2 : (c2 ? b2 | 0 : b2 << 32 - a2) + 1099511627776 * a2; - }, getPartial: function(a2) { - return Math.round(a2 / 1099511627776) || 32; - }, equal: function(a2, b2) { - if (sjcl2.bitArray.bitLength(a2) !== sjcl2.bitArray.bitLength(b2)) return false; - var c2 = 0, d2; - for (d2 = 0; d2 < a2.length; d2++) c2 |= a2[d2] ^ b2[d2]; - return 0 === c2; - }, Y: function(a2, b2, c2, d2) { - var e2; - e2 = 0; - for (void 0 === d2 && (d2 = []); 32 <= b2; b2 -= 32) d2.push(c2), c2 = 0; - if (0 === b2) return d2.concat(a2); - for (e2 = 0; e2 < a2.length; e2++) d2.push(c2 | a2[e2] >>> b2), c2 = a2[e2] << 32 - b2; - e2 = a2.length ? a2[a2.length - 1] : 0; - a2 = sjcl2.bitArray.getPartial(e2); - d2.push(sjcl2.bitArray.partial(b2 + a2 & 31, 32 < b2 + a2 ? c2 : d2.pop(), 1)); - return d2; - }, P: function(a2, b2) { - return [a2[0] ^ b2[0], a2[1] ^ b2[1], a2[2] ^ b2[2], a2[3] ^ b2[3]]; - }, byteswapM: function(a2) { - var b2, c2; - for (b2 = 0; b2 < a2.length; ++b2) c2 = a2[b2], a2[b2] = c2 >>> 24 | c2 >>> 8 & 65280 | (c2 & 65280) << 8 | c2 << 24; - return a2; - } }; - sjcl2.codec.utf8String = { fromBits: function(a2) { - var b2 = "", c2 = sjcl2.bitArray.bitLength(a2), d2, e2; - for (d2 = 0; d2 < c2 / 8; d2++) 0 === (d2 & 3) && (e2 = a2[d2 / 4]), b2 += String.fromCharCode(e2 >>> 8 >>> 8 >>> 8), e2 <<= 8; - return decodeURIComponent(escape(b2)); - }, toBits: function(a2) { - a2 = unescape(encodeURIComponent(a2)); - var b2 = [], c2, d2 = 0; - for (c2 = 0; c2 < a2.length; c2++) d2 = d2 << 8 | a2.charCodeAt(c2), 3 === (c2 & 3) && (b2.push(d2), d2 = 0); - c2 & 3 && b2.push(sjcl2.bitArray.partial(8 * (c2 & 3), d2)); - return b2; - } }; - sjcl2.codec.hex = { fromBits: function(a2) { - var b2 = "", c2; - for (c2 = 0; c2 < a2.length; c2++) b2 += ((a2[c2] | 0) + 263882790666240).toString(16).substr(4); - return b2.substr(0, sjcl2.bitArray.bitLength(a2) / 4); - }, toBits: function(a2) { - var b2, c2 = [], d2; - a2 = a2.replace(/\s|0x/g, ""); - d2 = a2.length; - a2 = a2 + "00000000"; - for (b2 = 0; b2 < a2.length; b2 += 8) c2.push(parseInt(a2.substr(b2, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c2, 4 * d2); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a2, b2, c2) { - var d2 = "", e2 = 0, f2 = sjcl2.codec.base64.S, g2 = 0, h2 = sjcl2.bitArray.bitLength(a2); - c2 && (f2 = f2.substr(0, 62) + "-_"); - for (c2 = 0; 6 * d2.length < h2; ) d2 += f2.charAt((g2 ^ a2[c2] >>> e2) >>> 26), 6 > e2 ? (g2 = a2[c2] << 6 - e2, e2 += 26, c2++) : (g2 <<= 6, e2 -= 6); - for (; d2.length & 3 && !b2; ) d2 += "="; - return d2; - }, toBits: function(a2, b2) { - a2 = a2.replace(/\s|=/g, ""); - var c2 = [], d2, e2 = 0, f2 = sjcl2.codec.base64.S, g2 = 0, h2; - b2 && (f2 = f2.substr(0, 62) + "-_"); - for (d2 = 0; d2 < a2.length; d2++) { - h2 = f2.indexOf(a2.charAt(d2)); - if (0 > h2) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e2 ? (e2 -= 26, c2.push(g2 ^ h2 >>> e2), g2 = h2 << 32 - e2) : (e2 += 6, g2 ^= h2 << 32 - e2); - } - e2 & 56 && c2.push(sjcl2.bitArray.partial(e2 & 56, g2, 1)); - return c2; - } }; - sjcl2.codec.base64url = { fromBits: function(a2) { - return sjcl2.codec.base64.fromBits(a2, 1, 1); - }, toBits: function(a2) { - return sjcl2.codec.base64.toBits(a2, 1); - } }; - sjcl2.hash.sha256 = function(a2) { - this.b[0] || this.C(); - a2 ? (this.g = a2.g.slice(0), this.f = a2.f.slice(0), this.c = a2.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a2) { - return new sjcl2.hash.sha256().update(a2).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a2) { - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - var b2, c2 = this.f = sjcl2.bitArray.concat(this.f, a2); - b2 = this.c; - a2 = this.c = b2 + sjcl2.bitArray.bitLength(a2); - if (9007199254740991 < a2) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d2 = new Uint32Array(c2), e2 = 0; - for (b2 = 512 + b2 - (512 + b2 & 511); b2 <= a2; b2 += 512) this.l(d2.subarray( - 16 * e2, - 16 * (e2 + 1) - )), e2 += 1; - c2.splice(0, 16 * e2); - } else for (b2 = 512 + b2 - (512 + b2 & 511); b2 <= a2; b2 += 512) this.l(c2.splice(0, 16)); - return this; - }, finalize: function() { - var a2, b2 = this.f, c2 = this.g, b2 = sjcl2.bitArray.concat(b2, [sjcl2.bitArray.partial(1, 1)]); - for (a2 = b2.length + 2; a2 & 15; a2++) b2.push(0); - b2.push(Math.floor(this.c / 4294967296)); - for (b2.push(this.c | 0); b2.length; ) this.l(b2.splice(0, 16)); - this.reset(); - return c2; - }, o: [], b: [], C: function() { - function a2(a22) { - return 4294967296 * (a22 - Math.floor(a22)) | 0; - } - for (var b2 = 0, c2 = 2, d2, e2; 64 > b2; c2++) { - e2 = true; - for (d2 = 2; d2 * d2 <= c2; d2++) if (0 === c2 % d2) { - e2 = false; - break; - } - e2 && (8 > b2 && (this.o[b2] = a2(Math.pow(c2, 0.5))), this.b[b2] = a2(Math.pow(c2, 1 / 3)), b2++); - } - }, l: function(a2) { - var b2, c2, d2, e2 = this.g, f2 = this.b, g2 = e2[0], h2 = e2[1], k = e2[2], n2 = e2[3], l2 = e2[4], m2 = e2[5], p2 = e2[6], z = e2[7]; - for (b2 = 0; 64 > b2; b2++) 16 > b2 ? c2 = a2[b2] : (c2 = a2[b2 + 1 & 15], d2 = a2[b2 + 14 & 15], c2 = a2[b2 & 15] = (c2 >>> 7 ^ c2 >>> 18 ^ c2 >>> 3 ^ c2 << 25 ^ c2 << 14) + (d2 >>> 17 ^ d2 >>> 19 ^ d2 >>> 10 ^ d2 << 15 ^ d2 << 13) + a2[b2 & 15] + a2[b2 + 9 & 15] | 0), c2 = c2 + z + (l2 >>> 6 ^ l2 >>> 11 ^ l2 >>> 25 ^ l2 << 26 ^ l2 << 21 ^ l2 << 7) + (p2 ^ l2 & (m2 ^ p2)) + f2[b2], z = p2, p2 = m2, m2 = l2, l2 = n2 + c2 | 0, n2 = k, k = h2, h2 = g2, g2 = c2 + (h2 & k ^ n2 & (h2 ^ k)) + (h2 >>> 2 ^ h2 >>> 13 ^ h2 >>> 22 ^ h2 << 30 ^ h2 << 19 ^ h2 << 10) | 0; - e2[0] = e2[0] + g2 | 0; - e2[1] = e2[1] + h2 | 0; - e2[2] = e2[2] + k | 0; - e2[3] = e2[3] + n2 | 0; - e2[4] = e2[4] + l2 | 0; - e2[5] = e2[5] + m2 | 0; - e2[6] = e2[6] + p2 | 0; - e2[7] = e2[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a2) { - this.b[0] || this.C(); - a2 ? (this.g = a2.g.slice(0), this.f = a2.f.slice(0), this.c = a2.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a2) { - return new sjcl2.hash.sha512().update(a2).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a2) { - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - var b2, c2 = this.f = sjcl2.bitArray.concat(this.f, a2); - b2 = this.c; - a2 = this.c = b2 + sjcl2.bitArray.bitLength(a2); - if (9007199254740991 < a2) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d2 = new Uint32Array(c2), e2 = 0; - for (b2 = 1024 + b2 - (1024 + b2 & 1023); b2 <= a2; b2 += 1024) this.l(d2.subarray(32 * e2, 32 * (e2 + 1))), e2 += 1; - c2.splice(0, 32 * e2); - } else for (b2 = 1024 + b2 - (1024 + b2 & 1023); b2 <= a2; b2 += 1024) this.l(c2.splice(0, 32)); - return this; - }, finalize: function() { - var a2, b2 = this.f, c2 = this.g, b2 = sjcl2.bitArray.concat(b2, [sjcl2.bitArray.partial(1, 1)]); - for (a2 = b2.length + 4; a2 & 31; a2++) b2.push(0); - b2.push(0); - b2.push(0); - b2.push(Math.floor(this.c / 4294967296)); - for (b2.push(this.c | 0); b2.length; ) this.l(b2.splice(0, 32)); - this.reset(); - return c2; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a2(a22) { - return 4294967296 * (a22 - Math.floor(a22)) | 0; - } - function b2(a22) { - return 1099511627776 * (a22 - Math.floor(a22)) & 255; - } - for (var c2 = 0, d2 = 2, e2, f2; 80 > c2; d2++) { - f2 = true; - for (e2 = 2; e2 * e2 <= d2; e2++) if (0 === d2 % e2) { - f2 = false; - break; - } - f2 && (8 > c2 && (this.o[2 * c2] = a2(Math.pow(d2, 0.5)), this.o[2 * c2 + 1] = b2(Math.pow(d2, 0.5)) << 24 | this.ia[c2]), this.b[2 * c2] = a2(Math.pow(d2, 1 / 3)), this.b[2 * c2 + 1] = b2(Math.pow(d2, 1 / 3)) << 24 | this.ka[c2], c2++); - } - }, l: function(a2) { - var b2, c2, d2 = this.g, e2 = this.b, f2 = d2[0], g2 = d2[1], h2 = d2[2], k = d2[3], n2 = d2[4], l2 = d2[5], m2 = d2[6], p2 = d2[7], z = d2[8], A = d2[9], C = d2[10], B2 = d2[11], D = d2[12], P = d2[13], ea = d2[14], Q = d2[15], t2; - if ("undefined" !== typeof Uint32Array) { - t2 = Array(160); - for (var r2 = 0; 32 > r2; r2++) t2[r2] = a2[r2]; - } else t2 = a2; - var r2 = f2, u2 = g2, G = h2, E2 = k, H = n2, F = l2, V = m2, I = p2, w2 = z, v = A, R = C, J = B2, S = D, K = P, W = ea, L = Q; - for (a2 = 0; 80 > a2; a2++) { - if (16 > a2) b2 = t2[2 * a2], c2 = t2[2 * a2 + 1]; - else { - c2 = t2[2 * (a2 - 15)]; - var q = t2[2 * (a2 - 15) + 1]; - b2 = (q << 31 | c2 >>> 1) ^ (q << 24 | c2 >>> 8) ^ c2 >>> 7; - var x2 = (c2 << 31 | q >>> 1) ^ (c2 << 24 | q >>> 8) ^ (c2 << 25 | q >>> 7); - c2 = t2[2 * (a2 - 2)]; - var y2 = t2[2 * (a2 - 2) + 1], q = (y2 << 13 | c2 >>> 19) ^ (c2 << 3 | y2 >>> 29) ^ c2 >>> 6, y2 = (c2 << 13 | y2 >>> 19) ^ (y2 << 3 | c2 >>> 29) ^ (c2 << 26 | y2 >>> 6), X = t2[2 * (a2 - 7)], Y = t2[2 * (a2 - 16)], M2 = t2[2 * (a2 - 16) + 1]; - c2 = x2 + t2[2 * (a2 - 7) + 1]; - b2 = b2 + X + (c2 >>> 0 < x2 >>> 0 ? 1 : 0); - c2 += y2; - b2 += q + (c2 >>> 0 < y2 >>> 0 ? 1 : 0); - c2 += M2; - b2 += Y + (c2 >>> 0 < M2 >>> 0 ? 1 : 0); - } - t2[2 * a2] = b2 |= 0; - t2[2 * a2 + 1] = c2 |= 0; - var X = w2 & R ^ ~w2 & S, fa = v & J ^ ~v & K, y2 = r2 & G ^ r2 & H ^ G & H, ja = u2 & E2 ^ u2 & F ^ E2 & F, Y = (u2 << 4 | r2 >>> 28) ^ (r2 << 30 | u2 >>> 2) ^ (r2 << 25 | u2 >>> 7), M2 = (r2 << 4 | u2 >>> 28) ^ (u2 << 30 | r2 >>> 2) ^ (u2 << 25 | r2 >>> 7), ka = e2[2 * a2], ga = e2[2 * a2 + 1], q = L + ((w2 << 18 | v >>> 14) ^ (w2 << 14 | v >>> 18) ^ (v << 23 | w2 >>> 9)), x2 = W + ((v << 18 | w2 >>> 14) ^ (v << 14 | w2 >>> 18) ^ (w2 << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x2 = x2 + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x2 = x2 + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c2 | 0, x2 = x2 + (b2 + (q >>> 0 < c2 >>> 0 ? 1 : 0)); - c2 = M2 + ja; - b2 = Y + y2 + (c2 >>> 0 < M2 >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w2; - J = v; - v = I + q | 0; - w2 = V + x2 + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E2; - G = r2; - E2 = u2; - u2 = q + c2 | 0; - r2 = x2 + b2 + (u2 >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g2 = d2[1] = g2 + u2 | 0; - d2[0] = f2 + r2 + (g2 >>> 0 < u2 >>> 0 ? 1 : 0) | 0; - k = d2[3] = k + E2 | 0; - d2[2] = h2 + G + (k >>> 0 < E2 >>> 0 ? 1 : 0) | 0; - l2 = d2[5] = l2 + F | 0; - d2[4] = n2 + H + (l2 >>> 0 < F >>> 0 ? 1 : 0) | 0; - p2 = d2[7] = p2 + I | 0; - d2[6] = m2 + V + (p2 >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d2[9] = A + v | 0; - d2[8] = z + w2 + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B2 = d2[11] = B2 + J | 0; - d2[10] = C + R + (B2 >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d2[13] = P + K | 0; - d2[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d2[15] = Q + L | 0; - d2[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a2) { - sjcl2.mode.ccm.F.push(a2); - }, unListenProgress: function(a2) { - a2 = sjcl2.mode.ccm.F.indexOf(a2); - -1 < a2 && sjcl2.mode.ccm.F.splice(a2, 1); - }, da: function(a2) { - var b2 = sjcl2.mode.ccm.F.slice(), c2; - for (c2 = 0; c2 < b2.length; c2 += 1) b2[c2](a2); - }, encrypt: function(a2, b2, c2, d2, e2) { - var f2, g2 = b2.slice(0), h2 = sjcl2.bitArray, k = h2.bitLength(c2) / 8, n2 = h2.bitLength(g2) / 8; - e2 = e2 || 64; - d2 = d2 || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f2 = 2; 4 > f2 && n2 >>> 8 * f2; f2++) ; - f2 < 15 - k && (f2 = 15 - k); - c2 = h2.clamp( - c2, - 8 * (15 - f2) - ); - b2 = sjcl2.mode.ccm.U(a2, b2, c2, d2, e2, f2); - g2 = sjcl2.mode.ccm.V(a2, g2, c2, b2, e2, f2); - return h2.concat(g2.data, g2.tag); - }, decrypt: function(a2, b2, c2, d2, e2) { - e2 = e2 || 64; - d2 = d2 || []; - var f2 = sjcl2.bitArray, g2 = f2.bitLength(c2) / 8, h2 = f2.bitLength(b2), k = f2.clamp(b2, h2 - e2), n2 = f2.bitSlice(b2, h2 - e2), h2 = (h2 - e2) / 8; - if (7 > g2) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b2 = 2; 4 > b2 && h2 >>> 8 * b2; b2++) ; - b2 < 15 - g2 && (b2 = 15 - g2); - c2 = f2.clamp(c2, 8 * (15 - b2)); - k = sjcl2.mode.ccm.V(a2, k, c2, n2, e2, b2); - a2 = sjcl2.mode.ccm.U(a2, k.data, c2, d2, e2, b2); - if (!f2.equal(k.tag, a2)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a2, b2, c2, d2, e2, f2) { - var g2 = [], h2 = sjcl2.bitArray, k = h2.P; - d2 = [h2.partial(8, (b2.length ? 64 : 0) | d2 - 2 << 2 | f2 - 1)]; - d2 = h2.concat(d2, c2); - d2[3] |= e2; - d2 = a2.encrypt(d2); - if (b2.length) for (c2 = h2.bitLength(b2) / 8, 65279 >= c2 ? g2 = [h2.partial(16, c2)] : 4294967295 >= c2 && (g2 = h2.concat([h2.partial(16, 65534)], [c2])), g2 = h2.concat(g2, b2), b2 = 0; b2 < g2.length; b2 += 4) d2 = a2.encrypt(k(d2, g2.slice(b2, b2 + 4).concat([0, 0, 0]))); - return d2; - }, U: function(a2, b2, c2, d2, e2, f2) { - var g2 = sjcl2.bitArray, h2 = g2.P; - e2 /= 8; - if (e2 % 2 || 4 > e2 || 16 < e2) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d2.length || 4294967295 < b2.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c2 = sjcl2.mode.ccm.ma(a2, d2, c2, e2, g2.bitLength(b2) / 8, f2); - for (d2 = 0; d2 < b2.length; d2 += 4) c2 = a2.encrypt(h2(c2, b2.slice(d2, d2 + 4).concat([0, 0, 0]))); - return g2.clamp(c2, 8 * e2); - }, V: function(a2, b2, c2, d2, e2, f2) { - var g2, h2 = sjcl2.bitArray; - g2 = h2.P; - var k = b2.length, n2 = h2.bitLength(b2), l2 = k / 50, m2 = l2; - c2 = h2.concat([h2.partial(8, f2 - 1)], c2).concat([0, 0, 0]).slice(0, 4); - d2 = h2.bitSlice(g2(d2, a2.encrypt(c2)), 0, e2); - if (!k) return { tag: d2, data: [] }; - for (g2 = 0; g2 < k; g2 += 4) g2 > l2 && (sjcl2.mode.ccm.da(g2 / k), l2 += m2), c2[3]++, e2 = a2.encrypt(c2), b2[g2] ^= e2[0], b2[g2 + 1] ^= e2[1], b2[g2 + 2] ^= e2[2], b2[g2 + 3] ^= e2[3]; - return { tag: d2, data: h2.clamp(b2, n2) }; - } }; - sjcl2.misc.hmac = function(a2, b2) { - this.W = b2 = b2 || sjcl2.hash.sha256; - var c2 = [[], []], d2, e2 = b2.prototype.blockSize / 32; - this.B = [new b2(), new b2()]; - a2.length > e2 && (a2 = b2.hash(a2)); - for (d2 = 0; d2 < e2; d2++) c2[0][d2] = a2[d2] ^ 909522486, c2[1][d2] = a2[d2] ^ 1549556828; - this.B[0].update(c2[0]); - this.B[1].update(c2[1]); - this.O = new b2(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a2) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a2); - return this.digest(a2); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a2) { - this.Z = true; - this.O.update(a2); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a2 = this.O.finalize(), a2 = new this.W(this.B[1]).update(a2).finalize(); - this.reset(); - return a2; - }; - sjcl2.misc.pbkdf2 = function(a2, b2, c2, d2, e2) { - c2 = c2 || 1e4; - if (0 > d2 || 0 > c2) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - "string" === typeof b2 && (b2 = sjcl2.codec.utf8String.toBits(b2)); - e2 = e2 || sjcl2.misc.hmac; - a2 = new e2(a2); - var f2, g2, h2, k, n2 = [], l2 = sjcl2.bitArray; - for (k = 1; 32 * n2.length < (d2 || 1); k++) { - e2 = f2 = a2.encrypt(l2.concat(b2, [k])); - for (g2 = 1; g2 < c2; g2++) for (f2 = a2.encrypt(f2), h2 = 0; h2 < f2.length; h2++) e2[h2] ^= f2[h2]; - n2 = n2.concat(e2); - } - d2 && (n2 = l2.clamp(n2, d2)); - return n2; - }; - sjcl2.prng = function(a2) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a2; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a2, b2) { - var c2 = [], d2; - d2 = this.isReady(b2); - var e2; - if (d2 === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d2 & this.I) { - d2 = !(d2 & this.H); - e2 = []; - var f2 = 0, g2; - this.X = e2[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g2 = 0; 16 > g2; g2++) e2.push(4294967296 * Math.random() | 0); - for (g2 = 0; g2 < this.h.length && (e2 = e2.concat(this.h[g2].finalize()), f2 += this.s[g2], this.s[g2] = 0, d2 || !(this.N & 1 << g2)); g2++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f2; - f2 > this.u && (this.u = f2); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e2)); - this.K = new sjcl2.cipher.aes(this.b); - for (d2 = 0; 4 > d2 && (this.m[d2] = this.m[d2] + 1 | 0, !this.m[d2]); d2++) ; - } - for (d2 = 0; d2 < a2; d2 += 4) 0 === (d2 + 1) % this.aa && ba(this), e2 = N(this), c2.push(e2[0], e2[1], e2[2], e2[3]); - ba(this); - return c2.slice(0, a2); - }, - setDefaultParanoia: function(a2, b2) { - if (0 === a2 && "Setting paranoia=0 will ruin your security; use it only for testing" !== b2) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a2; - }, - addEntropy: function(a2, b2, c2) { - c2 = c2 || "user"; - var d2, e2, f2 = (/* @__PURE__ */ new Date()).valueOf(), g2 = this.G[c2], h2 = this.isReady(), k = 0; - d2 = this.T[c2]; - void 0 === d2 && (d2 = this.T[c2] = this.fa++); - void 0 === g2 && (g2 = this.G[c2] = 0); - this.G[c2] = (this.G[c2] + 1) % this.h.length; - switch (typeof a2) { - case "number": - void 0 === b2 && (b2 = 1); - this.h[g2].update([d2, this.M++, 1, b2, f2, 1, a2 | 0]); - break; - case "object": - c2 = Object.prototype.toString.call(a2); - if ("[object Uint32Array]" === c2) { - e2 = []; - for (c2 = 0; c2 < a2.length; c2++) e2.push(a2[c2]); - a2 = e2; - } else for ("[object Array]" !== c2 && (k = 1), c2 = 0; c2 < a2.length && !k; c2++) "number" !== typeof a2[c2] && (k = 1); - if (!k) { - if (void 0 === b2) for (c2 = b2 = 0; c2 < a2.length; c2++) for (e2 = a2[c2]; 0 < e2; ) b2++, e2 = e2 >>> 1; - this.h[g2].update([d2, this.M++, 2, b2, f2, a2.length].concat(a2)); - } - break; - case "string": - void 0 === b2 && (b2 = a2.length); - this.h[g2].update([d2, this.M++, 3, b2, f2, a2.length]); - this.h[g2].update(a2); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g2] += b2; - this.i += b2; - h2 === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a2) { - a2 = this.R[void 0 !== a2 ? a2 : this.L]; - return this.u && this.u >= a2 ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a2 ? this.I | this.A : this.A; - }, - getProgress: function(a2) { - a2 = this.R[a2 ? a2 : this.L]; - return this.u >= a2 ? 1 : this.i > a2 ? 1 : this.i / a2; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a2, b2) { - this.J[a2][this.ea++] = b2; - }, - removeEventListener: function(a2, b2) { - var c2, d2, e2 = this.J[a2], f2 = []; - for (d2 in e2) e2.hasOwnProperty(d2) && e2[d2] === b2 && f2.push(d2); - for (c2 = 0; c2 < f2.length; c2++) d2 = f2[c2], delete e2[d2]; - }, - ja: function() { - T(this, 1); - }, - na: function(a2) { - var b2, c2; - try { - b2 = a2.x || a2.clientX || a2.offsetX || 0, c2 = a2.y || a2.clientY || a2.offsetY || 0; - } catch (d2) { - c2 = b2 = 0; - } - 0 != b2 && 0 != c2 && this.addEntropy([b2, c2], 2, "mouse"); - T(this, 0); - }, - pa: function(a2) { - a2 = a2.touches[0] || a2.changedTouches[0]; - this.addEntropy([a2.pageX || a2.clientX, a2.pageY || a2.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a2) { - a2 = a2.accelerationIncludingGravity.x || a2.accelerationIncludingGravity.y || a2.accelerationIncludingGravity.z; - if (window.orientation) { - var b2 = window.orientation; - "number" === typeof b2 && this.addEntropy(b2, 1, "accelerometer"); - } - a2 && this.addEntropy(a2, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a2, b2) { - var c2, d2 = sjcl2.random.J[a2], e2 = []; - for (c2 in d2) d2.hasOwnProperty(c2) && e2.push(d2[c2]); - for (c2 = 0; c2 < e2.length; c2++) e2[c2](b2); - } - function T(a2, b2) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a2.addEntropy(window.performance.now(), b2, "loadtime") : a2.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b2, "loadtime"); - } - function ba(a2) { - a2.b = N(a2).concat(N(a2)); - a2.K = new sjcl2.cipher.aes(a2.b); - } - function N(a2) { - for (var b2 = 0; 4 > b2 && (a2.m[b2] = a2.m[b2] + 1 | 0, !a2.m[b2]); b2++) ; - return a2.K.encrypt(a2.m); - } - function O(a2, b2) { - return function() { - b2.apply(a2, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require2("crypto"); - } catch (a2) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a2) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a2)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a2, b2, c2, d2) { - c2 = c2 || {}; - d2 = d2 || {}; - var e2 = sjcl2.json, f2 = e2.j({ iv: sjcl2.random.randomWords(4, 0) }, e2.defaults), g2; - e2.j(f2, c2); - c2 = f2.adata; - "string" === typeof f2.salt && (f2.salt = sjcl2.codec.base64.toBits(f2.salt)); - "string" === typeof f2.iv && (f2.iv = sjcl2.codec.base64.toBits(f2.iv)); - if (!sjcl2.mode[f2.mode] || !sjcl2.cipher[f2.cipher] || "string" === typeof a2 && 100 >= f2.iter || 64 !== f2.ts && 96 !== f2.ts && 128 !== f2.ts || 128 !== f2.ks && 192 !== f2.ks && 256 !== f2.ks || 2 > f2.iv.length || 4 < f2.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a2 ? (g2 = sjcl2.misc.cachedPbkdf2(a2, f2), a2 = g2.key.slice(0, f2.ks / 32), f2.salt = g2.salt) : sjcl2.ecc && a2 instanceof sjcl2.ecc.elGamal.publicKey && (g2 = a2.kem(), f2.kemtag = g2.tag, a2 = g2.key.slice(0, f2.ks / 32)); - "string" === typeof b2 && (b2 = sjcl2.codec.utf8String.toBits(b2)); - "string" === typeof c2 && (f2.adata = c2 = sjcl2.codec.utf8String.toBits(c2)); - g2 = new sjcl2.cipher[f2.cipher](a2); - e2.j(d2, f2); - d2.key = a2; - f2.ct = "ccm" === f2.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b2 instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g2, b2, f2.iv, c2, f2.ts) : sjcl2.mode[f2.mode].encrypt(g2, b2, f2.iv, c2, f2.ts); - return f2; - }, encrypt: function(a2, b2, c2, d2) { - var e2 = sjcl2.json, f2 = e2.ha.apply(e2, arguments); - return e2.encode(f2); - }, ga: function(a2, b2, c2, d2) { - c2 = c2 || {}; - d2 = d2 || {}; - var e2 = sjcl2.json; - b2 = e2.j(e2.j(e2.j({}, e2.defaults), b2), c2, true); - var f2, g2; - f2 = b2.adata; - "string" === typeof b2.salt && (b2.salt = sjcl2.codec.base64.toBits(b2.salt)); - "string" === typeof b2.iv && (b2.iv = sjcl2.codec.base64.toBits(b2.iv)); - if (!sjcl2.mode[b2.mode] || !sjcl2.cipher[b2.cipher] || "string" === typeof a2 && 100 >= b2.iter || 64 !== b2.ts && 96 !== b2.ts && 128 !== b2.ts || 128 !== b2.ks && 192 !== b2.ks && 256 !== b2.ks || !b2.iv || 2 > b2.iv.length || 4 < b2.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a2 ? (g2 = sjcl2.misc.cachedPbkdf2(a2, b2), a2 = g2.key.slice(0, b2.ks / 32), b2.salt = g2.salt) : sjcl2.ecc && a2 instanceof sjcl2.ecc.elGamal.secretKey && (a2 = a2.unkem(sjcl2.codec.base64.toBits(b2.kemtag)).slice(0, b2.ks / 32)); - "string" === typeof f2 && (f2 = sjcl2.codec.utf8String.toBits(f2)); - g2 = new sjcl2.cipher[b2.cipher](a2); - f2 = "ccm" === b2.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b2.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g2, b2.ct, b2.iv, b2.tag, f2, b2.ts) : sjcl2.mode[b2.mode].decrypt(g2, b2.ct, b2.iv, f2, b2.ts); - e2.j(d2, b2); - d2.key = a2; - return 1 === c2.raw ? f2 : sjcl2.codec.utf8String.fromBits(f2); - }, decrypt: function(a2, b2, c2, d2) { - var e2 = sjcl2.json; - return e2.ga(a2, e2.decode(b2), c2, d2); - }, encode: function(a2) { - var b2, c2 = "{", d2 = ""; - for (b2 in a2) if (a2.hasOwnProperty(b2)) { - if (!b2.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c2 += d2 + '"' + b2 + '":'; - d2 = ","; - switch (typeof a2[b2]) { - case "number": - case "boolean": - c2 += a2[b2]; - break; - case "string": - c2 += '"' + escape(a2[b2]) + '"'; - break; - case "object": - c2 += '"' + sjcl2.codec.base64.fromBits(a2[b2], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c2 + "}"; - }, decode: function(a2) { - a2 = a2.replace(/\s/g, ""); - if (!a2.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a2 = a2.replace(/^\{|\}$/g, "").split(/,/); - var b2 = {}, c2, d2; - for (c2 = 0; c2 < a2.length; c2++) { - if (!(d2 = a2[c2].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d2[3] ? b2[d2[2]] = parseInt(d2[3], 10) : null != d2[4] ? b2[d2[2]] = d2[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d2[4]) : unescape(d2[4]) : null != d2[5] && (b2[d2[2]] = "true" === d2[5]); - } - return b2; - }, j: function(a2, b2, c2) { - void 0 === a2 && (a2 = {}); - if (void 0 === b2) return a2; - for (var d2 in b2) if (b2.hasOwnProperty(d2)) { - if (c2 && void 0 !== a2[d2] && a2[d2] !== b2[d2]) throw new sjcl2.exception.invalid("required parameter overridden"); - a2[d2] = b2[d2]; - } - return a2; - }, ra: function(a2, b2) { - var c2 = {}, d2; - for (d2 in a2) a2.hasOwnProperty(d2) && a2[d2] !== b2[d2] && (c2[d2] = a2[d2]); - return c2; - }, qa: function(a2, b2) { - var c2 = {}, d2; - for (d2 = 0; d2 < b2.length; d2++) void 0 !== a2[b2[d2]] && (c2[b2[d2]] = a2[b2[d2]]); - return c2; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a2, b2) { - var c2 = sjcl2.misc.oa, d2; - b2 = b2 || {}; - d2 = b2.iter || 1e3; - c2 = c2[a2] = c2[a2] || {}; - d2 = c2[d2] = c2[d2] || { firstSalt: b2.salt && b2.salt.length ? b2.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c2 = void 0 === b2.salt ? d2.firstSalt : b2.salt; - d2[c2] = d2[c2] || sjcl2.misc.pbkdf2(a2, c2, b2.iter); - return { key: d2[c2].slice(0), salt: c2.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); -var lufi_exports = {}; -__export(lufi_exports, { - addFilesToArchive: () => addFilesToArchive, - cancel: () => cancel, - compress: () => compress, - decompress: () => decompress, - download: () => download, - events: () => events, - getFileIndexInQueue: () => getFileIndexInQueue, - infos: () => infos, - pause: () => pause, - remove: () => remove, - resume: () => resume, - upload: () => upload -}); -var import_events2 = __toESM(require_events()); -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e2) { - reject(e2); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e2) { - reject(e2); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o2) { - var s2 = typeof Symbol === "function" && Symbol.iterator, m2 = s2 && o2[s2], i2 = 0; - if (m2) return m2.call(o2); - if (o2 && typeof o2.length === "number") return { - next: function() { - if (o2 && i2 >= o2.length) o2 = void 0; - return { value: o2 && o2[i2++], done: !o2 }; - } - }; - throw new TypeError(s2 ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g2 = generator.apply(thisArg, _arguments || []), i2, q = []; - return i2 = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i2[Symbol.asyncIterator] = function() { - return this; - }, i2; - function awaitReturn(f2) { - return function(v) { - return Promise.resolve(v).then(f2, reject); - }; - } - function verb(n2, f2) { - if (g2[n2]) { - i2[n2] = function(v) { - return new Promise(function(a2, b2) { - q.push([n2, v, a2, b2]) > 1 || resume2(n2, v); - }); - }; - if (f2) i2[n2] = f2(i2[n2]); - } - } - function resume2(n2, v) { - try { - step(g2[n2](v)); - } catch (e2) { - settle(q[0][3], e2); - } - } - function step(r2) { - r2.value instanceof __await ? Promise.resolve(r2.value.v).then(fulfill, reject) : settle(q[0][2], r2); - } - function fulfill(value) { - resume2("next", value); - } - function reject(value) { - resume2("throw", value); - } - function settle(f2, v) { - if (f2(v), q.shift(), q.length) resume2(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o2) { - var i2, p2; - return i2 = {}, verb("next"), verb("throw", function(e2) { - throw e2; - }), verb("return"), i2[Symbol.iterator] = function() { - return this; - }, i2; - function verb(n2, f2) { - i2[n2] = o2[n2] ? function(v) { - return (p2 = !p2) ? { value: __await(o2[n2](v)), done: false } : f2 ? f2(v) : v; - } : f2; - } -} -function __asyncValues(o2) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m2 = o2[Symbol.asyncIterator], i2; - return m2 ? m2.call(o2) : (o2 = typeof __values === "function" ? __values(o2) : o2[Symbol.iterator](), i2 = {}, verb("next"), verb("throw"), verb("return"), i2[Symbol.asyncIterator] = function() { - return this; - }, i2); - function verb(n2) { - i2[n2] = o2[n2] && function(v) { - return new Promise(function(resolve, reject) { - v = o2[n2](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d2, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d2 }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e2) => new Err(errorFn(e2))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f2(res.value)); - }))); - } - andThrough(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f2(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f2(res.value); - } catch (e2) { - } - return new Ok(res.value); - }))); - } - mapErr(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f2(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f2) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f2(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f2(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t2) { - return this._promise.then((res) => res.unwrapOr(t2)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e2) { - return err(errorFn ? errorFn(e2) : e2); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f2) { - return ok(f2(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f2) { - return f2(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f2) { - return f2(this.value).map((_value) => this.value); - } - andTee(f2) { - try { - f2(this.value); - } catch (e2) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f2) { - return f2(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f2) { - return f2(this.value).map(() => this.value); - } - asyncMap(f2) { - return ResultAsync.fromSafePromise(f2(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f2) { - return err(f2(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f2) { - return f2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self = this; - yield self; - return self; - } -}; -var fromThrowable = Result.fromThrowable; -var LufiFile = class _LufiFile { - constructor(serverUrl, properties) { - __publicField(this, "actionToken", ""); - __publicField(this, "chunksReady", 0); - __publicField(this, "createdAt", 0); - __publicField(this, "delay", 0); - __publicField(this, "delAtFirstView", false); - __publicField(this, "keys", { client: "", server: "" }); - __publicField(this, "name", ""); - __publicField(this, "password", ""); - __publicField(this, "queueIndex", 0); - __publicField(this, "serverUrl"); - __publicField(this, "size", 0); - __publicField( - this, - "uploadStatus", - 3 - /* INITIALIZED */ - ); - __publicField(this, "totalChunks", 0); - __publicField(this, "type", ""); - __publicField(this, "zipped", false); - this.serverUrl = serverUrl; - Object.assign(this, properties); - } - downloadUrl() { - const serverUrl = new URL(this.serverUrl); - return new URL( - `${serverUrl.origin + serverUrl.pathname}r/${this.keys.server}#${this.keys.client}` - ); - } - removeUrl() { - const serverUrl = new URL(this.serverUrl); - return new URL( - `${serverUrl.origin + serverUrl.pathname}d/${this.keys.server}/${this.actionToken}` - ); - } - static fromDownloadUrl(downloadUrl, password = "") { - const pathinfos = downloadUrl.pathname.split("r/"); - const keys = { - client: downloadUrl.hash.slice(1).split("&")[0], - server: pathinfos[1] - }; - return new _LufiFile(downloadUrl.origin + pathinfos[0], { - keys, - password - }); - } - static fromRemoveUrl(removeUrl, password = "") { - const pathInfos = removeUrl.pathname.split("d/"); - const splittedPath = pathInfos[1].split("/"); - const keys = { client: "", server: splittedPath[0] }; - return new _LufiFile(removeUrl.origin + pathInfos[0], { - keys, - password, - actionToken: splittedPath[1] - }); - } -}; -var import_events = __toESM(require_events()); -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; -var ConnectionError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to connect. Is the computer able to access the url?"); - } -}; -var ServerError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "The server returned an error"); - } -}; -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; -var fetchServerConfig = (instanceUrl) => { - const originMatches = instanceUrl.href.match( - /(.*?)\/?(?:\/[dr]{1}\/|login\/?|files\/?)/ - ); - const urlOrigin = originMatches && originMatches[1] ? originMatches[1] : instanceUrl.origin; - return ResultAsync.fromPromise( - fetch(urlOrigin + "/about/config"), - (error) => new ConnectionError(void 0, { - cause: ensureError(error) - }) - ).andThen((response) => { - if (response.ok) { - return ResultAsync.fromPromise( - response.json(), - (error) => ensureError(error) - ); - } else { - return errAsync( - new ServerError(void 0, { context: response.statusText }) - ); - } - }); -}; -var isDenoRuntime = () => typeof Deno !== "undefined"; -var isSecureContext2 = () => { - return isDenoRuntime() || globalThis.isSecureContext || globalThis.location.protocol === "https:"; -}; -var workerUrl = (relativePath) => { - return isDenoRuntime() ? new URL(`./worker/${relativePath}.ts`, new URL(".", import.meta.url).href) : new URL( - import.meta.resolve( - `./${relativePath !== "encrypt" ? `worker/${relativePath}` : relativePath}.js` - ) - ); -}; -var LufiJob = class { - constructor(lufiFile, workerType) { - __publicField(this, "events", new import_events.default()); - __publicField(this, "lufiFile"); - __publicField( - this, - "status", - 2 - /* ONGOING */ - ); - __publicField(this, "archiveFile"); - __publicField(this, "archiveFiles", []); - __publicField(this, "downloadedFile"); - __publicField(this, "worker"); - __publicField(this, "isTerminated", false); - __publicField(this, "complete", () => { - this.status = 0; - this.events.emit( - "JOB_TERMINATED" - /* JOB_TERMINATED */ - ); - }); - __publicField( - this, - "hasFailed", - () => this.status === 1 - /* FAILED */ - ); - __publicField(this, "onError", (callback) => { - this.worker.onerror = (event) => { - callback(event); - }; - return this; - }); - __publicField(this, "onMessage", (callback) => { - this.worker.onmessage = (e2) => { - if (callback) { - callback(e2); - } - const event = e2.data.event; - if (event) { - if (event === "FILE_UPDATED") { - Object.assign(this.lufiFile, e2.data.lufiFile); - } else { - this.dispatchEvent(event, e2.data.error); - } - } - }; - return this; - }); - __publicField(this, "onMessageError", (callback) => { - this.worker.onmessageerror = (event) => { - callback(event); - }; - return this; - }); - __publicField(this, "onProgress", (callback) => { - this.events.on("CHUNK_UPLOADED", () => { - callback(); - }); - this.events.on("CHUNK_DOWNLOADED", () => { - callback(); - }); - return this; - }); - __publicField(this, "requestMessage", (msg, transferable = []) => { - this.worker.postMessage(msg, transferable); - return this; - }); - __publicField(this, "terminate", () => { - this.worker.terminate(); - return this; - }); - __publicField(this, "waitForCompletion", () => { - if (this.isTerminated) { - if (this.status === 0) { - return okAsync(this); - } else { - return errAsync(ensureError("Job has failed")); - } - } else { - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - this.events.once("OPERATION_FAILED", (error) => { - reject(error); - }); - this.events.once("JOB_TERMINATED", () => { - if (this.status === 0) { - resolve(this); - } - }); - }), - (error) => ensureError(error) - ); - } - }); - __publicField(this, "waitForStart", () => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - this.events.once("OPERATION_FAILED", (error) => { - reject(error); - }); - this.events.once("UPLOAD_STARTED", () => { - resolve(this); - }); - this.events.once("DOWNLOAD_STARTED", () => { - resolve(this); - }); - }), - (error) => ensureError(error) - )); - __publicField(this, "dispatchEvent", (event, error) => { - this.events.emit(event, error); - }); - switch (workerType) { - case 0: - { - this.worker = new Worker(workerUrl("cancel"), { type: "module" }); - } - break; - case 1: - { - this.worker = new Worker(workerUrl("compress"), { type: "module" }); - } - break; - case 2: - { - this.worker = new Worker(workerUrl("decompress"), { type: "module" }); - } - break; - case 3: - { - this.worker = new Worker(workerUrl("download"), { type: "module" }); - } - break; - case 4: - { - this.worker = new Worker(workerUrl("infos"), { type: "module" }); - } - break; - case 5: - { - this.worker = new Worker(workerUrl("remove"), { type: "module" }); - } - break; - case 6: - { - this.worker = new Worker(workerUrl("upload"), { type: "module" }); - } - break; - } - this.lufiFile = lufiFile; - this.events.once("JOB_TERMINATED", () => { - this.isTerminated = true; - this.terminate(); - }); - this.events.once("OPERATION_FAILED", (error) => { - this.status = 1; - this.lufiFile.uploadStatus = 2; - this.events.emit("JOB_TERMINATED", error); - }); - this.onError((event) => console.error(event.error)); - } -}; -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i2 = 0; i2 < len; i2 += 3) { - res += this._charset[view[i2] >> 2] + this._charset[(view[i2] & 3) << 4 | view[i2 + 1] >> 4] + this._charset[(view[i2 + 1] & 15) << 2 | view[i2 + 2] >> 6] + this._charset[view[i2 + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i2 = 0, j = 0; - while (i2 < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i2++] = enc1 << 2 | enc2 >> 4; - view[i2++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i2++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Encode(ab) { - return obj2.Encode(ab); -} -var import_lufi_sjcl = __toESM(require_sjcl()); -var CryptoError = class extends BaseError { -}; -var HashingError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to hash the provided string"); - } -}; -var generateKey = () => { - try { - return okAsync(import_lufi_sjcl.default.codec.base64.fromBits(import_lufi_sjcl.default.random.randomWords(8, 10))); - } catch (error) { - return errAsync( - new CryptoError("Unable to generate key", { - cause: ensureError(error) - }) - ); - } -}; -var hashPassword = (password) => { - try { - return okAsync(import_lufi_sjcl.default.codec.hex.fromBits(import_lufi_sjcl.default.hash.sha512.hash(password))); - } catch (error) { - return errAsync(new HashingError(void 0, { cause: ensureError(error) })); - } -}; -var generateKey2 = () => { - return ResultAsync.fromPromise( - new Promise( - (resolve, reject) => crypto.subtle.generateKey( - { - name: "AES-GCM", - length: 256 - }, - true, - ["encrypt", "decrypt"] - ).then( - (generatedKey) => crypto.subtle.exportKey("raw", generatedKey).then((key) => resolve(Encode(key))).catch((error) => { - reject( - new CryptoError("Unable to base64 encode the url", { - cause: ensureError(error) - }) - ); - }) - ).catch((error) => reject(error)) - ), - (error) => new CryptoError("Unable to generate key", { cause: ensureError(error) }) - ); -}; -var hashPassword2 = (password) => { - const promise = async () => { - return Array.from( - new Uint8Array( - await crypto.subtle.digest( - "SHA-512", - new TextEncoder().encode(password) - ) - ) - ).map((b2) => b2.toString(16).padStart(2, "0")).join(""); - }; - return ResultAsync.fromPromise( - promise(), - (error) => new HashingError(void 0, { cause: ensureError(error) }) - ); -}; -var generateKey3 = (algo = 1) => algo === 0 ? generateKey() : generateKey2(); -var hashPassword3 = (password, algo) => algo === 0 ? hashPassword(password) : hashPassword2(password); -var DownloadError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while downloading the data"); - } -}; -var InfosError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to retrieve server informations"); - } -}; -var JobError = class extends BaseError { -}; -var JobPauseError = class extends JobError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to pause the job"); - } -}; -var JobResumeError = class extends JobError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to resume the job"); - } -}; -var UploadError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while uploading the data"); - } -}; -var CHUNK_LENGTH = 15e5; -var files = {}; -var events = new import_events2.default(); -var cancel = (uploadJob) => { - uploadJob.terminate(); - const job = new LufiJob( - uploadJob.lufiFile, - 0 - /* CANCEL */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "UPLOAD_CANCELLED") { - files[job.lufiFile.keys.client].uploadStatus = 0; - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError( - "An error occured while trying to cancel an upload", - { cause: event.data.error } - ) - ); - } - }).requestMessage({ - args: { - lufiFile: job.lufiFile - } - }); - }), - (error) => ensureError(error) - ); -}; -var addFilesToArchive = (files2, archiveEntries = {}) => { - const asyncLoop = async (files3) => { - var _a; - for (const file of files3) { - const nameWithExtension = ((_a = file.name.split("/")) == null ? void 0 : _a.pop()) || file.name; - const nameWithoutExtension = nameWithExtension.split(".").shift(); - const extension = nameWithExtension.split(".").length > 1 ? `.${nameWithExtension.split(".").pop()}` : ""; - let name = nameWithExtension; - if (archiveEntries[name] !== void 0) { - let i2 = 1; - do { - name = `${nameWithoutExtension}(${i2})${extension}`; - i2++; - } while (archiveEntries[name] !== void 0); - } - events.emit("ARCHIVE_ADDED_FILE", { name, size: file.size }); - archiveEntries[name] = await file.bytes(); - } - }; - return ResultAsync.fromPromise( - asyncLoop(files2), - (error) => ensureError(error) - ).andThen(() => okAsync(archiveEntries)); -}; -var compress = (archiveEntries, archiveName) => { - const lufiFile = new LufiFile(""); - const job = new LufiJob( - lufiFile, - 1 - /* COMPRESS */ - ); - return okAsync( - job.onMessage((event) => { - if (event.data.event === "ARCHIVE_CREATED") { - job.archiveFile = new File([event.data.buffer], archiveName, { - type: "application/zip" - }); - job.complete(); - } - }).requestMessage({ - args: { - lufiFile, - archive: { entries: archiveEntries } - } - }) - ); -}; -var decompress = (zipFile) => { - const lufiFile = new LufiFile(""); - const job = new LufiJob( - lufiFile, - 2 - /* DECOMPRESS */ - ); - return okAsync( - job.onMessage((event) => { - if (event.data.event === "ARCHIVE_DECOMPRESSED") { - job.complete(); - } - if (event.data.event === "ARCHIVE_RETRIEVED_FILE") { - job.archiveFiles.push( - new File([event.data.file.buffer], event.data.file.path) - ); - } - }).requestMessage({ - args: { - lufiFile, - archive: { file: zipFile } - } - }) - ); -}; -var handlePasswordHashing = (downloadUrl, password) => { - if (password) { - return fetchServerConfig(downloadUrl).andThen((config) => { - if (config.version.tag > "0.07.0") { - const algo = isSecureContext2() ? 1 : 0; - return hashPassword3(password, algo).andThen( - (hashedPassword) => okAsync(LufiFile.fromDownloadUrl(downloadUrl, hashedPassword)) - ); - } else { - return okAsync(LufiFile.fromDownloadUrl(downloadUrl, password)); - } - }); - } else { - return okAsync(LufiFile.fromDownloadUrl(downloadUrl)); - } -}; -var download = (downloadUrl, password) => handlePasswordHashing(downloadUrl, password).andThen( - (lufiFile) => { - const job = new LufiJob( - lufiFile, - 3 - /* DOWNLOAD */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - const chunks = []; - return job.onMessage((event) => { - handleSocketResults(resolve, reject, job, event); - if (event.data.event === "CHUNK_DOWNLOADED") { - chunks.push(event.data.chunk.buffer); - if (chunks.length >= 50) { - job.downloadedFile = new File( - job.downloadedFile ? [job.downloadedFile.slice()].concat(chunks) : chunks, - lufiFile.name, - { - type: lufiFile.type - } - ); - chunks.length = 0; - } - } - if (event.data.event === "DOWNLOAD_COMPLETE") { - job.downloadedFile = new File( - job.downloadedFile ? [job.downloadedFile.slice()].concat(chunks) : chunks, - lufiFile.name, - { - type: lufiFile.type - } - ); - chunks.length = 0; - job.complete(); - } - }).requestMessage({ - args: { - lufiFile - } - }); - }), - (error) => new DownloadError(void 0, { cause: ensureError(error) }) - ); - } -); -var infos = (downloadUrl, password) => handlePasswordHashing(downloadUrl, password).andThen( - (lufiFile) => okAsync(new LufiJob( - lufiFile, - 4 - /* INFOS */ - )) -).andThen( - (job) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "INFOS_RETRIEVED") { - job.complete(); - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError( - "An error occured while trying to retrieve informations of the file", - { cause: event.data.error } - ) - ); - } - }).requestMessage({ - args: { lufiFile: job.lufiFile } - }); - }), - (error) => new InfosError(void 0, { cause: ensureError(error) }) - ) -); -var pause = (job) => { - try { - job.status = 3; - return okAsync( - job.requestMessage({ - action: 0, - args: { lufiFile: job.lufiFile } - }) - ); - } catch (error) { - return errAsync( - new JobPauseError(void 0, { cause: ensureError(error) }) - ); - } -}; -var remove = (removeUrl, password) => { - const lufiFile = LufiFile.fromRemoveUrl(removeUrl, password); - const job = new LufiJob( - lufiFile, - 5 - /* REMOVE */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "FILE_REMOVED") { - job.complete(); - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError("An error occured while trying to remove a file", { - cause: event.data.error - }) - ); - } - }).requestMessage({ args: { lufiFile } }); - }), - (error) => ensureError(error) - ); -}; -var resume = (job) => { - try { - job.status = 2; - return okAsync( - job.requestMessage({ - action: 2, - args: { lufiFile: job.lufiFile } - }) - ); - } catch (error) { - return errAsync( - new JobResumeError(void 0, { cause: ensureError(error) }) - ); - } -}; -var sliceAndUpload = (job, file, algo, chunkLength = CHUNK_LENGTH) => { - events.emit("SLICE_STARTED", files[job.lufiFile.keys.client]); - const totalChunks = Math.ceil(file.size / chunkLength) || 1; - const concurrency = navigator.hardwareConcurrency || 1; - files[job.lufiFile.keys.client].totalChunks = totalChunks; - const sequentialLoop = async () => { - for (let i2 = 0; i2 < totalChunks; i2++) { - const start = i2 * chunkLength; - const end = Math.min(start + chunkLength, file.size); - const buffer = await file.slice(start, end, file.type).arrayBuffer(); - job.requestMessage( - { - args: { - chunk: { - buffer, - index: i2 - }, - lufiFile: files[job.lufiFile.keys.client], - algo - } - }, - [buffer] - ); - if (i2 === 0) { - const waitUntilUploadStarted = () => new Promise((resolve) => { - job.events.once("UPLOAD_STARTED", () => { - resolve(void 0); - }); - }); - await waitUntilUploadStarted(); - } else if (i2 % concurrency === 0) { - const waitForQueueAvailability = () => new Promise((resolve) => { - job.events.once("CHUNK_UPLOADED", () => { - resolve(void 0); - }); - }); - await waitForQueueAvailability(); - } - } - }; - sequentialLoop(); - return okAsync(void 0); -}; -var startUpload = (serverUrl, file, delay, delAtFirstView, zipped, password, algo) => generateKey3( - algo -).andThen( - (clientKey) => { - if (password) { - return hashPassword3(password, algo).andThen( - (hashedPassword) => okAsync({ password: hashedPassword, clientKey }) - ); - } else { - return okAsync({ password, clientKey }); - } - } -).andThen(({ password: password2, clientKey }) => { - files[clientKey] = new LufiFile(serverUrl.toString(), { - delay, - delAtFirstView, - zipped, - password: password2, - name: file.name.split("/").pop(), - // Remove path from filename - size: file.size, - type: file.type, - keys: { client: clientKey, server: "" } - }); - const job = new LufiJob( - files[clientKey], - 6 - /* UPLOAD */ - ); - files[clientKey].uploadStatus = 4; - return sliceAndUpload(job, file, algo).andThen( - () => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - handleSocketResults(resolve, reject, job, event); - switch (event.data.event) { - case "UPLOAD_COMPLETE": - { - job.complete(); - job.lufiFile.uploadStatus = 1; - } - break; - } - }); - }), - (error) => ensureError(error) - ) - ); -}); -var upload = (serverUrl, filesToUpload, delay = 0, delAtFirstView = false, zipped = false, zipName = "documents.zip", password = "", algo = 1) => { - const operations = []; - if (!zipped) { - filesToUpload.forEach((file) => { - operations.push(startUpload( - serverUrl, - file, - delay, - delAtFirstView, - zipped, - password, - algo - )); - }); - } else { - if (filesToUpload.length === 1 && filesToUpload[0].type === "application/zip") { - operations.push( - startUpload( - serverUrl, - filesToUpload[0], - delay, - delAtFirstView, - zipped, - password, - algo - ) - ); - } else { - operations.push( - addFilesToArchive(filesToUpload).andThen( - (archiveEntries) => compress( - archiveEntries, - zipName - ).andThen((job) => job.waitForCompletion()).andThen((job) => { - if (job.archiveFile) { - return startUpload( - serverUrl, - job.archiveFile, - delay, - delAtFirstView, - true, - password, - algo - ); - } else { - return errAsync(new JobError("archiveFile must be defined")); - } - }) - ) - ); - } - } - return ResultAsync.combine(operations).orElse( - (error) => errAsync(new UploadError(void 0, { cause: error })) - ); -}; -var handleSocketResults = (resolve, reject, job, event) => { - if (event.data.event === "SOCKET_OPENED") { - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError("The job returned an error", { cause: event.data.error }) - ); - } -}; -var getFilesQueued = () => Object.values(files).filter( - (file) => file.uploadStatus === 4 - /* QUEUED */ -); -var getFileIndexInQueue = (clientKey) => Object.keys(getFilesQueued()).indexOf(clientKey); - -// themes/default/public/js/lib/filesize.esm.min.js -var t = "array"; -var i = "bit"; -var o = "bits"; -var e = "byte"; -var n = "bytes"; -var r = ""; -var a = "exponent"; -var b = "function"; -var s = "iec"; -var l = "Invalid number"; -var p = "Invalid rounding method"; -var u = "jedec"; -var c = "object"; -var d = "."; -var f = "round"; -var g = "s"; -var m = "si"; -var B = "kbit"; -var y = "kB"; -var h = " "; -var M = "string"; -var x = "0"; -var w = { symbol: { iec: { bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, jedec: { bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] } }, fullform: { iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] } }; -function E(E2, { bits: T = false, pad: j = false, base: N = -1, round: P = 2, locale: S = r, localeOptions: k = {}, separator: G = r, spacer: K = h, symbols: Y = {}, standard: Z = r, output: v = M, fullform: O = false, fullforms: $ = [], exponent: z = -1, roundingMethod: I = f, precision: L = 0 } = {}) { - let D = z, q = Number(E2), A = [], C = 0, F = r; - Z === m ? (N = 10, Z = u) : Z === s || Z === u ? N = 2 : 2 === N ? Z = s : (N = 10, Z = u); - const H = 10 === N ? 1e3 : 1024, J = true === O, Q = q < 0, R = Math[I]; - if ("bigint" != typeof E2 && isNaN(E2)) throw new TypeError(l); - if (typeof R !== b) throw new TypeError(p); - if (Q && (q = -q), (-1 === D || isNaN(D)) && (D = Math.floor(Math.log(q) / Math.log(H)), D < 0 && (D = 0)), D > 8 && (L > 0 && (L += 8 - D), D = 8), v === a) return D; - if (0 === q) A[0] = 0, F = A[1] = w.symbol[Z][T ? o : n][D]; - else { - C = q / (2 === N ? Math.pow(2, 10 * D) : Math.pow(1e3, D)), T && (C *= 8, C >= H && D < 8 && (C /= H, D++)); - const t2 = Math.pow(10, D > 0 ? P : 0); - A[0] = R(C * t2) / t2, A[0] === H && D < 8 && -1 === z && (A[0] = 1, D++), F = A[1] = 10 === N && 1 === D ? T ? B : y : w.symbol[Z][T ? o : n][D]; - } - if (Q && (A[0] = -A[0]), L > 0 && (A[0] = A[0].toPrecision(L)), A[1] = Y[A[1]] || A[1], true === S ? A[0] = A[0].toLocaleString() : S.length > 0 ? A[0] = A[0].toLocaleString(S, k) : G.length > 0 && (A[0] = A[0].toString().replace(d, G)), j && P > 0) { - const t2 = A[0].toString(), i2 = G || (t2.match(/(\D)/g) || []).pop() || d, o2 = t2.toString().split(i2), e2 = o2[1] || r, n2 = e2.length, a2 = P - n2; - A[0] = `${o2[0]}${i2}${e2.padEnd(n2 + a2, x)}`; - } - return J && (A[1] = $[D] ? $[D] : w.fullform[Z][D] + (T ? i : e) + (1 === A[0] ? r : g)), v === t ? A : v === c ? { value: A[0], symbol: A[1], exponent: D, unit: F } : A.join(K); -} - -// themes/default/public/js/lib/utils.js -var entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - "/": "/" -}; -var escapeHtml = (string) => String(string).replace(/[&<>"'\/]/g, (s2) => entityMap[s2]); -var notify = (title, body) => { - if (isSecureContext) { - if (!("Notification" in window) || typeof Notification === "undefined") { - console.log( - `This browser does not support desktop notification, cannot send following message: ${title} ${body}` - ); - return; - } - if (Notification.permission !== "granted") { - Notification.requestPermission(); - } else { - new Notification(title, { - body, - icon: "/img/lufi.svg" - }); - } - } -}; - -// themes/default/public/js/download.js -document.addEventListener("DOMContentLoaded", () => { - const passwordFormDOM = document.getElementById("password-form"); - const updateDOM = (type) => { - const blockDOM = document.querySelector(`template#block-download-${type}`).content.cloneNode(true).children[0]; - blockDOM.querySelector(".size").innerText = E( - blockDOM.querySelector(".size").dataset.filesize - ); - if (blockDOM.querySelector(".description").dataset.isZipped === "true") { - blockDOM.querySelector(".icon").classList.replace("fa-file", "fa-file-zipper"); - } - document.getElementById("download-container").replaceChildren(blockDOM); - if (type === "success") { - document.getElementById("download-button").focus(); - } - return blockDOM; - }; - const isPasswordNeeded = () => passwordFormDOM !== null; - const onPasswordEvents = () => { - passwordFormDOM.onsubmit = (event) => { - event.preventDefault(); - passwordFormDOM.classList.add("is-hidden"); - startDownload(); - }; - }; - const showZipContent = (zipFile) => { - const zipContainerDOM = document.getElementById("zip-container"); - const showZipButtonDOM = document.getElementById("show-zip-button"); - zipContainerDOM.classList.remove("is-hidden"); - showZipButtonDOM.href = window.location; - showZipButtonDOM.onclick = () => { - const zipContentDOM = zipContainerDOM.querySelector(".content"); - document.body.style.cursor = "wait"; - showZipButtonDOM.style.cursor = "wait"; - lufi_exports.decompress(zipFile).andThen((job) => job.waitForCompletion()).map((job) => { - zipContentDOM.replaceChildren(); - zipContentDOM.classList.remove("has-text-centered"); - job.archiveFiles.forEach((file) => { - const itemDOM = document.querySelector("template#card-zipped-item").content.cloneNode(true).children[0]; - itemDOM.querySelector(".name").innerText = escapeHtml(file.name); - itemDOM.querySelector(".size").innerText = E(file.size); - const downloadItemDOM = itemDOM.querySelector(".action-download"); - downloadItemDOM.download = escapeHtml(file.name); - downloadItemDOM.href = URL.createObjectURL(file); - zipContentDOM.append(itemDOM); - }); - document.body.style.cursor = "auto"; - }).mapErr((error) => { - console.error(error); - }); - }; - }; - const startDownload = () => { - var _a; - lufi_exports.download(window.location, (_a = document.getElementById("password")) == null ? void 0 : _a.value).andThen((job) => { - const blockDOM = updateDOM("ongoing"); - warnOnReload(); - job.onProgress(() => { - const percent = Math.round( - job.lufiFile.chunksReady * 100 / job.lufiFile.totalChunks - ); - blockDOM.querySelector(".progress").value = percent; - blockDOM.querySelector(".progress").innerText = percent; - blockDOM.querySelector(".progress-text").innerText = percent + "%"; - }); - document.getElementById("abort-button").onclick = () => { - job.terminate(); - warnOnReload(false); - updateDOM("aborted"); - document.getElementById("reload-button").onclick = (event) => { - event.preventDefault(); - window.location.reload(); - }; - }; - return job.waitForCompletion(); - }).mapErr((error) => { - updateDOM("error").querySelector(".message-body").innerText = error.message; - warnOnReload(false); - }).andThen((job) => { - notify(i18n.fileDownloaded, job.lufiFile.name); - const downloadDOM = updateDOM("success"); - const downloadButtonDOM = document.getElementById("download-button"); - const blobURL = URL.createObjectURL(job.downloadedFile); - downloadButtonDOM.href = blobURL; - downloadButtonDOM.download = escapeHtml(job.lufiFile.name); - const isZipped = downloadDOM.querySelector(".description").dataset.isZipped === "true"; - let render; - if (job.lufiFile.type.match(/^image\//) !== null) { - render = `${escapeHtml(
-          job.lufiFile.name
-        )}`; - } else if (job.lufiFile.type.match(/^video\//) !== null) { - render = ``; - } else if (job.lufiFile.type.match(/^audio\//) !== null) { - render = ``; - } - if (render) { - downloadDOM.querySelector(".render").innerHTML = render; - } - if (isZipped) { - showZipContent(job.downloadedFile); - } - }); - }; - const warnOnReload = (toWarn = true) => { - window.onbeforeunload = toWarn ? i18n.confirmExit : null; - }; - if (isPasswordNeeded()) { - onPasswordEvents(); - } else { - startDownload(); - } -}); -/*! - 2024 Jason Mulligan - @version 10.1.6 -*/ diff --git a/themes/default/public/js/minified/files.min.js b/themes/default/public/js/minified/files.min.js deleted file mode 100644 index 41aaf3d..0000000 --- a/themes/default/public/js/minified/files.min.js +++ /dev/null @@ -1,191 +0,0 @@ -// themes/default/public/js/lib/utils.js -var formatDate = (unixTimestamp) => new Date(unixTimestamp * 1e3).toLocaleString(window.navigator.language, { - year: "numeric", - month: "long", - day: "numeric", - weekday: "long", - hour: "2-digit", - minute: "2-digit" -}); - -// themes/default/public/js/files.js -var addItem = (item) => { - const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || []; - files.push(item); - localStorage.setItem(`${prefix}files`, JSON.stringify(files)); -}; -var deleteFromStorage = (serverKey) => { - let files = JSON.parse(localStorage.getItem(`${prefix}files`)) || []; - files = files.filter((file) => file.short !== serverKey); - localStorage.setItem(`${prefix}files`, JSON.stringify(files)); -}; -var itemExists = (serverKey) => { - const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || []; - return files.some((file) => file.short === serverKey); -}; -var updateSelection = (event) => { - document.querySelectorAll(".item .checkbox input").forEach((node) => { - node.checked = event.target.checked; - }); - checkItemSelection(); -}; -var purgeExpired = () => { - const files = JSON.parse(localStorage.getItem(`${prefix}files`)); - files.forEach((file) => { - const fileDOM = document.querySelector(`.item-${file.short}`); - if (fileDOM == null ? void 0 : fileDOM.classList.contains("deleted")) { - deleteFromStorage(file.short); - fileDOM.remove(); - } - }); -}; -var exportStorage = () => { - const exportStorageDOM = document.getElementById("action-export-storage"); - const storageData = [localStorage.getItem(`${prefix}files`)]; - const exportFile = new Blob(storageData, { type: "application/json" }); - exportStorageDOM.href = window.URL.createObjectURL(exportFile); - exportStorageDOM.download = "data.json"; -}; -var importStorage = (event) => { - const reader = new FileReader(); - reader.addEventListener("loadend", () => { - try { - const newFiles = JSON.parse( - String.fromCharCode.apply(null, new Uint8Array(reader.result)) - ); - let importedCounter = 0; - newFiles.forEach((file) => { - if (validURL(file.url) && !itemExists(file.short)) { - addItem(file); - importedCounter++; - } - }); - populateFilesTable(); - } catch (err) { - alert(err); - } - }); - reader.readAsArrayBuffer(event.target.files[0]); -}; -var validURL = (str) => { - try { - return new URL(str).host ? true : false; - } catch (e) { - return false; - } -}; -var deleteFile = (node) => { - const serverKey = node.dataset.serverKey; - const deleteUrl = new URL( - `${actionURL}d/${serverKey}/${node.dataset.actionKey}` - ); - deleteUrl.searchParams.append("_format", "json"); - fetch(deleteUrl, { - method: "GET" - }).then((response) => { - if (!response.ok) { - throw new Error("Network error while deleting file"); - } - return response.json(); - }).then((data) => { - if (data.success) { - node.remove(); - deleteFromStorage(serverKey); - } else { - alert(data.msg); - } - checkItemSelection(); - }); -}; -var checkItemSelection = () => { - const deleteSelectionDOM = document.getElementById("action-delete-selection"); - if (document.querySelectorAll(".item .checkbox input:checked").length > 0) { - deleteSelectionDOM.disabled = false; - } else { - deleteSelectionDOM.disabled = true; - } -}; -var deleteSelection = () => { - document.querySelectorAll(".item:has(.checkbox input:checked)").forEach((node) => deleteFile(node)); -}; -var populateFilesTable = () => { - const itemsTableDOM = document.getElementById("items-table"); - itemsTableDOM.replaceChildren(); - let files = localStorage.getItem(`${prefix}files`); - if (files === null) { - const filesWithoutPrefix = localStorage.getItem("files"); - if (filesWithoutPrefix !== null) { - if (confirm(i18n.importFilesWithoutPrefix)) { - localStorage.setItem(`${prefix}files`, filesWithoutPrefix); - files = JSON.parse(filesWithoutPrefix); - } else { - localStorage.setItem(`${prefix}files`, JSON.stringify([])); - files = []; - } - } else { - files = []; - } - } else { - files = JSON.parse(files); - } - files.sort((a, b) => b.created_at - a.created_at); - files.forEach((file) => { - const itemDOM = document.querySelector("template#item").content.cloneNode(true).children[0]; - itemDOM.classList.add(`item-${file.short}`); - itemDOM.dataset.serverKey = file.short; - itemDOM.dataset.actionKey = file.token; - itemDOM.querySelector(".name").innerText = file.name; - itemDOM.querySelector(".download a").href = file.url; - itemDOM.querySelector(".delete-at-first-view .icon").classList.add(file.del_at_first_view ? "fa-eraser" : "fa-close"); - itemDOM.querySelector(".created-at").innerText = formatDate( - file.created_at - ); - itemDOM.querySelector(".expires-at").innerText = file.delay == 0 ? i18n.noExpiration : formatDate(file.delay * 86400 + file.created_at); - itemDOM.querySelector( - ".mail a" - ).href = `${actionURL}m?links=["${file.short}"]`; - itemDOM.querySelector(".action-delete-item").onclick = () => deleteFile(itemDOM); - itemDOM.querySelector(".checkbox input").onclick = () => { - checkItemSelection(); - }; - itemsTableDOM.append(itemDOM); - console.debug(file.short, file.token); - fetch(counterURL, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" - }, - body: new URLSearchParams({ - short: file.short, - token: file.token - }) - }).then((response) => { - if (!response.ok) { - throw new Error(`Request error: ${response.statusText}`); - } - return response.json(); - }).then((data) => { - const countDOM = itemDOM.querySelector(".counter"); - if (data.success) { - countDOM.innerText = data.counter; - if (data.deleted) { - countDOM.parentElement.classList.add("deleted"); - } - } else { - alert(data.msg); - countDOM.parentElement.remove(); - if (data.missing) { - deleteFromStorage(data.short); - } - } - }).catch((error) => console.error(error)); - }); -}; -document.addEventListener("DOMContentLoaded", () => { - populateFilesTable(); - document.getElementById("action-select-all").onclick = updateSelection; - document.getElementById("action-export-storage").onclick = exportStorage; - document.getElementById("action-purge-expired").onclick = purgeExpired; - document.getElementById("action-import-storage").onchange = importStorage; - document.getElementById("action-delete-selection").onclick = deleteSelection; -}); diff --git a/themes/default/public/js/minified/list-invitations.min.js b/themes/default/public/js/minified/list-invitations.min.js deleted file mode 100644 index e6c71c2..0000000 --- a/themes/default/public/js/minified/list-invitations.min.js +++ /dev/null @@ -1,235 +0,0 @@ -// themes/default/public/js/lib/filesize.esm.min.js -var t = "array"; -var i = "bit"; -var o = "bits"; -var e = "byte"; -var n = "bytes"; -var r = ""; -var a = "exponent"; -var b = "function"; -var s = "iec"; -var l = "Invalid number"; -var p = "Invalid rounding method"; -var u = "jedec"; -var c = "object"; -var d = "."; -var f = "round"; -var g = "s"; -var m = "si"; -var B = "kbit"; -var y = "kB"; -var h = " "; -var M = "string"; -var x = "0"; -var w = { symbol: { iec: { bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, jedec: { bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] } }, fullform: { iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] } }; -function E(E2, { bits: T = false, pad: j = false, base: N = -1, round: P = 2, locale: S = r, localeOptions: k = {}, separator: G = r, spacer: K = h, symbols: Y = {}, standard: Z = r, output: v = M, fullform: O = false, fullforms: $ = [], exponent: z = -1, roundingMethod: I = f, precision: L = 0 } = {}) { - let D = z, q = Number(E2), A = [], C = 0, F = r; - Z === m ? (N = 10, Z = u) : Z === s || Z === u ? N = 2 : 2 === N ? Z = s : (N = 10, Z = u); - const H = 10 === N ? 1e3 : 1024, J = true === O, Q = q < 0, R = Math[I]; - if ("bigint" != typeof E2 && isNaN(E2)) throw new TypeError(l); - if (typeof R !== b) throw new TypeError(p); - if (Q && (q = -q), (-1 === D || isNaN(D)) && (D = Math.floor(Math.log(q) / Math.log(H)), D < 0 && (D = 0)), D > 8 && (L > 0 && (L += 8 - D), D = 8), v === a) return D; - if (0 === q) A[0] = 0, F = A[1] = w.symbol[Z][T ? o : n][D]; - else { - C = q / (2 === N ? Math.pow(2, 10 * D) : Math.pow(1e3, D)), T && (C *= 8, C >= H && D < 8 && (C /= H, D++)); - const t2 = Math.pow(10, D > 0 ? P : 0); - A[0] = R(C * t2) / t2, A[0] === H && D < 8 && -1 === z && (A[0] = 1, D++), F = A[1] = 10 === N && 1 === D ? T ? B : y : w.symbol[Z][T ? o : n][D]; - } - if (Q && (A[0] = -A[0]), L > 0 && (A[0] = A[0].toPrecision(L)), A[1] = Y[A[1]] || A[1], true === S ? A[0] = A[0].toLocaleString() : S.length > 0 ? A[0] = A[0].toLocaleString(S, k) : G.length > 0 && (A[0] = A[0].toString().replace(d, G)), j && P > 0) { - const t2 = A[0].toString(), i2 = G || (t2.match(/(\D)/g) || []).pop() || d, o2 = t2.toString().split(i2), e2 = o2[1] || r, n2 = e2.length, a2 = P - n2; - A[0] = `${o2[0]}${i2}${e2.padEnd(n2 + a2, x)}`; - } - return J && (A[1] = $[D] ? $[D] : w.fullform[Z][D] + (T ? i : e) + (1 === A[0] ? r : g)), v === t ? A : v === c ? { value: A[0], symbol: A[1], exponent: D, unit: F } : A.join(K); -} - -// themes/default/public/js/list-invitations.js -var updateButtonsStatus = () => { - const targetSelectionDOM = document.querySelectorAll(".target-selection"); - if (document.querySelectorAll(".column.selection .checkbox input:checked").length > 0) { - targetSelectionDOM.forEach((node) => node.disabled = false); - } else { - targetSelectionDOM.forEach((node) => node.disabled = true); - } -}; -var invertSelection = () => { - document.querySelectorAll(".item .column.selection input").forEach((node) => { - node.click(); - }); - updateButtonsStatus(); -}; -var toggleHidden = () => { - const invitationsListDOM = document.querySelector(".invitations-list"); - const toggleButtonDOM = document.querySelector(".action-toggle-hidden"); - const itemsHiddenDOM = invitationsListDOM.querySelectorAll( - ".item[data-visibility='0']" - ); - if (invitationsListDOM.getAttribute("data-visibility") === "hidden") { - toggleButtonDOM.innerText = i18n.hideText; - itemsHiddenDOM.forEach((item) => showNode(item)); - invitationsListDOM.setAttribute("data-visibility", "shown"); - } else { - toggleButtonDOM.innerText = i18n.showText; - itemsHiddenDOM.forEach((item) => { - hideNode(item); - const checkbox = item.querySelector("input"); - if (checkbox.checked) { - checkbox.click(); - } - }); - invitationsListDOM.setAttribute("data-visibility", "hidden"); - } -}; -var deleteInvitation = () => { - if (confirm(i18n.confirmDeleteInvit)) { - try { - fetch(deleteURL, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" - }, - body: getTokensBody() - }).then((response) => { - if (!response.ok) { - throw new Error(`Request error: ${response.statusText}`); - } - return response.json(); - }).then((data) => { - if (data.success) { - data.tokens.forEach((t2) => { - addToast(t2.msg, "success"); - document.getElementById(`row-${t2.token}`).remove(); - }); - data.failures.forEach((msg) => { - addToast(msg, "error"); - }); - updateButtonsStatus(); - } else { - data.failures.forEach((msg) => { - addToast(msg, "error"); - }); - if (data.msg) { - addToast(data.msg, "error"); - } - } - }); - } catch (error) { - console.error(error); - } - } -}; -var resendInvitation = () => { - if (confirm(i18n.confirmResendMail)) { - fetch(resendURL, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" - }, - body: getTokensBody() - }).then((response) => { - if (!response.ok) { - throw new Error(`Request error: ${response.statusText}`); - } - return response.json(); - }).then((data) => { - if (data.success) { - data.tokens.forEach((t2) => { - const itemDOM = document.getElementById(`row-${t2.token}`); - itemDOM.querySelector(".column.expiration-date").innerText = t2.expires; - itemDOM.querySelector(".column.selection input").click(); - addToast(t2.msg, "success"); - }); - data.failures.forEach((msg) => { - addToast(msg, "error"); - }); - updateButtonsStatus(); - } - }).catch((error) => console.error(error)); - } -}; -var toggleVisibility = () => { - fetch(toggleURL, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" - }, - body: getTokensBody() - }).then((response) => { - if (!response.ok) { - throw new Error(`Request error: ${response.statusText}`); - } - return response.json(); - }).then((data) => { - if (data.success) { - data.tokens.forEach((t2) => { - const itemDOM = document.getElementById(`row-${t2.token}`); - if (t2.show) { - itemDOM.setAttribute("data-visibility", 1); - showNode(itemDOM); - itemDOM.querySelector(".column.selection .icon.hide-source").remove(); - } else { - itemDOM.setAttribute("data-visibility", 0); - if (document.querySelector(".invitations-list").getAttribute("data-visibility") === "hidden") { - hideNode(itemDOM); - } - itemDOM.querySelector(".column.selection").appendChild( - document.querySelector("template#icon-hide-source").content.cloneNode(true) - ); - } - itemDOM.querySelector(".column.selection input").click(); - }); - updateButtonsStatus(); - } else { - addToast(data.msg, "error"); - } - }).catch((error) => console.error(error)); -}; -var getTokensBody = () => { - const tokens = new URLSearchParams(); - document.querySelectorAll(".column.selection input:checked").forEach( - (item) => tokens.append("tokens[]", item.getAttribute("data-token")) - ); - return tokens; -}; -var fillModal = (event) => { - const buttonDOM = event.target; - const modalDOM = document.querySelector(".modal.files-info"); - modalDOM.querySelector(".files-list").replaceChildren(); - modalDOM.querySelector("h1").innerText = i18n.listFiles.replace("XX1", buttonDOM.getAttribute("data-token")).replace("XX2", buttonDOM.getAttribute("data-guest")); - const files = JSON.parse(buttonDOM.getAttribute("data-files")) || []; - const itemList = new DocumentFragment(); - files.forEach((file) => { - const expires = i18n.expiration.replace( - "XXX", - formatDate(file.delay * 86400 + file.created_at) - ); - const item = modalDOM.querySelector("template#item").content.cloneNode(true); - item.querySelector(".file-link").href = file.url; - item.querySelector(".file-link").value = file.name; - item.querySelector(".file-size").innerText = `${E( - file.size - )}, ${expires}`; - itemList.appendChild(item); - }); - modalDOM.querySelector(".files-list").appendChild(itemList); -}; -document.addEventListener("DOMContentLoaded", () => { - document.querySelectorAll(".modal-button.action-files-info").forEach( - (button) => button.onclick = (event) => { - fillModal(event); - document.querySelector(".modal.files-info").showModal(); - } - ); - document.querySelector(".close-modal").onclick = () => { - document.querySelector(".modal").close(); - }; - document.querySelectorAll(".column.selection input").forEach((node) => node.onclick = updateButtonsStatus); - document.querySelector(".action-invert-selection").onclick = invertSelection; - document.querySelector(".action-toggle-hidden").onclick = toggleHidden; - document.querySelector(".action-delete-invitation").onclick = deleteInvitation; - document.querySelector(".action-resend-invitation").onclick = resendInvitation; - document.querySelector(".action-toggle-visibility").onclick = toggleVisibility; -}); -/*! - 2024 Jason Mulligan - @version 10.1.6 -*/ diff --git a/themes/default/public/js/minified/upload.min.js b/themes/default/public/js/minified/upload.min.js deleted file mode 100644 index e4c22e5..0000000 --- a/themes/default/public/js/minified/upload.min.js +++ /dev/null @@ -1,2976 +0,0 @@ -var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x2, { - get: (a2, b2) => (typeof require !== "undefined" ? require : a2)[b2] -}) : x2)(function(x2) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x2 + '" is not supported'); -}); - -// themes/default/public/js/lib/lufi.js -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require2 = /* @__PURE__ */ ((x2) => typeof __require !== "undefined" ? __require : typeof Proxy !== "undefined" ? new Proxy(x2, { - get: (a2, b2) => (typeof __require !== "undefined" ? __require : a2)[b2] -}) : x2)(function(x2) { - if (typeof __require !== "undefined") return __require.apply(this, arguments); - throw Error('Dynamic require of "' + x2 + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require22() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter3() { - EventEmitter3.init.call(this); - } - module.exports = EventEmitter3; - module.exports.once = once; - EventEmitter3.EventEmitter = EventEmitter3; - EventEmitter3.prototype._events = void 0; - EventEmitter3.prototype._eventsCount = 0; - EventEmitter3.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter3, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter3.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter3.prototype.setMaxListeners = function setMaxListeners(n2) { - if (typeof n2 !== "number" || n2 < 0 || NumberIsNaN(n2)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n2 + "."); - } - this._maxListeners = n2; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter3.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter3.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter3.prototype.emit = function emit(type) { - var args = []; - for (var i2 = 1; i2 < arguments.length; i2++) args.push(arguments[i2]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i2 = 0; i2 < len; ++i2) - ReflectApply(listeners[i2], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m2; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m2 = _getMaxListeners(target); - if (m2 > 0 && existing.length > m2 && !existing.warned) { - existing.warned = true; - var w2 = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w2.name = "MaxListenersExceededWarning"; - w2.emitter = target; - w2.type = type; - w2.count = existing.length; - ProcessEmitWarning(w2); - } - } - return target; - } - EventEmitter3.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter3.prototype.on = EventEmitter3.prototype.addListener; - EventEmitter3.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter3.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i2, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i2 = list.length - 1; i2 >= 0; i2--) { - if (list[i2] === listener || list[i2].listener === listener) { - originalListener = list[i2].listener; - position = i2; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter3.prototype.off = EventEmitter3.prototype.removeListener; - EventEmitter3.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i2; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i2 = 0; i2 < keys.length; ++i2) { - key = keys[i2]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i2 = listeners.length - 1; i2 >= 0; i2--) { - this.removeListener(type, listeners[i2]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter3.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter3.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter3.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter3.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter3.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n2) { - var copy = new Array(n2); - for (var i2 = 0; i2 < n2; ++i2) - copy[i2] = arr[i2]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i2 = 0; i2 < ret.length; ++i2) { - ret[i2] = arr[i2].listener || arr[i2]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a2) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a2; - }, invalid: function(a2) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a2; - }, bug: function(a2) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a2; - }, notReady: function(a2) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a2; - } } }; - sjcl2.cipher.aes = function(a2) { - this.w[0][0][0] || this.C(); - var b2, c2, d2, e2, f2 = this.w[0][4], g2 = this.w[1]; - b2 = a2.length; - var h2 = 1; - if (4 !== b2 && 6 !== b2 && 8 !== b2) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d2 = a2.slice(0), e2 = []]; - for (a2 = b2; a2 < 4 * b2 + 28; a2++) { - c2 = d2[a2 - 1]; - if (0 === a2 % b2 || 8 === b2 && 4 === a2 % b2) c2 = f2[c2 >>> 24] << 24 ^ f2[c2 >> 16 & 255] << 16 ^ f2[c2 >> 8 & 255] << 8 ^ f2[c2 & 255], 0 === a2 % b2 && (c2 = c2 << 8 ^ c2 >>> 24 ^ h2 << 24, h2 = h2 << 1 ^ 283 * (h2 >> 7)); - d2[a2] = d2[a2 - b2] ^ c2; - } - for (b2 = 0; a2; b2++, a2--) c2 = d2[b2 & 3 ? a2 : a2 - 4], e2[b2] = 4 >= a2 || 4 > b2 ? c2 : g2[0][f2[c2 >>> 24]] ^ g2[1][f2[c2 >> 16 & 255]] ^ g2[2][f2[c2 >> 8 & 255]] ^ g2[3][f2[c2 & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a2) { - return aa(this, a2, 0); - }, decrypt: function(a2) { - return aa(this, a2, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a2 = this.w[0], b2 = this.w[1], c2 = a2[4], d2 = b2[4], e2, f2, g2, h2 = [], k = [], n2, l2, m2, p2; - for (e2 = 0; 256 > e2; e2++) k[(h2[e2] = e2 << 1 ^ 283 * (e2 >> 7)) ^ e2] = e2; - for (f2 = g2 = 0; !c2[f2]; f2 ^= n2 || 1, g2 = k[g2] || 1) for (m2 = g2 ^ g2 << 1 ^ g2 << 2 ^ g2 << 3 ^ g2 << 4, m2 = m2 >> 8 ^ m2 & 255 ^ 99, c2[f2] = m2, d2[m2] = f2, l2 = h2[e2 = h2[n2 = h2[f2]]], p2 = 16843009 * l2 ^ 65537 * e2 ^ 257 * n2 ^ 16843008 * f2, l2 = 257 * h2[m2] ^ 16843008 * m2, e2 = 0; 4 > e2; e2++) a2[e2][f2] = l2 = l2 << 24 ^ l2 >>> 8, b2[e2][m2] = p2 = p2 << 24 ^ p2 >>> 8; - for (e2 = 0; 5 > e2; e2++) a2[e2] = a2[e2].slice(0), b2[e2] = b2[e2].slice(0); - } }; - function aa(a2, b2, c2) { - if (4 !== b2.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d2 = a2.b[c2], e2 = b2[0] ^ d2[0], f2 = b2[c2 ? 3 : 1] ^ d2[1], g2 = b2[2] ^ d2[2]; - b2 = b2[c2 ? 1 : 3] ^ d2[3]; - var h2, k, n2, l2 = d2.length / 4 - 2, m2, p2 = 4, z = [0, 0, 0, 0]; - h2 = a2.w[c2]; - a2 = h2[0]; - var A = h2[1], C = h2[2], B2 = h2[3], D = h2[4]; - for (m2 = 0; m2 < l2; m2++) h2 = a2[e2 >>> 24] ^ A[f2 >> 16 & 255] ^ C[g2 >> 8 & 255] ^ B2[b2 & 255] ^ d2[p2], k = a2[f2 >>> 24] ^ A[g2 >> 16 & 255] ^ C[b2 >> 8 & 255] ^ B2[e2 & 255] ^ d2[p2 + 1], n2 = a2[g2 >>> 24] ^ A[b2 >> 16 & 255] ^ C[e2 >> 8 & 255] ^ B2[f2 & 255] ^ d2[p2 + 2], b2 = a2[b2 >>> 24] ^ A[e2 >> 16 & 255] ^ C[f2 >> 8 & 255] ^ B2[g2 & 255] ^ d2[p2 + 3], p2 += 4, e2 = h2, f2 = k, g2 = n2; - for (m2 = 0; 4 > m2; m2++) z[c2 ? 3 & -m2 : m2] = D[e2 >>> 24] << 24 ^ D[f2 >> 16 & 255] << 16 ^ D[g2 >> 8 & 255] << 8 ^ D[b2 & 255] ^ d2[p2++], h2 = e2, e2 = f2, f2 = g2, g2 = b2, b2 = h2; - return z; - } - sjcl2.bitArray = { bitSlice: function(a2, b2, c2) { - a2 = sjcl2.bitArray.Y(a2.slice(b2 / 32), 32 - (b2 & 31)).slice(1); - return void 0 === c2 ? a2 : sjcl2.bitArray.clamp(a2, c2 - b2); - }, extract: function(a2, b2, c2) { - var d2 = Math.floor(-b2 - c2 & 31); - return ((b2 + c2 - 1 ^ b2) & -32 ? a2[b2 / 32 | 0] << 32 - d2 ^ a2[b2 / 32 + 1 | 0] >>> d2 : a2[b2 / 32 | 0] >>> d2) & (1 << c2) - 1; - }, concat: function(a2, b2) { - if (0 === a2.length || 0 === b2.length) return a2.concat(b2); - var c2 = a2[a2.length - 1], d2 = sjcl2.bitArray.getPartial(c2); - return 32 === d2 ? a2.concat(b2) : sjcl2.bitArray.Y(b2, d2, c2 | 0, a2.slice(0, a2.length - 1)); - }, bitLength: function(a2) { - var b2 = a2.length; - return 0 === b2 ? 0 : 32 * (b2 - 1) + sjcl2.bitArray.getPartial(a2[b2 - 1]); - }, clamp: function(a2, b2) { - if (32 * a2.length < b2) return a2; - a2 = a2.slice(0, Math.ceil(b2 / 32)); - var c2 = a2.length; - b2 = b2 & 31; - 0 < c2 && b2 && (a2[c2 - 1] = sjcl2.bitArray.partial(b2, a2[c2 - 1] & 2147483648 >> b2 - 1, 1)); - return a2; - }, partial: function(a2, b2, c2) { - return 32 === a2 ? b2 : (c2 ? b2 | 0 : b2 << 32 - a2) + 1099511627776 * a2; - }, getPartial: function(a2) { - return Math.round(a2 / 1099511627776) || 32; - }, equal: function(a2, b2) { - if (sjcl2.bitArray.bitLength(a2) !== sjcl2.bitArray.bitLength(b2)) return false; - var c2 = 0, d2; - for (d2 = 0; d2 < a2.length; d2++) c2 |= a2[d2] ^ b2[d2]; - return 0 === c2; - }, Y: function(a2, b2, c2, d2) { - var e2; - e2 = 0; - for (void 0 === d2 && (d2 = []); 32 <= b2; b2 -= 32) d2.push(c2), c2 = 0; - if (0 === b2) return d2.concat(a2); - for (e2 = 0; e2 < a2.length; e2++) d2.push(c2 | a2[e2] >>> b2), c2 = a2[e2] << 32 - b2; - e2 = a2.length ? a2[a2.length - 1] : 0; - a2 = sjcl2.bitArray.getPartial(e2); - d2.push(sjcl2.bitArray.partial(b2 + a2 & 31, 32 < b2 + a2 ? c2 : d2.pop(), 1)); - return d2; - }, P: function(a2, b2) { - return [a2[0] ^ b2[0], a2[1] ^ b2[1], a2[2] ^ b2[2], a2[3] ^ b2[3]]; - }, byteswapM: function(a2) { - var b2, c2; - for (b2 = 0; b2 < a2.length; ++b2) c2 = a2[b2], a2[b2] = c2 >>> 24 | c2 >>> 8 & 65280 | (c2 & 65280) << 8 | c2 << 24; - return a2; - } }; - sjcl2.codec.utf8String = { fromBits: function(a2) { - var b2 = "", c2 = sjcl2.bitArray.bitLength(a2), d2, e2; - for (d2 = 0; d2 < c2 / 8; d2++) 0 === (d2 & 3) && (e2 = a2[d2 / 4]), b2 += String.fromCharCode(e2 >>> 8 >>> 8 >>> 8), e2 <<= 8; - return decodeURIComponent(escape(b2)); - }, toBits: function(a2) { - a2 = unescape(encodeURIComponent(a2)); - var b2 = [], c2, d2 = 0; - for (c2 = 0; c2 < a2.length; c2++) d2 = d2 << 8 | a2.charCodeAt(c2), 3 === (c2 & 3) && (b2.push(d2), d2 = 0); - c2 & 3 && b2.push(sjcl2.bitArray.partial(8 * (c2 & 3), d2)); - return b2; - } }; - sjcl2.codec.hex = { fromBits: function(a2) { - var b2 = "", c2; - for (c2 = 0; c2 < a2.length; c2++) b2 += ((a2[c2] | 0) + 263882790666240).toString(16).substr(4); - return b2.substr(0, sjcl2.bitArray.bitLength(a2) / 4); - }, toBits: function(a2) { - var b2, c2 = [], d2; - a2 = a2.replace(/\s|0x/g, ""); - d2 = a2.length; - a2 = a2 + "00000000"; - for (b2 = 0; b2 < a2.length; b2 += 8) c2.push(parseInt(a2.substr(b2, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c2, 4 * d2); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a2, b2, c2) { - var d2 = "", e2 = 0, f2 = sjcl2.codec.base64.S, g2 = 0, h2 = sjcl2.bitArray.bitLength(a2); - c2 && (f2 = f2.substr(0, 62) + "-_"); - for (c2 = 0; 6 * d2.length < h2; ) d2 += f2.charAt((g2 ^ a2[c2] >>> e2) >>> 26), 6 > e2 ? (g2 = a2[c2] << 6 - e2, e2 += 26, c2++) : (g2 <<= 6, e2 -= 6); - for (; d2.length & 3 && !b2; ) d2 += "="; - return d2; - }, toBits: function(a2, b2) { - a2 = a2.replace(/\s|=/g, ""); - var c2 = [], d2, e2 = 0, f2 = sjcl2.codec.base64.S, g2 = 0, h2; - b2 && (f2 = f2.substr(0, 62) + "-_"); - for (d2 = 0; d2 < a2.length; d2++) { - h2 = f2.indexOf(a2.charAt(d2)); - if (0 > h2) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e2 ? (e2 -= 26, c2.push(g2 ^ h2 >>> e2), g2 = h2 << 32 - e2) : (e2 += 6, g2 ^= h2 << 32 - e2); - } - e2 & 56 && c2.push(sjcl2.bitArray.partial(e2 & 56, g2, 1)); - return c2; - } }; - sjcl2.codec.base64url = { fromBits: function(a2) { - return sjcl2.codec.base64.fromBits(a2, 1, 1); - }, toBits: function(a2) { - return sjcl2.codec.base64.toBits(a2, 1); - } }; - sjcl2.hash.sha256 = function(a2) { - this.b[0] || this.C(); - a2 ? (this.g = a2.g.slice(0), this.f = a2.f.slice(0), this.c = a2.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a2) { - return new sjcl2.hash.sha256().update(a2).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a2) { - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - var b2, c2 = this.f = sjcl2.bitArray.concat(this.f, a2); - b2 = this.c; - a2 = this.c = b2 + sjcl2.bitArray.bitLength(a2); - if (9007199254740991 < a2) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d2 = new Uint32Array(c2), e2 = 0; - for (b2 = 512 + b2 - (512 + b2 & 511); b2 <= a2; b2 += 512) this.l(d2.subarray( - 16 * e2, - 16 * (e2 + 1) - )), e2 += 1; - c2.splice(0, 16 * e2); - } else for (b2 = 512 + b2 - (512 + b2 & 511); b2 <= a2; b2 += 512) this.l(c2.splice(0, 16)); - return this; - }, finalize: function() { - var a2, b2 = this.f, c2 = this.g, b2 = sjcl2.bitArray.concat(b2, [sjcl2.bitArray.partial(1, 1)]); - for (a2 = b2.length + 2; a2 & 15; a2++) b2.push(0); - b2.push(Math.floor(this.c / 4294967296)); - for (b2.push(this.c | 0); b2.length; ) this.l(b2.splice(0, 16)); - this.reset(); - return c2; - }, o: [], b: [], C: function() { - function a2(a22) { - return 4294967296 * (a22 - Math.floor(a22)) | 0; - } - for (var b2 = 0, c2 = 2, d2, e2; 64 > b2; c2++) { - e2 = true; - for (d2 = 2; d2 * d2 <= c2; d2++) if (0 === c2 % d2) { - e2 = false; - break; - } - e2 && (8 > b2 && (this.o[b2] = a2(Math.pow(c2, 0.5))), this.b[b2] = a2(Math.pow(c2, 1 / 3)), b2++); - } - }, l: function(a2) { - var b2, c2, d2, e2 = this.g, f2 = this.b, g2 = e2[0], h2 = e2[1], k = e2[2], n2 = e2[3], l2 = e2[4], m2 = e2[5], p2 = e2[6], z = e2[7]; - for (b2 = 0; 64 > b2; b2++) 16 > b2 ? c2 = a2[b2] : (c2 = a2[b2 + 1 & 15], d2 = a2[b2 + 14 & 15], c2 = a2[b2 & 15] = (c2 >>> 7 ^ c2 >>> 18 ^ c2 >>> 3 ^ c2 << 25 ^ c2 << 14) + (d2 >>> 17 ^ d2 >>> 19 ^ d2 >>> 10 ^ d2 << 15 ^ d2 << 13) + a2[b2 & 15] + a2[b2 + 9 & 15] | 0), c2 = c2 + z + (l2 >>> 6 ^ l2 >>> 11 ^ l2 >>> 25 ^ l2 << 26 ^ l2 << 21 ^ l2 << 7) + (p2 ^ l2 & (m2 ^ p2)) + f2[b2], z = p2, p2 = m2, m2 = l2, l2 = n2 + c2 | 0, n2 = k, k = h2, h2 = g2, g2 = c2 + (h2 & k ^ n2 & (h2 ^ k)) + (h2 >>> 2 ^ h2 >>> 13 ^ h2 >>> 22 ^ h2 << 30 ^ h2 << 19 ^ h2 << 10) | 0; - e2[0] = e2[0] + g2 | 0; - e2[1] = e2[1] + h2 | 0; - e2[2] = e2[2] + k | 0; - e2[3] = e2[3] + n2 | 0; - e2[4] = e2[4] + l2 | 0; - e2[5] = e2[5] + m2 | 0; - e2[6] = e2[6] + p2 | 0; - e2[7] = e2[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a2) { - this.b[0] || this.C(); - a2 ? (this.g = a2.g.slice(0), this.f = a2.f.slice(0), this.c = a2.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a2) { - return new sjcl2.hash.sha512().update(a2).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a2) { - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - var b2, c2 = this.f = sjcl2.bitArray.concat(this.f, a2); - b2 = this.c; - a2 = this.c = b2 + sjcl2.bitArray.bitLength(a2); - if (9007199254740991 < a2) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d2 = new Uint32Array(c2), e2 = 0; - for (b2 = 1024 + b2 - (1024 + b2 & 1023); b2 <= a2; b2 += 1024) this.l(d2.subarray(32 * e2, 32 * (e2 + 1))), e2 += 1; - c2.splice(0, 32 * e2); - } else for (b2 = 1024 + b2 - (1024 + b2 & 1023); b2 <= a2; b2 += 1024) this.l(c2.splice(0, 32)); - return this; - }, finalize: function() { - var a2, b2 = this.f, c2 = this.g, b2 = sjcl2.bitArray.concat(b2, [sjcl2.bitArray.partial(1, 1)]); - for (a2 = b2.length + 4; a2 & 31; a2++) b2.push(0); - b2.push(0); - b2.push(0); - b2.push(Math.floor(this.c / 4294967296)); - for (b2.push(this.c | 0); b2.length; ) this.l(b2.splice(0, 32)); - this.reset(); - return c2; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a2(a22) { - return 4294967296 * (a22 - Math.floor(a22)) | 0; - } - function b2(a22) { - return 1099511627776 * (a22 - Math.floor(a22)) & 255; - } - for (var c2 = 0, d2 = 2, e2, f2; 80 > c2; d2++) { - f2 = true; - for (e2 = 2; e2 * e2 <= d2; e2++) if (0 === d2 % e2) { - f2 = false; - break; - } - f2 && (8 > c2 && (this.o[2 * c2] = a2(Math.pow(d2, 0.5)), this.o[2 * c2 + 1] = b2(Math.pow(d2, 0.5)) << 24 | this.ia[c2]), this.b[2 * c2] = a2(Math.pow(d2, 1 / 3)), this.b[2 * c2 + 1] = b2(Math.pow(d2, 1 / 3)) << 24 | this.ka[c2], c2++); - } - }, l: function(a2) { - var b2, c2, d2 = this.g, e2 = this.b, f2 = d2[0], g2 = d2[1], h2 = d2[2], k = d2[3], n2 = d2[4], l2 = d2[5], m2 = d2[6], p2 = d2[7], z = d2[8], A = d2[9], C = d2[10], B2 = d2[11], D = d2[12], P = d2[13], ea = d2[14], Q = d2[15], t2; - if ("undefined" !== typeof Uint32Array) { - t2 = Array(160); - for (var r2 = 0; 32 > r2; r2++) t2[r2] = a2[r2]; - } else t2 = a2; - var r2 = f2, u2 = g2, G = h2, E2 = k, H = n2, F = l2, V = m2, I = p2, w2 = z, v = A, R = C, J = B2, S = D, K = P, W = ea, L = Q; - for (a2 = 0; 80 > a2; a2++) { - if (16 > a2) b2 = t2[2 * a2], c2 = t2[2 * a2 + 1]; - else { - c2 = t2[2 * (a2 - 15)]; - var q = t2[2 * (a2 - 15) + 1]; - b2 = (q << 31 | c2 >>> 1) ^ (q << 24 | c2 >>> 8) ^ c2 >>> 7; - var x2 = (c2 << 31 | q >>> 1) ^ (c2 << 24 | q >>> 8) ^ (c2 << 25 | q >>> 7); - c2 = t2[2 * (a2 - 2)]; - var y2 = t2[2 * (a2 - 2) + 1], q = (y2 << 13 | c2 >>> 19) ^ (c2 << 3 | y2 >>> 29) ^ c2 >>> 6, y2 = (c2 << 13 | y2 >>> 19) ^ (y2 << 3 | c2 >>> 29) ^ (c2 << 26 | y2 >>> 6), X = t2[2 * (a2 - 7)], Y = t2[2 * (a2 - 16)], M2 = t2[2 * (a2 - 16) + 1]; - c2 = x2 + t2[2 * (a2 - 7) + 1]; - b2 = b2 + X + (c2 >>> 0 < x2 >>> 0 ? 1 : 0); - c2 += y2; - b2 += q + (c2 >>> 0 < y2 >>> 0 ? 1 : 0); - c2 += M2; - b2 += Y + (c2 >>> 0 < M2 >>> 0 ? 1 : 0); - } - t2[2 * a2] = b2 |= 0; - t2[2 * a2 + 1] = c2 |= 0; - var X = w2 & R ^ ~w2 & S, fa = v & J ^ ~v & K, y2 = r2 & G ^ r2 & H ^ G & H, ja = u2 & E2 ^ u2 & F ^ E2 & F, Y = (u2 << 4 | r2 >>> 28) ^ (r2 << 30 | u2 >>> 2) ^ (r2 << 25 | u2 >>> 7), M2 = (r2 << 4 | u2 >>> 28) ^ (u2 << 30 | r2 >>> 2) ^ (u2 << 25 | r2 >>> 7), ka = e2[2 * a2], ga = e2[2 * a2 + 1], q = L + ((w2 << 18 | v >>> 14) ^ (w2 << 14 | v >>> 18) ^ (v << 23 | w2 >>> 9)), x2 = W + ((v << 18 | w2 >>> 14) ^ (v << 14 | w2 >>> 18) ^ (w2 << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x2 = x2 + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x2 = x2 + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c2 | 0, x2 = x2 + (b2 + (q >>> 0 < c2 >>> 0 ? 1 : 0)); - c2 = M2 + ja; - b2 = Y + y2 + (c2 >>> 0 < M2 >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w2; - J = v; - v = I + q | 0; - w2 = V + x2 + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E2; - G = r2; - E2 = u2; - u2 = q + c2 | 0; - r2 = x2 + b2 + (u2 >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g2 = d2[1] = g2 + u2 | 0; - d2[0] = f2 + r2 + (g2 >>> 0 < u2 >>> 0 ? 1 : 0) | 0; - k = d2[3] = k + E2 | 0; - d2[2] = h2 + G + (k >>> 0 < E2 >>> 0 ? 1 : 0) | 0; - l2 = d2[5] = l2 + F | 0; - d2[4] = n2 + H + (l2 >>> 0 < F >>> 0 ? 1 : 0) | 0; - p2 = d2[7] = p2 + I | 0; - d2[6] = m2 + V + (p2 >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d2[9] = A + v | 0; - d2[8] = z + w2 + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B2 = d2[11] = B2 + J | 0; - d2[10] = C + R + (B2 >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d2[13] = P + K | 0; - d2[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d2[15] = Q + L | 0; - d2[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a2) { - sjcl2.mode.ccm.F.push(a2); - }, unListenProgress: function(a2) { - a2 = sjcl2.mode.ccm.F.indexOf(a2); - -1 < a2 && sjcl2.mode.ccm.F.splice(a2, 1); - }, da: function(a2) { - var b2 = sjcl2.mode.ccm.F.slice(), c2; - for (c2 = 0; c2 < b2.length; c2 += 1) b2[c2](a2); - }, encrypt: function(a2, b2, c2, d2, e2) { - var f2, g2 = b2.slice(0), h2 = sjcl2.bitArray, k = h2.bitLength(c2) / 8, n2 = h2.bitLength(g2) / 8; - e2 = e2 || 64; - d2 = d2 || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f2 = 2; 4 > f2 && n2 >>> 8 * f2; f2++) ; - f2 < 15 - k && (f2 = 15 - k); - c2 = h2.clamp( - c2, - 8 * (15 - f2) - ); - b2 = sjcl2.mode.ccm.U(a2, b2, c2, d2, e2, f2); - g2 = sjcl2.mode.ccm.V(a2, g2, c2, b2, e2, f2); - return h2.concat(g2.data, g2.tag); - }, decrypt: function(a2, b2, c2, d2, e2) { - e2 = e2 || 64; - d2 = d2 || []; - var f2 = sjcl2.bitArray, g2 = f2.bitLength(c2) / 8, h2 = f2.bitLength(b2), k = f2.clamp(b2, h2 - e2), n2 = f2.bitSlice(b2, h2 - e2), h2 = (h2 - e2) / 8; - if (7 > g2) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b2 = 2; 4 > b2 && h2 >>> 8 * b2; b2++) ; - b2 < 15 - g2 && (b2 = 15 - g2); - c2 = f2.clamp(c2, 8 * (15 - b2)); - k = sjcl2.mode.ccm.V(a2, k, c2, n2, e2, b2); - a2 = sjcl2.mode.ccm.U(a2, k.data, c2, d2, e2, b2); - if (!f2.equal(k.tag, a2)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a2, b2, c2, d2, e2, f2) { - var g2 = [], h2 = sjcl2.bitArray, k = h2.P; - d2 = [h2.partial(8, (b2.length ? 64 : 0) | d2 - 2 << 2 | f2 - 1)]; - d2 = h2.concat(d2, c2); - d2[3] |= e2; - d2 = a2.encrypt(d2); - if (b2.length) for (c2 = h2.bitLength(b2) / 8, 65279 >= c2 ? g2 = [h2.partial(16, c2)] : 4294967295 >= c2 && (g2 = h2.concat([h2.partial(16, 65534)], [c2])), g2 = h2.concat(g2, b2), b2 = 0; b2 < g2.length; b2 += 4) d2 = a2.encrypt(k(d2, g2.slice(b2, b2 + 4).concat([0, 0, 0]))); - return d2; - }, U: function(a2, b2, c2, d2, e2, f2) { - var g2 = sjcl2.bitArray, h2 = g2.P; - e2 /= 8; - if (e2 % 2 || 4 > e2 || 16 < e2) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d2.length || 4294967295 < b2.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c2 = sjcl2.mode.ccm.ma(a2, d2, c2, e2, g2.bitLength(b2) / 8, f2); - for (d2 = 0; d2 < b2.length; d2 += 4) c2 = a2.encrypt(h2(c2, b2.slice(d2, d2 + 4).concat([0, 0, 0]))); - return g2.clamp(c2, 8 * e2); - }, V: function(a2, b2, c2, d2, e2, f2) { - var g2, h2 = sjcl2.bitArray; - g2 = h2.P; - var k = b2.length, n2 = h2.bitLength(b2), l2 = k / 50, m2 = l2; - c2 = h2.concat([h2.partial(8, f2 - 1)], c2).concat([0, 0, 0]).slice(0, 4); - d2 = h2.bitSlice(g2(d2, a2.encrypt(c2)), 0, e2); - if (!k) return { tag: d2, data: [] }; - for (g2 = 0; g2 < k; g2 += 4) g2 > l2 && (sjcl2.mode.ccm.da(g2 / k), l2 += m2), c2[3]++, e2 = a2.encrypt(c2), b2[g2] ^= e2[0], b2[g2 + 1] ^= e2[1], b2[g2 + 2] ^= e2[2], b2[g2 + 3] ^= e2[3]; - return { tag: d2, data: h2.clamp(b2, n2) }; - } }; - sjcl2.misc.hmac = function(a2, b2) { - this.W = b2 = b2 || sjcl2.hash.sha256; - var c2 = [[], []], d2, e2 = b2.prototype.blockSize / 32; - this.B = [new b2(), new b2()]; - a2.length > e2 && (a2 = b2.hash(a2)); - for (d2 = 0; d2 < e2; d2++) c2[0][d2] = a2[d2] ^ 909522486, c2[1][d2] = a2[d2] ^ 1549556828; - this.B[0].update(c2[0]); - this.B[1].update(c2[1]); - this.O = new b2(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a2) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a2); - return this.digest(a2); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a2) { - this.Z = true; - this.O.update(a2); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a2 = this.O.finalize(), a2 = new this.W(this.B[1]).update(a2).finalize(); - this.reset(); - return a2; - }; - sjcl2.misc.pbkdf2 = function(a2, b2, c2, d2, e2) { - c2 = c2 || 1e4; - if (0 > d2 || 0 > c2) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a2 && (a2 = sjcl2.codec.utf8String.toBits(a2)); - "string" === typeof b2 && (b2 = sjcl2.codec.utf8String.toBits(b2)); - e2 = e2 || sjcl2.misc.hmac; - a2 = new e2(a2); - var f2, g2, h2, k, n2 = [], l2 = sjcl2.bitArray; - for (k = 1; 32 * n2.length < (d2 || 1); k++) { - e2 = f2 = a2.encrypt(l2.concat(b2, [k])); - for (g2 = 1; g2 < c2; g2++) for (f2 = a2.encrypt(f2), h2 = 0; h2 < f2.length; h2++) e2[h2] ^= f2[h2]; - n2 = n2.concat(e2); - } - d2 && (n2 = l2.clamp(n2, d2)); - return n2; - }; - sjcl2.prng = function(a2) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a2; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a2, b2) { - var c2 = [], d2; - d2 = this.isReady(b2); - var e2; - if (d2 === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d2 & this.I) { - d2 = !(d2 & this.H); - e2 = []; - var f2 = 0, g2; - this.X = e2[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g2 = 0; 16 > g2; g2++) e2.push(4294967296 * Math.random() | 0); - for (g2 = 0; g2 < this.h.length && (e2 = e2.concat(this.h[g2].finalize()), f2 += this.s[g2], this.s[g2] = 0, d2 || !(this.N & 1 << g2)); g2++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f2; - f2 > this.u && (this.u = f2); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e2)); - this.K = new sjcl2.cipher.aes(this.b); - for (d2 = 0; 4 > d2 && (this.m[d2] = this.m[d2] + 1 | 0, !this.m[d2]); d2++) ; - } - for (d2 = 0; d2 < a2; d2 += 4) 0 === (d2 + 1) % this.aa && ba(this), e2 = N(this), c2.push(e2[0], e2[1], e2[2], e2[3]); - ba(this); - return c2.slice(0, a2); - }, - setDefaultParanoia: function(a2, b2) { - if (0 === a2 && "Setting paranoia=0 will ruin your security; use it only for testing" !== b2) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a2; - }, - addEntropy: function(a2, b2, c2) { - c2 = c2 || "user"; - var d2, e2, f2 = (/* @__PURE__ */ new Date()).valueOf(), g2 = this.G[c2], h2 = this.isReady(), k = 0; - d2 = this.T[c2]; - void 0 === d2 && (d2 = this.T[c2] = this.fa++); - void 0 === g2 && (g2 = this.G[c2] = 0); - this.G[c2] = (this.G[c2] + 1) % this.h.length; - switch (typeof a2) { - case "number": - void 0 === b2 && (b2 = 1); - this.h[g2].update([d2, this.M++, 1, b2, f2, 1, a2 | 0]); - break; - case "object": - c2 = Object.prototype.toString.call(a2); - if ("[object Uint32Array]" === c2) { - e2 = []; - for (c2 = 0; c2 < a2.length; c2++) e2.push(a2[c2]); - a2 = e2; - } else for ("[object Array]" !== c2 && (k = 1), c2 = 0; c2 < a2.length && !k; c2++) "number" !== typeof a2[c2] && (k = 1); - if (!k) { - if (void 0 === b2) for (c2 = b2 = 0; c2 < a2.length; c2++) for (e2 = a2[c2]; 0 < e2; ) b2++, e2 = e2 >>> 1; - this.h[g2].update([d2, this.M++, 2, b2, f2, a2.length].concat(a2)); - } - break; - case "string": - void 0 === b2 && (b2 = a2.length); - this.h[g2].update([d2, this.M++, 3, b2, f2, a2.length]); - this.h[g2].update(a2); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g2] += b2; - this.i += b2; - h2 === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a2) { - a2 = this.R[void 0 !== a2 ? a2 : this.L]; - return this.u && this.u >= a2 ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a2 ? this.I | this.A : this.A; - }, - getProgress: function(a2) { - a2 = this.R[a2 ? a2 : this.L]; - return this.u >= a2 ? 1 : this.i > a2 ? 1 : this.i / a2; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a2, b2) { - this.J[a2][this.ea++] = b2; - }, - removeEventListener: function(a2, b2) { - var c2, d2, e2 = this.J[a2], f2 = []; - for (d2 in e2) e2.hasOwnProperty(d2) && e2[d2] === b2 && f2.push(d2); - for (c2 = 0; c2 < f2.length; c2++) d2 = f2[c2], delete e2[d2]; - }, - ja: function() { - T(this, 1); - }, - na: function(a2) { - var b2, c2; - try { - b2 = a2.x || a2.clientX || a2.offsetX || 0, c2 = a2.y || a2.clientY || a2.offsetY || 0; - } catch (d2) { - c2 = b2 = 0; - } - 0 != b2 && 0 != c2 && this.addEntropy([b2, c2], 2, "mouse"); - T(this, 0); - }, - pa: function(a2) { - a2 = a2.touches[0] || a2.changedTouches[0]; - this.addEntropy([a2.pageX || a2.clientX, a2.pageY || a2.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a2) { - a2 = a2.accelerationIncludingGravity.x || a2.accelerationIncludingGravity.y || a2.accelerationIncludingGravity.z; - if (window.orientation) { - var b2 = window.orientation; - "number" === typeof b2 && this.addEntropy(b2, 1, "accelerometer"); - } - a2 && this.addEntropy(a2, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a2, b2) { - var c2, d2 = sjcl2.random.J[a2], e2 = []; - for (c2 in d2) d2.hasOwnProperty(c2) && e2.push(d2[c2]); - for (c2 = 0; c2 < e2.length; c2++) e2[c2](b2); - } - function T(a2, b2) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a2.addEntropy(window.performance.now(), b2, "loadtime") : a2.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b2, "loadtime"); - } - function ba(a2) { - a2.b = N(a2).concat(N(a2)); - a2.K = new sjcl2.cipher.aes(a2.b); - } - function N(a2) { - for (var b2 = 0; 4 > b2 && (a2.m[b2] = a2.m[b2] + 1 | 0, !a2.m[b2]); b2++) ; - return a2.K.encrypt(a2.m); - } - function O(a2, b2) { - return function() { - b2.apply(a2, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require2("crypto"); - } catch (a2) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a2) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a2)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a2, b2, c2, d2) { - c2 = c2 || {}; - d2 = d2 || {}; - var e2 = sjcl2.json, f2 = e2.j({ iv: sjcl2.random.randomWords(4, 0) }, e2.defaults), g2; - e2.j(f2, c2); - c2 = f2.adata; - "string" === typeof f2.salt && (f2.salt = sjcl2.codec.base64.toBits(f2.salt)); - "string" === typeof f2.iv && (f2.iv = sjcl2.codec.base64.toBits(f2.iv)); - if (!sjcl2.mode[f2.mode] || !sjcl2.cipher[f2.cipher] || "string" === typeof a2 && 100 >= f2.iter || 64 !== f2.ts && 96 !== f2.ts && 128 !== f2.ts || 128 !== f2.ks && 192 !== f2.ks && 256 !== f2.ks || 2 > f2.iv.length || 4 < f2.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a2 ? (g2 = sjcl2.misc.cachedPbkdf2(a2, f2), a2 = g2.key.slice(0, f2.ks / 32), f2.salt = g2.salt) : sjcl2.ecc && a2 instanceof sjcl2.ecc.elGamal.publicKey && (g2 = a2.kem(), f2.kemtag = g2.tag, a2 = g2.key.slice(0, f2.ks / 32)); - "string" === typeof b2 && (b2 = sjcl2.codec.utf8String.toBits(b2)); - "string" === typeof c2 && (f2.adata = c2 = sjcl2.codec.utf8String.toBits(c2)); - g2 = new sjcl2.cipher[f2.cipher](a2); - e2.j(d2, f2); - d2.key = a2; - f2.ct = "ccm" === f2.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b2 instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g2, b2, f2.iv, c2, f2.ts) : sjcl2.mode[f2.mode].encrypt(g2, b2, f2.iv, c2, f2.ts); - return f2; - }, encrypt: function(a2, b2, c2, d2) { - var e2 = sjcl2.json, f2 = e2.ha.apply(e2, arguments); - return e2.encode(f2); - }, ga: function(a2, b2, c2, d2) { - c2 = c2 || {}; - d2 = d2 || {}; - var e2 = sjcl2.json; - b2 = e2.j(e2.j(e2.j({}, e2.defaults), b2), c2, true); - var f2, g2; - f2 = b2.adata; - "string" === typeof b2.salt && (b2.salt = sjcl2.codec.base64.toBits(b2.salt)); - "string" === typeof b2.iv && (b2.iv = sjcl2.codec.base64.toBits(b2.iv)); - if (!sjcl2.mode[b2.mode] || !sjcl2.cipher[b2.cipher] || "string" === typeof a2 && 100 >= b2.iter || 64 !== b2.ts && 96 !== b2.ts && 128 !== b2.ts || 128 !== b2.ks && 192 !== b2.ks && 256 !== b2.ks || !b2.iv || 2 > b2.iv.length || 4 < b2.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a2 ? (g2 = sjcl2.misc.cachedPbkdf2(a2, b2), a2 = g2.key.slice(0, b2.ks / 32), b2.salt = g2.salt) : sjcl2.ecc && a2 instanceof sjcl2.ecc.elGamal.secretKey && (a2 = a2.unkem(sjcl2.codec.base64.toBits(b2.kemtag)).slice(0, b2.ks / 32)); - "string" === typeof f2 && (f2 = sjcl2.codec.utf8String.toBits(f2)); - g2 = new sjcl2.cipher[b2.cipher](a2); - f2 = "ccm" === b2.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b2.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g2, b2.ct, b2.iv, b2.tag, f2, b2.ts) : sjcl2.mode[b2.mode].decrypt(g2, b2.ct, b2.iv, f2, b2.ts); - e2.j(d2, b2); - d2.key = a2; - return 1 === c2.raw ? f2 : sjcl2.codec.utf8String.fromBits(f2); - }, decrypt: function(a2, b2, c2, d2) { - var e2 = sjcl2.json; - return e2.ga(a2, e2.decode(b2), c2, d2); - }, encode: function(a2) { - var b2, c2 = "{", d2 = ""; - for (b2 in a2) if (a2.hasOwnProperty(b2)) { - if (!b2.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c2 += d2 + '"' + b2 + '":'; - d2 = ","; - switch (typeof a2[b2]) { - case "number": - case "boolean": - c2 += a2[b2]; - break; - case "string": - c2 += '"' + escape(a2[b2]) + '"'; - break; - case "object": - c2 += '"' + sjcl2.codec.base64.fromBits(a2[b2], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c2 + "}"; - }, decode: function(a2) { - a2 = a2.replace(/\s/g, ""); - if (!a2.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a2 = a2.replace(/^\{|\}$/g, "").split(/,/); - var b2 = {}, c2, d2; - for (c2 = 0; c2 < a2.length; c2++) { - if (!(d2 = a2[c2].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d2[3] ? b2[d2[2]] = parseInt(d2[3], 10) : null != d2[4] ? b2[d2[2]] = d2[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d2[4]) : unescape(d2[4]) : null != d2[5] && (b2[d2[2]] = "true" === d2[5]); - } - return b2; - }, j: function(a2, b2, c2) { - void 0 === a2 && (a2 = {}); - if (void 0 === b2) return a2; - for (var d2 in b2) if (b2.hasOwnProperty(d2)) { - if (c2 && void 0 !== a2[d2] && a2[d2] !== b2[d2]) throw new sjcl2.exception.invalid("required parameter overridden"); - a2[d2] = b2[d2]; - } - return a2; - }, ra: function(a2, b2) { - var c2 = {}, d2; - for (d2 in a2) a2.hasOwnProperty(d2) && a2[d2] !== b2[d2] && (c2[d2] = a2[d2]); - return c2; - }, qa: function(a2, b2) { - var c2 = {}, d2; - for (d2 = 0; d2 < b2.length; d2++) void 0 !== a2[b2[d2]] && (c2[b2[d2]] = a2[b2[d2]]); - return c2; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a2, b2) { - var c2 = sjcl2.misc.oa, d2; - b2 = b2 || {}; - d2 = b2.iter || 1e3; - c2 = c2[a2] = c2[a2] || {}; - d2 = c2[d2] = c2[d2] || { firstSalt: b2.salt && b2.salt.length ? b2.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c2 = void 0 === b2.salt ? d2.firstSalt : b2.salt; - d2[c2] = d2[c2] || sjcl2.misc.pbkdf2(a2, c2, b2.iter); - return { key: d2[c2].slice(0), salt: c2.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); -var lufi_exports = {}; -__export(lufi_exports, { - addFilesToArchive: () => addFilesToArchive, - cancel: () => cancel, - compress: () => compress, - decompress: () => decompress, - download: () => download, - events: () => events, - getFileIndexInQueue: () => getFileIndexInQueue, - infos: () => infos, - pause: () => pause, - remove: () => remove, - resume: () => resume, - upload: () => upload -}); -var import_events2 = __toESM(require_events()); -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e2) { - reject(e2); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e2) { - reject(e2); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o2) { - var s2 = typeof Symbol === "function" && Symbol.iterator, m2 = s2 && o2[s2], i2 = 0; - if (m2) return m2.call(o2); - if (o2 && typeof o2.length === "number") return { - next: function() { - if (o2 && i2 >= o2.length) o2 = void 0; - return { value: o2 && o2[i2++], done: !o2 }; - } - }; - throw new TypeError(s2 ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g2 = generator.apply(thisArg, _arguments || []), i2, q = []; - return i2 = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i2[Symbol.asyncIterator] = function() { - return this; - }, i2; - function awaitReturn(f2) { - return function(v) { - return Promise.resolve(v).then(f2, reject); - }; - } - function verb(n2, f2) { - if (g2[n2]) { - i2[n2] = function(v) { - return new Promise(function(a2, b2) { - q.push([n2, v, a2, b2]) > 1 || resume2(n2, v); - }); - }; - if (f2) i2[n2] = f2(i2[n2]); - } - } - function resume2(n2, v) { - try { - step(g2[n2](v)); - } catch (e2) { - settle(q[0][3], e2); - } - } - function step(r2) { - r2.value instanceof __await ? Promise.resolve(r2.value.v).then(fulfill, reject) : settle(q[0][2], r2); - } - function fulfill(value) { - resume2("next", value); - } - function reject(value) { - resume2("throw", value); - } - function settle(f2, v) { - if (f2(v), q.shift(), q.length) resume2(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o2) { - var i2, p2; - return i2 = {}, verb("next"), verb("throw", function(e2) { - throw e2; - }), verb("return"), i2[Symbol.iterator] = function() { - return this; - }, i2; - function verb(n2, f2) { - i2[n2] = o2[n2] ? function(v) { - return (p2 = !p2) ? { value: __await(o2[n2](v)), done: false } : f2 ? f2(v) : v; - } : f2; - } -} -function __asyncValues(o2) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m2 = o2[Symbol.asyncIterator], i2; - return m2 ? m2.call(o2) : (o2 = typeof __values === "function" ? __values(o2) : o2[Symbol.iterator](), i2 = {}, verb("next"), verb("throw"), verb("return"), i2[Symbol.asyncIterator] = function() { - return this; - }, i2); - function verb(n2) { - i2[n2] = o2[n2] && function(v) { - return new Promise(function(resolve, reject) { - v = o2[n2](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d2, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d2 }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e2) => new Err(errorFn(e2))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f2(res.value)); - }))); - } - andThrough(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f2(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f2(res.value); - } catch (e2) { - } - return new Ok(res.value); - }))); - } - mapErr(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f2(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f2) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f2(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f2) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f2(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t2) { - return this._promise.then((res) => res.unwrapOr(t2)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e2) { - return err(errorFn ? errorFn(e2) : e2); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f2) { - return ok(f2(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f2) { - return f2(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f2) { - return f2(this.value).map((_value) => this.value); - } - andTee(f2) { - try { - f2(this.value); - } catch (e2) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f2) { - return f2(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f2) { - return f2(this.value).map(() => this.value); - } - asyncMap(f2) { - return ResultAsync.fromSafePromise(f2(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f2) { - return err(f2(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f2) { - return f2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self = this; - yield self; - return self; - } -}; -var fromThrowable = Result.fromThrowable; -var LufiFile = class _LufiFile { - constructor(serverUrl, properties) { - __publicField(this, "actionToken", ""); - __publicField(this, "chunksReady", 0); - __publicField(this, "createdAt", 0); - __publicField(this, "delay", 0); - __publicField(this, "delAtFirstView", false); - __publicField(this, "keys", { client: "", server: "" }); - __publicField(this, "name", ""); - __publicField(this, "password", ""); - __publicField(this, "queueIndex", 0); - __publicField(this, "serverUrl"); - __publicField(this, "size", 0); - __publicField( - this, - "uploadStatus", - 3 - /* INITIALIZED */ - ); - __publicField(this, "totalChunks", 0); - __publicField(this, "type", ""); - __publicField(this, "zipped", false); - this.serverUrl = serverUrl; - Object.assign(this, properties); - } - downloadUrl() { - const serverUrl = new URL(this.serverUrl); - return new URL( - `${serverUrl.origin + serverUrl.pathname}r/${this.keys.server}#${this.keys.client}` - ); - } - removeUrl() { - const serverUrl = new URL(this.serverUrl); - return new URL( - `${serverUrl.origin + serverUrl.pathname}d/${this.keys.server}/${this.actionToken}` - ); - } - static fromDownloadUrl(downloadUrl, password = "") { - const pathinfos = downloadUrl.pathname.split("r/"); - const keys = { - client: downloadUrl.hash.slice(1).split("&")[0], - server: pathinfos[1] - }; - return new _LufiFile(downloadUrl.origin + pathinfos[0], { - keys, - password - }); - } - static fromRemoveUrl(removeUrl, password = "") { - const pathInfos = removeUrl.pathname.split("d/"); - const splittedPath = pathInfos[1].split("/"); - const keys = { client: "", server: splittedPath[0] }; - return new _LufiFile(removeUrl.origin + pathInfos[0], { - keys, - password, - actionToken: splittedPath[1] - }); - } -}; -var import_events = __toESM(require_events()); -var JobStatus = /* @__PURE__ */ ((JobStatus2) => { - JobStatus2[JobStatus2["COMPLETE"] = 0] = "COMPLETE"; - JobStatus2[JobStatus2["FAILED"] = 1] = "FAILED"; - JobStatus2[JobStatus2["ONGOING"] = 2] = "ONGOING"; - JobStatus2[JobStatus2["PAUSED"] = 3] = "PAUSED"; - return JobStatus2; -})(JobStatus || {}); -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; -var ConnectionError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to connect. Is the computer able to access the url?"); - } -}; -var ServerError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "The server returned an error"); - } -}; -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; -var fetchServerConfig = (instanceUrl) => { - const originMatches = instanceUrl.href.match( - /(.*?)\/?(?:\/[dr]{1}\/|login\/?|files\/?)/ - ); - const urlOrigin = originMatches && originMatches[1] ? originMatches[1] : instanceUrl.origin; - return ResultAsync.fromPromise( - fetch(urlOrigin + "/about/config"), - (error) => new ConnectionError(void 0, { - cause: ensureError(error) - }) - ).andThen((response) => { - if (response.ok) { - return ResultAsync.fromPromise( - response.json(), - (error) => ensureError(error) - ); - } else { - return errAsync( - new ServerError(void 0, { context: response.statusText }) - ); - } - }); -}; -var isDenoRuntime = () => typeof Deno !== "undefined"; -var isSecureContext2 = () => { - return isDenoRuntime() || globalThis.isSecureContext || globalThis.location.protocol === "https:"; -}; -var workerUrl = (relativePath) => { - return isDenoRuntime() ? new URL(`./worker/${relativePath}.ts`, new URL(".", import.meta.url).href) : new URL( - import.meta.resolve( - `./${relativePath !== "encrypt" ? `worker/${relativePath}` : relativePath}.js` - ) - ); -}; -var LufiJob = class { - constructor(lufiFile, workerType) { - __publicField(this, "events", new import_events.default()); - __publicField(this, "lufiFile"); - __publicField( - this, - "status", - 2 - /* ONGOING */ - ); - __publicField(this, "archiveFile"); - __publicField(this, "archiveFiles", []); - __publicField(this, "downloadedFile"); - __publicField(this, "worker"); - __publicField(this, "isTerminated", false); - __publicField(this, "complete", () => { - this.status = 0; - this.events.emit( - "JOB_TERMINATED" - /* JOB_TERMINATED */ - ); - }); - __publicField( - this, - "hasFailed", - () => this.status === 1 - /* FAILED */ - ); - __publicField(this, "onError", (callback) => { - this.worker.onerror = (event) => { - callback(event); - }; - return this; - }); - __publicField(this, "onMessage", (callback) => { - this.worker.onmessage = (e2) => { - if (callback) { - callback(e2); - } - const event = e2.data.event; - if (event) { - if (event === "FILE_UPDATED") { - Object.assign(this.lufiFile, e2.data.lufiFile); - } else { - this.dispatchEvent(event, e2.data.error); - } - } - }; - return this; - }); - __publicField(this, "onMessageError", (callback) => { - this.worker.onmessageerror = (event) => { - callback(event); - }; - return this; - }); - __publicField(this, "onProgress", (callback) => { - this.events.on("CHUNK_UPLOADED", () => { - callback(); - }); - this.events.on("CHUNK_DOWNLOADED", () => { - callback(); - }); - return this; - }); - __publicField(this, "requestMessage", (msg, transferable = []) => { - this.worker.postMessage(msg, transferable); - return this; - }); - __publicField(this, "terminate", () => { - this.worker.terminate(); - return this; - }); - __publicField(this, "waitForCompletion", () => { - if (this.isTerminated) { - if (this.status === 0) { - return okAsync(this); - } else { - return errAsync(ensureError("Job has failed")); - } - } else { - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - this.events.once("OPERATION_FAILED", (error) => { - reject(error); - }); - this.events.once("JOB_TERMINATED", () => { - if (this.status === 0) { - resolve(this); - } - }); - }), - (error) => ensureError(error) - ); - } - }); - __publicField(this, "waitForStart", () => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - this.events.once("OPERATION_FAILED", (error) => { - reject(error); - }); - this.events.once("UPLOAD_STARTED", () => { - resolve(this); - }); - this.events.once("DOWNLOAD_STARTED", () => { - resolve(this); - }); - }), - (error) => ensureError(error) - )); - __publicField(this, "dispatchEvent", (event, error) => { - this.events.emit(event, error); - }); - switch (workerType) { - case 0: - { - this.worker = new Worker(workerUrl("cancel"), { type: "module" }); - } - break; - case 1: - { - this.worker = new Worker(workerUrl("compress"), { type: "module" }); - } - break; - case 2: - { - this.worker = new Worker(workerUrl("decompress"), { type: "module" }); - } - break; - case 3: - { - this.worker = new Worker(workerUrl("download"), { type: "module" }); - } - break; - case 4: - { - this.worker = new Worker(workerUrl("infos"), { type: "module" }); - } - break; - case 5: - { - this.worker = new Worker(workerUrl("remove"), { type: "module" }); - } - break; - case 6: - { - this.worker = new Worker(workerUrl("upload"), { type: "module" }); - } - break; - } - this.lufiFile = lufiFile; - this.events.once("JOB_TERMINATED", () => { - this.isTerminated = true; - this.terminate(); - }); - this.events.once("OPERATION_FAILED", (error) => { - this.status = 1; - this.lufiFile.uploadStatus = 2; - this.events.emit("JOB_TERMINATED", error); - }); - this.onError((event) => console.error(event.error)); - } -}; -var CryptoAlgorithm = /* @__PURE__ */ ((CryptoAlgorithm2) => { - CryptoAlgorithm2[CryptoAlgorithm2["Sjcl"] = 0] = "Sjcl"; - CryptoAlgorithm2[CryptoAlgorithm2["WebCrypto"] = 1] = "WebCrypto"; - return CryptoAlgorithm2; -})(CryptoAlgorithm || {}); -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i2 = 0; i2 < len; i2 += 3) { - res += this._charset[view[i2] >> 2] + this._charset[(view[i2] & 3) << 4 | view[i2 + 1] >> 4] + this._charset[(view[i2 + 1] & 15) << 2 | view[i2 + 2] >> 6] + this._charset[view[i2 + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i2 = 0, j = 0; - while (i2 < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i2++] = enc1 << 2 | enc2 >> 4; - view[i2++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i2++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Encode(ab) { - return obj2.Encode(ab); -} -var import_lufi_sjcl = __toESM(require_sjcl()); -var CryptoError = class extends BaseError { -}; -var HashingError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to hash the provided string"); - } -}; -var generateKey = () => { - try { - return okAsync(import_lufi_sjcl.default.codec.base64.fromBits(import_lufi_sjcl.default.random.randomWords(8, 10))); - } catch (error) { - return errAsync( - new CryptoError("Unable to generate key", { - cause: ensureError(error) - }) - ); - } -}; -var hashPassword = (password) => { - try { - return okAsync(import_lufi_sjcl.default.codec.hex.fromBits(import_lufi_sjcl.default.hash.sha512.hash(password))); - } catch (error) { - return errAsync(new HashingError(void 0, { cause: ensureError(error) })); - } -}; -var generateKey2 = () => { - return ResultAsync.fromPromise( - new Promise( - (resolve, reject) => crypto.subtle.generateKey( - { - name: "AES-GCM", - length: 256 - }, - true, - ["encrypt", "decrypt"] - ).then( - (generatedKey) => crypto.subtle.exportKey("raw", generatedKey).then((key) => resolve(Encode(key))).catch((error) => { - reject( - new CryptoError("Unable to base64 encode the url", { - cause: ensureError(error) - }) - ); - }) - ).catch((error) => reject(error)) - ), - (error) => new CryptoError("Unable to generate key", { cause: ensureError(error) }) - ); -}; -var hashPassword2 = (password) => { - const promise = async () => { - return Array.from( - new Uint8Array( - await crypto.subtle.digest( - "SHA-512", - new TextEncoder().encode(password) - ) - ) - ).map((b2) => b2.toString(16).padStart(2, "0")).join(""); - }; - return ResultAsync.fromPromise( - promise(), - (error) => new HashingError(void 0, { cause: ensureError(error) }) - ); -}; -var generateKey3 = (algo = 1) => algo === 0 ? generateKey() : generateKey2(); -var hashPassword3 = (password, algo) => algo === 0 ? hashPassword(password) : hashPassword2(password); -var DownloadError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while downloading the data"); - } -}; -var InfosError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to retrieve server informations"); - } -}; -var JobError = class extends BaseError { -}; -var JobPauseError = class extends JobError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to pause the job"); - } -}; -var JobResumeError = class extends JobError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to resume the job"); - } -}; -var UploadError = class extends BaseError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while uploading the data"); - } -}; -var CHUNK_LENGTH = 15e5; -var files = {}; -var events = new import_events2.default(); -var cancel = (uploadJob) => { - uploadJob.terminate(); - const job = new LufiJob( - uploadJob.lufiFile, - 0 - /* CANCEL */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "UPLOAD_CANCELLED") { - files[job.lufiFile.keys.client].uploadStatus = 0; - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError( - "An error occured while trying to cancel an upload", - { cause: event.data.error } - ) - ); - } - }).requestMessage({ - args: { - lufiFile: job.lufiFile - } - }); - }), - (error) => ensureError(error) - ); -}; -var addFilesToArchive = (files2, archiveEntries = {}) => { - const asyncLoop = async (files3) => { - var _a; - for (const file of files3) { - const nameWithExtension = ((_a = file.name.split("/")) == null ? void 0 : _a.pop()) || file.name; - const nameWithoutExtension = nameWithExtension.split(".").shift(); - const extension = nameWithExtension.split(".").length > 1 ? `.${nameWithExtension.split(".").pop()}` : ""; - let name = nameWithExtension; - if (archiveEntries[name] !== void 0) { - let i2 = 1; - do { - name = `${nameWithoutExtension}(${i2})${extension}`; - i2++; - } while (archiveEntries[name] !== void 0); - } - events.emit("ARCHIVE_ADDED_FILE", { name, size: file.size }); - archiveEntries[name] = await file.bytes(); - } - }; - return ResultAsync.fromPromise( - asyncLoop(files2), - (error) => ensureError(error) - ).andThen(() => okAsync(archiveEntries)); -}; -var compress = (archiveEntries, archiveName) => { - const lufiFile = new LufiFile(""); - const job = new LufiJob( - lufiFile, - 1 - /* COMPRESS */ - ); - return okAsync( - job.onMessage((event) => { - if (event.data.event === "ARCHIVE_CREATED") { - job.archiveFile = new File([event.data.buffer], archiveName, { - type: "application/zip" - }); - job.complete(); - } - }).requestMessage({ - args: { - lufiFile, - archive: { entries: archiveEntries } - } - }) - ); -}; -var decompress = (zipFile) => { - const lufiFile = new LufiFile(""); - const job = new LufiJob( - lufiFile, - 2 - /* DECOMPRESS */ - ); - return okAsync( - job.onMessage((event) => { - if (event.data.event === "ARCHIVE_DECOMPRESSED") { - job.complete(); - } - if (event.data.event === "ARCHIVE_RETRIEVED_FILE") { - job.archiveFiles.push( - new File([event.data.file.buffer], event.data.file.path) - ); - } - }).requestMessage({ - args: { - lufiFile, - archive: { file: zipFile } - } - }) - ); -}; -var handlePasswordHashing = (downloadUrl, password) => { - if (password) { - return fetchServerConfig(downloadUrl).andThen((config) => { - if (config.version.tag > "0.07.0") { - const algo = isSecureContext2() ? 1 : 0; - return hashPassword3(password, algo).andThen( - (hashedPassword) => okAsync(LufiFile.fromDownloadUrl(downloadUrl, hashedPassword)) - ); - } else { - return okAsync(LufiFile.fromDownloadUrl(downloadUrl, password)); - } - }); - } else { - return okAsync(LufiFile.fromDownloadUrl(downloadUrl)); - } -}; -var download = (downloadUrl, password) => handlePasswordHashing(downloadUrl, password).andThen( - (lufiFile) => { - const job = new LufiJob( - lufiFile, - 3 - /* DOWNLOAD */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - const chunks = []; - return job.onMessage((event) => { - handleSocketResults(resolve, reject, job, event); - if (event.data.event === "CHUNK_DOWNLOADED") { - chunks.push(event.data.chunk.buffer); - if (chunks.length >= 50) { - job.downloadedFile = new File( - job.downloadedFile ? [job.downloadedFile.slice()].concat(chunks) : chunks, - lufiFile.name, - { - type: lufiFile.type - } - ); - chunks.length = 0; - } - } - if (event.data.event === "DOWNLOAD_COMPLETE") { - job.downloadedFile = new File( - job.downloadedFile ? [job.downloadedFile.slice()].concat(chunks) : chunks, - lufiFile.name, - { - type: lufiFile.type - } - ); - chunks.length = 0; - job.complete(); - } - }).requestMessage({ - args: { - lufiFile - } - }); - }), - (error) => new DownloadError(void 0, { cause: ensureError(error) }) - ); - } -); -var infos = (downloadUrl, password) => handlePasswordHashing(downloadUrl, password).andThen( - (lufiFile) => okAsync(new LufiJob( - lufiFile, - 4 - /* INFOS */ - )) -).andThen( - (job) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "INFOS_RETRIEVED") { - job.complete(); - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError( - "An error occured while trying to retrieve informations of the file", - { cause: event.data.error } - ) - ); - } - }).requestMessage({ - args: { lufiFile: job.lufiFile } - }); - }), - (error) => new InfosError(void 0, { cause: ensureError(error) }) - ) -); -var pause = (job) => { - try { - job.status = 3; - return okAsync( - job.requestMessage({ - action: 0, - args: { lufiFile: job.lufiFile } - }) - ); - } catch (error) { - return errAsync( - new JobPauseError(void 0, { cause: ensureError(error) }) - ); - } -}; -var remove = (removeUrl, password) => { - const lufiFile = LufiFile.fromRemoveUrl(removeUrl, password); - const job = new LufiJob( - lufiFile, - 5 - /* REMOVE */ - ); - return ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - if (event.data.event === "FILE_REMOVED") { - job.complete(); - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError("An error occured while trying to remove a file", { - cause: event.data.error - }) - ); - } - }).requestMessage({ args: { lufiFile } }); - }), - (error) => ensureError(error) - ); -}; -var resume = (job) => { - try { - job.status = 2; - return okAsync( - job.requestMessage({ - action: 2, - args: { lufiFile: job.lufiFile } - }) - ); - } catch (error) { - return errAsync( - new JobResumeError(void 0, { cause: ensureError(error) }) - ); - } -}; -var sliceAndUpload = (job, file, algo, chunkLength = CHUNK_LENGTH) => { - events.emit("SLICE_STARTED", files[job.lufiFile.keys.client]); - const totalChunks = Math.ceil(file.size / chunkLength) || 1; - const concurrency = navigator.hardwareConcurrency || 1; - files[job.lufiFile.keys.client].totalChunks = totalChunks; - const sequentialLoop = async () => { - for (let i2 = 0; i2 < totalChunks; i2++) { - const start = i2 * chunkLength; - const end = Math.min(start + chunkLength, file.size); - const buffer = await file.slice(start, end, file.type).arrayBuffer(); - job.requestMessage( - { - args: { - chunk: { - buffer, - index: i2 - }, - lufiFile: files[job.lufiFile.keys.client], - algo - } - }, - [buffer] - ); - if (i2 === 0) { - const waitUntilUploadStarted = () => new Promise((resolve) => { - job.events.once("UPLOAD_STARTED", () => { - resolve(void 0); - }); - }); - await waitUntilUploadStarted(); - } else if (i2 % concurrency === 0) { - const waitForQueueAvailability = () => new Promise((resolve) => { - job.events.once("CHUNK_UPLOADED", () => { - resolve(void 0); - }); - }); - await waitForQueueAvailability(); - } - } - }; - sequentialLoop(); - return okAsync(void 0); -}; -var startUpload = (serverUrl, file, delay, delAtFirstView, zipped, password, algo) => generateKey3( - algo -).andThen( - (clientKey) => { - if (password) { - return hashPassword3(password, algo).andThen( - (hashedPassword) => okAsync({ password: hashedPassword, clientKey }) - ); - } else { - return okAsync({ password, clientKey }); - } - } -).andThen(({ password: password2, clientKey }) => { - files[clientKey] = new LufiFile(serverUrl.toString(), { - delay, - delAtFirstView, - zipped, - password: password2, - name: file.name.split("/").pop(), - // Remove path from filename - size: file.size, - type: file.type, - keys: { client: clientKey, server: "" } - }); - const job = new LufiJob( - files[clientKey], - 6 - /* UPLOAD */ - ); - files[clientKey].uploadStatus = 4; - return sliceAndUpload(job, file, algo).andThen( - () => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - job.onMessage((event) => { - handleSocketResults(resolve, reject, job, event); - switch (event.data.event) { - case "UPLOAD_COMPLETE": - { - job.complete(); - job.lufiFile.uploadStatus = 1; - } - break; - } - }); - }), - (error) => ensureError(error) - ) - ); -}); -var upload = (serverUrl, filesToUpload, delay = 0, delAtFirstView = false, zipped = false, zipName = "documents.zip", password = "", algo = 1) => { - const operations = []; - if (!zipped) { - filesToUpload.forEach((file) => { - operations.push(startUpload( - serverUrl, - file, - delay, - delAtFirstView, - zipped, - password, - algo - )); - }); - } else { - if (filesToUpload.length === 1 && filesToUpload[0].type === "application/zip") { - operations.push( - startUpload( - serverUrl, - filesToUpload[0], - delay, - delAtFirstView, - zipped, - password, - algo - ) - ); - } else { - operations.push( - addFilesToArchive(filesToUpload).andThen( - (archiveEntries) => compress( - archiveEntries, - zipName - ).andThen((job) => job.waitForCompletion()).andThen((job) => { - if (job.archiveFile) { - return startUpload( - serverUrl, - job.archiveFile, - delay, - delAtFirstView, - true, - password, - algo - ); - } else { - return errAsync(new JobError("archiveFile must be defined")); - } - }) - ) - ); - } - } - return ResultAsync.combine(operations).orElse( - (error) => errAsync(new UploadError(void 0, { cause: error })) - ); -}; -var handleSocketResults = (resolve, reject, job, event) => { - if (event.data.event === "SOCKET_OPENED") { - resolve(job); - } - if (event.data.event === "OPERATION_FAILED") { - reject( - new JobError("The job returned an error", { cause: event.data.error }) - ); - } -}; -var getFilesQueued = () => Object.values(files).filter( - (file) => file.uploadStatus === 4 - /* QUEUED */ -); -var getFileIndexInQueue = (clientKey) => Object.keys(getFilesQueued()).indexOf(clientKey); - -// themes/default/public/js/lib/utils.js -var copyToClipboard = async (text) => { - try { - if (navigator.clipboard) { - await navigator.clipboard.writeText(text); - } else { - const textArea = document.createElement("textarea"); - textArea.value = text; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand("copy"); - document.body.removeChild(textArea); - } - } catch (error) { - alert(error); - } -}; -var formatDate = (unixTimestamp) => new Date(unixTimestamp * 1e3).toLocaleString(window.navigator.language, { - year: "numeric", - month: "long", - day: "numeric", - weekday: "long", - hour: "2-digit", - minute: "2-digit" -}); -var notify = (title, body) => { - if (isSecureContext) { - if (!("Notification" in window) || typeof Notification === "undefined") { - console.log( - `This browser does not support desktop notification, cannot send following message: ${title} ${body}` - ); - return; - } - if (Notification.permission !== "granted") { - Notification.requestPermission(); - } else { - new Notification(title, { - body, - icon: "/img/lufi.svg" - }); - } - } -}; -var uuidv4 = () => "10000000-1000-4000-8000-100000000000".replace( - /[018]/g, - (c2) => (+c2 ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c2 / 4).toString(16) -); - -// themes/default/public/js/lib/filesize.esm.min.js -var t = "array"; -var i = "bit"; -var o = "bits"; -var e = "byte"; -var n = "bytes"; -var r = ""; -var a = "exponent"; -var b = "function"; -var s = "iec"; -var l = "Invalid number"; -var p = "Invalid rounding method"; -var u = "jedec"; -var c = "object"; -var d = "."; -var f = "round"; -var g = "s"; -var m = "si"; -var B = "kbit"; -var y = "kB"; -var h = " "; -var M = "string"; -var x = "0"; -var w = { symbol: { iec: { bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, jedec: { bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] } }, fullform: { iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] } }; -function E(E2, { bits: T = false, pad: j = false, base: N = -1, round: P = 2, locale: S = r, localeOptions: k = {}, separator: G = r, spacer: K = h, symbols: Y = {}, standard: Z = r, output: v = M, fullform: O = false, fullforms: $ = [], exponent: z = -1, roundingMethod: I = f, precision: L = 0 } = {}) { - let D = z, q = Number(E2), A = [], C = 0, F = r; - Z === m ? (N = 10, Z = u) : Z === s || Z === u ? N = 2 : 2 === N ? Z = s : (N = 10, Z = u); - const H = 10 === N ? 1e3 : 1024, J = true === O, Q = q < 0, R = Math[I]; - if ("bigint" != typeof E2 && isNaN(E2)) throw new TypeError(l); - if (typeof R !== b) throw new TypeError(p); - if (Q && (q = -q), (-1 === D || isNaN(D)) && (D = Math.floor(Math.log(q) / Math.log(H)), D < 0 && (D = 0)), D > 8 && (L > 0 && (L += 8 - D), D = 8), v === a) return D; - if (0 === q) A[0] = 0, F = A[1] = w.symbol[Z][T ? o : n][D]; - else { - C = q / (2 === N ? Math.pow(2, 10 * D) : Math.pow(1e3, D)), T && (C *= 8, C >= H && D < 8 && (C /= H, D++)); - const t2 = Math.pow(10, D > 0 ? P : 0); - A[0] = R(C * t2) / t2, A[0] === H && D < 8 && -1 === z && (A[0] = 1, D++), F = A[1] = 10 === N && 1 === D ? T ? B : y : w.symbol[Z][T ? o : n][D]; - } - if (Q && (A[0] = -A[0]), L > 0 && (A[0] = A[0].toPrecision(L)), A[1] = Y[A[1]] || A[1], true === S ? A[0] = A[0].toLocaleString() : S.length > 0 ? A[0] = A[0].toLocaleString(S, k) : G.length > 0 && (A[0] = A[0].toString().replace(d, G)), j && P > 0) { - const t2 = A[0].toString(), i2 = G || (t2.match(/(\D)/g) || []).pop() || d, o2 = t2.toString().split(i2), e2 = o2[1] || r, n2 = e2.length, a2 = P - n2; - A[0] = `${o2[0]}${i2}${e2.padEnd(n2 + a2, x)}`; - } - return J && (A[1] = $[D] ? $[D] : w.fullform[Z][D] + (T ? i : e) + (1 === A[0] ? r : g)), v === t ? A : v === c ? { value: A[0], symbol: A[1], exponent: D, unit: F } : A.join(K); -} - -// themes/default/public/js/upload.js -document.addEventListener("DOMContentLoaded", () => { - const initCard = (cardType, cardId = null) => { - const card = document.querySelector(`template#card-file-${cardType}`).content.cloneNode(true).children[0]; - if (cardId) { - card.classList.add(`card-${encodeURIComponent(cardId)}`); - } - card.querySelector("button .delete").parentNode.addEventListener("keydown", (event) => { - if (event.key === " " || event.key === "enter") { - event.target.click(); - } - }); - card.querySelector("button .delete").parentNode.addEventListener("click", () => { - card.remove(); - }); - return card; - }; - const showErrorCard = (error, cardId, lufiFile = null) => { - const errorCard = initCard("error", cardId); - if (lufiFile) { - errorCard.querySelector(".name").innerText = lufiFile.name; - errorCard.querySelector(".size").innerText = E(lufiFile.size); - } - const actualCard = document.querySelector(`.card-${cardId}`); - if (actualCard.classList.contains("card-file-error")) { - errorCard.querySelector( - ".message-body" - ).innerText += ` -${error.message}`; - } else { - errorCard.querySelector(".message-body").innerText = error.message; - document.getElementById("uploaded-files").replaceChild(errorCard, document.querySelector(`.card-${cardId}`)); - } - }; - const addItem = (name, url, size, del_at_first_view, created_at, delay, serverKey, actionToken) => { - const files2 = JSON.parse(localStorage.getItem(`${prefix}files`)) || []; - console.debug(serverKey); - files2.push({ - name, - short: serverKey, - url, - size, - del_at_first_view, - created_at, - delay, - token: actionToken - }); - localStorage.setItem(`${prefix}files`, JSON.stringify(files2)); - }; - const sendFilesURLs = () => { - if (filesURLs.length > 0) { - fetch(sendFilesURLsURL, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - urls: filesURLs - }) - }).then((response) => response.json()).then((data) => { - if (data.success) { - notify(data.msg, "success"); - } else { - notify(data.msg, "danger"); - } - }).catch((error) => { - console.error("Error:", error); - }); - } - }; - const startUpload2 = (files2, delay, delAtFirstView, isZipped, zipName, password) => { - const uploadFilesDOM = document.getElementById("uploaded-files"); - const serverUrl = new URL(ws_url.replace("/upload", "")); - serverUrl.protocol = serverUrl.protocol === "ws:" ? "http:" : "https:"; - const cardId = isSecureContext ? crypto.randomUUID() : uuidv4(); - const uploadingFileCard = initCard("uploading", cardId); - uploadingFileCard.querySelector(".name").innerText = zipName; - uploadingFileCard.querySelector(".size").innerText = i18n.unknownYet; - uploadingFileCard.querySelector(".info").innerText = i18n.compressing; - uploadFilesDOM.prepend(uploadingFileCard); - const runUpload = (job = null) => { - if (!job || job.status === JobStatus.COMPLETE) { - return lufi_exports.upload( - serverUrl.href, - files2, - delay, - delAtFirstView, - isZipped, - zipName, - password, - isSecureContext ? CryptoAlgorithm.WebCrypto : CryptoAlgorithm.Sjcl - ).andThen( - (jobs) => ResultAsync.combine( - jobs.map((job2) => { - uploadingFileCard.querySelector(".name").innerText = job2.lufiFile.name; - uploadingFileCard.querySelector(".size").innerText = E( - job2.lufiFile.size - ); - uploadingFileCard.querySelector(".info").innerText = i18n.uploading; - uploadingFileCard.querySelector("button .delete").parentNode.addEventListener("click", () => { - lufi_exports.cancel(job2); - }); - job2.onProgress(() => { - updateProgressBar(job2.lufiFile, uploadingFileCard); - }); - return job2.waitForCompletion().andThen((job3) => { - notify(i18n.fileUploaded, job3.lufiFile.name); - const uploadedFileCard = initCard("uploaded", cardId); - const expirationDate = job3.lufiFile.delay === 0 ? i18n.noLimit : `${i18n.expiration} ${formatDate( - job3.lufiFile.delay * 86400 + job3.lufiFile.createdAt - )}`; - if (job3.lufiFile.type === "application/zip") { - uploadedFileCard.querySelector(".content .icon").classList.replace("fa-file", "fa-file-zipper"); - } - uploadedFileCard.querySelector(".name").innerText = job3.lufiFile.name; - uploadedFileCard.querySelector(".size").innerText = E(job3.lufiFile.size); - uploadedFileCard.querySelector(".expiration").innerText = expirationDate; - uploadedFileCard.querySelector(".action-download").href = job3.lufiFile.downloadUrl(); - uploadedFileCard.querySelector(".action-delete").href = job3.lufiFile.removeUrl(); - uploadedFileCard.querySelector(".action-share").href = `${job3.lufiFile.serverUrl}m?links=${encodeURIComponent( - '["' + job3.lufiFile.keys.server + '"]' - )}`; - uploadedFileCard.querySelector(".action-copy").addEventListener("click", async () => { - await copyToClipboard(job3.lufiFile.downloadUrl()); - uploadedFileCard.querySelector( - ".action-copy .text" - ).innerText = i18n.copied; - setTimeout(() => { - uploadedFileCard.querySelector( - ".action-copy .text" - ).innerText = i18n.copyLink; - }, 1e3); - }); - uploadFilesDOM.replaceChild( - uploadedFileCard, - uploadingFileCard - ); - if (!isGuest) { - addItem( - job3.lufiFile.name, - job3.lufiFile.downloadUrl(), - job3.lufiFile.size, - delAtFirstView, - job3.lufiFile.createdAt, - delay, - job3.lufiFile.keys.server, - job3.lufiFile.actionToken - ); - } - if (isGuest && job3.lufiFile.keys.server !== null) { - filesURLs.push( - JSON.stringify({ - name: job3.lufiFile.name, - short: job3.lufiFile.keys.server, - url: job3.lufiFile.downloadUrl(), - size: job3.lufiFile.size, - created_at: job3.lufiFile.createdAt, - delay, - token: job3.lufiFile.actionToken - }) - ); - sendFilesURLs(); - } - return okAsync(job3); - }).orElse((error) => { - showErrorCard(error, cardId, job2.lufiFile); - return errAsync(error); - }); - }) - ) - ).orElse((error) => { - showErrorCard(error, cardId); - return errAsync(error); - }); - } else { - return okAsync(void 0); - } - }; - if (isZipped) { - return lufi_exports.addFilesToArchive(files2).andThen((archiveEntries) => lufi_exports.compress(archiveEntries, zipName)).andThen((job) => { - if (uploadingFileCard.querySelector(".name")) { - uploadingFileCard.querySelector("button .delete").parentNode.addEventListener("click", () => { - job.terminate(); - }); - } else { - job.terminate(); - } - return job.waitForCompletion(); - }).andThen(runUpload).mapErr((error) => { - showErrorCard(error, cardId); - }); - } else { - return runUpload(); - } - }; - const updateProgressBar = (lufiFile, cardDOM) => { - const percent = Math.round( - lufiFile.chunksReady * 100 / lufiFile.totalChunks - ); - cardDOM.querySelector(".progress").value = percent; - cardDOM.querySelector(".progress").innerText = percent; - cardDOM.querySelector(".progress-text").innerText = percent + "%"; - }; - const fileInput = document.querySelector("#file-js-upload input[type=file]"); - let providedFiles = []; - let totalSize = 0; - fileInput.onchange = () => { - const providedFilesDOM = document.getElementById("provided-files"); - Array.from(fileInput.files).forEach((file) => { - if (!providedFiles.find((f2) => file.name === f2.name)) { - providedFiles.push(file); - const fileCard = initCard("to-upload"); - fileCard.querySelector(".name").innerText = file.name; - fileCard.querySelector(".size").innerText = E(file.size); - fileCard.querySelector("button .delete").parentNode.addEventListener("click", () => { - providedFiles = providedFiles.filter((f2) => file.name !== f2.name); - totalSize -= file.size; - document.querySelector(".total-size .size").innerText = E(totalSize); - if (providedFiles.length === 0) { - document.getElementById("upload-controls").classList.add("is-hidden"); - providedFilesDOM.classList.add("is-hidden"); - document.querySelector("#file-js-upload .small-version").classList.add("is-hidden"); - document.querySelector("#file-js-upload .full-version").classList.remove("is-hidden"); - showFullUploadZone(); - } - }); - providedFilesDOM.append(fileCard); - totalSize += file.size; - } - document.querySelector(".total-size .size").innerText = E(totalSize); - showSmallUploadZone(); - }); - }; - document.getElementById("zip-multiple").onchange = () => { - document.getElementById("zip-name").classList.toggle("is-invisible"); - }; - document.getElementById("use-password").onchange = () => { - document.getElementById("password-control").classList.toggle("is-invisible"); - }; - document.getElementById("password-preview-button").onclick = (event) => { - if (event.target.classList.contains("fa-eye")) { - event.target.classList.replace("fa-eye", "fa-eye-slash"); - document.querySelector("#password-control input").type = "text"; - } else { - event.target.classList.replace("fa-eye-slash", "fa-eye"); - document.querySelector("#password-control input").type = "password"; - } - }; - document.getElementById("upload-zone-button").onclick = () => fileInput.click(); - document.getElementById("submit-button").onclick = () => { - const delay = document.getElementById("expiration-delay").value; - const deleteAfterDownload = document.getElementById( - "delete-at-first-download" - ).checked; - const password = document.getElementById("use-password").checked ? document.getElementById("password-input").value : ""; - const zipMultiple = document.getElementById("zip-multiple").checked; - const zipName = document.getElementById("zip-name").value; - const mustZip = providedFiles.length > 1 ? zipMultiple : false; - startUpload2( - providedFiles, - delay, - deleteAfterDownload, - mustZip, - zipName, - password - ); - fileInput.value = null; - providedFiles = []; - document.getElementById("provided-files").replaceChildren(); - showFullUploadZone(); - }; - if (maxSize) { - const maxSizeDOM = document.createElement("span"); - maxSizeDOM.innerText = i18n.maxSize.replace("XXX", E(maxSize)); - maxSizeDOM.classList.add("is-size-5"); - document.querySelector("#upload-box .file-cta .file-label").append(maxSizeDOM); - } -}); -var showSmallUploadZone = () => { - document.getElementById("provided-files").classList.remove("is-hidden"); - document.getElementById("upload-controls").classList.remove("is-hidden"); - document.querySelector("#file-js-upload .total-size").classList.remove("is-hidden"); - document.querySelector("#file-js-upload .small-version").classList.remove("is-hidden"); - document.querySelector("#file-js-upload .full-version").classList.add("is-hidden"); -}; -var showFullUploadZone = () => { - document.querySelector("#provided-files").classList.add("is-hidden"); - document.getElementById("upload-controls").classList.add("is-hidden"); - document.querySelector("#file-js-upload .total-size").classList.add("is-hidden"); - document.querySelector("#file-js-upload .small-version").classList.add("is-hidden"); - document.querySelector("#file-js-upload .full-version").classList.remove("is-hidden"); -}; -/*! - 2024 Jason Mulligan - @version 10.1.6 -*/ diff --git a/themes/default/public/js/minified/worker/archive.js b/themes/default/public/js/minified/worker/archive.js deleted file mode 100644 index e69de29..0000000 diff --git a/themes/default/public/js/minified/worker/cancel.js b/themes/default/public/js/minified/worker/cancel.js deleted file mode 100644 index 49f3a49..0000000 --- a/themes/default/public/js/minified/worker/cancel.js +++ /dev/null @@ -1,2133 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter2() { - EventEmitter2.init.call(this); - } - module.exports = EventEmitter2; - module.exports.once = once; - EventEmitter2.EventEmitter = EventEmitter2; - EventEmitter2.prototype._events = void 0; - EventEmitter2.prototype._eventsCount = 0; - EventEmitter2.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter2, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter2.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter2.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter2.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter2.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; - EventEmitter2.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter2.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; - EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter2.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter2.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter2.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter2.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter2.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a; - }, invalid: function(a) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a; - }, bug: function(a) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a; - }, notReady: function(a) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a; - } } }; - sjcl2.cipher.aes = function(a) { - this.w[0][0][0] || this.C(); - var b, c, d, e, f = this.w[0][4], g = this.w[1]; - b = a.length; - var h = 1; - if (4 !== b && 6 !== b && 8 !== b) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d = a.slice(0), e = []]; - for (a = b; a < 4 * b + 28; a++) { - c = d[a - 1]; - if (0 === a % b || 8 === b && 4 === a % b) c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255], 0 === a % b && (c = c << 8 ^ c >>> 24 ^ h << 24, h = h << 1 ^ 283 * (h >> 7)); - d[a] = d[a - b] ^ c; - } - for (b = 0; a; b++, a--) c = d[b & 3 ? a : a - 4], e[b] = 4 >= a || 4 > b ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a) { - return aa(this, a, 0); - }, decrypt: function(a) { - return aa(this, a, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a = this.w[0], b = this.w[1], c = a[4], d = b[4], e, f, g, h = [], k = [], n, l, m, p; - for (e = 0; 256 > e; e++) k[(h[e] = e << 1 ^ 283 * (e >> 7)) ^ e] = e; - for (f = g = 0; !c[f]; f ^= n || 1, g = k[g] || 1) for (m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, m = m >> 8 ^ m & 255 ^ 99, c[f] = m, d[m] = f, l = h[e = h[n = h[f]]], p = 16843009 * l ^ 65537 * e ^ 257 * n ^ 16843008 * f, l = 257 * h[m] ^ 16843008 * m, e = 0; 4 > e; e++) a[e][f] = l = l << 24 ^ l >>> 8, b[e][m] = p = p << 24 ^ p >>> 8; - for (e = 0; 5 > e; e++) a[e] = a[e].slice(0), b[e] = b[e].slice(0); - } }; - function aa(a, b, c) { - if (4 !== b.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d = a.b[c], e = b[0] ^ d[0], f = b[c ? 3 : 1] ^ d[1], g = b[2] ^ d[2]; - b = b[c ? 1 : 3] ^ d[3]; - var h, k, n, l = d.length / 4 - 2, m, p = 4, z = [0, 0, 0, 0]; - h = a.w[c]; - a = h[0]; - var A = h[1], C = h[2], B = h[3], D = h[4]; - for (m = 0; m < l; m++) h = a[e >>> 24] ^ A[f >> 16 & 255] ^ C[g >> 8 & 255] ^ B[b & 255] ^ d[p], k = a[f >>> 24] ^ A[g >> 16 & 255] ^ C[b >> 8 & 255] ^ B[e & 255] ^ d[p + 1], n = a[g >>> 24] ^ A[b >> 16 & 255] ^ C[e >> 8 & 255] ^ B[f & 255] ^ d[p + 2], b = a[b >>> 24] ^ A[e >> 16 & 255] ^ C[f >> 8 & 255] ^ B[g & 255] ^ d[p + 3], p += 4, e = h, f = k, g = n; - for (m = 0; 4 > m; m++) z[c ? 3 & -m : m] = D[e >>> 24] << 24 ^ D[f >> 16 & 255] << 16 ^ D[g >> 8 & 255] << 8 ^ D[b & 255] ^ d[p++], h = e, e = f, f = g, g = b, b = h; - return z; - } - sjcl2.bitArray = { bitSlice: function(a, b, c) { - a = sjcl2.bitArray.Y(a.slice(b / 32), 32 - (b & 31)).slice(1); - return void 0 === c ? a : sjcl2.bitArray.clamp(a, c - b); - }, extract: function(a, b, c) { - var d = Math.floor(-b - c & 31); - return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; - }, concat: function(a, b) { - if (0 === a.length || 0 === b.length) return a.concat(b); - var c = a[a.length - 1], d = sjcl2.bitArray.getPartial(c); - return 32 === d ? a.concat(b) : sjcl2.bitArray.Y(b, d, c | 0, a.slice(0, a.length - 1)); - }, bitLength: function(a) { - var b = a.length; - return 0 === b ? 0 : 32 * (b - 1) + sjcl2.bitArray.getPartial(a[b - 1]); - }, clamp: function(a, b) { - if (32 * a.length < b) return a; - a = a.slice(0, Math.ceil(b / 32)); - var c = a.length; - b = b & 31; - 0 < c && b && (a[c - 1] = sjcl2.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); - return a; - }, partial: function(a, b, c) { - return 32 === a ? b : (c ? b | 0 : b << 32 - a) + 1099511627776 * a; - }, getPartial: function(a) { - return Math.round(a / 1099511627776) || 32; - }, equal: function(a, b) { - if (sjcl2.bitArray.bitLength(a) !== sjcl2.bitArray.bitLength(b)) return false; - var c = 0, d; - for (d = 0; d < a.length; d++) c |= a[d] ^ b[d]; - return 0 === c; - }, Y: function(a, b, c, d) { - var e; - e = 0; - for (void 0 === d && (d = []); 32 <= b; b -= 32) d.push(c), c = 0; - if (0 === b) return d.concat(a); - for (e = 0; e < a.length; e++) d.push(c | a[e] >>> b), c = a[e] << 32 - b; - e = a.length ? a[a.length - 1] : 0; - a = sjcl2.bitArray.getPartial(e); - d.push(sjcl2.bitArray.partial(b + a & 31, 32 < b + a ? c : d.pop(), 1)); - return d; - }, P: function(a, b) { - return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; - }, byteswapM: function(a) { - var b, c; - for (b = 0; b < a.length; ++b) c = a[b], a[b] = c >>> 24 | c >>> 8 & 65280 | (c & 65280) << 8 | c << 24; - return a; - } }; - sjcl2.codec.utf8String = { fromBits: function(a) { - var b = "", c = sjcl2.bitArray.bitLength(a), d, e; - for (d = 0; d < c / 8; d++) 0 === (d & 3) && (e = a[d / 4]), b += String.fromCharCode(e >>> 8 >>> 8 >>> 8), e <<= 8; - return decodeURIComponent(escape(b)); - }, toBits: function(a) { - a = unescape(encodeURIComponent(a)); - var b = [], c, d = 0; - for (c = 0; c < a.length; c++) d = d << 8 | a.charCodeAt(c), 3 === (c & 3) && (b.push(d), d = 0); - c & 3 && b.push(sjcl2.bitArray.partial(8 * (c & 3), d)); - return b; - } }; - sjcl2.codec.hex = { fromBits: function(a) { - var b = "", c; - for (c = 0; c < a.length; c++) b += ((a[c] | 0) + 263882790666240).toString(16).substr(4); - return b.substr(0, sjcl2.bitArray.bitLength(a) / 4); - }, toBits: function(a) { - var b, c = [], d; - a = a.replace(/\s|0x/g, ""); - d = a.length; - a = a + "00000000"; - for (b = 0; b < a.length; b += 8) c.push(parseInt(a.substr(b, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c, 4 * d); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a, b, c) { - var d = "", e = 0, f = sjcl2.codec.base64.S, g = 0, h = sjcl2.bitArray.bitLength(a); - c && (f = f.substr(0, 62) + "-_"); - for (c = 0; 6 * d.length < h; ) d += f.charAt((g ^ a[c] >>> e) >>> 26), 6 > e ? (g = a[c] << 6 - e, e += 26, c++) : (g <<= 6, e -= 6); - for (; d.length & 3 && !b; ) d += "="; - return d; - }, toBits: function(a, b) { - a = a.replace(/\s|=/g, ""); - var c = [], d, e = 0, f = sjcl2.codec.base64.S, g = 0, h; - b && (f = f.substr(0, 62) + "-_"); - for (d = 0; d < a.length; d++) { - h = f.indexOf(a.charAt(d)); - if (0 > h) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e ? (e -= 26, c.push(g ^ h >>> e), g = h << 32 - e) : (e += 6, g ^= h << 32 - e); - } - e & 56 && c.push(sjcl2.bitArray.partial(e & 56, g, 1)); - return c; - } }; - sjcl2.codec.base64url = { fromBits: function(a) { - return sjcl2.codec.base64.fromBits(a, 1, 1); - }, toBits: function(a) { - return sjcl2.codec.base64.toBits(a, 1); - } }; - sjcl2.hash.sha256 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a) { - return new sjcl2.hash.sha256().update(a).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(d.subarray( - 16 * e, - 16 * (e + 1) - )), e += 1; - c.splice(0, 16 * e); - } else for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(c.splice(0, 16)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 2; a & 15; a++) b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 16)); - this.reset(); - return c; - }, o: [], b: [], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - for (var b = 0, c = 2, d, e; 64 > b; c++) { - e = true; - for (d = 2; d * d <= c; d++) if (0 === c % d) { - e = false; - break; - } - e && (8 > b && (this.o[b] = a(Math.pow(c, 0.5))), this.b[b] = a(Math.pow(c, 1 / 3)), b++); - } - }, l: function(a) { - var b, c, d, e = this.g, f = this.b, g = e[0], h = e[1], k = e[2], n = e[3], l = e[4], m = e[5], p = e[6], z = e[7]; - for (b = 0; 64 > b; b++) 16 > b ? c = a[b] : (c = a[b + 1 & 15], d = a[b + 14 & 15], c = a[b & 15] = (c >>> 7 ^ c >>> 18 ^ c >>> 3 ^ c << 25 ^ c << 14) + (d >>> 17 ^ d >>> 19 ^ d >>> 10 ^ d << 15 ^ d << 13) + a[b & 15] + a[b + 9 & 15] | 0), c = c + z + (l >>> 6 ^ l >>> 11 ^ l >>> 25 ^ l << 26 ^ l << 21 ^ l << 7) + (p ^ l & (m ^ p)) + f[b], z = p, p = m, m = l, l = n + c | 0, n = k, k = h, h = g, g = c + (h & k ^ n & (h ^ k)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; - e[0] = e[0] + g | 0; - e[1] = e[1] + h | 0; - e[2] = e[2] + k | 0; - e[3] = e[3] + n | 0; - e[4] = e[4] + l | 0; - e[5] = e[5] + m | 0; - e[6] = e[6] + p | 0; - e[7] = e[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a) { - return new sjcl2.hash.sha512().update(a).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(d.subarray(32 * e, 32 * (e + 1))), e += 1; - c.splice(0, 32 * e); - } else for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(c.splice(0, 32)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 4; a & 31; a++) b.push(0); - b.push(0); - b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 32)); - this.reset(); - return c; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - function b(a2) { - return 1099511627776 * (a2 - Math.floor(a2)) & 255; - } - for (var c = 0, d = 2, e, f; 80 > c; d++) { - f = true; - for (e = 2; e * e <= d; e++) if (0 === d % e) { - f = false; - break; - } - f && (8 > c && (this.o[2 * c] = a(Math.pow(d, 0.5)), this.o[2 * c + 1] = b(Math.pow(d, 0.5)) << 24 | this.ia[c]), this.b[2 * c] = a(Math.pow(d, 1 / 3)), this.b[2 * c + 1] = b(Math.pow(d, 1 / 3)) << 24 | this.ka[c], c++); - } - }, l: function(a) { - var b, c, d = this.g, e = this.b, f = d[0], g = d[1], h = d[2], k = d[3], n = d[4], l = d[5], m = d[6], p = d[7], z = d[8], A = d[9], C = d[10], B = d[11], D = d[12], P = d[13], ea = d[14], Q = d[15], t; - if ("undefined" !== typeof Uint32Array) { - t = Array(160); - for (var r = 0; 32 > r; r++) t[r] = a[r]; - } else t = a; - var r = f, u = g, G = h, E = k, H = n, F = l, V = m, I = p, w = z, v = A, R = C, J = B, S = D, K = P, W = ea, L = Q; - for (a = 0; 80 > a; a++) { - if (16 > a) b = t[2 * a], c = t[2 * a + 1]; - else { - c = t[2 * (a - 15)]; - var q = t[2 * (a - 15) + 1]; - b = (q << 31 | c >>> 1) ^ (q << 24 | c >>> 8) ^ c >>> 7; - var x = (c << 31 | q >>> 1) ^ (c << 24 | q >>> 8) ^ (c << 25 | q >>> 7); - c = t[2 * (a - 2)]; - var y = t[2 * (a - 2) + 1], q = (y << 13 | c >>> 19) ^ (c << 3 | y >>> 29) ^ c >>> 6, y = (c << 13 | y >>> 19) ^ (y << 3 | c >>> 29) ^ (c << 26 | y >>> 6), X = t[2 * (a - 7)], Y = t[2 * (a - 16)], M = t[2 * (a - 16) + 1]; - c = x + t[2 * (a - 7) + 1]; - b = b + X + (c >>> 0 < x >>> 0 ? 1 : 0); - c += y; - b += q + (c >>> 0 < y >>> 0 ? 1 : 0); - c += M; - b += Y + (c >>> 0 < M >>> 0 ? 1 : 0); - } - t[2 * a] = b |= 0; - t[2 * a + 1] = c |= 0; - var X = w & R ^ ~w & S, fa = v & J ^ ~v & K, y = r & G ^ r & H ^ G & H, ja = u & E ^ u & F ^ E & F, Y = (u << 4 | r >>> 28) ^ (r << 30 | u >>> 2) ^ (r << 25 | u >>> 7), M = (r << 4 | u >>> 28) ^ (u << 30 | r >>> 2) ^ (u << 25 | r >>> 7), ka = e[2 * a], ga = e[2 * a + 1], q = L + ((w << 18 | v >>> 14) ^ (w << 14 | v >>> 18) ^ (v << 23 | w >>> 9)), x = W + ((v << 18 | w >>> 14) ^ (v << 14 | w >>> 18) ^ (w << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x = x + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x = x + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c | 0, x = x + (b + (q >>> 0 < c >>> 0 ? 1 : 0)); - c = M + ja; - b = Y + y + (c >>> 0 < M >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w; - J = v; - v = I + q | 0; - w = V + x + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E; - G = r; - E = u; - u = q + c | 0; - r = x + b + (u >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g = d[1] = g + u | 0; - d[0] = f + r + (g >>> 0 < u >>> 0 ? 1 : 0) | 0; - k = d[3] = k + E | 0; - d[2] = h + G + (k >>> 0 < E >>> 0 ? 1 : 0) | 0; - l = d[5] = l + F | 0; - d[4] = n + H + (l >>> 0 < F >>> 0 ? 1 : 0) | 0; - p = d[7] = p + I | 0; - d[6] = m + V + (p >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d[9] = A + v | 0; - d[8] = z + w + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B = d[11] = B + J | 0; - d[10] = C + R + (B >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d[13] = P + K | 0; - d[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d[15] = Q + L | 0; - d[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a) { - sjcl2.mode.ccm.F.push(a); - }, unListenProgress: function(a) { - a = sjcl2.mode.ccm.F.indexOf(a); - -1 < a && sjcl2.mode.ccm.F.splice(a, 1); - }, da: function(a) { - var b = sjcl2.mode.ccm.F.slice(), c; - for (c = 0; c < b.length; c += 1) b[c](a); - }, encrypt: function(a, b, c, d, e) { - var f, g = b.slice(0), h = sjcl2.bitArray, k = h.bitLength(c) / 8, n = h.bitLength(g) / 8; - e = e || 64; - d = d || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f = 2; 4 > f && n >>> 8 * f; f++) ; - f < 15 - k && (f = 15 - k); - c = h.clamp( - c, - 8 * (15 - f) - ); - b = sjcl2.mode.ccm.U(a, b, c, d, e, f); - g = sjcl2.mode.ccm.V(a, g, c, b, e, f); - return h.concat(g.data, g.tag); - }, decrypt: function(a, b, c, d, e) { - e = e || 64; - d = d || []; - var f = sjcl2.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), k = f.clamp(b, h - e), n = f.bitSlice(b, h - e), h = (h - e) / 8; - if (7 > g) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b = 2; 4 > b && h >>> 8 * b; b++) ; - b < 15 - g && (b = 15 - g); - c = f.clamp(c, 8 * (15 - b)); - k = sjcl2.mode.ccm.V(a, k, c, n, e, b); - a = sjcl2.mode.ccm.U(a, k.data, c, d, e, b); - if (!f.equal(k.tag, a)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a, b, c, d, e, f) { - var g = [], h = sjcl2.bitArray, k = h.P; - d = [h.partial(8, (b.length ? 64 : 0) | d - 2 << 2 | f - 1)]; - d = h.concat(d, c); - d[3] |= e; - d = a.encrypt(d); - if (b.length) for (c = h.bitLength(b) / 8, 65279 >= c ? g = [h.partial(16, c)] : 4294967295 >= c && (g = h.concat([h.partial(16, 65534)], [c])), g = h.concat(g, b), b = 0; b < g.length; b += 4) d = a.encrypt(k(d, g.slice(b, b + 4).concat([0, 0, 0]))); - return d; - }, U: function(a, b, c, d, e, f) { - var g = sjcl2.bitArray, h = g.P; - e /= 8; - if (e % 2 || 4 > e || 16 < e) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d.length || 4294967295 < b.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c = sjcl2.mode.ccm.ma(a, d, c, e, g.bitLength(b) / 8, f); - for (d = 0; d < b.length; d += 4) c = a.encrypt(h(c, b.slice(d, d + 4).concat([0, 0, 0]))); - return g.clamp(c, 8 * e); - }, V: function(a, b, c, d, e, f) { - var g, h = sjcl2.bitArray; - g = h.P; - var k = b.length, n = h.bitLength(b), l = k / 50, m = l; - c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); - d = h.bitSlice(g(d, a.encrypt(c)), 0, e); - if (!k) return { tag: d, data: [] }; - for (g = 0; g < k; g += 4) g > l && (sjcl2.mode.ccm.da(g / k), l += m), c[3]++, e = a.encrypt(c), b[g] ^= e[0], b[g + 1] ^= e[1], b[g + 2] ^= e[2], b[g + 3] ^= e[3]; - return { tag: d, data: h.clamp(b, n) }; - } }; - sjcl2.misc.hmac = function(a, b) { - this.W = b = b || sjcl2.hash.sha256; - var c = [[], []], d, e = b.prototype.blockSize / 32; - this.B = [new b(), new b()]; - a.length > e && (a = b.hash(a)); - for (d = 0; d < e; d++) c[0][d] = a[d] ^ 909522486, c[1][d] = a[d] ^ 1549556828; - this.B[0].update(c[0]); - this.B[1].update(c[1]); - this.O = new b(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a); - return this.digest(a); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a) { - this.Z = true; - this.O.update(a); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a = this.O.finalize(), a = new this.W(this.B[1]).update(a).finalize(); - this.reset(); - return a; - }; - sjcl2.misc.pbkdf2 = function(a, b, c, d, e) { - c = c || 1e4; - if (0 > d || 0 > c) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - e = e || sjcl2.misc.hmac; - a = new e(a); - var f, g, h, k, n = [], l = sjcl2.bitArray; - for (k = 1; 32 * n.length < (d || 1); k++) { - e = f = a.encrypt(l.concat(b, [k])); - for (g = 1; g < c; g++) for (f = a.encrypt(f), h = 0; h < f.length; h++) e[h] ^= f[h]; - n = n.concat(e); - } - d && (n = l.clamp(n, d)); - return n; - }; - sjcl2.prng = function(a) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a, b) { - var c = [], d; - d = this.isReady(b); - var e; - if (d === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d & this.I) { - d = !(d & this.H); - e = []; - var f = 0, g; - this.X = e[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g = 0; 16 > g; g++) e.push(4294967296 * Math.random() | 0); - for (g = 0; g < this.h.length && (e = e.concat(this.h[g].finalize()), f += this.s[g], this.s[g] = 0, d || !(this.N & 1 << g)); g++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f; - f > this.u && (this.u = f); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e)); - this.K = new sjcl2.cipher.aes(this.b); - for (d = 0; 4 > d && (this.m[d] = this.m[d] + 1 | 0, !this.m[d]); d++) ; - } - for (d = 0; d < a; d += 4) 0 === (d + 1) % this.aa && ba(this), e = N(this), c.push(e[0], e[1], e[2], e[3]); - ba(this); - return c.slice(0, a); - }, - setDefaultParanoia: function(a, b) { - if (0 === a && "Setting paranoia=0 will ruin your security; use it only for testing" !== b) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a; - }, - addEntropy: function(a, b, c) { - c = c || "user"; - var d, e, f = (/* @__PURE__ */ new Date()).valueOf(), g = this.G[c], h = this.isReady(), k = 0; - d = this.T[c]; - void 0 === d && (d = this.T[c] = this.fa++); - void 0 === g && (g = this.G[c] = 0); - this.G[c] = (this.G[c] + 1) % this.h.length; - switch (typeof a) { - case "number": - void 0 === b && (b = 1); - this.h[g].update([d, this.M++, 1, b, f, 1, a | 0]); - break; - case "object": - c = Object.prototype.toString.call(a); - if ("[object Uint32Array]" === c) { - e = []; - for (c = 0; c < a.length; c++) e.push(a[c]); - a = e; - } else for ("[object Array]" !== c && (k = 1), c = 0; c < a.length && !k; c++) "number" !== typeof a[c] && (k = 1); - if (!k) { - if (void 0 === b) for (c = b = 0; c < a.length; c++) for (e = a[c]; 0 < e; ) b++, e = e >>> 1; - this.h[g].update([d, this.M++, 2, b, f, a.length].concat(a)); - } - break; - case "string": - void 0 === b && (b = a.length); - this.h[g].update([d, this.M++, 3, b, f, a.length]); - this.h[g].update(a); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g] += b; - this.i += b; - h === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a) { - a = this.R[void 0 !== a ? a : this.L]; - return this.u && this.u >= a ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a ? this.I | this.A : this.A; - }, - getProgress: function(a) { - a = this.R[a ? a : this.L]; - return this.u >= a ? 1 : this.i > a ? 1 : this.i / a; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a, b) { - this.J[a][this.ea++] = b; - }, - removeEventListener: function(a, b) { - var c, d, e = this.J[a], f = []; - for (d in e) e.hasOwnProperty(d) && e[d] === b && f.push(d); - for (c = 0; c < f.length; c++) d = f[c], delete e[d]; - }, - ja: function() { - T(this, 1); - }, - na: function(a) { - var b, c; - try { - b = a.x || a.clientX || a.offsetX || 0, c = a.y || a.clientY || a.offsetY || 0; - } catch (d) { - c = b = 0; - } - 0 != b && 0 != c && this.addEntropy([b, c], 2, "mouse"); - T(this, 0); - }, - pa: function(a) { - a = a.touches[0] || a.changedTouches[0]; - this.addEntropy([a.pageX || a.clientX, a.pageY || a.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a) { - a = a.accelerationIncludingGravity.x || a.accelerationIncludingGravity.y || a.accelerationIncludingGravity.z; - if (window.orientation) { - var b = window.orientation; - "number" === typeof b && this.addEntropy(b, 1, "accelerometer"); - } - a && this.addEntropy(a, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a, b) { - var c, d = sjcl2.random.J[a], e = []; - for (c in d) d.hasOwnProperty(c) && e.push(d[c]); - for (c = 0; c < e.length; c++) e[c](b); - } - function T(a, b) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a.addEntropy(window.performance.now(), b, "loadtime") : a.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b, "loadtime"); - } - function ba(a) { - a.b = N(a).concat(N(a)); - a.K = new sjcl2.cipher.aes(a.b); - } - function N(a) { - for (var b = 0; 4 > b && (a.m[b] = a.m[b] + 1 | 0, !a.m[b]); b++) ; - return a.K.encrypt(a.m); - } - function O(a, b) { - return function() { - b.apply(a, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require("crypto"); - } catch (a) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json, f = e.j({ iv: sjcl2.random.randomWords(4, 0) }, e.defaults), g; - e.j(f, c); - c = f.adata; - "string" === typeof f.salt && (f.salt = sjcl2.codec.base64.toBits(f.salt)); - "string" === typeof f.iv && (f.iv = sjcl2.codec.base64.toBits(f.iv)); - if (!sjcl2.mode[f.mode] || !sjcl2.cipher[f.cipher] || "string" === typeof a && 100 >= f.iter || 64 !== f.ts && 96 !== f.ts && 128 !== f.ts || 128 !== f.ks && 192 !== f.ks && 256 !== f.ks || 2 > f.iv.length || 4 < f.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, f), a = g.key.slice(0, f.ks / 32), f.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.publicKey && (g = a.kem(), f.kemtag = g.tag, a = g.key.slice(0, f.ks / 32)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - "string" === typeof c && (f.adata = c = sjcl2.codec.utf8String.toBits(c)); - g = new sjcl2.cipher[f.cipher](a); - e.j(d, f); - d.key = a; - f.ct = "ccm" === f.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g, b, f.iv, c, f.ts) : sjcl2.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); - return f; - }, encrypt: function(a, b, c, d) { - var e = sjcl2.json, f = e.ha.apply(e, arguments); - return e.encode(f); - }, ga: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json; - b = e.j(e.j(e.j({}, e.defaults), b), c, true); - var f, g; - f = b.adata; - "string" === typeof b.salt && (b.salt = sjcl2.codec.base64.toBits(b.salt)); - "string" === typeof b.iv && (b.iv = sjcl2.codec.base64.toBits(b.iv)); - if (!sjcl2.mode[b.mode] || !sjcl2.cipher[b.cipher] || "string" === typeof a && 100 >= b.iter || 64 !== b.ts && 96 !== b.ts && 128 !== b.ts || 128 !== b.ks && 192 !== b.ks && 256 !== b.ks || !b.iv || 2 > b.iv.length || 4 < b.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, b), a = g.key.slice(0, b.ks / 32), b.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.secretKey && (a = a.unkem(sjcl2.codec.base64.toBits(b.kemtag)).slice(0, b.ks / 32)); - "string" === typeof f && (f = sjcl2.codec.utf8String.toBits(f)); - g = new sjcl2.cipher[b.cipher](a); - f = "ccm" === b.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g, b.ct, b.iv, b.tag, f, b.ts) : sjcl2.mode[b.mode].decrypt(g, b.ct, b.iv, f, b.ts); - e.j(d, b); - d.key = a; - return 1 === c.raw ? f : sjcl2.codec.utf8String.fromBits(f); - }, decrypt: function(a, b, c, d) { - var e = sjcl2.json; - return e.ga(a, e.decode(b), c, d); - }, encode: function(a) { - var b, c = "{", d = ""; - for (b in a) if (a.hasOwnProperty(b)) { - if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c += d + '"' + b + '":'; - d = ","; - switch (typeof a[b]) { - case "number": - case "boolean": - c += a[b]; - break; - case "string": - c += '"' + escape(a[b]) + '"'; - break; - case "object": - c += '"' + sjcl2.codec.base64.fromBits(a[b], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c + "}"; - }, decode: function(a) { - a = a.replace(/\s/g, ""); - if (!a.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a = a.replace(/^\{|\}$/g, "").split(/,/); - var b = {}, c, d; - for (c = 0; c < a.length; c++) { - if (!(d = a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d[3] ? b[d[2]] = parseInt(d[3], 10) : null != d[4] ? b[d[2]] = d[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d[4]) : unescape(d[4]) : null != d[5] && (b[d[2]] = "true" === d[5]); - } - return b; - }, j: function(a, b, c) { - void 0 === a && (a = {}); - if (void 0 === b) return a; - for (var d in b) if (b.hasOwnProperty(d)) { - if (c && void 0 !== a[d] && a[d] !== b[d]) throw new sjcl2.exception.invalid("required parameter overridden"); - a[d] = b[d]; - } - return a; - }, ra: function(a, b) { - var c = {}, d; - for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); - return c; - }, qa: function(a, b) { - var c = {}, d; - for (d = 0; d < b.length; d++) void 0 !== a[b[d]] && (c[b[d]] = a[b[d]]); - return c; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a, b) { - var c = sjcl2.misc.oa, d; - b = b || {}; - d = b.iter || 1e3; - c = c[a] = c[a] || {}; - d = c[d] = c[d] || { firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c = void 0 === b.salt ? d.firstSalt : b.salt; - d[c] = d[c] || sjcl2.misc.pbkdf2(a, c, b.iter); - return { key: d[c].slice(0), salt: c.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var updateFile = (lufiFile, args) => { - Object.assign(lufiFile, args); - if (typeof WorkerGlobalScope !== "undefined") { - self.postMessage({ - event: "FILE_UPDATED" /* FILE_UPDATED */, - lufiFile - }); - } - return lufiFile; -}; -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/websocket/websocket-error.ts -var WebSocketError = class extends BaseError { -}; - -// src/error/websocket/websocket-connection-error.ts -var WebSocketConnectionError = class extends WebSocketError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to connect to WebSocket"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/encoding.js -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i = 0; i < len; i += 3) { - res += this._charset[view[i] >> 2] + this._charset[(view[i] & 3) << 4 | view[i + 1] >> 4] + this._charset[(view[i + 1] & 15) << 2 | view[i + 2] >> 6] + this._charset[view[i + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i = 0, j = 0; - while (i < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i++] = enc1 << 2 | enc2 >> 4; - view[i++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/standard.js -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -function Decode(str) { - return obj.Decode(str); -} - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/url.js -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Decode2(str) { - return obj2.Decode(str); -} - -// src/api/crypto/sjcl.ts -var import_lufi_sjcl = __toESM(require_sjcl()); - -// src/error/crypto/crypto-error.ts -var CryptoError = class extends BaseError { -}; - -// src/error/crypto/decryption-error.ts -var DecryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to decrypt the provided data"); - } -}; - -// src/api/crypto/sjcl.ts -var decrypt = (key, encryptedData) => { - try { - const data = typeof encryptedData === "string" ? encryptedData : new TextDecoder().decode(encryptedData.data); - return okAsync(Decode(import_lufi_sjcl.default.decrypt(key, data))); - } catch (error) { - return errAsync( - new DecryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; - -// src/api/crypto/web.ts -var decrypt2 = (key, encrypted) => { - return importKey(key).andThen( - (importedKey) => ResultAsync.fromPromise( - crypto.subtle.decrypt( - { - name: "AES-GCM", - iv: encrypted.iv - }, - importedKey, - encrypted.data - ), - (error) => new DecryptionError(void 0, { cause: ensureError(error) }) - ) - ); -}; -var importKey = (key) => { - return ResultAsync.fromPromise( - crypto.subtle.importKey( - "raw", - Decode2(key), - { name: "AES-GCM" }, - false, - [ - "encrypt", - "decrypt" - ] - ), - (error) => new CryptoError("Unable to import cryptography key", { - cause: ensureError(error) - }) - ); -}; - -// src/api/crypto.ts -var decrypt3 = (key, value) => value.algo === void 0 || value.algo === 0 /* Sjcl */ ? decrypt(key, value) : decrypt2(key, value); - -// src/api/websocket.ts -var sockets = {}; -var MAX_ERRORS = 5; -var onCancelMessage = (data) => { - events.emit("UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, data.success); - return okAsync(void 0); -}; -var onDownloadMessage = (response, lufiFile) => { - const result = response.split("XXMOJOXX"); - const metadataString = result.shift(); - if (metadataString !== void 0) { - const metadata = JSON.parse(metadataString); - if (isServerDownloadChunkSuccessMetadata(metadata)) { - const dataString = result.shift(); - if (dataString) { - const encryptedData = JSON.parse(dataString); - if (encryptedData.iv) { - encryptedData.iv = new Uint8Array(Object.values(encryptedData.iv)); - encryptedData.data = Decode(encryptedData.data); - } - return decrypt3(lufiFile.keys.client, encryptedData).andThen( - (decryptedPart) => { - const buffer = typeof decryptedPart === "string" ? new TextEncoder().encode(decryptedPart).buffer : decryptedPart; - if (metadata.part === 0) { - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - delAtFirstView: metadata.del_at_first_view, - delay: metadata.delay, - name: metadata.name, - size: metadata.size, - totalChunks: metadata.total, - type: metadata.type, - zipped: metadata.zipped - }); - events.emit("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */); - } else { - updateFile(lufiFile, { chunksReady: lufiFile.chunksReady + 1 }); - } - events.emit("CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, buffer, metadata.part); - if (lufiFile.chunksReady === metadata.total) { - return endDownload(lufiFile).andThen(() => { - events.emit("DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - return okAsync(void 0); - }); - } - return okAsync(void 0); - } - ); - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError(metadata.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onUploadMessage = (response, lufiFile) => { - if (response.success) { - if (response.j === 0) { - updateFile(lufiFile, { - keys: { client: lufiFile.keys.client, server: response.short }, - actionToken: response.token, - queueIndex: response.i - }); - events.emit("UPLOAD_STARTED" /* UPLOAD_STARTED */); - } - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - createdAt: response.created_at - }); - events.emit("CHUNK_UPLOADED" /* CHUNK_UPLOADED */); - if (lufiFile.chunksReady === lufiFile.totalChunks) { - updateFile(lufiFile, { uploadStatus: 1 /* COMPLETE */ }); - events.emit("UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - } - return okAsync(void 0); - } else { - const error = new WebSocketError(response.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onMessage = (e, lufiFile) => { - const data = tryParseJson(e.data); - let callback; - if (data) { - if (!data.action && data.msg) { - const error = new WebSocketError(data.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } else { - if ("delay" in data) { - callback = onUploadMessage(data, lufiFile); - } else { - callback = onCancelMessage(data); - } - } - } else { - callback = onDownloadMessage(e.data, lufiFile); - } - return callback; -}; -var isConnecting = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.CONNECTING; -var isSpawned = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.OPEN; -var cancelUpload = (lufiFile) => { - return sendMessage( - uploadSocketUrl(lufiFile), - lufiFile, - `${JSON.stringify({ - id: lufiFile.keys.server, - mod_token: lufiFile.actionToken, - cancel: true, - i: lufiFile.queueIndex - })}XXMOJOXXuseless` - ); -}; -var endDownload = (lufiFile) => { - let message; - if (lufiFile.password) { - message = { ended: true, file_pwd: lufiFile.password }; - } else { - message = { ended: true }; - } - return sendMessage( - downloadSocketUrl(lufiFile), - lufiFile, - JSON.stringify(message) - ); -}; -var sendMessage = (socketUrl, lufiFile, message) => { - if (!isSpawned(socketUrl)) { - return spawn(socketUrl).andThen(() => { - sockets[socketUrl].onmessage = (e) => onMessage(e, lufiFile); - return sendMessage(socketUrl, lufiFile, message); - }); - } else { - sockets[socketUrl].send(message); - return okAsync(void 0); - } -}; -var spawn = (socketKey, errorCount = 0) => { - if (!isSpawned(socketKey) && !isConnecting(socketKey)) { - sockets[socketKey] = new WebSocket(socketKey); - events.once("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */, () => { - sockets[socketKey].close(); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, () => { - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - }); - sockets[socketKey].onopen = () => { - events.emit("SOCKET_OPENED" /* SOCKET_OPENED */); - }; - sockets[socketKey].onclose = () => { - }; - sockets[socketKey].onerror = (event) => { - if (++errorCount <= MAX_ERRORS) { - console.error( - `An error happened while trying to connect to WebSocket "${socketKey}". Trying again. ${errorCount} / ${MAX_ERRORS}`, - event.error - ); - return spawn(socketKey, errorCount); - } else { - events.emit("SOCKET_ONERROR" /* SOCKET_ONERROR */); - return errAsync( - new WebSocketConnectionError( - `Unable to connect to WebSocket ${socketKey}.` - ) - ); - } - }; - } - return waitForConnection(socketKey).andThen(() => okAsync(socketKey)).orElse((error) => errAsync(error)); -}; -var waitForConnection = (socketKey) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - if (!isSpawned(socketKey)) { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - resolve(void 0); - }); - events.on("SOCKET_ONERROR" /* SOCKET_ONERROR */, () => { - reject(new WebSocketConnectionError()); - }); - } else { - resolve(void 0); - } - }), - (error) => { - return ensureError(error); - } -); -var buildSocketUrl = (instanceUrl, pathname) => { - const url = new URL(instanceUrl); - if (!["ws:", "wss:"].includes(url.protocol)) { - url.protocol = url.protocol === "http:" ? "ws:" : "wss:"; - } - url.pathname += pathname; - return new URL(url.origin + url.pathname); -}; -var downloadSocketUrl = (lufiFile) => { - return buildSocketUrl( - new URL(lufiFile.serverUrl), - "download" /* DOWNLOAD */ + `/${lufiFile.keys.server}` - ).toString(); -}; -var uploadSocketUrl = (lufiFile) => { - return buildSocketUrl(new URL(lufiFile.serverUrl), "upload" /* UPLOAD */).toString(); -}; -var tryParseJson = (data) => { - try { - const parsedObject = JSON.parse(data); - if (parsedObject && typeof parsedObject === "object") { - return parsedObject; - } - } catch (_e) { - } - return false; -}; -var isServerDownloadChunkSuccessMetadata = (message) => typeof message === "object" && message !== null && !("msg" in message); - -// src/worker/cancel.ts -var isInitiated = false; -self.onmessage = (event) => { - if (!isInitiated) { - init(); - isInitiated = true; - } - events.on("UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, (success) => { - self.postMessage({ event: "UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, success }); - }); - cancelUpload2(event.data).mapErr((error) => { - self.postMessage({ - event: "OPERATION_FAILED" /* OPERATION_FAILED */, - error - }); - }); -}; -var cancelUpload2 = (workerMessage) => cancelUpload(workerMessage.args.lufiFile); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbHVmaS1zamNsQDEuMC44L25vZGVfbW9kdWxlcy9sdWZpLXNqY2wvc2pjbC5qcyIsICIuLi8uLi9zcmMvd29ya2VyL3NoYXJlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbmV2ZXJ0aHJvd0A4LjEuMS9ub2RlX21vZHVsZXMvbmV2ZXJ0aHJvdy9kaXN0L2luZGV4LmVzLmpzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWNvbm5lY3Rpb24tZXJyb3IudHMiLCAiLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9hcnJheWJ1ZmZlci1lbmNvZGluZ0AxLjEuMC9ub2RlX21vZHVsZXMvYXJyYXlidWZmZXItZW5jb2Rpbmcvc3JjL2Jhc2U2NC9lbmNvZGluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vYXJyYXlidWZmZXItZW5jb2RpbmdAMS4xLjAvbm9kZV9tb2R1bGVzL2FycmF5YnVmZmVyLWVuY29kaW5nL3NyYy9iYXNlNjQvc3RhbmRhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2FycmF5YnVmZmVyLWVuY29kaW5nQDEuMS4wL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci1lbmNvZGluZy9zcmMvYmFzZTY0L3VybC50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by9zamNsLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by93ZWIudHMiLCAiLi4vLi4vc3JjL2FwaS9jcnlwdG8udHMiLCAiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQudHMiLCAiLi4vLi4vc3JjL3dvcmtlci9jYW5jZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7dmFyIHNqY2w9e2NpcGhlcjp7fSxoYXNoOnt9LGtleWV4Y2hhbmdlOnt9LG1vZGU6e30sbWlzYzp7fSxjb2RlYzp7fSxleGNlcHRpb246e2NvcnJ1cHQ6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiQ09SUlVQVDogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0saW52YWxpZDpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJJTlZBTElEOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfSxidWc6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiQlVHOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfSxub3RSZWFkeTpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJOT1QgUkVBRFk6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9fX07XG5zamNsLmNpcGhlci5hZXM9ZnVuY3Rpb24oYSl7dGhpcy53WzBdWzBdWzBdfHx0aGlzLkMoKTt2YXIgYixjLGQsZSxmPXRoaXMud1swXVs0XSxnPXRoaXMud1sxXTtiPWEubGVuZ3RoO3ZhciBoPTE7aWYoNCE9PWImJjYhPT1iJiY4IT09Yil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGtleSBzaXplXCIpO3RoaXMuYj1bZD1hLnNsaWNlKDApLGU9W11dO2ZvcihhPWI7YTw0KmIrMjg7YSsrKXtjPWRbYS0xXTtpZigwPT09YSVifHw4PT09YiYmND09PWElYiljPWZbYz4+PjI0XTw8MjReZltjPj4xNiYyNTVdPDwxNl5mW2M+PjgmMjU1XTw8OF5mW2MmMjU1XSwwPT09YSViJiYoYz1jPDw4XmM+Pj4yNF5oPDwyNCxoPWg8PDFeMjgzKihoPj43KSk7ZFthXT1kW2EtYl1eY31mb3IoYj0wO2E7YisrLGEtLSljPWRbYiYzP2E6YS00XSxlW2JdPTQ+PWF8fDQ+Yj9jOmdbMF1bZltjPj4+MjRdXV5nWzFdW2ZbYz4+MTYmMjU1XV1eZ1syXVtmW2M+PjgmMjU1XV1eZ1szXVtmW2MmXG4yNTVdXX07XG5zamNsLmNpcGhlci5hZXMucHJvdG90eXBlPXtlbmNyeXB0OmZ1bmN0aW9uKGEpe3JldHVybiBhYSh0aGlzLGEsMCl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhKHRoaXMsYSwxKX0sdzpbW1tdLFtdLFtdLFtdLFtdXSxbW10sW10sW10sW10sW11dXSxDOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy53WzBdLGI9dGhpcy53WzFdLGM9YVs0XSxkPWJbNF0sZSxmLGcsaD1bXSxrPVtdLG4sbCxtLHA7Zm9yKGU9MDsweDEwMD5lO2UrKylrWyhoW2VdPWU8PDFeMjgzKihlPj43KSleZV09ZTtmb3IoZj1nPTA7IWNbZl07Zl49bnx8MSxnPWtbZ118fDEpZm9yKG09Z15nPDwxXmc8PDJeZzw8M15nPDw0LG09bT4+OF5tJjI1NV45OSxjW2ZdPW0sZFttXT1mLGw9aFtlPWhbbj1oW2ZdXV0scD0weDEwMTAxMDEqbF4weDEwMDAxKmVeMHgxMDEqbl4weDEwMTAxMDAqZixsPTB4MTAxKmhbbV1eMHgxMDEwMTAwKm0sZT0wOzQ+ZTtlKyspYVtlXVtmXT1sPWw8PDI0Xmw+Pj44LGJbZV1bbV09cD1wPDwyNF5wPj4+ODtmb3IoZT1cbjA7NT5lO2UrKylhW2VdPWFbZV0uc2xpY2UoMCksYltlXT1iW2VdLnNsaWNlKDApfX07XG5mdW5jdGlvbiBhYShhLGIsYyl7aWYoNCE9PWIubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52YWxpZCBhZXMgYmxvY2sgc2l6ZVwiKTt2YXIgZD1hLmJbY10sZT1iWzBdXmRbMF0sZj1iW2M/MzoxXV5kWzFdLGc9YlsyXV5kWzJdO2I9YltjPzE6M11eZFszXTt2YXIgaCxrLG4sbD1kLmxlbmd0aC80LTIsbSxwPTQsej1bMCwwLDAsMF07aD1hLndbY107YT1oWzBdO3ZhciBBPWhbMV0sQz1oWzJdLEI9aFszXSxEPWhbNF07Zm9yKG09MDttPGw7bSsrKWg9YVtlPj4+MjRdXkFbZj4+MTYmMjU1XV5DW2c+PjgmMjU1XV5CW2ImMjU1XV5kW3BdLGs9YVtmPj4+MjRdXkFbZz4+MTYmMjU1XV5DW2I+PjgmMjU1XV5CW2UmMjU1XV5kW3ArMV0sbj1hW2c+Pj4yNF1eQVtiPj4xNiYyNTVdXkNbZT4+OCYyNTVdXkJbZiYyNTVdXmRbcCsyXSxiPWFbYj4+PjI0XV5BW2U+PjE2JjI1NV1eQ1tmPj44JjI1NV1eQltnJjI1NV1eZFtwKzNdLHArPTQsZT1oLGY9ayxnPW47Zm9yKG09XG4wOzQ+bTttKyspeltjPzMmLW06bV09RFtlPj4+MjRdPDwyNF5EW2Y+PjE2JjI1NV08PDE2XkRbZz4+OCYyNTVdPDw4XkRbYiYyNTVdXmRbcCsrXSxoPWUsZT1mLGY9ZyxnPWIsYj1oO3JldHVybiB6fVxuc2pjbC5iaXRBcnJheT17Yml0U2xpY2U6ZnVuY3Rpb24oYSxiLGMpe2E9c2pjbC5iaXRBcnJheS5ZKGEuc2xpY2UoYi8zMiksMzItKGImMzEpKS5zbGljZSgxKTtyZXR1cm4gdm9pZCAwPT09Yz9hOnNqY2wuYml0QXJyYXkuY2xhbXAoYSxjLWIpfSxleHRyYWN0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLmZsb29yKC1iLWMmMzEpO3JldHVybigoYitjLTFeYikmLTMyP2FbYi8zMnwwXTw8MzItZF5hW2IvMzIrMXwwXT4+PmQ6YVtiLzMyfDBdPj4+ZCkmKDE8PGMpLTF9LGNvbmNhdDpmdW5jdGlvbihhLGIpe2lmKDA9PT1hLmxlbmd0aHx8MD09PWIubGVuZ3RoKXJldHVybiBhLmNvbmNhdChiKTt2YXIgYz1hW2EubGVuZ3RoLTFdLGQ9c2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGMpO3JldHVybiAzMj09PWQ/YS5jb25jYXQoYik6c2pjbC5iaXRBcnJheS5ZKGIsZCxjfDAsYS5zbGljZSgwLGEubGVuZ3RoLTEpKX0sYml0TGVuZ3RoOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO3JldHVybiAwPT09XG5iPzA6MzIqKGItMSkrc2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGFbYi0xXSl9LGNsYW1wOmZ1bmN0aW9uKGEsYil7aWYoMzIqYS5sZW5ndGg8YilyZXR1cm4gYTthPWEuc2xpY2UoMCxNYXRoLmNlaWwoYi8zMikpO3ZhciBjPWEubGVuZ3RoO2I9YiYzMTswPGMmJmImJihhW2MtMV09c2pjbC5iaXRBcnJheS5wYXJ0aWFsKGIsYVtjLTFdJjIxNDc0ODM2NDg+PmItMSwxKSk7cmV0dXJuIGF9LHBhcnRpYWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAzMj09PWE/YjooYz9ifDA6Yjw8MzItYSkrMHgxMDAwMDAwMDAwMCphfSxnZXRQYXJ0aWFsOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKGEvMHgxMDAwMDAwMDAwMCl8fDMyfSxlcXVhbDpmdW5jdGlvbihhLGIpe2lmKHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpIT09c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYikpcmV0dXJuITE7dmFyIGM9MCxkO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspY3w9YVtkXV5iW2RdO3JldHVybiAwPT09XG5jfSxZOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlO2U9MDtmb3Iodm9pZCAwPT09ZCYmKGQ9W10pOzMyPD1iO2ItPTMyKWQucHVzaChjKSxjPTA7aWYoMD09PWIpcmV0dXJuIGQuY29uY2F0KGEpO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspZC5wdXNoKGN8YVtlXT4+PmIpLGM9YVtlXTw8MzItYjtlPWEubGVuZ3RoP2FbYS5sZW5ndGgtMV06MDthPXNqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChlKTtkLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKGIrYSYzMSwzMjxiK2E/YzpkLnBvcCgpLDEpKTtyZXR1cm4gZH0sUDpmdW5jdGlvbihhLGIpe3JldHVyblthWzBdXmJbMF0sYVsxXV5iWzFdLGFbMl1eYlsyXSxhWzNdXmJbM11dfSxieXRlc3dhcE06ZnVuY3Rpb24oYSl7dmFyIGIsYztmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWM9YVtiXSxhW2JdPWM+Pj4yNHxjPj4+OCYweGZmMDB8KGMmMHhmZjAwKTw8OHxjPDwyNDtyZXR1cm4gYX19O1xuc2pjbC5jb2RlYy51dGY4U3RyaW5nPXtmcm9tQml0czpmdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSksZCxlO2ZvcihkPTA7ZDxjLzg7ZCsrKTA9PT0oZCYzKSYmKGU9YVtkLzRdKSxiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGU+Pj44Pj4+OD4+PjgpLGU8PD04O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGIpKX0sdG9CaXRzOmZ1bmN0aW9uKGEpe2E9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGEpKTt2YXIgYj1bXSxjLGQ9MDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZDw8OHxhLmNoYXJDb2RlQXQoYyksMz09PShjJjMpJiYoYi5wdXNoKGQpLGQ9MCk7YyYzJiZiLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDgqKGMmMyksZCkpO3JldHVybiBifX07XG5zamNsLmNvZGVjLmhleD17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7dmFyIGI9XCJcIixjO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYis9KChhW2NdfDApKzB4ZjAwMDAwMDAwMDAwKS50b1N0cmluZygxNikuc3Vic3RyKDQpO3JldHVybiBiLnN1YnN0cigwLHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpLzQpfSx0b0JpdHM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkO2E9YS5yZXBsYWNlKC9cXHN8MHgvZyxcIlwiKTtkPWEubGVuZ3RoO2E9YStcIjAwMDAwMDAwXCI7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrPTgpYy5wdXNoKHBhcnNlSW50KGEuc3Vic3RyKGIsOCksMTYpXjApO3JldHVybiBzamNsLmJpdEFycmF5LmNsYW1wKGMsNCpkKX19O1xuc2pjbC5jb2RlYy5iYXNlNjQ9e1M6XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsZnJvbUJpdHM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVwiXCIsZT0wLGY9c2pjbC5jb2RlYy5iYXNlNjQuUyxnPTAsaD1zamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtjJiYoZj1mLnN1YnN0cigwLDYyKStcIi1fXCIpO2ZvcihjPTA7NipkLmxlbmd0aDxoOylkKz1mLmNoYXJBdCgoZ15hW2NdPj4+ZSk+Pj4yNiksNj5lPyhnPWFbY108PDYtZSxlKz0yNixjKyspOihnPDw9NixlLT02KTtmb3IoO2QubGVuZ3RoJjMmJiFiOylkKz1cIj1cIjtyZXR1cm4gZH0sdG9CaXRzOmZ1bmN0aW9uKGEsYil7YT1hLnJlcGxhY2UoL1xcc3w9L2csXCJcIik7dmFyIGM9W10sZCxlPTAsZj1zamNsLmNvZGVjLmJhc2U2NC5TLGc9MCxoO2ImJihmPWYuc3Vic3RyKDAsNjIpK1wiLV9cIik7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKyl7aD1mLmluZGV4T2YoYS5jaGFyQXQoZCkpO1xuaWYoMD5oKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwidGhpcyBpc24ndCBiYXNlNjQhXCIpOzI2PGU/KGUtPTI2LGMucHVzaChnXmg+Pj5lKSxnPWg8PDMyLWUpOihlKz02LGdePWg8PDMyLWUpfWUmNTYmJmMucHVzaChzamNsLmJpdEFycmF5LnBhcnRpYWwoZSY1NixnLDEpKTtyZXR1cm4gY319O3NqY2wuY29kZWMuYmFzZTY0dXJsPXtmcm9tQml0czpmdW5jdGlvbihhKXtyZXR1cm4gc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoYSwxLDEpfSx0b0JpdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhhLDEpfX07c2pjbC5oYXNoLnNoYTI1Nj1mdW5jdGlvbihhKXt0aGlzLmJbMF18fHRoaXMuQygpO2E/KHRoaXMuZz1hLmcuc2xpY2UoMCksdGhpcy5mPWEuZi5zbGljZSgwKSx0aGlzLmM9YS5jKTp0aGlzLnJlc2V0KCl9O3NqY2wuaGFzaC5zaGEyNTYuaGFzaD1mdW5jdGlvbihhKXtyZXR1cm4obmV3IHNqY2wuaGFzaC5zaGEyNTYpLnVwZGF0ZShhKS5maW5hbGl6ZSgpfTtcbnNqY2wuaGFzaC5zaGEyNTYucHJvdG90eXBlPXtibG9ja1NpemU6NTEyLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuby5zbGljZSgwKTt0aGlzLmY9W107dGhpcy5jPTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO3ZhciBiLGM9dGhpcy5mPXNqY2wuYml0QXJyYXkuY29uY2F0KHRoaXMuZixhKTtiPXRoaXMuYzthPXRoaXMuYz1iK3NqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpO2lmKDB4MWZmZmZmZmZmZmZmZmY8YSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe3ZhciBkPW5ldyBVaW50MzJBcnJheShjKSxlPTA7Zm9yKGI9NTEyK2ItKDUxMitiJjB4MWZmKTtiPD1hO2IrPTUxMil0aGlzLmwoZC5zdWJhcnJheSgxNiplLFxuMTYqKGUrMSkpKSxlKz0xO2Muc3BsaWNlKDAsMTYqZSl9ZWxzZSBmb3IoYj01MTIrYi0oNTEyK2ImMHgxZmYpO2I8PWE7Yis9NTEyKXRoaXMubChjLnNwbGljZSgwLDE2KSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLmYsYz10aGlzLmcsYj1zamNsLmJpdEFycmF5LmNvbmNhdChiLFtzamNsLmJpdEFycmF5LnBhcnRpYWwoMSwxKV0pO2ZvcihhPWIubGVuZ3RoKzI7YSYxNTthKyspYi5wdXNoKDApO2IucHVzaChNYXRoLmZsb29yKHRoaXMuYy8weDEwMDAwMDAwMCkpO2ZvcihiLnB1c2godGhpcy5jfDApO2IubGVuZ3RoOyl0aGlzLmwoYi5zcGxpY2UoMCwxNikpO3RoaXMucmVzZXQoKTtyZXR1cm4gY30sbzpbXSxiOltdLEM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiAweDEwMDAwMDAwMCooYS1NYXRoLmZsb29yKGEpKXwwfWZvcih2YXIgYj0wLGM9MixkLGU7NjQ+YjtjKyspe2U9ITA7Zm9yKGQ9MjtkKmQ8PWM7ZCsrKWlmKDA9PT1jJWQpe2U9XG4hMTticmVha31lJiYoOD5iJiYodGhpcy5vW2JdPWEoTWF0aC5wb3coYywuNSkpKSx0aGlzLmJbYl09YShNYXRoLnBvdyhjLDEvMykpLGIrKyl9fSxsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXMuZyxmPXRoaXMuYixnPWVbMF0saD1lWzFdLGs9ZVsyXSxuPWVbM10sbD1lWzRdLG09ZVs1XSxwPWVbNl0sej1lWzddO2ZvcihiPTA7NjQ+YjtiKyspMTY+Yj9jPWFbYl06KGM9YVtiKzEmMTVdLGQ9YVtiKzE0JjE1XSxjPWFbYiYxNV09KGM+Pj43XmM+Pj4xOF5jPj4+M15jPDwyNV5jPDwxNCkrKGQ+Pj4xN15kPj4+MTleZD4+PjEwXmQ8PDE1XmQ8PDEzKSthW2ImMTVdK2FbYis5JjE1XXwwKSxjPWMreisobD4+PjZebD4+PjExXmw+Pj4yNV5sPDwyNl5sPDwyMV5sPDw3KSsocF5sJihtXnApKStmW2JdLHo9cCxwPW0sbT1sLGw9bitjfDAsbj1rLGs9aCxoPWcsZz1jKyhoJmtebiYoaF5rKSkrKGg+Pj4yXmg+Pj4xM15oPj4+MjJeaDw8MzBeaDw8MTleaDw8MTApfDA7ZVswXT1lWzBdK2d8XG4wO2VbMV09ZVsxXStofDA7ZVsyXT1lWzJdK2t8MDtlWzNdPWVbM10rbnwwO2VbNF09ZVs0XStsfDA7ZVs1XT1lWzVdK218MDtlWzZdPWVbNl0rcHwwO2VbN109ZVs3XSt6fDB9fTtzamNsLmhhc2guc2hhNTEyPWZ1bmN0aW9uKGEpe3RoaXMuYlswXXx8dGhpcy5DKCk7YT8odGhpcy5nPWEuZy5zbGljZSgwKSx0aGlzLmY9YS5mLnNsaWNlKDApLHRoaXMuYz1hLmMpOnRoaXMucmVzZXQoKX07c2pjbC5oYXNoLnNoYTUxMi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybihuZXcgc2pjbC5oYXNoLnNoYTUxMikudXBkYXRlKGEpLmZpbmFsaXplKCl9O1xuc2pjbC5oYXNoLnNoYTUxMi5wcm90b3R5cGU9e2Jsb2NrU2l6ZToxMDI0LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuby5zbGljZSgwKTt0aGlzLmY9W107dGhpcy5jPTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO3ZhciBiLGM9dGhpcy5mPXNqY2wuYml0QXJyYXkuY29uY2F0KHRoaXMuZixhKTtiPXRoaXMuYzthPXRoaXMuYz1iK3NqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpO2lmKDB4MWZmZmZmZmZmZmZmZmY8YSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe3ZhciBkPW5ldyBVaW50MzJBcnJheShjKSxlPTA7Zm9yKGI9MTAyNCtiLSgxMDI0K2ImMTAyMyk7Yjw9YTtiKz0xMDI0KXRoaXMubChkLnN1YmFycmF5KDMyKlxuZSwzMiooZSsxKSkpLGUrPTE7Yy5zcGxpY2UoMCwzMiplKX1lbHNlIGZvcihiPTEwMjQrYi0oMTAyNCtiJjEwMjMpO2I8PWE7Yis9MTAyNCl0aGlzLmwoYy5zcGxpY2UoMCwzMikpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5mLGM9dGhpcy5nLGI9c2pjbC5iaXRBcnJheS5jb25jYXQoYixbc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDEsMSldKTtmb3IoYT1iLmxlbmd0aCs0O2EmMzE7YSsrKWIucHVzaCgwKTtiLnB1c2goMCk7Yi5wdXNoKDApO2IucHVzaChNYXRoLmZsb29yKHRoaXMuYy8weDEwMDAwMDAwMCkpO2ZvcihiLnB1c2godGhpcy5jfDApO2IubGVuZ3RoOyl0aGlzLmwoYi5zcGxpY2UoMCwzMikpO3RoaXMucmVzZXQoKTtyZXR1cm4gY30sbzpbXSxpYTpbMTIzNzIyMzIsMTMyODEwODMsOTc2Mjg1OSwxOTE0NjA5LDE1MTA2NzY5LDQwOTA5MTEsNDMwODMzMSw4MjY2MTA1XSxiOltdLGthOlsyNjY2MDE4LDE1Njg5MTY1LDUwNjE0MjMsOTAzNDY4NCxcbjQ3NjQ5ODQsMzgwOTUzLDE2NTg3NzksNzE3NjQ3MiwxOTcxODYsNzM2ODYzOCwxNDk4NzkxNiwxNjc1Nzk4Niw4MDk2MTExLDE0ODAzNjksMTMwNDYzMjUsNjg5MTE1NiwxNTgxMzMzMCw1MTg3MDQzLDkyMjk3NDksMTEzMTIyMjksMjgxODY3NywxMDkzNzQ3NSw0MzI0MzA4LDExMzU1NDEsNjc0MTkzMSwxMTgwOTI5NiwxNjQ1ODA0NywxNTY2NjkxNiwxMTA0Njg1MCw2OTgxNDksMjI5OTk5LDk0NTc3NiwxMzc3NDg0NCwyNTQxODYyLDEyODU2MDQ1LDk4MTA5MTEsMTE0OTQzNjYsNzg0NDUyMCwxNTU3NjgwNiw4NTMzMzA3LDE1Nzk1MDQ0LDQzMzc2NjUsMTYyOTE3MjksNTU1MzcxMiwxNTY4NDEyMCw2NjYyNDE2LDc0MTM4MDIsMTIzMDg5MjAsMTM4MTYwMDgsNDMwMzY5OSw5MzY2NDI1LDEwMTc2NjgwLDEzMTk1ODc1LDQyOTUzNzEsNjU0NjI5MSwxMTcxMjY3NSwxNTcwODkyNCwxNTE5NDU2LDE1NzcyNTMwLDY1Njg0MjgsNjQ5NTc4NCw4NTY4Mjk3LDEzMDA3MTI1LDc0OTIzOTUsMjUxNTM1NixcbjEyNjMyNTgzLDE0NzQwMjU0LDcyNjI1ODQsMTUzNTkzMCwxMzE0NjI3OCwxNjMyMTk2NiwxODUzMjExLDI5NDI3NiwxMzA1MTAyNywxMzIyMTU2NCwxMDUxOTgwLDQwODAzMTAsNjY1MTQzNCwxNDA4ODk0MCw0Njc1NjA3XSxDOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gMHgxMDAwMDAwMDAqKGEtTWF0aC5mbG9vcihhKSl8MH1mdW5jdGlvbiBiKGEpe3JldHVybiAweDEwMDAwMDAwMDAwKihhLU1hdGguZmxvb3IoYSkpJjI1NX1mb3IodmFyIGM9MCxkPTIsZSxmOzgwPmM7ZCsrKXtmPSEwO2ZvcihlPTI7ZSplPD1kO2UrKylpZigwPT09ZCVlKXtmPSExO2JyZWFrfWYmJig4PmMmJih0aGlzLm9bMipjXT1hKE1hdGgucG93KGQsLjUpKSx0aGlzLm9bMipjKzFdPWIoTWF0aC5wb3coZCwuNSkpPDwyNHx0aGlzLmlhW2NdKSx0aGlzLmJbMipjXT1hKE1hdGgucG93KGQsMS8zKSksdGhpcy5iWzIqYysxXT1iKE1hdGgucG93KGQsMS8zKSk8PDI0fHRoaXMua2FbY10sYysrKX19LGw6ZnVuY3Rpb24oYSl7dmFyIGIsXG5jLGQ9dGhpcy5nLGU9dGhpcy5iLGY9ZFswXSxnPWRbMV0saD1kWzJdLGs9ZFszXSxuPWRbNF0sbD1kWzVdLG09ZFs2XSxwPWRbN10sej1kWzhdLEE9ZFs5XSxDPWRbMTBdLEI9ZFsxMV0sRD1kWzEyXSxQPWRbMTNdLGVhPWRbMTRdLFE9ZFsxNV0sdDtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt0PUFycmF5KDE2MCk7Zm9yKHZhciByPTA7MzI+cjtyKyspdFtyXT1hW3JdfWVsc2UgdD1hO3ZhciByPWYsdT1nLEc9aCxFPWssSD1uLEY9bCxWPW0sST1wLHc9eix2PUEsUj1DLEo9QixTPUQsSz1QLFc9ZWEsTD1RO2ZvcihhPTA7ODA+YTthKyspe2lmKDE2PmEpYj10WzIqYV0sYz10WzIqYSsxXTtlbHNle2M9dFsyKihhLTE1KV07dmFyIHE9dFsyKihhLTE1KSsxXTtiPShxPDwzMXxjPj4+MSleKHE8PDI0fGM+Pj44KV5jPj4+Nzt2YXIgeD0oYzw8MzF8cT4+PjEpXihjPDwyNHxxPj4+OCleKGM8PDI1fHE+Pj43KTtjPXRbMiooYS0yKV07dmFyIHk9dFsyKihhLTIpKzFdLFxucT0oeTw8MTN8Yz4+PjE5KV4oYzw8M3x5Pj4+MjkpXmM+Pj42LHk9KGM8PDEzfHk+Pj4xOSleKHk8PDN8Yz4+PjI5KV4oYzw8MjZ8eT4+PjYpLFg9dFsyKihhLTcpXSxZPXRbMiooYS0xNildLE09dFsyKihhLTE2KSsxXTtjPXgrdFsyKihhLTcpKzFdO2I9YitYKyhjPj4+MDx4Pj4+MD8xOjApO2MrPXk7Yis9cSsoYz4+PjA8eT4+PjA/MTowKTtjKz1NO2IrPVkrKGM+Pj4wPE0+Pj4wPzE6MCl9dFsyKmFdPWJ8PTA7dFsyKmErMV09Y3w9MDt2YXIgWD13JlJefncmUyxmYT12JkpefnYmSyx5PXImR15yJkheRyZILGphPXUmRV51JkZeRSZGLFk9KHU8PDR8cj4+PjI4KV4ocjw8MzB8dT4+PjIpXihyPDwyNXx1Pj4+NyksTT0ocjw8NHx1Pj4+MjgpXih1PDwzMHxyPj4+MileKHU8PDI1fHI+Pj43KSxrYT1lWzIqYV0sZ2E9ZVsyKmErMV0scT1MKygodzw8MTh8dj4+PjE0KV4odzw8MTR8dj4+PjE4KV4odjw8MjN8dz4+PjkpKSx4PVcrKCh2PDwxOHx3Pj4+MTQpXih2PDwxNHx3Pj4+MTgpXih3PDxcbjIzfHY+Pj45KSkrKHE+Pj4wPEw+Pj4wPzE6MCkscT1xK2ZhLHg9eCsoWCsocT4+PjA8ZmE+Pj4wPzE6MCkpLHE9cStnYSx4PXgrKGthKyhxPj4+MDxnYT4+PjA/MTowKSkscT1xK2N8MCx4PXgrKGIrKHE+Pj4wPGM+Pj4wPzE6MCkpO2M9TStqYTtiPVkreSsoYz4+PjA8TT4+PjA/MTowKTtXPVM7TD1LO1M9UjtLPUo7Uj13O0o9djt2PUkrcXwwO3c9Vit4Kyh2Pj4+MDxJPj4+MD8xOjApfDA7Vj1IO0k9RjtIPUc7Rj1FO0c9cjtFPXU7dT1xK2N8MDtyPXgrYisodT4+PjA8cT4+PjA/MTowKXwwfWc9ZFsxXT1nK3V8MDtkWzBdPWYrcisoZz4+PjA8dT4+PjA/MTowKXwwO2s9ZFszXT1rK0V8MDtkWzJdPWgrRysoaz4+PjA8RT4+PjA/MTowKXwwO2w9ZFs1XT1sK0Z8MDtkWzRdPW4rSCsobD4+PjA8Rj4+PjA/MTowKXwwO3A9ZFs3XT1wK0l8MDtkWzZdPW0rVisocD4+PjA8ST4+PjA/MTowKXwwO0E9ZFs5XT1BK3Z8MDtkWzhdPXordysoQT4+PjA8dj4+PjA/MTowKXwwO0I9ZFsxMV09QitKfFxuMDtkWzEwXT1DK1IrKEI+Pj4wPEo+Pj4wPzE6MCl8MDtQPWRbMTNdPVArS3wwO2RbMTJdPUQrUysoUD4+PjA8Sz4+PjA/MTowKXwwO1E9ZFsxNV09UStMfDA7ZFsxNF09ZWErVysoUT4+PjA8TD4+PjA/MTowKXwwfX07XG5zamNsLm1vZGUuY2NtPXtuYW1lOlwiY2NtXCIsRjpbXSxsaXN0ZW5Qcm9ncmVzczpmdW5jdGlvbihhKXtzamNsLm1vZGUuY2NtLkYucHVzaChhKX0sdW5MaXN0ZW5Qcm9ncmVzczpmdW5jdGlvbihhKXthPXNqY2wubW9kZS5jY20uRi5pbmRleE9mKGEpOy0xPGEmJnNqY2wubW9kZS5jY20uRi5zcGxpY2UoYSwxKX0sZGE6ZnVuY3Rpb24oYSl7dmFyIGI9c2pjbC5tb2RlLmNjbS5GLnNsaWNlKCksYztmb3IoYz0wO2M8Yi5sZW5ndGg7Yys9MSliW2NdKGEpfSxlbmNyeXB0OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZz1iLnNsaWNlKDApLGg9c2pjbC5iaXRBcnJheSxrPWguYml0TGVuZ3RoKGMpLzgsbj1oLmJpdExlbmd0aChnKS84O2U9ZXx8NjQ7ZD1kfHxbXTtpZig3PmspdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGl2IG11c3QgYmUgYXQgbGVhc3QgNyBieXRlc1wiKTtmb3IoZj0yOzQ+ZiYmbj4+PjgqZjtmKyspO2Y8MTUtayYmKGY9MTUtayk7Yz1oLmNsYW1wKGMsXG44KigxNS1mKSk7Yj1zamNsLm1vZGUuY2NtLlUoYSxiLGMsZCxlLGYpO2c9c2pjbC5tb2RlLmNjbS5WKGEsZyxjLGIsZSxmKTtyZXR1cm4gaC5jb25jYXQoZy5kYXRhLGcudGFnKX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkLGUpe2U9ZXx8NjQ7ZD1kfHxbXTt2YXIgZj1zamNsLmJpdEFycmF5LGc9Zi5iaXRMZW5ndGgoYykvOCxoPWYuYml0TGVuZ3RoKGIpLGs9Zi5jbGFtcChiLGgtZSksbj1mLmJpdFNsaWNlKGIsaC1lKSxoPShoLWUpLzg7aWYoNz5nKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpdiBtdXN0IGJlIGF0IGxlYXN0IDcgYnl0ZXNcIik7Zm9yKGI9Mjs0PmImJmg+Pj44KmI7YisrKTtiPDE1LWcmJihiPTE1LWcpO2M9Zi5jbGFtcChjLDgqKDE1LWIpKTtrPXNqY2wubW9kZS5jY20uVihhLGssYyxuLGUsYik7YT1zamNsLm1vZGUuY2NtLlUoYSxrLmRhdGEsYyxkLGUsYik7aWYoIWYuZXF1YWwoay50YWcsYSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmNvcnJ1cHQoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpO1xucmV0dXJuIGsuZGF0YX0sbWE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPVtdLGg9c2pjbC5iaXRBcnJheSxrPWguUDtkPVtoLnBhcnRpYWwoOCwoYi5sZW5ndGg/NjQ6MCl8ZC0yPDwyfGYtMSldO2Q9aC5jb25jYXQoZCxjKTtkWzNdfD1lO2Q9YS5lbmNyeXB0KGQpO2lmKGIubGVuZ3RoKWZvcihjPWguYml0TGVuZ3RoKGIpLzgsNjUyNzk+PWM/Zz1baC5wYXJ0aWFsKDE2LGMpXToweGZmZmZmZmZmPj1jJiYoZz1oLmNvbmNhdChbaC5wYXJ0aWFsKDE2LDY1NTM0KV0sW2NdKSksZz1oLmNvbmNhdChnLGIpLGI9MDtiPGcubGVuZ3RoO2IrPTQpZD1hLmVuY3J5cHQoayhkLGcuc2xpY2UoYixiKzQpLmNvbmNhdChbMCwwLDBdKSkpO3JldHVybiBkfSxVOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1zamNsLmJpdEFycmF5LGg9Zy5QO2UvPTg7aWYoZSUyfHw0PmV8fDE2PGUpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGludmFsaWQgdGFnIGxlbmd0aFwiKTtcbmlmKDB4ZmZmZmZmZmY8ZC5sZW5ndGh8fDB4ZmZmZmZmZmY8Yi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImNjbTogY2FuJ3QgZGVhbCB3aXRoIDRHaUIgb3IgbW9yZSBkYXRhXCIpO2M9c2pjbC5tb2RlLmNjbS5tYShhLGQsYyxlLGcuYml0TGVuZ3RoKGIpLzgsZik7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrPTQpYz1hLmVuY3J5cHQoaChjLGIuc2xpY2UoZCxkKzQpLmNvbmNhdChbMCwwLDBdKSkpO3JldHVybiBnLmNsYW1wKGMsOCplKX0sVjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGcsaD1zamNsLmJpdEFycmF5O2c9aC5QO3ZhciBrPWIubGVuZ3RoLG49aC5iaXRMZW5ndGgoYiksbD1rLzUwLG09bDtjPWguY29uY2F0KFtoLnBhcnRpYWwoOCxmLTEpXSxjKS5jb25jYXQoWzAsMCwwXSkuc2xpY2UoMCw0KTtkPWguYml0U2xpY2UoZyhkLGEuZW5jcnlwdChjKSksMCxlKTtpZighaylyZXR1cm57dGFnOmQsZGF0YTpbXX07Zm9yKGc9MDtnPGs7Zys9NClnPmwmJihzamNsLm1vZGUuY2NtLmRhKGcvXG5rKSxsKz1tKSxjWzNdKyssZT1hLmVuY3J5cHQoYyksYltnXV49ZVswXSxiW2crMV1ePWVbMV0sYltnKzJdXj1lWzJdLGJbZyszXV49ZVszXTtyZXR1cm57dGFnOmQsZGF0YTpoLmNsYW1wKGIsbil9fX07c2pjbC5taXNjLmhtYWM9ZnVuY3Rpb24oYSxiKXt0aGlzLlc9Yj1ifHxzamNsLmhhc2guc2hhMjU2O3ZhciBjPVtbXSxbXV0sZCxlPWIucHJvdG90eXBlLmJsb2NrU2l6ZS8zMjt0aGlzLkI9W25ldyBiLG5ldyBiXTthLmxlbmd0aD5lJiYoYT1iLmhhc2goYSkpO2ZvcihkPTA7ZDxlO2QrKyljWzBdW2RdPWFbZF1eOTA5NTIyNDg2LGNbMV1bZF09YVtkXV4xNTQ5NTU2ODI4O3RoaXMuQlswXS51cGRhdGUoY1swXSk7dGhpcy5CWzFdLnVwZGF0ZShjWzFdKTt0aGlzLk89bmV3IGIodGhpcy5CWzBdKX07XG5zamNsLm1pc2MuaG1hYy5wcm90b3R5cGUuZW5jcnlwdD1zamNsLm1pc2MuaG1hYy5wcm90b3R5cGUubWFjPWZ1bmN0aW9uKGEpe2lmKHRoaXMuWil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImVuY3J5cHQgb24gYWxyZWFkeSB1cGRhdGVkIGhtYWMgY2FsbGVkIVwiKTt0aGlzLnVwZGF0ZShhKTtyZXR1cm4gdGhpcy5kaWdlc3QoYSl9O3NqY2wubWlzYy5obWFjLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuTz1uZXcgdGhpcy5XKHRoaXMuQlswXSk7dGhpcy5aPSExfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMuWj0hMDt0aGlzLk8udXBkYXRlKGEpfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5PLmZpbmFsaXplKCksYT0obmV3IHRoaXMuVyh0aGlzLkJbMV0pKS51cGRhdGUoYSkuZmluYWxpemUoKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGF9O1xuc2pjbC5taXNjLnBia2RmMj1mdW5jdGlvbihhLGIsYyxkLGUpe2M9Y3x8MUU0O2lmKDA+ZHx8MD5jKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52YWxpZCBwYXJhbXMgdG8gcGJrZGYyXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYSYmKGE9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGIpKTtlPWV8fHNqY2wubWlzYy5obWFjO2E9bmV3IGUoYSk7dmFyIGYsZyxoLGssbj1bXSxsPXNqY2wuYml0QXJyYXk7Zm9yKGs9MTszMipuLmxlbmd0aDwoZHx8MSk7aysrKXtlPWY9YS5lbmNyeXB0KGwuY29uY2F0KGIsW2tdKSk7Zm9yKGc9MTtnPGM7ZysrKWZvcihmPWEuZW5jcnlwdChmKSxoPTA7aDxmLmxlbmd0aDtoKyspZVtoXV49ZltoXTtuPW4uY29uY2F0KGUpfWQmJihuPWwuY2xhbXAobixkKSk7cmV0dXJuIG59O1xuc2pjbC5wcm5nPWZ1bmN0aW9uKGEpe3RoaXMuaD1bbmV3IHNqY2wuaGFzaC5zaGEyNTZdO3RoaXMucz1bMF07dGhpcy5OPTA7dGhpcy5HPXt9O3RoaXMuTT0wO3RoaXMuVD17fTt0aGlzLlg9dGhpcy5pPXRoaXMudT10aGlzLmZhPTA7dGhpcy5iPVswLDAsMCwwLDAsMCwwLDBdO3RoaXMubT1bMCwwLDAsMF07dGhpcy5LPXZvaWQgMDt0aGlzLkw9YTt0aGlzLkQ9ITE7dGhpcy5KPXtwcm9ncmVzczp7fSxzZWVkZWQ6e319O3RoaXMuQT10aGlzLmVhPTA7dGhpcy5IPTE7dGhpcy5JPTI7dGhpcy5hYT0weDEwMDAwO3RoaXMuUj1bMCw0OCw2NCw5NiwxMjgsMTkyLDB4MTAwLDM4NCw1MTIsNzY4LDEwMjRdO3RoaXMuYmE9M0U0O3RoaXMuJD04MH07XG5zamNsLnBybmcucHJvdG90eXBlPXtyYW5kb21Xb3JkczpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ7ZD10aGlzLmlzUmVhZHkoYik7dmFyIGU7aWYoZD09PXRoaXMuQSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24ubm90UmVhZHkoXCJnZW5lcmF0b3IgaXNuJ3Qgc2VlZGVkXCIpO2lmKGQmdGhpcy5JKXtkPSEoZCZ0aGlzLkgpO2U9W107dmFyIGY9MCxnO3RoaXMuWD1lWzBdPShuZXcgRGF0ZSkudmFsdWVPZigpK3RoaXMuYmE7Zm9yKGc9MDsxNj5nO2crKyllLnB1c2goMHgxMDAwMDAwMDAqTWF0aC5yYW5kb20oKXwwKTtmb3IoZz0wO2c8dGhpcy5oLmxlbmd0aCYmKGU9ZS5jb25jYXQodGhpcy5oW2ddLmZpbmFsaXplKCkpLGYrPXRoaXMuc1tnXSx0aGlzLnNbZ109MCxkfHwhKHRoaXMuTiYxPDxnKSk7ZysrKTt0aGlzLk4+PTE8PHRoaXMuaC5sZW5ndGgmJih0aGlzLmgucHVzaChuZXcgc2pjbC5oYXNoLnNoYTI1NiksdGhpcy5zLnB1c2goMCkpO3RoaXMuaS09ZjtmPnRoaXMudSYmKHRoaXMudT1cbmYpO3RoaXMuTisrO3RoaXMuYj1zamNsLmhhc2guc2hhMjU2Lmhhc2godGhpcy5iLmNvbmNhdChlKSk7dGhpcy5LPW5ldyBzamNsLmNpcGhlci5hZXModGhpcy5iKTtmb3IoZD0wOzQ+ZCYmKHRoaXMubVtkXT10aGlzLm1bZF0rMXwwLCF0aGlzLm1bZF0pO2QrKyk7fWZvcihkPTA7ZDxhO2QrPTQpMD09PShkKzEpJXRoaXMuYWEmJmJhKHRoaXMpLGU9Tih0aGlzKSxjLnB1c2goZVswXSxlWzFdLGVbMl0sZVszXSk7YmEodGhpcyk7cmV0dXJuIGMuc2xpY2UoMCxhKX0sc2V0RGVmYXVsdFBhcmFub2lhOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEmJlwiU2V0dGluZyBwYXJhbm9pYT0wIHdpbGwgcnVpbiB5b3VyIHNlY3VyaXR5OyB1c2UgaXQgb25seSBmb3IgdGVzdGluZ1wiIT09Yil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIlNldHRpbmcgcGFyYW5vaWE9MCB3aWxsIHJ1aW4geW91ciBzZWN1cml0eTsgdXNlIGl0IG9ubHkgZm9yIHRlc3RpbmdcIik7dGhpcy5MPWF9LGFkZEVudHJvcHk6ZnVuY3Rpb24oYSxcbmIsYyl7Yz1jfHxcInVzZXJcIjt2YXIgZCxlLGY9KG5ldyBEYXRlKS52YWx1ZU9mKCksZz10aGlzLkdbY10saD10aGlzLmlzUmVhZHkoKSxrPTA7ZD10aGlzLlRbY107dm9pZCAwPT09ZCYmKGQ9dGhpcy5UW2NdPXRoaXMuZmErKyk7dm9pZCAwPT09ZyYmKGc9dGhpcy5HW2NdPTApO3RoaXMuR1tjXT0odGhpcy5HW2NdKzEpJXRoaXMuaC5sZW5ndGg7c3dpdGNoKHR5cGVvZiBhKXtjYXNlIFwibnVtYmVyXCI6dm9pZCAwPT09YiYmKGI9MSk7dGhpcy5oW2ddLnVwZGF0ZShbZCx0aGlzLk0rKywxLGIsZiwxLGF8MF0pO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpjPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTtpZihcIltvYmplY3QgVWludDMyQXJyYXldXCI9PT1jKXtlPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZS5wdXNoKGFbY10pO2E9ZX1lbHNlIGZvcihcIltvYmplY3QgQXJyYXldXCIhPT1jJiYoaz0xKSxjPTA7YzxhLmxlbmd0aCYmIWs7YysrKVwibnVtYmVyXCIhPT10eXBlb2YgYVtjXSYmXG4oaz0xKTtpZighayl7aWYodm9pZCAwPT09Yilmb3IoYz1iPTA7YzxhLmxlbmd0aDtjKyspZm9yKGU9YVtjXTswPGU7KWIrKyxlPWU+Pj4xO3RoaXMuaFtnXS51cGRhdGUoW2QsdGhpcy5NKyssMixiLGYsYS5sZW5ndGhdLmNvbmNhdChhKSl9YnJlYWs7Y2FzZSBcInN0cmluZ1wiOnZvaWQgMD09PWImJihiPWEubGVuZ3RoKTt0aGlzLmhbZ10udXBkYXRlKFtkLHRoaXMuTSsrLDMsYixmLGEubGVuZ3RoXSk7dGhpcy5oW2ddLnVwZGF0ZShhKTticmVhaztkZWZhdWx0Oms9MX1pZihrKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJyYW5kb206IGFkZEVudHJvcHkgb25seSBzdXBwb3J0cyBudW1iZXIsIGFycmF5IG9mIG51bWJlcnMgb3Igc3RyaW5nXCIpO3RoaXMuc1tnXSs9Yjt0aGlzLmkrPWI7aD09PXRoaXMuQSYmKHRoaXMuaXNSZWFkeSgpIT09dGhpcy5BJiZjYShcInNlZWRlZFwiLE1hdGgubWF4KHRoaXMudSx0aGlzLmkpKSxjYShcInByb2dyZXNzXCIsdGhpcy5nZXRQcm9ncmVzcygpKSl9LFxuaXNSZWFkeTpmdW5jdGlvbihhKXthPXRoaXMuUlt2b2lkIDAhPT1hP2E6dGhpcy5MXTtyZXR1cm4gdGhpcy51JiZ0aGlzLnU+PWE/dGhpcy5zWzBdPnRoaXMuJCYmKG5ldyBEYXRlKS52YWx1ZU9mKCk+dGhpcy5YP3RoaXMuSXx0aGlzLkg6dGhpcy5IOnRoaXMuaT49YT90aGlzLkl8dGhpcy5BOnRoaXMuQX0sZ2V0UHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT10aGlzLlJbYT9hOnRoaXMuTF07cmV0dXJuIHRoaXMudT49YT8xOnRoaXMuaT5hPzE6dGhpcy5pL2F9LHN0YXJ0Q29sbGVjdG9yczpmdW5jdGlvbigpe2lmKCF0aGlzLkQpe3RoaXMuYT17bG9hZFRpbWVDb2xsZWN0b3I6Tyh0aGlzLHRoaXMubGEpLG1vdXNlQ29sbGVjdG9yOk8odGhpcyx0aGlzLm5hKSxrZXlib2FyZENvbGxlY3RvcjpPKHRoaXMsdGhpcy5qYSksYWNjZWxlcm9tZXRlckNvbGxlY3RvcjpPKHRoaXMsdGhpcy5jYSksdG91Y2hDb2xsZWN0b3I6Tyh0aGlzLHRoaXMucGEpfTtpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixcbnRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLmEubW91c2VDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZGV2aWNlbW90aW9uXCIsdGhpcy5hLmFjY2VsZXJvbWV0ZXJDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5hLnRvdWNoQ29sbGVjdG9yLCExKTtlbHNlIGlmKGRvY3VtZW50LmF0dGFjaEV2ZW50KWRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25sb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yKSxkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yKSxkb2N1bWVudC5hdHRhY2hFdmVudChcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yKTtlbHNlIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJjYW4ndCBhdHRhY2ggZXZlbnRcIik7XG50aGlzLkQ9ITB9fSxzdG9wQ29sbGVjdG9yczpmdW5jdGlvbigpe3RoaXMuRCYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyPyh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIix0aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRldmljZW1vdGlvblwiLHRoaXMuYS5hY2NlbGVyb21ldGVyQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuYS50b3VjaENvbGxlY3RvciwhMSkpOmRvY3VtZW50LmRldGFjaEV2ZW50JiYoZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJvbmxvYWRcIix0aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IpLGRvY3VtZW50LmRldGFjaEV2ZW50KFwib25tb3VzZW1vdmVcIixcbnRoaXMuYS5tb3VzZUNvbGxlY3RvciksZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3RvcikpLHRoaXMuRD0hMSl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLkpbYV1bdGhpcy5lYSsrXT1ifSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPXRoaXMuSlthXSxmPVtdO2ZvcihkIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShkKSYmZVtkXT09PWImJmYucHVzaChkKTtmb3IoYz0wO2M8Zi5sZW5ndGg7YysrKWQ9ZltjXSxkZWxldGUgZVtkXX0samE6ZnVuY3Rpb24oKXtUKHRoaXMsMSl9LG5hOmZ1bmN0aW9uKGEpe3ZhciBiLGM7dHJ5e2I9YS54fHxhLmNsaWVudFh8fGEub2Zmc2V0WHx8MCxjPWEueXx8YS5jbGllbnRZfHxhLm9mZnNldFl8fDB9Y2F0Y2goZCl7Yz1iPTB9MCE9YiYmMCE9YyYmdGhpcy5hZGRFbnRyb3B5KFtiLGNdLDIsXCJtb3VzZVwiKTtUKHRoaXMsMCl9LHBhOmZ1bmN0aW9uKGEpe2E9XG5hLnRvdWNoZXNbMF18fGEuY2hhbmdlZFRvdWNoZXNbMF07dGhpcy5hZGRFbnRyb3B5KFthLnBhZ2VYfHxhLmNsaWVudFgsYS5wYWdlWXx8YS5jbGllbnRZXSwxLFwidG91Y2hcIik7VCh0aGlzLDApfSxsYTpmdW5jdGlvbigpe1QodGhpcywyKX0sY2E6ZnVuY3Rpb24oYSl7YT1hLmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkueHx8YS5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lnl8fGEuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS56O2lmKHdpbmRvdy5vcmllbnRhdGlvbil7dmFyIGI9d2luZG93Lm9yaWVudGF0aW9uO1wibnVtYmVyXCI9PT10eXBlb2YgYiYmdGhpcy5hZGRFbnRyb3B5KGIsMSxcImFjY2VsZXJvbWV0ZXJcIil9YSYmdGhpcy5hZGRFbnRyb3B5KGEsMixcImFjY2VsZXJvbWV0ZXJcIik7VCh0aGlzLDApfX07XG5mdW5jdGlvbiBjYShhLGIpe3ZhciBjLGQ9c2pjbC5yYW5kb20uSlthXSxlPVtdO2ZvcihjIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShjKSYmZS5wdXNoKGRbY10pO2ZvcihjPTA7YzxlLmxlbmd0aDtjKyspZVtjXShiKX1mdW5jdGlvbiBUKGEsYil7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5wZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3c/YS5hZGRFbnRyb3B5KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSxiLFwibG9hZHRpbWVcIik6YS5hZGRFbnRyb3B5KChuZXcgRGF0ZSkudmFsdWVPZigpLGIsXCJsb2FkdGltZVwiKX1mdW5jdGlvbiBiYShhKXthLmI9TihhKS5jb25jYXQoTihhKSk7YS5LPW5ldyBzamNsLmNpcGhlci5hZXMoYS5iKX1mdW5jdGlvbiBOKGEpe2Zvcih2YXIgYj0wOzQ+YiYmKGEubVtiXT1hLm1bYl0rMXwwLCFhLm1bYl0pO2IrKyk7cmV0dXJuIGEuSy5lbmNyeXB0KGEubSl9XG5mdW5jdGlvbiBPKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5hcHBseShhLGFyZ3VtZW50cyl9fXNqY2wucmFuZG9tPW5ldyBzamNsLnBybmcoNik7XG5hOnRyeXt2YXIgVSxkYSxaLGhhO2lmKGhhPVwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyl7dmFyIGlhO3RyeXtpYT1yZXF1aXJlKFwiY3J5cHRvXCIpfWNhdGNoKGEpe2lhPW51bGx9aGE9ZGE9aWF9aWYoaGEmJmRhLnJhbmRvbUJ5dGVzKVU9ZGEucmFuZG9tQnl0ZXMoMTI4KSxVPW5ldyBVaW50MzJBcnJheSgobmV3IFVpbnQ4QXJyYXkoVSkpLmJ1ZmZlciksc2pjbC5yYW5kb20uYWRkRW50cm9weShVLDEwMjQsXCJjcnlwdG9bJ3JhbmRvbUJ5dGVzJ11cIik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7Wj1uZXcgVWludDMyQXJyYXkoMzIpO2lmKHdpbmRvdy5jcnlwdG8mJndpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFopO2Vsc2UgaWYod2luZG93Lm1zQ3J5cHRvJiZ3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoWik7XG5lbHNlIGJyZWFrIGE7c2pjbC5yYW5kb20uYWRkRW50cm9weShaLDEwMjQsXCJjcnlwdG9bJ2dldFJhbmRvbVZhbHVlcyddXCIpfX1jYXRjaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJihjb25zb2xlLmxvZyhcIlRoZXJlIHdhcyBhbiBlcnJvciBjb2xsZWN0aW5nIGVudHJvcHkgZnJvbSB0aGUgYnJvd3NlcjpcIiksY29uc29sZS5sb2coYSkpfVxuc2pjbC5qc29uPXtkZWZhdWx0czp7djoxLGl0ZXI6MUU0LGtzOjEyOCx0czo2NCxtb2RlOlwiY2NtXCIsYWRhdGE6XCJcIixjaXBoZXI6XCJhZXNcIn0saGE6ZnVuY3Rpb24oYSxiLGMsZCl7Yz1jfHx7fTtkPWR8fHt9O3ZhciBlPXNqY2wuanNvbixmPWUuaih7aXY6c2pjbC5yYW5kb20ucmFuZG9tV29yZHMoNCwwKX0sZS5kZWZhdWx0cyksZztlLmooZixjKTtjPWYuYWRhdGE7XCJzdHJpbmdcIj09PXR5cGVvZiBmLnNhbHQmJihmLnNhbHQ9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGYuc2FsdCkpO1wic3RyaW5nXCI9PT10eXBlb2YgZi5pdiYmKGYuaXY9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGYuaXYpKTtpZighc2pjbC5tb2RlW2YubW9kZV18fCFzamNsLmNpcGhlcltmLmNpcGhlcl18fFwic3RyaW5nXCI9PT10eXBlb2YgYSYmMTAwPj1mLml0ZXJ8fDY0IT09Zi50cyYmOTYhPT1mLnRzJiYxMjghPT1mLnRzfHwxMjghPT1mLmtzJiYxOTIhPT1mLmtzJiYweDEwMCE9PWYua3N8fDI+Zi5pdi5sZW5ndGh8fFxuNDxmLml2Lmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZW5jcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYT8oZz1zamNsLm1pc2MuY2FjaGVkUGJrZGYyKGEsZiksYT1nLmtleS5zbGljZSgwLGYua3MvMzIpLGYuc2FsdD1nLnNhbHQpOnNqY2wuZWNjJiZhIGluc3RhbmNlb2Ygc2pjbC5lY2MuZWxHYW1hbC5wdWJsaWNLZXkmJihnPWEua2VtKCksZi5rZW10YWc9Zy50YWcsYT1nLmtleS5zbGljZSgwLGYua3MvMzIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGImJihiPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYikpO1wic3RyaW5nXCI9PT10eXBlb2YgYyYmKGYuYWRhdGE9Yz1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGMpKTtnPW5ldyBzamNsLmNpcGhlcltmLmNpcGhlcl0oYSk7ZS5qKGQsZik7ZC5rZXk9YTtmLmN0PVwiY2NtXCI9PT1mLm1vZGUmJnNqY2wuYXJyYXlCdWZmZXImJnNqY2wuYXJyYXlCdWZmZXIuY2NtJiZcbmIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9zamNsLmFycmF5QnVmZmVyLmNjbS5lbmNyeXB0KGcsYixmLml2LGMsZi50cyk6c2pjbC5tb2RlW2YubW9kZV0uZW5jcnlwdChnLGIsZi5pdixjLGYudHMpO3JldHVybiBmfSxlbmNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXNqY2wuanNvbixmPWUuaGEuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBlLmVuY29kZShmKX0sZ2E6ZnVuY3Rpb24oYSxiLGMsZCl7Yz1jfHx7fTtkPWR8fHt9O3ZhciBlPXNqY2wuanNvbjtiPWUuaihlLmooZS5qKHt9LGUuZGVmYXVsdHMpLGIpLGMsITApO3ZhciBmLGc7Zj1iLmFkYXRhO1wic3RyaW5nXCI9PT10eXBlb2YgYi5zYWx0JiYoYi5zYWx0PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhiLnNhbHQpKTtcInN0cmluZ1wiPT09dHlwZW9mIGIuaXYmJihiLml2PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhiLml2KSk7aWYoIXNqY2wubW9kZVtiLm1vZGVdfHwhc2pjbC5jaXBoZXJbYi5jaXBoZXJdfHxcInN0cmluZ1wiPT09XG50eXBlb2YgYSYmMTAwPj1iLml0ZXJ8fDY0IT09Yi50cyYmOTYhPT1iLnRzJiYxMjghPT1iLnRzfHwxMjghPT1iLmtzJiYxOTIhPT1iLmtzJiYweDEwMCE9PWIua3N8fCFiLml2fHwyPmIuaXYubGVuZ3RofHw0PGIuaXYubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBkZWNyeXB0OiBpbnZhbGlkIHBhcmFtZXRlcnNcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBhPyhnPXNqY2wubWlzYy5jYWNoZWRQYmtkZjIoYSxiKSxhPWcua2V5LnNsaWNlKDAsYi5rcy8zMiksYi5zYWx0PWcuc2FsdCk6c2pjbC5lY2MmJmEgaW5zdGFuY2VvZiBzamNsLmVjYy5lbEdhbWFsLnNlY3JldEtleSYmKGE9YS51bmtlbShzamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5rZW10YWcpKS5zbGljZSgwLGIua3MvMzIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoZikpO2c9bmV3IHNqY2wuY2lwaGVyW2IuY2lwaGVyXShhKTtmPVwiY2NtXCI9PT1cbmIubW9kZSYmc2pjbC5hcnJheUJ1ZmZlciYmc2pjbC5hcnJheUJ1ZmZlci5jY20mJmIuY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9zamNsLmFycmF5QnVmZmVyLmNjbS5kZWNyeXB0KGcsYi5jdCxiLml2LGIudGFnLGYsYi50cyk6c2pjbC5tb2RlW2IubW9kZV0uZGVjcnlwdChnLGIuY3QsYi5pdixmLGIudHMpO2UuaihkLGIpO2Qua2V5PWE7cmV0dXJuIDE9PT1jLnJhdz9mOnNqY2wuY29kZWMudXRmOFN0cmluZy5mcm9tQml0cyhmKX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1zamNsLmpzb247cmV0dXJuIGUuZ2EoYSxlLmRlY29kZShiKSxjLGQpfSxlbmNvZGU6ZnVuY3Rpb24oYSl7dmFyIGIsYz1cIntcIixkPVwiXCI7Zm9yKGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXtpZighYi5tYXRjaCgvXlthLXowLTldKyQvaSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGVuY29kZTogaW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpO2MrPWQrJ1wiJytcbmIrJ1wiOic7ZD1cIixcIjtzd2l0Y2godHlwZW9mIGFbYl0pe2Nhc2UgXCJudW1iZXJcIjpjYXNlIFwiYm9vbGVhblwiOmMrPWFbYl07YnJlYWs7Y2FzZSBcInN0cmluZ1wiOmMrPSdcIicrZXNjYXBlKGFbYl0pKydcIic7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOmMrPSdcIicrc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoYVtiXSwwKSsnXCInO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImpzb24gZW5jb2RlOiB1bnN1cHBvcnRlZCB0eXBlXCIpO319cmV0dXJuIGMrXCJ9XCJ9LGRlY29kZTpmdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzL2csXCJcIik7aWYoIWEubWF0Y2goL15cXHsuKlxcfSQvKSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjb2RlOiB0aGlzIGlzbid0IGpzb24hXCIpO2E9YS5yZXBsYWNlKC9eXFx7fFxcfSQvZyxcIlwiKS5zcGxpdCgvLC8pO3ZhciBiPXt9LGMsZDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXtpZighKGQ9YVtjXS5tYXRjaCgvXlxccyooPzooW1wiJ10/KShbYS16XVthLXowLTldKilcXDEpXFxzKjpcXHMqKD86KC0/XFxkKyl8XCIoW2EtejAtOStcXC8lKl8uQD1cXC1dKilcInwodHJ1ZXxmYWxzZSkpJC9pKSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY29kZTogdGhpcyBpc24ndCBqc29uIVwiKTtcbm51bGwhPWRbM10/YltkWzJdXT1wYXJzZUludChkWzNdLDEwKTpudWxsIT1kWzRdP2JbZFsyXV09ZFsyXS5tYXRjaCgvXihjdHxhZGF0YXxzYWx0fGl2KSQvKT9zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoZFs0XSk6dW5lc2NhcGUoZFs0XSk6bnVsbCE9ZFs1XSYmKGJbZFsyXV09XCJ0cnVlXCI9PT1kWzVdKX1yZXR1cm4gYn0sajpmdW5jdGlvbihhLGIsYyl7dm9pZCAwPT09YSYmKGE9e30pO2lmKHZvaWQgMD09PWIpcmV0dXJuIGE7Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSl7aWYoYyYmdm9pZCAwIT09YVtkXSYmYVtkXSE9PWJbZF0pdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJyZXF1aXJlZCBwYXJhbWV0ZXIgb3ZlcnJpZGRlblwiKTthW2RdPWJbZF19cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9e30sZDtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0hPT1iW2RdJiYoY1tkXT1hW2RdKTtyZXR1cm4gY30scWE6ZnVuY3Rpb24oYSxcbmIpe3ZhciBjPXt9LGQ7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyl2b2lkIDAhPT1hW2JbZF1dJiYoY1tiW2RdXT1hW2JbZF1dKTtyZXR1cm4gY319O3NqY2wuZW5jcnlwdD1zamNsLmpzb24uZW5jcnlwdDtzamNsLmRlY3J5cHQ9c2pjbC5qc29uLmRlY3J5cHQ7c2pjbC5taXNjLm9hPXt9O3NqY2wubWlzYy5jYWNoZWRQYmtkZjI9ZnVuY3Rpb24oYSxiKXt2YXIgYz1zamNsLm1pc2Mub2EsZDtiPWJ8fHt9O2Q9Yi5pdGVyfHwxRTM7Yz1jW2FdPWNbYV18fHt9O2Q9Y1tkXT1jW2RdfHx7Zmlyc3RTYWx0OmIuc2FsdCYmYi5zYWx0Lmxlbmd0aD9iLnNhbHQuc2xpY2UoMCk6c2pjbC5yYW5kb20ucmFuZG9tV29yZHMoMiwwKX07Yz12b2lkIDA9PT1iLnNhbHQ/ZC5maXJzdFNhbHQ6Yi5zYWx0O2RbY109ZFtjXXx8c2pjbC5taXNjLnBia2RmMihhLGMsYi5pdGVyKTtyZXR1cm57a2V5OmRbY10uc2xpY2UoMCksc2FsdDpjLnNsaWNlKDApfX07XG5cInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1zamNsKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gc2pjbH0pO1xuIiwgImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgV09SS0VSX0FDVElPTiB9IGZyb20gXCJ+L2VudW0vd29ya2VyLWFjdGlvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBMdWZpRmlsZSB9IGZyb20gXCJ+L2VudGl0aWVzL2x1ZmktZmlsZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJFdmVudCB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItZXZlbnQudHNcIjtcblxuZGVjbGFyZSBsZXQgc2VsZjogV29ya2VyO1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4vKipcbiAqIFVwZGF0ZSBmaWxlIGluIHdvcmtlcnMgYW5kIHByb3ZpZGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgbWFpbiB0aHJlYWRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRmlsZSA9IChsdWZpRmlsZTogTHVmaUZpbGUsIGFyZ3M6IFBhcnRpYWw8THVmaUZpbGU+KSA9PiB7XG4gIE9iamVjdC5hc3NpZ24obHVmaUZpbGUsIGFyZ3MpO1xuXG4gIGlmICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBFVkVOVC5GSUxFX1VQREFURUQsXG4gICAgICBsdWZpRmlsZSxcbiAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiBsdWZpRmlsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kRmlsZUVycm9yID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSwgZXJyb3I6IEVycm9yKSA9PiB7XG4gIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgdXBsb2FkU3RhdHVzOiBVUExPQURfU1RBVFVTLkZBSUxFRCB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0gYXMgV29ya2VyRXZlbnQpO1xufTtcblxuLyoqXG4gKiBJbml0IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY2hpbGQgd29ya2VyJ3Mgb25tZXNzYWdlIGV2ZW50LlxuICovXG5leHBvcnQgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgZXZlbnRzLm9uY2UoRVZFTlQuU09DS0VUX09QRU5FRCwgKCkgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULlNPQ0tFVF9PUEVORUQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGV2ZW50cy5vbmNlKEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1dvcmtlckFjdGlvbk1lc3NhZ2UgPSAoXG4gIC8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG4gIG1lc3NhZ2U6IGFueSxcbik6IG1lc3NhZ2UgaXMgV29ya2VyQWN0aW9uTWVzc2FnZSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICBtZXNzYWdlICE9PSBudWxsICYmXG4gICAgXCJhY3Rpb25cIiBpbiBtZXNzYWdlICYmXG4gICAgT2JqZWN0LnZhbHVlcyhXT1JLRVJfQUNUSU9OKS5pbmNsdWRlcyhtZXNzYWdlLmFjdGlvbilcbiAgKTtcbn07XG4iLCAiY29uc3QgZGVmYXVsdEVycm9yQ29uZmlnID0ge1xyXG4gICAgd2l0aFN0YWNrVHJhY2U6IGZhbHNlLFxyXG59O1xyXG4vLyBDdXN0b20gZXJyb3Igb2JqZWN0XHJcbi8vIENvbnRleHQgLyBkaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtYWNyby9uZXZlcnRocm93L3B1bGwvMjE1XHJcbmNvbnN0IGNyZWF0ZU5ldmVyVGhyb3dFcnJvciA9IChtZXNzYWdlLCByZXN1bHQsIGNvbmZpZyA9IGRlZmF1bHRFcnJvckNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHJlc3VsdC5pc09rKClcclxuICAgICAgICA/IHsgdHlwZTogJ09rJywgdmFsdWU6IHJlc3VsdC52YWx1ZSB9XHJcbiAgICAgICAgOiB7IHR5cGU6ICdFcnInLCB2YWx1ZTogcmVzdWx0LmVycm9yIH07XHJcbiAgICBjb25zdCBtYXliZVN0YWNrID0gY29uZmlnLndpdGhTdGFja1RyYWNlID8gbmV3IEVycm9yKCkuc3RhY2sgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBzdGFjazogbWF5YmVTdGFjayxcclxuICAgIH07XHJcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuY2xhc3MgUmVzdWx0QXN5bmMge1xyXG4gICAgY29uc3RydWN0b3IocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU2FmZVByb21pc2UocHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yRm4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZVxyXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbmV3IEVycihlcnJvckZuKGUpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBzdGF0aWMgZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZm4oLi4uYXJncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoZXJyb3JGbiA/IGVycm9yRm4oZXJyb3IpIDogZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSkoKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0KGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZVdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZihyZXMudmFsdWUpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzID0geWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKG5ld1Jlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRlZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNPaygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoeWllbGQgZihyZXMuZXJyb3IpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRBc3luYyA/IG5ld1ZhbHVlLl9wcm9taXNlIDogbmV3VmFsdWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLm1hdGNoKG9rLCBfZXJyKSk7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMudW53cmFwT3IodCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gOS4wLjAuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiB1c2UgYHNhZmVUcnlgIHdpdGhvdXQgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogc2FmZVRyeShhc3luYyBmdW5jdGlvbiogKCkge1xyXG4gICAgICogICBjb25zdCBva1ZhbHVlID0geWllbGQqIHlvdXJSZXN1bHRcclxuICAgICAqIH0pXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEVtdWxhdGVzIFJ1c3QncyBgP2Agb3BlcmF0b3IgaW4gYHNhZmVUcnlgJ3MgYm9keS4gU2VlIGFsc28gYHNhZmVUcnlgLlxyXG4gICAgICovXHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHNhZmVVbndyYXBfMSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5zYWZlVW53cmFwKCkpKSkpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBNYWtlcyBSZXN1bHRBc3luYyBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8UmVzdWx0PlxyXG4gICAgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZXJyQXN5bmMocmVzdWx0LmVycm9yKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb2tBc3luYyA9ICh2YWx1ZSkgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgT2sodmFsdWUpKSk7XHJcbmNvbnN0IGVyckFzeW5jID0gKGVycikgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgRXJyKGVycikpKTtcclxuY29uc3QgZnJvbVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZTtcclxuY29uc3QgZnJvbVNhZmVQcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlO1xyXG5jb25zdCBmcm9tQXN5bmNUaHJvd2FibGUgPSBSZXN1bHRBc3luYy5mcm9tVGhyb3dhYmxlO1xuXG4vKipcclxuICogU2hvcnQgY2lyY3VpdHMgb24gdGhlIEZJUlNUIEVyciB2YWx1ZSB0aGF0IHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0ID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFjYy5tYXAoKGxpc3QpID0+IGxpc3QucHVzaChyZXN1bHQudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG4vKiBUaGlzIGlzIHRoZSB0eXBlc2FmZSB2ZXJzaW9uIG9mIFByb21pc2UuYWxsXHJcbiAqXHJcbiAqIFRha2VzIGEgbGlzdCBvZiBSZXN1bHRBc3luYzxULCBFPiBhbmQgc3VjY2VzcyBpZiBhbGwgaW5uZXIgcmVzdWx0cyBhcmUgT2sgdmFsdWVzXHJcbiAqIG9yIGZhaWxzIGlmIG9uZSAob3IgbW9yZSkgb2YgdGhlIGlubmVyIHJlc3VsdHMgYXJlIEVyciB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3QgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdCk7XHJcbi8qKlxyXG4gKiBHaXZlIGEgbGlzdCBvZiBhbGwgdGhlIGVycm9ycyB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjLmVycm9yLnB1c2gocmVzdWx0LmVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIoW3Jlc3VsdC5lcnJvcl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNPaygpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjLnZhbHVlLnB1c2gocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gbm90aGluZyB3aGVuIHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzRXJyKClcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcclxudmFyIFJlc3VsdDtcclxuKGZ1bmN0aW9uIChSZXN1bHQpIHtcclxuICAgIC8qKlxyXG4gICAgICogV3JhcHMgYSBmdW5jdGlvbiB3aXRoIGEgdHJ5IGNhdGNoLCBjcmVhdGluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lXHJcbiAgICAgKiBhcmd1bWVudHMgYnV0IHJldHVybmluZyBgT2tgIGlmIHN1Y2Nlc3NmdWwsIGBFcnJgIGlmIHRoZSBmdW5jdGlvbiB0aHJvd3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gd3JhcCB3aXRoIG9rIG9uIHN1Y2Nlc3Mgb3IgZXJyIG9uIGZhaWx1cmVcclxuICAgICAqIEBwYXJhbSBlcnJvckZuIHdoZW4gYW4gZXJyb3IgaXMgdGhyb3duLCB0aGlzIHdpbGwgd3JhcCB0aGUgZXJyb3IgcmVzdWx0IGlmIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBmdW5jdGlvbiBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyKGVycm9yRm4gPyBlcnJvckZuKGUpIDogZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmZyb21UaHJvd2FibGUgPSBmcm9tVGhyb3dhYmxlO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZShyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0KHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmUgPSBjb21iaW5lO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZVdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZVdpdGhBbGxFcnJvcnMgPSBjb21iaW5lV2l0aEFsbEVycm9ycztcclxufSkoUmVzdWx0IHx8IChSZXN1bHQgPSB7fSkpO1xyXG5jb25zdCBvayA9ICh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKTtcclxuZnVuY3Rpb24gZXJyKGVycikge1xyXG4gICAgcmV0dXJuIG5ldyBFcnIoZXJyKTtcclxufVxyXG5mdW5jdGlvbiBzYWZlVHJ5KGJvZHkpIHtcclxuICAgIGNvbnN0IG4gPSBib2R5KCkubmV4dCgpO1xyXG4gICAgaWYgKG4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuLnRoZW4oKHIpID0+IHIudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuLnZhbHVlO1xyXG59XHJcbmNsYXNzIE9rIHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBvayhmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcEVycihfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKF92YWx1ZSkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGYodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRlZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFzeW5jQW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKCgpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNNYXAoZikge1xyXG4gICAgICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB1bndyYXBPcihfdikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS15aWVsZCAqL1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBFcnJgIG9uIGFuIE9rJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgcmVxdWlyZS15aWVsZFxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVyciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBlcnIoZih0aGlzLmVycm9yKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jQW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jTWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3Iodikge1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgbWF0Y2goX29rLCBlcnIpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB5aWVsZCBlcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvIG5vdCB1c2UgdGhpcyBnZW5lcmF0b3Igb3V0IG9mIGBzYWZlVHJ5YCcpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwYCBvbiBhbiBFcnInLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgeWllbGQgc2VsZjtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufVxyXG5jb25zdCBmcm9tVGhyb3dhYmxlID0gUmVzdWx0LmZyb21UaHJvd2FibGU7XHJcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBFcnIsIE9rLCBSZXN1bHQsIFJlc3VsdEFzeW5jLCBlcnIsIGVyckFzeW5jLCBmcm9tQXN5bmNUaHJvd2FibGUsIGZyb21Qcm9taXNlLCBmcm9tU2FmZVByb21pc2UsIGZyb21UaHJvd2FibGUsIG9rLCBva0FzeW5jLCBzYWZlVHJ5IH07XG4iLCAidHlwZSBKc29uYWJsZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCByZWFkb25seSBKc29uYWJsZVtdXG4gIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uYWJsZSB9XG4gIHwgeyB0b0pTT04oKTogSnNvbmFibGUgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ/OiBKc29uYWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiBFcnJvcjsgY29udGV4dD86IEpzb25hYmxlIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBjYXVzZSwgY29udGV4dCB9ID0gb3B0aW9ucztcblxuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgV2ViU29ja2V0RXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBXZWJTb2NrZXRFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0XCI7XG59XG4iLCAiaW1wb3J0IHsgZXJyQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Nvbm5lY3Rpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IFNlcnZlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivc2VydmVyLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZyB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItY29uZmlnLnRzXCI7XG5cbi8qKlxuICogRW5zdXJlIGFuIGVycm9yIG1lc3NhZ2UgaXMgdHJhbnNmb3JtZWQgaW4gYW4gRXJyb3Igb2JqZWN0XG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5zdXJlRXJyb3IgPSAodmFsdWU6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsdWU7XG5cbiAgbGV0IHN0cmluZ2lmaWVkID0gXCJbVW5hYmxlIHRvIHN0cmluZ2lmeSB0aGUgdGhyb3duIHZhbHVlXVwiO1xuICB0cnkge1xuICAgIHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcihzdHJpbmdpZmllZCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIEx1ZmkncyBjb25maWcgZnJvbSBpdHMgQVBJXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZmV0Y2hTZXJ2ZXJDb25maWcgPSAoXG4gIGluc3RhbmNlVXJsOiBVUkwsXG4pOiBSZXN1bHRBc3luYzxTZXJ2ZXJDb25maWcsIEVycm9yPiA9PiB7XG4gIGNvbnN0IG9yaWdpbk1hdGNoZXMgPSBpbnN0YW5jZVVybC5ocmVmLm1hdGNoKFxuICAgIC8oLio/KVxcLz8oPzpcXC9bZHJdezF9XFwvfGxvZ2luXFwvP3xmaWxlc1xcLz8pLyxcbiAgKTtcblxuICBjb25zdCB1cmxPcmlnaW4gPSBvcmlnaW5NYXRjaGVzICYmIG9yaWdpbk1hdGNoZXNbMV1cbiAgICA/IG9yaWdpbk1hdGNoZXNbMV1cbiAgICA6IGluc3RhbmNlVXJsLm9yaWdpbjtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgZmV0Y2godXJsT3JpZ2luICsgXCIvYWJvdXQvY29uZmlnXCIpLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDb25uZWN0aW9uRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKS5hbmRUaGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICByZXNwb25zZS5qc29uKCksXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgICBuZXcgU2VydmVyRXJyb3IodW5kZWZpbmVkLCB7IGNvbnRleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEZW5vUnVudGltZSA9ICgpOiBib29sZWFuID0+IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgY29uc3QgaXNTZWN1cmVDb250ZXh0ID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpIHx8IGdsb2JhbFRoaXMuaXNTZWN1cmVDb250ZXh0IHx8XG4gICAgZ2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbn07XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJVcmwgPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBVUkwgPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpXG4gICAgPyBuZXcgVVJMKGAuL3dvcmtlci8ke3JlbGF0aXZlUGF0aH0udHNgLCBuZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLmhyZWYpXG4gICAgOiBuZXcgVVJMKFxuICAgICAgaW1wb3J0Lm1ldGEucmVzb2x2ZShcbiAgICAgICAgYC4vJHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggIT09IFwiZW5jcnlwdFwiID8gYHdvcmtlci8ke3JlbGF0aXZlUGF0aH1gIDogcmVsYXRpdmVQYXRoXG4gICAgICAgIH0uanNgLFxuICAgICAgKSxcbiAgICApO1xufTtcbiIsIG51bGwsIG51bGwsIG51bGwsICJpbXBvcnQge1xuICBEZWNvZGUgYXMgYjY0ZGVjb2RlLFxuICBFbmNvZGUgYXMgYjY0ZW5jb2RlLFxufSBmcm9tIFwiYXJyYXlidWZmZXItZW5jb2RpbmcvYmFzZTY0XCI7XG5pbXBvcnQgeyBlcnJBc3luYywgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHNqY2wgZnJvbSBcImx1Zmktc2pjbFwiO1xuaW1wb3J0IHsgQ3J5cHRvQWxnb3JpdGhtIH0gZnJvbSBcIn4vZW51bS9jcnlwdG8tYWxnb3JpdGhtLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcbmltcG9ydCB7IERlY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9kZWNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBFbmNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgdHlwZSBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gXCJ+L3V0aWxzLnRzXCI7XG5pbXBvcnQgeyBIYXNoaW5nRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vaGFzaGluZy1lcnJvci50c1wiO1xuXG4vKipcbiAqIERlY3J5cHQgYW4gRW5jcnlwdGVkRGF0YSBvciBhIHN0cmluZyB1c2luZyB0aGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24uXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZERhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkRGF0YTogRW5jcnlwdGVkRGF0YSB8IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPEFycmF5QnVmZmVyLCBEZWNyeXB0aW9uRXJyb3I+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gdHlwZW9mIGVuY3J5cHRlZERhdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZW5jcnlwdGVkRGF0YVxuICAgICAgOiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZW5jcnlwdGVkRGF0YS5kYXRhIGFzIEFycmF5QnVmZmVyKTtcblxuICAgIHJldHVybiBva0FzeW5jKGI2NGRlY29kZShzamNsLmRlY3J5cHQoa2V5LCBkYXRhKSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBEZWNyeXB0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmNyeXB0IGFuIEFycmF5QnVmZmVyIGludG8gYW4gRW5jcnlwdGVkRGF0YSB1c2luZyB0aGUgcHJvdmlkZWQga2V5XG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5jcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBBcnJheUJ1ZmZlcixcbik6IFJlc3VsdEFzeW5jPEVuY3J5cHRlZERhdGEsIEVuY3J5cHRpb25FcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IHNqY2wuZW5jcnlwdChrZXksIGI2NGVuY29kZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmMoe1xuICAgICAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLlNqY2wsXG4gICAgICBkYXRhOiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZW5jcnlwdGVkKS5idWZmZXIsXG4gICAgICBpdjogSlNPTi5wYXJzZShlbmNyeXB0ZWQgYXMgdW5rbm93biBhcyBzdHJpbmcpLml2LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBFbmNyeXB0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcgdXNpbmcgU2pjbCBBUElcbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVLZXkgPSAoKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBDcnlwdG9FcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBva0FzeW5jKHNqY2wuY29kZWMuYmFzZTY0LmZyb21CaXRzKHNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDgsIDEwKSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBnZW5lcmF0ZSBrZXlcIiwge1xuICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBIYXNoIGEgcGFzc3dvcmQgdXNpbmcgU2pjbCBBUElcbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNoUGFzc3dvcmQgPSAoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIEhhc2hpbmdFcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBva0FzeW5jKHNqY2wuY29kZWMuaGV4LmZyb21CaXRzKHNqY2wuaGFzaC5zaGE1MTIuaGFzaChwYXNzd29yZCkpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyQXN5bmMobmV3IEhhc2hpbmdFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBrZXkgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IFNqY2wuIFNpbmNlIHdlJ3JlIG5vdCBnZW5lcmF0aW5nIGFuIGVxdWFsIHN5bWJvbCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgV2ViQ3J5cHRvIEFQSSAoYnkgdXNpbmcgYmFzZTY0dXJsKSwgaXQncyBlYXN5IHRvIGRldGVjdFxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NqY2xLZXkgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIGtleVtrZXkubGVuZ3RoIC0gMV0gPT09IFwiPVwiO1xufTtcbiIsICJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwifi9lcnJvci9iYXNlLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBDcnlwdG9FcnJvciBleHRlbmRzIEJhc2VFcnJvciB7fVxuIiwgImltcG9ydCB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRGVjcnlwdGlvbkVycm9yIGV4dGVuZHMgQ3J5cHRvRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlOiBzdHJpbmcgPSBcIlVuYWJsZSB0byBkZWNyeXB0IHRoZSBwcm92aWRlZCBkYXRhXCI7XG59XG4iLCAiaW1wb3J0IHtcbiAgRGVjb2RlIGFzIGI2NHVybGRlY29kZSxcbiAgRW5jb2RlIGFzIGI2NHVybGVuY29kZSxcbn0gZnJvbSBcImFycmF5YnVmZmVyLWVuY29kaW5nL2Jhc2U2NC91cmxcIjtcbmltcG9ydCB7IHR5cGUgRW5jcnlwdGVkRGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9lbmNyeXB0ZWQtZGF0YS50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvQWxnb3JpdGhtIH0gZnJvbSBcIn4vZW51bS9jcnlwdG8tYWxnb3JpdGhtLnRzXCI7XG5pbXBvcnQgeyBEZWNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0IHsgRW5jcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2VuY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHsgSGFzaGluZ0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2hhc2hpbmctZXJyb3IudHNcIjtcblxuLyoqXG4gKiBEZWNyeXB0IGFuIGVuY3J5cHRlZERhdGEgdXNpbmcgdGhlIGtleSB1c2VkIGZvciBlbmNyeXB0aW9uXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICBlbmNyeXB0ZWQ6IEVuY3J5cHRlZERhdGEsXG4pOiBSZXN1bHRBc3luYzxBcnJheUJ1ZmZlciwgRGVjcnlwdGlvbkVycm9yPiA9PiB7XG4gIHJldHVybiBpbXBvcnRLZXkoa2V5KS5hbmRUaGVuKChpbXBvcnRlZEtleSkgPT5cbiAgICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgIGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgIGl2OiBlbmNyeXB0ZWQuaXYgYXMgVWludDhBcnJheSxcbiAgICAgICAgfSxcbiAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgIGVuY3J5cHRlZC5kYXRhIGFzIEFycmF5QnVmZmVyLFxuICAgICAgKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IERlY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgYW4gQXJyYXlCdWZmZXIgaW50byBhbiBFbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVuY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogQXJyYXlCdWZmZXIsXG4pOiBSZXN1bHRBc3luYzxFbmNyeXB0ZWREYXRhLCBFbmNyeXB0aW9uRXJyb3I+ID0+IHtcbiAgcmV0dXJuIGltcG9ydEtleShrZXkpLmFuZFRoZW4oKGltcG9ydGVkS2V5KSA9PiB7XG4gICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEyKSk7XG4gICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgaXYsXG4gICAgICAgIH0sXG4gICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICksXG4gICAgICAoZXJyb3IpID0+XG4gICAgICAgIG5ldyBFbmNyeXB0aW9uRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgICAgfSksXG4gICAgKS5hbmRUaGVuKChlbmNyeXB0ZWQpID0+IHtcbiAgICAgIHJldHVybiBva0FzeW5jKHtcbiAgICAgICAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLldlYkNyeXB0byxcbiAgICAgICAgZGF0YTogZW5jcnlwdGVkLFxuICAgICAgICBpdixcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGEgc3RyaW5nIGludG8gYSBDcnlwdG9LZXksIHVzYWJsZSBpbiBXZWIgQ3J5cHRvIEFQSVxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpbXBvcnRLZXkgPSAoa2V5OiBzdHJpbmcpOiBSZXN1bHRBc3luYzxDcnlwdG9LZXksIENyeXB0b0Vycm9yPiA9PiB7XG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBiNjR1cmxkZWNvZGUoa2V5KSxcbiAgICAgIHsgbmFtZTogXCJBRVMtR0NNXCIgfSxcbiAgICAgIGZhbHNlLFxuICAgICAgW1xuICAgICAgICBcImVuY3J5cHRcIixcbiAgICAgICAgXCJkZWNyeXB0XCIsXG4gICAgICBdLFxuICAgICksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGltcG9ydCBjcnlwdG9ncmFwaHkga2V5XCIsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcgdXNpbmcgV2ViIENyeXB0byBBUEkuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5ID0gKCk6IFJlc3VsdEFzeW5jPHN0cmluZywgQ3J5cHRvRXJyb3I+ID0+IHtcbiAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICBjcnlwdG8uc3VidGxlXG4gICAgICAgIC5nZW5lcmF0ZUtleShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICAgIGxlbmd0aDogMjU2LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigoZ2VuZXJhdGVkS2V5KSA9PlxuICAgICAgICAgIGNyeXB0by5zdWJ0bGVcbiAgICAgICAgICAgIC5leHBvcnRLZXkoXCJyYXdcIiwgZ2VuZXJhdGVkS2V5KVxuICAgICAgICAgICAgLnRoZW4oKGtleSkgPT4gcmVzb2x2ZShiNjR1cmxlbmNvZGUoa2V5KSkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgQ3J5cHRvRXJyb3IoXCJVbmFibGUgdG8gYmFzZTY0IGVuY29kZSB0aGUgdXJsXCIsIHtcbiAgICAgICAgICAgICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpXG4gICAgKSxcbiAgICAoZXJyb3IpID0+XG4gICAgICBuZXcgQ3J5cHRvRXJyb3IoXCJVbmFibGUgdG8gZ2VuZXJhdGUga2V5XCIsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogSGFzaCBhIHBhc3N3b3JkIHVzaW5nIFdlYkNyeXB0byBBUElcbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNoUGFzc3dvcmQgPSAoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIEhhc2hpbmdFcnJvcj4gPT4ge1xuICBjb25zdCBwcm9taXNlID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgIGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFxuICAgICAgICAgIFwiU0hBLTUxMlwiLFxuICAgICAgICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShwYXNzd29yZCksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIHByb21pc2UoKSxcbiAgICAoZXJyb3IpID0+IG5ldyBIYXNoaW5nRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICk7XG59O1xuIiwgImltcG9ydCB7IENyeXB0b0FsZ29yaXRobSB9IGZyb20gXCJ+L2VudW0vY3J5cHRvLWFsZ29yaXRobS50c1wiO1xuaW1wb3J0IHsgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHR5cGUgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgRW5jcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2VuY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IHR5cGUgRW5jcnlwdGVkRGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9lbmNyeXB0ZWQtZGF0YS50c1wiO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tIFwifi9hcGkvY3J5cHRvL3NqY2wudHNcIjtcbmltcG9ydCAqIGFzIHdlYiBmcm9tIFwifi9hcGkvY3J5cHRvL3dlYi50c1wiO1xuaW1wb3J0IHR5cGUgeyBIYXNoaW5nRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vaGFzaGluZy1lcnJvci50c1wiO1xuXG4vKipcbiAqIERlY3J5cHQgYW4gRW5jcnlwdGVkRGF0YSBvYmplY3QgdXNpbmcgdGhlIGtleSB1c2VkIGZvciBlbmNyeXB0aW9uXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZGVjcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBFbmNyeXB0ZWREYXRhLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT5cbiAgdmFsdWUuYWxnbyA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLmFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsXG4gICAgPyBzamNsLmRlY3J5cHQoa2V5LCB2YWx1ZSlcbiAgICA6IHdlYi5kZWNyeXB0KGtleSwgdmFsdWUpO1xuXG4vKipcbiAqIEVuY3J5cHQgYW4gQXJyYXlCdWZmZXIgdXNpbmcgdGhlIHByb3ZpZGVkIGtleSBhbmQgYWxnb3JpdGhtXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gYWxnb1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVuY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogQXJyYXlCdWZmZXIsXG4gIGFsZ286IENyeXB0b0FsZ29yaXRobSxcbik6IFJlc3VsdEFzeW5jPEVuY3J5cHRlZERhdGEsIEVuY3J5cHRpb25FcnJvcj4gPT5cbiAgKGFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsKVxuICAgID8gc2pjbC5lbmNyeXB0KGtleSwgdmFsdWUpXG4gICAgOiB3ZWIuZW5jcnlwdChrZXksIHZhbHVlKTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG5ldyBrZXkgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvblxuICpcbiAqIEBwYXJhbSBhbGdvXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVLZXkgPSAoXG4gIGFsZ28gPSBDcnlwdG9BbGdvcml0aG0uV2ViQ3J5cHRvLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBDcnlwdG9FcnJvcj4gPT5cbiAgYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2wgPyBzamNsLmdlbmVyYXRlS2V5KCkgOiB3ZWIuZ2VuZXJhdGVLZXkoKTtcblxuLyoqXG4gKiBIYXNoIGEgcGFzc3dvcmQgdXNpbmcgdGhlIHByb3ZpZGVkIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNoUGFzc3dvcmQgPSAoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIGFsZ286IENyeXB0b0FsZ29yaXRobSxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PlxuICBhbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbFxuICAgID8gc2pjbC5oYXNoUGFzc3dvcmQocGFzc3dvcmQpXG4gICAgOiB3ZWIuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKTtcbiIsICJpbXBvcnQgeyBlcnJBc3luYywgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgTHVmaUZpbGUgfSBmcm9tIFwifi9lbnRpdGllcy9sdWZpLWZpbGUudHNcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuaW1wb3J0IHsgVVBMT0FEX1NUQVRVUyB9IGZyb20gXCJ+L2VudW0vZmlsZS1zdGF0dXMudHNcIjtcbmltcG9ydCB7IFNvY2tldFBhdGggfSBmcm9tIFwifi9lbnVtL3NvY2tldC1wYXRoLnRzXCI7XG5pbXBvcnQgeyBVcGxvYWRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3VwbG9hZC91cGxvYWQtZXJyb3IudHNcIjtcbmltcG9ydCB7IFdlYlNvY2tldENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dlYnNvY2tldC93ZWJzb2NrZXQtY29ubmVjdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgV2ViU29ja2V0RXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudFVwbG9hZENodW5rTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvY2xpZW50LXVwbG9hZC1jaHVuay1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNhbmNlbE1ldGFkYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1jYW5jZWwtbWV0YWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRG93bmxvYWRDaHVua1N1Y2Nlc3NNZXRhZGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItZG93bmxvYWQtY2h1bmstc3VjY2Vzcy1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJVcGxvYWRDaHVua01ldGFkYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci11cGxvYWQtY2h1bmstbWV0YWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRG93bmxvYWRDaHVua01ldGFkYXRhIH0gZnJvbSBcIn4vdHlwZS9zZXJ2ZXItZG93bmxvYWQtY2h1bmstbWV0YWRhdGEudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IGV2ZW50cywgdXBkYXRlRmlsZSB9IGZyb20gXCJ+L3dvcmtlci9zaGFyZWQudHNcIjtcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwifi9hcGkvY3J5cHRvLnRzXCI7XG5pbXBvcnQge1xuICBEZWNvZGUgYXMgYjY0ZGVjb2RlLFxuICBFbmNvZGUgYXMgYjY0ZW5jb2RlLFxufSBmcm9tIFwiYXJyYXlidWZmZXItZW5jb2RpbmcvYmFzZTY0XCI7XG5cbmV4cG9ydCBjb25zdCBzb2NrZXRzOiB7XG4gIFtrZXk6IHN0cmluZ106IFdlYlNvY2tldDtcbn0gPSB7fTtcblxuY29uc3QgTUFYX0VSUk9SUyA9IDU7XG5cbi8qKlxuICogSGFuZGxlIFdlYlNvY2tldCByZXNwb25zZSBmb3IgY2FuY2VsIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuY29uc3Qgb25DYW5jZWxNZXNzYWdlID0gKFxuICBkYXRhOiBTZXJ2ZXJDYW5jZWxNZXRhZGF0YSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIEVycm9yPiA9PiB7XG4gIGV2ZW50cy5lbWl0KEVWRU5ULlVQTE9BRF9DQU5DRUxMRUQsIGRhdGEuc3VjY2Vzcyk7XG5cbiAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIFdlYlNvY2tldCByZXNwb25zZSBmb3IgZG93bmxvYWQgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSByZXNwb25zZVxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvbkRvd25sb2FkTWVzc2FnZSA9IChcbiAgcmVzcG9uc2U6IHN0cmluZyxcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2Uuc3BsaXQoXCJYWE1PSk9YWFwiKTtcbiAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSByZXN1bHQuc2hpZnQoKTtcblxuICBpZiAobWV0YWRhdGFTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gSlNPTi5wYXJzZShtZXRhZGF0YVN0cmluZykgYXMgU2VydmVyRG93bmxvYWRDaHVua01ldGFkYXRhO1xuXG4gICAgaWYgKGlzU2VydmVyRG93bmxvYWRDaHVua1N1Y2Nlc3NNZXRhZGF0YShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IGRhdGFTdHJpbmcgPSByZXN1bHQuc2hpZnQoKTtcblxuICAgICAgaWYgKGRhdGFTdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkRGF0YTogRW5jcnlwdGVkRGF0YSA9IEpTT04ucGFyc2UoZGF0YVN0cmluZyk7XG5cbiAgICAgICAgLy8gSWYgZmlsZSB3YXMgdXBsb2FkZWQgdXNpbmcgTHVmaSBBUElcbiAgICAgICAgaWYgKGVuY3J5cHRlZERhdGEuaXYpIHtcbiAgICAgICAgICBlbmNyeXB0ZWREYXRhLml2ID0gbmV3IFVpbnQ4QXJyYXkoT2JqZWN0LnZhbHVlcyhlbmNyeXB0ZWREYXRhLml2KSk7XG4gICAgICAgICAgZW5jcnlwdGVkRGF0YS5kYXRhID0gYjY0ZGVjb2RlKGVuY3J5cHRlZERhdGEuZGF0YSBhcyBzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyeXB0by5kZWNyeXB0KGx1ZmlGaWxlLmtleXMuY2xpZW50LCBlbmNyeXB0ZWREYXRhKS5hbmRUaGVuKFxuICAgICAgICAgIChkZWNyeXB0ZWRQYXJ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSB0eXBlb2YgZGVjcnlwdGVkUGFydCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGVjcnlwdGVkUGFydCkuYnVmZmVyIGFzIEFycmF5QnVmZmVyKVxuICAgICAgICAgICAgICA6IGRlY3J5cHRlZFBhcnQ7XG5cbiAgICAgICAgICAgIC8vIElmIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBpZiAobWV0YWRhdGEucGFydCA9PT0gMCkge1xuICAgICAgICAgICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7XG4gICAgICAgICAgICAgICAgY2h1bmtzUmVhZHk6IGx1ZmlGaWxlLmNodW5rc1JlYWR5ICsgMSxcbiAgICAgICAgICAgICAgICBkZWxBdEZpcnN0VmlldzogbWV0YWRhdGEuZGVsX2F0X2ZpcnN0X3ZpZXcsXG4gICAgICAgICAgICAgICAgZGVsYXk6IG1ldGFkYXRhLmRlbGF5LFxuICAgICAgICAgICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogbWV0YWRhdGEuc2l6ZSxcbiAgICAgICAgICAgICAgICB0b3RhbENodW5rczogbWV0YWRhdGEudG90YWwsXG4gICAgICAgICAgICAgICAgdHlwZTogbWV0YWRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICB6aXBwZWQ6IG1ldGFkYXRhLnppcHBlZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuRE9XTkxPQURfU1RBUlRFRCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7IGNodW5rc1JlYWR5OiBsdWZpRmlsZS5jaHVua3NSZWFkeSArIDEgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULkNIVU5LX0RPV05MT0FERUQsIGJ1ZmZlciwgbWV0YWRhdGEucGFydCk7XG5cbiAgICAgICAgICAgIGlmIChsdWZpRmlsZS5jaHVua3NSZWFkeSA9PT0gbWV0YWRhdGEudG90YWwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVuZERvd25sb2FkKGx1ZmlGaWxlKS5hbmRUaGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5ET1dOTE9BRF9DT01QTEVURSk7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRVJBVElPTl9URVJNSU5BVEVEKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCByZXRyaWV2ZSBtZXRhZGF0YSBmcm9tIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlclwiLFxuICAgICAgICApO1xuXG4gICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViU29ja2V0RXJyb3IobWV0YWRhdGEubXNnKTtcblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIGVyckFzeW5jKGVycm9yKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViU29ja2V0RXJyb3IoXG4gICAgICBcIkNhbm5vdCByZXRyaWV2ZSBtZXRhZGF0YSBmcm9tIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlclwiLFxuICAgICk7XG5cbiAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG4gICAgcmV0dXJuIGVyckFzeW5jKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBIYW5kbGUgV2ViU29ja2V0IHJlc3BvbnNlIGZvciB1cGxvYWQgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSByZXNwb25zZVxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvblVwbG9hZE1lc3NhZ2UgPSAoXG4gIHJlc3BvbnNlOiBTZXJ2ZXJVcGxvYWRDaHVua01ldGFkYXRhLFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBVcGxvYWRFcnJvcj4gPT4ge1xuICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgIC8vIElmIGZpcnN0IGNodW5rXG4gICAgaWYgKHJlc3BvbnNlLmogPT09IDApIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbyhgVXBsb2FkIG9mICR7bHVmaUZpbGUua2V5cy5jbGllbnR9IHN0YXJ0ZWRgKTtcblxuICAgICAgdXBkYXRlRmlsZShsdWZpRmlsZSwge1xuICAgICAgICBrZXlzOiB7IGNsaWVudDogbHVmaUZpbGUua2V5cy5jbGllbnQsIHNlcnZlcjogcmVzcG9uc2Uuc2hvcnQgfSxcbiAgICAgICAgYWN0aW9uVG9rZW46IHJlc3BvbnNlLnRva2VuLFxuICAgICAgICBxdWV1ZUluZGV4OiByZXNwb25zZS5pLFxuICAgICAgfSk7XG5cbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlVQTE9BRF9TVEFSVEVEKTtcbiAgICB9XG5cbiAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7XG4gICAgICBjaHVua3NSZWFkeTogbHVmaUZpbGUuY2h1bmtzUmVhZHkgKyAxLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkX2F0LFxuICAgIH0pO1xuXG4gICAgZXZlbnRzLmVtaXQoRVZFTlQuQ0hVTktfVVBMT0FERUQpO1xuXG4gICAgaWYgKGx1ZmlGaWxlLmNodW5rc1JlYWR5ID09PSBsdWZpRmlsZS50b3RhbENodW5rcykge1xuICAgICAgdXBkYXRlRmlsZShsdWZpRmlsZSwgeyB1cGxvYWRTdGF0dXM6IFVQTE9BRF9TVEFUVVMuQ09NUExFVEUgfSk7XG5cbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlVQTE9BRF9DT01QTEVURSk7XG4gICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQpO1xuICAgIH1cblxuICAgIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViU29ja2V0RXJyb3IocmVzcG9uc2UubXNnKTtcbiAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG5cbiAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCBvbiBzb2NrZXRzIFwib25tZXNzYWdlXCIgZXZlbnRcbiAqXG4gKiBAcGFyYW0gZVxuICogQHBhcmFtIHNvY2tldFVybFxuICogQHJldHVybnNcbiAqL1xuY29uc3Qgb25NZXNzYWdlID0gKFxuICBlOiBNZXNzYWdlRXZlbnQsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFVwbG9hZEVycm9yPiA9PiB7XG4gIGNvbnN0IGRhdGEgPSB0cnlQYXJzZUpzb24oZS5kYXRhKTtcblxuICBsZXQgY2FsbGJhY2s7XG5cbiAgaWYgKGRhdGEpIHtcbiAgICBpZiAoIWRhdGEuYWN0aW9uICYmIGRhdGEubXNnKSB7XG4gICAgICAvLyBJZiBlcnJvclxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViU29ja2V0RXJyb3IoZGF0YS5tc2cpO1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuXG4gICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXCJkZWxheVwiIGluIGRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvblVwbG9hZE1lc3NhZ2UoZGF0YSwgbHVmaUZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvbkNhbmNlbE1lc3NhZ2UoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrID0gb25Eb3dubG9hZE1lc3NhZ2UoZS5kYXRhLCBsdWZpRmlsZSk7XG4gIH1cblxuICByZXR1cm4gY2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIElzIHNvY2tldCBjb25uZWN0aW5nP1xuICpcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Nvbm5lY3RpbmcgPSAoc29ja2V0S2V5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gIHNvY2tldHMgIT09IHVuZGVmaW5lZCAmJlxuICBzb2NrZXRzW3NvY2tldEtleV0gIT09IHVuZGVmaW5lZCAmJlxuICBzb2NrZXRzW3NvY2tldEtleV0ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG5cbi8qKlxuICogSXMgc29ja2V0IHNwYXduZWQ/XG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3Bhd25lZCA9IChzb2NrZXRLZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgc29ja2V0cyAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XS5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcblxuLyoqXG4gKiBBc2sgV2ViU29ja2V0IHRvIGNhbmNlbCBhbiB1cGxvYWRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBjYW5jZWxVcGxvYWQgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIHJldHVybiBzZW5kTWVzc2FnZShcbiAgICB1cGxvYWRTb2NrZXRVcmwobHVmaUZpbGUpLFxuICAgIGx1ZmlGaWxlLFxuICAgIGAke1xuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBpZDogbHVmaUZpbGUua2V5cy5zZXJ2ZXIsXG4gICAgICAgIG1vZF90b2tlbjogbHVmaUZpbGUuYWN0aW9uVG9rZW4sXG4gICAgICAgIGNhbmNlbDogdHJ1ZSxcbiAgICAgICAgaTogbHVmaUZpbGUucXVldWVJbmRleCxcbiAgICAgIH0pXG4gICAgfVhYTU9KT1hYdXNlbGVzc2AsXG4gICk7XG59O1xuXG4vKipcbiAqIERvd25sb2FkIGEgcGFydCBvZiB0aGUgZmlsZSB0aHJvdWdoIHRoZSBXZWJTb2NrZXRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEBwYXJhbSBjaHVua051bWJlclxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkQ2h1bmsgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbiAgY2h1bmtOdW1iZXI6IG51bWJlcixcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGxldCBtZXNzYWdlO1xuXG4gIGlmIChsdWZpRmlsZS5wYXNzd29yZCkge1xuICAgIG1lc3NhZ2UgPSB7IHBhcnQ6IGNodW5rTnVtYmVyLCBmaWxlX3B3ZDogbHVmaUZpbGUucGFzc3dvcmQgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0geyBwYXJ0OiBjaHVua051bWJlciB9O1xuICB9XG5cbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIGRvd25sb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSxcbiAgKTtcbn07XG5cbi8qKlxuICogVGVsbCB0aGUgV2ViU29ja2V0IHRoZSBkb3dubG9hZCBlbmRlZFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVuZERvd25sb2FkID0gKFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBsZXQgbWVzc2FnZTogeyBlbmRlZDogdHJ1ZTsgZmlsZV9wd2Q/OiBzdHJpbmcgfTtcblxuICBpZiAobHVmaUZpbGUucGFzc3dvcmQpIHtcbiAgICBtZXNzYWdlID0geyBlbmRlZDogdHJ1ZSwgZmlsZV9wd2Q6IGx1ZmlGaWxlLnBhc3N3b3JkIH07XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IHsgZW5kZWQ6IHRydWUgfTtcbiAgfVxuXG4gIHJldHVybiBzZW5kTWVzc2FnZShcbiAgICBkb3dubG9hZFNvY2tldFVybChsdWZpRmlsZSksXG4gICAgbHVmaUZpbGUsXG4gICAgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksXG4gICk7XG59O1xuXG4vKipcbiAqIFVwbG9hZCBhIGNodW5rIG9mIHRoZSBmaWxlIHRocm91Z2ggdGhlIFdlYlNvY2tldFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHBhcmFtIG1ldGFkYXRhXG4gKiBAcGFyYW0gZW5jcnlwdGVkRGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwbG9hZENodW5rID0gKFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4gIG1ldGFkYXRhOiBDbGllbnRVcGxvYWRDaHVua01ldGFkYXRhLFxuICBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgZW5jcnlwdGVkRGF0YS5kYXRhID0gYjY0ZW5jb2RlKGVuY3J5cHRlZERhdGEuZGF0YSBhcyBBcnJheUJ1ZmZlcik7XG5cbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIHVwbG9hZFNvY2tldFVybChsdWZpRmlsZSksXG4gICAgbHVmaUZpbGUsXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpfVhYTU9KT1hYJHtKU09OLnN0cmluZ2lmeShlbmNyeXB0ZWREYXRhKX1gLFxuICApO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgV2ViU29ja2V0XG4gKlxuICogQHBhcmFtIHNvY2tldFVybFxuICogQHBhcmFtIG1lc3NhZ2VcbiAqIEBwYXJhbSBoYXNQcmlvcml0eVxuICogQHJldHVybnNcbiAqL1xuY29uc3Qgc2VuZE1lc3NhZ2UgPSAoXG4gIHNvY2tldFVybDogc3RyaW5nLFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGlmICghaXNTcGF3bmVkKHNvY2tldFVybCkpIHtcbiAgICByZXR1cm4gc3Bhd24oc29ja2V0VXJsKS5hbmRUaGVuKCgpID0+IHtcbiAgICAgIHNvY2tldHNbc29ja2V0VXJsXS5vbm1lc3NhZ2UgPSAoZSkgPT4gb25NZXNzYWdlKGUsIGx1ZmlGaWxlKTtcbiAgICAgIHJldHVybiBzZW5kTWVzc2FnZShzb2NrZXRVcmwsIGx1ZmlGaWxlLCBtZXNzYWdlKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzb2NrZXRzW3NvY2tldFVybF0uc2VuZChtZXNzYWdlKTtcblxuICAgIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3Bhd24gYSBuZXcgV2ViU29ja2V0IG9yIHJldXNlIGFuIGV4aXN0aW5nIG9uZS5cbiAqXG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcGFyYW0gZXJyb3JDb3VudFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNwYXduID0gKFxuICBzb2NrZXRLZXk6IHN0cmluZyxcbiAgZXJyb3JDb3VudCA9IDAsXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGlmICghaXNTcGF3bmVkKHNvY2tldEtleSkgJiYgIWlzQ29ubmVjdGluZyhzb2NrZXRLZXkpKSB7XG4gICAgLy8gY29uc29sZS5pbmZvKGBTcGF3bmluZyBXZWJTb2NrZXQgJHtzb2NrZXRVcmx9YCk7XG4gICAgc29ja2V0c1tzb2NrZXRLZXldID0gbmV3IFdlYlNvY2tldChzb2NrZXRLZXkpO1xuXG4gICAgZXZlbnRzLm9uY2UoRVZFTlQuU09DS0VUX09QRVJBVElPTl9URVJNSU5BVEVELCAoKSA9PiB7XG4gICAgICBzb2NrZXRzW3NvY2tldEtleV0uY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGV2ZW50cy5vbmNlKEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsICgpID0+IHtcbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PUEVSQVRJT05fVEVSTUlOQVRFRCk7XG4gICAgfSk7XG5cbiAgICBzb2NrZXRzW3NvY2tldEtleV0ub25vcGVuID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGBXZWJzb2NrZXQgJHtzb2NrZXRLZXl9IGhhcyBiZWVuIG9wZW5gKTtcbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PUEVORUQpO1xuICAgIH07XG5cbiAgICBzb2NrZXRzW3NvY2tldEtleV0ub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbyhgV2Vic29ja2V0ICR7c29ja2V0S2V5fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICB9O1xuXG4gICAgc29ja2V0c1tzb2NrZXRLZXldLm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAoKytlcnJvckNvdW50IDw9IE1BWF9FUlJPUlMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgQW4gZXJyb3IgaGFwcGVuZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0IFwiJHtzb2NrZXRLZXl9XCIuIFRyeWluZyBhZ2Fpbi4gJHtlcnJvckNvdW50fSAvICR7TUFYX0VSUk9SU31gLFxuICAgICAgICAgIChldmVudCBhcyBFcnJvckV2ZW50KS5lcnJvcixcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gc3Bhd24oc29ja2V0S2V5LCBlcnJvckNvdW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PTkVSUk9SKTtcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgICAgIG5ldyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IoXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0ICR7c29ja2V0S2V5fS5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB3YWl0Rm9yQ29ubmVjdGlvbihzb2NrZXRLZXkpXG4gICAgLmFuZFRoZW4oKCkgPT4gb2tBc3luYyhzb2NrZXRLZXkpKVxuICAgIC5vckVsc2UoKGVycm9yKSA9PiBlcnJBc3luYyhlcnJvcikpO1xufTtcblxuLyoqXG4gKiBXYWl0IGZvciBXZWJTb2NrZXQgdG8gb3Blbi4gUmV0dXJucyBhbiBlcnJvciBpZiB0b28gbWFueSBjb25uZWN0aW9uIGF0dGVtcHRzIGFyZSBtYWRlLlxuICpcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB3YWl0Rm9yQ29ubmVjdGlvbiA9IChcbiAgc29ja2V0S2V5OiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFpc1NwYXduZWQoc29ja2V0S2V5KSkge1xuICAgICAgICBldmVudHMub25jZShFVkVOVC5TT0NLRVRfT1BFTkVELCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBldmVudHMub24oRVZFTlQuU09DS0VUX09ORVJST1IsICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IFdlYlNvY2tldENvbm5lY3Rpb25FcnJvcigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICByZXR1cm4gZW5zdXJlRXJyb3IoZXJyb3IpO1xuICAgIH0sXG4gICk7XG5cbi8qKlxuICogQ2xvc2UgdGhlIFdlYlNvY2tldFxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsb3NlID0gKHNvY2tldEtleTogc3RyaW5nKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBXZWJTb2NrZXRFcnJvcj4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKGlzU3Bhd25lZChzb2NrZXRLZXkpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRJRCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgV2ViU29ja2V0RXJyb3IoXCJVbmFibGUgdG8gY2xvc2UgdGhlIFdlYlNvY2tldFwiKSk7XG4gICAgICAgIH0sIDEwMDApO1xuXG4gICAgICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SUQpO1xuICAgICAgICAgIHJlc29sdmUoc29ja2V0S2V5KTtcbiAgICAgICAgfTtcblxuICAgICAgICBzb2NrZXRzW3NvY2tldEtleV0uY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoc29ja2V0S2V5KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAoZXJyb3IpID0+IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIGluc3RhbmNlIFVSTCBpbiBhIFdlYlNvY2tldCBVUkxcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VVcmxcbiAqIEBwYXJhbSBwYXRobmFtZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkU29ja2V0VXJsID0gKGluc3RhbmNlVXJsOiBVUkwsIHBhdGhuYW1lOiBzdHJpbmcpOiBVUkwgPT4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKGluc3RhbmNlVXJsKTtcblxuICBpZiAoIVtcIndzOlwiLCBcIndzczpcIl0uaW5jbHVkZXModXJsLnByb3RvY29sKSkge1xuICAgIHVybC5wcm90b2NvbCA9IHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiID8gXCJ3czpcIiA6IFwid3NzOlwiO1xuICB9XG4gIHVybC5wYXRobmFtZSArPSBwYXRobmFtZTtcblxuICByZXR1cm4gbmV3IFVSTCh1cmwub3JpZ2luICsgdXJsLnBhdGhuYW1lKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIGRvd25sb2FkIFVSTCBmb3IgdGhlIHNvY2tldC4gUmV0dXJucyBhIHN0cmluZyBzaW5jZSBpdCdzIG1vc3RseSB1c2VkIGFzIHNvY2tldHMga2V5XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZG93bmxvYWRTb2NrZXRVcmwgPSAobHVmaUZpbGU6IEx1ZmlGaWxlKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGJ1aWxkU29ja2V0VXJsKFxuICAgIG5ldyBVUkwobHVmaUZpbGUuc2VydmVyVXJsKSxcbiAgICBTb2NrZXRQYXRoLkRPV05MT0FEICsgYC8ke2x1ZmlGaWxlLmtleXMuc2VydmVyfWAsXG4gICkudG9TdHJpbmcoKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHVwbG9hZCBVUkwgZm9yIHRoZSBzb2NrZXQuIFJldHVybnMgYSBzdHJpbmcgc2luY2UgaXQncyBtb3N0bHkgdXNlZCBhcyBzb2NrZXRzIGtleVxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwbG9hZFNvY2tldFVybCA9IChsdWZpRmlsZTogTHVmaUZpbGUpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYnVpbGRTb2NrZXRVcmwobmV3IFVSTChsdWZpRmlsZS5zZXJ2ZXJVcmwpLCBTb2NrZXRQYXRoLlVQTE9BRClcbiAgICAudG9TdHJpbmcoKTtcbn07XG5cbi8qKlxuICogVHJ5IHRvIHBhcnNlIGEgc3RyaW5nIGludG8gYSBKU09OLiBSZXR1cm5zIGZhbHNlIGlmIG5vdCBwb3NzaWJsZS5cbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuY29uc3QgdHJ5UGFyc2VKc29uID0gKGRhdGE6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICBpZiAocGFyc2VkT2JqZWN0ICYmIHR5cGVvZiBwYXJzZWRPYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwYXJzZWRPYmplY3Q7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGlzIFNlcnZlckRvd25sb2FkQ2h1bmtNZXRhZGF0YVxuICpcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhID0gKFxuICBtZXNzYWdlOiBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGEsXG4pOiBtZXNzYWdlIGlzIFNlcnZlckRvd25sb2FkQ2h1bmtTdWNjZXNzTWV0YWRhdGEgPT5cbiAgdHlwZW9mIG1lc3NhZ2UgPT09IFwib2JqZWN0XCIgJiYgbWVzc2FnZSAhPT0gbnVsbCAmJiAhKFwibXNnXCIgaW4gbWVzc2FnZSk7XG4iLCAiaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBldmVudHMsIGluaXQgfSBmcm9tIFwifi93b3JrZXIvc2hhcmVkLnRzXCI7XG5pbXBvcnQgeyBjYW5jZWxVcGxvYWQgYXMgd3NDYW5jZWxVcGxvYWQgfSBmcm9tIFwifi9hcGkvd2Vic29ja2V0LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyRXZlbnQgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWV2ZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNvY2tldEVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd2Vic29ja2V0L3dlYnNvY2tldC1lcnJvci50c1wiO1xuXG5kZWNsYXJlIGNvbnN0IHNlbGY6IFdvcmtlcjtcbmxldCBpc0luaXRpYXRlZCA9IGZhbHNlO1xuXG5zZWxmLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gIGlmICghaXNJbml0aWF0ZWQpIHtcbiAgICBpbml0KCk7XG4gICAgaXNJbml0aWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgZXZlbnRzLm9uKEVWRU5ULlVQTE9BRF9DQU5DRUxMRUQsIChzdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5VUExPQURfQ0FOQ0VMTEVELCBzdWNjZXNzIH0pO1xuICB9KTtcblxuICBjYW5jZWxVcGxvYWQoZXZlbnQuZGF0YSkubWFwRXJyKChlcnJvcikgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsXG4gICAgICBlcnJvcixcbiAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgfSk7XG59O1xuXG5jb25zdCBjYW5jZWxVcGxvYWQgPSAoXG4gIHdvcmtlck1lc3NhZ2U6IFdvcmtlckFjdGlvbk1lc3NhZ2UsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT5cbiAgd3NDYW5jZWxVcGxvYWQod29ya2VyTWVzc2FnZS5hcmdzLmx1ZmlGaWxlKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBdUJBLFFBQUksSUFBSSxPQUFPLFlBQVksV0FBVyxVQUFVO0FBQ2hELFFBQUksZUFBZSxLQUFLLE9BQU8sRUFBRSxVQUFVLGFBQ3ZDLEVBQUUsUUFDRixTQUFTQSxjQUFhLFFBQVEsVUFBVSxNQUFNO0FBQzlDLGFBQU8sU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLFVBQVUsSUFBSTtBQUFBLElBQzdEO0FBRUYsUUFBSTtBQUNKLFFBQUksS0FBSyxPQUFPLEVBQUUsWUFBWSxZQUFZO0FBQ3hDLHVCQUFpQixFQUFFO0FBQUEsSUFDckIsV0FBVyxPQUFPLHVCQUF1QjtBQUN2Qyx1QkFBaUIsU0FBU0MsZ0JBQWUsUUFBUTtBQUMvQyxlQUFPLE9BQU8sb0JBQW9CLE1BQU0sRUFDckMsT0FBTyxPQUFPLHNCQUFzQixNQUFNLENBQUM7QUFBQSxNQUNoRDtBQUFBLElBQ0YsT0FBTztBQUNMLHVCQUFpQixTQUFTQSxnQkFBZSxRQUFRO0FBQy9DLGVBQU8sT0FBTyxvQkFBb0IsTUFBTTtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUVBLGFBQVMsbUJBQW1CLFNBQVM7QUFDbkMsVUFBSSxXQUFXLFFBQVEsS0FBTSxTQUFRLEtBQUssT0FBTztBQUFBLElBQ25EO0FBRUEsUUFBSSxjQUFjLE9BQU8sU0FBUyxTQUFTQyxhQUFZLE9BQU87QUFDNUQsYUFBTyxVQUFVO0FBQUEsSUFD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QUFTLEdBQUU7QUFBQyxXQUFLLFdBQVMsV0FBVTtBQUFDLGVBQU0sVUFBUSxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsR0FBRSxVQUFTLFNBQVMsR0FBRTtBQUFDLFdBQUssV0FBUyxXQUFVO0FBQUMsZUFBTSxnQkFBYyxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsRUFBQyxFQUFDO0FBQzNjLElBQUFBLE1BQUssT0FBTyxNQUFJLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBRyxLQUFLLEVBQUU7QUFBRSxVQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFO0FBQU8sVUFBSSxJQUFFO0FBQUUsVUFBRyxNQUFJLEtBQUcsTUFBSSxLQUFHLE1BQUksRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHNCQUFzQjtBQUFFLFdBQUssSUFBRSxDQUFDLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsSUFBRSxJQUFFLElBQUcsS0FBSTtBQUFDLFlBQUUsRUFBRSxJQUFFLENBQUM7QUFBRSxZQUFHLE1BQUksSUFBRSxLQUFHLE1BQUksS0FBRyxNQUFJLElBQUUsRUFBRSxLQUFFLEVBQUUsTUFBSSxFQUFFLEtBQUcsS0FBRyxFQUFFLEtBQUcsS0FBRyxHQUFHLEtBQUcsS0FBRyxFQUFFLEtBQUcsSUFBRSxHQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxHQUFFLE1BQUksSUFBRSxNQUFJLElBQUUsS0FBRyxJQUFFLE1BQUksS0FBRyxLQUFHLElBQUcsSUFBRSxLQUFHLElBQUUsT0FBSyxLQUFHO0FBQUksVUFBRSxDQUFDLElBQUUsRUFBRSxJQUFFLENBQUMsSUFBRTtBQUFBLE1BQUM7QUFBQyxXQUFJLElBQUUsR0FBRSxHQUFFLEtBQUksSUFBSSxLQUFFLEVBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsS0FBRyxLQUFHLElBQUUsSUFBRSxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQzNmLEdBQUcsQ0FBQztBQUFBLElBQUM7QUFDTCxJQUFBQSxNQUFLLE9BQU8sSUFBSSxZQUFVLEVBQUMsU0FBUSxTQUFTLEdBQUU7QUFBQyxhQUFPLEdBQUcsTUFBSyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUU7QUFBQyxhQUFPLEdBQUcsTUFBSyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsR0FBRSxXQUFVO0FBQUMsVUFBSSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLENBQUMsR0FBRSxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFFLFdBQUksSUFBRSxHQUFFLE1BQU0sR0FBRSxJQUFJLElBQUcsRUFBRSxDQUFDLElBQUUsS0FBRyxJQUFFLE9BQUssS0FBRyxNQUFJLENBQUMsSUFBRTtBQUFFLFdBQUksSUFBRSxJQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRSxLQUFHLEtBQUcsR0FBRSxJQUFFLEVBQUUsQ0FBQyxLQUFHLEVBQUUsTUFBSSxJQUFFLElBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLElBQUUsS0FBRyxHQUFFLElBQUUsS0FBRyxJQUFFLElBQUUsTUFBSSxJQUFHLEVBQUUsQ0FBQyxJQUFFLEdBQUUsRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFFLElBQUUsV0FBVSxJQUFFLFFBQVEsSUFBRSxNQUFNLElBQUUsV0FBVSxHQUFFLElBQUUsTUFBTSxFQUFFLENBQUMsSUFBRSxXQUFVLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLEdBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxLQUFHLE1BQUk7QUFBRSxXQUFJLElBQ2xnQixHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUFBLElBQUMsRUFBQztBQUNoRCxhQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFHLE1BQUksRUFBRSxPQUFPLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsd0JBQXdCO0FBQUUsVUFBSSxJQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUUsRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUksR0FBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFNBQU8sSUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBSSxFQUFFLElBQUUsRUFBRSxLQUFHLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRTtBQUFFLFdBQUksSUFDcmYsR0FBRSxJQUFFLEdBQUUsSUFBSSxHQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsQ0FBQyxJQUFFLEVBQUUsTUFBSSxFQUFFLEtBQUcsS0FBRyxFQUFFLEtBQUcsS0FBRyxHQUFHLEtBQUcsS0FBRyxFQUFFLEtBQUcsSUFBRSxHQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsR0FBRyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFO0FBQUUsYUFBTztBQUFBLElBQUM7QUFDaEgsSUFBQUEsTUFBSyxXQUFTLEVBQUMsVUFBUyxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRUEsTUFBSyxTQUFTLEVBQUUsRUFBRSxNQUFNLElBQUUsRUFBRSxHQUFFLE1BQUksSUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDO0FBQUUsYUFBTyxXQUFTLElBQUUsSUFBRUEsTUFBSyxTQUFTLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLEtBQUssTUFBTSxDQUFDLElBQUUsSUFBRSxFQUFFO0FBQUUsZUFBUSxJQUFFLElBQUUsSUFBRSxLQUFHLE1BQUksRUFBRSxJQUFFLEtBQUcsQ0FBQyxLQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsS0FBRyxJQUFFLENBQUMsTUFBSSxJQUFFLEVBQUUsSUFBRSxLQUFHLENBQUMsTUFBSSxNQUFJLEtBQUcsS0FBRztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBRyxNQUFJLEVBQUUsVUFBUSxNQUFJLEVBQUUsT0FBTyxRQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUUsRUFBRSxTQUFPLENBQUMsR0FBRSxJQUFFQSxNQUFLLFNBQVMsV0FBVyxDQUFDO0FBQUUsYUFBTyxPQUFLLElBQUUsRUFBRSxPQUFPLENBQUMsSUFBRUEsTUFBSyxTQUFTLEVBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxFQUFFLE1BQU0sR0FBRSxFQUFFLFNBQU8sQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBSSxJQUFFLEVBQUU7QUFBTyxhQUFPLE1BQzFmLElBQUUsSUFBRSxNQUFJLElBQUUsS0FBR0EsTUFBSyxTQUFTLFdBQVcsRUFBRSxJQUFFLENBQUMsQ0FBQztBQUFBLElBQUMsR0FBRSxPQUFNLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBRyxLQUFHLEVBQUUsU0FBTyxFQUFFLFFBQU87QUFBRSxVQUFFLEVBQUUsTUFBTSxHQUFFLEtBQUssS0FBSyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUksSUFBRSxFQUFFO0FBQU8sVUFBRSxJQUFFO0FBQUcsVUFBRSxLQUFHLE1BQUksRUFBRSxJQUFFLENBQUMsSUFBRUEsTUFBSyxTQUFTLFFBQVEsR0FBRSxFQUFFLElBQUUsQ0FBQyxJQUFFLGNBQVksSUFBRSxHQUFFLENBQUM7QUFBRyxhQUFPO0FBQUEsSUFBQyxHQUFFLFNBQVEsU0FBUyxHQUFFLEdBQUUsR0FBRTtBQUFDLGFBQU8sT0FBSyxJQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsS0FBRyxLQUFHLEtBQUcsZ0JBQWM7QUFBQSxJQUFDLEdBQUUsWUFBVyxTQUFTLEdBQUU7QUFBQyxhQUFPLEtBQUssTUFBTSxJQUFFLGFBQWEsS0FBRztBQUFBLElBQUUsR0FBRSxPQUFNLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBR0EsTUFBSyxTQUFTLFVBQVUsQ0FBQyxNQUFJQSxNQUFLLFNBQVMsVUFBVSxDQUFDLEVBQUUsUUFBTTtBQUFHLFVBQUksSUFBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxNQUFHLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU8sTUFDbGY7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJO0FBQUUsVUFBRTtBQUFFLFdBQUksV0FBUyxNQUFJLElBQUUsQ0FBQyxJQUFHLE1BQUksR0FBRSxLQUFHLEdBQUcsR0FBRSxLQUFLLENBQUMsR0FBRSxJQUFFO0FBQUUsVUFBRyxNQUFJLEVBQUUsUUFBTyxFQUFFLE9BQU8sQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxLQUFLLElBQUUsRUFBRSxDQUFDLE1BQUksQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEtBQUcsS0FBRztBQUFFLFVBQUUsRUFBRSxTQUFPLEVBQUUsRUFBRSxTQUFPLENBQUMsSUFBRTtBQUFFLFVBQUVBLE1BQUssU0FBUyxXQUFXLENBQUM7QUFBRSxRQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLElBQUUsSUFBRSxJQUFHLEtBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxDQUFDO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFO0FBQUMsYUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBSSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sRUFBRSxFQUFFLEtBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxTQUFRLElBQUUsVUFBUyxJQUFFLEtBQUc7QUFBRyxhQUFPO0FBQUEsSUFBQyxFQUFDO0FBQ3BkLElBQUFBLE1BQUssTUFBTSxhQUFXLEVBQUMsVUFBUyxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUUsSUFBRyxJQUFFQSxNQUFLLFNBQVMsVUFBVSxDQUFDLEdBQUUsR0FBRTtBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsSUFBRSxHQUFFLElBQUksUUFBSyxJQUFFLE9BQUssSUFBRSxFQUFFLElBQUUsQ0FBQyxJQUFHLEtBQUcsT0FBTyxhQUFhLE1BQUksTUFBSSxNQUFJLENBQUMsR0FBRSxNQUFJO0FBQUUsYUFBTyxtQkFBbUIsT0FBTyxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxVQUFFLFNBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUFFLFVBQUksSUFBRSxDQUFDLEdBQUUsR0FBRSxJQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEtBQUcsSUFBRSxFQUFFLFdBQVcsQ0FBQyxHQUFFLE9BQUssSUFBRSxPQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUUsSUFBRTtBQUFHLFVBQUUsS0FBRyxFQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLEtBQUcsSUFBRSxJQUFHLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFDcFosSUFBQUEsTUFBSyxNQUFNLE1BQUksRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRSxJQUFHO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxRQUFLLEVBQUUsQ0FBQyxJQUFFLEtBQUcsaUJBQWdCLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQztBQUFFLGFBQU8sRUFBRSxPQUFPLEdBQUVBLE1BQUssU0FBUyxVQUFVLENBQUMsSUFBRSxDQUFDO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUUsQ0FBQyxHQUFFO0FBQUUsVUFBRSxFQUFFLFFBQVEsVUFBUyxFQUFFO0FBQUUsVUFBRSxFQUFFO0FBQU8sVUFBRSxJQUFFO0FBQVcsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBRyxFQUFFLEdBQUUsS0FBSyxTQUFTLEVBQUUsT0FBTyxHQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQztBQUFFLGFBQU9BLE1BQUssU0FBUyxNQUFNLEdBQUUsSUFBRSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQzlWLElBQUFBLE1BQUssTUFBTSxTQUFPLEVBQUMsR0FBRSxvRUFBbUUsVUFBUyxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLElBQUcsSUFBRSxHQUFFLElBQUVBLE1BQUssTUFBTSxPQUFPLEdBQUUsSUFBRSxHQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxZQUFJLElBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxJQUFFO0FBQU0sV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFNBQU8sSUFBRyxN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TUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsTUFBTyxLQUFHLEdBQUUsS0FBRyxJQUFJLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFVBQVMsV0FBVTtBQUFDLFVBQUksR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFQSxNQUFLLFNBQVMsT0FBTyxHQUFFLENBQUNBLE1BQUssU0FBUyxRQUFRLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFBRSxXQUFJLElBQUUsRUFBRSxTQUFPLEdBQUUsSUFBRSxJQUFHLElBQUksR0FBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBRSxVQUFXLENBQUM7QUFBRSxXQUFJLEVBQUUsS0FBSyxLQUFLLElBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBUSxNQUFLLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSyxNQUFNO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFFLFdBQVU7QUFBQyxlQUFTLEVBQUVDLElBQUU7QUFBQyxlQUFPLGNBQWFBLEtBQUUsS0FBSyxNQUFNQSxFQUFDLEtBQUc7QUFBQSxNQUFDO0FBQUMsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUU7QUFBRyxhQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsR0FBRSxJQUFJLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxjQUN6ZjtBQUFHO0FBQUEsUUFBSztBQUFDLGNBQUksSUFBRSxNQUFJLEtBQUssRUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxHQUFFLENBQUMsSUFBRyxLQUFLLEVBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsSUFBRSxDQUFDLENBQUMsR0FBRTtBQUFBLE1BQUk7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUUsR0FBRSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUM7QUFBRSxXQUFJLElBQUUsR0FBRSxLQUFHLEdBQUUsSUFBSSxNQUFHLElBQUUsSUFBRSxFQUFFLENBQUMsS0FBRyxJQUFFLEVBQUUsSUFBRSxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxLQUFHLEVBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsS0FBRyxLQUFHLEtBQUcsT0FBSyxNQUFJLEtBQUcsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxNQUFJLEVBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxJQUFFLElBQUUsRUFBRSxJQUFFLElBQUcsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLEtBQUcsS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUksSUFBRSxLQUFHLElBQUUsTUFBSSxFQUFFLENBQUMsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLElBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsS0FBRyxJQUFFLElBQUUsS0FBRyxJQUFFLE9BQUssTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLEtBQUcsS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUk7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUNwZjtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBRCxNQUFLLEtBQUssU0FBTyxTQUFTLEdBQUU7QUFBQyxXQUFLLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRTtBQUFFLFdBQUcsS0FBSyxJQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEtBQUcsS0FBSyxNQUFNO0FBQUEsSUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxPQUFPLE9BQUssU0FBUyxHQUFFO0FBQUMsYUFBTyxJQUFJQSxNQUFLLEtBQUssU0FBUSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsSUFBQztBQUMvUyxJQUFBQSxNQUFLLEtBQUssT0FBTyxZQUFVLEVBQUMsV0FBVSxNQUFLLE9BQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFFBQU8sU0FBUyxHQUFFO0FBQUMsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLFVBQUksR0FBRSxJQUFFLEtBQUssSUFBRUEsTUFBSyxTQUFTLE9BQU8sS0FBSyxHQUFFLENBQUM7QUFBRSxVQUFFLEtBQUs7QUFBRSxVQUFFLEtBQUssSUFBRSxJQUFFQSxNQUFLLFNBQVMsVUFBVSxDQUFDO0FBQUUsVUFBRyxtQkFBaUIsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHFDQUFxQztBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBSSxJQUFFLElBQUksWUFBWSxDQUFDLEdBQUUsSUFBRTtBQUFFLGFBQUksSUFBRSxPQUFLLEtBQUcsT0FBSyxJQUFFLE9BQU0sS0FBRyxHQUFFLEtBQUcsS0FBSyxNQUFLLEVBQUUsRUFBRSxTQUFTLEtBQ3RmLEdBQUUsTUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEtBQUc7QUFBRSxVQUFFLE9BQU8sR0FBRSxLQUFHLENBQUM7QUFBQSxNQUFDLE1BQU0sTUFBSSxJQUFFLE9BQUssS0FBRyxPQUFLLElBQUUsT0FBTSxLQUFHLEdBQUUsS0FBRyxLQUFLLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFVBQVMsV0FBVTtBQUFDLFVBQUksR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFQSxNQUFLLFNBQVMsT0FBTyxHQUFFLENBQUNBLE1BQUssU0FBUyxRQUFRLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFBRSxXQUFJLElBQUUsRUFBRSxTQUFPLEdBQUUsSUFBRSxJQUFHLElBQUksR0FBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxDQUFDO0FBQUUsUUFBRSxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUUsVUFBVyxDQUFDO0FBQUUsV0FBSSxFQUFFLEtBQUssS0FBSyxJQUFFLENBQUMsR0FBRSxFQUFFLFNBQVEsTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUssTUFBTTtBQUFFLGFBQU87QUFBQSxJQUFDLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRyxDQUFDLFVBQVMsVUFBUyxTQUFRLFNBQVEsVUFBUyxTQUFRLFNBQVEsT0FBTyxHQUFFLEdBQUUsQ0FBQyxHQUFFLElBQUc7QUFBQSxNQUFDO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFDbGY7QUFBQSxNQUFRO0FBQUEsTUFBTztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBTztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUNwZjtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsSUFBTyxHQUFFLEdBQUUsV0FBVTtBQUFDLGVBQVMsRUFBRUMsSUFBRTtBQUFDLGVBQU8sY0FBYUEsS0FBRSxLQUFLLE1BQU1BLEVBQUMsS0FBRztBQUFBLE1BQUM7QUFBQyxlQUFTLEVBQUVBLElBQUU7QUFBQyxlQUFPLGlCQUFlQSxLQUFFLEtBQUssTUFBTUEsRUFBQyxLQUFHO0FBQUEsTUFBRztBQUFDLGVBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxHQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxZQUFFO0FBQUcsYUFBSSxJQUFFLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBSSxLQUFHLE1BQUksSUFBRSxHQUFFO0FBQUMsY0FBRTtBQUFHO0FBQUEsUUFBSztBQUFDLGNBQUksSUFBRSxNQUFJLEtBQUssRUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxHQUFFLEtBQUssRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsR0FBRSxDQUFDLEtBQUcsS0FBRyxLQUFLLEdBQUcsQ0FBQyxJQUFHLEtBQUssRUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUUsS0FBSyxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLENBQUMsQ0FBQyxLQUFHLEtBQUcsS0FBSyxHQUFHLENBQUMsR0FBRTtBQUFBLE1BQUk7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQ3ZnQixHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxLQUFHLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUU7QUFBRSxVQUFHLGdCQUFjLE9BQU8sYUFBWTtBQUFDLFlBQUUsTUFBTSxHQUFHO0FBQUUsaUJBQVEsSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLEdBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFBLE1BQUMsTUFBTSxLQUFFO0FBQUUsVUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsSUFBRyxJQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxZQUFHLEtBQUcsRUFBRSxLQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDO0FBQUEsYUFBTTtBQUFDLGNBQUUsRUFBRSxLQUFHLElBQUUsR0FBRztBQUFFLGNBQUksSUFBRSxFQUFFLEtBQUcsSUFBRSxNQUFJLENBQUM7QUFBRSxlQUFHLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksS0FBRyxNQUFJO0FBQUUsY0FBSSxLQUFHLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSTtBQUFHLGNBQUUsRUFBRSxLQUFHLElBQUUsRUFBRTtBQUFFLGNBQUksSUFBRSxFQUFFLEtBQUcsSUFBRSxLQUFHLENBQUMsR0FDbmYsS0FBRyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsSUFBRSxNQUFJLE1BQUksTUFBSSxHQUFFLEtBQUcsS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLElBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLEdBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxNQUFJLENBQUM7QUFBRSxjQUFFLElBQUUsRUFBRSxLQUFHLElBQUUsS0FBRyxDQUFDO0FBQUUsY0FBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFO0FBQUcsZUFBRztBQUFFLGVBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxlQUFHO0FBQUUsZUFBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFBLFFBQUU7QUFBQyxVQUFFLElBQUUsQ0FBQyxJQUFFLEtBQUc7QUFBRSxVQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsS0FBRztBQUFFLFlBQUksSUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEdBQUUsS0FBRyxJQUFFLElBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsR0FBRSxLQUFHLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxHQUFFLEtBQUcsS0FBRyxJQUFFLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxNQUFJLEtBQUcsS0FBRyxNQUFJLElBQUcsS0FBRyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksSUFBRyxLQUFHLEVBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxFQUFFLElBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxNQUFJLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxLQUFJLElBQUUsTUFBSSxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FDcGYsS0FBRyxNQUFJLE9BQUssTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLElBQUcsSUFBRSxJQUFFLElBQUcsSUFBRSxLQUFHLEtBQUcsTUFBSSxJQUFFLE9BQUssSUFBRSxJQUFFLEtBQUksSUFBRSxJQUFFLElBQUcsSUFBRSxLQUFHLE1BQUksTUFBSSxJQUFFLE9BQUssSUFBRSxJQUFFLEtBQUksSUFBRSxJQUFFLElBQUUsR0FBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBSSxZQUFFLElBQUU7QUFBRyxZQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFLElBQUUsSUFBRTtBQUFFLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRSxJQUFFLElBQUU7QUFBRSxZQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFBLE1BQUM7QUFBQyxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLEVBQUUsSUFBRSxJQUFFLElBQ25mO0FBQUUsUUFBRSxFQUFFLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLEVBQUUsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLEVBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsRUFBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFBLElBQUMsRUFBQztBQUN6SCxJQUFBRCxNQUFLLEtBQUssTUFBSSxFQUFDLE1BQUssT0FBTSxHQUFFLENBQUMsR0FBRSxnQkFBZSxTQUFTLEdBQUU7QUFBQyxNQUFBQSxNQUFLLEtBQUssSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLElBQUMsR0FBRSxrQkFBaUIsU0FBUyxHQUFFO0FBQUMsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxRQUFRLENBQUM7QUFBRSxXQUFHLEtBQUdBLE1BQUssS0FBSyxJQUFJLEVBQUUsT0FBTyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsSUFBRyxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsTUFBTSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUksR0FBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsSUFBRUEsTUFBSyxVQUFTLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRTtBQUFFLFVBQUUsS0FBRztBQUFHLFVBQUUsS0FBRyxDQUFDO0FBQUUsVUFBRyxJQUFFLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSxrQ0FBa0M7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLEdBQUUsSUFBSTtBQUFDLFVBQUUsS0FBRyxNQUFJLElBQUUsS0FBRztBQUFHLFVBQUUsRUFBRTtBQUFBLFFBQU07QUFBQSxRQUN0ZixLQUFHLEtBQUc7QUFBQSxNQUFFO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxhQUFPLEVBQUUsT0FBTyxFQUFFLE1BQUssRUFBRSxHQUFHO0FBQUEsSUFBQyxHQUFFLFNBQVEsU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFFLEtBQUc7QUFBRyxVQUFFLEtBQUcsQ0FBQztBQUFFLFVBQUksSUFBRUEsTUFBSyxVQUFTLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFVLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxTQUFTLEdBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxJQUFFLEtBQUc7QUFBRSxVQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsR0FBRSxJQUFJO0FBQUMsVUFBRSxLQUFHLE1BQUksSUFBRSxLQUFHO0FBQUcsVUFBRSxFQUFFLE1BQU0sR0FBRSxLQUFHLEtBQUcsRUFBRTtBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLEdBQUUsRUFBRSxNQUFLLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSSxDQUFDLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx3QkFBd0I7QUFDeGhCLGFBQU8sRUFBRTtBQUFBLElBQUksR0FBRSxJQUFHLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsQ0FBQyxHQUFFLElBQUVBLE1BQUssVUFBUyxJQUFFLEVBQUU7QUFBRSxVQUFFLENBQUMsRUFBRSxRQUFRLElBQUcsRUFBRSxTQUFPLEtBQUcsS0FBRyxJQUFFLEtBQUcsSUFBRSxJQUFFLENBQUMsQ0FBQztBQUFFLFVBQUUsRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFFLFFBQUUsQ0FBQyxLQUFHO0FBQUUsVUFBRSxFQUFFLFFBQVEsQ0FBQztBQUFFLFVBQUcsRUFBRSxPQUFPLE1BQUksSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsU0FBTyxJQUFFLElBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBRyxDQUFDLENBQUMsSUFBRSxjQUFZLE1BQUksSUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsSUFBRyxLQUFLLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFHLElBQUUsRUFBRSxPQUFPLEdBQUUsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsS0FBRSxFQUFFLFFBQVEsRUFBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFO0FBQUUsV0FBRztBQUFFLFVBQUcsSUFBRSxLQUFHLElBQUUsS0FBRyxLQUFHLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx5QkFBeUI7QUFDbmYsVUFBRyxhQUFXLEVBQUUsVUFBUSxhQUFXLEVBQUUsT0FBTyxPQUFNLElBQUlBLE1BQUssVUFBVSxJQUFJLHdDQUF3QztBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUcsRUFBRSxLQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBTyxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUVBLE1BQUs7QUFBUyxVQUFFLEVBQUU7QUFBRSxVQUFJLElBQUUsRUFBRSxRQUFPLElBQUUsRUFBRSxVQUFVLENBQUMsR0FBRSxJQUFFLElBQUUsSUFBRyxJQUFFO0FBQUUsVUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsR0FBRSxJQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFHLENBQUMsRUFBRSxRQUFNLEVBQUMsS0FBSSxHQUFFLE1BQUssQ0FBQyxFQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLEtBQUcsRUFBRSxLQUFFLE1BQUlBLE1BQUssS0FBSyxJQUFJLEdBQUcsSUFDcmdCLENBQUMsR0FBRSxLQUFHLElBQUcsRUFBRSxDQUFDLEtBQUksSUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQztBQUFFLGFBQU0sRUFBQyxLQUFJLEdBQUUsTUFBSyxFQUFFLE1BQU0sR0FBRSxDQUFDLEVBQUM7QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssT0FBSyxTQUFTLEdBQUUsR0FBRTtBQUFDLFdBQUssSUFBRSxJQUFFLEtBQUdBLE1BQUssS0FBSztBQUFPLFVBQUksSUFBRSxDQUFDLENBQUMsR0FBRSxDQUFDLENBQUMsR0FBRSxHQUFFLElBQUUsRUFBRSxVQUFVLFlBQVU7QUFBRyxXQUFLLElBQUUsQ0FBQyxJQUFJLEtBQUUsSUFBSSxHQUFDO0FBQUUsUUFBRSxTQUFPLE1BQUksSUFBRSxFQUFFLEtBQUssQ0FBQztBQUFHLFdBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxXQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRTtBQUFXLFdBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssSUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUFBLElBQUM7QUFDM1ksSUFBQUEsTUFBSyxLQUFLLEtBQUssVUFBVSxVQUFRQSxNQUFLLEtBQUssS0FBSyxVQUFVLE1BQUksU0FBUyxHQUFFO0FBQUMsVUFBRyxLQUFLLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx5Q0FBeUM7QUFBRSxXQUFLLE9BQU8sQ0FBQztBQUFFLGFBQU8sS0FBSyxPQUFPLENBQUM7QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLEtBQUssVUFBVSxRQUFNLFdBQVU7QUFBQyxXQUFLLElBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFBLElBQUU7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FB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LENBQUMsSUFBRSxFQUFFLENBQUM7QUFBQSxNQUFDO0FBQUMsYUFBTztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLENBQUMsR0FBRTtBQUFFLFdBQUksS0FBSyxFQUFFLEdBQUUsZUFBZSxDQUFDLEtBQUcsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUcsYUFBTztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FDNWYsR0FBRTtBQUFDLFVBQUksSUFBRSxDQUFDLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLFlBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUcsYUFBTztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssVUFBUUEsTUFBSyxLQUFLO0FBQVEsSUFBQUEsTUFBSyxVQUFRQSxNQUFLLEtBQUs7QUFBUSxJQUFBQSxNQUFLLEtBQUssS0FBRyxDQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLGVBQWEsU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUVBLE1BQUssS0FBSyxJQUFHO0FBQUUsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFFLEVBQUUsUUFBTTtBQUFJLFVBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEtBQUcsQ0FBQztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEtBQUcsRUFBQyxXQUFVLEVBQUUsUUFBTSxFQUFFLEtBQUssU0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUVBLE1BQUssT0FBTyxZQUFZLEdBQUUsQ0FBQyxFQUFDO0FBQUUsVUFBRSxXQUFTLEVBQUUsT0FBSyxFQUFFLFlBQVUsRUFBRTtBQUFLLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxLQUFHQSxNQUFLLEtBQUssT0FBTyxHQUFFLEdBQUUsRUFBRSxJQUFJ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QUM3RCxDQUFDO0FBRUQsRUFBQUMsY0FBYSxNQUFNLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVTtBQUN6QyxTQUFLLFlBQVk7QUFBQSxNQUNmO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBZ0I7QUFBQSxFQUNsQixDQUFDO0FBQ0g7QUFFQSxJQUFNQSxnQkFBZSxDQUNuQixrQkFFQSxhQUFlLGNBQWMsS0FBSyxRQUFROyIsCiAgIm5hbWVzIjogWyJSZWZsZWN0QXBwbHkiLCAiUmVmbGVjdE93bktleXMiLCAiTnVtYmVySXNOYU4iLCAiRXZlbnRFbWl0dGVyIiwgImV2ZW50cyIsICJlcnIiLCAib25jZSIsICJzamNsIiwgImEiLCAiRXZlbnRFbWl0dGVyIiwgInYiLCAib2siLCAiZXJyIiwgIlJlc3VsdCIsICJmcm9tVGhyb3dhYmxlIiwgIm9rIiwgImVyciIsICJzZWxmIiwgIm9iaiIsICJEZWNvZGUiLCAib2JqIiwgInNqY2wiLCAiZGVjcnlwdCIsICJEZWNvZGUiLCAiZGVjcnlwdCIsICJkZWNyeXB0IiwgImNhbmNlbFVwbG9hZCJdCn0K diff --git a/themes/default/public/js/minified/worker/compress.js b/themes/default/public/js/minified/worker/compress.js deleted file mode 100644 index 11d0979..0000000 --- a/themes/default/public/js/minified/worker/compress.js +++ /dev/null @@ -1,1391 +0,0 @@ -var __defProp = Object.defineProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/zip/zip-error.ts -var ZipError = class extends BaseError { -}; - -// src/error/zip/zip-compression-error.ts -var ZipCompressionError = class extends ZipError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to compress the data"); - } -}; - -// node_modules/.deno/fflate@0.8.2/node_modules/fflate/esm/browser.js -var ch2 = {}; -var wk = function(c, id, msg, transfer, cb) { - var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([ - c + ';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})' - ], { type: "text/javascript" })))); - w.onmessage = function(e) { - var d = e.data, ed = d.$e$; - if (ed) { - var err3 = new Error(ed[0]); - err3["code"] = ed[1]; - err3.stack = ed[2]; - cb(err3, null); - } else - cb(null, d); - }; - w.postMessage(msg, transfer); - return w; -}; -var u8 = Uint8Array; -var u16 = Uint16Array; -var i32 = Int32Array; -var fleb = new u8([ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 0, - /* unused */ - 0, - 0, - /* impossible */ - 0 -]); -var fdeb = new u8([ - 0, - 0, - 0, - 0, - 1, - 1, - 2, - 2, - 3, - 3, - 4, - 4, - 5, - 5, - 6, - 6, - 7, - 7, - 8, - 8, - 9, - 9, - 10, - 10, - 11, - 11, - 12, - 12, - 13, - 13, - /* unused */ - 0, - 0 -]); -var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); -var freb = function(eb, start) { - var b = new u16(31); - for (var i = 0; i < 31; ++i) { - b[i] = start += 1 << eb[i - 1]; - } - var r = new i32(b[30]); - for (var i = 1; i < 30; ++i) { - for (var j = b[i]; j < b[i + 1]; ++j) { - r[j] = j - b[i] << 5 | i; - } - } - return { b, r }; -}; -var _a = freb(fleb, 2); -var fl = _a.b; -var revfl = _a.r; -fl[28] = 258, revfl[258] = 28; -var _b = freb(fdeb, 0); -var fd = _b.b; -var revfd = _b.r; -var rev = new u16(32768); -for (i = 0; i < 32768; ++i) { - x = (i & 43690) >> 1 | (i & 21845) << 1; - x = (x & 52428) >> 2 | (x & 13107) << 2; - x = (x & 61680) >> 4 | (x & 3855) << 4; - rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1; -} -var x; -var i; -var hMap = function(cd, mb, r) { - var s = cd.length; - var i = 0; - var l = new u16(mb); - for (; i < s; ++i) { - if (cd[i]) - ++l[cd[i] - 1]; - } - var le = new u16(mb); - for (i = 1; i < mb; ++i) { - le[i] = le[i - 1] + l[i - 1] << 1; - } - var co; - if (r) { - co = new u16(1 << mb); - var rvb = 15 - mb; - for (i = 0; i < s; ++i) { - if (cd[i]) { - var sv = i << 4 | cd[i]; - var r_1 = mb - cd[i]; - var v = le[cd[i] - 1]++ << r_1; - for (var m = v | (1 << r_1) - 1; v <= m; ++v) { - co[rev[v] >> rvb] = sv; - } - } - } - } else { - co = new u16(s); - for (i = 0; i < s; ++i) { - if (cd[i]) { - co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i]; - } - } - } - return co; -}; -var flt = new u8(288); -for (i = 0; i < 144; ++i) - flt[i] = 8; -var i; -for (i = 144; i < 256; ++i) - flt[i] = 9; -var i; -for (i = 256; i < 280; ++i) - flt[i] = 7; -var i; -for (i = 280; i < 288; ++i) - flt[i] = 8; -var i; -var fdt = new u8(32); -for (i = 0; i < 32; ++i) - fdt[i] = 5; -var i; -var flm = /* @__PURE__ */ hMap(flt, 9, 0); -var fdm = /* @__PURE__ */ hMap(fdt, 5, 0); -var shft = function(p) { - return (p + 7) / 8 | 0; -}; -var slc = function(v, s, e) { - if (s == null || s < 0) - s = 0; - if (e == null || e > v.length) - e = v.length; - return new u8(v.subarray(s, e)); -}; -var ec = [ - "unexpected EOF", - "invalid block type", - "invalid length/literal", - "invalid distance", - "stream finished", - "no stream handler", - , - "no callback", - "invalid UTF-8 data", - "extra field too long", - "date not in range 1980-2099", - "filename too long", - "stream finishing", - "invalid zip data" - // determined by unknown compression method -]; -var err = function(ind, msg, nt) { - var e = new Error(msg || ec[ind]); - e.code = ind; - if (Error.captureStackTrace) - Error.captureStackTrace(e, err); - if (!nt) - throw e; - return e; -}; -var wbits = function(d, p, v) { - v <<= p & 7; - var o = p / 8 | 0; - d[o] |= v; - d[o + 1] |= v >> 8; -}; -var wbits16 = function(d, p, v) { - v <<= p & 7; - var o = p / 8 | 0; - d[o] |= v; - d[o + 1] |= v >> 8; - d[o + 2] |= v >> 16; -}; -var hTree = function(d, mb) { - var t = []; - for (var i = 0; i < d.length; ++i) { - if (d[i]) - t.push({ s: i, f: d[i] }); - } - var s = t.length; - var t2 = t.slice(); - if (!s) - return { t: et, l: 0 }; - if (s == 1) { - var v = new u8(t[0].s + 1); - v[t[0].s] = 1; - return { t: v, l: 1 }; - } - t.sort(function(a, b) { - return a.f - b.f; - }); - t.push({ s: -1, f: 25001 }); - var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2; - t[0] = { s: -1, f: l.f + r.f, l, r }; - while (i1 != s - 1) { - l = t[t[i0].f < t[i2].f ? i0++ : i2++]; - r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++]; - t[i1++] = { s: -1, f: l.f + r.f, l, r }; - } - var maxSym = t2[0].s; - for (var i = 1; i < s; ++i) { - if (t2[i].s > maxSym) - maxSym = t2[i].s; - } - var tr = new u16(maxSym + 1); - var mbt = ln(t[i1 - 1], tr, 0); - if (mbt > mb) { - var i = 0, dt = 0; - var lft = mbt - mb, cst = 1 << lft; - t2.sort(function(a, b) { - return tr[b.s] - tr[a.s] || a.f - b.f; - }); - for (; i < s; ++i) { - var i2_1 = t2[i].s; - if (tr[i2_1] > mb) { - dt += cst - (1 << mbt - tr[i2_1]); - tr[i2_1] = mb; - } else - break; - } - dt >>= lft; - while (dt > 0) { - var i2_2 = t2[i].s; - if (tr[i2_2] < mb) - dt -= 1 << mb - tr[i2_2]++ - 1; - else - ++i; - } - for (; i >= 0 && dt; --i) { - var i2_3 = t2[i].s; - if (tr[i2_3] == mb) { - --tr[i2_3]; - ++dt; - } - } - mbt = mb; - } - return { t: new u8(tr), l: mbt }; -}; -var ln = function(n, l, d) { - return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d; -}; -var lc = function(c) { - var s = c.length; - while (s && !c[--s]) - ; - var cl = new u16(++s); - var cli = 0, cln = c[0], cls = 1; - var w = function(v) { - cl[cli++] = v; - }; - for (var i = 1; i <= s; ++i) { - if (c[i] == cln && i != s) - ++cls; - else { - if (!cln && cls > 2) { - for (; cls > 138; cls -= 138) - w(32754); - if (cls > 2) { - w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305); - cls = 0; - } - } else if (cls > 3) { - w(cln), --cls; - for (; cls > 6; cls -= 6) - w(8304); - if (cls > 2) - w(cls - 3 << 5 | 8208), cls = 0; - } - while (cls--) - w(cln); - cls = 1; - cln = c[i]; - } - } - return { c: cl.subarray(0, cli), n: s }; -}; -var clen = function(cf, cl) { - var l = 0; - for (var i = 0; i < cl.length; ++i) - l += cf[i] * cl[i]; - return l; -}; -var wfblk = function(out, pos, dat) { - var s = dat.length; - var o = shft(pos + 2); - out[o] = s & 255; - out[o + 1] = s >> 8; - out[o + 2] = out[o] ^ 255; - out[o + 3] = out[o + 1] ^ 255; - for (var i = 0; i < s; ++i) - out[o + i + 4] = dat[i]; - return (o + 4 + s) * 8; -}; -var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) { - wbits(out, p++, final); - ++lf[256]; - var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l; - var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l; - var _c = lc(dlt), lclt = _c.c, nlc = _c.n; - var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; - var lcfreq = new u16(19); - for (var i = 0; i < lclt.length; ++i) - ++lcfreq[lclt[i] & 31]; - for (var i = 0; i < lcdt.length; ++i) - ++lcfreq[lcdt[i] & 31]; - var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; - var nlcc = 19; - for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) - ; - var flen = bl + 5 << 3; - var ftlen = clen(lf, flt) + clen(df, fdt) + eb; - var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; - if (bs >= 0 && flen <= ftlen && flen <= dtlen) - return wfblk(out, p, dat.subarray(bs, bs + bl)); - var lm, ll, dm, dl; - wbits(out, p, 1 + (dtlen < ftlen)), p += 2; - if (dtlen < ftlen) { - lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; - var llm = hMap(lct, mlcb, 0); - wbits(out, p, nlc - 257); - wbits(out, p + 5, ndc - 1); - wbits(out, p + 10, nlcc - 4); - p += 14; - for (var i = 0; i < nlcc; ++i) - wbits(out, p + 3 * i, lct[clim[i]]); - p += 3 * nlcc; - var lcts = [lclt, lcdt]; - for (var it = 0; it < 2; ++it) { - var clct = lcts[it]; - for (var i = 0; i < clct.length; ++i) { - var len = clct[i] & 31; - wbits(out, p, llm[len]), p += lct[len]; - if (len > 15) - wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12; - } - } - } else { - lm = flm, ll = flt, dm = fdm, dl = fdt; - } - for (var i = 0; i < li; ++i) { - var sym = syms[i]; - if (sym > 255) { - var len = sym >> 18 & 31; - wbits16(out, p, lm[len + 257]), p += ll[len + 257]; - if (len > 7) - wbits(out, p, sym >> 23 & 31), p += fleb[len]; - var dst = sym & 31; - wbits16(out, p, dm[dst]), p += dl[dst]; - if (dst > 3) - wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst]; - } else { - wbits16(out, p, lm[sym]), p += ll[sym]; - } - } - wbits16(out, p, lm[256]); - return p + ll[256]; -}; -var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); -var et = /* @__PURE__ */ new u8(0); -var dflt = function(dat, lvl, plvl, pre, post, st) { - var s = st.z || dat.length; - var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post); - var w = o.subarray(pre, o.length - post); - var lst = st.l; - var pos = (st.r || 0) & 7; - if (lvl) { - if (pos) - w[0] = st.r >> 3; - var opt = deo[lvl - 1]; - var n = opt >> 13, c = opt & 8191; - var msk_1 = (1 << plvl) - 1; - var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); - var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; - var hsh = function(i2) { - return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1; - }; - var syms = new i32(25e3); - var lf = new u16(288), df = new u16(32); - var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; - for (; i + 2 < s; ++i) { - var hv = hsh(i); - var imod = i & 32767, pimod = head[hv]; - prev[imod] = pimod; - head[hv] = imod; - if (wi <= i) { - var rem = s - i; - if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) { - pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); - li = lc_1 = eb = 0, bs = i; - for (var j = 0; j < 286; ++j) - lf[j] = 0; - for (var j = 0; j < 30; ++j) - df[j] = 0; - } - var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; - if (rem > 2 && hv == hsh(i - dif)) { - var maxn = Math.min(n, rem) - 1; - var maxd = Math.min(32767, i); - var ml = Math.min(258, rem); - while (dif <= maxd && --ch_1 && imod != pimod) { - if (dat[i + l] == dat[i + l - dif]) { - var nl = 0; - for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) - ; - if (nl > l) { - l = nl, d = dif; - if (nl > maxn) - break; - var mmd = Math.min(dif, nl - 2); - var md = 0; - for (var j = 0; j < mmd; ++j) { - var ti = i - dif + j & 32767; - var pti = prev[ti]; - var cd = ti - pti & 32767; - if (cd > md) - md = cd, pimod = ti; - } - } - } - imod = pimod, pimod = prev[imod]; - dif += imod - pimod & 32767; - } - } - if (d) { - syms[li++] = 268435456 | revfl[l] << 18 | revfd[d]; - var lin = revfl[l] & 31, din = revfd[d] & 31; - eb += fleb[lin] + fdeb[din]; - ++lf[257 + lin]; - ++df[din]; - wi = i + l; - ++lc_1; - } else { - syms[li++] = dat[i]; - ++lf[dat[i]]; - } - } - } - for (i = Math.max(i, wi); i < s; ++i) { - syms[li++] = dat[i]; - ++lf[dat[i]]; - } - pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); - if (!lst) { - st.r = pos & 7 | w[pos / 8 | 0] << 3; - pos -= 7; - st.h = head, st.p = prev, st.i = i, st.w = wi; - } - } else { - for (var i = st.w || 0; i < s + lst; i += 65535) { - var e = i + 65535; - if (e >= s) { - w[pos / 8 | 0] = lst; - e = s; - } - pos = wfblk(w, pos + 1, dat.subarray(i, e)); - } - st.i = s; - } - return slc(o, 0, pre + shft(pos) + post); -}; -var crct = /* @__PURE__ */ function() { - var t = new Int32Array(256); - for (var i = 0; i < 256; ++i) { - var c = i, k = 9; - while (--k) - c = (c & 1 && -306674912) ^ c >>> 1; - t[i] = c; - } - return t; -}(); -var crc = function() { - var c = -1; - return { - p: function(d) { - var cr = c; - for (var i = 0; i < d.length; ++i) - cr = crct[cr & 255 ^ d[i]] ^ cr >>> 8; - c = cr; - }, - d: function() { - return ~c; - } - }; -}; -var dopt = function(dat, opt, pre, post, st) { - if (!st) { - st = { l: 1 }; - if (opt.dictionary) { - var dict = opt.dictionary.subarray(-32768); - var newDat = new u8(dict.length + dat.length); - newDat.set(dict); - newDat.set(dat, dict.length); - dat = newDat; - st.w = dict.length; - } - } - return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st); -}; -var mrg = function(a, b) { - var o = {}; - for (var k in a) - o[k] = a[k]; - for (var k in b) - o[k] = b[k]; - return o; -}; -var wcln = function(fn, fnStr, td2) { - var dt = fn(); - var st = fn.toString(); - var ks = st.slice(st.indexOf("[") + 1, st.lastIndexOf("]")).replace(/\s+/g, "").split(","); - for (var i = 0; i < dt.length; ++i) { - var v = dt[i], k = ks[i]; - if (typeof v == "function") { - fnStr += ";" + k + "="; - var st_1 = v.toString(); - if (v.prototype) { - if (st_1.indexOf("[native code]") != -1) { - var spInd = st_1.indexOf(" ", 8) + 1; - fnStr += st_1.slice(spInd, st_1.indexOf("(", spInd)); - } else { - fnStr += st_1; - for (var t in v.prototype) - fnStr += ";" + k + ".prototype." + t + "=" + v.prototype[t].toString(); - } - } else - fnStr += st_1; - } else - td2[k] = v; - } - return fnStr; -}; -var ch = []; -var cbfs = function(v) { - var tl = []; - for (var k in v) { - if (v[k].buffer) { - tl.push((v[k] = new v[k].constructor(v[k])).buffer); - } - } - return tl; -}; -var wrkr = function(fns, init, id, cb) { - if (!ch[id]) { - var fnStr = "", td_1 = {}, m = fns.length - 1; - for (var i = 0; i < m; ++i) - fnStr = wcln(fns[i], fnStr, td_1); - ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 }; - } - var td2 = mrg({}, ch[id].e); - return wk(ch[id].c + ";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=" + init.toString() + "}", id, td2, cbfs(td2), cb); -}; -var bDflt = function() { - return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; -}; -var pbf = function(msg) { - return postMessage(msg, [msg.buffer]); -}; -var cbify = function(dat, opts, fns, init, id, cb) { - var w = wrkr(fns, init, id, function(err3, dat2) { - w.terminate(); - cb(err3, dat2); - }); - w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []); - return function() { - w.terminate(); - }; -}; -var wbytes = function(d, b, v) { - for (; v; ++b) - d[b] = v, v >>>= 8; -}; -function deflate(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bDflt - ], function(ev) { - return pbf(deflateSync(ev.data[0], ev.data[1])); - }, 0, cb); -} -function deflateSync(data, opts) { - return dopt(data, opts || {}, 0, 0); -} -var fltn = function(d, p, t, o) { - for (var k in d) { - var val = d[k], n = p + k, op = o; - if (Array.isArray(val)) - op = mrg(o, val[1]), val = val[0]; - if (val instanceof u8) - t[n] = [val, op]; - else { - t[n += "/"] = [new u8(0), op]; - fltn(val, n, t, o); - } - } -}; -var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder(); -var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder(); -var tds = 0; -try { - td.decode(et, { stream: true }); - tds = 1; -} catch (e) { -} -function strToU8(str, latin1) { - if (latin1) { - var ar_1 = new u8(str.length); - for (var i = 0; i < str.length; ++i) - ar_1[i] = str.charCodeAt(i); - return ar_1; - } - if (te) - return te.encode(str); - var l = str.length; - var ar = new u8(str.length + (str.length >> 1)); - var ai = 0; - var w = function(v) { - ar[ai++] = v; - }; - for (var i = 0; i < l; ++i) { - if (ai + 5 > ar.length) { - var n = new u8(ai + 8 + (l - i << 1)); - n.set(ar); - ar = n; - } - var c = str.charCodeAt(i); - if (c < 128 || latin1) - w(c); - else if (c < 2048) - w(192 | c >> 6), w(128 | c & 63); - else if (c > 55295 && c < 57344) - c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63); - else - w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63); - } - return slc(ar, 0, ai); -} -var exfl = function(ex) { - var le = 0; - if (ex) { - for (var k in ex) { - var l = ex[k].length; - if (l > 65535) - err(9); - le += l + 4; - } - } - return le; -}; -var wzh = function(d, b, f, fn, u, c, ce, co) { - var fl2 = fn.length, ex = f.extra, col = co && co.length; - var exl = exfl(ex); - wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4; - if (ce != null) - d[b++] = 20, d[b++] = f.os; - d[b] = 20, b += 2; - d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8; - d[b++] = f.compression & 255, d[b++] = f.compression >> 8; - var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; - if (y < 0 || y > 119) - err(10); - wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4; - if (c != -1) { - wbytes(d, b, f.crc); - wbytes(d, b + 4, c < 0 ? -c - 2 : c); - wbytes(d, b + 8, f.size); - } - wbytes(d, b + 12, fl2); - wbytes(d, b + 14, exl), b += 16; - if (ce != null) { - wbytes(d, b, col); - wbytes(d, b + 6, f.attrs); - wbytes(d, b + 10, ce), b += 14; - } - d.set(fn, b); - b += fl2; - if (exl) { - for (var k in ex) { - var exf = ex[k], l = exf.length; - wbytes(d, b, +k); - wbytes(d, b + 2, l); - d.set(exf, b + 4), b += 4 + l; - } - } - if (col) - d.set(co, b), b += col; - return b; -}; -var wzf = function(o, b, c, d, e) { - wbytes(o, b, 101010256); - wbytes(o, b + 8, c); - wbytes(o, b + 10, c); - wbytes(o, b + 12, d); - wbytes(o, b + 16, e); -}; -function zip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - var r = {}; - fltn(data, "", r, opts); - var k = Object.keys(r); - var lft = k.length, o = 0, tot = 0; - var slft = lft, files = new Array(lft); - var term = []; - var tAll = function() { - for (var i2 = 0; i2 < term.length; ++i2) - term[i2](); - }; - var cbd = function(a, b) { - mt(function() { - cb(a, b); - }); - }; - mt(function() { - cbd = cb; - }); - var cbf = function() { - var out = new u8(tot + 22), oe = o, cdl = tot - o; - tot = 0; - for (var i2 = 0; i2 < slft; ++i2) { - var f = files[i2]; - try { - var l = f.c.length; - wzh(out, tot, f, f.f, f.u, l); - var badd = 30 + f.f.length + exfl(f.extra); - var loc = tot + badd; - out.set(f.c, loc); - wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l; - } catch (e) { - return cbd(e, null); - } - } - wzf(out, o, files.length, cdl, oe); - cbd(null, out); - }; - if (!lft) - cbf(); - var _loop_1 = function(i2) { - var fn = k[i2]; - var _a2 = r[fn], file = _a2[0], p = _a2[1]; - var c = crc(), size = file.length; - c.p(file); - var f = strToU8(fn), s = f.length; - var com = p.comment, m = com && strToU8(com), ms = m && m.length; - var exl = exfl(p.extra); - var compression = p.level == 0 ? 0 : 8; - var cbl = function(e, d) { - if (e) { - tAll(); - cbd(e, null); - } else { - var l = d.length; - files[i2] = mrg(p, { - size, - crc: c.d(), - c: d, - f, - m, - u: s != fn.length || m && com.length != ms, - compression - }); - o += 30 + s + exl + l; - tot += 76 + 2 * (s + exl) + (ms || 0) + l; - if (!--lft) - cbf(); - } - }; - if (s > 65535) - cbl(err(11, 0, 1), null); - if (!compression) - cbl(null, file); - else if (size < 16e4) { - try { - cbl(null, deflateSync(file, p)); - } catch (e) { - cbl(e, null); - } - } else - term.push(deflate(file, p, cbl)); - }; - for (var i = 0; i < slft; ++i) { - _loop_1(i); - } - return tAll; -} -var mt = typeof queueMicrotask == "function" ? queueMicrotask : typeof setTimeout == "function" ? setTimeout : function(fn) { - fn(); -}; - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a2() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err3) => new ResultAsync(Promise.resolve(new Err(err3))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err2(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err2([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err2(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err2(err3) { - return new Err(err3); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err2(this.error); - } - mapErr(f) { - return err2(f(this.error)); - } - andThrough(_f) { - return err2(this.error); - } - andTee(_f) { - return err2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err3) { - return err3(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err2(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/worker/worker-error.ts -var WorkerError = class extends BaseError { -}; - -// src/error/worker/worker-undefined-parameter-error.ts -var WorkerUndefinedParameterError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "Parameter must be defined"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// src/worker/compress.ts -self.onmessage = (event) => { - compress(event.data).map((bytes) => { - self.postMessage({ event: "ARCHIVE_CREATED" /* ARCHIVE_CREATED */, buffer: bytes.buffer }, [ - bytes.buffer - ]); - }).mapErr((error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; -var compress = (workerMessage) => { - const { archive } = workerMessage.args; - if (archive) { - const promiseZip = () => new Promise((resolve, reject) => { - if (archive.entries) { - zip(archive.entries, (error, data) => { - if (error) reject(error); - resolve(data); - }); - } else { - reject( - new WorkerUndefinedParameterError( - "archive.entries must be defined" - ) - ); - } - }); - return ResultAsync.fromPromise( - promiseZip(), - (error) => error - ).andThen((bytes) => okAsync(bytes)).orElse( - (error) => errAsync( - new ZipCompressionError(void 0, { cause: ensureError(error) }) - ) - ); - } else { - return errAsync( - new WorkerUndefinedParameterError("archive must be defined") - ); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2Vycm9yL2Jhc2UtZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3ppcC96aXAtZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3ppcC96aXAtY29tcHJlc3Npb24tZXJyb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2ZmbGF0ZUAwLjguMi9ub2RlX21vZHVsZXMvZmZsYXRlL2VzbS9icm93c2VyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9uZXZlcnRocm93QDguMS4xL25vZGVfbW9kdWxlcy9uZXZlcnRocm93L2Rpc3QvaW5kZXguZXMuanMiLCAiLi4vLi4vc3JjL2Vycm9yL3dvcmtlci93b3JrZXItZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3dvcmtlci93b3JrZXItdW5kZWZpbmVkLXBhcmFtZXRlci1lcnJvci50cyIsICIuLi8uLi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vc3JjL3dvcmtlci9jb21wcmVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidHlwZSBKc29uYWJsZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCByZWFkb25seSBKc29uYWJsZVtdXG4gIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uYWJsZSB9XG4gIHwgeyB0b0pTT04oKTogSnNvbmFibGUgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ/OiBKc29uYWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiBFcnJvcjsgY29udGV4dD86IEpzb25hYmxlIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBjYXVzZSwgY29udGV4dCB9ID0gb3B0aW9ucztcblxuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFppcEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgWmlwRXJyb3IgfSBmcm9tIFwifi9lcnJvci96aXAvemlwLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBaaXBDb21wcmVzc2lvbkVycm9yIGV4dGVuZHMgWmlwRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjb21wcmVzcyB0aGUgZGF0YVwiO1xufVxuIiwgIi8vIERFRkxBVEUgaXMgYSBjb21wbGV4IGZvcm1hdDsgdG8gcmVhZCB0aGlzIGNvZGUsIHlvdSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIFJGQyBmaXJzdDpcbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxXG4vLyBZb3UgbWF5IGFsc28gd2lzaCB0byB0YWtlIGEgbG9vayBhdCB0aGUgZ3VpZGUgSSBtYWRlIGFib3V0IHRoaXMgcHJvZ3JhbTpcbi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzEwMWFycm93ei8yNTNmMzFlYjVhYmMzZDkyNzVhYjk0MzAwM2ZmZWNhZFxuLy8gU29tZSBvZiB0aGUgZm9sbG93aW5nIGNvZGUgaXMgc2ltaWxhciB0byB0aGF0IG9mIFVaSVAuanM6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9wZWEvVVpJUC5qc1xuLy8gSG93ZXZlciwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIGNvZGViYXNlIGhhcyBkaXZlcmdlZCBmcm9tIFVaSVAuanMgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZSBidW5kbGUgc2l6ZS5cbi8vIFNvbWV0aW1lcyAwIHdpbGwgYXBwZWFyIHdoZXJlIC0xIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUuIFRoaXMgaXMgYmVjYXVzZSB1c2luZyBhIHVpbnRcbi8vIGlzIGJldHRlciBmb3IgbWVtb3J5IGluIG1vc3QgZW5naW5lcyAoSSAqdGhpbmsqKS5cbnZhciBjaDIgPSB7fTtcbnZhciB3ayA9IChmdW5jdGlvbiAoYywgaWQsIG1zZywgdHJhbnNmZXIsIGNiKSB7XG4gICAgdmFyIHcgPSBuZXcgV29ya2VyKGNoMltpZF0gfHwgKGNoMltpZF0gPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtcbiAgICAgICAgYyArICc7YWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsZnVuY3Rpb24oZSl7ZT1lLmVycm9yO3Bvc3RNZXNzYWdlKHskZSQ6W2UubWVzc2FnZSxlLmNvZGUsZS5zdGFja119KX0pJ1xuICAgIF0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSkpKSk7XG4gICAgdy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgZCA9IGUuZGF0YSwgZWQgPSBkLiRlJDtcbiAgICAgICAgaWYgKGVkKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKGVkWzBdKTtcbiAgICAgICAgICAgIGVyclsnY29kZSddID0gZWRbMV07XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBlZFsyXTtcbiAgICAgICAgICAgIGNiKGVyciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY2IobnVsbCwgZCk7XG4gICAgfTtcbiAgICB3LnBvc3RNZXNzYWdlKG1zZywgdHJhbnNmZXIpO1xuICAgIHJldHVybiB3O1xufSk7XG5cbi8vIGFsaWFzZXMgZm9yIHNob3J0ZXIgY29tcHJlc3NlZCBjb2RlIChtb3N0IG1pbmlmZXJzIGRvbid0IGRvIHRoaXMpXG52YXIgdTggPSBVaW50OEFycmF5LCB1MTYgPSBVaW50MTZBcnJheSwgaTMyID0gSW50MzJBcnJheTtcbi8vIGZpeGVkIGxlbmd0aCBleHRyYSBiaXRzXG52YXIgZmxlYiA9IG5ldyB1OChbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMCwgLyogdW51c2VkICovIDAsIDAsIC8qIGltcG9zc2libGUgKi8gMF0pO1xuLy8gZml4ZWQgZGlzdGFuY2UgZXh0cmEgYml0c1xudmFyIGZkZWIgPSBuZXcgdTgoWzAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgLyogdW51c2VkICovIDAsIDBdKTtcbi8vIGNvZGUgbGVuZ3RoIGluZGV4IG1hcFxudmFyIGNsaW0gPSBuZXcgdTgoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTtcbi8vIGdldCBiYXNlLCByZXZlcnNlIGluZGV4IG1hcCBmcm9tIGV4dHJhIGJpdHNcbnZhciBmcmViID0gZnVuY3Rpb24gKGViLCBzdGFydCkge1xuICAgIHZhciBiID0gbmV3IHUxNigzMSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMTsgKytpKSB7XG4gICAgICAgIGJbaV0gPSBzdGFydCArPSAxIDw8IGViW2kgLSAxXTtcbiAgICB9XG4gICAgLy8gbnVtYmVycyBoZXJlIGFyZSBhdCBtYXggMTggYml0c1xuICAgIHZhciByID0gbmV3IGkzMihiWzMwXSk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAzMDsgKytpKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBiW2ldOyBqIDwgYltpICsgMV07ICsraikge1xuICAgICAgICAgICAgcltqXSA9ICgoaiAtIGJbaV0pIDw8IDUpIHwgaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBiOiBiLCByOiByIH07XG59O1xudmFyIF9hID0gZnJlYihmbGViLCAyKSwgZmwgPSBfYS5iLCByZXZmbCA9IF9hLnI7XG4vLyB3ZSBjYW4gaWdub3JlIHRoZSBmYWN0IHRoYXQgdGhlIG90aGVyIG51bWJlcnMgYXJlIHdyb25nOyB0aGV5IG5ldmVyIGhhcHBlbiBhbnl3YXlcbmZsWzI4XSA9IDI1OCwgcmV2ZmxbMjU4XSA9IDI4O1xudmFyIF9iID0gZnJlYihmZGViLCAwKSwgZmQgPSBfYi5iLCByZXZmZCA9IF9iLnI7XG4vLyBtYXAgb2YgdmFsdWUgdG8gcmV2ZXJzZSAoYXNzdW1pbmcgMTYgYml0cylcbnZhciByZXYgPSBuZXcgdTE2KDMyNzY4KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMzI3Njg7ICsraSkge1xuICAgIC8vIHJldmVyc2UgdGFibGUgYWxnb3JpdGhtIGZyb20gU09cbiAgICB2YXIgeCA9ICgoaSAmIDB4QUFBQSkgPj4gMSkgfCAoKGkgJiAweDU1NTUpIDw8IDEpO1xuICAgIHggPSAoKHggJiAweENDQ0MpID4+IDIpIHwgKCh4ICYgMHgzMzMzKSA8PCAyKTtcbiAgICB4ID0gKCh4ICYgMHhGMEYwKSA+PiA0KSB8ICgoeCAmIDB4MEYwRikgPDwgNCk7XG4gICAgcmV2W2ldID0gKCgoeCAmIDB4RkYwMCkgPj4gOCkgfCAoKHggJiAweDAwRkYpIDw8IDgpKSA+PiAxO1xufVxuLy8gY3JlYXRlIGh1ZmZtYW4gdHJlZSBmcm9tIHU4IFwibWFwXCI6IGluZGV4IC0+IGNvZGUgbGVuZ3RoIGZvciBjb2RlIGluZGV4XG4vLyBtYiAobWF4IGJpdHMpIG11c3QgYmUgYXQgbW9zdCAxNVxuLy8gVE9ETzogb3B0aW1pemUvc3BsaXQgdXA/XG52YXIgaE1hcCA9IChmdW5jdGlvbiAoY2QsIG1iLCByKSB7XG4gICAgdmFyIHMgPSBjZC5sZW5ndGg7XG4gICAgLy8gaW5kZXhcbiAgICB2YXIgaSA9IDA7XG4gICAgLy8gdTE2IFwibWFwXCI6IGluZGV4IC0+ICMgb2YgY29kZXMgd2l0aCBiaXQgbGVuZ3RoID0gaW5kZXhcbiAgICB2YXIgbCA9IG5ldyB1MTYobWIpO1xuICAgIC8vIGxlbmd0aCBvZiBjZCBtdXN0IGJlIDI4OCAodG90YWwgIyBvZiBjb2RlcylcbiAgICBmb3IgKDsgaSA8IHM7ICsraSkge1xuICAgICAgICBpZiAoY2RbaV0pXG4gICAgICAgICAgICArK2xbY2RbaV0gLSAxXTtcbiAgICB9XG4gICAgLy8gdTE2IFwibWFwXCI6IGluZGV4IC0+IG1pbmltdW0gY29kZSBmb3IgYml0IGxlbmd0aCA9IGluZGV4XG4gICAgdmFyIGxlID0gbmV3IHUxNihtYik7XG4gICAgZm9yIChpID0gMTsgaSA8IG1iOyArK2kpIHtcbiAgICAgICAgbGVbaV0gPSAobGVbaSAtIDFdICsgbFtpIC0gMV0pIDw8IDE7XG4gICAgfVxuICAgIHZhciBjbztcbiAgICBpZiAocikge1xuICAgICAgICAvLyB1MTYgXCJtYXBcIjogaW5kZXggLT4gbnVtYmVyIG9mIGFjdHVhbCBiaXRzLCBzeW1ib2wgZm9yIGNvZGVcbiAgICAgICAgY28gPSBuZXcgdTE2KDEgPDwgbWIpO1xuICAgICAgICAvLyBiaXRzIHRvIHJlbW92ZSBmb3IgcmV2ZXJzZXJcbiAgICAgICAgdmFyIHJ2YiA9IDE1IC0gbWI7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSAwIGxlbmd0aHNcbiAgICAgICAgICAgIGlmIChjZFtpXSkge1xuICAgICAgICAgICAgICAgIC8vIG51bSBlbmNvZGluZyBib3RoIHN5bWJvbCBhbmQgYml0cyByZWFkXG4gICAgICAgICAgICAgICAgdmFyIHN2ID0gKGkgPDwgNCkgfCBjZFtpXTtcbiAgICAgICAgICAgICAgICAvLyBmcmVlIGJpdHNcbiAgICAgICAgICAgICAgICB2YXIgcl8xID0gbWIgLSBjZFtpXTtcbiAgICAgICAgICAgICAgICAvLyBzdGFydCB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciB2ID0gbGVbY2RbaV0gLSAxXSsrIDw8IHJfMTtcbiAgICAgICAgICAgICAgICAvLyBtIGlzIGVuZCB2YWx1ZVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSB2IHwgKCgxIDw8IHJfMSkgLSAxKTsgdiA8PSBtOyArK3YpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgMTYgYml0IHZhbHVlIHN0YXJ0aW5nIHdpdGggdGhlIGNvZGUgeWllbGRzIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICBjb1tyZXZbdl0gPj4gcnZiXSA9IHN2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY28gPSBuZXcgdTE2KHMpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgczsgKytpKSB7XG4gICAgICAgICAgICBpZiAoY2RbaV0pIHtcbiAgICAgICAgICAgICAgICBjb1tpXSA9IHJldltsZVtjZFtpXSAtIDFdKytdID4+ICgxNSAtIGNkW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY287XG59KTtcbi8vIGZpeGVkIGxlbmd0aCB0cmVlXG52YXIgZmx0ID0gbmV3IHU4KDI4OCk7XG5mb3IgKHZhciBpID0gMDsgaSA8IDE0NDsgKytpKVxuICAgIGZsdFtpXSA9IDg7XG5mb3IgKHZhciBpID0gMTQ0OyBpIDwgMjU2OyArK2kpXG4gICAgZmx0W2ldID0gOTtcbmZvciAodmFyIGkgPSAyNTY7IGkgPCAyODA7ICsraSlcbiAgICBmbHRbaV0gPSA3O1xuZm9yICh2YXIgaSA9IDI4MDsgaSA8IDI4ODsgKytpKVxuICAgIGZsdFtpXSA9IDg7XG4vLyBmaXhlZCBkaXN0YW5jZSB0cmVlXG52YXIgZmR0ID0gbmV3IHU4KDMyKTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMzI7ICsraSlcbiAgICBmZHRbaV0gPSA1O1xuLy8gZml4ZWQgbGVuZ3RoIG1hcFxudmFyIGZsbSA9IC8qI19fUFVSRV9fKi8gaE1hcChmbHQsIDksIDApLCBmbHJtID0gLyojX19QVVJFX18qLyBoTWFwKGZsdCwgOSwgMSk7XG4vLyBmaXhlZCBkaXN0YW5jZSBtYXBcbnZhciBmZG0gPSAvKiNfX1BVUkVfXyovIGhNYXAoZmR0LCA1LCAwKSwgZmRybSA9IC8qI19fUFVSRV9fKi8gaE1hcChmZHQsIDUsIDEpO1xuLy8gZmluZCBtYXggb2YgYXJyYXlcbnZhciBtYXggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBtID0gYVswXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGFbaV0gPiBtKVxuICAgICAgICAgICAgbSA9IGFbaV07XG4gICAgfVxuICAgIHJldHVybiBtO1xufTtcbi8vIHJlYWQgZCwgc3RhcnRpbmcgYXQgYml0IHAgYW5kIG1hc2sgd2l0aCBtXG52YXIgYml0cyA9IGZ1bmN0aW9uIChkLCBwLCBtKSB7XG4gICAgdmFyIG8gPSAocCAvIDgpIHwgMDtcbiAgICByZXR1cm4gKChkW29dIHwgKGRbbyArIDFdIDw8IDgpKSA+PiAocCAmIDcpKSAmIG07XG59O1xuLy8gcmVhZCBkLCBzdGFydGluZyBhdCBiaXQgcCBjb250aW51aW5nIGZvciBhdCBsZWFzdCAxNiBiaXRzXG52YXIgYml0czE2ID0gZnVuY3Rpb24gKGQsIHApIHtcbiAgICB2YXIgbyA9IChwIC8gOCkgfCAwO1xuICAgIHJldHVybiAoKGRbb10gfCAoZFtvICsgMV0gPDwgOCkgfCAoZFtvICsgMl0gPDwgMTYpKSA+PiAocCAmIDcpKTtcbn07XG4vLyBnZXQgZW5kIG9mIGJ5dGVcbnZhciBzaGZ0ID0gZnVuY3Rpb24gKHApIHsgcmV0dXJuICgocCArIDcpIC8gOCkgfCAwOyB9O1xuLy8gdHlwZWQgYXJyYXkgc2xpY2UgLSBhbGxvd3MgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gZnJlZSBvcmlnaW5hbCByZWZlcmVuY2UsXG4vLyB3aGlsZSBiZWluZyBtb3JlIGNvbXBhdGlibGUgdGhhbiAuc2xpY2VcbnZhciBzbGMgPSBmdW5jdGlvbiAodiwgcywgZSkge1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApXG4gICAgICAgIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKVxuICAgICAgICBlID0gdi5sZW5ndGg7XG4gICAgLy8gY2FuJ3QgdXNlIC5jb25zdHJ1Y3RvciBpbiBjYXNlIHVzZXItc3VwcGxpZWRcbiAgICByZXR1cm4gbmV3IHU4KHYuc3ViYXJyYXkocywgZSkpO1xufTtcbi8qKlxuICogQ29kZXMgZm9yIGVycm9ycyBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgbGlicmFyeVxuICovXG5leHBvcnQgdmFyIEZsYXRlRXJyb3JDb2RlID0ge1xuICAgIFVuZXhwZWN0ZWRFT0Y6IDAsXG4gICAgSW52YWxpZEJsb2NrVHlwZTogMSxcbiAgICBJbnZhbGlkTGVuZ3RoTGl0ZXJhbDogMixcbiAgICBJbnZhbGlkRGlzdGFuY2U6IDMsXG4gICAgU3RyZWFtRmluaXNoZWQ6IDQsXG4gICAgTm9TdHJlYW1IYW5kbGVyOiA1LFxuICAgIEludmFsaWRIZWFkZXI6IDYsXG4gICAgTm9DYWxsYmFjazogNyxcbiAgICBJbnZhbGlkVVRGODogOCxcbiAgICBFeHRyYUZpZWxkVG9vTG9uZzogOSxcbiAgICBJbnZhbGlkRGF0ZTogMTAsXG4gICAgRmlsZW5hbWVUb29Mb25nOiAxMSxcbiAgICBTdHJlYW1GaW5pc2hpbmc6IDEyLFxuICAgIEludmFsaWRaaXBEYXRhOiAxMyxcbiAgICBVbmtub3duQ29tcHJlc3Npb25NZXRob2Q6IDE0XG59O1xuLy8gZXJyb3IgY29kZXNcbnZhciBlYyA9IFtcbiAgICAndW5leHBlY3RlZCBFT0YnLFxuICAgICdpbnZhbGlkIGJsb2NrIHR5cGUnLFxuICAgICdpbnZhbGlkIGxlbmd0aC9saXRlcmFsJyxcbiAgICAnaW52YWxpZCBkaXN0YW5jZScsXG4gICAgJ3N0cmVhbSBmaW5pc2hlZCcsXG4gICAgJ25vIHN0cmVhbSBoYW5kbGVyJyxcbiAgICAsXG4gICAgJ25vIGNhbGxiYWNrJyxcbiAgICAnaW52YWxpZCBVVEYtOCBkYXRhJyxcbiAgICAnZXh0cmEgZmllbGQgdG9vIGxvbmcnLFxuICAgICdkYXRlIG5vdCBpbiByYW5nZSAxOTgwLTIwOTknLFxuICAgICdmaWxlbmFtZSB0b28gbG9uZycsXG4gICAgJ3N0cmVhbSBmaW5pc2hpbmcnLFxuICAgICdpbnZhbGlkIHppcCBkYXRhJ1xuICAgIC8vIGRldGVybWluZWQgYnkgdW5rbm93biBjb21wcmVzc2lvbiBtZXRob2Rcbl07XG47XG52YXIgZXJyID0gZnVuY3Rpb24gKGluZCwgbXNnLCBudCkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyB8fCBlY1tpbmRdKTtcbiAgICBlLmNvZGUgPSBpbmQ7XG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlLCBlcnIpO1xuICAgIGlmICghbnQpXG4gICAgICAgIHRocm93IGU7XG4gICAgcmV0dXJuIGU7XG59O1xuLy8gZXhwYW5kcyByYXcgREVGTEFURSBkYXRhXG52YXIgaW5mbHQgPSBmdW5jdGlvbiAoZGF0LCBzdCwgYnVmLCBkaWN0KSB7XG4gICAgLy8gc291cmNlIGxlbmd0aCAgICAgICBkaWN0IGxlbmd0aFxuICAgIHZhciBzbCA9IGRhdC5sZW5ndGgsIGRsID0gZGljdCA/IGRpY3QubGVuZ3RoIDogMDtcbiAgICBpZiAoIXNsIHx8IHN0LmYgJiYgIXN0LmwpXG4gICAgICAgIHJldHVybiBidWYgfHwgbmV3IHU4KDApO1xuICAgIHZhciBub0J1ZiA9ICFidWY7XG4gICAgLy8gaGF2ZSB0byBlc3RpbWF0ZSBzaXplXG4gICAgdmFyIHJlc2l6ZSA9IG5vQnVmIHx8IHN0LmkgIT0gMjtcbiAgICAvLyBubyBzdGF0ZVxuICAgIHZhciBub1N0ID0gc3QuaTtcbiAgICAvLyBBc3N1bWVzIHJvdWdobHkgMzMlIGNvbXByZXNzaW9uIHJhdGlvIGF2ZXJhZ2VcbiAgICBpZiAobm9CdWYpXG4gICAgICAgIGJ1ZiA9IG5ldyB1OChzbCAqIDMpO1xuICAgIC8vIGVuc3VyZSBidWZmZXIgY2FuIGZpdCBhdCBsZWFzdCBsIGVsZW1lbnRzXG4gICAgdmFyIGNidWYgPSBmdW5jdGlvbiAobCkge1xuICAgICAgICB2YXIgYmwgPSBidWYubGVuZ3RoO1xuICAgICAgICAvLyBuZWVkIHRvIGluY3JlYXNlIHNpemUgdG8gZml0XG4gICAgICAgIGlmIChsID4gYmwpIHtcbiAgICAgICAgICAgIC8vIERvdWJsZSBvciBzZXQgdG8gbmVjZXNzYXJ5LCB3aGljaGV2ZXIgaXMgZ3JlYXRlclxuICAgICAgICAgICAgdmFyIG5idWYgPSBuZXcgdTgoTWF0aC5tYXgoYmwgKiAyLCBsKSk7XG4gICAgICAgICAgICBuYnVmLnNldChidWYpO1xuICAgICAgICAgICAgYnVmID0gbmJ1ZjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gIGxhc3QgY2h1bmsgICAgICAgICBiaXRwb3MgICAgICAgICAgIGJ5dGVzXG4gICAgdmFyIGZpbmFsID0gc3QuZiB8fCAwLCBwb3MgPSBzdC5wIHx8IDAsIGJ0ID0gc3QuYiB8fCAwLCBsbSA9IHN0LmwsIGRtID0gc3QuZCwgbGJ0ID0gc3QubSwgZGJ0ID0gc3QubjtcbiAgICAvLyB0b3RhbCBiaXRzXG4gICAgdmFyIHRidHMgPSBzbCAqIDg7XG4gICAgZG8ge1xuICAgICAgICBpZiAoIWxtKSB7XG4gICAgICAgICAgICAvLyBCRklOQUwgLSB0aGlzIGlzIG9ubHkgMSB3aGVuIGxhc3QgY2h1bmsgaXMgbmV4dFxuICAgICAgICAgICAgZmluYWwgPSBiaXRzKGRhdCwgcG9zLCAxKTtcbiAgICAgICAgICAgIC8vIHR5cGU6IDAgPSBubyBjb21wcmVzc2lvbiwgMSA9IGZpeGVkIGh1ZmZtYW4sIDIgPSBkeW5hbWljIGh1ZmZtYW5cbiAgICAgICAgICAgIHZhciB0eXBlID0gYml0cyhkYXQsIHBvcyArIDEsIDMpO1xuICAgICAgICAgICAgcG9zICs9IDM7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBnbyB0byBlbmQgb2YgYnl0ZSBib3VuZGFyeVxuICAgICAgICAgICAgICAgIHZhciBzID0gc2hmdChwb3MpICsgNCwgbCA9IGRhdFtzIC0gNF0gfCAoZGF0W3MgLSAzXSA8PCA4KSwgdCA9IHMgKyBsO1xuICAgICAgICAgICAgICAgIGlmICh0ID4gc2wpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgc2l6ZVxuICAgICAgICAgICAgICAgIGlmIChyZXNpemUpXG4gICAgICAgICAgICAgICAgICAgIGNidWYoYnQgKyBsKTtcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG92ZXIgdW5jb21wcmVzc2VkIGRhdGFcbiAgICAgICAgICAgICAgICBidWYuc2V0KGRhdC5zdWJhcnJheShzLCB0KSwgYnQpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBuZXcgYml0cG9zLCB1cGRhdGUgYnl0ZSBjb3VudFxuICAgICAgICAgICAgICAgIHN0LmIgPSBidCArPSBsLCBzdC5wID0gcG9zID0gdCAqIDgsIHN0LmYgPSBmaW5hbDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICBsbSA9IGZscm0sIGRtID0gZmRybSwgbGJ0ID0gOSwgZGJ0ID0gNTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICAgICAgICAgIC8vICBsaXRlcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aHNcbiAgICAgICAgICAgICAgICB2YXIgaExpdCA9IGJpdHMoZGF0LCBwb3MsIDMxKSArIDI1NywgaGNMZW4gPSBiaXRzKGRhdCwgcG9zICsgMTAsIDE1KSArIDQ7XG4gICAgICAgICAgICAgICAgdmFyIHRsID0gaExpdCArIGJpdHMoZGF0LCBwb3MgKyA1LCAzMSkgKyAxO1xuICAgICAgICAgICAgICAgIHBvcyArPSAxNDtcbiAgICAgICAgICAgICAgICAvLyBsZW5ndGgrZGlzdGFuY2UgdHJlZVxuICAgICAgICAgICAgICAgIHZhciBsZHQgPSBuZXcgdTgodGwpO1xuICAgICAgICAgICAgICAgIC8vIGNvZGUgbGVuZ3RoIHRyZWVcbiAgICAgICAgICAgICAgICB2YXIgY2x0ID0gbmV3IHU4KDE5KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhjTGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGluZGV4IG1hcCB0byBnZXQgcmVhbCBjb2RlXG4gICAgICAgICAgICAgICAgICAgIGNsdFtjbGltW2ldXSA9IGJpdHMoZGF0LCBwb3MgKyBpICogMywgNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyArPSBoY0xlbiAqIDM7XG4gICAgICAgICAgICAgICAgLy8gY29kZSBsZW5ndGhzIGJpdHNcbiAgICAgICAgICAgICAgICB2YXIgY2xiID0gbWF4KGNsdCksIGNsYm1zayA9ICgxIDw8IGNsYikgLSAxO1xuICAgICAgICAgICAgICAgIC8vIGNvZGUgbGVuZ3RocyBtYXBcbiAgICAgICAgICAgICAgICB2YXIgY2xtID0gaE1hcChjbHQsIGNsYiwgMSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0bDspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBjbG1bYml0cyhkYXQsIHBvcywgY2xibXNrKV07XG4gICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgcmVhZFxuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gciAmIDE1O1xuICAgICAgICAgICAgICAgICAgICAvLyBzeW1ib2xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSByID4+IDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgbGVuZ3RoIHRvIGNvcHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPCAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGR0W2krK10gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGNvcHkgICBjb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwLCBuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09IDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAzICsgYml0cyhkYXQsIHBvcywgMyksIHBvcyArPSAyLCBjID0gbGR0W2kgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMgPT0gMTcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDMgKyBiaXRzKGRhdCwgcG9zLCA3KSwgcG9zICs9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzID09IDE4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAxMSArIGJpdHMoZGF0LCBwb3MsIDEyNyksIHBvcyArPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4tLSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZHRbaSsrXSA9IGM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgbGVuZ3RoIHRyZWUgICAgICAgICAgICAgICAgIGRpc3RhbmNlIHRyZWVcbiAgICAgICAgICAgICAgICB2YXIgbHQgPSBsZHQuc3ViYXJyYXkoMCwgaExpdCksIGR0ID0gbGR0LnN1YmFycmF5KGhMaXQpO1xuICAgICAgICAgICAgICAgIC8vIG1heCBsZW5ndGggYml0c1xuICAgICAgICAgICAgICAgIGxidCA9IG1heChsdCk7XG4gICAgICAgICAgICAgICAgLy8gbWF4IGRpc3QgYml0c1xuICAgICAgICAgICAgICAgIGRidCA9IG1heChkdCk7XG4gICAgICAgICAgICAgICAgbG0gPSBoTWFwKGx0LCBsYnQsIDEpO1xuICAgICAgICAgICAgICAgIGRtID0gaE1hcChkdCwgZGJ0LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlcnIoMSk7XG4gICAgICAgICAgICBpZiAocG9zID4gdGJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChub1N0KVxuICAgICAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBidWZmZXIgY2FuIGhvbGQgdGhpcyArIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGFkZGl0aW9uXG4gICAgICAgIC8vIE1heGltdW0gY2h1bmsgc2l6ZSAocHJhY3RpY2FsbHksIHRoZW9yZXRpY2FsbHkgaW5maW5pdGUpIGlzIDJeMTdcbiAgICAgICAgaWYgKHJlc2l6ZSlcbiAgICAgICAgICAgIGNidWYoYnQgKyAxMzEwNzIpO1xuICAgICAgICB2YXIgbG1zID0gKDEgPDwgbGJ0KSAtIDEsIGRtcyA9ICgxIDw8IGRidCkgLSAxO1xuICAgICAgICB2YXIgbHBvcyA9IHBvcztcbiAgICAgICAgZm9yICg7OyBscG9zID0gcG9zKSB7XG4gICAgICAgICAgICAvLyBiaXRzIHJlYWQsIGNvZGVcbiAgICAgICAgICAgIHZhciBjID0gbG1bYml0czE2KGRhdCwgcG9zKSAmIGxtc10sIHN5bSA9IGMgPj4gNDtcbiAgICAgICAgICAgIHBvcyArPSBjICYgMTU7XG4gICAgICAgICAgICBpZiAocG9zID4gdGJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChub1N0KVxuICAgICAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWMpXG4gICAgICAgICAgICAgICAgZXJyKDIpO1xuICAgICAgICAgICAgaWYgKHN5bSA8IDI1NilcbiAgICAgICAgICAgICAgICBidWZbYnQrK10gPSBzeW07XG4gICAgICAgICAgICBlbHNlIGlmIChzeW0gPT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgbHBvcyA9IHBvcywgbG0gPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGFkZCA9IHN5bSAtIDI1NDtcbiAgICAgICAgICAgICAgICAvLyBubyBleHRyYSBiaXRzIG5lZWRlZCBpZiBsZXNzXG4gICAgICAgICAgICAgICAgaWYgKHN5bSA+IDI2NCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmRleFxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHN5bSAtIDI1NywgYiA9IGZsZWJbaV07XG4gICAgICAgICAgICAgICAgICAgIGFkZCA9IGJpdHMoZGF0LCBwb3MsICgxIDw8IGIpIC0gMSkgKyBmbFtpXTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRpc3RcbiAgICAgICAgICAgICAgICB2YXIgZCA9IGRtW2JpdHMxNihkYXQsIHBvcykgJiBkbXNdLCBkc3ltID0gZCA+PiA0O1xuICAgICAgICAgICAgICAgIGlmICghZClcbiAgICAgICAgICAgICAgICAgICAgZXJyKDMpO1xuICAgICAgICAgICAgICAgIHBvcyArPSBkICYgMTU7XG4gICAgICAgICAgICAgICAgdmFyIGR0ID0gZmRbZHN5bV07XG4gICAgICAgICAgICAgICAgaWYgKGRzeW0gPiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiID0gZmRlYltkc3ltXTtcbiAgICAgICAgICAgICAgICAgICAgZHQgKz0gYml0czE2KGRhdCwgcG9zKSAmICgxIDw8IGIpIC0gMSwgcG9zICs9IGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3MgPiB0YnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub1N0KVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgY2J1ZihidCArIDEzMTA3Mik7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IGJ0ICsgYWRkO1xuICAgICAgICAgICAgICAgIGlmIChidCA8IGR0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzaGlmdCA9IGRsIC0gZHQsIGRlbmQgPSBNYXRoLm1pbihkdCwgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICsgYnQgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyKDMpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYnQgPCBkZW5kOyArK2J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2J0XSA9IGRpY3Rbc2hpZnQgKyBidF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoOyBidCA8IGVuZDsgKytidClcbiAgICAgICAgICAgICAgICAgICAgYnVmW2J0XSA9IGJ1ZltidCAtIGR0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdC5sID0gbG0sIHN0LnAgPSBscG9zLCBzdC5iID0gYnQsIHN0LmYgPSBmaW5hbDtcbiAgICAgICAgaWYgKGxtKVxuICAgICAgICAgICAgZmluYWwgPSAxLCBzdC5tID0gbGJ0LCBzdC5kID0gZG0sIHN0Lm4gPSBkYnQ7XG4gICAgfSB3aGlsZSAoIWZpbmFsKTtcbiAgICAvLyBkb24ndCByZWFsbG9jYXRlIGZvciBzdHJlYW1zIG9yIHVzZXIgYnVmZmVyc1xuICAgIHJldHVybiBidCAhPSBidWYubGVuZ3RoICYmIG5vQnVmID8gc2xjKGJ1ZiwgMCwgYnQpIDogYnVmLnN1YmFycmF5KDAsIGJ0KTtcbn07XG4vLyBzdGFydGluZyBhdCBwLCB3cml0ZSB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyB0aGF0IGNhbiBob2xkIHYgdG8gZFxudmFyIHdiaXRzID0gZnVuY3Rpb24gKGQsIHAsIHYpIHtcbiAgICB2IDw8PSBwICYgNztcbiAgICB2YXIgbyA9IChwIC8gOCkgfCAwO1xuICAgIGRbb10gfD0gdjtcbiAgICBkW28gKyAxXSB8PSB2ID4+IDg7XG59O1xuLy8gc3RhcnRpbmcgYXQgcCwgd3JpdGUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgKD44KSB0aGF0IGNhbiBob2xkIHYgdG8gZFxudmFyIHdiaXRzMTYgPSBmdW5jdGlvbiAoZCwgcCwgdikge1xuICAgIHYgPDw9IHAgJiA3O1xuICAgIHZhciBvID0gKHAgLyA4KSB8IDA7XG4gICAgZFtvXSB8PSB2O1xuICAgIGRbbyArIDFdIHw9IHYgPj4gODtcbiAgICBkW28gKyAyXSB8PSB2ID4+IDE2O1xufTtcbi8vIGNyZWF0ZXMgY29kZSBsZW5ndGhzIGZyb20gYSBmcmVxdWVuY3kgdGFibGVcbnZhciBoVHJlZSA9IGZ1bmN0aW9uIChkLCBtYikge1xuICAgIC8vIE5lZWQgZXh0cmEgaW5mbyB0byBtYWtlIGEgdHJlZVxuICAgIHZhciB0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChkW2ldKVxuICAgICAgICAgICAgdC5wdXNoKHsgczogaSwgZjogZFtpXSB9KTtcbiAgICB9XG4gICAgdmFyIHMgPSB0Lmxlbmd0aDtcbiAgICB2YXIgdDIgPSB0LnNsaWNlKCk7XG4gICAgaWYgKCFzKVxuICAgICAgICByZXR1cm4geyB0OiBldCwgbDogMCB9O1xuICAgIGlmIChzID09IDEpIHtcbiAgICAgICAgdmFyIHYgPSBuZXcgdTgodFswXS5zICsgMSk7XG4gICAgICAgIHZbdFswXS5zXSA9IDE7XG4gICAgICAgIHJldHVybiB7IHQ6IHYsIGw6IDEgfTtcbiAgICB9XG4gICAgdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmYgLSBiLmY7IH0pO1xuICAgIC8vIGFmdGVyIGkyIHJlYWNoZXMgbGFzdCBpbmQsIHdpbGwgYmUgc3RvcHBlZFxuICAgIC8vIGZyZXEgbXVzdCBiZSBncmVhdGVyIHRoYW4gbGFyZ2VzdCBwb3NzaWJsZSBudW1iZXIgb2Ygc3ltYm9sc1xuICAgIHQucHVzaCh7IHM6IC0xLCBmOiAyNTAwMSB9KTtcbiAgICB2YXIgbCA9IHRbMF0sIHIgPSB0WzFdLCBpMCA9IDAsIGkxID0gMSwgaTIgPSAyO1xuICAgIHRbMF0gPSB7IHM6IC0xLCBmOiBsLmYgKyByLmYsIGw6IGwsIHI6IHIgfTtcbiAgICAvLyBlZmZpY2llbnQgYWxnb3JpdGhtIGZyb20gVVpJUC5qc1xuICAgIC8vIGkwIGlzIGxvb2tiZWhpbmQsIGkyIGlzIGxvb2thaGVhZCAtIGFmdGVyIHByb2Nlc3NpbmcgdHdvIGxvdy1mcmVxXG4gICAgLy8gc3ltYm9scyB0aGF0IGNvbWJpbmVkIGhhdmUgaGlnaCBmcmVxLCB3aWxsIHN0YXJ0IHByb2Nlc3NpbmcgaTIgKGhpZ2gtZnJlcSxcbiAgICAvLyBub24tY29tcG9zaXRlKSBzeW1ib2xzIGluc3RlYWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9yZWRkaXQuY29tL3IvcGhvdG9wZWEvY29tbWVudHMvaWtla2h0L3V6aXBqc19xdWVzdGlvbnMvXG4gICAgd2hpbGUgKGkxICE9IHMgLSAxKSB7XG4gICAgICAgIGwgPSB0W3RbaTBdLmYgPCB0W2kyXS5mID8gaTArKyA6IGkyKytdO1xuICAgICAgICByID0gdFtpMCAhPSBpMSAmJiB0W2kwXS5mIDwgdFtpMl0uZiA/IGkwKysgOiBpMisrXTtcbiAgICAgICAgdFtpMSsrXSA9IHsgczogLTEsIGY6IGwuZiArIHIuZiwgbDogbCwgcjogciB9O1xuICAgIH1cbiAgICB2YXIgbWF4U3ltID0gdDJbMF0ucztcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHM7ICsraSkge1xuICAgICAgICBpZiAodDJbaV0ucyA+IG1heFN5bSlcbiAgICAgICAgICAgIG1heFN5bSA9IHQyW2ldLnM7XG4gICAgfVxuICAgIC8vIGNvZGUgbGVuZ3Roc1xuICAgIHZhciB0ciA9IG5ldyB1MTYobWF4U3ltICsgMSk7XG4gICAgLy8gbWF4IGJpdHMgaW4gdHJlZVxuICAgIHZhciBtYnQgPSBsbih0W2kxIC0gMV0sIHRyLCAwKTtcbiAgICBpZiAobWJ0ID4gbWIpIHtcbiAgICAgICAgLy8gbW9yZSBhbGdvcml0aG1zIGZyb20gVVpJUC5qc1xuICAgICAgICAvLyBUT0RPOiBmaW5kIG91dCBob3cgdGhpcyBjb2RlIHdvcmtzIChkZWJ0KVxuICAgICAgICAvLyAgaW5kICAgIGRlYnRcbiAgICAgICAgdmFyIGkgPSAwLCBkdCA9IDA7XG4gICAgICAgIC8vICAgIGxlZnQgICAgICAgICAgICBjb3N0XG4gICAgICAgIHZhciBsZnQgPSBtYnQgLSBtYiwgY3N0ID0gMSA8PCBsZnQ7XG4gICAgICAgIHQyLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRyW2Iuc10gLSB0clthLnNdIHx8IGEuZiAtIGIuZjsgfSk7XG4gICAgICAgIGZvciAoOyBpIDwgczsgKytpKSB7XG4gICAgICAgICAgICB2YXIgaTJfMSA9IHQyW2ldLnM7XG4gICAgICAgICAgICBpZiAodHJbaTJfMV0gPiBtYikge1xuICAgICAgICAgICAgICAgIGR0ICs9IGNzdCAtICgxIDw8IChtYnQgLSB0cltpMl8xXSkpO1xuICAgICAgICAgICAgICAgIHRyW2kyXzFdID0gbWI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZHQgPj49IGxmdDtcbiAgICAgICAgd2hpbGUgKGR0ID4gMCkge1xuICAgICAgICAgICAgdmFyIGkyXzIgPSB0MltpXS5zO1xuICAgICAgICAgICAgaWYgKHRyW2kyXzJdIDwgbWIpXG4gICAgICAgICAgICAgICAgZHQgLT0gMSA8PCAobWIgLSB0cltpMl8yXSsrIC0gMSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKytpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBpID49IDAgJiYgZHQ7IC0taSkge1xuICAgICAgICAgICAgdmFyIGkyXzMgPSB0MltpXS5zO1xuICAgICAgICAgICAgaWYgKHRyW2kyXzNdID09IG1iKSB7XG4gICAgICAgICAgICAgICAgLS10cltpMl8zXTtcbiAgICAgICAgICAgICAgICArK2R0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1idCA9IG1iO1xuICAgIH1cbiAgICByZXR1cm4geyB0OiBuZXcgdTgodHIpLCBsOiBtYnQgfTtcbn07XG4vLyBnZXQgdGhlIG1heCBsZW5ndGggYW5kIGFzc2lnbiBsZW5ndGggY29kZXNcbnZhciBsbiA9IGZ1bmN0aW9uIChuLCBsLCBkKSB7XG4gICAgcmV0dXJuIG4ucyA9PSAtMVxuICAgICAgICA/IE1hdGgubWF4KGxuKG4ubCwgbCwgZCArIDEpLCBsbihuLnIsIGwsIGQgKyAxKSlcbiAgICAgICAgOiAobFtuLnNdID0gZCk7XG59O1xuLy8gbGVuZ3RoIGNvZGVzIGdlbmVyYXRpb25cbnZhciBsYyA9IGZ1bmN0aW9uIChjKSB7XG4gICAgdmFyIHMgPSBjLmxlbmd0aDtcbiAgICAvLyBOb3RlIHRoYXQgdGhlIHNlbWljb2xvbiB3YXMgaW50ZW50aW9uYWxcbiAgICB3aGlsZSAocyAmJiAhY1stLXNdKVxuICAgICAgICA7XG4gICAgdmFyIGNsID0gbmV3IHUxNigrK3MpO1xuICAgIC8vICBpbmQgICAgICBudW0gICAgICAgICBzdHJlYWtcbiAgICB2YXIgY2xpID0gMCwgY2xuID0gY1swXSwgY2xzID0gMTtcbiAgICB2YXIgdyA9IGZ1bmN0aW9uICh2KSB7IGNsW2NsaSsrXSA9IHY7IH07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gczsgKytpKSB7XG4gICAgICAgIGlmIChjW2ldID09IGNsbiAmJiBpICE9IHMpXG4gICAgICAgICAgICArK2NscztcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWNsbiAmJiBjbHMgPiAyKSB7XG4gICAgICAgICAgICAgICAgZm9yICg7IGNscyA+IDEzODsgY2xzIC09IDEzOClcbiAgICAgICAgICAgICAgICAgICAgdygzMjc1NCk7XG4gICAgICAgICAgICAgICAgaWYgKGNscyA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdyhjbHMgPiAxMCA/ICgoY2xzIC0gMTEpIDw8IDUpIHwgMjg2OTAgOiAoKGNscyAtIDMpIDw8IDUpIHwgMTIzMDUpO1xuICAgICAgICAgICAgICAgICAgICBjbHMgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNscyA+IDMpIHtcbiAgICAgICAgICAgICAgICB3KGNsbiksIC0tY2xzO1xuICAgICAgICAgICAgICAgIGZvciAoOyBjbHMgPiA2OyBjbHMgLT0gNilcbiAgICAgICAgICAgICAgICAgICAgdyg4MzA0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2xzID4gMilcbiAgICAgICAgICAgICAgICAgICAgdygoKGNscyAtIDMpIDw8IDUpIHwgODIwOCksIGNscyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY2xzLS0pXG4gICAgICAgICAgICAgICAgdyhjbG4pO1xuICAgICAgICAgICAgY2xzID0gMTtcbiAgICAgICAgICAgIGNsbiA9IGNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYzogY2wuc3ViYXJyYXkoMCwgY2xpKSwgbjogcyB9O1xufTtcbi8vIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIG91dHB1dCBmcm9tIHRyZWUsIGNvZGUgbGVuZ3Roc1xudmFyIGNsZW4gPSBmdW5jdGlvbiAoY2YsIGNsKSB7XG4gICAgdmFyIGwgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2wubGVuZ3RoOyArK2kpXG4gICAgICAgIGwgKz0gY2ZbaV0gKiBjbFtpXTtcbiAgICByZXR1cm4gbDtcbn07XG4vLyB3cml0ZXMgYSBmaXhlZCBibG9ja1xuLy8gcmV0dXJucyB0aGUgbmV3IGJpdCBwb3NcbnZhciB3ZmJsayA9IGZ1bmN0aW9uIChvdXQsIHBvcywgZGF0KSB7XG4gICAgLy8gbm8gbmVlZCB0byB3cml0ZSAwMCBhcyB0eXBlOiBUeXBlZEFycmF5IGRlZmF1bHRzIHRvIDBcbiAgICB2YXIgcyA9IGRhdC5sZW5ndGg7XG4gICAgdmFyIG8gPSBzaGZ0KHBvcyArIDIpO1xuICAgIG91dFtvXSA9IHMgJiAyNTU7XG4gICAgb3V0W28gKyAxXSA9IHMgPj4gODtcbiAgICBvdXRbbyArIDJdID0gb3V0W29dIF4gMjU1O1xuICAgIG91dFtvICsgM10gPSBvdXRbbyArIDFdIF4gMjU1O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgKytpKVxuICAgICAgICBvdXRbbyArIGkgKyA0XSA9IGRhdFtpXTtcbiAgICByZXR1cm4gKG8gKyA0ICsgcykgKiA4O1xufTtcbi8vIHdyaXRlcyBhIGJsb2NrXG52YXIgd2JsayA9IGZ1bmN0aW9uIChkYXQsIG91dCwgZmluYWwsIHN5bXMsIGxmLCBkZiwgZWIsIGxpLCBicywgYmwsIHApIHtcbiAgICB3Yml0cyhvdXQsIHArKywgZmluYWwpO1xuICAgICsrbGZbMjU2XTtcbiAgICB2YXIgX2EgPSBoVHJlZShsZiwgMTUpLCBkbHQgPSBfYS50LCBtbGIgPSBfYS5sO1xuICAgIHZhciBfYiA9IGhUcmVlKGRmLCAxNSksIGRkdCA9IF9iLnQsIG1kYiA9IF9iLmw7XG4gICAgdmFyIF9jID0gbGMoZGx0KSwgbGNsdCA9IF9jLmMsIG5sYyA9IF9jLm47XG4gICAgdmFyIF9kID0gbGMoZGR0KSwgbGNkdCA9IF9kLmMsIG5kYyA9IF9kLm47XG4gICAgdmFyIGxjZnJlcSA9IG5ldyB1MTYoMTkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGNsdC5sZW5ndGg7ICsraSlcbiAgICAgICAgKytsY2ZyZXFbbGNsdFtpXSAmIDMxXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxjZHQubGVuZ3RoOyArK2kpXG4gICAgICAgICsrbGNmcmVxW2xjZHRbaV0gJiAzMV07XG4gICAgdmFyIF9lID0gaFRyZWUobGNmcmVxLCA3KSwgbGN0ID0gX2UudCwgbWxjYiA9IF9lLmw7XG4gICAgdmFyIG5sY2MgPSAxOTtcbiAgICBmb3IgKDsgbmxjYyA+IDQgJiYgIWxjdFtjbGltW25sY2MgLSAxXV07IC0tbmxjYylcbiAgICAgICAgO1xuICAgIHZhciBmbGVuID0gKGJsICsgNSkgPDwgMztcbiAgICB2YXIgZnRsZW4gPSBjbGVuKGxmLCBmbHQpICsgY2xlbihkZiwgZmR0KSArIGViO1xuICAgIHZhciBkdGxlbiA9IGNsZW4obGYsIGRsdCkgKyBjbGVuKGRmLCBkZHQpICsgZWIgKyAxNCArIDMgKiBubGNjICsgY2xlbihsY2ZyZXEsIGxjdCkgKyAyICogbGNmcmVxWzE2XSArIDMgKiBsY2ZyZXFbMTddICsgNyAqIGxjZnJlcVsxOF07XG4gICAgaWYgKGJzID49IDAgJiYgZmxlbiA8PSBmdGxlbiAmJiBmbGVuIDw9IGR0bGVuKVxuICAgICAgICByZXR1cm4gd2ZibGsob3V0LCBwLCBkYXQuc3ViYXJyYXkoYnMsIGJzICsgYmwpKTtcbiAgICB2YXIgbG0sIGxsLCBkbSwgZGw7XG4gICAgd2JpdHMob3V0LCBwLCAxICsgKGR0bGVuIDwgZnRsZW4pKSwgcCArPSAyO1xuICAgIGlmIChkdGxlbiA8IGZ0bGVuKSB7XG4gICAgICAgIGxtID0gaE1hcChkbHQsIG1sYiwgMCksIGxsID0gZGx0LCBkbSA9IGhNYXAoZGR0LCBtZGIsIDApLCBkbCA9IGRkdDtcbiAgICAgICAgdmFyIGxsbSA9IGhNYXAobGN0LCBtbGNiLCAwKTtcbiAgICAgICAgd2JpdHMob3V0LCBwLCBubGMgLSAyNTcpO1xuICAgICAgICB3Yml0cyhvdXQsIHAgKyA1LCBuZGMgLSAxKTtcbiAgICAgICAgd2JpdHMob3V0LCBwICsgMTAsIG5sY2MgLSA0KTtcbiAgICAgICAgcCArPSAxNDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBubGNjOyArK2kpXG4gICAgICAgICAgICB3Yml0cyhvdXQsIHAgKyAzICogaSwgbGN0W2NsaW1baV1dKTtcbiAgICAgICAgcCArPSAzICogbmxjYztcbiAgICAgICAgdmFyIGxjdHMgPSBbbGNsdCwgbGNkdF07XG4gICAgICAgIGZvciAodmFyIGl0ID0gMDsgaXQgPCAyOyArK2l0KSB7XG4gICAgICAgICAgICB2YXIgY2xjdCA9IGxjdHNbaXRdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNsY3RbaV0gJiAzMTtcbiAgICAgICAgICAgICAgICB3Yml0cyhvdXQsIHAsIGxsbVtsZW5dKSwgcCArPSBsY3RbbGVuXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMTUpXG4gICAgICAgICAgICAgICAgICAgIHdiaXRzKG91dCwgcCwgKGNsY3RbaV0gPj4gNSkgJiAxMjcpLCBwICs9IGNsY3RbaV0gPj4gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxtID0gZmxtLCBsbCA9IGZsdCwgZG0gPSBmZG0sIGRsID0gZmR0O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpOyArK2kpIHtcbiAgICAgICAgdmFyIHN5bSA9IHN5bXNbaV07XG4gICAgICAgIGlmIChzeW0gPiAyNTUpIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSAoc3ltID4+IDE4KSAmIDMxO1xuICAgICAgICAgICAgd2JpdHMxNihvdXQsIHAsIGxtW2xlbiArIDI1N10pLCBwICs9IGxsW2xlbiArIDI1N107XG4gICAgICAgICAgICBpZiAobGVuID4gNylcbiAgICAgICAgICAgICAgICB3Yml0cyhvdXQsIHAsIChzeW0gPj4gMjMpICYgMzEpLCBwICs9IGZsZWJbbGVuXTtcbiAgICAgICAgICAgIHZhciBkc3QgPSBzeW0gJiAzMTtcbiAgICAgICAgICAgIHdiaXRzMTYob3V0LCBwLCBkbVtkc3RdKSwgcCArPSBkbFtkc3RdO1xuICAgICAgICAgICAgaWYgKGRzdCA+IDMpXG4gICAgICAgICAgICAgICAgd2JpdHMxNihvdXQsIHAsIChzeW0gPj4gNSkgJiA4MTkxKSwgcCArPSBmZGViW2RzdF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3Yml0czE2KG91dCwgcCwgbG1bc3ltXSksIHAgKz0gbGxbc3ltXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3Yml0czE2KG91dCwgcCwgbG1bMjU2XSk7XG4gICAgcmV0dXJuIHAgKyBsbFsyNTZdO1xufTtcbi8vIGRlZmxhdGUgb3B0aW9ucyAobmljZSA8PCAxMykgfCBjaGFpblxudmFyIGRlbyA9IC8qI19fUFVSRV9fKi8gbmV3IGkzMihbNjU1NDAsIDEzMTA4MCwgMTMxMDg4LCAxMzExMDQsIDI2MjE3NiwgMTA0ODcwNCwgMTA0ODgzMiwgMjExNDU2MCwgMjExNzYzMl0pO1xuLy8gZW1wdHlcbnZhciBldCA9IC8qI19fUFVSRV9fKi8gbmV3IHU4KDApO1xuLy8gY29tcHJlc3NlcyBkYXRhIGludG8gYSByYXcgREVGTEFURSBidWZmZXJcbnZhciBkZmx0ID0gZnVuY3Rpb24gKGRhdCwgbHZsLCBwbHZsLCBwcmUsIHBvc3QsIHN0KSB7XG4gICAgdmFyIHMgPSBzdC56IHx8IGRhdC5sZW5ndGg7XG4gICAgdmFyIG8gPSBuZXcgdTgocHJlICsgcyArIDUgKiAoMSArIE1hdGguY2VpbChzIC8gNzAwMCkpICsgcG9zdCk7XG4gICAgLy8gd3JpdGluZyB0byB0aGlzIHdyaXRlcyB0byB0aGUgb3V0cHV0IGJ1ZmZlclxuICAgIHZhciB3ID0gby5zdWJhcnJheShwcmUsIG8ubGVuZ3RoIC0gcG9zdCk7XG4gICAgdmFyIGxzdCA9IHN0Lmw7XG4gICAgdmFyIHBvcyA9IChzdC5yIHx8IDApICYgNztcbiAgICBpZiAobHZsKSB7XG4gICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICB3WzBdID0gc3QuciA+PiAzO1xuICAgICAgICB2YXIgb3B0ID0gZGVvW2x2bCAtIDFdO1xuICAgICAgICB2YXIgbiA9IG9wdCA+PiAxMywgYyA9IG9wdCAmIDgxOTE7XG4gICAgICAgIHZhciBtc2tfMSA9ICgxIDw8IHBsdmwpIC0gMTtcbiAgICAgICAgLy8gICAgcHJldiAyLWJ5dGUgdmFsIG1hcCAgICBjdXJyIDItYnl0ZSB2YWwgbWFwXG4gICAgICAgIHZhciBwcmV2ID0gc3QucCB8fCBuZXcgdTE2KDMyNzY4KSwgaGVhZCA9IHN0LmggfHwgbmV3IHUxNihtc2tfMSArIDEpO1xuICAgICAgICB2YXIgYnMxXzEgPSBNYXRoLmNlaWwocGx2bCAvIDMpLCBiczJfMSA9IDIgKiBiczFfMTtcbiAgICAgICAgdmFyIGhzaCA9IGZ1bmN0aW9uIChpKSB7IHJldHVybiAoZGF0W2ldIF4gKGRhdFtpICsgMV0gPDwgYnMxXzEpIF4gKGRhdFtpICsgMl0gPDwgYnMyXzEpKSAmIG1za18xOyB9O1xuICAgICAgICAvLyAyNDU3NiBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG1heGltdW0gc3ltYm9scyBwZXIgYmxvY2tcbiAgICAgICAgLy8gNDI0IGJ1ZmZlciBmb3IgbGFzdCBibG9ja1xuICAgICAgICB2YXIgc3ltcyA9IG5ldyBpMzIoMjUwMDApO1xuICAgICAgICAvLyBsZW5ndGgvbGl0ZXJhbCBmcmVxICAgZGlzdGFuY2UgZnJlcVxuICAgICAgICB2YXIgbGYgPSBuZXcgdTE2KDI4OCksIGRmID0gbmV3IHUxNigzMik7XG4gICAgICAgIC8vICBsL2xjbnQgIGV4Yml0cyAgaW5kZXggICAgICAgICAgbC9saW5kICB3YWl0ZHggICAgICAgICAgYmxrcG9zXG4gICAgICAgIHZhciBsY18xID0gMCwgZWIgPSAwLCBpID0gc3QuaSB8fCAwLCBsaSA9IDAsIHdpID0gc3QudyB8fCAwLCBicyA9IDA7XG4gICAgICAgIGZvciAoOyBpICsgMiA8IHM7ICsraSkge1xuICAgICAgICAgICAgLy8gaGFzaCB2YWx1ZVxuICAgICAgICAgICAgdmFyIGh2ID0gaHNoKGkpO1xuICAgICAgICAgICAgLy8gaW5kZXggbW9kIDMyNzY4ICAgIHByZXZpb3VzIGluZGV4IG1vZFxuICAgICAgICAgICAgdmFyIGltb2QgPSBpICYgMzI3NjcsIHBpbW9kID0gaGVhZFtodl07XG4gICAgICAgICAgICBwcmV2W2ltb2RdID0gcGltb2Q7XG4gICAgICAgICAgICBoZWFkW2h2XSA9IGltb2Q7XG4gICAgICAgICAgICAvLyBXZSBhbHdheXMgc2hvdWxkIG1vZGlmeSBoZWFkIGFuZCBwcmV2LCBidXQgb25seSBhZGQgc3ltYm9scyBpZlxuICAgICAgICAgICAgLy8gdGhpcyBkYXRhIGlzIG5vdCB5ZXQgcHJvY2Vzc2VkIChcIndhaXRcIiBmb3Igd2FpdCBpbmRleClcbiAgICAgICAgICAgIGlmICh3aSA8PSBpKSB7XG4gICAgICAgICAgICAgICAgLy8gYnl0ZXMgcmVtYWluaW5nXG4gICAgICAgICAgICAgICAgdmFyIHJlbSA9IHMgLSBpO1xuICAgICAgICAgICAgICAgIGlmICgobGNfMSA+IDcwMDAgfHwgbGkgPiAyNDU3NikgJiYgKHJlbSA+IDQyMyB8fCAhbHN0KSkge1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSB3YmxrKGRhdCwgdywgMCwgc3ltcywgbGYsIGRmLCBlYiwgbGksIGJzLCBpIC0gYnMsIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGxpID0gbGNfMSA9IGViID0gMCwgYnMgPSBpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDI4NjsgKytqKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGZbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDMwOyArK2opXG4gICAgICAgICAgICAgICAgICAgICAgICBkZltqXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICBsZW4gICAgZGlzdCAgIGNoYWluXG4gICAgICAgICAgICAgICAgdmFyIGwgPSAyLCBkID0gMCwgY2hfMSA9IGMsIGRpZiA9IGltb2QgLSBwaW1vZCAmIDMyNzY3O1xuICAgICAgICAgICAgICAgIGlmIChyZW0gPiAyICYmIGh2ID09IGhzaChpIC0gZGlmKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4biA9IE1hdGgubWluKG4sIHJlbSkgLSAxO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ZCA9IE1hdGgubWluKDMyNzY3LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHBvc3NpYmxlIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAvLyBub3QgY2FwcGVkIGF0IGRpZiBiZWNhdXNlIGRlY29tcHJlc3NvcnMgaW1wbGVtZW50IFwicm9sbGluZ1wiIGluZGV4IHBvcHVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1sID0gTWF0aC5taW4oMjU4LCByZW0pO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGlmIDw9IG1heGQgJiYgLS1jaF8xICYmIGltb2QgIT0gcGltb2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRbaSArIGxdID09IGRhdFtpICsgbCAtIGRpZl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmwgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBubCA8IG1sICYmIGRhdFtpICsgbmxdID09IGRhdFtpICsgbmwgLSBkaWZdOyArK25sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5sID4gbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gbmwsIGQgPSBkaWY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrIG91dCBlYXJseSB3aGVuIHdlIHJlYWNoIFwibmljZVwiICh3ZSBhcmUgc2F0aXNmaWVkIGVub3VnaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5sID4gbWF4bilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3csIGZpbmQgdGhlIHJhcmVzdCAyLWJ5dGUgc2VxdWVuY2Ugd2l0aGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIGxpdGVyYWxzIGFuZCBzZWFyY2ggZm9yIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVjaCBmYXN0ZXIgdGhhbiBqdXN0IHVzaW5nIHRoZSBzdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW1kID0gTWF0aC5taW4oZGlmLCBubCAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1tZDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGkgPSBpIC0gZGlmICsgaiAmIDMyNzY3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB0aSA9IHByZXZbdGldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNkID0gdGkgLSBwdGkgJiAzMjc2NztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZCA+IG1kKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kID0gY2QsIHBpbW9kID0gdGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgcHJldmlvdXMgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGltb2QgPSBwaW1vZCwgcGltb2QgPSBwcmV2W2ltb2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmICs9IGltb2QgLSBwaW1vZCAmIDMyNzY3O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGQgd2lsbCBiZSBub256ZXJvIG9ubHkgd2hlbiBhIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJvdGggZGlzdCBhbmQgbGVuIGRhdGEgaW4gb25lIGludDMyXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGlzIHJlY29nbml6ZWQgYXMgYSBsZW4vZGlzdCB3aXRoIDI4dGggYml0ICgyXjI4KVxuICAgICAgICAgICAgICAgICAgICBzeW1zW2xpKytdID0gMjY4NDM1NDU2IHwgKHJldmZsW2xdIDw8IDE4KSB8IHJldmZkW2RdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluID0gcmV2ZmxbbF0gJiAzMSwgZGluID0gcmV2ZmRbZF0gJiAzMTtcbiAgICAgICAgICAgICAgICAgICAgZWIgKz0gZmxlYltsaW5dICsgZmRlYltkaW5dO1xuICAgICAgICAgICAgICAgICAgICArK2xmWzI1NyArIGxpbl07XG4gICAgICAgICAgICAgICAgICAgICsrZGZbZGluXTtcbiAgICAgICAgICAgICAgICAgICAgd2kgPSBpICsgbDtcbiAgICAgICAgICAgICAgICAgICAgKytsY18xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltc1tsaSsrXSA9IGRhdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgKytsZltkYXRbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBNYXRoLm1heChpLCB3aSk7IGkgPCBzOyArK2kpIHtcbiAgICAgICAgICAgIHN5bXNbbGkrK10gPSBkYXRbaV07XG4gICAgICAgICAgICArK2xmW2RhdFtpXV07XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gd2JsayhkYXQsIHcsIGxzdCwgc3ltcywgbGYsIGRmLCBlYiwgbGksIGJzLCBpIC0gYnMsIHBvcyk7XG4gICAgICAgIGlmICghbHN0KSB7XG4gICAgICAgICAgICBzdC5yID0gKHBvcyAmIDcpIHwgd1socG9zIC8gOCkgfCAwXSA8PCAzO1xuICAgICAgICAgICAgLy8gc2hmdChwb3MpIG5vdyAxIGxlc3MgaWYgcG9zICYgNyAhPSAwXG4gICAgICAgICAgICBwb3MgLT0gNztcbiAgICAgICAgICAgIHN0LmggPSBoZWFkLCBzdC5wID0gcHJldiwgc3QuaSA9IGksIHN0LncgPSB3aTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0LncgfHwgMDsgaSA8IHMgKyBsc3Q7IGkgKz0gNjU1MzUpIHtcbiAgICAgICAgICAgIC8vIGVuZFxuICAgICAgICAgICAgdmFyIGUgPSBpICsgNjU1MzU7XG4gICAgICAgICAgICBpZiAoZSA+PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gd3JpdGUgZmluYWwgYmxvY2tcbiAgICAgICAgICAgICAgICB3Wyhwb3MgLyA4KSB8IDBdID0gbHN0O1xuICAgICAgICAgICAgICAgIGUgPSBzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gd2ZibGsodywgcG9zICsgMSwgZGF0LnN1YmFycmF5KGksIGUpKTtcbiAgICAgICAgfVxuICAgICAgICBzdC5pID0gcztcbiAgICB9XG4gICAgcmV0dXJuIHNsYyhvLCAwLCBwcmUgKyBzaGZ0KHBvcykgKyBwb3N0KTtcbn07XG4vLyBDUkMzMiB0YWJsZVxudmFyIGNyY3QgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHQgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBpLCBrID0gOTtcbiAgICAgICAgd2hpbGUgKC0taylcbiAgICAgICAgICAgIGMgPSAoKGMgJiAxKSAmJiAtMzA2Njc0OTEyKSBeIChjID4+PiAxKTtcbiAgICAgICAgdFtpXSA9IGM7XG4gICAgfVxuICAgIHJldHVybiB0O1xufSkoKTtcbi8vIENSQzMyXG52YXIgY3JjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjID0gLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcDogZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIC8vIGNsb3N1cmVzIGhhdmUgYXdmdWwgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgIHZhciBjciA9IGM7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGQubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgY3IgPSBjcmN0WyhjciAmIDI1NSkgXiBkW2ldXSBeIChjciA+Pj4gOCk7XG4gICAgICAgICAgICBjID0gY3I7XG4gICAgICAgIH0sXG4gICAgICAgIGQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIH5jOyB9XG4gICAgfTtcbn07XG4vLyBBZGxlcjMyXG52YXIgYWRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGEgPSAxLCBiID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgICBwOiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgLy8gY2xvc3VyZXMgaGF2ZSBhd2Z1bCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgdmFyIG4gPSBhLCBtID0gYjtcbiAgICAgICAgICAgIHZhciBsID0gZC5sZW5ndGggfCAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgIT0gbDspIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IE1hdGgubWluKGkgKyAyNjU1LCBsKTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgbSArPSBuICs9IGRbaV07XG4gICAgICAgICAgICAgICAgbiA9IChuICYgNjU1MzUpICsgMTUgKiAobiA+PiAxNiksIG0gPSAobSAmIDY1NTM1KSArIDE1ICogKG0gPj4gMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYSA9IG4sIGIgPSBtO1xuICAgICAgICB9LFxuICAgICAgICBkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhICU9IDY1NTIxLCBiICU9IDY1NTIxO1xuICAgICAgICAgICAgcmV0dXJuIChhICYgMjU1KSA8PCAyNCB8IChhICYgMHhGRjAwKSA8PCA4IHwgKGIgJiAyNTUpIDw8IDggfCAoYiA+PiA4KTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuO1xuLy8gZGVmbGF0ZSB3aXRoIG9wdHNcbnZhciBkb3B0ID0gZnVuY3Rpb24gKGRhdCwgb3B0LCBwcmUsIHBvc3QsIHN0KSB7XG4gICAgaWYgKCFzdCkge1xuICAgICAgICBzdCA9IHsgbDogMSB9O1xuICAgICAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICAgICAgICAgIHZhciBkaWN0ID0gb3B0LmRpY3Rpb25hcnkuc3ViYXJyYXkoLTMyNzY4KTtcbiAgICAgICAgICAgIHZhciBuZXdEYXQgPSBuZXcgdTgoZGljdC5sZW5ndGggKyBkYXQubGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld0RhdC5zZXQoZGljdCk7XG4gICAgICAgICAgICBuZXdEYXQuc2V0KGRhdCwgZGljdC5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0ID0gbmV3RGF0O1xuICAgICAgICAgICAgc3QudyA9IGRpY3QubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZmx0KGRhdCwgb3B0LmxldmVsID09IG51bGwgPyA2IDogb3B0LmxldmVsLCBvcHQubWVtID09IG51bGwgPyAoc3QubCA/IE1hdGguY2VpbChNYXRoLm1heCg4LCBNYXRoLm1pbigxMywgTWF0aC5sb2coZGF0Lmxlbmd0aCkpKSAqIDEuNSkgOiAyMCkgOiAoMTIgKyBvcHQubWVtKSwgcHJlLCBwb3N0LCBzdCk7XG59O1xuLy8gV2FsbWFydCBvYmplY3Qgc3ByZWFkXG52YXIgbXJnID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgbyA9IHt9O1xuICAgIGZvciAodmFyIGsgaW4gYSlcbiAgICAgICAgb1trXSA9IGFba107XG4gICAgZm9yICh2YXIgayBpbiBiKVxuICAgICAgICBvW2tdID0gYltrXTtcbiAgICByZXR1cm4gbztcbn07XG4vLyB3b3JrZXIgY2xvbmVcbi8vIFRoaXMgaXMgcG9zc2libHkgdGhlIGNyYXppZXN0IHBhcnQgb2YgdGhlIGVudGlyZSBjb2RlYmFzZSwgZGVzcGl0ZSBob3cgc2ltcGxlIGl0IG1heSBzZWVtLlxuLy8gVGhlIG9ubHkgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaXMgYSBjbG9zdXJlIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgZnVuY3Rpb24gc2NvcGUuXG4vLyBXZSdyZSBnb2luZyB0byB0cnkgdG8gZmlndXJlIG91dCB0aGUgdmFyaWFibGUgbmFtZXMgdXNlZCBpbiB0aGUgY2xvc3VyZSBhcyBzdHJpbmdzIGJlY2F1c2UgdGhhdCBpcyBjcnVjaWFsIGZvciB3b3JrZXJpemF0aW9uLlxuLy8gV2Ugd2lsbCByZXR1cm4gYW4gb2JqZWN0IG1hcHBpbmcgb2YgdHJ1ZSB2YXJpYWJsZSBuYW1lIHRvIHZhbHVlIChiYXNpY2FsbHksIHRoZSBjdXJyZW50IHNjb3BlIGFzIGEgSlMgb2JqZWN0KS5cbi8vIFRoZSByZWFzb24gd2UgY2FuJ3QganVzdCB1c2UgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIG5hbWVzIGlzIG1pbmlmaWVycyBtYW5nbGluZyB0aGUgdG9wbGV2ZWwgc2NvcGUuXG4vLyBUaGlzIHRvb2sgbWUgdGhyZWUgd2Vla3MgdG8gZmlndXJlIG91dCBob3cgdG8gZG8uXG52YXIgd2NsbiA9IGZ1bmN0aW9uIChmbiwgZm5TdHIsIHRkKSB7XG4gICAgdmFyIGR0ID0gZm4oKTtcbiAgICB2YXIgc3QgPSBmbi50b1N0cmluZygpO1xuICAgIHZhciBrcyA9IHN0LnNsaWNlKHN0LmluZGV4T2YoJ1snKSArIDEsIHN0Lmxhc3RJbmRleE9mKCddJykpLnJlcGxhY2UoL1xccysvZywgJycpLnNwbGl0KCcsJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkdC5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgdiA9IGR0W2ldLCBrID0ga3NbaV07XG4gICAgICAgIGlmICh0eXBlb2YgdiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBmblN0ciArPSAnOycgKyBrICsgJz0nO1xuICAgICAgICAgICAgdmFyIHN0XzEgPSB2LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAodi5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgZ2xvYmFsIG9iamVjdHNcbiAgICAgICAgICAgICAgICBpZiAoc3RfMS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwSW5kID0gc3RfMS5pbmRleE9mKCcgJywgOCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBmblN0ciArPSBzdF8xLnNsaWNlKHNwSW5kLCBzdF8xLmluZGV4T2YoJygnLCBzcEluZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm5TdHIgKz0gc3RfMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiB2LnByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuU3RyICs9ICc7JyArIGsgKyAnLnByb3RvdHlwZS4nICsgdCArICc9JyArIHYucHJvdG90eXBlW3RdLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZuU3RyICs9IHN0XzE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGRba10gPSB2O1xuICAgIH1cbiAgICByZXR1cm4gZm5TdHI7XG59O1xudmFyIGNoID0gW107XG4vLyBjbG9uZSBidWZzXG52YXIgY2JmcyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIHRsID0gW107XG4gICAgZm9yICh2YXIgayBpbiB2KSB7XG4gICAgICAgIGlmICh2W2tdLmJ1ZmZlcikge1xuICAgICAgICAgICAgdGwucHVzaCgodltrXSA9IG5ldyB2W2tdLmNvbnN0cnVjdG9yKHZba10pKS5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bDtcbn07XG4vLyB1c2UgYSB3b3JrZXIgdG8gZXhlY3V0ZSBjb2RlXG52YXIgd3JrciA9IGZ1bmN0aW9uIChmbnMsIGluaXQsIGlkLCBjYikge1xuICAgIGlmICghY2hbaWRdKSB7XG4gICAgICAgIHZhciBmblN0ciA9ICcnLCB0ZF8xID0ge30sIG0gPSBmbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtOyArK2kpXG4gICAgICAgICAgICBmblN0ciA9IHdjbG4oZm5zW2ldLCBmblN0ciwgdGRfMSk7XG4gICAgICAgIGNoW2lkXSA9IHsgYzogd2NsbihmbnNbbV0sIGZuU3RyLCB0ZF8xKSwgZTogdGRfMSB9O1xuICAgIH1cbiAgICB2YXIgdGQgPSBtcmcoe30sIGNoW2lkXS5lKTtcbiAgICByZXR1cm4gd2soY2hbaWRdLmMgKyAnO29ubWVzc2FnZT1mdW5jdGlvbihlKXtmb3IodmFyIGsgaW4gZS5kYXRhKXNlbGZba109ZS5kYXRhW2tdO29ubWVzc2FnZT0nICsgaW5pdC50b1N0cmluZygpICsgJ30nLCBpZCwgdGQsIGNiZnModGQpLCBjYik7XG59O1xuLy8gYmFzZSBhc3luYyBpbmZsYXRlIGZuXG52YXIgYkluZmx0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW3U4LCB1MTYsIGkzMiwgZmxlYiwgZmRlYiwgY2xpbSwgZmwsIGZkLCBmbHJtLCBmZHJtLCByZXYsIGVjLCBoTWFwLCBtYXgsIGJpdHMsIGJpdHMxNiwgc2hmdCwgc2xjLCBlcnIsIGluZmx0LCBpbmZsYXRlU3luYywgcGJmLCBnb3B0XTsgfTtcbnZhciBiRGZsdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFt1OCwgdTE2LCBpMzIsIGZsZWIsIGZkZWIsIGNsaW0sIHJldmZsLCByZXZmZCwgZmxtLCBmbHQsIGZkbSwgZmR0LCByZXYsIGRlbywgZXQsIGhNYXAsIHdiaXRzLCB3Yml0czE2LCBoVHJlZSwgbG4sIGxjLCBjbGVuLCB3ZmJsaywgd2Jsaywgc2hmdCwgc2xjLCBkZmx0LCBkb3B0LCBkZWZsYXRlU3luYywgcGJmXTsgfTtcbi8vIGd6aXAgZXh0cmFcbnZhciBnemUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbZ3poLCBnemhsLCB3Ynl0ZXMsIGNyYywgY3JjdF07IH07XG4vLyBndW56aXAgZXh0cmFcbnZhciBndXplID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW2d6cywgZ3psXTsgfTtcbi8vIHpsaWIgZXh0cmFcbnZhciB6bGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbemxoLCB3Ynl0ZXMsIGFkbGVyXTsgfTtcbi8vIHVuemxpYiBleHRyYVxudmFyIHp1bGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbemxzXTsgfTtcbi8vIHBvc3QgYnVmXG52YXIgcGJmID0gZnVuY3Rpb24gKG1zZykgeyByZXR1cm4gcG9zdE1lc3NhZ2UobXNnLCBbbXNnLmJ1ZmZlcl0pOyB9O1xuLy8gZ2V0IG9wdHNcbnZhciBnb3B0ID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYge1xuICAgIG91dDogby5zaXplICYmIG5ldyB1OChvLnNpemUpLFxuICAgIGRpY3Rpb25hcnk6IG8uZGljdGlvbmFyeVxufTsgfTtcbi8vIGFzeW5jIGhlbHBlclxudmFyIGNiaWZ5ID0gZnVuY3Rpb24gKGRhdCwgb3B0cywgZm5zLCBpbml0LCBpZCwgY2IpIHtcbiAgICB2YXIgdyA9IHdya3IoZm5zLCBpbml0LCBpZCwgZnVuY3Rpb24gKGVyciwgZGF0KSB7XG4gICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgIGNiKGVyciwgZGF0KTtcbiAgICB9KTtcbiAgICB3LnBvc3RNZXNzYWdlKFtkYXQsIG9wdHNdLCBvcHRzLmNvbnN1bWUgPyBbZGF0LmJ1ZmZlcl0gOiBbXSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdy50ZXJtaW5hdGUoKTsgfTtcbn07XG4vLyBhdXRvIHN0cmVhbVxudmFyIGFzdHJtID0gZnVuY3Rpb24gKHN0cm0pIHtcbiAgICBzdHJtLm9uZGF0YSA9IGZ1bmN0aW9uIChkYXQsIGZpbmFsKSB7IHJldHVybiBwb3N0TWVzc2FnZShbZGF0LCBmaW5hbF0sIFtkYXQuYnVmZmVyXSk7IH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoZXYuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0cm0ucHVzaChldi5kYXRhWzBdLCBldi5kYXRhWzFdKTtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKFtldi5kYXRhWzBdLmxlbmd0aF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN0cm0uZmx1c2goKTtcbiAgICB9O1xufTtcbi8vIGFzeW5jIHN0cmVhbSBhdHRhY2hcbnZhciBhc3RybWlmeSA9IGZ1bmN0aW9uIChmbnMsIHN0cm0sIG9wdHMsIGluaXQsIGlkLCBmbHVzaCwgZXh0KSB7XG4gICAgdmFyIHQ7XG4gICAgdmFyIHcgPSB3cmtyKGZucywgaW5pdCwgaWQsIGZ1bmN0aW9uIChlcnIsIGRhdCkge1xuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgdy50ZXJtaW5hdGUoKSwgc3RybS5vbmRhdGEuY2FsbChzdHJtLCBlcnIpO1xuICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShkYXQpKVxuICAgICAgICAgICAgZXh0KGRhdCk7XG4gICAgICAgIGVsc2UgaWYgKGRhdC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgc3RybS5xdWV1ZWRTaXplIC09IGRhdFswXTtcbiAgICAgICAgICAgIGlmIChzdHJtLm9uZHJhaW4pXG4gICAgICAgICAgICAgICAgc3RybS5vbmRyYWluKGRhdFswXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGF0WzFdKVxuICAgICAgICAgICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgICAgICBzdHJtLm9uZGF0YS5jYWxsKHN0cm0sIGVyciwgZGF0WzBdLCBkYXRbMV0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgdy5wb3N0TWVzc2FnZShvcHRzKTtcbiAgICBzdHJtLnF1ZXVlZFNpemUgPSAwO1xuICAgIHN0cm0ucHVzaCA9IGZ1bmN0aW9uIChkLCBmKSB7XG4gICAgICAgIGlmICghc3RybS5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICh0KVxuICAgICAgICAgICAgc3RybS5vbmRhdGEoZXJyKDQsIDAsIDEpLCBudWxsLCAhIWYpO1xuICAgICAgICBzdHJtLnF1ZXVlZFNpemUgKz0gZC5sZW5ndGg7XG4gICAgICAgIHcucG9zdE1lc3NhZ2UoW2QsIHQgPSBmXSwgW2QuYnVmZmVyXSk7XG4gICAgfTtcbiAgICBzdHJtLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uICgpIHsgdy50ZXJtaW5hdGUoKTsgfTtcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgICAgc3RybS5mbHVzaCA9IGZ1bmN0aW9uICgpIHsgdy5wb3N0TWVzc2FnZShbXSk7IH07XG4gICAgfVxufTtcbi8vIHJlYWQgMiBieXRlc1xudmFyIGIyID0gZnVuY3Rpb24gKGQsIGIpIHsgcmV0dXJuIGRbYl0gfCAoZFtiICsgMV0gPDwgOCk7IH07XG4vLyByZWFkIDQgYnl0ZXNcbnZhciBiNCA9IGZ1bmN0aW9uIChkLCBiKSB7IHJldHVybiAoZFtiXSB8IChkW2IgKyAxXSA8PCA4KSB8IChkW2IgKyAyXSA8PCAxNikgfCAoZFtiICsgM10gPDwgMjQpKSA+Pj4gMDsgfTtcbnZhciBiOCA9IGZ1bmN0aW9uIChkLCBiKSB7IHJldHVybiBiNChkLCBiKSArIChiNChkLCBiICsgNCkgKiA0Mjk0OTY3Mjk2KTsgfTtcbi8vIHdyaXRlIGJ5dGVzXG52YXIgd2J5dGVzID0gZnVuY3Rpb24gKGQsIGIsIHYpIHtcbiAgICBmb3IgKDsgdjsgKytiKVxuICAgICAgICBkW2JdID0gdiwgdiA+Pj49IDg7XG59O1xuLy8gZ3ppcCBoZWFkZXJcbnZhciBnemggPSBmdW5jdGlvbiAoYywgbykge1xuICAgIHZhciBmbiA9IG8uZmlsZW5hbWU7XG4gICAgY1swXSA9IDMxLCBjWzFdID0gMTM5LCBjWzJdID0gOCwgY1s4XSA9IG8ubGV2ZWwgPCAyID8gNCA6IG8ubGV2ZWwgPT0gOSA/IDIgOiAwLCBjWzldID0gMzsgLy8gYXNzdW1lIFVuaXhcbiAgICBpZiAoby5tdGltZSAhPSAwKVxuICAgICAgICB3Ynl0ZXMoYywgNCwgTWF0aC5mbG9vcihuZXcgRGF0ZShvLm10aW1lIHx8IERhdGUubm93KCkpIC8gMTAwMCkpO1xuICAgIGlmIChmbikge1xuICAgICAgICBjWzNdID0gODtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZm4ubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjW2kgKyAxMF0gPSBmbi5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbn07XG4vLyBnemlwIGZvb3RlcjogLTggdG8gLTQgPSBDUkMsIC00IHRvIC0wIGlzIGxlbmd0aFxuLy8gZ3ppcCBzdGFydFxudmFyIGd6cyA9IGZ1bmN0aW9uIChkKSB7XG4gICAgaWYgKGRbMF0gIT0gMzEgfHwgZFsxXSAhPSAxMzkgfHwgZFsyXSAhPSA4KVxuICAgICAgICBlcnIoNiwgJ2ludmFsaWQgZ3ppcCBkYXRhJyk7XG4gICAgdmFyIGZsZyA9IGRbM107XG4gICAgdmFyIHN0ID0gMTA7XG4gICAgaWYgKGZsZyAmIDQpXG4gICAgICAgIHN0ICs9IChkWzEwXSB8IGRbMTFdIDw8IDgpICsgMjtcbiAgICBmb3IgKHZhciB6cyA9IChmbGcgPj4gMyAmIDEpICsgKGZsZyA+PiA0ICYgMSk7IHpzID4gMDsgenMgLT0gIWRbc3QrK10pXG4gICAgICAgIDtcbiAgICByZXR1cm4gc3QgKyAoZmxnICYgMik7XG59O1xuLy8gZ3ppcCBsZW5ndGhcbnZhciBnemwgPSBmdW5jdGlvbiAoZCkge1xuICAgIHZhciBsID0gZC5sZW5ndGg7XG4gICAgcmV0dXJuIChkW2wgLSA0XSB8IGRbbCAtIDNdIDw8IDggfCBkW2wgLSAyXSA8PCAxNiB8IGRbbCAtIDFdIDw8IDI0KSA+Pj4gMDtcbn07XG4vLyBnemlwIGhlYWRlciBsZW5ndGhcbnZhciBnemhsID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIDEwICsgKG8uZmlsZW5hbWUgPyBvLmZpbGVuYW1lLmxlbmd0aCArIDEgOiAwKTsgfTtcbi8vIHpsaWIgaGVhZGVyXG52YXIgemxoID0gZnVuY3Rpb24gKGMsIG8pIHtcbiAgICB2YXIgbHYgPSBvLmxldmVsLCBmbCA9IGx2ID09IDAgPyAwIDogbHYgPCA2ID8gMSA6IGx2ID09IDkgPyAzIDogMjtcbiAgICBjWzBdID0gMTIwLCBjWzFdID0gKGZsIDw8IDYpIHwgKG8uZGljdGlvbmFyeSAmJiAzMik7XG4gICAgY1sxXSB8PSAzMSAtICgoY1swXSA8PCA4KSB8IGNbMV0pICUgMzE7XG4gICAgaWYgKG8uZGljdGlvbmFyeSkge1xuICAgICAgICB2YXIgaCA9IGFkbGVyKCk7XG4gICAgICAgIGgucChvLmRpY3Rpb25hcnkpO1xuICAgICAgICB3Ynl0ZXMoYywgMiwgaC5kKCkpO1xuICAgIH1cbn07XG4vLyB6bGliIHN0YXJ0XG52YXIgemxzID0gZnVuY3Rpb24gKGQsIGRpY3QpIHtcbiAgICBpZiAoKGRbMF0gJiAxNSkgIT0gOCB8fCAoZFswXSA+PiA0KSA+IDcgfHwgKChkWzBdIDw8IDggfCBkWzFdKSAlIDMxKSlcbiAgICAgICAgZXJyKDYsICdpbnZhbGlkIHpsaWIgZGF0YScpO1xuICAgIGlmICgoZFsxXSA+PiA1ICYgMSkgPT0gKyFkaWN0KVxuICAgICAgICBlcnIoNiwgJ2ludmFsaWQgemxpYiBkYXRhOiAnICsgKGRbMV0gJiAzMiA/ICduZWVkJyA6ICd1bmV4cGVjdGVkJykgKyAnIGRpY3Rpb25hcnknKTtcbiAgICByZXR1cm4gKGRbMV0gPj4gMyAmIDQpICsgMjtcbn07XG5mdW5jdGlvbiBTdHJtT3B0KG9wdHMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpXG4gICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgIHRoaXMub25kYXRhID0gY2I7XG4gICAgcmV0dXJuIG9wdHM7XG59XG4vKipcbiAqIFN0cmVhbWluZyBERUZMQVRFIGNvbXByZXNzaW9uXG4gKi9cbnZhciBEZWZsYXRlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmxhdGUob3B0cywgY2IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICAgICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICAgICAgdGhpcy5vID0gb3B0cyB8fCB7fTtcbiAgICAgICAgdGhpcy5zID0geyBsOiAwLCBpOiAzMjc2OCwgdzogMzI3NjgsIHo6IDMyNzY4IH07XG4gICAgICAgIC8vIEJ1ZmZlciBsZW5ndGggbXVzdCBhbHdheXMgYmUgMCBtb2QgMzI3NjggZm9yIGluZGV4IGNhbGN1bGF0aW9ucyB0byBiZSBjb3JyZWN0IHdoZW4gbW9kaWZ5aW5nIGhlYWQgYW5kIHByZXZcbiAgICAgICAgLy8gOTgzMDQgPSAzMjc2OCAobG9va2JhY2spICsgNjU1MzYgKGNvbW1vbiBjaHVuayBzaXplKVxuICAgICAgICB0aGlzLmIgPSBuZXcgdTgoOTgzMDQpO1xuICAgICAgICBpZiAodGhpcy5vLmRpY3Rpb25hcnkpIHtcbiAgICAgICAgICAgIHZhciBkaWN0ID0gdGhpcy5vLmRpY3Rpb25hcnkuc3ViYXJyYXkoLTMyNzY4KTtcbiAgICAgICAgICAgIHRoaXMuYi5zZXQoZGljdCwgMzI3NjggLSBkaWN0Lmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnMuaSA9IDMyNzY4IC0gZGljdC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgRGVmbGF0ZS5wcm90b3R5cGUucCA9IGZ1bmN0aW9uIChjLCBmKSB7XG4gICAgICAgIHRoaXMub25kYXRhKGRvcHQoYywgdGhpcy5vLCAwLCAwLCB0aGlzLnMpLCBmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGRlZmxhdGVkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIERlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICh0aGlzLnMubClcbiAgICAgICAgICAgIGVycig0KTtcbiAgICAgICAgdmFyIGVuZExlbiA9IGNodW5rLmxlbmd0aCArIHRoaXMucy56O1xuICAgICAgICBpZiAoZW5kTGVuID4gdGhpcy5iLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGVuZExlbiA+IDIgKiB0aGlzLmIubGVuZ3RoIC0gMzI3NjgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3QnVmID0gbmV3IHU4KGVuZExlbiAmIC0zMjc2OCk7XG4gICAgICAgICAgICAgICAgbmV3QnVmLnNldCh0aGlzLmIuc3ViYXJyYXkoMCwgdGhpcy5zLnopKTtcbiAgICAgICAgICAgICAgICB0aGlzLmIgPSBuZXdCdWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3BsaXQgPSB0aGlzLmIubGVuZ3RoIC0gdGhpcy5zLno7XG4gICAgICAgICAgICB0aGlzLmIuc2V0KGNodW5rLnN1YmFycmF5KDAsIHNwbGl0KSwgdGhpcy5zLnopO1xuICAgICAgICAgICAgdGhpcy5zLnogPSB0aGlzLmIubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5wKHRoaXMuYiwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5iLnNldCh0aGlzLmIuc3ViYXJyYXkoLTMyNzY4KSk7XG4gICAgICAgICAgICB0aGlzLmIuc2V0KGNodW5rLnN1YmFycmF5KHNwbGl0KSwgMzI3NjgpO1xuICAgICAgICAgICAgdGhpcy5zLnogPSBjaHVuay5sZW5ndGggLSBzcGxpdCArIDMyNzY4O1xuICAgICAgICAgICAgdGhpcy5zLmkgPSAzMjc2NiwgdGhpcy5zLncgPSAzMjc2ODtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYi5zZXQoY2h1bmssIHRoaXMucy56KTtcbiAgICAgICAgICAgIHRoaXMucy56ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnMubCA9IGZpbmFsICYgMTtcbiAgICAgICAgaWYgKHRoaXMucy56ID4gdGhpcy5zLncgKyA4MTkxIHx8IGZpbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnAodGhpcy5iLCBmaW5hbCB8fCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnMudyA9IHRoaXMucy5pLCB0aGlzLnMuaSAtPSAyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGJ1ZmZlcmVkIHVuY29tcHJlc3NlZCBkYXRhLiBVc2VmdWwgdG8gaW1tZWRpYXRlbHkgcmV0cmlldmUgdGhlXG4gICAgICogZGVmbGF0ZWQgb3V0cHV0IGZvciBzbWFsbCBpbnB1dHMuXG4gICAgICovXG4gICAgRGVmbGF0ZS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICh0aGlzLnMubClcbiAgICAgICAgICAgIGVycig0KTtcbiAgICAgICAgdGhpcy5wKHRoaXMuYiwgZmFsc2UpO1xuICAgICAgICB0aGlzLnMudyA9IHRoaXMucy5pLCB0aGlzLnMuaSAtPSAyO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmxhdGU7XG59KCkpO1xuZXhwb3J0IHsgRGVmbGF0ZSB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIERFRkxBVEUgY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jRGVmbGF0ZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY0RlZmxhdGUob3B0cywgY2IpIHtcbiAgICAgICAgYXN0cm1pZnkoW1xuICAgICAgICAgICAgYkRmbHQsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbYXN0cm0sIERlZmxhdGVdOyB9XG4gICAgICAgIF0sIHRoaXMsIFN0cm1PcHQuY2FsbCh0aGlzLCBvcHRzLCBjYiksIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHN0cm0gPSBuZXcgRGVmbGF0ZShldi5kYXRhKTtcbiAgICAgICAgICAgIG9ubWVzc2FnZSA9IGFzdHJtKHN0cm0pO1xuICAgICAgICB9LCA2LCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzeW5jRGVmbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBBc3luY0RlZmxhdGUgfTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZsYXRlKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgcmV0dXJuIGNiaWZ5KGRhdGEsIG9wdHMsIFtcbiAgICAgICAgYkRmbHQsXG4gICAgXSwgZnVuY3Rpb24gKGV2KSB7IHJldHVybiBwYmYoZGVmbGF0ZVN5bmMoZXYuZGF0YVswXSwgZXYuZGF0YVsxXSkpOyB9LCAwLCBjYik7XG59XG4vKipcbiAqIENvbXByZXNzZXMgZGF0YSB3aXRoIERFRkxBVEUgd2l0aG91dCBhbnkgd3JhcHBlclxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gY29tcHJlc3NcbiAqIEBwYXJhbSBvcHRzIFRoZSBjb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZGVmbGF0ZWQgdmVyc2lvbiBvZiB0aGUgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmbGF0ZVN5bmMoZGF0YSwgb3B0cykge1xuICAgIHJldHVybiBkb3B0KGRhdGEsIG9wdHMgfHwge30sIDAsIDApO1xufVxuLyoqXG4gKiBTdHJlYW1pbmcgREVGTEFURSBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBJbmZsYXRlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluZmxhdGUob3B0cywgY2IpIHtcbiAgICAgICAgLy8gbm8gU3RybU9wdCBoZXJlIHRvIGF2b2lkIGFkZGluZyB0byB3b3JrZXJpemVyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgICAgIHRoaXMub25kYXRhID0gY2I7XG4gICAgICAgIHZhciBkaWN0ID0gb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkgJiYgb3B0cy5kaWN0aW9uYXJ5LnN1YmFycmF5KC0zMjc2OCk7XG4gICAgICAgIHRoaXMucyA9IHsgaTogMCwgYjogZGljdCA/IGRpY3QubGVuZ3RoIDogMCB9O1xuICAgICAgICB0aGlzLm8gPSBuZXcgdTgoMzI3NjgpO1xuICAgICAgICB0aGlzLnAgPSBuZXcgdTgoMCk7XG4gICAgICAgIGlmIChkaWN0KVxuICAgICAgICAgICAgdGhpcy5vLnNldChkaWN0KTtcbiAgICB9XG4gICAgSW5mbGF0ZS5wcm90b3R5cGUuZSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICh0aGlzLmQpXG4gICAgICAgICAgICBlcnIoNCk7XG4gICAgICAgIGlmICghdGhpcy5wLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucCA9IGM7XG4gICAgICAgIGVsc2UgaWYgKGMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbiA9IG5ldyB1OCh0aGlzLnAubGVuZ3RoICsgYy5sZW5ndGgpO1xuICAgICAgICAgICAgbi5zZXQodGhpcy5wKSwgbi5zZXQoYywgdGhpcy5wLmxlbmd0aCksIHRoaXMucCA9IG47XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEluZmxhdGUucHJvdG90eXBlLmMgPSBmdW5jdGlvbiAoZmluYWwpIHtcbiAgICAgICAgdGhpcy5zLmkgPSArKHRoaXMuZCA9IGZpbmFsIHx8IGZhbHNlKTtcbiAgICAgICAgdmFyIGJ0cyA9IHRoaXMucy5iO1xuICAgICAgICB2YXIgZHQgPSBpbmZsdCh0aGlzLnAsIHRoaXMucywgdGhpcy5vKTtcbiAgICAgICAgdGhpcy5vbmRhdGEoc2xjKGR0LCBidHMsIHRoaXMucy5iKSwgdGhpcy5kKTtcbiAgICAgICAgdGhpcy5vID0gc2xjKGR0LCB0aGlzLnMuYiAtIDMyNzY4KSwgdGhpcy5zLmIgPSB0aGlzLm8ubGVuZ3RoO1xuICAgICAgICB0aGlzLnAgPSBzbGModGhpcy5wLCAodGhpcy5zLnAgLyA4KSB8IDApLCB0aGlzLnMucCAmPSA3O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgaW5mbGF0ZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBmaW5hbCBjaHVua1xuICAgICAqL1xuICAgIEluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIHRoaXMuZShjaHVuayksIHRoaXMuYyhmaW5hbCk7XG4gICAgfTtcbiAgICByZXR1cm4gSW5mbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBJbmZsYXRlIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgREVGTEFURSBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBBc3luY0luZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN5bmNJbmZsYXRlKG9wdHMsIGNiKSB7XG4gICAgICAgIGFzdHJtaWZ5KFtcbiAgICAgICAgICAgIGJJbmZsdCxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFthc3RybSwgSW5mbGF0ZV07IH1cbiAgICAgICAgXSwgdGhpcywgU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc3RybSA9IG5ldyBJbmZsYXRlKGV2LmRhdGEpO1xuICAgICAgICAgICAgb25tZXNzYWdlID0gYXN0cm0oc3RybSk7XG4gICAgICAgIH0sIDcsIDApO1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNJbmZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jSW5mbGF0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIGluZmxhdGUoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICByZXR1cm4gY2JpZnkoZGF0YSwgb3B0cywgW1xuICAgICAgICBiSW5mbHRcbiAgICBdLCBmdW5jdGlvbiAoZXYpIHsgcmV0dXJuIHBiZihpbmZsYXRlU3luYyhldi5kYXRhWzBdLCBnb3B0KGV2LmRhdGFbMV0pKSk7IH0sIDEsIGNiKTtcbn1cbi8qKlxuICogRXhwYW5kcyBERUZMQVRFIGRhdGEgd2l0aCBubyB3cmFwcGVyXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvbXByZXNzXG4gKiBAcGFyYW0gb3B0cyBUaGUgZGVjb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmxhdGVTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICByZXR1cm4gaW5mbHQoZGF0YSwgeyBpOiAyIH0sIG9wdHMgJiYgb3B0cy5vdXQsIG9wdHMgJiYgb3B0cy5kaWN0aW9uYXJ5KTtcbn1cbi8vIGJlZm9yZSB5b3UgeWVsbCBhdCBtZSBmb3Igbm90IGp1c3QgdXNpbmcgZXh0ZW5kcywgbXkgcmVhc29uIGlzIHRoYXQgVFMgaW5oZXJpdGFuY2UgaXMgaGFyZCB0byB3b3JrZXJpemUuXG4vKipcbiAqIFN0cmVhbWluZyBHWklQIGNvbXByZXNzaW9uXG4gKi9cbnZhciBHemlwID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEd6aXAob3B0cywgY2IpIHtcbiAgICAgICAgdGhpcy5jID0gY3JjKCk7XG4gICAgICAgIHRoaXMubCA9IDA7XG4gICAgICAgIHRoaXMudiA9IDE7XG4gICAgICAgIERlZmxhdGUuY2FsbCh0aGlzLCBvcHRzLCBjYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIEdaSVBwZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgR3ppcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdGhpcy5jLnAoY2h1bmspO1xuICAgICAgICB0aGlzLmwgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGZpbmFsKTtcbiAgICB9O1xuICAgIEd6aXAucHJvdG90eXBlLnAgPSBmdW5jdGlvbiAoYywgZikge1xuICAgICAgICB2YXIgcmF3ID0gZG9wdChjLCB0aGlzLm8sIHRoaXMudiAmJiBnemhsKHRoaXMubyksIGYgJiYgOCwgdGhpcy5zKTtcbiAgICAgICAgaWYgKHRoaXMudilcbiAgICAgICAgICAgIGd6aChyYXcsIHRoaXMubyksIHRoaXMudiA9IDA7XG4gICAgICAgIGlmIChmKVxuICAgICAgICAgICAgd2J5dGVzKHJhdywgcmF3Lmxlbmd0aCAtIDgsIHRoaXMuYy5kKCkpLCB3Ynl0ZXMocmF3LCByYXcubGVuZ3RoIC0gNCwgdGhpcy5sKTtcbiAgICAgICAgdGhpcy5vbmRhdGEocmF3LCBmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgYnVmZmVyZWQgdW5jb21wcmVzc2VkIGRhdGEuIFVzZWZ1bCB0byBpbW1lZGlhdGVseSByZXRyaWV2ZSB0aGVcbiAgICAgKiBHWklQcGVkIG91dHB1dCBmb3Igc21hbGwgaW5wdXRzLlxuICAgICAqL1xuICAgIEd6aXAucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEd6aXA7XG59KCkpO1xuZXhwb3J0IHsgR3ppcCB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIEdaSVAgY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jR3ppcCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY0d6aXAob3B0cywgY2IpIHtcbiAgICAgICAgYXN0cm1pZnkoW1xuICAgICAgICAgICAgYkRmbHQsXG4gICAgICAgICAgICBnemUsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbYXN0cm0sIERlZmxhdGUsIEd6aXBdOyB9XG4gICAgICAgIF0sIHRoaXMsIFN0cm1PcHQuY2FsbCh0aGlzLCBvcHRzLCBjYiksIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHN0cm0gPSBuZXcgR3ppcChldi5kYXRhKTtcbiAgICAgICAgICAgIG9ubWVzc2FnZSA9IGFzdHJtKHN0cm0pO1xuICAgICAgICB9LCA4LCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzeW5jR3ppcDtcbn0oKSk7XG5leHBvcnQgeyBBc3luY0d6aXAgfTtcbmV4cG9ydCBmdW5jdGlvbiBnemlwKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgcmV0dXJuIGNiaWZ5KGRhdGEsIG9wdHMsIFtcbiAgICAgICAgYkRmbHQsXG4gICAgICAgIGd6ZSxcbiAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2d6aXBTeW5jXTsgfVxuICAgIF0sIGZ1bmN0aW9uIChldikgeyByZXR1cm4gcGJmKGd6aXBTeW5jKGV2LmRhdGFbMF0sIGV2LmRhdGFbMV0pKTsgfSwgMiwgY2IpO1xufVxuLyoqXG4gKiBDb21wcmVzc2VzIGRhdGEgd2l0aCBHWklQXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGNvbXByZXNzaW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBnemlwcGVkIHZlcnNpb24gb2YgdGhlIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd6aXBTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpXG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICB2YXIgYyA9IGNyYygpLCBsID0gZGF0YS5sZW5ndGg7XG4gICAgYy5wKGRhdGEpO1xuICAgIHZhciBkID0gZG9wdChkYXRhLCBvcHRzLCBnemhsKG9wdHMpLCA4KSwgcyA9IGQubGVuZ3RoO1xuICAgIHJldHVybiBnemgoZCwgb3B0cyksIHdieXRlcyhkLCBzIC0gOCwgYy5kKCkpLCB3Ynl0ZXMoZCwgcyAtIDQsIGwpLCBkO1xufVxuLyoqXG4gKiBTdHJlYW1pbmcgc2luZ2xlIG9yIG11bHRpLW1lbWJlciBHWklQIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIEd1bnppcCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBHdW56aXAob3B0cywgY2IpIHtcbiAgICAgICAgdGhpcy52ID0gMTtcbiAgICAgICAgdGhpcy5yID0gMDtcbiAgICAgICAgSW5mbGF0ZS5jYWxsKHRoaXMsIG9wdHMsIGNiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgR1VOWklQcGVkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIEd1bnppcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgSW5mbGF0ZS5wcm90b3R5cGUuZS5jYWxsKHRoaXMsIGNodW5rKTtcbiAgICAgICAgdGhpcy5yICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMudikge1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnAuc3ViYXJyYXkodGhpcy52IC0gMSk7XG4gICAgICAgICAgICB2YXIgcyA9IHAubGVuZ3RoID4gMyA/IGd6cyhwKSA6IDQ7XG4gICAgICAgICAgICBpZiAocyA+IHAubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaW5hbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52ID4gMSAmJiB0aGlzLm9ubWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1lbWJlcih0aGlzLnIgLSBwLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnAgPSBwLnN1YmFycmF5KHMpLCB0aGlzLnYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5lY2Vzc2FyeSB0byBwcmV2ZW50IFRTIGZyb20gdXNpbmcgdGhlIGNsb3N1cmUgdmFsdWVcbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIHdvcmtlcml6YXRpb24gdG8gZnVuY3Rpb24gY29ycmVjdGx5XG4gICAgICAgIEluZmxhdGUucHJvdG90eXBlLmMuY2FsbCh0aGlzLCBmaW5hbCk7XG4gICAgICAgIC8vIHByb2Nlc3MgY29uY2F0ZW5hdGVkIEdaSVBcbiAgICAgICAgaWYgKHRoaXMucy5mICYmICF0aGlzLnMubCAmJiAhZmluYWwpIHtcbiAgICAgICAgICAgIHRoaXMudiA9IHNoZnQodGhpcy5zLnApICsgOTtcbiAgICAgICAgICAgIHRoaXMucyA9IHsgaTogMCB9O1xuICAgICAgICAgICAgdGhpcy5vID0gbmV3IHU4KDApO1xuICAgICAgICAgICAgdGhpcy5wdXNoKG5ldyB1OCgwKSwgZmluYWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gR3VuemlwO1xufSgpKTtcbmV4cG9ydCB7IEd1bnppcCB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIHNpbmdsZSBvciBtdWx0aS1tZW1iZXIgR1pJUCBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBBc3luY0d1bnppcCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY0d1bnppcChvcHRzLCBjYikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBhc3RybWlmeShbXG4gICAgICAgICAgICBiSW5mbHQsXG4gICAgICAgICAgICBndXplLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2FzdHJtLCBJbmZsYXRlLCBHdW56aXBdOyB9XG4gICAgICAgIF0sIHRoaXMsIFN0cm1PcHQuY2FsbCh0aGlzLCBvcHRzLCBjYiksIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHN0cm0gPSBuZXcgR3VuemlwKGV2LmRhdGEpO1xuICAgICAgICAgICAgc3RybS5vbm1lbWJlciA9IGZ1bmN0aW9uIChvZmZzZXQpIHsgcmV0dXJuIHBvc3RNZXNzYWdlKG9mZnNldCk7IH07XG4gICAgICAgICAgICBvbm1lc3NhZ2UgPSBhc3RybShzdHJtKTtcbiAgICAgICAgfSwgOSwgMCwgZnVuY3Rpb24gKG9mZnNldCkgeyByZXR1cm4gX3RoaXMub25tZW1iZXIgJiYgX3RoaXMub25tZW1iZXIob2Zmc2V0KTsgfSk7XG4gICAgfVxuICAgIHJldHVybiBBc3luY0d1bnppcDtcbn0oKSk7XG5leHBvcnQgeyBBc3luY0d1bnppcCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGd1bnppcChkYXRhLCBvcHRzLCBjYikge1xuICAgIGlmICghY2IpXG4gICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY2IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZXJyKDcpO1xuICAgIHJldHVybiBjYmlmeShkYXRhLCBvcHRzLCBbXG4gICAgICAgIGJJbmZsdCxcbiAgICAgICAgZ3V6ZSxcbiAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2d1bnppcFN5bmNdOyB9XG4gICAgXSwgZnVuY3Rpb24gKGV2KSB7IHJldHVybiBwYmYoZ3VuemlwU3luYyhldi5kYXRhWzBdLCBldi5kYXRhWzFdKSk7IH0sIDMsIGNiKTtcbn1cbi8qKlxuICogRXhwYW5kcyBHWklQIGRhdGFcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29tcHJlc3NcbiAqIEBwYXJhbSBvcHRzIFRoZSBkZWNvbXByZXNzaW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3VuemlwU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgdmFyIHN0ID0gZ3pzKGRhdGEpO1xuICAgIGlmIChzdCArIDggPiBkYXRhLmxlbmd0aClcbiAgICAgICAgZXJyKDYsICdpbnZhbGlkIGd6aXAgZGF0YScpO1xuICAgIHJldHVybiBpbmZsdChkYXRhLnN1YmFycmF5KHN0LCAtOCksIHsgaTogMiB9LCBvcHRzICYmIG9wdHMub3V0IHx8IG5ldyB1OChnemwoZGF0YSkpLCBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSk7XG59XG4vKipcbiAqIFN0cmVhbWluZyBabGliIGNvbXByZXNzaW9uXG4gKi9cbnZhciBabGliID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFpsaWIob3B0cywgY2IpIHtcbiAgICAgICAgdGhpcy5jID0gYWRsZXIoKTtcbiAgICAgICAgdGhpcy52ID0gMTtcbiAgICAgICAgRGVmbGF0ZS5jYWxsKHRoaXMsIG9wdHMsIGNiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgemxpYmJlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBabGliLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0aGlzLmMucChjaHVuayk7XG4gICAgICAgIERlZmxhdGUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgWmxpYi5wcm90b3R5cGUucCA9IGZ1bmN0aW9uIChjLCBmKSB7XG4gICAgICAgIHZhciByYXcgPSBkb3B0KGMsIHRoaXMubywgdGhpcy52ICYmICh0aGlzLm8uZGljdGlvbmFyeSA/IDYgOiAyKSwgZiAmJiA0LCB0aGlzLnMpO1xuICAgICAgICBpZiAodGhpcy52KVxuICAgICAgICAgICAgemxoKHJhdywgdGhpcy5vKSwgdGhpcy52ID0gMDtcbiAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICB3Ynl0ZXMocmF3LCByYXcubGVuZ3RoIC0gNCwgdGhpcy5jLmQoKSk7XG4gICAgICAgIHRoaXMub25kYXRhKHJhdywgZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIGJ1ZmZlcmVkIHVuY29tcHJlc3NlZCBkYXRhLiBVc2VmdWwgdG8gaW1tZWRpYXRlbHkgcmV0cmlldmUgdGhlXG4gICAgICogemxpYmJlZCBvdXRwdXQgZm9yIHNtYWxsIGlucHV0cy5cbiAgICAgKi9cbiAgICBabGliLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgRGVmbGF0ZS5wcm90b3R5cGUuZmx1c2guY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBabGliO1xufSgpKTtcbmV4cG9ydCB7IFpsaWIgfTtcbi8qKlxuICogQXN5bmNocm9ub3VzIHN0cmVhbWluZyBabGliIGNvbXByZXNzaW9uXG4gKi9cbnZhciBBc3luY1psaWIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN5bmNabGliKG9wdHMsIGNiKSB7XG4gICAgICAgIGFzdHJtaWZ5KFtcbiAgICAgICAgICAgIGJEZmx0LFxuICAgICAgICAgICAgemxlLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2FzdHJtLCBEZWZsYXRlLCBabGliXTsgfVxuICAgICAgICBdLCB0aGlzLCBTdHJtT3B0LmNhbGwodGhpcywgb3B0cywgY2IpLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBzdHJtID0gbmV3IFpsaWIoZXYuZGF0YSk7XG4gICAgICAgICAgICBvbm1lc3NhZ2UgPSBhc3RybShzdHJtKTtcbiAgICAgICAgfSwgMTAsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNabGliO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jWmxpYiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHpsaWIoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICByZXR1cm4gY2JpZnkoZGF0YSwgb3B0cywgW1xuICAgICAgICBiRGZsdCxcbiAgICAgICAgemxlLFxuICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbemxpYlN5bmNdOyB9XG4gICAgXSwgZnVuY3Rpb24gKGV2KSB7IHJldHVybiBwYmYoemxpYlN5bmMoZXYuZGF0YVswXSwgZXYuZGF0YVsxXSkpOyB9LCA0LCBjYik7XG59XG4vKipcbiAqIENvbXByZXNzIGRhdGEgd2l0aCBabGliXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGNvbXByZXNzaW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSB6bGliLWNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gemxpYlN5bmMoZGF0YSwgb3B0cykge1xuICAgIGlmICghb3B0cylcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgIHZhciBhID0gYWRsZXIoKTtcbiAgICBhLnAoZGF0YSk7XG4gICAgdmFyIGQgPSBkb3B0KGRhdGEsIG9wdHMsIG9wdHMuZGljdGlvbmFyeSA/IDYgOiAyLCA0KTtcbiAgICByZXR1cm4gemxoKGQsIG9wdHMpLCB3Ynl0ZXMoZCwgZC5sZW5ndGggLSA0LCBhLmQoKSksIGQ7XG59XG4vKipcbiAqIFN0cmVhbWluZyBabGliIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIFVuemxpYiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBVbnpsaWIob3B0cywgY2IpIHtcbiAgICAgICAgSW5mbGF0ZS5jYWxsKHRoaXMsIG9wdHMsIGNiKTtcbiAgICAgICAgdGhpcy52ID0gb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkgPyAyIDogMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgdW56bGliYmVkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIFVuemxpYi5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgSW5mbGF0ZS5wcm90b3R5cGUuZS5jYWxsKHRoaXMsIGNodW5rKTtcbiAgICAgICAgaWYgKHRoaXMudikge1xuICAgICAgICAgICAgaWYgKHRoaXMucC5sZW5ndGggPCA2ICYmICFmaW5hbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnAgPSB0aGlzLnAuc3ViYXJyYXkoemxzKHRoaXMucCwgdGhpcy52IC0gMSkpLCB0aGlzLnYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucC5sZW5ndGggPCA0KVxuICAgICAgICAgICAgICAgIGVycig2LCAnaW52YWxpZCB6bGliIGRhdGEnKTtcbiAgICAgICAgICAgIHRoaXMucCA9IHRoaXMucC5zdWJhcnJheSgwLCAtNCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgVFMgZnJvbSB1c2luZyB0aGUgY2xvc3VyZSB2YWx1ZVxuICAgICAgICAvLyBUaGlzIGFsbG93cyBmb3Igd29ya2VyaXphdGlvbiB0byBmdW5jdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgSW5mbGF0ZS5wcm90b3R5cGUuYy5jYWxsKHRoaXMsIGZpbmFsKTtcbiAgICB9O1xuICAgIHJldHVybiBVbnpsaWI7XG59KCkpO1xuZXhwb3J0IHsgVW56bGliIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgWmxpYiBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBBc3luY1VuemxpYiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY1VuemxpYihvcHRzLCBjYikge1xuICAgICAgICBhc3RybWlmeShbXG4gICAgICAgICAgICBiSW5mbHQsXG4gICAgICAgICAgICB6dWxlLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2FzdHJtLCBJbmZsYXRlLCBVbnpsaWJdOyB9XG4gICAgICAgIF0sIHRoaXMsIFN0cm1PcHQuY2FsbCh0aGlzLCBvcHRzLCBjYiksIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHN0cm0gPSBuZXcgVW56bGliKGV2LmRhdGEpO1xuICAgICAgICAgICAgb25tZXNzYWdlID0gYXN0cm0oc3RybSk7XG4gICAgICAgIH0sIDExLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzeW5jVW56bGliO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jVW56bGliIH07XG5leHBvcnQgZnVuY3Rpb24gdW56bGliKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgcmV0dXJuIGNiaWZ5KGRhdGEsIG9wdHMsIFtcbiAgICAgICAgYkluZmx0LFxuICAgICAgICB6dWxlLFxuICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbdW56bGliU3luY107IH1cbiAgICBdLCBmdW5jdGlvbiAoZXYpIHsgcmV0dXJuIHBiZih1bnpsaWJTeW5jKGV2LmRhdGFbMF0sIGdvcHQoZXYuZGF0YVsxXSkpKTsgfSwgNSwgY2IpO1xufVxuLyoqXG4gKiBFeHBhbmRzIFpsaWIgZGF0YVxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGRlY29tcHJlc3Npb24gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnpsaWJTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICByZXR1cm4gaW5mbHQoZGF0YS5zdWJhcnJheSh6bHMoZGF0YSwgb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkpLCAtNCksIHsgaTogMiB9LCBvcHRzICYmIG9wdHMub3V0LCBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSk7XG59XG4vLyBEZWZhdWx0IGFsZ29yaXRobSBmb3IgY29tcHJlc3Npb24gKHVzZWQgYmVjYXVzZSBoYXZpbmcgYSBrbm93biBvdXRwdXQgc2l6ZSBhbGxvd3MgZmFzdGVyIGRlY29tcHJlc3Npb24pXG5leHBvcnQgeyBnemlwIGFzIGNvbXByZXNzLCBBc3luY0d6aXAgYXMgQXN5bmNDb21wcmVzcyB9O1xuZXhwb3J0IHsgZ3ppcFN5bmMgYXMgY29tcHJlc3NTeW5jLCBHemlwIGFzIENvbXByZXNzIH07XG4vKipcbiAqIFN0cmVhbWluZyBHWklQLCBabGliLCBvciByYXcgREVGTEFURSBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBEZWNvbXByZXNzID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlY29tcHJlc3Mob3B0cywgY2IpIHtcbiAgICAgICAgdGhpcy5vID0gU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSB8fCB7fTtcbiAgICAgICAgdGhpcy5HID0gR3VuemlwO1xuICAgICAgICB0aGlzLkkgPSBJbmZsYXRlO1xuICAgICAgICB0aGlzLlogPSBVbnpsaWI7XG4gICAgfVxuICAgIC8vIGluaXQgc3Vic3RyZWFtXG4gICAgLy8gb3ZlcnJpZGVuIGJ5IEFzeW5jRGVjb21wcmVzc1xuICAgIERlY29tcHJlc3MucHJvdG90eXBlLmkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMucy5vbmRhdGEgPSBmdW5jdGlvbiAoZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgX3RoaXMub25kYXRhKGRhdCwgZmluYWwpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZGVjb21wcmVzc2VkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIERlY29tcHJlc3MucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICghdGhpcy5zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wICYmIHRoaXMucC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1OCh0aGlzLnAubGVuZ3RoICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBuLnNldCh0aGlzLnApLCBuLnNldChjaHVuaywgdGhpcy5wLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5wID0gY2h1bms7XG4gICAgICAgICAgICBpZiAodGhpcy5wLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnMgPSAodGhpcy5wWzBdID09IDMxICYmIHRoaXMucFsxXSA9PSAxMzkgJiYgdGhpcy5wWzJdID09IDgpXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IHRoaXMuRyh0aGlzLm8pXG4gICAgICAgICAgICAgICAgICAgIDogKCh0aGlzLnBbMF0gJiAxNSkgIT0gOCB8fCAodGhpcy5wWzBdID4+IDQpID4gNyB8fCAoKHRoaXMucFswXSA8PCA4IHwgdGhpcy5wWzFdKSAlIDMxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHRoaXMuSSh0aGlzLm8pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyB0aGlzLloodGhpcy5vKTtcbiAgICAgICAgICAgICAgICB0aGlzLmkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnMucHVzaCh0aGlzLnAsIGZpbmFsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucy5wdXNoKGNodW5rLCBmaW5hbCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVjb21wcmVzcztcbn0oKSk7XG5leHBvcnQgeyBEZWNvbXByZXNzIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgR1pJUCwgWmxpYiwgb3IgcmF3IERFRkxBVEUgZGVjb21wcmVzc2lvblxuICovXG52YXIgQXN5bmNEZWNvbXByZXNzID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jRGVjb21wcmVzcyhvcHRzLCBjYikge1xuICAgICAgICBEZWNvbXByZXNzLmNhbGwodGhpcywgb3B0cywgY2IpO1xuICAgICAgICB0aGlzLnF1ZXVlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLkcgPSBBc3luY0d1bnppcDtcbiAgICAgICAgdGhpcy5JID0gQXN5bmNJbmZsYXRlO1xuICAgICAgICB0aGlzLlogPSBBc3luY1VuemxpYjtcbiAgICB9XG4gICAgQXN5bmNEZWNvbXByZXNzLnByb3RvdHlwZS5pID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnMub25kYXRhID0gZnVuY3Rpb24gKGVyciwgZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgX3RoaXMub25kYXRhKGVyciwgZGF0LCBmaW5hbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucy5vbmRyYWluID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgICAgIF90aGlzLnF1ZXVlZFNpemUgLT0gc2l6ZTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbmRyYWluKVxuICAgICAgICAgICAgICAgIF90aGlzLm9uZHJhaW4oc2l6ZSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSBkZWNvbXByZXNzZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgQXN5bmNEZWNvbXByZXNzLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0aGlzLnF1ZXVlZFNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBEZWNvbXByZXNzLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGZpbmFsKTtcbiAgICB9O1xuICAgIHJldHVybiBBc3luY0RlY29tcHJlc3M7XG59KCkpO1xuZXhwb3J0IHsgQXN5bmNEZWNvbXByZXNzIH07XG5leHBvcnQgZnVuY3Rpb24gZGVjb21wcmVzcyhkYXRhLCBvcHRzLCBjYikge1xuICAgIGlmICghY2IpXG4gICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY2IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZXJyKDcpO1xuICAgIHJldHVybiAoZGF0YVswXSA9PSAzMSAmJiBkYXRhWzFdID09IDEzOSAmJiBkYXRhWzJdID09IDgpXG4gICAgICAgID8gZ3VuemlwKGRhdGEsIG9wdHMsIGNiKVxuICAgICAgICA6ICgoZGF0YVswXSAmIDE1KSAhPSA4IHx8IChkYXRhWzBdID4+IDQpID4gNyB8fCAoKGRhdGFbMF0gPDwgOCB8IGRhdGFbMV0pICUgMzEpKVxuICAgICAgICAgICAgPyBpbmZsYXRlKGRhdGEsIG9wdHMsIGNiKVxuICAgICAgICAgICAgOiB1bnpsaWIoZGF0YSwgb3B0cywgY2IpO1xufVxuLyoqXG4gKiBFeHBhbmRzIGNvbXByZXNzZWQgR1pJUCwgWmxpYiwgb3IgcmF3IERFRkxBVEUgZGF0YSwgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgdGhlIGZvcm1hdFxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGRlY29tcHJlc3Npb24gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXByZXNzU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgcmV0dXJuIChkYXRhWzBdID09IDMxICYmIGRhdGFbMV0gPT0gMTM5ICYmIGRhdGFbMl0gPT0gOClcbiAgICAgICAgPyBndW56aXBTeW5jKGRhdGEsIG9wdHMpXG4gICAgICAgIDogKChkYXRhWzBdICYgMTUpICE9IDggfHwgKGRhdGFbMF0gPj4gNCkgPiA3IHx8ICgoZGF0YVswXSA8PCA4IHwgZGF0YVsxXSkgJSAzMSkpXG4gICAgICAgICAgICA/IGluZmxhdGVTeW5jKGRhdGEsIG9wdHMpXG4gICAgICAgICAgICA6IHVuemxpYlN5bmMoZGF0YSwgb3B0cyk7XG59XG4vLyBmbGF0dGVuIGEgZGlyZWN0b3J5IHN0cnVjdHVyZVxudmFyIGZsdG4gPSBmdW5jdGlvbiAoZCwgcCwgdCwgbykge1xuICAgIGZvciAodmFyIGsgaW4gZCkge1xuICAgICAgICB2YXIgdmFsID0gZFtrXSwgbiA9IHAgKyBrLCBvcCA9IG87XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICBvcCA9IG1yZyhvLCB2YWxbMV0pLCB2YWwgPSB2YWxbMF07XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiB1OClcbiAgICAgICAgICAgIHRbbl0gPSBbdmFsLCBvcF07XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdFtuICs9ICcvJ10gPSBbbmV3IHU4KDApLCBvcF07XG4gICAgICAgICAgICBmbHRuKHZhbCwgbiwgdCwgbyk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuLy8gdGV4dCBlbmNvZGVyXG52YXIgdGUgPSB0eXBlb2YgVGV4dEVuY29kZXIgIT0gJ3VuZGVmaW5lZCcgJiYgLyojX19QVVJFX18qLyBuZXcgVGV4dEVuY29kZXIoKTtcbi8vIHRleHQgZGVjb2RlclxudmFyIHRkID0gdHlwZW9mIFRleHREZWNvZGVyICE9ICd1bmRlZmluZWQnICYmIC8qI19fUFVSRV9fKi8gbmV3IFRleHREZWNvZGVyKCk7XG4vLyB0ZXh0IGRlY29kZXIgc3RyZWFtXG52YXIgdGRzID0gMDtcbnRyeSB7XG4gICAgdGQuZGVjb2RlKGV0LCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICB0ZHMgPSAxO1xufVxuY2F0Y2ggKGUpIHsgfVxuLy8gZGVjb2RlIFVURjhcbnZhciBkdXRmOCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgZm9yICh2YXIgciA9ICcnLCBpID0gMDs7KSB7XG4gICAgICAgIHZhciBjID0gZFtpKytdO1xuICAgICAgICB2YXIgZWIgPSAoYyA+IDEyNykgKyAoYyA+IDIyMykgKyAoYyA+IDIzOSk7XG4gICAgICAgIGlmIChpICsgZWIgPiBkLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB7IHM6IHIsIHI6IHNsYyhkLCBpIC0gMSkgfTtcbiAgICAgICAgaWYgKCFlYilcbiAgICAgICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgZWxzZSBpZiAoZWIgPT0gMykge1xuICAgICAgICAgICAgYyA9ICgoYyAmIDE1KSA8PCAxOCB8IChkW2krK10gJiA2MykgPDwgMTIgfCAoZFtpKytdICYgNjMpIDw8IDYgfCAoZFtpKytdICYgNjMpKSAtIDY1NTM2LFxuICAgICAgICAgICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IChjID4+IDEwKSwgNTYzMjAgfCAoYyAmIDEwMjMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlYiAmIDEpXG4gICAgICAgICAgICByICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAzMSkgPDwgNiB8IChkW2krK10gJiA2MykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAxNSkgPDwgMTIgfCAoZFtpKytdICYgNjMpIDw8IDYgfCAoZFtpKytdICYgNjMpKTtcbiAgICB9XG59O1xuLyoqXG4gKiBTdHJlYW1pbmcgVVRGLTggZGVjb2RpbmdcbiAqL1xudmFyIERlY29kZVVURjggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFVURi04IGRlY29kaW5nIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuZXZlciBkYXRhIGlzIGRlY29kZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBEZWNvZGVVVEY4KGNiKSB7XG4gICAgICAgIHRoaXMub25kYXRhID0gY2I7XG4gICAgICAgIGlmICh0ZHMpXG4gICAgICAgICAgICB0aGlzLnQgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5wID0gZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGRlY29kZWQgZnJvbSBVVEYtOCBiaW5hcnlcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgRGVjb2RlVVRGOC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgZmluYWwgPSAhIWZpbmFsO1xuICAgICAgICBpZiAodGhpcy50KSB7XG4gICAgICAgICAgICB0aGlzLm9uZGF0YSh0aGlzLnQuZGVjb2RlKGNodW5rLCB7IHN0cmVhbTogdHJ1ZSB9KSwgZmluYWwpO1xuICAgICAgICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudC5kZWNvZGUoKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGVycig4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5wKVxuICAgICAgICAgICAgZXJyKDQpO1xuICAgICAgICB2YXIgZGF0ID0gbmV3IHU4KHRoaXMucC5sZW5ndGggKyBjaHVuay5sZW5ndGgpO1xuICAgICAgICBkYXQuc2V0KHRoaXMucCk7XG4gICAgICAgIGRhdC5zZXQoY2h1bmssIHRoaXMucC5sZW5ndGgpO1xuICAgICAgICB2YXIgX2EgPSBkdXRmOChkYXQpLCBzID0gX2EucywgciA9IF9hLnI7XG4gICAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICAgICAgaWYgKHIubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGVycig4KTtcbiAgICAgICAgICAgIHRoaXMucCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5wID0gcjtcbiAgICAgICAgdGhpcy5vbmRhdGEocywgZmluYWwpO1xuICAgIH07XG4gICAgcmV0dXJuIERlY29kZVVURjg7XG59KCkpO1xuZXhwb3J0IHsgRGVjb2RlVVRGOCB9O1xuLyoqXG4gKiBTdHJlYW1pbmcgVVRGLTggZW5jb2RpbmdcbiAqL1xudmFyIEVuY29kZVVURjggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFVURi04IGRlY29kaW5nIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuZXZlciBkYXRhIGlzIGVuY29kZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBFbmNvZGVVVEY4KGNiKSB7XG4gICAgICAgIHRoaXMub25kYXRhID0gY2I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGVuY29kZWQgdG8gVVRGLThcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIHN0cmluZyBkYXRhIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgRW5jb2RlVVRGOC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKHRoaXMuZClcbiAgICAgICAgICAgIGVycig0KTtcbiAgICAgICAgdGhpcy5vbmRhdGEoc3RyVG9VOChjaHVuayksIHRoaXMuZCA9IGZpbmFsIHx8IGZhbHNlKTtcbiAgICB9O1xuICAgIHJldHVybiBFbmNvZGVVVEY4O1xufSgpKTtcbmV4cG9ydCB7IEVuY29kZVVURjggfTtcbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkgZm9yIHVzZSB3aXRoIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gbWV0aG9kc1xuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGVuY29kZVxuICogQHBhcmFtIGxhdGluMSBXaGV0aGVyIG9yIG5vdCB0byBpbnRlcnByZXQgdGhlIGRhdGEgYXMgTGF0aW4tMS4gVGhpcyBzaG91bGRcbiAqICAgICAgICAgICAgICAgbm90IG5lZWQgdG8gYmUgdHJ1ZSB1bmxlc3MgZGVjb2RpbmcgYSBiaW5hcnkgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIHN0cmluZyBlbmNvZGVkIGluIFVURi04L0xhdGluLTEgYmluYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJUb1U4KHN0ciwgbGF0aW4xKSB7XG4gICAgaWYgKGxhdGluMSkge1xuICAgICAgICB2YXIgYXJfMSA9IG5ldyB1OChzdHIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBhcl8xW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJldHVybiBhcl8xO1xuICAgIH1cbiAgICBpZiAodGUpXG4gICAgICAgIHJldHVybiB0ZS5lbmNvZGUoc3RyKTtcbiAgICB2YXIgbCA9IHN0ci5sZW5ndGg7XG4gICAgdmFyIGFyID0gbmV3IHU4KHN0ci5sZW5ndGggKyAoc3RyLmxlbmd0aCA+PiAxKSk7XG4gICAgdmFyIGFpID0gMDtcbiAgICB2YXIgdyA9IGZ1bmN0aW9uICh2KSB7IGFyW2FpKytdID0gdjsgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICBpZiAoYWkgKyA1ID4gYXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbiA9IG5ldyB1OChhaSArIDggKyAoKGwgLSBpKSA8PCAxKSk7XG4gICAgICAgICAgICBuLnNldChhcik7XG4gICAgICAgICAgICBhciA9IG47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGMgPCAxMjggfHwgbGF0aW4xKVxuICAgICAgICAgICAgdyhjKTtcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpXG4gICAgICAgICAgICB3KDE5MiB8IChjID4+IDYpKSwgdygxMjggfCAoYyAmIDYzKSk7XG4gICAgICAgIGVsc2UgaWYgKGMgPiA1NTI5NSAmJiBjIDwgNTczNDQpXG4gICAgICAgICAgICBjID0gNjU1MzYgKyAoYyAmIDEwMjMgPDwgMTApIHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAxMDIzKSxcbiAgICAgICAgICAgICAgICB3KDI0MCB8IChjID4+IDE4KSksIHcoMTI4IHwgKChjID4+IDEyKSAmIDYzKSksIHcoMTI4IHwgKChjID4+IDYpICYgNjMpKSwgdygxMjggfCAoYyAmIDYzKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHcoMjI0IHwgKGMgPj4gMTIpKSwgdygxMjggfCAoKGMgPj4gNikgJiA2MykpLCB3KDEyOCB8IChjICYgNjMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsYyhhciwgMCwgYWkpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAqIEBwYXJhbSBkYXQgVGhlIGRhdGEgdG8gZGVjb2RlIHRvIHN0cmluZ1xuICogQHBhcmFtIGxhdGluMSBXaGV0aGVyIG9yIG5vdCB0byBpbnRlcnByZXQgdGhlIGRhdGEgYXMgTGF0aW4tMS4gVGhpcyBzaG91bGRcbiAqICAgICAgICAgICAgICAgbm90IG5lZWQgdG8gYmUgdHJ1ZSB1bmxlc3MgZW5jb2RpbmcgdG8gYmluYXJ5IHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBVVEYtOC9MYXRpbi0xIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyRnJvbVU4KGRhdCwgbGF0aW4xKSB7XG4gICAgaWYgKGxhdGluMSkge1xuICAgICAgICB2YXIgciA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdC5sZW5ndGg7IGkgKz0gMTYzODQpXG4gICAgICAgICAgICByICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZGF0LnN1YmFycmF5KGksIGkgKyAxNjM4NCkpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgZWxzZSBpZiAodGQpIHtcbiAgICAgICAgcmV0dXJuIHRkLmRlY29kZShkYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIF9hID0gZHV0ZjgoZGF0KSwgcyA9IF9hLnMsIHIgPSBfYS5yO1xuICAgICAgICBpZiAoci5sZW5ndGgpXG4gICAgICAgICAgICBlcnIoOCk7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbn1cbjtcbi8vIGRlZmxhdGUgYml0IGZsYWdcbnZhciBkYmYgPSBmdW5jdGlvbiAobCkgeyByZXR1cm4gbCA9PSAxID8gMyA6IGwgPCA2ID8gMiA6IGwgPT0gOSA/IDEgOiAwOyB9O1xuLy8gc2tpcCBsb2NhbCB6aXAgaGVhZGVyXG52YXIgc2x6aCA9IGZ1bmN0aW9uIChkLCBiKSB7IHJldHVybiBiICsgMzAgKyBiMihkLCBiICsgMjYpICsgYjIoZCwgYiArIDI4KTsgfTtcbi8vIHJlYWQgemlwIGhlYWRlclxudmFyIHpoID0gZnVuY3Rpb24gKGQsIGIsIHopIHtcbiAgICB2YXIgZm5sID0gYjIoZCwgYiArIDI4KSwgZm4gPSBzdHJGcm9tVTgoZC5zdWJhcnJheShiICsgNDYsIGIgKyA0NiArIGZubCksICEoYjIoZCwgYiArIDgpICYgMjA0OCkpLCBlcyA9IGIgKyA0NiArIGZubCwgYnMgPSBiNChkLCBiICsgMjApO1xuICAgIHZhciBfYSA9IHogJiYgYnMgPT0gNDI5NDk2NzI5NSA/IHo2NGUoZCwgZXMpIDogW2JzLCBiNChkLCBiICsgMjQpLCBiNChkLCBiICsgNDIpXSwgc2MgPSBfYVswXSwgc3UgPSBfYVsxXSwgb2ZmID0gX2FbMl07XG4gICAgcmV0dXJuIFtiMihkLCBiICsgMTApLCBzYywgc3UsIGZuLCBlcyArIGIyKGQsIGIgKyAzMCkgKyBiMihkLCBiICsgMzIpLCBvZmZdO1xufTtcbi8vIHJlYWQgemlwNjQgZXh0cmEgZmllbGRcbnZhciB6NjRlID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKDsgYjIoZCwgYikgIT0gMTsgYiArPSA0ICsgYjIoZCwgYiArIDIpKVxuICAgICAgICA7XG4gICAgcmV0dXJuIFtiOChkLCBiICsgMTIpLCBiOChkLCBiICsgNCksIGI4KGQsIGIgKyAyMCldO1xufTtcbi8vIGV4dHJhIGZpZWxkIGxlbmd0aFxudmFyIGV4ZmwgPSBmdW5jdGlvbiAoZXgpIHtcbiAgICB2YXIgbGUgPSAwO1xuICAgIGlmIChleCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIGV4KSB7XG4gICAgICAgICAgICB2YXIgbCA9IGV4W2tdLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsID4gNjU1MzUpXG4gICAgICAgICAgICAgICAgZXJyKDkpO1xuICAgICAgICAgICAgbGUgKz0gbCArIDQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxlO1xufTtcbi8vIHdyaXRlIHppcCBoZWFkZXJcbnZhciB3emggPSBmdW5jdGlvbiAoZCwgYiwgZiwgZm4sIHUsIGMsIGNlLCBjbykge1xuICAgIHZhciBmbCA9IGZuLmxlbmd0aCwgZXggPSBmLmV4dHJhLCBjb2wgPSBjbyAmJiBjby5sZW5ndGg7XG4gICAgdmFyIGV4bCA9IGV4ZmwoZXgpO1xuICAgIHdieXRlcyhkLCBiLCBjZSAhPSBudWxsID8gMHgyMDE0QjUwIDogMHg0MDM0QjUwKSwgYiArPSA0O1xuICAgIGlmIChjZSAhPSBudWxsKVxuICAgICAgICBkW2IrK10gPSAyMCwgZFtiKytdID0gZi5vcztcbiAgICBkW2JdID0gMjAsIGIgKz0gMjsgLy8gc3BlYyBjb21wbGlhbmNlPyB3aGF0J3MgdGhhdD9cbiAgICBkW2IrK10gPSAoZi5mbGFnIDw8IDEpIHwgKGMgPCAwICYmIDgpLCBkW2IrK10gPSB1ICYmIDg7XG4gICAgZFtiKytdID0gZi5jb21wcmVzc2lvbiAmIDI1NSwgZFtiKytdID0gZi5jb21wcmVzc2lvbiA+PiA4O1xuICAgIHZhciBkdCA9IG5ldyBEYXRlKGYubXRpbWUgPT0gbnVsbCA/IERhdGUubm93KCkgOiBmLm10aW1lKSwgeSA9IGR0LmdldEZ1bGxZZWFyKCkgLSAxOTgwO1xuICAgIGlmICh5IDwgMCB8fCB5ID4gMTE5KVxuICAgICAgICBlcnIoMTApO1xuICAgIHdieXRlcyhkLCBiLCAoeSA8PCAyNSkgfCAoKGR0LmdldE1vbnRoKCkgKyAxKSA8PCAyMSkgfCAoZHQuZ2V0RGF0ZSgpIDw8IDE2KSB8IChkdC5nZXRIb3VycygpIDw8IDExKSB8IChkdC5nZXRNaW51dGVzKCkgPDwgNSkgfCAoZHQuZ2V0U2Vjb25kcygpID4+IDEpKSwgYiArPSA0O1xuICAgIGlmIChjICE9IC0xKSB7XG4gICAgICAgIHdieXRlcyhkLCBiLCBmLmNyYyk7XG4gICAgICAgIHdieXRlcyhkLCBiICsgNCwgYyA8IDAgPyAtYyAtIDIgOiBjKTtcbiAgICAgICAgd2J5dGVzKGQsIGIgKyA4LCBmLnNpemUpO1xuICAgIH1cbiAgICB3Ynl0ZXMoZCwgYiArIDEyLCBmbCk7XG4gICAgd2J5dGVzKGQsIGIgKyAxNCwgZXhsKSwgYiArPSAxNjtcbiAgICBpZiAoY2UgIT0gbnVsbCkge1xuICAgICAgICB3Ynl0ZXMoZCwgYiwgY29sKTtcbiAgICAgICAgd2J5dGVzKGQsIGIgKyA2LCBmLmF0dHJzKTtcbiAgICAgICAgd2J5dGVzKGQsIGIgKyAxMCwgY2UpLCBiICs9IDE0O1xuICAgIH1cbiAgICBkLnNldChmbiwgYik7XG4gICAgYiArPSBmbDtcbiAgICBpZiAoZXhsKSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gZXgpIHtcbiAgICAgICAgICAgIHZhciBleGYgPSBleFtrXSwgbCA9IGV4Zi5sZW5ndGg7XG4gICAgICAgICAgICB3Ynl0ZXMoZCwgYiwgK2spO1xuICAgICAgICAgICAgd2J5dGVzKGQsIGIgKyAyLCBsKTtcbiAgICAgICAgICAgIGQuc2V0KGV4ZiwgYiArIDQpLCBiICs9IDQgKyBsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb2wpXG4gICAgICAgIGQuc2V0KGNvLCBiKSwgYiArPSBjb2w7XG4gICAgcmV0dXJuIGI7XG59O1xuLy8gd3JpdGUgemlwIGZvb3RlciAoZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5KVxudmFyIHd6ZiA9IGZ1bmN0aW9uIChvLCBiLCBjLCBkLCBlKSB7XG4gICAgd2J5dGVzKG8sIGIsIDB4NjA1NEI1MCk7IC8vIHNraXAgZGlza1xuICAgIHdieXRlcyhvLCBiICsgOCwgYyk7XG4gICAgd2J5dGVzKG8sIGIgKyAxMCwgYyk7XG4gICAgd2J5dGVzKG8sIGIgKyAxMiwgZCk7XG4gICAgd2J5dGVzKG8sIGIgKyAxNiwgZSk7XG59O1xuLyoqXG4gKiBBIHBhc3MtdGhyb3VnaCBzdHJlYW0gdG8ga2VlcCBkYXRhIHVuY29tcHJlc3NlZCBpbiBhIFpJUCBhcmNoaXZlLlxuICovXG52YXIgWmlwUGFzc1Rocm91Z2ggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBhc3MtdGhyb3VnaCBzdHJlYW0gdGhhdCBjYW4gYmUgYWRkZWQgdG8gWklQIGFyY2hpdmVzXG4gICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGRhdGEgc3RyZWFtXG4gICAgICovXG4gICAgZnVuY3Rpb24gWmlwUGFzc1Rocm91Z2goZmlsZW5hbWUpIHtcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICB0aGlzLmMgPSBjcmMoKTtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbiA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIGNodW5rIGFuZCBwdXNoZXMgdG8gdGhlIG91dHB1dCBzdHJlYW0uIFlvdSBjYW4gb3ZlcnJpZGUgdGhpc1xuICAgICAqIG1ldGhvZCBpbiBhIHN1YmNsYXNzIGZvciBjdXN0b20gYmVoYXZpb3IsIGJ1dCBieSBkZWZhdWx0IHRoaXMgcGFzc2VzXG4gICAgICogdGhlIGRhdGEgdGhyb3VnaC4gWW91IG11c3QgY2FsbCB0aGlzLm9uZGF0YShlcnIsIGNodW5rLCBmaW5hbCkgYXQgc29tZVxuICAgICAqIHBvaW50IGluIHRoaXMgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHJvY2Vzc1xuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBaaXBQYXNzVGhyb3VnaC5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEobnVsbCwgY2h1bmssIGZpbmFsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGFkZGVkLiBJZiB5b3UgYXJlIHN1YmNsYXNzaW5nIHRoaXMgd2l0aCBhIGN1c3RvbVxuICAgICAqIGNvbXByZXNzaW9uIGFsZ29yaXRobSwgbm90ZSB0aGF0IHlvdSBtdXN0IHB1c2ggZGF0YSBmcm9tIHRoZSBzb3VyY2VcbiAgICAgKiBmaWxlIG9ubHksIHByZS1jb21wcmVzc2lvbi5cbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgWmlwUGFzc1Rocm91Z2gucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIHRoaXMuYy5wKGNodW5rKTtcbiAgICAgICAgdGhpcy5zaXplICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpbmFsKVxuICAgICAgICAgICAgdGhpcy5jcmMgPSB0aGlzLmMuZCgpO1xuICAgICAgICB0aGlzLnByb2Nlc3MoY2h1bmssIGZpbmFsIHx8IGZhbHNlKTtcbiAgICB9O1xuICAgIHJldHVybiBaaXBQYXNzVGhyb3VnaDtcbn0oKSk7XG5leHBvcnQgeyBaaXBQYXNzVGhyb3VnaCB9O1xuLy8gSSBkb24ndCBleHRlbmQgYmVjYXVzZSBUeXBlU2NyaXB0IGV4dGVuc2lvbiBhZGRzIDFrQiBvZiBydW50aW1lIGJsb2F0XG4vKipcbiAqIFN0cmVhbWluZyBERUZMQVRFIGNvbXByZXNzaW9uIGZvciBaSVAgYXJjaGl2ZXMuIFByZWZlciB1c2luZyBBc3luY1ppcERlZmxhdGVcbiAqIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xudmFyIFppcERlZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIERFRkxBVEUgc3RyZWFtIHRoYXQgY2FuIGJlIGFkZGVkIHRvIFpJUCBhcmNoaXZlc1xuICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBkYXRhIHN0cmVhbVxuICAgICAqIEBwYXJhbSBvcHRzIFRoZSBjb21wcmVzc2lvbiBvcHRpb25zXG4gICAgICovXG4gICAgZnVuY3Rpb24gWmlwRGVmbGF0ZShmaWxlbmFtZSwgb3B0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIW9wdHMpXG4gICAgICAgICAgICBvcHRzID0ge307XG4gICAgICAgIFppcFBhc3NUaHJvdWdoLmNhbGwodGhpcywgZmlsZW5hbWUpO1xuICAgICAgICB0aGlzLmQgPSBuZXcgRGVmbGF0ZShvcHRzLCBmdW5jdGlvbiAoZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgX3RoaXMub25kYXRhKG51bGwsIGRhdCwgZmluYWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbiA9IDg7XG4gICAgICAgIHRoaXMuZmxhZyA9IGRiZihvcHRzLmxldmVsKTtcbiAgICB9XG4gICAgWmlwRGVmbGF0ZS5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZC5wdXNoKGNodW5rLCBmaW5hbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMub25kYXRhKGUsIG51bGwsIGZpbmFsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZGVmbGF0ZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgWmlwRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgWmlwUGFzc1Rocm91Z2gucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgcmV0dXJuIFppcERlZmxhdGU7XG59KCkpO1xuZXhwb3J0IHsgWmlwRGVmbGF0ZSB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIERFRkxBVEUgY29tcHJlc3Npb24gZm9yIFpJUCBhcmNoaXZlc1xuICovXG52YXIgQXN5bmNaaXBEZWZsYXRlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXN5bmNocm9ub3VzIERFRkxBVEUgc3RyZWFtIHRoYXQgY2FuIGJlIGFkZGVkIHRvIFpJUCBhcmNoaXZlc1xuICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBkYXRhIHN0cmVhbVxuICAgICAqIEBwYXJhbSBvcHRzIFRoZSBjb21wcmVzc2lvbiBvcHRpb25zXG4gICAgICovXG4gICAgZnVuY3Rpb24gQXN5bmNaaXBEZWZsYXRlKGZpbGVuYW1lLCBvcHRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cylcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgWmlwUGFzc1Rocm91Z2guY2FsbCh0aGlzLCBmaWxlbmFtZSk7XG4gICAgICAgIHRoaXMuZCA9IG5ldyBBc3luY0RlZmxhdGUob3B0cywgZnVuY3Rpb24gKGVyciwgZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgX3RoaXMub25kYXRhKGVyciwgZGF0LCBmaW5hbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gODtcbiAgICAgICAgdGhpcy5mbGFnID0gZGJmKG9wdHMubGV2ZWwpO1xuICAgICAgICB0aGlzLnRlcm1pbmF0ZSA9IHRoaXMuZC50ZXJtaW5hdGU7XG4gICAgfVxuICAgIEFzeW5jWmlwRGVmbGF0ZS5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdGhpcy5kLnB1c2goY2h1bmssIGZpbmFsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGRlZmxhdGVkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIEFzeW5jWmlwRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgWmlwUGFzc1Rocm91Z2gucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgcmV0dXJuIEFzeW5jWmlwRGVmbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBBc3luY1ppcERlZmxhdGUgfTtcbi8vIFRPRE86IEJldHRlciB0cmVlIHNoYWtpbmdcbi8qKlxuICogQSB6aXBwYWJsZSBhcmNoaXZlIHRvIHdoaWNoIGZpbGVzIGNhbiBpbmNyZW1lbnRhbGx5IGJlIGFkZGVkXG4gKi9cbnZhciBaaXAgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBaSVAgYXJjaGl2ZSB0byB3aGljaCBmaWxlcyBjYW4gYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbmV2ZXIgZGF0YSBmb3IgdGhlIGdlbmVyYXRlZCBaSVAgYXJjaGl2ZVxuICAgICAqICAgICAgICAgICBpcyBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBaaXAoY2IpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICAgICAgdGhpcy51ID0gW107XG4gICAgICAgIHRoaXMuZCA9IDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmaWxlIHRvIHRoZSBaSVAgYXJjaGl2ZVxuICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHN0cmVhbSB0byBhZGRcbiAgICAgKi9cbiAgICBaaXAucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5vbmRhdGEpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIC8vIGZpbmlzaGluZyBvciBmaW5pc2hlZFxuICAgICAgICBpZiAodGhpcy5kICYgMilcbiAgICAgICAgICAgIHRoaXMub25kYXRhKGVycig0ICsgKHRoaXMuZCAmIDEpICogOCwgMCwgMSksIG51bGwsIGZhbHNlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZiA9IHN0clRvVTgoZmlsZS5maWxlbmFtZSksIGZsXzEgPSBmLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBjb20gPSBmaWxlLmNvbW1lbnQsIG8gPSBjb20gJiYgc3RyVG9VOChjb20pO1xuICAgICAgICAgICAgdmFyIHUgPSBmbF8xICE9IGZpbGUuZmlsZW5hbWUubGVuZ3RoIHx8IChvICYmIChjb20ubGVuZ3RoICE9IG8ubGVuZ3RoKSk7XG4gICAgICAgICAgICB2YXIgaGxfMSA9IGZsXzEgKyBleGZsKGZpbGUuZXh0cmEpICsgMzA7XG4gICAgICAgICAgICBpZiAoZmxfMSA+IDY1NTM1KVxuICAgICAgICAgICAgICAgIHRoaXMub25kYXRhKGVycigxMSwgMCwgMSksIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBuZXcgdTgoaGxfMSk7XG4gICAgICAgICAgICB3emgoaGVhZGVyLCAwLCBmaWxlLCBmLCB1LCAtMSk7XG4gICAgICAgICAgICB2YXIgY2hrc18xID0gW2hlYWRlcl07XG4gICAgICAgICAgICB2YXIgcEFsbF8xID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgY2hrc18yID0gY2hrc18xOyBfaSA8IGNoa3NfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoayA9IGNoa3NfMltfaV07XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm9uZGF0YShudWxsLCBjaGssIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hrc18xID0gW107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRyXzEgPSB0aGlzLmQ7XG4gICAgICAgICAgICB0aGlzLmQgPSAwO1xuICAgICAgICAgICAgdmFyIGluZF8xID0gdGhpcy51Lmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB1Zl8xID0gbXJnKGZpbGUsIHtcbiAgICAgICAgICAgICAgICBmOiBmLFxuICAgICAgICAgICAgICAgIHU6IHUsXG4gICAgICAgICAgICAgICAgbzogbyxcbiAgICAgICAgICAgICAgICB0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnRlcm1pbmF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBBbGxfMSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG54dCA9IF90aGlzLnVbaW5kXzEgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChueHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnh0LnIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cl8xID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBjbF8xID0gMDtcbiAgICAgICAgICAgIGZpbGUub25kYXRhID0gZnVuY3Rpb24gKGVyciwgZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25kYXRhKGVyciwgZGF0LCBmaW5hbCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2xfMSArPSBkYXQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjaGtzXzEucHVzaChkYXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZCA9IG5ldyB1OCgxNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB3Ynl0ZXMoZGQsIDAsIDB4ODA3NEI1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3Ynl0ZXMoZGQsIDQsIGZpbGUuY3JjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdieXRlcyhkZCwgOCwgY2xfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3Ynl0ZXMoZGQsIDEyLCBmaWxlLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hrc18xLnB1c2goZGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWZfMS5jID0gY2xfMSwgdWZfMS5iID0gaGxfMSArIGNsXzEgKyAxNiwgdWZfMS5jcmMgPSBmaWxlLmNyYywgdWZfMS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWZfMS5yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cl8xID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0cl8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcEFsbF8xKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMudS5wdXNoKHVmXzEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmRzIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBmaWxlcyBhbmQgcHJlcGFyZXMgdG8gZW1pdCB0aGUgZmluYWwgY2h1bmtzLlxuICAgICAqIFRoaXMgKm11c3QqIGJlIGNhbGxlZCBhZnRlciBhZGRpbmcgYWxsIGRlc2lyZWQgZmlsZXMgZm9yIHRoZSByZXN1bHRpbmdcbiAgICAgKiBaSVAgZmlsZSB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqL1xuICAgIFppcC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5kICYgMikge1xuICAgICAgICAgICAgdGhpcy5vbmRhdGEoZXJyKDQgKyAodGhpcy5kICYgMSkgKiA4LCAwLCAxKSwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZClcbiAgICAgICAgICAgIHRoaXMuZSgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnUucHVzaCh7XG4gICAgICAgICAgICAgICAgcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShfdGhpcy5kICYgMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnUuc3BsaWNlKC0xLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdDogZnVuY3Rpb24gKCkgeyB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kID0gMztcbiAgICB9O1xuICAgIFppcC5wcm90b3R5cGUuZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ0ID0gMCwgbCA9IDAsIHRsID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMudTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBmID0gX2FbX2ldO1xuICAgICAgICAgICAgdGwgKz0gNDYgKyBmLmYubGVuZ3RoICsgZXhmbChmLmV4dHJhKSArIChmLm8gPyBmLm8ubGVuZ3RoIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dCA9IG5ldyB1OCh0bCArIDIyKTtcbiAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IHRoaXMudTsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgICAgIHZhciBmID0gX2NbX2JdO1xuICAgICAgICAgICAgd3poKG91dCwgYnQsIGYsIGYuZiwgZi51LCAtZi5jIC0gMiwgbCwgZi5vKTtcbiAgICAgICAgICAgIGJ0ICs9IDQ2ICsgZi5mLmxlbmd0aCArIGV4ZmwoZi5leHRyYSkgKyAoZi5vID8gZi5vLmxlbmd0aCA6IDApLCBsICs9IGYuYjtcbiAgICAgICAgfVxuICAgICAgICB3emYob3V0LCBidCwgdGhpcy51Lmxlbmd0aCwgdGwsIGwpO1xuICAgICAgICB0aGlzLm9uZGF0YShudWxsLCBvdXQsIHRydWUpO1xuICAgICAgICB0aGlzLmQgPSAyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdG8gdGVybWluYXRlIGFueSBpbnRlcm5hbCB3b3JrZXJzIHVzZWQgYnkgdGhlIHN0cmVhbS4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIGFkZCgpIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBaaXAucHJvdG90eXBlLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMudTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBmID0gX2FbX2ldO1xuICAgICAgICAgICAgZi50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kID0gMjtcbiAgICB9O1xuICAgIHJldHVybiBaaXA7XG59KCkpO1xuZXhwb3J0IHsgWmlwIH07XG5leHBvcnQgZnVuY3Rpb24gemlwKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgdmFyIHIgPSB7fTtcbiAgICBmbHRuKGRhdGEsICcnLCByLCBvcHRzKTtcbiAgICB2YXIgayA9IE9iamVjdC5rZXlzKHIpO1xuICAgIHZhciBsZnQgPSBrLmxlbmd0aCwgbyA9IDAsIHRvdCA9IDA7XG4gICAgdmFyIHNsZnQgPSBsZnQsIGZpbGVzID0gbmV3IEFycmF5KGxmdCk7XG4gICAgdmFyIHRlcm0gPSBbXTtcbiAgICB2YXIgdEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXJtLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGVybVtpXSgpO1xuICAgIH07XG4gICAgdmFyIGNiZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIG10KGZ1bmN0aW9uICgpIHsgY2IoYSwgYik7IH0pO1xuICAgIH07XG4gICAgbXQoZnVuY3Rpb24gKCkgeyBjYmQgPSBjYjsgfSk7XG4gICAgdmFyIGNiZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyB1OCh0b3QgKyAyMiksIG9lID0gbywgY2RsID0gdG90IC0gbztcbiAgICAgICAgdG90ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGZ0OyArK2kpIHtcbiAgICAgICAgICAgIHZhciBmID0gZmlsZXNbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBsID0gZi5jLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3emgob3V0LCB0b3QsIGYsIGYuZiwgZi51LCBsKTtcbiAgICAgICAgICAgICAgICB2YXIgYmFkZCA9IDMwICsgZi5mLmxlbmd0aCArIGV4ZmwoZi5leHRyYSk7XG4gICAgICAgICAgICAgICAgdmFyIGxvYyA9IHRvdCArIGJhZGQ7XG4gICAgICAgICAgICAgICAgb3V0LnNldChmLmMsIGxvYyk7XG4gICAgICAgICAgICAgICAgd3poKG91dCwgbywgZiwgZi5mLCBmLnUsIGwsIHRvdCwgZi5tKSwgbyArPSAxNiArIGJhZGQgKyAoZi5tID8gZi5tLmxlbmd0aCA6IDApLCB0b3QgPSBsb2MgKyBsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2JkKGUsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHd6ZihvdXQsIG8sIGZpbGVzLmxlbmd0aCwgY2RsLCBvZSk7XG4gICAgICAgIGNiZChudWxsLCBvdXQpO1xuICAgIH07XG4gICAgaWYgKCFsZnQpXG4gICAgICAgIGNiZigpO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIGZuID0ga1tpXTtcbiAgICAgICAgdmFyIF9hID0gcltmbl0sIGZpbGUgPSBfYVswXSwgcCA9IF9hWzFdO1xuICAgICAgICB2YXIgYyA9IGNyYygpLCBzaXplID0gZmlsZS5sZW5ndGg7XG4gICAgICAgIGMucChmaWxlKTtcbiAgICAgICAgdmFyIGYgPSBzdHJUb1U4KGZuKSwgcyA9IGYubGVuZ3RoO1xuICAgICAgICB2YXIgY29tID0gcC5jb21tZW50LCBtID0gY29tICYmIHN0clRvVTgoY29tKSwgbXMgPSBtICYmIG0ubGVuZ3RoO1xuICAgICAgICB2YXIgZXhsID0gZXhmbChwLmV4dHJhKTtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uID0gcC5sZXZlbCA9PSAwID8gMCA6IDg7XG4gICAgICAgIHZhciBjYmwgPSBmdW5jdGlvbiAoZSwgZCkge1xuICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICB0QWxsKCk7XG4gICAgICAgICAgICAgICAgY2JkKGUsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGwgPSBkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmaWxlc1tpXSA9IG1yZyhwLCB7XG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNyYzogYy5kKCksXG4gICAgICAgICAgICAgICAgICAgIGM6IGQsXG4gICAgICAgICAgICAgICAgICAgIGY6IGYsXG4gICAgICAgICAgICAgICAgICAgIG06IG0sXG4gICAgICAgICAgICAgICAgICAgIHU6IHMgIT0gZm4ubGVuZ3RoIHx8IChtICYmIChjb20ubGVuZ3RoICE9IG1zKSksXG4gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uOiBjb21wcmVzc2lvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG8gKz0gMzAgKyBzICsgZXhsICsgbDtcbiAgICAgICAgICAgICAgICB0b3QgKz0gNzYgKyAyICogKHMgKyBleGwpICsgKG1zIHx8IDApICsgbDtcbiAgICAgICAgICAgICAgICBpZiAoIS0tbGZ0KVxuICAgICAgICAgICAgICAgICAgICBjYmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHMgPiA2NTUzNSlcbiAgICAgICAgICAgIGNibChlcnIoMTEsIDAsIDEpLCBudWxsKTtcbiAgICAgICAgaWYgKCFjb21wcmVzc2lvbilcbiAgICAgICAgICAgIGNibChudWxsLCBmaWxlKTtcbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA8IDE2MDAwMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjYmwobnVsbCwgZGVmbGF0ZVN5bmMoZmlsZSwgcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjYmwoZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGVybS5wdXNoKGRlZmxhdGUoZmlsZSwgcCwgY2JsKSk7XG4gICAgfTtcbiAgICAvLyBDYW5ub3QgdXNlIGxmdCBiZWNhdXNlIGl0IGNhbiBkZWNyZWFzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xmdDsgKytpKSB7XG4gICAgICAgIF9sb29wXzEoaSk7XG4gICAgfVxuICAgIHJldHVybiB0QWxsO1xufVxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSBaSVAgZmlsZS4gUHJlZmVyIHVzaW5nIGB6aXBgIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqIHdpdGggbW9yZSB0aGFuIG9uZSBmaWxlLlxuICogQHBhcmFtIGRhdGEgVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRoZSBaSVAgYXJjaGl2ZVxuICogQHBhcmFtIG9wdHMgVGhlIG1haW4gb3B0aW9ucywgbWVyZ2VkIHdpdGggcGVyLWZpbGUgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBaSVAgYXJjaGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gemlwU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgaWYgKCFvcHRzKVxuICAgICAgICBvcHRzID0ge307XG4gICAgdmFyIHIgPSB7fTtcbiAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICBmbHRuKGRhdGEsICcnLCByLCBvcHRzKTtcbiAgICB2YXIgbyA9IDA7XG4gICAgdmFyIHRvdCA9IDA7XG4gICAgZm9yICh2YXIgZm4gaW4gcikge1xuICAgICAgICB2YXIgX2EgPSByW2ZuXSwgZmlsZSA9IF9hWzBdLCBwID0gX2FbMV07XG4gICAgICAgIHZhciBjb21wcmVzc2lvbiA9IHAubGV2ZWwgPT0gMCA/IDAgOiA4O1xuICAgICAgICB2YXIgZiA9IHN0clRvVTgoZm4pLCBzID0gZi5sZW5ndGg7XG4gICAgICAgIHZhciBjb20gPSBwLmNvbW1lbnQsIG0gPSBjb20gJiYgc3RyVG9VOChjb20pLCBtcyA9IG0gJiYgbS5sZW5ndGg7XG4gICAgICAgIHZhciBleGwgPSBleGZsKHAuZXh0cmEpO1xuICAgICAgICBpZiAocyA+IDY1NTM1KVxuICAgICAgICAgICAgZXJyKDExKTtcbiAgICAgICAgdmFyIGQgPSBjb21wcmVzc2lvbiA/IGRlZmxhdGVTeW5jKGZpbGUsIHApIDogZmlsZSwgbCA9IGQubGVuZ3RoO1xuICAgICAgICB2YXIgYyA9IGNyYygpO1xuICAgICAgICBjLnAoZmlsZSk7XG4gICAgICAgIGZpbGVzLnB1c2gobXJnKHAsIHtcbiAgICAgICAgICAgIHNpemU6IGZpbGUubGVuZ3RoLFxuICAgICAgICAgICAgY3JjOiBjLmQoKSxcbiAgICAgICAgICAgIGM6IGQsXG4gICAgICAgICAgICBmOiBmLFxuICAgICAgICAgICAgbTogbSxcbiAgICAgICAgICAgIHU6IHMgIT0gZm4ubGVuZ3RoIHx8IChtICYmIChjb20ubGVuZ3RoICE9IG1zKSksXG4gICAgICAgICAgICBvOiBvLFxuICAgICAgICAgICAgY29tcHJlc3Npb246IGNvbXByZXNzaW9uXG4gICAgICAgIH0pKTtcbiAgICAgICAgbyArPSAzMCArIHMgKyBleGwgKyBsO1xuICAgICAgICB0b3QgKz0gNzYgKyAyICogKHMgKyBleGwpICsgKG1zIHx8IDApICsgbDtcbiAgICB9XG4gICAgdmFyIG91dCA9IG5ldyB1OCh0b3QgKyAyMiksIG9lID0gbywgY2RsID0gdG90IC0gbztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBmID0gZmlsZXNbaV07XG4gICAgICAgIHd6aChvdXQsIGYubywgZiwgZi5mLCBmLnUsIGYuYy5sZW5ndGgpO1xuICAgICAgICB2YXIgYmFkZCA9IDMwICsgZi5mLmxlbmd0aCArIGV4ZmwoZi5leHRyYSk7XG4gICAgICAgIG91dC5zZXQoZi5jLCBmLm8gKyBiYWRkKTtcbiAgICAgICAgd3poKG91dCwgbywgZiwgZi5mLCBmLnUsIGYuYy5sZW5ndGgsIGYubywgZi5tKSwgbyArPSAxNiArIGJhZGQgKyAoZi5tID8gZi5tLmxlbmd0aCA6IDApO1xuICAgIH1cbiAgICB3emYob3V0LCBvLCBmaWxlcy5sZW5ndGgsIGNkbCwgb2UpO1xuICAgIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN0cmVhbWluZyBwYXNzLXRocm91Z2ggZGVjb21wcmVzc2lvbiBmb3IgWklQIGFyY2hpdmVzXG4gKi9cbnZhciBVbnppcFBhc3NUaHJvdWdoID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFVuemlwUGFzc1Rocm91Z2goKSB7XG4gICAgfVxuICAgIFVuemlwUGFzc1Rocm91Z2gucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgZmluYWwpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEobnVsbCwgZGF0YSwgZmluYWwpO1xuICAgIH07XG4gICAgVW56aXBQYXNzVGhyb3VnaC5jb21wcmVzc2lvbiA9IDA7XG4gICAgcmV0dXJuIFVuemlwUGFzc1Rocm91Z2g7XG59KCkpO1xuZXhwb3J0IHsgVW56aXBQYXNzVGhyb3VnaCB9O1xuLyoqXG4gKiBTdHJlYW1pbmcgREVGTEFURSBkZWNvbXByZXNzaW9uIGZvciBaSVAgYXJjaGl2ZXMuIFByZWZlciBBc3luY1ppcEluZmxhdGUgZm9yXG4gKiBiZXR0ZXIgcGVyZm9ybWFuY2UuXG4gKi9cbnZhciBVbnppcEluZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIERFRkxBVEUgZGVjb21wcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGluIFpJUCBhcmNoaXZlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIFVuemlwSW5mbGF0ZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5pID0gbmV3IEluZmxhdGUoZnVuY3Rpb24gKGRhdCwgZmluYWwpIHtcbiAgICAgICAgICAgIF90aGlzLm9uZGF0YShudWxsLCBkYXQsIGZpbmFsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFVuemlwSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBmaW5hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5pLnB1c2goZGF0YSwgZmluYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLm9uZGF0YShlLCBudWxsLCBmaW5hbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFVuemlwSW5mbGF0ZS5jb21wcmVzc2lvbiA9IDg7XG4gICAgcmV0dXJuIFVuemlwSW5mbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBVbnppcEluZmxhdGUgfTtcbi8qKlxuICogQXN5bmNocm9ub3VzIHN0cmVhbWluZyBERUZMQVRFIGRlY29tcHJlc3Npb24gZm9yIFpJUCBhcmNoaXZlc1xuICovXG52YXIgQXN5bmNVbnppcEluZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIERFRkxBVEUgZGVjb21wcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGluIFpJUCBhcmNoaXZlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFzeW5jVW56aXBJbmZsYXRlKF8sIHN6KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChzeiA8IDMyMDAwMCkge1xuICAgICAgICAgICAgdGhpcy5pID0gbmV3IEluZmxhdGUoZnVuY3Rpb24gKGRhdCwgZmluYWwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbmRhdGEobnVsbCwgZGF0LCBmaW5hbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaSA9IG5ldyBBc3luY0luZmxhdGUoZnVuY3Rpb24gKGVyciwgZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uZGF0YShlcnIsIGRhdCwgZmluYWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZSA9IHRoaXMuaS50ZXJtaW5hdGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQXN5bmNVbnppcEluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgZmluYWwpIHtcbiAgICAgICAgaWYgKHRoaXMuaS50ZXJtaW5hdGUpXG4gICAgICAgICAgICBkYXRhID0gc2xjKGRhdGEsIDApO1xuICAgICAgICB0aGlzLmkucHVzaChkYXRhLCBmaW5hbCk7XG4gICAgfTtcbiAgICBBc3luY1VuemlwSW5mbGF0ZS5jb21wcmVzc2lvbiA9IDg7XG4gICAgcmV0dXJuIEFzeW5jVW56aXBJbmZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jVW56aXBJbmZsYXRlIH07XG4vKipcbiAqIEEgWklQIGFyY2hpdmUgZGVjb21wcmVzc2lvbiBzdHJlYW0gdGhhdCBlbWl0cyBmaWxlcyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkXG4gKi9cbnZhciBVbnppcCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgWklQIGRlY29tcHJlc3Npb24gc3RyZWFtXG4gICAgICogQHBhcmFtIGNiIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW5ldmVyIGEgZmlsZSBpbiB0aGUgWklQIGFyY2hpdmUgaXMgZm91bmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBVbnppcChjYikge1xuICAgICAgICB0aGlzLm9uZmlsZSA9IGNiO1xuICAgICAgICB0aGlzLmsgPSBbXTtcbiAgICAgICAgdGhpcy5vID0ge1xuICAgICAgICAgICAgMDogVW56aXBQYXNzVGhyb3VnaFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnAgPSBldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgdW56aXBwZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgVW56aXAucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5vbmZpbGUpXG4gICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgIGlmICghdGhpcy5wKVxuICAgICAgICAgICAgZXJyKDQpO1xuICAgICAgICBpZiAodGhpcy5jID4gMCkge1xuICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHRoaXMuYywgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciB0b0FkZCA9IGNodW5rLnN1YmFycmF5KDAsIGxlbik7XG4gICAgICAgICAgICB0aGlzLmMgLT0gbGVuO1xuICAgICAgICAgICAgaWYgKHRoaXMuZClcbiAgICAgICAgICAgICAgICB0aGlzLmQucHVzaCh0b0FkZCwgIXRoaXMuYyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5rWzBdLnB1c2godG9BZGQpO1xuICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5zdWJhcnJheShsZW4pO1xuICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoKGNodW5rLCBmaW5hbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZiA9IDAsIGkgPSAwLCBpcyA9IHZvaWQgMCwgYnVmID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnAubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGJ1ZiA9IGNodW5rO1xuICAgICAgICAgICAgZWxzZSBpZiAoIWNodW5rLmxlbmd0aClcbiAgICAgICAgICAgICAgICBidWYgPSB0aGlzLnA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWYgPSBuZXcgdTgodGhpcy5wLmxlbmd0aCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYnVmLnNldCh0aGlzLnApLCBidWYuc2V0KGNodW5rLCB0aGlzLnAubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsID0gYnVmLmxlbmd0aCwgb2MgPSB0aGlzLmMsIGFkZCA9IG9jICYmIHRoaXMuZDtcbiAgICAgICAgICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICB2YXIgc2lnID0gYjQoYnVmLCBpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2lnID09IDB4NDAzNEI1MCkge1xuICAgICAgICAgICAgICAgICAgICBmID0gMSwgaXMgPSBpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzXzEuZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNfMS5jID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJmID0gYjIoYnVmLCBpICsgNiksIGNtcF8xID0gYjIoYnVmLCBpICsgOCksIHUgPSBiZiAmIDIwNDgsIGRkID0gYmYgJiA4LCBmbmwgPSBiMihidWYsIGkgKyAyNiksIGVzID0gYjIoYnVmLCBpICsgMjgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobCA+IGkgKyAzMCArIGZubCArIGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hrc18zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEuay51bnNoaWZ0KGNoa3NfMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY18xID0gYjQoYnVmLCBpICsgMTgpLCBzdV8xID0gYjQoYnVmLCBpICsgMjIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuXzEgPSBzdHJGcm9tVTgoYnVmLnN1YmFycmF5KGkgKyAzMCwgaSArPSAzMCArIGZubCksICF1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY18xID09IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IGRkID8gWy0yXSA6IHo2NGUoYnVmLCBpKSwgc2NfMSA9IF9hWzBdLCBzdV8xID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY18xID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmMgPSBzY18xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlXzEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm5fMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbjogY21wXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlXzEub25kYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKDUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXzEub25kYXRhKG51bGwsIGV0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3RyID0gX3RoaXMub1tjbXBfMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN0cilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXzEub25kYXRhKGVycigxNCwgJ3Vua25vd24gY29tcHJlc3Npb24gdHlwZSAnICsgY21wXzEsIDEpLCBudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkXzEgPSBzY18xIDwgMCA/IG5ldyBjdHIoZm5fMSkgOiBuZXcgY3RyKGZuXzEsIHNjXzEsIHN1XzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF8xLm9uZGF0YSA9IGZ1bmN0aW9uIChlcnIsIGRhdCwgZmluYWwpIHsgZmlsZV8xLm9uZGF0YShlcnIsIGRhdCwgZmluYWwpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBjaGtzXzQgPSBjaGtzXzM7IF9pIDwgY2hrc180Lmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXQgPSBjaGtzXzRbX2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfMS5wdXNoKGRhdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmtbMF0gPT0gY2hrc18zICYmIF90aGlzLmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZCA9IGRfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkXzEucHVzaChldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZF8xICYmIGRfMS50ZXJtaW5hdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkXzEudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY18xID49IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8xLnNpemUgPSBzY18xLCBmaWxlXzEub3JpZ2luYWxTaXplID0gc3VfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMS5vbmZpbGUoZmlsZV8xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnID09IDB4ODA3NEI1MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBpICs9IDEyICsgKG9jID09IC0yICYmIDgpLCBmID0gMywgdGhpc18xLmMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaWcgPT0gMHgyMDE0QjUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGkgLT0gNCwgZiA9IDMsIHRoaXNfMS5jID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IGwgLSA0OyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdGVfMSA9IF9sb29wXzIoKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucCA9IGV0O1xuICAgICAgICAgICAgaWYgKG9jIDwgMCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXQgPSBmID8gYnVmLnN1YmFycmF5KDAsIGlzIC0gMTIgLSAob2MgPT0gLTIgJiYgOCkgLSAoYjQoYnVmLCBpcyAtIDE2KSA9PSAweDgwNzRCNTAgJiYgNCkpIDogYnVmLnN1YmFycmF5KDAsIGkpO1xuICAgICAgICAgICAgICAgIGlmIChhZGQpXG4gICAgICAgICAgICAgICAgICAgIGFkZC5wdXNoKGRhdCwgISFmKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMua1srKGYgPT0gMildLnB1c2goZGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmICYgMilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoKGJ1Zi5zdWJhcnJheShpKSwgZmluYWwpO1xuICAgICAgICAgICAgdGhpcy5wID0gYnVmLnN1YmFycmF5KGkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYylcbiAgICAgICAgICAgICAgICBlcnIoMTMpO1xuICAgICAgICAgICAgdGhpcy5wID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgZGVjb2RlciB3aXRoIHRoZSBzdHJlYW0sIGFsbG93aW5nIGZvciBmaWxlcyBjb21wcmVzc2VkIHdpdGhcbiAgICAgKiB0aGUgY29tcHJlc3Npb24gdHlwZSBwcm92aWRlZCB0byBiZSBleHBhbmRlZCBjb3JyZWN0bHlcbiAgICAgKiBAcGFyYW0gZGVjb2RlciBUaGUgZGVjb2RlciBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIFVuemlwLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIChkZWNvZGVyKSB7XG4gICAgICAgIHRoaXMub1tkZWNvZGVyLmNvbXByZXNzaW9uXSA9IGRlY29kZXI7XG4gICAgfTtcbiAgICByZXR1cm4gVW56aXA7XG59KCkpO1xuZXhwb3J0IHsgVW56aXAgfTtcbnZhciBtdCA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2Ygc2V0VGltZW91dCA9PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IGZ1bmN0aW9uIChmbikgeyBmbigpOyB9O1xuZXhwb3J0IGZ1bmN0aW9uIHVuemlwKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgdmFyIHRlcm0gPSBbXTtcbiAgICB2YXIgdEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXJtLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGVybVtpXSgpO1xuICAgIH07XG4gICAgdmFyIGZpbGVzID0ge307XG4gICAgdmFyIGNiZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIG10KGZ1bmN0aW9uICgpIHsgY2IoYSwgYik7IH0pO1xuICAgIH07XG4gICAgbXQoZnVuY3Rpb24gKCkgeyBjYmQgPSBjYjsgfSk7XG4gICAgdmFyIGUgPSBkYXRhLmxlbmd0aCAtIDIyO1xuICAgIGZvciAoOyBiNChkYXRhLCBlKSAhPSAweDYwNTRCNTA7IC0tZSkge1xuICAgICAgICBpZiAoIWUgfHwgZGF0YS5sZW5ndGggLSBlID4gNjU1NTgpIHtcbiAgICAgICAgICAgIGNiZChlcnIoMTMsIDAsIDEpLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybiB0QWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICB2YXIgbGZ0ID0gYjIoZGF0YSwgZSArIDgpO1xuICAgIGlmIChsZnQpIHtcbiAgICAgICAgdmFyIGMgPSBsZnQ7XG4gICAgICAgIHZhciBvID0gYjQoZGF0YSwgZSArIDE2KTtcbiAgICAgICAgdmFyIHogPSBvID09IDQyOTQ5NjcyOTUgfHwgYyA9PSA2NTUzNTtcbiAgICAgICAgaWYgKHopIHtcbiAgICAgICAgICAgIHZhciB6ZSA9IGI0KGRhdGEsIGUgLSAxMik7XG4gICAgICAgICAgICB6ID0gYjQoZGF0YSwgemUpID09IDB4NjA2NEI1MDtcbiAgICAgICAgICAgIGlmICh6KSB7XG4gICAgICAgICAgICAgICAgYyA9IGxmdCA9IGI0KGRhdGEsIHplICsgMzIpO1xuICAgICAgICAgICAgICAgIG8gPSBiNChkYXRhLCB6ZSArIDQ4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZmx0ciA9IG9wdHMgJiYgb3B0cy5maWx0ZXI7XG4gICAgICAgIHZhciBfbG9vcF8zID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHpoKGRhdGEsIG8sIHopLCBjXzEgPSBfYVswXSwgc2MgPSBfYVsxXSwgc3UgPSBfYVsyXSwgZm4gPSBfYVszXSwgbm8gPSBfYVs0XSwgb2ZmID0gX2FbNV0sIGIgPSBzbHpoKGRhdGEsIG9mZik7XG4gICAgICAgICAgICBvID0gbm87XG4gICAgICAgICAgICB2YXIgY2JsID0gZnVuY3Rpb24gKGUsIGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIGNiZChlLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbZm5dID0gZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWxmdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiZChudWxsLCBmaWxlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghZmx0ciB8fCBmbHRyKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmbixcbiAgICAgICAgICAgICAgICBzaXplOiBzYyxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFNpemU6IHN1LFxuICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uOiBjXzFcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjXzEpXG4gICAgICAgICAgICAgICAgICAgIGNibChudWxsLCBzbGMoZGF0YSwgYiwgYiArIHNjKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY18xID09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZmwgPSBkYXRhLnN1YmFycmF5KGIsIGIgKyBzYyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzbHkgZGVjb21wcmVzcyB1bmRlciA1MTJLQiwgb3IgYmFyZWx5LWNvbXByZXNzZWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3UgPCA1MjQyODggfHwgc2MgPiAwLjggKiBzdSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmwobnVsbCwgaW5mbGF0ZVN5bmMoaW5mbCwgeyBvdXQ6IG5ldyB1OChzdSkgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmwoZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGVybS5wdXNoKGluZmxhdGUoaW5mbCwgeyBzaXplOiBzdSB9LCBjYmwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjYmwoZXJyKDE0LCAndW5rbm93biBjb21wcmVzc2lvbiB0eXBlICcgKyBjXzEsIDEpLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjYmwobnVsbCwgbnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYzsgKytpKSB7XG4gICAgICAgICAgICBfbG9vcF8zKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgY2JkKG51bGwsIHt9KTtcbiAgICByZXR1cm4gdEFsbDtcbn1cbi8qKlxuICogU3luY2hyb25vdXNseSBkZWNvbXByZXNzZXMgYSBaSVAgYXJjaGl2ZS4gUHJlZmVyIHVzaW5nIGB1bnppcGAgZm9yIGJldHRlclxuICogcGVyZm9ybWFuY2Ugd2l0aCBtb3JlIHRoYW4gb25lIGZpbGUuXG4gKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGNvbXByZXNzZWQgWklQIGZpbGVcbiAqIEBwYXJhbSBvcHRzIFRoZSBaSVAgZXh0cmFjdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZGVjb21wcmVzc2VkIGZpbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnppcFN5bmMoZGF0YSwgb3B0cykge1xuICAgIHZhciBmaWxlcyA9IHt9O1xuICAgIHZhciBlID0gZGF0YS5sZW5ndGggLSAyMjtcbiAgICBmb3IgKDsgYjQoZGF0YSwgZSkgIT0gMHg2MDU0QjUwOyAtLWUpIHtcbiAgICAgICAgaWYgKCFlIHx8IGRhdGEubGVuZ3RoIC0gZSA+IDY1NTU4KVxuICAgICAgICAgICAgZXJyKDEzKTtcbiAgICB9XG4gICAgO1xuICAgIHZhciBjID0gYjIoZGF0YSwgZSArIDgpO1xuICAgIGlmICghYylcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHZhciBvID0gYjQoZGF0YSwgZSArIDE2KTtcbiAgICB2YXIgeiA9IG8gPT0gNDI5NDk2NzI5NSB8fCBjID09IDY1NTM1O1xuICAgIGlmICh6KSB7XG4gICAgICAgIHZhciB6ZSA9IGI0KGRhdGEsIGUgLSAxMik7XG4gICAgICAgIHogPSBiNChkYXRhLCB6ZSkgPT0gMHg2MDY0QjUwO1xuICAgICAgICBpZiAoeikge1xuICAgICAgICAgICAgYyA9IGI0KGRhdGEsIHplICsgMzIpO1xuICAgICAgICAgICAgbyA9IGI0KGRhdGEsIHplICsgNDgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBmbHRyID0gb3B0cyAmJiBvcHRzLmZpbHRlcjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGM7ICsraSkge1xuICAgICAgICB2YXIgX2EgPSB6aChkYXRhLCBvLCB6KSwgY18yID0gX2FbMF0sIHNjID0gX2FbMV0sIHN1ID0gX2FbMl0sIGZuID0gX2FbM10sIG5vID0gX2FbNF0sIG9mZiA9IF9hWzVdLCBiID0gc2x6aChkYXRhLCBvZmYpO1xuICAgICAgICBvID0gbm87XG4gICAgICAgIGlmICghZmx0ciB8fCBmbHRyKHtcbiAgICAgICAgICAgIG5hbWU6IGZuLFxuICAgICAgICAgICAgc2l6ZTogc2MsXG4gICAgICAgICAgICBvcmlnaW5hbFNpemU6IHN1LFxuICAgICAgICAgICAgY29tcHJlc3Npb246IGNfMlxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgaWYgKCFjXzIpXG4gICAgICAgICAgICAgICAgZmlsZXNbZm5dID0gc2xjKGRhdGEsIGIsIGIgKyBzYyk7XG4gICAgICAgICAgICBlbHNlIGlmIChjXzIgPT0gOClcbiAgICAgICAgICAgICAgICBmaWxlc1tmbl0gPSBpbmZsYXRlU3luYyhkYXRhLnN1YmFycmF5KGIsIGIgKyBzYyksIHsgb3V0OiBuZXcgdTgoc3UpIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycigxNCwgJ3Vua25vd24gY29tcHJlc3Npb24gdHlwZSAnICsgY18yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4iLCAiY29uc3QgZGVmYXVsdEVycm9yQ29uZmlnID0ge1xyXG4gICAgd2l0aFN0YWNrVHJhY2U6IGZhbHNlLFxyXG59O1xyXG4vLyBDdXN0b20gZXJyb3Igb2JqZWN0XHJcbi8vIENvbnRleHQgLyBkaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtYWNyby9uZXZlcnRocm93L3B1bGwvMjE1XHJcbmNvbnN0IGNyZWF0ZU5ldmVyVGhyb3dFcnJvciA9IChtZXNzYWdlLCByZXN1bHQsIGNvbmZpZyA9IGRlZmF1bHRFcnJvckNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHJlc3VsdC5pc09rKClcclxuICAgICAgICA/IHsgdHlwZTogJ09rJywgdmFsdWU6IHJlc3VsdC52YWx1ZSB9XHJcbiAgICAgICAgOiB7IHR5cGU6ICdFcnInLCB2YWx1ZTogcmVzdWx0LmVycm9yIH07XHJcbiAgICBjb25zdCBtYXliZVN0YWNrID0gY29uZmlnLndpdGhTdGFja1RyYWNlID8gbmV3IEVycm9yKCkuc3RhY2sgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBzdGFjazogbWF5YmVTdGFjayxcclxuICAgIH07XHJcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuY2xhc3MgUmVzdWx0QXN5bmMge1xyXG4gICAgY29uc3RydWN0b3IocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU2FmZVByb21pc2UocHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yRm4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZVxyXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbmV3IEVycihlcnJvckZuKGUpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBzdGF0aWMgZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZm4oLi4uYXJncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoZXJyb3JGbiA/IGVycm9yRm4oZXJyb3IpIDogZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSkoKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0KGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZVdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZihyZXMudmFsdWUpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzID0geWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKG5ld1Jlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRlZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNPaygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoeWllbGQgZihyZXMuZXJyb3IpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRBc3luYyA/IG5ld1ZhbHVlLl9wcm9taXNlIDogbmV3VmFsdWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLm1hdGNoKG9rLCBfZXJyKSk7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMudW53cmFwT3IodCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gOS4wLjAuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiB1c2UgYHNhZmVUcnlgIHdpdGhvdXQgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogc2FmZVRyeShhc3luYyBmdW5jdGlvbiogKCkge1xyXG4gICAgICogICBjb25zdCBva1ZhbHVlID0geWllbGQqIHlvdXJSZXN1bHRcclxuICAgICAqIH0pXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEVtdWxhdGVzIFJ1c3QncyBgP2Agb3BlcmF0b3IgaW4gYHNhZmVUcnlgJ3MgYm9keS4gU2VlIGFsc28gYHNhZmVUcnlgLlxyXG4gICAgICovXHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHNhZmVVbndyYXBfMSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5zYWZlVW53cmFwKCkpKSkpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBNYWtlcyBSZXN1bHRBc3luYyBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8UmVzdWx0PlxyXG4gICAgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZXJyQXN5bmMocmVzdWx0LmVycm9yKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb2tBc3luYyA9ICh2YWx1ZSkgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgT2sodmFsdWUpKSk7XHJcbmNvbnN0IGVyckFzeW5jID0gKGVycikgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgRXJyKGVycikpKTtcclxuY29uc3QgZnJvbVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZTtcclxuY29uc3QgZnJvbVNhZmVQcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlO1xyXG5jb25zdCBmcm9tQXN5bmNUaHJvd2FibGUgPSBSZXN1bHRBc3luYy5mcm9tVGhyb3dhYmxlO1xuXG4vKipcclxuICogU2hvcnQgY2lyY3VpdHMgb24gdGhlIEZJUlNUIEVyciB2YWx1ZSB0aGF0IHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0ID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFjYy5tYXAoKGxpc3QpID0+IGxpc3QucHVzaChyZXN1bHQudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG4vKiBUaGlzIGlzIHRoZSB0eXBlc2FmZSB2ZXJzaW9uIG9mIFByb21pc2UuYWxsXHJcbiAqXHJcbiAqIFRha2VzIGEgbGlzdCBvZiBSZXN1bHRBc3luYzxULCBFPiBhbmQgc3VjY2VzcyBpZiBhbGwgaW5uZXIgcmVzdWx0cyBhcmUgT2sgdmFsdWVzXHJcbiAqIG9yIGZhaWxzIGlmIG9uZSAob3IgbW9yZSkgb2YgdGhlIGlubmVyIHJlc3VsdHMgYXJlIEVyciB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3QgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdCk7XHJcbi8qKlxyXG4gKiBHaXZlIGEgbGlzdCBvZiBhbGwgdGhlIGVycm9ycyB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjLmVycm9yLnB1c2gocmVzdWx0LmVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIoW3Jlc3VsdC5lcnJvcl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNPaygpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjLnZhbHVlLnB1c2gocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gbm90aGluZyB3aGVuIHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzRXJyKClcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcclxudmFyIFJlc3VsdDtcclxuKGZ1bmN0aW9uIChSZXN1bHQpIHtcclxuICAgIC8qKlxyXG4gICAgICogV3JhcHMgYSBmdW5jdGlvbiB3aXRoIGEgdHJ5IGNhdGNoLCBjcmVhdGluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lXHJcbiAgICAgKiBhcmd1bWVudHMgYnV0IHJldHVybmluZyBgT2tgIGlmIHN1Y2Nlc3NmdWwsIGBFcnJgIGlmIHRoZSBmdW5jdGlvbiB0aHJvd3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gd3JhcCB3aXRoIG9rIG9uIHN1Y2Nlc3Mgb3IgZXJyIG9uIGZhaWx1cmVcclxuICAgICAqIEBwYXJhbSBlcnJvckZuIHdoZW4gYW4gZXJyb3IgaXMgdGhyb3duLCB0aGlzIHdpbGwgd3JhcCB0aGUgZXJyb3IgcmVzdWx0IGlmIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBmdW5jdGlvbiBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyKGVycm9yRm4gPyBlcnJvckZuKGUpIDogZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmZyb21UaHJvd2FibGUgPSBmcm9tVGhyb3dhYmxlO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZShyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0KHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmUgPSBjb21iaW5lO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZVdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZVdpdGhBbGxFcnJvcnMgPSBjb21iaW5lV2l0aEFsbEVycm9ycztcclxufSkoUmVzdWx0IHx8IChSZXN1bHQgPSB7fSkpO1xyXG5jb25zdCBvayA9ICh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKTtcclxuZnVuY3Rpb24gZXJyKGVycikge1xyXG4gICAgcmV0dXJuIG5ldyBFcnIoZXJyKTtcclxufVxyXG5mdW5jdGlvbiBzYWZlVHJ5KGJvZHkpIHtcclxuICAgIGNvbnN0IG4gPSBib2R5KCkubmV4dCgpO1xyXG4gICAgaWYgKG4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuLnRoZW4oKHIpID0+IHIudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuLnZhbHVlO1xyXG59XHJcbmNsYXNzIE9rIHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBvayhmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcEVycihfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKF92YWx1ZSkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGYodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRlZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFzeW5jQW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKCgpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNNYXAoZikge1xyXG4gICAgICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB1bndyYXBPcihfdikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS15aWVsZCAqL1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBFcnJgIG9uIGFuIE9rJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgcmVxdWlyZS15aWVsZFxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVyciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBlcnIoZih0aGlzLmVycm9yKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jQW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jTWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3Iodikge1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgbWF0Y2goX29rLCBlcnIpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB5aWVsZCBlcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvIG5vdCB1c2UgdGhpcyBnZW5lcmF0b3Igb3V0IG9mIGBzYWZlVHJ5YCcpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwYCBvbiBhbiBFcnInLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgeWllbGQgc2VsZjtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufVxyXG5jb25zdCBmcm9tVGhyb3dhYmxlID0gUmVzdWx0LmZyb21UaHJvd2FibGU7XHJcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBFcnIsIE9rLCBSZXN1bHQsIFJlc3VsdEFzeW5jLCBlcnIsIGVyckFzeW5jLCBmcm9tQXN5bmNUaHJvd2FibGUsIGZyb21Qcm9taXNlLCBmcm9tU2FmZVByb21pc2UsIGZyb21UaHJvd2FibGUsIG9rLCBva0FzeW5jLCBzYWZlVHJ5IH07XG4iLCAiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIn4vZXJyb3IvYmFzZS1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV29ya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige31cbiIsICJpbXBvcnQgeyBXb3JrZXJFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dvcmtlci93b3JrZXItZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmtlclVuZGVmaW5lZFBhcmFtZXRlckVycm9yIGV4dGVuZHMgV29ya2VyRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gXCJQYXJhbWV0ZXIgbXVzdCBiZSBkZWZpbmVkXCI7XG59XG4iLCAiaW1wb3J0IHsgZXJyQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Nvbm5lY3Rpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IFNlcnZlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivc2VydmVyLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZyB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItY29uZmlnLnRzXCI7XG5cbi8qKlxuICogRW5zdXJlIGFuIGVycm9yIG1lc3NhZ2UgaXMgdHJhbnNmb3JtZWQgaW4gYW4gRXJyb3Igb2JqZWN0XG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5zdXJlRXJyb3IgPSAodmFsdWU6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsdWU7XG5cbiAgbGV0IHN0cmluZ2lmaWVkID0gXCJbVW5hYmxlIHRvIHN0cmluZ2lmeSB0aGUgdGhyb3duIHZhbHVlXVwiO1xuICB0cnkge1xuICAgIHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcihzdHJpbmdpZmllZCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIEx1ZmkncyBjb25maWcgZnJvbSBpdHMgQVBJXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZmV0Y2hTZXJ2ZXJDb25maWcgPSAoXG4gIGluc3RhbmNlVXJsOiBVUkwsXG4pOiBSZXN1bHRBc3luYzxTZXJ2ZXJDb25maWcsIEVycm9yPiA9PiB7XG4gIGNvbnN0IG9yaWdpbk1hdGNoZXMgPSBpbnN0YW5jZVVybC5ocmVmLm1hdGNoKFxuICAgIC8oLio/KVxcLz8oPzpcXC9bZHJdezF9XFwvfGxvZ2luXFwvP3xmaWxlc1xcLz8pLyxcbiAgKTtcblxuICBjb25zdCB1cmxPcmlnaW4gPSBvcmlnaW5NYXRjaGVzICYmIG9yaWdpbk1hdGNoZXNbMV1cbiAgICA/IG9yaWdpbk1hdGNoZXNbMV1cbiAgICA6IGluc3RhbmNlVXJsLm9yaWdpbjtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgZmV0Y2godXJsT3JpZ2luICsgXCIvYWJvdXQvY29uZmlnXCIpLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDb25uZWN0aW9uRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKS5hbmRUaGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICByZXNwb25zZS5qc29uKCksXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgICBuZXcgU2VydmVyRXJyb3IodW5kZWZpbmVkLCB7IGNvbnRleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEZW5vUnVudGltZSA9ICgpOiBib29sZWFuID0+IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgY29uc3QgaXNTZWN1cmVDb250ZXh0ID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpIHx8IGdsb2JhbFRoaXMuaXNTZWN1cmVDb250ZXh0IHx8XG4gICAgZ2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbn07XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJVcmwgPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBVUkwgPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpXG4gICAgPyBuZXcgVVJMKGAuL3dvcmtlci8ke3JlbGF0aXZlUGF0aH0udHNgLCBuZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLmhyZWYpXG4gICAgOiBuZXcgVVJMKFxuICAgICAgaW1wb3J0Lm1ldGEucmVzb2x2ZShcbiAgICAgICAgYC4vJHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggIT09IFwiZW5jcnlwdFwiID8gYHdvcmtlci8ke3JlbGF0aXZlUGF0aH1gIDogcmVsYXRpdmVQYXRoXG4gICAgICAgIH0uanNgLFxuICAgICAgKSxcbiAgICApO1xufTtcbiIsICJpbXBvcnQgeyBaaXBDb21wcmVzc2lvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvemlwL3ppcC1jb21wcmVzc2lvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgemlwIH0gZnJvbSBcImZmbGF0ZVwiO1xuaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IFdvcmtlclVuZGVmaW5lZFBhcmFtZXRlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci11bmRlZmluZWQtcGFyYW1ldGVyLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gXCJ+L3V0aWxzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgeyBFVkVOVCB9IGZyb20gXCJ+L2VudW0vZXZlbnQudHNcIjtcblxuZGVjbGFyZSBjb25zdCBzZWxmOiBXb3JrZXI7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgY29tcHJlc3MoZXZlbnQuZGF0YSkubWFwKChieXRlcykgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuQVJDSElWRV9DUkVBVEVELCBidWZmZXI6IGJ5dGVzLmJ1ZmZlciB9LCBbXG4gICAgICBieXRlcy5idWZmZXIsXG4gICAgXSk7XG4gIH0pLm1hcEVycigoZXJyb3IpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0pO1xuICB9KTtcbn07XG5cbmNvbnN0IGNvbXByZXNzID0gKFxuICB3b3JrZXJNZXNzYWdlOiBXb3JrZXJBY3Rpb25NZXNzYWdlLFxuKTogUmVzdWx0QXN5bmM8VWludDhBcnJheSwgRXJyb3I+ID0+IHtcbiAgY29uc3QgeyBhcmNoaXZlIH0gPSB3b3JrZXJNZXNzYWdlLmFyZ3M7XG5cbiAgaWYgKGFyY2hpdmUpIHtcbiAgICBjb25zdCBwcm9taXNlWmlwID0gKCk6IFByb21pc2U8VWludDhBcnJheT4gPT5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGFyY2hpdmUuZW50cmllcykge1xuICAgICAgICAgIHppcChhcmNoaXZlLmVudHJpZXMsIChlcnJvciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBXb3JrZXJVbmRlZmluZWRQYXJhbWV0ZXJFcnJvcihcbiAgICAgICAgICAgICAgXCJhcmNoaXZlLmVudHJpZXMgbXVzdCBiZSBkZWZpbmVkXCIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgIHByb21pc2VaaXAoKSxcbiAgICAgIChlcnJvcikgPT4gZXJyb3IsXG4gICAgKS5hbmRUaGVuKChieXRlcykgPT4gb2tBc3luYyhieXRlcykpLm9yRWxzZSgoZXJyb3IpID0+XG4gICAgICBlcnJBc3luYyhcbiAgICAgICAgbmV3IFppcENvbXByZXNzaW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgICApXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICBuZXcgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IoXCJhcmNoaXZlIG11c3QgYmUgZGVmaW5lZFwiKSxcbiAgICApO1xuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFVTyxJQUFNLFlBQU4sY0FBd0IsTUFBTTtBQUFBLEVBR25DLFlBQ0UsU0FDQSxVQUFpRCxDQUFDLEdBQ2xEO0FBQ0EsVUFBTSxFQUFFLE9BQU8sUUFBUSxJQUFJO0FBRTNCLFVBQU0s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LFVBQU1BO0FBRU4sV0FBT0E7QUFBQSxFQUNYO0FBQ0o7QUFDQSxJQUFNLGdCQUFnQixPQUFPOzs7QUMzY3RCLElBQU0sY0FBTixjQUEwQixVQUFVO0FBQUM7OztBQ0FyQyxJQUFNLGdDQUFOLGNBQTRDLFlBQVk7QUFBQSxFQUF4RDtBQUFBO0FBQ0wsd0JBQVMsV0FBVTtBQUFBO0FBQ3JCOzs7QUNPTyxJQUFNLGNBQWMsQ0FBQyxVQUEwQjtBQUNwRCxNQUFJLGlCQUFpQixNQUFPLFFBQU87QUFFbkMsTUFBSSxjQUFjO0FBQ2xCLE1BQUk7QUFDRixrQkFBYyxLQUFLLFVBQVUsS0FBSztBQUFBLEVBQ3BDLFNBQVMsUUFBUTtBQUFBLEVBRWpCO0FBRUEsU0FBTyxJQUFJLE1BQU0sV0FBVztBQUM5Qjs7O0FDWkEsS0FBSyxZQUFZLENBQUMsVUFBd0I7QUFDeEMsV0FBUyxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtBQUNsQyxTQUFLLFlBQVksRUFBRSxnREFBOEIsUUFBUSxNQUFNLE9BQU8sR0FBRztBQUFBLE1BQ3ZFLE1BQU07QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNILENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVTtBQUNuQixTQUFLLFlBQVksRUFBRSxrREFBK0IsTUFBTSxDQUFDO0FBQUEsRUFDM0QsQ0FBQztBQUNIO0FBRUEsSUFBTSxXQUFXLENBQ2Ysa0JBQ21DO0FBQ25DLFFBQU0sRUFBRSxRQUFRLElBQUksY0FBYztBQUVsQyxNQUFJLFNBQVM7QUFDWCxVQUFNLGFBQWEsTUFDakIsSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQy9CLFVBQUksUUFBUSxTQUFTO0FBQ25CLFlBQUksUUFBUSxTQUFTLENBQUMsT0FBTyxTQUFTO0FBQ3BDLGNBQUksTUFBTyxRQUFPLEtBQUs7QUFFdkIsa0JBQVEsSUFBSTtBQUFBLFFBQ2QsQ0FBQztBQUFBLE1BQ0gsT0FBTztBQUNMO0FBQUEsVUFDRSxJQUFJO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNILFdBQU8sWUFBWTtBQUFBLE1BQ2pCLFdBQVc7QUFBQSxNQUNYLENBQUMsVUFBVTtBQUFBLElBQ2IsRUFBRSxRQUFRLENBQUMsVUFBVSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFBTyxDQUFDLFVBQzNDO0FBQUEsUUFDRSxJQUFJLG9CQUFvQixRQUFXLEVBQUUsT0FBTyxZQUFZLEtBQUssRUFBRSxDQUFDO0FBQUEsTUFDbEU7QUFBQSxJQUNGO0FBQUEsRUFDRixPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsSUFBSSw4QkFBOEIseUJBQXlCO0FBQUEsSUFDN0Q7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImVyciIsICJfYSIsICJfYiIsICJpIiwgInRkIiwgImVyciIsICJkYXQiLCAiZmwiLCAiaSIsICJfYSIsICJ2IiwgIm9rIiwgIl9hIiwgImVyciIsICJSZXN1bHQiLCAiZnJvbVRocm93YWJsZSIsICJvayIsICJlcnIiLCAic2VsZiJdCn0K diff --git a/themes/default/public/js/minified/worker/decompress.js b/themes/default/public/js/minified/worker/decompress.js deleted file mode 100644 index 9607985..0000000 --- a/themes/default/public/js/minified/worker/decompress.js +++ /dev/null @@ -1,1161 +0,0 @@ -var __defProp = Object.defineProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/zip/zip-error.ts -var ZipError = class extends BaseError { -}; - -// src/error/zip/zip-decompression-error.ts -var ZipDecompressionError = class extends ZipError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to decompress the data"); - } -}; - -// node_modules/.deno/fflate@0.8.2/node_modules/fflate/esm/browser.js -var ch2 = {}; -var wk = function(c, id, msg, transfer, cb) { - var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([ - c + ';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})' - ], { type: "text/javascript" })))); - w.onmessage = function(e) { - var d = e.data, ed = d.$e$; - if (ed) { - var err3 = new Error(ed[0]); - err3["code"] = ed[1]; - err3.stack = ed[2]; - cb(err3, null); - } else - cb(null, d); - }; - w.postMessage(msg, transfer); - return w; -}; -var u8 = Uint8Array; -var u16 = Uint16Array; -var i32 = Int32Array; -var fleb = new u8([ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 0, - /* unused */ - 0, - 0, - /* impossible */ - 0 -]); -var fdeb = new u8([ - 0, - 0, - 0, - 0, - 1, - 1, - 2, - 2, - 3, - 3, - 4, - 4, - 5, - 5, - 6, - 6, - 7, - 7, - 8, - 8, - 9, - 9, - 10, - 10, - 11, - 11, - 12, - 12, - 13, - 13, - /* unused */ - 0, - 0 -]); -var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); -var freb = function(eb, start) { - var b = new u16(31); - for (var i = 0; i < 31; ++i) { - b[i] = start += 1 << eb[i - 1]; - } - var r = new i32(b[30]); - for (var i = 1; i < 30; ++i) { - for (var j = b[i]; j < b[i + 1]; ++j) { - r[j] = j - b[i] << 5 | i; - } - } - return { b, r }; -}; -var _a = freb(fleb, 2); -var fl = _a.b; -var revfl = _a.r; -fl[28] = 258, revfl[258] = 28; -var _b = freb(fdeb, 0); -var fd = _b.b; -var revfd = _b.r; -var rev = new u16(32768); -for (i = 0; i < 32768; ++i) { - x = (i & 43690) >> 1 | (i & 21845) << 1; - x = (x & 52428) >> 2 | (x & 13107) << 2; - x = (x & 61680) >> 4 | (x & 3855) << 4; - rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1; -} -var x; -var i; -var hMap = function(cd, mb, r) { - var s = cd.length; - var i = 0; - var l = new u16(mb); - for (; i < s; ++i) { - if (cd[i]) - ++l[cd[i] - 1]; - } - var le = new u16(mb); - for (i = 1; i < mb; ++i) { - le[i] = le[i - 1] + l[i - 1] << 1; - } - var co; - if (r) { - co = new u16(1 << mb); - var rvb = 15 - mb; - for (i = 0; i < s; ++i) { - if (cd[i]) { - var sv = i << 4 | cd[i]; - var r_1 = mb - cd[i]; - var v = le[cd[i] - 1]++ << r_1; - for (var m = v | (1 << r_1) - 1; v <= m; ++v) { - co[rev[v] >> rvb] = sv; - } - } - } - } else { - co = new u16(s); - for (i = 0; i < s; ++i) { - if (cd[i]) { - co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i]; - } - } - } - return co; -}; -var flt = new u8(288); -for (i = 0; i < 144; ++i) - flt[i] = 8; -var i; -for (i = 144; i < 256; ++i) - flt[i] = 9; -var i; -for (i = 256; i < 280; ++i) - flt[i] = 7; -var i; -for (i = 280; i < 288; ++i) - flt[i] = 8; -var i; -var fdt = new u8(32); -for (i = 0; i < 32; ++i) - fdt[i] = 5; -var i; -var flrm = /* @__PURE__ */ hMap(flt, 9, 1); -var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1); -var max = function(a) { - var m = a[0]; - for (var i = 1; i < a.length; ++i) { - if (a[i] > m) - m = a[i]; - } - return m; -}; -var bits = function(d, p, m) { - var o = p / 8 | 0; - return (d[o] | d[o + 1] << 8) >> (p & 7) & m; -}; -var bits16 = function(d, p) { - var o = p / 8 | 0; - return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7); -}; -var shft = function(p) { - return (p + 7) / 8 | 0; -}; -var slc = function(v, s, e) { - if (s == null || s < 0) - s = 0; - if (e == null || e > v.length) - e = v.length; - return new u8(v.subarray(s, e)); -}; -var ec = [ - "unexpected EOF", - "invalid block type", - "invalid length/literal", - "invalid distance", - "stream finished", - "no stream handler", - , - "no callback", - "invalid UTF-8 data", - "extra field too long", - "date not in range 1980-2099", - "filename too long", - "stream finishing", - "invalid zip data" - // determined by unknown compression method -]; -var err = function(ind, msg, nt) { - var e = new Error(msg || ec[ind]); - e.code = ind; - if (Error.captureStackTrace) - Error.captureStackTrace(e, err); - if (!nt) - throw e; - return e; -}; -var inflt = function(dat, st, buf, dict) { - var sl = dat.length, dl = dict ? dict.length : 0; - if (!sl || st.f && !st.l) - return buf || new u8(0); - var noBuf = !buf; - var resize = noBuf || st.i != 2; - var noSt = st.i; - if (noBuf) - buf = new u8(sl * 3); - var cbuf = function(l2) { - var bl = buf.length; - if (l2 > bl) { - var nbuf = new u8(Math.max(bl * 2, l2)); - nbuf.set(buf); - buf = nbuf; - } - }; - var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n; - var tbts = sl * 8; - do { - if (!lm) { - final = bits(dat, pos, 1); - var type = bits(dat, pos + 1, 3); - pos += 3; - if (!type) { - var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l; - if (t > sl) { - if (noSt) - err(0); - break; - } - if (resize) - cbuf(bt + l); - buf.set(dat.subarray(s, t), bt); - st.b = bt += l, st.p = pos = t * 8, st.f = final; - continue; - } else if (type == 1) - lm = flrm, dm = fdrm, lbt = 9, dbt = 5; - else if (type == 2) { - var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4; - var tl = hLit + bits(dat, pos + 5, 31) + 1; - pos += 14; - var ldt = new u8(tl); - var clt = new u8(19); - for (var i = 0; i < hcLen; ++i) { - clt[clim[i]] = bits(dat, pos + i * 3, 7); - } - pos += hcLen * 3; - var clb = max(clt), clbmsk = (1 << clb) - 1; - var clm = hMap(clt, clb, 1); - for (var i = 0; i < tl; ) { - var r = clm[bits(dat, pos, clbmsk)]; - pos += r & 15; - var s = r >> 4; - if (s < 16) { - ldt[i++] = s; - } else { - var c = 0, n = 0; - if (s == 16) - n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1]; - else if (s == 17) - n = 3 + bits(dat, pos, 7), pos += 3; - else if (s == 18) - n = 11 + bits(dat, pos, 127), pos += 7; - while (n--) - ldt[i++] = c; - } - } - var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit); - lbt = max(lt); - dbt = max(dt); - lm = hMap(lt, lbt, 1); - dm = hMap(dt, dbt, 1); - } else - err(1); - if (pos > tbts) { - if (noSt) - err(0); - break; - } - } - if (resize) - cbuf(bt + 131072); - var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1; - var lpos = pos; - for (; ; lpos = pos) { - var c = lm[bits16(dat, pos) & lms], sym = c >> 4; - pos += c & 15; - if (pos > tbts) { - if (noSt) - err(0); - break; - } - if (!c) - err(2); - if (sym < 256) - buf[bt++] = sym; - else if (sym == 256) { - lpos = pos, lm = null; - break; - } else { - var add = sym - 254; - if (sym > 264) { - var i = sym - 257, b = fleb[i]; - add = bits(dat, pos, (1 << b) - 1) + fl[i]; - pos += b; - } - var d = dm[bits16(dat, pos) & dms], dsym = d >> 4; - if (!d) - err(3); - pos += d & 15; - var dt = fd[dsym]; - if (dsym > 3) { - var b = fdeb[dsym]; - dt += bits16(dat, pos) & (1 << b) - 1, pos += b; - } - if (pos > tbts) { - if (noSt) - err(0); - break; - } - if (resize) - cbuf(bt + 131072); - var end = bt + add; - if (bt < dt) { - var shift = dl - dt, dend = Math.min(dt, end); - if (shift + bt < 0) - err(3); - for (; bt < dend; ++bt) - buf[bt] = dict[shift + bt]; - } - for (; bt < end; ++bt) - buf[bt] = buf[bt - dt]; - } - } - st.l = lm, st.p = lpos, st.b = bt, st.f = final; - if (lm) - final = 1, st.m = lbt, st.d = dm, st.n = dbt; - } while (!final); - return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt); -}; -var et = /* @__PURE__ */ new u8(0); -var mrg = function(a, b) { - var o = {}; - for (var k in a) - o[k] = a[k]; - for (var k in b) - o[k] = b[k]; - return o; -}; -var wcln = function(fn, fnStr, td2) { - var dt = fn(); - var st = fn.toString(); - var ks = st.slice(st.indexOf("[") + 1, st.lastIndexOf("]")).replace(/\s+/g, "").split(","); - for (var i = 0; i < dt.length; ++i) { - var v = dt[i], k = ks[i]; - if (typeof v == "function") { - fnStr += ";" + k + "="; - var st_1 = v.toString(); - if (v.prototype) { - if (st_1.indexOf("[native code]") != -1) { - var spInd = st_1.indexOf(" ", 8) + 1; - fnStr += st_1.slice(spInd, st_1.indexOf("(", spInd)); - } else { - fnStr += st_1; - for (var t in v.prototype) - fnStr += ";" + k + ".prototype." + t + "=" + v.prototype[t].toString(); - } - } else - fnStr += st_1; - } else - td2[k] = v; - } - return fnStr; -}; -var ch = []; -var cbfs = function(v) { - var tl = []; - for (var k in v) { - if (v[k].buffer) { - tl.push((v[k] = new v[k].constructor(v[k])).buffer); - } - } - return tl; -}; -var wrkr = function(fns, init, id, cb) { - if (!ch[id]) { - var fnStr = "", td_1 = {}, m = fns.length - 1; - for (var i = 0; i < m; ++i) - fnStr = wcln(fns[i], fnStr, td_1); - ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 }; - } - var td2 = mrg({}, ch[id].e); - return wk(ch[id].c + ";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=" + init.toString() + "}", id, td2, cbfs(td2), cb); -}; -var bInflt = function() { - return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; -}; -var pbf = function(msg) { - return postMessage(msg, [msg.buffer]); -}; -var gopt = function(o) { - return o && { - out: o.size && new u8(o.size), - dictionary: o.dictionary - }; -}; -var cbify = function(dat, opts, fns, init, id, cb) { - var w = wrkr(fns, init, id, function(err3, dat2) { - w.terminate(); - cb(err3, dat2); - }); - w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []); - return function() { - w.terminate(); - }; -}; -var b2 = function(d, b) { - return d[b] | d[b + 1] << 8; -}; -var b4 = function(d, b) { - return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; -}; -var b8 = function(d, b) { - return b4(d, b) + b4(d, b + 4) * 4294967296; -}; -function inflate(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bInflt - ], function(ev) { - return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); - }, 1, cb); -} -function inflateSync(data, opts) { - return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary); -} -var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder(); -var tds = 0; -try { - td.decode(et, { stream: true }); - tds = 1; -} catch (e) { -} -var dutf8 = function(d) { - for (var r = "", i = 0; ; ) { - var c = d[i++]; - var eb = (c > 127) + (c > 223) + (c > 239); - if (i + eb > d.length) - return { s: r, r: slc(d, i - 1) }; - if (!eb) - r += String.fromCharCode(c); - else if (eb == 3) { - c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023); - } else if (eb & 1) - r += String.fromCharCode((c & 31) << 6 | d[i++] & 63); - else - r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63); - } -}; -function strFromU8(dat, latin1) { - if (latin1) { - var r = ""; - for (var i = 0; i < dat.length; i += 16384) - r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384)); - return r; - } else if (td) { - return td.decode(dat); - } else { - var _a2 = dutf8(dat), s = _a2.s, r = _a2.r; - if (r.length) - err(8); - return s; - } -} -var slzh = function(d, b) { - return b + 30 + b2(d, b + 26) + b2(d, b + 28); -}; -var zh = function(d, b, z) { - var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20); - var _a2 = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a2[0], su = _a2[1], off = _a2[2]; - return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off]; -}; -var z64e = function(d, b) { - for (; b2(d, b) != 1; b += 4 + b2(d, b + 2)) - ; - return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)]; -}; -var mt = typeof queueMicrotask == "function" ? queueMicrotask : typeof setTimeout == "function" ? setTimeout : function(fn) { - fn(); -}; -function unzip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - var term = []; - var tAll = function() { - for (var i2 = 0; i2 < term.length; ++i2) - term[i2](); - }; - var files = {}; - var cbd = function(a, b) { - mt(function() { - cb(a, b); - }); - }; - mt(function() { - cbd = cb; - }); - var e = data.length - 22; - for (; b4(data, e) != 101010256; --e) { - if (!e || data.length - e > 65558) { - cbd(err(13, 0, 1), null); - return tAll; - } - } - ; - var lft = b2(data, e + 8); - if (lft) { - var c = lft; - var o = b4(data, e + 16); - var z = o == 4294967295 || c == 65535; - if (z) { - var ze = b4(data, e - 12); - z = b4(data, ze) == 101075792; - if (z) { - c = lft = b4(data, ze + 32); - o = b4(data, ze + 48); - } - } - var fltr = opts && opts.filter; - var _loop_3 = function(i2) { - var _a2 = zh(data, o, z), c_1 = _a2[0], sc = _a2[1], su = _a2[2], fn = _a2[3], no = _a2[4], off = _a2[5], b = slzh(data, off); - o = no; - var cbl = function(e2, d) { - if (e2) { - tAll(); - cbd(e2, null); - } else { - if (d) - files[fn] = d; - if (!--lft) - cbd(null, files); - } - }; - if (!fltr || fltr({ - name: fn, - size: sc, - originalSize: su, - compression: c_1 - })) { - if (!c_1) - cbl(null, slc(data, b, b + sc)); - else if (c_1 == 8) { - var infl = data.subarray(b, b + sc); - if (su < 524288 || sc > 0.8 * su) { - try { - cbl(null, inflateSync(infl, { out: new u8(su) })); - } catch (e2) { - cbl(e2, null); - } - } else - term.push(inflate(infl, { size: su }, cbl)); - } else - cbl(err(14, "unknown compression type " + c_1, 1), null); - } else - cbl(null, null); - }; - for (var i = 0; i < c; ++i) { - _loop_3(i); - } - } else - cbd(null, {}); - return tAll; -} - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a2() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err3) => new ResultAsync(Promise.resolve(new Err(err3))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err2(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err2([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err2(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err2(err3) { - return new Err(err3); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err2(this.error); - } - mapErr(f) { - return err2(f(this.error)); - } - andThrough(_f) { - return err2(this.error); - } - andTee(_f) { - return err2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err2(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err3) { - return err3(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err2(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/worker/worker-error.ts -var WorkerError = class extends BaseError { -}; - -// src/error/worker/worker-undefined-parameter-error.ts -var WorkerUndefinedParameterError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "Parameter must be defined"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// src/worker/decompress.ts -self.onmessage = (event) => { - decompress(event.data).map(() => { - self.postMessage({ event: "ARCHIVE_DECOMPRESSED" /* ARCHIVE_DECOMPRESSED */ }); - }).mapErr((error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; -var decompress = (workerMessage) => { - const { archive } = workerMessage.args; - if (archive !== void 0) { - const unzipPromise = async () => { - if (archive.file) { - const fileBytes = await archive.file.bytes(); - return new Promise((resolve, reject) => { - unzip(fileBytes, (error, files) => { - if (error) reject(error); - resolve(files); - }); - }); - } else { - return Promise.reject( - new WorkerUndefinedParameterError("archive.file must be defined") - ); - } - }; - return ResultAsync.fromPromise(unzipPromise(), (error) => error).andThen((files) => { - try { - for (const path in files) { - self.postMessage({ - event: "ARCHIVE_RETRIEVED_FILE" /* ARCHIVE_RETRIEVED_FILE */, - file: { buffer: files[path].buffer, path } - }, [files[path].buffer]); - } - return okAsync(void 0); - } catch (error) { - return errAsync(error); - } - }).orElse( - (error) => errAsync( - new ZipDecompressionError(void 0, { cause: ensureError(error) }) - ) - ); - } else { - return errAsync( - new WorkerUndefinedParameterError("archive must be defined") - ); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2Vycm9yL2Jhc2UtZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3ppcC96aXAtZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3ppcC96aXAtZGVjb21wcmVzc2lvbi1lcnJvci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vZmZsYXRlQDAuOC4yL25vZGVfbW9kdWxlcy9mZmxhdGUvZXNtL2Jyb3dzZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL25ldmVydGhyb3dAOC4xLjEvbm9kZV9tb2R1bGVzL25ldmVydGhyb3cvZGlzdC9pbmRleC5lcy5qcyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50cyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci11bmRlZmluZWQtcGFyYW1ldGVyLWVycm9yLnRzIiwgIi4uLy4uL3NyYy91dGlscy50cyIsICIuLi8uLi9zcmMvd29ya2VyL2RlY29tcHJlc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInR5cGUgSnNvbmFibGUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgcmVhZG9ubHkgSnNvbmFibGVbXVxuICB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogSnNvbmFibGUgfVxuICB8IHsgdG9KU09OKCk6IEpzb25hYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb250ZXh0PzogSnNvbmFibGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGNhdXNlPzogRXJyb3I7IGNvbnRleHQ/OiBKc29uYWJsZSB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHsgY2F1c2UsIGNvbnRleHQgfSA9IG9wdGlvbnM7XG5cbiAgICBzdXBlcihtZXNzYWdlLCB7IGNhdXNlIH0pO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwifi9lcnJvci9iYXNlLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBaaXBFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7fVxuIiwgImltcG9ydCB7IFppcEVycm9yIH0gZnJvbSBcIn4vZXJyb3IvemlwL3ppcC1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgWmlwRGVjb21wcmVzc2lvbkVycm9yIGV4dGVuZHMgWmlwRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBkZWNvbXByZXNzIHRoZSBkYXRhXCI7XG59XG4iLCAiLy8gREVGTEFURSBpcyBhIGNvbXBsZXggZm9ybWF0OyB0byByZWFkIHRoaXMgY29kZSwgeW91IHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgUkZDIGZpcnN0OlxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTFcbi8vIFlvdSBtYXkgYWxzbyB3aXNoIHRvIHRha2UgYSBsb29rIGF0IHRoZSBndWlkZSBJIG1hZGUgYWJvdXQgdGhpcyBwcm9ncmFtOlxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTAxYXJyb3d6LzI1M2YzMWViNWFiYzNkOTI3NWFiOTQzMDAzZmZlY2FkXG4vLyBTb21lIG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBzaW1pbGFyIHRvIHRoYXQgb2YgVVpJUC5qczpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b3BlYS9VWklQLmpzXG4vLyBIb3dldmVyLCB0aGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgY29kZWJhc2UgaGFzIGRpdmVyZ2VkIGZyb20gVVpJUC5qcyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSBhbmQgcmVkdWNlIGJ1bmRsZSBzaXplLlxuLy8gU29tZXRpbWVzIDAgd2lsbCBhcHBlYXIgd2hlcmUgLTEgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZS4gVGhpcyBpcyBiZWNhdXNlIHVzaW5nIGEgdWludFxuLy8gaXMgYmV0dGVyIGZvciBtZW1vcnkgaW4gbW9zdCBlbmdpbmVzIChJICp0aGluayopLlxudmFyIGNoMiA9IHt9O1xudmFyIHdrID0gKGZ1bmN0aW9uIChjLCBpZCwgbXNnLCB0cmFuc2ZlciwgY2IpIHtcbiAgICB2YXIgdyA9IG5ldyBXb3JrZXIoY2gyW2lkXSB8fCAoY2gyW2lkXSA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1xuICAgICAgICBjICsgJzthZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixmdW5jdGlvbihlKXtlPWUuZXJyb3I7cG9zdE1lc3NhZ2UoeyRlJDpbZS5tZXNzYWdlLGUuY29kZSxlLnN0YWNrXX0pfSknXG4gICAgXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KSkpKTtcbiAgICB3Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBkID0gZS5kYXRhLCBlZCA9IGQuJGUkO1xuICAgICAgICBpZiAoZWQpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoZWRbMF0pO1xuICAgICAgICAgICAgZXJyWydjb2RlJ10gPSBlZFsxXTtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IGVkWzJdO1xuICAgICAgICAgICAgY2IoZXJyLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjYihudWxsLCBkKTtcbiAgICB9O1xuICAgIHcucG9zdE1lc3NhZ2UobXNnLCB0cmFuc2Zlcik7XG4gICAgcmV0dXJuIHc7XG59KTtcblxuLy8gYWxpYXNlcyBmb3Igc2hvcnRlciBjb21wcmVzc2VkIGNvZGUgKG1vc3QgbWluaWZlcnMgZG9uJ3QgZG8gdGhpcylcbnZhciB1OCA9IFVpbnQ4QXJyYXksIHUxNiA9IFVpbnQxNkFycmF5LCBpMzIgPSBJbnQzMkFycmF5O1xuLy8gZml4ZWQgbGVuZ3RoIGV4dHJhIGJpdHNcbnZhciBmbGViID0gbmV3IHU4KFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCAvKiB1bnVzZWQgKi8gMCwgMCwgLyogaW1wb3NzaWJsZSAqLyAwXSk7XG4vLyBmaXhlZCBkaXN0YW5jZSBleHRyYSBiaXRzXG52YXIgZmRlYiA9IG5ldyB1OChbMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAvKiB1bnVzZWQgKi8gMCwgMF0pO1xuLy8gY29kZSBsZW5ndGggaW5kZXggbWFwXG52YXIgY2xpbSA9IG5ldyB1OChbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pO1xuLy8gZ2V0IGJhc2UsIHJldmVyc2UgaW5kZXggbWFwIGZyb20gZXh0cmEgYml0c1xudmFyIGZyZWIgPSBmdW5jdGlvbiAoZWIsIHN0YXJ0KSB7XG4gICAgdmFyIGIgPSBuZXcgdTE2KDMxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDMxOyArK2kpIHtcbiAgICAgICAgYltpXSA9IHN0YXJ0ICs9IDEgPDwgZWJbaSAtIDFdO1xuICAgIH1cbiAgICAvLyBudW1iZXJzIGhlcmUgYXJlIGF0IG1heCAxOCBiaXRzXG4gICAgdmFyIHIgPSBuZXcgaTMyKGJbMzBdKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDMwOyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGJbaV07IGogPCBiW2kgKyAxXTsgKytqKSB7XG4gICAgICAgICAgICByW2pdID0gKChqIC0gYltpXSkgPDwgNSkgfCBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGI6IGIsIHI6IHIgfTtcbn07XG52YXIgX2EgPSBmcmViKGZsZWIsIDIpLCBmbCA9IF9hLmIsIHJldmZsID0gX2Eucjtcbi8vIHdlIGNhbiBpZ25vcmUgdGhlIGZhY3QgdGhhdCB0aGUgb3RoZXIgbnVtYmVycyBhcmUgd3Jvbmc7IHRoZXkgbmV2ZXIgaGFwcGVuIGFueXdheVxuZmxbMjhdID0gMjU4LCByZXZmbFsyNThdID0gMjg7XG52YXIgX2IgPSBmcmViKGZkZWIsIDApLCBmZCA9IF9iLmIsIHJldmZkID0gX2Iucjtcbi8vIG1hcCBvZiB2YWx1ZSB0byByZXZlcnNlIChhc3N1bWluZyAxNiBiaXRzKVxudmFyIHJldiA9IG5ldyB1MTYoMzI3NjgpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAzMjc2ODsgKytpKSB7XG4gICAgLy8gcmV2ZXJzZSB0YWJsZSBhbGdvcml0aG0gZnJvbSBTT1xuICAgIHZhciB4ID0gKChpICYgMHhBQUFBKSA+PiAxKSB8ICgoaSAmIDB4NTU1NSkgPDwgMSk7XG4gICAgeCA9ICgoeCAmIDB4Q0NDQykgPj4gMikgfCAoKHggJiAweDMzMzMpIDw8IDIpO1xuICAgIHggPSAoKHggJiAweEYwRjApID4+IDQpIHwgKCh4ICYgMHgwRjBGKSA8PCA0KTtcbiAgICByZXZbaV0gPSAoKCh4ICYgMHhGRjAwKSA+PiA4KSB8ICgoeCAmIDB4MDBGRikgPDwgOCkpID4+IDE7XG59XG4vLyBjcmVhdGUgaHVmZm1hbiB0cmVlIGZyb20gdTggXCJtYXBcIjogaW5kZXggLT4gY29kZSBsZW5ndGggZm9yIGNvZGUgaW5kZXhcbi8vIG1iIChtYXggYml0cykgbXVzdCBiZSBhdCBtb3N0IDE1XG4vLyBUT0RPOiBvcHRpbWl6ZS9zcGxpdCB1cD9cbnZhciBoTWFwID0gKGZ1bmN0aW9uIChjZCwgbWIsIHIpIHtcbiAgICB2YXIgcyA9IGNkLmxlbmd0aDtcbiAgICAvLyBpbmRleFxuICAgIHZhciBpID0gMDtcbiAgICAvLyB1MTYgXCJtYXBcIjogaW5kZXggLT4gIyBvZiBjb2RlcyB3aXRoIGJpdCBsZW5ndGggPSBpbmRleFxuICAgIHZhciBsID0gbmV3IHUxNihtYik7XG4gICAgLy8gbGVuZ3RoIG9mIGNkIG11c3QgYmUgMjg4ICh0b3RhbCAjIG9mIGNvZGVzKVxuICAgIGZvciAoOyBpIDwgczsgKytpKSB7XG4gICAgICAgIGlmIChjZFtpXSlcbiAgICAgICAgICAgICsrbFtjZFtpXSAtIDFdO1xuICAgIH1cbiAgICAvLyB1MTYgXCJtYXBcIjogaW5kZXggLT4gbWluaW11bSBjb2RlIGZvciBiaXQgbGVuZ3RoID0gaW5kZXhcbiAgICB2YXIgbGUgPSBuZXcgdTE2KG1iKTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgbWI7ICsraSkge1xuICAgICAgICBsZVtpXSA9IChsZVtpIC0gMV0gKyBsW2kgLSAxXSkgPDwgMTtcbiAgICB9XG4gICAgdmFyIGNvO1xuICAgIGlmIChyKSB7XG4gICAgICAgIC8vIHUxNiBcIm1hcFwiOiBpbmRleCAtPiBudW1iZXIgb2YgYWN0dWFsIGJpdHMsIHN5bWJvbCBmb3IgY29kZVxuICAgICAgICBjbyA9IG5ldyB1MTYoMSA8PCBtYik7XG4gICAgICAgIC8vIGJpdHMgdG8gcmVtb3ZlIGZvciByZXZlcnNlclxuICAgICAgICB2YXIgcnZiID0gMTUgLSBtYjtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHM7ICsraSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIDAgbGVuZ3Roc1xuICAgICAgICAgICAgaWYgKGNkW2ldKSB7XG4gICAgICAgICAgICAgICAgLy8gbnVtIGVuY29kaW5nIGJvdGggc3ltYm9sIGFuZCBiaXRzIHJlYWRcbiAgICAgICAgICAgICAgICB2YXIgc3YgPSAoaSA8PCA0KSB8IGNkW2ldO1xuICAgICAgICAgICAgICAgIC8vIGZyZWUgYml0c1xuICAgICAgICAgICAgICAgIHZhciByXzEgPSBtYiAtIGNkW2ldO1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBsZVtjZFtpXSAtIDFdKysgPDwgcl8xO1xuICAgICAgICAgICAgICAgIC8vIG0gaXMgZW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IHYgfCAoKDEgPDwgcl8xKSAtIDEpOyB2IDw9IG07ICsrdikge1xuICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSAxNiBiaXQgdmFsdWUgc3RhcnRpbmcgd2l0aCB0aGUgY29kZSB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIGNvW3Jldlt2XSA+PiBydmJdID0gc3Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjbyA9IG5ldyB1MTYocyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjZFtpXSkge1xuICAgICAgICAgICAgICAgIGNvW2ldID0gcmV2W2xlW2NkW2ldIC0gMV0rK10gPj4gKDE1IC0gY2RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbztcbn0pO1xuLy8gZml4ZWQgbGVuZ3RoIHRyZWVcbnZhciBmbHQgPSBuZXcgdTgoMjg4KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMTQ0OyArK2kpXG4gICAgZmx0W2ldID0gODtcbmZvciAodmFyIGkgPSAxNDQ7IGkgPCAyNTY7ICsraSlcbiAgICBmbHRbaV0gPSA5O1xuZm9yICh2YXIgaSA9IDI1NjsgaSA8IDI4MDsgKytpKVxuICAgIGZsdFtpXSA9IDc7XG5mb3IgKHZhciBpID0gMjgwOyBpIDwgMjg4OyArK2kpXG4gICAgZmx0W2ldID0gODtcbi8vIGZpeGVkIGRpc3RhbmNlIHRyZWVcbnZhciBmZHQgPSBuZXcgdTgoMzIpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgKytpKVxuICAgIGZkdFtpXSA9IDU7XG4vLyBmaXhlZCBsZW5ndGggbWFwXG52YXIgZmxtID0gLyojX19QVVJFX18qLyBoTWFwKGZsdCwgOSwgMCksIGZscm0gPSAvKiNfX1BVUkVfXyovIGhNYXAoZmx0LCA5LCAxKTtcbi8vIGZpeGVkIGRpc3RhbmNlIG1hcFxudmFyIGZkbSA9IC8qI19fUFVSRV9fKi8gaE1hcChmZHQsIDUsIDApLCBmZHJtID0gLyojX19QVVJFX18qLyBoTWFwKGZkdCwgNSwgMSk7XG4vLyBmaW5kIG1heCBvZiBhcnJheVxudmFyIG1heCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIG0gPSBhWzBdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYVtpXSA+IG0pXG4gICAgICAgICAgICBtID0gYVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG07XG59O1xuLy8gcmVhZCBkLCBzdGFydGluZyBhdCBiaXQgcCBhbmQgbWFzayB3aXRoIG1cbnZhciBiaXRzID0gZnVuY3Rpb24gKGQsIHAsIG0pIHtcbiAgICB2YXIgbyA9IChwIC8gOCkgfCAwO1xuICAgIHJldHVybiAoKGRbb10gfCAoZFtvICsgMV0gPDwgOCkpID4+IChwICYgNykpICYgbTtcbn07XG4vLyByZWFkIGQsIHN0YXJ0aW5nIGF0IGJpdCBwIGNvbnRpbnVpbmcgZm9yIGF0IGxlYXN0IDE2IGJpdHNcbnZhciBiaXRzMTYgPSBmdW5jdGlvbiAoZCwgcCkge1xuICAgIHZhciBvID0gKHAgLyA4KSB8IDA7XG4gICAgcmV0dXJuICgoZFtvXSB8IChkW28gKyAxXSA8PCA4KSB8IChkW28gKyAyXSA8PCAxNikpID4+IChwICYgNykpO1xufTtcbi8vIGdldCBlbmQgb2YgYnl0ZVxudmFyIHNoZnQgPSBmdW5jdGlvbiAocCkgeyByZXR1cm4gKChwICsgNykgLyA4KSB8IDA7IH07XG4vLyB0eXBlZCBhcnJheSBzbGljZSAtIGFsbG93cyBnYXJiYWdlIGNvbGxlY3RvciB0byBmcmVlIG9yaWdpbmFsIHJlZmVyZW5jZSxcbi8vIHdoaWxlIGJlaW5nIG1vcmUgY29tcGF0aWJsZSB0aGFuIC5zbGljZVxudmFyIHNsYyA9IGZ1bmN0aW9uICh2LCBzLCBlKSB7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMClcbiAgICAgICAgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpXG4gICAgICAgIGUgPSB2Lmxlbmd0aDtcbiAgICAvLyBjYW4ndCB1c2UgLmNvbnN0cnVjdG9yIGluIGNhc2UgdXNlci1zdXBwbGllZFxuICAgIHJldHVybiBuZXcgdTgodi5zdWJhcnJheShzLCBlKSk7XG59O1xuLyoqXG4gKiBDb2RlcyBmb3IgZXJyb3JzIGdlbmVyYXRlZCB3aXRoaW4gdGhpcyBsaWJyYXJ5XG4gKi9cbmV4cG9ydCB2YXIgRmxhdGVFcnJvckNvZGUgPSB7XG4gICAgVW5leHBlY3RlZEVPRjogMCxcbiAgICBJbnZhbGlkQmxvY2tUeXBlOiAxLFxuICAgIEludmFsaWRMZW5ndGhMaXRlcmFsOiAyLFxuICAgIEludmFsaWREaXN0YW5jZTogMyxcbiAgICBTdHJlYW1GaW5pc2hlZDogNCxcbiAgICBOb1N0cmVhbUhhbmRsZXI6IDUsXG4gICAgSW52YWxpZEhlYWRlcjogNixcbiAgICBOb0NhbGxiYWNrOiA3LFxuICAgIEludmFsaWRVVEY4OiA4LFxuICAgIEV4dHJhRmllbGRUb29Mb25nOiA5LFxuICAgIEludmFsaWREYXRlOiAxMCxcbiAgICBGaWxlbmFtZVRvb0xvbmc6IDExLFxuICAgIFN0cmVhbUZpbmlzaGluZzogMTIsXG4gICAgSW52YWxpZFppcERhdGE6IDEzLFxuICAgIFVua25vd25Db21wcmVzc2lvbk1ldGhvZDogMTRcbn07XG4vLyBlcnJvciBjb2Rlc1xudmFyIGVjID0gW1xuICAgICd1bmV4cGVjdGVkIEVPRicsXG4gICAgJ2ludmFsaWQgYmxvY2sgdHlwZScsXG4gICAgJ2ludmFsaWQgbGVuZ3RoL2xpdGVyYWwnLFxuICAgICdpbnZhbGlkIGRpc3RhbmNlJyxcbiAgICAnc3RyZWFtIGZpbmlzaGVkJyxcbiAgICAnbm8gc3RyZWFtIGhhbmRsZXInLFxuICAgICxcbiAgICAnbm8gY2FsbGJhY2snLFxuICAgICdpbnZhbGlkIFVURi04IGRhdGEnLFxuICAgICdleHRyYSBmaWVsZCB0b28gbG9uZycsXG4gICAgJ2RhdGUgbm90IGluIHJhbmdlIDE5ODAtMjA5OScsXG4gICAgJ2ZpbGVuYW1lIHRvbyBsb25nJyxcbiAgICAnc3RyZWFtIGZpbmlzaGluZycsXG4gICAgJ2ludmFsaWQgemlwIGRhdGEnXG4gICAgLy8gZGV0ZXJtaW5lZCBieSB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZFxuXTtcbjtcbnZhciBlcnIgPSBmdW5jdGlvbiAoaW5kLCBtc2csIG50KSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICAgIGUuY29kZSA9IGluZDtcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGUsIGVycik7XG4gICAgaWYgKCFudClcbiAgICAgICAgdGhyb3cgZTtcbiAgICByZXR1cm4gZTtcbn07XG4vLyBleHBhbmRzIHJhdyBERUZMQVRFIGRhdGFcbnZhciBpbmZsdCA9IGZ1bmN0aW9uIChkYXQsIHN0LCBidWYsIGRpY3QpIHtcbiAgICAvLyBzb3VyY2UgbGVuZ3RoICAgICAgIGRpY3QgbGVuZ3RoXG4gICAgdmFyIHNsID0gZGF0Lmxlbmd0aCwgZGwgPSBkaWN0ID8gZGljdC5sZW5ndGggOiAwO1xuICAgIGlmICghc2wgfHwgc3QuZiAmJiAhc3QubClcbiAgICAgICAgcmV0dXJuIGJ1ZiB8fCBuZXcgdTgoMCk7XG4gICAgdmFyIG5vQnVmID0gIWJ1ZjtcbiAgICAvLyBoYXZlIHRvIGVzdGltYXRlIHNpemVcbiAgICB2YXIgcmVzaXplID0gbm9CdWYgfHwgc3QuaSAhPSAyO1xuICAgIC8vIG5vIHN0YXRlXG4gICAgdmFyIG5vU3QgPSBzdC5pO1xuICAgIC8vIEFzc3VtZXMgcm91Z2hseSAzMyUgY29tcHJlc3Npb24gcmF0aW8gYXZlcmFnZVxuICAgIGlmIChub0J1ZilcbiAgICAgICAgYnVmID0gbmV3IHU4KHNsICogMyk7XG4gICAgLy8gZW5zdXJlIGJ1ZmZlciBjYW4gZml0IGF0IGxlYXN0IGwgZWxlbWVudHNcbiAgICB2YXIgY2J1ZiA9IGZ1bmN0aW9uIChsKSB7XG4gICAgICAgIHZhciBibCA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIC8vIG5lZWQgdG8gaW5jcmVhc2Ugc2l6ZSB0byBmaXRcbiAgICAgICAgaWYgKGwgPiBibCkge1xuICAgICAgICAgICAgLy8gRG91YmxlIG9yIHNldCB0byBuZWNlc3NhcnksIHdoaWNoZXZlciBpcyBncmVhdGVyXG4gICAgICAgICAgICB2YXIgbmJ1ZiA9IG5ldyB1OChNYXRoLm1heChibCAqIDIsIGwpKTtcbiAgICAgICAgICAgIG5idWYuc2V0KGJ1Zik7XG4gICAgICAgICAgICBidWYgPSBuYnVmO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyAgbGFzdCBjaHVuayAgICAgICAgIGJpdHBvcyAgICAgICAgICAgYnl0ZXNcbiAgICB2YXIgZmluYWwgPSBzdC5mIHx8IDAsIHBvcyA9IHN0LnAgfHwgMCwgYnQgPSBzdC5iIHx8IDAsIGxtID0gc3QubCwgZG0gPSBzdC5kLCBsYnQgPSBzdC5tLCBkYnQgPSBzdC5uO1xuICAgIC8vIHRvdGFsIGJpdHNcbiAgICB2YXIgdGJ0cyA9IHNsICogODtcbiAgICBkbyB7XG4gICAgICAgIGlmICghbG0pIHtcbiAgICAgICAgICAgIC8vIEJGSU5BTCAtIHRoaXMgaXMgb25seSAxIHdoZW4gbGFzdCBjaHVuayBpcyBuZXh0XG4gICAgICAgICAgICBmaW5hbCA9IGJpdHMoZGF0LCBwb3MsIDEpO1xuICAgICAgICAgICAgLy8gdHlwZTogMCA9IG5vIGNvbXByZXNzaW9uLCAxID0gZml4ZWQgaHVmZm1hbiwgMiA9IGR5bmFtaWMgaHVmZm1hblxuICAgICAgICAgICAgdmFyIHR5cGUgPSBiaXRzKGRhdCwgcG9zICsgMSwgMyk7XG4gICAgICAgICAgICBwb3MgKz0gMztcbiAgICAgICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIGdvIHRvIGVuZCBvZiBieXRlIGJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgdmFyIHMgPSBzaGZ0KHBvcykgKyA0LCBsID0gZGF0W3MgLSA0XSB8IChkYXRbcyAtIDNdIDw8IDgpLCB0ID0gcyArIGw7XG4gICAgICAgICAgICAgICAgaWYgKHQgPiBzbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9TdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBzaXplXG4gICAgICAgICAgICAgICAgaWYgKHJlc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgY2J1ZihidCArIGwpO1xuICAgICAgICAgICAgICAgIC8vIENvcHkgb3ZlciB1bmNvbXByZXNzZWQgZGF0YVxuICAgICAgICAgICAgICAgIGJ1Zi5zZXQoZGF0LnN1YmFycmF5KHMsIHQpLCBidCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IG5ldyBiaXRwb3MsIHVwZGF0ZSBieXRlIGNvdW50XG4gICAgICAgICAgICAgICAgc3QuYiA9IGJ0ICs9IGwsIHN0LnAgPSBwb3MgPSB0ICogOCwgc3QuZiA9IGZpbmFsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIGxtID0gZmxybSwgZG0gPSBmZHJtLCBsYnQgPSA5LCBkYnQgPSA1O1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gIGxpdGVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3Roc1xuICAgICAgICAgICAgICAgIHZhciBoTGl0ID0gYml0cyhkYXQsIHBvcywgMzEpICsgMjU3LCBoY0xlbiA9IGJpdHMoZGF0LCBwb3MgKyAxMCwgMTUpICsgNDtcbiAgICAgICAgICAgICAgICB2YXIgdGwgPSBoTGl0ICsgYml0cyhkYXQsIHBvcyArIDUsIDMxKSArIDE7XG4gICAgICAgICAgICAgICAgcG9zICs9IDE0O1xuICAgICAgICAgICAgICAgIC8vIGxlbmd0aCtkaXN0YW5jZSB0cmVlXG4gICAgICAgICAgICAgICAgdmFyIGxkdCA9IG5ldyB1OCh0bCk7XG4gICAgICAgICAgICAgICAgLy8gY29kZSBsZW5ndGggdHJlZVxuICAgICAgICAgICAgICAgIHZhciBjbHQgPSBuZXcgdTgoMTkpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGNMZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaW5kZXggbWFwIHRvIGdldCByZWFsIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgY2x0W2NsaW1baV1dID0gYml0cyhkYXQsIHBvcyArIGkgKiAzLCA3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zICs9IGhjTGVuICogMztcbiAgICAgICAgICAgICAgICAvLyBjb2RlIGxlbmd0aHMgYml0c1xuICAgICAgICAgICAgICAgIHZhciBjbGIgPSBtYXgoY2x0KSwgY2xibXNrID0gKDEgPDwgY2xiKSAtIDE7XG4gICAgICAgICAgICAgICAgLy8gY29kZSBsZW5ndGhzIG1hcFxuICAgICAgICAgICAgICAgIHZhciBjbG0gPSBoTWFwKGNsdCwgY2xiLCAxKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRsOykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGNsbVtiaXRzKGRhdCwgcG9zLCBjbGJtc2spXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYml0cyByZWFkXG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSByICYgMTU7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHIgPj4gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBsZW5ndGggdG8gY29weVxuICAgICAgICAgICAgICAgICAgICBpZiAocyA8IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZHRbaSsrXSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgY29weSAgIGNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDAsIG4gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDMgKyBiaXRzKGRhdCwgcG9zLCAzKSwgcG9zICs9IDIsIGMgPSBsZHRbaSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocyA9PSAxNylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMyArIGJpdHMoZGF0LCBwb3MsIDcpLCBwb3MgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMgPT0gMTgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDExICsgYml0cyhkYXQsIHBvcywgMTI3KSwgcG9zICs9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobi0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkdFtpKytdID0gYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICBsZW5ndGggdHJlZSAgICAgICAgICAgICAgICAgZGlzdGFuY2UgdHJlZVxuICAgICAgICAgICAgICAgIHZhciBsdCA9IGxkdC5zdWJhcnJheSgwLCBoTGl0KSwgZHQgPSBsZHQuc3ViYXJyYXkoaExpdCk7XG4gICAgICAgICAgICAgICAgLy8gbWF4IGxlbmd0aCBiaXRzXG4gICAgICAgICAgICAgICAgbGJ0ID0gbWF4KGx0KTtcbiAgICAgICAgICAgICAgICAvLyBtYXggZGlzdCBiaXRzXG4gICAgICAgICAgICAgICAgZGJ0ID0gbWF4KGR0KTtcbiAgICAgICAgICAgICAgICBsbSA9IGhNYXAobHQsIGxidCwgMSk7XG4gICAgICAgICAgICAgICAgZG0gPSBoTWFwKGR0LCBkYnQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycigxKTtcbiAgICAgICAgICAgIGlmIChwb3MgPiB0YnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBjYW4gaG9sZCB0aGlzICsgdGhlIGxhcmdlc3QgcG9zc2libGUgYWRkaXRpb25cbiAgICAgICAgLy8gTWF4aW11bSBjaHVuayBzaXplIChwcmFjdGljYWxseSwgdGhlb3JldGljYWxseSBpbmZpbml0ZSkgaXMgMl4xN1xuICAgICAgICBpZiAocmVzaXplKVxuICAgICAgICAgICAgY2J1ZihidCArIDEzMTA3Mik7XG4gICAgICAgIHZhciBsbXMgPSAoMSA8PCBsYnQpIC0gMSwgZG1zID0gKDEgPDwgZGJ0KSAtIDE7XG4gICAgICAgIHZhciBscG9zID0gcG9zO1xuICAgICAgICBmb3IgKDs7IGxwb3MgPSBwb3MpIHtcbiAgICAgICAgICAgIC8vIGJpdHMgcmVhZCwgY29kZVxuICAgICAgICAgICAgdmFyIGMgPSBsbVtiaXRzMTYoZGF0LCBwb3MpICYgbG1zXSwgc3ltID0gYyA+PiA0O1xuICAgICAgICAgICAgcG9zICs9IGMgJiAxNTtcbiAgICAgICAgICAgIGlmIChwb3MgPiB0YnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYylcbiAgICAgICAgICAgICAgICBlcnIoMik7XG4gICAgICAgICAgICBpZiAoc3ltIDwgMjU2KVxuICAgICAgICAgICAgICAgIGJ1ZltidCsrXSA9IHN5bTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHN5bSA9PSAyNTYpIHtcbiAgICAgICAgICAgICAgICBscG9zID0gcG9zLCBsbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgYWRkID0gc3ltIC0gMjU0O1xuICAgICAgICAgICAgICAgIC8vIG5vIGV4dHJhIGJpdHMgbmVlZGVkIGlmIGxlc3NcbiAgICAgICAgICAgICAgICBpZiAoc3ltID4gMjY0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluZGV4XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gc3ltIC0gMjU3LCBiID0gZmxlYltpXTtcbiAgICAgICAgICAgICAgICAgICAgYWRkID0gYml0cyhkYXQsIHBvcywgKDEgPDwgYikgLSAxKSArIGZsW2ldO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gYjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlzdFxuICAgICAgICAgICAgICAgIHZhciBkID0gZG1bYml0czE2KGRhdCwgcG9zKSAmIGRtc10sIGRzeW0gPSBkID4+IDQ7XG4gICAgICAgICAgICAgICAgaWYgKCFkKVxuICAgICAgICAgICAgICAgICAgICBlcnIoMyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IGQgJiAxNTtcbiAgICAgICAgICAgICAgICB2YXIgZHQgPSBmZFtkc3ltXTtcbiAgICAgICAgICAgICAgICBpZiAoZHN5bSA+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBmZGViW2RzeW1dO1xuICAgICAgICAgICAgICAgICAgICBkdCArPSBiaXRzMTYoZGF0LCBwb3MpICYgKDEgPDwgYikgLSAxLCBwb3MgKz0gYjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IHRidHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vU3QpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzaXplKVxuICAgICAgICAgICAgICAgICAgICBjYnVmKGJ0ICsgMTMxMDcyKTtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gYnQgKyBhZGQ7XG4gICAgICAgICAgICAgICAgaWYgKGJ0IDwgZHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNoaWZ0ID0gZGwgLSBkdCwgZGVuZCA9IE1hdGgubWluKGR0LCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgKyBidCA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoMyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBidCA8IGRlbmQ7ICsrYnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBidWZbYnRdID0gZGljdFtzaGlmdCArIGJ0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICg7IGJ0IDwgZW5kOyArK2J0KVxuICAgICAgICAgICAgICAgICAgICBidWZbYnRdID0gYnVmW2J0IC0gZHRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0LmwgPSBsbSwgc3QucCA9IGxwb3MsIHN0LmIgPSBidCwgc3QuZiA9IGZpbmFsO1xuICAgICAgICBpZiAobG0pXG4gICAgICAgICAgICBmaW5hbCA9IDEsIHN0Lm0gPSBsYnQsIHN0LmQgPSBkbSwgc3QubiA9IGRidDtcbiAgICB9IHdoaWxlICghZmluYWwpO1xuICAgIC8vIGRvbid0IHJlYWxsb2NhdGUgZm9yIHN0cmVhbXMgb3IgdXNlciBidWZmZXJzXG4gICAgcmV0dXJuIGJ0ICE9IGJ1Zi5sZW5ndGggJiYgbm9CdWYgPyBzbGMoYnVmLCAwLCBidCkgOiBidWYuc3ViYXJyYXkoMCwgYnQpO1xufTtcbi8vIHN0YXJ0aW5nIGF0IHAsIHdyaXRlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHRoYXQgY2FuIGhvbGQgdiB0byBkXG52YXIgd2JpdHMgPSBmdW5jdGlvbiAoZCwgcCwgdikge1xuICAgIHYgPDw9IHAgJiA3O1xuICAgIHZhciBvID0gKHAgLyA4KSB8IDA7XG4gICAgZFtvXSB8PSB2O1xuICAgIGRbbyArIDFdIHw9IHYgPj4gODtcbn07XG4vLyBzdGFydGluZyBhdCBwLCB3cml0ZSB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyAoPjgpIHRoYXQgY2FuIGhvbGQgdiB0byBkXG52YXIgd2JpdHMxNiA9IGZ1bmN0aW9uIChkLCBwLCB2KSB7XG4gICAgdiA8PD0gcCAmIDc7XG4gICAgdmFyIG8gPSAocCAvIDgpIHwgMDtcbiAgICBkW29dIHw9IHY7XG4gICAgZFtvICsgMV0gfD0gdiA+PiA4O1xuICAgIGRbbyArIDJdIHw9IHYgPj4gMTY7XG59O1xuLy8gY3JlYXRlcyBjb2RlIGxlbmd0aHMgZnJvbSBhIGZyZXF1ZW5jeSB0YWJsZVxudmFyIGhUcmVlID0gZnVuY3Rpb24gKGQsIG1iKSB7XG4gICAgLy8gTmVlZCBleHRyYSBpbmZvIHRvIG1ha2UgYSB0cmVlXG4gICAgdmFyIHQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGRbaV0pXG4gICAgICAgICAgICB0LnB1c2goeyBzOiBpLCBmOiBkW2ldIH0pO1xuICAgIH1cbiAgICB2YXIgcyA9IHQubGVuZ3RoO1xuICAgIHZhciB0MiA9IHQuc2xpY2UoKTtcbiAgICBpZiAoIXMpXG4gICAgICAgIHJldHVybiB7IHQ6IGV0LCBsOiAwIH07XG4gICAgaWYgKHMgPT0gMSkge1xuICAgICAgICB2YXIgdiA9IG5ldyB1OCh0WzBdLnMgKyAxKTtcbiAgICAgICAgdlt0WzBdLnNdID0gMTtcbiAgICAgICAgcmV0dXJuIHsgdDogdiwgbDogMSB9O1xuICAgIH1cbiAgICB0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuZiAtIGIuZjsgfSk7XG4gICAgLy8gYWZ0ZXIgaTIgcmVhY2hlcyBsYXN0IGluZCwgd2lsbCBiZSBzdG9wcGVkXG4gICAgLy8gZnJlcSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsYXJnZXN0IHBvc3NpYmxlIG51bWJlciBvZiBzeW1ib2xzXG4gICAgdC5wdXNoKHsgczogLTEsIGY6IDI1MDAxIH0pO1xuICAgIHZhciBsID0gdFswXSwgciA9IHRbMV0sIGkwID0gMCwgaTEgPSAxLCBpMiA9IDI7XG4gICAgdFswXSA9IHsgczogLTEsIGY6IGwuZiArIHIuZiwgbDogbCwgcjogciB9O1xuICAgIC8vIGVmZmljaWVudCBhbGdvcml0aG0gZnJvbSBVWklQLmpzXG4gICAgLy8gaTAgaXMgbG9va2JlaGluZCwgaTIgaXMgbG9va2FoZWFkIC0gYWZ0ZXIgcHJvY2Vzc2luZyB0d28gbG93LWZyZXFcbiAgICAvLyBzeW1ib2xzIHRoYXQgY29tYmluZWQgaGF2ZSBoaWdoIGZyZXEsIHdpbGwgc3RhcnQgcHJvY2Vzc2luZyBpMiAoaGlnaC1mcmVxLFxuICAgIC8vIG5vbi1jb21wb3NpdGUpIHN5bWJvbHMgaW5zdGVhZFxuICAgIC8vIHNlZSBodHRwczovL3JlZGRpdC5jb20vci9waG90b3BlYS9jb21tZW50cy9pa2VraHQvdXppcGpzX3F1ZXN0aW9ucy9cbiAgICB3aGlsZSAoaTEgIT0gcyAtIDEpIHtcbiAgICAgICAgbCA9IHRbdFtpMF0uZiA8IHRbaTJdLmYgPyBpMCsrIDogaTIrK107XG4gICAgICAgIHIgPSB0W2kwICE9IGkxICYmIHRbaTBdLmYgPCB0W2kyXS5mID8gaTArKyA6IGkyKytdO1xuICAgICAgICB0W2kxKytdID0geyBzOiAtMSwgZjogbC5mICsgci5mLCBsOiBsLCByOiByIH07XG4gICAgfVxuICAgIHZhciBtYXhTeW0gPSB0MlswXS5zO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgczsgKytpKSB7XG4gICAgICAgIGlmICh0MltpXS5zID4gbWF4U3ltKVxuICAgICAgICAgICAgbWF4U3ltID0gdDJbaV0ucztcbiAgICB9XG4gICAgLy8gY29kZSBsZW5ndGhzXG4gICAgdmFyIHRyID0gbmV3IHUxNihtYXhTeW0gKyAxKTtcbiAgICAvLyBtYXggYml0cyBpbiB0cmVlXG4gICAgdmFyIG1idCA9IGxuKHRbaTEgLSAxXSwgdHIsIDApO1xuICAgIGlmIChtYnQgPiBtYikge1xuICAgICAgICAvLyBtb3JlIGFsZ29yaXRobXMgZnJvbSBVWklQLmpzXG4gICAgICAgIC8vIFRPRE86IGZpbmQgb3V0IGhvdyB0aGlzIGNvZGUgd29ya3MgKGRlYnQpXG4gICAgICAgIC8vICBpbmQgICAgZGVidFxuICAgICAgICB2YXIgaSA9IDAsIGR0ID0gMDtcbiAgICAgICAgLy8gICAgbGVmdCAgICAgICAgICAgIGNvc3RcbiAgICAgICAgdmFyIGxmdCA9IG1idCAtIG1iLCBjc3QgPSAxIDw8IGxmdDtcbiAgICAgICAgdDIuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gdHJbYi5zXSAtIHRyW2Euc10gfHwgYS5mIC0gYi5mOyB9KTtcbiAgICAgICAgZm9yICg7IGkgPCBzOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBpMl8xID0gdDJbaV0ucztcbiAgICAgICAgICAgIGlmICh0cltpMl8xXSA+IG1iKSB7XG4gICAgICAgICAgICAgICAgZHQgKz0gY3N0IC0gKDEgPDwgKG1idCAtIHRyW2kyXzFdKSk7XG4gICAgICAgICAgICAgICAgdHJbaTJfMV0gPSBtYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkdCA+Pj0gbGZ0O1xuICAgICAgICB3aGlsZSAoZHQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgaTJfMiA9IHQyW2ldLnM7XG4gICAgICAgICAgICBpZiAodHJbaTJfMl0gPCBtYilcbiAgICAgICAgICAgICAgICBkdCAtPSAxIDw8IChtYiAtIHRyW2kyXzJdKysgLSAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPj0gMCAmJiBkdDsgLS1pKSB7XG4gICAgICAgICAgICB2YXIgaTJfMyA9IHQyW2ldLnM7XG4gICAgICAgICAgICBpZiAodHJbaTJfM10gPT0gbWIpIHtcbiAgICAgICAgICAgICAgICAtLXRyW2kyXzNdO1xuICAgICAgICAgICAgICAgICsrZHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWJ0ID0gbWI7XG4gICAgfVxuICAgIHJldHVybiB7IHQ6IG5ldyB1OCh0ciksIGw6IG1idCB9O1xufTtcbi8vIGdldCB0aGUgbWF4IGxlbmd0aCBhbmQgYXNzaWduIGxlbmd0aCBjb2Rlc1xudmFyIGxuID0gZnVuY3Rpb24gKG4sIGwsIGQpIHtcbiAgICByZXR1cm4gbi5zID09IC0xXG4gICAgICAgID8gTWF0aC5tYXgobG4obi5sLCBsLCBkICsgMSksIGxuKG4uciwgbCwgZCArIDEpKVxuICAgICAgICA6IChsW24uc10gPSBkKTtcbn07XG4vLyBsZW5ndGggY29kZXMgZ2VuZXJhdGlvblxudmFyIGxjID0gZnVuY3Rpb24gKGMpIHtcbiAgICB2YXIgcyA9IGMubGVuZ3RoO1xuICAgIC8vIE5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIHdhcyBpbnRlbnRpb25hbFxuICAgIHdoaWxlIChzICYmICFjWy0tc10pXG4gICAgICAgIDtcbiAgICB2YXIgY2wgPSBuZXcgdTE2KCsrcyk7XG4gICAgLy8gIGluZCAgICAgIG51bSAgICAgICAgIHN0cmVha1xuICAgIHZhciBjbGkgPSAwLCBjbG4gPSBjWzBdLCBjbHMgPSAxO1xuICAgIHZhciB3ID0gZnVuY3Rpb24gKHYpIHsgY2xbY2xpKytdID0gdjsgfTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBzOyArK2kpIHtcbiAgICAgICAgaWYgKGNbaV0gPT0gY2xuICYmIGkgIT0gcylcbiAgICAgICAgICAgICsrY2xzO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghY2xuICYmIGNscyA+IDIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgY2xzID4gMTM4OyBjbHMgLT0gMTM4KVxuICAgICAgICAgICAgICAgICAgICB3KDMyNzU0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2xzID4gMikge1xuICAgICAgICAgICAgICAgICAgICB3KGNscyA+IDEwID8gKChjbHMgLSAxMSkgPDwgNSkgfCAyODY5MCA6ICgoY2xzIC0gMykgPDwgNSkgfCAxMjMwNSk7XG4gICAgICAgICAgICAgICAgICAgIGNscyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2xzID4gMykge1xuICAgICAgICAgICAgICAgIHcoY2xuKSwgLS1jbHM7XG4gICAgICAgICAgICAgICAgZm9yICg7IGNscyA+IDY7IGNscyAtPSA2KVxuICAgICAgICAgICAgICAgICAgICB3KDgzMDQpO1xuICAgICAgICAgICAgICAgIGlmIChjbHMgPiAyKVxuICAgICAgICAgICAgICAgICAgICB3KCgoY2xzIC0gMykgPDwgNSkgfCA4MjA4KSwgY2xzID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjbHMtLSlcbiAgICAgICAgICAgICAgICB3KGNsbik7XG4gICAgICAgICAgICBjbHMgPSAxO1xuICAgICAgICAgICAgY2xuID0gY1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjOiBjbC5zdWJhcnJheSgwLCBjbGkpLCBuOiBzIH07XG59O1xuLy8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2Ygb3V0cHV0IGZyb20gdHJlZSwgY29kZSBsZW5ndGhzXG52YXIgY2xlbiA9IGZ1bmN0aW9uIChjZiwgY2wpIHtcbiAgICB2YXIgbCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbC5sZW5ndGg7ICsraSlcbiAgICAgICAgbCArPSBjZltpXSAqIGNsW2ldO1xuICAgIHJldHVybiBsO1xufTtcbi8vIHdyaXRlcyBhIGZpeGVkIGJsb2NrXG4vLyByZXR1cm5zIHRoZSBuZXcgYml0IHBvc1xudmFyIHdmYmxrID0gZnVuY3Rpb24gKG91dCwgcG9zLCBkYXQpIHtcbiAgICAvLyBubyBuZWVkIHRvIHdyaXRlIDAwIGFzIHR5cGU6IFR5cGVkQXJyYXkgZGVmYXVsdHMgdG8gMFxuICAgIHZhciBzID0gZGF0Lmxlbmd0aDtcbiAgICB2YXIgbyA9IHNoZnQocG9zICsgMik7XG4gICAgb3V0W29dID0gcyAmIDI1NTtcbiAgICBvdXRbbyArIDFdID0gcyA+PiA4O1xuICAgIG91dFtvICsgMl0gPSBvdXRbb10gXiAyNTU7XG4gICAgb3V0W28gKyAzXSA9IG91dFtvICsgMV0gXiAyNTU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyArK2kpXG4gICAgICAgIG91dFtvICsgaSArIDRdID0gZGF0W2ldO1xuICAgIHJldHVybiAobyArIDQgKyBzKSAqIDg7XG59O1xuLy8gd3JpdGVzIGEgYmxvY2tcbnZhciB3YmxrID0gZnVuY3Rpb24gKGRhdCwgb3V0LCBmaW5hbCwgc3ltcywgbGYsIGRmLCBlYiwgbGksIGJzLCBibCwgcCkge1xuICAgIHdiaXRzKG91dCwgcCsrLCBmaW5hbCk7XG4gICAgKytsZlsyNTZdO1xuICAgIHZhciBfYSA9IGhUcmVlKGxmLCAxNSksIGRsdCA9IF9hLnQsIG1sYiA9IF9hLmw7XG4gICAgdmFyIF9iID0gaFRyZWUoZGYsIDE1KSwgZGR0ID0gX2IudCwgbWRiID0gX2IubDtcbiAgICB2YXIgX2MgPSBsYyhkbHQpLCBsY2x0ID0gX2MuYywgbmxjID0gX2MubjtcbiAgICB2YXIgX2QgPSBsYyhkZHQpLCBsY2R0ID0gX2QuYywgbmRjID0gX2QubjtcbiAgICB2YXIgbGNmcmVxID0gbmV3IHUxNigxOSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsY2x0Lmxlbmd0aDsgKytpKVxuICAgICAgICArK2xjZnJlcVtsY2x0W2ldICYgMzFdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGNkdC5sZW5ndGg7ICsraSlcbiAgICAgICAgKytsY2ZyZXFbbGNkdFtpXSAmIDMxXTtcbiAgICB2YXIgX2UgPSBoVHJlZShsY2ZyZXEsIDcpLCBsY3QgPSBfZS50LCBtbGNiID0gX2UubDtcbiAgICB2YXIgbmxjYyA9IDE5O1xuICAgIGZvciAoOyBubGNjID4gNCAmJiAhbGN0W2NsaW1bbmxjYyAtIDFdXTsgLS1ubGNjKVxuICAgICAgICA7XG4gICAgdmFyIGZsZW4gPSAoYmwgKyA1KSA8PCAzO1xuICAgIHZhciBmdGxlbiA9IGNsZW4obGYsIGZsdCkgKyBjbGVuKGRmLCBmZHQpICsgZWI7XG4gICAgdmFyIGR0bGVuID0gY2xlbihsZiwgZGx0KSArIGNsZW4oZGYsIGRkdCkgKyBlYiArIDE0ICsgMyAqIG5sY2MgKyBjbGVuKGxjZnJlcSwgbGN0KSArIDIgKiBsY2ZyZXFbMTZdICsgMyAqIGxjZnJlcVsxN10gKyA3ICogbGNmcmVxWzE4XTtcbiAgICBpZiAoYnMgPj0gMCAmJiBmbGVuIDw9IGZ0bGVuICYmIGZsZW4gPD0gZHRsZW4pXG4gICAgICAgIHJldHVybiB3ZmJsayhvdXQsIHAsIGRhdC5zdWJhcnJheShicywgYnMgKyBibCkpO1xuICAgIHZhciBsbSwgbGwsIGRtLCBkbDtcbiAgICB3Yml0cyhvdXQsIHAsIDEgKyAoZHRsZW4gPCBmdGxlbikpLCBwICs9IDI7XG4gICAgaWYgKGR0bGVuIDwgZnRsZW4pIHtcbiAgICAgICAgbG0gPSBoTWFwKGRsdCwgbWxiLCAwKSwgbGwgPSBkbHQsIGRtID0gaE1hcChkZHQsIG1kYiwgMCksIGRsID0gZGR0O1xuICAgICAgICB2YXIgbGxtID0gaE1hcChsY3QsIG1sY2IsIDApO1xuICAgICAgICB3Yml0cyhvdXQsIHAsIG5sYyAtIDI1Nyk7XG4gICAgICAgIHdiaXRzKG91dCwgcCArIDUsIG5kYyAtIDEpO1xuICAgICAgICB3Yml0cyhvdXQsIHAgKyAxMCwgbmxjYyAtIDQpO1xuICAgICAgICBwICs9IDE0O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5sY2M7ICsraSlcbiAgICAgICAgICAgIHdiaXRzKG91dCwgcCArIDMgKiBpLCBsY3RbY2xpbVtpXV0pO1xuICAgICAgICBwICs9IDMgKiBubGNjO1xuICAgICAgICB2YXIgbGN0cyA9IFtsY2x0LCBsY2R0XTtcbiAgICAgICAgZm9yICh2YXIgaXQgPSAwOyBpdCA8IDI7ICsraXQpIHtcbiAgICAgICAgICAgIHZhciBjbGN0ID0gbGN0c1tpdF07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsY3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gY2xjdFtpXSAmIDMxO1xuICAgICAgICAgICAgICAgIHdiaXRzKG91dCwgcCwgbGxtW2xlbl0pLCBwICs9IGxjdFtsZW5dO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxNSlcbiAgICAgICAgICAgICAgICAgICAgd2JpdHMob3V0LCBwLCAoY2xjdFtpXSA+PiA1KSAmIDEyNyksIHAgKz0gY2xjdFtpXSA+PiAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbG0gPSBmbG0sIGxsID0gZmx0LCBkbSA9IGZkbSwgZGwgPSBmZHQ7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGk7ICsraSkge1xuICAgICAgICB2YXIgc3ltID0gc3ltc1tpXTtcbiAgICAgICAgaWYgKHN5bSA+IDI1NSkge1xuICAgICAgICAgICAgdmFyIGxlbiA9IChzeW0gPj4gMTgpICYgMzE7XG4gICAgICAgICAgICB3Yml0czE2KG91dCwgcCwgbG1bbGVuICsgMjU3XSksIHAgKz0gbGxbbGVuICsgMjU3XTtcbiAgICAgICAgICAgIGlmIChsZW4gPiA3KVxuICAgICAgICAgICAgICAgIHdiaXRzKG91dCwgcCwgKHN5bSA+PiAyMykgJiAzMSksIHAgKz0gZmxlYltsZW5dO1xuICAgICAgICAgICAgdmFyIGRzdCA9IHN5bSAmIDMxO1xuICAgICAgICAgICAgd2JpdHMxNihvdXQsIHAsIGRtW2RzdF0pLCBwICs9IGRsW2RzdF07XG4gICAgICAgICAgICBpZiAoZHN0ID4gMylcbiAgICAgICAgICAgICAgICB3Yml0czE2KG91dCwgcCwgKHN5bSA+PiA1KSAmIDgxOTEpLCBwICs9IGZkZWJbZHN0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdiaXRzMTYob3V0LCBwLCBsbVtzeW1dKSwgcCArPSBsbFtzeW1dO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdiaXRzMTYob3V0LCBwLCBsbVsyNTZdKTtcbiAgICByZXR1cm4gcCArIGxsWzI1Nl07XG59O1xuLy8gZGVmbGF0ZSBvcHRpb25zIChuaWNlIDw8IDEzKSB8IGNoYWluXG52YXIgZGVvID0gLyojX19QVVJFX18qLyBuZXcgaTMyKFs2NTU0MCwgMTMxMDgwLCAxMzEwODgsIDEzMTEwNCwgMjYyMTc2LCAxMDQ4NzA0LCAxMDQ4ODMyLCAyMTE0NTYwLCAyMTE3NjMyXSk7XG4vLyBlbXB0eVxudmFyIGV0ID0gLyojX19QVVJFX18qLyBuZXcgdTgoMCk7XG4vLyBjb21wcmVzc2VzIGRhdGEgaW50byBhIHJhdyBERUZMQVRFIGJ1ZmZlclxudmFyIGRmbHQgPSBmdW5jdGlvbiAoZGF0LCBsdmwsIHBsdmwsIHByZSwgcG9zdCwgc3QpIHtcbiAgICB2YXIgcyA9IHN0LnogfHwgZGF0Lmxlbmd0aDtcbiAgICB2YXIgbyA9IG5ldyB1OChwcmUgKyBzICsgNSAqICgxICsgTWF0aC5jZWlsKHMgLyA3MDAwKSkgKyBwb3N0KTtcbiAgICAvLyB3cml0aW5nIHRvIHRoaXMgd3JpdGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyXG4gICAgdmFyIHcgPSBvLnN1YmFycmF5KHByZSwgby5sZW5ndGggLSBwb3N0KTtcbiAgICB2YXIgbHN0ID0gc3QubDtcbiAgICB2YXIgcG9zID0gKHN0LnIgfHwgMCkgJiA3O1xuICAgIGlmIChsdmwpIHtcbiAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgIHdbMF0gPSBzdC5yID4+IDM7XG4gICAgICAgIHZhciBvcHQgPSBkZW9bbHZsIC0gMV07XG4gICAgICAgIHZhciBuID0gb3B0ID4+IDEzLCBjID0gb3B0ICYgODE5MTtcbiAgICAgICAgdmFyIG1za18xID0gKDEgPDwgcGx2bCkgLSAxO1xuICAgICAgICAvLyAgICBwcmV2IDItYnl0ZSB2YWwgbWFwICAgIGN1cnIgMi1ieXRlIHZhbCBtYXBcbiAgICAgICAgdmFyIHByZXYgPSBzdC5wIHx8IG5ldyB1MTYoMzI3NjgpLCBoZWFkID0gc3QuaCB8fCBuZXcgdTE2KG1za18xICsgMSk7XG4gICAgICAgIHZhciBiczFfMSA9IE1hdGguY2VpbChwbHZsIC8gMyksIGJzMl8xID0gMiAqIGJzMV8xO1xuICAgICAgICB2YXIgaHNoID0gZnVuY3Rpb24gKGkpIHsgcmV0dXJuIChkYXRbaV0gXiAoZGF0W2kgKyAxXSA8PCBiczFfMSkgXiAoZGF0W2kgKyAyXSA8PCBiczJfMSkpICYgbXNrXzE7IH07XG4gICAgICAgIC8vIDI0NTc2IGlzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgbWF4aW11bSBzeW1ib2xzIHBlciBibG9ja1xuICAgICAgICAvLyA0MjQgYnVmZmVyIGZvciBsYXN0IGJsb2NrXG4gICAgICAgIHZhciBzeW1zID0gbmV3IGkzMigyNTAwMCk7XG4gICAgICAgIC8vIGxlbmd0aC9saXRlcmFsIGZyZXEgICBkaXN0YW5jZSBmcmVxXG4gICAgICAgIHZhciBsZiA9IG5ldyB1MTYoMjg4KSwgZGYgPSBuZXcgdTE2KDMyKTtcbiAgICAgICAgLy8gIGwvbGNudCAgZXhiaXRzICBpbmRleCAgICAgICAgICBsL2xpbmQgIHdhaXRkeCAgICAgICAgICBibGtwb3NcbiAgICAgICAgdmFyIGxjXzEgPSAwLCBlYiA9IDAsIGkgPSBzdC5pIHx8IDAsIGxpID0gMCwgd2kgPSBzdC53IHx8IDAsIGJzID0gMDtcbiAgICAgICAgZm9yICg7IGkgKyAyIDwgczsgKytpKSB7XG4gICAgICAgICAgICAvLyBoYXNoIHZhbHVlXG4gICAgICAgICAgICB2YXIgaHYgPSBoc2goaSk7XG4gICAgICAgICAgICAvLyBpbmRleCBtb2QgMzI3NjggICAgcHJldmlvdXMgaW5kZXggbW9kXG4gICAgICAgICAgICB2YXIgaW1vZCA9IGkgJiAzMjc2NywgcGltb2QgPSBoZWFkW2h2XTtcbiAgICAgICAgICAgIHByZXZbaW1vZF0gPSBwaW1vZDtcbiAgICAgICAgICAgIGhlYWRbaHZdID0gaW1vZDtcbiAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBzaG91bGQgbW9kaWZ5IGhlYWQgYW5kIHByZXYsIGJ1dCBvbmx5IGFkZCBzeW1ib2xzIGlmXG4gICAgICAgICAgICAvLyB0aGlzIGRhdGEgaXMgbm90IHlldCBwcm9jZXNzZWQgKFwid2FpdFwiIGZvciB3YWl0IGluZGV4KVxuICAgICAgICAgICAgaWYgKHdpIDw9IGkpIHtcbiAgICAgICAgICAgICAgICAvLyBieXRlcyByZW1haW5pbmdcbiAgICAgICAgICAgICAgICB2YXIgcmVtID0gcyAtIGk7XG4gICAgICAgICAgICAgICAgaWYgKChsY18xID4gNzAwMCB8fCBsaSA+IDI0NTc2KSAmJiAocmVtID4gNDIzIHx8ICFsc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHdibGsoZGF0LCB3LCAwLCBzeW1zLCBsZiwgZGYsIGViLCBsaSwgYnMsIGkgLSBicywgcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgbGkgPSBsY18xID0gZWIgPSAwLCBicyA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMjg2OyArK2opXG4gICAgICAgICAgICAgICAgICAgICAgICBsZltqXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMzA7ICsrailcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmW2pdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIGxlbiAgICBkaXN0ICAgY2hhaW5cbiAgICAgICAgICAgICAgICB2YXIgbCA9IDIsIGQgPSAwLCBjaF8xID0gYywgZGlmID0gaW1vZCAtIHBpbW9kICYgMzI3Njc7XG4gICAgICAgICAgICAgICAgaWYgKHJlbSA+IDIgJiYgaHYgPT0gaHNoKGkgLSBkaWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhuID0gTWF0aC5taW4obiwgcmVtKSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhkID0gTWF0aC5taW4oMzI3NjcsIGkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBtYXggcG9zc2libGUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjYXBwZWQgYXQgZGlmIGJlY2F1c2UgZGVjb21wcmVzc29ycyBpbXBsZW1lbnQgXCJyb2xsaW5nXCIgaW5kZXggcG9wdWxhdGlvblxuICAgICAgICAgICAgICAgICAgICB2YXIgbWwgPSBNYXRoLm1pbigyNTgsIHJlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChkaWYgPD0gbWF4ZCAmJiAtLWNoXzEgJiYgaW1vZCAhPSBwaW1vZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdFtpICsgbF0gPT0gZGF0W2kgKyBsIC0gZGlmXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBubCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IG5sIDwgbWwgJiYgZGF0W2kgKyBubF0gPT0gZGF0W2kgKyBubCAtIGRpZl07ICsrbmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmwgPiBsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBubCwgZCA9IGRpZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJlYWsgb3V0IGVhcmx5IHdoZW4gd2UgcmVhY2ggXCJuaWNlXCIgKHdlIGFyZSBzYXRpc2ZpZWQgZW5vdWdoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmwgPiBtYXhuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdywgZmluZCB0aGUgcmFyZXN0IDItYnl0ZSBzZXF1ZW5jZSB3aXRoaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgbGl0ZXJhbHMgYW5kIHNlYXJjaCBmb3IgdGhhdCBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdWNoIGZhc3RlciB0aGFuIGp1c3QgdXNpbmcgdGhlIHN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtbWQgPSBNYXRoLm1pbihkaWYsIG5sIC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbW1kOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aSA9IGkgLSBkaWYgKyBqICYgMzI3Njc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHRpID0gcHJldlt0aV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2QgPSB0aSAtIHB0aSAmIDMyNzY3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNkID4gbWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQgPSBjZCwgcGltb2QgPSB0aTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBwcmV2aW91cyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1vZCA9IHBpbW9kLCBwaW1vZCA9IHByZXZbaW1vZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWYgKz0gaW1vZCAtIHBpbW9kICYgMzI3Njc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZCB3aWxsIGJlIG5vbnplcm8gb25seSB3aGVuIGEgbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgYm90aCBkaXN0IGFuZCBsZW4gZGF0YSBpbiBvbmUgaW50MzJcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgcmVjb2duaXplZCBhcyBhIGxlbi9kaXN0IHdpdGggMjh0aCBiaXQgKDJeMjgpXG4gICAgICAgICAgICAgICAgICAgIHN5bXNbbGkrK10gPSAyNjg0MzU0NTYgfCAocmV2ZmxbbF0gPDwgMTgpIHwgcmV2ZmRbZF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW4gPSByZXZmbFtsXSAmIDMxLCBkaW4gPSByZXZmZFtkXSAmIDMxO1xuICAgICAgICAgICAgICAgICAgICBlYiArPSBmbGViW2xpbl0gKyBmZGViW2Rpbl07XG4gICAgICAgICAgICAgICAgICAgICsrbGZbMjU3ICsgbGluXTtcbiAgICAgICAgICAgICAgICAgICAgKytkZltkaW5dO1xuICAgICAgICAgICAgICAgICAgICB3aSA9IGkgKyBsO1xuICAgICAgICAgICAgICAgICAgICArK2xjXzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzeW1zW2xpKytdID0gZGF0W2ldO1xuICAgICAgICAgICAgICAgICAgICArK2xmW2RhdFtpXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IE1hdGgubWF4KGksIHdpKTsgaSA8IHM7ICsraSkge1xuICAgICAgICAgICAgc3ltc1tsaSsrXSA9IGRhdFtpXTtcbiAgICAgICAgICAgICsrbGZbZGF0W2ldXTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSB3YmxrKGRhdCwgdywgbHN0LCBzeW1zLCBsZiwgZGYsIGViLCBsaSwgYnMsIGkgLSBicywgcG9zKTtcbiAgICAgICAgaWYgKCFsc3QpIHtcbiAgICAgICAgICAgIHN0LnIgPSAocG9zICYgNykgfCB3Wyhwb3MgLyA4KSB8IDBdIDw8IDM7XG4gICAgICAgICAgICAvLyBzaGZ0KHBvcykgbm93IDEgbGVzcyBpZiBwb3MgJiA3ICE9IDBcbiAgICAgICAgICAgIHBvcyAtPSA3O1xuICAgICAgICAgICAgc3QuaCA9IGhlYWQsIHN0LnAgPSBwcmV2LCBzdC5pID0gaSwgc3QudyA9IHdpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gc3QudyB8fCAwOyBpIDwgcyArIGxzdDsgaSArPSA2NTUzNSkge1xuICAgICAgICAgICAgLy8gZW5kXG4gICAgICAgICAgICB2YXIgZSA9IGkgKyA2NTUzNTtcbiAgICAgICAgICAgIGlmIChlID49IHMpIHtcbiAgICAgICAgICAgICAgICAvLyB3cml0ZSBmaW5hbCBibG9ja1xuICAgICAgICAgICAgICAgIHdbKHBvcyAvIDgpIHwgMF0gPSBsc3Q7XG4gICAgICAgICAgICAgICAgZSA9IHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSB3ZmJsayh3LCBwb3MgKyAxLCBkYXQuc3ViYXJyYXkoaSwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIHN0LmkgPSBzO1xuICAgIH1cbiAgICByZXR1cm4gc2xjKG8sIDAsIHByZSArIHNoZnQocG9zKSArIHBvc3QpO1xufTtcbi8vIENSQzMyIHRhYmxlXG52YXIgY3JjdCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdCA9IG5ldyBJbnQzMkFycmF5KDI1Nik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICB2YXIgYyA9IGksIGsgPSA5O1xuICAgICAgICB3aGlsZSAoLS1rKVxuICAgICAgICAgICAgYyA9ICgoYyAmIDEpICYmIC0zMDY2NzQ5MTIpIF4gKGMgPj4+IDEpO1xuICAgICAgICB0W2ldID0gYztcbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59KSgpO1xuLy8gQ1JDMzJcbnZhciBjcmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGMgPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwOiBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgLy8gY2xvc3VyZXMgaGF2ZSBhd2Z1bCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgdmFyIGNyID0gYztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjciA9IGNyY3RbKGNyICYgMjU1KSBeIGRbaV1dIF4gKGNyID4+PiA4KTtcbiAgICAgICAgICAgIGMgPSBjcjtcbiAgICAgICAgfSxcbiAgICAgICAgZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gfmM7IH1cbiAgICB9O1xufTtcbi8vIEFkbGVyMzJcbnZhciBhZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IDEsIGIgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICAgIHA6IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAvLyBjbG9zdXJlcyBoYXZlIGF3ZnVsIHBlcmZvcm1hbmNlXG4gICAgICAgICAgICB2YXIgbiA9IGEsIG0gPSBiO1xuICAgICAgICAgICAgdmFyIGwgPSBkLmxlbmd0aCB8IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSAhPSBsOykge1xuICAgICAgICAgICAgICAgIHZhciBlID0gTWF0aC5taW4oaSArIDI2NTUsIGwpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgZTsgKytpKVxuICAgICAgICAgICAgICAgICAgICBtICs9IG4gKz0gZFtpXTtcbiAgICAgICAgICAgICAgICBuID0gKG4gJiA2NTUzNSkgKyAxNSAqIChuID4+IDE2KSwgbSA9IChtICYgNjU1MzUpICsgMTUgKiAobSA+PiAxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhID0gbiwgYiA9IG07XG4gICAgICAgIH0sXG4gICAgICAgIGQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGEgJT0gNjU1MjEsIGIgJT0gNjU1MjE7XG4gICAgICAgICAgICByZXR1cm4gKGEgJiAyNTUpIDw8IDI0IHwgKGEgJiAweEZGMDApIDw8IDggfCAoYiAmIDI1NSkgPDwgOCB8IChiID4+IDgpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG47XG4vLyBkZWZsYXRlIHdpdGggb3B0c1xudmFyIGRvcHQgPSBmdW5jdGlvbiAoZGF0LCBvcHQsIHByZSwgcG9zdCwgc3QpIHtcbiAgICBpZiAoIXN0KSB7XG4gICAgICAgIHN0ID0geyBsOiAxIH07XG4gICAgICAgIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBvcHQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpO1xuICAgICAgICAgICAgdmFyIG5ld0RhdCA9IG5ldyB1OChkaWN0Lmxlbmd0aCArIGRhdC5sZW5ndGgpO1xuICAgICAgICAgICAgbmV3RGF0LnNldChkaWN0KTtcbiAgICAgICAgICAgIG5ld0RhdC5zZXQoZGF0LCBkaWN0Lmxlbmd0aCk7XG4gICAgICAgICAgICBkYXQgPSBuZXdEYXQ7XG4gICAgICAgICAgICBzdC53ID0gZGljdC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRmbHQoZGF0LCBvcHQubGV2ZWwgPT0gbnVsbCA/IDYgOiBvcHQubGV2ZWwsIG9wdC5tZW0gPT0gbnVsbCA/IChzdC5sID8gTWF0aC5jZWlsKE1hdGgubWF4KDgsIE1hdGgubWluKDEzLCBNYXRoLmxvZyhkYXQubGVuZ3RoKSkpICogMS41KSA6IDIwKSA6ICgxMiArIG9wdC5tZW0pLCBwcmUsIHBvc3QsIHN0KTtcbn07XG4vLyBXYWxtYXJ0IG9iamVjdCBzcHJlYWRcbnZhciBtcmcgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBvID0ge307XG4gICAgZm9yICh2YXIgayBpbiBhKVxuICAgICAgICBvW2tdID0gYVtrXTtcbiAgICBmb3IgKHZhciBrIGluIGIpXG4gICAgICAgIG9ba10gPSBiW2tdO1xuICAgIHJldHVybiBvO1xufTtcbi8vIHdvcmtlciBjbG9uZVxuLy8gVGhpcyBpcyBwb3NzaWJseSB0aGUgY3Jhemllc3QgcGFydCBvZiB0aGUgZW50aXJlIGNvZGViYXNlLCBkZXNwaXRlIGhvdyBzaW1wbGUgaXQgbWF5IHNlZW0uXG4vLyBUaGUgb25seSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbiBpcyBhIGNsb3N1cmUgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIHZhcmlhYmxlcyBvdXRzaWRlIG9mIHRoZSBmdW5jdGlvbiBzY29wZS5cbi8vIFdlJ3JlIGdvaW5nIHRvIHRyeSB0byBmaWd1cmUgb3V0IHRoZSB2YXJpYWJsZSBuYW1lcyB1c2VkIGluIHRoZSBjbG9zdXJlIGFzIHN0cmluZ3MgYmVjYXVzZSB0aGF0IGlzIGNydWNpYWwgZm9yIHdvcmtlcml6YXRpb24uXG4vLyBXZSB3aWxsIHJldHVybiBhbiBvYmplY3QgbWFwcGluZyBvZiB0cnVlIHZhcmlhYmxlIG5hbWUgdG8gdmFsdWUgKGJhc2ljYWxseSwgdGhlIGN1cnJlbnQgc2NvcGUgYXMgYSBKUyBvYmplY3QpLlxuLy8gVGhlIHJlYXNvbiB3ZSBjYW4ndCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgdmFyaWFibGUgbmFtZXMgaXMgbWluaWZpZXJzIG1hbmdsaW5nIHRoZSB0b3BsZXZlbCBzY29wZS5cbi8vIFRoaXMgdG9vayBtZSB0aHJlZSB3ZWVrcyB0byBmaWd1cmUgb3V0IGhvdyB0byBkby5cbnZhciB3Y2xuID0gZnVuY3Rpb24gKGZuLCBmblN0ciwgdGQpIHtcbiAgICB2YXIgZHQgPSBmbigpO1xuICAgIHZhciBzdCA9IGZuLnRvU3RyaW5nKCk7XG4gICAgdmFyIGtzID0gc3Quc2xpY2Uoc3QuaW5kZXhPZignWycpICsgMSwgc3QubGFzdEluZGV4T2YoJ10nKSkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoJywnKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGR0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciB2ID0gZHRbaV0sIGsgPSBrc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGZuU3RyICs9ICc7JyArIGsgKyAnPSc7XG4gICAgICAgICAgICB2YXIgc3RfMSA9IHYudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmICh2LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBnbG9iYWwgb2JqZWN0c1xuICAgICAgICAgICAgICAgIGlmIChzdF8xLmluZGV4T2YoJ1tuYXRpdmUgY29kZV0nKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3BJbmQgPSBzdF8xLmluZGV4T2YoJyAnLCA4KSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGZuU3RyICs9IHN0XzEuc2xpY2Uoc3BJbmQsIHN0XzEuaW5kZXhPZignKCcsIHNwSW5kKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmblN0ciArPSBzdF8xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIHYucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm5TdHIgKz0gJzsnICsgayArICcucHJvdG90eXBlLicgKyB0ICsgJz0nICsgdi5wcm90b3R5cGVbdF0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm5TdHIgKz0gc3RfMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ZFtrXSA9IHY7XG4gICAgfVxuICAgIHJldHVybiBmblN0cjtcbn07XG52YXIgY2ggPSBbXTtcbi8vIGNsb25lIGJ1ZnNcbnZhciBjYmZzID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgdGwgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIHYpIHtcbiAgICAgICAgaWYgKHZba10uYnVmZmVyKSB7XG4gICAgICAgICAgICB0bC5wdXNoKCh2W2tdID0gbmV3IHZba10uY29uc3RydWN0b3IodltrXSkpLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRsO1xufTtcbi8vIHVzZSBhIHdvcmtlciB0byBleGVjdXRlIGNvZGVcbnZhciB3cmtyID0gZnVuY3Rpb24gKGZucywgaW5pdCwgaWQsIGNiKSB7XG4gICAgaWYgKCFjaFtpZF0pIHtcbiAgICAgICAgdmFyIGZuU3RyID0gJycsIHRkXzEgPSB7fSwgbSA9IGZucy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG07ICsraSlcbiAgICAgICAgICAgIGZuU3RyID0gd2NsbihmbnNbaV0sIGZuU3RyLCB0ZF8xKTtcbiAgICAgICAgY2hbaWRdID0geyBjOiB3Y2xuKGZuc1ttXSwgZm5TdHIsIHRkXzEpLCBlOiB0ZF8xIH07XG4gICAgfVxuICAgIHZhciB0ZCA9IG1yZyh7fSwgY2hbaWRdLmUpO1xuICAgIHJldHVybiB3ayhjaFtpZF0uYyArICc7b25tZXNzYWdlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgayBpbiBlLmRhdGEpc2VsZltrXT1lLmRhdGFba107b25tZXNzYWdlPScgKyBpbml0LnRvU3RyaW5nKCkgKyAnfScsIGlkLCB0ZCwgY2Jmcyh0ZCksIGNiKTtcbn07XG4vLyBiYXNlIGFzeW5jIGluZmxhdGUgZm5cbnZhciBiSW5mbHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbdTgsIHUxNiwgaTMyLCBmbGViLCBmZGViLCBjbGltLCBmbCwgZmQsIGZscm0sIGZkcm0sIHJldiwgZWMsIGhNYXAsIG1heCwgYml0cywgYml0czE2LCBzaGZ0LCBzbGMsIGVyciwgaW5mbHQsIGluZmxhdGVTeW5jLCBwYmYsIGdvcHRdOyB9O1xudmFyIGJEZmx0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW3U4LCB1MTYsIGkzMiwgZmxlYiwgZmRlYiwgY2xpbSwgcmV2ZmwsIHJldmZkLCBmbG0sIGZsdCwgZmRtLCBmZHQsIHJldiwgZGVvLCBldCwgaE1hcCwgd2JpdHMsIHdiaXRzMTYsIGhUcmVlLCBsbiwgbGMsIGNsZW4sIHdmYmxrLCB3YmxrLCBzaGZ0LCBzbGMsIGRmbHQsIGRvcHQsIGRlZmxhdGVTeW5jLCBwYmZdOyB9O1xuLy8gZ3ppcCBleHRyYVxudmFyIGd6ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtnemgsIGd6aGwsIHdieXRlcywgY3JjLCBjcmN0XTsgfTtcbi8vIGd1bnppcCBleHRyYVxudmFyIGd1emUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbZ3pzLCBnemxdOyB9O1xuLy8gemxpYiBleHRyYVxudmFyIHpsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFt6bGgsIHdieXRlcywgYWRsZXJdOyB9O1xuLy8gdW56bGliIGV4dHJhXG52YXIgenVsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFt6bHNdOyB9O1xuLy8gcG9zdCBidWZcbnZhciBwYmYgPSBmdW5jdGlvbiAobXNnKSB7IHJldHVybiBwb3N0TWVzc2FnZShtc2csIFttc2cuYnVmZmVyXSk7IH07XG4vLyBnZXQgb3B0c1xudmFyIGdvcHQgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiB7XG4gICAgb3V0OiBvLnNpemUgJiYgbmV3IHU4KG8uc2l6ZSksXG4gICAgZGljdGlvbmFyeTogby5kaWN0aW9uYXJ5XG59OyB9O1xuLy8gYXN5bmMgaGVscGVyXG52YXIgY2JpZnkgPSBmdW5jdGlvbiAoZGF0LCBvcHRzLCBmbnMsIGluaXQsIGlkLCBjYikge1xuICAgIHZhciB3ID0gd3JrcihmbnMsIGluaXQsIGlkLCBmdW5jdGlvbiAoZXJyLCBkYXQpIHtcbiAgICAgICAgdy50ZXJtaW5hdGUoKTtcbiAgICAgICAgY2IoZXJyLCBkYXQpO1xuICAgIH0pO1xuICAgIHcucG9zdE1lc3NhZ2UoW2RhdCwgb3B0c10sIG9wdHMuY29uc3VtZSA/IFtkYXQuYnVmZmVyXSA6IFtdKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyB3LnRlcm1pbmF0ZSgpOyB9O1xufTtcbi8vIGF1dG8gc3RyZWFtXG52YXIgYXN0cm0gPSBmdW5jdGlvbiAoc3RybSkge1xuICAgIHN0cm0ub25kYXRhID0gZnVuY3Rpb24gKGRhdCwgZmluYWwpIHsgcmV0dXJuIHBvc3RNZXNzYWdlKFtkYXQsIGZpbmFsXSwgW2RhdC5idWZmZXJdKTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmIChldi5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RybS5wdXNoKGV2LmRhdGFbMF0sIGV2LmRhdGFbMV0pO1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoW2V2LmRhdGFbMF0ubGVuZ3RoXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3RybS5mbHVzaCgpO1xuICAgIH07XG59O1xuLy8gYXN5bmMgc3RyZWFtIGF0dGFjaFxudmFyIGFzdHJtaWZ5ID0gZnVuY3Rpb24gKGZucywgc3RybSwgb3B0cywgaW5pdCwgaWQsIGZsdXNoLCBleHQpIHtcbiAgICB2YXIgdDtcbiAgICB2YXIgdyA9IHdya3IoZm5zLCBpbml0LCBpZCwgZnVuY3Rpb24gKGVyciwgZGF0KSB7XG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICB3LnRlcm1pbmF0ZSgpLCBzdHJtLm9uZGF0YS5jYWxsKHN0cm0sIGVycik7XG4gICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGRhdCkpXG4gICAgICAgICAgICBleHQoZGF0KTtcbiAgICAgICAgZWxzZSBpZiAoZGF0Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICBzdHJtLnF1ZXVlZFNpemUgLT0gZGF0WzBdO1xuICAgICAgICAgICAgaWYgKHN0cm0ub25kcmFpbilcbiAgICAgICAgICAgICAgICBzdHJtLm9uZHJhaW4oZGF0WzBdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkYXRbMV0pXG4gICAgICAgICAgICAgICAgdy50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHN0cm0ub25kYXRhLmNhbGwoc3RybSwgZXJyLCBkYXRbMF0sIGRhdFsxXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB3LnBvc3RNZXNzYWdlKG9wdHMpO1xuICAgIHN0cm0ucXVldWVkU2l6ZSA9IDA7XG4gICAgc3RybS5wdXNoID0gZnVuY3Rpb24gKGQsIGYpIHtcbiAgICAgICAgaWYgKCFzdHJtLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICBzdHJtLm9uZGF0YShlcnIoNCwgMCwgMSksIG51bGwsICEhZik7XG4gICAgICAgIHN0cm0ucXVldWVkU2l6ZSArPSBkLmxlbmd0aDtcbiAgICAgICAgdy5wb3N0TWVzc2FnZShbZCwgdCA9IGZdLCBbZC5idWZmZXJdKTtcbiAgICB9O1xuICAgIHN0cm0udGVybWluYXRlID0gZnVuY3Rpb24gKCkgeyB3LnRlcm1pbmF0ZSgpOyB9O1xuICAgIGlmIChmbHVzaCkge1xuICAgICAgICBzdHJtLmZsdXNoID0gZnVuY3Rpb24gKCkgeyB3LnBvc3RNZXNzYWdlKFtdKTsgfTtcbiAgICB9XG59O1xuLy8gcmVhZCAyIGJ5dGVzXG52YXIgYjIgPSBmdW5jdGlvbiAoZCwgYikgeyByZXR1cm4gZFtiXSB8IChkW2IgKyAxXSA8PCA4KTsgfTtcbi8vIHJlYWQgNCBieXRlc1xudmFyIGI0ID0gZnVuY3Rpb24gKGQsIGIpIHsgcmV0dXJuIChkW2JdIHwgKGRbYiArIDFdIDw8IDgpIHwgKGRbYiArIDJdIDw8IDE2KSB8IChkW2IgKyAzXSA8PCAyNCkpID4+PiAwOyB9O1xudmFyIGI4ID0gZnVuY3Rpb24gKGQsIGIpIHsgcmV0dXJuIGI0KGQsIGIpICsgKGI0KGQsIGIgKyA0KSAqIDQyOTQ5NjcyOTYpOyB9O1xuLy8gd3JpdGUgYnl0ZXNcbnZhciB3Ynl0ZXMgPSBmdW5jdGlvbiAoZCwgYiwgdikge1xuICAgIGZvciAoOyB2OyArK2IpXG4gICAgICAgIGRbYl0gPSB2LCB2ID4+Pj0gODtcbn07XG4vLyBnemlwIGhlYWRlclxudmFyIGd6aCA9IGZ1bmN0aW9uIChjLCBvKSB7XG4gICAgdmFyIGZuID0gby5maWxlbmFtZTtcbiAgICBjWzBdID0gMzEsIGNbMV0gPSAxMzksIGNbMl0gPSA4LCBjWzhdID0gby5sZXZlbCA8IDIgPyA0IDogby5sZXZlbCA9PSA5ID8gMiA6IDAsIGNbOV0gPSAzOyAvLyBhc3N1bWUgVW5peFxuICAgIGlmIChvLm10aW1lICE9IDApXG4gICAgICAgIHdieXRlcyhjLCA0LCBNYXRoLmZsb29yKG5ldyBEYXRlKG8ubXRpbWUgfHwgRGF0ZS5ub3coKSkgLyAxMDAwKSk7XG4gICAgaWYgKGZuKSB7XG4gICAgICAgIGNbM10gPSA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBmbi5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNbaSArIDEwXSA9IGZuLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxufTtcbi8vIGd6aXAgZm9vdGVyOiAtOCB0byAtNCA9IENSQywgLTQgdG8gLTAgaXMgbGVuZ3RoXG4vLyBnemlwIHN0YXJ0XG52YXIgZ3pzID0gZnVuY3Rpb24gKGQpIHtcbiAgICBpZiAoZFswXSAhPSAzMSB8fCBkWzFdICE9IDEzOSB8fCBkWzJdICE9IDgpXG4gICAgICAgIGVycig2LCAnaW52YWxpZCBnemlwIGRhdGEnKTtcbiAgICB2YXIgZmxnID0gZFszXTtcbiAgICB2YXIgc3QgPSAxMDtcbiAgICBpZiAoZmxnICYgNClcbiAgICAgICAgc3QgKz0gKGRbMTBdIHwgZFsxMV0gPDwgOCkgKyAyO1xuICAgIGZvciAodmFyIHpzID0gKGZsZyA+PiAzICYgMSkgKyAoZmxnID4+IDQgJiAxKTsgenMgPiAwOyB6cyAtPSAhZFtzdCsrXSlcbiAgICAgICAgO1xuICAgIHJldHVybiBzdCArIChmbGcgJiAyKTtcbn07XG4vLyBnemlwIGxlbmd0aFxudmFyIGd6bCA9IGZ1bmN0aW9uIChkKSB7XG4gICAgdmFyIGwgPSBkLmxlbmd0aDtcbiAgICByZXR1cm4gKGRbbCAtIDRdIHwgZFtsIC0gM10gPDwgOCB8IGRbbCAtIDJdIDw8IDE2IHwgZFtsIC0gMV0gPDwgMjQpID4+PiAwO1xufTtcbi8vIGd6aXAgaGVhZGVyIGxlbmd0aFxudmFyIGd6aGwgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gMTAgKyAoby5maWxlbmFtZSA/IG8uZmlsZW5hbWUubGVuZ3RoICsgMSA6IDApOyB9O1xuLy8gemxpYiBoZWFkZXJcbnZhciB6bGggPSBmdW5jdGlvbiAoYywgbykge1xuICAgIHZhciBsdiA9IG8ubGV2ZWwsIGZsID0gbHYgPT0gMCA/IDAgOiBsdiA8IDYgPyAxIDogbHYgPT0gOSA/IDMgOiAyO1xuICAgIGNbMF0gPSAxMjAsIGNbMV0gPSAoZmwgPDwgNikgfCAoby5kaWN0aW9uYXJ5ICYmIDMyKTtcbiAgICBjWzFdIHw9IDMxIC0gKChjWzBdIDw8IDgpIHwgY1sxXSkgJSAzMTtcbiAgICBpZiAoby5kaWN0aW9uYXJ5KSB7XG4gICAgICAgIHZhciBoID0gYWRsZXIoKTtcbiAgICAgICAgaC5wKG8uZGljdGlvbmFyeSk7XG4gICAgICAgIHdieXRlcyhjLCAyLCBoLmQoKSk7XG4gICAgfVxufTtcbi8vIHpsaWIgc3RhcnRcbnZhciB6bHMgPSBmdW5jdGlvbiAoZCwgZGljdCkge1xuICAgIGlmICgoZFswXSAmIDE1KSAhPSA4IHx8IChkWzBdID4+IDQpID4gNyB8fCAoKGRbMF0gPDwgOCB8IGRbMV0pICUgMzEpKVxuICAgICAgICBlcnIoNiwgJ2ludmFsaWQgemxpYiBkYXRhJyk7XG4gICAgaWYgKChkWzFdID4+IDUgJiAxKSA9PSArIWRpY3QpXG4gICAgICAgIGVycig2LCAnaW52YWxpZCB6bGliIGRhdGE6ICcgKyAoZFsxXSAmIDMyID8gJ25lZWQnIDogJ3VuZXhwZWN0ZWQnKSArICcgZGljdGlvbmFyeScpO1xuICAgIHJldHVybiAoZFsxXSA+PiAzICYgNCkgKyAyO1xufTtcbmZ1bmN0aW9uIFN0cm1PcHQob3B0cywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICByZXR1cm4gb3B0cztcbn1cbi8qKlxuICogU3RyZWFtaW5nIERFRkxBVEUgY29tcHJlc3Npb25cbiAqL1xudmFyIERlZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmbGF0ZShvcHRzLCBjYikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgICAgICB0aGlzLm9uZGF0YSA9IGNiO1xuICAgICAgICB0aGlzLm8gPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLnMgPSB7IGw6IDAsIGk6IDMyNzY4LCB3OiAzMjc2OCwgejogMzI3NjggfTtcbiAgICAgICAgLy8gQnVmZmVyIGxlbmd0aCBtdXN0IGFsd2F5cyBiZSAwIG1vZCAzMjc2OCBmb3IgaW5kZXggY2FsY3VsYXRpb25zIHRvIGJlIGNvcnJlY3Qgd2hlbiBtb2RpZnlpbmcgaGVhZCBhbmQgcHJldlxuICAgICAgICAvLyA5ODMwNCA9IDMyNzY4IChsb29rYmFjaykgKyA2NTUzNiAoY29tbW9uIGNodW5rIHNpemUpXG4gICAgICAgIHRoaXMuYiA9IG5ldyB1OCg5ODMwNCk7XG4gICAgICAgIGlmICh0aGlzLm8uZGljdGlvbmFyeSkge1xuICAgICAgICAgICAgdmFyIGRpY3QgPSB0aGlzLm8uZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpO1xuICAgICAgICAgICAgdGhpcy5iLnNldChkaWN0LCAzMjc2OCAtIGRpY3QubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMucy5pID0gMzI3NjggLSBkaWN0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBEZWZsYXRlLnByb3RvdHlwZS5wID0gZnVuY3Rpb24gKGMsIGYpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEoZG9wdChjLCB0aGlzLm8sIDAsIDAsIHRoaXMucyksIGYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZGVmbGF0ZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKHRoaXMucy5sKVxuICAgICAgICAgICAgZXJyKDQpO1xuICAgICAgICB2YXIgZW5kTGVuID0gY2h1bmsubGVuZ3RoICsgdGhpcy5zLno7XG4gICAgICAgIGlmIChlbmRMZW4gPiB0aGlzLmIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZW5kTGVuID4gMiAqIHRoaXMuYi5sZW5ndGggLSAzMjc2OCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdCdWYgPSBuZXcgdTgoZW5kTGVuICYgLTMyNzY4KTtcbiAgICAgICAgICAgICAgICBuZXdCdWYuc2V0KHRoaXMuYi5zdWJhcnJheSgwLCB0aGlzLnMueikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYiA9IG5ld0J1ZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGxpdCA9IHRoaXMuYi5sZW5ndGggLSB0aGlzLnMuejtcbiAgICAgICAgICAgIHRoaXMuYi5zZXQoY2h1bmsuc3ViYXJyYXkoMCwgc3BsaXQpLCB0aGlzLnMueik7XG4gICAgICAgICAgICB0aGlzLnMueiA9IHRoaXMuYi5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnAodGhpcy5iLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmIuc2V0KHRoaXMuYi5zdWJhcnJheSgtMzI3NjgpKTtcbiAgICAgICAgICAgIHRoaXMuYi5zZXQoY2h1bmsuc3ViYXJyYXkoc3BsaXQpLCAzMjc2OCk7XG4gICAgICAgICAgICB0aGlzLnMueiA9IGNodW5rLmxlbmd0aCAtIHNwbGl0ICsgMzI3Njg7XG4gICAgICAgICAgICB0aGlzLnMuaSA9IDMyNzY2LCB0aGlzLnMudyA9IDMyNzY4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5iLnNldChjaHVuaywgdGhpcy5zLnopO1xuICAgICAgICAgICAgdGhpcy5zLnogKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucy5sID0gZmluYWwgJiAxO1xuICAgICAgICBpZiAodGhpcy5zLnogPiB0aGlzLnMudyArIDgxOTEgfHwgZmluYWwpIHtcbiAgICAgICAgICAgIHRoaXMucCh0aGlzLmIsIGZpbmFsIHx8IGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMucy53ID0gdGhpcy5zLmksIHRoaXMucy5pIC09IDI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgYnVmZmVyZWQgdW5jb21wcmVzc2VkIGRhdGEuIFVzZWZ1bCB0byBpbW1lZGlhdGVseSByZXRyaWV2ZSB0aGVcbiAgICAgKiBkZWZsYXRlZCBvdXRwdXQgZm9yIHNtYWxsIGlucHV0cy5cbiAgICAgKi9cbiAgICBEZWZsYXRlLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKHRoaXMucy5sKVxuICAgICAgICAgICAgZXJyKDQpO1xuICAgICAgICB0aGlzLnAodGhpcy5iLCBmYWxzZSk7XG4gICAgICAgIHRoaXMucy53ID0gdGhpcy5zLmksIHRoaXMucy5pIC09IDI7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBEZWZsYXRlIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgREVGTEFURSBjb21wcmVzc2lvblxuICovXG52YXIgQXN5bmNEZWZsYXRlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jRGVmbGF0ZShvcHRzLCBjYikge1xuICAgICAgICBhc3RybWlmeShbXG4gICAgICAgICAgICBiRGZsdCxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFthc3RybSwgRGVmbGF0ZV07IH1cbiAgICAgICAgXSwgdGhpcywgU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc3RybSA9IG5ldyBEZWZsYXRlKGV2LmRhdGEpO1xuICAgICAgICAgICAgb25tZXNzYWdlID0gYXN0cm0oc3RybSk7XG4gICAgICAgIH0sIDYsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNEZWZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jRGVmbGF0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmxhdGUoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICByZXR1cm4gY2JpZnkoZGF0YSwgb3B0cywgW1xuICAgICAgICBiRGZsdCxcbiAgICBdLCBmdW5jdGlvbiAoZXYpIHsgcmV0dXJuIHBiZihkZWZsYXRlU3luYyhldi5kYXRhWzBdLCBldi5kYXRhWzFdKSk7IH0sIDAsIGNiKTtcbn1cbi8qKlxuICogQ29tcHJlc3NlcyBkYXRhIHdpdGggREVGTEFURSB3aXRob3V0IGFueSB3cmFwcGVyXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGNvbXByZXNzaW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBkZWZsYXRlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZsYXRlU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgcmV0dXJuIGRvcHQoZGF0YSwgb3B0cyB8fCB7fSwgMCwgMCk7XG59XG4vKipcbiAqIFN0cmVhbWluZyBERUZMQVRFIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIEluZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5mbGF0ZShvcHRzLCBjYikge1xuICAgICAgICAvLyBubyBTdHJtT3B0IGhlcmUgdG8gYXZvaWQgYWRkaW5nIHRvIHdvcmtlcml6ZXJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICAgICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICAgICAgdmFyIGRpY3QgPSBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSAmJiBvcHRzLmRpY3Rpb25hcnkuc3ViYXJyYXkoLTMyNzY4KTtcbiAgICAgICAgdGhpcy5zID0geyBpOiAwLCBiOiBkaWN0ID8gZGljdC5sZW5ndGggOiAwIH07XG4gICAgICAgIHRoaXMubyA9IG5ldyB1OCgzMjc2OCk7XG4gICAgICAgIHRoaXMucCA9IG5ldyB1OCgwKTtcbiAgICAgICAgaWYgKGRpY3QpXG4gICAgICAgICAgICB0aGlzLm8uc2V0KGRpY3QpO1xuICAgIH1cbiAgICBJbmZsYXRlLnByb3RvdHlwZS5lID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKHRoaXMuZClcbiAgICAgICAgICAgIGVycig0KTtcbiAgICAgICAgaWYgKCF0aGlzLnAubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5wID0gYztcbiAgICAgICAgZWxzZSBpZiAoYy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IHU4KHRoaXMucC5sZW5ndGggKyBjLmxlbmd0aCk7XG4gICAgICAgICAgICBuLnNldCh0aGlzLnApLCBuLnNldChjLCB0aGlzLnAubGVuZ3RoKSwgdGhpcy5wID0gbjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5mbGF0ZS5wcm90b3R5cGUuYyA9IGZ1bmN0aW9uIChmaW5hbCkge1xuICAgICAgICB0aGlzLnMuaSA9ICsodGhpcy5kID0gZmluYWwgfHwgZmFsc2UpO1xuICAgICAgICB2YXIgYnRzID0gdGhpcy5zLmI7XG4gICAgICAgIHZhciBkdCA9IGluZmx0KHRoaXMucCwgdGhpcy5zLCB0aGlzLm8pO1xuICAgICAgICB0aGlzLm9uZGF0YShzbGMoZHQsIGJ0cywgdGhpcy5zLmIpLCB0aGlzLmQpO1xuICAgICAgICB0aGlzLm8gPSBzbGMoZHQsIHRoaXMucy5iIC0gMzI3NjgpLCB0aGlzLnMuYiA9IHRoaXMuby5sZW5ndGg7XG4gICAgICAgIHRoaXMucCA9IHNsYyh0aGlzLnAsICh0aGlzLnMucCAvIDgpIHwgMCksIHRoaXMucy5wICY9IDc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSBpbmZsYXRlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGZpbmFsIGNodW5rXG4gICAgICovXG4gICAgSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdGhpcy5lKGNodW5rKSwgdGhpcy5jKGZpbmFsKTtcbiAgICB9O1xuICAgIHJldHVybiBJbmZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IEluZmxhdGUgfTtcbi8qKlxuICogQXN5bmNocm9ub3VzIHN0cmVhbWluZyBERUZMQVRFIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jSW5mbGF0ZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY0luZmxhdGUob3B0cywgY2IpIHtcbiAgICAgICAgYXN0cm1pZnkoW1xuICAgICAgICAgICAgYkluZmx0LFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2FzdHJtLCBJbmZsYXRlXTsgfVxuICAgICAgICBdLCB0aGlzLCBTdHJtT3B0LmNhbGwodGhpcywgb3B0cywgY2IpLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBzdHJtID0gbmV3IEluZmxhdGUoZXYuZGF0YSk7XG4gICAgICAgICAgICBvbm1lc3NhZ2UgPSBhc3RybShzdHJtKTtcbiAgICAgICAgfSwgNywgMCk7XG4gICAgfVxuICAgIHJldHVybiBBc3luY0luZmxhdGU7XG59KCkpO1xuZXhwb3J0IHsgQXN5bmNJbmZsYXRlIH07XG5leHBvcnQgZnVuY3Rpb24gaW5mbGF0ZShkYXRhLCBvcHRzLCBjYikge1xuICAgIGlmICghY2IpXG4gICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY2IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZXJyKDcpO1xuICAgIHJldHVybiBjYmlmeShkYXRhLCBvcHRzLCBbXG4gICAgICAgIGJJbmZsdFxuICAgIF0sIGZ1bmN0aW9uIChldikgeyByZXR1cm4gcGJmKGluZmxhdGVTeW5jKGV2LmRhdGFbMF0sIGdvcHQoZXYuZGF0YVsxXSkpKTsgfSwgMSwgY2IpO1xufVxuLyoqXG4gKiBFeHBhbmRzIERFRkxBVEUgZGF0YSB3aXRoIG5vIHdyYXBwZXJcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29tcHJlc3NcbiAqIEBwYXJhbSBvcHRzIFRoZSBkZWNvbXByZXNzaW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbGF0ZVN5bmMoZGF0YSwgb3B0cykge1xuICAgIHJldHVybiBpbmZsdChkYXRhLCB7IGk6IDIgfSwgb3B0cyAmJiBvcHRzLm91dCwgb3B0cyAmJiBvcHRzLmRpY3Rpb25hcnkpO1xufVxuLy8gYmVmb3JlIHlvdSB5ZWxsIGF0IG1lIGZvciBub3QganVzdCB1c2luZyBleHRlbmRzLCBteSByZWFzb24gaXMgdGhhdCBUUyBpbmhlcml0YW5jZSBpcyBoYXJkIHRvIHdvcmtlcml6ZS5cbi8qKlxuICogU3RyZWFtaW5nIEdaSVAgY29tcHJlc3Npb25cbiAqL1xudmFyIEd6aXAgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gR3ppcChvcHRzLCBjYikge1xuICAgICAgICB0aGlzLmMgPSBjcmMoKTtcbiAgICAgICAgdGhpcy5sID0gMDtcbiAgICAgICAgdGhpcy52ID0gMTtcbiAgICAgICAgRGVmbGF0ZS5jYWxsKHRoaXMsIG9wdHMsIGNiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgR1pJUHBlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBHemlwLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0aGlzLmMucChjaHVuayk7XG4gICAgICAgIHRoaXMubCArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIERlZmxhdGUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgR3ppcC5wcm90b3R5cGUucCA9IGZ1bmN0aW9uIChjLCBmKSB7XG4gICAgICAgIHZhciByYXcgPSBkb3B0KGMsIHRoaXMubywgdGhpcy52ICYmIGd6aGwodGhpcy5vKSwgZiAmJiA4LCB0aGlzLnMpO1xuICAgICAgICBpZiAodGhpcy52KVxuICAgICAgICAgICAgZ3poKHJhdywgdGhpcy5vKSwgdGhpcy52ID0gMDtcbiAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICB3Ynl0ZXMocmF3LCByYXcubGVuZ3RoIC0gOCwgdGhpcy5jLmQoKSksIHdieXRlcyhyYXcsIHJhdy5sZW5ndGggLSA0LCB0aGlzLmwpO1xuICAgICAgICB0aGlzLm9uZGF0YShyYXcsIGYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmx1c2hlcyBidWZmZXJlZCB1bmNvbXByZXNzZWQgZGF0YS4gVXNlZnVsIHRvIGltbWVkaWF0ZWx5IHJldHJpZXZlIHRoZVxuICAgICAqIEdaSVBwZWQgb3V0cHV0IGZvciBzbWFsbCBpbnB1dHMuXG4gICAgICovXG4gICAgR3ppcC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIERlZmxhdGUucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICByZXR1cm4gR3ppcDtcbn0oKSk7XG5leHBvcnQgeyBHemlwIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgR1pJUCBjb21wcmVzc2lvblxuICovXG52YXIgQXN5bmNHemlwID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jR3ppcChvcHRzLCBjYikge1xuICAgICAgICBhc3RybWlmeShbXG4gICAgICAgICAgICBiRGZsdCxcbiAgICAgICAgICAgIGd6ZSxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFthc3RybSwgRGVmbGF0ZSwgR3ppcF07IH1cbiAgICAgICAgXSwgdGhpcywgU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc3RybSA9IG5ldyBHemlwKGV2LmRhdGEpO1xuICAgICAgICAgICAgb25tZXNzYWdlID0gYXN0cm0oc3RybSk7XG4gICAgICAgIH0sIDgsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNHemlwO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jR3ppcCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGd6aXAoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICByZXR1cm4gY2JpZnkoZGF0YSwgb3B0cywgW1xuICAgICAgICBiRGZsdCxcbiAgICAgICAgZ3plLFxuICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbZ3ppcFN5bmNdOyB9XG4gICAgXSwgZnVuY3Rpb24gKGV2KSB7IHJldHVybiBwYmYoZ3ppcFN5bmMoZXYuZGF0YVswXSwgZXYuZGF0YVsxXSkpOyB9LCAyLCBjYik7XG59XG4vKipcbiAqIENvbXByZXNzZXMgZGF0YSB3aXRoIEdaSVBcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGNvbXByZXNzXG4gKiBAcGFyYW0gb3B0cyBUaGUgY29tcHJlc3Npb24gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGd6aXBwZWQgdmVyc2lvbiBvZiB0aGUgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3ppcFN5bmMoZGF0YSwgb3B0cykge1xuICAgIGlmICghb3B0cylcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgIHZhciBjID0gY3JjKCksIGwgPSBkYXRhLmxlbmd0aDtcbiAgICBjLnAoZGF0YSk7XG4gICAgdmFyIGQgPSBkb3B0KGRhdGEsIG9wdHMsIGd6aGwob3B0cyksIDgpLCBzID0gZC5sZW5ndGg7XG4gICAgcmV0dXJuIGd6aChkLCBvcHRzKSwgd2J5dGVzKGQsIHMgLSA4LCBjLmQoKSksIHdieXRlcyhkLCBzIC0gNCwgbCksIGQ7XG59XG4vKipcbiAqIFN0cmVhbWluZyBzaW5nbGUgb3IgbXVsdGktbWVtYmVyIEdaSVAgZGVjb21wcmVzc2lvblxuICovXG52YXIgR3VuemlwID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEd1bnppcChvcHRzLCBjYikge1xuICAgICAgICB0aGlzLnYgPSAxO1xuICAgICAgICB0aGlzLnIgPSAwO1xuICAgICAgICBJbmZsYXRlLmNhbGwodGhpcywgb3B0cywgY2IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSBHVU5aSVBwZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgR3VuemlwLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBJbmZsYXRlLnByb3RvdHlwZS5lLmNhbGwodGhpcywgY2h1bmspO1xuICAgICAgICB0aGlzLnIgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy52KSB7XG4gICAgICAgICAgICB2YXIgcCA9IHRoaXMucC5zdWJhcnJheSh0aGlzLnYgLSAxKTtcbiAgICAgICAgICAgIHZhciBzID0gcC5sZW5ndGggPiAzID8gZ3pzKHApIDogNDtcbiAgICAgICAgICAgIGlmIChzID4gcC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbmFsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnYgPiAxICYmIHRoaXMub25tZW1iZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubWVtYmVyKHRoaXMuciAtIHAubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucCA9IHAuc3ViYXJyYXkocyksIHRoaXMudiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgVFMgZnJvbSB1c2luZyB0aGUgY2xvc3VyZSB2YWx1ZVxuICAgICAgICAvLyBUaGlzIGFsbG93cyBmb3Igd29ya2VyaXphdGlvbiB0byBmdW5jdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgSW5mbGF0ZS5wcm90b3R5cGUuYy5jYWxsKHRoaXMsIGZpbmFsKTtcbiAgICAgICAgLy8gcHJvY2VzcyBjb25jYXRlbmF0ZWQgR1pJUFxuICAgICAgICBpZiAodGhpcy5zLmYgJiYgIXRoaXMucy5sICYmICFmaW5hbCkge1xuICAgICAgICAgICAgdGhpcy52ID0gc2hmdCh0aGlzLnMucCkgKyA5O1xuICAgICAgICAgICAgdGhpcy5zID0geyBpOiAwIH07XG4gICAgICAgICAgICB0aGlzLm8gPSBuZXcgdTgoMCk7XG4gICAgICAgICAgICB0aGlzLnB1c2gobmV3IHU4KDApLCBmaW5hbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBHdW56aXA7XG59KCkpO1xuZXhwb3J0IHsgR3VuemlwIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgc2luZ2xlIG9yIG11bHRpLW1lbWJlciBHWklQIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jR3VuemlwID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jR3VuemlwKG9wdHMsIGNiKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGFzdHJtaWZ5KFtcbiAgICAgICAgICAgIGJJbmZsdCxcbiAgICAgICAgICAgIGd1emUsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbYXN0cm0sIEluZmxhdGUsIEd1bnppcF07IH1cbiAgICAgICAgXSwgdGhpcywgU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc3RybSA9IG5ldyBHdW56aXAoZXYuZGF0YSk7XG4gICAgICAgICAgICBzdHJtLm9ubWVtYmVyID0gZnVuY3Rpb24gKG9mZnNldCkgeyByZXR1cm4gcG9zdE1lc3NhZ2Uob2Zmc2V0KTsgfTtcbiAgICAgICAgICAgIG9ubWVzc2FnZSA9IGFzdHJtKHN0cm0pO1xuICAgICAgICB9LCA5LCAwLCBmdW5jdGlvbiAob2Zmc2V0KSB7IHJldHVybiBfdGhpcy5vbm1lbWJlciAmJiBfdGhpcy5vbm1lbWJlcihvZmZzZXQpOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIEFzeW5jR3VuemlwO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jR3VuemlwIH07XG5leHBvcnQgZnVuY3Rpb24gZ3VuemlwKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgcmV0dXJuIGNiaWZ5KGRhdGEsIG9wdHMsIFtcbiAgICAgICAgYkluZmx0LFxuICAgICAgICBndXplLFxuICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbZ3VuemlwU3luY107IH1cbiAgICBdLCBmdW5jdGlvbiAoZXYpIHsgcmV0dXJuIHBiZihndW56aXBTeW5jKGV2LmRhdGFbMF0sIGV2LmRhdGFbMV0pKTsgfSwgMywgY2IpO1xufVxuLyoqXG4gKiBFeHBhbmRzIEdaSVAgZGF0YVxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb21wcmVzc1xuICogQHBhcmFtIG9wdHMgVGhlIGRlY29tcHJlc3Npb24gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndW56aXBTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICB2YXIgc3QgPSBnenMoZGF0YSk7XG4gICAgaWYgKHN0ICsgOCA+IGRhdGEubGVuZ3RoKVxuICAgICAgICBlcnIoNiwgJ2ludmFsaWQgZ3ppcCBkYXRhJyk7XG4gICAgcmV0dXJuIGluZmx0KGRhdGEuc3ViYXJyYXkoc3QsIC04KSwgeyBpOiAyIH0sIG9wdHMgJiYgb3B0cy5vdXQgfHwgbmV3IHU4KGd6bChkYXRhKSksIG9wdHMgJiYgb3B0cy5kaWN0aW9uYXJ5KTtcbn1cbi8qKlxuICogU3RyZWFtaW5nIFpsaWIgY29tcHJlc3Npb25cbiAqL1xudmFyIFpsaWIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gWmxpYihvcHRzLCBjYikge1xuICAgICAgICB0aGlzLmMgPSBhZGxlcigpO1xuICAgICAgICB0aGlzLnYgPSAxO1xuICAgICAgICBEZWZsYXRlLmNhbGwodGhpcywgb3B0cywgY2IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSB6bGliYmVkXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwdXNoXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIFpsaWIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIHRoaXMuYy5wKGNodW5rKTtcbiAgICAgICAgRGVmbGF0ZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBmaW5hbCk7XG4gICAgfTtcbiAgICBabGliLnByb3RvdHlwZS5wID0gZnVuY3Rpb24gKGMsIGYpIHtcbiAgICAgICAgdmFyIHJhdyA9IGRvcHQoYywgdGhpcy5vLCB0aGlzLnYgJiYgKHRoaXMuby5kaWN0aW9uYXJ5ID8gNiA6IDIpLCBmICYmIDQsIHRoaXMucyk7XG4gICAgICAgIGlmICh0aGlzLnYpXG4gICAgICAgICAgICB6bGgocmF3LCB0aGlzLm8pLCB0aGlzLnYgPSAwO1xuICAgICAgICBpZiAoZilcbiAgICAgICAgICAgIHdieXRlcyhyYXcsIHJhdy5sZW5ndGggLSA0LCB0aGlzLmMuZCgpKTtcbiAgICAgICAgdGhpcy5vbmRhdGEocmF3LCBmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgYnVmZmVyZWQgdW5jb21wcmVzc2VkIGRhdGEuIFVzZWZ1bCB0byBpbW1lZGlhdGVseSByZXRyaWV2ZSB0aGVcbiAgICAgKiB6bGliYmVkIG91dHB1dCBmb3Igc21hbGwgaW5wdXRzLlxuICAgICAqL1xuICAgIFpsaWIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBEZWZsYXRlLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFpsaWI7XG59KCkpO1xuZXhwb3J0IHsgWmxpYiB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIFpsaWIgY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jWmxpYiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3luY1psaWIob3B0cywgY2IpIHtcbiAgICAgICAgYXN0cm1pZnkoW1xuICAgICAgICAgICAgYkRmbHQsXG4gICAgICAgICAgICB6bGUsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbYXN0cm0sIERlZmxhdGUsIFpsaWJdOyB9XG4gICAgICAgIF0sIHRoaXMsIFN0cm1PcHQuY2FsbCh0aGlzLCBvcHRzLCBjYiksIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHN0cm0gPSBuZXcgWmxpYihldi5kYXRhKTtcbiAgICAgICAgICAgIG9ubWVzc2FnZSA9IGFzdHJtKHN0cm0pO1xuICAgICAgICB9LCAxMCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBBc3luY1psaWI7XG59KCkpO1xuZXhwb3J0IHsgQXN5bmNabGliIH07XG5leHBvcnQgZnVuY3Rpb24gemxpYihkYXRhLCBvcHRzLCBjYikge1xuICAgIGlmICghY2IpXG4gICAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY2IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZXJyKDcpO1xuICAgIHJldHVybiBjYmlmeShkYXRhLCBvcHRzLCBbXG4gICAgICAgIGJEZmx0LFxuICAgICAgICB6bGUsXG4gICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFt6bGliU3luY107IH1cbiAgICBdLCBmdW5jdGlvbiAoZXYpIHsgcmV0dXJuIHBiZih6bGliU3luYyhldi5kYXRhWzBdLCBldi5kYXRhWzFdKSk7IH0sIDQsIGNiKTtcbn1cbi8qKlxuICogQ29tcHJlc3MgZGF0YSB3aXRoIFpsaWJcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGNvbXByZXNzXG4gKiBAcGFyYW0gb3B0cyBUaGUgY29tcHJlc3Npb24gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIHpsaWItY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6bGliU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgaWYgKCFvcHRzKVxuICAgICAgICBvcHRzID0ge307XG4gICAgdmFyIGEgPSBhZGxlcigpO1xuICAgIGEucChkYXRhKTtcbiAgICB2YXIgZCA9IGRvcHQoZGF0YSwgb3B0cywgb3B0cy5kaWN0aW9uYXJ5ID8gNiA6IDIsIDQpO1xuICAgIHJldHVybiB6bGgoZCwgb3B0cyksIHdieXRlcyhkLCBkLmxlbmd0aCAtIDQsIGEuZCgpKSwgZDtcbn1cbi8qKlxuICogU3RyZWFtaW5nIFpsaWIgZGVjb21wcmVzc2lvblxuICovXG52YXIgVW56bGliID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFVuemxpYihvcHRzLCBjYikge1xuICAgICAgICBJbmZsYXRlLmNhbGwodGhpcywgb3B0cywgY2IpO1xuICAgICAgICB0aGlzLnYgPSBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSA/IDIgOiAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSB1bnpsaWJiZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgVW56bGliLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBJbmZsYXRlLnByb3RvdHlwZS5lLmNhbGwodGhpcywgY2h1bmspO1xuICAgICAgICBpZiAodGhpcy52KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wLmxlbmd0aCA8IDYgJiYgIWZpbmFsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMucCA9IHRoaXMucC5zdWJhcnJheSh6bHModGhpcy5wLCB0aGlzLnYgLSAxKSksIHRoaXMudiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICAgICAgZXJyKDYsICdpbnZhbGlkIHpsaWIgZGF0YScpO1xuICAgICAgICAgICAgdGhpcy5wID0gdGhpcy5wLnN1YmFycmF5KDAsIC00KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZWNlc3NhcnkgdG8gcHJldmVudCBUUyBmcm9tIHVzaW5nIHRoZSBjbG9zdXJlIHZhbHVlXG4gICAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciB3b3JrZXJpemF0aW9uIHRvIGZ1bmN0aW9uIGNvcnJlY3RseVxuICAgICAgICBJbmZsYXRlLnByb3RvdHlwZS5jLmNhbGwodGhpcywgZmluYWwpO1xuICAgIH07XG4gICAgcmV0dXJuIFVuemxpYjtcbn0oKSk7XG5leHBvcnQgeyBVbnpsaWIgfTtcbi8qKlxuICogQXN5bmNocm9ub3VzIHN0cmVhbWluZyBabGliIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIEFzeW5jVW56bGliID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jVW56bGliKG9wdHMsIGNiKSB7XG4gICAgICAgIGFzdHJtaWZ5KFtcbiAgICAgICAgICAgIGJJbmZsdCxcbiAgICAgICAgICAgIHp1bGUsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBbYXN0cm0sIEluZmxhdGUsIFVuemxpYl07IH1cbiAgICAgICAgXSwgdGhpcywgU3RybU9wdC5jYWxsKHRoaXMsIG9wdHMsIGNiKSwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc3RybSA9IG5ldyBVbnpsaWIoZXYuZGF0YSk7XG4gICAgICAgICAgICBvbm1lc3NhZ2UgPSBhc3RybShzdHJtKTtcbiAgICAgICAgfSwgMTEsIDApO1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNVbnpsaWI7XG59KCkpO1xuZXhwb3J0IHsgQXN5bmNVbnpsaWIgfTtcbmV4cG9ydCBmdW5jdGlvbiB1bnpsaWIoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICByZXR1cm4gY2JpZnkoZGF0YSwgb3B0cywgW1xuICAgICAgICBiSW5mbHQsXG4gICAgICAgIHp1bGUsXG4gICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFt1bnpsaWJTeW5jXTsgfVxuICAgIF0sIGZ1bmN0aW9uIChldikgeyByZXR1cm4gcGJmKHVuemxpYlN5bmMoZXYuZGF0YVswXSwgZ29wdChldi5kYXRhWzFdKSkpOyB9LCA1LCBjYik7XG59XG4vKipcbiAqIEV4cGFuZHMgWmxpYiBkYXRhXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvbXByZXNzXG4gKiBAcGFyYW0gb3B0cyBUaGUgZGVjb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuemxpYlN5bmMoZGF0YSwgb3B0cykge1xuICAgIHJldHVybiBpbmZsdChkYXRhLnN1YmFycmF5KHpscyhkYXRhLCBvcHRzICYmIG9wdHMuZGljdGlvbmFyeSksIC00KSwgeyBpOiAyIH0sIG9wdHMgJiYgb3B0cy5vdXQsIG9wdHMgJiYgb3B0cy5kaWN0aW9uYXJ5KTtcbn1cbi8vIERlZmF1bHQgYWxnb3JpdGhtIGZvciBjb21wcmVzc2lvbiAodXNlZCBiZWNhdXNlIGhhdmluZyBhIGtub3duIG91dHB1dCBzaXplIGFsbG93cyBmYXN0ZXIgZGVjb21wcmVzc2lvbilcbmV4cG9ydCB7IGd6aXAgYXMgY29tcHJlc3MsIEFzeW5jR3ppcCBhcyBBc3luY0NvbXByZXNzIH07XG5leHBvcnQgeyBnemlwU3luYyBhcyBjb21wcmVzc1N5bmMsIEd6aXAgYXMgQ29tcHJlc3MgfTtcbi8qKlxuICogU3RyZWFtaW5nIEdaSVAsIFpsaWIsIG9yIHJhdyBERUZMQVRFIGRlY29tcHJlc3Npb25cbiAqL1xudmFyIERlY29tcHJlc3MgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVjb21wcmVzcyhvcHRzLCBjYikge1xuICAgICAgICB0aGlzLm8gPSBTdHJtT3B0LmNhbGwodGhpcywgb3B0cywgY2IpIHx8IHt9O1xuICAgICAgICB0aGlzLkcgPSBHdW56aXA7XG4gICAgICAgIHRoaXMuSSA9IEluZmxhdGU7XG4gICAgICAgIHRoaXMuWiA9IFVuemxpYjtcbiAgICB9XG4gICAgLy8gaW5pdCBzdWJzdHJlYW1cbiAgICAvLyBvdmVycmlkZW4gYnkgQXN5bmNEZWNvbXByZXNzXG4gICAgRGVjb21wcmVzcy5wcm90b3R5cGUuaSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zLm9uZGF0YSA9IGZ1bmN0aW9uIChkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICBfdGhpcy5vbmRhdGEoZGF0LCBmaW5hbCk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSBkZWNvbXByZXNzZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgRGVjb21wcmVzcy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKCF0aGlzLnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnAgJiYgdGhpcy5wLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHU4KHRoaXMucC5sZW5ndGggKyBjaHVuay5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4uc2V0KHRoaXMucCksIG4uc2V0KGNodW5rLCB0aGlzLnAubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnAgPSBjaHVuaztcbiAgICAgICAgICAgIGlmICh0aGlzLnAubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIHRoaXMucyA9ICh0aGlzLnBbMF0gPT0gMzEgJiYgdGhpcy5wWzFdID09IDEzOSAmJiB0aGlzLnBbMl0gPT0gOClcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgdGhpcy5HKHRoaXMubylcbiAgICAgICAgICAgICAgICAgICAgOiAoKHRoaXMucFswXSAmIDE1KSAhPSA4IHx8ICh0aGlzLnBbMF0gPj4gNCkgPiA3IHx8ICgodGhpcy5wWzBdIDw8IDggfCB0aGlzLnBbMV0pICUgMzEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgdGhpcy5JKHRoaXMubylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IHRoaXMuWih0aGlzLm8pO1xuICAgICAgICAgICAgICAgIHRoaXMuaSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucy5wdXNoKHRoaXMucCwgZmluYWwpO1xuICAgICAgICAgICAgICAgIHRoaXMucCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zLnB1c2goY2h1bmssIGZpbmFsKTtcbiAgICB9O1xuICAgIHJldHVybiBEZWNvbXByZXNzO1xufSgpKTtcbmV4cG9ydCB7IERlY29tcHJlc3MgfTtcbi8qKlxuICogQXN5bmNocm9ub3VzIHN0cmVhbWluZyBHWklQLCBabGliLCBvciByYXcgREVGTEFURSBkZWNvbXByZXNzaW9uXG4gKi9cbnZhciBBc3luY0RlY29tcHJlc3MgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN5bmNEZWNvbXByZXNzKG9wdHMsIGNiKSB7XG4gICAgICAgIERlY29tcHJlc3MuY2FsbCh0aGlzLCBvcHRzLCBjYik7XG4gICAgICAgIHRoaXMucXVldWVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuRyA9IEFzeW5jR3VuemlwO1xuICAgICAgICB0aGlzLkkgPSBBc3luY0luZmxhdGU7XG4gICAgICAgIHRoaXMuWiA9IEFzeW5jVW56bGliO1xuICAgIH1cbiAgICBBc3luY0RlY29tcHJlc3MucHJvdG90eXBlLmkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMucy5vbmRhdGEgPSBmdW5jdGlvbiAoZXJyLCBkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICBfdGhpcy5vbmRhdGEoZXJyLCBkYXQsIGZpbmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zLm9uZHJhaW4gPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICAgICAgX3RoaXMucXVldWVkU2l6ZSAtPSBzaXplO1xuICAgICAgICAgICAgaWYgKF90aGlzLm9uZHJhaW4pXG4gICAgICAgICAgICAgICAgX3RoaXMub25kcmFpbihzaXplKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhIGNodW5rIHRvIGJlIGRlY29tcHJlc3NlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBBc3luY0RlY29tcHJlc3MucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGZpbmFsKSB7XG4gICAgICAgIHRoaXMucXVldWVkU2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIERlY29tcHJlc3MucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgcmV0dXJuIEFzeW5jRGVjb21wcmVzcztcbn0oKSk7XG5leHBvcnQgeyBBc3luY0RlY29tcHJlc3MgfTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXByZXNzKGRhdGEsIG9wdHMsIGNiKSB7XG4gICAgaWYgKCFjYilcbiAgICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBjYiAhPSAnZnVuY3Rpb24nKVxuICAgICAgICBlcnIoNyk7XG4gICAgcmV0dXJuIChkYXRhWzBdID09IDMxICYmIGRhdGFbMV0gPT0gMTM5ICYmIGRhdGFbMl0gPT0gOClcbiAgICAgICAgPyBndW56aXAoZGF0YSwgb3B0cywgY2IpXG4gICAgICAgIDogKChkYXRhWzBdICYgMTUpICE9IDggfHwgKGRhdGFbMF0gPj4gNCkgPiA3IHx8ICgoZGF0YVswXSA8PCA4IHwgZGF0YVsxXSkgJSAzMSkpXG4gICAgICAgICAgICA/IGluZmxhdGUoZGF0YSwgb3B0cywgY2IpXG4gICAgICAgICAgICA6IHVuemxpYihkYXRhLCBvcHRzLCBjYik7XG59XG4vKipcbiAqIEV4cGFuZHMgY29tcHJlc3NlZCBHWklQLCBabGliLCBvciByYXcgREVGTEFURSBkYXRhLCBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyB0aGUgZm9ybWF0XG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvbXByZXNzXG4gKiBAcGFyYW0gb3B0cyBUaGUgZGVjb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcHJlc3NTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICByZXR1cm4gKGRhdGFbMF0gPT0gMzEgJiYgZGF0YVsxXSA9PSAxMzkgJiYgZGF0YVsyXSA9PSA4KVxuICAgICAgICA/IGd1bnppcFN5bmMoZGF0YSwgb3B0cylcbiAgICAgICAgOiAoKGRhdGFbMF0gJiAxNSkgIT0gOCB8fCAoZGF0YVswXSA+PiA0KSA+IDcgfHwgKChkYXRhWzBdIDw8IDggfCBkYXRhWzFdKSAlIDMxKSlcbiAgICAgICAgICAgID8gaW5mbGF0ZVN5bmMoZGF0YSwgb3B0cylcbiAgICAgICAgICAgIDogdW56bGliU3luYyhkYXRhLCBvcHRzKTtcbn1cbi8vIGZsYXR0ZW4gYSBkaXJlY3Rvcnkgc3RydWN0dXJlXG52YXIgZmx0biA9IGZ1bmN0aW9uIChkLCBwLCB0LCBvKSB7XG4gICAgZm9yICh2YXIgayBpbiBkKSB7XG4gICAgICAgIHZhciB2YWwgPSBkW2tdLCBuID0gcCArIGssIG9wID0gbztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICAgICAgICAgIG9wID0gbXJnKG8sIHZhbFsxXSksIHZhbCA9IHZhbFswXTtcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIHU4KVxuICAgICAgICAgICAgdFtuXSA9IFt2YWwsIG9wXTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0W24gKz0gJy8nXSA9IFtuZXcgdTgoMCksIG9wXTtcbiAgICAgICAgICAgIGZsdG4odmFsLCBuLCB0LCBvKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyB0ZXh0IGVuY29kZXJcbnZhciB0ZSA9IHR5cGVvZiBUZXh0RW5jb2RlciAhPSAndW5kZWZpbmVkJyAmJiAvKiNfX1BVUkVfXyovIG5ldyBUZXh0RW5jb2RlcigpO1xuLy8gdGV4dCBkZWNvZGVyXG52YXIgdGQgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gJ3VuZGVmaW5lZCcgJiYgLyojX19QVVJFX18qLyBuZXcgVGV4dERlY29kZXIoKTtcbi8vIHRleHQgZGVjb2RlciBzdHJlYW1cbnZhciB0ZHMgPSAwO1xudHJ5IHtcbiAgICB0ZC5kZWNvZGUoZXQsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgIHRkcyA9IDE7XG59XG5jYXRjaCAoZSkgeyB9XG4vLyBkZWNvZGUgVVRGOFxudmFyIGR1dGY4ID0gZnVuY3Rpb24gKGQpIHtcbiAgICBmb3IgKHZhciByID0gJycsIGkgPSAwOzspIHtcbiAgICAgICAgdmFyIGMgPSBkW2krK107XG4gICAgICAgIHZhciBlYiA9IChjID4gMTI3KSArIChjID4gMjIzKSArIChjID4gMjM5KTtcbiAgICAgICAgaWYgKGkgKyBlYiA+IGQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHsgczogciwgcjogc2xjKGQsIGkgLSAxKSB9O1xuICAgICAgICBpZiAoIWViKVxuICAgICAgICAgICAgciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBlbHNlIGlmIChlYiA9PSAzKSB7XG4gICAgICAgICAgICBjID0gKChjICYgMTUpIDw8IDE4IHwgKGRbaSsrXSAmIDYzKSA8PCAxMiB8IChkW2krK10gJiA2MykgPDwgNiB8IChkW2krK10gJiA2MykpIC0gNjU1MzYsXG4gICAgICAgICAgICAgICAgciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGMgPj4gMTApLCA1NjMyMCB8IChjICYgMTAyMykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGViICYgMSlcbiAgICAgICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDMxKSA8PCA2IHwgKGRbaSsrXSAmIDYzKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDE1KSA8PCAxMiB8IChkW2krK10gJiA2MykgPDwgNiB8IChkW2krK10gJiA2MykpO1xuICAgIH1cbn07XG4vKipcbiAqIFN0cmVhbWluZyBVVEYtOCBkZWNvZGluZ1xuICovXG52YXIgRGVjb2RlVVRGOCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgVVRGLTggZGVjb2Rpbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIGNiIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW5ldmVyIGRhdGEgaXMgZGVjb2RlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIERlY29kZVVURjgoY2IpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICAgICAgaWYgKHRkcylcbiAgICAgICAgICAgIHRoaXMudCA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnAgPSBldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZGVjb2RlZCBmcm9tIFVURi04IGJpbmFyeVxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBEZWNvZGVVVEY4LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBpZiAoIXRoaXMub25kYXRhKVxuICAgICAgICAgICAgZXJyKDUpO1xuICAgICAgICBmaW5hbCA9ICEhZmluYWw7XG4gICAgICAgIGlmICh0aGlzLnQpIHtcbiAgICAgICAgICAgIHRoaXMub25kYXRhKHRoaXMudC5kZWNvZGUoY2h1bmssIHsgc3RyZWFtOiB0cnVlIH0pLCBmaW5hbCk7XG4gICAgICAgICAgICBpZiAoZmluYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50LmRlY29kZSgpLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgZXJyKDgpO1xuICAgICAgICAgICAgICAgIHRoaXMudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnApXG4gICAgICAgICAgICBlcnIoNCk7XG4gICAgICAgIHZhciBkYXQgPSBuZXcgdTgodGhpcy5wLmxlbmd0aCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgIGRhdC5zZXQodGhpcy5wKTtcbiAgICAgICAgZGF0LnNldChjaHVuaywgdGhpcy5wLmxlbmd0aCk7XG4gICAgICAgIHZhciBfYSA9IGR1dGY4KGRhdCksIHMgPSBfYS5zLCByID0gX2EucjtcbiAgICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgICAgICBpZiAoci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZXJyKDgpO1xuICAgICAgICAgICAgdGhpcy5wID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnAgPSByO1xuICAgICAgICB0aGlzLm9uZGF0YShzLCBmaW5hbCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVjb2RlVVRGODtcbn0oKSk7XG5leHBvcnQgeyBEZWNvZGVVVEY4IH07XG4vKipcbiAqIFN0cmVhbWluZyBVVEYtOCBlbmNvZGluZ1xuICovXG52YXIgRW5jb2RlVVRGOCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgVVRGLTggZGVjb2Rpbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIGNiIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW5ldmVyIGRhdGEgaXMgZW5jb2RlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEVuY29kZVVURjgoY2IpIHtcbiAgICAgICAgdGhpcy5vbmRhdGEgPSBjYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZW5jb2RlZCB0byBVVEYtOFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgc3RyaW5nIGRhdGEgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBFbmNvZGVVVEY4LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBpZiAoIXRoaXMub25kYXRhKVxuICAgICAgICAgICAgZXJyKDUpO1xuICAgICAgICBpZiAodGhpcy5kKVxuICAgICAgICAgICAgZXJyKDQpO1xuICAgICAgICB0aGlzLm9uZGF0YShzdHJUb1U4KGNodW5rKSwgdGhpcy5kID0gZmluYWwgfHwgZmFsc2UpO1xuICAgIH07XG4gICAgcmV0dXJuIEVuY29kZVVURjg7XG59KCkpO1xuZXhwb3J0IHsgRW5jb2RlVVRGOCB9O1xuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgVWludDhBcnJheSBmb3IgdXNlIHdpdGggY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBtZXRob2RzXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcGFyYW0gbGF0aW4xIFdoZXRoZXIgb3Igbm90IHRvIGludGVycHJldCB0aGUgZGF0YSBhcyBMYXRpbi0xLiBUaGlzIHNob3VsZFxuICogICAgICAgICAgICAgICBub3QgbmVlZCB0byBiZSB0cnVlIHVubGVzcyBkZWNvZGluZyBhIGJpbmFyeSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIGVuY29kZWQgaW4gVVRGLTgvTGF0aW4tMSBiaW5hcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0clRvVTgoc3RyLCBsYXRpbjEpIHtcbiAgICBpZiAobGF0aW4xKSB7XG4gICAgICAgIHZhciBhcl8xID0gbmV3IHU4KHN0ci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGFyXzFbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgcmV0dXJuIGFyXzE7XG4gICAgfVxuICAgIGlmICh0ZSlcbiAgICAgICAgcmV0dXJuIHRlLmVuY29kZShzdHIpO1xuICAgIHZhciBsID0gc3RyLmxlbmd0aDtcbiAgICB2YXIgYXIgPSBuZXcgdTgoc3RyLmxlbmd0aCArIChzdHIubGVuZ3RoID4+IDEpKTtcbiAgICB2YXIgYWkgPSAwO1xuICAgIHZhciB3ID0gZnVuY3Rpb24gKHYpIHsgYXJbYWkrK10gPSB2OyB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmIChhaSArIDUgPiBhci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IHU4KGFpICsgOCArICgobCAtIGkpIDw8IDEpKTtcbiAgICAgICAgICAgIG4uc2V0KGFyKTtcbiAgICAgICAgICAgIGFyID0gbjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDEyOCB8fCBsYXRpbjEpXG4gICAgICAgICAgICB3KGMpO1xuICAgICAgICBlbHNlIGlmIChjIDwgMjA0OClcbiAgICAgICAgICAgIHcoMTkyIHwgKGMgPj4gNikpLCB3KDEyOCB8IChjICYgNjMpKTtcbiAgICAgICAgZWxzZSBpZiAoYyA+IDU1Mjk1ICYmIGMgPCA1NzM0NClcbiAgICAgICAgICAgIGMgPSA2NTUzNiArIChjICYgMTAyMyA8PCAxMCkgfCAoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDEwMjMpLFxuICAgICAgICAgICAgICAgIHcoMjQwIHwgKGMgPj4gMTgpKSwgdygxMjggfCAoKGMgPj4gMTIpICYgNjMpKSwgdygxMjggfCAoKGMgPj4gNikgJiA2MykpLCB3KDEyOCB8IChjICYgNjMpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdygyMjQgfCAoYyA+PiAxMikpLCB3KDEyOCB8ICgoYyA+PiA2KSAmIDYzKSksIHcoMTI4IHwgKGMgJiA2MykpO1xuICAgIH1cbiAgICByZXR1cm4gc2xjKGFyLCAwLCBhaSk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICogQHBhcmFtIGRhdCBUaGUgZGF0YSB0byBkZWNvZGUgdG8gc3RyaW5nXG4gKiBAcGFyYW0gbGF0aW4xIFdoZXRoZXIgb3Igbm90IHRvIGludGVycHJldCB0aGUgZGF0YSBhcyBMYXRpbi0xLiBUaGlzIHNob3VsZFxuICogICAgICAgICAgICAgICBub3QgbmVlZCB0byBiZSB0cnVlIHVubGVzcyBlbmNvZGluZyB0byBiaW5hcnkgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIG9yaWdpbmFsIFVURi04L0xhdGluLTEgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJGcm9tVTgoZGF0LCBsYXRpbjEpIHtcbiAgICBpZiAobGF0aW4xKSB7XG4gICAgICAgIHZhciByID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0Lmxlbmd0aDsgaSArPSAxNjM4NClcbiAgICAgICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXQuc3ViYXJyYXkoaSwgaSArIDE2Mzg0KSk7XG4gICAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICBlbHNlIGlmICh0ZCkge1xuICAgICAgICByZXR1cm4gdGQuZGVjb2RlKGRhdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgX2EgPSBkdXRmOChkYXQpLCBzID0gX2EucywgciA9IF9hLnI7XG4gICAgICAgIGlmIChyLmxlbmd0aClcbiAgICAgICAgICAgIGVycig4KTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxufVxuO1xuLy8gZGVmbGF0ZSBiaXQgZmxhZ1xudmFyIGRiZiA9IGZ1bmN0aW9uIChsKSB7IHJldHVybiBsID09IDEgPyAzIDogbCA8IDYgPyAyIDogbCA9PSA5ID8gMSA6IDA7IH07XG4vLyBza2lwIGxvY2FsIHppcCBoZWFkZXJcbnZhciBzbHpoID0gZnVuY3Rpb24gKGQsIGIpIHsgcmV0dXJuIGIgKyAzMCArIGIyKGQsIGIgKyAyNikgKyBiMihkLCBiICsgMjgpOyB9O1xuLy8gcmVhZCB6aXAgaGVhZGVyXG52YXIgemggPSBmdW5jdGlvbiAoZCwgYiwgeikge1xuICAgIHZhciBmbmwgPSBiMihkLCBiICsgMjgpLCBmbiA9IHN0ckZyb21VOChkLnN1YmFycmF5KGIgKyA0NiwgYiArIDQ2ICsgZm5sKSwgIShiMihkLCBiICsgOCkgJiAyMDQ4KSksIGVzID0gYiArIDQ2ICsgZm5sLCBicyA9IGI0KGQsIGIgKyAyMCk7XG4gICAgdmFyIF9hID0geiAmJiBicyA9PSA0Mjk0OTY3Mjk1ID8gejY0ZShkLCBlcykgOiBbYnMsIGI0KGQsIGIgKyAyNCksIGI0KGQsIGIgKyA0MildLCBzYyA9IF9hWzBdLCBzdSA9IF9hWzFdLCBvZmYgPSBfYVsyXTtcbiAgICByZXR1cm4gW2IyKGQsIGIgKyAxMCksIHNjLCBzdSwgZm4sIGVzICsgYjIoZCwgYiArIDMwKSArIGIyKGQsIGIgKyAzMiksIG9mZl07XG59O1xuLy8gcmVhZCB6aXA2NCBleHRyYSBmaWVsZFxudmFyIHo2NGUgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAoOyBiMihkLCBiKSAhPSAxOyBiICs9IDQgKyBiMihkLCBiICsgMikpXG4gICAgICAgIDtcbiAgICByZXR1cm4gW2I4KGQsIGIgKyAxMiksIGI4KGQsIGIgKyA0KSwgYjgoZCwgYiArIDIwKV07XG59O1xuLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG52YXIgZXhmbCA9IGZ1bmN0aW9uIChleCkge1xuICAgIHZhciBsZSA9IDA7XG4gICAgaWYgKGV4KSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gZXgpIHtcbiAgICAgICAgICAgIHZhciBsID0gZXhba10ubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGwgPiA2NTUzNSlcbiAgICAgICAgICAgICAgICBlcnIoOSk7XG4gICAgICAgICAgICBsZSArPSBsICsgNDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGU7XG59O1xuLy8gd3JpdGUgemlwIGhlYWRlclxudmFyIHd6aCA9IGZ1bmN0aW9uIChkLCBiLCBmLCBmbiwgdSwgYywgY2UsIGNvKSB7XG4gICAgdmFyIGZsID0gZm4ubGVuZ3RoLCBleCA9IGYuZXh0cmEsIGNvbCA9IGNvICYmIGNvLmxlbmd0aDtcbiAgICB2YXIgZXhsID0gZXhmbChleCk7XG4gICAgd2J5dGVzKGQsIGIsIGNlICE9IG51bGwgPyAweDIwMTRCNTAgOiAweDQwMzRCNTApLCBiICs9IDQ7XG4gICAgaWYgKGNlICE9IG51bGwpXG4gICAgICAgIGRbYisrXSA9IDIwLCBkW2IrK10gPSBmLm9zO1xuICAgIGRbYl0gPSAyMCwgYiArPSAyOyAvLyBzcGVjIGNvbXBsaWFuY2U/IHdoYXQncyB0aGF0P1xuICAgIGRbYisrXSA9IChmLmZsYWcgPDwgMSkgfCAoYyA8IDAgJiYgOCksIGRbYisrXSA9IHUgJiYgODtcbiAgICBkW2IrK10gPSBmLmNvbXByZXNzaW9uICYgMjU1LCBkW2IrK10gPSBmLmNvbXByZXNzaW9uID4+IDg7XG4gICAgdmFyIGR0ID0gbmV3IERhdGUoZi5tdGltZSA9PSBudWxsID8gRGF0ZS5ub3coKSA6IGYubXRpbWUpLCB5ID0gZHQuZ2V0RnVsbFllYXIoKSAtIDE5ODA7XG4gICAgaWYgKHkgPCAwIHx8IHkgPiAxMTkpXG4gICAgICAgIGVycigxMCk7XG4gICAgd2J5dGVzKGQsIGIsICh5IDw8IDI1KSB8ICgoZHQuZ2V0TW9udGgoKSArIDEpIDw8IDIxKSB8IChkdC5nZXREYXRlKCkgPDwgMTYpIHwgKGR0LmdldEhvdXJzKCkgPDwgMTEpIHwgKGR0LmdldE1pbnV0ZXMoKSA8PCA1KSB8IChkdC5nZXRTZWNvbmRzKCkgPj4gMSkpLCBiICs9IDQ7XG4gICAgaWYgKGMgIT0gLTEpIHtcbiAgICAgICAgd2J5dGVzKGQsIGIsIGYuY3JjKTtcbiAgICAgICAgd2J5dGVzKGQsIGIgKyA0LCBjIDwgMCA/IC1jIC0gMiA6IGMpO1xuICAgICAgICB3Ynl0ZXMoZCwgYiArIDgsIGYuc2l6ZSk7XG4gICAgfVxuICAgIHdieXRlcyhkLCBiICsgMTIsIGZsKTtcbiAgICB3Ynl0ZXMoZCwgYiArIDE0LCBleGwpLCBiICs9IDE2O1xuICAgIGlmIChjZSAhPSBudWxsKSB7XG4gICAgICAgIHdieXRlcyhkLCBiLCBjb2wpO1xuICAgICAgICB3Ynl0ZXMoZCwgYiArIDYsIGYuYXR0cnMpO1xuICAgICAgICB3Ynl0ZXMoZCwgYiArIDEwLCBjZSksIGIgKz0gMTQ7XG4gICAgfVxuICAgIGQuc2V0KGZuLCBiKTtcbiAgICBiICs9IGZsO1xuICAgIGlmIChleGwpIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiBleCkge1xuICAgICAgICAgICAgdmFyIGV4ZiA9IGV4W2tdLCBsID0gZXhmLmxlbmd0aDtcbiAgICAgICAgICAgIHdieXRlcyhkLCBiLCArayk7XG4gICAgICAgICAgICB3Ynl0ZXMoZCwgYiArIDIsIGwpO1xuICAgICAgICAgICAgZC5zZXQoZXhmLCBiICsgNCksIGIgKz0gNCArIGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbClcbiAgICAgICAgZC5zZXQoY28sIGIpLCBiICs9IGNvbDtcbiAgICByZXR1cm4gYjtcbn07XG4vLyB3cml0ZSB6aXAgZm9vdGVyIChlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkpXG52YXIgd3pmID0gZnVuY3Rpb24gKG8sIGIsIGMsIGQsIGUpIHtcbiAgICB3Ynl0ZXMobywgYiwgMHg2MDU0QjUwKTsgLy8gc2tpcCBkaXNrXG4gICAgd2J5dGVzKG8sIGIgKyA4LCBjKTtcbiAgICB3Ynl0ZXMobywgYiArIDEwLCBjKTtcbiAgICB3Ynl0ZXMobywgYiArIDEyLCBkKTtcbiAgICB3Ynl0ZXMobywgYiArIDE2LCBlKTtcbn07XG4vKipcbiAqIEEgcGFzcy10aHJvdWdoIHN0cmVhbSB0byBrZWVwIGRhdGEgdW5jb21wcmVzc2VkIGluIGEgWklQIGFyY2hpdmUuXG4gKi9cbnZhciBaaXBQYXNzVGhyb3VnaCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcGFzcy10aHJvdWdoIHN0cmVhbSB0aGF0IGNhbiBiZSBhZGRlZCB0byBaSVAgYXJjaGl2ZXNcbiAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgZGF0YSBzdHJlYW1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBaaXBQYXNzVGhyb3VnaChmaWxlbmFtZSkge1xuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgIHRoaXMuYyA9IGNyYygpO1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgY2h1bmsgYW5kIHB1c2hlcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4gWW91IGNhbiBvdmVycmlkZSB0aGlzXG4gICAgICogbWV0aG9kIGluIGEgc3ViY2xhc3MgZm9yIGN1c3RvbSBiZWhhdmlvciwgYnV0IGJ5IGRlZmF1bHQgdGhpcyBwYXNzZXNcbiAgICAgKiB0aGUgZGF0YSB0aHJvdWdoLiBZb3UgbXVzdCBjYWxsIHRoaXMub25kYXRhKGVyciwgY2h1bmssIGZpbmFsKSBhdCBzb21lXG4gICAgICogcG9pbnQgaW4gdGhpcyBtZXRob2QuXG4gICAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBwcm9jZXNzXG4gICAgICogQHBhcmFtIGZpbmFsIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBjaHVua1xuICAgICAqL1xuICAgIFppcFBhc3NUaHJvdWdoLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0aGlzLm9uZGF0YShudWxsLCBjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgYWRkZWQuIElmIHlvdSBhcmUgc3ViY2xhc3NpbmcgdGhpcyB3aXRoIGEgY3VzdG9tXG4gICAgICogY29tcHJlc3Npb24gYWxnb3JpdGhtLCBub3RlIHRoYXQgeW91IG11c3QgcHVzaCBkYXRhIGZyb20gdGhlIHNvdXJjZVxuICAgICAqIGZpbGUgb25seSwgcHJlLWNvbXByZXNzaW9uLlxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBaaXBQYXNzVGhyb3VnaC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgdGhpcy5jLnAoY2h1bmspO1xuICAgICAgICB0aGlzLnNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBpZiAoZmluYWwpXG4gICAgICAgICAgICB0aGlzLmNyYyA9IHRoaXMuYy5kKCk7XG4gICAgICAgIHRoaXMucHJvY2VzcyhjaHVuaywgZmluYWwgfHwgZmFsc2UpO1xuICAgIH07XG4gICAgcmV0dXJuIFppcFBhc3NUaHJvdWdoO1xufSgpKTtcbmV4cG9ydCB7IFppcFBhc3NUaHJvdWdoIH07XG4vLyBJIGRvbid0IGV4dGVuZCBiZWNhdXNlIFR5cGVTY3JpcHQgZXh0ZW5zaW9uIGFkZHMgMWtCIG9mIHJ1bnRpbWUgYmxvYXRcbi8qKlxuICogU3RyZWFtaW5nIERFRkxBVEUgY29tcHJlc3Npb24gZm9yIFpJUCBhcmNoaXZlcy4gUHJlZmVyIHVzaW5nIEFzeW5jWmlwRGVmbGF0ZVxuICogZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG52YXIgWmlwRGVmbGF0ZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgREVGTEFURSBzdHJlYW0gdGhhdCBjYW4gYmUgYWRkZWQgdG8gWklQIGFyY2hpdmVzXG4gICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGRhdGEgc3RyZWFtXG4gICAgICogQHBhcmFtIG9wdHMgVGhlIGNvbXByZXNzaW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBaaXBEZWZsYXRlKGZpbGVuYW1lLCBvcHRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cylcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgWmlwUGFzc1Rocm91Z2guY2FsbCh0aGlzLCBmaWxlbmFtZSk7XG4gICAgICAgIHRoaXMuZCA9IG5ldyBEZWZsYXRlKG9wdHMsIGZ1bmN0aW9uIChkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICBfdGhpcy5vbmRhdGEobnVsbCwgZGF0LCBmaW5hbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gODtcbiAgICAgICAgdGhpcy5mbGFnID0gZGJmKG9wdHMubGV2ZWwpO1xuICAgIH1cbiAgICBaaXBEZWZsYXRlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kLnB1c2goY2h1bmssIGZpbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbmRhdGEoZSwgbnVsbCwgZmluYWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSBkZWZsYXRlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBaaXBEZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBaaXBQYXNzVGhyb3VnaC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBmaW5hbCk7XG4gICAgfTtcbiAgICByZXR1cm4gWmlwRGVmbGF0ZTtcbn0oKSk7XG5leHBvcnQgeyBaaXBEZWZsYXRlIH07XG4vKipcbiAqIEFzeW5jaHJvbm91cyBzdHJlYW1pbmcgREVGTEFURSBjb21wcmVzc2lvbiBmb3IgWklQIGFyY2hpdmVzXG4gKi9cbnZhciBBc3luY1ppcERlZmxhdGUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhc3luY2hyb25vdXMgREVGTEFURSBzdHJlYW0gdGhhdCBjYW4gYmUgYWRkZWQgdG8gWklQIGFyY2hpdmVzXG4gICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGRhdGEgc3RyZWFtXG4gICAgICogQHBhcmFtIG9wdHMgVGhlIGNvbXByZXNzaW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBBc3luY1ppcERlZmxhdGUoZmlsZW5hbWUsIG9wdHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRzKVxuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICBaaXBQYXNzVGhyb3VnaC5jYWxsKHRoaXMsIGZpbGVuYW1lKTtcbiAgICAgICAgdGhpcy5kID0gbmV3IEFzeW5jRGVmbGF0ZShvcHRzLCBmdW5jdGlvbiAoZXJyLCBkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICBfdGhpcy5vbmRhdGEoZXJyLCBkYXQsIGZpbmFsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSA4O1xuICAgICAgICB0aGlzLmZsYWcgPSBkYmYob3B0cy5sZXZlbCk7XG4gICAgICAgIHRoaXMudGVybWluYXRlID0gdGhpcy5kLnRlcm1pbmF0ZTtcbiAgICB9XG4gICAgQXN5bmNaaXBEZWZsYXRlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICB0aGlzLmQucHVzaChjaHVuaywgZmluYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGEgY2h1bmsgdG8gYmUgZGVmbGF0ZWRcbiAgICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKiBAcGFyYW0gZmluYWwgV2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IGNodW5rXG4gICAgICovXG4gICAgQXN5bmNaaXBEZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBmaW5hbCkge1xuICAgICAgICBaaXBQYXNzVGhyb3VnaC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBmaW5hbCk7XG4gICAgfTtcbiAgICByZXR1cm4gQXN5bmNaaXBEZWZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jWmlwRGVmbGF0ZSB9O1xuLy8gVE9ETzogQmV0dGVyIHRyZWUgc2hha2luZ1xuLyoqXG4gKiBBIHppcHBhYmxlIGFyY2hpdmUgdG8gd2hpY2ggZmlsZXMgY2FuIGluY3JlbWVudGFsbHkgYmUgYWRkZWRcbiAqL1xudmFyIFppcCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IFpJUCBhcmNoaXZlIHRvIHdoaWNoIGZpbGVzIGNhbiBiZSBhZGRlZFxuICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuZXZlciBkYXRhIGZvciB0aGUgZ2VuZXJhdGVkIFpJUCBhcmNoaXZlXG4gICAgICogICAgICAgICAgIGlzIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFppcChjYikge1xuICAgICAgICB0aGlzLm9uZGF0YSA9IGNiO1xuICAgICAgICB0aGlzLnUgPSBbXTtcbiAgICAgICAgdGhpcy5kID0gMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZpbGUgdG8gdGhlIFpJUCBhcmNoaXZlXG4gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgc3RyZWFtIHRvIGFkZFxuICAgICAqL1xuICAgIFppcC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLm9uZGF0YSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgLy8gZmluaXNoaW5nIG9yIGZpbmlzaGVkXG4gICAgICAgIGlmICh0aGlzLmQgJiAyKVxuICAgICAgICAgICAgdGhpcy5vbmRhdGEoZXJyKDQgKyAodGhpcy5kICYgMSkgKiA4LCAwLCAxKSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmID0gc3RyVG9VOChmaWxlLmZpbGVuYW1lKSwgZmxfMSA9IGYubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGNvbSA9IGZpbGUuY29tbWVudCwgbyA9IGNvbSAmJiBzdHJUb1U4KGNvbSk7XG4gICAgICAgICAgICB2YXIgdSA9IGZsXzEgIT0gZmlsZS5maWxlbmFtZS5sZW5ndGggfHwgKG8gJiYgKGNvbS5sZW5ndGggIT0gby5sZW5ndGgpKTtcbiAgICAgICAgICAgIHZhciBobF8xID0gZmxfMSArIGV4ZmwoZmlsZS5leHRyYSkgKyAzMDtcbiAgICAgICAgICAgIGlmIChmbF8xID4gNjU1MzUpXG4gICAgICAgICAgICAgICAgdGhpcy5vbmRhdGEoZXJyKDExLCAwLCAxKSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IG5ldyB1OChobF8xKTtcbiAgICAgICAgICAgIHd6aChoZWFkZXIsIDAsIGZpbGUsIGYsIHUsIC0xKTtcbiAgICAgICAgICAgIHZhciBjaGtzXzEgPSBbaGVhZGVyXTtcbiAgICAgICAgICAgIHZhciBwQWxsXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBjaGtzXzIgPSBjaGtzXzE7IF9pIDwgY2hrc18yLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hrID0gY2hrc18yW19pXTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMub25kYXRhKG51bGwsIGNoaywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGtzXzEgPSBbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgdHJfMSA9IHRoaXMuZDtcbiAgICAgICAgICAgIHRoaXMuZCA9IDA7XG4gICAgICAgICAgICB2YXIgaW5kXzEgPSB0aGlzLnUubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHVmXzEgPSBtcmcoZmlsZSwge1xuICAgICAgICAgICAgICAgIGY6IGYsXG4gICAgICAgICAgICAgICAgdTogdSxcbiAgICAgICAgICAgICAgICBvOiBvLFxuICAgICAgICAgICAgICAgIHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUudGVybWluYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcEFsbF8xKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnh0ID0gX3RoaXMudVtpbmRfMSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG54dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBueHQucigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyXzEgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGNsXzEgPSAwO1xuICAgICAgICAgICAgZmlsZS5vbmRhdGEgPSBmdW5jdGlvbiAoZXJyLCBkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbmRhdGEoZXJyLCBkYXQsIGZpbmFsKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjbF8xICs9IGRhdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNoa3NfMS5wdXNoKGRhdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRkID0gbmV3IHU4KDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdieXRlcyhkZCwgMCwgMHg4MDc0QjUwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdieXRlcyhkZCwgNCwgZmlsZS5jcmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2J5dGVzKGRkLCA4LCBjbF8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdieXRlcyhkZCwgMTIsIGZpbGUuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGtzXzEucHVzaChkZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1Zl8xLmMgPSBjbF8xLCB1Zl8xLmIgPSBobF8xICsgY2xfMSArIDE2LCB1Zl8xLmNyYyA9IGZpbGUuY3JjLCB1Zl8xLnNpemUgPSBmaWxlLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJfMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Zl8xLnIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyXzEgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRyXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICBwQWxsXzEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy51LnB1c2godWZfMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuZHMgdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGZpbGVzIGFuZCBwcmVwYXJlcyB0byBlbWl0IHRoZSBmaW5hbCBjaHVua3MuXG4gICAgICogVGhpcyAqbXVzdCogYmUgY2FsbGVkIGFmdGVyIGFkZGluZyBhbGwgZGVzaXJlZCBmaWxlcyBmb3IgdGhlIHJlc3VsdGluZ1xuICAgICAqIFpJUCBmaWxlIHRvIHdvcmsgcHJvcGVybHkuXG4gICAgICovXG4gICAgWmlwLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLmQgJiAyKSB7XG4gICAgICAgICAgICB0aGlzLm9uZGF0YShlcnIoNCArICh0aGlzLmQgJiAxKSAqIDgsIDAsIDEpLCBudWxsLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kKVxuICAgICAgICAgICAgdGhpcy5lKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMudS5wdXNoKHtcbiAgICAgICAgICAgICAgICByOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKF90aGlzLmQgJiAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudS5zcGxpY2UoLTEsIDEpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0OiBmdW5jdGlvbiAoKSB7IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmQgPSAzO1xuICAgIH07XG4gICAgWmlwLnByb3RvdHlwZS5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnQgPSAwLCBsID0gMCwgdGwgPSAwO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy51OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGYgPSBfYVtfaV07XG4gICAgICAgICAgICB0bCArPSA0NiArIGYuZi5sZW5ndGggKyBleGZsKGYuZXh0cmEpICsgKGYubyA/IGYuby5sZW5ndGggOiAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0ID0gbmV3IHU4KHRsICsgMjIpO1xuICAgICAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gdGhpcy51OyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIGYgPSBfY1tfYl07XG4gICAgICAgICAgICB3emgob3V0LCBidCwgZiwgZi5mLCBmLnUsIC1mLmMgLSAyLCBsLCBmLm8pO1xuICAgICAgICAgICAgYnQgKz0gNDYgKyBmLmYubGVuZ3RoICsgZXhmbChmLmV4dHJhKSArIChmLm8gPyBmLm8ubGVuZ3RoIDogMCksIGwgKz0gZi5iO1xuICAgICAgICB9XG4gICAgICAgIHd6ZihvdXQsIGJ0LCB0aGlzLnUubGVuZ3RoLCB0bCwgbCk7XG4gICAgICAgIHRoaXMub25kYXRhKG51bGwsIG91dCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZCA9IDI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCB0byB0ZXJtaW5hdGUgYW55IGludGVybmFsIHdvcmtlcnMgdXNlZCBieSB0aGUgc3RyZWFtLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gYWRkKCkgd2lsbCBmYWlsLlxuICAgICAqL1xuICAgIFppcC5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy51OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGYgPSBfYVtfaV07XG4gICAgICAgICAgICBmLnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmQgPSAyO1xuICAgIH07XG4gICAgcmV0dXJuIFppcDtcbn0oKSk7XG5leHBvcnQgeyBaaXAgfTtcbmV4cG9ydCBmdW5jdGlvbiB6aXAoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICB2YXIgciA9IHt9O1xuICAgIGZsdG4oZGF0YSwgJycsIHIsIG9wdHMpO1xuICAgIHZhciBrID0gT2JqZWN0LmtleXMocik7XG4gICAgdmFyIGxmdCA9IGsubGVuZ3RoLCBvID0gMCwgdG90ID0gMDtcbiAgICB2YXIgc2xmdCA9IGxmdCwgZmlsZXMgPSBuZXcgQXJyYXkobGZ0KTtcbiAgICB2YXIgdGVybSA9IFtdO1xuICAgIHZhciB0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlcm0ubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICB0ZXJtW2ldKCk7XG4gICAgfTtcbiAgICB2YXIgY2JkID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgbXQoZnVuY3Rpb24gKCkgeyBjYihhLCBiKTsgfSk7XG4gICAgfTtcbiAgICBtdChmdW5jdGlvbiAoKSB7IGNiZCA9IGNiOyB9KTtcbiAgICB2YXIgY2JmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3V0ID0gbmV3IHU4KHRvdCArIDIyKSwgb2UgPSBvLCBjZGwgPSB0b3QgLSBvO1xuICAgICAgICB0b3QgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsZnQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGwgPSBmLmMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHd6aChvdXQsIHRvdCwgZiwgZi5mLCBmLnUsIGwpO1xuICAgICAgICAgICAgICAgIHZhciBiYWRkID0gMzAgKyBmLmYubGVuZ3RoICsgZXhmbChmLmV4dHJhKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jID0gdG90ICsgYmFkZDtcbiAgICAgICAgICAgICAgICBvdXQuc2V0KGYuYywgbG9jKTtcbiAgICAgICAgICAgICAgICB3emgob3V0LCBvLCBmLCBmLmYsIGYudSwgbCwgdG90LCBmLm0pLCBvICs9IDE2ICsgYmFkZCArIChmLm0gPyBmLm0ubGVuZ3RoIDogMCksIHRvdCA9IGxvYyArIGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYmQoZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd3pmKG91dCwgbywgZmlsZXMubGVuZ3RoLCBjZGwsIG9lKTtcbiAgICAgICAgY2JkKG51bGwsIG91dCk7XG4gICAgfTtcbiAgICBpZiAoIWxmdClcbiAgICAgICAgY2JmKCk7XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICB2YXIgZm4gPSBrW2ldO1xuICAgICAgICB2YXIgX2EgPSByW2ZuXSwgZmlsZSA9IF9hWzBdLCBwID0gX2FbMV07XG4gICAgICAgIHZhciBjID0gY3JjKCksIHNpemUgPSBmaWxlLmxlbmd0aDtcbiAgICAgICAgYy5wKGZpbGUpO1xuICAgICAgICB2YXIgZiA9IHN0clRvVTgoZm4pLCBzID0gZi5sZW5ndGg7XG4gICAgICAgIHZhciBjb20gPSBwLmNvbW1lbnQsIG0gPSBjb20gJiYgc3RyVG9VOChjb20pLCBtcyA9IG0gJiYgbS5sZW5ndGg7XG4gICAgICAgIHZhciBleGwgPSBleGZsKHAuZXh0cmEpO1xuICAgICAgICB2YXIgY29tcHJlc3Npb24gPSBwLmxldmVsID09IDAgPyAwIDogODtcbiAgICAgICAgdmFyIGNibCA9IGZ1bmN0aW9uIChlLCBkKSB7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgIHRBbGwoKTtcbiAgICAgICAgICAgICAgICBjYmQoZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbCA9IGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gbXJnKHAsIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY3JjOiBjLmQoKSxcbiAgICAgICAgICAgICAgICAgICAgYzogZCxcbiAgICAgICAgICAgICAgICAgICAgZjogZixcbiAgICAgICAgICAgICAgICAgICAgbTogbSxcbiAgICAgICAgICAgICAgICAgICAgdTogcyAhPSBmbi5sZW5ndGggfHwgKG0gJiYgKGNvbS5sZW5ndGggIT0gbXMpKSxcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb246IGNvbXByZXNzaW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbyArPSAzMCArIHMgKyBleGwgKyBsO1xuICAgICAgICAgICAgICAgIHRvdCArPSA3NiArIDIgKiAocyArIGV4bCkgKyAobXMgfHwgMCkgKyBsO1xuICAgICAgICAgICAgICAgIGlmICghLS1sZnQpXG4gICAgICAgICAgICAgICAgICAgIGNiZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAocyA+IDY1NTM1KVxuICAgICAgICAgICAgY2JsKGVycigxMSwgMCwgMSksIG51bGwpO1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9uKVxuICAgICAgICAgICAgY2JsKG51bGwsIGZpbGUpO1xuICAgICAgICBlbHNlIGlmIChzaXplIDwgMTYwMDAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNibChudWxsLCBkZWZsYXRlU3luYyhmaWxlLCBwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNibChlLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ZXJtLnB1c2goZGVmbGF0ZShmaWxlLCBwLCBjYmwpKTtcbiAgICB9O1xuICAgIC8vIENhbm5vdCB1c2UgbGZ0IGJlY2F1c2UgaXQgY2FuIGRlY3JlYXNlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGZ0OyArK2kpIHtcbiAgICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRBbGw7XG59XG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY3JlYXRlcyBhIFpJUCBmaWxlLiBQcmVmZXIgdXNpbmcgYHppcGAgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICogd2l0aCBtb3JlIHRoYW4gb25lIGZpbGUuXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgdGhlIFpJUCBhcmNoaXZlXG4gKiBAcGFyYW0gb3B0cyBUaGUgbWFpbiBvcHRpb25zLCBtZXJnZWQgd2l0aCBwZXItZmlsZSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIFpJUCBhcmNoaXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6aXBTeW5jKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpXG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICB2YXIgciA9IHt9O1xuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIGZsdG4oZGF0YSwgJycsIHIsIG9wdHMpO1xuICAgIHZhciBvID0gMDtcbiAgICB2YXIgdG90ID0gMDtcbiAgICBmb3IgKHZhciBmbiBpbiByKSB7XG4gICAgICAgIHZhciBfYSA9IHJbZm5dLCBmaWxlID0gX2FbMF0sIHAgPSBfYVsxXTtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uID0gcC5sZXZlbCA9PSAwID8gMCA6IDg7XG4gICAgICAgIHZhciBmID0gc3RyVG9VOChmbiksIHMgPSBmLmxlbmd0aDtcbiAgICAgICAgdmFyIGNvbSA9IHAuY29tbWVudCwgbSA9IGNvbSAmJiBzdHJUb1U4KGNvbSksIG1zID0gbSAmJiBtLmxlbmd0aDtcbiAgICAgICAgdmFyIGV4bCA9IGV4ZmwocC5leHRyYSk7XG4gICAgICAgIGlmIChzID4gNjU1MzUpXG4gICAgICAgICAgICBlcnIoMTEpO1xuICAgICAgICB2YXIgZCA9IGNvbXByZXNzaW9uID8gZGVmbGF0ZVN5bmMoZmlsZSwgcCkgOiBmaWxlLCBsID0gZC5sZW5ndGg7XG4gICAgICAgIHZhciBjID0gY3JjKCk7XG4gICAgICAgIGMucChmaWxlKTtcbiAgICAgICAgZmlsZXMucHVzaChtcmcocCwge1xuICAgICAgICAgICAgc2l6ZTogZmlsZS5sZW5ndGgsXG4gICAgICAgICAgICBjcmM6IGMuZCgpLFxuICAgICAgICAgICAgYzogZCxcbiAgICAgICAgICAgIGY6IGYsXG4gICAgICAgICAgICBtOiBtLFxuICAgICAgICAgICAgdTogcyAhPSBmbi5sZW5ndGggfHwgKG0gJiYgKGNvbS5sZW5ndGggIT0gbXMpKSxcbiAgICAgICAgICAgIG86IG8sXG4gICAgICAgICAgICBjb21wcmVzc2lvbjogY29tcHJlc3Npb25cbiAgICAgICAgfSkpO1xuICAgICAgICBvICs9IDMwICsgcyArIGV4bCArIGw7XG4gICAgICAgIHRvdCArPSA3NiArIDIgKiAocyArIGV4bCkgKyAobXMgfHwgMCkgKyBsO1xuICAgIH1cbiAgICB2YXIgb3V0ID0gbmV3IHU4KHRvdCArIDIyKSwgb2UgPSBvLCBjZGwgPSB0b3QgLSBvO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgd3poKG91dCwgZi5vLCBmLCBmLmYsIGYudSwgZi5jLmxlbmd0aCk7XG4gICAgICAgIHZhciBiYWRkID0gMzAgKyBmLmYubGVuZ3RoICsgZXhmbChmLmV4dHJhKTtcbiAgICAgICAgb3V0LnNldChmLmMsIGYubyArIGJhZGQpO1xuICAgICAgICB3emgob3V0LCBvLCBmLCBmLmYsIGYudSwgZi5jLmxlbmd0aCwgZi5vLCBmLm0pLCBvICs9IDE2ICsgYmFkZCArIChmLm0gPyBmLm0ubGVuZ3RoIDogMCk7XG4gICAgfVxuICAgIHd6ZihvdXQsIG8sIGZpbGVzLmxlbmd0aCwgY2RsLCBvZSk7XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3RyZWFtaW5nIHBhc3MtdGhyb3VnaCBkZWNvbXByZXNzaW9uIGZvciBaSVAgYXJjaGl2ZXNcbiAqL1xudmFyIFVuemlwUGFzc1Rocm91Z2ggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVW56aXBQYXNzVGhyb3VnaCgpIHtcbiAgICB9XG4gICAgVW56aXBQYXNzVGhyb3VnaC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBmaW5hbCkge1xuICAgICAgICB0aGlzLm9uZGF0YShudWxsLCBkYXRhLCBmaW5hbCk7XG4gICAgfTtcbiAgICBVbnppcFBhc3NUaHJvdWdoLmNvbXByZXNzaW9uID0gMDtcbiAgICByZXR1cm4gVW56aXBQYXNzVGhyb3VnaDtcbn0oKSk7XG5leHBvcnQgeyBVbnppcFBhc3NUaHJvdWdoIH07XG4vKipcbiAqIFN0cmVhbWluZyBERUZMQVRFIGRlY29tcHJlc3Npb24gZm9yIFpJUCBhcmNoaXZlcy4gUHJlZmVyIEFzeW5jWmlwSW5mbGF0ZSBmb3JcbiAqIGJldHRlciBwZXJmb3JtYW5jZS5cbiAqL1xudmFyIFVuemlwSW5mbGF0ZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgREVGTEFURSBkZWNvbXByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gWklQIGFyY2hpdmVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gVW56aXBJbmZsYXRlKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmkgPSBuZXcgSW5mbGF0ZShmdW5jdGlvbiAoZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgX3RoaXMub25kYXRhKG51bGwsIGRhdCwgZmluYWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgVW56aXBJbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIGZpbmFsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmkucHVzaChkYXRhLCBmaW5hbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMub25kYXRhKGUsIG51bGwsIGZpbmFsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVW56aXBJbmZsYXRlLmNvbXByZXNzaW9uID0gODtcbiAgICByZXR1cm4gVW56aXBJbmZsYXRlO1xufSgpKTtcbmV4cG9ydCB7IFVuemlwSW5mbGF0ZSB9O1xuLyoqXG4gKiBBc3luY2hyb25vdXMgc3RyZWFtaW5nIERFRkxBVEUgZGVjb21wcmVzc2lvbiBmb3IgWklQIGFyY2hpdmVzXG4gKi9cbnZhciBBc3luY1VuemlwSW5mbGF0ZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgREVGTEFURSBkZWNvbXByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gWklQIGFyY2hpdmVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gQXN5bmNVbnppcEluZmxhdGUoXywgc3opIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHN6IDwgMzIwMDAwKSB7XG4gICAgICAgICAgICB0aGlzLmkgPSBuZXcgSW5mbGF0ZShmdW5jdGlvbiAoZGF0LCBmaW5hbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uZGF0YShudWxsLCBkYXQsIGZpbmFsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pID0gbmV3IEFzeW5jSW5mbGF0ZShmdW5jdGlvbiAoZXJyLCBkYXQsIGZpbmFsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25kYXRhKGVyciwgZGF0LCBmaW5hbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGVybWluYXRlID0gdGhpcy5pLnRlcm1pbmF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBBc3luY1VuemlwSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBmaW5hbCkge1xuICAgICAgICBpZiAodGhpcy5pLnRlcm1pbmF0ZSlcbiAgICAgICAgICAgIGRhdGEgPSBzbGMoZGF0YSwgMCk7XG4gICAgICAgIHRoaXMuaS5wdXNoKGRhdGEsIGZpbmFsKTtcbiAgICB9O1xuICAgIEFzeW5jVW56aXBJbmZsYXRlLmNvbXByZXNzaW9uID0gODtcbiAgICByZXR1cm4gQXN5bmNVbnppcEluZmxhdGU7XG59KCkpO1xuZXhwb3J0IHsgQXN5bmNVbnppcEluZmxhdGUgfTtcbi8qKlxuICogQSBaSVAgYXJjaGl2ZSBkZWNvbXByZXNzaW9uIHN0cmVhbSB0aGF0IGVtaXRzIGZpbGVzIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWRcbiAqL1xudmFyIFVuemlwID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBaSVAgZGVjb21wcmVzc2lvbiBzdHJlYW1cbiAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbmV2ZXIgYSBmaWxlIGluIHRoZSBaSVAgYXJjaGl2ZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFVuemlwKGNiKSB7XG4gICAgICAgIHRoaXMub25maWxlID0gY2I7XG4gICAgICAgIHRoaXMuayA9IFtdO1xuICAgICAgICB0aGlzLm8gPSB7XG4gICAgICAgICAgICAwOiBVbnppcFBhc3NUaHJvdWdoXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucCA9IGV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoZXMgYSBjaHVuayB0byBiZSB1bnppcHBlZFxuICAgICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gcHVzaFxuICAgICAqIEBwYXJhbSBmaW5hbCBXaGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmtcbiAgICAgKi9cbiAgICBVbnppcC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZmluYWwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLm9uZmlsZSlcbiAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgaWYgKCF0aGlzLnApXG4gICAgICAgICAgICBlcnIoNCk7XG4gICAgICAgIGlmICh0aGlzLmMgPiAwKSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4odGhpcy5jLCBjaHVuay5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHRvQWRkID0gY2h1bmsuc3ViYXJyYXkoMCwgbGVuKTtcbiAgICAgICAgICAgIHRoaXMuYyAtPSBsZW47XG4gICAgICAgICAgICBpZiAodGhpcy5kKVxuICAgICAgICAgICAgICAgIHRoaXMuZC5wdXNoKHRvQWRkLCAhdGhpcy5jKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmtbMF0ucHVzaCh0b0FkZCk7XG4gICAgICAgICAgICBjaHVuayA9IGNodW5rLnN1YmFycmF5KGxlbik7XG4gICAgICAgICAgICBpZiAoY2h1bmsubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnB1c2goY2h1bmssIGZpbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmID0gMCwgaSA9IDAsIGlzID0gdm9pZCAwLCBidWYgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoIXRoaXMucC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgYnVmID0gY2h1bms7XG4gICAgICAgICAgICBlbHNlIGlmICghY2h1bmsubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGJ1ZiA9IHRoaXMucDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyB1OCh0aGlzLnAubGVuZ3RoICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWYuc2V0KHRoaXMucCksIGJ1Zi5zZXQoY2h1bmssIHRoaXMucC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGwgPSBidWYubGVuZ3RoLCBvYyA9IHRoaXMuYywgYWRkID0gb2MgJiYgdGhpcy5kO1xuICAgICAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIHZhciBzaWcgPSBiNChidWYsIGkpO1xuICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gMHg0MDM0QjUwKSB7XG4gICAgICAgICAgICAgICAgICAgIGYgPSAxLCBpcyA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNfMS5kID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpc18xLmMgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYmYgPSBiMihidWYsIGkgKyA2KSwgY21wXzEgPSBiMihidWYsIGkgKyA4KSwgdSA9IGJmICYgMjA0OCwgZGQgPSBiZiAmIDgsIGZubCA9IGIyKGJ1ZiwgaSArIDI2KSwgZXMgPSBiMihidWYsIGkgKyAyOCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsID4gaSArIDMwICsgZm5sICsgZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGtzXzMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMS5rLnVuc2hpZnQoY2hrc18zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjXzEgPSBiNChidWYsIGkgKyAxOCksIHN1XzEgPSBiNChidWYsIGkgKyAyMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm5fMSA9IHN0ckZyb21VOChidWYuc3ViYXJyYXkoaSArIDMwLCBpICs9IDMwICsgZm5sKSwgIXUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjXzEgPT0gNDI5NDk2NzI5NSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gZGQgPyBbLTJdIDogejY0ZShidWYsIGkpLCBzY18xID0gX2FbMF0sIHN1XzEgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjXzEgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEuYyA9IHNjXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfMSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmbl8xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uOiBjbXBfMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVfMS5vbmRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NfMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfMS5vbmRhdGEobnVsbCwgZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdHIgPSBfdGhpcy5vW2NtcF8xXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfMS5vbmRhdGEoZXJyKDE0LCAndW5rbm93biBjb21wcmVzc2lvbiB0eXBlICcgKyBjbXBfMSwgMSksIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfMSA9IHNjXzEgPCAwID8gbmV3IGN0cihmbl8xKSA6IG5ldyBjdHIoZm5fMSwgc2NfMSwgc3VfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkXzEub25kYXRhID0gZnVuY3Rpb24gKGVyciwgZGF0LCBmaW5hbCkgeyBmaWxlXzEub25kYXRhKGVyciwgZGF0LCBmaW5hbCk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGNoa3NfNCA9IGNoa3NfMzsgX2kgPCBjaGtzXzQubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdCA9IGNoa3NfNFtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF8xLnB1c2goZGF0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMua1swXSA9PSBjaGtzXzMgJiYgX3RoaXMuYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kID0gZF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfMS5wdXNoKGV0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkXzEgJiYgZF8xLnRlcm1pbmF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfMS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjXzEgPj0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXzEuc2l6ZSA9IHNjXzEsIGZpbGVfMS5vcmlnaW5hbFNpemUgPSBzdV8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLm9uZmlsZShmaWxlXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gMHg4MDc0QjUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGkgKz0gMTIgKyAob2MgPT0gLTIgJiYgOCksIGYgPSAzLCB0aGlzXzEuYyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpZyA9PSAweDIwMTRCNTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gaSAtPSA0LCBmID0gMywgdGhpc18xLmMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgdGhpc18xID0gdGhpcztcbiAgICAgICAgICAgIGZvciAoOyBpIDwgbCAtIDQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMigpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xID09PSBcImJyZWFrXCIpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wID0gZXQ7XG4gICAgICAgICAgICBpZiAob2MgPCAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdCA9IGYgPyBidWYuc3ViYXJyYXkoMCwgaXMgLSAxMiAtIChvYyA9PSAtMiAmJiA4KSAtIChiNChidWYsIGlzIC0gMTYpID09IDB4ODA3NEI1MCAmJiA0KSkgOiBidWYuc3ViYXJyYXkoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGFkZClcbiAgICAgICAgICAgICAgICAgICAgYWRkLnB1c2goZGF0LCAhIWYpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5rWysoZiA9PSAyKV0ucHVzaChkYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGYgJiAyKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnB1c2goYnVmLnN1YmFycmF5KGkpLCBmaW5hbCk7XG4gICAgICAgICAgICB0aGlzLnAgPSBidWYuc3ViYXJyYXkoaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jKVxuICAgICAgICAgICAgICAgIGVycigxMyk7XG4gICAgICAgICAgICB0aGlzLnAgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBkZWNvZGVyIHdpdGggdGhlIHN0cmVhbSwgYWxsb3dpbmcgZm9yIGZpbGVzIGNvbXByZXNzZWQgd2l0aFxuICAgICAqIHRoZSBjb21wcmVzc2lvbiB0eXBlIHByb3ZpZGVkIHRvIGJlIGV4cGFuZGVkIGNvcnJlY3RseVxuICAgICAqIEBwYXJhbSBkZWNvZGVyIFRoZSBkZWNvZGVyIGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgVW56aXAucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGRlY29kZXIpIHtcbiAgICAgICAgdGhpcy5vW2RlY29kZXIuY29tcHJlc3Npb25dID0gZGVjb2RlcjtcbiAgICB9O1xuICAgIHJldHVybiBVbnppcDtcbn0oKSk7XG5leHBvcnQgeyBVbnppcCB9O1xudmFyIG10ID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBzZXRUaW1lb3V0ID09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogZnVuY3Rpb24gKGZuKSB7IGZuKCk7IH07XG5leHBvcnQgZnVuY3Rpb24gdW56aXAoZGF0YSwgb3B0cywgY2IpIHtcbiAgICBpZiAoIWNiKVxuICAgICAgICBjYiA9IG9wdHMsIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNiICE9ICdmdW5jdGlvbicpXG4gICAgICAgIGVycig3KTtcbiAgICB2YXIgdGVybSA9IFtdO1xuICAgIHZhciB0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlcm0ubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICB0ZXJtW2ldKCk7XG4gICAgfTtcbiAgICB2YXIgZmlsZXMgPSB7fTtcbiAgICB2YXIgY2JkID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgbXQoZnVuY3Rpb24gKCkgeyBjYihhLCBiKTsgfSk7XG4gICAgfTtcbiAgICBtdChmdW5jdGlvbiAoKSB7IGNiZCA9IGNiOyB9KTtcbiAgICB2YXIgZSA9IGRhdGEubGVuZ3RoIC0gMjI7XG4gICAgZm9yICg7IGI0KGRhdGEsIGUpICE9IDB4NjA1NEI1MDsgLS1lKSB7XG4gICAgICAgIGlmICghZSB8fCBkYXRhLmxlbmd0aCAtIGUgPiA2NTU1OCkge1xuICAgICAgICAgICAgY2JkKGVycigxMywgMCwgMSksIG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIHRBbGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHZhciBsZnQgPSBiMihkYXRhLCBlICsgOCk7XG4gICAgaWYgKGxmdCkge1xuICAgICAgICB2YXIgYyA9IGxmdDtcbiAgICAgICAgdmFyIG8gPSBiNChkYXRhLCBlICsgMTYpO1xuICAgICAgICB2YXIgeiA9IG8gPT0gNDI5NDk2NzI5NSB8fCBjID09IDY1NTM1O1xuICAgICAgICBpZiAoeikge1xuICAgICAgICAgICAgdmFyIHplID0gYjQoZGF0YSwgZSAtIDEyKTtcbiAgICAgICAgICAgIHogPSBiNChkYXRhLCB6ZSkgPT0gMHg2MDY0QjUwO1xuICAgICAgICAgICAgaWYgKHopIHtcbiAgICAgICAgICAgICAgICBjID0gbGZ0ID0gYjQoZGF0YSwgemUgKyAzMik7XG4gICAgICAgICAgICAgICAgbyA9IGI0KGRhdGEsIHplICsgNDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBmbHRyID0gb3B0cyAmJiBvcHRzLmZpbHRlcjtcbiAgICAgICAgdmFyIF9sb29wXzMgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgdmFyIF9hID0gemgoZGF0YSwgbywgeiksIGNfMSA9IF9hWzBdLCBzYyA9IF9hWzFdLCBzdSA9IF9hWzJdLCBmbiA9IF9hWzNdLCBubyA9IF9hWzRdLCBvZmYgPSBfYVs1XSwgYiA9IHNsemgoZGF0YSwgb2ZmKTtcbiAgICAgICAgICAgIG8gPSBubztcbiAgICAgICAgICAgIHZhciBjYmwgPSBmdW5jdGlvbiAoZSwgZCkge1xuICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgY2JkKGUsIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1tmbl0gPSBkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIS0tbGZ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JkKG51bGwsIGZpbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCFmbHRyIHx8IGZsdHIoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGZuLFxuICAgICAgICAgICAgICAgIHNpemU6IHNjLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZTogc3UsXG4gICAgICAgICAgICAgICAgY29tcHJlc3Npb246IGNfMVxuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNfMSlcbiAgICAgICAgICAgICAgICAgICAgY2JsKG51bGwsIHNsYyhkYXRhLCBiLCBiICsgc2MpKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjXzEgPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5mbCA9IGRhdGEuc3ViYXJyYXkoYiwgYiArIHNjKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25vdXNseSBkZWNvbXByZXNzIHVuZGVyIDUxMktCLCBvciBiYXJlbHktY29tcHJlc3NlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdSA8IDUyNDI4OCB8fCBzYyA+IDAuOCAqIHN1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibChudWxsLCBpbmZsYXRlU3luYyhpbmZsLCB7IG91dDogbmV3IHU4KHN1KSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibChlLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtLnB1c2goaW5mbGF0ZShpbmZsLCB7IHNpemU6IHN1IH0sIGNibCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNibChlcnIoMTQsICd1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJyArIGNfMSwgMSksIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNibChudWxsLCBudWxsKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjOyArK2kpIHtcbiAgICAgICAgICAgIF9sb29wXzMoaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBjYmQobnVsbCwge30pO1xuICAgIHJldHVybiB0QWxsO1xufVxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGRlY29tcHJlc3NlcyBhIFpJUCBhcmNoaXZlLiBQcmVmZXIgdXNpbmcgYHVuemlwYCBmb3IgYmV0dGVyXG4gKiBwZXJmb3JtYW5jZSB3aXRoIG1vcmUgdGhhbiBvbmUgZmlsZS5cbiAqIEBwYXJhbSBkYXRhIFRoZSByYXcgY29tcHJlc3NlZCBaSVAgZmlsZVxuICogQHBhcmFtIG9wdHMgVGhlIFpJUCBleHRyYWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuemlwU3luYyhkYXRhLCBvcHRzKSB7XG4gICAgdmFyIGZpbGVzID0ge307XG4gICAgdmFyIGUgPSBkYXRhLmxlbmd0aCAtIDIyO1xuICAgIGZvciAoOyBiNChkYXRhLCBlKSAhPSAweDYwNTRCNTA7IC0tZSkge1xuICAgICAgICBpZiAoIWUgfHwgZGF0YS5sZW5ndGggLSBlID4gNjU1NTgpXG4gICAgICAgICAgICBlcnIoMTMpO1xuICAgIH1cbiAgICA7XG4gICAgdmFyIGMgPSBiMihkYXRhLCBlICsgOCk7XG4gICAgaWYgKCFjKVxuICAgICAgICByZXR1cm4ge307XG4gICAgdmFyIG8gPSBiNChkYXRhLCBlICsgMTYpO1xuICAgIHZhciB6ID0gbyA9PSA0Mjk0OTY3Mjk1IHx8IGMgPT0gNjU1MzU7XG4gICAgaWYgKHopIHtcbiAgICAgICAgdmFyIHplID0gYjQoZGF0YSwgZSAtIDEyKTtcbiAgICAgICAgeiA9IGI0KGRhdGEsIHplKSA9PSAweDYwNjRCNTA7XG4gICAgICAgIGlmICh6KSB7XG4gICAgICAgICAgICBjID0gYjQoZGF0YSwgemUgKyAzMik7XG4gICAgICAgICAgICBvID0gYjQoZGF0YSwgemUgKyA0OCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGZsdHIgPSBvcHRzICYmIG9wdHMuZmlsdGVyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYzsgKytpKSB7XG4gICAgICAgIHZhciBfYSA9IHpoKGRhdGEsIG8sIHopLCBjXzIgPSBfYVswXSwgc2MgPSBfYVsxXSwgc3UgPSBfYVsyXSwgZm4gPSBfYVszXSwgbm8gPSBfYVs0XSwgb2ZmID0gX2FbNV0sIGIgPSBzbHpoKGRhdGEsIG9mZik7XG4gICAgICAgIG8gPSBubztcbiAgICAgICAgaWYgKCFmbHRyIHx8IGZsdHIoe1xuICAgICAgICAgICAgbmFtZTogZm4sXG4gICAgICAgICAgICBzaXplOiBzYyxcbiAgICAgICAgICAgIG9yaWdpbmFsU2l6ZTogc3UsXG4gICAgICAgICAgICBjb21wcmVzc2lvbjogY18yXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAoIWNfMilcbiAgICAgICAgICAgICAgICBmaWxlc1tmbl0gPSBzbGMoZGF0YSwgYiwgYiArIHNjKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNfMiA9PSA4KVxuICAgICAgICAgICAgICAgIGZpbGVzW2ZuXSA9IGluZmxhdGVTeW5jKGRhdGEuc3ViYXJyYXkoYiwgYiArIHNjKSwgeyBvdXQ6IG5ldyB1OChzdSkgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyKDE0LCAndW5rbm93biBjb21wcmVzc2lvbiB0eXBlICcgKyBjXzIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWxlcztcbn1cbiIsICJjb25zdCBkZWZhdWx0RXJyb3JDb25maWcgPSB7XHJcbiAgICB3aXRoU3RhY2tUcmFjZTogZmFsc2UsXHJcbn07XHJcbi8vIEN1c3RvbSBlcnJvciBvYmplY3RcclxuLy8gQ29udGV4dCAvIGRpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1hY3JvL25ldmVydGhyb3cvcHVsbC8yMTVcclxuY29uc3QgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yID0gKG1lc3NhZ2UsIHJlc3VsdCwgY29uZmlnID0gZGVmYXVsdEVycm9yQ29uZmlnKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID0gcmVzdWx0LmlzT2soKVxyXG4gICAgICAgID8geyB0eXBlOiAnT2snLCB2YWx1ZTogcmVzdWx0LnZhbHVlIH1cclxuICAgICAgICA6IHsgdHlwZTogJ0VycicsIHZhbHVlOiByZXN1bHQuZXJyb3IgfTtcclxuICAgIGNvbnN0IG1heWJlU3RhY2sgPSBjb25maWcud2l0aFN0YWNrVHJhY2UgPyBuZXcgRXJyb3IoKS5zdGFjayA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgIHN0YWNrOiBtYXliZVN0YWNrLFxyXG4gICAgfTtcclxufTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcblxyXG5mdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbnR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xuXG5jbGFzcyBSZXN1bHRBc3luYyB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21TYWZlUHJvbWlzZShwcm9taXNlKSB7XHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IHByb21pc2UudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMobmV3UHJvbWlzZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JGbikge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlXHJcbiAgICAgICAgICAgIC50aGVuKCh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKSlcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiBuZXcgRXJyKGVycm9yRm4oZSkpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIHN0YXRpYyBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMoKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPayh5aWVsZCBmbiguLi5hcmdzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihlcnJvckZuID8gZXJyb3JGbihlcnJvcikgOiBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKSgpKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNvbWJpbmUoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3QoYXN5bmNSZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lV2l0aEFsbEVycm9ycyhhc3luY1Jlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdEFzeW5jTGlzdFdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIG1hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayh5aWVsZCBmKHJlcy52YWx1ZSkpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBuZXdSZXMgPSB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChuZXdSZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIobmV3UmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHlpZWxkIGYocmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGVlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc09rKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycih5aWVsZCBmKHJlcy5lcnJvcikpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZSBpbnN0YW5jZW9mIFJlc3VsdEFzeW5jID8gbmV3VmFsdWUuX3Byb21pc2UgOiBuZXdWYWx1ZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGYocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIG1hdGNoKG9rLCBfZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMubWF0Y2gob2ssIF9lcnIpKTtcclxuICAgIH1cclxuICAgIHVud3JhcE9yKHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy51bndyYXBPcih0KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiA5LjAuMC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHVzZSBgc2FmZVRyeWAgd2l0aG91dCB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICAgKiBzYWZlVHJ5KGFzeW5jIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgKiAgIGNvbnN0IG9rVmFsdWUgPSB5aWVsZCogeW91clJlc3VsdFxyXG4gICAgICogfSlcclxuICAgICAqIGBgYFxyXG4gICAgICogRW11bGF0ZXMgUnVzdCdzIGA/YCBvcGVyYXRvciBpbiBgc2FmZVRyeWAncyBib2R5LiBTZWUgYWxzbyBgc2FmZVRyeWAuXHJcbiAgICAgKi9cclxuICAgIHNhZmVVbndyYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogc2FmZVVud3JhcF8xKCkge1xyXG4gICAgICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMoeWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLnNhZmVVbndyYXAoKSkpKSkpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIE1ha2VzIFJlc3VsdEFzeW5jIGltcGxlbWVudCBQcm9taXNlTGlrZTxSZXN1bHQ+XHJcbiAgICB0aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIF9hKCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBfX2F3YWl0KHRoaXMuX3Byb21pc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChlcnJBc3luYyhyZXN1bHQuZXJyb3IpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5jb25zdCBva0FzeW5jID0gKHZhbHVlKSA9PiBuZXcgUmVzdWx0QXN5bmMoUHJvbWlzZS5yZXNvbHZlKG5ldyBPayh2YWx1ZSkpKTtcclxuY29uc3QgZXJyQXN5bmMgPSAoZXJyKSA9PiBuZXcgUmVzdWx0QXN5bmMoUHJvbWlzZS5yZXNvbHZlKG5ldyBFcnIoZXJyKSkpO1xyXG5jb25zdCBmcm9tUHJvbWlzZSA9IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlO1xyXG5jb25zdCBmcm9tU2FmZVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2U7XHJcbmNvbnN0IGZyb21Bc3luY1Rocm93YWJsZSA9IFJlc3VsdEFzeW5jLmZyb21UaHJvd2FibGU7XG5cbi8qKlxyXG4gKiBTaG9ydCBjaXJjdWl0cyBvbiB0aGUgRklSU1QgRXJyIHZhbHVlIHRoYXQgd2UgZmluZFxyXG4gKi9cclxuY29uc3QgY29tYmluZVJlc3VsdExpc3QgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjID0gZXJyKHJlc3VsdC5lcnJvcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYWNjLm1hcCgobGlzdCkgPT4gbGlzdC5wdXNoKHJlc3VsdC52YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbi8qIFRoaXMgaXMgdGhlIHR5cGVzYWZlIHZlcnNpb24gb2YgUHJvbWlzZS5hbGxcclxuICpcclxuICogVGFrZXMgYSBsaXN0IG9mIFJlc3VsdEFzeW5jPFQsIEU+IGFuZCBzdWNjZXNzIGlmIGFsbCBpbm5lciByZXN1bHRzIGFyZSBPayB2YWx1ZXNcclxuICogb3IgZmFpbHMgaWYgb25lIChvciBtb3JlKSBvZiB0aGUgaW5uZXIgcmVzdWx0cyBhcmUgRXJyIHZhbHVlc1xyXG4gKi9cclxuY29uc3QgY29tYmluZVJlc3VsdEFzeW5jTGlzdCA9IChhc3luY1Jlc3VsdExpc3QpID0+IFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZShQcm9taXNlLmFsbChhc3luY1Jlc3VsdExpc3QpKS5hbmRUaGVuKGNvbWJpbmVSZXN1bHRMaXN0KTtcclxuLyoqXHJcbiAqIEdpdmUgYSBsaXN0IG9mIGFsbCB0aGUgZXJyb3JzIHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0V2l0aEFsbEVycm9ycyA9IChyZXN1bHRMaXN0KSA9PiB7XHJcbiAgICBsZXQgYWNjID0gb2soW10pO1xyXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0TGlzdCkge1xyXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSAmJiBhY2MuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICBhY2MuZXJyb3IucHVzaChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNFcnIoKSAmJiBhY2MuaXNPaygpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihbcmVzdWx0LmVycm9yXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MudmFsdWUucHVzaChyZXN1bHQudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBkbyBub3RoaW5nIHdoZW4gcmVzdWx0LmlzT2soKSAmJiBhY2MuaXNFcnIoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxufTtcclxuY29uc3QgY29tYmluZVJlc3VsdEFzeW5jTGlzdFdpdGhBbGxFcnJvcnMgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxyXG52YXIgUmVzdWx0O1xyXG4oZnVuY3Rpb24gKFJlc3VsdCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwcyBhIGZ1bmN0aW9uIHdpdGggYSB0cnkgY2F0Y2gsIGNyZWF0aW5nIGEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWVcclxuICAgICAqIGFyZ3VtZW50cyBidXQgcmV0dXJuaW5nIGBPa2AgaWYgc3VjY2Vzc2Z1bCwgYEVycmAgaWYgdGhlIGZ1bmN0aW9uIHRocm93c1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmbiBmdW5jdGlvbiB0byB3cmFwIHdpdGggb2sgb24gc3VjY2VzcyBvciBlcnIgb24gZmFpbHVyZVxyXG4gICAgICogQHBhcmFtIGVycm9yRm4gd2hlbiBhbiBlcnJvciBpcyB0aHJvd24sIHRoaXMgd2lsbCB3cmFwIHRoZSBlcnJvciByZXN1bHQgaWYgcHJvdmlkZWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGZ1bmN0aW9uIGZyb21UaHJvd2FibGUoZm4sIGVycm9yRm4pIHtcclxuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZXJyb3JGbiA/IGVycm9yRm4oZSkgOiBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuZnJvbVRocm93YWJsZSA9IGZyb21UaHJvd2FibGU7XHJcbiAgICBmdW5jdGlvbiBjb21iaW5lKHJlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdExpc3QocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZSA9IGNvbWJpbmU7XHJcbiAgICBmdW5jdGlvbiBjb21iaW5lV2l0aEFsbEVycm9ycyhyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0V2l0aEFsbEVycm9ycyhyZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIFJlc3VsdC5jb21iaW5lV2l0aEFsbEVycm9ycyA9IGNvbWJpbmVXaXRoQWxsRXJyb3JzO1xyXG59KShSZXN1bHQgfHwgKFJlc3VsdCA9IHt9KSk7XHJcbmNvbnN0IG9rID0gKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpO1xyXG5mdW5jdGlvbiBlcnIoZXJyKSB7XHJcbiAgICByZXR1cm4gbmV3IEVycihlcnIpO1xyXG59XHJcbmZ1bmN0aW9uIHNhZmVUcnkoYm9keSkge1xyXG4gICAgY29uc3QgbiA9IGJvZHkoKS5uZXh0KCk7XHJcbiAgICBpZiAobiBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG4udGhlbigocikgPT4gci52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG4udmFsdWU7XHJcbn1cclxuY2xhc3MgT2sge1xyXG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBpc09rKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIG1hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKGYodGhpcy52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWFwRXJyKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRocm91Z2goZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpLm1hcCgoX3ZhbHVlKSA9PiB0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShmKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZih0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gVGVlIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhlbihmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYXN5bmNBbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKCkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY01hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZShmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHVud3JhcE9yKF92KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHNhZmVVbndyYXAoKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLXlpZWxkICovXHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXAoXykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihjb25maWcpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVOZXZlclRocm93RXJyb3IoJ0NhbGxlZCBgX3Vuc2FmZVVud3JhcEVycmAgb24gYW4gT2snLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzLCByZXF1aXJlLXlpZWxkXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRXJyIHtcclxuICAgIGNvbnN0cnVjdG9yKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpc0VycigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNPaygpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIG1hcEVycihmKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycihmKHRoaXMuZXJyb3IpKTtcclxuICAgIH1cclxuICAgIGFuZFRocm91Z2goX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgYW5kVGVlKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmNBbmRUaGVuKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNBbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmNNYXAoX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyQXN5bmModGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih2KSB7XHJcbiAgICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcbiAgICBtYXRjaChfb2ssIGVycikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5lcnJvcjtcclxuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIHlpZWxkIGVycihlcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRG8gbm90IHVzZSB0aGlzIGdlbmVyYXRvciBvdXQgb2YgYHNhZmVUcnlgJyk7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXAoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBgIG9uIGFuIEVycicsIHRoaXMsIGNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwRXJyKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcjtcclxuICAgIH1cclxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICB5aWVsZCBzZWxmO1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IGZyb21UaHJvd2FibGUgPSBSZXN1bHQuZnJvbVRocm93YWJsZTtcclxuLy8jZW5kcmVnaW9uXG5cbmV4cG9ydCB7IEVyciwgT2ssIFJlc3VsdCwgUmVzdWx0QXN5bmMsIGVyciwgZXJyQXN5bmMsIGZyb21Bc3luY1Rocm93YWJsZSwgZnJvbVByb21pc2UsIGZyb21TYWZlUHJvbWlzZSwgZnJvbVRocm93YWJsZSwgb2ssIG9rQXN5bmMsIHNhZmVUcnkgfTtcbiIsICJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwifi9lcnJvci9iYXNlLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3JrZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7fVxuIiwgImltcG9ydCB7IFdvcmtlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IgZXh0ZW5kcyBXb3JrZXJFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIlBhcmFtZXRlciBtdXN0IGJlIGRlZmluZWRcIjtcbn1cbiIsICJpbXBvcnQgeyBlcnJBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY29ubmVjdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci9zZXJ2ZXItZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ29uZmlnIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1jb25maWcudHNcIjtcblxuLyoqXG4gKiBFbnN1cmUgYW4gZXJyb3IgbWVzc2FnZSBpcyB0cmFuc2Zvcm1lZCBpbiBhbiBFcnJvciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbnN1cmVFcnJvciA9ICh2YWx1ZTogdW5rbm93bik6IEVycm9yID0+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWx1ZTtcblxuICBsZXQgc3RyaW5naWZpZWQgPSBcIltVbmFibGUgdG8gc3RyaW5naWZ5IHRoZSB0aHJvd24gdmFsdWVdXCI7XG4gIHRyeSB7XG4gICAgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICByZXR1cm4gbmV3IEVycm9yKHN0cmluZ2lmaWVkKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgTHVmaSdzIGNvbmZpZyBmcm9tIGl0cyBBUElcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VVcmxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaFNlcnZlckNvbmZpZyA9IChcbiAgaW5zdGFuY2VVcmw6IFVSTCxcbik6IFJlc3VsdEFzeW5jPFNlcnZlckNvbmZpZywgRXJyb3I+ID0+IHtcbiAgY29uc3Qgb3JpZ2luTWF0Y2hlcyA9IGluc3RhbmNlVXJsLmhyZWYubWF0Y2goXG4gICAgLyguKj8pXFwvPyg/OlxcL1tkcl17MX1cXC98bG9naW5cXC8/fGZpbGVzXFwvPykvLFxuICApO1xuXG4gIGNvbnN0IHVybE9yaWdpbiA9IG9yaWdpbk1hdGNoZXMgJiYgb3JpZ2luTWF0Y2hlc1sxXVxuICAgID8gb3JpZ2luTWF0Y2hlc1sxXVxuICAgIDogaW5zdGFuY2VVcmwub3JpZ2luO1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBmZXRjaCh1cmxPcmlnaW4gKyBcIi9hYm91dC9jb25maWdcIiksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENvbm5lY3Rpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICApLmFuZFRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIHJlc3BvbnNlLmpzb24oKSxcbiAgICAgICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgIG5ldyBTZXJ2ZXJFcnJvcih1bmRlZmluZWQsIHsgY29udGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Rlbm9SdW50aW1lID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBjb25zdCBpc1NlY3VyZUNvbnRleHQgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKCkgfHwgZ2xvYmFsVGhpcy5pc1NlY3VyZUNvbnRleHQgfHxcbiAgICBnbG9iYWxUaGlzLmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IHdvcmtlclVybCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFVSTCA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKClcbiAgICA/IG5ldyBVUkwoYC4vd29ya2VyLyR7cmVsYXRpdmVQYXRofS50c2AsIG5ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZilcbiAgICA6IG5ldyBVUkwoXG4gICAgICBpbXBvcnQubWV0YS5yZXNvbHZlKFxuICAgICAgICBgLi8ke1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCAhPT0gXCJlbmNyeXB0XCIgPyBgd29ya2VyLyR7cmVsYXRpdmVQYXRofWAgOiByZWxhdGl2ZVBhdGhcbiAgICAgICAgfS5qc2AsXG4gICAgICApLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7IFppcERlY29tcHJlc3Npb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL3ppcC96aXAtZGVjb21wcmVzc2lvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgdW56aXAsIHR5cGUgVW56aXBwZWQgfSBmcm9tIFwiZmZsYXRlXCI7XG5pbXBvcnQgeyBlcnJBc3luYywgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci93b3JrZXIvd29ya2VyLXVuZGVmaW5lZC1wYXJhbWV0ZXItZXJyb3IudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWN0aW9uTWVzc2FnZSB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItYWN0aW9uLW1lc3NhZ2UudHNcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuXG5kZWNsYXJlIGNvbnN0IHNlbGY6IFdvcmtlcjtcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICBkZWNvbXByZXNzKGV2ZW50LmRhdGEpLm1hcCgoKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5BUkNISVZFX0RFQ09NUFJFU1NFRCB9KTtcbiAgfSkubWFwRXJyKChlcnJvcikgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZGVjb21wcmVzcyA9IChcbiAgd29ya2VyTWVzc2FnZTogV29ya2VyQWN0aW9uTWVzc2FnZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIEVycm9yPiA9PiB7XG4gIGNvbnN0IHsgYXJjaGl2ZSB9ID0gd29ya2VyTWVzc2FnZS5hcmdzO1xuXG4gIGlmIChhcmNoaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB1bnppcFByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxVbnppcHBlZD4gPT4ge1xuICAgICAgaWYgKGFyY2hpdmUuZmlsZSkge1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBhd2FpdCBhcmNoaXZlLmZpbGUuYnl0ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuemlwKGZpbGVCeXRlcywgKGVycm9yLCBmaWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuXG4gICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IFdvcmtlclVuZGVmaW5lZFBhcmFtZXRlckVycm9yKFwiYXJjaGl2ZS5maWxlIG11c3QgYmUgZGVmaW5lZFwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKHVuemlwUHJvbWlzZSgpLCAoZXJyb3IpID0+IGVycm9yKVxuICAgICAgLmFuZFRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXRoIGluIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgZXZlbnQ6IEVWRU5ULkFSQ0hJVkVfUkVUUklFVkVEX0ZJTEUsXG4gICAgICAgICAgICAgIGZpbGU6IHsgYnVmZmVyOiBmaWxlc1twYXRoXS5idWZmZXIsIHBhdGggfSxcbiAgICAgICAgICAgIH0sIFtmaWxlc1twYXRoXS5idWZmZXJdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KS5vckVsc2UoKGVycm9yKSA9PlxuICAgICAgICBlcnJBc3luYyhcbiAgICAgICAgICBuZXcgWmlwRGVjb21wcmVzc2lvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgICAgICApXG4gICAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBXb3JrZXJVbmRlZmluZWRQYXJhbWV0ZXJFcnJvcihcImFyY2hpdmUgbXVzdCBiZSBkZWZpbmVkXCIpLFxuICAgICk7XG4gIH1cbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVVPLElBQU0sWUFBTixjQUF3QixNQUFNO0FBQUEsRUFHbkMsWUFDRSxTQUNBLFVBQWlELENBQUMsR0FDbEQ7QUFDQSxVQUFNLEVBQUUsT0FBTyxRQUFRLElBQUk7QUFFM0IsVUFBTSxTQUFTLEVBQUUsTUFBTSxDQUFDO0FBUjFCLHdCQUFnQjtBQVNkLFNBQUssT0FBTyxLQUFLLFlBQVk7QUFFN0IsU0FBSyxVQUFVO0FBQUEsRUFDakI7QUFDRjs7O0FDdEJPLElBQU0sV0FBTixjQUF1QixVQUFVO0FBQUM7OztBQ0FsQyxJQUFNLHdCQUFOLGNBQW9DLFNBQVM7QUFBQSxFQUE3QztBQUFBO0FBQ0wsd0JBQVMsV0FBVTtBQUFBO0FBQ3JCOzs7QUNLQSxJQUFJLE1BQU0sQ0FBQztBQUNYLElBQUksS0FBTSxTQUFVLEdBQUcsSUFBSSxLQUFLLFVBQVUsSUFBSTtBQUMxQyxNQUFJLElBQUksSUFBSSxPQUFPLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxJQUFJLElBQUksZ0JBQWdCLElBQUksS0FBSztBQUFBLElBQ2xFLElBQUk7QUFBQSxFQUNSLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDLENBQUMsRUFBRTtBQUNqQyxJQUFFLFlBQVksU0FBVSxHQUFHO0FBQ3ZCLFFBQUksSUFBSSxFQUFFLE1BQU0sS0FBSyxFQUFFO0FBQ3ZCLFFBQUksSUFBSTtBQUNKLFVBQUlBLE9BQU0sSUFBSSxNQUFN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QUNqQyxnQkFBSSxNQUFPLFFBQU8sS0FBSztBQUV2QixvQkFBUSxLQUFLO0FBQUEsVUFDZixDQUFDO0FBQUEsUUFDSCxDQUFDO0FBQUEsTUFDSCxPQUFPO0FBQ0wsZUFBTyxRQUFRO0FBQUEsVUFDYixJQUFJLDhCQUE4Qiw4QkFBOEI7QUFBQSxRQUNsRTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsV0FBTyxZQUFZLFlBQVksYUFBYSxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQzVELFFBQVEsQ0FBQyxVQUFVO0FBQ2xCLFVBQUk7QUFDRixtQkFBVyxRQUFRLE9BQU87QUFDeEIsZUFBSyxZQUFZO0FBQUEsWUFDZjtBQUFBLFlBQ0EsTUFBTSxFQUFFLFFBQVEsTUFBTSxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsVUFDM0MsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLE1BQU0sQ0FBQztBQUFBLFFBQ3pCO0FBQ0EsZUFBTyxRQUFRLE1BQVM7QUFBQSxNQUMxQixTQUFTLE9BQU87QUFDZCxlQUFPLFNBQVMsS0FBSztBQUFBLE1BQ3ZCO0FBQUEsSUFDRixDQUFDLEVBQUU7QUFBQSxNQUFPLENBQUMsVUFDVDtBQUFBLFFBQ0UsSUFBSSxzQkFBc0IsUUFBVyxFQUFFLE9BQU8sWUFBWSxLQUFLLEVBQUUsQ0FBQztBQUFBLE1BQ3BFO0FBQUEsSUFDRjtBQUFBLEVBQ0osT0FBTztBQUNMLFdBQU87QUFBQSxNQUNMLElBQUksOEJBQThCLHlCQUF5QjtBQUFBLElBQzdEO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJlcnIiLCAibCIsICJ0ZCIsICJlcnIiLCAiZGF0IiwgIl9hIiwgIl9hIiwgImkiLCAiX2EiLCAiZSIsICJ2IiwgIm9rIiwgIl9hIiwgImVyciIsICJSZXN1bHQiLCAiZnJvbVRocm93YWJsZSIsICJvayIsICJlcnIiLCAic2VsZiJdCn0K diff --git a/themes/default/public/js/minified/worker/download.js b/themes/default/public/js/minified/worker/download.js deleted file mode 100644 index b40d8df..0000000 --- a/themes/default/public/js/minified/worker/download.js +++ /dev/null @@ -1,2822 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __typeError = (msg) => { - throw TypeError(msg); -}; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); -var __accessCheck = (obj3, member, msg) => member.has(obj3) || __typeError("Cannot " + msg); -var __privateGet = (obj3, member, getter) => (__accessCheck(obj3, member, "read from private field"), getter ? getter.call(obj3) : member.get(obj3)); -var __privateAdd = (obj3, member, value) => member.has(obj3) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj3) : member.set(obj3, value); -var __privateSet = (obj3, member, value, setter) => (__accessCheck(obj3, member, "write to private field"), setter ? setter.call(obj3, value) : member.set(obj3, value), value); -var __privateMethod = (obj3, member, method) => (__accessCheck(obj3, member, "access private method"), method); -var __privateWrapper = (obj3, member, setter, getter) => ({ - set _(value) { - __privateSet(obj3, member, value, setter); - }, - get _() { - return __privateGet(obj3, member, getter); - } -}); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter3() { - EventEmitter3.init.call(this); - } - module.exports = EventEmitter3; - module.exports.once = once; - EventEmitter3.EventEmitter = EventEmitter3; - EventEmitter3.prototype._events = void 0; - EventEmitter3.prototype._eventsCount = 0; - EventEmitter3.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter3, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter3.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter3.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter3.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter3.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter3.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter3.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter3.prototype.on = EventEmitter3.prototype.addListener; - EventEmitter3.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter3.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter3.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter3.prototype.off = EventEmitter3.prototype.removeListener; - EventEmitter3.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter3.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter3.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter3.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter3.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter3.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a; - }, invalid: function(a) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a; - }, bug: function(a) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a; - }, notReady: function(a) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a; - } } }; - sjcl2.cipher.aes = function(a) { - this.w[0][0][0] || this.C(); - var b, c, d, e, f = this.w[0][4], g = this.w[1]; - b = a.length; - var h = 1; - if (4 !== b && 6 !== b && 8 !== b) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d = a.slice(0), e = []]; - for (a = b; a < 4 * b + 28; a++) { - c = d[a - 1]; - if (0 === a % b || 8 === b && 4 === a % b) c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255], 0 === a % b && (c = c << 8 ^ c >>> 24 ^ h << 24, h = h << 1 ^ 283 * (h >> 7)); - d[a] = d[a - b] ^ c; - } - for (b = 0; a; b++, a--) c = d[b & 3 ? a : a - 4], e[b] = 4 >= a || 4 > b ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a) { - return aa(this, a, 0); - }, decrypt: function(a) { - return aa(this, a, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a = this.w[0], b = this.w[1], c = a[4], d = b[4], e, f, g, h = [], k = [], n, l, m, p; - for (e = 0; 256 > e; e++) k[(h[e] = e << 1 ^ 283 * (e >> 7)) ^ e] = e; - for (f = g = 0; !c[f]; f ^= n || 1, g = k[g] || 1) for (m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, m = m >> 8 ^ m & 255 ^ 99, c[f] = m, d[m] = f, l = h[e = h[n = h[f]]], p = 16843009 * l ^ 65537 * e ^ 257 * n ^ 16843008 * f, l = 257 * h[m] ^ 16843008 * m, e = 0; 4 > e; e++) a[e][f] = l = l << 24 ^ l >>> 8, b[e][m] = p = p << 24 ^ p >>> 8; - for (e = 0; 5 > e; e++) a[e] = a[e].slice(0), b[e] = b[e].slice(0); - } }; - function aa(a, b, c) { - if (4 !== b.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d = a.b[c], e = b[0] ^ d[0], f = b[c ? 3 : 1] ^ d[1], g = b[2] ^ d[2]; - b = b[c ? 1 : 3] ^ d[3]; - var h, k, n, l = d.length / 4 - 2, m, p = 4, z = [0, 0, 0, 0]; - h = a.w[c]; - a = h[0]; - var A = h[1], C = h[2], B = h[3], D = h[4]; - for (m = 0; m < l; m++) h = a[e >>> 24] ^ A[f >> 16 & 255] ^ C[g >> 8 & 255] ^ B[b & 255] ^ d[p], k = a[f >>> 24] ^ A[g >> 16 & 255] ^ C[b >> 8 & 255] ^ B[e & 255] ^ d[p + 1], n = a[g >>> 24] ^ A[b >> 16 & 255] ^ C[e >> 8 & 255] ^ B[f & 255] ^ d[p + 2], b = a[b >>> 24] ^ A[e >> 16 & 255] ^ C[f >> 8 & 255] ^ B[g & 255] ^ d[p + 3], p += 4, e = h, f = k, g = n; - for (m = 0; 4 > m; m++) z[c ? 3 & -m : m] = D[e >>> 24] << 24 ^ D[f >> 16 & 255] << 16 ^ D[g >> 8 & 255] << 8 ^ D[b & 255] ^ d[p++], h = e, e = f, f = g, g = b, b = h; - return z; - } - sjcl2.bitArray = { bitSlice: function(a, b, c) { - a = sjcl2.bitArray.Y(a.slice(b / 32), 32 - (b & 31)).slice(1); - return void 0 === c ? a : sjcl2.bitArray.clamp(a, c - b); - }, extract: function(a, b, c) { - var d = Math.floor(-b - c & 31); - return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; - }, concat: function(a, b) { - if (0 === a.length || 0 === b.length) return a.concat(b); - var c = a[a.length - 1], d = sjcl2.bitArray.getPartial(c); - return 32 === d ? a.concat(b) : sjcl2.bitArray.Y(b, d, c | 0, a.slice(0, a.length - 1)); - }, bitLength: function(a) { - var b = a.length; - return 0 === b ? 0 : 32 * (b - 1) + sjcl2.bitArray.getPartial(a[b - 1]); - }, clamp: function(a, b) { - if (32 * a.length < b) return a; - a = a.slice(0, Math.ceil(b / 32)); - var c = a.length; - b = b & 31; - 0 < c && b && (a[c - 1] = sjcl2.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); - return a; - }, partial: function(a, b, c) { - return 32 === a ? b : (c ? b | 0 : b << 32 - a) + 1099511627776 * a; - }, getPartial: function(a) { - return Math.round(a / 1099511627776) || 32; - }, equal: function(a, b) { - if (sjcl2.bitArray.bitLength(a) !== sjcl2.bitArray.bitLength(b)) return false; - var c = 0, d; - for (d = 0; d < a.length; d++) c |= a[d] ^ b[d]; - return 0 === c; - }, Y: function(a, b, c, d) { - var e; - e = 0; - for (void 0 === d && (d = []); 32 <= b; b -= 32) d.push(c), c = 0; - if (0 === b) return d.concat(a); - for (e = 0; e < a.length; e++) d.push(c | a[e] >>> b), c = a[e] << 32 - b; - e = a.length ? a[a.length - 1] : 0; - a = sjcl2.bitArray.getPartial(e); - d.push(sjcl2.bitArray.partial(b + a & 31, 32 < b + a ? c : d.pop(), 1)); - return d; - }, P: function(a, b) { - return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; - }, byteswapM: function(a) { - var b, c; - for (b = 0; b < a.length; ++b) c = a[b], a[b] = c >>> 24 | c >>> 8 & 65280 | (c & 65280) << 8 | c << 24; - return a; - } }; - sjcl2.codec.utf8String = { fromBits: function(a) { - var b = "", c = sjcl2.bitArray.bitLength(a), d, e; - for (d = 0; d < c / 8; d++) 0 === (d & 3) && (e = a[d / 4]), b += String.fromCharCode(e >>> 8 >>> 8 >>> 8), e <<= 8; - return decodeURIComponent(escape(b)); - }, toBits: function(a) { - a = unescape(encodeURIComponent(a)); - var b = [], c, d = 0; - for (c = 0; c < a.length; c++) d = d << 8 | a.charCodeAt(c), 3 === (c & 3) && (b.push(d), d = 0); - c & 3 && b.push(sjcl2.bitArray.partial(8 * (c & 3), d)); - return b; - } }; - sjcl2.codec.hex = { fromBits: function(a) { - var b = "", c; - for (c = 0; c < a.length; c++) b += ((a[c] | 0) + 263882790666240).toString(16).substr(4); - return b.substr(0, sjcl2.bitArray.bitLength(a) / 4); - }, toBits: function(a) { - var b, c = [], d; - a = a.replace(/\s|0x/g, ""); - d = a.length; - a = a + "00000000"; - for (b = 0; b < a.length; b += 8) c.push(parseInt(a.substr(b, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c, 4 * d); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a, b, c) { - var d = "", e = 0, f = sjcl2.codec.base64.S, g = 0, h = sjcl2.bitArray.bitLength(a); - c && (f = f.substr(0, 62) + "-_"); - for (c = 0; 6 * d.length < h; ) d += f.charAt((g ^ a[c] >>> e) >>> 26), 6 > e ? (g = a[c] << 6 - e, e += 26, c++) : (g <<= 6, e -= 6); - for (; d.length & 3 && !b; ) d += "="; - return d; - }, toBits: function(a, b) { - a = a.replace(/\s|=/g, ""); - var c = [], d, e = 0, f = sjcl2.codec.base64.S, g = 0, h; - b && (f = f.substr(0, 62) + "-_"); - for (d = 0; d < a.length; d++) { - h = f.indexOf(a.charAt(d)); - if (0 > h) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e ? (e -= 26, c.push(g ^ h >>> e), g = h << 32 - e) : (e += 6, g ^= h << 32 - e); - } - e & 56 && c.push(sjcl2.bitArray.partial(e & 56, g, 1)); - return c; - } }; - sjcl2.codec.base64url = { fromBits: function(a) { - return sjcl2.codec.base64.fromBits(a, 1, 1); - }, toBits: function(a) { - return sjcl2.codec.base64.toBits(a, 1); - } }; - sjcl2.hash.sha256 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a) { - return new sjcl2.hash.sha256().update(a).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(d.subarray( - 16 * e, - 16 * (e + 1) - )), e += 1; - c.splice(0, 16 * e); - } else for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(c.splice(0, 16)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 2; a & 15; a++) b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 16)); - this.reset(); - return c; - }, o: [], b: [], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - for (var b = 0, c = 2, d, e; 64 > b; c++) { - e = true; - for (d = 2; d * d <= c; d++) if (0 === c % d) { - e = false; - break; - } - e && (8 > b && (this.o[b] = a(Math.pow(c, 0.5))), this.b[b] = a(Math.pow(c, 1 / 3)), b++); - } - }, l: function(a) { - var b, c, d, e = this.g, f = this.b, g = e[0], h = e[1], k = e[2], n = e[3], l = e[4], m = e[5], p = e[6], z = e[7]; - for (b = 0; 64 > b; b++) 16 > b ? c = a[b] : (c = a[b + 1 & 15], d = a[b + 14 & 15], c = a[b & 15] = (c >>> 7 ^ c >>> 18 ^ c >>> 3 ^ c << 25 ^ c << 14) + (d >>> 17 ^ d >>> 19 ^ d >>> 10 ^ d << 15 ^ d << 13) + a[b & 15] + a[b + 9 & 15] | 0), c = c + z + (l >>> 6 ^ l >>> 11 ^ l >>> 25 ^ l << 26 ^ l << 21 ^ l << 7) + (p ^ l & (m ^ p)) + f[b], z = p, p = m, m = l, l = n + c | 0, n = k, k = h, h = g, g = c + (h & k ^ n & (h ^ k)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; - e[0] = e[0] + g | 0; - e[1] = e[1] + h | 0; - e[2] = e[2] + k | 0; - e[3] = e[3] + n | 0; - e[4] = e[4] + l | 0; - e[5] = e[5] + m | 0; - e[6] = e[6] + p | 0; - e[7] = e[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a) { - return new sjcl2.hash.sha512().update(a).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(d.subarray(32 * e, 32 * (e + 1))), e += 1; - c.splice(0, 32 * e); - } else for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(c.splice(0, 32)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 4; a & 31; a++) b.push(0); - b.push(0); - b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 32)); - this.reset(); - return c; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - function b(a2) { - return 1099511627776 * (a2 - Math.floor(a2)) & 255; - } - for (var c = 0, d = 2, e, f; 80 > c; d++) { - f = true; - for (e = 2; e * e <= d; e++) if (0 === d % e) { - f = false; - break; - } - f && (8 > c && (this.o[2 * c] = a(Math.pow(d, 0.5)), this.o[2 * c + 1] = b(Math.pow(d, 0.5)) << 24 | this.ia[c]), this.b[2 * c] = a(Math.pow(d, 1 / 3)), this.b[2 * c + 1] = b(Math.pow(d, 1 / 3)) << 24 | this.ka[c], c++); - } - }, l: function(a) { - var b, c, d = this.g, e = this.b, f = d[0], g = d[1], h = d[2], k = d[3], n = d[4], l = d[5], m = d[6], p = d[7], z = d[8], A = d[9], C = d[10], B = d[11], D = d[12], P = d[13], ea = d[14], Q = d[15], t; - if ("undefined" !== typeof Uint32Array) { - t = Array(160); - for (var r = 0; 32 > r; r++) t[r] = a[r]; - } else t = a; - var r = f, u = g, G = h, E = k, H = n, F = l, V = m, I = p, w = z, v = A, R = C, J = B, S = D, K = P, W = ea, L = Q; - for (a = 0; 80 > a; a++) { - if (16 > a) b = t[2 * a], c = t[2 * a + 1]; - else { - c = t[2 * (a - 15)]; - var q = t[2 * (a - 15) + 1]; - b = (q << 31 | c >>> 1) ^ (q << 24 | c >>> 8) ^ c >>> 7; - var x = (c << 31 | q >>> 1) ^ (c << 24 | q >>> 8) ^ (c << 25 | q >>> 7); - c = t[2 * (a - 2)]; - var y = t[2 * (a - 2) + 1], q = (y << 13 | c >>> 19) ^ (c << 3 | y >>> 29) ^ c >>> 6, y = (c << 13 | y >>> 19) ^ (y << 3 | c >>> 29) ^ (c << 26 | y >>> 6), X = t[2 * (a - 7)], Y = t[2 * (a - 16)], M = t[2 * (a - 16) + 1]; - c = x + t[2 * (a - 7) + 1]; - b = b + X + (c >>> 0 < x >>> 0 ? 1 : 0); - c += y; - b += q + (c >>> 0 < y >>> 0 ? 1 : 0); - c += M; - b += Y + (c >>> 0 < M >>> 0 ? 1 : 0); - } - t[2 * a] = b |= 0; - t[2 * a + 1] = c |= 0; - var X = w & R ^ ~w & S, fa = v & J ^ ~v & K, y = r & G ^ r & H ^ G & H, ja = u & E ^ u & F ^ E & F, Y = (u << 4 | r >>> 28) ^ (r << 30 | u >>> 2) ^ (r << 25 | u >>> 7), M = (r << 4 | u >>> 28) ^ (u << 30 | r >>> 2) ^ (u << 25 | r >>> 7), ka = e[2 * a], ga = e[2 * a + 1], q = L + ((w << 18 | v >>> 14) ^ (w << 14 | v >>> 18) ^ (v << 23 | w >>> 9)), x = W + ((v << 18 | w >>> 14) ^ (v << 14 | w >>> 18) ^ (w << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x = x + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x = x + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c | 0, x = x + (b + (q >>> 0 < c >>> 0 ? 1 : 0)); - c = M + ja; - b = Y + y + (c >>> 0 < M >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w; - J = v; - v = I + q | 0; - w = V + x + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E; - G = r; - E = u; - u = q + c | 0; - r = x + b + (u >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g = d[1] = g + u | 0; - d[0] = f + r + (g >>> 0 < u >>> 0 ? 1 : 0) | 0; - k = d[3] = k + E | 0; - d[2] = h + G + (k >>> 0 < E >>> 0 ? 1 : 0) | 0; - l = d[5] = l + F | 0; - d[4] = n + H + (l >>> 0 < F >>> 0 ? 1 : 0) | 0; - p = d[7] = p + I | 0; - d[6] = m + V + (p >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d[9] = A + v | 0; - d[8] = z + w + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B = d[11] = B + J | 0; - d[10] = C + R + (B >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d[13] = P + K | 0; - d[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d[15] = Q + L | 0; - d[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a) { - sjcl2.mode.ccm.F.push(a); - }, unListenProgress: function(a) { - a = sjcl2.mode.ccm.F.indexOf(a); - -1 < a && sjcl2.mode.ccm.F.splice(a, 1); - }, da: function(a) { - var b = sjcl2.mode.ccm.F.slice(), c; - for (c = 0; c < b.length; c += 1) b[c](a); - }, encrypt: function(a, b, c, d, e) { - var f, g = b.slice(0), h = sjcl2.bitArray, k = h.bitLength(c) / 8, n = h.bitLength(g) / 8; - e = e || 64; - d = d || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f = 2; 4 > f && n >>> 8 * f; f++) ; - f < 15 - k && (f = 15 - k); - c = h.clamp( - c, - 8 * (15 - f) - ); - b = sjcl2.mode.ccm.U(a, b, c, d, e, f); - g = sjcl2.mode.ccm.V(a, g, c, b, e, f); - return h.concat(g.data, g.tag); - }, decrypt: function(a, b, c, d, e) { - e = e || 64; - d = d || []; - var f = sjcl2.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), k = f.clamp(b, h - e), n = f.bitSlice(b, h - e), h = (h - e) / 8; - if (7 > g) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b = 2; 4 > b && h >>> 8 * b; b++) ; - b < 15 - g && (b = 15 - g); - c = f.clamp(c, 8 * (15 - b)); - k = sjcl2.mode.ccm.V(a, k, c, n, e, b); - a = sjcl2.mode.ccm.U(a, k.data, c, d, e, b); - if (!f.equal(k.tag, a)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a, b, c, d, e, f) { - var g = [], h = sjcl2.bitArray, k = h.P; - d = [h.partial(8, (b.length ? 64 : 0) | d - 2 << 2 | f - 1)]; - d = h.concat(d, c); - d[3] |= e; - d = a.encrypt(d); - if (b.length) for (c = h.bitLength(b) / 8, 65279 >= c ? g = [h.partial(16, c)] : 4294967295 >= c && (g = h.concat([h.partial(16, 65534)], [c])), g = h.concat(g, b), b = 0; b < g.length; b += 4) d = a.encrypt(k(d, g.slice(b, b + 4).concat([0, 0, 0]))); - return d; - }, U: function(a, b, c, d, e, f) { - var g = sjcl2.bitArray, h = g.P; - e /= 8; - if (e % 2 || 4 > e || 16 < e) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d.length || 4294967295 < b.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c = sjcl2.mode.ccm.ma(a, d, c, e, g.bitLength(b) / 8, f); - for (d = 0; d < b.length; d += 4) c = a.encrypt(h(c, b.slice(d, d + 4).concat([0, 0, 0]))); - return g.clamp(c, 8 * e); - }, V: function(a, b, c, d, e, f) { - var g, h = sjcl2.bitArray; - g = h.P; - var k = b.length, n = h.bitLength(b), l = k / 50, m = l; - c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); - d = h.bitSlice(g(d, a.encrypt(c)), 0, e); - if (!k) return { tag: d, data: [] }; - for (g = 0; g < k; g += 4) g > l && (sjcl2.mode.ccm.da(g / k), l += m), c[3]++, e = a.encrypt(c), b[g] ^= e[0], b[g + 1] ^= e[1], b[g + 2] ^= e[2], b[g + 3] ^= e[3]; - return { tag: d, data: h.clamp(b, n) }; - } }; - sjcl2.misc.hmac = function(a, b) { - this.W = b = b || sjcl2.hash.sha256; - var c = [[], []], d, e = b.prototype.blockSize / 32; - this.B = [new b(), new b()]; - a.length > e && (a = b.hash(a)); - for (d = 0; d < e; d++) c[0][d] = a[d] ^ 909522486, c[1][d] = a[d] ^ 1549556828; - this.B[0].update(c[0]); - this.B[1].update(c[1]); - this.O = new b(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a); - return this.digest(a); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a) { - this.Z = true; - this.O.update(a); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a = this.O.finalize(), a = new this.W(this.B[1]).update(a).finalize(); - this.reset(); - return a; - }; - sjcl2.misc.pbkdf2 = function(a, b, c, d, e) { - c = c || 1e4; - if (0 > d || 0 > c) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - e = e || sjcl2.misc.hmac; - a = new e(a); - var f, g, h, k, n = [], l = sjcl2.bitArray; - for (k = 1; 32 * n.length < (d || 1); k++) { - e = f = a.encrypt(l.concat(b, [k])); - for (g = 1; g < c; g++) for (f = a.encrypt(f), h = 0; h < f.length; h++) e[h] ^= f[h]; - n = n.concat(e); - } - d && (n = l.clamp(n, d)); - return n; - }; - sjcl2.prng = function(a) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a, b) { - var c = [], d; - d = this.isReady(b); - var e; - if (d === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d & this.I) { - d = !(d & this.H); - e = []; - var f = 0, g; - this.X = e[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g = 0; 16 > g; g++) e.push(4294967296 * Math.random() | 0); - for (g = 0; g < this.h.length && (e = e.concat(this.h[g].finalize()), f += this.s[g], this.s[g] = 0, d || !(this.N & 1 << g)); g++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f; - f > this.u && (this.u = f); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e)); - this.K = new sjcl2.cipher.aes(this.b); - for (d = 0; 4 > d && (this.m[d] = this.m[d] + 1 | 0, !this.m[d]); d++) ; - } - for (d = 0; d < a; d += 4) 0 === (d + 1) % this.aa && ba(this), e = N(this), c.push(e[0], e[1], e[2], e[3]); - ba(this); - return c.slice(0, a); - }, - setDefaultParanoia: function(a, b) { - if (0 === a && "Setting paranoia=0 will ruin your security; use it only for testing" !== b) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a; - }, - addEntropy: function(a, b, c) { - c = c || "user"; - var d, e, f = (/* @__PURE__ */ new Date()).valueOf(), g = this.G[c], h = this.isReady(), k = 0; - d = this.T[c]; - void 0 === d && (d = this.T[c] = this.fa++); - void 0 === g && (g = this.G[c] = 0); - this.G[c] = (this.G[c] + 1) % this.h.length; - switch (typeof a) { - case "number": - void 0 === b && (b = 1); - this.h[g].update([d, this.M++, 1, b, f, 1, a | 0]); - break; - case "object": - c = Object.prototype.toString.call(a); - if ("[object Uint32Array]" === c) { - e = []; - for (c = 0; c < a.length; c++) e.push(a[c]); - a = e; - } else for ("[object Array]" !== c && (k = 1), c = 0; c < a.length && !k; c++) "number" !== typeof a[c] && (k = 1); - if (!k) { - if (void 0 === b) for (c = b = 0; c < a.length; c++) for (e = a[c]; 0 < e; ) b++, e = e >>> 1; - this.h[g].update([d, this.M++, 2, b, f, a.length].concat(a)); - } - break; - case "string": - void 0 === b && (b = a.length); - this.h[g].update([d, this.M++, 3, b, f, a.length]); - this.h[g].update(a); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g] += b; - this.i += b; - h === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a) { - a = this.R[void 0 !== a ? a : this.L]; - return this.u && this.u >= a ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a ? this.I | this.A : this.A; - }, - getProgress: function(a) { - a = this.R[a ? a : this.L]; - return this.u >= a ? 1 : this.i > a ? 1 : this.i / a; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a, b) { - this.J[a][this.ea++] = b; - }, - removeEventListener: function(a, b) { - var c, d, e = this.J[a], f = []; - for (d in e) e.hasOwnProperty(d) && e[d] === b && f.push(d); - for (c = 0; c < f.length; c++) d = f[c], delete e[d]; - }, - ja: function() { - T(this, 1); - }, - na: function(a) { - var b, c; - try { - b = a.x || a.clientX || a.offsetX || 0, c = a.y || a.clientY || a.offsetY || 0; - } catch (d) { - c = b = 0; - } - 0 != b && 0 != c && this.addEntropy([b, c], 2, "mouse"); - T(this, 0); - }, - pa: function(a) { - a = a.touches[0] || a.changedTouches[0]; - this.addEntropy([a.pageX || a.clientX, a.pageY || a.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a) { - a = a.accelerationIncludingGravity.x || a.accelerationIncludingGravity.y || a.accelerationIncludingGravity.z; - if (window.orientation) { - var b = window.orientation; - "number" === typeof b && this.addEntropy(b, 1, "accelerometer"); - } - a && this.addEntropy(a, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a, b) { - var c, d = sjcl2.random.J[a], e = []; - for (c in d) d.hasOwnProperty(c) && e.push(d[c]); - for (c = 0; c < e.length; c++) e[c](b); - } - function T(a, b) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a.addEntropy(window.performance.now(), b, "loadtime") : a.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b, "loadtime"); - } - function ba(a) { - a.b = N(a).concat(N(a)); - a.K = new sjcl2.cipher.aes(a.b); - } - function N(a) { - for (var b = 0; 4 > b && (a.m[b] = a.m[b] + 1 | 0, !a.m[b]); b++) ; - return a.K.encrypt(a.m); - } - function O(a, b) { - return function() { - b.apply(a, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require("crypto"); - } catch (a) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json, f = e.j({ iv: sjcl2.random.randomWords(4, 0) }, e.defaults), g; - e.j(f, c); - c = f.adata; - "string" === typeof f.salt && (f.salt = sjcl2.codec.base64.toBits(f.salt)); - "string" === typeof f.iv && (f.iv = sjcl2.codec.base64.toBits(f.iv)); - if (!sjcl2.mode[f.mode] || !sjcl2.cipher[f.cipher] || "string" === typeof a && 100 >= f.iter || 64 !== f.ts && 96 !== f.ts && 128 !== f.ts || 128 !== f.ks && 192 !== f.ks && 256 !== f.ks || 2 > f.iv.length || 4 < f.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, f), a = g.key.slice(0, f.ks / 32), f.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.publicKey && (g = a.kem(), f.kemtag = g.tag, a = g.key.slice(0, f.ks / 32)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - "string" === typeof c && (f.adata = c = sjcl2.codec.utf8String.toBits(c)); - g = new sjcl2.cipher[f.cipher](a); - e.j(d, f); - d.key = a; - f.ct = "ccm" === f.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g, b, f.iv, c, f.ts) : sjcl2.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); - return f; - }, encrypt: function(a, b, c, d) { - var e = sjcl2.json, f = e.ha.apply(e, arguments); - return e.encode(f); - }, ga: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json; - b = e.j(e.j(e.j({}, e.defaults), b), c, true); - var f, g; - f = b.adata; - "string" === typeof b.salt && (b.salt = sjcl2.codec.base64.toBits(b.salt)); - "string" === typeof b.iv && (b.iv = sjcl2.codec.base64.toBits(b.iv)); - if (!sjcl2.mode[b.mode] || !sjcl2.cipher[b.cipher] || "string" === typeof a && 100 >= b.iter || 64 !== b.ts && 96 !== b.ts && 128 !== b.ts || 128 !== b.ks && 192 !== b.ks && 256 !== b.ks || !b.iv || 2 > b.iv.length || 4 < b.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, b), a = g.key.slice(0, b.ks / 32), b.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.secretKey && (a = a.unkem(sjcl2.codec.base64.toBits(b.kemtag)).slice(0, b.ks / 32)); - "string" === typeof f && (f = sjcl2.codec.utf8String.toBits(f)); - g = new sjcl2.cipher[b.cipher](a); - f = "ccm" === b.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g, b.ct, b.iv, b.tag, f, b.ts) : sjcl2.mode[b.mode].decrypt(g, b.ct, b.iv, f, b.ts); - e.j(d, b); - d.key = a; - return 1 === c.raw ? f : sjcl2.codec.utf8String.fromBits(f); - }, decrypt: function(a, b, c, d) { - var e = sjcl2.json; - return e.ga(a, e.decode(b), c, d); - }, encode: function(a) { - var b, c = "{", d = ""; - for (b in a) if (a.hasOwnProperty(b)) { - if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c += d + '"' + b + '":'; - d = ","; - switch (typeof a[b]) { - case "number": - case "boolean": - c += a[b]; - break; - case "string": - c += '"' + escape(a[b]) + '"'; - break; - case "object": - c += '"' + sjcl2.codec.base64.fromBits(a[b], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c + "}"; - }, decode: function(a) { - a = a.replace(/\s/g, ""); - if (!a.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a = a.replace(/^\{|\}$/g, "").split(/,/); - var b = {}, c, d; - for (c = 0; c < a.length; c++) { - if (!(d = a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d[3] ? b[d[2]] = parseInt(d[3], 10) : null != d[4] ? b[d[2]] = d[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d[4]) : unescape(d[4]) : null != d[5] && (b[d[2]] = "true" === d[5]); - } - return b; - }, j: function(a, b, c) { - void 0 === a && (a = {}); - if (void 0 === b) return a; - for (var d in b) if (b.hasOwnProperty(d)) { - if (c && void 0 !== a[d] && a[d] !== b[d]) throw new sjcl2.exception.invalid("required parameter overridden"); - a[d] = b[d]; - } - return a; - }, ra: function(a, b) { - var c = {}, d; - for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); - return c; - }, qa: function(a, b) { - var c = {}, d; - for (d = 0; d < b.length; d++) void 0 !== a[b[d]] && (c[b[d]] = a[b[d]]); - return c; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a, b) { - var c = sjcl2.misc.oa, d; - b = b || {}; - d = b.iter || 1e3; - c = c[a] = c[a] || {}; - d = c[d] = c[d] || { firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c = void 0 === b.salt ? d.firstSalt : b.salt; - d[c] = d[c] || sjcl2.misc.pbkdf2(a, c, b.iter); - return { key: d[c].slice(0), salt: c.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); - -// node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.js -var require_eventemitter3 = __commonJS({ - "node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.js"(exports, module) { - "use strict"; - var has = Object.prototype.hasOwnProperty; - var prefix = "~"; - function Events() { - } - if (Object.create) { - Events.prototype = /* @__PURE__ */ Object.create(null); - if (!new Events().__proto__) prefix = false; - } - function EE(fn, context, once) { - this.fn = fn; - this.context = context; - this.once = once || false; - } - function addListener(emitter, event, fn, context, once) { - if (typeof fn !== "function") { - throw new TypeError("The listener must be a function"); - } - var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event; - if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; - else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); - else emitter._events[evt] = [emitter._events[evt], listener]; - return emitter; - } - function clearEvent(emitter, evt) { - if (--emitter._eventsCount === 0) emitter._events = new Events(); - else delete emitter._events[evt]; - } - function EventEmitter3() { - this._events = new Events(); - this._eventsCount = 0; - } - EventEmitter3.prototype.eventNames = function eventNames() { - var names = [], events2, name; - if (this._eventsCount === 0) return names; - for (name in events2 = this._events) { - if (has.call(events2, name)) names.push(prefix ? name.slice(1) : name); - } - if (Object.getOwnPropertySymbols) { - return names.concat(Object.getOwnPropertySymbols(events2)); - } - return names; - }; - EventEmitter3.prototype.listeners = function listeners(event) { - var evt = prefix ? prefix + event : event, handlers = this._events[evt]; - if (!handlers) return []; - if (handlers.fn) return [handlers.fn]; - for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { - ee[i] = handlers[i].fn; - } - return ee; - }; - EventEmitter3.prototype.listenerCount = function listenerCount(event) { - var evt = prefix ? prefix + event : event, listeners = this._events[evt]; - if (!listeners) return 0; - if (listeners.fn) return 1; - return listeners.length; - }; - EventEmitter3.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { - var evt = prefix ? prefix + event : event; - if (!this._events[evt]) return false; - var listeners = this._events[evt], len = arguments.length, args, i; - if (listeners.fn) { - if (listeners.once) this.removeListener(event, listeners.fn, void 0, true); - switch (len) { - case 1: - return listeners.fn.call(listeners.context), true; - case 2: - return listeners.fn.call(listeners.context, a1), true; - case 3: - return listeners.fn.call(listeners.context, a1, a2), true; - case 4: - return listeners.fn.call(listeners.context, a1, a2, a3), true; - case 5: - return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; - case 6: - return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; - } - for (i = 1, args = new Array(len - 1); i < len; i++) { - args[i - 1] = arguments[i]; - } - listeners.fn.apply(listeners.context, args); - } else { - var length = listeners.length, j; - for (i = 0; i < length; i++) { - if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true); - switch (len) { - case 1: - listeners[i].fn.call(listeners[i].context); - break; - case 2: - listeners[i].fn.call(listeners[i].context, a1); - break; - case 3: - listeners[i].fn.call(listeners[i].context, a1, a2); - break; - case 4: - listeners[i].fn.call(listeners[i].context, a1, a2, a3); - break; - default: - if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) { - args[j - 1] = arguments[j]; - } - listeners[i].fn.apply(listeners[i].context, args); - } - } - } - return true; - }; - EventEmitter3.prototype.on = function on(event, fn, context) { - return addListener(this, event, fn, context, false); - }; - EventEmitter3.prototype.once = function once(event, fn, context) { - return addListener(this, event, fn, context, true); - }; - EventEmitter3.prototype.removeListener = function removeListener(event, fn, context, once) { - var evt = prefix ? prefix + event : event; - if (!this._events[evt]) return this; - if (!fn) { - clearEvent(this, evt); - return this; - } - var listeners = this._events[evt]; - if (listeners.fn) { - if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) { - clearEvent(this, evt); - } - } else { - for (var i = 0, events2 = [], length = listeners.length; i < length; i++) { - if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) { - events2.push(listeners[i]); - } - } - if (events2.length) this._events[evt] = events2.length === 1 ? events2[0] : events2; - else clearEvent(this, evt); - } - return this; - }; - EventEmitter3.prototype.removeAllListeners = function removeAllListeners(event) { - var evt; - if (event) { - evt = prefix ? prefix + event : event; - if (this._events[evt]) clearEvent(this, evt); - } else { - this._events = new Events(); - this._eventsCount = 0; - } - return this; - }; - EventEmitter3.prototype.off = EventEmitter3.prototype.removeListener; - EventEmitter3.prototype.addListener = EventEmitter3.prototype.on; - EventEmitter3.prefixed = prefix; - EventEmitter3.EventEmitter = EventEmitter3; - if ("undefined" !== typeof module) { - module.exports = EventEmitter3; - } - } -}); - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var updateFile = (lufiFile, args) => { - Object.assign(lufiFile, args); - if (typeof WorkerGlobalScope !== "undefined") { - self.postMessage({ - event: "FILE_UPDATED" /* FILE_UPDATED */, - lufiFile - }); - } - return lufiFile; -}; -var sendFileError = (lufiFile, error) => { - updateFile(lufiFile, { uploadStatus: 2 /* FAILED */ }); - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); -}; -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/websocket/websocket-error.ts -var WebSocketError = class extends BaseError { -}; - -// src/error/websocket/websocket-connection-error.ts -var WebSocketConnectionError = class extends WebSocketError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to connect to WebSocket"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/encoding.js -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i = 0; i < len; i += 3) { - res += this._charset[view[i] >> 2] + this._charset[(view[i] & 3) << 4 | view[i + 1] >> 4] + this._charset[(view[i + 1] & 15) << 2 | view[i + 2] >> 6] + this._charset[view[i + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i = 0, j = 0; - while (i < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i++] = enc1 << 2 | enc2 >> 4; - view[i++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/standard.js -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -function Decode(str) { - return obj.Decode(str); -} - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/url.js -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Decode2(str) { - return obj2.Decode(str); -} - -// src/api/crypto/sjcl.ts -var import_lufi_sjcl = __toESM(require_sjcl()); - -// src/error/crypto/crypto-error.ts -var CryptoError = class extends BaseError { -}; - -// src/error/crypto/decryption-error.ts -var DecryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to decrypt the provided data"); - } -}; - -// src/api/crypto/sjcl.ts -var decrypt = (key, encryptedData) => { - try { - const data = typeof encryptedData === "string" ? encryptedData : new TextDecoder().decode(encryptedData.data); - return okAsync(Decode(import_lufi_sjcl.default.decrypt(key, data))); - } catch (error) { - return errAsync( - new DecryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; - -// src/api/crypto/web.ts -var decrypt2 = (key, encrypted) => { - return importKey(key).andThen( - (importedKey) => ResultAsync.fromPromise( - crypto.subtle.decrypt( - { - name: "AES-GCM", - iv: encrypted.iv - }, - importedKey, - encrypted.data - ), - (error) => new DecryptionError(void 0, { cause: ensureError(error) }) - ) - ); -}; -var importKey = (key) => { - return ResultAsync.fromPromise( - crypto.subtle.importKey( - "raw", - Decode2(key), - { name: "AES-GCM" }, - false, - [ - "encrypt", - "decrypt" - ] - ), - (error) => new CryptoError("Unable to import cryptography key", { - cause: ensureError(error) - }) - ); -}; - -// src/api/crypto.ts -var decrypt3 = (key, value) => value.algo === void 0 || value.algo === 0 /* Sjcl */ ? decrypt(key, value) : decrypt2(key, value); - -// src/api/websocket.ts -var sockets = {}; -var MAX_ERRORS = 5; -var onCancelMessage = (data) => { - events.emit("UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, data.success); - return okAsync(void 0); -}; -var onDownloadMessage = (response, lufiFile) => { - const result = response.split("XXMOJOXX"); - const metadataString = result.shift(); - if (metadataString !== void 0) { - const metadata = JSON.parse(metadataString); - if (isServerDownloadChunkSuccessMetadata(metadata)) { - const dataString = result.shift(); - if (dataString) { - const encryptedData = JSON.parse(dataString); - if (encryptedData.iv) { - encryptedData.iv = new Uint8Array(Object.values(encryptedData.iv)); - encryptedData.data = Decode(encryptedData.data); - } - return decrypt3(lufiFile.keys.client, encryptedData).andThen( - (decryptedPart) => { - const buffer = typeof decryptedPart === "string" ? new TextEncoder().encode(decryptedPart).buffer : decryptedPart; - if (metadata.part === 0) { - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - delAtFirstView: metadata.del_at_first_view, - delay: metadata.delay, - name: metadata.name, - size: metadata.size, - totalChunks: metadata.total, - type: metadata.type, - zipped: metadata.zipped - }); - events.emit("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */); - } else { - updateFile(lufiFile, { chunksReady: lufiFile.chunksReady + 1 }); - } - events.emit("CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, buffer, metadata.part); - if (lufiFile.chunksReady === metadata.total) { - return endDownload(lufiFile).andThen(() => { - events.emit("DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - return okAsync(void 0); - }); - } - return okAsync(void 0); - } - ); - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError(metadata.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onUploadMessage = (response, lufiFile) => { - if (response.success) { - if (response.j === 0) { - updateFile(lufiFile, { - keys: { client: lufiFile.keys.client, server: response.short }, - actionToken: response.token, - queueIndex: response.i - }); - events.emit("UPLOAD_STARTED" /* UPLOAD_STARTED */); - } - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - createdAt: response.created_at - }); - events.emit("CHUNK_UPLOADED" /* CHUNK_UPLOADED */); - if (lufiFile.chunksReady === lufiFile.totalChunks) { - updateFile(lufiFile, { uploadStatus: 1 /* COMPLETE */ }); - events.emit("UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - } - return okAsync(void 0); - } else { - const error = new WebSocketError(response.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onMessage = (e, lufiFile) => { - const data = tryParseJson(e.data); - let callback; - if (data) { - if (!data.action && data.msg) { - const error = new WebSocketError(data.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } else { - if ("delay" in data) { - callback = onUploadMessage(data, lufiFile); - } else { - callback = onCancelMessage(data); - } - } - } else { - callback = onDownloadMessage(e.data, lufiFile); - } - return callback; -}; -var isConnecting = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.CONNECTING; -var isSpawned = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.OPEN; -var downloadChunk = (lufiFile, chunkNumber) => { - let message; - if (lufiFile.password) { - message = { part: chunkNumber, file_pwd: lufiFile.password }; - } else { - message = { part: chunkNumber }; - } - return sendMessage( - downloadSocketUrl(lufiFile), - lufiFile, - JSON.stringify(message) - ); -}; -var endDownload = (lufiFile) => { - let message; - if (lufiFile.password) { - message = { ended: true, file_pwd: lufiFile.password }; - } else { - message = { ended: true }; - } - return sendMessage( - downloadSocketUrl(lufiFile), - lufiFile, - JSON.stringify(message) - ); -}; -var sendMessage = (socketUrl, lufiFile, message) => { - if (!isSpawned(socketUrl)) { - return spawn(socketUrl).andThen(() => { - sockets[socketUrl].onmessage = (e) => onMessage(e, lufiFile); - return sendMessage(socketUrl, lufiFile, message); - }); - } else { - sockets[socketUrl].send(message); - return okAsync(void 0); - } -}; -var spawn = (socketKey, errorCount = 0) => { - if (!isSpawned(socketKey) && !isConnecting(socketKey)) { - sockets[socketKey] = new WebSocket(socketKey); - events.once("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */, () => { - sockets[socketKey].close(); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, () => { - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - }); - sockets[socketKey].onopen = () => { - events.emit("SOCKET_OPENED" /* SOCKET_OPENED */); - }; - sockets[socketKey].onclose = () => { - }; - sockets[socketKey].onerror = (event) => { - if (++errorCount <= MAX_ERRORS) { - console.error( - `An error happened while trying to connect to WebSocket "${socketKey}". Trying again. ${errorCount} / ${MAX_ERRORS}`, - event.error - ); - return spawn(socketKey, errorCount); - } else { - events.emit("SOCKET_ONERROR" /* SOCKET_ONERROR */); - return errAsync( - new WebSocketConnectionError( - `Unable to connect to WebSocket ${socketKey}.` - ) - ); - } - }; - } - return waitForConnection(socketKey).andThen(() => okAsync(socketKey)).orElse((error) => errAsync(error)); -}; -var waitForConnection = (socketKey) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - if (!isSpawned(socketKey)) { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - resolve(void 0); - }); - events.on("SOCKET_ONERROR" /* SOCKET_ONERROR */, () => { - reject(new WebSocketConnectionError()); - }); - } else { - resolve(void 0); - } - }), - (error) => { - return ensureError(error); - } -); -var buildSocketUrl = (instanceUrl, pathname) => { - const url = new URL(instanceUrl); - if (!["ws:", "wss:"].includes(url.protocol)) { - url.protocol = url.protocol === "http:" ? "ws:" : "wss:"; - } - url.pathname += pathname; - return new URL(url.origin + url.pathname); -}; -var downloadSocketUrl = (lufiFile) => { - return buildSocketUrl( - new URL(lufiFile.serverUrl), - "download" /* DOWNLOAD */ + `/${lufiFile.keys.server}` - ).toString(); -}; -var tryParseJson = (data) => { - try { - const parsedObject = JSON.parse(data); - if (parsedObject && typeof parsedObject === "object") { - return parsedObject; - } - } catch (_e) { - } - return false; -}; -var isServerDownloadChunkSuccessMetadata = (message) => typeof message === "object" && message !== null && !("msg" in message); - -// node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.mjs -var import_index = __toESM(require_eventemitter3(), 1); - -// node_modules/.deno/p-timeout@6.1.3/node_modules/p-timeout/index.js -var TimeoutError = class extends Error { - constructor(message) { - super(message); - this.name = "TimeoutError"; - } -}; -var AbortError = class extends Error { - constructor(message) { - super(); - this.name = "AbortError"; - this.message = message; - } -}; -var getDOMException = (errorMessage) => globalThis.DOMException === void 0 ? new AbortError(errorMessage) : new DOMException(errorMessage); -var getAbortedReason = (signal) => { - const reason = signal.reason === void 0 ? getDOMException("This operation was aborted.") : signal.reason; - return reason instanceof Error ? reason : getDOMException(reason); -}; -function pTimeout(promise, options) { - const { - milliseconds, - fallback, - message, - customTimers = { setTimeout, clearTimeout } - } = options; - let timer; - const wrappedPromise = new Promise((resolve, reject) => { - if (typeof milliseconds !== "number" || Math.sign(milliseconds) !== 1) { - throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${milliseconds}\``); - } - if (options.signal) { - const { signal } = options; - if (signal.aborted) { - reject(getAbortedReason(signal)); - } - const abortHandler = () => { - reject(getAbortedReason(signal)); - }; - signal.addEventListener("abort", abortHandler, { once: true }); - promise.finally(() => { - signal.removeEventListener("abort", abortHandler); - }); - } - if (milliseconds === Number.POSITIVE_INFINITY) { - promise.then(resolve, reject); - return; - } - const timeoutError = new TimeoutError(); - timer = customTimers.setTimeout.call(void 0, () => { - if (fallback) { - try { - resolve(fallback()); - } catch (error) { - reject(error); - } - return; - } - if (typeof promise.cancel === "function") { - promise.cancel(); - } - if (message === false) { - resolve(); - } else if (message instanceof Error) { - reject(message); - } else { - timeoutError.message = message != null ? message : `Promise timed out after ${milliseconds} milliseconds`; - reject(timeoutError); - } - }, milliseconds); - (async () => { - try { - resolve(await promise); - } catch (error) { - reject(error); - } - })(); - }); - const cancelablePromise = wrappedPromise.finally(() => { - cancelablePromise.clear(); - }); - cancelablePromise.clear = () => { - customTimers.clearTimeout.call(void 0, timer); - timer = void 0; - }; - return cancelablePromise; -} - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/lower-bound.js -function lowerBound(array, value, comparator) { - let first = 0; - let count = array.length; - while (count > 0) { - const step = Math.trunc(count / 2); - let it = first + step; - if (comparator(array[it], value) <= 0) { - first = ++it; - count -= step + 1; - } else { - count = step; - } - } - return first; -} - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/priority-queue.js -var _queue; -var PriorityQueue = class { - constructor() { - __privateAdd(this, _queue, []); - } - enqueue(run, options) { - options = { - priority: 0, - ...options - }; - const element = { - priority: options.priority, - run - }; - if (this.size && __privateGet(this, _queue)[this.size - 1].priority >= options.priority) { - __privateGet(this, _queue).push(element); - return; - } - const index = lowerBound(__privateGet(this, _queue), element, (a, b) => b.priority - a.priority); - __privateGet(this, _queue).splice(index, 0, element); - } - dequeue() { - const item = __privateGet(this, _queue).shift(); - return item == null ? void 0 : item.run; - } - filter(options) { - return __privateGet(this, _queue).filter((element) => element.priority === options.priority).map((element) => element.run); - } - get size() { - return __privateGet(this, _queue).length; - } -}; -_queue = new WeakMap(); - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/index.js -var _carryoverConcurrencyCount, _isIntervalIgnored, _intervalCount, _intervalCap, _interval, _intervalEnd, _intervalId, _timeoutId, _queue2, _queueClass, _pending, _concurrency, _isPaused, _throwOnTimeout, _PQueue_instances, doesIntervalAllowAnother_get, doesConcurrentAllowAnother_get, next_fn, onResumeInterval_fn, isIntervalPaused_get, tryToStartAnother_fn, initializeIntervalIfNeeded_fn, onInterval_fn, processQueue_fn, throwOnAbort_fn, onEvent_fn; -var PQueue = class extends import_index.default { - // TODO: The `throwOnTimeout` option should affect the return types of `add()` and `addAll()` - constructor(options) { - var _a, _b, _c, _d; - super(); - __privateAdd(this, _PQueue_instances); - __privateAdd(this, _carryoverConcurrencyCount); - __privateAdd(this, _isIntervalIgnored); - __privateAdd(this, _intervalCount, 0); - __privateAdd(this, _intervalCap); - __privateAdd(this, _interval); - __privateAdd(this, _intervalEnd, 0); - __privateAdd(this, _intervalId); - __privateAdd(this, _timeoutId); - __privateAdd(this, _queue2); - __privateAdd(this, _queueClass); - __privateAdd(this, _pending, 0); - // The `!` is needed because of https://github.com/microsoft/TypeScript/issues/32194 - __privateAdd(this, _concurrency); - __privateAdd(this, _isPaused); - __privateAdd(this, _throwOnTimeout); - /** - Per-operation timeout in milliseconds. Operations fulfill once `timeout` elapses if they haven't already. - - Applies to each future operation. - */ - __publicField(this, "timeout"); - options = { - carryoverConcurrencyCount: false, - intervalCap: Number.POSITIVE_INFINITY, - interval: 0, - concurrency: Number.POSITIVE_INFINITY, - autoStart: true, - queueClass: PriorityQueue, - ...options - }; - if (!(typeof options.intervalCap === "number" && options.intervalCap >= 1)) { - throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(_b = (_a = options.intervalCap) == null ? void 0 : _a.toString()) != null ? _b : ""}\` (${typeof options.intervalCap})`); - } - if (options.interval === void 0 || !(Number.isFinite(options.interval) && options.interval >= 0)) { - throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(_d = (_c = options.interval) == null ? void 0 : _c.toString()) != null ? _d : ""}\` (${typeof options.interval})`); - } - __privateSet(this, _carryoverConcurrencyCount, options.carryoverConcurrencyCount); - __privateSet(this, _isIntervalIgnored, options.intervalCap === Number.POSITIVE_INFINITY || options.interval === 0); - __privateSet(this, _intervalCap, options.intervalCap); - __privateSet(this, _interval, options.interval); - __privateSet(this, _queue2, new options.queueClass()); - __privateSet(this, _queueClass, options.queueClass); - this.concurrency = options.concurrency; - this.timeout = options.timeout; - __privateSet(this, _throwOnTimeout, options.throwOnTimeout === true); - __privateSet(this, _isPaused, options.autoStart === false); - } - get concurrency() { - return __privateGet(this, _concurrency); - } - set concurrency(newConcurrency) { - if (!(typeof newConcurrency === "number" && newConcurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${newConcurrency}\` (${typeof newConcurrency})`); - } - __privateSet(this, _concurrency, newConcurrency); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); - } - async add(function_, options = {}) { - options = { - timeout: this.timeout, - throwOnTimeout: __privateGet(this, _throwOnTimeout), - ...options - }; - return new Promise((resolve, reject) => { - __privateGet(this, _queue2).enqueue(async () => { - var _a; - __privateWrapper(this, _pending)._++; - __privateWrapper(this, _intervalCount)._++; - try { - (_a = options.signal) == null ? void 0 : _a.throwIfAborted(); - let operation = function_({ signal: options.signal }); - if (options.timeout) { - operation = pTimeout(Promise.resolve(operation), { milliseconds: options.timeout }); - } - if (options.signal) { - operation = Promise.race([operation, __privateMethod(this, _PQueue_instances, throwOnAbort_fn).call(this, options.signal)]); - } - const result = await operation; - resolve(result); - this.emit("completed", result); - } catch (error) { - if (error instanceof TimeoutError && !options.throwOnTimeout) { - resolve(); - return; - } - reject(error); - this.emit("error", error); - } finally { - __privateMethod(this, _PQueue_instances, next_fn).call(this); - } - }, options); - this.emit("add"); - __privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this); - }); - } - async addAll(functions, options) { - return Promise.all(functions.map(async (function_) => this.add(function_, options))); - } - /** - Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.) - */ - start() { - if (!__privateGet(this, _isPaused)) { - return this; - } - __privateSet(this, _isPaused, false); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); - return this; - } - /** - Put queue execution on hold. - */ - pause() { - __privateSet(this, _isPaused, true); - } - /** - Clear the queue. - */ - clear() { - __privateSet(this, _queue2, new (__privateGet(this, _queueClass))()); - } - /** - Can be called multiple times. Useful if you for example add additional items at a later time. - - @returns A promise that settles when the queue becomes empty. - */ - async onEmpty() { - if (__privateGet(this, _queue2).size === 0) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "empty"); - } - /** - @returns A promise that settles when the queue size is less than the given limit: `queue.size < limit`. - - If you want to avoid having the queue grow beyond a certain size you can `await queue.onSizeLessThan()` before adding a new item. - - Note that this only limits the number of items waiting to start. There could still be up to `concurrency` jobs already running that this call does not include in its calculation. - */ - async onSizeLessThan(limit) { - if (__privateGet(this, _queue2).size < limit) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "next", () => __privateGet(this, _queue2).size < limit); - } - /** - The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet. - - @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`. - */ - async onIdle() { - if (__privateGet(this, _pending) === 0 && __privateGet(this, _queue2).size === 0) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "idle"); - } - /** - Size of the queue, the number of queued items waiting to run. - */ - get size() { - return __privateGet(this, _queue2).size; - } - /** - Size of the queue, filtered by the given options. - - For example, this can be used to find the number of items remaining in the queue with a specific priority level. - */ - sizeBy(options) { - return __privateGet(this, _queue2).filter(options).length; - } - /** - Number of running items (no longer in the queue). - */ - get pending() { - return __privateGet(this, _pending); - } - /** - Whether the queue is currently paused. - */ - get isPaused() { - return __privateGet(this, _isPaused); - } -}; -_carryoverConcurrencyCount = new WeakMap(); -_isIntervalIgnored = new WeakMap(); -_intervalCount = new WeakMap(); -_intervalCap = new WeakMap(); -_interval = new WeakMap(); -_intervalEnd = new WeakMap(); -_intervalId = new WeakMap(); -_timeoutId = new WeakMap(); -_queue2 = new WeakMap(); -_queueClass = new WeakMap(); -_pending = new WeakMap(); -_concurrency = new WeakMap(); -_isPaused = new WeakMap(); -_throwOnTimeout = new WeakMap(); -_PQueue_instances = new WeakSet(); -doesIntervalAllowAnother_get = function() { - return __privateGet(this, _isIntervalIgnored) || __privateGet(this, _intervalCount) < __privateGet(this, _intervalCap); -}; -doesConcurrentAllowAnother_get = function() { - return __privateGet(this, _pending) < __privateGet(this, _concurrency); -}; -next_fn = function() { - __privateWrapper(this, _pending)._--; - __privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this); - this.emit("next"); -}; -onResumeInterval_fn = function() { - __privateMethod(this, _PQueue_instances, onInterval_fn).call(this); - __privateMethod(this, _PQueue_instances, initializeIntervalIfNeeded_fn).call(this); - __privateSet(this, _timeoutId, void 0); -}; -isIntervalPaused_get = function() { - const now = Date.now(); - if (__privateGet(this, _intervalId) === void 0) { - const delay = __privateGet(this, _intervalEnd) - now; - if (delay < 0) { - __privateSet(this, _intervalCount, __privateGet(this, _carryoverConcurrencyCount) ? __privateGet(this, _pending) : 0); - } else { - if (__privateGet(this, _timeoutId) === void 0) { - __privateSet(this, _timeoutId, setTimeout(() => { - __privateMethod(this, _PQueue_instances, onResumeInterval_fn).call(this); - }, delay)); - } - return true; - } - } - return false; -}; -tryToStartAnother_fn = function() { - if (__privateGet(this, _queue2).size === 0) { - if (__privateGet(this, _intervalId)) { - clearInterval(__privateGet(this, _intervalId)); - } - __privateSet(this, _intervalId, void 0); - this.emit("empty"); - if (__privateGet(this, _pending) === 0) { - this.emit("idle"); - } - return false; - } - if (!__privateGet(this, _isPaused)) { - const canInitializeInterval = !__privateGet(this, _PQueue_instances, isIntervalPaused_get); - if (__privateGet(this, _PQueue_instances, doesIntervalAllowAnother_get) && __privateGet(this, _PQueue_instances, doesConcurrentAllowAnother_get)) { - const job = __privateGet(this, _queue2).dequeue(); - if (!job) { - return false; - } - this.emit("active"); - job(); - if (canInitializeInterval) { - __privateMethod(this, _PQueue_instances, initializeIntervalIfNeeded_fn).call(this); - } - return true; - } - } - return false; -}; -initializeIntervalIfNeeded_fn = function() { - if (__privateGet(this, _isIntervalIgnored) || __privateGet(this, _intervalId) !== void 0) { - return; - } - __privateSet(this, _intervalId, setInterval(() => { - __privateMethod(this, _PQueue_instances, onInterval_fn).call(this); - }, __privateGet(this, _interval))); - __privateSet(this, _intervalEnd, Date.now() + __privateGet(this, _interval)); -}; -onInterval_fn = function() { - if (__privateGet(this, _intervalCount) === 0 && __privateGet(this, _pending) === 0 && __privateGet(this, _intervalId)) { - clearInterval(__privateGet(this, _intervalId)); - __privateSet(this, _intervalId, void 0); - } - __privateSet(this, _intervalCount, __privateGet(this, _carryoverConcurrencyCount) ? __privateGet(this, _pending) : 0); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); -}; -/** -Executes all queued functions until it reaches the limit. -*/ -processQueue_fn = function() { - while (__privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this)) { - } -}; -throwOnAbort_fn = async function(signal) { - return new Promise((_resolve, reject) => { - signal.addEventListener("abort", () => { - reject(signal.reason); - }, { once: true }); - }); -}; -onEvent_fn = async function(event, filter) { - return new Promise((resolve) => { - const listener = () => { - if (filter && !filter()) { - return; - } - this.off(event, listener); - resolve(); - }; - this.on(event, listener); - }); -}; - -// src/worker/download.ts -var QUEUE_CONCURRENCY_LIMIT = navigator.hardwareConcurrency || 1; -var queue = new PQueue({ - concurrency: QUEUE_CONCURRENCY_LIMIT -}); -var itemsInQueue = 0; -var isInitiated = false; -var isPaused = false; -self.onmessage = (event) => { - if (!isInitiated) { - init(); - isInitiated = true; - events.once("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */, () => { - self.postMessage({ event: "DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */ }); - }); - events.once("DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */, () => { - self.postMessage({ event: "DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */ }); - }); - events.on("FILE_UPDATED" /* FILE_UPDATED */, updateFile); - events.on( - "CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, - (buffer, index) => { - itemsInQueue--; - if (!isPaused && itemsInQueue < QUEUE_CONCURRENCY_LIMIT) { - queue.start(); - } - self.postMessage({ - event: "CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, - chunk: { buffer, index } - }, [buffer]); - } - ); - } - const data = event.data; - switch (data.action) { - case 0 /* PAUSE */: - { - isPaused = true; - self.postMessage({ event: "JOB_PAUSED" /* JOB_PAUSED */ }); - } - break; - case 2 /* RESUME */: - { - isPaused = false; - self.postMessage({ event: "JOB_RESUMED" /* JOB_RESUMED */ }); - } - break; - default: - download(data).mapErr((error) => { - sendFileError(data.args.lufiFile, error); - }); - } -}; -var download = (workerMessage) => { - const { lufiFile } = workerMessage.args; - events.on("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */, async () => { - for (let i = 1; i < lufiFile.totalChunks; i++) { - if (!isPaused && itemsInQueue < QUEUE_CONCURRENCY_LIMIT) { - queue.start(); - } - await queue.add(async () => { - await downloadChunk(lufiFile, i); - itemsInQueue++; - if (isPaused || itemsInQueue === QUEUE_CONCURRENCY_LIMIT) { - queue.pause(); - } - }); - } - }); - itemsInQueue++; - return downloadChunk(lufiFile, 0); -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbHVmaS1zamNsQDEuMC44L25vZGVfbW9kdWxlcy9sdWZpLXNqY2wvc2pjbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vZXZlbnRlbWl0dGVyM0A1LjAuMS9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5qcyIsICIuLi8uLi9zcmMvd29ya2VyL3NoYXJlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbmV2ZXJ0aHJvd0A4LjEuMS9ub2RlX21vZHVsZXMvbmV2ZXJ0aHJvdy9kaXN0L2luZGV4LmVzLmpzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWNvbm5lY3Rpb24tZXJyb3IudHMiLCAiLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9hcnJheWJ1ZmZlci1lbmNvZGluZ0AxLjEuMC9ub2RlX21vZHVsZXMvYXJyYXlidWZmZXItZW5jb2Rpbmcvc3JjL2Jhc2U2NC9lbmNvZGluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vYXJyYXlidWZmZXItZW5jb2RpbmdAMS4xLjAvbm9kZV9tb2R1bGVzL2FycmF5YnVmZmVyLWVuY29kaW5nL3NyYy9iYXNlNjQvc3RhbmRhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2FycmF5YnVmZmVyLWVuY29kaW5nQDEuMS4wL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci1lbmNvZGluZy9zcmMvYmFzZTY0L3VybC50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by9zamNsLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by93ZWIudHMiLCAiLi4vLi4vc3JjL2FwaS9jcnlwdG8udHMiLCAiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50ZW1pdHRlcjNANS4wLjEvbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9wLXRpbWVvdXRANi4xLjMvbm9kZV9tb2R1bGVzL3AtdGltZW91dC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vcC1xdWV1ZUA4LjAuMS9ub2RlX21vZHVsZXMvcC1xdWV1ZS9kaXN0L2xvd2VyLWJvdW5kLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9wLXF1ZXVlQDguMC4xL25vZGVfbW9kdWxlcy9wLXF1ZXVlL2Rpc3QvcHJpb3JpdHktcXVldWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL3AtcXVldWVAOC4wLjEvbm9kZV9tb2R1bGVzL3AtcXVldWUvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9zcmMvd29ya2VyL2Rvd25sb2FkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO3ZhciBzamNsPXtjaXBoZXI6e30saGFzaDp7fSxrZXlleGNoYW5nZTp7fSxtb2RlOnt9LG1pc2M6e30sY29kZWM6e30sZXhjZXB0aW9uOntjb3JydXB0OmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkNPUlJVUFQ6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9LGludmFsaWQ6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiSU5WQUxJRDogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0sYnVnOmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkJVRzogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0sbm90UmVhZHk6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiTk9UIFJFQURZOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfX19O1xuc2pjbC5jaXBoZXIuYWVzPWZ1bmN0aW9uKGEpe3RoaXMud1swXVswXVswXXx8dGhpcy5DKCk7dmFyIGIsYyxkLGUsZj10aGlzLndbMF1bNF0sZz10aGlzLndbMV07Yj1hLmxlbmd0aDt2YXIgaD0xO2lmKDQhPT1iJiY2IT09YiYmOCE9PWIpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZhbGlkIGFlcyBrZXkgc2l6ZVwiKTt0aGlzLmI9W2Q9YS5zbGljZSgwKSxlPVtdXTtmb3IoYT1iO2E8NCpiKzI4O2ErKyl7Yz1kW2EtMV07aWYoMD09PWElYnx8OD09PWImJjQ9PT1hJWIpYz1mW2M+Pj4yNF08PDI0XmZbYz4+MTYmMjU1XTw8MTZeZltjPj44JjI1NV08PDheZltjJjI1NV0sMD09PWElYiYmKGM9Yzw8OF5jPj4+MjReaDw8MjQsaD1oPDwxXjI4MyooaD4+NykpO2RbYV09ZFthLWJdXmN9Zm9yKGI9MDthO2IrKyxhLS0pYz1kW2ImMz9hOmEtNF0sZVtiXT00Pj1hfHw0PmI/YzpnWzBdW2ZbYz4+PjI0XV1eZ1sxXVtmW2M+PjE2JjI1NV1dXmdbMl1bZltjPj44JjI1NV1dXmdbM11bZltjJlxuMjU1XV19O1xuc2pjbC5jaXBoZXIuYWVzLnByb3RvdHlwZT17ZW5jcnlwdDpmdW5jdGlvbihhKXtyZXR1cm4gYWEodGhpcyxhLDApfSxkZWNyeXB0OmZ1bmN0aW9uKGEpe3JldHVybiBhYSh0aGlzLGEsMSl9LHc6W1tbXSxbXSxbXSxbXSxbXV0sW1tdLFtdLFtdLFtdLFtdXV0sQzpmdW5jdGlvbigpe3ZhciBhPXRoaXMud1swXSxiPXRoaXMud1sxXSxjPWFbNF0sZD1iWzRdLGUsZixnLGg9W10saz1bXSxuLGwsbSxwO2ZvcihlPTA7MHgxMDA+ZTtlKyspa1soaFtlXT1lPDwxXjI4MyooZT4+NykpXmVdPWU7Zm9yKGY9Zz0wOyFjW2ZdO2ZePW58fDEsZz1rW2ddfHwxKWZvcihtPWdeZzw8MV5nPDwyXmc8PDNeZzw8NCxtPW0+PjhebSYyNTVeOTksY1tmXT1tLGRbbV09ZixsPWhbZT1oW249aFtmXV1dLHA9MHgxMDEwMTAxKmxeMHgxMDAwMSplXjB4MTAxKm5eMHgxMDEwMTAwKmYsbD0weDEwMSpoW21dXjB4MTAxMDEwMCptLGU9MDs0PmU7ZSsrKWFbZV1bZl09bD1sPDwyNF5sPj4+OCxiW2VdW21dPXA9cDw8MjRecD4+Pjg7Zm9yKGU9XG4wOzU+ZTtlKyspYVtlXT1hW2VdLnNsaWNlKDApLGJbZV09YltlXS5zbGljZSgwKX19O1xuZnVuY3Rpb24gYWEoYSxiLGMpe2lmKDQhPT1iLmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGJsb2NrIHNpemVcIik7dmFyIGQ9YS5iW2NdLGU9YlswXV5kWzBdLGY9YltjPzM6MV1eZFsxXSxnPWJbMl1eZFsyXTtiPWJbYz8xOjNdXmRbM107dmFyIGgsayxuLGw9ZC5sZW5ndGgvNC0yLG0scD00LHo9WzAsMCwwLDBdO2g9YS53W2NdO2E9aFswXTt2YXIgQT1oWzFdLEM9aFsyXSxCPWhbM10sRD1oWzRdO2ZvcihtPTA7bTxsO20rKyloPWFbZT4+PjI0XV5BW2Y+PjE2JjI1NV1eQ1tnPj44JjI1NV1eQltiJjI1NV1eZFtwXSxrPWFbZj4+PjI0XV5BW2c+PjE2JjI1NV1eQ1tiPj44JjI1NV1eQltlJjI1NV1eZFtwKzFdLG49YVtnPj4+MjRdXkFbYj4+MTYmMjU1XV5DW2U+PjgmMjU1XV5CW2YmMjU1XV5kW3ArMl0sYj1hW2I+Pj4yNF1eQVtlPj4xNiYyNTVdXkNbZj4+OCYyNTVdXkJbZyYyNTVdXmRbcCszXSxwKz00LGU9aCxmPWssZz1uO2ZvcihtPVxuMDs0Pm07bSsrKXpbYz8zJi1tOm1dPURbZT4+PjI0XTw8MjReRFtmPj4xNiYyNTVdPDwxNl5EW2c+PjgmMjU1XTw8OF5EW2ImMjU1XV5kW3ArK10saD1lLGU9ZixmPWcsZz1iLGI9aDtyZXR1cm4gen1cbnNqY2wuYml0QXJyYXk9e2JpdFNsaWNlOmZ1bmN0aW9uKGEsYixjKXthPXNqY2wuYml0QXJyYXkuWShhLnNsaWNlKGIvMzIpLDMyLShiJjMxKSkuc2xpY2UoMSk7cmV0dXJuIHZvaWQgMD09PWM/YTpzamNsLmJpdEFycmF5LmNsYW1wKGEsYy1iKX0sZXh0cmFjdDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5mbG9vcigtYi1jJjMxKTtyZXR1cm4oKGIrYy0xXmIpJi0zMj9hW2IvMzJ8MF08PDMyLWReYVtiLzMyKzF8MF0+Pj5kOmFbYi8zMnwwXT4+PmQpJigxPDxjKS0xfSxjb25jYXQ6ZnVuY3Rpb24oYSxiKXtpZigwPT09YS5sZW5ndGh8fDA9PT1iLmxlbmd0aClyZXR1cm4gYS5jb25jYXQoYik7dmFyIGM9YVthLmxlbmd0aC0xXSxkPXNqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChjKTtyZXR1cm4gMzI9PT1kP2EuY29uY2F0KGIpOnNqY2wuYml0QXJyYXkuWShiLGQsY3wwLGEuc2xpY2UoMCxhLmxlbmd0aC0xKSl9LGJpdExlbmd0aDpmdW5jdGlvbihhKXt2YXIgYj1hLmxlbmd0aDtyZXR1cm4gMD09PVxuYj8wOjMyKihiLTEpK3NqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChhW2ItMV0pfSxjbGFtcDpmdW5jdGlvbihhLGIpe2lmKDMyKmEubGVuZ3RoPGIpcmV0dXJuIGE7YT1hLnNsaWNlKDAsTWF0aC5jZWlsKGIvMzIpKTt2YXIgYz1hLmxlbmd0aDtiPWImMzE7MDxjJiZiJiYoYVtjLTFdPXNqY2wuYml0QXJyYXkucGFydGlhbChiLGFbYy0xXSYyMTQ3NDgzNjQ4Pj5iLTEsMSkpO3JldHVybiBhfSxwYXJ0aWFsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMzI9PT1hP2I6KGM/YnwwOmI8PDMyLWEpKzB4MTAwMDAwMDAwMDAqYX0sZ2V0UGFydGlhbDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChhLzB4MTAwMDAwMDAwMDApfHwzMn0sZXF1YWw6ZnVuY3Rpb24oYSxiKXtpZihzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKSE9PXNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGIpKXJldHVybiExO3ZhciBjPTAsZDtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWN8PWFbZF1eYltkXTtyZXR1cm4gMD09PVxuY30sWTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtlPTA7Zm9yKHZvaWQgMD09PWQmJihkPVtdKTszMjw9YjtiLT0zMilkLnB1c2goYyksYz0wO2lmKDA9PT1iKXJldHVybiBkLmNvbmNhdChhKTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWQucHVzaChjfGFbZV0+Pj5iKSxjPWFbZV08PDMyLWI7ZT1hLmxlbmd0aD9hW2EubGVuZ3RoLTFdOjA7YT1zamNsLmJpdEFycmF5LmdldFBhcnRpYWwoZSk7ZC5wdXNoKHNqY2wuYml0QXJyYXkucGFydGlhbChiK2EmMzEsMzI8YithP2M6ZC5wb3AoKSwxKSk7cmV0dXJuIGR9LFA6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYVswXV5iWzBdLGFbMV1eYlsxXSxhWzJdXmJbMl0sYVszXV5iWzNdXX0sYnl0ZXN3YXBNOmZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtiPGEubGVuZ3RoOysrYiljPWFbYl0sYVtiXT1jPj4+MjR8Yz4+PjgmMHhmZjAwfChjJjB4ZmYwMCk8PDh8Yzw8MjQ7cmV0dXJuIGF9fTtcbnNqY2wuY29kZWMudXRmOFN0cmluZz17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7dmFyIGI9XCJcIixjPXNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpLGQsZTtmb3IoZD0wO2Q8Yy84O2QrKykwPT09KGQmMykmJihlPWFbZC80XSksYis9U3RyaW5nLmZyb21DaGFyQ29kZShlPj4+OD4+Pjg+Pj44KSxlPDw9ODtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShiKSl9LHRvQml0czpmdW5jdGlvbihhKXthPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhKSk7dmFyIGI9W10sYyxkPTA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkPWQ8PDh8YS5jaGFyQ29kZUF0KGMpLDM9PT0oYyYzKSYmKGIucHVzaChkKSxkPTApO2MmMyYmYi5wdXNoKHNqY2wuYml0QXJyYXkucGFydGlhbCg4KihjJjMpLGQpKTtyZXR1cm4gYn19O1xuc2pjbC5jb2RlYy5oZXg9e2Zyb21CaXRzOmZ1bmN0aW9uKGEpe3ZhciBiPVwiXCIsYztmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIrPSgoYVtjXXwwKSsweGYwMDAwMDAwMDAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cig0KTtyZXR1cm4gYi5zdWJzdHIoMCxzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKS80KX0sdG9CaXRzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZDthPWEucmVwbGFjZSgvXFxzfDB4L2csXCJcIik7ZD1hLmxlbmd0aDthPWErXCIwMDAwMDAwMFwiO2ZvcihiPTA7YjxhLmxlbmd0aDtiKz04KWMucHVzaChwYXJzZUludChhLnN1YnN0cihiLDgpLDE2KV4wKTtyZXR1cm4gc2pjbC5iaXRBcnJheS5jbGFtcChjLDQqZCl9fTtcbnNqY2wuY29kZWMuYmFzZTY0PXtTOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLGZyb21CaXRzOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1cIlwiLGU9MCxmPXNqY2wuY29kZWMuYmFzZTY0LlMsZz0wLGg9c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSk7YyYmKGY9Zi5zdWJzdHIoMCw2MikrXCItX1wiKTtmb3IoYz0wOzYqZC5sZW5ndGg8aDspZCs9Zi5jaGFyQXQoKGdeYVtjXT4+PmUpPj4+MjYpLDY+ZT8oZz1hW2NdPDw2LWUsZSs9MjYsYysrKTooZzw8PTYsZS09Nik7Zm9yKDtkLmxlbmd0aCYzJiYhYjspZCs9XCI9XCI7cmV0dXJuIGR9LHRvQml0czpmdW5jdGlvbihhLGIpe2E9YS5yZXBsYWNlKC9cXHN8PS9nLFwiXCIpO3ZhciBjPVtdLGQsZT0wLGY9c2pjbC5jb2RlYy5iYXNlNjQuUyxnPTAsaDtiJiYoZj1mLnN1YnN0cigwLDYyKStcIi1fXCIpO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspe2g9Zi5pbmRleE9mKGEuY2hhckF0KGQpKTtcbmlmKDA+aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcInRoaXMgaXNuJ3QgYmFzZTY0IVwiKTsyNjxlPyhlLT0yNixjLnB1c2goZ15oPj4+ZSksZz1oPDwzMi1lKTooZSs9NixnXj1oPDwzMi1lKX1lJjU2JiZjLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKGUmNTYsZywxKSk7cmV0dXJuIGN9fTtzamNsLmNvZGVjLmJhc2U2NHVybD17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHNqY2wuY29kZWMuYmFzZTY0LmZyb21CaXRzKGEsMSwxKX0sdG9CaXRzOmZ1bmN0aW9uKGEpe3JldHVybiBzamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYSwxKX19O3NqY2wuaGFzaC5zaGEyNTY9ZnVuY3Rpb24oYSl7dGhpcy5iWzBdfHx0aGlzLkMoKTthPyh0aGlzLmc9YS5nLnNsaWNlKDApLHRoaXMuZj1hLmYuc2xpY2UoMCksdGhpcy5jPWEuYyk6dGhpcy5yZXNldCgpfTtzamNsLmhhc2guc2hhMjU2Lmhhc2g9ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyBzamNsLmhhc2guc2hhMjU2KS51cGRhdGUoYSkuZmluYWxpemUoKX07XG5zamNsLmhhc2guc2hhMjU2LnByb3RvdHlwZT17YmxvY2tTaXplOjUxMixyZXNldDpmdW5jdGlvbigpe3RoaXMuZz10aGlzLm8uc2xpY2UoMCk7dGhpcy5mPVtdO3RoaXMuYz0wO3JldHVybiB0aGlzfSx1cGRhdGU6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYoYT1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGEpKTt2YXIgYixjPXRoaXMuZj1zamNsLmJpdEFycmF5LmNvbmNhdCh0aGlzLmYsYSk7Yj10aGlzLmM7YT10aGlzLmM9YitzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtpZigweDFmZmZmZmZmZmZmZmZmPGEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0c1wiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt2YXIgZD1uZXcgVWludDMyQXJyYXkoYyksZT0wO2ZvcihiPTUxMitiLSg1MTIrYiYweDFmZik7Yjw9YTtiKz01MTIpdGhpcy5sKGQuc3ViYXJyYXkoMTYqZSxcbjE2KihlKzEpKSksZSs9MTtjLnNwbGljZSgwLDE2KmUpfWVsc2UgZm9yKGI9NTEyK2ItKDUxMitiJjB4MWZmKTtiPD1hO2IrPTUxMil0aGlzLmwoYy5zcGxpY2UoMCwxNikpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5mLGM9dGhpcy5nLGI9c2pjbC5iaXRBcnJheS5jb25jYXQoYixbc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDEsMSldKTtmb3IoYT1iLmxlbmd0aCsyO2EmMTU7YSsrKWIucHVzaCgwKTtiLnB1c2goTWF0aC5mbG9vcih0aGlzLmMvMHgxMDAwMDAwMDApKTtmb3IoYi5wdXNoKHRoaXMuY3wwKTtiLmxlbmd0aDspdGhpcy5sKGIuc3BsaWNlKDAsMTYpKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGN9LG86W10sYjpbXSxDOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gMHgxMDAwMDAwMDAqKGEtTWF0aC5mbG9vcihhKSl8MH1mb3IodmFyIGI9MCxjPTIsZCxlOzY0PmI7YysrKXtlPSEwO2ZvcihkPTI7ZCpkPD1jO2QrKylpZigwPT09YyVkKXtlPVxuITE7YnJlYWt9ZSYmKDg+YiYmKHRoaXMub1tiXT1hKE1hdGgucG93KGMsLjUpKSksdGhpcy5iW2JdPWEoTWF0aC5wb3coYywxLzMpKSxiKyspfX0sbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzLmcsZj10aGlzLmIsZz1lWzBdLGg9ZVsxXSxrPWVbMl0sbj1lWzNdLGw9ZVs0XSxtPWVbNV0scD1lWzZdLHo9ZVs3XTtmb3IoYj0wOzY0PmI7YisrKTE2PmI/Yz1hW2JdOihjPWFbYisxJjE1XSxkPWFbYisxNCYxNV0sYz1hW2ImMTVdPShjPj4+N15jPj4+MTheYz4+PjNeYzw8MjVeYzw8MTQpKyhkPj4+MTdeZD4+PjE5XmQ+Pj4xMF5kPDwxNV5kPDwxMykrYVtiJjE1XSthW2IrOSYxNV18MCksYz1jK3orKGw+Pj42Xmw+Pj4xMV5sPj4+MjVebDw8MjZebDw8MjFebDw8NykrKHBebCYobV5wKSkrZltiXSx6PXAscD1tLG09bCxsPW4rY3wwLG49ayxrPWgsaD1nLGc9YysoaCZrXm4mKGheaykpKyhoPj4+Ml5oPj4+MTNeaD4+PjIyXmg8PDMwXmg8PDE5Xmg8PDEwKXwwO2VbMF09ZVswXStnfFxuMDtlWzFdPWVbMV0raHwwO2VbMl09ZVsyXStrfDA7ZVszXT1lWzNdK258MDtlWzRdPWVbNF0rbHwwO2VbNV09ZVs1XSttfDA7ZVs2XT1lWzZdK3B8MDtlWzddPWVbN10renwwfX07c2pjbC5oYXNoLnNoYTUxMj1mdW5jdGlvbihhKXt0aGlzLmJbMF18fHRoaXMuQygpO2E/KHRoaXMuZz1hLmcuc2xpY2UoMCksdGhpcy5mPWEuZi5zbGljZSgwKSx0aGlzLmM9YS5jKTp0aGlzLnJlc2V0KCl9O3NqY2wuaGFzaC5zaGE1MTIuaGFzaD1mdW5jdGlvbihhKXtyZXR1cm4obmV3IHNqY2wuaGFzaC5zaGE1MTIpLnVwZGF0ZShhKS5maW5hbGl6ZSgpfTtcbnNqY2wuaGFzaC5zaGE1MTIucHJvdG90eXBlPXtibG9ja1NpemU6MTAyNCxyZXNldDpmdW5jdGlvbigpe3RoaXMuZz10aGlzLm8uc2xpY2UoMCk7dGhpcy5mPVtdO3RoaXMuYz0wO3JldHVybiB0aGlzfSx1cGRhdGU6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYoYT1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGEpKTt2YXIgYixjPXRoaXMuZj1zamNsLmJpdEFycmF5LmNvbmNhdCh0aGlzLmYsYSk7Yj10aGlzLmM7YT10aGlzLmM9YitzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtpZigweDFmZmZmZmZmZmZmZmZmPGEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0c1wiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt2YXIgZD1uZXcgVWludDMyQXJyYXkoYyksZT0wO2ZvcihiPTEwMjQrYi0oMTAyNCtiJjEwMjMpO2I8PWE7Yis9MTAyNCl0aGlzLmwoZC5zdWJhcnJheSgzMipcbmUsMzIqKGUrMSkpKSxlKz0xO2Muc3BsaWNlKDAsMzIqZSl9ZWxzZSBmb3IoYj0xMDI0K2ItKDEwMjQrYiYxMDIzKTtiPD1hO2IrPTEwMjQpdGhpcy5sKGMuc3BsaWNlKDAsMzIpKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuZixjPXRoaXMuZyxiPXNqY2wuYml0QXJyYXkuY29uY2F0KGIsW3NqY2wuYml0QXJyYXkucGFydGlhbCgxLDEpXSk7Zm9yKGE9Yi5sZW5ndGgrNDthJjMxO2ErKyliLnB1c2goMCk7Yi5wdXNoKDApO2IucHVzaCgwKTtiLnB1c2goTWF0aC5mbG9vcih0aGlzLmMvMHgxMDAwMDAwMDApKTtmb3IoYi5wdXNoKHRoaXMuY3wwKTtiLmxlbmd0aDspdGhpcy5sKGIuc3BsaWNlKDAsMzIpKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGN9LG86W10saWE6WzEyMzcyMjMyLDEzMjgxMDgzLDk3NjI4NTksMTkxNDYwOSwxNTEwNjc2OSw0MDkwOTExLDQzMDgzMzEsODI2NjEwNV0sYjpbXSxrYTpbMjY2NjAxOCwxNTY4OTE2NSw1MDYxNDIzLDkwMzQ2ODQsXG40NzY0OTg0LDM4MDk1MywxNjU4Nzc5LDcxNzY0NzIsMTk3MTg2LDczNjg2MzgsMTQ5ODc5MTYsMTY3NTc5ODYsODA5NjExMSwxNDgwMzY5LDEzMDQ2MzI1LDY4OTExNTYsMTU4MTMzMzAsNTE4NzA0Myw5MjI5NzQ5LDExMzEyMjI5LDI4MTg2NzcsMTA5Mzc0NzUsNDMyNDMwOCwxMTM1NTQxLDY3NDE5MzEsMTE4MDkyOTYsMTY0NTgwNDcsMTU2NjY5MTYsMTEwNDY4NTAsNjk4MTQ5LDIyOTk5OSw5NDU3NzYsMTM3NzQ4NDQsMjU0MTg2MiwxMjg1NjA0NSw5ODEwOTExLDExNDk0MzY2LDc4NDQ1MjAsMTU1NzY4MDYsODUzMzMwNywxNTc5NTA0NCw0MzM3NjY1LDE2MjkxNzI5LDU1NTM3MTIsMTU2ODQxMjAsNjY2MjQxNiw3NDEzODAyLDEyMzA4OTIwLDEzODE2MDA4LDQzMDM2OTksOTM2NjQyNSwxMDE3NjY4MCwxMzE5NTg3NSw0Mjk1MzcxLDY1NDYyOTEsMTE3MTI2NzUsMTU3MDg5MjQsMTUxOTQ1NiwxNTc3MjUzMCw2NTY4NDI4LDY0OTU3ODQsODU2ODI5NywxMzAwNzEyNSw3NDkyMzk1LDI1MTUzNTYsXG4xMjYzMjU4MywxNDc0MDI1NCw3MjYyNTg0LDE1MzU5MzAsMTMxNDYyNzgsMTYzMjE5NjYsMTg1MzIxMSwyOTQyNzYsMTMwNTEwMjcsMTMyMjE1NjQsMTA1MTk4MCw0MDgwMzEwLDY2NTE0MzQsMTQwODg5NDAsNDY3NTYwN10sQzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIDB4MTAwMDAwMDAwKihhLU1hdGguZmxvb3IoYSkpfDB9ZnVuY3Rpb24gYihhKXtyZXR1cm4gMHgxMDAwMDAwMDAwMCooYS1NYXRoLmZsb29yKGEpKSYyNTV9Zm9yKHZhciBjPTAsZD0yLGUsZjs4MD5jO2QrKyl7Zj0hMDtmb3IoZT0yO2UqZTw9ZDtlKyspaWYoMD09PWQlZSl7Zj0hMTticmVha31mJiYoOD5jJiYodGhpcy5vWzIqY109YShNYXRoLnBvdyhkLC41KSksdGhpcy5vWzIqYysxXT1iKE1hdGgucG93KGQsLjUpKTw8MjR8dGhpcy5pYVtjXSksdGhpcy5iWzIqY109YShNYXRoLnBvdyhkLDEvMykpLHRoaXMuYlsyKmMrMV09YihNYXRoLnBvdyhkLDEvMykpPDwyNHx0aGlzLmthW2NdLGMrKyl9fSxsOmZ1bmN0aW9uKGEpe3ZhciBiLFxuYyxkPXRoaXMuZyxlPXRoaXMuYixmPWRbMF0sZz1kWzFdLGg9ZFsyXSxrPWRbM10sbj1kWzRdLGw9ZFs1XSxtPWRbNl0scD1kWzddLHo9ZFs4XSxBPWRbOV0sQz1kWzEwXSxCPWRbMTFdLEQ9ZFsxMl0sUD1kWzEzXSxlYT1kWzE0XSxRPWRbMTVdLHQ7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7dD1BcnJheSgxNjApO2Zvcih2YXIgcj0wOzMyPnI7cisrKXRbcl09YVtyXX1lbHNlIHQ9YTt2YXIgcj1mLHU9ZyxHPWgsRT1rLEg9bixGPWwsVj1tLEk9cCx3PXosdj1BLFI9QyxKPUIsUz1ELEs9UCxXPWVhLEw9UTtmb3IoYT0wOzgwPmE7YSsrKXtpZigxNj5hKWI9dFsyKmFdLGM9dFsyKmErMV07ZWxzZXtjPXRbMiooYS0xNSldO3ZhciBxPXRbMiooYS0xNSkrMV07Yj0ocTw8MzF8Yz4+PjEpXihxPDwyNHxjPj4+OCleYz4+Pjc7dmFyIHg9KGM8PDMxfHE+Pj4xKV4oYzw8MjR8cT4+PjgpXihjPDwyNXxxPj4+Nyk7Yz10WzIqKGEtMildO3ZhciB5PXRbMiooYS0yKSsxXSxcbnE9KHk8PDEzfGM+Pj4xOSleKGM8PDN8eT4+PjI5KV5jPj4+Nix5PShjPDwxM3x5Pj4+MTkpXih5PDwzfGM+Pj4yOSleKGM8PDI2fHk+Pj42KSxYPXRbMiooYS03KV0sWT10WzIqKGEtMTYpXSxNPXRbMiooYS0xNikrMV07Yz14K3RbMiooYS03KSsxXTtiPWIrWCsoYz4+PjA8eD4+PjA/MTowKTtjKz15O2IrPXErKGM+Pj4wPHk+Pj4wPzE6MCk7Yys9TTtiKz1ZKyhjPj4+MDxNPj4+MD8xOjApfXRbMiphXT1ifD0wO3RbMiphKzFdPWN8PTA7dmFyIFg9dyZSXn53JlMsZmE9diZKXn52JksseT1yJkdeciZIXkcmSCxqYT11JkVedSZGXkUmRixZPSh1PDw0fHI+Pj4yOCleKHI8PDMwfHU+Pj4yKV4ocjw8MjV8dT4+PjcpLE09KHI8PDR8dT4+PjI4KV4odTw8MzB8cj4+PjIpXih1PDwyNXxyPj4+Nyksa2E9ZVsyKmFdLGdhPWVbMiphKzFdLHE9TCsoKHc8PDE4fHY+Pj4xNCleKHc8PDE0fHY+Pj4xOCleKHY8PDIzfHc+Pj45KSkseD1XKygodjw8MTh8dz4+PjE0KV4odjw8MTR8dz4+PjE4KV4odzw8XG4yM3x2Pj4+OSkpKyhxPj4+MDxMPj4+MD8xOjApLHE9cStmYSx4PXgrKFgrKHE+Pj4wPGZhPj4+MD8xOjApKSxxPXErZ2EseD14KyhrYSsocT4+PjA8Z2E+Pj4wPzE6MCkpLHE9cStjfDAseD14KyhiKyhxPj4+MDxjPj4+MD8xOjApKTtjPU0ramE7Yj1ZK3krKGM+Pj4wPE0+Pj4wPzE6MCk7Vz1TO0w9SztTPVI7Sz1KO1I9dztKPXY7dj1JK3F8MDt3PVYreCsodj4+PjA8ST4+PjA/MTowKXwwO1Y9SDtJPUY7SD1HO0Y9RTtHPXI7RT11O3U9cStjfDA7cj14K2IrKHU+Pj4wPHE+Pj4wPzE6MCl8MH1nPWRbMV09Zyt1fDA7ZFswXT1mK3IrKGc+Pj4wPHU+Pj4wPzE6MCl8MDtrPWRbM109aytFfDA7ZFsyXT1oK0crKGs+Pj4wPEU+Pj4wPzE6MCl8MDtsPWRbNV09bCtGfDA7ZFs0XT1uK0grKGw+Pj4wPEY+Pj4wPzE6MCl8MDtwPWRbN109cCtJfDA7ZFs2XT1tK1YrKHA+Pj4wPEk+Pj4wPzE6MCl8MDtBPWRbOV09QSt2fDA7ZFs4XT16K3crKEE+Pj4wPHY+Pj4wPzE6MCl8MDtCPWRbMTFdPUIrSnxcbjA7ZFsxMF09QytSKyhCPj4+MDxKPj4+MD8xOjApfDA7UD1kWzEzXT1QK0t8MDtkWzEyXT1EK1MrKFA+Pj4wPEs+Pj4wPzE6MCl8MDtRPWRbMTVdPVErTHwwO2RbMTRdPWVhK1crKFE+Pj4wPEw+Pj4wPzE6MCl8MH19O1xuc2pjbC5tb2RlLmNjbT17bmFtZTpcImNjbVwiLEY6W10sbGlzdGVuUHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7c2pjbC5tb2RlLmNjbS5GLnB1c2goYSl9LHVuTGlzdGVuUHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT1zamNsLm1vZGUuY2NtLkYuaW5kZXhPZihhKTstMTxhJiZzamNsLm1vZGUuY2NtLkYuc3BsaWNlKGEsMSl9LGRhOmZ1bmN0aW9uKGEpe3ZhciBiPXNqY2wubW9kZS5jY20uRi5zbGljZSgpLGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrPTEpYltjXShhKX0sZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc9Yi5zbGljZSgwKSxoPXNqY2wuYml0QXJyYXksaz1oLmJpdExlbmd0aChjKS84LG49aC5iaXRMZW5ndGgoZykvODtlPWV8fDY0O2Q9ZHx8W107aWYoNz5rKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpdiBtdXN0IGJlIGF0IGxlYXN0IDcgYnl0ZXNcIik7Zm9yKGY9Mjs0PmYmJm4+Pj44KmY7ZisrKTtmPDE1LWsmJihmPTE1LWspO2M9aC5jbGFtcChjLFxuOCooMTUtZikpO2I9c2pjbC5tb2RlLmNjbS5VKGEsYixjLGQsZSxmKTtnPXNqY2wubW9kZS5jY20uVihhLGcsYyxiLGUsZik7cmV0dXJuIGguY29uY2F0KGcuZGF0YSxnLnRhZyl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXtlPWV8fDY0O2Q9ZHx8W107dmFyIGY9c2pjbC5iaXRBcnJheSxnPWYuYml0TGVuZ3RoKGMpLzgsaD1mLmJpdExlbmd0aChiKSxrPWYuY2xhbXAoYixoLWUpLG49Zi5iaXRTbGljZShiLGgtZSksaD0oaC1lKS84O2lmKDc+Zyl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImNjbTogaXYgbXVzdCBiZSBhdCBsZWFzdCA3IGJ5dGVzXCIpO2ZvcihiPTI7ND5iJiZoPj4+OCpiO2IrKyk7YjwxNS1nJiYoYj0xNS1nKTtjPWYuY2xhbXAoYyw4KigxNS1iKSk7az1zamNsLm1vZGUuY2NtLlYoYSxrLGMsbixlLGIpO2E9c2pjbC5tb2RlLmNjbS5VKGEsay5kYXRhLGMsZCxlLGIpO2lmKCFmLmVxdWFsKGsudGFnLGEpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5jb3JydXB0KFwiY2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKTtcbnJldHVybiBrLmRhdGF9LG1hOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1bXSxoPXNqY2wuYml0QXJyYXksaz1oLlA7ZD1baC5wYXJ0aWFsKDgsKGIubGVuZ3RoPzY0OjApfGQtMjw8MnxmLTEpXTtkPWguY29uY2F0KGQsYyk7ZFszXXw9ZTtkPWEuZW5jcnlwdChkKTtpZihiLmxlbmd0aClmb3IoYz1oLmJpdExlbmd0aChiKS84LDY1Mjc5Pj1jP2c9W2gucGFydGlhbCgxNixjKV06MHhmZmZmZmZmZj49YyYmKGc9aC5jb25jYXQoW2gucGFydGlhbCgxNiw2NTUzNCldLFtjXSkpLGc9aC5jb25jYXQoZyxiKSxiPTA7YjxnLmxlbmd0aDtiKz00KWQ9YS5lbmNyeXB0KGsoZCxnLnNsaWNlKGIsYis0KS5jb25jYXQoWzAsMCwwXSkpKTtyZXR1cm4gZH0sVTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9c2pjbC5iaXRBcnJheSxoPWcuUDtlLz04O2lmKGUlMnx8ND5lfHwxNjxlKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5pZigweGZmZmZmZmZmPGQubGVuZ3RofHwweGZmZmZmZmZmPGIubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJjY206IGNhbid0IGRlYWwgd2l0aCA0R2lCIG9yIG1vcmUgZGF0YVwiKTtjPXNqY2wubW9kZS5jY20ubWEoYSxkLGMsZSxnLmJpdExlbmd0aChiKS84LGYpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKz00KWM9YS5lbmNyeXB0KGgoYyxiLnNsaWNlKGQsZCs0KS5jb25jYXQoWzAsMCwwXSkpKTtyZXR1cm4gZy5jbGFtcChjLDgqZSl9LFY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnLGg9c2pjbC5iaXRBcnJheTtnPWguUDt2YXIgaz1iLmxlbmd0aCxuPWguYml0TGVuZ3RoKGIpLGw9ay81MCxtPWw7Yz1oLmNvbmNhdChbaC5wYXJ0aWFsKDgsZi0xKV0sYykuY29uY2F0KFswLDAsMF0pLnNsaWNlKDAsNCk7ZD1oLmJpdFNsaWNlKGcoZCxhLmVuY3J5cHQoYykpLDAsZSk7aWYoIWspcmV0dXJue3RhZzpkLGRhdGE6W119O2ZvcihnPTA7ZzxrO2crPTQpZz5sJiYoc2pjbC5tb2RlLmNjbS5kYShnL1xuayksbCs9bSksY1szXSsrLGU9YS5lbmNyeXB0KGMpLGJbZ11ePWVbMF0sYltnKzFdXj1lWzFdLGJbZysyXV49ZVsyXSxiW2crM11ePWVbM107cmV0dXJue3RhZzpkLGRhdGE6aC5jbGFtcChiLG4pfX19O3NqY2wubWlzYy5obWFjPWZ1bmN0aW9uKGEsYil7dGhpcy5XPWI9Ynx8c2pjbC5oYXNoLnNoYTI1Njt2YXIgYz1bW10sW11dLGQsZT1iLnByb3RvdHlwZS5ibG9ja1NpemUvMzI7dGhpcy5CPVtuZXcgYixuZXcgYl07YS5sZW5ndGg+ZSYmKGE9Yi5oYXNoKGEpKTtmb3IoZD0wO2Q8ZTtkKyspY1swXVtkXT1hW2RdXjkwOTUyMjQ4NixjWzFdW2RdPWFbZF1eMTU0OTU1NjgyODt0aGlzLkJbMF0udXBkYXRlKGNbMF0pO3RoaXMuQlsxXS51cGRhdGUoY1sxXSk7dGhpcy5PPW5ldyBiKHRoaXMuQlswXSl9O1xuc2pjbC5taXNjLmhtYWMucHJvdG90eXBlLmVuY3J5cHQ9c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLm1hYz1mdW5jdGlvbihhKXtpZih0aGlzLlopdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJlbmNyeXB0IG9uIGFscmVhZHkgdXBkYXRlZCBobWFjIGNhbGxlZCFcIik7dGhpcy51cGRhdGUoYSk7cmV0dXJuIHRoaXMuZGlnZXN0KGEpfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLk89bmV3IHRoaXMuVyh0aGlzLkJbMF0pO3RoaXMuWj0hMX07c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLlo9ITA7dGhpcy5PLnVwZGF0ZShhKX07c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuTy5maW5hbGl6ZSgpLGE9KG5ldyB0aGlzLlcodGhpcy5CWzFdKSkudXBkYXRlKGEpLmZpbmFsaXplKCk7dGhpcy5yZXNldCgpO3JldHVybiBhfTtcbnNqY2wubWlzYy5wYmtkZjI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtjPWN8fDFFNDtpZigwPmR8fDA+Yyl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgcGFyYW1zIHRvIHBia2RmMlwiKTtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO1wic3RyaW5nXCI9PT10eXBlb2YgYiYmKGI9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhiKSk7ZT1lfHxzamNsLm1pc2MuaG1hYzthPW5ldyBlKGEpO3ZhciBmLGcsaCxrLG49W10sbD1zamNsLmJpdEFycmF5O2ZvcihrPTE7MzIqbi5sZW5ndGg8KGR8fDEpO2srKyl7ZT1mPWEuZW5jcnlwdChsLmNvbmNhdChiLFtrXSkpO2ZvcihnPTE7ZzxjO2crKylmb3IoZj1hLmVuY3J5cHQoZiksaD0wO2g8Zi5sZW5ndGg7aCsrKWVbaF1ePWZbaF07bj1uLmNvbmNhdChlKX1kJiYobj1sLmNsYW1wKG4sZCkpO3JldHVybiBufTtcbnNqY2wucHJuZz1mdW5jdGlvbihhKXt0aGlzLmg9W25ldyBzamNsLmhhc2guc2hhMjU2XTt0aGlzLnM9WzBdO3RoaXMuTj0wO3RoaXMuRz17fTt0aGlzLk09MDt0aGlzLlQ9e307dGhpcy5YPXRoaXMuaT10aGlzLnU9dGhpcy5mYT0wO3RoaXMuYj1bMCwwLDAsMCwwLDAsMCwwXTt0aGlzLm09WzAsMCwwLDBdO3RoaXMuSz12b2lkIDA7dGhpcy5MPWE7dGhpcy5EPSExO3RoaXMuSj17cHJvZ3Jlc3M6e30sc2VlZGVkOnt9fTt0aGlzLkE9dGhpcy5lYT0wO3RoaXMuSD0xO3RoaXMuST0yO3RoaXMuYWE9MHgxMDAwMDt0aGlzLlI9WzAsNDgsNjQsOTYsMTI4LDE5MiwweDEwMCwzODQsNTEyLDc2OCwxMDI0XTt0aGlzLmJhPTNFNDt0aGlzLiQ9ODB9O1xuc2pjbC5wcm5nLnByb3RvdHlwZT17cmFuZG9tV29yZHM6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkO2Q9dGhpcy5pc1JlYWR5KGIpO3ZhciBlO2lmKGQ9PT10aGlzLkEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLm5vdFJlYWR5KFwiZ2VuZXJhdG9yIGlzbid0IHNlZWRlZFwiKTtpZihkJnRoaXMuSSl7ZD0hKGQmdGhpcy5IKTtlPVtdO3ZhciBmPTAsZzt0aGlzLlg9ZVswXT0obmV3IERhdGUpLnZhbHVlT2YoKSt0aGlzLmJhO2ZvcihnPTA7MTY+ZztnKyspZS5wdXNoKDB4MTAwMDAwMDAwKk1hdGgucmFuZG9tKCl8MCk7Zm9yKGc9MDtnPHRoaXMuaC5sZW5ndGgmJihlPWUuY29uY2F0KHRoaXMuaFtnXS5maW5hbGl6ZSgpKSxmKz10aGlzLnNbZ10sdGhpcy5zW2ddPTAsZHx8ISh0aGlzLk4mMTw8ZykpO2crKyk7dGhpcy5OPj0xPDx0aGlzLmgubGVuZ3RoJiYodGhpcy5oLnB1c2gobmV3IHNqY2wuaGFzaC5zaGEyNTYpLHRoaXMucy5wdXNoKDApKTt0aGlzLmktPWY7Zj50aGlzLnUmJih0aGlzLnU9XG5mKTt0aGlzLk4rKzt0aGlzLmI9c2pjbC5oYXNoLnNoYTI1Ni5oYXNoKHRoaXMuYi5jb25jYXQoZSkpO3RoaXMuSz1uZXcgc2pjbC5jaXBoZXIuYWVzKHRoaXMuYik7Zm9yKGQ9MDs0PmQmJih0aGlzLm1bZF09dGhpcy5tW2RdKzF8MCwhdGhpcy5tW2RdKTtkKyspO31mb3IoZD0wO2Q8YTtkKz00KTA9PT0oZCsxKSV0aGlzLmFhJiZiYSh0aGlzKSxlPU4odGhpcyksYy5wdXNoKGVbMF0sZVsxXSxlWzJdLGVbM10pO2JhKHRoaXMpO3JldHVybiBjLnNsaWNlKDAsYSl9LHNldERlZmF1bHRQYXJhbm9pYTpmdW5jdGlvbihhLGIpe2lmKDA9PT1hJiZcIlNldHRpbmcgcGFyYW5vaWE9MCB3aWxsIHJ1aW4geW91ciBzZWN1cml0eTsgdXNlIGl0IG9ubHkgZm9yIHRlc3RpbmdcIiE9PWIpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJTZXR0aW5nIHBhcmFub2lhPTAgd2lsbCBydWluIHlvdXIgc2VjdXJpdHk7IHVzZSBpdCBvbmx5IGZvciB0ZXN0aW5nXCIpO3RoaXMuTD1hfSxhZGRFbnRyb3B5OmZ1bmN0aW9uKGEsXG5iLGMpe2M9Y3x8XCJ1c2VyXCI7dmFyIGQsZSxmPShuZXcgRGF0ZSkudmFsdWVPZigpLGc9dGhpcy5HW2NdLGg9dGhpcy5pc1JlYWR5KCksaz0wO2Q9dGhpcy5UW2NdO3ZvaWQgMD09PWQmJihkPXRoaXMuVFtjXT10aGlzLmZhKyspO3ZvaWQgMD09PWcmJihnPXRoaXMuR1tjXT0wKTt0aGlzLkdbY109KHRoaXMuR1tjXSsxKSV0aGlzLmgubGVuZ3RoO3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcIm51bWJlclwiOnZvaWQgMD09PWImJihiPTEpO3RoaXMuaFtnXS51cGRhdGUoW2QsdGhpcy5NKyssMSxiLGYsMSxhfDBdKTticmVhaztjYXNlIFwib2JqZWN0XCI6Yz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiPT09Yyl7ZT1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdKTthPWV9ZWxzZSBmb3IoXCJbb2JqZWN0IEFycmF5XVwiIT09YyYmKGs9MSksYz0wO2M8YS5sZW5ndGgmJiFrO2MrKylcIm51bWJlclwiIT09dHlwZW9mIGFbY10mJlxuKGs9MSk7aWYoIWspe2lmKHZvaWQgMD09PWIpZm9yKGM9Yj0wO2M8YS5sZW5ndGg7YysrKWZvcihlPWFbY107MDxlOyliKyssZT1lPj4+MTt0aGlzLmhbZ10udXBkYXRlKFtkLHRoaXMuTSsrLDIsYixmLGEubGVuZ3RoXS5jb25jYXQoYSkpfWJyZWFrO2Nhc2UgXCJzdHJpbmdcIjp2b2lkIDA9PT1iJiYoYj1hLmxlbmd0aCk7dGhpcy5oW2ddLnVwZGF0ZShbZCx0aGlzLk0rKywzLGIsZixhLmxlbmd0aF0pO3RoaXMuaFtnXS51cGRhdGUoYSk7YnJlYWs7ZGVmYXVsdDprPTF9aWYoayl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwicmFuZG9tOiBhZGRFbnRyb3B5IG9ubHkgc3VwcG9ydHMgbnVtYmVyLCBhcnJheSBvZiBudW1iZXJzIG9yIHN0cmluZ1wiKTt0aGlzLnNbZ10rPWI7dGhpcy5pKz1iO2g9PT10aGlzLkEmJih0aGlzLmlzUmVhZHkoKSE9PXRoaXMuQSYmY2EoXCJzZWVkZWRcIixNYXRoLm1heCh0aGlzLnUsdGhpcy5pKSksY2EoXCJwcm9ncmVzc1wiLHRoaXMuZ2V0UHJvZ3Jlc3MoKSkpfSxcbmlzUmVhZHk6ZnVuY3Rpb24oYSl7YT10aGlzLlJbdm9pZCAwIT09YT9hOnRoaXMuTF07cmV0dXJuIHRoaXMudSYmdGhpcy51Pj1hP3RoaXMuc1swXT50aGlzLiQmJihuZXcgRGF0ZSkudmFsdWVPZigpPnRoaXMuWD90aGlzLkl8dGhpcy5IOnRoaXMuSDp0aGlzLmk+PWE/dGhpcy5JfHRoaXMuQTp0aGlzLkF9LGdldFByb2dyZXNzOmZ1bmN0aW9uKGEpe2E9dGhpcy5SW2E/YTp0aGlzLkxdO3JldHVybiB0aGlzLnU+PWE/MTp0aGlzLmk+YT8xOnRoaXMuaS9hfSxzdGFydENvbGxlY3RvcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5EKXt0aGlzLmE9e2xvYWRUaW1lQ29sbGVjdG9yOk8odGhpcyx0aGlzLmxhKSxtb3VzZUNvbGxlY3RvcjpPKHRoaXMsdGhpcy5uYSksa2V5Ym9hcmRDb2xsZWN0b3I6Tyh0aGlzLHRoaXMuamEpLGFjY2VsZXJvbWV0ZXJDb2xsZWN0b3I6Tyh0aGlzLHRoaXMuY2EpLHRvdWNoQ29sbGVjdG9yOk8odGhpcyx0aGlzLnBhKX07aWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsXG50aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRldmljZW1vdGlvblwiLHRoaXMuYS5hY2NlbGVyb21ldGVyQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuYS50b3VjaENvbGxlY3RvciwhMSk7ZWxzZSBpZihkb2N1bWVudC5hdHRhY2hFdmVudClkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ubG9hZFwiLHRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciksZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbm1vdXNlbW92ZVwiLHRoaXMuYS5tb3VzZUNvbGxlY3RvciksZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3Rvcik7ZWxzZSB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwiY2FuJ3QgYXR0YWNoIGV2ZW50XCIpO1xudGhpcy5EPSEwfX0sc3RvcENvbGxlY3RvcnM6ZnVuY3Rpb24oKXt0aGlzLkQmJih3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcj8od2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuYS5tb3VzZUNvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkZXZpY2Vtb3Rpb25cIix0aGlzLmEuYWNjZWxlcm9tZXRlckNvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLmEudG91Y2hDb2xsZWN0b3IsITEpKTpkb2N1bWVudC5kZXRhY2hFdmVudCYmKGRvY3VtZW50LmRldGFjaEV2ZW50KFwib25sb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yKSxkb2N1bWVudC5kZXRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsXG50aGlzLmEubW91c2VDb2xsZWN0b3IpLGRvY3VtZW50LmRldGFjaEV2ZW50KFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IpKSx0aGlzLkQ9ITEpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5KW2FdW3RoaXMuZWErK109Yn0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT10aGlzLkpbYV0sZj1bXTtmb3IoZCBpbiBlKWUuaGFzT3duUHJvcGVydHkoZCkmJmVbZF09PT1iJiZmLnB1c2goZCk7Zm9yKGM9MDtjPGYubGVuZ3RoO2MrKylkPWZbY10sZGVsZXRlIGVbZF19LGphOmZ1bmN0aW9uKCl7VCh0aGlzLDEpfSxuYTpmdW5jdGlvbihhKXt2YXIgYixjO3RyeXtiPWEueHx8YS5jbGllbnRYfHxhLm9mZnNldFh8fDAsYz1hLnl8fGEuY2xpZW50WXx8YS5vZmZzZXRZfHwwfWNhdGNoKGQpe2M9Yj0wfTAhPWImJjAhPWMmJnRoaXMuYWRkRW50cm9weShbYixjXSwyLFwibW91c2VcIik7VCh0aGlzLDApfSxwYTpmdW5jdGlvbihhKXthPVxuYS50b3VjaGVzWzBdfHxhLmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuYWRkRW50cm9weShbYS5wYWdlWHx8YS5jbGllbnRYLGEucGFnZVl8fGEuY2xpZW50WV0sMSxcInRvdWNoXCIpO1QodGhpcywwKX0sbGE6ZnVuY3Rpb24oKXtUKHRoaXMsMil9LGNhOmZ1bmN0aW9uKGEpe2E9YS5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lnh8fGEuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS55fHxhLmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkuejtpZih3aW5kb3cub3JpZW50YXRpb24pe3ZhciBiPXdpbmRvdy5vcmllbnRhdGlvbjtcIm51bWJlclwiPT09dHlwZW9mIGImJnRoaXMuYWRkRW50cm9weShiLDEsXCJhY2NlbGVyb21ldGVyXCIpfWEmJnRoaXMuYWRkRW50cm9weShhLDIsXCJhY2NlbGVyb21ldGVyXCIpO1QodGhpcywwKX19O1xuZnVuY3Rpb24gY2EoYSxiKXt2YXIgYyxkPXNqY2wucmFuZG9tLkpbYV0sZT1bXTtmb3IoYyBpbiBkKWQuaGFzT3duUHJvcGVydHkoYykmJmUucHVzaChkW2NdKTtmb3IoYz0wO2M8ZS5sZW5ndGg7YysrKWVbY10oYil9ZnVuY3Rpb24gVChhLGIpe1widW5kZWZpbmVkXCIhPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93P2EuYWRkRW50cm9weSh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCksYixcImxvYWR0aW1lXCIpOmEuYWRkRW50cm9weSgobmV3IERhdGUpLnZhbHVlT2YoKSxiLFwibG9hZHRpbWVcIil9ZnVuY3Rpb24gYmEoYSl7YS5iPU4oYSkuY29uY2F0KE4oYSkpO2EuSz1uZXcgc2pjbC5jaXBoZXIuYWVzKGEuYil9ZnVuY3Rpb24gTihhKXtmb3IodmFyIGI9MDs0PmImJihhLm1bYl09YS5tW2JdKzF8MCwhYS5tW2JdKTtiKyspO3JldHVybiBhLksuZW5jcnlwdChhLm0pfVxuZnVuY3Rpb24gTyhhLGIpe3JldHVybiBmdW5jdGlvbigpe2IuYXBwbHkoYSxhcmd1bWVudHMpfX1zamNsLnJhbmRvbT1uZXcgc2pjbC5wcm5nKDYpO1xuYTp0cnl7dmFyIFUsZGEsWixoYTtpZihoYT1cInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMpe3ZhciBpYTt0cnl7aWE9cmVxdWlyZShcImNyeXB0b1wiKX1jYXRjaChhKXtpYT1udWxsfWhhPWRhPWlhfWlmKGhhJiZkYS5yYW5kb21CeXRlcylVPWRhLnJhbmRvbUJ5dGVzKDEyOCksVT1uZXcgVWludDMyQXJyYXkoKG5ldyBVaW50OEFycmF5KFUpKS5idWZmZXIpLHNqY2wucmFuZG9tLmFkZEVudHJvcHkoVSwxMDI0LFwiY3J5cHRvWydyYW5kb21CeXRlcyddXCIpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe1o9bmV3IFVpbnQzMkFycmF5KDMyKTtpZih3aW5kb3cuY3J5cHRvJiZ3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyl3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhaKTtlbHNlIGlmKHdpbmRvdy5tc0NyeXB0byYmd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyl3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFopO1xuZWxzZSBicmVhayBhO3NqY2wucmFuZG9tLmFkZEVudHJvcHkoWiwxMDI0LFwiY3J5cHRvWydnZXRSYW5kb21WYWx1ZXMnXVwiKX19Y2F0Y2goYSl7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYoY29uc29sZS5sb2coXCJUaGVyZSB3YXMgYW4gZXJyb3IgY29sbGVjdGluZyBlbnRyb3B5IGZyb20gdGhlIGJyb3dzZXI6XCIpLGNvbnNvbGUubG9nKGEpKX1cbnNqY2wuanNvbj17ZGVmYXVsdHM6e3Y6MSxpdGVyOjFFNCxrczoxMjgsdHM6NjQsbW9kZTpcImNjbVwiLGFkYXRhOlwiXCIsY2lwaGVyOlwiYWVzXCJ9LGhhOmZ1bmN0aW9uKGEsYixjLGQpe2M9Y3x8e307ZD1kfHx7fTt2YXIgZT1zamNsLmpzb24sZj1lLmooe2l2OnNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDQsMCl9LGUuZGVmYXVsdHMpLGc7ZS5qKGYsYyk7Yz1mLmFkYXRhO1wic3RyaW5nXCI9PT10eXBlb2YgZi5zYWx0JiYoZi5zYWx0PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhmLnNhbHQpKTtcInN0cmluZ1wiPT09dHlwZW9mIGYuaXYmJihmLml2PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhmLml2KSk7aWYoIXNqY2wubW9kZVtmLm1vZGVdfHwhc2pjbC5jaXBoZXJbZi5jaXBoZXJdfHxcInN0cmluZ1wiPT09dHlwZW9mIGEmJjEwMD49Zi5pdGVyfHw2NCE9PWYudHMmJjk2IT09Zi50cyYmMTI4IT09Zi50c3x8MTI4IT09Zi5rcyYmMTkyIT09Zi5rcyYmMHgxMDAhPT1mLmtzfHwyPmYuaXYubGVuZ3RofHxcbjQ8Zi5pdi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGVuY3J5cHQ6IGludmFsaWQgcGFyYW1ldGVyc1wiKTtcInN0cmluZ1wiPT09dHlwZW9mIGE/KGc9c2pjbC5taXNjLmNhY2hlZFBia2RmMihhLGYpLGE9Zy5rZXkuc2xpY2UoMCxmLmtzLzMyKSxmLnNhbHQ9Zy5zYWx0KTpzamNsLmVjYyYmYSBpbnN0YW5jZW9mIHNqY2wuZWNjLmVsR2FtYWwucHVibGljS2V5JiYoZz1hLmtlbSgpLGYua2VtdGFnPWcudGFnLGE9Zy5rZXkuc2xpY2UoMCxmLmtzLzMyKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihmLmFkYXRhPWM9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhjKSk7Zz1uZXcgc2pjbC5jaXBoZXJbZi5jaXBoZXJdKGEpO2UuaihkLGYpO2Qua2V5PWE7Zi5jdD1cImNjbVwiPT09Zi5tb2RlJiZzamNsLmFycmF5QnVmZmVyJiZzamNsLmFycmF5QnVmZmVyLmNjbSYmXG5iIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/c2pjbC5hcnJheUJ1ZmZlci5jY20uZW5jcnlwdChnLGIsZi5pdixjLGYudHMpOnNqY2wubW9kZVtmLm1vZGVdLmVuY3J5cHQoZyxiLGYuaXYsYyxmLnRzKTtyZXR1cm4gZn0sZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1zamNsLmpzb24sZj1lLmhhLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gZS5lbmNvZGUoZil9LGdhOmZ1bmN0aW9uKGEsYixjLGQpe2M9Y3x8e307ZD1kfHx7fTt2YXIgZT1zamNsLmpzb247Yj1lLmooZS5qKGUuaih7fSxlLmRlZmF1bHRzKSxiKSxjLCEwKTt2YXIgZixnO2Y9Yi5hZGF0YTtcInN0cmluZ1wiPT09dHlwZW9mIGIuc2FsdCYmKGIuc2FsdD1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5zYWx0KSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiLml2JiYoYi5pdj1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5pdikpO2lmKCFzamNsLm1vZGVbYi5tb2RlXXx8IXNqY2wuY2lwaGVyW2IuY2lwaGVyXXx8XCJzdHJpbmdcIj09PVxudHlwZW9mIGEmJjEwMD49Yi5pdGVyfHw2NCE9PWIudHMmJjk2IT09Yi50cyYmMTI4IT09Yi50c3x8MTI4IT09Yi5rcyYmMTkyIT09Yi5rcyYmMHgxMDAhPT1iLmtzfHwhYi5pdnx8Mj5iLml2Lmxlbmd0aHx8NDxiLml2Lmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYT8oZz1zamNsLm1pc2MuY2FjaGVkUGJrZGYyKGEsYiksYT1nLmtleS5zbGljZSgwLGIua3MvMzIpLGIuc2FsdD1nLnNhbHQpOnNqY2wuZWNjJiZhIGluc3RhbmNlb2Ygc2pjbC5lY2MuZWxHYW1hbC5zZWNyZXRLZXkmJihhPWEudW5rZW0oc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGIua2VtdGFnKSkuc2xpY2UoMCxiLmtzLzMyKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBmJiYoZj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGYpKTtnPW5ldyBzamNsLmNpcGhlcltiLmNpcGhlcl0oYSk7Zj1cImNjbVwiPT09XG5iLm1vZGUmJnNqY2wuYXJyYXlCdWZmZXImJnNqY2wuYXJyYXlCdWZmZXIuY2NtJiZiLmN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/c2pjbC5hcnJheUJ1ZmZlci5jY20uZGVjcnlwdChnLGIuY3QsYi5pdixiLnRhZyxmLGIudHMpOnNqY2wubW9kZVtiLm1vZGVdLmRlY3J5cHQoZyxiLmN0LGIuaXYsZixiLnRzKTtlLmooZCxiKTtkLmtleT1hO3JldHVybiAxPT09Yy5yYXc/ZjpzamNsLmNvZGVjLnV0ZjhTdHJpbmcuZnJvbUJpdHMoZil9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9c2pjbC5qc29uO3JldHVybiBlLmdhKGEsZS5kZWNvZGUoYiksYyxkKX0sZW5jb2RlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJ7XCIsZD1cIlwiO2ZvcihiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7aWYoIWIubWF0Y2goL15bYS16MC05XSskL2kpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBlbmNvZGU6IGludmFsaWQgcHJvcGVydHkgbmFtZVwiKTtjKz1kKydcIicrXG5iKydcIjonO2Q9XCIsXCI7c3dpdGNoKHR5cGVvZiBhW2JdKXtjYXNlIFwibnVtYmVyXCI6Y2FzZSBcImJvb2xlYW5cIjpjKz1hW2JdO2JyZWFrO2Nhc2UgXCJzdHJpbmdcIjpjKz0nXCInK2VzY2FwZShhW2JdKSsnXCInO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpjKz0nXCInK3NqY2wuY29kZWMuYmFzZTY0LmZyb21CaXRzKGFbYl0sMCkrJ1wiJzticmVhaztkZWZhdWx0OnRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJqc29uIGVuY29kZTogdW5zdXBwb3J0ZWQgdHlwZVwiKTt9fXJldHVybiBjK1wifVwifSxkZWNvZGU6ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xccy9nLFwiXCIpO2lmKCFhLm1hdGNoKC9eXFx7LipcXH0kLykpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY29kZTogdGhpcyBpc24ndCBqc29uIVwiKTthPWEucmVwbGFjZSgvXlxce3xcXH0kL2csXCJcIikuc3BsaXQoLywvKTt2YXIgYj17fSxjLGQ7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7aWYoIShkPWFbY10ubWF0Y2goL15cXHMqKD86KFtcIiddPykoW2Etel1bYS16MC05XSopXFwxKVxccyo6XFxzKig/OigtP1xcZCspfFwiKFthLXowLTkrXFwvJSpfLkA9XFwtXSopXCJ8KHRydWV8ZmFsc2UpKSQvaSkpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBkZWNvZGU6IHRoaXMgaXNuJ3QganNvbiFcIik7XG5udWxsIT1kWzNdP2JbZFsyXV09cGFyc2VJbnQoZFszXSwxMCk6bnVsbCE9ZFs0XT9iW2RbMl1dPWRbMl0ubWF0Y2goL14oY3R8YWRhdGF8c2FsdHxpdikkLyk/c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGRbNF0pOnVuZXNjYXBlKGRbNF0pOm51bGwhPWRbNV0mJihiW2RbMl1dPVwidHJ1ZVwiPT09ZFs1XSl9cmV0dXJuIGJ9LGo6ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWEmJihhPXt9KTtpZih2b2lkIDA9PT1iKXJldHVybiBhO2Zvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkpe2lmKGMmJnZvaWQgMCE9PWFbZF0mJmFbZF0hPT1iW2RdKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwicmVxdWlyZWQgcGFyYW1ldGVyIG92ZXJyaWRkZW5cIik7YVtkXT1iW2RdfXJldHVybiBhfSxyYTpmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZhW2RdIT09YltkXSYmKGNbZF09YVtkXSk7cmV0dXJuIGN9LHFhOmZ1bmN0aW9uKGEsXG5iKXt2YXIgYz17fSxkO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspdm9pZCAwIT09YVtiW2RdXSYmKGNbYltkXV09YVtiW2RdXSk7cmV0dXJuIGN9fTtzamNsLmVuY3J5cHQ9c2pjbC5qc29uLmVuY3J5cHQ7c2pjbC5kZWNyeXB0PXNqY2wuanNvbi5kZWNyeXB0O3NqY2wubWlzYy5vYT17fTtzamNsLm1pc2MuY2FjaGVkUGJrZGYyPWZ1bmN0aW9uKGEsYil7dmFyIGM9c2pjbC5taXNjLm9hLGQ7Yj1ifHx7fTtkPWIuaXRlcnx8MUUzO2M9Y1thXT1jW2FdfHx7fTtkPWNbZF09Y1tkXXx8e2ZpcnN0U2FsdDpiLnNhbHQmJmIuc2FsdC5sZW5ndGg/Yi5zYWx0LnNsaWNlKDApOnNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDIsMCl9O2M9dm9pZCAwPT09Yi5zYWx0P2QuZmlyc3RTYWx0OmIuc2FsdDtkW2NdPWRbY118fHNqY2wubWlzYy5wYmtkZjIoYSxjLGIuaXRlcik7cmV0dXJue2tleTpkW2NdLnNsaWNlKDApLHNhbHQ6Yy5zbGljZSgwKX19O1xuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9c2pjbCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHNqY2x9KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBXT1JLRVJfQUNUSU9OIH0gZnJvbSBcIn4vZW51bS93b3JrZXItYWN0aW9uLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEx1ZmlGaWxlIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1maWxlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgeyBFVkVOVCB9IGZyb20gXCJ+L2VudW0vZXZlbnQudHNcIjtcbmltcG9ydCB7IFVQTE9BRF9TVEFUVVMgfSBmcm9tIFwifi9lbnVtL2ZpbGUtc3RhdHVzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckV2ZW50IH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1ldmVudC50c1wiO1xuXG5kZWNsYXJlIGxldCBzZWxmOiBXb3JrZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogVXBkYXRlIGZpbGUgaW4gd29ya2VycyBhbmQgcHJvdmlkZSBtb2RpZmljYXRpb25zIHRvIHRoZSBtYWluIHRocmVhZFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWxlID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSwgYXJnczogUGFydGlhbDxMdWZpRmlsZT4pID0+IHtcbiAgT2JqZWN0LmFzc2lnbihsdWZpRmlsZSwgYXJncyk7XG5cbiAgaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULkZJTEVfVVBEQVRFRCxcbiAgICAgIGx1ZmlGaWxlLFxuICAgIH0gYXMgV29ya2VyRXZlbnQpO1xuICB9XG5cbiAgcmV0dXJuIGx1ZmlGaWxlO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRGaWxlRXJyb3IgPSAobHVmaUZpbGU6IEx1ZmlGaWxlLCBlcnJvcjogRXJyb3IpID0+IHtcbiAgdXBkYXRlRmlsZShsdWZpRmlsZSwgeyB1cGxvYWRTdGF0dXM6IFVQTE9BRF9TVEFUVVMuRkFJTEVEIH0pO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IgfSBhcyBXb3JrZXJFdmVudCk7XG59O1xuXG4vKipcbiAqIEluaXQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjaGlsZCB3b3JrZXIncyBvbm1lc3NhZ2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0ID0gKCkgPT4ge1xuICBldmVudHMub25jZShFVkVOVC5TT0NLRVRfT1BFTkVELCAoKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBldmVudDogRVZFTlQuU09DS0VUX09QRU5FRCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgZXZlbnRzLm9uY2UoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzV29ya2VyQWN0aW9uTWVzc2FnZSA9IChcbiAgLy8gZGVuby1saW50LWlnbm9yZSBuby1leHBsaWNpdC1hbnlcbiAgbWVzc2FnZTogYW55LFxuKTogbWVzc2FnZSBpcyBXb3JrZXJBY3Rpb25NZXNzYWdlID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIG1lc3NhZ2UgIT09IG51bGwgJiZcbiAgICBcImFjdGlvblwiIGluIG1lc3NhZ2UgJiZcbiAgICBPYmplY3QudmFsdWVzKFdPUktFUl9BQ1RJT04pLmluY2x1ZGVzKG1lc3NhZ2UuYWN0aW9uKVxuICApO1xufTtcbiIsICJjb25zdCBkZWZhdWx0RXJyb3JDb25maWcgPSB7XHJcbiAgICB3aXRoU3RhY2tUcmFjZTogZmFsc2UsXHJcbn07XHJcbi8vIEN1c3RvbSBlcnJvciBvYmplY3RcclxuLy8gQ29udGV4dCAvIGRpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1hY3JvL25ldmVydGhyb3cvcHVsbC8yMTVcclxuY29uc3QgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yID0gKG1lc3NhZ2UsIHJlc3VsdCwgY29uZmlnID0gZGVmYXVsdEVycm9yQ29uZmlnKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID0gcmVzdWx0LmlzT2soKVxyXG4gICAgICAgID8geyB0eXBlOiAnT2snLCB2YWx1ZTogcmVzdWx0LnZhbHVlIH1cclxuICAgICAgICA6IHsgdHlwZTogJ0VycicsIHZhbHVlOiByZXN1bHQuZXJyb3IgfTtcclxuICAgIGNvbnN0IG1heWJlU3RhY2sgPSBjb25maWcud2l0aFN0YWNrVHJhY2UgPyBuZXcgRXJyb3IoKS5zdGFjayA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgIHN0YWNrOiBtYXliZVN0YWNrLFxyXG4gICAgfTtcclxufTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcblxyXG5mdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbnR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xuXG5jbGFzcyBSZXN1bHRBc3luYyB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXMpIHtcclxuICAgICAgICB0aGlzLl9wcm9taXNlID0gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21TYWZlUHJvbWlzZShwcm9taXNlKSB7XHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IHByb21pc2UudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMobmV3UHJvbWlzZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JGbikge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlXHJcbiAgICAgICAgICAgIC50aGVuKCh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKSlcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiBuZXcgRXJyKGVycm9yRm4oZSkpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIHN0YXRpYyBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMoKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPayh5aWVsZCBmbiguLi5hcmdzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihlcnJvckZuID8gZXJyb3JGbihlcnJvcikgOiBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKSgpKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNvbWJpbmUoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3QoYXN5bmNSZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lV2l0aEFsbEVycm9ycyhhc3luY1Jlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdEFzeW5jTGlzdFdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIG1hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayh5aWVsZCBmKHJlcy52YWx1ZSkpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBuZXdSZXMgPSB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChuZXdSZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIobmV3UmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHlpZWxkIGYocmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGVlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc09rKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycih5aWVsZCBmKHJlcy5lcnJvcikpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZSBpbnN0YW5jZW9mIFJlc3VsdEFzeW5jID8gbmV3VmFsdWUuX3Byb21pc2UgOiBuZXdWYWx1ZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGYocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIG1hdGNoKG9rLCBfZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMubWF0Y2gob2ssIF9lcnIpKTtcclxuICAgIH1cclxuICAgIHVud3JhcE9yKHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy51bndyYXBPcih0KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiA5LjAuMC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHVzZSBgc2FmZVRyeWAgd2l0aG91dCB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICAgKiBzYWZlVHJ5KGFzeW5jIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgKiAgIGNvbnN0IG9rVmFsdWUgPSB5aWVsZCogeW91clJlc3VsdFxyXG4gICAgICogfSlcclxuICAgICAqIGBgYFxyXG4gICAgICogRW11bGF0ZXMgUnVzdCdzIGA/YCBvcGVyYXRvciBpbiBgc2FmZVRyeWAncyBib2R5LiBTZWUgYWxzbyBgc2FmZVRyeWAuXHJcbiAgICAgKi9cclxuICAgIHNhZmVVbndyYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogc2FmZVVud3JhcF8xKCkge1xyXG4gICAgICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMoeWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLnNhZmVVbndyYXAoKSkpKSkpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIE1ha2VzIFJlc3VsdEFzeW5jIGltcGxlbWVudCBQcm9taXNlTGlrZTxSZXN1bHQ+XHJcbiAgICB0aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIF9hKCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBfX2F3YWl0KHRoaXMuX3Byb21pc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChlcnJBc3luYyhyZXN1bHQuZXJyb3IpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5jb25zdCBva0FzeW5jID0gKHZhbHVlKSA9PiBuZXcgUmVzdWx0QXN5bmMoUHJvbWlzZS5yZXNvbHZlKG5ldyBPayh2YWx1ZSkpKTtcclxuY29uc3QgZXJyQXN5bmMgPSAoZXJyKSA9PiBuZXcgUmVzdWx0QXN5bmMoUHJvbWlzZS5yZXNvbHZlKG5ldyBFcnIoZXJyKSkpO1xyXG5jb25zdCBmcm9tUHJvbWlzZSA9IFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlO1xyXG5jb25zdCBmcm9tU2FmZVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2U7XHJcbmNvbnN0IGZyb21Bc3luY1Rocm93YWJsZSA9IFJlc3VsdEFzeW5jLmZyb21UaHJvd2FibGU7XG5cbi8qKlxyXG4gKiBTaG9ydCBjaXJjdWl0cyBvbiB0aGUgRklSU1QgRXJyIHZhbHVlIHRoYXQgd2UgZmluZFxyXG4gKi9cclxuY29uc3QgY29tYmluZVJlc3VsdExpc3QgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjID0gZXJyKHJlc3VsdC5lcnJvcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYWNjLm1hcCgobGlzdCkgPT4gbGlzdC5wdXNoKHJlc3VsdC52YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbi8qIFRoaXMgaXMgdGhlIHR5cGVzYWZlIHZlcnNpb24gb2YgUHJvbWlzZS5hbGxcclxuICpcclxuICogVGFrZXMgYSBsaXN0IG9mIFJlc3VsdEFzeW5jPFQsIEU+IGFuZCBzdWNjZXNzIGlmIGFsbCBpbm5lciByZXN1bHRzIGFyZSBPayB2YWx1ZXNcclxuICogb3IgZmFpbHMgaWYgb25lIChvciBtb3JlKSBvZiB0aGUgaW5uZXIgcmVzdWx0cyBhcmUgRXJyIHZhbHVlc1xyXG4gKi9cclxuY29uc3QgY29tYmluZVJlc3VsdEFzeW5jTGlzdCA9IChhc3luY1Jlc3VsdExpc3QpID0+IFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZShQcm9taXNlLmFsbChhc3luY1Jlc3VsdExpc3QpKS5hbmRUaGVuKGNvbWJpbmVSZXN1bHRMaXN0KTtcclxuLyoqXHJcbiAqIEdpdmUgYSBsaXN0IG9mIGFsbCB0aGUgZXJyb3JzIHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0V2l0aEFsbEVycm9ycyA9IChyZXN1bHRMaXN0KSA9PiB7XHJcbiAgICBsZXQgYWNjID0gb2soW10pO1xyXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0TGlzdCkge1xyXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSAmJiBhY2MuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICBhY2MuZXJyb3IucHVzaChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNFcnIoKSAmJiBhY2MuaXNPaygpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihbcmVzdWx0LmVycm9yXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MudmFsdWUucHVzaChyZXN1bHQudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBkbyBub3RoaW5nIHdoZW4gcmVzdWx0LmlzT2soKSAmJiBhY2MuaXNFcnIoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxufTtcclxuY29uc3QgY29tYmluZVJlc3VsdEFzeW5jTGlzdFdpdGhBbGxFcnJvcnMgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxyXG52YXIgUmVzdWx0O1xyXG4oZnVuY3Rpb24gKFJlc3VsdCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwcyBhIGZ1bmN0aW9uIHdpdGggYSB0cnkgY2F0Y2gsIGNyZWF0aW5nIGEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWVcclxuICAgICAqIGFyZ3VtZW50cyBidXQgcmV0dXJuaW5nIGBPa2AgaWYgc3VjY2Vzc2Z1bCwgYEVycmAgaWYgdGhlIGZ1bmN0aW9uIHRocm93c1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmbiBmdW5jdGlvbiB0byB3cmFwIHdpdGggb2sgb24gc3VjY2VzcyBvciBlcnIgb24gZmFpbHVyZVxyXG4gICAgICogQHBhcmFtIGVycm9yRm4gd2hlbiBhbiBlcnJvciBpcyB0aHJvd24sIHRoaXMgd2lsbCB3cmFwIHRoZSBlcnJvciByZXN1bHQgaWYgcHJvdmlkZWRcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGZ1bmN0aW9uIGZyb21UaHJvd2FibGUoZm4sIGVycm9yRm4pIHtcclxuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZXJyb3JGbiA/IGVycm9yRm4oZSkgOiBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuZnJvbVRocm93YWJsZSA9IGZyb21UaHJvd2FibGU7XHJcbiAgICBmdW5jdGlvbiBjb21iaW5lKHJlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdExpc3QocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZSA9IGNvbWJpbmU7XHJcbiAgICBmdW5jdGlvbiBjb21iaW5lV2l0aEFsbEVycm9ycyhyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0V2l0aEFsbEVycm9ycyhyZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIFJlc3VsdC5jb21iaW5lV2l0aEFsbEVycm9ycyA9IGNvbWJpbmVXaXRoQWxsRXJyb3JzO1xyXG59KShSZXN1bHQgfHwgKFJlc3VsdCA9IHt9KSk7XHJcbmNvbnN0IG9rID0gKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpO1xyXG5mdW5jdGlvbiBlcnIoZXJyKSB7XHJcbiAgICByZXR1cm4gbmV3IEVycihlcnIpO1xyXG59XHJcbmZ1bmN0aW9uIHNhZmVUcnkoYm9keSkge1xyXG4gICAgY29uc3QgbiA9IGJvZHkoKS5uZXh0KCk7XHJcbiAgICBpZiAobiBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG4udGhlbigocikgPT4gci52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG4udmFsdWU7XHJcbn1cclxuY2xhc3MgT2sge1xyXG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBpc09rKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIG1hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKGYodGhpcy52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWFwRXJyKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRocm91Z2goZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpLm1hcCgoX3ZhbHVlKSA9PiB0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShmKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZih0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gVGVlIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhlbihmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYXN5bmNBbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKCkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY01hcChmKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZShmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHVud3JhcE9yKF92KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHNhZmVVbndyYXAoKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLXlpZWxkICovXHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXAoXykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihjb25maWcpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVOZXZlclRocm93RXJyb3IoJ0NhbGxlZCBgX3Vuc2FmZVVud3JhcEVycmAgb24gYW4gT2snLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzLCByZXF1aXJlLXlpZWxkXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRXJyIHtcclxuICAgIGNvbnN0cnVjdG9yKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpc0VycigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNPaygpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIG1hcEVycihmKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycihmKHRoaXMuZXJyb3IpKTtcclxuICAgIH1cclxuICAgIGFuZFRocm91Z2goX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgYW5kVGVlKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmNBbmRUaGVuKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNBbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmNNYXAoX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyQXN5bmModGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih2KSB7XHJcbiAgICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcbiAgICBtYXRjaChfb2ssIGVycikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5lcnJvcjtcclxuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIHlpZWxkIGVycihlcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRG8gbm90IHVzZSB0aGlzIGdlbmVyYXRvciBvdXQgb2YgYHNhZmVUcnlgJyk7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXAoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBgIG9uIGFuIEVycicsIHRoaXMsIGNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwRXJyKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcjtcclxuICAgIH1cclxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICB5aWVsZCBzZWxmO1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IGZyb21UaHJvd2FibGUgPSBSZXN1bHQuZnJvbVRocm93YWJsZTtcclxuLy8jZW5kcmVnaW9uXG5cbmV4cG9ydCB7IEVyciwgT2ssIFJlc3VsdCwgUmVzdWx0QXN5bmMsIGVyciwgZXJyQXN5bmMsIGZyb21Bc3luY1Rocm93YWJsZSwgZnJvbVByb21pc2UsIGZyb21TYWZlUHJvbWlzZSwgZnJvbVRocm93YWJsZSwgb2ssIG9rQXN5bmMsIHNhZmVUcnkgfTtcbiIsICJ0eXBlIEpzb25hYmxlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IHJlYWRvbmx5IEpzb25hYmxlW11cbiAgfCB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IEpzb25hYmxlIH1cbiAgfCB7IHRvSlNPTigpOiBKc29uYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dD86IEpzb25hYmxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBjYXVzZT86IEVycm9yOyBjb250ZXh0PzogSnNvbmFibGUgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCB7IGNhdXNlLCBjb250ZXh0IH0gPSBvcHRpb25zO1xuXG4gICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIn4vZXJyb3IvYmFzZS1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige31cbiIsICJpbXBvcnQgeyBXZWJTb2NrZXRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dlYnNvY2tldC93ZWJzb2NrZXQtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldENvbm5lY3Rpb25FcnJvciBleHRlbmRzIFdlYlNvY2tldEVycm9yIHtcbiAgb3ZlcnJpZGUgbWVzc2FnZSA9IFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byBXZWJTb2NrZXRcIjtcbn1cbiIsICJpbXBvcnQgeyBlcnJBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY29ubmVjdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci9zZXJ2ZXItZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ29uZmlnIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1jb25maWcudHNcIjtcblxuLyoqXG4gKiBFbnN1cmUgYW4gZXJyb3IgbWVzc2FnZSBpcyB0cmFuc2Zvcm1lZCBpbiBhbiBFcnJvciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbnN1cmVFcnJvciA9ICh2YWx1ZTogdW5rbm93bik6IEVycm9yID0+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWx1ZTtcblxuICBsZXQgc3RyaW5naWZpZWQgPSBcIltVbmFibGUgdG8gc3RyaW5naWZ5IHRoZSB0aHJvd24gdmFsdWVdXCI7XG4gIHRyeSB7XG4gICAgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICByZXR1cm4gbmV3IEVycm9yKHN0cmluZ2lmaWVkKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgTHVmaSdzIGNvbmZpZyBmcm9tIGl0cyBBUElcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VVcmxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaFNlcnZlckNvbmZpZyA9IChcbiAgaW5zdGFuY2VVcmw6IFVSTCxcbik6IFJlc3VsdEFzeW5jPFNlcnZlckNvbmZpZywgRXJyb3I+ID0+IHtcbiAgY29uc3Qgb3JpZ2luTWF0Y2hlcyA9IGluc3RhbmNlVXJsLmhyZWYubWF0Y2goXG4gICAgLyguKj8pXFwvPyg/OlxcL1tkcl17MX1cXC98bG9naW5cXC8/fGZpbGVzXFwvPykvLFxuICApO1xuXG4gIGNvbnN0IHVybE9yaWdpbiA9IG9yaWdpbk1hdGNoZXMgJiYgb3JpZ2luTWF0Y2hlc1sxXVxuICAgID8gb3JpZ2luTWF0Y2hlc1sxXVxuICAgIDogaW5zdGFuY2VVcmwub3JpZ2luO1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBmZXRjaCh1cmxPcmlnaW4gKyBcIi9hYm91dC9jb25maWdcIiksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENvbm5lY3Rpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICApLmFuZFRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIHJlc3BvbnNlLmpzb24oKSxcbiAgICAgICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgIG5ldyBTZXJ2ZXJFcnJvcih1bmRlZmluZWQsIHsgY29udGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Rlbm9SdW50aW1lID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBjb25zdCBpc1NlY3VyZUNvbnRleHQgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKCkgfHwgZ2xvYmFsVGhpcy5pc1NlY3VyZUNvbnRleHQgfHxcbiAgICBnbG9iYWxUaGlzLmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IHdvcmtlclVybCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFVSTCA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKClcbiAgICA/IG5ldyBVUkwoYC4vd29ya2VyLyR7cmVsYXRpdmVQYXRofS50c2AsIG5ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZilcbiAgICA6IG5ldyBVUkwoXG4gICAgICBpbXBvcnQubWV0YS5yZXNvbHZlKFxuICAgICAgICBgLi8ke1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCAhPT0gXCJlbmNyeXB0XCIgPyBgd29ya2VyLyR7cmVsYXRpdmVQYXRofWAgOiByZWxhdGl2ZVBhdGhcbiAgICAgICAgfS5qc2AsXG4gICAgICApLFxuICAgICk7XG59O1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgImltcG9ydCB7XG4gIERlY29kZSBhcyBiNjRkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjRlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjRcIjtcbmltcG9ydCB7IGVyckFzeW5jLCBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgc2pjbCBmcm9tIFwibHVmaS1zamNsXCI7XG5pbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBFbmNyeXB0ZWREYXRhIG9yIGEgc3RyaW5nIHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkRGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhIHwgc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgZW5jcnlwdGVkRGF0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBlbmNyeXB0ZWREYXRhXG4gICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNyeXB0ZWREYXRhLmRhdGEgYXMgQXJyYXlCdWZmZXIpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmMoYjY0ZGVjb2RlKHNqY2wuZGVjcnlwdChrZXksIGRhdGEpKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IERlY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgYW4gQXJyYXlCdWZmZXIgaW50byBhbiBFbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gc2pjbC5lbmNyeXB0KGtleSwgYjY0ZW5jb2RlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gb2tBc3luYyh7XG4gICAgICBhbGdvOiBDcnlwdG9BbGdvcml0aG0uU2pjbCxcbiAgICAgIGRhdGE6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlbmNyeXB0ZWQpLmJ1ZmZlcixcbiAgICAgIGl2OiBKU09OLnBhcnNlKGVuY3J5cHRlZCBhcyB1bmtub3duIGFzIHN0cmluZykuaXYsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IEVuY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyB1c2luZyBTamNsIEFQSVxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9ICgpOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoc2pjbC5yYW5kb20ucmFuZG9tV29yZHMoOCwgMTApKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIGtleVwiLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyBTamNsIEFQSVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoc2pjbC5oYXNoLnNoYTUxMi5oYXNoKHBhc3N3b3JkKSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhuZXcgSGFzaGluZ0Vycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGtleSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgU2pjbC4gU2luY2Ugd2UncmUgbm90IGdlbmVyYXRpbmcgYW4gZXF1YWwgc3ltYm9sIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBXZWJDcnlwdG8gQVBJIChieSB1c2luZyBiYXNlNjR1cmwpLCBpdCdzIGVhc3kgdG8gZGV0ZWN0XG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2pjbEtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4ga2V5W2tleS5sZW5ndGggLSAxXSA9PT0gXCI9XCI7XG59O1xuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIENyeXB0b0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWNyeXB0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2U6IHN0cmluZyA9IFwiVW5hYmxlIHRvIGRlY3J5cHQgdGhlIHByb3ZpZGVkIGRhdGFcIjtcbn1cbiIsICJpbXBvcnQge1xuICBEZWNvZGUgYXMgYjY0dXJsZGVjb2RlLFxuICBFbmNvZGUgYXMgYjY0dXJsZW5jb2RlLFxufSBmcm9tIFwiYXJyYXlidWZmZXItZW5jb2RpbmcvYmFzZTY0L3VybFwiO1xuaW1wb3J0IHsgdHlwZSBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IERlY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9kZWNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gXCJ+L3V0aWxzLnRzXCI7XG5pbXBvcnQgeyBFbmNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBIYXNoaW5nRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vaGFzaGluZy1lcnJvci50c1wiO1xuXG4vKipcbiAqIERlY3J5cHQgYW4gZW5jcnlwdGVkRGF0YSB1c2luZyB0aGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZGVjcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZDogRW5jcnlwdGVkRGF0YSxcbik6IFJlc3VsdEFzeW5jPEFycmF5QnVmZmVyLCBEZWNyeXB0aW9uRXJyb3I+ID0+IHtcbiAgcmV0dXJuIGltcG9ydEtleShrZXkpLmFuZFRoZW4oKGltcG9ydGVkS2V5KSA9PlxuICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgaXY6IGVuY3J5cHRlZC5pdiBhcyBVaW50OEFycmF5LFxuICAgICAgICB9LFxuICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgZW5jcnlwdGVkLmRhdGEgYXMgQXJyYXlCdWZmZXIsXG4gICAgICApLFxuICAgICAgKGVycm9yKSA9PiBuZXcgRGVjcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogRW5jcnlwdCBhbiBBcnJheUJ1ZmZlciBpbnRvIGFuIEVuY3J5cHRlZERhdGEgdXNpbmcgdGhlIHByb3ZpZGVkIGtleVxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5jcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBBcnJheUJ1ZmZlcixcbik6IFJlc3VsdEFzeW5jPEVuY3J5cHRlZERhdGEsIEVuY3J5cHRpb25FcnJvcj4gPT4ge1xuICByZXR1cm4gaW1wb3J0S2V5KGtleSkuYW5kVGhlbigoaW1wb3J0ZWRLZXkpID0+IHtcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTtcbiAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICBpdixcbiAgICAgICAgfSxcbiAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgKSxcbiAgICAgIChlcnJvcikgPT5cbiAgICAgICAgbmV3IEVuY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KSxcbiAgICApLmFuZFRoZW4oKGVuY3J5cHRlZCkgPT4ge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoe1xuICAgICAgICBhbGdvOiBDcnlwdG9BbGdvcml0aG0uV2ViQ3J5cHRvLFxuICAgICAgICBkYXRhOiBlbmNyeXB0ZWQsXG4gICAgICAgIGl2LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBzdHJpbmcgaW50byBhIENyeXB0b0tleSwgdXNhYmxlIGluIFdlYiBDcnlwdG8gQVBJXG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGltcG9ydEtleSA9IChrZXk6IHN0cmluZyk6IFJlc3VsdEFzeW5jPENyeXB0b0tleSwgQ3J5cHRvRXJyb3I+ID0+IHtcbiAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGI2NHVybGRlY29kZShrZXkpLFxuICAgICAgeyBuYW1lOiBcIkFFUy1HQ01cIiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXG4gICAgICAgIFwiZW5jcnlwdFwiLFxuICAgICAgICBcImRlY3J5cHRcIixcbiAgICAgIF0sXG4gICAgKSxcbiAgICAoZXJyb3IpID0+XG4gICAgICBuZXcgQ3J5cHRvRXJyb3IoXCJVbmFibGUgdG8gaW1wb3J0IGNyeXB0b2dyYXBoeSBrZXlcIiwge1xuICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyB1c2luZyBXZWIgQ3J5cHRvIEFQSS5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVLZXkgPSAoKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBDcnlwdG9FcnJvcj4gPT4ge1xuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgIGNyeXB0by5zdWJ0bGVcbiAgICAgICAgLmdlbmVyYXRlS2V5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChnZW5lcmF0ZWRLZXkpID0+XG4gICAgICAgICAgY3J5cHRvLnN1YnRsZVxuICAgICAgICAgICAgLmV4cG9ydEtleShcInJhd1wiLCBnZW5lcmF0ZWRLZXkpXG4gICAgICAgICAgICAudGhlbigoa2V5KSA9PiByZXNvbHZlKGI2NHVybGVuY29kZShrZXkpKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBiYXNlNjQgZW5jb2RlIHRoZSB1cmxcIiwge1xuICAgICAgICAgICAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSlcbiAgICApLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBnZW5lcmF0ZSBrZXlcIiwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBIYXNoIGEgcGFzc3dvcmQgdXNpbmcgV2ViQ3J5cHRvIEFQSVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PiB7XG4gIGNvbnN0IHByb21pc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgVWludDhBcnJheShcbiAgICAgICAgYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXG4gICAgICAgICAgXCJTSEEtNTEyXCIsXG4gICAgICAgICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHBhc3N3b3JkKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbiAgfTtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgcHJvbWlzZSgpLFxuICAgIChlcnJvcikgPT4gbmV3IEhhc2hpbmdFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgKTtcbn07XG4iLCAiaW1wb3J0IHsgQ3J5cHRvQWxnb3JpdGhtIH0gZnJvbSBcIn4vZW51bS9jcnlwdG8tYWxnb3JpdGhtLnRzXCI7XG5pbXBvcnQgeyBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgdHlwZSB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHR5cGUgeyBEZWNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHR5cGUgeyBFbmNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgdHlwZSBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgKiBhcyBzamNsIGZyb20gXCJ+L2FwaS9jcnlwdG8vc2pjbC50c1wiO1xuaW1wb3J0ICogYXMgd2ViIGZyb20gXCJ+L2FwaS9jcnlwdG8vd2ViLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBFbmNyeXB0ZWREYXRhIG9iamVjdCB1c2luZyB0aGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEVuY3J5cHRlZERhdGEsXG4pOiBSZXN1bHRBc3luYzxBcnJheUJ1ZmZlciwgRGVjcnlwdGlvbkVycm9yPiA9PlxuICB2YWx1ZS5hbGdvID09PSB1bmRlZmluZWQgfHwgdmFsdWUuYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2xcbiAgICA/IHNqY2wuZGVjcnlwdChrZXksIHZhbHVlKVxuICAgIDogd2ViLmRlY3J5cHQoa2V5LCB2YWx1ZSk7XG5cbi8qKlxuICogRW5jcnlwdCBhbiBBcnJheUJ1ZmZlciB1c2luZyB0aGUgcHJvdmlkZWQga2V5IGFuZCBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBhbGdvXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5jcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBBcnJheUJ1ZmZlcixcbiAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PlxuICAoYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2wpXG4gICAgPyBzamNsLmVuY3J5cHQoa2V5LCB2YWx1ZSlcbiAgICA6IHdlYi5lbmNyeXB0KGtleSwgdmFsdWUpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbmV3IGtleSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uXG4gKlxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9IChcbiAgYWxnbyA9IENyeXB0b0FsZ29yaXRobS5XZWJDcnlwdG8sXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PlxuICBhbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbCA/IHNqY2wuZ2VuZXJhdGVLZXkoKSA6IHdlYi5nZW5lcmF0ZUtleSgpO1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyB0aGUgcHJvdmlkZWQgYWxnb3JpdGhtXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkXG4gKiBAcGFyYW0gYWxnb1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBIYXNoaW5nRXJyb3I+ID0+XG4gIGFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsXG4gICAgPyBzamNsLmhhc2hQYXNzd29yZChwYXNzd29yZClcbiAgICA6IHdlYi5oYXNoUGFzc3dvcmQocGFzc3dvcmQpO1xuIiwgImltcG9ydCB7IGVyckFzeW5jLCBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgeyBMdWZpRmlsZSB9IGZyb20gXCJ+L2VudGl0aWVzL2x1ZmktZmlsZS50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHsgU29ja2V0UGF0aCB9IGZyb20gXCJ+L2VudW0vc29ja2V0LXBhdGgudHNcIjtcbmltcG9ydCB7IFVwbG9hZEVycm9yIH0gZnJvbSBcIn4vZXJyb3IvdXBsb2FkL3VwbG9hZC1lcnJvci50c1wiO1xuaW1wb3J0IHsgV2ViU29ja2V0Q29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd2Vic29ja2V0L3dlYnNvY2tldC1jb25uZWN0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dlYnNvY2tldC93ZWJzb2NrZXQtZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgQ2xpZW50VXBsb2FkQ2h1bmtNZXRhZGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9jbGllbnQtdXBsb2FkLWNodW5rLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ2FuY2VsTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2Uvc2VydmVyLWNhbmNlbC1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1kb3dubG9hZC1jaHVuay1zdWNjZXNzLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclVwbG9hZENodW5rTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2Uvc2VydmVyLXVwbG9hZC1jaHVuay1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGEgfSBmcm9tIFwifi90eXBlL3NlcnZlci1kb3dubG9hZC1jaHVuay1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0IHsgZXZlbnRzLCB1cGRhdGVGaWxlIH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJ+L2FwaS9jcnlwdG8udHNcIjtcbmltcG9ydCB7XG4gIERlY29kZSBhcyBiNjRkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjRlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjRcIjtcblxuZXhwb3J0IGNvbnN0IHNvY2tldHM6IHtcbiAgW2tleTogc3RyaW5nXTogV2ViU29ja2V0O1xufSA9IHt9O1xuXG5jb25zdCBNQVhfRVJST1JTID0gNTtcblxuLyoqXG4gKiBIYW5kbGUgV2ViU29ja2V0IHJlc3BvbnNlIGZvciBjYW5jZWwgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvbkNhbmNlbE1lc3NhZ2UgPSAoXG4gIGRhdGE6IFNlcnZlckNhbmNlbE1ldGFkYXRhLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgRXJyb3I+ID0+IHtcbiAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX0NBTkNFTExFRCwgZGF0YS5zdWNjZXNzKTtcblxuICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgV2ViU29ja2V0IHJlc3BvbnNlIGZvciBkb3dubG9hZCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHJlc3BvbnNlXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uRG93bmxvYWRNZXNzYWdlID0gKFxuICByZXNwb25zZTogc3RyaW5nLFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5zcGxpdChcIlhYTU9KT1hYXCIpO1xuICBjb25zdCBtZXRhZGF0YVN0cmluZyA9IHJlc3VsdC5zaGlmdCgpO1xuXG4gIGlmIChtZXRhZGF0YVN0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKSBhcyBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGE7XG5cbiAgICBpZiAoaXNTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhKG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgZGF0YVN0cmluZyA9IHJlc3VsdC5zaGlmdCgpO1xuXG4gICAgICBpZiAoZGF0YVN0cmluZykge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyaW5nKTtcblxuICAgICAgICAvLyBJZiBmaWxlIHdhcyB1cGxvYWRlZCB1c2luZyBMdWZpIEFQSVxuICAgICAgICBpZiAoZW5jcnlwdGVkRGF0YS5pdikge1xuICAgICAgICAgIGVuY3J5cHRlZERhdGEuaXYgPSBuZXcgVWludDhBcnJheShPYmplY3QudmFsdWVzKGVuY3J5cHRlZERhdGEuaXYpKTtcbiAgICAgICAgICBlbmNyeXB0ZWREYXRhLmRhdGEgPSBiNjRkZWNvZGUoZW5jcnlwdGVkRGF0YS5kYXRhIGFzIHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3J5cHRvLmRlY3J5cHQobHVmaUZpbGUua2V5cy5jbGllbnQsIGVuY3J5cHRlZERhdGEpLmFuZFRoZW4oXG4gICAgICAgICAgKGRlY3J5cHRlZFBhcnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHR5cGVvZiBkZWNyeXB0ZWRQYXJ0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkZWNyeXB0ZWRQYXJ0KS5idWZmZXIgYXMgQXJyYXlCdWZmZXIpXG4gICAgICAgICAgICAgIDogZGVjcnlwdGVkUGFydDtcblxuICAgICAgICAgICAgLy8gSWYgZmlyc3QgY2h1bmtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5wYXJ0ID09PSAwKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHtcbiAgICAgICAgICAgICAgICBjaHVua3NSZWFkeTogbHVmaUZpbGUuY2h1bmtzUmVhZHkgKyAxLFxuICAgICAgICAgICAgICAgIGRlbEF0Rmlyc3RWaWV3OiBtZXRhZGF0YS5kZWxfYXRfZmlyc3RfdmlldyxcbiAgICAgICAgICAgICAgICBkZWxheTogbWV0YWRhdGEuZGVsYXksXG4gICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBtZXRhZGF0YS5zaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsQ2h1bmtzOiBtZXRhZGF0YS50b3RhbCxcbiAgICAgICAgICAgICAgICB0eXBlOiBtZXRhZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIHppcHBlZDogbWV0YWRhdGEuemlwcGVkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5ET1dOTE9BRF9TVEFSVEVEKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgY2h1bmtzUmVhZHk6IGx1ZmlGaWxlLmNodW5rc1JlYWR5ICsgMSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuQ0hVTktfRE9XTkxPQURFRCwgYnVmZmVyLCBtZXRhZGF0YS5wYXJ0KTtcblxuICAgICAgICAgICAgaWYgKGx1ZmlGaWxlLmNodW5rc1JlYWR5ID09PSBtZXRhZGF0YS50b3RhbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW5kRG93bmxvYWQobHVmaUZpbGUpLmFuZFRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULkRPV05MT0FEX0NPTVBMRVRFKTtcbiAgICAgICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IHJldHJpZXZlIG1ldGFkYXRhIGZyb20gZGF0YSByZWNlaXZlZCBieSB0aGUgc2VydmVyXCIsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihtZXRhZGF0YS5tc2cpO1xuXG4gICAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihcbiAgICAgIFwiQ2Fubm90IHJldHJpZXZlIG1ldGFkYXRhIGZyb20gZGF0YSByZWNlaXZlZCBieSB0aGUgc2VydmVyXCIsXG4gICAgKTtcblxuICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcbiAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhbmRsZSBXZWJTb2NrZXQgcmVzcG9uc2UgZm9yIHVwbG9hZCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHJlc3BvbnNlXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uVXBsb2FkTWVzc2FnZSA9IChcbiAgcmVzcG9uc2U6IFNlcnZlclVwbG9hZENodW5rTWV0YWRhdGEsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFVwbG9hZEVycm9yPiA9PiB7XG4gIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgLy8gSWYgZmlyc3QgY2h1bmtcbiAgICBpZiAocmVzcG9uc2UuaiA9PT0gMCkge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGBVcGxvYWQgb2YgJHtsdWZpRmlsZS5rZXlzLmNsaWVudH0gc3RhcnRlZGApO1xuXG4gICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7XG4gICAgICAgIGtleXM6IHsgY2xpZW50OiBsdWZpRmlsZS5rZXlzLmNsaWVudCwgc2VydmVyOiByZXNwb25zZS5zaG9ydCB9LFxuICAgICAgICBhY3Rpb25Ub2tlbjogcmVzcG9uc2UudG9rZW4sXG4gICAgICAgIHF1ZXVlSW5kZXg6IHJlc3BvbnNlLmksXG4gICAgICB9KTtcblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX1NUQVJURUQpO1xuICAgIH1cblxuICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHtcbiAgICAgIGNodW5rc1JlYWR5OiBsdWZpRmlsZS5jaHVua3NSZWFkeSArIDEsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRfYXQsXG4gICAgfSk7XG5cbiAgICBldmVudHMuZW1pdChFVkVOVC5DSFVOS19VUExPQURFRCk7XG5cbiAgICBpZiAobHVmaUZpbGUuY2h1bmtzUmVhZHkgPT09IGx1ZmlGaWxlLnRvdGFsQ2h1bmtzKSB7XG4gICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7IHVwbG9hZFN0YXR1czogVVBMT0FEX1NUQVRVUy5DT01QTEVURSB9KTtcblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX0NPTVBMRVRFKTtcbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PUEVSQVRJT05fVEVSTUlOQVRFRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihyZXNwb25zZS5tc2cpO1xuICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcblxuICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIG9uIHNvY2tldHMgXCJvbm1lc3NhZ2VcIiBldmVudFxuICpcbiAqIEBwYXJhbSBlXG4gKiBAcGFyYW0gc29ja2V0VXJsXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvbk1lc3NhZ2UgPSAoXG4gIGU6IE1lc3NhZ2VFdmVudCxcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgVXBsb2FkRXJyb3I+ID0+IHtcbiAgY29uc3QgZGF0YSA9IHRyeVBhcnNlSnNvbihlLmRhdGEpO1xuXG4gIGxldCBjYWxsYmFjaztcblxuICBpZiAoZGF0YSkge1xuICAgIGlmICghZGF0YS5hY3Rpb24gJiYgZGF0YS5tc2cpIHtcbiAgICAgIC8vIElmIGVycm9yXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihkYXRhLm1zZyk7XG4gICAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG5cbiAgICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcImRlbGF5XCIgaW4gZGF0YSkge1xuICAgICAgICBjYWxsYmFjayA9IG9uVXBsb2FkTWVzc2FnZShkYXRhLCBsdWZpRmlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9IG9uQ2FuY2VsTWVzc2FnZShkYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2sgPSBvbkRvd25sb2FkTWVzc2FnZShlLmRhdGEsIGx1ZmlGaWxlKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjaztcbn07XG5cbi8qKlxuICogSXMgc29ja2V0IGNvbm5lY3Rpbmc/XG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29ubmVjdGluZyA9IChzb2NrZXRLZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgc29ja2V0cyAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XS5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORztcblxuLyoqXG4gKiBJcyBzb2NrZXQgc3Bhd25lZD9cbiAqXG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNTcGF3bmVkID0gKHNvY2tldEtleTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICBzb2NrZXRzICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuXG4vKipcbiAqIEFzayBXZWJTb2NrZXQgdG8gY2FuY2VsIGFuIHVwbG9hZFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbmNlbFVwbG9hZCA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIHVwbG9hZFNvY2tldFVybChsdWZpRmlsZSksXG4gICAgbHVmaUZpbGUsXG4gICAgYCR7XG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBsdWZpRmlsZS5rZXlzLnNlcnZlcixcbiAgICAgICAgbW9kX3Rva2VuOiBsdWZpRmlsZS5hY3Rpb25Ub2tlbixcbiAgICAgICAgY2FuY2VsOiB0cnVlLFxuICAgICAgICBpOiBsdWZpRmlsZS5xdWV1ZUluZGV4LFxuICAgICAgfSlcbiAgICB9WFhNT0pPWFh1c2VsZXNzYCxcbiAgKTtcbn07XG5cbi8qKlxuICogRG93bmxvYWQgYSBwYXJ0IG9mIHRoZSBmaWxlIHRocm91Z2ggdGhlIFdlYlNvY2tldFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHBhcmFtIGNodW5rTnVtYmVyXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZG93bmxvYWRDaHVuayA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuICBjaHVua051bWJlcjogbnVtYmVyLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgbGV0IG1lc3NhZ2U7XG5cbiAgaWYgKGx1ZmlGaWxlLnBhc3N3b3JkKSB7XG4gICAgbWVzc2FnZSA9IHsgcGFydDogY2h1bmtOdW1iZXIsIGZpbGVfcHdkOiBsdWZpRmlsZS5wYXNzd29yZCB9O1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSB7IHBhcnQ6IGNodW5rTnVtYmVyIH07XG4gIH1cblxuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgZG93bmxvYWRTb2NrZXRVcmwobHVmaUZpbGUpLFxuICAgIGx1ZmlGaWxlLFxuICAgIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLFxuICApO1xufTtcblxuLyoqXG4gKiBUZWxsIHRoZSBXZWJTb2NrZXQgdGhlIGRvd25sb2FkIGVuZGVkXG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5kRG93bmxvYWQgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGxldCBtZXNzYWdlOiB7IGVuZGVkOiB0cnVlOyBmaWxlX3B3ZD86IHN0cmluZyB9O1xuXG4gIGlmIChsdWZpRmlsZS5wYXNzd29yZCkge1xuICAgIG1lc3NhZ2UgPSB7IGVuZGVkOiB0cnVlLCBmaWxlX3B3ZDogbHVmaUZpbGUucGFzc3dvcmQgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0geyBlbmRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIGRvd25sb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSxcbiAgKTtcbn07XG5cbi8qKlxuICogVXBsb2FkIGEgY2h1bmsgb2YgdGhlIGZpbGUgdGhyb3VnaCB0aGUgV2ViU29ja2V0XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcGFyYW0gbWV0YWRhdGFcbiAqIEBwYXJhbSBlbmNyeXB0ZWREYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBsb2FkQ2h1bmsgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbiAgbWV0YWRhdGE6IENsaWVudFVwbG9hZENodW5rTWV0YWRhdGEsXG4gIGVuY3J5cHRlZERhdGE6IEVuY3J5cHRlZERhdGEsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBlbmNyeXB0ZWREYXRhLmRhdGEgPSBiNjRlbmNvZGUoZW5jcnlwdGVkRGF0YS5kYXRhIGFzIEFycmF5QnVmZmVyKTtcblxuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgdXBsb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSl9WFhNT0pPWFgke0pTT04uc3RyaW5naWZ5KGVuY3J5cHRlZERhdGEpfWAsXG4gICk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBXZWJTb2NrZXRcbiAqXG4gKiBAcGFyYW0gc29ja2V0VXJsXG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHBhcmFtIGhhc1ByaW9yaXR5XG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBzZW5kTWVzc2FnZSA9IChcbiAgc29ja2V0VXJsOiBzdHJpbmcsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbiAgbWVzc2FnZTogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgaWYgKCFpc1NwYXduZWQoc29ja2V0VXJsKSkge1xuICAgIHJldHVybiBzcGF3bihzb2NrZXRVcmwpLmFuZFRoZW4oKCkgPT4ge1xuICAgICAgc29ja2V0c1tzb2NrZXRVcmxdLm9ubWVzc2FnZSA9IChlKSA9PiBvbk1lc3NhZ2UoZSwgbHVmaUZpbGUpO1xuICAgICAgcmV0dXJuIHNlbmRNZXNzYWdlKHNvY2tldFVybCwgbHVmaUZpbGUsIG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNvY2tldHNbc29ja2V0VXJsXS5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTcGF3biBhIG5ldyBXZWJTb2NrZXQgb3IgcmV1c2UgYW4gZXhpc3Rpbmcgb25lLlxuICpcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEBwYXJhbSBlcnJvckNvdW50XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3Qgc3Bhd24gPSAoXG4gIHNvY2tldEtleTogc3RyaW5nLFxuICBlcnJvckNvdW50ID0gMCxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgaWYgKCFpc1NwYXduZWQoc29ja2V0S2V5KSAmJiAhaXNDb25uZWN0aW5nKHNvY2tldEtleSkpIHtcbiAgICAvLyBjb25zb2xlLmluZm8oYFNwYXduaW5nIFdlYlNvY2tldCAke3NvY2tldFVybH1gKTtcbiAgICBzb2NrZXRzW3NvY2tldEtleV0gPSBuZXcgV2ViU29ja2V0KHNvY2tldEtleSk7XG5cbiAgICBldmVudHMub25jZShFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQsICgpID0+IHtcbiAgICAgIHNvY2tldHNbc29ja2V0S2V5XS5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgZXZlbnRzLm9uY2UoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgKCkgPT4ge1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRVJBVElPTl9URVJNSU5BVEVEKTtcbiAgICB9KTtcblxuICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oYFdlYnNvY2tldCAke3NvY2tldEtleX0gaGFzIGJlZW4gb3BlbmApO1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRU5FRCk7XG4gICAgfTtcblxuICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGBXZWJzb2NrZXQgJHtzb2NrZXRLZXl9IGhhcyBiZWVuIGNsb3NlZGApO1xuICAgIH07XG5cbiAgICBzb2NrZXRzW3NvY2tldEtleV0ub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmICgrK2Vycm9yQ291bnQgPD0gTUFYX0VSUk9SUykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBBbiBlcnJvciBoYXBwZW5lZCB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgXCIke3NvY2tldEtleX1cIi4gVHJ5aW5nIGFnYWluLiAke2Vycm9yQ291bnR9IC8gJHtNQVhfRVJST1JTfWAsXG4gICAgICAgICAgKGV2ZW50IGFzIEVycm9yRXZlbnQpLmVycm9yLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBzcGF3bihzb2NrZXRLZXksIGVycm9yQ291bnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09ORVJST1IpO1xuICAgICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgICAgbmV3IFdlYlNvY2tldENvbm5lY3Rpb25FcnJvcihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgJHtzb2NrZXRLZXl9LmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHdhaXRGb3JDb25uZWN0aW9uKHNvY2tldEtleSlcbiAgICAuYW5kVGhlbigoKSA9PiBva0FzeW5jKHNvY2tldEtleSkpXG4gICAgLm9yRWxzZSgoZXJyb3IpID0+IGVyckFzeW5jKGVycm9yKSk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIFdlYlNvY2tldCB0byBvcGVuLiBSZXR1cm5zIGFuIGVycm9yIGlmIHRvbyBtYW55IGNvbm5lY3Rpb24gYXR0ZW1wdHMgYXJlIG1hZGUuXG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JDb25uZWN0aW9uID0gKFxuICBzb2NrZXRLZXk6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWlzU3Bhd25lZChzb2NrZXRLZXkpKSB7XG4gICAgICAgIGV2ZW50cy5vbmNlKEVWRU5ULlNPQ0tFVF9PUEVORUQsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50cy5vbihFVkVOVC5TT0NLRVRfT05FUlJPUiwgKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkVycm9yKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIHJldHVybiBlbnN1cmVFcnJvcihlcnJvcik7XG4gICAgfSxcbiAgKTtcblxuLyoqXG4gKiBDbG9zZSB0aGUgV2ViU29ja2V0XG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgY2xvc2UgPSAoc29ja2V0S2V5OiBzdHJpbmcpOiBSZXN1bHRBc3luYzxzdHJpbmcsIFdlYlNvY2tldEVycm9yPiA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoaXNTcGF3bmVkKHNvY2tldEtleSkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBXZWJTb2NrZXRFcnJvcihcIlVuYWJsZSB0byBjbG9zZSB0aGUgV2ViU29ja2V0XCIpKTtcbiAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgc29ja2V0c1tzb2NrZXRLZXldLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7XG4gICAgICAgICAgcmVzb2x2ZShzb2NrZXRLZXkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNvY2tldHNbc29ja2V0S2V5XS5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShzb2NrZXRLZXkpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICApO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gaW5zdGFuY2UgVVJMIGluIGEgV2ViU29ja2V0IFVSTFxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZVVybFxuICogQHBhcmFtIHBhdGhuYW1lXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgYnVpbGRTb2NrZXRVcmwgPSAoaW5zdGFuY2VVcmw6IFVSTCwgcGF0aG5hbWU6IHN0cmluZyk6IFVSTCA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoaW5zdGFuY2VVcmwpO1xuXG4gIGlmICghW1wid3M6XCIsIFwid3NzOlwiXS5pbmNsdWRlcyh1cmwucHJvdG9jb2wpKSB7XG4gICAgdXJsLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgPyBcIndzOlwiIDogXCJ3c3M6XCI7XG4gIH1cbiAgdXJsLnBhdGhuYW1lICs9IHBhdGhuYW1lO1xuXG4gIHJldHVybiBuZXcgVVJMKHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgZG93bmxvYWQgVVJMIGZvciB0aGUgc29ja2V0LiBSZXR1cm5zIGEgc3RyaW5nIHNpbmNlIGl0J3MgbW9zdGx5IHVzZWQgYXMgc29ja2V0cyBrZXlcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkb3dubG9hZFNvY2tldFVybCA9IChsdWZpRmlsZTogTHVmaUZpbGUpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYnVpbGRTb2NrZXRVcmwoXG4gICAgbmV3IFVSTChsdWZpRmlsZS5zZXJ2ZXJVcmwpLFxuICAgIFNvY2tldFBhdGguRE9XTkxPQUQgKyBgLyR7bHVmaUZpbGUua2V5cy5zZXJ2ZXJ9YCxcbiAgKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgdXBsb2FkIFVSTCBmb3IgdGhlIHNvY2tldC4gUmV0dXJucyBhIHN0cmluZyBzaW5jZSBpdCdzIG1vc3RseSB1c2VkIGFzIHNvY2tldHMga2V5XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBsb2FkU29ja2V0VXJsID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBidWlsZFNvY2tldFVybChuZXcgVVJMKGx1ZmlGaWxlLnNlcnZlclVybCksIFNvY2tldFBhdGguVVBMT0FEKVxuICAgIC50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBUcnkgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIEpTT04uIFJldHVybnMgZmFsc2UgaWYgbm90IHBvc3NpYmxlLlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCB0cnlQYXJzZUpzb24gPSAoZGF0YTogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgIGlmIChwYXJzZWRPYmplY3QgJiYgdHlwZW9mIHBhcnNlZE9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHBhcnNlZE9iamVjdDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChfZSkge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgaXMgU2VydmVyRG93bmxvYWRDaHVua01ldGFkYXRhXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NlcnZlckRvd25sb2FkQ2h1bmtTdWNjZXNzTWV0YWRhdGEgPSAoXG4gIG1lc3NhZ2U6IFNlcnZlckRvd25sb2FkQ2h1bmtNZXRhZGF0YSxcbik6IG1lc3NhZ2UgaXMgU2VydmVyRG93bmxvYWRDaHVua1N1Y2Nlc3NNZXRhZGF0YSA9PlxuICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJiBtZXNzYWdlICE9PSBudWxsICYmICEoXCJtc2dcIiBpbiBtZXNzYWdlKTtcbiIsICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJy4vaW5kZXguanMnXG5cbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXJcbiIsICJleHBvcnQgY2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG5cdH1cbn1cblxuLyoqXG5BbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiB0aGUgcmVxdWVzdCBpcyBhYm9ydGVkIGJ5IEFib3J0Q29udHJvbGxlci5cbkRPTUV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiB0aGlzIEVycm9yIHdoZW4gRE9NRXhjZXB0aW9uIGlzIGF2YWlsYWJsZS5cbiovXG5leHBvcnQgY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InO1xuXHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH1cbn1cblxuLyoqXG5UT0RPOiBSZW1vdmUgQWJvcnRFcnJvciBhbmQganVzdCB0aHJvdyBET01FeGNlcHRpb24gd2hlbiB0YXJnZXRpbmcgTm9kZSAxOC5cbiovXG5jb25zdCBnZXRET01FeGNlcHRpb24gPSBlcnJvck1lc3NhZ2UgPT4gZ2xvYmFsVGhpcy5ET01FeGNlcHRpb24gPT09IHVuZGVmaW5lZFxuXHQ/IG5ldyBBYm9ydEVycm9yKGVycm9yTWVzc2FnZSlcblx0OiBuZXcgRE9NRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7XG5cbi8qKlxuVE9ETzogUmVtb3ZlIGJlbG93IGZ1bmN0aW9uIGFuZCBqdXN0ICdyZWplY3Qoc2lnbmFsLnJlYXNvbiknIHdoZW4gdGFyZ2V0aW5nIE5vZGUgMTguXG4qL1xuY29uc3QgZ2V0QWJvcnRlZFJlYXNvbiA9IHNpZ25hbCA9PiB7XG5cdGNvbnN0IHJlYXNvbiA9IHNpZ25hbC5yZWFzb24gPT09IHVuZGVmaW5lZFxuXHRcdD8gZ2V0RE9NRXhjZXB0aW9uKCdUaGlzIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nKVxuXHRcdDogc2lnbmFsLnJlYXNvbjtcblxuXHRyZXR1cm4gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBnZXRET01FeGNlcHRpb24ocmVhc29uKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBUaW1lb3V0KHByb21pc2UsIG9wdGlvbnMpIHtcblx0Y29uc3Qge1xuXHRcdG1pbGxpc2Vjb25kcyxcblx0XHRmYWxsYmFjayxcblx0XHRtZXNzYWdlLFxuXHRcdGN1c3RvbVRpbWVycyA9IHtzZXRUaW1lb3V0LCBjbGVhclRpbWVvdXR9LFxuXHR9ID0gb3B0aW9ucztcblxuXHRsZXQgdGltZXI7XG5cblx0Y29uc3Qgd3JhcHBlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgIT09ICdudW1iZXInIHx8IE1hdGguc2lnbihtaWxsaXNlY29uZHMpICE9PSAxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBtaWxsaXNlY29uZHNcXGAgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCBcXGAke21pbGxpc2Vjb25kc31cXGBgKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zaWduYWwpIHtcblx0XHRcdGNvbnN0IHtzaWduYWx9ID0gb3B0aW9ucztcblx0XHRcdGlmIChzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0XHRyZWplY3QoZ2V0QWJvcnRlZFJlYXNvbihzaWduYWwpKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuXHRcdFx0XHRyZWplY3QoZ2V0QWJvcnRlZFJlYXNvbihzaWduYWwpKTtcblx0XHRcdH07XG5cblx0XHRcdHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0SGFuZGxlciwge29uY2U6IHRydWV9KTtcblxuXHRcdFx0cHJvbWlzZS5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChtaWxsaXNlY29uZHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuXHRcdFx0cHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY3JlYXRlIHRoZSBlcnJvciBvdXRzaWRlIG9mIGBzZXRUaW1lb3V0YCB0byBwcmVzZXJ2ZSB0aGUgc3RhY2sgdHJhY2UuXG5cdFx0Y29uc3QgdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcigpO1xuXG5cdFx0dGltZXIgPSBjdXN0b21UaW1lcnMuc2V0VGltZW91dC5jYWxsKHVuZGVmaW5lZCwgKCkgPT4ge1xuXHRcdFx0aWYgKGZhbGxiYWNrKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShmYWxsYmFjaygpKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mIHByb21pc2UuY2FuY2VsID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHByb21pc2UuY2FuY2VsKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0XHRyZWplY3QobWVzc2FnZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aW1lb3V0RXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UgPz8gYFByb21pc2UgdGltZWQgb3V0IGFmdGVyICR7bWlsbGlzZWNvbmRzfSBtaWxsaXNlY29uZHNgO1xuXHRcdFx0XHRyZWplY3QodGltZW91dEVycm9yKTtcblx0XHRcdH1cblx0XHR9LCBtaWxsaXNlY29uZHMpO1xuXG5cdFx0KGFzeW5jICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJlc29sdmUoYXdhaXQgcHJvbWlzZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pKCk7XG5cdH0pO1xuXG5cdGNvbnN0IGNhbmNlbGFibGVQcm9taXNlID0gd3JhcHBlZFByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdFx0Y2FuY2VsYWJsZVByb21pc2UuY2xlYXIoKTtcblx0fSk7XG5cblx0Y2FuY2VsYWJsZVByb21pc2UuY2xlYXIgPSAoKSA9PiB7XG5cdFx0Y3VzdG9tVGltZXJzLmNsZWFyVGltZW91dC5jYWxsKHVuZGVmaW5lZCwgdGltZXIpO1xuXHRcdHRpbWVyID0gdW5kZWZpbmVkO1xuXHR9O1xuXG5cdHJldHVybiBjYW5jZWxhYmxlUHJvbWlzZTtcbn1cbiIsICIvLyBQb3J0IG9mIGxvd2VyX2JvdW5kIGZyb20gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2FsZ29yaXRobS9sb3dlcl9ib3VuZFxuLy8gVXNlZCB0byBjb21wdXRlIGluc2VydGlvbiBpbmRleCB0byBrZWVwIHF1ZXVlIHNvcnRlZCBhZnRlciBpbnNlcnRpb25cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gICAgbGV0IGZpcnN0ID0gMDtcbiAgICBsZXQgY291bnQgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zdCBzdGVwID0gTWF0aC50cnVuYyhjb3VudCAvIDIpO1xuICAgICAgICBsZXQgaXQgPSBmaXJzdCArIHN0ZXA7XG4gICAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2l0XSwgdmFsdWUpIDw9IDApIHtcbiAgICAgICAgICAgIGZpcnN0ID0gKytpdDtcbiAgICAgICAgICAgIGNvdW50IC09IHN0ZXAgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY291bnQgPSBzdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaXJzdDtcbn1cbiIsICJpbXBvcnQgbG93ZXJCb3VuZCBmcm9tICcuL2xvd2VyLWJvdW5kLmpzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByaW9yaXR5UXVldWUge1xuICAgICNxdWV1ZSA9IFtdO1xuICAgIGVucXVldWUocnVuLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBwcmlvcml0eTogMCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgICAgICAgICBwcmlvcml0eTogb3B0aW9ucy5wcmlvcml0eSxcbiAgICAgICAgICAgIHJ1bixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAmJiB0aGlzLiNxdWV1ZVt0aGlzLnNpemUgLSAxXS5wcmlvcml0eSA+PSBvcHRpb25zLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLiNxdWV1ZS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG93ZXJCb3VuZCh0aGlzLiNxdWV1ZSwgZWxlbWVudCwgKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcbiAgICAgICAgdGhpcy4jcXVldWUuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gICAgZGVxdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuI3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiBpdGVtPy5ydW47XG4gICAgfVxuICAgIGZpbHRlcihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWV1ZS5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQucHJpb3JpdHkgPT09IG9wdGlvbnMucHJpb3JpdHkpLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5ydW4pO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXVlLmxlbmd0aDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgcFRpbWVvdXQsIHsgVGltZW91dEVycm9yIH0gZnJvbSAncC10aW1lb3V0JztcbmltcG9ydCBQcmlvcml0eVF1ZXVlIGZyb20gJy4vcHJpb3JpdHktcXVldWUuanMnO1xuLyoqXG5Qcm9taXNlIHF1ZXVlIHdpdGggY29uY3VycmVuY3kgY29udHJvbC5cbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQUXVldWUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50O1xuICAgICNpc0ludGVydmFsSWdub3JlZDtcbiAgICAjaW50ZXJ2YWxDb3VudCA9IDA7XG4gICAgI2ludGVydmFsQ2FwO1xuICAgICNpbnRlcnZhbDtcbiAgICAjaW50ZXJ2YWxFbmQgPSAwO1xuICAgICNpbnRlcnZhbElkO1xuICAgICN0aW1lb3V0SWQ7XG4gICAgI3F1ZXVlO1xuICAgICNxdWV1ZUNsYXNzO1xuICAgICNwZW5kaW5nID0gMDtcbiAgICAvLyBUaGUgYCFgIGlzIG5lZWRlZCBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzIxOTRcbiAgICAjY29uY3VycmVuY3k7XG4gICAgI2lzUGF1c2VkO1xuICAgICN0aHJvd09uVGltZW91dDtcbiAgICAvKipcbiAgICBQZXItb3BlcmF0aW9uIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBPcGVyYXRpb25zIGZ1bGZpbGwgb25jZSBgdGltZW91dGAgZWxhcHNlcyBpZiB0aGV5IGhhdmVuJ3QgYWxyZWFkeS5cblxuICAgIEFwcGxpZXMgdG8gZWFjaCBmdXR1cmUgb3BlcmF0aW9uLlxuICAgICovXG4gICAgdGltZW91dDtcbiAgICAvLyBUT0RPOiBUaGUgYHRocm93T25UaW1lb3V0YCBvcHRpb24gc2hvdWxkIGFmZmVjdCB0aGUgcmV0dXJuIHR5cGVzIG9mIGBhZGQoKWAgYW5kIGBhZGRBbGwoKWBcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQ6IGZhbHNlLFxuICAgICAgICAgICAgaW50ZXJ2YWxDYXA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIGludGVydmFsOiAwLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIGF1dG9TdGFydDogdHJ1ZSxcbiAgICAgICAgICAgIHF1ZXVlQ2xhc3M6IFByaW9yaXR5UXVldWUsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoISh0eXBlb2Ygb3B0aW9ucy5pbnRlcnZhbENhcCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5pbnRlcnZhbENhcCA+PSAxKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW50ZXJ2YWxDYXBcXGAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCwgZ290IFxcYCR7b3B0aW9ucy5pbnRlcnZhbENhcD8udG9TdHJpbmcoKSA/PyAnJ31cXGAgKCR7dHlwZW9mIG9wdGlvbnMuaW50ZXJ2YWxDYXB9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludGVydmFsID09PSB1bmRlZmluZWQgfHwgIShOdW1iZXIuaXNGaW5pdGUob3B0aW9ucy5pbnRlcnZhbCkgJiYgb3B0aW9ucy5pbnRlcnZhbCA+PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW50ZXJ2YWxcXGAgdG8gYmUgYSBmaW5pdGUgbnVtYmVyID49IDAsIGdvdCBcXGAke29wdGlvbnMuaW50ZXJ2YWw/LnRvU3RyaW5nKCkgPz8gJyd9XFxgICgke3R5cGVvZiBvcHRpb25zLmludGVydmFsfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50ID0gb3B0aW9ucy5jYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50O1xuICAgICAgICB0aGlzLiNpc0ludGVydmFsSWdub3JlZCA9IG9wdGlvbnMuaW50ZXJ2YWxDYXAgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBvcHRpb25zLmludGVydmFsID09PSAwO1xuICAgICAgICB0aGlzLiNpbnRlcnZhbENhcCA9IG9wdGlvbnMuaW50ZXJ2YWxDYXA7XG4gICAgICAgIHRoaXMuI2ludGVydmFsID0gb3B0aW9ucy5pbnRlcnZhbDtcbiAgICAgICAgdGhpcy4jcXVldWUgPSBuZXcgb3B0aW9ucy5xdWV1ZUNsYXNzKCk7XG4gICAgICAgIHRoaXMuI3F1ZXVlQ2xhc3MgPSBvcHRpb25zLnF1ZXVlQ2xhc3M7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQ7XG4gICAgICAgIHRoaXMuI3Rocm93T25UaW1lb3V0ID0gb3B0aW9ucy50aHJvd09uVGltZW91dCA9PT0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jaXNQYXVzZWQgPSBvcHRpb25zLmF1dG9TdGFydCA9PT0gZmFsc2U7XG4gICAgfVxuICAgIGdldCAjZG9lc0ludGVydmFsQWxsb3dBbm90aGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNJbnRlcnZhbElnbm9yZWQgfHwgdGhpcy4jaW50ZXJ2YWxDb3VudCA8IHRoaXMuI2ludGVydmFsQ2FwO1xuICAgIH1cbiAgICBnZXQgI2RvZXNDb25jdXJyZW50QWxsb3dBbm90aGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGVuZGluZyA8IHRoaXMuI2NvbmN1cnJlbmN5O1xuICAgIH1cbiAgICAjbmV4dCgpIHtcbiAgICAgICAgdGhpcy4jcGVuZGluZy0tO1xuICAgICAgICB0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpO1xuICAgICAgICB0aGlzLmVtaXQoJ25leHQnKTtcbiAgICB9XG4gICAgI29uUmVzdW1lSW50ZXJ2YWwoKSB7XG4gICAgICAgIHRoaXMuI29uSW50ZXJ2YWwoKTtcbiAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZUludGVydmFsSWZOZWVkZWQoKTtcbiAgICAgICAgdGhpcy4jdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgI2lzSW50ZXJ2YWxQYXVzZWQoKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLiNpbnRlcnZhbElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy4jaW50ZXJ2YWxFbmQgLSBub3c7XG4gICAgICAgICAgICBpZiAoZGVsYXkgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWN0IGFzIHRoZSBpbnRlcnZhbCB3YXMgZG9uZVxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVzdW1lIGl0IGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHJlc3VtZWQgb24gbGluZSAxNjBcbiAgICAgICAgICAgICAgICB0aGlzLiNpbnRlcnZhbENvdW50ID0gKHRoaXMuI2NhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQpID8gdGhpcy4jcGVuZGluZyA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBY3QgYXMgdGhlIGludGVydmFsIGlzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jdGltZW91dElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNvblJlc3VtZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAjdHJ5VG9TdGFydEFub3RoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNxdWV1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4gY2xlYXIgdGhlIGludGVydmFsIChcInBhdXNlXCIpXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbiByZWRvIGl0IGxhdGVyIChcInJlc3VtZVwiKVxuICAgICAgICAgICAgaWYgKHRoaXMuI2ludGVydmFsSWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuI2ludGVydmFsSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW50ZXJ2YWxJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW1wdHknKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiNpc1BhdXNlZCkge1xuICAgICAgICAgICAgY29uc3QgY2FuSW5pdGlhbGl6ZUludGVydmFsID0gIXRoaXMuI2lzSW50ZXJ2YWxQYXVzZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy4jZG9lc0ludGVydmFsQWxsb3dBbm90aGVyICYmIHRoaXMuI2RvZXNDb25jdXJyZW50QWxsb3dBbm90aGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy4jcXVldWUuZGVxdWV1ZSgpO1xuICAgICAgICAgICAgICAgIGlmICgham9iKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBqb2IoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FuSW5pdGlhbGl6ZUludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVJbnRlcnZhbElmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgI2luaXRpYWxpemVJbnRlcnZhbElmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy4jaXNJbnRlcnZhbElnbm9yZWQgfHwgdGhpcy4jaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uSW50ZXJ2YWwoKTtcbiAgICAgICAgfSwgdGhpcy4jaW50ZXJ2YWwpO1xuICAgICAgICB0aGlzLiNpbnRlcnZhbEVuZCA9IERhdGUubm93KCkgKyB0aGlzLiNpbnRlcnZhbDtcbiAgICB9XG4gICAgI29uSW50ZXJ2YWwoKSB7XG4gICAgICAgIGlmICh0aGlzLiNpbnRlcnZhbENvdW50ID09PSAwICYmIHRoaXMuI3BlbmRpbmcgPT09IDAgJiYgdGhpcy4jaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNpbnRlcnZhbElkKTtcbiAgICAgICAgICAgIHRoaXMuI2ludGVydmFsSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxDb3VudCA9IHRoaXMuI2NhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQgPyB0aGlzLiNwZW5kaW5nIDogMDtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc1F1ZXVlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4ZWN1dGVzIGFsbCBxdWV1ZWQgZnVuY3Rpb25zIHVudGlsIGl0IHJlYWNoZXMgdGhlIGxpbWl0LlxuICAgICovXG4gICAgI3Byb2Nlc3NRdWV1ZSgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgICAgIHdoaWxlICh0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpKSB7IH1cbiAgICB9XG4gICAgZ2V0IGNvbmN1cnJlbmN5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29uY3VycmVuY3k7XG4gICAgfVxuICAgIHNldCBjb25jdXJyZW5jeShuZXdDb25jdXJyZW5jeSkge1xuICAgICAgICBpZiAoISh0eXBlb2YgbmV3Q29uY3VycmVuY3kgPT09ICdudW1iZXInICYmIG5ld0NvbmN1cnJlbmN5ID49IDEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb25jdXJyZW5jeVxcYCB0byBiZSBhIG51bWJlciBmcm9tIDEgYW5kIHVwLCBnb3QgXFxgJHtuZXdDb25jdXJyZW5jeX1cXGAgKCR7dHlwZW9mIG5ld0NvbmN1cnJlbmN5fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjb25jdXJyZW5jeSA9IG5ld0NvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLiNwcm9jZXNzUXVldWUoKTtcbiAgICB9XG4gICAgYXN5bmMgI3Rocm93T25BYm9ydChzaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgYWRkKGZ1bmN0aW9uXywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICB0aHJvd09uVGltZW91dDogdGhpcy4jdGhyb3dPblRpbWVvdXQsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcXVldWUuZW5xdWV1ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGVuZGluZysrO1xuICAgICAgICAgICAgICAgIHRoaXMuI2ludGVydmFsQ291bnQrKztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9IGZ1bmN0aW9uXyh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IHBUaW1lb3V0KFByb21pc2UucmVzb2x2ZShvcGVyYXRpb24pLCB7IG1pbGxpc2Vjb25kczogb3B0aW9ucy50aW1lb3V0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gUHJvbWlzZS5yYWNlKFtvcGVyYXRpb24sIHRoaXMuI3Rocm93T25BYm9ydChvcHRpb25zLnNpZ25hbCldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb21wbGV0ZWQnLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yICYmICFvcHRpb25zLnRocm93T25UaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI25leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWRkJyk7XG4gICAgICAgICAgICB0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgYWRkQWxsKGZ1bmN0aW9ucywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZnVuY3Rpb25zLm1hcChhc3luYyAoZnVuY3Rpb25fKSA9PiB0aGlzLmFkZChmdW5jdGlvbl8sIG9wdGlvbnMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IChvciByZXN1bWUpIGV4ZWN1dGluZyBlbnF1ZXVlZCB0YXNrcyB3aXRoaW4gY29uY3VycmVuY3kgbGltaXQuIE5vIG5lZWQgdG8gY2FsbCB0aGlzIGlmIHF1ZXVlIGlzIG5vdCBwYXVzZWQgKHZpYSBgb3B0aW9ucy5hdXRvU3RhcnQgPSBmYWxzZWAgb3IgYnkgYC5wYXVzZSgpYCBtZXRob2QuKVxuICAgICovXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NRdWV1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IHF1ZXVlIGV4ZWN1dGlvbiBvbiBob2xkLlxuICAgICovXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuI2lzUGF1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYXIgdGhlIHF1ZXVlLlxuICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI3F1ZXVlID0gbmV3IHRoaXMuI3F1ZXVlQ2xhc3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVXNlZnVsIGlmIHlvdSBmb3IgZXhhbXBsZSBhZGQgYWRkaXRpb25hbCBpdGVtcyBhdCBhIGxhdGVyIHRpbWUuXG5cbiAgICBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBzZXR0bGVzIHdoZW4gdGhlIHF1ZXVlIGJlY29tZXMgZW1wdHkuXG4gICAgKi9cbiAgICBhc3luYyBvbkVtcHR5KCkge1xuICAgICAgICAvLyBJbnN0YW50bHkgcmVzb2x2ZSBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNvbkV2ZW50KCdlbXB0eScpO1xuICAgIH1cbiAgICAvKipcbiAgICBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBzZXR0bGVzIHdoZW4gdGhlIHF1ZXVlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBsaW1pdDogYHF1ZXVlLnNpemUgPCBsaW1pdGAuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhdm9pZCBoYXZpbmcgdGhlIHF1ZXVlIGdyb3cgYmV5b25kIGEgY2VydGFpbiBzaXplIHlvdSBjYW4gYGF3YWl0IHF1ZXVlLm9uU2l6ZUxlc3NUaGFuKClgIGJlZm9yZSBhZGRpbmcgYSBuZXcgaXRlbS5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9ubHkgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgd2FpdGluZyB0byBzdGFydC4gVGhlcmUgY291bGQgc3RpbGwgYmUgdXAgdG8gYGNvbmN1cnJlbmN5YCBqb2JzIGFscmVhZHkgcnVubmluZyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBpbmNsdWRlIGluIGl0cyBjYWxjdWxhdGlvbi5cbiAgICAqL1xuICAgIGFzeW5jIG9uU2l6ZUxlc3NUaGFuKGxpbWl0KSB7XG4gICAgICAgIC8vIEluc3RhbnRseSByZXNvbHZlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgICAgaWYgKHRoaXMuI3F1ZXVlLnNpemUgPCBsaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXZlbnQoJ25leHQnLCAoKSA9PiB0aGlzLiNxdWV1ZS5zaXplIDwgbGltaXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGlmZmVyZW5jZSB3aXRoIGAub25FbXB0eWAgaXMgdGhhdCBgLm9uSWRsZWAgZ3VhcmFudGVlcyB0aGF0IGFsbCB3b3JrIGZyb20gdGhlIHF1ZXVlIGhhcyBmaW5pc2hlZC4gYC5vbkVtcHR5YCBtZXJlbHkgc2lnbmFscyB0aGF0IHRoZSBxdWV1ZSBpcyBlbXB0eSwgYnV0IGl0IGNvdWxkIG1lYW4gdGhhdCBzb21lIHByb21pc2VzIGhhdmVuJ3QgY29tcGxldGVkIHlldC5cblxuICAgIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHNldHRsZXMgd2hlbiB0aGUgcXVldWUgYmVjb21lcyBlbXB0eSwgYW5kIGFsbCBwcm9taXNlcyBoYXZlIGNvbXBsZXRlZDsgYHF1ZXVlLnNpemUgPT09IDAgJiYgcXVldWUucGVuZGluZyA9PT0gMGAuXG4gICAgKi9cbiAgICBhc3luYyBvbklkbGUoKSB7XG4gICAgICAgIC8vIEluc3RhbnRseSByZXNvbHZlIGlmIG5vbmUgcGVuZGluZyBhbmQgaWYgbm90aGluZyBlbHNlIGlzIHF1ZXVlZFxuICAgICAgICBpZiAodGhpcy4jcGVuZGluZyA9PT0gMCAmJiB0aGlzLiNxdWV1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jb25FdmVudCgnaWRsZScpO1xuICAgIH1cbiAgICBhc3luYyAjb25FdmVudChldmVudCwgZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2l6ZSBvZiB0aGUgcXVldWUsIHRoZSBudW1iZXIgb2YgcXVldWVkIGl0ZW1zIHdhaXRpbmcgdG8gcnVuLlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWV1ZS5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBTaXplIG9mIHRoZSBxdWV1ZSwgZmlsdGVyZWQgYnkgdGhlIGdpdmVuIG9wdGlvbnMuXG5cbiAgICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZSB3aXRoIGEgc3BlY2lmaWMgcHJpb3JpdHkgbGV2ZWwuXG4gICAgKi9cbiAgICBzaXplQnkob3B0aW9ucykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1hcnJheS1jYWxsYmFjay1yZWZlcmVuY2VcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXVlLmZpbHRlcihvcHRpb25zKS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIE51bWJlciBvZiBydW5uaW5nIGl0ZW1zIChubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS5cbiAgICAqL1xuICAgIGdldCBwZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGVuZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgcXVldWUgaXMgY3VycmVudGx5IHBhdXNlZC5cbiAgICAqL1xuICAgIGdldCBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUGF1c2VkO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuaW1wb3J0IHsgZXZlbnRzLCBpbml0LCBzZW5kRmlsZUVycm9yLCB1cGRhdGVGaWxlIH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgZG93bmxvYWRDaHVuayB9IGZyb20gXCJ+L2FwaS93ZWJzb2NrZXQudHNcIjtcbmltcG9ydCBQUXVldWUgZnJvbSBcInAtcXVldWVcIjtcbmltcG9ydCB7IFdPUktFUl9BQ1RJT04gfSBmcm9tIFwifi9lbnVtL3dvcmtlci1hY3Rpb24udHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0RXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzXCI7XG5cbmRlY2xhcmUgY29uc3Qgc2VsZjogV29ya2VyO1xuXG5jb25zdCBRVUVVRV9DT05DVVJSRU5DWV9MSU1JVCA9IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDE7XG5jb25zdCBxdWV1ZSA9IG5ldyBQUXVldWUoe1xuICBjb25jdXJyZW5jeTogUVVFVUVfQ09OQ1VSUkVOQ1lfTElNSVQsXG59KTtcbmxldCBpdGVtc0luUXVldWUgPSAwO1xubGV0IGlzSW5pdGlhdGVkID0gZmFsc2U7XG5sZXQgaXNQYXVzZWQgPSBmYWxzZTtcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICBpZiAoIWlzSW5pdGlhdGVkKSB7XG4gICAgaW5pdCgpO1xuICAgIGlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgIGV2ZW50cy5vbmNlKEVWRU5ULkRPV05MT0FEX1NUQVJURUQsICgpID0+IHtcbiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuRE9XTkxPQURfU1RBUlRFRCB9KTtcbiAgICB9KTtcblxuICAgIGV2ZW50cy5vbmNlKEVWRU5ULkRPV05MT0FEX0NPTVBMRVRFLCAoKSA9PiB7XG4gICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULkRPV05MT0FEX0NPTVBMRVRFIH0pO1xuICAgIH0pO1xuXG4gICAgZXZlbnRzLm9uKEVWRU5ULkZJTEVfVVBEQVRFRCwgdXBkYXRlRmlsZSk7XG5cbiAgICBldmVudHMub24oXG4gICAgICBFVkVOVC5DSFVOS19ET1dOTE9BREVELFxuICAgICAgKGJ1ZmZlcjogQXJyYXlCdWZmZXIsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaXRlbXNJblF1ZXVlLS07XG5cbiAgICAgICAgaWYgKCFpc1BhdXNlZCAmJiBpdGVtc0luUXVldWUgPCBRVUVVRV9DT05DVVJSRU5DWV9MSU1JVCkge1xuICAgICAgICAgIHF1ZXVlLnN0YXJ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBldmVudDogRVZFTlQuQ0hVTktfRE9XTkxPQURFRCxcbiAgICAgICAgICBjaHVuazogeyBidWZmZXIsIGluZGV4IH0sXG4gICAgICAgIH0sIFtidWZmZXJdKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhIGFzIFdvcmtlckFjdGlvbk1lc3NhZ2U7XG5cbiAgc3dpdGNoIChkYXRhLmFjdGlvbikge1xuICAgIGNhc2UgV09SS0VSX0FDVElPTi5QQVVTRTpcbiAgICAgIHtcbiAgICAgICAgaXNQYXVzZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULkpPQl9QQVVTRUQgfSk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgV09SS0VSX0FDVElPTi5SRVNVTUU6XG4gICAgICB7XG4gICAgICAgIGlzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuSk9CX1JFU1VNRUQgfSk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBkb3dubG9hZChkYXRhKS5tYXBFcnIoKGVycm9yKSA9PiB7XG4gICAgICAgIHNlbmRGaWxlRXJyb3IoZGF0YS5hcmdzLmx1ZmlGaWxlLCBlcnJvcik7XG4gICAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgZG93bmxvYWQgPSAoXG4gIHdvcmtlck1lc3NhZ2U6IFdvcmtlckFjdGlvbk1lc3NhZ2UsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBjb25zdCB7IGx1ZmlGaWxlIH0gPSB3b3JrZXJNZXNzYWdlLmFyZ3M7XG5cbiAgZXZlbnRzLm9uKEVWRU5ULkRPV05MT0FEX1NUQVJURUQsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGx1ZmlGaWxlLnRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgIGlmICghaXNQYXVzZWQgJiYgaXRlbXNJblF1ZXVlIDwgUVVFVUVfQ09OQ1VSUkVOQ1lfTElNSVQpIHtcbiAgICAgICAgcXVldWUuc3RhcnQoKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcXVldWUuYWRkKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZG93bmxvYWRDaHVuayhsdWZpRmlsZSwgaSk7XG5cbiAgICAgICAgaXRlbXNJblF1ZXVlKys7XG5cbiAgICAgICAgaWYgKGlzUGF1c2VkIHx8IGl0ZW1zSW5RdWV1ZSA9PT0gUVVFVUVfQ09OQ1VSUkVOQ1lfTElNSVQpIHtcbiAgICAgICAgICBxdWV1ZS5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0ZW1zSW5RdWV1ZSsrO1xuXG4gIHJldHVybiBkb3dubG9hZENodW5rKGx1ZmlGaWxlLCAwKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUF1QkEsUUFBSSxJQUFJLE9BQU8sWUFBWSxXQUFXLFVBQVU7QUFDaEQsUUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLFVBQVUsYUFDdkMsRUFBRSxRQUNGLFNBQVNBLGNBQWEsUUFBUSxVQUFVLE1BQU07QUFDOUMsYUFBTyxTQUFTLFVBQVUsTUFBTSxLQUFLLFFBQVEsVUFBVSxJQUFJO0FBQUEsSUFDN0Q7QUFFRixRQUFJO0FBQ0osUUFBSSxLQUFLLE9BQU8sRUFBRSxZQUFZLFlBQVk7QUFDeEMsdUJBQWlCLEVBQUU7QUFBQSxJQUNyQixXQUFXLE9BQU8sdUJBQXVCO0FBQ3ZDLHVCQUFpQixTQUFTQyxnQkFBZSxRQUFRO0FBQy9DLGVBQU8sT0FBTyxvQkFBb0IsTUFBTSxFQUNyQyxPQUFPLE9BQU8sc0JBQXNCLE1BQU0sQ0FBQztBQUFBLE1BQ2hEO0FBQUEsSUFDRixPQUFPO0FBQ0wsdUJBQWlCLFNBQVNBLGdCQUFlLFFBQVE7QUFDL0MsZUFBTyxPQUFPLG9CQUFvQixNQUFNO0FBQUEsTUFDMUM7QUFBQSxJQUNGO0FBRUEsYUFBUyxtQkFBbUIsU0FBUztBQUNuQyxVQUFJLFdBQVcsUUFBUSxLQUFNLFNBQVEsS0FBSyxPQUFPO0FBQUEsSUFDbkQ7QUFFQSxRQUFJLGNBQWMsT0FBTyxTQUFTLFNBQVNDLGFBQVksT0FBTztBQUM1RCxhQUFPLFVBQVU7QUFBQSxJQUNuQjtBQUVBLGFBQVNDLGdCQUFlO0FBQ3RCLE1BQUFBLGNBQWEsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUM3QjtBQUNBLFdBQU8sVUFBVUE7QUFDakIsV0FBTyxRQUFRLE9BQU87QUFHdEIsSUFBQUEsY0FBYSxlQUFlQTtBQUU1QixJQUFBQSxjQUFhLFVBQVUsVUFBVTtBQUNqQyxJQUFBQSxjQUFhLFVBQVUsZUFBZTtBQUN0QyxJQUFBQSxjQUFhLFVBQVUsZ0JBQWdCO0FBSXZDLFFBQUksc0JBQXNCO0FBRTFCLGFBQVMsY0FBYyxVQUFVO0FBQy9CLFVBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsY0FBTSxJQUFJLFVBQVUscUVBQXFFLE9BQU8sUUFBUTtBQUFBLE1BQzFHO0FBQUEsSUFDRjtBQUVBLFdBQU8sZUFBZUEsZUFBYyx1QkFBdUI7QUFBQSxNQUN6RCxZQUFZO0FBQUEsTUFDWixLQUFLLFdBQVc7QUFDZCxlQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxTQUFTLEtBQUs7QUFDakIsWUFBSSxPQUFPLFFBQVEsWUFBWSxNQUFNLEtBQUssWUFBWSxHQUFHLEdBQUc7QUFDMUQsZ0JBQU0sSUFBSSxXQUFXLG9HQUFvRyxNQUFNLEdBQUc7QUFBQSxRQUNwSTtBQUNBLDhCQUFzQjtBQUFBLE1BQ3hCO0FBQUEsSUFDRixDQUFDO0FBRUQsSUFBQUEsY0FBYSxPQUFPLFdBQVc7QUFFN0IsVUFBSSxLQUFLLFlBQVksVUFDakIsS0FBSyxZQUFZLE9BQU8sZUFBZSxJQUFJLEVBQUUsU0FBUztBQUN4RCxhQUFLLFVBQVUsdUJBQU8sT0FBTyxJQUFJO0FBQ2pDLGFBQUssZUFBZTtBQUFBLE1BQ3RCO0FBRUEsV0FBSyxnQkFBZ0IsS0FBSyxpQkFBaUI7QUFBQSxJQUM3QztBQUlBLElBQUFBLGNBQWEsVUFBVSxrQkFBa0IsU0FBUyxnQkFBZ0IsR0FBRztBQUNuRSxVQUFJLE9BQU8sTUFBTSxZQUFZLElBQUksS0FBSyxZQUFZLENBQUMsR0FBRztBQUNwRCxjQUFNLElBQUksV0FBVyxrRkFBa0YsSUFBSSxHQUFHO0FBQUEsTUFDaEg7QUFDQSxXQUFLLGdCQUFnQjtBQUNyQixhQUFPO0FBQUEsSUFDVDtBQUVBLGFBQVMsaUJBQWlCLE1BQU07QUFDOUIsVUFBSSxLQUFLLGtCQUFrQjtBQUN6QixlQUFPQSxjQUFhO0FBQ3RCLGFBQU8sS0FBSztBQUFBLElBQ2Q7QUFFQSxJQUFBQSxjQUFhLFVBQVUsa0JBQWtCLFNBQVMsa0JBQWtCO0FBQ2xFLGFBQU8saUJBQWlCLElBQUk7QUFBQSxJQUM5QjtBQUVBLElBQUFBLGNBQWEsVUFBVSxPQUFPLFNBQVMsS0FBSyxNQUFNO0FBQ2hELFVBQUksT0FBTyxDQUFDO0FBQ1osZUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsSUFBSyxNQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDakUsVUFBSSxVQUFXLFNBQVM7QUFFeEIsVUFBSUMsVUFBUyxLQUFLO0FBQ2xCLFVBQUlBLFlBQVc7QUFDYixrQkFBVyxXQUFXQSxRQUFPLFVBQVU7QUFBQSxlQUNoQyxDQUFDO0FBQ1IsZUFBTztBQUdULFVBQUksU0FBUztBQUNYLFlBQUk7QUFDSixZQUFJLEtBQUssU0FBUztBQUNoQixlQUFLLEtBQUssQ0FBQztBQUNiLFlBQUksY0FBYyxPQUFPO0FBR3ZCLGdCQUFNO0FBQUEsUUFDUjtBQUVBLFlBQUlDLE9BQU0sSUFBSSxNQUFNLHNCQUFzQixLQUFLLE9BQU8sR0FBRyxVQUFVLE1BQU0sR0FBRztBQUM1RSxRQUFBQSxLQUFJLFVBQVU7QUFDZCxjQUFNQTtBQUFBLE1BQ1I7QUFFQSxVQUFJLFVBQVVELFFBQU8sSUFBSTtBQUV6QixVQUFJLFlBQVk7QUFDZCxlQUFPO0FBRVQsVUFBSSxPQUFPLFlBQVksWUFBWTtBQUNqQyxxQkFBYSxTQUFTLE1BQU0sSUFBSTtBQUFBLE1BQ2xDLE9BQU87QUFDTCxZQUFJLE1BQU0sUUFBUTtBQUNsQixZQUFJLFlBQVksV0FBVyxTQUFTLEdBQUc7QUFDdkMsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFO0FBQ3pCLHVCQUFhLFVBQVUsQ0FBQyxHQUFHLE1BQU0sSUFBSTtBQUFBLE1BQ3pDO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFFQSxhQUFTLGFBQWEsUUFBUSxNQUFNLFVBQVUsU0FBUztBQUNyRCxVQUFJO0FBQ0osVUFBSUE7QUFDSixVQUFJO0FBRUosb0JBQWMsUUFBUTtBQUV0QixNQUFBQSxVQUFTLE9BQU87QUFDaEIsVUFBSUEsWUFBVyxRQUFXO0FBQ3hCLFFBQUFBLFVBQVMsT0FBTyxVQUFVLHVCQUFPLE9BQU8sSUFBSTtBQUM1QyxlQUFPLGVBQWU7QUFBQSxNQUN4QixPQUFPO0FBR0wsWUFBSUEsUUFBTyxnQkFBZ0IsUUFBVztBQUNwQyxpQkFBTztBQUFBLFlBQUs7QUFBQSxZQUFlO0FBQUEsWUFDZixTQUFTLFdBQVcsU0FBUyxXQUFXO0FBQUEsVUFBUTtBQUk1RCxVQUFBQSxVQUFTLE9BQU87QUFBQSxRQUNsQjtBQUNBLG1CQUFXQSxRQUFPLElBQUk7QUFBQSxNQUN4QjtBQUVBLFVBQUksYUFBYSxRQUFXO0FBRTFCLG1CQUFXQSxRQUFPLElBQUksSUFBSTtBQUMxQixVQUFFLE9BQU87QUFBQSxNQUNYLE9BQU87QUFDTCxZQUFJLE9BQU8sYUFBYSxZQUFZO0FBRWxDLHFCQUFXQSxRQUFPLElBQUksSUFDcEIsVUFBVSxDQUFDLFVBQVUsUUFBUSxJQUFJLENBQUMsVUFBVSxRQUFRO0FBQUEsUUFFeEQsV0FBVyxTQUFTO0FBQ2xCLG1CQUFTLFFBQVEsUUFBUTtBQUFBLFFBQzNCLE9BQU87QUFDTCxtQkFBUyxLQUFLLFFBQVE7QUFBQSxRQUN4QjtBQUdBLFlBQUksaUJBQWlCLE1BQU07QUFDM0IsWUFBSSxJQUFJLEtBQUssU0FBUyxTQUFTLEtBQUssQ0FBQyxTQUFTLFFBQVE7QUFDcEQsbUJBQVMsU0FBUztBQUdsQixjQUFJLElBQUksSUFBSSxNQUFNLGlEQUNFLFNBQVMsU0FBUyxNQUFNLE9BQU8sSUFBSSxJQUFJLG1FQUV2QjtBQUNwQyxZQUFFLE9BQU87QUFDVCxZQUFFLFVBQVU7QUFDWixZQUFFLE9BQU87QUFDVCxZQUFFLFFBQVEsU0FBUztBQUNuQiw2QkFBbUIsQ0FBQztBQUFBLFFBQ3RCO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsSUFBQUQsY0FBYSxVQUFVLGNBQWMsU0FBUyxZQUFZLE1BQU0sVUFBVTtBQUN4RSxhQUFPLGFBQWEsTUFBTSxNQUFNLFVBQVUsS0FBSztBQUFBLElBQ2pEO0FBRUEsSUFBQUEsY0FBYSxVQUFVLEtBQUtBLGNBQWEsVUFBVTtBQUVuRCxJQUFBQSxjQUFhLFVBQVUsa0JBQ25CLFNBQVMsZ0JBQWdCLE1BQU0sVUFBVTtBQUN2QyxhQUFPLGFBQWEsTUFBTSxNQUFNLFVBQVUsSUFBSTtBQUFBLElBQ2hEO0FBRUosYUFBUyxjQUFjO0FBQ3JCLFVBQUksQ0FBQyxLQUFLLE9BQU87QUFDZixhQUFLLE9BQU8sZUFBZSxLQUFLLE1BQU0sS0FBSyxNQUFNO0FBQ2pELGFBQUssUUFBUTtBQUNiLFlBQUksVUFBVSxXQUFXO0FBQ3ZCLGlCQUFPLEtBQUssU0FBUyxLQUFLLEtBQUssTUFBTTtBQUN2QyxlQUFPLEtBQUssU0FBUyxNQUFNLEtBQUssUUFBUSxTQUFTO0FBQUEsTUFDbkQ7QUFBQSxJQUNGO0FBRUEsYUFBUyxVQUFVLFFBQVEsTUFBTSxVQUFVO0FBQ3pDLFVBQUksUUFBUSxFQUFFLE9BQU8sT0FBTyxRQUFRLFFBQVcsUUFBZ0IsTUFBWSxTQUFtQjtBQUM5RixVQUFJLFVBQVUsWUFBWSxLQUFLLEtBQUs7QUFDcEMsY0FBUSxXQUFXO0FBQ25CLFlBQU0sU0FBUztBQUNmLGFBQU87QUFBQSxJQUNUO0FBRUEsSUFBQUEsY0FBYSxVQUFVLE9BQU8sU0FBU0csTUFBSyxNQUFNLFVBQVU7QUFDMUQsb0JBQWMsUUFBUTtBQUN0QixXQUFLLEdBQUcsTUFBTSxVQUFVLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDN0MsYUFBTztBQUFBLElBQ1Q7QUFFQSxJQUFBSCxjQUFhLFVBQVUsc0JBQ25CLFNBQVMsb0JBQW9CLE1BQU0sVUFBVTtBQUMzQyxvQkFBYyxRQUFRO0FBQ3RCLFdBQUssZ0JBQWdCLE1BQU0sVUFBVSxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzFELGFBQU87QUFBQSxJQUNUO0FBR0osSUFBQUEsY0FBYSxVQUFVLGlCQUNuQixTQUFTLGVBQWUsTUFBTSxVQUFVO0FBQ3RDLFVBQUksTUFBTUMsU0FBUSxVQUFVLEdBQUc7QUFFL0Isb0JBQWMsUUFBUTtBQUV0QixNQUFBQSxVQUFTLEtBQUs7QUFDZCxVQUFJQSxZQUFXO0FBQ2IsZUFBTztBQUVULGFBQU9BLFFBQU8sSUFBSTtBQUNsQixVQUFJLFNBQVM7QUFDWCxlQUFPO0FBRVQsVUFBSSxTQUFTLFlBQVksS0FBSyxhQUFhLFVBQVU7QUFDbkQsWUFBSSxFQUFFLEtBQUssaUJBQWlCO0FBQzFCLGVBQUssVUFBVSx1QkFBTyxPQUFPLElBQUk7QUFBQSxhQUM5QjtBQUNILGlCQUFPQSxRQUFPLElBQUk7QUFDbEIsY0FBSUEsUUFBTztBQUNULGlCQUFLLEtBQUssa0JBQWtCLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFBQSxRQUMvRDtBQUFBLE1BQ0YsV0FBVyxPQUFPLFNBQVMsWUFBWTtBQUNyQyxtQkFBVztBQUVYLGFBQUssSUFBSSxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUNyQyxjQUFJLEtBQUssQ0FBQyxNQUFNLFlBQVksS0FBSyxDQUFDLEVBQUUsYUFBYSxVQUFVO0FBQ3pELCtCQUFtQixLQUFLLENBQUMsRUFBRTtBQUMzQix1QkFBVztBQUNYO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLFdBQVc7QUFDYixpQkFBTztBQUVULFlBQUksYUFBYTtBQUNmLGVBQUssTUFBTTtBQUFBLGFBQ1I7QUFDSCxvQkFBVSxNQUFNLFFBQVE7QUFBQSxRQUMxQjtBQUVBLFlBQUksS0FBSyxXQUFXO0FBQ2xCLFVBQUFBLFFBQU8sSUFBSSxJQUFJLEtBQUssQ0FBQztBQUV2QixZQUFJQSxRQUFPLG1CQUFtQjtBQUM1QixlQUFLLEtBQUssa0JBQWtCLE1BQU0sb0JBQW9CLFFBQVE7QUFBQSxNQUNsRTtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUosSUFBQUQsY0FBYSxVQUFVLE1BQU1BLGNBQWEsVUFBVTtBQUVwRCxJQUFBQSxjQUFhLFVBQVUscUJBQ25CLFNBQVMsbUJBQW1CLE1BQU07QUFDaEMsVUFBSSxXQUFXQyxTQUFRO0FBRXZCLE1BQUFBLFVBQVMsS0FBSztBQUNkLFVBQUlBLFlBQVc7QUFDYixlQUFPO0FBR1QsVUFBSUEsUUFBTyxtQkFBbUIsUUFBVztBQUN2QyxZQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLGVBQUssVUFBVSx1QkFBTyxPQUFPLElBQUk7QUFDakMsZUFBSyxlQUFlO0FBQUEsUUFDdEIsV0FBV0EsUUFBTyxJQUFJLE1BQU0sUUFBVztBQUNyQyxjQUFJLEVBQUUsS0FBSyxpQkFBaUI7QUFDMUIsaUJBQUssVUFBVSx1QkFBTyxPQUFPLElBQUk7QUFBQTtBQUVqQyxtQkFBT0EsUUFBTyxJQUFJO0FBQUEsUUFDdEI7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUdBLFVBQUksVUFBVSxXQUFXLEdBQUc7QUFDMUIsWUFBSSxPQUFPLE9BQU8sS0FBS0EsT0FBTTtBQUM3QixZQUFJO0FBQ0osYUFBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHO0FBQ2hDLGdCQUFNLEtBQUssQ0FBQztBQUNaLGNBQUksUUFBUSxpQkFBa0I7QUFDOUIsZUFBSyxtQkFBbUIsR0FBRztBQUFBLFFBQzdCO0FBQ0EsYUFBSyxtQkFBbUIsZ0JBQWdCO0FBQ3hDLGFBQUssVUFBVSx1QkFBTyxPQUFPLElBQUk7QUFDakMsYUFBSyxlQUFlO0FBQ3BCLGVBQU87QUFBQSxNQUNUO0FBRUEsa0JBQVlBLFFBQU8sSUFBSTtBQUV2QixVQUFJLE9BQU8sY0FBYyxZQUFZO0FBQ25DLGFBQUssZUFBZSxNQUFNLFNBQVM7QUFBQSxNQUNyQyxXQUFXLGNBQWMsUUFBVztBQUVsQyxhQUFLLElBQUksVUFBVSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDMUMsZUFBSyxlQUFlLE1BQU0sVUFBVSxDQUFDLENBQUM7QUFBQSxRQUN4QztBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUVKLGFBQVMsV0FBVyxRQUFRLE1BQU0sUUFBUTtBQUN4QyxVQUFJQSxVQUFTLE9BQU87QUFFcEIsVUFBSUEsWUFBVztBQUNiLGVBQU8sQ0FBQztBQUVWLFVBQUksYUFBYUEsUUFBTyxJQUFJO0FBQzVCLFVBQUksZUFBZTtBQUNqQixlQUFPLENBQUM7QUFFVixVQUFJLE9BQU8sZUFBZTtBQUN4QixlQUFPLFNBQVMsQ0FBQyxXQUFXLFlBQVksVUFBVSxJQUFJLENBQUMsVUFBVTtBQUVuRSxhQUFPLFNBQ0wsZ0JBQWdCLFVBQVUsSUFBSSxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQUEsSUFDMUU7QUFFQSxJQUFBRCxjQUFhLFVBQVUsWUFBWSxTQUFTLFVBQVUsTUFBTTtBQUMxRCxhQUFPLFdBQVcsTUFBTSxNQUFNLElBQUk7QUFBQSxJQUNwQztBQUVBLElBQUFBLGNBQWEsVUFBVSxlQUFlLFNBQVMsYUFBYSxNQUFNO0FBQ2hFLGFBQU8sV0FBVyxNQUFNLE1BQU0sS0FBSztBQUFBLElBQ3JDO0FBRUEsSUFBQUEsY0FBYSxnQkFBZ0IsU0FBUyxTQUFTLE1BQU07QUFDbkQsVUFBSSxPQUFPLFFBQVEsa0JBQWtCLFlBQVk7QUFDL0MsZUFBTyxRQUFRLGNBQWMsSUFBSTtBQUFBLE1BQ25DLE9BQU87QUFDTCxlQUFPLGNBQWMsS0FBSyxTQUFTLElBQUk7QUFBQSxNQUN6QztBQUFBLElBQ0Y7QUFFQSxJQUFBQSxjQUFhLFVBQVUsZ0JBQWdCO0FBQ3ZDLGFBQVMsY0FBYyxNQUFNO0FBQzNCLFVBQUlDLFVBQVMsS0FBSztBQUVsQixVQUFJQSxZQUFXLFFBQVc7QUFDeEIsWUFBSSxhQUFhQSxRQUFPLElBQUk7QUFFNUIsWUFBSSxPQUFPLGVBQWUsWUFBWTtBQUNwQyxpQkFBTztBQUFBLFFBQ1QsV0FBVyxlQUFlLFFBQVc7QUFDbkMsaUJBQU8sV0FBVztBQUFBLFFBQ3BCO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsSUFBQUQsY0FBYSxVQUFVLGFBQWEsU0FBUyxhQUFhO0FBQ3hELGFBQU8sS0FBSyxlQUFlLElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDakU7QUFFQSxhQUFTLFdBQVcsS0FBSyxHQUFHO0FBQzFCLFVBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN0QixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUN2QixhQUFLLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDakIsYUFBTztBQUFBLElBQ1Q7QUFFQSxhQUFTLFVBQVUsTUFBTSxPQUFPO0FBQzlCLGFBQU8sUUFBUSxJQUFJLEtBQUssUUFBUTtBQUM5QixhQUFLLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUM5QixXQUFLLElBQUk7QUFBQSxJQUNYO0FBRUEsYUFBUyxnQkFBZ0IsS0FBSztBQUM1QixVQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTTtBQUM5QixlQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFLEdBQUc7QUFDbkMsWUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUM7QUFBQSxNQUNuQztBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBUyxLQUFLLFNBQVMsTUFBTTtBQUMzQixhQUFPLElBQUksUUFBUSxTQUFVLFNBQVMsUUFBUTtBQUM1QyxpQkFBUyxjQUFjRSxNQUFLO0FBQzFCLGtCQUFRLGVBQWUsTUFBTSxRQUFRO0FBQ3JDLGlCQUFPQSxJQUFHO0FBQUEsUUFDWjtBQUVBLGlCQUFTLFdBQVc7QUFDbEIsY0FBSSxPQUFPLFFBQVEsbUJBQW1CLFlBQVk7QUFDaEQsb0JBQVEsZUFBZSxTQUFTLGFBQWE7QUFBQSxVQUMvQztBQUNBLGtCQUFRLENBQUMsRUFBRSxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsUUFDbEM7QUFBQztBQUVELHVDQUErQixTQUFTLE1BQU0sVUFBVSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3RFLFlBQUksU0FBUyxTQUFTO0FBQ3BCLHdDQUE4QixTQUFTLGVBQWUsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUFBLFFBQ3RFO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLGFBQVMsOEJBQThCLFNBQVMsU0FBUyxPQUFPO0FBQzlELFVBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUNwQyx1Q0FBK0IsU0FBUyxTQUFTLFNBQVMsS0FBSztBQUFBLE1BQ2pFO0FBQUEsSUFDRjtBQUVBLGFBQVMsK0JBQStCLFNBQVMsTUFBTSxVQUFVLE9BQU87QUFDdEUsVUFBSSxPQUFPLFFBQVEsT0FBTyxZQUFZO0FBQ3BDLFlBQUksTUFBTSxNQUFNO0FBQ2Qsa0JBQVEsS0FBSyxNQUFNLFFBQVE7QUFBQSxRQUM3QixPQUFPO0FBQ0wsa0JBQVEsR0FBRyxNQUFNLFFBQVE7QUFBQSxRQUMzQjtBQUFBLE1BQ0YsV0FBVyxPQUFPLFFBQVEscUJBQXFCLFlBQVk7QUFHekQsZ0JBQVEsaUJBQWlCLE1BQU0sU0FBUyxhQUFhLEtBQUs7QUFHeEQsY0FBSSxNQUFNLE1BQU07QUFDZCxvQkFBUSxvQkFBb0IsTUFBTSxZQUFZO0FBQUEsVUFDaEQ7QUFDQSxtQkFBUyxHQUFHO0FBQUEsUUFDZCxDQUFDO0FBQUEsTUFDSCxPQUFPO0FBQ0wsY0FBTSxJQUFJLFVBQVUsd0VBQXdFLE9BQU8sT0FBTztBQUFBLE1BQzVHO0FBQUEsSUFDRjtBQUFBO0FBQUE7OztBQ2hmQTtBQUFBO0FBQUE7QUFBYSxRQUFJRSxRQUFLLEVBQUMsUUFBTyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsV0FBVSxFQUFDLFNBQVEsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGNBQVksS0FBSztBQUFBLE1BQU87QUFBRSxXQUFLLFVBQVE7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUU7QUFBQyxXQUFLLFdBQVMsV0FBVTtBQUFDLGVBQU0sY0FBWSxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsR0FBRSxLQUFJLFNBQVMsR0FBRTtBQUFDLFdBQUssV0FBUyxXQUFVO0FBQUMsZUFBTSxVQUFRLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxHQUFFLFVBQVMsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGdCQUFjLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxFQUFDLEVBQUM7QUFDM2MsSUFBQUEsTUFBSyxPQUFPLE1BQUksU0FBUyxHQUFFO0FBQUMsV0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRTtBQUFFLFVBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxVQUFFLEVBQUU7QUFBTyxVQUFJLElBQUU7QUFBRSxVQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsc0JBQXNCO0FBQUUsV0FBSyxJQUFFLENBQUMsSUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUUsSUFBRyxLQUFJO0FBQUMsWUFBRSxFQUFFLElBQUUsQ0FBQztBQUFFLFlBQUcsTUFBSSxJQUFFLEtBQUcsTUFBSSxLQUFHLE1BQUksSUFBRSxFQUFFLEtBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLEdBQUUsTUFBSSxJQUFFLE1BQUksSUFBRSxLQUFHLElBQUUsTUFBSSxLQUFHLEtBQUcsSUFBRyxJQUFFLEtBQUcsSUFBRSxPQUFLLEtBQUc7QUFBSSxVQUFFLENBQUMsSUFBRSxFQUFFLElBQUUsQ0FBQyxJQUFFO0FBQUEsTUFBQztBQUFDLFdBQUksSUFBRSxHQUFFLEdBQUUsS0FBSSxJQUFJLEtBQUUsRUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxLQUFHLEtBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFDM2YsR0FBRyxDQUFDO0FBQUEsSUFBQztBQUNMLElBQUFBLE1BQUssT0FBTyxJQUFJLFlBQVUsRUFBQyxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRSxHQUFFLFdBQVU7QUFBQyxVQUFJLElBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsTUFBTSxHQUFFLElBQUksSUFBRyxFQUFFLENBQUMsSUFBRSxLQUFHLElBQUUsT0FBSyxLQUFHLE1BQUksQ0FBQyxJQUFFO0FBQUUsV0FBSSxJQUFFLElBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLEtBQUcsS0FBRyxHQUFFLElBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHLElBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxNQUFJLElBQUcsRUFBRSxDQUFDLElBQUUsR0FBRSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxXQUFVLElBQUUsUUFBUSxJQUFFLE1BQU0sSUFBRSxXQUFVLEdBQUUsSUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFFLFdBQVUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksR0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSTtBQUFFLFdBQUksSUFDbGdCLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQ2hELGFBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUcsTUFBSSxFQUFFLE9BQU8sT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx3QkFBd0I7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxHQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsU0FBTyxJQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBSSxFQUFFLElBQUUsRUFBRSxLQUFHLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFO0FBQUUsV0FBSSxJQUNyZixHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxDQUFDLElBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxHQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBQztBQUNoSCxJQUFBQSxNQUFLLFdBQVMsRUFBQyxVQUFTLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFFQSxNQUFLLFNBQVMsRUFBRSxFQUFFLE1BQU0sSUFBRSxFQUFFLEdBQUUsTUFBSSxJQUFFLEdBQUcsRUFBRSxNQUFNLENBQUM7QUFBRSxhQUFPLFdBQVMsSUFBRSxJQUFFQSxNQUFLLFNBQVMsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBSyxNQUFNLENBQUMsSUFBRSxJQUFFLEVBQUU7QUFBRSxlQUFRLElBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsS0FBRyxDQUFDLEtBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxLQUFHLElBQUUsQ0FBQyxNQUFJLElBQUUsRUFBRSxJQUFFLEtBQUcsQ0FBQyxNQUFJLE1BQUksS0FBRyxLQUFHO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLE1BQUksRUFBRSxVQUFRLE1BQUksRUFBRSxPQUFPLFFBQU8sRUFBRSxPQUFPLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLFNBQU8sQ0FBQyxHQUFFLElBQUVBLE1BQUssU0FBUyxXQUFXLENBQUM7QUFBRSxhQUFPLE9BQUssSUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFFQSxNQUFLLFNBQVMsRUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLEVBQUUsU0FBTyxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFPLGFBQU8sTUFDMWYsSUFBRSxJQUFFLE1BQUksSUFBRSxLQUFHQSxNQUFLLFNBQVMsV0FBVyxFQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLEtBQUcsRUFBRSxTQUFPLEVBQUUsUUFBTztBQUFFLFVBQUUsRUFBRSxNQUFNLEdBQUUsS0FBSyxLQUFLLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUU7QUFBTyxVQUFFLElBQUU7QUFBRyxVQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsQ0FBQyxJQUFFQSxNQUFLLFNBQVMsUUFBUSxHQUFFLEVBQUUsSUFBRSxDQUFDLElBQUUsY0FBWSxJQUFFLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsYUFBTyxPQUFLLElBQUUsS0FBRyxJQUFFLElBQUUsSUFBRSxLQUFHLEtBQUcsS0FBRyxnQkFBYztBQUFBLElBQUMsR0FBRSxZQUFXLFNBQVMsR0FBRTtBQUFDLGFBQU8sS0FBSyxNQUFNLElBQUUsYUFBYSxLQUFHO0FBQUEsSUFBRSxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHQSxNQUFLLFNBQVMsVUFBVSxDQUFDLE1BQUlBLE1BQUssU0FBUyxVQUFVLENBQUMsRUFBRSxRQUFNO0FBQUcsVUFBSSxJQUFFLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLE1BQUcsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsYUFBTyxNQUNsZjtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUk7QUFBRSxVQUFFO0FBQUUsV0FBSSxXQUFTLE1BQUksSUFBRSxDQUFDLElBQUcsTUFBSSxHQUFFLEtBQUcsR0FBRyxHQUFFLEtBQUssQ0FBQyxHQUFFLElBQUU7QUFBRSxVQUFHLE1BQUksRUFBRSxRQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLEtBQUssSUFBRSxFQUFFLENBQUMsTUFBSSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsS0FBRyxLQUFHO0FBQUUsVUFBRSxFQUFFLFNBQU8sRUFBRSxFQUFFLFNBQU8sQ0FBQyxJQUFFO0FBQUUsVUFBRUEsTUFBSyxTQUFTLFdBQVcsQ0FBQztBQUFFLFFBQUUsS0FBS0EsTUFBSyxTQUFTLFFBQVEsSUFBRSxJQUFFLElBQUcsS0FBRyxJQUFFLElBQUUsSUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsU0FBUyxHQUFFLEdBQUU7QUFBQyxhQUFNLENBQUMsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxFQUFFLEVBQUUsS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxNQUFJLEtBQUcsTUFBSSxJQUFFLFNBQVEsSUFBRSxVQUFTLElBQUUsS0FBRztBQUFHLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFDcGQsSUFBQUEsTUFBSyxNQUFNLGFBQVcsRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRSxJQUFHLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUMsR0FBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxJQUFFLEdBQUUsSUFBSSxRQUFLLElBQUUsT0FBSyxJQUFFLEVBQUUsSUFBRSxDQUFDLElBQUcsS0FBRyxPQUFPLGFBQWEsTUFBSSxNQUFJLE1BQUksQ0FBQyxHQUFFLE1BQUk7QUFBRSxhQUFPLG1CQUFtQixPQUFPLENBQUMsQ0FBQztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRTtBQUFDLFVBQUUsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDO0FBQUUsVUFBSSxJQUFFLENBQUMsR0FBRSxHQUFFLElBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsS0FBRyxJQUFFLEVBQUUsV0FBVyxDQUFDLEdBQUUsT0FBSyxJQUFFLE9BQUssRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFO0FBQUcsVUFBRSxLQUFHLEVBQUUsS0FBS0EsTUFBSyxTQUFTLFFB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LEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFFLFVBQVcsQ0FBQztBQUFFLFdBQUksRUFBRSxLQUFLLEtBQUssSUFBRSxDQUFDLEdBQUUsRUFBRSxTQUFRLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxXQUFLLE1BQU07QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsV0FBVTtBQUFDLGVBQVMsRUFBRUMsSUFBRTtBQUFDLGVBQU8sY0FBYUEsS0FBRSxLQUFLLE1BQU1BLEVBQUMsS0FBRztBQUFBLE1BQUM7QUFBQyxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsR0FBRSxHQUFFLEtBQUcsR0FBRSxLQUFJO0FBQUMsWUFBRTtBQUFHLGFBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxHQUFFLElBQUksS0FBRyxNQUFJLElBQUUsR0FBRTtBQUFDLGNBQ3pmO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFHLEtBQUssRUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLENBQUMsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLE1BQUcsSUFBRSxJQUFFLEVBQUUsQ0FBQyxLQUFHLElBQUUsRUFBRSxJQUFFLElBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEtBQUcsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxLQUFHLEtBQUcsS0FBRyxPQUFLLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUksRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLElBQUUsSUFBRSxFQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSSxJQUFFLEtBQUcsSUFBRSxNQUFJLEVBQUUsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxLQUFHLElBQUUsT0FBSyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQ3BmO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFBLElBQUMsRUFBQztBQUFFLElBQUFELE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEtBQUcsS0FBSyxFQUFFO0FBQUUsV0FBRyxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsS0FBRyxLQUFLLE1BQU07QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLE9BQU8sT0FBSyxTQUFTLEdBQUU7QUFBQyxhQUFPLElBQUlBLE1BQUssS0FBSyxTQUFRLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUFDO0FBQy9TLElBQUFBLE1BQUssS0FBSyxPQUFPLFlBQVUsRUFBQyxXQUFVLE1BQUssT0FBTSxXQUFVO0FBQUMsV0FBSyxJQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBSSxHQUFFLElBQUUsS0FBSyxJQUFFQSxNQUFLLFNBQVMsT0FBTyxLQUFLLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSztBQUFFLFVBQUUsS0FBSyxJQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxVQUFHLG1CQUFpQixFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEscUNBQXFDO0FBQUUsVUFBRyxnQkFBYyxPQUFPLGFBQVk7QUFBQyxZQUFJLElBQUUsSUFBSSxZQUFZLENBQUMsR0FBRSxJQUFFO0FBQUUsYUFBSSxJQUFFLE9BQUssS0FBRyxPQUFLLElBQUUsT0FBTSxLQUFHLEdBQUUsS0FBRyxLQUFLLE1BQUssRUFBRSxFQUFFLFNBQVMsS0FDdGYsR0FBRSxNQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsS0FBRztBQUFFLFVBQUUsT0FBTyxHQUFFLEtBQUcsQ0FBQztBQUFBLE1BQUMsTUFBTSxNQUFJLElBQUUsT0FBSyxLQUFHLE9BQUssSUFBRSxPQUFNLEtBQUcsR0FBRSxLQUFHLEtBQUssTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxDQUFDO0FBQUUsUUFBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBRSxVQUFXLENBQUM7QUFBRSxXQUFJLEVBQUUsS0FBSyxLQUFLLElBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBUSxNQUFLLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSyxNQUFNO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxJQUFHLENBQUMsVUFBUyxVQUFTLFNBQVEsU0FBUSxVQUFTLFNBQVEsU0FBUSxPQUFPLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRztBQUFBLE1BQUM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUNsZjtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQ3BmO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxJQUFPLEdBQUUsR0FBRSxXQUFVO0FBQUMsZUFBUyxFQUFFQyxJQUFFO0FBQUMsZUFBTyxjQUFhQSxLQUFFLEtBQUssTUFBTUEsRUFBQyxLQUFHO0FBQUEsTUFBQztBQUFDLGVBQVMsRUFBRUEsSUFBRTtBQUFDLGVBQU8saUJBQWVBLEtBQUUsS0FBSyxNQUFNQSxFQUFDLEtBQUc7QUFBQSxNQUFHO0FBQUMsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUU7QUFBRyxhQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsR0FBRSxJQUFJLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxjQUFFO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsR0FBRSxDQUFDLEdBQUUsS0FBSyxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxHQUFFLENBQUMsS0FBRyxLQUFHLEtBQUssR0FBRyxDQUFDLElBQUcsS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsSUFBRSxDQUFDLENBQUMsR0FBRSxLQUFLLEVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLElBQUUsQ0FBQyxDQUFDLEtBQUcsS0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FDdmdCLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLEtBQUcsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRTtBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBRSxNQUFNLEdBQUc7QUFBRSxpQkFBUSxJQUFFLEdBQUUsS0FBRyxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUEsTUFBQyxNQUFNLEtBQUU7QUFBRSxVQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxJQUFHLElBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUcsS0FBRyxFQUFFLEtBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUM7QUFBQSxhQUFNO0FBQUMsY0FBRSxFQUFFLEtBQUcsSUFBRSxHQUFHO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGVBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxLQUFHLE1BQUk7QUFBRSxjQUFJLEtBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxNQUFJLEtBQUcsS0FBRyxNQUFJO0FBQUcsY0FBRSxFQUFFLEtBQUcsSUFBRSxFQUFFO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLEtBQUcsQ0FBQyxHQUNuZixLQUFHLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxJQUFFLE1BQUksTUFBSSxNQUFJLEdBQUUsS0FBRyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksSUFBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGNBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxLQUFHLENBQUM7QUFBRSxjQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxlQUFHO0FBQUUsZUFBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLGVBQUc7QUFBRSxlQUFHLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFO0FBQUEsUUFBRTtBQUFDLFVBQUUsSUFBRSxDQUFDLElBQUUsS0FBRztBQUFFLFVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxLQUFHO0FBQUUsWUFBSSxJQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxLQUFHLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxHQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsS0FBRyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksSUFBRyxLQUFHLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxJQUFHLEtBQUcsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEVBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLE1BQUksS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLEtBQUksSUFBRSxNQUFJLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksT0FBSyxLQUNwZixLQUFHLE1BQUksT0FBSyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsTUFBSSxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRSxHQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFJLFlBQUUsSUFBRTtBQUFHLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUUsSUFBRSxJQUFFO0FBQUUsWUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFLElBQUUsSUFBRTtBQUFFLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsTUFBQztBQUFDLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFDbmY7QUFBRSxRQUFFLEVBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsRUFBRSxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxFQUFFLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxFQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsSUFBQyxFQUFDO0FBQ3pILElBQUFELE1BQUssS0FBSyxNQUFJLEVBQUMsTUFBSyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGdCQUFlLFNBQVMsR0FBRTtBQUFDLE1BQUFBLE1BQUssS0FBSyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFBQyxHQUFFLGtCQUFpQixTQUFTLEdBQUU7QUFBQyxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUFFLFdBQUcsS0FBR0EsTUFBSyxLQUFLLElBQUksRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFO0FBQUUsVUFBRSxLQUFHO0FBQUcsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsR0FBRSxJQUFJO0FBQUMsVUFBRSxLQUFHLE1BQUksSUFBRSxLQUFHO0FBQUcsVUFBRSxFQUFFO0FBQUEsUUFBTTtBQUFBLFFBQ3RmLEtBQUcsS0FBRztBQUFB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QUFFLEtBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBRSxhQUFPLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLEdBQUUsSUFBRUEsTUFBSztBQUFTLFVBQUUsRUFBRTtBQUFFLFVBQUksSUFBRSxFQUFFLFFBQU8sSUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFFLElBQUUsSUFBRSxJQUFHLElBQUU7QUFBRSxVQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxHQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFFLEdBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUcsQ0FBQyxFQUFFLFFBQU0sRUFBQyxLQUFJLEdBQUUsTUFBSyxDQUFDLEVBQUM7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsS0FBRyxFQUFFLEtBQUUsTUFBSUEsTUFBSyxLQUFLLElBQUksR0FBRyxJQUNyZ0IsQ0FBQyxHQUFFLEtBQUcsSUFBRyxFQUFFLENBQUMsS0FBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsYUFBTSxFQUFDLEtBQUksR0FBRSxNQUFLLEVBQUUsTUFBTSxHQUFFLENBQUMsRUFBQztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxPQUFLLFNBQVMsR0FBRSxHQUFFO0FBQUMsV0FBSyxJQUFFLElBQUUsS0FBR0EsTUFBSyxLQUFLO0FBQU8sVUFBSSxJQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsWUFBVTtBQUFHLFdBQUssSUFBRSxDQUFDLElBQUksS0FBRSxJQUFJLEdBQUM7QUFBRSxRQUFFLFNBQU8sTUFBSSxJQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUcsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLFdBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQVcsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQztBQUMzWSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFVBQVFBLE1BQUssS0FBSyxLQUFLLFVBQVUsTUFBSSxTQUFTLEdBQUU7QUFBQyxVQUFHLEtBQUssRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHlDQUF5QztBQUFFLFdBQUssT0FBTyxDQUFDO0FBQUUsYUFBTyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFFBQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFO0FBQUEsSUFBRTtBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUU7QUFBRyxXQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxXQUFVO0FBQUMsVUFBSSxJQUFFLEtBQUssRUFBRSxTQUFTLEdBQUUsSUFBRyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUcsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFFLFdBQUssTUFBTTtBQUFFLGFBQU87QUFBQSxJQUFDO0FBQ3ZlLElBQUFBLE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRSxLQUFHO0FBQUksVUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsMEJBQTBCO0FBQUUsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLG1CQUFXLE9BQU8sTUFBSSxJQUFFQSxNQUFLLE1BQU0sV0FBVyxPQUFPLENBQUM7QUFBRyxVQUFFLEtBQUdBLE1BQUssS0FBSztBQUFLLFVBQUUsSUFBSSxFQUFFLENBQUM7QUFBRSxVQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRUEsTUFBSztBQUFTLFdBQUksSUFBRSxHQUFFLEtBQUcsRUFBRSxVQUFRLEtBQUcsSUFBRyxLQUFJO0FBQUMsWUFBRSxJQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksTUFBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsWUFBRSxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQUM7QUFBQyxZQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDO0FBQ25kLElBQUFBLE1BQUssT0FBSyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUUsQ0FBQyxJQUFJQSxNQUFLLEtBQUssUUFBTTtBQUFFLFdBQUssSUFBRSxDQUFDLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLEtBQUssSUFBRSxLQUFLLElBQUUsS0FBSyxLQUFHO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFPLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRTtBQUFHLFdBQUssSUFBRSxFQUFDLFVBQVMsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxFQUFDO0FBQUUsV0FBSyxJQUFFLEtBQUssS0FBRztBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssS0FBRztBQUFRLFdBQUssSUFBRSxDQUFDLEdBQUUsSUFBRyxJQUFHLElBQUcsS0FBSSxLQUFJLEtBQU0sS0FBSSxLQUFJLEtBQUksSUFBSTtBQUFFLFdBQUssS0FBRztBQUFJLFdBQUssSUFBRTtBQUFBLElBQUU7QUFDelcsSUFBQUEsTUFBSyxLQUFLLFlBQVU7QUFBQSxNQUFDLGFBQVksU0FBUyxHQUFFLEdBQUU7QUFBQyxZQUFJLElBQUUsQ0FBQyxHQUFFO0FBQUUsWUFBRSxLQUFLLFFBQVEsQ0FBQztBQUFFLFlBQUk7QUFBRSxZQUFHLE1BQUksS0FBSyxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFNBQVMsd0JBQXdCO0FBQUUsWUFBRyxJQUFFLEtBQUssR0FBRTtBQUFDLGNBQUUsRUFBRSxJQUFFLEtBQUs7QUFBRyxjQUFFLENBQUM7QUFBRSxjQUFJLElBQUUsR0FBRTtBQUFFLGVBQUssSUFBRSxFQUFFLENBQUMsS0FBRyxvQkFBSSxRQUFNLFFBQVEsSUFBRSxLQUFLO0FBQUcsZUFBSSxJQUFFLEdBQUUsS0FBRyxHQUFFLElBQUksR0FBRSxLQUFLLGFBQVksS0FBSyxPQUFPLElBQUUsQ0FBQztBQUFFLGVBQUksSUFBRSxH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QTtBQUFBLE1BRUwsQ0FBQyxRQUFxQixVQUFrQjtBQUN0QztBQUVBLFlBQUksQ0FBQyxZQUFZLGVBQWUseUJBQXlCO0FBQ3ZELGdCQUFNLE1BQU07QUFBQSxRQUNkO0FBRUEsYUFBSyxZQUFZO0FBQUEsVUFDZjtBQUFBLFVBQ0EsT0FBTyxFQUFFLFFBQVEsTUFBTTtBQUFBLFFBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLE9BQU8sTUFBTTtBQUVuQixVQUFRLEtBQUssUUFBUTtBQUFBLElBQ25CO0FBQ0U7QUFDRSxtQkFBVztBQUNYLGFBQUssWUFBWSxFQUFFLHFDQUF3QixDQUFDO0FBQUEsTUFDOUM7QUFDQTtBQUFBLElBRUY7QUFDRTtBQUNFLG1CQUFXO0FBQ1gsYUFBSyxZQUFZLEVBQUUsdUNBQXlCLENBQUM7QUFBQSxNQUMvQztBQUNBO0FBQUEsSUFFRjtBQUNFLGVBQVMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0FBQy9CLHNCQUFjLEtBQUssS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUN6QyxDQUFDO0FBQUEsRUFDTDtBQUNGO0FBRUEsSUFBTSxXQUFXLENBQ2Ysa0JBQ3NDO0FBQ3RDLFFBQU0sRUFBRSxTQUFTLElBQUksY0FBYztBQUVuQyxTQUFPLDhDQUEyQixZQUFZO0FBQzVDLGFBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxhQUFhLEtBQUs7QUFDN0MsVUFBSSxDQUFDLFlBQVksZUFBZSx5QkFBeUI7QUFDdkQsY0FBTSxNQUFNO0FBQUEsTUFDZDtBQUVBLFlBQU0sTUFBTSxJQUFJLFlBQVk7QUFDMUIsY0FBTSxjQUFjLFVBQVUsQ0FBQztBQUUvQjtBQUVBLFlBQUksWUFBWSxpQkFBaUIseUJBQXlCO0FBQ3hELGdCQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUVEO0FBRUEsU0FBTyxjQUFjLFVBQVUsQ0FBQztBQUNsQzsiLAogICJuYW1lcyI6IFsiUmVmbGVjdEFwcGx5IiwgIlJlZmxlY3RPd25LZXlzIiwgIk51bWJlcklzTmFOIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAiZXJyIiwgIm9uY2UiLCAic2pjbCIsICJhIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAiRXZlbnRFbWl0dGVyIiwgInYiLCAib2siLCAiZXJyIiwgIlJlc3VsdCIsICJmcm9tVGhyb3dhYmxlIiwgIm9rIiwgImVyciIsICJzZWxmIiwgIm9iaiIsICJEZWNvZGUiLCAib2JqIiwgInNqY2wiLCAiZGVjcnlwdCIsICJEZWNvZGUiLCAiZGVjcnlwdCIsICJkZWNyeXB0IiwgIl9xdWV1ZSIsICJFdmVudEVtaXR0ZXIiXQp9Cg== diff --git a/themes/default/public/js/minified/worker/encrypt.js b/themes/default/public/js/minified/worker/encrypt.js deleted file mode 100644 index 84d82e0..0000000 --- a/themes/default/public/js/minified/worker/encrypt.js +++ /dev/null @@ -1,1930 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); - -// node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a; - }, invalid: function(a) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a; - }, bug: function(a) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a; - }, notReady: function(a) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a; - } } }; - sjcl2.cipher.aes = function(a) { - this.w[0][0][0] || this.C(); - var b, c, d, e, f = this.w[0][4], g = this.w[1]; - b = a.length; - var h = 1; - if (4 !== b && 6 !== b && 8 !== b) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d = a.slice(0), e = []]; - for (a = b; a < 4 * b + 28; a++) { - c = d[a - 1]; - if (0 === a % b || 8 === b && 4 === a % b) c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255], 0 === a % b && (c = c << 8 ^ c >>> 24 ^ h << 24, h = h << 1 ^ 283 * (h >> 7)); - d[a] = d[a - b] ^ c; - } - for (b = 0; a; b++, a--) c = d[b & 3 ? a : a - 4], e[b] = 4 >= a || 4 > b ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a) { - return aa(this, a, 0); - }, decrypt: function(a) { - return aa(this, a, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a = this.w[0], b = this.w[1], c = a[4], d = b[4], e, f, g, h = [], k = [], n, l, m, p; - for (e = 0; 256 > e; e++) k[(h[e] = e << 1 ^ 283 * (e >> 7)) ^ e] = e; - for (f = g = 0; !c[f]; f ^= n || 1, g = k[g] || 1) for (m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, m = m >> 8 ^ m & 255 ^ 99, c[f] = m, d[m] = f, l = h[e = h[n = h[f]]], p = 16843009 * l ^ 65537 * e ^ 257 * n ^ 16843008 * f, l = 257 * h[m] ^ 16843008 * m, e = 0; 4 > e; e++) a[e][f] = l = l << 24 ^ l >>> 8, b[e][m] = p = p << 24 ^ p >>> 8; - for (e = 0; 5 > e; e++) a[e] = a[e].slice(0), b[e] = b[e].slice(0); - } }; - function aa(a, b, c) { - if (4 !== b.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d = a.b[c], e = b[0] ^ d[0], f = b[c ? 3 : 1] ^ d[1], g = b[2] ^ d[2]; - b = b[c ? 1 : 3] ^ d[3]; - var h, k, n, l = d.length / 4 - 2, m, p = 4, z = [0, 0, 0, 0]; - h = a.w[c]; - a = h[0]; - var A = h[1], C = h[2], B = h[3], D = h[4]; - for (m = 0; m < l; m++) h = a[e >>> 24] ^ A[f >> 16 & 255] ^ C[g >> 8 & 255] ^ B[b & 255] ^ d[p], k = a[f >>> 24] ^ A[g >> 16 & 255] ^ C[b >> 8 & 255] ^ B[e & 255] ^ d[p + 1], n = a[g >>> 24] ^ A[b >> 16 & 255] ^ C[e >> 8 & 255] ^ B[f & 255] ^ d[p + 2], b = a[b >>> 24] ^ A[e >> 16 & 255] ^ C[f >> 8 & 255] ^ B[g & 255] ^ d[p + 3], p += 4, e = h, f = k, g = n; - for (m = 0; 4 > m; m++) z[c ? 3 & -m : m] = D[e >>> 24] << 24 ^ D[f >> 16 & 255] << 16 ^ D[g >> 8 & 255] << 8 ^ D[b & 255] ^ d[p++], h = e, e = f, f = g, g = b, b = h; - return z; - } - sjcl2.bitArray = { bitSlice: function(a, b, c) { - a = sjcl2.bitArray.Y(a.slice(b / 32), 32 - (b & 31)).slice(1); - return void 0 === c ? a : sjcl2.bitArray.clamp(a, c - b); - }, extract: function(a, b, c) { - var d = Math.floor(-b - c & 31); - return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; - }, concat: function(a, b) { - if (0 === a.length || 0 === b.length) return a.concat(b); - var c = a[a.length - 1], d = sjcl2.bitArray.getPartial(c); - return 32 === d ? a.concat(b) : sjcl2.bitArray.Y(b, d, c | 0, a.slice(0, a.length - 1)); - }, bitLength: function(a) { - var b = a.length; - return 0 === b ? 0 : 32 * (b - 1) + sjcl2.bitArray.getPartial(a[b - 1]); - }, clamp: function(a, b) { - if (32 * a.length < b) return a; - a = a.slice(0, Math.ceil(b / 32)); - var c = a.length; - b = b & 31; - 0 < c && b && (a[c - 1] = sjcl2.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); - return a; - }, partial: function(a, b, c) { - return 32 === a ? b : (c ? b | 0 : b << 32 - a) + 1099511627776 * a; - }, getPartial: function(a) { - return Math.round(a / 1099511627776) || 32; - }, equal: function(a, b) { - if (sjcl2.bitArray.bitLength(a) !== sjcl2.bitArray.bitLength(b)) return false; - var c = 0, d; - for (d = 0; d < a.length; d++) c |= a[d] ^ b[d]; - return 0 === c; - }, Y: function(a, b, c, d) { - var e; - e = 0; - for (void 0 === d && (d = []); 32 <= b; b -= 32) d.push(c), c = 0; - if (0 === b) return d.concat(a); - for (e = 0; e < a.length; e++) d.push(c | a[e] >>> b), c = a[e] << 32 - b; - e = a.length ? a[a.length - 1] : 0; - a = sjcl2.bitArray.getPartial(e); - d.push(sjcl2.bitArray.partial(b + a & 31, 32 < b + a ? c : d.pop(), 1)); - return d; - }, P: function(a, b) { - return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; - }, byteswapM: function(a) { - var b, c; - for (b = 0; b < a.length; ++b) c = a[b], a[b] = c >>> 24 | c >>> 8 & 65280 | (c & 65280) << 8 | c << 24; - return a; - } }; - sjcl2.codec.utf8String = { fromBits: function(a) { - var b = "", c = sjcl2.bitArray.bitLength(a), d, e; - for (d = 0; d < c / 8; d++) 0 === (d & 3) && (e = a[d / 4]), b += String.fromCharCode(e >>> 8 >>> 8 >>> 8), e <<= 8; - return decodeURIComponent(escape(b)); - }, toBits: function(a) { - a = unescape(encodeURIComponent(a)); - var b = [], c, d = 0; - for (c = 0; c < a.length; c++) d = d << 8 | a.charCodeAt(c), 3 === (c & 3) && (b.push(d), d = 0); - c & 3 && b.push(sjcl2.bitArray.partial(8 * (c & 3), d)); - return b; - } }; - sjcl2.codec.hex = { fromBits: function(a) { - var b = "", c; - for (c = 0; c < a.length; c++) b += ((a[c] | 0) + 263882790666240).toString(16).substr(4); - return b.substr(0, sjcl2.bitArray.bitLength(a) / 4); - }, toBits: function(a) { - var b, c = [], d; - a = a.replace(/\s|0x/g, ""); - d = a.length; - a = a + "00000000"; - for (b = 0; b < a.length; b += 8) c.push(parseInt(a.substr(b, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c, 4 * d); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a, b, c) { - var d = "", e = 0, f = sjcl2.codec.base64.S, g = 0, h = sjcl2.bitArray.bitLength(a); - c && (f = f.substr(0, 62) + "-_"); - for (c = 0; 6 * d.length < h; ) d += f.charAt((g ^ a[c] >>> e) >>> 26), 6 > e ? (g = a[c] << 6 - e, e += 26, c++) : (g <<= 6, e -= 6); - for (; d.length & 3 && !b; ) d += "="; - return d; - }, toBits: function(a, b) { - a = a.replace(/\s|=/g, ""); - var c = [], d, e = 0, f = sjcl2.codec.base64.S, g = 0, h; - b && (f = f.substr(0, 62) + "-_"); - for (d = 0; d < a.length; d++) { - h = f.indexOf(a.charAt(d)); - if (0 > h) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e ? (e -= 26, c.push(g ^ h >>> e), g = h << 32 - e) : (e += 6, g ^= h << 32 - e); - } - e & 56 && c.push(sjcl2.bitArray.partial(e & 56, g, 1)); - return c; - } }; - sjcl2.codec.base64url = { fromBits: function(a) { - return sjcl2.codec.base64.fromBits(a, 1, 1); - }, toBits: function(a) { - return sjcl2.codec.base64.toBits(a, 1); - } }; - sjcl2.hash.sha256 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a) { - return new sjcl2.hash.sha256().update(a).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(d.subarray( - 16 * e, - 16 * (e + 1) - )), e += 1; - c.splice(0, 16 * e); - } else for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(c.splice(0, 16)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 2; a & 15; a++) b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 16)); - this.reset(); - return c; - }, o: [], b: [], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - for (var b = 0, c = 2, d, e; 64 > b; c++) { - e = true; - for (d = 2; d * d <= c; d++) if (0 === c % d) { - e = false; - break; - } - e && (8 > b && (this.o[b] = a(Math.pow(c, 0.5))), this.b[b] = a(Math.pow(c, 1 / 3)), b++); - } - }, l: function(a) { - var b, c, d, e = this.g, f = this.b, g = e[0], h = e[1], k = e[2], n = e[3], l = e[4], m = e[5], p = e[6], z = e[7]; - for (b = 0; 64 > b; b++) 16 > b ? c = a[b] : (c = a[b + 1 & 15], d = a[b + 14 & 15], c = a[b & 15] = (c >>> 7 ^ c >>> 18 ^ c >>> 3 ^ c << 25 ^ c << 14) + (d >>> 17 ^ d >>> 19 ^ d >>> 10 ^ d << 15 ^ d << 13) + a[b & 15] + a[b + 9 & 15] | 0), c = c + z + (l >>> 6 ^ l >>> 11 ^ l >>> 25 ^ l << 26 ^ l << 21 ^ l << 7) + (p ^ l & (m ^ p)) + f[b], z = p, p = m, m = l, l = n + c | 0, n = k, k = h, h = g, g = c + (h & k ^ n & (h ^ k)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; - e[0] = e[0] + g | 0; - e[1] = e[1] + h | 0; - e[2] = e[2] + k | 0; - e[3] = e[3] + n | 0; - e[4] = e[4] + l | 0; - e[5] = e[5] + m | 0; - e[6] = e[6] + p | 0; - e[7] = e[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a) { - return new sjcl2.hash.sha512().update(a).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(d.subarray(32 * e, 32 * (e + 1))), e += 1; - c.splice(0, 32 * e); - } else for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(c.splice(0, 32)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 4; a & 31; a++) b.push(0); - b.push(0); - b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 32)); - this.reset(); - return c; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - function b(a2) { - return 1099511627776 * (a2 - Math.floor(a2)) & 255; - } - for (var c = 0, d = 2, e, f; 80 > c; d++) { - f = true; - for (e = 2; e * e <= d; e++) if (0 === d % e) { - f = false; - break; - } - f && (8 > c && (this.o[2 * c] = a(Math.pow(d, 0.5)), this.o[2 * c + 1] = b(Math.pow(d, 0.5)) << 24 | this.ia[c]), this.b[2 * c] = a(Math.pow(d, 1 / 3)), this.b[2 * c + 1] = b(Math.pow(d, 1 / 3)) << 24 | this.ka[c], c++); - } - }, l: function(a) { - var b, c, d = this.g, e = this.b, f = d[0], g = d[1], h = d[2], k = d[3], n = d[4], l = d[5], m = d[6], p = d[7], z = d[8], A = d[9], C = d[10], B = d[11], D = d[12], P = d[13], ea = d[14], Q = d[15], t; - if ("undefined" !== typeof Uint32Array) { - t = Array(160); - for (var r = 0; 32 > r; r++) t[r] = a[r]; - } else t = a; - var r = f, u = g, G = h, E = k, H = n, F = l, V = m, I = p, w = z, v = A, R = C, J = B, S = D, K = P, W = ea, L = Q; - for (a = 0; 80 > a; a++) { - if (16 > a) b = t[2 * a], c = t[2 * a + 1]; - else { - c = t[2 * (a - 15)]; - var q = t[2 * (a - 15) + 1]; - b = (q << 31 | c >>> 1) ^ (q << 24 | c >>> 8) ^ c >>> 7; - var x = (c << 31 | q >>> 1) ^ (c << 24 | q >>> 8) ^ (c << 25 | q >>> 7); - c = t[2 * (a - 2)]; - var y = t[2 * (a - 2) + 1], q = (y << 13 | c >>> 19) ^ (c << 3 | y >>> 29) ^ c >>> 6, y = (c << 13 | y >>> 19) ^ (y << 3 | c >>> 29) ^ (c << 26 | y >>> 6), X = t[2 * (a - 7)], Y = t[2 * (a - 16)], M = t[2 * (a - 16) + 1]; - c = x + t[2 * (a - 7) + 1]; - b = b + X + (c >>> 0 < x >>> 0 ? 1 : 0); - c += y; - b += q + (c >>> 0 < y >>> 0 ? 1 : 0); - c += M; - b += Y + (c >>> 0 < M >>> 0 ? 1 : 0); - } - t[2 * a] = b |= 0; - t[2 * a + 1] = c |= 0; - var X = w & R ^ ~w & S, fa = v & J ^ ~v & K, y = r & G ^ r & H ^ G & H, ja = u & E ^ u & F ^ E & F, Y = (u << 4 | r >>> 28) ^ (r << 30 | u >>> 2) ^ (r << 25 | u >>> 7), M = (r << 4 | u >>> 28) ^ (u << 30 | r >>> 2) ^ (u << 25 | r >>> 7), ka = e[2 * a], ga = e[2 * a + 1], q = L + ((w << 18 | v >>> 14) ^ (w << 14 | v >>> 18) ^ (v << 23 | w >>> 9)), x = W + ((v << 18 | w >>> 14) ^ (v << 14 | w >>> 18) ^ (w << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x = x + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x = x + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c | 0, x = x + (b + (q >>> 0 < c >>> 0 ? 1 : 0)); - c = M + ja; - b = Y + y + (c >>> 0 < M >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w; - J = v; - v = I + q | 0; - w = V + x + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E; - G = r; - E = u; - u = q + c | 0; - r = x + b + (u >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g = d[1] = g + u | 0; - d[0] = f + r + (g >>> 0 < u >>> 0 ? 1 : 0) | 0; - k = d[3] = k + E | 0; - d[2] = h + G + (k >>> 0 < E >>> 0 ? 1 : 0) | 0; - l = d[5] = l + F | 0; - d[4] = n + H + (l >>> 0 < F >>> 0 ? 1 : 0) | 0; - p = d[7] = p + I | 0; - d[6] = m + V + (p >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d[9] = A + v | 0; - d[8] = z + w + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B = d[11] = B + J | 0; - d[10] = C + R + (B >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d[13] = P + K | 0; - d[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d[15] = Q + L | 0; - d[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a) { - sjcl2.mode.ccm.F.push(a); - }, unListenProgress: function(a) { - a = sjcl2.mode.ccm.F.indexOf(a); - -1 < a && sjcl2.mode.ccm.F.splice(a, 1); - }, da: function(a) { - var b = sjcl2.mode.ccm.F.slice(), c; - for (c = 0; c < b.length; c += 1) b[c](a); - }, encrypt: function(a, b, c, d, e) { - var f, g = b.slice(0), h = sjcl2.bitArray, k = h.bitLength(c) / 8, n = h.bitLength(g) / 8; - e = e || 64; - d = d || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f = 2; 4 > f && n >>> 8 * f; f++) ; - f < 15 - k && (f = 15 - k); - c = h.clamp( - c, - 8 * (15 - f) - ); - b = sjcl2.mode.ccm.U(a, b, c, d, e, f); - g = sjcl2.mode.ccm.V(a, g, c, b, e, f); - return h.concat(g.data, g.tag); - }, decrypt: function(a, b, c, d, e) { - e = e || 64; - d = d || []; - var f = sjcl2.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), k = f.clamp(b, h - e), n = f.bitSlice(b, h - e), h = (h - e) / 8; - if (7 > g) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b = 2; 4 > b && h >>> 8 * b; b++) ; - b < 15 - g && (b = 15 - g); - c = f.clamp(c, 8 * (15 - b)); - k = sjcl2.mode.ccm.V(a, k, c, n, e, b); - a = sjcl2.mode.ccm.U(a, k.data, c, d, e, b); - if (!f.equal(k.tag, a)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a, b, c, d, e, f) { - var g = [], h = sjcl2.bitArray, k = h.P; - d = [h.partial(8, (b.length ? 64 : 0) | d - 2 << 2 | f - 1)]; - d = h.concat(d, c); - d[3] |= e; - d = a.encrypt(d); - if (b.length) for (c = h.bitLength(b) / 8, 65279 >= c ? g = [h.partial(16, c)] : 4294967295 >= c && (g = h.concat([h.partial(16, 65534)], [c])), g = h.concat(g, b), b = 0; b < g.length; b += 4) d = a.encrypt(k(d, g.slice(b, b + 4).concat([0, 0, 0]))); - return d; - }, U: function(a, b, c, d, e, f) { - var g = sjcl2.bitArray, h = g.P; - e /= 8; - if (e % 2 || 4 > e || 16 < e) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d.length || 4294967295 < b.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c = sjcl2.mode.ccm.ma(a, d, c, e, g.bitLength(b) / 8, f); - for (d = 0; d < b.length; d += 4) c = a.encrypt(h(c, b.slice(d, d + 4).concat([0, 0, 0]))); - return g.clamp(c, 8 * e); - }, V: function(a, b, c, d, e, f) { - var g, h = sjcl2.bitArray; - g = h.P; - var k = b.length, n = h.bitLength(b), l = k / 50, m = l; - c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); - d = h.bitSlice(g(d, a.encrypt(c)), 0, e); - if (!k) return { tag: d, data: [] }; - for (g = 0; g < k; g += 4) g > l && (sjcl2.mode.ccm.da(g / k), l += m), c[3]++, e = a.encrypt(c), b[g] ^= e[0], b[g + 1] ^= e[1], b[g + 2] ^= e[2], b[g + 3] ^= e[3]; - return { tag: d, data: h.clamp(b, n) }; - } }; - sjcl2.misc.hmac = function(a, b) { - this.W = b = b || sjcl2.hash.sha256; - var c = [[], []], d, e = b.prototype.blockSize / 32; - this.B = [new b(), new b()]; - a.length > e && (a = b.hash(a)); - for (d = 0; d < e; d++) c[0][d] = a[d] ^ 909522486, c[1][d] = a[d] ^ 1549556828; - this.B[0].update(c[0]); - this.B[1].update(c[1]); - this.O = new b(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a); - return this.digest(a); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a) { - this.Z = true; - this.O.update(a); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a = this.O.finalize(), a = new this.W(this.B[1]).update(a).finalize(); - this.reset(); - return a; - }; - sjcl2.misc.pbkdf2 = function(a, b, c, d, e) { - c = c || 1e4; - if (0 > d || 0 > c) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - e = e || sjcl2.misc.hmac; - a = new e(a); - var f, g, h, k, n = [], l = sjcl2.bitArray; - for (k = 1; 32 * n.length < (d || 1); k++) { - e = f = a.encrypt(l.concat(b, [k])); - for (g = 1; g < c; g++) for (f = a.encrypt(f), h = 0; h < f.length; h++) e[h] ^= f[h]; - n = n.concat(e); - } - d && (n = l.clamp(n, d)); - return n; - }; - sjcl2.prng = function(a) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a, b) { - var c = [], d; - d = this.isReady(b); - var e; - if (d === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d & this.I) { - d = !(d & this.H); - e = []; - var f = 0, g; - this.X = e[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g = 0; 16 > g; g++) e.push(4294967296 * Math.random() | 0); - for (g = 0; g < this.h.length && (e = e.concat(this.h[g].finalize()), f += this.s[g], this.s[g] = 0, d || !(this.N & 1 << g)); g++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f; - f > this.u && (this.u = f); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e)); - this.K = new sjcl2.cipher.aes(this.b); - for (d = 0; 4 > d && (this.m[d] = this.m[d] + 1 | 0, !this.m[d]); d++) ; - } - for (d = 0; d < a; d += 4) 0 === (d + 1) % this.aa && ba(this), e = N(this), c.push(e[0], e[1], e[2], e[3]); - ba(this); - return c.slice(0, a); - }, - setDefaultParanoia: function(a, b) { - if (0 === a && "Setting paranoia=0 will ruin your security; use it only for testing" !== b) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a; - }, - addEntropy: function(a, b, c) { - c = c || "user"; - var d, e, f = (/* @__PURE__ */ new Date()).valueOf(), g = this.G[c], h = this.isReady(), k = 0; - d = this.T[c]; - void 0 === d && (d = this.T[c] = this.fa++); - void 0 === g && (g = this.G[c] = 0); - this.G[c] = (this.G[c] + 1) % this.h.length; - switch (typeof a) { - case "number": - void 0 === b && (b = 1); - this.h[g].update([d, this.M++, 1, b, f, 1, a | 0]); - break; - case "object": - c = Object.prototype.toString.call(a); - if ("[object Uint32Array]" === c) { - e = []; - for (c = 0; c < a.length; c++) e.push(a[c]); - a = e; - } else for ("[object Array]" !== c && (k = 1), c = 0; c < a.length && !k; c++) "number" !== typeof a[c] && (k = 1); - if (!k) { - if (void 0 === b) for (c = b = 0; c < a.length; c++) for (e = a[c]; 0 < e; ) b++, e = e >>> 1; - this.h[g].update([d, this.M++, 2, b, f, a.length].concat(a)); - } - break; - case "string": - void 0 === b && (b = a.length); - this.h[g].update([d, this.M++, 3, b, f, a.length]); - this.h[g].update(a); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g] += b; - this.i += b; - h === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a) { - a = this.R[void 0 !== a ? a : this.L]; - return this.u && this.u >= a ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a ? this.I | this.A : this.A; - }, - getProgress: function(a) { - a = this.R[a ? a : this.L]; - return this.u >= a ? 1 : this.i > a ? 1 : this.i / a; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a, b) { - this.J[a][this.ea++] = b; - }, - removeEventListener: function(a, b) { - var c, d, e = this.J[a], f = []; - for (d in e) e.hasOwnProperty(d) && e[d] === b && f.push(d); - for (c = 0; c < f.length; c++) d = f[c], delete e[d]; - }, - ja: function() { - T(this, 1); - }, - na: function(a) { - var b, c; - try { - b = a.x || a.clientX || a.offsetX || 0, c = a.y || a.clientY || a.offsetY || 0; - } catch (d) { - c = b = 0; - } - 0 != b && 0 != c && this.addEntropy([b, c], 2, "mouse"); - T(this, 0); - }, - pa: function(a) { - a = a.touches[0] || a.changedTouches[0]; - this.addEntropy([a.pageX || a.clientX, a.pageY || a.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a) { - a = a.accelerationIncludingGravity.x || a.accelerationIncludingGravity.y || a.accelerationIncludingGravity.z; - if (window.orientation) { - var b = window.orientation; - "number" === typeof b && this.addEntropy(b, 1, "accelerometer"); - } - a && this.addEntropy(a, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a, b) { - var c, d = sjcl2.random.J[a], e = []; - for (c in d) d.hasOwnProperty(c) && e.push(d[c]); - for (c = 0; c < e.length; c++) e[c](b); - } - function T(a, b) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a.addEntropy(window.performance.now(), b, "loadtime") : a.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b, "loadtime"); - } - function ba(a) { - a.b = N(a).concat(N(a)); - a.K = new sjcl2.cipher.aes(a.b); - } - function N(a) { - for (var b = 0; 4 > b && (a.m[b] = a.m[b] + 1 | 0, !a.m[b]); b++) ; - return a.K.encrypt(a.m); - } - function O(a, b) { - return function() { - b.apply(a, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require("crypto"); - } catch (a) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json, f = e.j({ iv: sjcl2.random.randomWords(4, 0) }, e.defaults), g; - e.j(f, c); - c = f.adata; - "string" === typeof f.salt && (f.salt = sjcl2.codec.base64.toBits(f.salt)); - "string" === typeof f.iv && (f.iv = sjcl2.codec.base64.toBits(f.iv)); - if (!sjcl2.mode[f.mode] || !sjcl2.cipher[f.cipher] || "string" === typeof a && 100 >= f.iter || 64 !== f.ts && 96 !== f.ts && 128 !== f.ts || 128 !== f.ks && 192 !== f.ks && 256 !== f.ks || 2 > f.iv.length || 4 < f.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, f), a = g.key.slice(0, f.ks / 32), f.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.publicKey && (g = a.kem(), f.kemtag = g.tag, a = g.key.slice(0, f.ks / 32)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - "string" === typeof c && (f.adata = c = sjcl2.codec.utf8String.toBits(c)); - g = new sjcl2.cipher[f.cipher](a); - e.j(d, f); - d.key = a; - f.ct = "ccm" === f.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g, b, f.iv, c, f.ts) : sjcl2.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); - return f; - }, encrypt: function(a, b, c, d) { - var e = sjcl2.json, f = e.ha.apply(e, arguments); - return e.encode(f); - }, ga: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json; - b = e.j(e.j(e.j({}, e.defaults), b), c, true); - var f, g; - f = b.adata; - "string" === typeof b.salt && (b.salt = sjcl2.codec.base64.toBits(b.salt)); - "string" === typeof b.iv && (b.iv = sjcl2.codec.base64.toBits(b.iv)); - if (!sjcl2.mode[b.mode] || !sjcl2.cipher[b.cipher] || "string" === typeof a && 100 >= b.iter || 64 !== b.ts && 96 !== b.ts && 128 !== b.ts || 128 !== b.ks && 192 !== b.ks && 256 !== b.ks || !b.iv || 2 > b.iv.length || 4 < b.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, b), a = g.key.slice(0, b.ks / 32), b.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.secretKey && (a = a.unkem(sjcl2.codec.base64.toBits(b.kemtag)).slice(0, b.ks / 32)); - "string" === typeof f && (f = sjcl2.codec.utf8String.toBits(f)); - g = new sjcl2.cipher[b.cipher](a); - f = "ccm" === b.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g, b.ct, b.iv, b.tag, f, b.ts) : sjcl2.mode[b.mode].decrypt(g, b.ct, b.iv, f, b.ts); - e.j(d, b); - d.key = a; - return 1 === c.raw ? f : sjcl2.codec.utf8String.fromBits(f); - }, decrypt: function(a, b, c, d) { - var e = sjcl2.json; - return e.ga(a, e.decode(b), c, d); - }, encode: function(a) { - var b, c = "{", d = ""; - for (b in a) if (a.hasOwnProperty(b)) { - if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c += d + '"' + b + '":'; - d = ","; - switch (typeof a[b]) { - case "number": - case "boolean": - c += a[b]; - break; - case "string": - c += '"' + escape(a[b]) + '"'; - break; - case "object": - c += '"' + sjcl2.codec.base64.fromBits(a[b], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c + "}"; - }, decode: function(a) { - a = a.replace(/\s/g, ""); - if (!a.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a = a.replace(/^\{|\}$/g, "").split(/,/); - var b = {}, c, d; - for (c = 0; c < a.length; c++) { - if (!(d = a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d[3] ? b[d[2]] = parseInt(d[3], 10) : null != d[4] ? b[d[2]] = d[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d[4]) : unescape(d[4]) : null != d[5] && (b[d[2]] = "true" === d[5]); - } - return b; - }, j: function(a, b, c) { - void 0 === a && (a = {}); - if (void 0 === b) return a; - for (var d in b) if (b.hasOwnProperty(d)) { - if (c && void 0 !== a[d] && a[d] !== b[d]) throw new sjcl2.exception.invalid("required parameter overridden"); - a[d] = b[d]; - } - return a; - }, ra: function(a, b) { - var c = {}, d; - for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); - return c; - }, qa: function(a, b) { - var c = {}, d; - for (d = 0; d < b.length; d++) void 0 !== a[b[d]] && (c[b[d]] = a[b[d]]); - return c; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a, b) { - var c = sjcl2.misc.oa, d; - b = b || {}; - d = b.iter || 1e3; - c = c[a] = c[a] || {}; - d = c[d] = c[d] || { firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c = void 0 === b.salt ? d.firstSalt : b.salt; - d[c] = d[c] || sjcl2.misc.pbkdf2(a, c, b.iter); - return { key: d[c].slice(0), salt: c.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter2() { - EventEmitter2.init.call(this); - } - module.exports = EventEmitter2; - module.exports.once = once; - EventEmitter2.EventEmitter = EventEmitter2; - EventEmitter2.prototype._events = void 0; - EventEmitter2.prototype._eventsCount = 0; - EventEmitter2.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter2, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter2.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter2.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter2.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter2.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; - EventEmitter2.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter2.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; - EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter2.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter2.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter2.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter2.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter2.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/encoding.js -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i = 0; i < len; i += 3) { - res += this._charset[view[i] >> 2] + this._charset[(view[i] & 3) << 4 | view[i + 1] >> 4] + this._charset[(view[i + 1] & 15) << 2 | view[i + 2] >> 6] + this._charset[view[i + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i = 0, j = 0; - while (i < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i++] = enc1 << 2 | enc2 >> 4; - view[i++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/standard.js -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -function Encode(ab) { - return obj.Encode(ab); -} - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/url.js -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Decode(str) { - return obj2.Decode(str); -} - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/api/crypto/sjcl.ts -var import_lufi_sjcl = __toESM(require_sjcl()); - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/crypto/crypto-error.ts -var CryptoError = class extends BaseError { -}; - -// src/error/crypto/encryption-error.ts -var EncryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to encrypt the provided data"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// src/api/crypto/sjcl.ts -var encrypt = (key, value) => { - try { - const encrypted = import_lufi_sjcl.default.encrypt(key, Encode(value)); - return okAsync({ - algo: 0 /* Sjcl */, - data: new TextEncoder().encode(encrypted).buffer, - iv: JSON.parse(encrypted).iv - }); - } catch (error) { - return errAsync( - new EncryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; - -// src/api/crypto/web.ts -var encrypt2 = (key, value) => { - return importKey(key).andThen((importedKey) => { - const iv = crypto.getRandomValues(new Uint8Array(12)); - return ResultAsync.fromPromise( - crypto.subtle.encrypt( - { - name: "AES-GCM", - iv - }, - importedKey, - value - ), - (error) => new EncryptionError(void 0, { - cause: ensureError(error) - }) - ).andThen((encrypted) => { - return okAsync({ - algo: 1 /* WebCrypto */, - data: encrypted, - iv - }); - }); - }); -}; -var importKey = (key) => { - return ResultAsync.fromPromise( - crypto.subtle.importKey( - "raw", - Decode(key), - { name: "AES-GCM" }, - false, - [ - "encrypt", - "decrypt" - ] - ), - (error) => new CryptoError("Unable to import cryptography key", { - cause: ensureError(error) - }) - ); -}; - -// src/api/crypto.ts -var encrypt3 = (key, value, algo) => algo === 0 /* Sjcl */ ? encrypt(key, value) : encrypt2(key, value); - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// src/error/worker/worker-error.ts -var WorkerError = class extends BaseError { -}; - -// src/error/worker/worker-undefined-parameter-error.ts -var WorkerUndefinedParameterError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "Parameter must be defined"); - } -}; - -// src/error/worker/worker-upload-already-failed-error.ts -var WorkerUploadAlreadyFailedError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "File upload already failed"); - } -}; - -// src/worker/encrypt.ts -var isInitiated = false; -self.onmessage = (event) => { - if (!isInitiated) { - init(); - isInitiated = true; - } - const { lufiFile, chunk, algo } = event.data.args; - if (chunk && typeof algo !== "undefined") { - if (lufiFile.uploadStatus !== 2 /* FAILED */) { - encrypt3(lufiFile.keys.client, chunk.buffer, algo).map((encryptedData) => { - self.postMessage({ encryptedData, chunkIndex: chunk.index }, [ - typeof encryptedData.data === "string" ? new TextEncoder().encode(encryptedData.data).buffer : encryptedData.data - ]); - }).mapErr((error) => { - self.postMessage({ error }); - }); - } else { - self.postMessage({ - error: new WorkerUploadAlreadyFailedError("File upload already failed") - }); - } - } else { - if (!chunk) { - self.postMessage({ - error: new WorkerUndefinedParameterError( - "chunk buffer must be defined" - ) - }); - } - if (typeof algo === "undefined") { - self.postMessage({ - error: new WorkerUndefinedParameterError("algo must be defined") - }); - } - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2x1Zmktc2pjbEAxLjAuOC9ub2RlX21vZHVsZXMvbHVmaS1zamNsL3NqY2wuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vYXJyYXlidWZmZXItZW5jb2RpbmdAMS4xLjAvbm9kZV9tb2R1bGVzL2FycmF5YnVmZmVyLWVuY29kaW5nL3NyYy9iYXNlNjQvZW5jb2RpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2FycmF5YnVmZmVyLWVuY29kaW5nQDEuMS4wL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci1lbmNvZGluZy9zcmMvYmFzZTY0L3N0YW5kYXJkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9hcnJheWJ1ZmZlci1lbmNvZGluZ0AxLjEuMC9ub2RlX21vZHVsZXMvYXJyYXlidWZmZXItZW5jb2Rpbmcvc3JjL2Jhc2U2NC91cmwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL25ldmVydGhyb3dAOC4xLjEvbm9kZV9tb2R1bGVzL25ldmVydGhyb3cvZGlzdC9pbmRleC5lcy5qcyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by9zamNsLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50cyIsICIuLi8uLi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2FwaS9jcnlwdG8vd2ViLnRzIiwgIi4uLy4uL3NyYy9hcGkvY3J5cHRvLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvc2hhcmVkLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93b3JrZXIvd29ya2VyLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93b3JrZXIvd29ya2VyLXVuZGVmaW5lZC1wYXJhbWV0ZXItZXJyb3IudHMiLCAiLi4vLi4vc3JjL2Vycm9yL3dvcmtlci93b3JrZXItdXBsb2FkLWFscmVhZHktZmFpbGVkLWVycm9yLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvZW5jcnlwdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiXCJ1c2Ugc3RyaWN0XCI7dmFyIHNqY2w9e2NpcGhlcjp7fSxoYXNoOnt9LGtleWV4Y2hhbmdlOnt9LG1vZGU6e30sbWlzYzp7fSxjb2RlYzp7fSxleGNlcHRpb246e2NvcnJ1cHQ6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiQ09SUlVQVDogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0saW52YWxpZDpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJJTlZBTElEOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfSxidWc6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiQlVHOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfSxub3RSZWFkeTpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJOT1QgUkVBRFk6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9fX07XG5zamNsLmNpcGhlci5hZXM9ZnVuY3Rpb24oYSl7dGhpcy53WzBdWzBdWzBdfHx0aGlzLkMoKTt2YXIgYixjLGQsZSxmPXRoaXMud1swXVs0XSxnPXRoaXMud1sxXTtiPWEubGVuZ3RoO3ZhciBoPTE7aWYoNCE9PWImJjYhPT1iJiY4IT09Yil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGtleSBzaXplXCIpO3RoaXMuYj1bZD1hLnNsaWNlKDApLGU9W11dO2ZvcihhPWI7YTw0KmIrMjg7YSsrKXtjPWRbYS0xXTtpZigwPT09YSVifHw4PT09YiYmND09PWElYiljPWZbYz4+PjI0XTw8MjReZltjPj4xNiYyNTVdPDwxNl5mW2M+PjgmMjU1XTw8OF5mW2MmMjU1XSwwPT09YSViJiYoYz1jPDw4XmM+Pj4yNF5oPDwyNCxoPWg8PDFeMjgzKihoPj43KSk7ZFthXT1kW2EtYl1eY31mb3IoYj0wO2E7YisrLGEtLSljPWRbYiYzP2E6YS00XSxlW2JdPTQ+PWF8fDQ+Yj9jOmdbMF1bZltjPj4+MjRdXV5nWzFdW2ZbYz4+MTYmMjU1XV1eZ1syXVtmW2M+PjgmMjU1XV1eZ1szXVtmW2MmXG4yNTVdXX07XG5zamNsLmNpcGhlci5hZXMucHJvdG90eXBlPXtlbmNyeXB0OmZ1bmN0aW9uKGEpe3JldHVybiBhYSh0aGlzLGEsMCl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhKHRoaXMsYSwxKX0sdzpbW1tdLFtdLFtdLFtdLFtdXSxbW10sW10sW10sW10sW11dXSxDOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy53WzBdLGI9dGhpcy53WzFdLGM9YVs0XSxkPWJbNF0sZSxmLGcsaD1bXSxrPVtdLG4sbCxtLHA7Zm9yKGU9MDsweDEwMD5lO2UrKylrWyhoW2VdPWU8PDFeMjgzKihlPj43KSleZV09ZTtmb3IoZj1nPTA7IWNbZl07Zl49bnx8MSxnPWtbZ118fDEpZm9yKG09Z15nPDwxXmc8PDJeZzw8M15nPDw0LG09bT4+OF5tJjI1NV45OSxjW2ZdPW0sZFttXT1mLGw9aFtlPWhbbj1oW2ZdXV0scD0weDEwMTAxMDEqbF4weDEwMDAxKmVeMHgxMDEqbl4weDEwMTAxMDAqZixsPTB4MTAxKmhbbV1eMHgxMDEwMTAwKm0sZT0wOzQ+ZTtlKyspYVtlXVtmXT1sPWw8PDI0Xmw+Pj44LGJbZV1bbV09cD1wPDwyNF5wPj4+ODtmb3IoZT1cbjA7NT5lO2UrKylhW2VdPWFbZV0uc2xpY2UoMCksYltlXT1iW2VdLnNsaWNlKDApfX07XG5mdW5jdGlvbiBhYShhLGIsYyl7aWYoNCE9PWIubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52YWxpZCBhZXMgYmxvY2sgc2l6ZVwiKTt2YXIgZD1hLmJbY10sZT1iWzBdXmRbMF0sZj1iW2M/MzoxXV5kWzFdLGc9YlsyXV5kWzJdO2I9YltjPzE6M11eZFszXTt2YXIgaCxrLG4sbD1kLmxlbmd0aC80LTIsbSxwPTQsej1bMCwwLDAsMF07aD1hLndbY107YT1oWzBdO3ZhciBBPWhbMV0sQz1oWzJdLEI9aFszXSxEPWhbNF07Zm9yKG09MDttPGw7bSsrKWg9YVtlPj4+MjRdXkFbZj4+MTYmMjU1XV5DW2c+PjgmMjU1XV5CW2ImMjU1XV5kW3BdLGs9YVtmPj4+MjRdXkFbZz4+MTYmMjU1XV5DW2I+PjgmMjU1XV5CW2UmMjU1XV5kW3ArMV0sbj1hW2c+Pj4yNF1eQVtiPj4xNiYyNTVdXkNbZT4+OCYyNTVdXkJbZiYyNTVdXmRbcCsyXSxiPWFbYj4+PjI0XV5BW2U+PjE2JjI1NV1eQ1tmPj44JjI1NV1eQltnJjI1NV1eZFtwKzNdLHArPTQsZT1oLGY9ayxnPW47Zm9yKG09XG4wOzQ+bTttKyspeltjPzMmLW06bV09RFtlPj4+MjRdPDwyNF5EW2Y+PjE2JjI1NV08PDE2XkRbZz4+OCYyNTVdPDw4XkRbYiYyNTVdXmRbcCsrXSxoPWUsZT1mLGY9ZyxnPWIsYj1oO3JldHVybiB6fVxuc2pjbC5iaXRBcnJheT17Yml0U2xpY2U6ZnVuY3Rpb24oYSxiLGMpe2E9c2pjbC5iaXRBcnJheS5ZKGEuc2xpY2UoYi8zMiksMzItKGImMzEpKS5zbGljZSgxKTtyZXR1cm4gdm9pZCAwPT09Yz9hOnNqY2wuYml0QXJyYXkuY2xhbXAoYSxjLWIpfSxleHRyYWN0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1NYXRoLmZsb29yKC1iLWMmMzEpO3JldHVybigoYitjLTFeYikmLTMyP2FbYi8zMnwwXTw8MzItZF5hW2IvMzIrMXwwXT4+PmQ6YVtiLzMyfDBdPj4+ZCkmKDE8PGMpLTF9LGNvbmNhdDpmdW5jdGlvbihhLGIpe2lmKDA9PT1hLmxlbmd0aHx8MD09PWIubGVuZ3RoKXJldHVybiBhLmNvbmNhdChiKTt2YXIgYz1hW2EubGVuZ3RoLTFdLGQ9c2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGMpO3JldHVybiAzMj09PWQ/YS5jb25jYXQoYik6c2pjbC5iaXRBcnJheS5ZKGIsZCxjfDAsYS5zbGljZSgwLGEubGVuZ3RoLTEpKX0sYml0TGVuZ3RoOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO3JldHVybiAwPT09XG5iPzA6MzIqKGItMSkrc2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGFbYi0xXSl9LGNsYW1wOmZ1bmN0aW9uKGEsYil7aWYoMzIqYS5sZW5ndGg8YilyZXR1cm4gYTthPWEuc2xpY2UoMCxNYXRoLmNlaWwoYi8zMikpO3ZhciBjPWEubGVuZ3RoO2I9YiYzMTswPGMmJmImJihhW2MtMV09c2pjbC5iaXRBcnJheS5wYXJ0aWFsKGIsYVtjLTFdJjIxNDc0ODM2NDg+PmItMSwxKSk7cmV0dXJuIGF9LHBhcnRpYWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAzMj09PWE/YjooYz9ifDA6Yjw8MzItYSkrMHgxMDAwMDAwMDAwMCphfSxnZXRQYXJ0aWFsOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKGEvMHgxMDAwMDAwMDAwMCl8fDMyfSxlcXVhbDpmdW5jdGlvbihhLGIpe2lmKHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpIT09c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYikpcmV0dXJuITE7dmFyIGM9MCxkO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspY3w9YVtkXV5iW2RdO3JldHVybiAwPT09XG5jfSxZOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlO2U9MDtmb3Iodm9pZCAwPT09ZCYmKGQ9W10pOzMyPD1iO2ItPTMyKWQucHVzaChjKSxjPTA7aWYoMD09PWIpcmV0dXJuIGQuY29uY2F0KGEpO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspZC5wdXNoKGN8YVtlXT4+PmIpLGM9YVtlXTw8MzItYjtlPWEubGVuZ3RoP2FbYS5sZW5ndGgtMV06MDthPXNqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChlKTtkLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKGIrYSYzMSwzMjxiK2E/YzpkLnBvcCgpLDEpKTtyZXR1cm4gZH0sUDpmdW5jdGlvbihhLGIpe3JldHVyblthWzBdXmJbMF0sYVsxXV5iWzFdLGFbMl1eYlsyXSxhWzNdXmJbM11dfSxieXRlc3dhcE06ZnVuY3Rpb24oYSl7dmFyIGIsYztmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWM9YVtiXSxhW2JdPWM+Pj4yNHxjPj4+OCYweGZmMDB8KGMmMHhmZjAwKTw8OHxjPDwyNDtyZXR1cm4gYX19O1xuc2pjbC5jb2RlYy51dGY4U3RyaW5nPXtmcm9tQml0czpmdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSksZCxlO2ZvcihkPTA7ZDxjLzg7ZCsrKTA9PT0oZCYzKSYmKGU9YVtkLzRdKSxiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGU+Pj44Pj4+OD4+PjgpLGU8PD04O3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGIpKX0sdG9CaXRzOmZ1bmN0aW9uKGEpe2E9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGEpKTt2YXIgYj1bXSxjLGQ9MDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZDw8OHxhLmNoYXJDb2RlQXQoYyksMz09PShjJjMpJiYoYi5wdXNoKGQpLGQ9MCk7YyYzJiZiLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDgqKGMmMyksZCkpO3JldHVybiBifX07XG5zamNsLmNvZGVjLmhleD17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7dmFyIGI9XCJcIixjO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYis9KChhW2NdfDApKzB4ZjAwMDAwMDAwMDAwKS50b1N0cmluZygxNikuc3Vic3RyKDQpO3JldHVybiBiLnN1YnN0cigwLHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpLzQpfSx0b0JpdHM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkO2E9YS5yZXBsYWNlKC9cXHN8MHgvZyxcIlwiKTtkPWEubGVuZ3RoO2E9YStcIjAwMDAwMDAwXCI7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrPTgpYy5wdXNoKHBhcnNlSW50KGEuc3Vic3RyKGIsOCksMTYpXjApO3JldHVybiBzamNsLmJpdEFycmF5LmNsYW1wKGMsNCpkKX19O1xuc2pjbC5jb2RlYy5iYXNlNjQ9e1M6XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsZnJvbUJpdHM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVwiXCIsZT0wLGY9c2pjbC5jb2RlYy5iYXNlNjQuUyxnPTAsaD1zamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtjJiYoZj1mLnN1YnN0cigwLDYyKStcIi1fXCIpO2ZvcihjPTA7NipkLmxlbmd0aDxoOylkKz1mLmNoYXJBdCgoZ15hW2NdPj4+ZSk+Pj4yNiksNj5lPyhnPWFbY108PDYtZSxlKz0yNixjKyspOihnPDw9NixlLT02KTtmb3IoO2QubGVuZ3RoJjMmJiFiOylkKz1cIj1cIjtyZXR1cm4gZH0sdG9CaXRzOmZ1bmN0aW9uKGEsYil7YT1hLnJlcGxhY2UoL1xcc3w9L2csXCJcIik7dmFyIGM9W10sZCxlPTAsZj1zamNsLmNvZGVjLmJhc2U2NC5TLGc9MCxoO2ImJihmPWYuc3Vic3RyKDAsNjIpK1wiLV9cIik7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKyl7aD1mLmluZGV4T2YoYS5jaGFyQXQoZCkpO1xuaWYoMD5oKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwidGhpcyBpc24ndCBiYXNlNjQhXCIpOzI2PGU/KGUtPTI2LGMucHVzaChnXmg+Pj5lKSxnPWg8PDMyLWUpOihlKz02LGdePWg8PDMyLWUpfWUmNTYmJmMucHVzaChzamNsLmJpdEFycmF5LnBhcnRpYWwoZSY1NixnLDEpKTtyZXR1cm4gY319O3NqY2wuY29kZWMuYmFzZTY0dXJsPXtmcm9tQml0czpmdW5jdGlvbihhKXtyZXR1cm4gc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoYSwxLDEpfSx0b0JpdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhhLDEpfX07c2pjbC5oYXNoLnNoYTI1Nj1mdW5jdGlvbihhKXt0aGlzLmJbMF18fHRoaXMuQygpO2E/KHRoaXMuZz1hLmcuc2xpY2UoMCksdGhpcy5mPWEuZi5zbGljZSgwKSx0aGlzLmM9YS5jKTp0aGlzLnJlc2V0KCl9O3NqY2wuaGFzaC5zaGEyNTYuaGFzaD1mdW5jdGlvbihhKXtyZXR1cm4obmV3IHNqY2wuaGFzaC5zaGEyNTYpLnVwZGF0ZShhKS5maW5hbGl6ZSgpfTtcbnNqY2wuaGFzaC5zaGEyNTYucHJvdG90eXBlPXtibG9ja1NpemU6NTEyLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuby5zbGljZSgwKTt0aGlzLmY9W107dGhpcy5jPTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO3ZhciBiLGM9dGhpcy5mPXNqY2wuYml0QXJyYXkuY29uY2F0KHRoaXMuZixhKTtiPXRoaXMuYzthPXRoaXMuYz1iK3NqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpO2lmKDB4MWZmZmZmZmZmZmZmZmY8YSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe3ZhciBkPW5ldyBVaW50MzJBcnJheShjKSxlPTA7Zm9yKGI9NTEyK2ItKDUxMitiJjB4MWZmKTtiPD1hO2IrPTUxMil0aGlzLmwoZC5zdWJhcnJheSgxNiplLFxuMTYqKGUrMSkpKSxlKz0xO2Muc3BsaWNlKDAsMTYqZSl9ZWxzZSBmb3IoYj01MTIrYi0oNTEyK2ImMHgxZmYpO2I8PWE7Yis9NTEyKXRoaXMubChjLnNwbGljZSgwLDE2KSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLmYsYz10aGlzLmcsYj1zamNsLmJpdEFycmF5LmNvbmNhdChiLFtzamNsLmJpdEFycmF5LnBhcnRpYWwoMSwxKV0pO2ZvcihhPWIubGVuZ3RoKzI7YSYxNTthKyspYi5wdXNoKDApO2IucHVzaChNYXRoLmZsb29yKHRoaXMuYy8weDEwMDAwMDAwMCkpO2ZvcihiLnB1c2godGhpcy5jfDApO2IubGVuZ3RoOyl0aGlzLmwoYi5zcGxpY2UoMCwxNikpO3RoaXMucmVzZXQoKTtyZXR1cm4gY30sbzpbXSxiOltdLEM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiAweDEwMDAwMDAwMCooYS1NYXRoLmZsb29yKGEpKXwwfWZvcih2YXIgYj0wLGM9MixkLGU7NjQ+YjtjKyspe2U9ITA7Zm9yKGQ9MjtkKmQ8PWM7ZCsrKWlmKDA9PT1jJWQpe2U9XG4hMTticmVha31lJiYoOD5iJiYodGhpcy5vW2JdPWEoTWF0aC5wb3coYywuNSkpKSx0aGlzLmJbYl09YShNYXRoLnBvdyhjLDEvMykpLGIrKyl9fSxsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXMuZyxmPXRoaXMuYixnPWVbMF0saD1lWzFdLGs9ZVsyXSxuPWVbM10sbD1lWzRdLG09ZVs1XSxwPWVbNl0sej1lWzddO2ZvcihiPTA7NjQ+YjtiKyspMTY+Yj9jPWFbYl06KGM9YVtiKzEmMTVdLGQ9YVtiKzE0JjE1XSxjPWFbYiYxNV09KGM+Pj43XmM+Pj4xOF5jPj4+M15jPDwyNV5jPDwxNCkrKGQ+Pj4xN15kPj4+MTleZD4+PjEwXmQ8PDE1XmQ8PDEzKSthW2ImMTVdK2FbYis5JjE1XXwwKSxjPWMreisobD4+PjZebD4+PjExXmw+Pj4yNV5sPDwyNl5sPDwyMV5sPDw3KSsocF5sJihtXnApKStmW2JdLHo9cCxwPW0sbT1sLGw9bitjfDAsbj1rLGs9aCxoPWcsZz1jKyhoJmtebiYoaF5rKSkrKGg+Pj4yXmg+Pj4xM15oPj4+MjJeaDw8MzBeaDw8MTleaDw8MTApfDA7ZVswXT1lWzBdK2d8XG4wO2VbMV09ZVsxXStofDA7ZVsyXT1lWzJdK2t8MDtlWzNdPWVbM10rbnwwO2VbNF09ZVs0XStsfDA7ZVs1XT1lWzVdK218MDtlWzZdPWVbNl0rcHwwO2VbN109ZVs3XSt6fDB9fTtzamNsLmhhc2guc2hhNTEyPWZ1bmN0aW9uKGEpe3RoaXMuYlswXXx8dGhpcy5DKCk7YT8odGhpcy5nPWEuZy5zbGljZSgwKSx0aGlzLmY9YS5mLnNsaWNlKDApLHRoaXMuYz1hLmMpOnRoaXMucmVzZXQoKX07c2pjbC5oYXNoLnNoYTUxMi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybihuZXcgc2pjbC5oYXNoLnNoYTUxMikudXBkYXRlKGEpLmZpbmFsaXplKCl9O1xuc2pjbC5oYXNoLnNoYTUxMi5wcm90b3R5cGU9e2Jsb2NrU2l6ZToxMDI0LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuby5zbGljZSgwKTt0aGlzLmY9W107dGhpcy5jPTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO3ZhciBiLGM9dGhpcy5mPXNqY2wuYml0QXJyYXkuY29uY2F0KHRoaXMuZixhKTtiPXRoaXMuYzthPXRoaXMuYz1iK3NqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpO2lmKDB4MWZmZmZmZmZmZmZmZmY8YSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe3ZhciBkPW5ldyBVaW50MzJBcnJheShjKSxlPTA7Zm9yKGI9MTAyNCtiLSgxMDI0K2ImMTAyMyk7Yjw9YTtiKz0xMDI0KXRoaXMubChkLnN1YmFycmF5KDMyKlxuZSwzMiooZSsxKSkpLGUrPTE7Yy5zcGxpY2UoMCwzMiplKX1lbHNlIGZvcihiPTEwMjQrYi0oMTAyNCtiJjEwMjMpO2I8PWE7Yis9MTAyNCl0aGlzLmwoYy5zcGxpY2UoMCwzMikpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5mLGM9dGhpcy5nLGI9c2pjbC5iaXRBcnJheS5jb25jYXQoYixbc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDEsMSldKTtmb3IoYT1iLmxlbmd0aCs0O2EmMzE7YSsrKWIucHVzaCgwKTtiLnB1c2goMCk7Yi5wdXNoKDApO2IucHVzaChNYXRoLmZsb29yKHRoaXMuYy8weDEwMDAwMDAwMCkpO2ZvcihiLnB1c2godGhpcy5jfDApO2IubGVuZ3RoOyl0aGlzLmwoYi5zcGxpY2UoMCwzMikpO3RoaXMucmVzZXQoKTtyZXR1cm4gY30sbzpbXSxpYTpbMTIzNzIyMzIsMTMyODEwODMsOTc2Mjg1OSwxOTE0NjA5LDE1MTA2NzY5LDQwOTA5MTEsNDMwODMzMSw4MjY2MTA1XSxiOltdLGthOlsyNjY2MDE4LDE1Njg5MTY1LDUwNjE0MjMsOTAzNDY4NCxcbjQ3NjQ5ODQsMzgwOTUzLDE2NTg3NzksNzE3NjQ3MiwxOTcxODYsNzM2ODYzOCwxNDk4NzkxNiwxNjc1Nzk4Niw4MDk2MTExLDE0ODAzNjksMTMwNDYzMjUsNjg5MTE1NiwxNTgxMzMzMCw1MTg3MDQzLDkyMjk3NDksMTEzMTIyMjksMjgxODY3NywxMDkzNzQ3NSw0MzI0MzA4LDExMzU1NDEsNjc0MTkzMSwxMTgwOTI5NiwxNjQ1ODA0NywxNTY2NjkxNiwxMTA0Njg1MCw2OTgxNDksMjI5OTk5LDk0NTc3NiwxMzc3NDg0NCwyNTQxODYyLDEyODU2MDQ1LDk4MTA5MTEsMTE0OTQzNjYsNzg0NDUyMCwxNTU3NjgwNiw4NTMzMzA3LDE1Nzk1MDQ0LDQzMzc2NjUsMTYyOTE3MjksNTU1MzcxMiwxNTY4NDEyMCw2NjYyNDE2LDc0MTM4MDIsMTIzMDg5MjAsMTM4MTYwMDgsNDMwMzY5OSw5MzY2NDI1LDEwMTc2NjgwLDEzMTk1ODc1LDQyOTUzNzEsNjU0NjI5MSwxMTcxMjY3NSwxNTcwODkyNCwxNTE5NDU2LDE1NzcyNTMwLDY1Njg0MjgsNjQ5NTc4NCw4NTY4Mjk3LDEzMDA3MTI1LDc0OTIzOTUsMjUxNTM1NixcbjEyNjMyNTgzLDE0NzQwMjU0LDcyNjI1ODQsMTUzNTkzMCwxMzE0NjI3OCwxNjMyMTk2NiwxODUzMjExLDI5NDI3NiwxMzA1MTAyNywxMzIyMTU2NCwxMDUxOTgwLDQwODAzMTAsNjY1MTQzNCwxNDA4ODk0MCw0Njc1NjA3XSxDOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gMHgxMDAwMDAwMDAqKGEtTWF0aC5mbG9vcihhKSl8MH1mdW5jdGlvbiBiKGEpe3JldHVybiAweDEwMDAwMDAwMDAwKihhLU1hdGguZmxvb3IoYSkpJjI1NX1mb3IodmFyIGM9MCxkPTIsZSxmOzgwPmM7ZCsrKXtmPSEwO2ZvcihlPTI7ZSplPD1kO2UrKylpZigwPT09ZCVlKXtmPSExO2JyZWFrfWYmJig4PmMmJih0aGlzLm9bMipjXT1hKE1hdGgucG93KGQsLjUpKSx0aGlzLm9bMipjKzFdPWIoTWF0aC5wb3coZCwuNSkpPDwyNHx0aGlzLmlhW2NdKSx0aGlzLmJbMipjXT1hKE1hdGgucG93KGQsMS8zKSksdGhpcy5iWzIqYysxXT1iKE1hdGgucG93KGQsMS8zKSk8PDI0fHRoaXMua2FbY10sYysrKX19LGw6ZnVuY3Rpb24oYSl7dmFyIGIsXG5jLGQ9dGhpcy5nLGU9dGhpcy5iLGY9ZFswXSxnPWRbMV0saD1kWzJdLGs9ZFszXSxuPWRbNF0sbD1kWzVdLG09ZFs2XSxwPWRbN10sej1kWzhdLEE9ZFs5XSxDPWRbMTBdLEI9ZFsxMV0sRD1kWzEyXSxQPWRbMTNdLGVhPWRbMTRdLFE9ZFsxNV0sdDtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt0PUFycmF5KDE2MCk7Zm9yKHZhciByPTA7MzI+cjtyKyspdFtyXT1hW3JdfWVsc2UgdD1hO3ZhciByPWYsdT1nLEc9aCxFPWssSD1uLEY9bCxWPW0sST1wLHc9eix2PUEsUj1DLEo9QixTPUQsSz1QLFc9ZWEsTD1RO2ZvcihhPTA7ODA+YTthKyspe2lmKDE2PmEpYj10WzIqYV0sYz10WzIqYSsxXTtlbHNle2M9dFsyKihhLTE1KV07dmFyIHE9dFsyKihhLTE1KSsxXTtiPShxPDwzMXxjPj4+MSleKHE8PDI0fGM+Pj44KV5jPj4+Nzt2YXIgeD0oYzw8MzF8cT4+PjEpXihjPDwyNHxxPj4+OCleKGM8PDI1fHE+Pj43KTtjPXRbMiooYS0yKV07dmFyIHk9dFsyKihhLTIpKzFdLFxucT0oeTw8MTN8Yz4+PjE5KV4oYzw8M3x5Pj4+MjkpXmM+Pj42LHk9KGM8PDEzfHk+Pj4xOSleKHk8PDN8Yz4+PjI5KV4oYzw8MjZ8eT4+PjYpLFg9dFsyKihhLTcpXSxZPXRbMiooYS0xNildLE09dFsyKihhLTE2KSsxXTtjPXgrdFsyKihhLTcpKzFdO2I9YitYKyhjPj4+MDx4Pj4+MD8xOjApO2MrPXk7Yis9cSsoYz4+PjA8eT4+PjA/MTowKTtjKz1NO2IrPVkrKGM+Pj4wPE0+Pj4wPzE6MCl9dFsyKmFdPWJ8PTA7dFsyKmErMV09Y3w9MDt2YXIgWD13JlJefncmUyxmYT12JkpefnYmSyx5PXImR15yJkheRyZILGphPXUmRV51JkZeRSZGLFk9KHU8PDR8cj4+PjI4KV4ocjw8MzB8dT4+PjIpXihyPDwyNXx1Pj4+NyksTT0ocjw8NHx1Pj4+MjgpXih1PDwzMHxyPj4+MileKHU8PDI1fHI+Pj43KSxrYT1lWzIqYV0sZ2E9ZVsyKmErMV0scT1MKygodzw8MTh8dj4+PjE0KV4odzw8MTR8dj4+PjE4KV4odjw8MjN8dz4+PjkpKSx4PVcrKCh2PDwxOHx3Pj4+MTQpXih2PDwxNHx3Pj4+MTgpXih3PDxcbjIzfHY+Pj45KSkrKHE+Pj4wPEw+Pj4wPzE6MCkscT1xK2ZhLHg9eCsoWCsocT4+PjA8ZmE+Pj4wPzE6MCkpLHE9cStnYSx4PXgrKGthKyhxPj4+MDxnYT4+PjA/MTowKSkscT1xK2N8MCx4PXgrKGIrKHE+Pj4wPGM+Pj4wPzE6MCkpO2M9TStqYTtiPVkreSsoYz4+PjA8TT4+PjA/MTowKTtXPVM7TD1LO1M9UjtLPUo7Uj13O0o9djt2PUkrcXwwO3c9Vit4Kyh2Pj4+MDxJPj4+MD8xOjApfDA7Vj1IO0k9RjtIPUc7Rj1FO0c9cjtFPXU7dT1xK2N8MDtyPXgrYisodT4+PjA8cT4+PjA/MTowKXwwfWc9ZFsxXT1nK3V8MDtkWzBdPWYrcisoZz4+PjA8dT4+PjA/MTowKXwwO2s9ZFszXT1rK0V8MDtkWzJdPWgrRysoaz4+PjA8RT4+PjA/MTowKXwwO2w9ZFs1XT1sK0Z8MDtkWzRdPW4rSCsobD4+PjA8Rj4+PjA/MTowKXwwO3A9ZFs3XT1wK0l8MDtkWzZdPW0rVisocD4+PjA8ST4+PjA/MTowKXwwO0E9ZFs5XT1BK3Z8MDtkWzhdPXordysoQT4+PjA8dj4+PjA/MTowKXwwO0I9ZFsxMV09QitKfFxuMDtkWzEwXT1DK1IrKEI+Pj4wPEo+Pj4wPzE6MCl8MDtQPWRbMTNdPVArS3wwO2RbMTJdPUQrUysoUD4+PjA8Sz4+PjA/MTowKXwwO1E9ZFsxNV09UStMfDA7ZFsxNF09ZWErVysoUT4+PjA8TD4+PjA/MTowKXwwfX07XG5zamNsLm1vZGUuY2NtPXtuYW1lOlwiY2NtXCIsRjpbXSxsaXN0ZW5Qcm9ncmVzczpmdW5jdGlvbihhKXtzamNsLm1vZGUuY2NtLkYucHVzaChhKX0sdW5MaXN0ZW5Qcm9ncmVzczpmdW5jdGlvbihhKXthPXNqY2wubW9kZS5jY20uRi5pbmRleE9mKGEpOy0xPGEmJnNqY2wubW9kZS5jY20uRi5zcGxpY2UoYSwxKX0sZGE6ZnVuY3Rpb24oYSl7dmFyIGI9c2pjbC5tb2RlLmNjbS5GLnNsaWNlKCksYztmb3IoYz0wO2M8Yi5sZW5ndGg7Yys9MSliW2NdKGEpfSxlbmNyeXB0OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZz1iLnNsaWNlKDApLGg9c2pjbC5iaXRBcnJheSxrPWguYml0TGVuZ3RoKGMpLzgsbj1oLmJpdExlbmd0aChnKS84O2U9ZXx8NjQ7ZD1kfHxbXTtpZig3PmspdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGl2IG11c3QgYmUgYXQgbGVhc3QgNyBieXRlc1wiKTtmb3IoZj0yOzQ+ZiYmbj4+PjgqZjtmKyspO2Y8MTUtayYmKGY9MTUtayk7Yz1oLmNsYW1wKGMsXG44KigxNS1mKSk7Yj1zamNsLm1vZGUuY2NtLlUoYSxiLGMsZCxlLGYpO2c9c2pjbC5tb2RlLmNjbS5WKGEsZyxjLGIsZSxmKTtyZXR1cm4gaC5jb25jYXQoZy5kYXRhLGcudGFnKX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkLGUpe2U9ZXx8NjQ7ZD1kfHxbXTt2YXIgZj1zamNsLmJpdEFycmF5LGc9Zi5iaXRMZW5ndGgoYykvOCxoPWYuYml0TGVuZ3RoKGIpLGs9Zi5jbGFtcChiLGgtZSksbj1mLmJpdFNsaWNlKGIsaC1lKSxoPShoLWUpLzg7aWYoNz5nKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpdiBtdXN0IGJlIGF0IGxlYXN0IDcgYnl0ZXNcIik7Zm9yKGI9Mjs0PmImJmg+Pj44KmI7YisrKTtiPDE1LWcmJihiPTE1LWcpO2M9Zi5jbGFtcChjLDgqKDE1LWIpKTtrPXNqY2wubW9kZS5jY20uVihhLGssYyxuLGUsYik7YT1zamNsLm1vZGUuY2NtLlUoYSxrLmRhdGEsYyxkLGUsYik7aWYoIWYuZXF1YWwoay50YWcsYSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmNvcnJ1cHQoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpO1xucmV0dXJuIGsuZGF0YX0sbWE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPVtdLGg9c2pjbC5iaXRBcnJheSxrPWguUDtkPVtoLnBhcnRpYWwoOCwoYi5sZW5ndGg/NjQ6MCl8ZC0yPDwyfGYtMSldO2Q9aC5jb25jYXQoZCxjKTtkWzNdfD1lO2Q9YS5lbmNyeXB0KGQpO2lmKGIubGVuZ3RoKWZvcihjPWguYml0TGVuZ3RoKGIpLzgsNjUyNzk+PWM/Zz1baC5wYXJ0aWFsKDE2LGMpXToweGZmZmZmZmZmPj1jJiYoZz1oLmNvbmNhdChbaC5wYXJ0aWFsKDE2LDY1NTM0KV0sW2NdKSksZz1oLmNvbmNhdChnLGIpLGI9MDtiPGcubGVuZ3RoO2IrPTQpZD1hLmVuY3J5cHQoayhkLGcuc2xpY2UoYixiKzQpLmNvbmNhdChbMCwwLDBdKSkpO3JldHVybiBkfSxVOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1zamNsLmJpdEFycmF5LGg9Zy5QO2UvPTg7aWYoZSUyfHw0PmV8fDE2PGUpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGludmFsaWQgdGFnIGxlbmd0aFwiKTtcbmlmKDB4ZmZmZmZmZmY8ZC5sZW5ndGh8fDB4ZmZmZmZmZmY8Yi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImNjbTogY2FuJ3QgZGVhbCB3aXRoIDRHaUIgb3IgbW9yZSBkYXRhXCIpO2M9c2pjbC5tb2RlLmNjbS5tYShhLGQsYyxlLGcuYml0TGVuZ3RoKGIpLzgsZik7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrPTQpYz1hLmVuY3J5cHQoaChjLGIuc2xpY2UoZCxkKzQpLmNvbmNhdChbMCwwLDBdKSkpO3JldHVybiBnLmNsYW1wKGMsOCplKX0sVjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGcsaD1zamNsLmJpdEFycmF5O2c9aC5QO3ZhciBrPWIubGVuZ3RoLG49aC5iaXRMZW5ndGgoYiksbD1rLzUwLG09bDtjPWguY29uY2F0KFtoLnBhcnRpYWwoOCxmLTEpXSxjKS5jb25jYXQoWzAsMCwwXSkuc2xpY2UoMCw0KTtkPWguYml0U2xpY2UoZyhkLGEuZW5jcnlwdChjKSksMCxlKTtpZighaylyZXR1cm57dGFnOmQsZGF0YTpbXX07Zm9yKGc9MDtnPGs7Zys9NClnPmwmJihzamNsLm1vZGUuY2NtLmRhKGcvXG5rKSxsKz1tKSxjWzNdKyssZT1hLmVuY3J5cHQoYyksYltnXV49ZVswXSxiW2crMV1ePWVbMV0sYltnKzJdXj1lWzJdLGJbZyszXV49ZVszXTtyZXR1cm57dGFnOmQsZGF0YTpoLmNsYW1wKGIsbil9fX07c2pjbC5taXNjLmhtYWM9ZnVuY3Rpb24oYSxiKXt0aGlzLlc9Yj1ifHxzamNsLmhhc2guc2hhMjU2O3ZhciBjPVtbXSxbXV0sZCxlPWIucHJvdG90eXBlLmJsb2NrU2l6ZS8zMjt0aGlzLkI9W25ldyBiLG5ldyBiXTthLmxlbmd0aD5lJiYoYT1iLmhhc2goYSkpO2ZvcihkPTA7ZDxlO2QrKyljWzBdW2RdPWFbZF1eOTA5NTIyNDg2LGNbMV1bZF09YVtkXV4xNTQ5NTU2ODI4O3RoaXMuQlswXS51cGRhdGUoY1swXSk7dGhpcy5CWzFdLnVwZGF0ZShjWzFdKTt0aGlzLk89bmV3IGIodGhpcy5CWzBdKX07XG5zamNsLm1pc2MuaG1hYy5wcm90b3R5cGUuZW5jcnlwdD1zamNsLm1pc2MuaG1hYy5wcm90b3R5cGUubWFjPWZ1bmN0aW9uKGEpe2lmKHRoaXMuWil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImVuY3J5cHQgb24gYWxyZWFkeSB1cGRhdGVkIGhtYWMgY2FsbGVkIVwiKTt0aGlzLnVwZGF0ZShhKTtyZXR1cm4gdGhpcy5kaWdlc3QoYSl9O3NqY2wubWlzYy5obWFjLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuTz1uZXcgdGhpcy5XKHRoaXMuQlswXSk7dGhpcy5aPSExfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMuWj0hMDt0aGlzLk8udXBkYXRlKGEpfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5PLmZpbmFsaXplKCksYT0obmV3IHRoaXMuVyh0aGlzLkJbMV0pKS51cGRhdGUoYSkuZmluYWxpemUoKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGF9O1xuc2pjbC5taXNjLnBia2RmMj1mdW5jdGlvbihhLGIsYyxkLGUpe2M9Y3x8MUU0O2lmKDA+ZHx8MD5jKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52YWxpZCBwYXJhbXMgdG8gcGJrZGYyXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYSYmKGE9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGIpKTtlPWV8fHNqY2wubWlzYy5obWFjO2E9bmV3IGUoYSk7dmFyIGYsZyxoLGssbj1bXSxsPXNqY2wuYml0QXJyYXk7Zm9yKGs9MTszMipuLmxlbmd0aDwoZHx8MSk7aysrKXtlPWY9YS5lbmNyeXB0KGwuY29uY2F0KGIsW2tdKSk7Zm9yKGc9MTtnPGM7ZysrKWZvcihmPWEuZW5jcnlwdChmKSxoPTA7aDxmLmxlbmd0aDtoKyspZVtoXV49ZltoXTtuPW4uY29uY2F0KGUpfWQmJihuPWwuY2xhbXAobixkKSk7cmV0dXJuIG59O1xuc2pjbC5wcm5nPWZ1bmN0aW9uKGEpe3RoaXMuaD1bbmV3IHNqY2wuaGFzaC5zaGEyNTZdO3RoaXMucz1bMF07dGhpcy5OPTA7dGhpcy5HPXt9O3RoaXMuTT0wO3RoaXMuVD17fTt0aGlzLlg9dGhpcy5pPXRoaXMudT10aGlzLmZhPTA7dGhpcy5iPVswLDAsMCwwLDAsMCwwLDBdO3RoaXMubT1bMCwwLDAsMF07dGhpcy5LPXZvaWQgMDt0aGlzLkw9YTt0aGlzLkQ9ITE7dGhpcy5KPXtwcm9ncmVzczp7fSxzZWVkZWQ6e319O3RoaXMuQT10aGlzLmVhPTA7dGhpcy5IPTE7dGhpcy5JPTI7dGhpcy5hYT0weDEwMDAwO3RoaXMuUj1bMCw0OCw2NCw5NiwxMjgsMTkyLDB4MTAwLDM4NCw1MTIsNzY4LDEwMjRdO3RoaXMuYmE9M0U0O3RoaXMuJD04MH07XG5zamNsLnBybmcucHJvdG90eXBlPXtyYW5kb21Xb3JkczpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ7ZD10aGlzLmlzUmVhZHkoYik7dmFyIGU7aWYoZD09PXRoaXMuQSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24ubm90UmVhZHkoXCJnZW5lcmF0b3IgaXNuJ3Qgc2VlZGVkXCIpO2lmKGQmdGhpcy5JKXtkPSEoZCZ0aGlzLkgpO2U9W107dmFyIGY9MCxnO3RoaXMuWD1lWzBdPShuZXcgRGF0ZSkudmFsdWVPZigpK3RoaXMuYmE7Zm9yKGc9MDsxNj5nO2crKyllLnB1c2goMHgxMDAwMDAwMDAqTWF0aC5yYW5kb20oKXwwKTtmb3IoZz0wO2c8dGhpcy5oLmxlbmd0aCYmKGU9ZS5jb25jYXQodGhpcy5oW2ddLmZpbmFsaXplKCkpLGYrPXRoaXMuc1tnXSx0aGlzLnNbZ109MCxkfHwhKHRoaXMuTiYxPDxnKSk7ZysrKTt0aGlzLk4+PTE8PHRoaXMuaC5sZW5ndGgmJih0aGlzLmgucHVzaChuZXcgc2pjbC5oYXNoLnNoYTI1NiksdGhpcy5zLnB1c2goMCkpO3RoaXMuaS09ZjtmPnRoaXMudSYmKHRoaXMudT1cbmYpO3RoaXMuTisrO3RoaXMuYj1zamNsLmhhc2guc2hhMjU2Lmhhc2godGhpcy5iLmNvbmNhdChlKSk7dGhpcy5LPW5ldyBzamNsLmNpcGhlci5hZXModGhpcy5iKTtmb3IoZD0wOzQ+ZCYmKHRoaXMubVtkXT10aGlzLm1bZF0rMXwwLCF0aGlzLm1bZF0pO2QrKyk7fWZvcihkPTA7ZDxhO2QrPTQpMD09PShkKzEpJXRoaXMuYWEmJmJhKHRoaXMpLGU9Tih0aGlzKSxjLnB1c2goZVswXSxlWzFdLGVbMl0sZVszXSk7YmEodGhpcyk7cmV0dXJuIGMuc2xpY2UoMCxhKX0sc2V0RGVmYXVsdFBhcmFub2lhOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEmJlwiU2V0dGluZyBwYXJhbm9pYT0wIHdpbGwgcnVpbiB5b3VyIHNlY3VyaXR5OyB1c2UgaXQgb25seSBmb3IgdGVzdGluZ1wiIT09Yil0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIlNldHRpbmcgcGFyYW5vaWE9MCB3aWxsIHJ1aW4geW91ciBzZWN1cml0eTsgdXNlIGl0IG9ubHkgZm9yIHRlc3RpbmdcIik7dGhpcy5MPWF9LGFkZEVudHJvcHk6ZnVuY3Rpb24oYSxcbmIsYyl7Yz1jfHxcInVzZXJcIjt2YXIgZCxlLGY9KG5ldyBEYXRlKS52YWx1ZU9mKCksZz10aGlzLkdbY10saD10aGlzLmlzUmVhZHkoKSxrPTA7ZD10aGlzLlRbY107dm9pZCAwPT09ZCYmKGQ9dGhpcy5UW2NdPXRoaXMuZmErKyk7dm9pZCAwPT09ZyYmKGc9dGhpcy5HW2NdPTApO3RoaXMuR1tjXT0odGhpcy5HW2NdKzEpJXRoaXMuaC5sZW5ndGg7c3dpdGNoKHR5cGVvZiBhKXtjYXNlIFwibnVtYmVyXCI6dm9pZCAwPT09YiYmKGI9MSk7dGhpcy5oW2ddLnVwZGF0ZShbZCx0aGlzLk0rKywxLGIsZiwxLGF8MF0pO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpjPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTtpZihcIltvYmplY3QgVWludDMyQXJyYXldXCI9PT1jKXtlPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZS5wdXNoKGFbY10pO2E9ZX1lbHNlIGZvcihcIltvYmplY3QgQXJyYXldXCIhPT1jJiYoaz0xKSxjPTA7YzxhLmxlbmd0aCYmIWs7YysrKVwibnVtYmVyXCIhPT10eXBlb2YgYVtjXSYmXG4oaz0xKTtpZighayl7aWYodm9pZCAwPT09Yilmb3IoYz1iPTA7YzxhLmxlbmd0aDtjKyspZm9yKGU9YVtjXTswPGU7KWIrKyxlPWU+Pj4xO3RoaXMuaFtnXS51cGRhdGUoW2QsdGhpcy5NKyssMixiLGYsYS5sZW5ndGhdLmNvbmNhdChhKSl9YnJlYWs7Y2FzZSBcInN0cmluZ1wiOnZvaWQgMD09PWImJihiPWEubGVuZ3RoKTt0aGlzLmhbZ10udXBkYXRlKFtkLHRoaXMuTSsrLDMsYixmLGEubGVuZ3RoXSk7dGhpcy5oW2ddLnVwZGF0ZShhKTticmVhaztkZWZhdWx0Oms9MX1pZihrKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJyYW5kb206IGFkZEVudHJvcHkgb25seSBzdXBwb3J0cyBudW1iZXIsIGFycmF5IG9mIG51bWJlcnMgb3Igc3RyaW5nXCIpO3RoaXMuc1tnXSs9Yjt0aGlzLmkrPWI7aD09PXRoaXMuQSYmKHRoaXMuaXNSZWFkeSgpIT09dGhpcy5BJiZjYShcInNlZWRlZFwiLE1hdGgubWF4KHRoaXMudSx0aGlzLmkpKSxjYShcInByb2dyZXNzXCIsdGhpcy5nZXRQcm9ncmVzcygpKSl9LFxuaXNSZWFkeTpmdW5jdGlvbihhKXthPXRoaXMuUlt2b2lkIDAhPT1hP2E6dGhpcy5MXTtyZXR1cm4gdGhpcy51JiZ0aGlzLnU+PWE/dGhpcy5zWzBdPnRoaXMuJCYmKG5ldyBEYXRlKS52YWx1ZU9mKCk+dGhpcy5YP3RoaXMuSXx0aGlzLkg6dGhpcy5IOnRoaXMuaT49YT90aGlzLkl8dGhpcy5BOnRoaXMuQX0sZ2V0UHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT10aGlzLlJbYT9hOnRoaXMuTF07cmV0dXJuIHRoaXMudT49YT8xOnRoaXMuaT5hPzE6dGhpcy5pL2F9LHN0YXJ0Q29sbGVjdG9yczpmdW5jdGlvbigpe2lmKCF0aGlzLkQpe3RoaXMuYT17bG9hZFRpbWVDb2xsZWN0b3I6Tyh0aGlzLHRoaXMubGEpLG1vdXNlQ29sbGVjdG9yOk8odGhpcyx0aGlzLm5hKSxrZXlib2FyZENvbGxlY3RvcjpPKHRoaXMsdGhpcy5qYSksYWNjZWxlcm9tZXRlckNvbGxlY3RvcjpPKHRoaXMsdGhpcy5jYSksdG91Y2hDb2xsZWN0b3I6Tyh0aGlzLHRoaXMucGEpfTtpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixcbnRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLmEubW91c2VDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZGV2aWNlbW90aW9uXCIsdGhpcy5hLmFjY2VsZXJvbWV0ZXJDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5hLnRvdWNoQ29sbGVjdG9yLCExKTtlbHNlIGlmKGRvY3VtZW50LmF0dGFjaEV2ZW50KWRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25sb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yKSxkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yKSxkb2N1bWVudC5hdHRhY2hFdmVudChcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yKTtlbHNlIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJjYW4ndCBhdHRhY2ggZXZlbnRcIik7XG50aGlzLkQ9ITB9fSxzdG9wQ29sbGVjdG9yczpmdW5jdGlvbigpe3RoaXMuRCYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyPyh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIix0aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRldmljZW1vdGlvblwiLHRoaXMuYS5hY2NlbGVyb21ldGVyQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuYS50b3VjaENvbGxlY3RvciwhMSkpOmRvY3VtZW50LmRldGFjaEV2ZW50JiYoZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJvbmxvYWRcIix0aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IpLGRvY3VtZW50LmRldGFjaEV2ZW50KFwib25tb3VzZW1vdmVcIixcbnRoaXMuYS5tb3VzZUNvbGxlY3RvciksZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3RvcikpLHRoaXMuRD0hMSl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLkpbYV1bdGhpcy5lYSsrXT1ifSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPXRoaXMuSlthXSxmPVtdO2ZvcihkIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShkKSYmZVtkXT09PWImJmYucHVzaChkKTtmb3IoYz0wO2M8Zi5sZW5ndGg7YysrKWQ9ZltjXSxkZWxldGUgZVtkXX0samE6ZnVuY3Rpb24oKXtUKHRoaXMsMSl9LG5hOmZ1bmN0aW9uKGEpe3ZhciBiLGM7dHJ5e2I9YS54fHxhLmNsaWVudFh8fGEub2Zmc2V0WHx8MCxjPWEueXx8YS5jbGllbnRZfHxhLm9mZnNldFl8fDB9Y2F0Y2goZCl7Yz1iPTB9MCE9YiYmMCE9YyYmdGhpcy5hZGRFbnRyb3B5KFtiLGNdLDIsXCJtb3VzZVwiKTtUKHRoaXMsMCl9LHBhOmZ1bmN0aW9uKGEpe2E9XG5hLnRvdWNoZXNbMF18fGEuY2hhbmdlZFRvdWNoZXNbMF07dGhpcy5hZGRFbnRyb3B5KFthLnBhZ2VYfHxhLmNsaWVudFgsYS5wYWdlWXx8YS5jbGllbnRZXSwxLFwidG91Y2hcIik7VCh0aGlzLDApfSxsYTpmdW5jdGlvbigpe1QodGhpcywyKX0sY2E6ZnVuY3Rpb24oYSl7YT1hLmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkueHx8YS5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lnl8fGEuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS56O2lmKHdpbmRvdy5vcmllbnRhdGlvbil7dmFyIGI9d2luZG93Lm9yaWVudGF0aW9uO1wibnVtYmVyXCI9PT10eXBlb2YgYiYmdGhpcy5hZGRFbnRyb3B5KGIsMSxcImFjY2VsZXJvbWV0ZXJcIil9YSYmdGhpcy5hZGRFbnRyb3B5KGEsMixcImFjY2VsZXJvbWV0ZXJcIik7VCh0aGlzLDApfX07XG5mdW5jdGlvbiBjYShhLGIpe3ZhciBjLGQ9c2pjbC5yYW5kb20uSlthXSxlPVtdO2ZvcihjIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShjKSYmZS5wdXNoKGRbY10pO2ZvcihjPTA7YzxlLmxlbmd0aDtjKyspZVtjXShiKX1mdW5jdGlvbiBUKGEsYil7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5wZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3c/YS5hZGRFbnRyb3B5KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSxiLFwibG9hZHRpbWVcIik6YS5hZGRFbnRyb3B5KChuZXcgRGF0ZSkudmFsdWVPZigpLGIsXCJsb2FkdGltZVwiKX1mdW5jdGlvbiBiYShhKXthLmI9TihhKS5jb25jYXQoTihhKSk7YS5LPW5ldyBzamNsLmNpcGhlci5hZXMoYS5iKX1mdW5jdGlvbiBOKGEpe2Zvcih2YXIgYj0wOzQ+YiYmKGEubVtiXT1hLm1bYl0rMXwwLCFhLm1bYl0pO2IrKyk7cmV0dXJuIGEuSy5lbmNyeXB0KGEubSl9XG5mdW5jdGlvbiBPKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5hcHBseShhLGFyZ3VtZW50cyl9fXNqY2wucmFuZG9tPW5ldyBzamNsLnBybmcoNik7XG5hOnRyeXt2YXIgVSxkYSxaLGhhO2lmKGhhPVwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyl7dmFyIGlhO3RyeXtpYT1yZXF1aXJlKFwiY3J5cHRvXCIpfWNhdGNoKGEpe2lhPW51bGx9aGE9ZGE9aWF9aWYoaGEmJmRhLnJhbmRvbUJ5dGVzKVU9ZGEucmFuZG9tQnl0ZXMoMTI4KSxVPW5ldyBVaW50MzJBcnJheSgobmV3IFVpbnQ4QXJyYXkoVSkpLmJ1ZmZlciksc2pjbC5yYW5kb20uYWRkRW50cm9weShVLDEwMjQsXCJjcnlwdG9bJ3JhbmRvbUJ5dGVzJ11cIik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7Wj1uZXcgVWludDMyQXJyYXkoMzIpO2lmKHdpbmRvdy5jcnlwdG8mJndpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFopO2Vsc2UgaWYod2luZG93Lm1zQ3J5cHRvJiZ3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoWik7XG5lbHNlIGJyZWFrIGE7c2pjbC5yYW5kb20uYWRkRW50cm9weShaLDEwMjQsXCJjcnlwdG9bJ2dldFJhbmRvbVZhbHVlcyddXCIpfX1jYXRjaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJihjb25zb2xlLmxvZyhcIlRoZXJlIHdhcyBhbiBlcnJvciBjb2xsZWN0aW5nIGVudHJvcHkgZnJvbSB0aGUgYnJvd3NlcjpcIiksY29uc29sZS5sb2coYSkpfVxuc2pjbC5qc29uPXtkZWZhdWx0czp7djoxLGl0ZXI6MUU0LGtzOjEyOCx0czo2NCxtb2RlOlwiY2NtXCIsYWRhdGE6XCJcIixjaXBoZXI6XCJhZXNcIn0saGE6ZnVuY3Rpb24oYSxiLGMsZCl7Yz1jfHx7fTtkPWR8fHt9O3ZhciBlPXNqY2wuanNvbixmPWUuaih7aXY6c2pjbC5yYW5kb20ucmFuZG9tV29yZHMoNCwwKX0sZS5kZWZhdWx0cyksZztlLmooZixjKTtjPWYuYWRhdGE7XCJzdHJpbmdcIj09PXR5cGVvZiBmLnNhbHQmJihmLnNhbHQ9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGYuc2FsdCkpO1wic3RyaW5nXCI9PT10eXBlb2YgZi5pdiYmKGYuaXY9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGYuaXYpKTtpZighc2pjbC5tb2RlW2YubW9kZV18fCFzamNsLmNpcGhlcltmLmNpcGhlcl18fFwic3RyaW5nXCI9PT10eXBlb2YgYSYmMTAwPj1mLml0ZXJ8fDY0IT09Zi50cyYmOTYhPT1mLnRzJiYxMjghPT1mLnRzfHwxMjghPT1mLmtzJiYxOTIhPT1mLmtzJiYweDEwMCE9PWYua3N8fDI+Zi5pdi5sZW5ndGh8fFxuNDxmLml2Lmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZW5jcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYT8oZz1zamNsLm1pc2MuY2FjaGVkUGJrZGYyKGEsZiksYT1nLmtleS5zbGljZSgwLGYua3MvMzIpLGYuc2FsdD1nLnNhbHQpOnNqY2wuZWNjJiZhIGluc3RhbmNlb2Ygc2pjbC5lY2MuZWxHYW1hbC5wdWJsaWNLZXkmJihnPWEua2VtKCksZi5rZW10YWc9Zy50YWcsYT1nLmtleS5zbGljZSgwLGYua3MvMzIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGImJihiPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYikpO1wic3RyaW5nXCI9PT10eXBlb2YgYyYmKGYuYWRhdGE9Yz1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGMpKTtnPW5ldyBzamNsLmNpcGhlcltmLmNpcGhlcl0oYSk7ZS5qKGQsZik7ZC5rZXk9YTtmLmN0PVwiY2NtXCI9PT1mLm1vZGUmJnNqY2wuYXJyYXlCdWZmZXImJnNqY2wuYXJyYXlCdWZmZXIuY2NtJiZcbmIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9zamNsLmFycmF5QnVmZmVyLmNjbS5lbmNyeXB0KGcsYixmLml2LGMsZi50cyk6c2pjbC5tb2RlW2YubW9kZV0uZW5jcnlwdChnLGIsZi5pdixjLGYudHMpO3JldHVybiBmfSxlbmNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXNqY2wuanNvbixmPWUuaGEuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBlLmVuY29kZShmKX0sZ2E6ZnVuY3Rpb24oYSxiLGMsZCl7Yz1jfHx7fTtkPWR8fHt9O3ZhciBlPXNqY2wuanNvbjtiPWUuaihlLmooZS5qKHt9LGUuZGVmYXVsdHMpLGIpLGMsITApO3ZhciBmLGc7Zj1iLmFkYXRhO1wic3RyaW5nXCI9PT10eXBlb2YgYi5zYWx0JiYoYi5zYWx0PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhiLnNhbHQpKTtcInN0cmluZ1wiPT09dHlwZW9mIGIuaXYmJihiLml2PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhiLml2KSk7aWYoIXNqY2wubW9kZVtiLm1vZGVdfHwhc2pjbC5jaXBoZXJbYi5jaXBoZXJdfHxcInN0cmluZ1wiPT09XG50eXBlb2YgYSYmMTAwPj1iLml0ZXJ8fDY0IT09Yi50cyYmOTYhPT1iLnRzJiYxMjghPT1iLnRzfHwxMjghPT1iLmtzJiYxOTIhPT1iLmtzJiYweDEwMCE9PWIua3N8fCFiLml2fHwyPmIuaXYubGVuZ3RofHw0PGIuaXYubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBkZWNyeXB0OiBpbnZhbGlkIHBhcmFtZXRlcnNcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBhPyhnPXNqY2wubWlzYy5jYWNoZWRQYmtkZjIoYSxiKSxhPWcua2V5LnNsaWNlKDAsYi5rcy8zMiksYi5zYWx0PWcuc2FsdCk6c2pjbC5lY2MmJmEgaW5zdGFuY2VvZiBzamNsLmVjYy5lbEdhbWFsLnNlY3JldEtleSYmKGE9YS51bmtlbShzamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5rZW10YWcpKS5zbGljZSgwLGIua3MvMzIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoZikpO2c9bmV3IHNqY2wuY2lwaGVyW2IuY2lwaGVyXShhKTtmPVwiY2NtXCI9PT1cbmIubW9kZSYmc2pjbC5hcnJheUJ1ZmZlciYmc2pjbC5hcnJheUJ1ZmZlci5jY20mJmIuY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9zamNsLmFycmF5QnVmZmVyLmNjbS5kZWNyeXB0KGcsYi5jdCxiLml2LGIudGFnLGYsYi50cyk6c2pjbC5tb2RlW2IubW9kZV0uZGVjcnlwdChnLGIuY3QsYi5pdixmLGIudHMpO2UuaihkLGIpO2Qua2V5PWE7cmV0dXJuIDE9PT1jLnJhdz9mOnNqY2wuY29kZWMudXRmOFN0cmluZy5mcm9tQml0cyhmKX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1zamNsLmpzb247cmV0dXJuIGUuZ2EoYSxlLmRlY29kZShiKSxjLGQpfSxlbmNvZGU6ZnVuY3Rpb24oYSl7dmFyIGIsYz1cIntcIixkPVwiXCI7Zm9yKGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXtpZighYi5tYXRjaCgvXlthLXowLTldKyQvaSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGVuY29kZTogaW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpO2MrPWQrJ1wiJytcbmIrJ1wiOic7ZD1cIixcIjtzd2l0Y2godHlwZW9mIGFbYl0pe2Nhc2UgXCJudW1iZXJcIjpjYXNlIFwiYm9vbGVhblwiOmMrPWFbYl07YnJlYWs7Y2FzZSBcInN0cmluZ1wiOmMrPSdcIicrZXNjYXBlKGFbYl0pKydcIic7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOmMrPSdcIicrc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoYVtiXSwwKSsnXCInO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImpzb24gZW5jb2RlOiB1bnN1cHBvcnRlZCB0eXBlXCIpO319cmV0dXJuIGMrXCJ9XCJ9LGRlY29kZTpmdW5jdGlvbihhKXthPWEucmVwbGFjZSgvXFxzL2csXCJcIik7aWYoIWEubWF0Y2goL15cXHsuKlxcfSQvKSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjb2RlOiB0aGlzIGlzbid0IGpzb24hXCIpO2E9YS5yZXBsYWNlKC9eXFx7fFxcfSQvZyxcIlwiKS5zcGxpdCgvLC8pO3ZhciBiPXt9LGMsZDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXtpZighKGQ9YVtjXS5tYXRjaCgvXlxccyooPzooW1wiJ10/KShbYS16XVthLXowLTldKilcXDEpXFxzKjpcXHMqKD86KC0/XFxkKyl8XCIoW2EtejAtOStcXC8lKl8uQD1cXC1dKilcInwodHJ1ZXxmYWxzZSkpJC9pKSkpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY29kZTogdGhpcyBpc24ndCBqc29uIVwiKTtcbm51bGwhPWRbM10/YltkWzJdXT1wYXJzZUludChkWzNdLDEwKTpudWxsIT1kWzRdP2JbZFsyXV09ZFsyXS5tYXRjaCgvXihjdHxhZGF0YXxzYWx0fGl2KSQvKT9zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoZFs0XSk6dW5lc2NhcGUoZFs0XSk6bnVsbCE9ZFs1XSYmKGJbZFsyXV09XCJ0cnVlXCI9PT1kWzVdKX1yZXR1cm4gYn0sajpmdW5jdGlvbihhLGIsYyl7dm9pZCAwPT09YSYmKGE9e30pO2lmKHZvaWQgMD09PWIpcmV0dXJuIGE7Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSl7aWYoYyYmdm9pZCAwIT09YVtkXSYmYVtkXSE9PWJbZF0pdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJyZXF1aXJlZCBwYXJhbWV0ZXIgb3ZlcnJpZGRlblwiKTthW2RdPWJbZF19cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9e30sZDtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0hPT1iW2RdJiYoY1tkXT1hW2RdKTtyZXR1cm4gY30scWE6ZnVuY3Rpb24oYSxcbmIpe3ZhciBjPXt9LGQ7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyl2b2lkIDAhPT1hW2JbZF1dJiYoY1tiW2RdXT1hW2JbZF1dKTtyZXR1cm4gY319O3NqY2wuZW5jcnlwdD1zamNsLmpzb24uZW5jcnlwdDtzamNsLmRlY3J5cHQ9c2pjbC5qc29uLmRlY3J5cHQ7c2pjbC5taXNjLm9hPXt9O3NqY2wubWlzYy5jYWNoZWRQYmtkZjI9ZnVuY3Rpb24oYSxiKXt2YXIgYz1zamNsLm1pc2Mub2EsZDtiPWJ8fHt9O2Q9Yi5pdGVyfHwxRTM7Yz1jW2FdPWNbYV18fHt9O2Q9Y1tkXT1jW2RdfHx7Zmlyc3RTYWx0OmIuc2FsdCYmYi5zYWx0Lmxlbmd0aD9iLnNhbHQuc2xpY2UoMCk6c2pjbC5yYW5kb20ucmFuZG9tV29yZHMoMiwwKX07Yz12b2lkIDA9PT1iLnNhbHQ/ZC5maXJzdFNhbHQ6Yi5zYWx0O2RbY109ZFtjXXx8c2pjbC5taXNjLnBia2RmMihhLGMsYi5pdGVyKTtyZXR1cm57a2V5OmRbY10uc2xpY2UoMCksc2FsdDpjLnNsaWNlKDApfX07XG5cInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1zamNsKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gc2pjbH0pO1xuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCBudWxsLCBudWxsLCBudWxsLCAiY29uc3QgZGVmYXVsdEVycm9yQ29uZmlnID0ge1xyXG4gICAgd2l0aFN0YWNrVHJhY2U6IGZhbHNlLFxyXG59O1xyXG4vLyBDdXN0b20gZXJyb3Igb2JqZWN0XHJcbi8vIENvbnRleHQgLyBkaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtYWNyby9uZXZlcnRocm93L3B1bGwvMjE1XHJcbmNvbnN0IGNyZWF0ZU5ldmVyVGhyb3dFcnJvciA9IChtZXNzYWdlLCByZXN1bHQsIGNvbmZpZyA9IGRlZmF1bHRFcnJvckNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHJlc3VsdC5pc09rKClcclxuICAgICAgICA/IHsgdHlwZTogJ09rJywgdmFsdWU6IHJlc3VsdC52YWx1ZSB9XHJcbiAgICAgICAgOiB7IHR5cGU6ICdFcnInLCB2YWx1ZTogcmVzdWx0LmVycm9yIH07XHJcbiAgICBjb25zdCBtYXliZVN0YWNrID0gY29uZmlnLndpdGhTdGFja1RyYWNlID8gbmV3IEVycm9yKCkuc3RhY2sgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBzdGFjazogbWF5YmVTdGFjayxcclxuICAgIH07XHJcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuY2xhc3MgUmVzdWx0QXN5bmMge1xyXG4gICAgY29uc3RydWN0b3IocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU2FmZVByb21pc2UocHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yRm4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZVxyXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbmV3IEVycihlcnJvckZuKGUpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBzdGF0aWMgZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZm4oLi4uYXJncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoZXJyb3JGbiA/IGVycm9yRm4oZXJyb3IpIDogZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSkoKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0KGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZVdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZihyZXMudmFsdWUpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzID0geWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKG5ld1Jlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRlZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNPaygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoeWllbGQgZihyZXMuZXJyb3IpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRBc3luYyA/IG5ld1ZhbHVlLl9wcm9taXNlIDogbmV3VmFsdWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLm1hdGNoKG9rLCBfZXJyKSk7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMudW53cmFwT3IodCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gOS4wLjAuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiB1c2UgYHNhZmVUcnlgIHdpdGhvdXQgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogc2FmZVRyeShhc3luYyBmdW5jdGlvbiogKCkge1xyXG4gICAgICogICBjb25zdCBva1ZhbHVlID0geWllbGQqIHlvdXJSZXN1bHRcclxuICAgICAqIH0pXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEVtdWxhdGVzIFJ1c3QncyBgP2Agb3BlcmF0b3IgaW4gYHNhZmVUcnlgJ3MgYm9keS4gU2VlIGFsc28gYHNhZmVUcnlgLlxyXG4gICAgICovXHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHNhZmVVbndyYXBfMSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5zYWZlVW53cmFwKCkpKSkpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBNYWtlcyBSZXN1bHRBc3luYyBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8UmVzdWx0PlxyXG4gICAgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZXJyQXN5bmMocmVzdWx0LmVycm9yKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb2tBc3luYyA9ICh2YWx1ZSkgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgT2sodmFsdWUpKSk7XHJcbmNvbnN0IGVyckFzeW5jID0gKGVycikgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgRXJyKGVycikpKTtcclxuY29uc3QgZnJvbVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZTtcclxuY29uc3QgZnJvbVNhZmVQcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlO1xyXG5jb25zdCBmcm9tQXN5bmNUaHJvd2FibGUgPSBSZXN1bHRBc3luYy5mcm9tVGhyb3dhYmxlO1xuXG4vKipcclxuICogU2hvcnQgY2lyY3VpdHMgb24gdGhlIEZJUlNUIEVyciB2YWx1ZSB0aGF0IHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0ID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFjYy5tYXAoKGxpc3QpID0+IGxpc3QucHVzaChyZXN1bHQudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG4vKiBUaGlzIGlzIHRoZSB0eXBlc2FmZSB2ZXJzaW9uIG9mIFByb21pc2UuYWxsXHJcbiAqXHJcbiAqIFRha2VzIGEgbGlzdCBvZiBSZXN1bHRBc3luYzxULCBFPiBhbmQgc3VjY2VzcyBpZiBhbGwgaW5uZXIgcmVzdWx0cyBhcmUgT2sgdmFsdWVzXHJcbiAqIG9yIGZhaWxzIGlmIG9uZSAob3IgbW9yZSkgb2YgdGhlIGlubmVyIHJlc3VsdHMgYXJlIEVyciB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3QgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdCk7XHJcbi8qKlxyXG4gKiBHaXZlIGEgbGlzdCBvZiBhbGwgdGhlIGVycm9ycyB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjLmVycm9yLnB1c2gocmVzdWx0LmVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIoW3Jlc3VsdC5lcnJvcl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNPaygpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjLnZhbHVlLnB1c2gocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gbm90aGluZyB3aGVuIHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzRXJyKClcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcclxudmFyIFJlc3VsdDtcclxuKGZ1bmN0aW9uIChSZXN1bHQpIHtcclxuICAgIC8qKlxyXG4gICAgICogV3JhcHMgYSBmdW5jdGlvbiB3aXRoIGEgdHJ5IGNhdGNoLCBjcmVhdGluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lXHJcbiAgICAgKiBhcmd1bWVudHMgYnV0IHJldHVybmluZyBgT2tgIGlmIHN1Y2Nlc3NmdWwsIGBFcnJgIGlmIHRoZSBmdW5jdGlvbiB0aHJvd3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gd3JhcCB3aXRoIG9rIG9uIHN1Y2Nlc3Mgb3IgZXJyIG9uIGZhaWx1cmVcclxuICAgICAqIEBwYXJhbSBlcnJvckZuIHdoZW4gYW4gZXJyb3IgaXMgdGhyb3duLCB0aGlzIHdpbGwgd3JhcCB0aGUgZXJyb3IgcmVzdWx0IGlmIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBmdW5jdGlvbiBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyKGVycm9yRm4gPyBlcnJvckZuKGUpIDogZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmZyb21UaHJvd2FibGUgPSBmcm9tVGhyb3dhYmxlO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZShyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0KHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmUgPSBjb21iaW5lO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZVdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZVdpdGhBbGxFcnJvcnMgPSBjb21iaW5lV2l0aEFsbEVycm9ycztcclxufSkoUmVzdWx0IHx8IChSZXN1bHQgPSB7fSkpO1xyXG5jb25zdCBvayA9ICh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKTtcclxuZnVuY3Rpb24gZXJyKGVycikge1xyXG4gICAgcmV0dXJuIG5ldyBFcnIoZXJyKTtcclxufVxyXG5mdW5jdGlvbiBzYWZlVHJ5KGJvZHkpIHtcclxuICAgIGNvbnN0IG4gPSBib2R5KCkubmV4dCgpO1xyXG4gICAgaWYgKG4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuLnRoZW4oKHIpID0+IHIudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuLnZhbHVlO1xyXG59XHJcbmNsYXNzIE9rIHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBvayhmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcEVycihfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKF92YWx1ZSkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGYodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRlZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFzeW5jQW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKCgpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNNYXAoZikge1xyXG4gICAgICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB1bndyYXBPcihfdikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS15aWVsZCAqL1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBFcnJgIG9uIGFuIE9rJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgcmVxdWlyZS15aWVsZFxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVyciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBlcnIoZih0aGlzLmVycm9yKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jQW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jTWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3Iodikge1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgbWF0Y2goX29rLCBlcnIpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB5aWVsZCBlcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvIG5vdCB1c2UgdGhpcyBnZW5lcmF0b3Igb3V0IG9mIGBzYWZlVHJ5YCcpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwYCBvbiBhbiBFcnInLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgeWllbGQgc2VsZjtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufVxyXG5jb25zdCBmcm9tVGhyb3dhYmxlID0gUmVzdWx0LmZyb21UaHJvd2FibGU7XHJcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBFcnIsIE9rLCBSZXN1bHQsIFJlc3VsdEFzeW5jLCBlcnIsIGVyckFzeW5jLCBmcm9tQXN5bmNUaHJvd2FibGUsIGZyb21Qcm9taXNlLCBmcm9tU2FmZVByb21pc2UsIGZyb21UaHJvd2FibGUsIG9rLCBva0FzeW5jLCBzYWZlVHJ5IH07XG4iLCAiaW1wb3J0IHtcbiAgRGVjb2RlIGFzIGI2NGRlY29kZSxcbiAgRW5jb2RlIGFzIGI2NGVuY29kZSxcbn0gZnJvbSBcImFycmF5YnVmZmVyLWVuY29kaW5nL2Jhc2U2NFwiO1xuaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCBzamNsIGZyb20gXCJsdWZpLXNqY2xcIjtcbmltcG9ydCB7IENyeXB0b0FsZ29yaXRobSB9IGZyb20gXCJ+L2VudW0vY3J5cHRvLWFsZ29yaXRobS50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBEZWNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgRW5jcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2VuY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IHR5cGUgRW5jcnlwdGVkRGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9lbmNyeXB0ZWQtZGF0YS50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0IHsgSGFzaGluZ0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2hhc2hpbmctZXJyb3IudHNcIjtcblxuLyoqXG4gKiBEZWNyeXB0IGFuIEVuY3J5cHRlZERhdGEgb3IgYSBzdHJpbmcgdXNpbmcgdGhlIGtleSB1c2VkIGZvciBlbmNyeXB0aW9uLlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWREYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZGVjcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZERhdGE6IEVuY3J5cHRlZERhdGEgfCBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzxBcnJheUJ1ZmZlciwgRGVjcnlwdGlvbkVycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHR5cGVvZiBlbmNyeXB0ZWREYXRhID09PSBcInN0cmluZ1wiXG4gICAgICA/IGVuY3J5cHRlZERhdGFcbiAgICAgIDogbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVuY3J5cHRlZERhdGEuZGF0YSBhcyBBcnJheUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gb2tBc3luYyhiNjRkZWNvZGUoc2pjbC5kZWNyeXB0KGtleSwgZGF0YSkpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICBuZXcgRGVjcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5jcnlwdCBhbiBBcnJheUJ1ZmZlciBpbnRvIGFuIEVuY3J5cHRlZERhdGEgdXNpbmcgdGhlIHByb3ZpZGVkIGtleVxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVuY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogQXJyYXlCdWZmZXIsXG4pOiBSZXN1bHRBc3luYzxFbmNyeXB0ZWREYXRhLCBFbmNyeXB0aW9uRXJyb3I+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBzamNsLmVuY3J5cHQoa2V5LCBiNjRlbmNvZGUodmFsdWUpKTtcblxuICAgIHJldHVybiBva0FzeW5jKHtcbiAgICAgIGFsZ286IENyeXB0b0FsZ29yaXRobS5TamNsLFxuICAgICAgZGF0YTogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGVuY3J5cHRlZCkuYnVmZmVyLFxuICAgICAgaXY6IEpTT04ucGFyc2UoZW5jcnlwdGVkIGFzIHVua25vd24gYXMgc3RyaW5nKS5pdixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICBuZXcgRW5jcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gc3RyaW5nIHVzaW5nIFNqY2wgQVBJXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5ID0gKCk6IFJlc3VsdEFzeW5jPHN0cmluZywgQ3J5cHRvRXJyb3I+ID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gb2tBc3luYyhzamNsLmNvZGVjLmJhc2U2NC5mcm9tQml0cyhzamNsLnJhbmRvbS5yYW5kb21Xb3Jkcyg4LCAxMCkpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICBuZXcgQ3J5cHRvRXJyb3IoXCJVbmFibGUgdG8gZ2VuZXJhdGUga2V5XCIsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogSGFzaCBhIHBhc3N3b3JkIHVzaW5nIFNqY2wgQVBJXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaGFzaFBhc3N3b3JkID0gKFxuICBwYXNzd29yZDogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBIYXNoaW5nRXJyb3I+ID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gb2tBc3luYyhzamNsLmNvZGVjLmhleC5mcm9tQml0cyhzamNsLmhhc2guc2hhNTEyLmhhc2gocGFzc3dvcmQpKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKG5ldyBIYXNoaW5nRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSkpO1xuICB9XG59O1xuXG4vKipcbiAqIERldGVjdCBpZiB0aGUga2V5IGhhcyBiZWVuIGdlbmVyYXRlZCBieSBTamNsLiBTaW5jZSB3ZSdyZSBub3QgZ2VuZXJhdGluZyBhbiBlcXVhbCBzeW1ib2wgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIFdlYkNyeXB0byBBUEkgKGJ5IHVzaW5nIGJhc2U2NHVybCksIGl0J3MgZWFzeSB0byBkZXRlY3RcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNTamNsS2V5ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBrZXlba2V5Lmxlbmd0aCAtIDFdID09PSBcIj1cIjtcbn07XG4iLCAidHlwZSBKc29uYWJsZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCByZWFkb25seSBKc29uYWJsZVtdXG4gIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uYWJsZSB9XG4gIHwgeyB0b0pTT04oKTogSnNvbmFibGUgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ/OiBKc29uYWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiBFcnJvcjsgY29udGV4dD86IEpzb25hYmxlIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBjYXVzZSwgY29udGV4dCB9ID0gb3B0aW9ucztcblxuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIENyeXB0b0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2U6IHN0cmluZyA9IFwiVW5hYmxlIHRvIGVuY3J5cHQgdGhlIHByb3ZpZGVkIGRhdGFcIjtcbn1cbiIsICJpbXBvcnQgeyBlcnJBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY29ubmVjdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci9zZXJ2ZXItZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ29uZmlnIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1jb25maWcudHNcIjtcblxuLyoqXG4gKiBFbnN1cmUgYW4gZXJyb3IgbWVzc2FnZSBpcyB0cmFuc2Zvcm1lZCBpbiBhbiBFcnJvciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbnN1cmVFcnJvciA9ICh2YWx1ZTogdW5rbm93bik6IEVycm9yID0+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWx1ZTtcblxuICBsZXQgc3RyaW5naWZpZWQgPSBcIltVbmFibGUgdG8gc3RyaW5naWZ5IHRoZSB0aHJvd24gdmFsdWVdXCI7XG4gIHRyeSB7XG4gICAgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICByZXR1cm4gbmV3IEVycm9yKHN0cmluZ2lmaWVkKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgTHVmaSdzIGNvbmZpZyBmcm9tIGl0cyBBUElcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VVcmxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaFNlcnZlckNvbmZpZyA9IChcbiAgaW5zdGFuY2VVcmw6IFVSTCxcbik6IFJlc3VsdEFzeW5jPFNlcnZlckNvbmZpZywgRXJyb3I+ID0+IHtcbiAgY29uc3Qgb3JpZ2luTWF0Y2hlcyA9IGluc3RhbmNlVXJsLmhyZWYubWF0Y2goXG4gICAgLyguKj8pXFwvPyg/OlxcL1tkcl17MX1cXC98bG9naW5cXC8/fGZpbGVzXFwvPykvLFxuICApO1xuXG4gIGNvbnN0IHVybE9yaWdpbiA9IG9yaWdpbk1hdGNoZXMgJiYgb3JpZ2luTWF0Y2hlc1sxXVxuICAgID8gb3JpZ2luTWF0Y2hlc1sxXVxuICAgIDogaW5zdGFuY2VVcmwub3JpZ2luO1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBmZXRjaCh1cmxPcmlnaW4gKyBcIi9hYm91dC9jb25maWdcIiksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENvbm5lY3Rpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICApLmFuZFRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIHJlc3BvbnNlLmpzb24oKSxcbiAgICAgICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgIG5ldyBTZXJ2ZXJFcnJvcih1bmRlZmluZWQsIHsgY29udGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Rlbm9SdW50aW1lID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBjb25zdCBpc1NlY3VyZUNvbnRleHQgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKCkgfHwgZ2xvYmFsVGhpcy5pc1NlY3VyZUNvbnRleHQgfHxcbiAgICBnbG9iYWxUaGlzLmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IHdvcmtlclVybCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFVSTCA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKClcbiAgICA/IG5ldyBVUkwoYC4vd29ya2VyLyR7cmVsYXRpdmVQYXRofS50c2AsIG5ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZilcbiAgICA6IG5ldyBVUkwoXG4gICAgICBpbXBvcnQubWV0YS5yZXNvbHZlKFxuICAgICAgICBgLi8ke1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCAhPT0gXCJlbmNyeXB0XCIgPyBgd29ya2VyLyR7cmVsYXRpdmVQYXRofWAgOiByZWxhdGl2ZVBhdGhcbiAgICAgICAgfS5qc2AsXG4gICAgICApLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIERlY29kZSBhcyBiNjR1cmxkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjR1cmxlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjQvdXJsXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB7IENyeXB0b0FsZ29yaXRobSB9IGZyb20gXCJ+L2VudW0vY3J5cHRvLWFsZ29yaXRobS50c1wiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcbmltcG9ydCB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBlbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvblxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkOiBFbmNyeXB0ZWREYXRhLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT4ge1xuICByZXR1cm4gaW1wb3J0S2V5KGtleSkuYW5kVGhlbigoaW1wb3J0ZWRLZXkpID0+XG4gICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICBpdjogZW5jcnlwdGVkLml2IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgIH0sXG4gICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICBlbmNyeXB0ZWQuZGF0YSBhcyBBcnJheUJ1ZmZlcixcbiAgICAgICksXG4gICAgICAoZXJyb3IpID0+IG5ldyBEZWNyeXB0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgKVxuICApO1xufTtcblxuLyoqXG4gKiBFbmNyeXB0IGFuIEFycmF5QnVmZmVyIGludG8gYW4gRW5jcnlwdGVkRGF0YSB1c2luZyB0aGUgcHJvdmlkZWQga2V5XG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PiB7XG4gIHJldHVybiBpbXBvcnRLZXkoa2V5KS5hbmRUaGVuKChpbXBvcnRlZEtleSkgPT4ge1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxMikpO1xuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgIGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgIGl2LFxuICAgICAgICB9LFxuICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICApLFxuICAgICAgKGVycm9yKSA9PlxuICAgICAgICBuZXcgRW5jcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIH0pLFxuICAgICkuYW5kVGhlbigoZW5jcnlwdGVkKSA9PiB7XG4gICAgICByZXR1cm4gb2tBc3luYyh7XG4gICAgICAgIGFsZ286IENyeXB0b0FsZ29yaXRobS5XZWJDcnlwdG8sXG4gICAgICAgIGRhdGE6IGVuY3J5cHRlZCxcbiAgICAgICAgaXYsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhIHN0cmluZyBpbnRvIGEgQ3J5cHRvS2V5LCB1c2FibGUgaW4gV2ViIENyeXB0byBBUElcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaW1wb3J0S2V5ID0gKGtleTogc3RyaW5nKTogUmVzdWx0QXN5bmM8Q3J5cHRvS2V5LCBDcnlwdG9FcnJvcj4gPT4ge1xuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInJhd1wiLFxuICAgICAgYjY0dXJsZGVjb2RlKGtleSksXG4gICAgICB7IG5hbWU6IFwiQUVTLUdDTVwiIH0sXG4gICAgICBmYWxzZSxcbiAgICAgIFtcbiAgICAgICAgXCJlbmNyeXB0XCIsXG4gICAgICAgIFwiZGVjcnlwdFwiLFxuICAgICAgXSxcbiAgICApLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBpbXBvcnQgY3J5cHRvZ3JhcGh5IGtleVwiLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gc3RyaW5nIHVzaW5nIFdlYiBDcnlwdG8gQVBJLlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9ICgpOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PiB7XG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgY3J5cHRvLnN1YnRsZVxuICAgICAgICAuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICBsZW5ndGg6IDI1NixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0sXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oKGdlbmVyYXRlZEtleSkgPT5cbiAgICAgICAgICBjcnlwdG8uc3VidGxlXG4gICAgICAgICAgICAuZXhwb3J0S2V5KFwicmF3XCIsIGdlbmVyYXRlZEtleSlcbiAgICAgICAgICAgIC50aGVuKChrZXkpID0+IHJlc29sdmUoYjY0dXJsZW5jb2RlKGtleSkpKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGJhc2U2NCBlbmNvZGUgdGhlIHVybFwiLCB7XG4gICAgICAgICAgICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKVxuICAgICksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIGtleVwiLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyBXZWJDcnlwdG8gQVBJXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaGFzaFBhc3N3b3JkID0gKFxuICBwYXNzd29yZDogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBIYXNoaW5nRXJyb3I+ID0+IHtcbiAgY29uc3QgcHJvbWlzZSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcbiAgICAgICAgICBcIlNIQS01MTJcIixcbiAgICAgICAgICBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGFzc3dvcmQpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBwcm9taXNlKCksXG4gICAgKGVycm9yKSA9PiBuZXcgSGFzaGluZ0Vycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICApO1xufTtcbiIsICJpbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB0eXBlIHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERlY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9kZWNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSBcIn4vYXBpL2NyeXB0by9zamNsLnRzXCI7XG5pbXBvcnQgKiBhcyB3ZWIgZnJvbSBcIn4vYXBpL2NyeXB0by93ZWIudHNcIjtcbmltcG9ydCB0eXBlIHsgSGFzaGluZ0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2hhc2hpbmctZXJyb3IudHNcIjtcblxuLyoqXG4gKiBEZWNyeXB0IGFuIEVuY3J5cHRlZERhdGEgb2JqZWN0IHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvblxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogRW5jcnlwdGVkRGF0YSxcbik6IFJlc3VsdEFzeW5jPEFycmF5QnVmZmVyLCBEZWNyeXB0aW9uRXJyb3I+ID0+XG4gIHZhbHVlLmFsZ28gPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5hbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbFxuICAgID8gc2pjbC5kZWNyeXB0KGtleSwgdmFsdWUpXG4gICAgOiB3ZWIuZGVjcnlwdChrZXksIHZhbHVlKTtcblxuLyoqXG4gKiBFbmNyeXB0IGFuIEFycmF5QnVmZmVyIHVzaW5nIHRoZSBwcm92aWRlZCBrZXkgYW5kIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuICBhbGdvOiBDcnlwdG9BbGdvcml0aG0sXG4pOiBSZXN1bHRBc3luYzxFbmNyeXB0ZWREYXRhLCBFbmNyeXB0aW9uRXJyb3I+ID0+XG4gIChhbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbClcbiAgICA/IHNqY2wuZW5jcnlwdChrZXksIHZhbHVlKVxuICAgIDogd2ViLmVuY3J5cHQoa2V5LCB2YWx1ZSk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBuZXcga2V5IGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0gYWxnb1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5ID0gKFxuICBhbGdvID0gQ3J5cHRvQWxnb3JpdGhtLldlYkNyeXB0byxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgQ3J5cHRvRXJyb3I+ID0+XG4gIGFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsID8gc2pjbC5nZW5lcmF0ZUtleSgpIDogd2ViLmdlbmVyYXRlS2V5KCk7XG5cbi8qKlxuICogSGFzaCBhIHBhc3N3b3JkIHVzaW5nIHRoZSBwcm92aWRlZCBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEBwYXJhbSBhbGdvXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaGFzaFBhc3N3b3JkID0gKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBhbGdvOiBDcnlwdG9BbGdvcml0aG0sXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIEhhc2hpbmdFcnJvcj4gPT5cbiAgYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2xcbiAgICA/IHNqY2wuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKVxuICAgIDogd2ViLmhhc2hQYXNzd29yZChwYXNzd29yZCk7XG4iLCAiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBXT1JLRVJfQUNUSU9OIH0gZnJvbSBcIn4vZW51bS93b3JrZXItYWN0aW9uLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEx1ZmlGaWxlIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1maWxlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgeyBFVkVOVCB9IGZyb20gXCJ+L2VudW0vZXZlbnQudHNcIjtcbmltcG9ydCB7IFVQTE9BRF9TVEFUVVMgfSBmcm9tIFwifi9lbnVtL2ZpbGUtc3RhdHVzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckV2ZW50IH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1ldmVudC50c1wiO1xuXG5kZWNsYXJlIGxldCBzZWxmOiBXb3JrZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogVXBkYXRlIGZpbGUgaW4gd29ya2VycyBhbmQgcHJvdmlkZSBtb2RpZmljYXRpb25zIHRvIHRoZSBtYWluIHRocmVhZFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWxlID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSwgYXJnczogUGFydGlhbDxMdWZpRmlsZT4pID0+IHtcbiAgT2JqZWN0LmFzc2lnbihsdWZpRmlsZSwgYXJncyk7XG5cbiAgaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULkZJTEVfVVBEQVRFRCxcbiAgICAgIGx1ZmlGaWxlLFxuICAgIH0gYXMgV29ya2VyRXZlbnQpO1xuICB9XG5cbiAgcmV0dXJuIGx1ZmlGaWxlO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRGaWxlRXJyb3IgPSAobHVmaUZpbGU6IEx1ZmlGaWxlLCBlcnJvcjogRXJyb3IpID0+IHtcbiAgdXBkYXRlRmlsZShsdWZpRmlsZSwgeyB1cGxvYWRTdGF0dXM6IFVQTE9BRF9TVEFUVVMuRkFJTEVEIH0pO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IgfSBhcyBXb3JrZXJFdmVudCk7XG59O1xuXG4vKipcbiAqIEluaXQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjaGlsZCB3b3JrZXIncyBvbm1lc3NhZ2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0ID0gKCkgPT4ge1xuICBldmVudHMub25jZShFVkVOVC5TT0NLRVRfT1BFTkVELCAoKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBldmVudDogRVZFTlQuU09DS0VUX09QRU5FRCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgZXZlbnRzLm9uY2UoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzV29ya2VyQWN0aW9uTWVzc2FnZSA9IChcbiAgLy8gZGVuby1saW50LWlnbm9yZSBuby1leHBsaWNpdC1hbnlcbiAgbWVzc2FnZTogYW55LFxuKTogbWVzc2FnZSBpcyBXb3JrZXJBY3Rpb25NZXNzYWdlID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIG1lc3NhZ2UgIT09IG51bGwgJiZcbiAgICBcImFjdGlvblwiIGluIG1lc3NhZ2UgJiZcbiAgICBPYmplY3QudmFsdWVzKFdPUktFUl9BQ1RJT04pLmluY2x1ZGVzKG1lc3NhZ2UuYWN0aW9uKVxuICApO1xufTtcbiIsICJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwifi9lcnJvci9iYXNlLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3JrZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7fVxuIiwgImltcG9ydCB7IFdvcmtlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IgZXh0ZW5kcyBXb3JrZXJFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIlBhcmFtZXRlciBtdXN0IGJlIGRlZmluZWRcIjtcbn1cbiIsICJpbXBvcnQgeyBXb3JrZXJFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dvcmtlci93b3JrZXItZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmtlclVwbG9hZEFscmVhZHlGYWlsZWRFcnJvciBleHRlbmRzIFdvcmtlckVycm9yIHtcbiAgb3ZlcnJpZGUgbWVzc2FnZSA9IFwiRmlsZSB1cGxvYWQgYWxyZWFkeSBmYWlsZWRcIjtcbn1cbiIsICJpbXBvcnQgeyBlbmNyeXB0IH0gZnJvbSBcIn4vYXBpL2NyeXB0by50c1wiO1xuaW1wb3J0IHsgVVBMT0FEX1NUQVRVUyB9IGZyb20gXCJ+L2VudW0vZmlsZS1zdGF0dXMudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBpbml0IH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci93b3JrZXIvd29ya2VyLXVuZGVmaW5lZC1wYXJhbWV0ZXItZXJyb3IudHNcIjtcbmltcG9ydCB7IFdvcmtlclVwbG9hZEFscmVhZHlGYWlsZWRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dvcmtlci93b3JrZXItdXBsb2FkLWFscmVhZHktZmFpbGVkLWVycm9yLnRzXCI7XG5cbmRlY2xhcmUgY29uc3Qgc2VsZjogV29ya2VyO1xuXG5sZXQgaXNJbml0aWF0ZWQgPSBmYWxzZTtcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICBpZiAoIWlzSW5pdGlhdGVkKSB7XG4gICAgaW5pdCgpO1xuICAgIGlzSW5pdGlhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHsgbHVmaUZpbGUsIGNodW5rLCBhbGdvIH0gPSAoZXZlbnQuZGF0YSBhcyBXb3JrZXJBY3Rpb25NZXNzYWdlKS5hcmdzO1xuXG4gIGlmIChjaHVuayAmJiB0eXBlb2YgYWxnbyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmIChsdWZpRmlsZS51cGxvYWRTdGF0dXMgIT09IFVQTE9BRF9TVEFUVVMuRkFJTEVEKSB7XG4gICAgICBlbmNyeXB0KGx1ZmlGaWxlLmtleXMuY2xpZW50LCBjaHVuay5idWZmZXIsIGFsZ28pXG4gICAgICAgIC5tYXAoKGVuY3J5cHRlZERhdGEpID0+IHtcbiAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZW5jcnlwdGVkRGF0YSwgY2h1bmtJbmRleDogY2h1bmsuaW5kZXggfSwgW1xuICAgICAgICAgICAgdHlwZW9mIGVuY3J5cHRlZERhdGEuZGF0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlbmNyeXB0ZWREYXRhLmRhdGEpLmJ1ZmZlclxuICAgICAgICAgICAgICA6IGVuY3J5cHRlZERhdGEuZGF0YSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcEVycigoZXJyb3I6IEVuY3J5cHRpb25FcnJvcikgPT4ge1xuICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBlcnJvcjogbmV3IFdvcmtlclVwbG9hZEFscmVhZHlGYWlsZWRFcnJvcihcIkZpbGUgdXBsb2FkIGFscmVhZHkgZmFpbGVkXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghY2h1bmspIHtcbiAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBlcnJvcjogbmV3IFdvcmtlclVuZGVmaW5lZFBhcmFtZXRlckVycm9yKFxuICAgICAgICAgIFwiY2h1bmsgYnVmZmVyIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhbGdvID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgZXJyb3I6IG5ldyBXb3JrZXJVbmRlZmluZWRQYXJhbWV0ZXJFcnJvcihcImFsZ28gbXVzdCBiZSBkZWZpbmVkXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBYSxRQUFJQSxRQUFLLEVBQUMsUUFBTyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsV0FBVSxFQUFDLFNBQVEsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGNBQVksS0FBSztBQUFBLE1BQU87QUFBRSxXQUFLLFVBQVE7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUU7QUFBQyxXQUFLLFdBQVMsV0FBVTtBQUFDLGVBQU0sY0FBWSxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsR0FBRSxLQUFJLFNBQVMsR0FBRTtBQUFDLFdBQUssV0FBUyxXQUFVO0FBQUMsZUFBTSxVQUFRLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxHQUFFLFVBQVMsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGdCQUFjLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxFQUFDLEVBQUM7QUFDM2MsSUFBQUEsTUFBSyxPQUFPLE1BQUksU0FBUyxHQUFFO0FBQUMsV0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRTtBQUFFLFVBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxVQUFFLEVBQUU7QUFBTyxVQUFJLElBQUU7QUFBRSxVQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsc0JBQXNCO0FBQUUsV0FBSyxJQUFFLENBQUMsSUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUUsSUFBRyxLQUFJO0FBQUMsWUFBRSxFQUFFLElBQUUsQ0FBQztBQUFFLFlBQUcsTUFBSSxJQUFFLEtBQUcsTUFBSSxLQUFHLE1BQUksSUFBRSxFQUFFLEtBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLEdBQUUsTUFBSSxJQUFFLE1BQUksSUFBRSxLQUFHLElBQUUsTUFBSSxLQUFHLEtBQUcsSUFBRyxJQUFFLEtBQUcsSUFBRSxPQUFLLEtBQUc7QUFBSSxVQUFFLENBQUMsSUFBRSxFQUFFLElBQUUsQ0FBQyxJQUFFO0FBQUEsTUFBQztBQUFDLFdBQUksSUFBRSxHQUFFLEdBQUUsS0FBSSxJQUFJLEtBQUUsRUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxLQUFHLEtBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFDM2YsR0FBRyxDQUFDO0FBQUEsSUFBQztBQUNMLElBQUFBLE1BQUssT0FBTyxJQUFJLFlBQVUsRUFBQyxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRSxHQUFFLFdBQVU7QUFBQyxVQUFJLElBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsTUFBTSxHQUFFLElBQUksSUFBRyxFQUFFLENBQUMsSUFBRSxLQUFHLElBQUUsT0FBSyxLQUFHLE1BQUksQ0FBQyxJQUFFO0FBQUUsV0FBSSxJQUFFLElBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLEtBQUcsS0FBRyxHQUFFLElBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHLElBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxNQUFJLElBQUcsRUFBRSxDQUFDLElBQUUsR0FBRSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxXQUFVLElBQUUsUUFBUSxJQUFFLE1BQU0sSUFBRSxXQUFVLEdBQUUsSUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFFLFdBQVUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksR0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSTtBQUFFLFdBQUksSUFDbGdCLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQ2hELGFBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUcsTUFBSSxFQUFFLE9BQU8sT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx3QkFBd0I7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxHQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsU0FBTyxJQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBSSxFQUFFLElBQUUsRUFBRSxLQUFHLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFO0FBQUUsV0FBSSxJQUNyZixHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxDQUFDLElBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxHQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBQztBQUNoSCxJQUFBQSxNQUFLLFdBQVMsRUFBQyxVQUFTLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFFQSxNQUFLLFNBQVMsRUFBRSxFQUFFLE1BQU0sSUFBRSxFQUFFLEdBQUUsTUFBSSxJQUFFLEdBQUcsRUFBRSxNQUFNLENBQUM7QUFBRSxhQUFPLFdBQVMsSUFBRSxJQUFFQSxNQUFLLFNBQVMsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBSyxNQUFNLENBQUMsSUFBRSxJQUFFLEVBQUU7QUFBRSxlQUFRLElBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsS0FBRyxDQUFDLEtBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxLQUFHLElBQUUsQ0FBQyxNQUFJLElBQUUsRUFBRSxJQUFFLEtBQUcsQ0FBQyxNQUFJLE1BQUksS0FBRyxLQUFHO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLE1BQUksRUFBRSxVQUFRLE1BQUksRUFBRSxPQUFPLFFBQU8sRUFBRSxPQUFPLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLFNBQU8sQ0FBQyxHQUFFLElBQUVBLE1BQUssU0FBUyxXQUFXLENBQUM7QUFBRSxhQUFPLE9BQUssSUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFFQSxNQUFLLFNBQVMsRUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLEVBQUUsU0FBTyxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFPLGFBQU8sTUFDMWYsSUFBRSxJQUFFLE1BQUksSUFBRSxLQUFHQSxNQUFLLFNBQVMsV0FBVyxFQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLEtBQUcsRUFBRSxTQUFPLEVBQUUsUUFBTztBQUFFLFVBQUUsRUFBRSxNQUFNLEdBQUUsS0FBSyxLQUFLLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUU7QUFBTyxVQUFFLElBQUU7QUFBRyxVQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsQ0FBQyxJQUFFQSxNQUFLLFNBQVMsUUFBUSxHQUFFLEVBQUUsSUFBRSxDQUFDLElBQUUsY0FBWSxJQUFFLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsYUFBTyxPQUFLLElBQUUsS0FBRyxJQUFFLElBQUUsSUFBRSxLQUFHLEtBQUcsS0FBRyxnQkFBYztBQUFBLElBQUMsR0FBRSxZQUFXLFNBQVMsR0FBRTtBQUFDLGFBQU8sS0FBSyxNQUFNLElBQUUsYUFBYSxLQUFHO0FBQUEsSUFBRSxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHQSxNQUFLLFNBQVMsVUFBVSxDQUFDLE1BQUlBLE1BQUssU0FBUyxVQUFVLENBQUMsRUFBRSxRQUFNO0FBQUcsVUFBSSxJQUFFLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLE1BQUcsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsYUFBTyxNQUNsZjtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUk7QUFBRSxVQUFFO0FBQUUsV0FBSSxXQUFTLE1BQUksSUFBRSxDQUFDLElBQUcsTUFBSSxHQUFFLEtBQUcsR0FBRyxHQUFFLEtBQUssQ0FBQyxHQUFFLElBQUU7QUFBRSxVQUFHLE1BQUksRUFBRSxRQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLEtBQUssSUFBRSxFQUFFLENBQUMsTUFBSSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsS0FBRyxLQUFHO0FBQUUsVUFBRSxFQUFFLFNBQU8sRUFBRSxFQUFFLFNBQU8sQ0FBQyxJQUFFO0FBQUUsVUFBRUEsTUFBSyxTQUFTLFdBQVcsQ0FBQztBQUFFLFFBQUUsS0FBS0EsTUFBSyxTQUFTLFFBQVEsSUFBRSxJQUFFLElBQUcsS0FBRyxJQUFFLElBQUUsSUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsU0FBUyxHQUFFLEdBQUU7QUFBQyxhQUFNLENBQUMsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxFQUFFLEVBQUUsS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxNQUFJLEtBQUcsTUFBSSxJQUFFLFNBQVEsSUFBRSxVQUFTLElBQUUsS0FBRztBQUFHLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFDcGQsSUFBQUEsTUFBSyxNQUFNLGFBQVcsRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRSxJQUFHLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUMsR0FBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxJQUFFLEdBQUUsSUFBSSxRQUFLLElBQUUsT0FBSyxJQUFFLEVBQUUsSUFBRSxDQUFDLElBQUcsS0FBRyxPQUFPLGFBQWEsTUFBSSxNQUFJLE1BQUksQ0FBQyxHQUFFLE1BQUk7QUFBRSxhQUFPLG1CQUFtQixPQUFPLENBQUMsQ0FBQztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRTtBQUFDLFVBQUUsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDO0FBQUUsVUFBSSxJQUFFLENBQUMsR0FBRSxHQUFFLElBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEtBQUUsS0FBRyxJQUFFLEVBQUUsV0FBVyxDQUFDLEdBQUUsT0FBSyxJQUFFLE9BQUssRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFO0FBQUcsVUFBRSxLQUFHLEVBQUUsS0FBS0EsTUFBSyxTQUFTLFFBQVEsS0FBRyxJQUFFLElBQUcsQ0FBQyxDQUFDO0FBQUUsYUFBTztBQUFBLElBQUMsRUFBQztBQUNwWixJQUFBQSxNQUFLLE1BQU0sTUFBSSxFQUFDLFVBQVMsU0FBUyxHQUFFO0FBQUMsVUFBSSxJQUFFLElBQUc7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLFFBQUssRUFBRSxDQUFDLElBQUUsS0FBRyxpQkFBZ0IsU0FBUyxFQUFFLEVBQUUsT0FBTyxDQUFDO0FBQUUsYUFBTyxFQUFFLE9BQU8sR0FBRUEsTUFBSyxTQUFTLFVBQVUsQ0FBQyxJQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBRSxVQUFFLEVBQUUsUUFBUSxVQUFTLEVBQUU7QUFBRSxVQUFFLEVBQUU7QUFBTyxVQUFFLElBQUU7QUFBVyxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsR0FBRSxLQUFLLFNBQVMsRUFBRSxPQUFPLEdBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDO0FBQUUsYUFBT0EsTUFBSyxTQUFTLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBQSxJQUFDLEVBQUM7QUFDOVYsSUFBQUEsTUFBSyxNQUFNLFNBQU8sRUFBQyxHQUFFLG9FQUFtRSxVQUFTLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsSUFBRyxJQUFFLEdBQUUsSUFBRUEsTUFBSyxNQUFNLE9BQU8sR0FBRSxJQUFFLEdBQUUsSUFBRUEsTUFBSyxTQUFTLFVBQVUsQ0FBQztBQUFFLFlBQUksSUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLElBQUU7QUFBTSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsU0FBTyxJQUFHLE1BQUcsRUFBRSxRQUFRLElBQUUsRUFBRSxDQUFDLE1BQUksT0FBSyxFQUFFLEdBQUUsSUFBRSxLQUFHLElBQUUsRUFBRSxDQUFDLEtBQUcsSUFBRSxHQUFFLEtBQUcsSUFBRyxRQUFNLE1BQUksR0FBRSxLQUFHO0FBQUcsYUFBSyxFQUFFLFNBQU8sS0FBRyxDQUFDLElBQUcsTUFBRztBQUFJLGFBQU87QUFBQSxJQUFDLEdBQUUsUUFBTyxTQUFTLEdBQUUsR0FBRTtBQUFDLFVBQUUsRUFBRSxRQUFRLFNBQVEsRUFBRTtBQUFFLFVBQUksSUFBRSxDQUFDLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRUEsTUFBSyxNQUFNLE9BQU8sR0FBRSxJQUFFLEdBQUU7QUFBRSxZQUFJLElBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxJQUFFO0FBQU0sV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBSTtBQUFDLFlBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdGYsWUFBRyxJQUFFLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSxvQkFBb0I7QUFBRSxhQUFHLEtBQUcsS0FBRyxJQUFHLEVBQUUsS0FBSyxJQUFFLE1BQUksQ0FBQyxHQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksS0FBRyxHQUFFLEtBQUcsS0FBRyxLQUFHO0FBQUEsTUFBRTtBQUFDLFVBQUUsTUFBSSxFQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLElBQUUsSUFBRyxHQUFFLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBQSxNQUFLLE1BQU0sWUFBVSxFQUFDLFVBQVMsU0FBUyxHQUFFO0FBQUMsYUFBT0EsTUFBSyxNQUFNLE9BQU8sU0FBUyxHQUFFLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRTtBQUFDLGFBQU9BLE1BQUssTUFBTSxPQUFPLE9BQU8sR0FBRSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLFNBQU8sU0FBUyxHQUFFO0FBQUMsV0FBSyxFQUFFLENBQUMsS0FBRyxLQUFLLEVBQUU7QUFBRSxXQUFHLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxLQUFLLElBQUUsRUFBRSxLQUFHLEtBQUssTUFBTTtBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssT0FBTyxPQUFLLFNBQVMsR0FBRTtBQUFDLGFBQU8sSUFBSUEsTUFBSyxLQUFLLFNBQVEsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFBLElBQUM7QUFDeGdCLElBQUFBLE1BQUssS0FBSyxPQUFPLFlBQVUsRUFBQyxXQUFVLEtBQUksT0FBTSxXQUFVO0FBQUMsV0FBSyxJQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBSSxHQUFFLElBQUUsS0FBSyxJQUFFQSxNQUFLLFNBQVMsT0FBTyxLQUFLLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSztBQUFFLFVBQUUsS0FBSyxJQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxVQUFHLG1CQUFpQixFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEscUNBQXFDO0FBQUUsVUFBRyxnQkFBYyxPQUFPLGFBQVk7QUFBQyxZQUFJLElBQUUsSUFBSSxZQUFZLENBQUMsR0FBRSxJQUFFO0FBQUUsYUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsTUFBTyxLQUFHLEdBQUUsS0FBRyxJQUFJLE1BQUssRUFBRSxFQUFFO0FBQUEsVUFBUyxLQUFHO0FBQUEsVUFDdGYsTUFBSSxJQUFFO0FBQUEsUUFBRSxDQUFDLEdBQUUsS0FBRztBQUFFLFVBQUUsT0FBTyxHQUFFLEtBQUcsQ0FBQztBQUFBLE1BQUMsTUFBTSxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxNQUFPLEtBQUcsR0FBRSxLQUFHLElBQUksTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFFLFVBQVcsQ0FBQztBQUFFLFdBQUksRUFBRSxLQUFLLEtBQUssSUFBRSxDQUFDLEdBQUUsRUFBRSxTQUFRLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxXQUFLLE1BQU07QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsV0FBVTtBQUFDLGVBQVMsRUFBRUMsSUFBRTtBQUFDLGVBQU8sY0FBYUEsS0FBRSxLQUFLLE1BQU1BLEVBQUMsS0FBRztBQUFBLE1BQUM7QUFBQyxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsR0FBRSxHQUFFLEtBQUcsR0FBRSxLQUFJO0FBQUMsWUFBRTtBQUFHLGFBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxHQUFFLElBQUksS0FBRyxNQUFJLElBQUUsR0FBRTtBQUFDLGNBQ3pmO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFHLEtBQUssRUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLENBQUMsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLE1BQUcsSUFBRSxJQUFFLEVBQUUsQ0FBQyxLQUFHLElBQUUsRUFBRSxJQUFFLElBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEtBQUcsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxLQUFHLEtBQUcsS0FBRyxPQUFLLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUksRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLElBQUUsSUFBRSxFQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSSxJQUFFLEtBQUcsSUFBRSxNQUFJLEVBQUUsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxLQUFHLElBQUUsT0FBSyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQ3BmO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFBLElBQUMsRUFBQztBQUFFLElBQUFELE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEtBQUcsS0FBSyxFQUFFO0FBQUUsV0FBRyxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsS0FBRyxLQUFLLE1BQU07QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLE9BQU8sT0FBSyxTQUFTLEdBQUU7QUFBQyxhQUFPLElBQUlBLE1BQUssS0FBSyxTQUFRLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUFDO0FBQy9TLElBQUFBLE1BQUssS0FBSyxPQUFPLFlBQVUsRUFBQyxXQUFVLE1BQUssT0FBTSxXQUFVO0FBQUMsV0FBSyxJQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBSSxHQUFFLElBQUUsS0FBSyxJQUFFQSxNQUFLLFNBQVMsT0FBTyxLQUFLLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSztBQUFFLFVBQUUsS0FBSyxJQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxVQUFHLG1CQUFpQixFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEscUNBQXFDO0FBQUUsVUFBRyxnQkFBYyxPQUFPLGFBQVk7QUFBQyxZQUFJLElBQUUsSUFBSSxZQUFZLENBQUMsR0FBRSxJQUFFO0FBQUUsYUFBSSxJQUFFLE9BQUssS0FBRyxPQUFLLElBQUUsT0FBTSxLQUFHLEdBQUUsS0FBRyxLQUFLLE1BQUssRUFBRSxFQUFFLFNBQVMsS0FDdGYsR0FBRSxNQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsS0FBRztBQUFFLFVBQUUsT0FBTyxHQUFFLEtBQUcsQ0FBQztBQUFBLE1BQUMsTUFBTSxNQUFJLElBQUUsT0FBSyxLQUFHLE9BQUssSUFBRSxPQUFNLEtBQUcsR0FBRSxLQUFHLEtBQUssTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxDQUFDO0FBQUUsUUFBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBRSxVQUFXLENBQUM7QUFBRSxXQUFJLEVBQUUsS0FBSyxLQUFLLElBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBUSxNQUFLLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSyxNQUFNO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxJQUFHLENBQUMsVUFBUyxVQUFTLFNBQVEsU0FBUSxVQUFTLFNBQVEsU0FBUSxPQUFPLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRztBQUFBLE1BQUM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUNsZjtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQ3BmO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxJQUFPLEdBQUUsR0FBRSxXQUFVO0FBQUMsZUFBUyxFQUFFQyxJQUFFO0FBQUMsZUFBTyxjQUFhQSxLQUFFLEtBQUssTUFBTUEsRUFBQyxLQUFHO0FBQUEsTUFBQztBQUFDLGVBQVMsRUFBRUEsSUFBRTtBQUFDLGVBQU8saUJBQWVBLEtBQUUsS0FBSyxNQUFNQSxFQUFDLEtBQUc7QUFBQSxNQUFHO0FBQUMsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUU7QUFBRyxhQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsR0FBRSxJQUFJLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxjQUFFO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsR0FBRSxDQUFDLEdBQUUsS0FBSyxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxHQUFFLENBQUMsS0FBRyxLQUFHLEtBQUssR0FBRyxDQUFDLElBQUcsS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsSUFBRSxDQUFDLENBQUMsR0FBRSxLQUFLLEVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLElBQUUsQ0FBQyxDQUFDLEtBQUcsS0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FDdmdCLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLEtBQUcsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRTtBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBRSxNQUFNLEdBQUc7QUFBRSxpQkFBUSxJQUFFLEdBQUUsS0FBRyxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUEsTUFBQyxNQUFNLEtBQUU7QUFBRSxVQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxJQUFHLElBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUcsS0FBRyxFQUFFLEtBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUM7QUFBQSxhQUFNO0FBQUMsY0FBRSxFQUFFLEtBQUcsSUFBRSxHQUFHO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGVBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxLQUFHLE1BQUk7QUFBRSxjQUFJLEtBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxNQUFJLEtBQUcsS0FBRyxNQUFJO0FBQUcsY0FBRSxFQUFFLEtBQUcsSUFBRSxFQUFFO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLEtBQUcsQ0FBQyxHQUNuZixLQUFHLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxJQUFFLE1BQUksTUFBSSxNQUFJLEdBQUUsS0FBRyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksSUFBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGNBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxLQUFHLENBQUM7QUFBRSxjQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxlQUFHO0FBQUUsZUFBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLGVBQUc7QUFBRSxlQUFHLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFO0FBQUEsUUFBRTtBQUFDLFVBQUUsSUFBRSxDQUFDLElBQUUsS0FBRztBQUFFLFVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxLQUFHO0FBQUUsWUFBSSxJQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxLQUFHLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxHQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsS0FBRyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksSUFBRyxLQUFHLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxJQUFHLEtBQUcsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEVBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLE1BQUksS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLEtBQUksSUFBRSxNQUFJLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksT0FBSyxLQUNwZixLQUFHLE1BQUksT0FBSyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsTUFBSSxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRSxHQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFJLFlBQUUsSUFBRTtBQUFHLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUUsSUFBRSxJQUFFO0FBQUUsWUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFLElBQUUsSUFBRTtBQUFFLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsTUFBQztBQUFDLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFDbmY7QUFBRSxRQUFFLEVBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsRUFBRSxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxFQUFFLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxFQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsSUFBQyxFQUFDO0FBQ3pILElBQUFELE1BQUssS0FBSyxNQUFJLEVBQUMsTUFBSyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGdCQUFlLFNBQVMsR0FBRTtBQUFDLE1BQUFBLE1BQUssS0FBSyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFBQyxHQUFFLGtCQUFpQixTQUFTLEdBQUU7QUFBQyxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUFFLFdBQUcsS0FBR0EsTUFBSyxLQUFLLElBQUksRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFO0FBQUUsVUFBRSxLQUFHO0FBQUcsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsR0FBRSxJQUFJO0FBQUMsVUFBRSxLQUFHLE1BQUksSUFBRSxLQUFHO0FBQUcsVUFBRSxFQUFFO0FBQUEsUUFBTTtBQUFBLFFBQ3RmLEtBQUcsS0FBRztBQUFBLE1BQUU7QUFBRSxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLGFBQU8sRUFBRSxPQUFPLEVBQUUsTUFBSyxFQUFFLEdBQUc7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUUsS0FBRztBQUFHLFVBQUUsS0FBRyxDQUFDO0FBQUUsVUFBSSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLFNBQVMsR0FBRSxJQUFFLENBQUMsR0FBRSxLQUFHLElBQUUsS0FBRztBQUFFLFVBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsa0NBQWtDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxHQUFFLElBQUk7QUFBQyxVQUFFLEtBQUcsTUFBSSxJQUFFLEtBQUc7QUFBRyxVQUFFLEVBQUUsTUFBTSxHQUFFLEtBQUcsS0FBRyxFQUFFO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsR0FBRSxFQUFFLE1BQUssR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFJLENBQUMsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHdCQUF3QjtBQUN4aEIsYUFBTyxFQUFFO0FBQUEsSUFBSSxHQUFFLElBQUcsU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUksSUFBRSxDQUFDLEdBQUUsSUFBRUEsTUFBSyxVQUFTLElBQUUsRUFBRTtBQUFFLFVBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBRyxFQUFFLFNBQU8sS0FBRyxLQUFHLElBQUUsS0FBRyxJQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUUsVUFBRSxFQUFFLE9BQU8sR0FBRSxDQUFDO0FBQUUsUUFBRSxDQUFDLEtBQUc7QUFBRSxVQUFFLEVBQUUsUUFBUSxDQUFDO0FBQUUsVUFBRyxFQUFFLE9BQU8sTUFBSSxJQUFFLEVBQUUsVUFBVSxDQUFDLElBQUUsR0FBRSxTQUFPLElBQUUsSUFBRSxDQUFDLEVBQUUsUUFBUSxJQUFHLENBQUMsQ0FBQyxJQUFFLGNBQVksTUFBSSxJQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxJQUFHLEtBQUssQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLElBQUcsSUFBRSxFQUFFLE9BQU8sR0FBRSxDQUFDLEdBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUcsRUFBRSxLQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUVBLE1BQUssVUFBUyxJQUFFLEVBQUU7QUFBRSxXQUFHO0FBQUUsVUFBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLEtBQUcsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHlCQUF5QjtBQUNuZixVQUFHLGFBQVcsRUFBRSxVQUFRLGFBQVcsRUFBRSxPQUFPLE9BQU0sSUFBSUEsTUFBSyxVQUFVLElBQUksd0NBQXdDO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUUsVUFBVSxDQUFDLElBQUUsR0FBRSxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBRyxFQUFFLEtBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBRSxhQUFPLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLEdBQUUsSUFBRUEsTUFBSztBQUFTLFVBQUUsRUFBRTtBQUFFLFVBQUksSUFBRSxFQUFFLFFBQU8sSUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFFLElBQUUsSUFBRSxJQUFHLElBQUU7QUFBRSxVQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxHQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFFLEdBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUcsQ0FBQyxFQUFFLFFBQU0sRUFBQyxLQUFJLEdBQUUsTUFBSyxDQUFDLEVBQUM7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsS0FBRyxFQUFFLEtBQUUsTUFBSUEsTUFBSyxLQUFLLElBQUksR0FBRyxJQUNyZ0IsQ0FBQyxHQUFFLEtBQUcsSUFBRyxFQUFFLENBQUMsS0FBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsYUFBTSxFQUFDLEtBQUksR0FBRSxNQUFLLEVBQUUsTUFBTSxHQUFFLENBQUMsRUFBQztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxPQUFLLFNBQVMsR0FBRSxHQUFFO0FBQUMsV0FBSyxJQUFFLElBQUUsS0FBR0EsTUFBSyxLQUFLO0FBQU8sVUFBSSxJQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsWUFBVTtBQUFHLFdBQUssSUFBRSxDQUFDLElBQUksS0FBRSxJQUFJLEdBQUM7QUFBRSxRQUFFLFNBQU8sTUFBSSxJQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUcsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLFdBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQVcsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQztBQUMzWSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFVBQVFBLE1BQUssS0FBSyxLQUFLLFVBQVUsTUFBSSxTQUFTLEdBQUU7QUFBQyxVQUFHLEtBQUssRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHlDQUF5QztBQUFFLFdBQUssT0FBTyxDQUFDO0FBQUUsYUFBTyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFFBQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFO0FBQUEsSUFBRTtBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUU7QUFBRyxXQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxXQUFVO0FBQUMsVUFBSSxJQUFFLEtBQUssRUFBRSxTQUFTLEdBQUUsSUFBRyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUcsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFFLFdBQUssTUFBTTtBQUFFLGFBQU87QUFBQSxJQUFDO0FBQ3ZlLElBQUFBLE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRSxLQUFHO0FBQUksVUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsMEJBQTBCO0FBQUUsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLG1CQUFXLE9BQU8sTUFBSSxJQUFFQSxNQUFLLE1BQU0sV0FBVyxPQUFPLENBQUM7QUFBRyxVQUFFLEtBQUdBLE1BQUssS0FBSztBQUFLLFVBQUUsSUFBSSxFQUFFLENBQUM7QUFBRSxVQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRUEsTUFBSztBQUFTLFdBQUksSUFBRSxHQUFFLEtBQUcsRUFBRSxVQUFRLEtBQUcsSUFBRyxLQUFJO0FBQUMsWUFBRSxJQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksTUFBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsWUFBRSxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQUM7QUFBQyxZQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDO0FBQ25kLElBQUFBLE1BQUssT0FBSyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUUsQ0FBQyxJQUFJQSxNQUFLLEtBQUssUUFBTTtBQUFFLFdBQUssSUFBRSxDQUFDLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLEtBQUssSUFBRSxLQUFLLElBQUUsS0FBSyxLQUFHO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFPLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRTtBQUFHLFdBQUssSUFBRSxFQUFDLFVBQVMsQ0FBQyxHQUFFLFFB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LEVBQXpEO0FBQUE7QUFDTCx3QkFBUyxXQUFVO0FBQUE7QUFDckI7OztBQ01BLElBQUksY0FBYztBQUVsQixLQUFLLFlBQVksQ0FBQyxVQUF3QjtBQUN4QyxNQUFJLENBQUMsYUFBYTtBQUNoQixTQUFLO0FBQ0wsa0JBQWM7QUFBQSxFQUNoQjtBQUVBLFFBQU0sRUFBRSxVQUFVLE9BQU8sS0FBSyxJQUFLLE1BQU0sS0FBNkI7QUFFdEUsTUFBSSxTQUFTLE9BQU8sU0FBUyxhQUFhO0FBQ3hDLFFBQUksU0FBUyxpQ0FBdUM7QUFDbEQsTUFBQUMsU0FBUSxTQUFTLEtBQUssUUFBUSxNQUFNLFFBQVEsSUFBSSxFQUM3QyxJQUFJLENBQUMsa0JBQWtCO0FBQ3RCLGFBQUssWUFBWSxFQUFFLGVBQWUsWUFBWSxNQUFNLE1BQU0sR0FBRztBQUFBLFVBQzNELE9BQU8sY0FBYyxTQUFTLFdBQzFCLElBQUksWUFBWSxFQUFFLE9BQU8sY0FBYyxJQUFJLEVBQUUsU0FDN0MsY0FBYztBQUFBLFFBQ3BCLENBQUM7QUFBQSxNQUNILENBQUMsRUFDQSxPQUFPLENBQUMsVUFBMkI7QUFDbEMsYUFBSyxZQUFZLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFDNUIsQ0FBQztBQUFBLElBQ0wsT0FBTztBQUNMLFdBQUssWUFBWTtBQUFBLFFBQ2YsT0FBTyxJQUFJLCtCQUErQiw0QkFBNEI7QUFBQSxNQUN4RSxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsT0FBTztBQUNMLFFBQUksQ0FBQyxPQUFPO0FBQ1YsV0FBSyxZQUFZO0FBQUEsUUFDZixPQUFPLElBQUk7QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxRQUFJLE9BQU8sU0FBUyxhQUFhO0FBQy9CLFdBQUssWUFBWTtBQUFBLFFBQ2YsT0FBTyxJQUFJLDhCQUE4QixzQkFBc0I7QUFBQSxNQUNqRSxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsic2pjbCIsICJhIiwgIlJlZmxlY3RBcHBseSIsICJSZWZsZWN0T3duS2V5cyIsICJOdW1iZXJJc05hTiIsICJFdmVudEVtaXR0ZXIiLCAiZXZlbnRzIiwgImVyciIsICJvbmNlIiwgIm9iaiIsICJvYmoiLCAidiIsICJvayIsICJlcnIiLCAiUmVzdWx0IiwgImZyb21UaHJvd2FibGUiLCAib2siLCAiZXJyIiwgInNlbGYiLCAic2pjbCIsICJlbmNyeXB0IiwgImVuY3J5cHQiLCAiRXZlbnRFbWl0dGVyIiwgImVuY3J5cHQiXQp9Cg== diff --git a/themes/default/public/js/minified/worker/infos.js b/themes/default/public/js/minified/worker/infos.js deleted file mode 100644 index 9b4e2cb..0000000 --- a/themes/default/public/js/minified/worker/infos.js +++ /dev/null @@ -1,2132 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter2() { - EventEmitter2.init.call(this); - } - module.exports = EventEmitter2; - module.exports.once = once; - EventEmitter2.EventEmitter = EventEmitter2; - EventEmitter2.prototype._events = void 0; - EventEmitter2.prototype._eventsCount = 0; - EventEmitter2.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter2, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter2.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter2.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter2.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter2.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; - EventEmitter2.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter2.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; - EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter2.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter2.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter2.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter2.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter2.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a; - }, invalid: function(a) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a; - }, bug: function(a) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a; - }, notReady: function(a) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a; - } } }; - sjcl2.cipher.aes = function(a) { - this.w[0][0][0] || this.C(); - var b, c, d, e, f = this.w[0][4], g = this.w[1]; - b = a.length; - var h = 1; - if (4 !== b && 6 !== b && 8 !== b) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d = a.slice(0), e = []]; - for (a = b; a < 4 * b + 28; a++) { - c = d[a - 1]; - if (0 === a % b || 8 === b && 4 === a % b) c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255], 0 === a % b && (c = c << 8 ^ c >>> 24 ^ h << 24, h = h << 1 ^ 283 * (h >> 7)); - d[a] = d[a - b] ^ c; - } - for (b = 0; a; b++, a--) c = d[b & 3 ? a : a - 4], e[b] = 4 >= a || 4 > b ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a) { - return aa(this, a, 0); - }, decrypt: function(a) { - return aa(this, a, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a = this.w[0], b = this.w[1], c = a[4], d = b[4], e, f, g, h = [], k = [], n, l, m, p; - for (e = 0; 256 > e; e++) k[(h[e] = e << 1 ^ 283 * (e >> 7)) ^ e] = e; - for (f = g = 0; !c[f]; f ^= n || 1, g = k[g] || 1) for (m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, m = m >> 8 ^ m & 255 ^ 99, c[f] = m, d[m] = f, l = h[e = h[n = h[f]]], p = 16843009 * l ^ 65537 * e ^ 257 * n ^ 16843008 * f, l = 257 * h[m] ^ 16843008 * m, e = 0; 4 > e; e++) a[e][f] = l = l << 24 ^ l >>> 8, b[e][m] = p = p << 24 ^ p >>> 8; - for (e = 0; 5 > e; e++) a[e] = a[e].slice(0), b[e] = b[e].slice(0); - } }; - function aa(a, b, c) { - if (4 !== b.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d = a.b[c], e = b[0] ^ d[0], f = b[c ? 3 : 1] ^ d[1], g = b[2] ^ d[2]; - b = b[c ? 1 : 3] ^ d[3]; - var h, k, n, l = d.length / 4 - 2, m, p = 4, z = [0, 0, 0, 0]; - h = a.w[c]; - a = h[0]; - var A = h[1], C = h[2], B = h[3], D = h[4]; - for (m = 0; m < l; m++) h = a[e >>> 24] ^ A[f >> 16 & 255] ^ C[g >> 8 & 255] ^ B[b & 255] ^ d[p], k = a[f >>> 24] ^ A[g >> 16 & 255] ^ C[b >> 8 & 255] ^ B[e & 255] ^ d[p + 1], n = a[g >>> 24] ^ A[b >> 16 & 255] ^ C[e >> 8 & 255] ^ B[f & 255] ^ d[p + 2], b = a[b >>> 24] ^ A[e >> 16 & 255] ^ C[f >> 8 & 255] ^ B[g & 255] ^ d[p + 3], p += 4, e = h, f = k, g = n; - for (m = 0; 4 > m; m++) z[c ? 3 & -m : m] = D[e >>> 24] << 24 ^ D[f >> 16 & 255] << 16 ^ D[g >> 8 & 255] << 8 ^ D[b & 255] ^ d[p++], h = e, e = f, f = g, g = b, b = h; - return z; - } - sjcl2.bitArray = { bitSlice: function(a, b, c) { - a = sjcl2.bitArray.Y(a.slice(b / 32), 32 - (b & 31)).slice(1); - return void 0 === c ? a : sjcl2.bitArray.clamp(a, c - b); - }, extract: function(a, b, c) { - var d = Math.floor(-b - c & 31); - return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; - }, concat: function(a, b) { - if (0 === a.length || 0 === b.length) return a.concat(b); - var c = a[a.length - 1], d = sjcl2.bitArray.getPartial(c); - return 32 === d ? a.concat(b) : sjcl2.bitArray.Y(b, d, c | 0, a.slice(0, a.length - 1)); - }, bitLength: function(a) { - var b = a.length; - return 0 === b ? 0 : 32 * (b - 1) + sjcl2.bitArray.getPartial(a[b - 1]); - }, clamp: function(a, b) { - if (32 * a.length < b) return a; - a = a.slice(0, Math.ceil(b / 32)); - var c = a.length; - b = b & 31; - 0 < c && b && (a[c - 1] = sjcl2.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); - return a; - }, partial: function(a, b, c) { - return 32 === a ? b : (c ? b | 0 : b << 32 - a) + 1099511627776 * a; - }, getPartial: function(a) { - return Math.round(a / 1099511627776) || 32; - }, equal: function(a, b) { - if (sjcl2.bitArray.bitLength(a) !== sjcl2.bitArray.bitLength(b)) return false; - var c = 0, d; - for (d = 0; d < a.length; d++) c |= a[d] ^ b[d]; - return 0 === c; - }, Y: function(a, b, c, d) { - var e; - e = 0; - for (void 0 === d && (d = []); 32 <= b; b -= 32) d.push(c), c = 0; - if (0 === b) return d.concat(a); - for (e = 0; e < a.length; e++) d.push(c | a[e] >>> b), c = a[e] << 32 - b; - e = a.length ? a[a.length - 1] : 0; - a = sjcl2.bitArray.getPartial(e); - d.push(sjcl2.bitArray.partial(b + a & 31, 32 < b + a ? c : d.pop(), 1)); - return d; - }, P: function(a, b) { - return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; - }, byteswapM: function(a) { - var b, c; - for (b = 0; b < a.length; ++b) c = a[b], a[b] = c >>> 24 | c >>> 8 & 65280 | (c & 65280) << 8 | c << 24; - return a; - } }; - sjcl2.codec.utf8String = { fromBits: function(a) { - var b = "", c = sjcl2.bitArray.bitLength(a), d, e; - for (d = 0; d < c / 8; d++) 0 === (d & 3) && (e = a[d / 4]), b += String.fromCharCode(e >>> 8 >>> 8 >>> 8), e <<= 8; - return decodeURIComponent(escape(b)); - }, toBits: function(a) { - a = unescape(encodeURIComponent(a)); - var b = [], c, d = 0; - for (c = 0; c < a.length; c++) d = d << 8 | a.charCodeAt(c), 3 === (c & 3) && (b.push(d), d = 0); - c & 3 && b.push(sjcl2.bitArray.partial(8 * (c & 3), d)); - return b; - } }; - sjcl2.codec.hex = { fromBits: function(a) { - var b = "", c; - for (c = 0; c < a.length; c++) b += ((a[c] | 0) + 263882790666240).toString(16).substr(4); - return b.substr(0, sjcl2.bitArray.bitLength(a) / 4); - }, toBits: function(a) { - var b, c = [], d; - a = a.replace(/\s|0x/g, ""); - d = a.length; - a = a + "00000000"; - for (b = 0; b < a.length; b += 8) c.push(parseInt(a.substr(b, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c, 4 * d); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a, b, c) { - var d = "", e = 0, f = sjcl2.codec.base64.S, g = 0, h = sjcl2.bitArray.bitLength(a); - c && (f = f.substr(0, 62) + "-_"); - for (c = 0; 6 * d.length < h; ) d += f.charAt((g ^ a[c] >>> e) >>> 26), 6 > e ? (g = a[c] << 6 - e, e += 26, c++) : (g <<= 6, e -= 6); - for (; d.length & 3 && !b; ) d += "="; - return d; - }, toBits: function(a, b) { - a = a.replace(/\s|=/g, ""); - var c = [], d, e = 0, f = sjcl2.codec.base64.S, g = 0, h; - b && (f = f.substr(0, 62) + "-_"); - for (d = 0; d < a.length; d++) { - h = f.indexOf(a.charAt(d)); - if (0 > h) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e ? (e -= 26, c.push(g ^ h >>> e), g = h << 32 - e) : (e += 6, g ^= h << 32 - e); - } - e & 56 && c.push(sjcl2.bitArray.partial(e & 56, g, 1)); - return c; - } }; - sjcl2.codec.base64url = { fromBits: function(a) { - return sjcl2.codec.base64.fromBits(a, 1, 1); - }, toBits: function(a) { - return sjcl2.codec.base64.toBits(a, 1); - } }; - sjcl2.hash.sha256 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a) { - return new sjcl2.hash.sha256().update(a).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(d.subarray( - 16 * e, - 16 * (e + 1) - )), e += 1; - c.splice(0, 16 * e); - } else for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(c.splice(0, 16)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 2; a & 15; a++) b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 16)); - this.reset(); - return c; - }, o: [], b: [], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - for (var b = 0, c = 2, d, e; 64 > b; c++) { - e = true; - for (d = 2; d * d <= c; d++) if (0 === c % d) { - e = false; - break; - } - e && (8 > b && (this.o[b] = a(Math.pow(c, 0.5))), this.b[b] = a(Math.pow(c, 1 / 3)), b++); - } - }, l: function(a) { - var b, c, d, e = this.g, f = this.b, g = e[0], h = e[1], k = e[2], n = e[3], l = e[4], m = e[5], p = e[6], z = e[7]; - for (b = 0; 64 > b; b++) 16 > b ? c = a[b] : (c = a[b + 1 & 15], d = a[b + 14 & 15], c = a[b & 15] = (c >>> 7 ^ c >>> 18 ^ c >>> 3 ^ c << 25 ^ c << 14) + (d >>> 17 ^ d >>> 19 ^ d >>> 10 ^ d << 15 ^ d << 13) + a[b & 15] + a[b + 9 & 15] | 0), c = c + z + (l >>> 6 ^ l >>> 11 ^ l >>> 25 ^ l << 26 ^ l << 21 ^ l << 7) + (p ^ l & (m ^ p)) + f[b], z = p, p = m, m = l, l = n + c | 0, n = k, k = h, h = g, g = c + (h & k ^ n & (h ^ k)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; - e[0] = e[0] + g | 0; - e[1] = e[1] + h | 0; - e[2] = e[2] + k | 0; - e[3] = e[3] + n | 0; - e[4] = e[4] + l | 0; - e[5] = e[5] + m | 0; - e[6] = e[6] + p | 0; - e[7] = e[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a) { - return new sjcl2.hash.sha512().update(a).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(d.subarray(32 * e, 32 * (e + 1))), e += 1; - c.splice(0, 32 * e); - } else for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(c.splice(0, 32)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 4; a & 31; a++) b.push(0); - b.push(0); - b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 32)); - this.reset(); - return c; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - function b(a2) { - return 1099511627776 * (a2 - Math.floor(a2)) & 255; - } - for (var c = 0, d = 2, e, f; 80 > c; d++) { - f = true; - for (e = 2; e * e <= d; e++) if (0 === d % e) { - f = false; - break; - } - f && (8 > c && (this.o[2 * c] = a(Math.pow(d, 0.5)), this.o[2 * c + 1] = b(Math.pow(d, 0.5)) << 24 | this.ia[c]), this.b[2 * c] = a(Math.pow(d, 1 / 3)), this.b[2 * c + 1] = b(Math.pow(d, 1 / 3)) << 24 | this.ka[c], c++); - } - }, l: function(a) { - var b, c, d = this.g, e = this.b, f = d[0], g = d[1], h = d[2], k = d[3], n = d[4], l = d[5], m = d[6], p = d[7], z = d[8], A = d[9], C = d[10], B = d[11], D = d[12], P = d[13], ea = d[14], Q = d[15], t; - if ("undefined" !== typeof Uint32Array) { - t = Array(160); - for (var r = 0; 32 > r; r++) t[r] = a[r]; - } else t = a; - var r = f, u = g, G = h, E = k, H = n, F = l, V = m, I = p, w = z, v = A, R = C, J = B, S = D, K = P, W = ea, L = Q; - for (a = 0; 80 > a; a++) { - if (16 > a) b = t[2 * a], c = t[2 * a + 1]; - else { - c = t[2 * (a - 15)]; - var q = t[2 * (a - 15) + 1]; - b = (q << 31 | c >>> 1) ^ (q << 24 | c >>> 8) ^ c >>> 7; - var x = (c << 31 | q >>> 1) ^ (c << 24 | q >>> 8) ^ (c << 25 | q >>> 7); - c = t[2 * (a - 2)]; - var y = t[2 * (a - 2) + 1], q = (y << 13 | c >>> 19) ^ (c << 3 | y >>> 29) ^ c >>> 6, y = (c << 13 | y >>> 19) ^ (y << 3 | c >>> 29) ^ (c << 26 | y >>> 6), X = t[2 * (a - 7)], Y = t[2 * (a - 16)], M = t[2 * (a - 16) + 1]; - c = x + t[2 * (a - 7) + 1]; - b = b + X + (c >>> 0 < x >>> 0 ? 1 : 0); - c += y; - b += q + (c >>> 0 < y >>> 0 ? 1 : 0); - c += M; - b += Y + (c >>> 0 < M >>> 0 ? 1 : 0); - } - t[2 * a] = b |= 0; - t[2 * a + 1] = c |= 0; - var X = w & R ^ ~w & S, fa = v & J ^ ~v & K, y = r & G ^ r & H ^ G & H, ja = u & E ^ u & F ^ E & F, Y = (u << 4 | r >>> 28) ^ (r << 30 | u >>> 2) ^ (r << 25 | u >>> 7), M = (r << 4 | u >>> 28) ^ (u << 30 | r >>> 2) ^ (u << 25 | r >>> 7), ka = e[2 * a], ga = e[2 * a + 1], q = L + ((w << 18 | v >>> 14) ^ (w << 14 | v >>> 18) ^ (v << 23 | w >>> 9)), x = W + ((v << 18 | w >>> 14) ^ (v << 14 | w >>> 18) ^ (w << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x = x + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x = x + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c | 0, x = x + (b + (q >>> 0 < c >>> 0 ? 1 : 0)); - c = M + ja; - b = Y + y + (c >>> 0 < M >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w; - J = v; - v = I + q | 0; - w = V + x + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E; - G = r; - E = u; - u = q + c | 0; - r = x + b + (u >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g = d[1] = g + u | 0; - d[0] = f + r + (g >>> 0 < u >>> 0 ? 1 : 0) | 0; - k = d[3] = k + E | 0; - d[2] = h + G + (k >>> 0 < E >>> 0 ? 1 : 0) | 0; - l = d[5] = l + F | 0; - d[4] = n + H + (l >>> 0 < F >>> 0 ? 1 : 0) | 0; - p = d[7] = p + I | 0; - d[6] = m + V + (p >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d[9] = A + v | 0; - d[8] = z + w + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B = d[11] = B + J | 0; - d[10] = C + R + (B >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d[13] = P + K | 0; - d[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d[15] = Q + L | 0; - d[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a) { - sjcl2.mode.ccm.F.push(a); - }, unListenProgress: function(a) { - a = sjcl2.mode.ccm.F.indexOf(a); - -1 < a && sjcl2.mode.ccm.F.splice(a, 1); - }, da: function(a) { - var b = sjcl2.mode.ccm.F.slice(), c; - for (c = 0; c < b.length; c += 1) b[c](a); - }, encrypt: function(a, b, c, d, e) { - var f, g = b.slice(0), h = sjcl2.bitArray, k = h.bitLength(c) / 8, n = h.bitLength(g) / 8; - e = e || 64; - d = d || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f = 2; 4 > f && n >>> 8 * f; f++) ; - f < 15 - k && (f = 15 - k); - c = h.clamp( - c, - 8 * (15 - f) - ); - b = sjcl2.mode.ccm.U(a, b, c, d, e, f); - g = sjcl2.mode.ccm.V(a, g, c, b, e, f); - return h.concat(g.data, g.tag); - }, decrypt: function(a, b, c, d, e) { - e = e || 64; - d = d || []; - var f = sjcl2.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), k = f.clamp(b, h - e), n = f.bitSlice(b, h - e), h = (h - e) / 8; - if (7 > g) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b = 2; 4 > b && h >>> 8 * b; b++) ; - b < 15 - g && (b = 15 - g); - c = f.clamp(c, 8 * (15 - b)); - k = sjcl2.mode.ccm.V(a, k, c, n, e, b); - a = sjcl2.mode.ccm.U(a, k.data, c, d, e, b); - if (!f.equal(k.tag, a)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a, b, c, d, e, f) { - var g = [], h = sjcl2.bitArray, k = h.P; - d = [h.partial(8, (b.length ? 64 : 0) | d - 2 << 2 | f - 1)]; - d = h.concat(d, c); - d[3] |= e; - d = a.encrypt(d); - if (b.length) for (c = h.bitLength(b) / 8, 65279 >= c ? g = [h.partial(16, c)] : 4294967295 >= c && (g = h.concat([h.partial(16, 65534)], [c])), g = h.concat(g, b), b = 0; b < g.length; b += 4) d = a.encrypt(k(d, g.slice(b, b + 4).concat([0, 0, 0]))); - return d; - }, U: function(a, b, c, d, e, f) { - var g = sjcl2.bitArray, h = g.P; - e /= 8; - if (e % 2 || 4 > e || 16 < e) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d.length || 4294967295 < b.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c = sjcl2.mode.ccm.ma(a, d, c, e, g.bitLength(b) / 8, f); - for (d = 0; d < b.length; d += 4) c = a.encrypt(h(c, b.slice(d, d + 4).concat([0, 0, 0]))); - return g.clamp(c, 8 * e); - }, V: function(a, b, c, d, e, f) { - var g, h = sjcl2.bitArray; - g = h.P; - var k = b.length, n = h.bitLength(b), l = k / 50, m = l; - c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); - d = h.bitSlice(g(d, a.encrypt(c)), 0, e); - if (!k) return { tag: d, data: [] }; - for (g = 0; g < k; g += 4) g > l && (sjcl2.mode.ccm.da(g / k), l += m), c[3]++, e = a.encrypt(c), b[g] ^= e[0], b[g + 1] ^= e[1], b[g + 2] ^= e[2], b[g + 3] ^= e[3]; - return { tag: d, data: h.clamp(b, n) }; - } }; - sjcl2.misc.hmac = function(a, b) { - this.W = b = b || sjcl2.hash.sha256; - var c = [[], []], d, e = b.prototype.blockSize / 32; - this.B = [new b(), new b()]; - a.length > e && (a = b.hash(a)); - for (d = 0; d < e; d++) c[0][d] = a[d] ^ 909522486, c[1][d] = a[d] ^ 1549556828; - this.B[0].update(c[0]); - this.B[1].update(c[1]); - this.O = new b(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a); - return this.digest(a); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a) { - this.Z = true; - this.O.update(a); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a = this.O.finalize(), a = new this.W(this.B[1]).update(a).finalize(); - this.reset(); - return a; - }; - sjcl2.misc.pbkdf2 = function(a, b, c, d, e) { - c = c || 1e4; - if (0 > d || 0 > c) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - e = e || sjcl2.misc.hmac; - a = new e(a); - var f, g, h, k, n = [], l = sjcl2.bitArray; - for (k = 1; 32 * n.length < (d || 1); k++) { - e = f = a.encrypt(l.concat(b, [k])); - for (g = 1; g < c; g++) for (f = a.encrypt(f), h = 0; h < f.length; h++) e[h] ^= f[h]; - n = n.concat(e); - } - d && (n = l.clamp(n, d)); - return n; - }; - sjcl2.prng = function(a) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a, b) { - var c = [], d; - d = this.isReady(b); - var e; - if (d === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d & this.I) { - d = !(d & this.H); - e = []; - var f = 0, g; - this.X = e[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g = 0; 16 > g; g++) e.push(4294967296 * Math.random() | 0); - for (g = 0; g < this.h.length && (e = e.concat(this.h[g].finalize()), f += this.s[g], this.s[g] = 0, d || !(this.N & 1 << g)); g++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f; - f > this.u && (this.u = f); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e)); - this.K = new sjcl2.cipher.aes(this.b); - for (d = 0; 4 > d && (this.m[d] = this.m[d] + 1 | 0, !this.m[d]); d++) ; - } - for (d = 0; d < a; d += 4) 0 === (d + 1) % this.aa && ba(this), e = N(this), c.push(e[0], e[1], e[2], e[3]); - ba(this); - return c.slice(0, a); - }, - setDefaultParanoia: function(a, b) { - if (0 === a && "Setting paranoia=0 will ruin your security; use it only for testing" !== b) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a; - }, - addEntropy: function(a, b, c) { - c = c || "user"; - var d, e, f = (/* @__PURE__ */ new Date()).valueOf(), g = this.G[c], h = this.isReady(), k = 0; - d = this.T[c]; - void 0 === d && (d = this.T[c] = this.fa++); - void 0 === g && (g = this.G[c] = 0); - this.G[c] = (this.G[c] + 1) % this.h.length; - switch (typeof a) { - case "number": - void 0 === b && (b = 1); - this.h[g].update([d, this.M++, 1, b, f, 1, a | 0]); - break; - case "object": - c = Object.prototype.toString.call(a); - if ("[object Uint32Array]" === c) { - e = []; - for (c = 0; c < a.length; c++) e.push(a[c]); - a = e; - } else for ("[object Array]" !== c && (k = 1), c = 0; c < a.length && !k; c++) "number" !== typeof a[c] && (k = 1); - if (!k) { - if (void 0 === b) for (c = b = 0; c < a.length; c++) for (e = a[c]; 0 < e; ) b++, e = e >>> 1; - this.h[g].update([d, this.M++, 2, b, f, a.length].concat(a)); - } - break; - case "string": - void 0 === b && (b = a.length); - this.h[g].update([d, this.M++, 3, b, f, a.length]); - this.h[g].update(a); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g] += b; - this.i += b; - h === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a) { - a = this.R[void 0 !== a ? a : this.L]; - return this.u && this.u >= a ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a ? this.I | this.A : this.A; - }, - getProgress: function(a) { - a = this.R[a ? a : this.L]; - return this.u >= a ? 1 : this.i > a ? 1 : this.i / a; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a, b) { - this.J[a][this.ea++] = b; - }, - removeEventListener: function(a, b) { - var c, d, e = this.J[a], f = []; - for (d in e) e.hasOwnProperty(d) && e[d] === b && f.push(d); - for (c = 0; c < f.length; c++) d = f[c], delete e[d]; - }, - ja: function() { - T(this, 1); - }, - na: function(a) { - var b, c; - try { - b = a.x || a.clientX || a.offsetX || 0, c = a.y || a.clientY || a.offsetY || 0; - } catch (d) { - c = b = 0; - } - 0 != b && 0 != c && this.addEntropy([b, c], 2, "mouse"); - T(this, 0); - }, - pa: function(a) { - a = a.touches[0] || a.changedTouches[0]; - this.addEntropy([a.pageX || a.clientX, a.pageY || a.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a) { - a = a.accelerationIncludingGravity.x || a.accelerationIncludingGravity.y || a.accelerationIncludingGravity.z; - if (window.orientation) { - var b = window.orientation; - "number" === typeof b && this.addEntropy(b, 1, "accelerometer"); - } - a && this.addEntropy(a, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a, b) { - var c, d = sjcl2.random.J[a], e = []; - for (c in d) d.hasOwnProperty(c) && e.push(d[c]); - for (c = 0; c < e.length; c++) e[c](b); - } - function T(a, b) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a.addEntropy(window.performance.now(), b, "loadtime") : a.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b, "loadtime"); - } - function ba(a) { - a.b = N(a).concat(N(a)); - a.K = new sjcl2.cipher.aes(a.b); - } - function N(a) { - for (var b = 0; 4 > b && (a.m[b] = a.m[b] + 1 | 0, !a.m[b]); b++) ; - return a.K.encrypt(a.m); - } - function O(a, b) { - return function() { - b.apply(a, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require("crypto"); - } catch (a) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json, f = e.j({ iv: sjcl2.random.randomWords(4, 0) }, e.defaults), g; - e.j(f, c); - c = f.adata; - "string" === typeof f.salt && (f.salt = sjcl2.codec.base64.toBits(f.salt)); - "string" === typeof f.iv && (f.iv = sjcl2.codec.base64.toBits(f.iv)); - if (!sjcl2.mode[f.mode] || !sjcl2.cipher[f.cipher] || "string" === typeof a && 100 >= f.iter || 64 !== f.ts && 96 !== f.ts && 128 !== f.ts || 128 !== f.ks && 192 !== f.ks && 256 !== f.ks || 2 > f.iv.length || 4 < f.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, f), a = g.key.slice(0, f.ks / 32), f.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.publicKey && (g = a.kem(), f.kemtag = g.tag, a = g.key.slice(0, f.ks / 32)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - "string" === typeof c && (f.adata = c = sjcl2.codec.utf8String.toBits(c)); - g = new sjcl2.cipher[f.cipher](a); - e.j(d, f); - d.key = a; - f.ct = "ccm" === f.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g, b, f.iv, c, f.ts) : sjcl2.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); - return f; - }, encrypt: function(a, b, c, d) { - var e = sjcl2.json, f = e.ha.apply(e, arguments); - return e.encode(f); - }, ga: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json; - b = e.j(e.j(e.j({}, e.defaults), b), c, true); - var f, g; - f = b.adata; - "string" === typeof b.salt && (b.salt = sjcl2.codec.base64.toBits(b.salt)); - "string" === typeof b.iv && (b.iv = sjcl2.codec.base64.toBits(b.iv)); - if (!sjcl2.mode[b.mode] || !sjcl2.cipher[b.cipher] || "string" === typeof a && 100 >= b.iter || 64 !== b.ts && 96 !== b.ts && 128 !== b.ts || 128 !== b.ks && 192 !== b.ks && 256 !== b.ks || !b.iv || 2 > b.iv.length || 4 < b.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, b), a = g.key.slice(0, b.ks / 32), b.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.secretKey && (a = a.unkem(sjcl2.codec.base64.toBits(b.kemtag)).slice(0, b.ks / 32)); - "string" === typeof f && (f = sjcl2.codec.utf8String.toBits(f)); - g = new sjcl2.cipher[b.cipher](a); - f = "ccm" === b.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g, b.ct, b.iv, b.tag, f, b.ts) : sjcl2.mode[b.mode].decrypt(g, b.ct, b.iv, f, b.ts); - e.j(d, b); - d.key = a; - return 1 === c.raw ? f : sjcl2.codec.utf8String.fromBits(f); - }, decrypt: function(a, b, c, d) { - var e = sjcl2.json; - return e.ga(a, e.decode(b), c, d); - }, encode: function(a) { - var b, c = "{", d = ""; - for (b in a) if (a.hasOwnProperty(b)) { - if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c += d + '"' + b + '":'; - d = ","; - switch (typeof a[b]) { - case "number": - case "boolean": - c += a[b]; - break; - case "string": - c += '"' + escape(a[b]) + '"'; - break; - case "object": - c += '"' + sjcl2.codec.base64.fromBits(a[b], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c + "}"; - }, decode: function(a) { - a = a.replace(/\s/g, ""); - if (!a.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a = a.replace(/^\{|\}$/g, "").split(/,/); - var b = {}, c, d; - for (c = 0; c < a.length; c++) { - if (!(d = a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d[3] ? b[d[2]] = parseInt(d[3], 10) : null != d[4] ? b[d[2]] = d[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d[4]) : unescape(d[4]) : null != d[5] && (b[d[2]] = "true" === d[5]); - } - return b; - }, j: function(a, b, c) { - void 0 === a && (a = {}); - if (void 0 === b) return a; - for (var d in b) if (b.hasOwnProperty(d)) { - if (c && void 0 !== a[d] && a[d] !== b[d]) throw new sjcl2.exception.invalid("required parameter overridden"); - a[d] = b[d]; - } - return a; - }, ra: function(a, b) { - var c = {}, d; - for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); - return c; - }, qa: function(a, b) { - var c = {}, d; - for (d = 0; d < b.length; d++) void 0 !== a[b[d]] && (c[b[d]] = a[b[d]]); - return c; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a, b) { - var c = sjcl2.misc.oa, d; - b = b || {}; - d = b.iter || 1e3; - c = c[a] = c[a] || {}; - d = c[d] = c[d] || { firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c = void 0 === b.salt ? d.firstSalt : b.salt; - d[c] = d[c] || sjcl2.misc.pbkdf2(a, c, b.iter); - return { key: d[c].slice(0), salt: c.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/websocket/websocket-error.ts -var WebSocketError = class extends BaseError { -}; - -// src/error/websocket/websocket-connection-error.ts -var WebSocketConnectionError = class extends WebSocketError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to connect to WebSocket"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var updateFile = (lufiFile, args) => { - Object.assign(lufiFile, args); - if (typeof WorkerGlobalScope !== "undefined") { - self.postMessage({ - event: "FILE_UPDATED" /* FILE_UPDATED */, - lufiFile - }); - } - return lufiFile; -}; -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/encoding.js -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i = 0; i < len; i += 3) { - res += this._charset[view[i] >> 2] + this._charset[(view[i] & 3) << 4 | view[i + 1] >> 4] + this._charset[(view[i + 1] & 15) << 2 | view[i + 2] >> 6] + this._charset[view[i + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i = 0, j = 0; - while (i < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i++] = enc1 << 2 | enc2 >> 4; - view[i++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/standard.js -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -function Decode(str) { - return obj.Decode(str); -} - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/url.js -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Decode2(str) { - return obj2.Decode(str); -} - -// src/api/crypto/sjcl.ts -var import_lufi_sjcl = __toESM(require_sjcl()); - -// src/error/crypto/crypto-error.ts -var CryptoError = class extends BaseError { -}; - -// src/error/crypto/decryption-error.ts -var DecryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to decrypt the provided data"); - } -}; - -// src/api/crypto/sjcl.ts -var decrypt = (key, encryptedData) => { - try { - const data = typeof encryptedData === "string" ? encryptedData : new TextDecoder().decode(encryptedData.data); - return okAsync(Decode(import_lufi_sjcl.default.decrypt(key, data))); - } catch (error) { - return errAsync( - new DecryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; - -// src/api/crypto/web.ts -var decrypt2 = (key, encrypted) => { - return importKey(key).andThen( - (importedKey) => ResultAsync.fromPromise( - crypto.subtle.decrypt( - { - name: "AES-GCM", - iv: encrypted.iv - }, - importedKey, - encrypted.data - ), - (error) => new DecryptionError(void 0, { cause: ensureError(error) }) - ) - ); -}; -var importKey = (key) => { - return ResultAsync.fromPromise( - crypto.subtle.importKey( - "raw", - Decode2(key), - { name: "AES-GCM" }, - false, - [ - "encrypt", - "decrypt" - ] - ), - (error) => new CryptoError("Unable to import cryptography key", { - cause: ensureError(error) - }) - ); -}; - -// src/api/crypto.ts -var decrypt3 = (key, value) => value.algo === void 0 || value.algo === 0 /* Sjcl */ ? decrypt(key, value) : decrypt2(key, value); - -// src/api/websocket.ts -var sockets = {}; -var MAX_ERRORS = 5; -var onCancelMessage = (data) => { - events.emit("UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, data.success); - return okAsync(void 0); -}; -var onDownloadMessage = (response, lufiFile) => { - const result = response.split("XXMOJOXX"); - const metadataString = result.shift(); - if (metadataString !== void 0) { - const metadata = JSON.parse(metadataString); - if (isServerDownloadChunkSuccessMetadata(metadata)) { - const dataString = result.shift(); - if (dataString) { - const encryptedData = JSON.parse(dataString); - if (encryptedData.iv) { - encryptedData.iv = new Uint8Array(Object.values(encryptedData.iv)); - encryptedData.data = Decode(encryptedData.data); - } - return decrypt3(lufiFile.keys.client, encryptedData).andThen( - (decryptedPart) => { - const buffer = typeof decryptedPart === "string" ? new TextEncoder().encode(decryptedPart).buffer : decryptedPart; - if (metadata.part === 0) { - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - delAtFirstView: metadata.del_at_first_view, - delay: metadata.delay, - name: metadata.name, - size: metadata.size, - totalChunks: metadata.total, - type: metadata.type, - zipped: metadata.zipped - }); - events.emit("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */); - } else { - updateFile(lufiFile, { chunksReady: lufiFile.chunksReady + 1 }); - } - events.emit("CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, buffer, metadata.part); - if (lufiFile.chunksReady === metadata.total) { - return endDownload(lufiFile).andThen(() => { - events.emit("DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - return okAsync(void 0); - }); - } - return okAsync(void 0); - } - ); - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError(metadata.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onUploadMessage = (response, lufiFile) => { - if (response.success) { - if (response.j === 0) { - updateFile(lufiFile, { - keys: { client: lufiFile.keys.client, server: response.short }, - actionToken: response.token, - queueIndex: response.i - }); - events.emit("UPLOAD_STARTED" /* UPLOAD_STARTED */); - } - updateFile(lufiFile, { - chunksReady: lufiFile.chunksReady + 1, - createdAt: response.created_at - }); - events.emit("CHUNK_UPLOADED" /* CHUNK_UPLOADED */); - if (lufiFile.chunksReady === lufiFile.totalChunks) { - updateFile(lufiFile, { uploadStatus: 1 /* COMPLETE */ }); - events.emit("UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - } - return okAsync(void 0); - } else { - const error = new WebSocketError(response.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onMessage = (e, lufiFile) => { - const data = tryParseJson(e.data); - let callback; - if (data) { - if (!data.action && data.msg) { - const error = new WebSocketError(data.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } else { - if ("delay" in data) { - callback = onUploadMessage(data, lufiFile); - } else { - callback = onCancelMessage(data); - } - } - } else { - callback = onDownloadMessage(e.data, lufiFile); - } - return callback; -}; -var isConnecting = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.CONNECTING; -var isSpawned = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.OPEN; -var downloadChunk = (lufiFile, chunkNumber) => { - let message; - if (lufiFile.password) { - message = { part: chunkNumber, file_pwd: lufiFile.password }; - } else { - message = { part: chunkNumber }; - } - return sendMessage( - downloadSocketUrl(lufiFile), - lufiFile, - JSON.stringify(message) - ); -}; -var endDownload = (lufiFile) => { - let message; - if (lufiFile.password) { - message = { ended: true, file_pwd: lufiFile.password }; - } else { - message = { ended: true }; - } - return sendMessage( - downloadSocketUrl(lufiFile), - lufiFile, - JSON.stringify(message) - ); -}; -var sendMessage = (socketUrl, lufiFile, message) => { - if (!isSpawned(socketUrl)) { - return spawn(socketUrl).andThen(() => { - sockets[socketUrl].onmessage = (e) => onMessage(e, lufiFile); - return sendMessage(socketUrl, lufiFile, message); - }); - } else { - sockets[socketUrl].send(message); - return okAsync(void 0); - } -}; -var spawn = (socketKey, errorCount = 0) => { - if (!isSpawned(socketKey) && !isConnecting(socketKey)) { - sockets[socketKey] = new WebSocket(socketKey); - events.once("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */, () => { - sockets[socketKey].close(); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, () => { - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - }); - sockets[socketKey].onopen = () => { - events.emit("SOCKET_OPENED" /* SOCKET_OPENED */); - }; - sockets[socketKey].onclose = () => { - }; - sockets[socketKey].onerror = (event) => { - if (++errorCount <= MAX_ERRORS) { - console.error( - `An error happened while trying to connect to WebSocket "${socketKey}". Trying again. ${errorCount} / ${MAX_ERRORS}`, - event.error - ); - return spawn(socketKey, errorCount); - } else { - events.emit("SOCKET_ONERROR" /* SOCKET_ONERROR */); - return errAsync( - new WebSocketConnectionError( - `Unable to connect to WebSocket ${socketKey}.` - ) - ); - } - }; - } - return waitForConnection(socketKey).andThen(() => okAsync(socketKey)).orElse((error) => errAsync(error)); -}; -var waitForConnection = (socketKey) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - if (!isSpawned(socketKey)) { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - resolve(void 0); - }); - events.on("SOCKET_ONERROR" /* SOCKET_ONERROR */, () => { - reject(new WebSocketConnectionError()); - }); - } else { - resolve(void 0); - } - }), - (error) => { - return ensureError(error); - } -); -var buildSocketUrl = (instanceUrl, pathname) => { - const url = new URL(instanceUrl); - if (!["ws:", "wss:"].includes(url.protocol)) { - url.protocol = url.protocol === "http:" ? "ws:" : "wss:"; - } - url.pathname += pathname; - return new URL(url.origin + url.pathname); -}; -var downloadSocketUrl = (lufiFile) => { - return buildSocketUrl( - new URL(lufiFile.serverUrl), - "download" /* DOWNLOAD */ + `/${lufiFile.keys.server}` - ).toString(); -}; -var tryParseJson = (data) => { - try { - const parsedObject = JSON.parse(data); - if (parsedObject && typeof parsedObject === "object") { - return parsedObject; - } - } catch (_e) { - } - return false; -}; -var isServerDownloadChunkSuccessMetadata = (message) => typeof message === "object" && message !== null && !("msg" in message); - -// src/worker/infos.ts -var isInitiated = false; -self.onmessage = (event) => { - if (!isInitiated) { - init(); - isInitiated = true; - } - events.on("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */, () => { - sockets[downloadSocketUrl(event.data.args.lufiFile)].close(); - self.postMessage({ event: "INFOS_RETRIEVED" /* INFOS_RETRIEVED */ }); - }); - retrieveInfos(event.data).mapErr((error) => { - self.postMessage({ - event: "OPERATION_FAILED" /* OPERATION_FAILED */, - error - }); - }); -}; -var retrieveInfos = (workerMessage) => downloadChunk(workerMessage.args.lufiFile, 0); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbHVmaS1zamNsQDEuMC44L25vZGVfbW9kdWxlcy9sdWZpLXNqY2wvc2pjbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbmV2ZXJ0aHJvd0A4LjEuMS9ub2RlX21vZHVsZXMvbmV2ZXJ0aHJvdy9kaXN0L2luZGV4LmVzLmpzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWNvbm5lY3Rpb24tZXJyb3IudHMiLCAiLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvc2hhcmVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9hcnJheWJ1ZmZlci1lbmNvZGluZ0AxLjEuMC9ub2RlX21vZHVsZXMvYXJyYXlidWZmZXItZW5jb2Rpbmcvc3JjL2Jhc2U2NC9lbmNvZGluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vYXJyYXlidWZmZXItZW5jb2RpbmdAMS4xLjAvbm9kZV9tb2R1bGVzL2FycmF5YnVmZmVyLWVuY29kaW5nL3NyYy9iYXNlNjQvc3RhbmRhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2FycmF5YnVmZmVyLWVuY29kaW5nQDEuMS4wL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci1lbmNvZGluZy9zcmMvYmFzZTY0L3VybC50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by9zamNsLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by93ZWIudHMiLCAiLi4vLi4vc3JjL2FwaS9jcnlwdG8udHMiLCAiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQudHMiLCAiLi4vLi4vc3JjL3dvcmtlci9pbmZvcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsICJcInVzZSBzdHJpY3RcIjt2YXIgc2pjbD17Y2lwaGVyOnt9LGhhc2g6e30sa2V5ZXhjaGFuZ2U6e30sbW9kZTp7fSxtaXNjOnt9LGNvZGVjOnt9LGV4Y2VwdGlvbjp7Y29ycnVwdDpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJDT1JSVVBUOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfSxpbnZhbGlkOmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIklOVkFMSUQ6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9LGJ1ZzpmdW5jdGlvbihhKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJCVUc6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9LG5vdFJlYWR5OmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIk5PVCBSRUFEWTogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX19fTtcbnNqY2wuY2lwaGVyLmFlcz1mdW5jdGlvbihhKXt0aGlzLndbMF1bMF1bMF18fHRoaXMuQygpO3ZhciBiLGMsZCxlLGY9dGhpcy53WzBdWzRdLGc9dGhpcy53WzFdO2I9YS5sZW5ndGg7dmFyIGg9MTtpZig0IT09YiYmNiE9PWImJjghPT1iKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52YWxpZCBhZXMga2V5IHNpemVcIik7dGhpcy5iPVtkPWEuc2xpY2UoMCksZT1bXV07Zm9yKGE9YjthPDQqYisyODthKyspe2M9ZFthLTFdO2lmKDA9PT1hJWJ8fDg9PT1iJiY0PT09YSViKWM9ZltjPj4+MjRdPDwyNF5mW2M+PjE2JjI1NV08PDE2XmZbYz4+OCYyNTVdPDw4XmZbYyYyNTVdLDA9PT1hJWImJihjPWM8PDheYz4+PjI0Xmg8PDI0LGg9aDw8MV4yODMqKGg+PjcpKTtkW2FdPWRbYS1iXV5jfWZvcihiPTA7YTtiKyssYS0tKWM9ZFtiJjM/YTphLTRdLGVbYl09ND49YXx8ND5iP2M6Z1swXVtmW2M+Pj4yNF1dXmdbMV1bZltjPj4xNiYyNTVdXV5nWzJdW2ZbYz4+OCYyNTVdXV5nWzNdW2ZbYyZcbjI1NV1dfTtcbnNqY2wuY2lwaGVyLmFlcy5wcm90b3R5cGU9e2VuY3J5cHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhKHRoaXMsYSwwKX0sZGVjcnlwdDpmdW5jdGlvbihhKXtyZXR1cm4gYWEodGhpcyxhLDEpfSx3OltbW10sW10sW10sW10sW11dLFtbXSxbXSxbXSxbXSxbXV1dLEM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndbMF0sYj10aGlzLndbMV0sYz1hWzRdLGQ9Yls0XSxlLGYsZyxoPVtdLGs9W10sbixsLG0scDtmb3IoZT0wOzB4MTAwPmU7ZSsrKWtbKGhbZV09ZTw8MV4yODMqKGU+PjcpKV5lXT1lO2ZvcihmPWc9MDshY1tmXTtmXj1ufHwxLGc9a1tnXXx8MSlmb3IobT1nXmc8PDFeZzw8Ml5nPDwzXmc8PDQsbT1tPj44Xm0mMjU1Xjk5LGNbZl09bSxkW21dPWYsbD1oW2U9aFtuPWhbZl1dXSxwPTB4MTAxMDEwMSpsXjB4MTAwMDEqZV4weDEwMSpuXjB4MTAxMDEwMCpmLGw9MHgxMDEqaFttXV4weDEwMTAxMDAqbSxlPTA7ND5lO2UrKylhW2VdW2ZdPWw9bDw8MjRebD4+PjgsYltlXVttXT1wPXA8PDI0XnA+Pj44O2ZvcihlPVxuMDs1PmU7ZSsrKWFbZV09YVtlXS5zbGljZSgwKSxiW2VdPWJbZV0uc2xpY2UoMCl9fTtcbmZ1bmN0aW9uIGFhKGEsYixjKXtpZig0IT09Yi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZhbGlkIGFlcyBibG9jayBzaXplXCIpO3ZhciBkPWEuYltjXSxlPWJbMF1eZFswXSxmPWJbYz8zOjFdXmRbMV0sZz1iWzJdXmRbMl07Yj1iW2M/MTozXV5kWzNdO3ZhciBoLGssbixsPWQubGVuZ3RoLzQtMixtLHA9NCx6PVswLDAsMCwwXTtoPWEud1tjXTthPWhbMF07dmFyIEE9aFsxXSxDPWhbMl0sQj1oWzNdLEQ9aFs0XTtmb3IobT0wO208bDttKyspaD1hW2U+Pj4yNF1eQVtmPj4xNiYyNTVdXkNbZz4+OCYyNTVdXkJbYiYyNTVdXmRbcF0saz1hW2Y+Pj4yNF1eQVtnPj4xNiYyNTVdXkNbYj4+OCYyNTVdXkJbZSYyNTVdXmRbcCsxXSxuPWFbZz4+PjI0XV5BW2I+PjE2JjI1NV1eQ1tlPj44JjI1NV1eQltmJjI1NV1eZFtwKzJdLGI9YVtiPj4+MjRdXkFbZT4+MTYmMjU1XV5DW2Y+PjgmMjU1XV5CW2cmMjU1XV5kW3ArM10scCs9NCxlPWgsZj1rLGc9bjtmb3IobT1cbjA7ND5tO20rKyl6W2M/MyYtbTptXT1EW2U+Pj4yNF08PDI0XkRbZj4+MTYmMjU1XTw8MTZeRFtnPj44JjI1NV08PDheRFtiJjI1NV1eZFtwKytdLGg9ZSxlPWYsZj1nLGc9YixiPWg7cmV0dXJuIHp9XG5zamNsLmJpdEFycmF5PXtiaXRTbGljZTpmdW5jdGlvbihhLGIsYyl7YT1zamNsLmJpdEFycmF5LlkoYS5zbGljZShiLzMyKSwzMi0oYiYzMSkpLnNsaWNlKDEpO3JldHVybiB2b2lkIDA9PT1jP2E6c2pjbC5iaXRBcnJheS5jbGFtcChhLGMtYil9LGV4dHJhY3Q6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU1hdGguZmxvb3IoLWItYyYzMSk7cmV0dXJuKChiK2MtMV5iKSYtMzI/YVtiLzMyfDBdPDwzMi1kXmFbYi8zMisxfDBdPj4+ZDphW2IvMzJ8MF0+Pj5kKSYoMTw8YyktMX0sY29uY2F0OmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RofHwwPT09Yi5sZW5ndGgpcmV0dXJuIGEuY29uY2F0KGIpO3ZhciBjPWFbYS5sZW5ndGgtMV0sZD1zamNsLmJpdEFycmF5LmdldFBhcnRpYWwoYyk7cmV0dXJuIDMyPT09ZD9hLmNvbmNhdChiKTpzamNsLmJpdEFycmF5LlkoYixkLGN8MCxhLnNsaWNlKDAsYS5sZW5ndGgtMSkpfSxiaXRMZW5ndGg6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7cmV0dXJuIDA9PT1cbmI/MDozMiooYi0xKStzamNsLmJpdEFycmF5LmdldFBhcnRpYWwoYVtiLTFdKX0sY2xhbXA6ZnVuY3Rpb24oYSxiKXtpZigzMiphLmxlbmd0aDxiKXJldHVybiBhO2E9YS5zbGljZSgwLE1hdGguY2VpbChiLzMyKSk7dmFyIGM9YS5sZW5ndGg7Yj1iJjMxOzA8YyYmYiYmKGFbYy0xXT1zamNsLmJpdEFycmF5LnBhcnRpYWwoYixhW2MtMV0mMjE0NzQ4MzY0OD4+Yi0xLDEpKTtyZXR1cm4gYX0scGFydGlhbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDMyPT09YT9iOihjP2J8MDpiPDwzMi1hKSsweDEwMDAwMDAwMDAwKmF9LGdldFBhcnRpYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoYS8weDEwMDAwMDAwMDAwKXx8MzJ9LGVxdWFsOmZ1bmN0aW9uKGEsYil7aWYoc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSkhPT1zamNsLmJpdEFycmF5LmJpdExlbmd0aChiKSlyZXR1cm4hMTt2YXIgYz0wLGQ7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKyljfD1hW2RdXmJbZF07cmV0dXJuIDA9PT1cbmN9LFk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7ZT0wO2Zvcih2b2lkIDA9PT1kJiYoZD1bXSk7MzI8PWI7Yi09MzIpZC5wdXNoKGMpLGM9MDtpZigwPT09YilyZXR1cm4gZC5jb25jYXQoYSk7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKylkLnB1c2goY3xhW2VdPj4+YiksYz1hW2VdPDwzMi1iO2U9YS5sZW5ndGg/YVthLmxlbmd0aC0xXTowO2E9c2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGUpO2QucHVzaChzamNsLmJpdEFycmF5LnBhcnRpYWwoYithJjMxLDMyPGIrYT9jOmQucG9wKCksMSkpO3JldHVybiBkfSxQOmZ1bmN0aW9uKGEsYil7cmV0dXJuW2FbMF1eYlswXSxhWzFdXmJbMV0sYVsyXV5iWzJdLGFbM11eYlszXV19LGJ5dGVzd2FwTTpmdW5jdGlvbihhKXt2YXIgYixjO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpYz1hW2JdLGFbYl09Yz4+PjI0fGM+Pj44JjB4ZmYwMHwoYyYweGZmMDApPDw4fGM8PDI0O3JldHVybiBhfX07XG5zamNsLmNvZGVjLnV0ZjhTdHJpbmc9e2Zyb21CaXRzOmZ1bmN0aW9uKGEpe3ZhciBiPVwiXCIsYz1zamNsLmJpdEFycmF5LmJpdExlbmd0aChhKSxkLGU7Zm9yKGQ9MDtkPGMvODtkKyspMD09PShkJjMpJiYoZT1hW2QvNF0pLGIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZT4+Pjg+Pj44Pj4+OCksZTw8PTg7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYikpfSx0b0JpdHM6ZnVuY3Rpb24oYSl7YT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYSkpO3ZhciBiPVtdLGMsZD0wO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZD1kPDw4fGEuY2hhckNvZGVBdChjKSwzPT09KGMmMykmJihiLnB1c2goZCksZD0wKTtjJjMmJmIucHVzaChzamNsLmJpdEFycmF5LnBhcnRpYWwoOCooYyYzKSxkKSk7cmV0dXJuIGJ9fTtcbnNqY2wuY29kZWMuaGV4PXtmcm9tQml0czpmdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliKz0oKGFbY118MCkrMHhmMDAwMDAwMDAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoNCk7cmV0dXJuIGIuc3Vic3RyKDAsc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSkvNCl9LHRvQml0czpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ7YT1hLnJlcGxhY2UoL1xcc3wweC9nLFwiXCIpO2Q9YS5sZW5ndGg7YT1hK1wiMDAwMDAwMDBcIjtmb3IoYj0wO2I8YS5sZW5ndGg7Yis9OCljLnB1c2gocGFyc2VJbnQoYS5zdWJzdHIoYiw4KSwxNileMCk7cmV0dXJuIHNqY2wuYml0QXJyYXkuY2xhbXAoYyw0KmQpfX07XG5zamNsLmNvZGVjLmJhc2U2ND17UzpcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIixmcm9tQml0czpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9XCJcIixlPTAsZj1zamNsLmNvZGVjLmJhc2U2NC5TLGc9MCxoPXNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpO2MmJihmPWYuc3Vic3RyKDAsNjIpK1wiLV9cIik7Zm9yKGM9MDs2KmQubGVuZ3RoPGg7KWQrPWYuY2hhckF0KChnXmFbY10+Pj5lKT4+PjI2KSw2PmU/KGc9YVtjXTw8Ni1lLGUrPTI2LGMrKyk6KGc8PD02LGUtPTYpO2Zvcig7ZC5sZW5ndGgmMyYmIWI7KWQrPVwiPVwiO3JldHVybiBkfSx0b0JpdHM6ZnVuY3Rpb24oYSxiKXthPWEucmVwbGFjZSgvXFxzfD0vZyxcIlwiKTt2YXIgYz1bXSxkLGU9MCxmPXNqY2wuY29kZWMuYmFzZTY0LlMsZz0wLGg7YiYmKGY9Zi5zdWJzdHIoMCw2MikrXCItX1wiKTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKXtoPWYuaW5kZXhPZihhLmNoYXJBdChkKSk7XG5pZigwPmgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJ0aGlzIGlzbid0IGJhc2U2NCFcIik7MjY8ZT8oZS09MjYsYy5wdXNoKGdeaD4+PmUpLGc9aDw8MzItZSk6KGUrPTYsZ149aDw8MzItZSl9ZSY1NiYmYy5wdXNoKHNqY2wuYml0QXJyYXkucGFydGlhbChlJjU2LGcsMSkpO3JldHVybiBjfX07c2pjbC5jb2RlYy5iYXNlNjR1cmw9e2Zyb21CaXRzOmZ1bmN0aW9uKGEpe3JldHVybiBzamNsLmNvZGVjLmJhc2U2NC5mcm9tQml0cyhhLDEsMSl9LHRvQml0czpmdW5jdGlvbihhKXtyZXR1cm4gc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGEsMSl9fTtzamNsLmhhc2guc2hhMjU2PWZ1bmN0aW9uKGEpe3RoaXMuYlswXXx8dGhpcy5DKCk7YT8odGhpcy5nPWEuZy5zbGljZSgwKSx0aGlzLmY9YS5mLnNsaWNlKDApLHRoaXMuYz1hLmMpOnRoaXMucmVzZXQoKX07c2pjbC5oYXNoLnNoYTI1Ni5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybihuZXcgc2pjbC5oYXNoLnNoYTI1NikudXBkYXRlKGEpLmZpbmFsaXplKCl9O1xuc2pjbC5oYXNoLnNoYTI1Ni5wcm90b3R5cGU9e2Jsb2NrU2l6ZTo1MTIscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmc9dGhpcy5vLnNsaWNlKDApO3RoaXMuZj1bXTt0aGlzLmM9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe1wic3RyaW5nXCI9PT10eXBlb2YgYSYmKGE9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhKSk7dmFyIGIsYz10aGlzLmY9c2pjbC5iaXRBcnJheS5jb25jYXQodGhpcy5mLGEpO2I9dGhpcy5jO2E9dGhpcy5jPWIrc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSk7aWYoMHgxZmZmZmZmZmZmZmZmZjxhKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiQ2Fubm90IGhhc2ggbW9yZSB0aGFuIDJeNTMgLSAxIGJpdHNcIik7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7dmFyIGQ9bmV3IFVpbnQzMkFycmF5KGMpLGU9MDtmb3IoYj01MTIrYi0oNTEyK2ImMHgxZmYpO2I8PWE7Yis9NTEyKXRoaXMubChkLnN1YmFycmF5KDE2KmUsXG4xNiooZSsxKSkpLGUrPTE7Yy5zcGxpY2UoMCwxNiplKX1lbHNlIGZvcihiPTUxMitiLSg1MTIrYiYweDFmZik7Yjw9YTtiKz01MTIpdGhpcy5sKGMuc3BsaWNlKDAsMTYpKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuZixjPXRoaXMuZyxiPXNqY2wuYml0QXJyYXkuY29uY2F0KGIsW3NqY2wuYml0QXJyYXkucGFydGlhbCgxLDEpXSk7Zm9yKGE9Yi5sZW5ndGgrMjthJjE1O2ErKyliLnB1c2goMCk7Yi5wdXNoKE1hdGguZmxvb3IodGhpcy5jLzB4MTAwMDAwMDAwKSk7Zm9yKGIucHVzaCh0aGlzLmN8MCk7Yi5sZW5ndGg7KXRoaXMubChiLnNwbGljZSgwLDE2KSk7dGhpcy5yZXNldCgpO3JldHVybiBjfSxvOltdLGI6W10sQzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIDB4MTAwMDAwMDAwKihhLU1hdGguZmxvb3IoYSkpfDB9Zm9yKHZhciBiPTAsYz0yLGQsZTs2ND5iO2MrKyl7ZT0hMDtmb3IoZD0yO2QqZDw9YztkKyspaWYoMD09PWMlZCl7ZT1cbiExO2JyZWFrfWUmJig4PmImJih0aGlzLm9bYl09YShNYXRoLnBvdyhjLC41KSkpLHRoaXMuYltiXT1hKE1hdGgucG93KGMsMS8zKSksYisrKX19LGw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpcy5nLGY9dGhpcy5iLGc9ZVswXSxoPWVbMV0saz1lWzJdLG49ZVszXSxsPWVbNF0sbT1lWzVdLHA9ZVs2XSx6PWVbN107Zm9yKGI9MDs2ND5iO2IrKykxNj5iP2M9YVtiXTooYz1hW2IrMSYxNV0sZD1hW2IrMTQmMTVdLGM9YVtiJjE1XT0oYz4+PjdeYz4+PjE4XmM+Pj4zXmM8PDI1XmM8PDE0KSsoZD4+PjE3XmQ+Pj4xOV5kPj4+MTBeZDw8MTVeZDw8MTMpK2FbYiYxNV0rYVtiKzkmMTVdfDApLGM9Yyt6KyhsPj4+Nl5sPj4+MTFebD4+PjI1Xmw8PDI2Xmw8PDIxXmw8PDcpKyhwXmwmKG1ecCkpK2ZbYl0sej1wLHA9bSxtPWwsbD1uK2N8MCxuPWssaz1oLGg9ZyxnPWMrKGgma15uJihoXmspKSsoaD4+PjJeaD4+PjEzXmg+Pj4yMl5oPDwzMF5oPDwxOV5oPDwxMCl8MDtlWzBdPWVbMF0rZ3xcbjA7ZVsxXT1lWzFdK2h8MDtlWzJdPWVbMl0ra3wwO2VbM109ZVszXStufDA7ZVs0XT1lWzRdK2x8MDtlWzVdPWVbNV0rbXwwO2VbNl09ZVs2XStwfDA7ZVs3XT1lWzddK3p8MH19O3NqY2wuaGFzaC5zaGE1MTI9ZnVuY3Rpb24oYSl7dGhpcy5iWzBdfHx0aGlzLkMoKTthPyh0aGlzLmc9YS5nLnNsaWNlKDApLHRoaXMuZj1hLmYuc2xpY2UoMCksdGhpcy5jPWEuYyk6dGhpcy5yZXNldCgpfTtzamNsLmhhc2guc2hhNTEyLmhhc2g9ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyBzamNsLmhhc2guc2hhNTEyKS51cGRhdGUoYSkuZmluYWxpemUoKX07XG5zamNsLmhhc2guc2hhNTEyLnByb3RvdHlwZT17YmxvY2tTaXplOjEwMjQscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmc9dGhpcy5vLnNsaWNlKDApO3RoaXMuZj1bXTt0aGlzLmM9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe1wic3RyaW5nXCI9PT10eXBlb2YgYSYmKGE9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhKSk7dmFyIGIsYz10aGlzLmY9c2pjbC5iaXRBcnJheS5jb25jYXQodGhpcy5mLGEpO2I9dGhpcy5jO2E9dGhpcy5jPWIrc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSk7aWYoMHgxZmZmZmZmZmZmZmZmZjxhKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiQ2Fubm90IGhhc2ggbW9yZSB0aGFuIDJeNTMgLSAxIGJpdHNcIik7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7dmFyIGQ9bmV3IFVpbnQzMkFycmF5KGMpLGU9MDtmb3IoYj0xMDI0K2ItKDEwMjQrYiYxMDIzKTtiPD1hO2IrPTEwMjQpdGhpcy5sKGQuc3ViYXJyYXkoMzIqXG5lLDMyKihlKzEpKSksZSs9MTtjLnNwbGljZSgwLDMyKmUpfWVsc2UgZm9yKGI9MTAyNCtiLSgxMDI0K2ImMTAyMyk7Yjw9YTtiKz0xMDI0KXRoaXMubChjLnNwbGljZSgwLDMyKSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLmYsYz10aGlzLmcsYj1zamNsLmJpdEFycmF5LmNvbmNhdChiLFtzamNsLmJpdEFycmF5LnBhcnRpYWwoMSwxKV0pO2ZvcihhPWIubGVuZ3RoKzQ7YSYzMTthKyspYi5wdXNoKDApO2IucHVzaCgwKTtiLnB1c2goMCk7Yi5wdXNoKE1hdGguZmxvb3IodGhpcy5jLzB4MTAwMDAwMDAwKSk7Zm9yKGIucHVzaCh0aGlzLmN8MCk7Yi5sZW5ndGg7KXRoaXMubChiLnNwbGljZSgwLDMyKSk7dGhpcy5yZXNldCgpO3JldHVybiBjfSxvOltdLGlhOlsxMjM3MjIzMiwxMzI4MTA4Myw5NzYyODU5LDE5MTQ2MDksMTUxMDY3NjksNDA5MDkxMSw0MzA4MzMxLDgyNjYxMDVdLGI6W10sa2E6WzI2NjYwMTgsMTU2ODkxNjUsNTA2MTQyMyw5MDM0Njg0LFxuNDc2NDk4NCwzODA5NTMsMTY1ODc3OSw3MTc2NDcyLDE5NzE4Niw3MzY4NjM4LDE0OTg3OTE2LDE2NzU3OTg2LDgwOTYxMTEsMTQ4MDM2OSwxMzA0NjMyNSw2ODkxMTU2LDE1ODEzMzMwLDUxODcwNDMsOTIyOTc0OSwxMTMxMjIyOSwyODE4Njc3LDEwOTM3NDc1LDQzMjQzMDgsMTEzNTU0MSw2NzQxOTMxLDExODA5Mjk2LDE2NDU4MDQ3LDE1NjY2OTE2LDExMDQ2ODUwLDY5ODE0OSwyMjk5OTksOTQ1Nzc2LDEzNzc0ODQ0LDI1NDE4NjIsMTI4NTYwNDUsOTgxMDkxMSwxMTQ5NDM2Niw3ODQ0NTIwLDE1NTc2ODA2LDg1MzMzMDcsMTU3OTUwNDQsNDMzNzY2NSwxNjI5MTcyOSw1NTUzNzEyLDE1Njg0MTIwLDY2NjI0MTYsNzQxMzgwMiwxMjMwODkyMCwxMzgxNjAwOCw0MzAzNjk5LDkzNjY0MjUsMTAxNzY2ODAsMTMxOTU4NzUsNDI5NTM3MSw2NTQ2MjkxLDExNzEyNjc1LDE1NzA4OTI0LDE1MTk0NTYsMTU3NzI1MzAsNjU2ODQyOCw2NDk1Nzg0LDg1NjgyOTcsMTMwMDcxMjUsNzQ5MjM5NSwyNTE1MzU2LFxuMTI2MzI1ODMsMTQ3NDAyNTQsNzI2MjU4NCwxNTM1OTMwLDEzMTQ2Mjc4LDE2MzIxOTY2LDE4NTMyMTEsMjk0Mjc2LDEzMDUxMDI3LDEzMjIxNTY0LDEwNTE5ODAsNDA4MDMxMCw2NjUxNDM0LDE0MDg4OTQwLDQ2NzU2MDddLEM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiAweDEwMDAwMDAwMCooYS1NYXRoLmZsb29yKGEpKXwwfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDB4MTAwMDAwMDAwMDAqKGEtTWF0aC5mbG9vcihhKSkmMjU1fWZvcih2YXIgYz0wLGQ9MixlLGY7ODA+YztkKyspe2Y9ITA7Zm9yKGU9MjtlKmU8PWQ7ZSsrKWlmKDA9PT1kJWUpe2Y9ITE7YnJlYWt9ZiYmKDg+YyYmKHRoaXMub1syKmNdPWEoTWF0aC5wb3coZCwuNSkpLHRoaXMub1syKmMrMV09YihNYXRoLnBvdyhkLC41KSk8PDI0fHRoaXMuaWFbY10pLHRoaXMuYlsyKmNdPWEoTWF0aC5wb3coZCwxLzMpKSx0aGlzLmJbMipjKzFdPWIoTWF0aC5wb3coZCwxLzMpKTw8MjR8dGhpcy5rYVtjXSxjKyspfX0sbDpmdW5jdGlvbihhKXt2YXIgYixcbmMsZD10aGlzLmcsZT10aGlzLmIsZj1kWzBdLGc9ZFsxXSxoPWRbMl0saz1kWzNdLG49ZFs0XSxsPWRbNV0sbT1kWzZdLHA9ZFs3XSx6PWRbOF0sQT1kWzldLEM9ZFsxMF0sQj1kWzExXSxEPWRbMTJdLFA9ZFsxM10sZWE9ZFsxNF0sUT1kWzE1XSx0O2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe3Q9QXJyYXkoMTYwKTtmb3IodmFyIHI9MDszMj5yO3IrKyl0W3JdPWFbcl19ZWxzZSB0PWE7dmFyIHI9Zix1PWcsRz1oLEU9ayxIPW4sRj1sLFY9bSxJPXAsdz16LHY9QSxSPUMsSj1CLFM9RCxLPVAsVz1lYSxMPVE7Zm9yKGE9MDs4MD5hO2ErKyl7aWYoMTY+YSliPXRbMiphXSxjPXRbMiphKzFdO2Vsc2V7Yz10WzIqKGEtMTUpXTt2YXIgcT10WzIqKGEtMTUpKzFdO2I9KHE8PDMxfGM+Pj4xKV4ocTw8MjR8Yz4+PjgpXmM+Pj43O3ZhciB4PShjPDwzMXxxPj4+MSleKGM8PDI0fHE+Pj44KV4oYzw8MjV8cT4+PjcpO2M9dFsyKihhLTIpXTt2YXIgeT10WzIqKGEtMikrMV0sXG5xPSh5PDwxM3xjPj4+MTkpXihjPDwzfHk+Pj4yOSleYz4+PjYseT0oYzw8MTN8eT4+PjE5KV4oeTw8M3xjPj4+MjkpXihjPDwyNnx5Pj4+NiksWD10WzIqKGEtNyldLFk9dFsyKihhLTE2KV0sTT10WzIqKGEtMTYpKzFdO2M9eCt0WzIqKGEtNykrMV07Yj1iK1grKGM+Pj4wPHg+Pj4wPzE6MCk7Yys9eTtiKz1xKyhjPj4+MDx5Pj4+MD8xOjApO2MrPU07Yis9WSsoYz4+PjA8TT4+PjA/MTowKX10WzIqYV09Ynw9MDt0WzIqYSsxXT1jfD0wO3ZhciBYPXcmUl5+dyZTLGZhPXYmSl5+diZLLHk9ciZHXnImSF5HJkgsamE9dSZFXnUmRl5FJkYsWT0odTw8NHxyPj4+MjgpXihyPDwzMHx1Pj4+MileKHI8PDI1fHU+Pj43KSxNPShyPDw0fHU+Pj4yOCleKHU8PDMwfHI+Pj4yKV4odTw8MjV8cj4+PjcpLGthPWVbMiphXSxnYT1lWzIqYSsxXSxxPUwrKCh3PDwxOHx2Pj4+MTQpXih3PDwxNHx2Pj4+MTgpXih2PDwyM3x3Pj4+OSkpLHg9VysoKHY8PDE4fHc+Pj4xNCleKHY8PDE0fHc+Pj4xOCleKHc8PFxuMjN8dj4+PjkpKSsocT4+PjA8TD4+PjA/MTowKSxxPXErZmEseD14KyhYKyhxPj4+MDxmYT4+PjA/MTowKSkscT1xK2dhLHg9eCsoa2ErKHE+Pj4wPGdhPj4+MD8xOjApKSxxPXErY3wwLHg9eCsoYisocT4+PjA8Yz4+PjA/MTowKSk7Yz1NK2phO2I9WSt5KyhjPj4+MDxNPj4+MD8xOjApO1c9UztMPUs7Uz1SO0s9SjtSPXc7Sj12O3Y9SStxfDA7dz1WK3grKHY+Pj4wPEk+Pj4wPzE6MCl8MDtWPUg7ST1GO0g9RztGPUU7Rz1yO0U9dTt1PXErY3wwO3I9eCtiKyh1Pj4+MDxxPj4+MD8xOjApfDB9Zz1kWzFdPWcrdXwwO2RbMF09ZityKyhnPj4+MDx1Pj4+MD8xOjApfDA7az1kWzNdPWsrRXwwO2RbMl09aCtHKyhrPj4+MDxFPj4+MD8xOjApfDA7bD1kWzVdPWwrRnwwO2RbNF09bitIKyhsPj4+MDxGPj4+MD8xOjApfDA7cD1kWzddPXArSXwwO2RbNl09bStWKyhwPj4+MDxJPj4+MD8xOjApfDA7QT1kWzldPUErdnwwO2RbOF09eit3KyhBPj4+MDx2Pj4+MD8xOjApfDA7Qj1kWzExXT1CK0p8XG4wO2RbMTBdPUMrUisoQj4+PjA8Sj4+PjA/MTowKXwwO1A9ZFsxM109UCtLfDA7ZFsxMl09RCtTKyhQPj4+MDxLPj4+MD8xOjApfDA7UT1kWzE1XT1RK0x8MDtkWzE0XT1lYStXKyhRPj4+MDxMPj4+MD8xOjApfDB9fTtcbnNqY2wubW9kZS5jY209e25hbWU6XCJjY21cIixGOltdLGxpc3RlblByb2dyZXNzOmZ1bmN0aW9uKGEpe3NqY2wubW9kZS5jY20uRi5wdXNoKGEpfSx1bkxpc3RlblByb2dyZXNzOmZ1bmN0aW9uKGEpe2E9c2pjbC5tb2RlLmNjbS5GLmluZGV4T2YoYSk7LTE8YSYmc2pjbC5tb2RlLmNjbS5GLnNwbGljZShhLDEpfSxkYTpmdW5jdGlvbihhKXt2YXIgYj1zamNsLm1vZGUuY2NtLkYuc2xpY2UoKSxjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKz0xKWJbY10oYSl9LGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnPWIuc2xpY2UoMCksaD1zamNsLmJpdEFycmF5LGs9aC5iaXRMZW5ndGgoYykvOCxuPWguYml0TGVuZ3RoKGcpLzg7ZT1lfHw2NDtkPWR8fFtdO2lmKDc+ayl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImNjbTogaXYgbXVzdCBiZSBhdCBsZWFzdCA3IGJ5dGVzXCIpO2ZvcihmPTI7ND5mJiZuPj4+OCpmO2YrKyk7ZjwxNS1rJiYoZj0xNS1rKTtjPWguY2xhbXAoYyxcbjgqKDE1LWYpKTtiPXNqY2wubW9kZS5jY20uVShhLGIsYyxkLGUsZik7Zz1zamNsLm1vZGUuY2NtLlYoYSxnLGMsYixlLGYpO3JldHVybiBoLmNvbmNhdChnLmRhdGEsZy50YWcpfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQsZSl7ZT1lfHw2NDtkPWR8fFtdO3ZhciBmPXNqY2wuYml0QXJyYXksZz1mLmJpdExlbmd0aChjKS84LGg9Zi5iaXRMZW5ndGgoYiksaz1mLmNsYW1wKGIsaC1lKSxuPWYuYml0U2xpY2UoYixoLWUpLGg9KGgtZSkvODtpZig3PmcpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGl2IG11c3QgYmUgYXQgbGVhc3QgNyBieXRlc1wiKTtmb3IoYj0yOzQ+YiYmaD4+PjgqYjtiKyspO2I8MTUtZyYmKGI9MTUtZyk7Yz1mLmNsYW1wKGMsOCooMTUtYikpO2s9c2pjbC5tb2RlLmNjbS5WKGEsayxjLG4sZSxiKTthPXNqY2wubW9kZS5jY20uVShhLGsuZGF0YSxjLGQsZSxiKTtpZighZi5lcXVhbChrLnRhZyxhKSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uY29ycnVwdChcImNjbTogdGFnIGRvZXNuJ3QgbWF0Y2hcIik7XG5yZXR1cm4gay5kYXRhfSxtYTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9W10saD1zamNsLmJpdEFycmF5LGs9aC5QO2Q9W2gucGFydGlhbCg4LChiLmxlbmd0aD82NDowKXxkLTI8PDJ8Zi0xKV07ZD1oLmNvbmNhdChkLGMpO2RbM118PWU7ZD1hLmVuY3J5cHQoZCk7aWYoYi5sZW5ndGgpZm9yKGM9aC5iaXRMZW5ndGgoYikvOCw2NTI3OT49Yz9nPVtoLnBhcnRpYWwoMTYsYyldOjB4ZmZmZmZmZmY+PWMmJihnPWguY29uY2F0KFtoLnBhcnRpYWwoMTYsNjU1MzQpXSxbY10pKSxnPWguY29uY2F0KGcsYiksYj0wO2I8Zy5sZW5ndGg7Yis9NClkPWEuZW5jcnlwdChrKGQsZy5zbGljZShiLGIrNCkuY29uY2F0KFswLDAsMF0pKSk7cmV0dXJuIGR9LFU6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPXNqY2wuYml0QXJyYXksaD1nLlA7ZS89ODtpZihlJTJ8fDQ+ZXx8MTY8ZSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImNjbTogaW52YWxpZCB0YWcgbGVuZ3RoXCIpO1xuaWYoMHhmZmZmZmZmZjxkLmxlbmd0aHx8MHhmZmZmZmZmZjxiLmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwiY2NtOiBjYW4ndCBkZWFsIHdpdGggNEdpQiBvciBtb3JlIGRhdGFcIik7Yz1zamNsLm1vZGUuY2NtLm1hKGEsZCxjLGUsZy5iaXRMZW5ndGgoYikvOCxmKTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCs9NCljPWEuZW5jcnlwdChoKGMsYi5zbGljZShkLGQrNCkuY29uY2F0KFswLDAsMF0pKSk7cmV0dXJuIGcuY2xhbXAoYyw4KmUpfSxWOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZyxoPXNqY2wuYml0QXJyYXk7Zz1oLlA7dmFyIGs9Yi5sZW5ndGgsbj1oLmJpdExlbmd0aChiKSxsPWsvNTAsbT1sO2M9aC5jb25jYXQoW2gucGFydGlhbCg4LGYtMSldLGMpLmNvbmNhdChbMCwwLDBdKS5zbGljZSgwLDQpO2Q9aC5iaXRTbGljZShnKGQsYS5lbmNyeXB0KGMpKSwwLGUpO2lmKCFrKXJldHVybnt0YWc6ZCxkYXRhOltdfTtmb3IoZz0wO2c8aztnKz00KWc+bCYmKHNqY2wubW9kZS5jY20uZGEoZy9cbmspLGwrPW0pLGNbM10rKyxlPWEuZW5jcnlwdChjKSxiW2ddXj1lWzBdLGJbZysxXV49ZVsxXSxiW2crMl1ePWVbMl0sYltnKzNdXj1lWzNdO3JldHVybnt0YWc6ZCxkYXRhOmguY2xhbXAoYixuKX19fTtzamNsLm1pc2MuaG1hYz1mdW5jdGlvbihhLGIpe3RoaXMuVz1iPWJ8fHNqY2wuaGFzaC5zaGEyNTY7dmFyIGM9W1tdLFtdXSxkLGU9Yi5wcm90b3R5cGUuYmxvY2tTaXplLzMyO3RoaXMuQj1bbmV3IGIsbmV3IGJdO2EubGVuZ3RoPmUmJihhPWIuaGFzaChhKSk7Zm9yKGQ9MDtkPGU7ZCsrKWNbMF1bZF09YVtkXV45MDk1MjI0ODYsY1sxXVtkXT1hW2RdXjE1NDk1NTY4Mjg7dGhpcy5CWzBdLnVwZGF0ZShjWzBdKTt0aGlzLkJbMV0udXBkYXRlKGNbMV0pO3RoaXMuTz1uZXcgYih0aGlzLkJbMF0pfTtcbnNqY2wubWlzYy5obWFjLnByb3RvdHlwZS5lbmNyeXB0PXNqY2wubWlzYy5obWFjLnByb3RvdHlwZS5tYWM9ZnVuY3Rpb24oYSl7aWYodGhpcy5aKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiZW5jcnlwdCBvbiBhbHJlYWR5IHVwZGF0ZWQgaG1hYyBjYWxsZWQhXCIpO3RoaXMudXBkYXRlKGEpO3JldHVybiB0aGlzLmRpZ2VzdChhKX07c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5PPW5ldyB0aGlzLlcodGhpcy5CWzBdKTt0aGlzLlo9ITF9O3NqY2wubWlzYy5obWFjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy5aPSEwO3RoaXMuTy51cGRhdGUoYSl9O3NqY2wubWlzYy5obWFjLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk8uZmluYWxpemUoKSxhPShuZXcgdGhpcy5XKHRoaXMuQlsxXSkpLnVwZGF0ZShhKS5maW5hbGl6ZSgpO3RoaXMucmVzZXQoKTtyZXR1cm4gYX07XG5zamNsLm1pc2MucGJrZGYyPWZ1bmN0aW9uKGEsYixjLGQsZSl7Yz1jfHwxRTQ7aWYoMD5kfHwwPmMpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZhbGlkIHBhcmFtcyB0byBwYmtkZjJcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYoYT1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGEpKTtcInN0cmluZ1wiPT09dHlwZW9mIGImJihiPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYikpO2U9ZXx8c2pjbC5taXNjLmhtYWM7YT1uZXcgZShhKTt2YXIgZixnLGgsayxuPVtdLGw9c2pjbC5iaXRBcnJheTtmb3Ioaz0xOzMyKm4ubGVuZ3RoPChkfHwxKTtrKyspe2U9Zj1hLmVuY3J5cHQobC5jb25jYXQoYixba10pKTtmb3IoZz0xO2c8YztnKyspZm9yKGY9YS5lbmNyeXB0KGYpLGg9MDtoPGYubGVuZ3RoO2grKyllW2hdXj1mW2hdO249bi5jb25jYXQoZSl9ZCYmKG49bC5jbGFtcChuLGQpKTtyZXR1cm4gbn07XG5zamNsLnBybmc9ZnVuY3Rpb24oYSl7dGhpcy5oPVtuZXcgc2pjbC5oYXNoLnNoYTI1Nl07dGhpcy5zPVswXTt0aGlzLk49MDt0aGlzLkc9e307dGhpcy5NPTA7dGhpcy5UPXt9O3RoaXMuWD10aGlzLmk9dGhpcy51PXRoaXMuZmE9MDt0aGlzLmI9WzAsMCwwLDAsMCwwLDAsMF07dGhpcy5tPVswLDAsMCwwXTt0aGlzLks9dm9pZCAwO3RoaXMuTD1hO3RoaXMuRD0hMTt0aGlzLko9e3Byb2dyZXNzOnt9LHNlZWRlZDp7fX07dGhpcy5BPXRoaXMuZWE9MDt0aGlzLkg9MTt0aGlzLkk9Mjt0aGlzLmFhPTB4MTAwMDA7dGhpcy5SPVswLDQ4LDY0LDk2LDEyOCwxOTIsMHgxMDAsMzg0LDUxMiw3NjgsMTAyNF07dGhpcy5iYT0zRTQ7dGhpcy4kPTgwfTtcbnNqY2wucHJuZy5wcm90b3R5cGU9e3JhbmRvbVdvcmRzOmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZDtkPXRoaXMuaXNSZWFkeShiKTt2YXIgZTtpZihkPT09dGhpcy5BKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5ub3RSZWFkeShcImdlbmVyYXRvciBpc24ndCBzZWVkZWRcIik7aWYoZCZ0aGlzLkkpe2Q9IShkJnRoaXMuSCk7ZT1bXTt2YXIgZj0wLGc7dGhpcy5YPWVbMF09KG5ldyBEYXRlKS52YWx1ZU9mKCkrdGhpcy5iYTtmb3IoZz0wOzE2Pmc7ZysrKWUucHVzaCgweDEwMDAwMDAwMCpNYXRoLnJhbmRvbSgpfDApO2ZvcihnPTA7Zzx0aGlzLmgubGVuZ3RoJiYoZT1lLmNvbmNhdCh0aGlzLmhbZ10uZmluYWxpemUoKSksZis9dGhpcy5zW2ddLHRoaXMuc1tnXT0wLGR8fCEodGhpcy5OJjE8PGcpKTtnKyspO3RoaXMuTj49MTw8dGhpcy5oLmxlbmd0aCYmKHRoaXMuaC5wdXNoKG5ldyBzamNsLmhhc2guc2hhMjU2KSx0aGlzLnMucHVzaCgwKSk7dGhpcy5pLT1mO2Y+dGhpcy51JiYodGhpcy51PVxuZik7dGhpcy5OKys7dGhpcy5iPXNqY2wuaGFzaC5zaGEyNTYuaGFzaCh0aGlzLmIuY29uY2F0KGUpKTt0aGlzLks9bmV3IHNqY2wuY2lwaGVyLmFlcyh0aGlzLmIpO2ZvcihkPTA7ND5kJiYodGhpcy5tW2RdPXRoaXMubVtkXSsxfDAsIXRoaXMubVtkXSk7ZCsrKTt9Zm9yKGQ9MDtkPGE7ZCs9NCkwPT09KGQrMSkldGhpcy5hYSYmYmEodGhpcyksZT1OKHRoaXMpLGMucHVzaChlWzBdLGVbMV0sZVsyXSxlWzNdKTtiYSh0aGlzKTtyZXR1cm4gYy5zbGljZSgwLGEpfSxzZXREZWZhdWx0UGFyYW5vaWE6ZnVuY3Rpb24oYSxiKXtpZigwPT09YSYmXCJTZXR0aW5nIHBhcmFub2lhPTAgd2lsbCBydWluIHlvdXIgc2VjdXJpdHk7IHVzZSBpdCBvbmx5IGZvciB0ZXN0aW5nXCIhPT1iKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiU2V0dGluZyBwYXJhbm9pYT0wIHdpbGwgcnVpbiB5b3VyIHNlY3VyaXR5OyB1c2UgaXQgb25seSBmb3IgdGVzdGluZ1wiKTt0aGlzLkw9YX0sYWRkRW50cm9weTpmdW5jdGlvbihhLFxuYixjKXtjPWN8fFwidXNlclwiO3ZhciBkLGUsZj0obmV3IERhdGUpLnZhbHVlT2YoKSxnPXRoaXMuR1tjXSxoPXRoaXMuaXNSZWFkeSgpLGs9MDtkPXRoaXMuVFtjXTt2b2lkIDA9PT1kJiYoZD10aGlzLlRbY109dGhpcy5mYSsrKTt2b2lkIDA9PT1nJiYoZz10aGlzLkdbY109MCk7dGhpcy5HW2NdPSh0aGlzLkdbY10rMSkldGhpcy5oLmxlbmd0aDtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJudW1iZXJcIjp2b2lkIDA9PT1iJiYoYj0xKTt0aGlzLmhbZ10udXBkYXRlKFtkLHRoaXMuTSsrLDEsYixmLDEsYXwwXSk7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOmM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpO2lmKFwiW29iamVjdCBVaW50MzJBcnJheV1cIj09PWMpe2U9W107Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyllLnB1c2goYVtjXSk7YT1lfWVsc2UgZm9yKFwiW29iamVjdCBBcnJheV1cIiE9PWMmJihrPTEpLGM9MDtjPGEubGVuZ3RoJiYhaztjKyspXCJudW1iZXJcIiE9PXR5cGVvZiBhW2NdJiZcbihrPTEpO2lmKCFrKXtpZih2b2lkIDA9PT1iKWZvcihjPWI9MDtjPGEubGVuZ3RoO2MrKylmb3IoZT1hW2NdOzA8ZTspYisrLGU9ZT4+PjE7dGhpcy5oW2ddLnVwZGF0ZShbZCx0aGlzLk0rKywyLGIsZixhLmxlbmd0aF0uY29uY2F0KGEpKX1icmVhaztjYXNlIFwic3RyaW5nXCI6dm9pZCAwPT09YiYmKGI9YS5sZW5ndGgpO3RoaXMuaFtnXS51cGRhdGUoW2QsdGhpcy5NKyssMyxiLGYsYS5sZW5ndGhdKTt0aGlzLmhbZ10udXBkYXRlKGEpO2JyZWFrO2RlZmF1bHQ6az0xfWlmKGspdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcInJhbmRvbTogYWRkRW50cm9weSBvbmx5IHN1cHBvcnRzIG51bWJlciwgYXJyYXkgb2YgbnVtYmVycyBvciBzdHJpbmdcIik7dGhpcy5zW2ddKz1iO3RoaXMuaSs9YjtoPT09dGhpcy5BJiYodGhpcy5pc1JlYWR5KCkhPT10aGlzLkEmJmNhKFwic2VlZGVkXCIsTWF0aC5tYXgodGhpcy51LHRoaXMuaSkpLGNhKFwicHJvZ3Jlc3NcIix0aGlzLmdldFByb2dyZXNzKCkpKX0sXG5pc1JlYWR5OmZ1bmN0aW9uKGEpe2E9dGhpcy5SW3ZvaWQgMCE9PWE/YTp0aGlzLkxdO3JldHVybiB0aGlzLnUmJnRoaXMudT49YT90aGlzLnNbMF0+dGhpcy4kJiYobmV3IERhdGUpLnZhbHVlT2YoKT50aGlzLlg/dGhpcy5JfHRoaXMuSDp0aGlzLkg6dGhpcy5pPj1hP3RoaXMuSXx0aGlzLkE6dGhpcy5BfSxnZXRQcm9ncmVzczpmdW5jdGlvbihhKXthPXRoaXMuUlthP2E6dGhpcy5MXTtyZXR1cm4gdGhpcy51Pj1hPzE6dGhpcy5pPmE/MTp0aGlzLmkvYX0sc3RhcnRDb2xsZWN0b3JzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRCl7dGhpcy5hPXtsb2FkVGltZUNvbGxlY3RvcjpPKHRoaXMsdGhpcy5sYSksbW91c2VDb2xsZWN0b3I6Tyh0aGlzLHRoaXMubmEpLGtleWJvYXJkQ29sbGVjdG9yOk8odGhpcyx0aGlzLmphKSxhY2NlbGVyb21ldGVyQ29sbGVjdG9yOk8odGhpcyx0aGlzLmNhKSx0b3VjaENvbGxlY3RvcjpPKHRoaXMsdGhpcy5wYSl9O2lmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLFxudGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuYS5tb3VzZUNvbGxlY3RvciwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3RvciwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJkZXZpY2Vtb3Rpb25cIix0aGlzLmEuYWNjZWxlcm9tZXRlckNvbGxlY3RvciwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLmEudG91Y2hDb2xsZWN0b3IsITEpO2Vsc2UgaWYoZG9jdW1lbnQuYXR0YWNoRXZlbnQpZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbmxvYWRcIix0aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IpLGRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25tb3VzZW1vdmVcIix0aGlzLmEubW91c2VDb2xsZWN0b3IpLGRvY3VtZW50LmF0dGFjaEV2ZW50KFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IpO2Vsc2UgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImNhbid0IGF0dGFjaCBldmVudFwiKTtcbnRoaXMuRD0hMH19LHN0b3BDb2xsZWN0b3JzOmZ1bmN0aW9uKCl7dGhpcy5EJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXI/KHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLmEubW91c2VDb2xsZWN0b3IsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZGV2aWNlbW90aW9uXCIsdGhpcy5hLmFjY2VsZXJvbWV0ZXJDb2xsZWN0b3IsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5hLnRvdWNoQ29sbGVjdG9yLCExKSk6ZG9jdW1lbnQuZGV0YWNoRXZlbnQmJihkb2N1bWVudC5kZXRhY2hFdmVudChcIm9ubG9hZFwiLHRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciksZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJvbm1vdXNlbW92ZVwiLFxudGhpcy5hLm1vdXNlQ29sbGVjdG9yKSxkb2N1bWVudC5kZXRhY2hFdmVudChcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yKSksdGhpcy5EPSExKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3RoaXMuSlthXVt0aGlzLmVhKytdPWJ9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5KW2FdLGY9W107Zm9yKGQgaW4gZSllLmhhc093blByb3BlcnR5KGQpJiZlW2RdPT09YiYmZi5wdXNoKGQpO2ZvcihjPTA7YzxmLmxlbmd0aDtjKyspZD1mW2NdLGRlbGV0ZSBlW2RdfSxqYTpmdW5jdGlvbigpe1QodGhpcywxKX0sbmE6ZnVuY3Rpb24oYSl7dmFyIGIsYzt0cnl7Yj1hLnh8fGEuY2xpZW50WHx8YS5vZmZzZXRYfHwwLGM9YS55fHxhLmNsaWVudFl8fGEub2Zmc2V0WXx8MH1jYXRjaChkKXtjPWI9MH0wIT1iJiYwIT1jJiZ0aGlzLmFkZEVudHJvcHkoW2IsY10sMixcIm1vdXNlXCIpO1QodGhpcywwKX0scGE6ZnVuY3Rpb24oYSl7YT1cbmEudG91Y2hlc1swXXx8YS5jaGFuZ2VkVG91Y2hlc1swXTt0aGlzLmFkZEVudHJvcHkoW2EucGFnZVh8fGEuY2xpZW50WCxhLnBhZ2VZfHxhLmNsaWVudFldLDEsXCJ0b3VjaFwiKTtUKHRoaXMsMCl9LGxhOmZ1bmN0aW9uKCl7VCh0aGlzLDIpfSxjYTpmdW5jdGlvbihhKXthPWEuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS54fHxhLmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkueXx8YS5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lno7aWYod2luZG93Lm9yaWVudGF0aW9uKXt2YXIgYj13aW5kb3cub3JpZW50YXRpb247XCJudW1iZXJcIj09PXR5cGVvZiBiJiZ0aGlzLmFkZEVudHJvcHkoYiwxLFwiYWNjZWxlcm9tZXRlclwiKX1hJiZ0aGlzLmFkZEVudHJvcHkoYSwyLFwiYWNjZWxlcm9tZXRlclwiKTtUKHRoaXMsMCl9fTtcbmZ1bmN0aW9uIGNhKGEsYil7dmFyIGMsZD1zamNsLnJhbmRvbS5KW2FdLGU9W107Zm9yKGMgaW4gZClkLmhhc093blByb3BlcnR5KGMpJiZlLnB1c2goZFtjXSk7Zm9yKGM9MDtjPGUubGVuZ3RoO2MrKyllW2NdKGIpfWZ1bmN0aW9uIFQoYSxiKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmd2luZG93LnBlcmZvcm1hbmNlJiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLm5vdz9hLmFkZEVudHJvcHkod2luZG93LnBlcmZvcm1hbmNlLm5vdygpLGIsXCJsb2FkdGltZVwiKTphLmFkZEVudHJvcHkoKG5ldyBEYXRlKS52YWx1ZU9mKCksYixcImxvYWR0aW1lXCIpfWZ1bmN0aW9uIGJhKGEpe2EuYj1OKGEpLmNvbmNhdChOKGEpKTthLks9bmV3IHNqY2wuY2lwaGVyLmFlcyhhLmIpfWZ1bmN0aW9uIE4oYSl7Zm9yKHZhciBiPTA7ND5iJiYoYS5tW2JdPWEubVtiXSsxfDAsIWEubVtiXSk7YisrKTtyZXR1cm4gYS5LLmVuY3J5cHQoYS5tKX1cbmZ1bmN0aW9uIE8oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtiLmFwcGx5KGEsYXJndW1lbnRzKX19c2pjbC5yYW5kb209bmV3IHNqY2wucHJuZyg2KTtcbmE6dHJ5e3ZhciBVLGRhLFosaGE7aWYoaGE9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzKXt2YXIgaWE7dHJ5e2lhPXJlcXVpcmUoXCJjcnlwdG9cIil9Y2F0Y2goYSl7aWE9bnVsbH1oYT1kYT1pYX1pZihoYSYmZGEucmFuZG9tQnl0ZXMpVT1kYS5yYW5kb21CeXRlcygxMjgpLFU9bmV3IFVpbnQzMkFycmF5KChuZXcgVWludDhBcnJheShVKSkuYnVmZmVyKSxzamNsLnJhbmRvbS5hZGRFbnRyb3B5KFUsMTAyNCxcImNyeXB0b1sncmFuZG9tQnl0ZXMnXVwiKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPT10eXBlb2Ygd2luZG93JiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXtaPW5ldyBVaW50MzJBcnJheSgzMik7aWYod2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoWik7ZWxzZSBpZih3aW5kb3cubXNDcnlwdG8mJndpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMpd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhaKTtcbmVsc2UgYnJlYWsgYTtzamNsLnJhbmRvbS5hZGRFbnRyb3B5KFosMTAyNCxcImNyeXB0b1snZ2V0UmFuZG9tVmFsdWVzJ11cIil9fWNhdGNoKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY29uc29sZSYmKGNvbnNvbGUubG9nKFwiVGhlcmUgd2FzIGFuIGVycm9yIGNvbGxlY3RpbmcgZW50cm9weSBmcm9tIHRoZSBicm93c2VyOlwiKSxjb25zb2xlLmxvZyhhKSl9XG5zamNsLmpzb249e2RlZmF1bHRzOnt2OjEsaXRlcjoxRTQsa3M6MTI4LHRzOjY0LG1vZGU6XCJjY21cIixhZGF0YTpcIlwiLGNpcGhlcjpcImFlc1wifSxoYTpmdW5jdGlvbihhLGIsYyxkKXtjPWN8fHt9O2Q9ZHx8e307dmFyIGU9c2pjbC5qc29uLGY9ZS5qKHtpdjpzamNsLnJhbmRvbS5yYW5kb21Xb3Jkcyg0LDApfSxlLmRlZmF1bHRzKSxnO2UuaihmLGMpO2M9Zi5hZGF0YTtcInN0cmluZ1wiPT09dHlwZW9mIGYuc2FsdCYmKGYuc2FsdD1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoZi5zYWx0KSk7XCJzdHJpbmdcIj09PXR5cGVvZiBmLml2JiYoZi5pdj1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoZi5pdikpO2lmKCFzamNsLm1vZGVbZi5tb2RlXXx8IXNqY2wuY2lwaGVyW2YuY2lwaGVyXXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYxMDA+PWYuaXRlcnx8NjQhPT1mLnRzJiY5NiE9PWYudHMmJjEyOCE9PWYudHN8fDEyOCE9PWYua3MmJjE5MiE9PWYua3MmJjB4MTAwIT09Zi5rc3x8Mj5mLml2Lmxlbmd0aHx8XG40PGYuaXYubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBlbmNyeXB0OiBpbnZhbGlkIHBhcmFtZXRlcnNcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBhPyhnPXNqY2wubWlzYy5jYWNoZWRQYmtkZjIoYSxmKSxhPWcua2V5LnNsaWNlKDAsZi5rcy8zMiksZi5zYWx0PWcuc2FsdCk6c2pjbC5lY2MmJmEgaW5zdGFuY2VvZiBzamNsLmVjYy5lbEdhbWFsLnB1YmxpY0tleSYmKGc9YS5rZW0oKSxmLmtlbXRhZz1nLnRhZyxhPWcua2V5LnNsaWNlKDAsZi5rcy8zMikpO1wic3RyaW5nXCI9PT10eXBlb2YgYiYmKGI9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhiKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBjJiYoZi5hZGF0YT1jPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYykpO2c9bmV3IHNqY2wuY2lwaGVyW2YuY2lwaGVyXShhKTtlLmooZCxmKTtkLmtleT1hO2YuY3Q9XCJjY21cIj09PWYubW9kZSYmc2pjbC5hcnJheUJ1ZmZlciYmc2pjbC5hcnJheUJ1ZmZlci5jY20mJlxuYiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP3NqY2wuYXJyYXlCdWZmZXIuY2NtLmVuY3J5cHQoZyxiLGYuaXYsYyxmLnRzKTpzamNsLm1vZGVbZi5tb2RlXS5lbmNyeXB0KGcsYixmLml2LGMsZi50cyk7cmV0dXJuIGZ9LGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9c2pjbC5qc29uLGY9ZS5oYS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIGUuZW5jb2RlKGYpfSxnYTpmdW5jdGlvbihhLGIsYyxkKXtjPWN8fHt9O2Q9ZHx8e307dmFyIGU9c2pjbC5qc29uO2I9ZS5qKGUuaihlLmooe30sZS5kZWZhdWx0cyksYiksYywhMCk7dmFyIGYsZztmPWIuYWRhdGE7XCJzdHJpbmdcIj09PXR5cGVvZiBiLnNhbHQmJihiLnNhbHQ9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGIuc2FsdCkpO1wic3RyaW5nXCI9PT10eXBlb2YgYi5pdiYmKGIuaXY9c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGIuaXYpKTtpZighc2pjbC5tb2RlW2IubW9kZV18fCFzamNsLmNpcGhlcltiLmNpcGhlcl18fFwic3RyaW5nXCI9PT1cbnR5cGVvZiBhJiYxMDA+PWIuaXRlcnx8NjQhPT1iLnRzJiY5NiE9PWIudHMmJjEyOCE9PWIudHN8fDEyOCE9PWIua3MmJjE5MiE9PWIua3MmJjB4MTAwIT09Yi5rc3x8IWIuaXZ8fDI+Yi5pdi5sZW5ndGh8fDQ8Yi5pdi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY3J5cHQ6IGludmFsaWQgcGFyYW1ldGVyc1wiKTtcInN0cmluZ1wiPT09dHlwZW9mIGE/KGc9c2pjbC5taXNjLmNhY2hlZFBia2RmMihhLGIpLGE9Zy5rZXkuc2xpY2UoMCxiLmtzLzMyKSxiLnNhbHQ9Zy5zYWx0KTpzamNsLmVjYyYmYSBpbnN0YW5jZW9mIHNqY2wuZWNjLmVsR2FtYWwuc2VjcmV0S2V5JiYoYT1hLnVua2VtKHNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhiLmtlbXRhZykpLnNsaWNlKDAsYi5rcy8zMikpO1wic3RyaW5nXCI9PT10eXBlb2YgZiYmKGY9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhmKSk7Zz1uZXcgc2pjbC5jaXBoZXJbYi5jaXBoZXJdKGEpO2Y9XCJjY21cIj09PVxuYi5tb2RlJiZzamNsLmFycmF5QnVmZmVyJiZzamNsLmFycmF5QnVmZmVyLmNjbSYmYi5jdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP3NqY2wuYXJyYXlCdWZmZXIuY2NtLmRlY3J5cHQoZyxiLmN0LGIuaXYsYi50YWcsZixiLnRzKTpzamNsLm1vZGVbYi5tb2RlXS5kZWNyeXB0KGcsYi5jdCxiLml2LGYsYi50cyk7ZS5qKGQsYik7ZC5rZXk9YTtyZXR1cm4gMT09PWMucmF3P2Y6c2pjbC5jb2RlYy51dGY4U3RyaW5nLmZyb21CaXRzKGYpfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXNqY2wuanNvbjtyZXR1cm4gZS5nYShhLGUuZGVjb2RlKGIpLGMsZCl9LGVuY29kZTpmdW5jdGlvbihhKXt2YXIgYixjPVwie1wiLGQ9XCJcIjtmb3IoYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe2lmKCFiLm1hdGNoKC9eW2EtejAtOV0rJC9pKSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZW5jb2RlOiBpbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7Yys9ZCsnXCInK1xuYisnXCI6JztkPVwiLFwiO3N3aXRjaCh0eXBlb2YgYVtiXSl7Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJib29sZWFuXCI6Yys9YVtiXTticmVhaztjYXNlIFwic3RyaW5nXCI6Yys9J1wiJytlc2NhcGUoYVtiXSkrJ1wiJzticmVhaztjYXNlIFwib2JqZWN0XCI6Yys9J1wiJytzamNsLmNvZGVjLmJhc2U2NC5mcm9tQml0cyhhW2JdLDApKydcIic7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwianNvbiBlbmNvZGU6IHVuc3VwcG9ydGVkIHR5cGVcIik7fX1yZXR1cm4gYytcIn1cIn0sZGVjb2RlOmZ1bmN0aW9uKGEpe2E9YS5yZXBsYWNlKC9cXHMvZyxcIlwiKTtpZighYS5tYXRjaCgvXlxcey4qXFx9JC8pKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBkZWNvZGU6IHRoaXMgaXNuJ3QganNvbiFcIik7YT1hLnJlcGxhY2UoL15cXHt8XFx9JC9nLFwiXCIpLnNwbGl0KC8sLyk7dmFyIGI9e30sYyxkO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe2lmKCEoZD1hW2NdLm1hdGNoKC9eXFxzKig/OihbXCInXT8pKFthLXpdW2EtejAtOV0qKVxcMSlcXHMqOlxccyooPzooLT9cXGQrKXxcIihbYS16MC05K1xcLyUqXy5APVxcLV0qKVwifCh0cnVlfGZhbHNlKSkkL2kpKSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjb2RlOiB0aGlzIGlzbid0IGpzb24hXCIpO1xubnVsbCE9ZFszXT9iW2RbMl1dPXBhcnNlSW50KGRbM10sMTApOm51bGwhPWRbNF0/YltkWzJdXT1kWzJdLm1hdGNoKC9eKGN0fGFkYXRhfHNhbHR8aXYpJC8pP3NqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhkWzRdKTp1bmVzY2FwZShkWzRdKTpudWxsIT1kWzVdJiYoYltkWzJdXT1cInRydWVcIj09PWRbNV0pfXJldHVybiBifSxqOmZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1hJiYoYT17fSk7aWYodm9pZCAwPT09YilyZXR1cm4gYTtmb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpKXtpZihjJiZ2b2lkIDAhPT1hW2RdJiZhW2RdIT09YltkXSl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcInJlcXVpcmVkIHBhcmFtZXRlciBvdmVycmlkZGVuXCIpO2FbZF09YltkXX1yZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSxiKXt2YXIgYz17fSxkO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSE9PWJbZF0mJihjW2RdPWFbZF0pO3JldHVybiBjfSxxYTpmdW5jdGlvbihhLFxuYil7dmFyIGM9e30sZDtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKXZvaWQgMCE9PWFbYltkXV0mJihjW2JbZF1dPWFbYltkXV0pO3JldHVybiBjfX07c2pjbC5lbmNyeXB0PXNqY2wuanNvbi5lbmNyeXB0O3NqY2wuZGVjcnlwdD1zamNsLmpzb24uZGVjcnlwdDtzamNsLm1pc2Mub2E9e307c2pjbC5taXNjLmNhY2hlZFBia2RmMj1mdW5jdGlvbihhLGIpe3ZhciBjPXNqY2wubWlzYy5vYSxkO2I9Ynx8e307ZD1iLml0ZXJ8fDFFMztjPWNbYV09Y1thXXx8e307ZD1jW2RdPWNbZF18fHtmaXJzdFNhbHQ6Yi5zYWx0JiZiLnNhbHQubGVuZ3RoP2Iuc2FsdC5zbGljZSgwKTpzamNsLnJhbmRvbS5yYW5kb21Xb3JkcygyLDApfTtjPXZvaWQgMD09PWIuc2FsdD9kLmZpcnN0U2FsdDpiLnNhbHQ7ZFtjXT1kW2NdfHxzamNsLm1pc2MucGJrZGYyKGEsYyxiLml0ZXIpO3JldHVybntrZXk6ZFtjXS5zbGljZSgwKSxzYWx0OmMuc2xpY2UoMCl9fTtcblwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXNqY2wpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBzamNsfSk7XG4iLCAiY29uc3QgZGVmYXVsdEVycm9yQ29uZmlnID0ge1xyXG4gICAgd2l0aFN0YWNrVHJhY2U6IGZhbHNlLFxyXG59O1xyXG4vLyBDdXN0b20gZXJyb3Igb2JqZWN0XHJcbi8vIENvbnRleHQgLyBkaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtYWNyby9uZXZlcnRocm93L3B1bGwvMjE1XHJcbmNvbnN0IGNyZWF0ZU5ldmVyVGhyb3dFcnJvciA9IChtZXNzYWdlLCByZXN1bHQsIGNvbmZpZyA9IGRlZmF1bHRFcnJvckNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHJlc3VsdC5pc09rKClcclxuICAgICAgICA/IHsgdHlwZTogJ09rJywgdmFsdWU6IHJlc3VsdC52YWx1ZSB9XHJcbiAgICAgICAgOiB7IHR5cGU6ICdFcnInLCB2YWx1ZTogcmVzdWx0LmVycm9yIH07XHJcbiAgICBjb25zdCBtYXliZVN0YWNrID0gY29uZmlnLndpdGhTdGFja1RyYWNlID8gbmV3IEVycm9yKCkuc3RhY2sgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBzdGFjazogbWF5YmVTdGFjayxcclxuICAgIH07XHJcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuY2xhc3MgUmVzdWx0QXN5bmMge1xyXG4gICAgY29uc3RydWN0b3IocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU2FmZVByb21pc2UocHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yRm4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZVxyXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbmV3IEVycihlcnJvckZuKGUpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBzdGF0aWMgZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZm4oLi4uYXJncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoZXJyb3JGbiA/IGVycm9yRm4oZXJyb3IpIDogZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSkoKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0KGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZVdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZihyZXMudmFsdWUpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzID0geWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKG5ld1Jlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRlZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNPaygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoeWllbGQgZihyZXMuZXJyb3IpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRBc3luYyA/IG5ld1ZhbHVlLl9wcm9taXNlIDogbmV3VmFsdWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLm1hdGNoKG9rLCBfZXJyKSk7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMudW53cmFwT3IodCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gOS4wLjAuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiB1c2UgYHNhZmVUcnlgIHdpdGhvdXQgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogc2FmZVRyeShhc3luYyBmdW5jdGlvbiogKCkge1xyXG4gICAgICogICBjb25zdCBva1ZhbHVlID0geWllbGQqIHlvdXJSZXN1bHRcclxuICAgICAqIH0pXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEVtdWxhdGVzIFJ1c3QncyBgP2Agb3BlcmF0b3IgaW4gYHNhZmVUcnlgJ3MgYm9keS4gU2VlIGFsc28gYHNhZmVUcnlgLlxyXG4gICAgICovXHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHNhZmVVbndyYXBfMSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5zYWZlVW53cmFwKCkpKSkpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBNYWtlcyBSZXN1bHRBc3luYyBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8UmVzdWx0PlxyXG4gICAgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZXJyQXN5bmMocmVzdWx0LmVycm9yKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb2tBc3luYyA9ICh2YWx1ZSkgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgT2sodmFsdWUpKSk7XHJcbmNvbnN0IGVyckFzeW5jID0gKGVycikgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgRXJyKGVycikpKTtcclxuY29uc3QgZnJvbVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZTtcclxuY29uc3QgZnJvbVNhZmVQcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlO1xyXG5jb25zdCBmcm9tQXN5bmNUaHJvd2FibGUgPSBSZXN1bHRBc3luYy5mcm9tVGhyb3dhYmxlO1xuXG4vKipcclxuICogU2hvcnQgY2lyY3VpdHMgb24gdGhlIEZJUlNUIEVyciB2YWx1ZSB0aGF0IHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0ID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFjYy5tYXAoKGxpc3QpID0+IGxpc3QucHVzaChyZXN1bHQudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG4vKiBUaGlzIGlzIHRoZSB0eXBlc2FmZSB2ZXJzaW9uIG9mIFByb21pc2UuYWxsXHJcbiAqXHJcbiAqIFRha2VzIGEgbGlzdCBvZiBSZXN1bHRBc3luYzxULCBFPiBhbmQgc3VjY2VzcyBpZiBhbGwgaW5uZXIgcmVzdWx0cyBhcmUgT2sgdmFsdWVzXHJcbiAqIG9yIGZhaWxzIGlmIG9uZSAob3IgbW9yZSkgb2YgdGhlIGlubmVyIHJlc3VsdHMgYXJlIEVyciB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3QgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdCk7XHJcbi8qKlxyXG4gKiBHaXZlIGEgbGlzdCBvZiBhbGwgdGhlIGVycm9ycyB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjLmVycm9yLnB1c2gocmVzdWx0LmVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIoW3Jlc3VsdC5lcnJvcl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNPaygpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjLnZhbHVlLnB1c2gocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gbm90aGluZyB3aGVuIHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzRXJyKClcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcclxudmFyIFJlc3VsdDtcclxuKGZ1bmN0aW9uIChSZXN1bHQpIHtcclxuICAgIC8qKlxyXG4gICAgICogV3JhcHMgYSBmdW5jdGlvbiB3aXRoIGEgdHJ5IGNhdGNoLCBjcmVhdGluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lXHJcbiAgICAgKiBhcmd1bWVudHMgYnV0IHJldHVybmluZyBgT2tgIGlmIHN1Y2Nlc3NmdWwsIGBFcnJgIGlmIHRoZSBmdW5jdGlvbiB0aHJvd3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gd3JhcCB3aXRoIG9rIG9uIHN1Y2Nlc3Mgb3IgZXJyIG9uIGZhaWx1cmVcclxuICAgICAqIEBwYXJhbSBlcnJvckZuIHdoZW4gYW4gZXJyb3IgaXMgdGhyb3duLCB0aGlzIHdpbGwgd3JhcCB0aGUgZXJyb3IgcmVzdWx0IGlmIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBmdW5jdGlvbiBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyKGVycm9yRm4gPyBlcnJvckZuKGUpIDogZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmZyb21UaHJvd2FibGUgPSBmcm9tVGhyb3dhYmxlO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZShyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0KHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmUgPSBjb21iaW5lO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZVdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZVdpdGhBbGxFcnJvcnMgPSBjb21iaW5lV2l0aEFsbEVycm9ycztcclxufSkoUmVzdWx0IHx8IChSZXN1bHQgPSB7fSkpO1xyXG5jb25zdCBvayA9ICh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKTtcclxuZnVuY3Rpb24gZXJyKGVycikge1xyXG4gICAgcmV0dXJuIG5ldyBFcnIoZXJyKTtcclxufVxyXG5mdW5jdGlvbiBzYWZlVHJ5KGJvZHkpIHtcclxuICAgIGNvbnN0IG4gPSBib2R5KCkubmV4dCgpO1xyXG4gICAgaWYgKG4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuLnRoZW4oKHIpID0+IHIudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuLnZhbHVlO1xyXG59XHJcbmNsYXNzIE9rIHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBvayhmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcEVycihfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKF92YWx1ZSkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGYodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRlZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFzeW5jQW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKCgpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNNYXAoZikge1xyXG4gICAgICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB1bndyYXBPcihfdikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS15aWVsZCAqL1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBFcnJgIG9uIGFuIE9rJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgcmVxdWlyZS15aWVsZFxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVyciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBlcnIoZih0aGlzLmVycm9yKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jQW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jTWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3Iodikge1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgbWF0Y2goX29rLCBlcnIpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB5aWVsZCBlcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvIG5vdCB1c2UgdGhpcyBnZW5lcmF0b3Igb3V0IG9mIGBzYWZlVHJ5YCcpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwYCBvbiBhbiBFcnInLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgeWllbGQgc2VsZjtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufVxyXG5jb25zdCBmcm9tVGhyb3dhYmxlID0gUmVzdWx0LmZyb21UaHJvd2FibGU7XHJcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBFcnIsIE9rLCBSZXN1bHQsIFJlc3VsdEFzeW5jLCBlcnIsIGVyckFzeW5jLCBmcm9tQXN5bmNUaHJvd2FibGUsIGZyb21Qcm9taXNlLCBmcm9tU2FmZVByb21pc2UsIGZyb21UaHJvd2FibGUsIG9rLCBva0FzeW5jLCBzYWZlVHJ5IH07XG4iLCAidHlwZSBKc29uYWJsZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCByZWFkb25seSBKc29uYWJsZVtdXG4gIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uYWJsZSB9XG4gIHwgeyB0b0pTT04oKTogSnNvbmFibGUgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ/OiBKc29uYWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiBFcnJvcjsgY29udGV4dD86IEpzb25hYmxlIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBjYXVzZSwgY29udGV4dCB9ID0gb3B0aW9ucztcblxuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgV2ViU29ja2V0RXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBXZWJTb2NrZXRFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0XCI7XG59XG4iLCAiaW1wb3J0IHsgZXJyQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Nvbm5lY3Rpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IFNlcnZlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivc2VydmVyLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZyB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItY29uZmlnLnRzXCI7XG5cbi8qKlxuICogRW5zdXJlIGFuIGVycm9yIG1lc3NhZ2UgaXMgdHJhbnNmb3JtZWQgaW4gYW4gRXJyb3Igb2JqZWN0XG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5zdXJlRXJyb3IgPSAodmFsdWU6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsdWU7XG5cbiAgbGV0IHN0cmluZ2lmaWVkID0gXCJbVW5hYmxlIHRvIHN0cmluZ2lmeSB0aGUgdGhyb3duIHZhbHVlXVwiO1xuICB0cnkge1xuICAgIHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcihzdHJpbmdpZmllZCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIEx1ZmkncyBjb25maWcgZnJvbSBpdHMgQVBJXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZmV0Y2hTZXJ2ZXJDb25maWcgPSAoXG4gIGluc3RhbmNlVXJsOiBVUkwsXG4pOiBSZXN1bHRBc3luYzxTZXJ2ZXJDb25maWcsIEVycm9yPiA9PiB7XG4gIGNvbnN0IG9yaWdpbk1hdGNoZXMgPSBpbnN0YW5jZVVybC5ocmVmLm1hdGNoKFxuICAgIC8oLio/KVxcLz8oPzpcXC9bZHJdezF9XFwvfGxvZ2luXFwvP3xmaWxlc1xcLz8pLyxcbiAgKTtcblxuICBjb25zdCB1cmxPcmlnaW4gPSBvcmlnaW5NYXRjaGVzICYmIG9yaWdpbk1hdGNoZXNbMV1cbiAgICA/IG9yaWdpbk1hdGNoZXNbMV1cbiAgICA6IGluc3RhbmNlVXJsLm9yaWdpbjtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgZmV0Y2godXJsT3JpZ2luICsgXCIvYWJvdXQvY29uZmlnXCIpLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDb25uZWN0aW9uRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKS5hbmRUaGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICByZXNwb25zZS5qc29uKCksXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgICBuZXcgU2VydmVyRXJyb3IodW5kZWZpbmVkLCB7IGNvbnRleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEZW5vUnVudGltZSA9ICgpOiBib29sZWFuID0+IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgY29uc3QgaXNTZWN1cmVDb250ZXh0ID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpIHx8IGdsb2JhbFRoaXMuaXNTZWN1cmVDb250ZXh0IHx8XG4gICAgZ2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbn07XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJVcmwgPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBVUkwgPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpXG4gICAgPyBuZXcgVVJMKGAuL3dvcmtlci8ke3JlbGF0aXZlUGF0aH0udHNgLCBuZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLmhyZWYpXG4gICAgOiBuZXcgVVJMKFxuICAgICAgaW1wb3J0Lm1ldGEucmVzb2x2ZShcbiAgICAgICAgYC4vJHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggIT09IFwiZW5jcnlwdFwiID8gYHdvcmtlci8ke3JlbGF0aXZlUGF0aH1gIDogcmVsYXRpdmVQYXRoXG4gICAgICAgIH0uanNgLFxuICAgICAgKSxcbiAgICApO1xufTtcbiIsICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7IFdPUktFUl9BQ1RJT04gfSBmcm9tIFwifi9lbnVtL3dvcmtlci1hY3Rpb24udHNcIjtcbmltcG9ydCB0eXBlIHsgTHVmaUZpbGUgfSBmcm9tIFwifi9lbnRpdGllcy9sdWZpLWZpbGUudHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWN0aW9uTWVzc2FnZSB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItYWN0aW9uLW1lc3NhZ2UudHNcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuaW1wb3J0IHsgVVBMT0FEX1NUQVRVUyB9IGZyb20gXCJ+L2VudW0vZmlsZS1zdGF0dXMudHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyRXZlbnQgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWV2ZW50LnRzXCI7XG5cbmRlY2xhcmUgbGV0IHNlbGY6IFdvcmtlcjtcblxuZXhwb3J0IGNvbnN0IGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuLyoqXG4gKiBVcGRhdGUgZmlsZSBpbiB3b3JrZXJzIGFuZCBwcm92aWRlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gdGhyZWFkXG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUZpbGUgPSAobHVmaUZpbGU6IEx1ZmlGaWxlLCBhcmdzOiBQYXJ0aWFsPEx1ZmlGaWxlPikgPT4ge1xuICBPYmplY3QuYXNzaWduKGx1ZmlGaWxlLCBhcmdzKTtcblxuICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBldmVudDogRVZFTlQuRklMRV9VUERBVEVELFxuICAgICAgbHVmaUZpbGUsXG4gICAgfSBhcyBXb3JrZXJFdmVudCk7XG4gIH1cblxuICByZXR1cm4gbHVmaUZpbGU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZEZpbGVFcnJvciA9IChsdWZpRmlsZTogTHVmaUZpbGUsIGVycm9yOiBFcnJvcikgPT4ge1xuICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7IHVwbG9hZFN0YXR1czogVVBMT0FEX1NUQVRVUy5GQUlMRUQgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvciB9IGFzIFdvcmtlckV2ZW50KTtcbn07XG5cbi8qKlxuICogSW5pdCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNoaWxkIHdvcmtlcidzIG9ubWVzc2FnZSBldmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gIGV2ZW50cy5vbmNlKEVWRU5ULlNPQ0tFVF9PUEVORUQsICgpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBFVkVOVC5TT0NLRVRfT1BFTkVELFxuICAgIH0pO1xuICB9KTtcblxuICBldmVudHMub25jZShFVkVOVC5PUEVSQVRJT05fRkFJTEVELCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvciB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNXb3JrZXJBY3Rpb25NZXNzYWdlID0gKFxuICAvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICBtZXNzYWdlOiBhbnksXG4pOiBtZXNzYWdlIGlzIFdvcmtlckFjdGlvbk1lc3NhZ2UgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBtZXNzYWdlID09PSBcIm9iamVjdFwiICYmXG4gICAgbWVzc2FnZSAhPT0gbnVsbCAmJlxuICAgIFwiYWN0aW9uXCIgaW4gbWVzc2FnZSAmJlxuICAgIE9iamVjdC52YWx1ZXMoV09SS0VSX0FDVElPTikuaW5jbHVkZXMobWVzc2FnZS5hY3Rpb24pXG4gICk7XG59O1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgImltcG9ydCB7XG4gIERlY29kZSBhcyBiNjRkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjRlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjRcIjtcbmltcG9ydCB7IGVyckFzeW5jLCBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgc2pjbCBmcm9tIFwibHVmaS1zamNsXCI7XG5pbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBFbmNyeXB0ZWREYXRhIG9yIGEgc3RyaW5nIHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkRGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhIHwgc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgZW5jcnlwdGVkRGF0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBlbmNyeXB0ZWREYXRhXG4gICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNyeXB0ZWREYXRhLmRhdGEgYXMgQXJyYXlCdWZmZXIpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmMoYjY0ZGVjb2RlKHNqY2wuZGVjcnlwdChrZXksIGRhdGEpKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IERlY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgYW4gQXJyYXlCdWZmZXIgaW50byBhbiBFbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gc2pjbC5lbmNyeXB0KGtleSwgYjY0ZW5jb2RlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gb2tBc3luYyh7XG4gICAgICBhbGdvOiBDcnlwdG9BbGdvcml0aG0uU2pjbCxcbiAgICAgIGRhdGE6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlbmNyeXB0ZWQpLmJ1ZmZlcixcbiAgICAgIGl2OiBKU09OLnBhcnNlKGVuY3J5cHRlZCBhcyB1bmtub3duIGFzIHN0cmluZykuaXYsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IEVuY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyB1c2luZyBTamNsIEFQSVxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9ICgpOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoc2pjbC5yYW5kb20ucmFuZG9tV29yZHMoOCwgMTApKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIGtleVwiLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyBTamNsIEFQSVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoc2pjbC5oYXNoLnNoYTUxMi5oYXNoKHBhc3N3b3JkKSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhuZXcgSGFzaGluZ0Vycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGtleSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgU2pjbC4gU2luY2Ugd2UncmUgbm90IGdlbmVyYXRpbmcgYW4gZXF1YWwgc3ltYm9sIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBXZWJDcnlwdG8gQVBJIChieSB1c2luZyBiYXNlNjR1cmwpLCBpdCdzIGVhc3kgdG8gZGV0ZWN0XG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2pjbEtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4ga2V5W2tleS5sZW5ndGggLSAxXSA9PT0gXCI9XCI7XG59O1xuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIENyeXB0b0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWNyeXB0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2U6IHN0cmluZyA9IFwiVW5hYmxlIHRvIGRlY3J5cHQgdGhlIHByb3ZpZGVkIGRhdGFcIjtcbn1cbiIsICJpbXBvcnQge1xuICBEZWNvZGUgYXMgYjY0dXJsZGVjb2RlLFxuICBFbmNvZGUgYXMgYjY0dXJsZW5jb2RlLFxufSBmcm9tIFwiYXJyYXlidWZmZXItZW5jb2RpbmcvYmFzZTY0L3VybFwiO1xuaW1wb3J0IHsgdHlwZSBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IERlY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9kZWNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gXCJ+L3V0aWxzLnRzXCI7XG5pbXBvcnQgeyBFbmNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBIYXNoaW5nRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vaGFzaGluZy1lcnJvci50c1wiO1xuXG4vKipcbiAqIERlY3J5cHQgYW4gZW5jcnlwdGVkRGF0YSB1c2luZyB0aGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZGVjcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZDogRW5jcnlwdGVkRGF0YSxcbik6IFJlc3VsdEFzeW5jPEFycmF5QnVmZmVyLCBEZWNyeXB0aW9uRXJyb3I+ID0+IHtcbiAgcmV0dXJuIGltcG9ydEtleShrZXkpLmFuZFRoZW4oKGltcG9ydGVkS2V5KSA9PlxuICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgaXY6IGVuY3J5cHRlZC5pdiBhcyBVaW50OEFycmF5LFxuICAgICAgICB9LFxuICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgZW5jcnlwdGVkLmRhdGEgYXMgQXJyYXlCdWZmZXIsXG4gICAgICApLFxuICAgICAgKGVycm9yKSA9PiBuZXcgRGVjcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogRW5jcnlwdCBhbiBBcnJheUJ1ZmZlciBpbnRvIGFuIEVuY3J5cHRlZERhdGEgdXNpbmcgdGhlIHByb3ZpZGVkIGtleVxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5jcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBBcnJheUJ1ZmZlcixcbik6IFJlc3VsdEFzeW5jPEVuY3J5cHRlZERhdGEsIEVuY3J5cHRpb25FcnJvcj4gPT4ge1xuICByZXR1cm4gaW1wb3J0S2V5KGtleSkuYW5kVGhlbigoaW1wb3J0ZWRLZXkpID0+IHtcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTtcbiAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICBpdixcbiAgICAgICAgfSxcbiAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgKSxcbiAgICAgIChlcnJvcikgPT5cbiAgICAgICAgbmV3IEVuY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KSxcbiAgICApLmFuZFRoZW4oKGVuY3J5cHRlZCkgPT4ge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoe1xuICAgICAgICBhbGdvOiBDcnlwdG9BbGdvcml0aG0uV2ViQ3J5cHRvLFxuICAgICAgICBkYXRhOiBlbmNyeXB0ZWQsXG4gICAgICAgIGl2LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBzdHJpbmcgaW50byBhIENyeXB0b0tleSwgdXNhYmxlIGluIFdlYiBDcnlwdG8gQVBJXG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGltcG9ydEtleSA9IChrZXk6IHN0cmluZyk6IFJlc3VsdEFzeW5jPENyeXB0b0tleSwgQ3J5cHRvRXJyb3I+ID0+IHtcbiAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJyYXdcIixcbiAgICAgIGI2NHVybGRlY29kZShrZXkpLFxuICAgICAgeyBuYW1lOiBcIkFFUy1HQ01cIiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXG4gICAgICAgIFwiZW5jcnlwdFwiLFxuICAgICAgICBcImRlY3J5cHRcIixcbiAgICAgIF0sXG4gICAgKSxcbiAgICAoZXJyb3IpID0+XG4gICAgICBuZXcgQ3J5cHRvRXJyb3IoXCJVbmFibGUgdG8gaW1wb3J0IGNyeXB0b2dyYXBoeSBrZXlcIiwge1xuICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyB1c2luZyBXZWIgQ3J5cHRvIEFQSS5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVLZXkgPSAoKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBDcnlwdG9FcnJvcj4gPT4ge1xuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgIGNyeXB0by5zdWJ0bGVcbiAgICAgICAgLmdlbmVyYXRlS2V5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChnZW5lcmF0ZWRLZXkpID0+XG4gICAgICAgICAgY3J5cHRvLnN1YnRsZVxuICAgICAgICAgICAgLmV4cG9ydEtleShcInJhd1wiLCBnZW5lcmF0ZWRLZXkpXG4gICAgICAgICAgICAudGhlbigoa2V5KSA9PiByZXNvbHZlKGI2NHVybGVuY29kZShrZXkpKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBiYXNlNjQgZW5jb2RlIHRoZSB1cmxcIiwge1xuICAgICAgICAgICAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSlcbiAgICApLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBnZW5lcmF0ZSBrZXlcIiwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBIYXNoIGEgcGFzc3dvcmQgdXNpbmcgV2ViQ3J5cHRvIEFQSVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PiB7XG4gIGNvbnN0IHByb21pc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICBuZXcgVWludDhBcnJheShcbiAgICAgICAgYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXG4gICAgICAgICAgXCJTSEEtNTEyXCIsXG4gICAgICAgICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHBhc3N3b3JkKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbiAgfTtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgcHJvbWlzZSgpLFxuICAgIChlcnJvcikgPT4gbmV3IEhhc2hpbmdFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgKTtcbn07XG4iLCAiaW1wb3J0IHsgQ3J5cHRvQWxnb3JpdGhtIH0gZnJvbSBcIn4vZW51bS9jcnlwdG8tYWxnb3JpdGhtLnRzXCI7XG5pbXBvcnQgeyBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgdHlwZSB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHR5cGUgeyBEZWNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHR5cGUgeyBFbmNyeXB0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vZW5jcnlwdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgdHlwZSBFbmNyeXB0ZWREYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2VuY3J5cHRlZC1kYXRhLnRzXCI7XG5pbXBvcnQgKiBhcyBzamNsIGZyb20gXCJ+L2FwaS9jcnlwdG8vc2pjbC50c1wiO1xuaW1wb3J0ICogYXMgd2ViIGZyb20gXCJ+L2FwaS9jcnlwdG8vd2ViLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBFbmNyeXB0ZWREYXRhIG9iamVjdCB1c2luZyB0aGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEVuY3J5cHRlZERhdGEsXG4pOiBSZXN1bHRBc3luYzxBcnJheUJ1ZmZlciwgRGVjcnlwdGlvbkVycm9yPiA9PlxuICB2YWx1ZS5hbGdvID09PSB1bmRlZmluZWQgfHwgdmFsdWUuYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2xcbiAgICA/IHNqY2wuZGVjcnlwdChrZXksIHZhbHVlKVxuICAgIDogd2ViLmRlY3J5cHQoa2V5LCB2YWx1ZSk7XG5cbi8qKlxuICogRW5jcnlwdCBhbiBBcnJheUJ1ZmZlciB1c2luZyB0aGUgcHJvdmlkZWQga2V5IGFuZCBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBhbGdvXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5jcnlwdCA9IChcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBBcnJheUJ1ZmZlcixcbiAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PlxuICAoYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2wpXG4gICAgPyBzamNsLmVuY3J5cHQoa2V5LCB2YWx1ZSlcbiAgICA6IHdlYi5lbmNyeXB0KGtleSwgdmFsdWUpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbmV3IGtleSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uXG4gKlxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9IChcbiAgYWxnbyA9IENyeXB0b0FsZ29yaXRobS5XZWJDcnlwdG8sXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PlxuICBhbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbCA/IHNqY2wuZ2VuZXJhdGVLZXkoKSA6IHdlYi5nZW5lcmF0ZUtleSgpO1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyB0aGUgcHJvdmlkZWQgYWxnb3JpdGhtXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkXG4gKiBAcGFyYW0gYWxnb1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBIYXNoaW5nRXJyb3I+ID0+XG4gIGFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsXG4gICAgPyBzamNsLmhhc2hQYXNzd29yZChwYXNzd29yZClcbiAgICA6IHdlYi5oYXNoUGFzc3dvcmQocGFzc3dvcmQpO1xuIiwgImltcG9ydCB7IGVyckFzeW5jLCBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgeyBMdWZpRmlsZSB9IGZyb20gXCJ+L2VudGl0aWVzL2x1ZmktZmlsZS50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHsgU29ja2V0UGF0aCB9IGZyb20gXCJ+L2VudW0vc29ja2V0LXBhdGgudHNcIjtcbmltcG9ydCB7IFVwbG9hZEVycm9yIH0gZnJvbSBcIn4vZXJyb3IvdXBsb2FkL3VwbG9hZC1lcnJvci50c1wiO1xuaW1wb3J0IHsgV2ViU29ja2V0Q29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd2Vic29ja2V0L3dlYnNvY2tldC1jb25uZWN0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dlYnNvY2tldC93ZWJzb2NrZXQtZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgQ2xpZW50VXBsb2FkQ2h1bmtNZXRhZGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9jbGllbnQtdXBsb2FkLWNodW5rLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ2FuY2VsTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2Uvc2VydmVyLWNhbmNlbC1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1kb3dubG9hZC1jaHVuay1zdWNjZXNzLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclVwbG9hZENodW5rTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2Uvc2VydmVyLXVwbG9hZC1jaHVuay1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGEgfSBmcm9tIFwifi90eXBlL3NlcnZlci1kb3dubG9hZC1jaHVuay1tZXRhZGF0YS50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0IHsgZXZlbnRzLCB1cGRhdGVGaWxlIH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJ+L2FwaS9jcnlwdG8udHNcIjtcbmltcG9ydCB7XG4gIERlY29kZSBhcyBiNjRkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjRlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjRcIjtcblxuZXhwb3J0IGNvbnN0IHNvY2tldHM6IHtcbiAgW2tleTogc3RyaW5nXTogV2ViU29ja2V0O1xufSA9IHt9O1xuXG5jb25zdCBNQVhfRVJST1JTID0gNTtcblxuLyoqXG4gKiBIYW5kbGUgV2ViU29ja2V0IHJlc3BvbnNlIGZvciBjYW5jZWwgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvbkNhbmNlbE1lc3NhZ2UgPSAoXG4gIGRhdGE6IFNlcnZlckNhbmNlbE1ldGFkYXRhLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgRXJyb3I+ID0+IHtcbiAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX0NBTkNFTExFRCwgZGF0YS5zdWNjZXNzKTtcblxuICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgV2ViU29ja2V0IHJlc3BvbnNlIGZvciBkb3dubG9hZCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHJlc3BvbnNlXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uRG93bmxvYWRNZXNzYWdlID0gKFxuICByZXNwb25zZTogc3RyaW5nLFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5zcGxpdChcIlhYTU9KT1hYXCIpO1xuICBjb25zdCBtZXRhZGF0YVN0cmluZyA9IHJlc3VsdC5zaGlmdCgpO1xuXG4gIGlmIChtZXRhZGF0YVN0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKSBhcyBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGE7XG5cbiAgICBpZiAoaXNTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhKG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgZGF0YVN0cmluZyA9IHJlc3VsdC5zaGlmdCgpO1xuXG4gICAgICBpZiAoZGF0YVN0cmluZykge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyaW5nKTtcblxuICAgICAgICAvLyBJZiBmaWxlIHdhcyB1cGxvYWRlZCB1c2luZyBMdWZpIEFQSVxuICAgICAgICBpZiAoZW5jcnlwdGVkRGF0YS5pdikge1xuICAgICAgICAgIGVuY3J5cHRlZERhdGEuaXYgPSBuZXcgVWludDhBcnJheShPYmplY3QudmFsdWVzKGVuY3J5cHRlZERhdGEuaXYpKTtcbiAgICAgICAgICBlbmNyeXB0ZWREYXRhLmRhdGEgPSBiNjRkZWNvZGUoZW5jcnlwdGVkRGF0YS5kYXRhIGFzIHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3J5cHRvLmRlY3J5cHQobHVmaUZpbGUua2V5cy5jbGllbnQsIGVuY3J5cHRlZERhdGEpLmFuZFRoZW4oXG4gICAgICAgICAgKGRlY3J5cHRlZFBhcnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHR5cGVvZiBkZWNyeXB0ZWRQYXJ0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkZWNyeXB0ZWRQYXJ0KS5idWZmZXIgYXMgQXJyYXlCdWZmZXIpXG4gICAgICAgICAgICAgIDogZGVjcnlwdGVkUGFydDtcblxuICAgICAgICAgICAgLy8gSWYgZmlyc3QgY2h1bmtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5wYXJ0ID09PSAwKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHtcbiAgICAgICAgICAgICAgICBjaHVua3NSZWFkeTogbHVmaUZpbGUuY2h1bmtzUmVhZHkgKyAxLFxuICAgICAgICAgICAgICAgIGRlbEF0Rmlyc3RWaWV3OiBtZXRhZGF0YS5kZWxfYXRfZmlyc3RfdmlldyxcbiAgICAgICAgICAgICAgICBkZWxheTogbWV0YWRhdGEuZGVsYXksXG4gICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBtZXRhZGF0YS5zaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsQ2h1bmtzOiBtZXRhZGF0YS50b3RhbCxcbiAgICAgICAgICAgICAgICB0eXBlOiBtZXRhZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIHppcHBlZDogbWV0YWRhdGEuemlwcGVkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5ET1dOTE9BRF9TVEFSVEVEKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgY2h1bmtzUmVhZHk6IGx1ZmlGaWxlLmNodW5rc1JlYWR5ICsgMSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuQ0hVTktfRE9XTkxPQURFRCwgYnVmZmVyLCBtZXRhZGF0YS5wYXJ0KTtcblxuICAgICAgICAgICAgaWYgKGx1ZmlGaWxlLmNodW5rc1JlYWR5ID09PSBtZXRhZGF0YS50b3RhbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW5kRG93bmxvYWQobHVmaUZpbGUpLmFuZFRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULkRPV05MT0FEX0NPTVBMRVRFKTtcbiAgICAgICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IHJldHJpZXZlIG1ldGFkYXRhIGZyb20gZGF0YSByZWNlaXZlZCBieSB0aGUgc2VydmVyXCIsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihtZXRhZGF0YS5tc2cpO1xuXG4gICAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihcbiAgICAgIFwiQ2Fubm90IHJldHJpZXZlIG1ldGFkYXRhIGZyb20gZGF0YSByZWNlaXZlZCBieSB0aGUgc2VydmVyXCIsXG4gICAgKTtcblxuICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcbiAgICByZXR1cm4gZXJyQXN5bmMoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhbmRsZSBXZWJTb2NrZXQgcmVzcG9uc2UgZm9yIHVwbG9hZCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHJlc3BvbnNlXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uVXBsb2FkTWVzc2FnZSA9IChcbiAgcmVzcG9uc2U6IFNlcnZlclVwbG9hZENodW5rTWV0YWRhdGEsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFVwbG9hZEVycm9yPiA9PiB7XG4gIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgLy8gSWYgZmlyc3QgY2h1bmtcbiAgICBpZiAocmVzcG9uc2UuaiA9PT0gMCkge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGBVcGxvYWQgb2YgJHtsdWZpRmlsZS5rZXlzLmNsaWVudH0gc3RhcnRlZGApO1xuXG4gICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7XG4gICAgICAgIGtleXM6IHsgY2xpZW50OiBsdWZpRmlsZS5rZXlzLmNsaWVudCwgc2VydmVyOiByZXNwb25zZS5zaG9ydCB9LFxuICAgICAgICBhY3Rpb25Ub2tlbjogcmVzcG9uc2UudG9rZW4sXG4gICAgICAgIHF1ZXVlSW5kZXg6IHJlc3BvbnNlLmksXG4gICAgICB9KTtcblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX1NUQVJURUQpO1xuICAgIH1cblxuICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHtcbiAgICAgIGNodW5rc1JlYWR5OiBsdWZpRmlsZS5jaHVua3NSZWFkeSArIDEsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRfYXQsXG4gICAgfSk7XG5cbiAgICBldmVudHMuZW1pdChFVkVOVC5DSFVOS19VUExPQURFRCk7XG5cbiAgICBpZiAobHVmaUZpbGUuY2h1bmtzUmVhZHkgPT09IGx1ZmlGaWxlLnRvdGFsQ2h1bmtzKSB7XG4gICAgICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7IHVwbG9hZFN0YXR1czogVVBMT0FEX1NUQVRVUy5DT01QTEVURSB9KTtcblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuVVBMT0FEX0NPTVBMRVRFKTtcbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PUEVSQVRJT05fVEVSTUlOQVRFRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihyZXNwb25zZS5tc2cpO1xuICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcblxuICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbGVkIG9uIHNvY2tldHMgXCJvbm1lc3NhZ2VcIiBldmVudFxuICpcbiAqIEBwYXJhbSBlXG4gKiBAcGFyYW0gc29ja2V0VXJsXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBvbk1lc3NhZ2UgPSAoXG4gIGU6IE1lc3NhZ2VFdmVudCxcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgVXBsb2FkRXJyb3I+ID0+IHtcbiAgY29uc3QgZGF0YSA9IHRyeVBhcnNlSnNvbihlLmRhdGEpO1xuXG4gIGxldCBjYWxsYmFjaztcblxuICBpZiAoZGF0YSkge1xuICAgIGlmICghZGF0YS5hY3Rpb24gJiYgZGF0YS5tc2cpIHtcbiAgICAgIC8vIElmIGVycm9yXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBXZWJTb2NrZXRFcnJvcihkYXRhLm1zZyk7XG4gICAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG5cbiAgICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcImRlbGF5XCIgaW4gZGF0YSkge1xuICAgICAgICBjYWxsYmFjayA9IG9uVXBsb2FkTWVzc2FnZShkYXRhLCBsdWZpRmlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9IG9uQ2FuY2VsTWVzc2FnZShkYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2sgPSBvbkRvd25sb2FkTWVzc2FnZShlLmRhdGEsIGx1ZmlGaWxlKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsYmFjaztcbn07XG5cbi8qKlxuICogSXMgc29ja2V0IGNvbm5lY3Rpbmc/XG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29ubmVjdGluZyA9IChzb2NrZXRLZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgc29ja2V0cyAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gIHNvY2tldHNbc29ja2V0S2V5XS5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORztcblxuLyoqXG4gKiBJcyBzb2NrZXQgc3Bhd25lZD9cbiAqXG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNTcGF3bmVkID0gKHNvY2tldEtleTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICBzb2NrZXRzICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuXG4vKipcbiAqIEFzayBXZWJTb2NrZXQgdG8gY2FuY2VsIGFuIHVwbG9hZFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbmNlbFVwbG9hZCA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIHVwbG9hZFNvY2tldFVybChsdWZpRmlsZSksXG4gICAgbHVmaUZpbGUsXG4gICAgYCR7XG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBsdWZpRmlsZS5rZXlzLnNlcnZlcixcbiAgICAgICAgbW9kX3Rva2VuOiBsdWZpRmlsZS5hY3Rpb25Ub2tlbixcbiAgICAgICAgY2FuY2VsOiB0cnVlLFxuICAgICAgICBpOiBsdWZpRmlsZS5xdWV1ZUluZGV4LFxuICAgICAgfSlcbiAgICB9WFhNT0pPWFh1c2VsZXNzYCxcbiAgKTtcbn07XG5cbi8qKlxuICogRG93bmxvYWQgYSBwYXJ0IG9mIHRoZSBmaWxlIHRocm91Z2ggdGhlIFdlYlNvY2tldFxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHBhcmFtIGNodW5rTnVtYmVyXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZG93bmxvYWRDaHVuayA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuICBjaHVua051bWJlcjogbnVtYmVyLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgbGV0IG1lc3NhZ2U7XG5cbiAgaWYgKGx1ZmlGaWxlLnBhc3N3b3JkKSB7XG4gICAgbWVzc2FnZSA9IHsgcGFydDogY2h1bmtOdW1iZXIsIGZpbGVfcHdkOiBsdWZpRmlsZS5wYXNzd29yZCB9O1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSB7IHBhcnQ6IGNodW5rTnVtYmVyIH07XG4gIH1cblxuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgZG93bmxvYWRTb2NrZXRVcmwobHVmaUZpbGUpLFxuICAgIGx1ZmlGaWxlLFxuICAgIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLFxuICApO1xufTtcblxuLyoqXG4gKiBUZWxsIHRoZSBXZWJTb2NrZXQgdGhlIGRvd25sb2FkIGVuZGVkXG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5kRG93bmxvYWQgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGxldCBtZXNzYWdlOiB7IGVuZGVkOiB0cnVlOyBmaWxlX3B3ZD86IHN0cmluZyB9O1xuXG4gIGlmIChsdWZpRmlsZS5wYXNzd29yZCkge1xuICAgIG1lc3NhZ2UgPSB7IGVuZGVkOiB0cnVlLCBmaWxlX3B3ZDogbHVmaUZpbGUucGFzc3dvcmQgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0geyBlbmRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgcmV0dXJuIHNlbmRNZXNzYWdlKFxuICAgIGRvd25sb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSxcbiAgKTtcbn07XG5cbi8qKlxuICogVXBsb2FkIGEgY2h1bmsgb2YgdGhlIGZpbGUgdGhyb3VnaCB0aGUgV2ViU29ja2V0XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcGFyYW0gbWV0YWRhdGFcbiAqIEBwYXJhbSBlbmNyeXB0ZWREYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBsb2FkQ2h1bmsgPSAoXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbiAgbWV0YWRhdGE6IENsaWVudFVwbG9hZENodW5rTWV0YWRhdGEsXG4gIGVuY3J5cHRlZERhdGE6IEVuY3J5cHRlZERhdGEsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBlbmNyeXB0ZWREYXRhLmRhdGEgPSBiNjRlbmNvZGUoZW5jcnlwdGVkRGF0YS5kYXRhIGFzIEFycmF5QnVmZmVyKTtcblxuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgdXBsb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSl9WFhNT0pPWFgke0pTT04uc3RyaW5naWZ5KGVuY3J5cHRlZERhdGEpfWAsXG4gICk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBXZWJTb2NrZXRcbiAqXG4gKiBAcGFyYW0gc29ja2V0VXJsXG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHBhcmFtIGhhc1ByaW9yaXR5XG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCBzZW5kTWVzc2FnZSA9IChcbiAgc29ja2V0VXJsOiBzdHJpbmcsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbiAgbWVzc2FnZTogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgaWYgKCFpc1NwYXduZWQoc29ja2V0VXJsKSkge1xuICAgIHJldHVybiBzcGF3bihzb2NrZXRVcmwpLmFuZFRoZW4oKCkgPT4ge1xuICAgICAgc29ja2V0c1tzb2NrZXRVcmxdLm9ubWVzc2FnZSA9IChlKSA9PiBvbk1lc3NhZ2UoZSwgbHVmaUZpbGUpO1xuICAgICAgcmV0dXJuIHNlbmRNZXNzYWdlKHNvY2tldFVybCwgbHVmaUZpbGUsIG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNvY2tldHNbc29ja2V0VXJsXS5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTcGF3biBhIG5ldyBXZWJTb2NrZXQgb3IgcmV1c2UgYW4gZXhpc3Rpbmcgb25lLlxuICpcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEBwYXJhbSBlcnJvckNvdW50XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3Qgc3Bhd24gPSAoXG4gIHNvY2tldEtleTogc3RyaW5nLFxuICBlcnJvckNvdW50ID0gMCxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgaWYgKCFpc1NwYXduZWQoc29ja2V0S2V5KSAmJiAhaXNDb25uZWN0aW5nKHNvY2tldEtleSkpIHtcbiAgICAvLyBjb25zb2xlLmluZm8oYFNwYXduaW5nIFdlYlNvY2tldCAke3NvY2tldFVybH1gKTtcbiAgICBzb2NrZXRzW3NvY2tldEtleV0gPSBuZXcgV2ViU29ja2V0KHNvY2tldEtleSk7XG5cbiAgICBldmVudHMub25jZShFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQsICgpID0+IHtcbiAgICAgIHNvY2tldHNbc29ja2V0S2V5XS5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgZXZlbnRzLm9uY2UoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgKCkgPT4ge1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRVJBVElPTl9URVJNSU5BVEVEKTtcbiAgICB9KTtcblxuICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oYFdlYnNvY2tldCAke3NvY2tldEtleX0gaGFzIGJlZW4gb3BlbmApO1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRU5FRCk7XG4gICAgfTtcblxuICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGBXZWJzb2NrZXQgJHtzb2NrZXRLZXl9IGhhcyBiZWVuIGNsb3NlZGApO1xuICAgIH07XG5cbiAgICBzb2NrZXRzW3NvY2tldEtleV0ub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmICgrK2Vycm9yQ291bnQgPD0gTUFYX0VSUk9SUykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBBbiBlcnJvciBoYXBwZW5lZCB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgXCIke3NvY2tldEtleX1cIi4gVHJ5aW5nIGFnYWluLiAke2Vycm9yQ291bnR9IC8gJHtNQVhfRVJST1JTfWAsXG4gICAgICAgICAgKGV2ZW50IGFzIEVycm9yRXZlbnQpLmVycm9yLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBzcGF3bihzb2NrZXRLZXksIGVycm9yQ291bnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09ORVJST1IpO1xuICAgICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgICAgbmV3IFdlYlNvY2tldENvbm5lY3Rpb25FcnJvcihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgJHtzb2NrZXRLZXl9LmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHdhaXRGb3JDb25uZWN0aW9uKHNvY2tldEtleSlcbiAgICAuYW5kVGhlbigoKSA9PiBva0FzeW5jKHNvY2tldEtleSkpXG4gICAgLm9yRWxzZSgoZXJyb3IpID0+IGVyckFzeW5jKGVycm9yKSk7XG59O1xuXG4vKipcbiAqIFdhaXQgZm9yIFdlYlNvY2tldCB0byBvcGVuLiBSZXR1cm5zIGFuIGVycm9yIGlmIHRvbyBtYW55IGNvbm5lY3Rpb24gYXR0ZW1wdHMgYXJlIG1hZGUuXG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JDb25uZWN0aW9uID0gKFxuICBzb2NrZXRLZXk6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWlzU3Bhd25lZChzb2NrZXRLZXkpKSB7XG4gICAgICAgIGV2ZW50cy5vbmNlKEVWRU5ULlNPQ0tFVF9PUEVORUQsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50cy5vbihFVkVOVC5TT0NLRVRfT05FUlJPUiwgKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkVycm9yKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIHJldHVybiBlbnN1cmVFcnJvcihlcnJvcik7XG4gICAgfSxcbiAgKTtcblxuLyoqXG4gKiBDbG9zZSB0aGUgV2ViU29ja2V0XG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgY2xvc2UgPSAoc29ja2V0S2V5OiBzdHJpbmcpOiBSZXN1bHRBc3luYzxzdHJpbmcsIFdlYlNvY2tldEVycm9yPiA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoaXNTcGF3bmVkKHNvY2tldEtleSkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBXZWJTb2NrZXRFcnJvcihcIlVuYWJsZSB0byBjbG9zZSB0aGUgV2ViU29ja2V0XCIpKTtcbiAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgc29ja2V0c1tzb2NrZXRLZXldLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7XG4gICAgICAgICAgcmVzb2x2ZShzb2NrZXRLZXkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNvY2tldHNbc29ja2V0S2V5XS5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShzb2NrZXRLZXkpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICApO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gaW5zdGFuY2UgVVJMIGluIGEgV2ViU29ja2V0IFVSTFxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZVVybFxuICogQHBhcmFtIHBhdGhuYW1lXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgYnVpbGRTb2NrZXRVcmwgPSAoaW5zdGFuY2VVcmw6IFVSTCwgcGF0aG5hbWU6IHN0cmluZyk6IFVSTCA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoaW5zdGFuY2VVcmwpO1xuXG4gIGlmICghW1wid3M6XCIsIFwid3NzOlwiXS5pbmNsdWRlcyh1cmwucHJvdG9jb2wpKSB7XG4gICAgdXJsLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgPyBcIndzOlwiIDogXCJ3c3M6XCI7XG4gIH1cbiAgdXJsLnBhdGhuYW1lICs9IHBhdGhuYW1lO1xuXG4gIHJldHVybiBuZXcgVVJMKHVybC5vcmlnaW4gKyB1cmwucGF0aG5hbWUpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgZG93bmxvYWQgVVJMIGZvciB0aGUgc29ja2V0LiBSZXR1cm5zIGEgc3RyaW5nIHNpbmNlIGl0J3MgbW9zdGx5IHVzZWQgYXMgc29ja2V0cyBrZXlcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkb3dubG9hZFNvY2tldFVybCA9IChsdWZpRmlsZTogTHVmaUZpbGUpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYnVpbGRTb2NrZXRVcmwoXG4gICAgbmV3IFVSTChsdWZpRmlsZS5zZXJ2ZXJVcmwpLFxuICAgIFNvY2tldFBhdGguRE9XTkxPQUQgKyBgLyR7bHVmaUZpbGUua2V5cy5zZXJ2ZXJ9YCxcbiAgKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgdXBsb2FkIFVSTCBmb3IgdGhlIHNvY2tldC4gUmV0dXJucyBhIHN0cmluZyBzaW5jZSBpdCdzIG1vc3RseSB1c2VkIGFzIHNvY2tldHMga2V5XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBsb2FkU29ja2V0VXJsID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBidWlsZFNvY2tldFVybChuZXcgVVJMKGx1ZmlGaWxlLnNlcnZlclVybCksIFNvY2tldFBhdGguVVBMT0FEKVxuICAgIC50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBUcnkgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIEpTT04uIFJldHVybnMgZmFsc2UgaWYgbm90IHBvc3NpYmxlLlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5jb25zdCB0cnlQYXJzZUpzb24gPSAoZGF0YTogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgIGlmIChwYXJzZWRPYmplY3QgJiYgdHlwZW9mIHBhcnNlZE9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHBhcnNlZE9iamVjdDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChfZSkge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgaXMgU2VydmVyRG93bmxvYWRDaHVua01ldGFkYXRhXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NlcnZlckRvd25sb2FkQ2h1bmtTdWNjZXNzTWV0YWRhdGEgPSAoXG4gIG1lc3NhZ2U6IFNlcnZlckRvd25sb2FkQ2h1bmtNZXRhZGF0YSxcbik6IG1lc3NhZ2UgaXMgU2VydmVyRG93bmxvYWRDaHVua1N1Y2Nlc3NNZXRhZGF0YSA9PlxuICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJiBtZXNzYWdlICE9PSBudWxsICYmICEoXCJtc2dcIiBpbiBtZXNzYWdlKTtcbiIsICJpbXBvcnQgdHlwZSB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IGRvd25sb2FkQ2h1bmssIGRvd25sb2FkU29ja2V0VXJsLCBzb2NrZXRzIH0gZnJvbSBcIn4vYXBpL3dlYnNvY2tldC50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckV2ZW50IH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1ldmVudC50c1wiO1xuaW1wb3J0IHsgZXZlbnRzLCBpbml0IH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTb2NrZXRFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dlYnNvY2tldC93ZWJzb2NrZXQtZXJyb3IudHNcIjtcblxuZGVjbGFyZSBjb25zdCBzZWxmOiBXb3JrZXI7XG5sZXQgaXNJbml0aWF0ZWQgPSBmYWxzZTtcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICBpZiAoIWlzSW5pdGlhdGVkKSB7XG4gICAgaW5pdCgpO1xuICAgIGlzSW5pdGlhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGV2ZW50cy5vbihFVkVOVC5ET1dOTE9BRF9TVEFSVEVELCAoKSA9PiB7XG4gICAgc29ja2V0c1tkb3dubG9hZFNvY2tldFVybChldmVudC5kYXRhLmFyZ3MubHVmaUZpbGUpXS5jbG9zZSgpO1xuXG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5JTkZPU19SRVRSSUVWRUQgfSk7XG4gIH0pO1xuXG4gIHJldHJpZXZlSW5mb3MoZXZlbnQuZGF0YSkubWFwRXJyKChlcnJvcikgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsXG4gICAgICBlcnJvcixcbiAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgfSk7XG59O1xuXG5jb25zdCByZXRyaWV2ZUluZm9zID0gKFxuICB3b3JrZXJNZXNzYWdlOiBXb3JrZXJBY3Rpb25NZXNzYWdlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+XG4gIGRvd25sb2FkQ2h1bmsod29ya2VyTWVzc2FnZS5hcmdzLmx1ZmlGaWxlLCAwKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBdUJBLFFBQUksSUFBSSxPQUFPLFlBQVksV0FBVyxVQUFVO0FBQ2hELFFBQUksZUFBZSxLQUFLLE9BQU8sRUFBRSxVQUFVLGFBQ3ZDLEVBQUUsUUFDRixTQUFTQSxjQUFhLFFBQVEsVUFBVSxNQUFNO0FBQzlDLGFBQU8sU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLFVBQVUsSUFBSTtBQUFBLElBQzdEO0FBRUYsUUFBSTtBQUNKLFFBQUksS0FBSyxPQUFPLEVBQUUsWUFBWSxZQUFZO0FBQ3hDLHVCQUFpQixFQUFFO0FBQUEsSUFDckIsV0FBVyxPQUFPLHVCQUF1QjtBQUN2Qyx1QkFBaUIsU0FBU0MsZ0JBQWUsUUFBUTtBQUMvQyxlQUFPLE9BQU8sb0JBQW9CLE1BQU0sRUFDckMsT0FBTyxPQUFPLHNCQUFzQixNQUFNLENBQUM7QUFBQSxNQUNoRDtBQUFBLElBQ0YsT0FBTztBQUNMLHVCQUFpQixTQUFTQSxnQkFBZSxRQUFRO0FBQy9DLGVBQU8sT0FBTyxvQkFBb0IsTUFBTTtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUVBLGFBQVMsbUJBQW1CLFNBQVM7QUFDbkMsVUFBSSxXQUFXLFFBQVEsS0FBTSxTQUFRLEtBQUssT0FBTztBQUFBLElBQ25EO0FBRUEsUUFB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LGNBQVksS0FBSztBQUFBLE1BQU87QUFBRSxXQUFLLFVBQVE7QUFBQSxJQUFDLEdBQUUsS0FBSSxTQUFTLEdBQUU7QUFBQyxXQUFLLFdBQVMsV0FBVTtBQUFDLGVBQU0sVUFBUSxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsR0FBRSxVQUFTLFNBQVMsR0FBRTtBQUFDLFdBQUssV0FBUyxXQUFVO0FBQUMsZUFBTSxnQkFBYyxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsRUFBQyxFQUFDO0FBQzNjLElBQUFBLE1BQUssT0FBTyxNQUFJLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBRyxLQUFLLEVBQUU7QUFBRSxVQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFO0FBQU8sVUFBSSxJQUFFO0FBQUUsVUFBRyxNQUFJLEtBQUcsTUFBSSxLQUFHLE1BQUksRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHNCQUFzQjtBQUFFLFdBQUssSUFBRSxDQUFDLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsSUFBRSxJQUFFLElBQUcsS0FBSTtBQUFDLFlBQUUsRUFBRSxJQUFFLENBQUM7QUFBRSxZQUFHLE1BQUksSUFBRSxLQUFHLE1BQUksS0FBRyxNQUFJLElBQUUsRUFBRSxLQUFFLEVBQUUsTUFBSSxFQUFFLEtBQUcsS0FBRyxFQUFFLEtBQUcsS0FBRyxHQUFHLEtBQUcsS0FBRyxFQUFFLEtBQUcsSUFBRSxHQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxHQUFFLE1BQUksSUFBRSxNQUFJLElBQUUsS0FBRyxJQUFFLE1BQUksS0FBRyxLQUFHLElBQUcsSUFBRSxLQUFHLElBQUUsT0FBSyxLQUFHO0FBQUksVUFBRSxDQUFDLElBQUUsRUFBRSxJQUFFLENBQUMsSUFBRTtBQUFBLE1BQUM7QUFBQyxXQUFJLElBQUUsR0FBRSxHQUFFLEtBQUksSUFBSSxLQUFFLEVBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsS0FBRyxLQUFHLElBQUUsSUFBRSxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLENBQUMsSUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQzNmLEdBQUcsQ0FBQztBQUFBLElBQUM7QUFDTCxJQUFBQSxNQUFLLE9BQU8sSUFBSSxZQUFVLEVBQUMsU0FBUSxTQUFTLEdBQUU7QUFBQyxhQUFPLEdBQUcsTUFBSyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUU7QUFBQyxhQUFPLEdBQUcsTUFBSyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsR0FBRSxXQUFVO0FBQUMsVUFBSSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLENBQUMsR0FBRSxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFFLFdBQUksSUFBRSxHQUFFLE1BQU0sR0FBRSxJQUFJLElBQUcsRUFBRSxDQUFDLElBQUUsS0FBRyxJQUFFLE9BQUssS0FBRyxNQUFJLENBQUMsSUFBRTtBQUFFLFdBQUksSUFBRSxJQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRSxLQUFHLEtBQUcsR0FBRSxJQUFFLEVBQUUsQ0FBQyxLQUFHLEVBQUUsTUFBSSxJQUFFLElBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLElBQUUsS0FBRyxHQUFFLElBQUUsS0FBRyxJQUFFLElBQUUsTUFBSSxJQUFHLEVBQUUsQ0FBQyxJQUFFLEdBQUUsRUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFFLElBQUUsV0FBVSxJQUFFLFFBQVEsSUFBRSxNQUFNLElBQUUsV0FBVSxHQUFFLElBQUUsTUFBTSxFQUFFLENBQUMsSUFBRSxXQUFVLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLEdBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxLQUFHLE1BQUk7QUFBRSxXQUFJLElBQ2xnQixHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUFBLElBQUMsRUFBQztBQUNoRCxhQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFHLE1BQUksRUFBRSxPQUFPLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsd0JBQXdCO0FBQUUsVUFBSSxJQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUUsRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUksR0FBRSxHQUFFLEdBQUUsSUFBRSxFQUFFLFNBQU8sSUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEtBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBSSxFQUFFLElBQUUsRUFBRSxLQUFHLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRTtBQUFFLFdBQUksSUFDcmYsR0FBRSxJQUFFLEdBQUUsSUFBSSxHQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsQ0FBQyxJQUFFLEVBQUUsTUFBSSxFQUFFLEtBQUcsS0FBRyxFQUFFLEtBQUcsS0FBRyxHQUFHLEtBQUcsS0FBRyxFQUFFLEtBQUcsSUFBRSxHQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsR0FBRyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFO0FBQUUsYUFBTztBQUFBLElBQUM7QUFDaEgsSUFBQUEsTUFBSyxXQUFTLEVBQUMsVUFBUyxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRUEsTUFBSyxTQUFTLEVBQUUsRUFBRSxNQUFNLElBQUUsRUFBRSxHQUFFLE1BQUksSUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDO0FBQUUsYUFBTyxXQUFTLElBQUUsSUFBRUEsTUFBSyxTQUFTLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLEtBQUssTUFBTSxDQUFDLElBQUUsSUFBRSxFQUFFO0FBQUUsZUFBUSxJQUFFLElBQUUsSUFBRSxLQUFHLE1BQUksRUFBRSxJQUFFLEtBQUcsQ0FBQyxLQUFHLEtBQUcsSUFBRSxFQUFFLElBQUUsS0FBRyxJQUFFLENBQUMsTUFBSSxJQUFFLEVBQUUsSUFBRSxLQUFHLENBQUMsTUFBSSxNQUFJLEtBQUcsS0FBRztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBRyxNQUFJLEVBQUUsVUFBUSxNQUFJLEVBQUUsT0FBTyxRQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUUsRUFBRSxTQUFPLENBQUMsR0FBRSxJQUFFQSxNQUFLLFNBQVMsV0FBVyxDQUFDO0FBQUUsYUFBTyxPQUFLLElBQUUsRUFBRSxPQUFPLENBQUMsSUFBRUEsTUFBSyxTQUFTLEVBQUUsR0FBRSxHQUFFLElBQUUsR0FBRSxFQUFFLE1BQU0sR0FBRSxFQUFFLFNBQU8sQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBSSxJQUFFLEVBQUU7QUFBTyxhQUFPLE1BQzFmLElBQUUsSUFBRSxNQUFJLElBQUUsS0FBR0EsTUFBSyxTQUFTLFdBQVcsRUFBRSxJQUFFLENBQUMsQ0FBQztBQUFBLElBQUMsR0FBRSxPQUFNLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBRyxLQUFHLEVBQUUsU0FBTyxFQUFFLFFBQU87QUFBRSxVQUFFLEVBQUUsTUFBTSxHQUFFLEtBQUssS0FBSyxJQUFFLEVBQUUsQ0FBQztBQUFFLFVBQUksSUFBRSxFQUFFO0FBQU8sVUFBRSxJQUFFO0FBQUcsVUFBRSxLQUFHLE1BQUksRUFBRSxJQUFFLENBQUMsSUFBRUEsTUFBSyxTQUFTLFFBQVEsR0FBRSxFQUFFLElBQUUsQ0FBQyxJQUFFLGNBQVksSUFBRSxHQUFFLENBQUM7QUFBRyxhQUFPO0FBQUEsSUFBQyxHQUFFLFNBQVEsU0FBUyxHQUFFLEdBQUUsR0FBRTtBQUFDLGFBQU8sT0FBSyxJQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsS0FBRyxLQUFHLEtBQUcsZ0JBQWM7QUFBQSxJQUFDLEdBQUUsWUFBVyxTQUFTLEdBQUU7QUFBQyxhQUFPLEtBQUssTUFBTSxJQUFFLGFBQWEsS0FBRztBQUFBLElBQUUsR0FBRSxPQUFNLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBR0EsTUFBSyxTQUFTLFVBQVUsQ0FBQyxNQUFJQSxNQUFLLFNBQVMsVUFBVSxDQUFDLEVBQUUsUUFBTTtBQUFHLFVBQUksSUFBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxNQUFHLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU8sTUFDbGY7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJO0FBQUUsVUFBRTtBQUFFLFdBQUksV0FBUyxNQUFJLElBQUUsQ0FBQyxJQUFHLE1BQUksR0FBRSxLQUFHLEdBQUcsR0FBRSxLQUFLLENBQUMsR0FBRSxJQUFFO0FBQUUsVUFBRyxNQUFJLEVBQUUsUUFBTyxFQUFFLE9BQU8sQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxLQUFLLElBQUUsRUFBRSxDQUFDLE1BQUksQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEtBQUcsS0FBRztBQUFFLFVBQUUsRUFBRSxTQUFPLEVBQUUsRUFBRSxTQUFPLENBQUMsSUFBRTtBQUFFLFVBQUVBLE1BQUssU0FBUyxXQUFXLENBQUM7QUFBRSxRQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLElBQUUsSUFBRSxJQUFHLEtBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxDQUFDO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFO0FBQUMsYUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBSSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sRUFBRSxFQUFFLEtBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxTQUFRLElBQUUsVUFBUyxJQUFFLEtBQUc7QUFBRyxhQUFPO0FBQUEsSUFBQyxFQUFDO0FBQ3BkLElBQUFBLE1BQUssTUFBTSxhQUFXLEVBQUMsVUFBUyxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUUsSUFBRyxJQUFFQSxNQUFLLFNBQVMsVUFBVSxDQUFDLEdBQUUsR0FBRTtBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsSUFBRSxHQUFFLElBQUksUUFBSyxJQUFFLE9BQUssSUFBRSxFQUFFLElBQUUsQ0FBQyxJQUFHLEtBQUcsT0FBTyxhQUFhLE1BQUksTUFBSSxNQUFJLENBQUMsR0FBRSxNQUFJO0FBQUUsYUFBTyxtQkFBbUIsT0FBTyxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxVQUFFLFNBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUFFLFVBQUksSUFBRSxDQUFDLEdBQUUsR0FBRSxJQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEtBQUcsSUFBRSxFQUFFLFdBQVcsQ0FBQyxHQUFFLE9BQUssSUFBRSxPQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUUsSUFBRTtBQUFHLFVBQUUsS0FBRyxFQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLEtBQUcsSUFBRSxJQUFHLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFDcFosSUFBQUEsTUFBSyxNQUFNLE1BQUksRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRSxJQUFHO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxRQUFLLEVBQUUsQ0FBQyxJQUFFLEtBQUcsaUJBQWdCLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQztBQUFFLGFBQU8sRUFBRSxPQUFPLEdBQUVBLE1BQUssU0FBUyxVQUFVLENBQUMsSUFBRSxDQUFDO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUUsQ0FBQyxHQUFFO0FBQUUsVUFBRSxFQUFFLFFBQVEsVUFBUyxFQUFFO0FBQUUsVUFBRSxFQUFFO0FBQU8sVUFBRSxJQUFFO0FBQVcsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBRyxFQUFFLEdBQUUsS0FBSyxTQUFTLEVBQUUsT0FBTyxHQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQztBQUFFLGFBQU9BLE1BQUssU0FBUyxNQUFNLEdBQUUsSUFBRSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQzlWLElBQUFBLE1BQUssTUFBTSxTQUFPLEVBQUMsR0FBRSxvRUFBbUUsVUFBUyxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLElBQUcsSUFBRSxHQUFFLElBQUVBLE1BQUssTUFBTSxPQUFPLEdBQUUsSUFBRSxHQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxZQUFJLElBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxJQUFFO0FBQU0sV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFNBQU8sSUFBRyxNQUFHLEVBQUUsUUFBUSxJQUFFLEVBQUUsQ0FBQyxNQUFJLE9BQUssRUFBRSxHQUFFLElBQUUsS0FBRyxJQUFFLEVBQUUsQ0FBQyxLQUFHLElBQUUsR0FBRSxLQUFHLElBQUcsUUFBTSxNQUFJLEdBQUUsS0FBRztBQUFHLGFBQUssRUFBRSxTQUFPLEtBQUcsQ0FBQyxJQUFHLE1BQUc7QUFBSSxhQUFPO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFFLEVBQUUsUUFBUSxTQUFRLEVBQUU7QUFBRSxVQUFJLElBQUUsQ0FBQyxHQUFFLEdBQUUsSUFBRSxHQUFFLElBQUVBLE1BQUssTUFBTSxPQUFPLEdBQUUsSUFBRSxHQUFFO0FBQUUsWUFBSSxJQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsSUFBRTtBQUFNLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxZQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RmLFlBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsb0JBQW9CO0FBQUUsYUFBRyxLQUFHLEtBQUcsSUFBRyxFQUFFLEtBQUssSUFBRSxNQUFJLENBQUMsR0FBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLEtBQUcsR0FBRSxLQUFHLEtBQUcsS0FBRztBQUFBLE1BQUU7QUFBQyxVQUFFLE1BQUksRUFBRSxLQUFLQSxNQUFLLFNBQVMsUUFBUSxJQUFFLElBQUcsR0FBRSxDQUFDLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBQyxFQUFDO0FBQUUsSUFBQUEsTUFBSyxNQUFNLFlBQVUsRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLGFBQU9BLE1BQUssTUFBTSxPQUFPLFNBQVMsR0FBRSxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxhQUFPQSxNQUFLLE1BQU0sT0FBTyxPQUFPLEdBQUUsQ0FBQztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEtBQUcsS0FBSyxFQUFFO0FBQUUsV0FBRyxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsS0FBRyxLQUFLLE1BQU07QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLE9BQU8sT0FBSyxTQUFTLEdBQUU7QUFBQyxhQUFPLElBQUlBLE1BQUssS0FBSyxTQUFRLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUFDO0FBQ3hnQixJQUFBQSxNQUFLLEtBQUssT0FBTyxZQUFVLEVBQUMsV0FBVSxLQUFJLE9BQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFFBQU8sU0FBUyxHQUFFO0FBQUMsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLFVBQUksR0FBRSxJQUFFLEtBQUssSUFBRUEsTUFBSyxTQUFTLE9BQU8sS0FBSyxHQUFFLENBQUM7QUFBRSxVQUFFLEtBQUs7QUFBRSxVQUFFLEtBQUssSUFBRSxJQUFFQSxNQUFLLFNBQVMsVUFBVSxDQUFDO0FBQUUsVUFBRyxtQkFBaUIsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHFDQUFxQztBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBSSxJQUFFLElBQUksWUFBWSxDQUFDLEdBQUUsSUFBRTtBQUFFLGFBQUksSUFBRSxNQUFJLEtBQUcsTUFBSSxJQUFFLE1BQU8sS0FBRyxHQUFFLEtBQUcsSUFBSSxNQUFLLEVBQUUsRUFBRTtBQUFBLFVBQVMsS0FBRztBQUFBLFVBQ3RmLE1BQUksSUFBRTtBQUFBLFFBQUUsQ0FBQyxHQUFFLEtBQUc7QUFBRSxVQUFFLE9BQU8sR0FBRSxLQUFHLENBQUM7QUFBQSxNQUFDLE1BQU0sTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsTUFBTyxLQUFHLEdBQUUsS0FBRyxJQUFJLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFVBQVMsV0FBVTtBQUFDLFVBQUksR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFQSxNQUFLLFNBQVMsT0FBTyxHQUFFLENBQUNBLE1BQUssU0FBUyxRQUFRLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFBRSxXQUFJLElBQUUsRUFBRSxTQUFPLEdBQUUsSUFBRSxJQUFHLElBQUksR0FBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBRSxVQUFXLENBQUM7QUFBRSxXQUFJLEVBQUUsS0FBSyxLQUFLLElBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBUSxNQUFLLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSyxNQUFNO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFFLFdBQVU7QUFBQyxlQUFTLEVBQUVDLElBQUU7QUFBQyxlQUFPLGNBQWFBLEtBQUUsS0FBSyxNQUFNQSxFQUFDLEtBQUc7QUFBQSxNQUFDO0FBQUMsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUU7QUFBRyxhQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsR0FBRSxJQUFJLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxjQUN6ZjtBQUFHO0FBQUEsUUFBSztBQUFDLGNBQUksSUFBRSxNQUFJLEtBQUssRUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxHQUFFLENBQUMsSUFBRyxLQUFLLEVBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsSUFBRSxDQUFDLENBQUMsR0FBRTtBQUFBLE1BQUk7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUUsR0FBRSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUM7QUFBRSxXQUFJLElBQUUsR0FBRSxLQUFHLEdBQUUsSUFBSSxNQUFHLElBQUUsSUFBRSxFQUFFLENBQUMsS0FBRyxJQUFFLEVBQUUsSUFBRSxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxLQUFHLEVBQUUsR0FBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsS0FBRyxLQUFHLEtBQUcsT0FBSyxNQUFJLEtBQUcsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxNQUFJLEVBQUUsSUFBRSxFQUFFLElBQUUsRUFBRSxJQUFFLElBQUUsRUFBRSxJQUFFLElBQUcsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLEtBQUcsS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUksSUFBRSxLQUFHLElBQUUsTUFBSSxFQUFFLENBQUMsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLElBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsS0FBRyxJQUFFLElBQUUsS0FBRyxJQUFFLE9BQUssTUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLEtBQUcsS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUk7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUNwZjtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBRCxNQUFLLEtBQUssU0FBTyxTQUFTLEdBQUU7QUFBQyxXQUFLLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRTtBQUFFLFdBQUcsS0FBSyxJQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEtBQUcsS0FBSyxNQUFNO0FBQUEsSUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxPQUFPLE9BQUssU0FBUyxHQUFFO0FBQUMsYUFBTyxJQUFJQSxNQUFLLEtBQUssU0FBUSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQUEsSUFBQztBQUMvUyxJQUFBQSxNQUFLLEtBQUssT0FBTyxZQUFVLEVBQUMsV0FBVSxNQUFLLE9BQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFFBQU8sU0FBUyxHQUFFO0FBQUMsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLFVBQUksR0FBRSxJQUFFLEtBQUssSUFBRUEsTUFBSyxTQUFTLE9BQU8sS0FBSyxHQUFFLENBQUM7QUFBRSxVQUFFLEtBQUs7QUFBRSxVQUFFLEtBQUssSUFBRSxJQUFFQSxNQUFLLFNBQVMsVUFBVSxDQUFDO0FBQUUsVUFBRyxtQkFBaUIsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHFDQUFxQztBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBSSxJQUFFLElBQUksWUFBWSxDQUFDLEdBQUUsSUFBRTtBQUFFLGFBQUksSUFBRSxPQUFLLEtBQUcsT0FBSyxJQUFFLE9BQU0sS0FBRyxHQUFFLEtBQUcsS0FBSyxNQUFLLEVBQUUsRUFBRSxTQUFTLEtBQ3RmLEdBQUUsTUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEtBQUc7QUFBRSxVQUFFLE9BQU8sR0FBRSxLQUFHLENBQUM7QUFBQSxNQUFDLE1BQU0sTUFBSSxJQUFFLE9BQUssS0FBRyxPQUFLLElBQUUsT0FBTSxLQUFHLEdBQUUsS0FBRyxLQUFLLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBSSxHQUFFLFVBQVMsV0FBVTtBQUFDLFVBQUksR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFLEtBQUssR0FBRSxJQUFFQSxNQUFLLFNBQVMsT0FBTyxHQUFFLENBQUNBLE1BQUssU0FBUyxRQUFRLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFBRSxXQUFJLElBQUUsRUFBRSxTQUFPLEdBQUUsSUFBRSxJQUFHLElBQUksR0FBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxDQUFDO0FBQUUsUUFBRSxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUUsVUFBVyxDQUFDO0FBQUUsV0FBSSxFQUFFLEtBQUssS0FBSyxJQUFFLENBQUMsR0FBRSxFQUFFLFNBQVEsTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUssTUFBTTtBQUFFLGFBQU87QUFBQSxJQUFDLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRyxDQUFDLFVBQVMsVUFBUyxTQUFRLFNBQVEsVUFBUyxTQUFRLFNBQVEsT0FBTyxHQUFFLEdBQUUsQ0FBQyxHQUFFLElBQUc7QUFBQSxNQUFDO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFDbGY7QUFBQSxNQUFRO0FBQUEsTUFBTztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBTztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFPO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUNwZjtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsSUFBTyxHQUFFLEdBQUUsV0FBVTtBQUFDLGVBQVMsRUFBRUMsSUFBRTtBQUFDLGVBQU8sY0FBYUEsS0FBRSxLQUFLLE1BQU1BLEVBQUMsS0FBRztBQUFBLE1BQUM7QUFBQyxlQUFTLEVBQUVBLElBQUU7QUFBQyxlQUFPLGlCQUFlQSxLQUFFLEtBQUssTUFBTUEsRUFBQyxLQUFHO0FBQUEsTUFBRztBQUFDLGVBQVEsSUFBRSxHQUFFLElBQUUsR0FBRSxHQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxZQUFFO0FBQUcsYUFBSSxJQUFFLEdBQUUsSUFBRSxLQUFHLEdBQUUsSUFBSSxLQUFHLE1BQUksSUFBRSxHQUFFO0FBQUMsY0FBRTtBQUFHO0FBQUEsUUFBSztBQUFDLGNBQUksSUFBRSxNQUFJLEtBQUssRUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxHQUFFLEtBQUssRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsR0FBRSxDQUFDLEtBQUcsS0FBRyxLQUFLLEdBQUcsQ0FBQyxJQUFHLEtBQUssRUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUUsS0FBSyxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLENBQUMsQ0FBQyxLQUFHLEtBQUcsS0FBSyxHQUFHLENBQUMsR0FBRTtBQUFBLE1BQUk7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQ3ZnQixHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxLQUFHLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUU7QUFBRSxVQUFHLGdCQUFjLE9BQU8sYUFBWTtBQUFDLFlBQUUsTUFBTSxHQUFHO0FBQUUsaUJBQVEsSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLEdBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFBLE1BQUMsTUFBTSxLQUFFO0FBQUUsVUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsSUFBRyxJQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsS0FBRyxHQUFFLEtBQUk7QUFBQyxZQUFHLEtBQUcsRUFBRSxLQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDO0FBQUEsYUFBTTtBQUFDLGNBQUUsRUFBRSxLQUFHLElBQUUsR0FBRztBQUFFLGNBQUksSUFBRSxFQUFFLEtBQUcsSUFBRSxNQUFJLENBQUM7QUFBRSxlQUFHLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksS0FBRyxNQUFJO0FBQUUsY0FBSSxLQUFHLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSTtBQUFHLGNBQUUsRUFBRSxLQUFHLElBQUUsRUFBRTtBQUFFLGNBQUksSUFBRSxFQUFFLEtBQUcsSUFBRSxLQUFHLENBQUMsR0FDbmYsS0FBRyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsSUFBRSxNQUFJLE1BQUksTUFBSSxHQUFFLEtBQUcsS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLElBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLEdBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxNQUFJLENBQUM7QUFBRSxjQUFFLElBQUUsRUFBRSxLQUFHLElBQUUsS0FBRyxDQUFDO0FBQUUsY0FBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFO0FBQUcsZUFBRztBQUFFLGVBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxlQUFHO0FBQUUsZUFBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFBLFFBQUU7QUFBQyxVQUFFLElBQUUsQ0FBQyxJQUFFLEtBQUc7QUFBRSxVQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsS0FBRztBQUFFLFlBQUksSUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEdBQUUsS0FBRyxJQUFFLElBQUUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsR0FBRSxLQUFHLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxHQUFFLEtBQUcsS0FBRyxJQUFFLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxNQUFJLEtBQUcsS0FBRyxNQUFJLElBQUcsS0FBRyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksSUFBRyxLQUFHLEVBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxFQUFFLElBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxNQUFJLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxLQUFJLElBQUUsTUFBSSxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FDcGYsS0FBRyxNQUFJLE9BQUssTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLElBQUcsSUFBRSxJQUFFLElBQUcsSUFBRSxLQUFHLEtBQUcsTUFBSSxJQUFFLE9BQUssSUFBRSxJQUFFLEtBQUksSUFBRSxJQUFFLElBQUcsSUFBRSxLQUFHLE1BQUksTUFBSSxJQUFFLE9BQUssSUFBRSxJQUFFLEtBQUksSUFBRSxJQUFFLElBQUUsR0FBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBSSxZQUFFLElBQUU7QUFBRyxZQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFLElBQUUsSUFBRTtBQUFFLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRSxJQUFFLElBQUU7QUFBRSxZQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFBLE1BQUM7QUFBQyxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLEVBQUUsSUFBRSxJQUFFLElBQ25mO0FBQUUsUUFBRSxFQUFFLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLEVBQUUsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLEVBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsRUFBRSxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFBLElBQUMsRUFBQztBQUN6SCxJQUFBRCxNQUFLLEtBQUssTUFBSSxFQUFDLE1BQUssT0FBTSxHQUFFLENBQUMsR0FBRSxnQkFBZSxTQUFTLEdBQUU7QUFBQyxNQUFBQSxNQUFLLEtBQUssSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLElBQUMsR0FBRSxrQkFBaUIsU0FBUyxHQUFFO0FBQUMsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxRQUFRLENBQUM7QUFBRSxXQUFHLEtBQUdBLE1BQUssS0FBSyxJQUFJLEVBQUUsT0FBTyxHQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsSUFBRyxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsTUFBTSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUksR0FBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsSUFBRUEsTUFBSyxVQUFTLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRTtBQUFFLFVBQUUsS0FBRztBQUFHLFVBQUUsS0FBRyxDQUFDO0FBQUUsVUFBRyxJQUFFLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSxrQ0FBa0M7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLEdBQUUsSUFBSTtBQUFDLFVBQUUsS0FBRyxNQUFJLElBQUUsS0FBRztBQUFHLFVBQUUsRUFBRTtBQUFBLFFBQU07QUFBQSxRQUN0ZixLQUFHLEtBQUc7QUFBQSxNQUFFO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxhQUFPLEVBQUUsT0FBTyxFQUFFLE1BQUssRUFBRSxHQUFHO0FBQUEsSUFBQyxHQUFFLFNBQVEsU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFFLEtBQUc7QUFBRyxVQUFFLEtBQUcsQ0FBQztBQUFFLFVBQUksSUFBRUEsTUFBSyxVQUFTLElBQUUsRUFBRSxVQUFVLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFVLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxTQUFTLEdBQUUsSUFBRSxDQUFDLEdBQUUsS0FBRyxJQUFFLEtBQUc7QUFBRSxVQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsR0FBRSxJQUFJO0FBQUMsVUFBRSxLQUFHLE1BQUksSUFBRSxLQUFHO0FBQUcsVUFBRSxFQUFFLE1BQU0sR0FBRSxLQUFHLEtBQUcsRUFBRTtBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLEdBQUUsRUFBRSxNQUFLLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSSxDQUFDLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx3QkFBd0I7QUFDeGhCLGFBQU8sRUFBRTtBQUFBLElBQUksR0FBRSxJQUFHLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsQ0FBQyxHQUFFLElBQUVBLE1BQUssVUFBUyxJQUFFLEVBQUU7QUFBRSxVQUFFLENBQUMsRUFBRSxRQUFRLElBQUcsRUFBRSxTQUFPLEtBQUcsS0FBRyxJQUFFLEtBQUcsSUFBRSxJQUFFLENBQUMsQ0FBQztBQUFFLFVBQUUsRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFFLFFBQUUsQ0FBQyxLQUFHO0FBQUUsVUFBRSxFQUFFLFFBQVEsQ0FBQztBQUFFLFVBQUcsRUFBRSxPQUFPLE1BQUksSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsU0FBTyxJQUFFLElBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBRyxDQUFDLENBQUMsSUFBRSxjQUFZLE1BQUksSUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsSUFBRyxLQUFLLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFHLElBQUUsRUFBRSxPQUFPLEdBQUUsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsS0FBRSxFQUFFLFFBQVEsRUFBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFO0FBQUUsV0FBRztBQUFFLFVBQUcsSUFBRSxLQUFHLElBQUUsS0FBRyxLQUFHLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx5QkFBeUI7QUFDbmYsVUFBRyxhQUFXLEVBQUUsVUFBUSxhQUFXLEVBQUUsT0FBTyxPQUFNLElBQUlBLE1BQUssVUFBVSxJQUFJLHdDQUF3QztBQUFFLFVBQUVBLE1BQUssS0FBSyxJQUFJLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUcsRUFBRSxLQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBTyxFQUFFLE1BQU0sR0FBRSxJQUFFLENBQUM7QUFBQSxJQUFDLEdBQUUsR0FBRSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUVBLE1BQUs7QUFBUyxVQUFFLEVBQUU7QUFBRSxVQUFJLElBQUUsRUFBRSxRQUFPLElBQUUsRUFBRSxVQUFVLENBQUMsR0FBRSxJQUFFLElBQUUsSUFBRyxJQUFFO0FBQUUsVUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsR0FBRSxJQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFHLENBQUMsRUFBRSxRQUFNLEVBQUMsS0FBSSxHQUFFLE1BQUssQ0FBQyxFQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLEtBQUcsRUFBRSxLQUFFLE1BQUlBLE1BQUssS0FBSyxJQUFJLEdBQUcsSUFDcmdCLENBQUMsR0FBRSxLQUFHLElBQUcsRUFBRSxDQUFDLEtBQUksSUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQztBQUFFLGFBQU0sRUFBQyxLQUFJLEdBQUUsTUFBSyxFQUFFLE1BQU0sR0FBRSxDQUFDLEVBQUM7QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssT0FBSyxTQUFTLEdBQUUsR0FBRTtBQUFDLFdBQUssSUFBRSxJQUFFLEtBQUdBLE1BQUssS0FBSztBQUFPLFVBQUksSUFBRSxDQUFDLENBQUMsR0FBRSxDQUFDLENBQUMsR0FBRSxHQUFFLElBQUUsRUFBRSxVQUFVLFlBQVU7QUFBRyxXQUFLLElBQUUsQ0FBQyxJQUFJLEtBQUUsSUFBSSxHQUFDO0FBQUUsUUFBRSxTQUFPLE1BQUksSUFBRSxFQUFFLEtBQUssQ0FBQztBQUFHLFdBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxXQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRTtBQUFXLFdBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssSUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUFBLElBQUM7QUFDM1ksSUFBQUEsTUFBSyxLQUFLLEtBQUssVUFBVSxVQUFRQSxNQUFLLEtBQUssS0FBSyxVQUFVLE1BQUksU0FBUyxHQUFFO0FBQUMsVUFBRyxLQUFLLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx5Q0FBeUM7QUFBRSxXQUFLLE9BQU8sQ0FBQztBQUFFLGFBQU8sS0FBSyxPQUFPLENBQUM7QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLEtBQUssVUFBVSxRQUFNLFdBQVU7QUFBQyxXQUFLLElBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFBLElBQUU7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFNBQU8sU0FBUyxHQUFFO0FBQUMsV0FBSyxJQUFFO0FBQUcsV0FBSyxFQUFFLE9BQU8sQ0FBQztBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFNBQU8sV0FBVTtBQUFDLFVBQUksSUFBRSxLQUFLLEVBQUUsU0FBUyxHQUFFLElBQUcsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFHLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBRSxXQUFLLE1BQU07QUFBRSxhQUFPO0FBQUEsSUFBQztBQUN2ZSxJQUFBQSxNQUFLLEtBQUssU0FBTyxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUUsS0FBRztBQUFJLFVBQUcsSUFBRSxLQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLDBCQUEwQjtBQUFFLG1CQUFXLE9BQU8sTUFBSSxJQUFFQSxNQUFLLE1BQU0sV0FBVyxPQUFPLENBQUM7QUFBRyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBRSxLQUFHQSxNQUFLLEtBQUs7QUFBSyxVQUFFLElBQUksRUFBRSxDQUFDO0FBQUUsVUFBSSxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUVBLE1BQUs7QUFBUyxXQUFJLElBQUUsR0FBRSxLQUFHLEVBQUUsVUFBUSxLQUFHLElBQUcsS0FBSTtBQUFDLFlBQUUsSUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUFFLGFBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFJLE1BQUksSUFBRSxFQUFFLFFBQVEsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQztBQUFFLFlBQUUsRUFBRSxPQUFPLENBQUM7QUFBQSxNQUFDO0FBQUMsWUFBSSxJQUFFLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBRyxhQUFPO0FBQUEsSUFBQztBQUNuZCxJQUFBQSxNQUFLLE9BQUssU0FBUyxHQUFFO0FBQUMsV0FBSyxJQUFFLENBQUMsSUFBSUEsTUFBSyxLQUFLLFFBQU07QUFBRSxXQUFLLElBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFO0FBQUUsV0FBSyxJQUFFLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRSxLQUFLLElBQUUsS0FBSyxJQUFFLEtBQUssS0FBRztBQUFFLFdBQUssSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUssSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBTyxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUU7QUFBRyxXQUFLLElBQUUsRUFBQyxVQUFTLENBQUMsR0FBRSxRQUFPLENBQUMsRUFBQztBQUFFLFdBQUssSUFBRSxLQUFLLEtBQUc7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLEtBQUc7QUFBUSxXQUFLLElBQUUsQ0FBQyxHQUFFLElBQUcsSUFBRyxJQUFHLEtBQUksS0FBSSxLQUFNLEtBQUksS0FBSSxLQUFJLElBQUk7QUFBRSxXQUFLLEtBQUc7QUFBSSxXQUFLLElBQUU7QUFBQSxJQUFFO0FBQ3pXLElBQUFBLE1BQUssS0FBSyxZQUFVO0FBQUEsTUFBQyxhQUFZLFNBQVMsR0FBRSxHQUFFO0FBQUMsWUFBSSxJQUFFLENBQUMsR0FBRTtBQUFFLFlBQUUsS0FBSyxRQUFRLENBQUM7QUFBRSxZQUFJO0FBQUUsWUFBRyxNQUFJLEtBQUssRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxTQUFTLHdCQUF3QjtBQUFFLFlBQUcsSUFBRSxLQUFLLEdBQUU7QUFBQyxjQUFFLEVBQUUsSUFBRSxLQUFLO0FBQUcsY0FBRSxDQUFDO0FBQUUsY0FBSSxJQUFFLEdBQUU7QUFBRSxlQUFLLElBQUUsRUFBRSxDQUFDLEtBQUcsb0JBQUksUUFBTSxRQUFRLElBQUUsS0FBSztBQUFHLGVBQUksSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLEdBQUUsS0FBSyxhQUFZLEtBQUssT0FBTyxJQUFFLENBQUM7QUFBRSxlQUFJLElBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxXQUFTLElBQUUsRUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUUsS0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFFLEtBQUssRUFBRSxDQUFDLElBQUUsR0FBRSxLQUFHLEVBQUUsS0FBSyxJQUFFLEtBQUcsS0FBSSxJQUFJO0FBQUMsZUFBSyxLQUFHLEtBQUcsS0FBSyxFQUFFLFdBQVMsS0FBSyxFQUFFLEtBQUssSUFBSUEsTUFBSyxLQUFLLFFBQU0sR0FBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQUcsZUFBSyxLQUFHO0FBQUUsY0FBRSxLQUFLLE1BQUksS0FBSyxJQUN2ZjtBQUFHLGVBQUs7QUFBSSxlQUFLLElBQUVBLE1BQUssS0FBSyxPQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQUUsZUFBSyxJQUFFLElBQUlBLE1BQUssT0FBTyxJQUFJLEtBQUssQ0FBQztBQUFFLGVBQUksSUFBRSxHQUFFLElBQUUsTUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFFLEtBQUssRUFBRSxDQUFDLElBQUUsSUFBRSxHQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBRyxJQUFJO0FBQUEsUUFBQztBQUFDLGFBQUksSUFBRSxHQUFFLElBQUUsR0FBRSxLQUFHLEVBQUUsUUFBSyxJQUFFLEtBQUcsS0FBSyxNQUFJLEdBQUcsSUFBSSxHQUFFLElBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBRyxJQUFJO0FBQUUsZUFBTyxFQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUEsTUFBQztBQUFBLE1BQUUsb0JBQW1CLFNBQVMsR0FBRSxHQUFFO0FBQUMsWUFBRyxNQUFJLEtBQUcsMEVBQXdFLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSxxRUFBcUU7QUFBRSxhQUFLLElBQUU7QUFBQSxNQUFDO0FBQUEsTUFBRSxZQUFXLFNBQVMsR0FDbGdCLEdBQUUsR0FBRTtBQUFDLFlBQUUsS0FBRztBQUFPLFlBQUksR0FBRSxHQUFFLEtBQUcsb0JBQUksUUFBTSxRQUFRLEdBQUUsSUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSyxRQUFRLEdBQUUsSUFBRTtBQUFFLFlBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxtQkFBUyxNQUFJLElBQUUsS0FBSyxFQUFFLENBQUMsSUFBRSxLQUFLO0FBQU0sbUJBQVMsTUFBSSxJQUFFLEtBQUssRUFBRSxDQUFDLElBQUU7QUFBRyxhQUFLLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRSxDQUFDLElBQUUsS0FBRyxLQUFLLEVBQUU7QUFBTyxnQkFBTyxPQUFPLEdBQUU7QUFBQSxVQUFDLEtBQUs7QUFBUyx1QkFBUyxNQUFJLElBQUU7QUFBRyxpQkFBSyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRSxLQUFLLEtBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLENBQUMsQ0FBQztBQUFFO0FBQUEsVUFBTSxLQUFLO0FBQVMsZ0JBQUUsT0FBTyxVQUFVLFNBQVMsS0FBSyxDQUFDO0FBQUUsZ0JBQUcsMkJBQXlCLEdBQUU7QUFBQyxrQkFBRSxDQUFDO0FBQUUsbUJBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUUsa0JBQUU7QUFBQSxZQUFDLE1BQU0sTUFBSSxxQkFBbUIsTUFBSSxJQUFFLElBQUcsSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFRLENBQUMsR0FBRSxJQUFJLGNBQVcsT0FBTyxFQUFFLENBQUMsTUFDbmYsSUFBRTtBQUFHLGdCQUFHLENBQUMsR0FBRTtBQUFDLGtCQUFHLFdBQVMsRUFBRSxNQUFJLElBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksTUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsSUFBRyxNQUFJLElBQUUsTUFBSTtBQUFFLG1CQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFFLEtBQUssS0FBSSxHQUFFLEdBQUUsR0FBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUFBLFlBQUM7QUFBQztBQUFBLFVBQU0sS0FBSztBQUFTLHVCQUFTLE1BQUksSUFBRSxFQUFFO0FBQVEsaUJBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUUsS0FBSyxLQUFJLEdBQUUsR0FBRSxHQUFFLEVBQUUsTUFBTSxDQUFDO0FBQUUsaUJBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDO0FBQUU7QUFBQSxVQUFNO0FBQVEsZ0JBQUU7QUFBQSxRQUFDO0FBQUMsWUFBRyxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLElBQUkscUVBQXFFO0FBQUUsYUFBSyxFQUFFLENBQUMsS0FBRztBQUFFLGFBQUssS0FBRztBQUFFLGNBQUksS0FBSyxNQUFJLEtBQUssUUFBUSxNQUFJLEtBQUssS0FBRyxHQUFHLFVBQVMsS0FBSyxJQUFJLEtBQUssR0FBRSxLQUFLLENBQUMsQ0FBQyxHQUFFLEdBQUcsWUFBVyxLQUFLLFlBQVksQ0FBQztBQUFBLE1BQUU7QUFBQSxNQUN0ZixTQUFRLFNBQVMsR0FBRTtBQUFDLFlBQUUsS0FBSyxFQUFFLFdBQVMsSUFBRSxJQUFFLEtBQUssQ0FBQztBQUFFLGVBQU8sS0FBSyxLQUFHLEtBQUssS0FBRyxJQUFFLEtBQUssRUFBRSxDQUFDLElBQUUsS0FBSyxNQUFJLG9CQUFJLFFBQU0sUUFBUSxJQUFFLEtBQUssSUFBRSxLQUFLLElBQUUsS0FBSyxJQUFFLEtBQUssSUFBRSxLQUFLLEtBQUcsSUFBRSxLQUFLLElBQUUsS0FBSyxJQUFFLEtBQUs7QUFBQSxNQUFD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LFVBQUUsS0FBRyxDQUFDO0FBQUUsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFJLElBQUVBLE1BQUs7QUFBSyxVQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxFQUFFLFFBQVEsR0FBRSxDQUFDLEdBQUUsR0FBRSxJQUFFO0FBQUUsVUFBSSxHQUFFO0FBQUUsVUFBRSxFQUFFO0FBQU0sbUJBQVcsT0FBTyxFQUFFLFNBQU8sRUFBRSxPQUFLQSxNQUFLLE1BQU0sT0FBTyxPQUFPLEVBQUUsSUFBSTtBQUFHLG1CQUFXLE9BQU8sRUFBRSxPQUFLLEVBQUUsS0FBR0EsTUFBSyxNQUFNLE9BQU8sT0FBTyxFQUFFLEVBQUU7QUFBRyxVQUFHLENBQUNBLE1BQUssS0FBSyxFQUFFLElBQUksS0FBRyxDQUFDQSxNQUFLLE9BQU8sRUFBRSxNQUFNLEtBQUcsYUFDbGYsT0FBTyxLQUFHLE9BQUssRUFBRSxRQUFNLE9BQUssRUFBRSxNQUFJLE9BQUssRUFBRSxNQUFJLFFBQU0sRUFBRSxNQUFJLFFBQU0sRUFBRSxNQUFJLFFBQU0sRUFBRSxNQUFJLFFBQVEsRUFBRSxNQUFJLENBQUMsRUFBRSxNQUFJLElBQUUsRUFBRSxHQUFHLFVBQVEsSUFBRSxFQUFFLEdBQUcsT0FBTyxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLG1CQUFXLE9BQU8sS0FBRyxJQUFFQSxNQUFLLEtBQUssYUFBYSxHQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFHLEVBQUUsR0FBRSxFQUFFLE9BQUssRUFBRSxRQUFNQSxNQUFLLE9BQUssYUFBYUEsTUFBSyxJQUFJLFFBQVEsY0FBWSxJQUFFLEVBQUUsTUFBTUEsTUFBSyxNQUFNLE9BQU8sT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRSxFQUFFLEtBQUcsRUFBRTtBQUFHLG1CQUFXLE9BQU8sTUFBSSxJQUFFQSxNQUFLLE1BQU0sV0FBVyxPQUFPLENBQUM7QUFBRyxVQUFFLElBQUlBLE1BQUss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RUFBRSxDQUFDLEVBQUUsT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSwrQkFBK0I7QUFBRSxVQUFFLENBQUMsSUFBRSxFQUFFLENBQUM7QUFBQSxNQUFDO0FBQUMsYUFBTztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFLENBQUMsR0FBRTtBQUFFLFdBQUksS0FBSyxFQUFFLEdBQUUsZUFBZSxDQUFDLEtBQUcsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUcsYUFBTztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FDNWYsR0FBRTtBQUFDLFVBQUksSUFBRSxDQUFDLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLFlBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUcsYUFBTztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssVUFBUUEsTUFBSyxLQUFLO0FBQVEsSUFBQUEsTUFBSyxVQUFRQSxNQUFLLEtBQUs7QUFBUSxJQUFBQSxNQUFLLEtBQUssS0FBRyxDQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLGVBQWEsU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUVBLE1BQUssS0FBSyxJQUFHO0FBQUUsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFFLEVBQUUsUUFBTTtBQUFJLFVBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEtBQUcsQ0FBQztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEtBQUcsRUFBQyxXQUFVLEVBQUUsUUFBTSxFQUFFLEtBQUssU0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUVBLE1BQUssT0FBTyxZQUFZLEdBQUUsQ0FBQyxFQUFDO0FBQUUsVUFBRSxXQUFTLEVBQUUsT0FBSyxFQUFFLFlBQVUsRUFBRTtBQUFLLFFBQUUsQ0FB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QUFNO0FBRTNELFNBQUssWUFBWSxFQUFFLCtDQUE2QixDQUFDO0FBQUEsRUFDbkQsQ0FBQztBQUVELGdCQUFjLE1BQU0sSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0FBQzFDLFNBQUssWUFBWTtBQUFBLE1BQ2Y7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFnQjtBQUFBLEVBQ2xCLENBQUM7QUFDSDtBQUVBLElBQU0sZ0JBQWdCLENBQ3BCLGtCQUVBLGNBQWMsY0FBYyxLQUFLLFVBQVUsQ0FBQzsiLAogICJuYW1lcyI6IFsiUmVmbGVjdEFwcGx5IiwgIlJlZmxlY3RPd25LZXlzIiwgIk51bWJlcklzTmFOIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAiZXJyIiwgIm9uY2UiLCAic2pjbCIsICJhIiwgInYiLCAib2siLCAiZXJyIiwgIlJlc3VsdCIsICJmcm9tVGhyb3dhYmxlIiwgIm9rIiwgImVyciIsICJzZWxmIiwgIkV2ZW50RW1pdHRlciIsICJvYmoiLCAiRGVjb2RlIiwgIm9iaiIsICJzamNsIiwgImRlY3J5cHQiLCAiRGVjb2RlIiwgImRlY3J5cHQiLCAiZGVjcnlwdCJdCn0K diff --git a/themes/default/public/js/minified/worker/main.js b/themes/default/public/js/minified/worker/main.js deleted file mode 100644 index 6cc715f..0000000 --- a/themes/default/public/js/minified/worker/main.js +++ /dev/null @@ -1 +0,0 @@ -var te=Object.create;var R=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var ue=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var ae=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of oe(e))!ie.call(r,o)&&o!==t&&R(r,o,{get:()=>e[o],enumerable:!(n=ne(e,o))||n.enumerable});return r};var fe=(r,e,t)=>(t=r!=null?te(se(r)):{},ae(e||!r||!r.__esModule?R(t,"default",{value:r,enumerable:!0}):t,r));var G=ue((Ae,M)=>{"use strict";var b=typeof Reflect=="object"?Reflect:null,U=b&&typeof b.apply=="function"?b.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},P;b&&typeof b.ownKeys=="function"?P=b.ownKeys:Object.getOwnPropertySymbols?P=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:P=function(e){return Object.getOwnPropertyNames(e)};function ce(r){console&&console.warn&&console.warn(r)}var T=Number.isNaN||function(e){return e!==e};function a(){a.init.call(this)}M.exports=a;M.exports.once=de;a.EventEmitter=a;a.prototype._events=void 0;a.prototype._eventsCount=0;a.prototype._maxListeners=void 0;var F=10;function x(r){if(typeof r!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return F},set:function(r){if(typeof r!="number"||r<0||T(r))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+r+".");F=r}});a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};a.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||T(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function j(r){return r._maxListeners===void 0?a.defaultMaxListeners:r._maxListeners}a.prototype.getMaxListeners=function(){return j(this)};a.prototype.emit=function(e){for(var t=[],n=1;n0&&(s=t[0]),s instanceof Error)throw s;var f=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw f.context=s,f}var h=i[e];if(h===void 0)return!1;if(typeof h=="function")U(h,this,t);else for(var m=h.length,u=B(h,m),n=0;n0&&s.length>o&&!s.warned){s.warned=!0;var f=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");f.name="MaxListenersExceededWarning",f.emitter=r,f.type=e,f.count=s.length,ce(f)}return r}a.prototype.addListener=function(e,t){return N(this,e,t,!1)};a.prototype.on=a.prototype.addListener;a.prototype.prependListener=function(e,t){return N(this,e,t,!0)};function le(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function W(r,e,t){var n={fired:!1,wrapFn:void 0,target:r,type:e,listener:t},o=le.bind(n);return o.listener=t,n.wrapFn=o,o}a.prototype.once=function(e,t){return x(t),this.on(e,W(this,e,t)),this};a.prototype.prependOnceListener=function(e,t){return x(t),this.prependListener(e,W(this,e,t)),this};a.prototype.removeListener=function(e,t){var n,o,i,s,f;if(x(t),o=this._events,o===void 0)return this;if(n=o[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete o[e],o.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(i=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){f=n[s].listener,i=s;break}if(i<0)return this;i===0?n.shift():he(n,i),n.length===1&&(o[e]=n[0]),o.removeListener!==void 0&&this.emit("removeListener",e,f||t)}return this};a.prototype.off=a.prototype.removeListener;a.prototype.removeAllListeners=function(e){var t,n,o;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var i=Object.keys(n),s;for(o=0;o=0;o--)this.removeListener(e,t[o]);return this};function J(r,e,t){var n=r._events;if(n===void 0)return[];var o=n[e];return o===void 0?[]:typeof o=="function"?t?[o.listener||o]:[o]:t?pe(o):B(o,o.length)}a.prototype.listeners=function(e){return J(this,e,!0)};a.prototype.rawListeners=function(e){return J(this,e,!1)};a.listenerCount=function(r,e){return typeof r.listenerCount=="function"?r.listenerCount(e):H.call(r,e)};a.prototype.listenerCount=H;function H(r){var e=this._events;if(e!==void 0){var t=e[r];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?P(this._events):[]};function B(r,e){for(var t=new Array(e),n=0;n(u[u.ARCHIVE_ADD=0]="ARCHIVE_ADD",u[u.ARCHHIVE_COMPRESS=1]="ARCHHIVE_COMPRESS",u[u.CANCEL=2]="CANCEL",u[u.DOWNLOAD=3]="DOWNLOAD",u[u.INFOS=4]="INFOS",u[u.PAUSE=5]="PAUSE",u[u.PROVIDE_FILE=6]="PROVIDE_FILE",u[u.REMOVE=7]="REMOVE",u[u.RESUME=8]="RESUME",u[u.UPLOAD=9]="UPLOAD",u))(k||{});var ve={withStackTrace:!1},Q=(r,e,t=ve)=>{let n=e.isOk()?{type:"Ok",value:e.value}:{type:"Err",value:e.error},o=t.withStackTrace?new Error().stack:void 0;return{data:n,message:r,stack:o}};function g(r,e,t,n){function o(i){return i instanceof t?i:new t(function(s){s(i)})}return new(t||(t=Promise))(function(i,s){function f(u){try{m(n.next(u))}catch(_){s(_)}}function h(u){try{m(n.throw(u))}catch(_){s(_)}}function m(u){u.done?i(u.value):o(u.value).then(f,h)}m((n=n.apply(r,e||[])).next())})}function q(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(r){return this instanceof v?(this.v=r,this):new v(r)}function z(r,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t.apply(r,e||[]),o,i=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),f("next"),f("throw"),f("return",s),o[Symbol.asyncIterator]=function(){return this},o;function s(c){return function(w){return Promise.resolve(w).then(c,_)}}function f(c,w){n[c]&&(o[c]=function(A){return new Promise(function(ee,re){i.push([c,A,ee,re])>1||h(c,A)})},w&&(o[c]=w(o[c])))}function h(c,w){try{m(n[c](w))}catch(A){C(i[0][3],A)}}function m(c){c.value instanceof v?Promise.resolve(c.value.v).then(u,_):C(i[0][2],c)}function u(c){h("next",c)}function _(c){h("throw",c)}function C(c,w){c(w),i.shift(),i.length&&h(i[0][0],i[0][1])}}function ye(r){var e,t;return e={},n("next"),n("throw",function(o){throw o}),n("return"),e[Symbol.iterator]=function(){return this},e;function n(o,i){e[o]=r[o]?function(s){return(t=!t)?{value:v(r[o](s)),done:!1}:i?i(s):s}:i}}function Ee(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof q=="function"?q(r):r[Symbol.iterator](),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(i){t[i]=r[i]&&function(s){return new Promise(function(f,h){s=r[i](s),o(f,h,s.done,s.value)})}}function o(i,s,f,h){Promise.resolve(h).then(function(m){i({value:m,done:f})},s)}}var y=class r{constructor(e){this._promise=e}static fromSafePromise(e){let t=e.then(n=>new d(n));return new r(t)}static fromPromise(e,t){let n=e.then(o=>new d(o)).catch(o=>new p(t(o)));return new r(n)}static fromThrowable(e,t){return(...n)=>new r(g(this,void 0,void 0,function*(){try{return new d(yield e(...n))}catch(o){return new p(t?t(o):o)}}))}static combine(e){return we(e)}static combineWithAllErrors(e){return Le(e)}map(e){return new r(this._promise.then(t=>g(this,void 0,void 0,function*(){return t.isErr()?new p(t.error):new d(yield e(t.value))})))}andThrough(e){return new r(this._promise.then(t=>g(this,void 0,void 0,function*(){if(t.isErr())return new p(t.error);let n=yield e(t.value);return n.isErr()?new p(n.error):new d(t.value)})))}andTee(e){return new r(this._promise.then(t=>g(this,void 0,void 0,function*(){if(t.isErr())return new p(t.error);try{yield e(t.value)}catch{}return new d(t.value)})))}mapErr(e){return new r(this._promise.then(t=>g(this,void 0,void 0,function*(){return t.isOk()?new d(t.value):new p(yield e(t.error))})))}andThen(e){return new r(this._promise.then(t=>{if(t.isErr())return new p(t.error);let n=e(t.value);return n instanceof r?n._promise:n}))}orElse(e){return new r(this._promise.then(t=>g(this,void 0,void 0,function*(){return t.isErr()?e(t.error):new d(t.value)})))}match(e,t){return this._promise.then(n=>n.match(e,t))}unwrapOr(e){return this._promise.then(t=>t.unwrapOr(e))}safeUnwrap(){return z(this,arguments,function*(){return yield v(yield v(yield*ye(Ee(yield v(this._promise.then(t=>t.safeUnwrap()))))))})}then(e,t){return this._promise.then(e,t)}[Symbol.asyncIterator](){return z(this,arguments,function*(){let t=yield v(this._promise);return t.isErr()&&(yield yield v(O(t.error))),yield v(t.value)})}};var O=r=>new y(Promise.resolve(new p(r))),ke=y.fromPromise,Ie=y.fromSafePromise,Se=y.fromThrowable,Z=r=>{let e=L([]);for(let t of r)if(t.isErr()){e=E(t.error);break}else e.map(n=>n.push(t.value));return e},we=r=>y.fromSafePromise(Promise.all(r)).andThen(Z),X=r=>{let e=L([]);for(let t of r)t.isErr()&&e.isErr()?e.error.push(t.error):t.isErr()&&e.isOk()?e=E([t.error]):t.isOk()&&e.isOk()&&e.value.push(t.value);return e},Le=r=>y.fromSafePromise(Promise.all(r)).andThen(X),I;(function(r){function e(o,i){return(...s)=>{try{let f=o(...s);return L(f)}catch(f){return E(i?i(f):f)}}}r.fromThrowable=e;function t(o){return Z(o)}r.combine=t;function n(o){return X(o)}r.combineWithAllErrors=n})(I||(I={}));var L=r=>new d(r);function E(r){return new p(r)}var d=class{constructor(e){this.value=e}isOk(){return!0}isErr(){return!this.isOk()}map(e){return L(e(this.value))}mapErr(e){return L(this.value)}andThen(e){return e(this.value)}andThrough(e){return e(this.value).map(t=>this.value)}andTee(e){try{e(this.value)}catch{}return L(this.value)}orElse(e){return L(this.value)}asyncAndThen(e){return e(this.value)}asyncAndThrough(e){return e(this.value).map(()=>this.value)}asyncMap(e){return y.fromSafePromise(e(this.value))}unwrapOr(e){return this.value}match(e,t){return e(this.value)}safeUnwrap(){let e=this.value;return function*(){return e}()}_unsafeUnwrap(e){return this.value}_unsafeUnwrapErr(e){throw Q("Called `_unsafeUnwrapErr` on an Ok",this,e)}*[Symbol.iterator](){return this.value}},p=class{constructor(e){this.error=e}isOk(){return!1}isErr(){return!this.isOk()}map(e){return E(this.error)}mapErr(e){return E(e(this.error))}andThrough(e){return E(this.error)}andTee(e){return E(this.error)}andThen(e){return E(this.error)}orElse(e){return e(this.error)}asyncAndThen(e){return O(this.error)}asyncAndThrough(e){return O(this.error)}asyncMap(e){return O(this.error)}unwrapOr(e){return e}match(e,t){return t(this.error)}safeUnwrap(){let e=this.error;return function*(){throw yield E(e),new Error("Do not use this generator out of `safeTry`")}()}_unsafeUnwrap(e){throw Q("Called `_unsafeUnwrap` on an Err",this,e)}_unsafeUnwrapErr(e){return this.error}*[Symbol.iterator](){let e=this;return yield e,e}},Ce=I.fromThrowable;var be=()=>typeof Deno<"u";var D=r=>be()?new URL(`./worker/${r}.ts`,new URL(".",import.meta.url).href):new URL(import.meta.resolve(`./${r==="main"?`worker/${r}`:r}.js`));var S=new V.default,l,K=!1;self.onmessage=r=>{De(r),K||(K=!0,S.once("OPERATION_FAILED",()=>{l&&l.terminate()}))};var ge=(r,e)=>(Object.assign(r,e),typeof WorkerGlobalScope<"u"&&self.postMessage({event:"FILE_UPDATED",lufiFile:r}),r),rr=(r,e)=>{ge(r,{uploadStatus:2}),self.postMessage({event:"OPERATION_FAILED",error:e})},De=(r,e)=>{let{action:t}=r.data;if(t===5||t===8)l.postMessage(r.data,r.data);else{switch(t){case 2:l=new Worker(D("cancel"),{type:"module"}),l.postMessage(r.data,r.data);break;case 3:l=new Worker(D("download"),{type:"module"}),l.postMessage(r.data,r.data);break;case 4:l=new Worker(D("infos"),{type:"module"}),l.postMessage(r.data,r.data);break;case 7:l=l||new Worker(D("remove"),{type:"module"}),l.postMessage(r.data,r.data);break;case 9:l=l||new Worker(D("upload"),{type:"module"}),l.postMessage(r.data,r.data);break;default:console.error("Action not found")}l.onmessage=n=>{e&&e(n),self.postMessage(n.data,n.data)},l.onerror=n=>{console.error(`Error: ${n.message}`)}}},tr=()=>{S.once("SOCKET_OPENED",()=>{self.postMessage({event:"SOCKET_OPENED"})}),S.once("OPERATION_FAILED",r=>{self.postMessage({event:"OPERATION_FAILED",error:r})})},nr=r=>typeof r=="object"&&r!==null&&"action"in r&&Object.values(k).includes(r.action);export{S as events,tr as init,nr as isWorkerActionMessage,rr as sendFileError,ge as updateFile}; diff --git a/themes/default/public/js/minified/worker/remove.js b/themes/default/public/js/minified/worker/remove.js deleted file mode 100644 index e12c174..0000000 --- a/themes/default/public/js/minified/worker/remove.js +++ /dev/null @@ -1,925 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter2() { - EventEmitter2.init.call(this); - } - module.exports = EventEmitter2; - module.exports.once = once; - EventEmitter2.EventEmitter = EventEmitter2; - EventEmitter2.prototype._events = void 0; - EventEmitter2.prototype._eventsCount = 0; - EventEmitter2.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter2, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter2.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter2.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter2.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter2.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; - EventEmitter2.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter2.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; - EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter2.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter2.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter2.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter2.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter2.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// src/error/worker/worker-error.ts -var WorkerError = class extends BaseError { -}; - -// src/error/worker/worker-remove-failed-error.ts -var WorkerRemoveFailedError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "Failed to remove the file"); - } -}; - -// src/worker/remove.ts -var isInitiated = false; -self.onmessage = (event) => { - if (!isInitiated) { - init(); - isInitiated = true; - } - removeFile(event.data).map(() => { - self.postMessage({ event: "FILE_REMOVED" /* FILE_REMOVED */ }); - }).mapErr((error) => { - self.postMessage({ - event: "OPERATION_FAILED" /* OPERATION_FAILED */, - error - }); - }); -}; -var removeFile = (workerMessage) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - const lufiFile = workerMessage.args.lufiFile; - fetch( - `${new URL(lufiFile.serverUrl).href}d/${lufiFile.keys.server}/${lufiFile.actionToken}` - ).then((response) => response.ok ? resolve(void 0) : reject( - new WorkerRemoveFailedError(void 0, { - cause: ensureError(response.statusText) - }) - )); - }), - (error) => ensureError(error) -); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbmV2ZXJ0aHJvd0A4LjEuMS9ub2RlX21vZHVsZXMvbmV2ZXJ0aHJvdy9kaXN0L2luZGV4LmVzLmpzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy91dGlscy50cyIsICIuLi8uLi9zcmMvd29ya2VyL3NoYXJlZC50cyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50cyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci1yZW1vdmUtZmFpbGVkLWVycm9yLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvcmVtb3ZlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwgImNvbnN0IGRlZmF1bHRFcnJvckNvbmZpZyA9IHtcclxuICAgIHdpdGhTdGFja1RyYWNlOiBmYWxzZSxcclxufTtcclxuLy8gQ3VzdG9tIGVycm9yIG9iamVjdFxyXG4vLyBDb250ZXh0IC8gZGlzY3Vzc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL3N1cGVybWFjcm8vbmV2ZXJ0aHJvdy9wdWxsLzIxNVxyXG5jb25zdCBjcmVhdGVOZXZlclRocm93RXJyb3IgPSAobWVzc2FnZSwgcmVzdWx0LCBjb25maWcgPSBkZWZhdWx0RXJyb3JDb25maWcpID0+IHtcclxuICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuaXNPaygpXHJcbiAgICAgICAgPyB7IHR5cGU6ICdPaycsIHZhbHVlOiByZXN1bHQudmFsdWUgfVxyXG4gICAgICAgIDogeyB0eXBlOiAnRXJyJywgdmFsdWU6IHJlc3VsdC5lcnJvciB9O1xyXG4gICAgY29uc3QgbWF5YmVTdGFjayA9IGNvbmZpZy53aXRoU3RhY2tUcmFjZSA/IG5ldyBFcnJvcigpLnN0YWNrIDogdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRhLFxyXG4gICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgc3RhY2s6IG1heWJlU3RhY2ssXHJcbiAgICB9O1xyXG59O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxudHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XG5cbmNsYXNzIFJlc3VsdEFzeW5jIHtcclxuICAgIGNvbnN0cnVjdG9yKHJlcykge1xyXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbVNhZmVQcm9taXNlKHByb21pc2UpIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZS50aGVuKCh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tUHJvbWlzZShwcm9taXNlLCBlcnJvckZuKSB7XHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IHByb21pc2VcclxuICAgICAgICAgICAgLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKVxyXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IG5ldyBFcnIoZXJyb3JGbihlKSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMobmV3UHJvbWlzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgc3RhdGljIGZyb21UaHJvd2FibGUoZm4sIGVycm9yRm4pIHtcclxuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYygoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHlpZWxkIGZuKC4uLmFyZ3MpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKGVycm9yRm4gPyBlcnJvckZuKGVycm9yKSA6IGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpKCkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZShhc3luY1Jlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdEFzeW5jTGlzdChhc3luY1Jlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNvbWJpbmVXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0V2l0aEFsbEVycm9ycyhhc3luY1Jlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgbWFwKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHlpZWxkIGYocmVzLnZhbHVlKSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIGFuZFRocm91Z2goZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlcyA9IHlpZWxkIGYocmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKG5ld1Jlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihuZXdSZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGVlKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgeWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUZWUgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIG1hcEVycihmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzT2soKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHlpZWxkIGYocmVzLmVycm9yKSk7XHJcbiAgICAgICAgfSkpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIocmVzLmVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGYocmVzLnZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlIGluc3RhbmNlb2YgUmVzdWx0QXN5bmMgPyBuZXdWYWx1ZS5fcHJvbWlzZSA6IG5ld1ZhbHVlO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5tYXRjaChvaywgX2VycikpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3IodCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLnVud3JhcE9yKHQpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIDkuMC4wLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gdXNlIGBzYWZlVHJ5YCB3aXRob3V0IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYHR5cGVzY3JpcHRcclxuICAgICAqIHNhZmVUcnkoYXN5bmMgZnVuY3Rpb24qICgpIHtcclxuICAgICAqICAgY29uc3Qgb2tWYWx1ZSA9IHlpZWxkKiB5b3VyUmVzdWx0XHJcbiAgICAgKiB9KVxyXG4gICAgICogYGBgXHJcbiAgICAgKiBFbXVsYXRlcyBSdXN0J3MgYD9gIG9wZXJhdG9yIGluIGBzYWZlVHJ5YCdzIGJvZHkuIFNlZSBhbHNvIGBzYWZlVHJ5YC5cclxuICAgICAqL1xyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBzYWZlVW53cmFwXzEoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyh5aWVsZCBfX2F3YWl0KHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMuc2FmZVVud3JhcCgpKSkpKSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gTWFrZXMgUmVzdWx0QXN5bmMgaW1wbGVtZW50IFByb21pc2VMaWtlPFJlc3VsdD5cclxuICAgIHRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZS50aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogX2EoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZSk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KGVyckFzeW5jKHJlc3VsdC5lcnJvcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdChyZXN1bHQudmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9rQXN5bmMgPSAodmFsdWUpID0+IG5ldyBSZXN1bHRBc3luYyhQcm9taXNlLnJlc29sdmUobmV3IE9rKHZhbHVlKSkpO1xyXG5jb25zdCBlcnJBc3luYyA9IChlcnIpID0+IG5ldyBSZXN1bHRBc3luYyhQcm9taXNlLnJlc29sdmUobmV3IEVycihlcnIpKSk7XHJcbmNvbnN0IGZyb21Qcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVByb21pc2U7XHJcbmNvbnN0IGZyb21TYWZlUHJvbWlzZSA9IFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZTtcclxuY29uc3QgZnJvbUFzeW5jVGhyb3dhYmxlID0gUmVzdWx0QXN5bmMuZnJvbVRocm93YWJsZTtcblxuLyoqXHJcbiAqIFNob3J0IGNpcmN1aXRzIG9uIHRoZSBGSVJTVCBFcnIgdmFsdWUgdGhhdCB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdCA9IChyZXN1bHRMaXN0KSA9PiB7XHJcbiAgICBsZXQgYWNjID0gb2soW10pO1xyXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0TGlzdCkge1xyXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIocmVzdWx0LmVycm9yKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhY2MubWFwKChsaXN0KSA9PiBsaXN0LnB1c2gocmVzdWx0LnZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxufTtcclxuLyogVGhpcyBpcyB0aGUgdHlwZXNhZmUgdmVyc2lvbiBvZiBQcm9taXNlLmFsbFxyXG4gKlxyXG4gKiBUYWtlcyBhIGxpc3Qgb2YgUmVzdWx0QXN5bmM8VCwgRT4gYW5kIHN1Y2Nlc3MgaWYgYWxsIGlubmVyIHJlc3VsdHMgYXJlIE9rIHZhbHVlc1xyXG4gKiBvciBmYWlscyBpZiBvbmUgKG9yIG1vcmUpIG9mIHRoZSBpbm5lciByZXN1bHRzIGFyZSBFcnIgdmFsdWVzXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0QXN5bmNMaXN0ID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3QpO1xyXG4vKipcclxuICogR2l2ZSBhIGxpc3Qgb2YgYWxsIHRoZSBlcnJvcnMgd2UgZmluZFxyXG4gKi9cclxuY29uc3QgY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpICYmIGFjYy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYy5lcnJvci5wdXNoKHJlc3VsdC5lcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0VycigpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjID0gZXJyKFtyZXN1bHQuZXJyb3JdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzT2soKSAmJiBhY2MuaXNPaygpKSB7XHJcbiAgICAgICAgICAgIGFjYy52YWx1ZS5wdXNoKHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRvIG5vdGhpbmcgd2hlbiByZXN1bHQuaXNPaygpICYmIGFjYy5pc0VycigpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG5jb25zdCBjb21iaW5lUmVzdWx0QXN5bmNMaXN0V2l0aEFsbEVycm9ycyA9IChhc3luY1Jlc3VsdExpc3QpID0+IFJlc3VsdEFzeW5jLmZyb21TYWZlUHJvbWlzZShQcm9taXNlLmFsbChhc3luY1Jlc3VsdExpc3QpKS5hbmRUaGVuKGNvbWJpbmVSZXN1bHRMaXN0V2l0aEFsbEVycm9ycyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXHJcbnZhciBSZXN1bHQ7XHJcbihmdW5jdGlvbiAoUmVzdWx0KSB7XHJcbiAgICAvKipcclxuICAgICAqIFdyYXBzIGEgZnVuY3Rpb24gd2l0aCBhIHRyeSBjYXRjaCwgY3JlYXRpbmcgYSBuZXcgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZVxyXG4gICAgICogYXJndW1lbnRzIGJ1dCByZXR1cm5pbmcgYE9rYCBpZiBzdWNjZXNzZnVsLCBgRXJyYCBpZiB0aGUgZnVuY3Rpb24gdGhyb3dzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZuIGZ1bmN0aW9uIHRvIHdyYXAgd2l0aCBvayBvbiBzdWNjZXNzIG9yIGVyciBvbiBmYWlsdXJlXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JGbiB3aGVuIGFuIGVycm9yIGlzIHRocm93biwgdGhpcyB3aWxsIHdyYXAgdGhlIGVycm9yIHJlc3VsdCBpZiBwcm92aWRlZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgZnVuY3Rpb24gZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2socmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycihlcnJvckZuID8gZXJyb3JGbihlKSA6IGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIFJlc3VsdC5mcm9tVGhyb3dhYmxlID0gZnJvbVRocm93YWJsZTtcclxuICAgIGZ1bmN0aW9uIGNvbWJpbmUocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdChyZXN1bHRMaXN0KTtcclxuICAgIH1cclxuICAgIFJlc3VsdC5jb21iaW5lID0gY29tYmluZTtcclxuICAgIGZ1bmN0aW9uIGNvbWJpbmVXaXRoQWxsRXJyb3JzKHJlc3VsdExpc3QpIHtcclxuICAgICAgICByZXR1cm4gY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmVXaXRoQWxsRXJyb3JzID0gY29tYmluZVdpdGhBbGxFcnJvcnM7XHJcbn0pKFJlc3VsdCB8fCAoUmVzdWx0ID0ge30pKTtcclxuY29uc3Qgb2sgPSAodmFsdWUpID0+IG5ldyBPayh2YWx1ZSk7XHJcbmZ1bmN0aW9uIGVycihlcnIpIHtcclxuICAgIHJldHVybiBuZXcgRXJyKGVycik7XHJcbn1cclxuZnVuY3Rpb24gc2FmZVRyeShib2R5KSB7XHJcbiAgICBjb25zdCBuID0gYm9keSgpLm5leHQoKTtcclxuICAgIGlmIChuIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmMobi50aGVuKChyKSA9PiByLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbi52YWx1ZTtcclxufVxyXG5jbGFzcyBPayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpc0VycigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNPaygpO1xyXG4gICAgfVxyXG4gICAgbWFwKGYpIHtcclxuICAgICAgICByZXR1cm4gb2soZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBtYXBFcnIoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKChfdmFsdWUpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYW5kVGVlKGYpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBUZWUgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNBbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhc3luY0FuZFRocm91Z2goZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpLm1hcCgoKSA9PiB0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGFzeW5jTWFwKGYpIHtcclxuICAgICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKGYodGhpcy52YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdW53cmFwT3IoX3YpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hdGNoKG9rLCBfZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIG9rKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUteWllbGQgKi9cclxuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcChfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwRXJyKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwRXJyYCBvbiBhbiBPaycsIHRoaXMsIGNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXMsIHJlcXVpcmUteWllbGRcclxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxufVxyXG5jbGFzcyBFcnIge1xyXG4gICAgY29uc3RydWN0b3IoZXJyb3IpIHtcclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICB9XHJcbiAgICBpc09rKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBtYXAoX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gZXJyKGYodGhpcy5lcnJvcikpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhc3luY0FuZFRoZW4oX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyQXN5bmModGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRocm91Z2goX2YpIHtcclxuICAgICAgICByZXR1cm4gZXJyQXN5bmModGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhc3luY01hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIHVud3JhcE9yKHYpIHtcclxuICAgICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuICAgIG1hdGNoKF9vaywgZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIHNhZmVVbndyYXAoKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yO1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgeWllbGQgZXJyKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEbyBub3QgdXNlIHRoaXMgZ2VuZXJhdG9yIG91dCBvZiBgc2FmZVRyeWAnKTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcChjb25maWcpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVOZXZlclRocm93RXJyb3IoJ0NhbGxlZCBgX3Vuc2FmZVVud3JhcGAgb24gYW4gRXJyJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoXykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yO1xyXG4gICAgfVxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gVGhpcyBpcyBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBhbmQgc2FmZVxyXG4gICAgICAgIHlpZWxkIHNlbGY7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbn1cclxuY29uc3QgZnJvbVRocm93YWJsZSA9IFJlc3VsdC5mcm9tVGhyb3dhYmxlO1xyXG4vLyNlbmRyZWdpb25cblxuZXhwb3J0IHsgRXJyLCBPaywgUmVzdWx0LCBSZXN1bHRBc3luYywgZXJyLCBlcnJBc3luYywgZnJvbUFzeW5jVGhyb3dhYmxlLCBmcm9tUHJvbWlzZSwgZnJvbVNhZmVQcm9taXNlLCBmcm9tVGhyb3dhYmxlLCBvaywgb2tBc3luYywgc2FmZVRyeSB9O1xuIiwgInR5cGUgSnNvbmFibGUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgcmVhZG9ubHkgSnNvbmFibGVbXVxuICB8IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogSnNvbmFibGUgfVxuICB8IHsgdG9KU09OKCk6IEpzb25hYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb250ZXh0PzogSnNvbmFibGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGNhdXNlPzogRXJyb3I7IGNvbnRleHQ/OiBKc29uYWJsZSB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHsgY2F1c2UsIGNvbnRleHQgfSA9IG9wdGlvbnM7XG5cbiAgICBzdXBlcihtZXNzYWdlLCB7IGNhdXNlIH0pO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBlcnJBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY29ubmVjdGlvbi1lcnJvci50c1wiO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tIFwifi9lcnJvci9zZXJ2ZXItZXJyb3IudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyQ29uZmlnIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3NlcnZlci1jb25maWcudHNcIjtcblxuLyoqXG4gKiBFbnN1cmUgYW4gZXJyb3IgbWVzc2FnZSBpcyB0cmFuc2Zvcm1lZCBpbiBhbiBFcnJvciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbnN1cmVFcnJvciA9ICh2YWx1ZTogdW5rbm93bik6IEVycm9yID0+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWx1ZTtcblxuICBsZXQgc3RyaW5naWZpZWQgPSBcIltVbmFibGUgdG8gc3RyaW5naWZ5IHRoZSB0aHJvd24gdmFsdWVdXCI7XG4gIHRyeSB7XG4gICAgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICByZXR1cm4gbmV3IEVycm9yKHN0cmluZ2lmaWVkKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgTHVmaSdzIGNvbmZpZyBmcm9tIGl0cyBBUElcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VVcmxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBmZXRjaFNlcnZlckNvbmZpZyA9IChcbiAgaW5zdGFuY2VVcmw6IFVSTCxcbik6IFJlc3VsdEFzeW5jPFNlcnZlckNvbmZpZywgRXJyb3I+ID0+IHtcbiAgY29uc3Qgb3JpZ2luTWF0Y2hlcyA9IGluc3RhbmNlVXJsLmhyZWYubWF0Y2goXG4gICAgLyguKj8pXFwvPyg/OlxcL1tkcl17MX1cXC98bG9naW5cXC8/fGZpbGVzXFwvPykvLFxuICApO1xuXG4gIGNvbnN0IHVybE9yaWdpbiA9IG9yaWdpbk1hdGNoZXMgJiYgb3JpZ2luTWF0Y2hlc1sxXVxuICAgID8gb3JpZ2luTWF0Y2hlc1sxXVxuICAgIDogaW5zdGFuY2VVcmwub3JpZ2luO1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBmZXRjaCh1cmxPcmlnaW4gKyBcIi9hYm91dC9jb25maWdcIiksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENvbm5lY3Rpb25FcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICAgIH0pLFxuICApLmFuZFRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIHJlc3BvbnNlLmpzb24oKSxcbiAgICAgICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICAgIG5ldyBTZXJ2ZXJFcnJvcih1bmRlZmluZWQsIHsgY29udGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Rlbm9SdW50aW1lID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBjb25zdCBpc1NlY3VyZUNvbnRleHQgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKCkgfHwgZ2xvYmFsVGhpcy5pc1NlY3VyZUNvbnRleHQgfHxcbiAgICBnbG9iYWxUaGlzLmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IHdvcmtlclVybCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFVSTCA9PiB7XG4gIHJldHVybiBpc0Rlbm9SdW50aW1lKClcbiAgICA/IG5ldyBVUkwoYC4vd29ya2VyLyR7cmVsYXRpdmVQYXRofS50c2AsIG5ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZilcbiAgICA6IG5ldyBVUkwoXG4gICAgICBpbXBvcnQubWV0YS5yZXNvbHZlKFxuICAgICAgICBgLi8ke1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCAhPT0gXCJlbmNyeXB0XCIgPyBgd29ya2VyLyR7cmVsYXRpdmVQYXRofWAgOiByZWxhdGl2ZVBhdGhcbiAgICAgICAgfS5qc2AsXG4gICAgICApLFxuICAgICk7XG59O1xuIiwgImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgV09SS0VSX0FDVElPTiB9IGZyb20gXCJ+L2VudW0vd29ya2VyLWFjdGlvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBMdWZpRmlsZSB9IGZyb20gXCJ+L2VudGl0aWVzL2x1ZmktZmlsZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJFdmVudCB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItZXZlbnQudHNcIjtcblxuZGVjbGFyZSBsZXQgc2VsZjogV29ya2VyO1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4vKipcbiAqIFVwZGF0ZSBmaWxlIGluIHdvcmtlcnMgYW5kIHByb3ZpZGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgbWFpbiB0aHJlYWRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRmlsZSA9IChsdWZpRmlsZTogTHVmaUZpbGUsIGFyZ3M6IFBhcnRpYWw8THVmaUZpbGU+KSA9PiB7XG4gIE9iamVjdC5hc3NpZ24obHVmaUZpbGUsIGFyZ3MpO1xuXG4gIGlmICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBFVkVOVC5GSUxFX1VQREFURUQsXG4gICAgICBsdWZpRmlsZSxcbiAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiBsdWZpRmlsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kRmlsZUVycm9yID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSwgZXJyb3I6IEVycm9yKSA9PiB7XG4gIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgdXBsb2FkU3RhdHVzOiBVUExPQURfU1RBVFVTLkZBSUxFRCB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0gYXMgV29ya2VyRXZlbnQpO1xufTtcblxuLyoqXG4gKiBJbml0IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY2hpbGQgd29ya2VyJ3Mgb25tZXNzYWdlIGV2ZW50LlxuICovXG5leHBvcnQgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgZXZlbnRzLm9uY2UoRVZFTlQuU09DS0VUX09QRU5FRCwgKCkgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULlNPQ0tFVF9PUEVORUQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGV2ZW50cy5vbmNlKEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1dvcmtlckFjdGlvbk1lc3NhZ2UgPSAoXG4gIC8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG4gIG1lc3NhZ2U6IGFueSxcbik6IG1lc3NhZ2UgaXMgV29ya2VyQWN0aW9uTWVzc2FnZSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICBtZXNzYWdlICE9PSBudWxsICYmXG4gICAgXCJhY3Rpb25cIiBpbiBtZXNzYWdlICYmXG4gICAgT2JqZWN0LnZhbHVlcyhXT1JLRVJfQUNUSU9OKS5pbmNsdWRlcyhtZXNzYWdlLmFjdGlvbilcbiAgKTtcbn07XG4iLCAiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIn4vZXJyb3IvYmFzZS1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV29ya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige31cbiIsICJpbXBvcnQgeyBXb3JrZXJFcnJvciB9IGZyb20gXCJ+L2Vycm9yL3dvcmtlci93b3JrZXItZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdvcmtlclJlbW92ZUZhaWxlZEVycm9yIGV4dGVuZHMgV29ya2VyRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gXCJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBmaWxlXCI7XG59XG4iLCAiaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFjdGlvbk1lc3NhZ2UgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWFjdGlvbi1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgeyBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckV2ZW50IH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1ldmVudC50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0IHsgaW5pdCB9IGZyb20gXCJ+L3dvcmtlci9zaGFyZWQudHNcIjtcbmltcG9ydCB7IFdvcmtlclJlbW92ZUZhaWxlZEVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci1yZW1vdmUtZmFpbGVkLWVycm9yLnRzXCI7XG5cbmRlY2xhcmUgY29uc3Qgc2VsZjogV29ya2VyO1xuXG5sZXQgaXNJbml0aWF0ZWQgPSBmYWxzZTtcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICBpZiAoIWlzSW5pdGlhdGVkKSB7XG4gICAgaW5pdCgpO1xuICAgIGlzSW5pdGlhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHJlbW92ZUZpbGUoZXZlbnQuZGF0YSlcbiAgICAubWFwKCgpID0+IHtcbiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBldmVudDogRVZFTlQuRklMRV9SRU1PVkVEIH0pO1xuICAgIH0pXG4gICAgLm1hcEVycigoZXJyb3IpID0+IHtcbiAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBldmVudDogRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IHJlbW92ZUZpbGUgPSAoXG4gIHdvcmtlck1lc3NhZ2U6IFdvcmtlckFjdGlvbk1lc3NhZ2UsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBFcnJvcj4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgbHVmaUZpbGUgPSB3b3JrZXJNZXNzYWdlLmFyZ3MubHVmaUZpbGU7XG5cbiAgICAgIGZldGNoKFxuICAgICAgICBgJHtcbiAgICAgICAgICBuZXcgVVJMKGx1ZmlGaWxlLnNlcnZlclVybCkuaHJlZlxuICAgICAgICB9ZC8ke2x1ZmlGaWxlLmtleXMuc2VydmVyfS8ke2x1ZmlGaWxlLmFjdGlvblRva2VufWAsXG4gICAgICApLnRoZW4oKFxuICAgICAgICByZXNwb25zZSxcbiAgICAgICkgPT4gKHJlc3BvbnNlLm9rID8gcmVzb2x2ZSh1bmRlZmluZWQpIDogcmVqZWN0KFxuICAgICAgICBuZXcgV29ya2VyUmVtb3ZlRmFpbGVkRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgY2F1c2U6IGVuc3VyZUVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpLFxuICAgICAgICB9KSxcbiAgICAgICkpKTtcbiAgICB9KSxcbiAgICAoZXJyb3IpID0+IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBdUJBLFFBQUksSUFBSSxPQUFPLFlBQVksV0FBVyxVQUFVO0FBQ2hELFFBQUksZUFBZSxLQUFLLE9BQU8sRUFBRSxVQUFVLGFBQ3ZDLEVBQUUsUUFDRixTQUFTQSxjQUFhLFFBQVEsVUFBVSxNQUFNO0FBQzlDLGFBQU8sU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLFVBQVUsSUFBSTtBQUFBLElBQzdEO0FBRUYsUUFBSTtBQUNKLFFBQUksS0FBSyxPQUFPLEVBQUUsWUFBWSxZQUFZO0FBQ3hDLHVCQUFpQixFQUFFO0FBQUEsSUFDckIsV0FBVyxPQUFPLHVCQUF1QjtBQUN2Qyx1QkFBaUIsU0FBU0MsZ0JBQWUsUUFBUTtBQUMvQyxlQUFPLE9BQU8sb0JBQW9CLE1BQU0sRUFDckMsT0FBTyxPQUFPLHNCQUFzQixNQUFNLENBQUM7QUFBQSxNQUNoRDtBQUFBLElBQ0YsT0FBTztBQUNMLHVCQUFpQixTQUFTQSxnQkFBZSxRQUFRO0FBQy9DLGVBQU8sT0FBTyxvQkFBb0IsTUFBTTtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUVBLGFBQVMsbUJBQW1CLFNBQVM7QUFDbkMsVUFBSSxXQUFXLFFBQVEsS0FBTSxTQUFRLEtBQUssT0FBTztBQUFBLElBQ25EO0FBRUEsUUFBSSxjQUFjLE9BQU8sU0FBUyxTQUFTQyxhQUFZLE9BQU87QUFDNUQsYUFBTyxVQUFVO0FBQUEsSUFDbkI7QUFFQSxhQUFTQyxnQkFBZTtBQUN0QixNQUFBQSxjQUFhLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDN0I7QUFDQSxXQUFPLFVBQVVBO0FBQ2pCLFdB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QUNNQSxJQUFJLGNBQWM7QUFFbEIsS0FBSyxZQUFZLENBQUMsVUFBd0I7QUFDeEMsTUFBSSxDQUFDLGFBQWE7QUFDaEIsU0FBSztBQUNMLGtCQUFjO0FBQUEsRUFDaEI7QUFFQSxhQUFXLE1BQU0sSUFBSSxFQUNsQixJQUFJLE1BQU07QUFDVCxTQUFLLFlBQVksRUFBRSx5Q0FBMEIsQ0FBQztBQUFBLEVBQ2hELENBQUMsRUFDQSxPQUFPLENBQUMsVUFBVTtBQUNqQixTQUFLLFlBQVk7QUFBQSxNQUNmO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBZ0I7QUFBQSxFQUNsQixDQUFDO0FBQ0w7QUFFQSxJQUFNLGFBQWEsQ0FDakIsa0JBRUEsWUFBWTtBQUFBLEVBQ1YsSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQy9CLFVBQU0sV0FBVyxjQUFjLEtBQUs7QUFFcEM7QUFBQSxNQUNFLEdBQ0UsSUFBSSxJQUFJLFNBQVMsU0FBUyxFQUFFLElBQzlCLEtBQUssU0FBUyxLQUFLLE1BQU0sSUFBSSxTQUFTLFdBQVc7QUFBQSxJQUNuRCxFQUFFLEtBQUssQ0FDTCxhQUNJLFNBQVMsS0FBSyxRQUFRLE1BQVMsSUFBSTtBQUFBLE1BQ3ZDLElBQUksd0JBQXdCLFFBQVc7QUFBQSxRQUNyQyxPQUFPLFlBQVksU0FBUyxVQUFVO0FBQUEsTUFDeEMsQ0FBQztBQUFBLElBQ0gsQ0FBRTtBQUFBLEVBQ0osQ0FBQztBQUFBLEVBQ0QsQ0FBQyxVQUFVLFlBQVksS0FBSztBQUM5QjsiLAogICJuYW1lcyI6IFsiUmVmbGVjdEFwcGx5IiwgIlJlZmxlY3RPd25LZXlzIiwgIk51bWJlcklzTmFOIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAiZXJyIiwgIm9uY2UiLCAidiIsICJvayIsICJlcnIiLCAiUmVzdWx0IiwgImZyb21UaHJvd2FibGUiLCAib2siLCAiZXJyIiwgInNlbGYiLCAiRXZlbnRFbWl0dGVyIl0KfQo= diff --git a/themes/default/public/js/minified/worker/shared.js b/themes/default/public/js/minified/worker/shared.js deleted file mode 100644 index 7798edd..0000000 --- a/themes/default/public/js/minified/worker/shared.js +++ /dev/null @@ -1,443 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter2() { - EventEmitter2.init.call(this); - } - module.exports = EventEmitter2; - module.exports.once = once; - EventEmitter2.EventEmitter = EventEmitter2; - EventEmitter2.prototype._events = void 0; - EventEmitter2.prototype._eventsCount = 0; - EventEmitter2.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter2, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter2.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter2.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter2.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events2 = this._events; - if (events2 !== void 0) - doError = doError && events2.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err.context = er; - throw err; - } - var handler = events2[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events2; - var existing; - checkListener(listener); - events2 = target._events; - if (events2 === void 0) { - events2 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events2.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events2 = target._events; - } - existing = events2[type]; - } - if (existing === void 0) { - existing = events2[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter2.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; - EventEmitter2.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter2.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter2.prototype.removeListener = function removeListener(type, listener) { - var list, events2, position, i, originalListener; - checkListener(listener); - events2 = this._events; - if (events2 === void 0) - return this; - list = events2[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events2[type]; - if (events2.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events2[type] = list[0]; - if (events2.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; - EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events2, i; - events2 = this._events; - if (events2 === void 0) - return this; - if (events2.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events2[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events2[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events2); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events2[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events2 = target._events; - if (events2 === void 0) - return []; - var evlistener = events2[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter2.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter2.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter2.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter2.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events2 = this._events; - if (events2 !== void 0) { - var evlistener = events2[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter2.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// src/worker/shared.ts -var import_events = __toESM(require_events()); - -// src/enum/worker-action.ts -var WORKER_ACTION = /* @__PURE__ */ ((WORKER_ACTION2) => { - WORKER_ACTION2[WORKER_ACTION2["PAUSE"] = 0] = "PAUSE"; - WORKER_ACTION2[WORKER_ACTION2["PROVIDE_FILE"] = 1] = "PROVIDE_FILE"; - WORKER_ACTION2[WORKER_ACTION2["RESUME"] = 2] = "RESUME"; - return WORKER_ACTION2; -})(WORKER_ACTION || {}); - -// src/worker/shared.ts -var events = new import_events.default(); -var updateFile = (lufiFile, args) => { - Object.assign(lufiFile, args); - if (typeof WorkerGlobalScope !== "undefined") { - self.postMessage({ - event: "FILE_UPDATED" /* FILE_UPDATED */, - lufiFile - }); - } - return lufiFile; -}; -var sendFileError = (lufiFile, error) => { - updateFile(lufiFile, { uploadStatus: 2 /* FAILED */ }); - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); -}; -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; -var isWorkerActionMessage = (message) => { - return typeof message === "object" && message !== null && "action" in message && Object.values(WORKER_ACTION).includes(message.action); -}; -export { - events, - init, - isWorkerActionMessage, - sendFileError, - updateFile -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9zcmMvd29ya2VyL3NoYXJlZC50cyIsICIuLi8uLi9zcmMvZW51bS93b3JrZXItYWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwgImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgV09SS0VSX0FDVElPTiB9IGZyb20gXCJ+L2VudW0vd29ya2VyLWFjdGlvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBMdWZpRmlsZSB9IGZyb20gXCJ+L2VudGl0aWVzL2x1ZmktZmlsZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJFdmVudCB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItZXZlbnQudHNcIjtcblxuZGVjbGFyZSBsZXQgc2VsZjogV29ya2VyO1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4vKipcbiAqIFVwZGF0ZSBmaWxlIGluIHdvcmtlcnMgYW5kIHByb3ZpZGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgbWFpbiB0aHJlYWRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRmlsZSA9IChsdWZpRmlsZTogTHVmaUZpbGUsIGFyZ3M6IFBhcnRpYWw8THVmaUZpbGU+KSA9PiB7XG4gIE9iamVjdC5hc3NpZ24obHVmaUZpbGUsIGFyZ3MpO1xuXG4gIGlmICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBFVkVOVC5GSUxFX1VQREFURUQsXG4gICAgICBsdWZpRmlsZSxcbiAgICB9IGFzIFdvcmtlckV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiBsdWZpRmlsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kRmlsZUVycm9yID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSwgZXJyb3I6IEVycm9yKSA9PiB7XG4gIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgdXBsb2FkU3RhdHVzOiBVUExPQURfU1RBVFVTLkZBSUxFRCB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0gYXMgV29ya2VyRXZlbnQpO1xufTtcblxuLyoqXG4gKiBJbml0IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY2hpbGQgd29ya2VyJ3Mgb25tZXNzYWdlIGV2ZW50LlxuICovXG5leHBvcnQgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgZXZlbnRzLm9uY2UoRVZFTlQuU09DS0VUX09QRU5FRCwgKCkgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IEVWRU5ULlNPQ0tFVF9PUEVORUQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGV2ZW50cy5vbmNlKEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1dvcmtlckFjdGlvbk1lc3NhZ2UgPSAoXG4gIC8vIGRlbm8tbGludC1pZ25vcmUgbm8tZXhwbGljaXQtYW55XG4gIG1lc3NhZ2U6IGFueSxcbik6IG1lc3NhZ2UgaXMgV29ya2VyQWN0aW9uTWVzc2FnZSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICBtZXNzYWdlICE9PSBudWxsICYmXG4gICAgXCJhY3Rpb25cIiBpbiBtZXNzYWdlICYmXG4gICAgT2JqZWN0LnZhbHVlcyhXT1JLRVJfQUNUSU9OKS5pbmNsdWRlcyhtZXNzYWdlLmFjdGlvbilcbiAgKTtcbn07XG4iLCAiZXhwb3J0IGVudW0gV09SS0VSX0FDVElPTiB7XG4gIFBBVVNFLFxuICBQUk9WSURFX0ZJTEUsXG4gIFJFU1VNRSxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQXVCQSxRQUFJLElBQUksT0FBTyxZQUFZLFdBQVcsVUFBVTtBQUNoRCxRQUFJLGVBQWUsS0FBSyxPQUFPLEVBQUUsVUFBVSxhQUN2QyxFQUFFLFFBQ0YsU0FBU0EsY0FBYSxRQUFRLFVBQVUsTUFBTTtBQUM5QyxhQUFPLFNBQVMsVUFBVSxNQUFNLEtBQUssUUFBUSxVQUFVLElBQUk7QUFBQSxJQUM3RDtBQUVGLFFBQUk7QUFDSixRQUFJLEtBQUssT0FBTyxFQUFFLFlBQVksWUFBWTtBQUN4Qyx1QkFBaUIsRUFBRTtBQUFBLElBQ3JCLFdBQVcsT0FBTyx1QkFBdUI7QUFDdkMsdUJBQWlCLFNBQVNDLGdCQUFlLFFBQVE7QUFDL0MsZUFBTyxPQUFPLG9CQUFvQixNQUFNLEVBQ3JDLE9BQU8sT0FBTyxzQkFBc0IsTUFBTSxDQUFDO0FBQUEsTUFDaEQ7QUFBQSxJQUNGLE9BQU87QUFDTCx1QkFBaUIsU0FBU0EsZ0JBQWUsUUFBUTtBQUMvQyxlQUFPLE9BQU8sb0JBQW9C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U0FBNEI7QUFDekUsU0FBTyxPQUFPLFVBQVUsSUFBSTtBQUU1QixNQUFJLE9BQU8sc0JBQXNCLGFBQWE7QUFDNUMsU0FBSyxZQUFZO0FBQUEsTUFDZjtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQWdCO0FBQUEsRUFDbEI7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxJQUFNLGdCQUFnQixDQUFDLFVBQW9CLFVBQWlCO0FBQ2pFLGFBQVcsVUFBVSxFQUFFLDZCQUFtQyxDQUFDO0FBRTNELE9BQUssWUFBWSxFQUFFLGtEQUErQixNQUFNLENBQWdCO0FBQzFFO0FBS08sSUFBTSxPQUFPLE1BQU07QUFDeEIsU0FBTywwQ0FBMEIsTUFBTTtBQUNyQyxTQUFLLFlBQVk7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBRUQsU0FBTyxnREFBNkIsQ0FBQyxVQUFpQjtBQUNwRCxTQUFLLFlBQVksRUFBRSxrREFBK0IsTUFBTSxDQUFDO0FBQUEsRUFDM0QsQ0FBQztBQUNIO0FBRU8sSUFBTSx3QkFBd0IsQ0FFbkMsWUFDbUM7QUFDbkMsU0FDRSxPQUFPLFlBQVksWUFDbkIsWUFBWSxRQUNaLFlBQVksV0FDWixPQUFPLE9BQU8sYUFBYSxFQUFFLFNBQVMsUUFBUSxNQUFNO0FBRXhEOyIsCiAgIm5hbWVzIjogWyJSZWZsZWN0QXBwbHkiLCAiUmVmbGVjdE93bktleXMiLCAiTnVtYmVySXNOYU4iLCAiRXZlbnRFbWl0dGVyIiwgImV2ZW50cyIsICJvbmNlIiwgIldPUktFUl9BQ1RJT04iLCAiRXZlbnRFbWl0dGVyIl0KfQo= diff --git a/themes/default/public/js/minified/worker/upload.js b/themes/default/public/js/minified/worker/upload.js deleted file mode 100644 index 811df8c..0000000 --- a/themes/default/public/js/minified/worker/upload.js +++ /dev/null @@ -1,2963 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __typeError = (msg) => { - throw TypeError(msg); -}; -var __defNormalProp = (obj3, key, value) => key in obj3 ? __defProp(obj3, key, { enumerable: true, configurable: true, writable: true, value }) : obj3[key] = value; -var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj3, key, value) => __defNormalProp(obj3, typeof key !== "symbol" ? key + "" : key, value); -var __accessCheck = (obj3, member, msg) => member.has(obj3) || __typeError("Cannot " + msg); -var __privateGet = (obj3, member, getter) => (__accessCheck(obj3, member, "read from private field"), getter ? getter.call(obj3) : member.get(obj3)); -var __privateAdd = (obj3, member, value) => member.has(obj3) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj3) : member.set(obj3, value); -var __privateSet = (obj3, member, value, setter) => (__accessCheck(obj3, member, "write to private field"), setter ? setter.call(obj3, value) : member.set(obj3, value), value); -var __privateMethod = (obj3, member, method) => (__accessCheck(obj3, member, "access private method"), method); -var __privateWrapper = (obj3, member, setter, getter) => ({ - set _(value) { - __privateSet(obj3, member, value, setter); - }, - get _() { - return __privateGet(obj3, member, getter); - } -}); - -// node_modules/.deno/events@3.3.0/node_modules/events/events.js -var require_events = __commonJS({ - "node_modules/.deno/events@3.3.0/node_modules/events/events.js"(exports, module) { - "use strict"; - var R = typeof Reflect === "object" ? Reflect : null; - var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - }; - var ReflectOwnKeys; - if (R && typeof R.ownKeys === "function") { - ReflectOwnKeys = R.ownKeys; - } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; - } else { - ReflectOwnKeys = function ReflectOwnKeys2(target) { - return Object.getOwnPropertyNames(target); - }; - } - function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); - } - var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { - return value !== value; - }; - function EventEmitter5() { - EventEmitter5.init.call(this); - } - module.exports = EventEmitter5; - module.exports.once = once; - EventEmitter5.EventEmitter = EventEmitter5; - EventEmitter5.prototype._events = void 0; - EventEmitter5.prototype._eventsCount = 0; - EventEmitter5.prototype._maxListeners = void 0; - var defaultMaxListeners = 10; - function checkListener(listener) { - if (typeof listener !== "function") { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - } - Object.defineProperty(EventEmitter5, "defaultMaxListeners", { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); - } - defaultMaxListeners = arg; - } - }); - EventEmitter5.init = function() { - if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || void 0; - }; - EventEmitter5.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); - } - this._maxListeners = n; - return this; - }; - function _getMaxListeners(that) { - if (that._maxListeners === void 0) - return EventEmitter5.defaultMaxListeners; - return that._maxListeners; - } - EventEmitter5.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }; - EventEmitter5.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === "error"; - var events3 = this._events; - if (events3 !== void 0) - doError = doError && events3.error === void 0; - else if (!doError) - return false; - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - throw er; - } - var err2 = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); - err2.context = er; - throw err2; - } - var handler = events3[type]; - if (handler === void 0) - return false; - if (typeof handler === "function") { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - return true; - }; - function _addListener(target, type, listener, prepend) { - var m; - var events3; - var existing; - checkListener(listener); - events3 = target._events; - if (events3 === void 0) { - events3 = target._events = /* @__PURE__ */ Object.create(null); - target._eventsCount = 0; - } else { - if (events3.newListener !== void 0) { - target.emit( - "newListener", - type, - listener.listener ? listener.listener : listener - ); - events3 = target._events; - } - existing = events3[type]; - } - if (existing === void 0) { - existing = events3[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === "function") { - existing = events3[type] = prepend ? [listener, existing] : [existing, listener]; - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); - w.name = "MaxListenersExceededWarning"; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; - } - EventEmitter5.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); - }; - EventEmitter5.prototype.on = EventEmitter5.prototype.addListener; - EventEmitter5.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } - } - function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: void 0, target, type, listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; - } - EventEmitter5.prototype.once = function once2(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter5.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - EventEmitter5.prototype.removeListener = function removeListener(type, listener) { - var list, events3, position, i, originalListener; - checkListener(listener); - events3 = this._events; - if (events3 === void 0) - return this; - list = events3[type]; - if (list === void 0) - return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else { - delete events3[type]; - if (events3.removeListener) - this.emit("removeListener", type, list.listener || listener); - } - } else if (typeof list !== "function") { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) - return this; - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - if (list.length === 1) - events3[type] = list[0]; - if (events3.removeListener !== void 0) - this.emit("removeListener", type, originalListener || listener); - } - return this; - }; - EventEmitter5.prototype.off = EventEmitter5.prototype.removeListener; - EventEmitter5.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events3, i; - events3 = this._events; - if (events3 === void 0) - return this; - if (events3.removeListener === void 0) { - if (arguments.length === 0) { - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - } else if (events3[type] !== void 0) { - if (--this._eventsCount === 0) - this._events = /* @__PURE__ */ Object.create(null); - else - delete events3[type]; - } - return this; - } - if (arguments.length === 0) { - var keys = Object.keys(events3); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === "removeListener") continue; - this.removeAllListeners(key); - } - this.removeAllListeners("removeListener"); - this._events = /* @__PURE__ */ Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events3[type]; - if (typeof listeners === "function") { - this.removeListener(type, listeners); - } else if (listeners !== void 0) { - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; - }; - function _listeners(target, type, unwrap) { - var events3 = target._events; - if (events3 === void 0) - return []; - var evlistener = events3[type]; - if (evlistener === void 0) - return []; - if (typeof evlistener === "function") - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); - } - EventEmitter5.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); - }; - EventEmitter5.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); - }; - EventEmitter5.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === "function") { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } - }; - EventEmitter5.prototype.listenerCount = listenerCount; - function listenerCount(type) { - var events3 = this._events; - if (events3 !== void 0) { - var evlistener = events3[type]; - if (typeof evlistener === "function") { - return 1; - } else if (evlistener !== void 0) { - return evlistener.length; - } - } - return 0; - } - EventEmitter5.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; - }; - function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; - } - function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); - } - function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; - } - function once(emitter, name) { - return new Promise(function(resolve, reject) { - function errorListener(err2) { - emitter.removeListener(name, resolver); - reject(err2); - } - function resolver() { - if (typeof emitter.removeListener === "function") { - emitter.removeListener("error", errorListener); - } - resolve([].slice.call(arguments)); - } - ; - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== "error") { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); - } - function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === "function") { - eventTargetAgnosticAddListener(emitter, "error", handler, flags); - } - } - function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === "function") { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === "function") { - emitter.addEventListener(name, function wrapListener(arg) { - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } - } - } -}); - -// node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js -var require_sjcl = __commonJS({ - "node_modules/.deno/lufi-sjcl@1.0.8/node_modules/lufi-sjcl/sjcl.js"(exports, module) { - "use strict"; - var sjcl2 = { cipher: {}, hash: {}, keyexchange: {}, mode: {}, misc: {}, codec: {}, exception: { corrupt: function(a) { - this.toString = function() { - return "CORRUPT: " + this.message; - }; - this.message = a; - }, invalid: function(a) { - this.toString = function() { - return "INVALID: " + this.message; - }; - this.message = a; - }, bug: function(a) { - this.toString = function() { - return "BUG: " + this.message; - }; - this.message = a; - }, notReady: function(a) { - this.toString = function() { - return "NOT READY: " + this.message; - }; - this.message = a; - } } }; - sjcl2.cipher.aes = function(a) { - this.w[0][0][0] || this.C(); - var b, c, d, e, f = this.w[0][4], g = this.w[1]; - b = a.length; - var h = 1; - if (4 !== b && 6 !== b && 8 !== b) throw new sjcl2.exception.invalid("invalid aes key size"); - this.b = [d = a.slice(0), e = []]; - for (a = b; a < 4 * b + 28; a++) { - c = d[a - 1]; - if (0 === a % b || 8 === b && 4 === a % b) c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255], 0 === a % b && (c = c << 8 ^ c >>> 24 ^ h << 24, h = h << 1 ^ 283 * (h >> 7)); - d[a] = d[a - b] ^ c; - } - for (b = 0; a; b++, a--) c = d[b & 3 ? a : a - 4], e[b] = 4 >= a || 4 > b ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; - }; - sjcl2.cipher.aes.prototype = { encrypt: function(a) { - return aa(this, a, 0); - }, decrypt: function(a) { - return aa(this, a, 1); - }, w: [[[], [], [], [], []], [[], [], [], [], []]], C: function() { - var a = this.w[0], b = this.w[1], c = a[4], d = b[4], e, f, g, h = [], k = [], n, l, m, p; - for (e = 0; 256 > e; e++) k[(h[e] = e << 1 ^ 283 * (e >> 7)) ^ e] = e; - for (f = g = 0; !c[f]; f ^= n || 1, g = k[g] || 1) for (m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, m = m >> 8 ^ m & 255 ^ 99, c[f] = m, d[m] = f, l = h[e = h[n = h[f]]], p = 16843009 * l ^ 65537 * e ^ 257 * n ^ 16843008 * f, l = 257 * h[m] ^ 16843008 * m, e = 0; 4 > e; e++) a[e][f] = l = l << 24 ^ l >>> 8, b[e][m] = p = p << 24 ^ p >>> 8; - for (e = 0; 5 > e; e++) a[e] = a[e].slice(0), b[e] = b[e].slice(0); - } }; - function aa(a, b, c) { - if (4 !== b.length) throw new sjcl2.exception.invalid("invalid aes block size"); - var d = a.b[c], e = b[0] ^ d[0], f = b[c ? 3 : 1] ^ d[1], g = b[2] ^ d[2]; - b = b[c ? 1 : 3] ^ d[3]; - var h, k, n, l = d.length / 4 - 2, m, p = 4, z = [0, 0, 0, 0]; - h = a.w[c]; - a = h[0]; - var A = h[1], C = h[2], B = h[3], D = h[4]; - for (m = 0; m < l; m++) h = a[e >>> 24] ^ A[f >> 16 & 255] ^ C[g >> 8 & 255] ^ B[b & 255] ^ d[p], k = a[f >>> 24] ^ A[g >> 16 & 255] ^ C[b >> 8 & 255] ^ B[e & 255] ^ d[p + 1], n = a[g >>> 24] ^ A[b >> 16 & 255] ^ C[e >> 8 & 255] ^ B[f & 255] ^ d[p + 2], b = a[b >>> 24] ^ A[e >> 16 & 255] ^ C[f >> 8 & 255] ^ B[g & 255] ^ d[p + 3], p += 4, e = h, f = k, g = n; - for (m = 0; 4 > m; m++) z[c ? 3 & -m : m] = D[e >>> 24] << 24 ^ D[f >> 16 & 255] << 16 ^ D[g >> 8 & 255] << 8 ^ D[b & 255] ^ d[p++], h = e, e = f, f = g, g = b, b = h; - return z; - } - sjcl2.bitArray = { bitSlice: function(a, b, c) { - a = sjcl2.bitArray.Y(a.slice(b / 32), 32 - (b & 31)).slice(1); - return void 0 === c ? a : sjcl2.bitArray.clamp(a, c - b); - }, extract: function(a, b, c) { - var d = Math.floor(-b - c & 31); - return ((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; - }, concat: function(a, b) { - if (0 === a.length || 0 === b.length) return a.concat(b); - var c = a[a.length - 1], d = sjcl2.bitArray.getPartial(c); - return 32 === d ? a.concat(b) : sjcl2.bitArray.Y(b, d, c | 0, a.slice(0, a.length - 1)); - }, bitLength: function(a) { - var b = a.length; - return 0 === b ? 0 : 32 * (b - 1) + sjcl2.bitArray.getPartial(a[b - 1]); - }, clamp: function(a, b) { - if (32 * a.length < b) return a; - a = a.slice(0, Math.ceil(b / 32)); - var c = a.length; - b = b & 31; - 0 < c && b && (a[c - 1] = sjcl2.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1)); - return a; - }, partial: function(a, b, c) { - return 32 === a ? b : (c ? b | 0 : b << 32 - a) + 1099511627776 * a; - }, getPartial: function(a) { - return Math.round(a / 1099511627776) || 32; - }, equal: function(a, b) { - if (sjcl2.bitArray.bitLength(a) !== sjcl2.bitArray.bitLength(b)) return false; - var c = 0, d; - for (d = 0; d < a.length; d++) c |= a[d] ^ b[d]; - return 0 === c; - }, Y: function(a, b, c, d) { - var e; - e = 0; - for (void 0 === d && (d = []); 32 <= b; b -= 32) d.push(c), c = 0; - if (0 === b) return d.concat(a); - for (e = 0; e < a.length; e++) d.push(c | a[e] >>> b), c = a[e] << 32 - b; - e = a.length ? a[a.length - 1] : 0; - a = sjcl2.bitArray.getPartial(e); - d.push(sjcl2.bitArray.partial(b + a & 31, 32 < b + a ? c : d.pop(), 1)); - return d; - }, P: function(a, b) { - return [a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; - }, byteswapM: function(a) { - var b, c; - for (b = 0; b < a.length; ++b) c = a[b], a[b] = c >>> 24 | c >>> 8 & 65280 | (c & 65280) << 8 | c << 24; - return a; - } }; - sjcl2.codec.utf8String = { fromBits: function(a) { - var b = "", c = sjcl2.bitArray.bitLength(a), d, e; - for (d = 0; d < c / 8; d++) 0 === (d & 3) && (e = a[d / 4]), b += String.fromCharCode(e >>> 8 >>> 8 >>> 8), e <<= 8; - return decodeURIComponent(escape(b)); - }, toBits: function(a) { - a = unescape(encodeURIComponent(a)); - var b = [], c, d = 0; - for (c = 0; c < a.length; c++) d = d << 8 | a.charCodeAt(c), 3 === (c & 3) && (b.push(d), d = 0); - c & 3 && b.push(sjcl2.bitArray.partial(8 * (c & 3), d)); - return b; - } }; - sjcl2.codec.hex = { fromBits: function(a) { - var b = "", c; - for (c = 0; c < a.length; c++) b += ((a[c] | 0) + 263882790666240).toString(16).substr(4); - return b.substr(0, sjcl2.bitArray.bitLength(a) / 4); - }, toBits: function(a) { - var b, c = [], d; - a = a.replace(/\s|0x/g, ""); - d = a.length; - a = a + "00000000"; - for (b = 0; b < a.length; b += 8) c.push(parseInt(a.substr(b, 8), 16) ^ 0); - return sjcl2.bitArray.clamp(c, 4 * d); - } }; - sjcl2.codec.base64 = { S: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits: function(a, b, c) { - var d = "", e = 0, f = sjcl2.codec.base64.S, g = 0, h = sjcl2.bitArray.bitLength(a); - c && (f = f.substr(0, 62) + "-_"); - for (c = 0; 6 * d.length < h; ) d += f.charAt((g ^ a[c] >>> e) >>> 26), 6 > e ? (g = a[c] << 6 - e, e += 26, c++) : (g <<= 6, e -= 6); - for (; d.length & 3 && !b; ) d += "="; - return d; - }, toBits: function(a, b) { - a = a.replace(/\s|=/g, ""); - var c = [], d, e = 0, f = sjcl2.codec.base64.S, g = 0, h; - b && (f = f.substr(0, 62) + "-_"); - for (d = 0; d < a.length; d++) { - h = f.indexOf(a.charAt(d)); - if (0 > h) throw new sjcl2.exception.invalid("this isn't base64!"); - 26 < e ? (e -= 26, c.push(g ^ h >>> e), g = h << 32 - e) : (e += 6, g ^= h << 32 - e); - } - e & 56 && c.push(sjcl2.bitArray.partial(e & 56, g, 1)); - return c; - } }; - sjcl2.codec.base64url = { fromBits: function(a) { - return sjcl2.codec.base64.fromBits(a, 1, 1); - }, toBits: function(a) { - return sjcl2.codec.base64.toBits(a, 1); - } }; - sjcl2.hash.sha256 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha256.hash = function(a) { - return new sjcl2.hash.sha256().update(a).finalize(); - }; - sjcl2.hash.sha256.prototype = { blockSize: 512, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(d.subarray( - 16 * e, - 16 * (e + 1) - )), e += 1; - c.splice(0, 16 * e); - } else for (b = 512 + b - (512 + b & 511); b <= a; b += 512) this.l(c.splice(0, 16)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 2; a & 15; a++) b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 16)); - this.reset(); - return c; - }, o: [], b: [], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - for (var b = 0, c = 2, d, e; 64 > b; c++) { - e = true; - for (d = 2; d * d <= c; d++) if (0 === c % d) { - e = false; - break; - } - e && (8 > b && (this.o[b] = a(Math.pow(c, 0.5))), this.b[b] = a(Math.pow(c, 1 / 3)), b++); - } - }, l: function(a) { - var b, c, d, e = this.g, f = this.b, g = e[0], h = e[1], k = e[2], n = e[3], l = e[4], m = e[5], p = e[6], z = e[7]; - for (b = 0; 64 > b; b++) 16 > b ? c = a[b] : (c = a[b + 1 & 15], d = a[b + 14 & 15], c = a[b & 15] = (c >>> 7 ^ c >>> 18 ^ c >>> 3 ^ c << 25 ^ c << 14) + (d >>> 17 ^ d >>> 19 ^ d >>> 10 ^ d << 15 ^ d << 13) + a[b & 15] + a[b + 9 & 15] | 0), c = c + z + (l >>> 6 ^ l >>> 11 ^ l >>> 25 ^ l << 26 ^ l << 21 ^ l << 7) + (p ^ l & (m ^ p)) + f[b], z = p, p = m, m = l, l = n + c | 0, n = k, k = h, h = g, g = c + (h & k ^ n & (h ^ k)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; - e[0] = e[0] + g | 0; - e[1] = e[1] + h | 0; - e[2] = e[2] + k | 0; - e[3] = e[3] + n | 0; - e[4] = e[4] + l | 0; - e[5] = e[5] + m | 0; - e[6] = e[6] + p | 0; - e[7] = e[7] + z | 0; - } }; - sjcl2.hash.sha512 = function(a) { - this.b[0] || this.C(); - a ? (this.g = a.g.slice(0), this.f = a.f.slice(0), this.c = a.c) : this.reset(); - }; - sjcl2.hash.sha512.hash = function(a) { - return new sjcl2.hash.sha512().update(a).finalize(); - }; - sjcl2.hash.sha512.prototype = { blockSize: 1024, reset: function() { - this.g = this.o.slice(0); - this.f = []; - this.c = 0; - return this; - }, update: function(a) { - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - var b, c = this.f = sjcl2.bitArray.concat(this.f, a); - b = this.c; - a = this.c = b + sjcl2.bitArray.bitLength(a); - if (9007199254740991 < a) throw new sjcl2.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - if ("undefined" !== typeof Uint32Array) { - var d = new Uint32Array(c), e = 0; - for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(d.subarray(32 * e, 32 * (e + 1))), e += 1; - c.splice(0, 32 * e); - } else for (b = 1024 + b - (1024 + b & 1023); b <= a; b += 1024) this.l(c.splice(0, 32)); - return this; - }, finalize: function() { - var a, b = this.f, c = this.g, b = sjcl2.bitArray.concat(b, [sjcl2.bitArray.partial(1, 1)]); - for (a = b.length + 4; a & 31; a++) b.push(0); - b.push(0); - b.push(0); - b.push(Math.floor(this.c / 4294967296)); - for (b.push(this.c | 0); b.length; ) this.l(b.splice(0, 32)); - this.reset(); - return c; - }, o: [], ia: [12372232, 13281083, 9762859, 1914609, 15106769, 4090911, 4308331, 8266105], b: [], ka: [ - 2666018, - 15689165, - 5061423, - 9034684, - 4764984, - 380953, - 1658779, - 7176472, - 197186, - 7368638, - 14987916, - 16757986, - 8096111, - 1480369, - 13046325, - 6891156, - 15813330, - 5187043, - 9229749, - 11312229, - 2818677, - 10937475, - 4324308, - 1135541, - 6741931, - 11809296, - 16458047, - 15666916, - 11046850, - 698149, - 229999, - 945776, - 13774844, - 2541862, - 12856045, - 9810911, - 11494366, - 7844520, - 15576806, - 8533307, - 15795044, - 4337665, - 16291729, - 5553712, - 15684120, - 6662416, - 7413802, - 12308920, - 13816008, - 4303699, - 9366425, - 10176680, - 13195875, - 4295371, - 6546291, - 11712675, - 15708924, - 1519456, - 15772530, - 6568428, - 6495784, - 8568297, - 13007125, - 7492395, - 2515356, - 12632583, - 14740254, - 7262584, - 1535930, - 13146278, - 16321966, - 1853211, - 294276, - 13051027, - 13221564, - 1051980, - 4080310, - 6651434, - 14088940, - 4675607 - ], C: function() { - function a(a2) { - return 4294967296 * (a2 - Math.floor(a2)) | 0; - } - function b(a2) { - return 1099511627776 * (a2 - Math.floor(a2)) & 255; - } - for (var c = 0, d = 2, e, f; 80 > c; d++) { - f = true; - for (e = 2; e * e <= d; e++) if (0 === d % e) { - f = false; - break; - } - f && (8 > c && (this.o[2 * c] = a(Math.pow(d, 0.5)), this.o[2 * c + 1] = b(Math.pow(d, 0.5)) << 24 | this.ia[c]), this.b[2 * c] = a(Math.pow(d, 1 / 3)), this.b[2 * c + 1] = b(Math.pow(d, 1 / 3)) << 24 | this.ka[c], c++); - } - }, l: function(a) { - var b, c, d = this.g, e = this.b, f = d[0], g = d[1], h = d[2], k = d[3], n = d[4], l = d[5], m = d[6], p = d[7], z = d[8], A = d[9], C = d[10], B = d[11], D = d[12], P = d[13], ea = d[14], Q = d[15], t; - if ("undefined" !== typeof Uint32Array) { - t = Array(160); - for (var r = 0; 32 > r; r++) t[r] = a[r]; - } else t = a; - var r = f, u = g, G = h, E = k, H = n, F = l, V = m, I = p, w = z, v = A, R = C, J = B, S = D, K = P, W = ea, L = Q; - for (a = 0; 80 > a; a++) { - if (16 > a) b = t[2 * a], c = t[2 * a + 1]; - else { - c = t[2 * (a - 15)]; - var q = t[2 * (a - 15) + 1]; - b = (q << 31 | c >>> 1) ^ (q << 24 | c >>> 8) ^ c >>> 7; - var x = (c << 31 | q >>> 1) ^ (c << 24 | q >>> 8) ^ (c << 25 | q >>> 7); - c = t[2 * (a - 2)]; - var y = t[2 * (a - 2) + 1], q = (y << 13 | c >>> 19) ^ (c << 3 | y >>> 29) ^ c >>> 6, y = (c << 13 | y >>> 19) ^ (y << 3 | c >>> 29) ^ (c << 26 | y >>> 6), X = t[2 * (a - 7)], Y = t[2 * (a - 16)], M = t[2 * (a - 16) + 1]; - c = x + t[2 * (a - 7) + 1]; - b = b + X + (c >>> 0 < x >>> 0 ? 1 : 0); - c += y; - b += q + (c >>> 0 < y >>> 0 ? 1 : 0); - c += M; - b += Y + (c >>> 0 < M >>> 0 ? 1 : 0); - } - t[2 * a] = b |= 0; - t[2 * a + 1] = c |= 0; - var X = w & R ^ ~w & S, fa = v & J ^ ~v & K, y = r & G ^ r & H ^ G & H, ja = u & E ^ u & F ^ E & F, Y = (u << 4 | r >>> 28) ^ (r << 30 | u >>> 2) ^ (r << 25 | u >>> 7), M = (r << 4 | u >>> 28) ^ (u << 30 | r >>> 2) ^ (u << 25 | r >>> 7), ka = e[2 * a], ga = e[2 * a + 1], q = L + ((w << 18 | v >>> 14) ^ (w << 14 | v >>> 18) ^ (v << 23 | w >>> 9)), x = W + ((v << 18 | w >>> 14) ^ (v << 14 | w >>> 18) ^ (w << 23 | v >>> 9)) + (q >>> 0 < L >>> 0 ? 1 : 0), q = q + fa, x = x + (X + (q >>> 0 < fa >>> 0 ? 1 : 0)), q = q + ga, x = x + (ka + (q >>> 0 < ga >>> 0 ? 1 : 0)), q = q + c | 0, x = x + (b + (q >>> 0 < c >>> 0 ? 1 : 0)); - c = M + ja; - b = Y + y + (c >>> 0 < M >>> 0 ? 1 : 0); - W = S; - L = K; - S = R; - K = J; - R = w; - J = v; - v = I + q | 0; - w = V + x + (v >>> 0 < I >>> 0 ? 1 : 0) | 0; - V = H; - I = F; - H = G; - F = E; - G = r; - E = u; - u = q + c | 0; - r = x + b + (u >>> 0 < q >>> 0 ? 1 : 0) | 0; - } - g = d[1] = g + u | 0; - d[0] = f + r + (g >>> 0 < u >>> 0 ? 1 : 0) | 0; - k = d[3] = k + E | 0; - d[2] = h + G + (k >>> 0 < E >>> 0 ? 1 : 0) | 0; - l = d[5] = l + F | 0; - d[4] = n + H + (l >>> 0 < F >>> 0 ? 1 : 0) | 0; - p = d[7] = p + I | 0; - d[6] = m + V + (p >>> 0 < I >>> 0 ? 1 : 0) | 0; - A = d[9] = A + v | 0; - d[8] = z + w + (A >>> 0 < v >>> 0 ? 1 : 0) | 0; - B = d[11] = B + J | 0; - d[10] = C + R + (B >>> 0 < J >>> 0 ? 1 : 0) | 0; - P = d[13] = P + K | 0; - d[12] = D + S + (P >>> 0 < K >>> 0 ? 1 : 0) | 0; - Q = d[15] = Q + L | 0; - d[14] = ea + W + (Q >>> 0 < L >>> 0 ? 1 : 0) | 0; - } }; - sjcl2.mode.ccm = { name: "ccm", F: [], listenProgress: function(a) { - sjcl2.mode.ccm.F.push(a); - }, unListenProgress: function(a) { - a = sjcl2.mode.ccm.F.indexOf(a); - -1 < a && sjcl2.mode.ccm.F.splice(a, 1); - }, da: function(a) { - var b = sjcl2.mode.ccm.F.slice(), c; - for (c = 0; c < b.length; c += 1) b[c](a); - }, encrypt: function(a, b, c, d, e) { - var f, g = b.slice(0), h = sjcl2.bitArray, k = h.bitLength(c) / 8, n = h.bitLength(g) / 8; - e = e || 64; - d = d || []; - if (7 > k) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (f = 2; 4 > f && n >>> 8 * f; f++) ; - f < 15 - k && (f = 15 - k); - c = h.clamp( - c, - 8 * (15 - f) - ); - b = sjcl2.mode.ccm.U(a, b, c, d, e, f); - g = sjcl2.mode.ccm.V(a, g, c, b, e, f); - return h.concat(g.data, g.tag); - }, decrypt: function(a, b, c, d, e) { - e = e || 64; - d = d || []; - var f = sjcl2.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), k = f.clamp(b, h - e), n = f.bitSlice(b, h - e), h = (h - e) / 8; - if (7 > g) throw new sjcl2.exception.invalid("ccm: iv must be at least 7 bytes"); - for (b = 2; 4 > b && h >>> 8 * b; b++) ; - b < 15 - g && (b = 15 - g); - c = f.clamp(c, 8 * (15 - b)); - k = sjcl2.mode.ccm.V(a, k, c, n, e, b); - a = sjcl2.mode.ccm.U(a, k.data, c, d, e, b); - if (!f.equal(k.tag, a)) throw new sjcl2.exception.corrupt("ccm: tag doesn't match"); - return k.data; - }, ma: function(a, b, c, d, e, f) { - var g = [], h = sjcl2.bitArray, k = h.P; - d = [h.partial(8, (b.length ? 64 : 0) | d - 2 << 2 | f - 1)]; - d = h.concat(d, c); - d[3] |= e; - d = a.encrypt(d); - if (b.length) for (c = h.bitLength(b) / 8, 65279 >= c ? g = [h.partial(16, c)] : 4294967295 >= c && (g = h.concat([h.partial(16, 65534)], [c])), g = h.concat(g, b), b = 0; b < g.length; b += 4) d = a.encrypt(k(d, g.slice(b, b + 4).concat([0, 0, 0]))); - return d; - }, U: function(a, b, c, d, e, f) { - var g = sjcl2.bitArray, h = g.P; - e /= 8; - if (e % 2 || 4 > e || 16 < e) throw new sjcl2.exception.invalid("ccm: invalid tag length"); - if (4294967295 < d.length || 4294967295 < b.length) throw new sjcl2.exception.bug("ccm: can't deal with 4GiB or more data"); - c = sjcl2.mode.ccm.ma(a, d, c, e, g.bitLength(b) / 8, f); - for (d = 0; d < b.length; d += 4) c = a.encrypt(h(c, b.slice(d, d + 4).concat([0, 0, 0]))); - return g.clamp(c, 8 * e); - }, V: function(a, b, c, d, e, f) { - var g, h = sjcl2.bitArray; - g = h.P; - var k = b.length, n = h.bitLength(b), l = k / 50, m = l; - c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); - d = h.bitSlice(g(d, a.encrypt(c)), 0, e); - if (!k) return { tag: d, data: [] }; - for (g = 0; g < k; g += 4) g > l && (sjcl2.mode.ccm.da(g / k), l += m), c[3]++, e = a.encrypt(c), b[g] ^= e[0], b[g + 1] ^= e[1], b[g + 2] ^= e[2], b[g + 3] ^= e[3]; - return { tag: d, data: h.clamp(b, n) }; - } }; - sjcl2.misc.hmac = function(a, b) { - this.W = b = b || sjcl2.hash.sha256; - var c = [[], []], d, e = b.prototype.blockSize / 32; - this.B = [new b(), new b()]; - a.length > e && (a = b.hash(a)); - for (d = 0; d < e; d++) c[0][d] = a[d] ^ 909522486, c[1][d] = a[d] ^ 1549556828; - this.B[0].update(c[0]); - this.B[1].update(c[1]); - this.O = new b(this.B[0]); - }; - sjcl2.misc.hmac.prototype.encrypt = sjcl2.misc.hmac.prototype.mac = function(a) { - if (this.Z) throw new sjcl2.exception.invalid("encrypt on already updated hmac called!"); - this.update(a); - return this.digest(a); - }; - sjcl2.misc.hmac.prototype.reset = function() { - this.O = new this.W(this.B[0]); - this.Z = false; - }; - sjcl2.misc.hmac.prototype.update = function(a) { - this.Z = true; - this.O.update(a); - }; - sjcl2.misc.hmac.prototype.digest = function() { - var a = this.O.finalize(), a = new this.W(this.B[1]).update(a).finalize(); - this.reset(); - return a; - }; - sjcl2.misc.pbkdf2 = function(a, b, c, d, e) { - c = c || 1e4; - if (0 > d || 0 > c) throw new sjcl2.exception.invalid("invalid params to pbkdf2"); - "string" === typeof a && (a = sjcl2.codec.utf8String.toBits(a)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - e = e || sjcl2.misc.hmac; - a = new e(a); - var f, g, h, k, n = [], l = sjcl2.bitArray; - for (k = 1; 32 * n.length < (d || 1); k++) { - e = f = a.encrypt(l.concat(b, [k])); - for (g = 1; g < c; g++) for (f = a.encrypt(f), h = 0; h < f.length; h++) e[h] ^= f[h]; - n = n.concat(e); - } - d && (n = l.clamp(n, d)); - return n; - }; - sjcl2.prng = function(a) { - this.h = [new sjcl2.hash.sha256()]; - this.s = [0]; - this.N = 0; - this.G = {}; - this.M = 0; - this.T = {}; - this.X = this.i = this.u = this.fa = 0; - this.b = [0, 0, 0, 0, 0, 0, 0, 0]; - this.m = [0, 0, 0, 0]; - this.K = void 0; - this.L = a; - this.D = false; - this.J = { progress: {}, seeded: {} }; - this.A = this.ea = 0; - this.H = 1; - this.I = 2; - this.aa = 65536; - this.R = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024]; - this.ba = 3e4; - this.$ = 80; - }; - sjcl2.prng.prototype = { - randomWords: function(a, b) { - var c = [], d; - d = this.isReady(b); - var e; - if (d === this.A) throw new sjcl2.exception.notReady("generator isn't seeded"); - if (d & this.I) { - d = !(d & this.H); - e = []; - var f = 0, g; - this.X = e[0] = (/* @__PURE__ */ new Date()).valueOf() + this.ba; - for (g = 0; 16 > g; g++) e.push(4294967296 * Math.random() | 0); - for (g = 0; g < this.h.length && (e = e.concat(this.h[g].finalize()), f += this.s[g], this.s[g] = 0, d || !(this.N & 1 << g)); g++) ; - this.N >= 1 << this.h.length && (this.h.push(new sjcl2.hash.sha256()), this.s.push(0)); - this.i -= f; - f > this.u && (this.u = f); - this.N++; - this.b = sjcl2.hash.sha256.hash(this.b.concat(e)); - this.K = new sjcl2.cipher.aes(this.b); - for (d = 0; 4 > d && (this.m[d] = this.m[d] + 1 | 0, !this.m[d]); d++) ; - } - for (d = 0; d < a; d += 4) 0 === (d + 1) % this.aa && ba(this), e = N(this), c.push(e[0], e[1], e[2], e[3]); - ba(this); - return c.slice(0, a); - }, - setDefaultParanoia: function(a, b) { - if (0 === a && "Setting paranoia=0 will ruin your security; use it only for testing" !== b) throw new sjcl2.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing"); - this.L = a; - }, - addEntropy: function(a, b, c) { - c = c || "user"; - var d, e, f = (/* @__PURE__ */ new Date()).valueOf(), g = this.G[c], h = this.isReady(), k = 0; - d = this.T[c]; - void 0 === d && (d = this.T[c] = this.fa++); - void 0 === g && (g = this.G[c] = 0); - this.G[c] = (this.G[c] + 1) % this.h.length; - switch (typeof a) { - case "number": - void 0 === b && (b = 1); - this.h[g].update([d, this.M++, 1, b, f, 1, a | 0]); - break; - case "object": - c = Object.prototype.toString.call(a); - if ("[object Uint32Array]" === c) { - e = []; - for (c = 0; c < a.length; c++) e.push(a[c]); - a = e; - } else for ("[object Array]" !== c && (k = 1), c = 0; c < a.length && !k; c++) "number" !== typeof a[c] && (k = 1); - if (!k) { - if (void 0 === b) for (c = b = 0; c < a.length; c++) for (e = a[c]; 0 < e; ) b++, e = e >>> 1; - this.h[g].update([d, this.M++, 2, b, f, a.length].concat(a)); - } - break; - case "string": - void 0 === b && (b = a.length); - this.h[g].update([d, this.M++, 3, b, f, a.length]); - this.h[g].update(a); - break; - default: - k = 1; - } - if (k) throw new sjcl2.exception.bug("random: addEntropy only supports number, array of numbers or string"); - this.s[g] += b; - this.i += b; - h === this.A && (this.isReady() !== this.A && ca("seeded", Math.max(this.u, this.i)), ca("progress", this.getProgress())); - }, - isReady: function(a) { - a = this.R[void 0 !== a ? a : this.L]; - return this.u && this.u >= a ? this.s[0] > this.$ && (/* @__PURE__ */ new Date()).valueOf() > this.X ? this.I | this.H : this.H : this.i >= a ? this.I | this.A : this.A; - }, - getProgress: function(a) { - a = this.R[a ? a : this.L]; - return this.u >= a ? 1 : this.i > a ? 1 : this.i / a; - }, - startCollectors: function() { - if (!this.D) { - this.a = { loadTimeCollector: O(this, this.la), mouseCollector: O(this, this.na), keyboardCollector: O(this, this.ja), accelerometerCollector: O(this, this.ca), touchCollector: O(this, this.pa) }; - if (window.addEventListener) window.addEventListener( - "load", - this.a.loadTimeCollector, - false - ), window.addEventListener("mousemove", this.a.mouseCollector, false), window.addEventListener("keypress", this.a.keyboardCollector, false), window.addEventListener("devicemotion", this.a.accelerometerCollector, false), window.addEventListener("touchmove", this.a.touchCollector, false); - else if (document.attachEvent) document.attachEvent("onload", this.a.loadTimeCollector), document.attachEvent("onmousemove", this.a.mouseCollector), document.attachEvent("keypress", this.a.keyboardCollector); - else throw new sjcl2.exception.bug("can't attach event"); - this.D = true; - } - }, - stopCollectors: function() { - this.D && (window.removeEventListener ? (window.removeEventListener("load", this.a.loadTimeCollector, false), window.removeEventListener("mousemove", this.a.mouseCollector, false), window.removeEventListener("keypress", this.a.keyboardCollector, false), window.removeEventListener("devicemotion", this.a.accelerometerCollector, false), window.removeEventListener("touchmove", this.a.touchCollector, false)) : document.detachEvent && (document.detachEvent("onload", this.a.loadTimeCollector), document.detachEvent( - "onmousemove", - this.a.mouseCollector - ), document.detachEvent("keypress", this.a.keyboardCollector)), this.D = false); - }, - addEventListener: function(a, b) { - this.J[a][this.ea++] = b; - }, - removeEventListener: function(a, b) { - var c, d, e = this.J[a], f = []; - for (d in e) e.hasOwnProperty(d) && e[d] === b && f.push(d); - for (c = 0; c < f.length; c++) d = f[c], delete e[d]; - }, - ja: function() { - T(this, 1); - }, - na: function(a) { - var b, c; - try { - b = a.x || a.clientX || a.offsetX || 0, c = a.y || a.clientY || a.offsetY || 0; - } catch (d) { - c = b = 0; - } - 0 != b && 0 != c && this.addEntropy([b, c], 2, "mouse"); - T(this, 0); - }, - pa: function(a) { - a = a.touches[0] || a.changedTouches[0]; - this.addEntropy([a.pageX || a.clientX, a.pageY || a.clientY], 1, "touch"); - T(this, 0); - }, - la: function() { - T(this, 2); - }, - ca: function(a) { - a = a.accelerationIncludingGravity.x || a.accelerationIncludingGravity.y || a.accelerationIncludingGravity.z; - if (window.orientation) { - var b = window.orientation; - "number" === typeof b && this.addEntropy(b, 1, "accelerometer"); - } - a && this.addEntropy(a, 2, "accelerometer"); - T(this, 0); - } - }; - function ca(a, b) { - var c, d = sjcl2.random.J[a], e = []; - for (c in d) d.hasOwnProperty(c) && e.push(d[c]); - for (c = 0; c < e.length; c++) e[c](b); - } - function T(a, b) { - "undefined" !== typeof window && window.performance && "function" === typeof window.performance.now ? a.addEntropy(window.performance.now(), b, "loadtime") : a.addEntropy((/* @__PURE__ */ new Date()).valueOf(), b, "loadtime"); - } - function ba(a) { - a.b = N(a).concat(N(a)); - a.K = new sjcl2.cipher.aes(a.b); - } - function N(a) { - for (var b = 0; 4 > b && (a.m[b] = a.m[b] + 1 | 0, !a.m[b]); b++) ; - return a.K.encrypt(a.m); - } - function O(a, b) { - return function() { - b.apply(a, arguments); - }; - } - sjcl2.random = new sjcl2.prng(6); - a: try { - if (ha = "undefined" !== typeof module && module.exports) { - try { - ia = __require("crypto"); - } catch (a) { - ia = null; - } - ha = da = ia; - } - if (ha && da.randomBytes) U = da.randomBytes(128), U = new Uint32Array(new Uint8Array(U).buffer), sjcl2.random.addEntropy(U, 1024, "crypto['randomBytes']"); - else if ("undefined" !== typeof window && "undefined" !== typeof Uint32Array) { - Z = new Uint32Array(32); - if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(Z); - else if (window.msCrypto && window.msCrypto.getRandomValues) window.msCrypto.getRandomValues(Z); - else break a; - sjcl2.random.addEntropy(Z, 1024, "crypto['getRandomValues']"); - } - } catch (a) { - "undefined" !== typeof window && window.console && (console.log("There was an error collecting entropy from the browser:"), console.log(a)); - } - var U; - var da; - var Z; - var ha; - var ia; - sjcl2.json = { defaults: { v: 1, iter: 1e4, ks: 128, ts: 64, mode: "ccm", adata: "", cipher: "aes" }, ha: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json, f = e.j({ iv: sjcl2.random.randomWords(4, 0) }, e.defaults), g; - e.j(f, c); - c = f.adata; - "string" === typeof f.salt && (f.salt = sjcl2.codec.base64.toBits(f.salt)); - "string" === typeof f.iv && (f.iv = sjcl2.codec.base64.toBits(f.iv)); - if (!sjcl2.mode[f.mode] || !sjcl2.cipher[f.cipher] || "string" === typeof a && 100 >= f.iter || 64 !== f.ts && 96 !== f.ts && 128 !== f.ts || 128 !== f.ks && 192 !== f.ks && 256 !== f.ks || 2 > f.iv.length || 4 < f.iv.length) throw new sjcl2.exception.invalid("json encrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, f), a = g.key.slice(0, f.ks / 32), f.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.publicKey && (g = a.kem(), f.kemtag = g.tag, a = g.key.slice(0, f.ks / 32)); - "string" === typeof b && (b = sjcl2.codec.utf8String.toBits(b)); - "string" === typeof c && (f.adata = c = sjcl2.codec.utf8String.toBits(c)); - g = new sjcl2.cipher[f.cipher](a); - e.j(d, f); - d.key = a; - f.ct = "ccm" === f.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.encrypt(g, b, f.iv, c, f.ts) : sjcl2.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); - return f; - }, encrypt: function(a, b, c, d) { - var e = sjcl2.json, f = e.ha.apply(e, arguments); - return e.encode(f); - }, ga: function(a, b, c, d) { - c = c || {}; - d = d || {}; - var e = sjcl2.json; - b = e.j(e.j(e.j({}, e.defaults), b), c, true); - var f, g; - f = b.adata; - "string" === typeof b.salt && (b.salt = sjcl2.codec.base64.toBits(b.salt)); - "string" === typeof b.iv && (b.iv = sjcl2.codec.base64.toBits(b.iv)); - if (!sjcl2.mode[b.mode] || !sjcl2.cipher[b.cipher] || "string" === typeof a && 100 >= b.iter || 64 !== b.ts && 96 !== b.ts && 128 !== b.ts || 128 !== b.ks && 192 !== b.ks && 256 !== b.ks || !b.iv || 2 > b.iv.length || 4 < b.iv.length) throw new sjcl2.exception.invalid("json decrypt: invalid parameters"); - "string" === typeof a ? (g = sjcl2.misc.cachedPbkdf2(a, b), a = g.key.slice(0, b.ks / 32), b.salt = g.salt) : sjcl2.ecc && a instanceof sjcl2.ecc.elGamal.secretKey && (a = a.unkem(sjcl2.codec.base64.toBits(b.kemtag)).slice(0, b.ks / 32)); - "string" === typeof f && (f = sjcl2.codec.utf8String.toBits(f)); - g = new sjcl2.cipher[b.cipher](a); - f = "ccm" === b.mode && sjcl2.arrayBuffer && sjcl2.arrayBuffer.ccm && b.ct instanceof ArrayBuffer ? sjcl2.arrayBuffer.ccm.decrypt(g, b.ct, b.iv, b.tag, f, b.ts) : sjcl2.mode[b.mode].decrypt(g, b.ct, b.iv, f, b.ts); - e.j(d, b); - d.key = a; - return 1 === c.raw ? f : sjcl2.codec.utf8String.fromBits(f); - }, decrypt: function(a, b, c, d) { - var e = sjcl2.json; - return e.ga(a, e.decode(b), c, d); - }, encode: function(a) { - var b, c = "{", d = ""; - for (b in a) if (a.hasOwnProperty(b)) { - if (!b.match(/^[a-z0-9]+$/i)) throw new sjcl2.exception.invalid("json encode: invalid property name"); - c += d + '"' + b + '":'; - d = ","; - switch (typeof a[b]) { - case "number": - case "boolean": - c += a[b]; - break; - case "string": - c += '"' + escape(a[b]) + '"'; - break; - case "object": - c += '"' + sjcl2.codec.base64.fromBits(a[b], 0) + '"'; - break; - default: - throw new sjcl2.exception.bug("json encode: unsupported type"); - } - } - return c + "}"; - }, decode: function(a) { - a = a.replace(/\s/g, ""); - if (!a.match(/^\{.*\}$/)) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - a = a.replace(/^\{|\}$/g, "").split(/,/); - var b = {}, c, d; - for (c = 0; c < a.length; c++) { - if (!(d = a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i))) throw new sjcl2.exception.invalid("json decode: this isn't json!"); - null != d[3] ? b[d[2]] = parseInt(d[3], 10) : null != d[4] ? b[d[2]] = d[2].match(/^(ct|adata|salt|iv)$/) ? sjcl2.codec.base64.toBits(d[4]) : unescape(d[4]) : null != d[5] && (b[d[2]] = "true" === d[5]); - } - return b; - }, j: function(a, b, c) { - void 0 === a && (a = {}); - if (void 0 === b) return a; - for (var d in b) if (b.hasOwnProperty(d)) { - if (c && void 0 !== a[d] && a[d] !== b[d]) throw new sjcl2.exception.invalid("required parameter overridden"); - a[d] = b[d]; - } - return a; - }, ra: function(a, b) { - var c = {}, d; - for (d in a) a.hasOwnProperty(d) && a[d] !== b[d] && (c[d] = a[d]); - return c; - }, qa: function(a, b) { - var c = {}, d; - for (d = 0; d < b.length; d++) void 0 !== a[b[d]] && (c[b[d]] = a[b[d]]); - return c; - } }; - sjcl2.encrypt = sjcl2.json.encrypt; - sjcl2.decrypt = sjcl2.json.decrypt; - sjcl2.misc.oa = {}; - sjcl2.misc.cachedPbkdf2 = function(a, b) { - var c = sjcl2.misc.oa, d; - b = b || {}; - d = b.iter || 1e3; - c = c[a] = c[a] || {}; - d = c[d] = c[d] || { firstSalt: b.salt && b.salt.length ? b.salt.slice(0) : sjcl2.random.randomWords(2, 0) }; - c = void 0 === b.salt ? d.firstSalt : b.salt; - d[c] = d[c] || sjcl2.misc.pbkdf2(a, c, b.iter); - return { key: d[c].slice(0), salt: c.slice(0) }; - }; - "undefined" !== typeof module && module.exports && (module.exports = sjcl2); - "function" === typeof define && define([], function() { - return sjcl2; - }); - } -}); - -// node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.js -var require_eventemitter3 = __commonJS({ - "node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.js"(exports, module) { - "use strict"; - var has = Object.prototype.hasOwnProperty; - var prefix = "~"; - function Events() { - } - if (Object.create) { - Events.prototype = /* @__PURE__ */ Object.create(null); - if (!new Events().__proto__) prefix = false; - } - function EE(fn, context, once) { - this.fn = fn; - this.context = context; - this.once = once || false; - } - function addListener(emitter, event, fn, context, once) { - if (typeof fn !== "function") { - throw new TypeError("The listener must be a function"); - } - var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event; - if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; - else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); - else emitter._events[evt] = [emitter._events[evt], listener]; - return emitter; - } - function clearEvent(emitter, evt) { - if (--emitter._eventsCount === 0) emitter._events = new Events(); - else delete emitter._events[evt]; - } - function EventEmitter5() { - this._events = new Events(); - this._eventsCount = 0; - } - EventEmitter5.prototype.eventNames = function eventNames() { - var names = [], events3, name; - if (this._eventsCount === 0) return names; - for (name in events3 = this._events) { - if (has.call(events3, name)) names.push(prefix ? name.slice(1) : name); - } - if (Object.getOwnPropertySymbols) { - return names.concat(Object.getOwnPropertySymbols(events3)); - } - return names; - }; - EventEmitter5.prototype.listeners = function listeners(event) { - var evt = prefix ? prefix + event : event, handlers = this._events[evt]; - if (!handlers) return []; - if (handlers.fn) return [handlers.fn]; - for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { - ee[i] = handlers[i].fn; - } - return ee; - }; - EventEmitter5.prototype.listenerCount = function listenerCount(event) { - var evt = prefix ? prefix + event : event, listeners = this._events[evt]; - if (!listeners) return 0; - if (listeners.fn) return 1; - return listeners.length; - }; - EventEmitter5.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { - var evt = prefix ? prefix + event : event; - if (!this._events[evt]) return false; - var listeners = this._events[evt], len = arguments.length, args, i; - if (listeners.fn) { - if (listeners.once) this.removeListener(event, listeners.fn, void 0, true); - switch (len) { - case 1: - return listeners.fn.call(listeners.context), true; - case 2: - return listeners.fn.call(listeners.context, a1), true; - case 3: - return listeners.fn.call(listeners.context, a1, a2), true; - case 4: - return listeners.fn.call(listeners.context, a1, a2, a3), true; - case 5: - return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; - case 6: - return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; - } - for (i = 1, args = new Array(len - 1); i < len; i++) { - args[i - 1] = arguments[i]; - } - listeners.fn.apply(listeners.context, args); - } else { - var length = listeners.length, j; - for (i = 0; i < length; i++) { - if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true); - switch (len) { - case 1: - listeners[i].fn.call(listeners[i].context); - break; - case 2: - listeners[i].fn.call(listeners[i].context, a1); - break; - case 3: - listeners[i].fn.call(listeners[i].context, a1, a2); - break; - case 4: - listeners[i].fn.call(listeners[i].context, a1, a2, a3); - break; - default: - if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) { - args[j - 1] = arguments[j]; - } - listeners[i].fn.apply(listeners[i].context, args); - } - } - } - return true; - }; - EventEmitter5.prototype.on = function on(event, fn, context) { - return addListener(this, event, fn, context, false); - }; - EventEmitter5.prototype.once = function once(event, fn, context) { - return addListener(this, event, fn, context, true); - }; - EventEmitter5.prototype.removeListener = function removeListener(event, fn, context, once) { - var evt = prefix ? prefix + event : event; - if (!this._events[evt]) return this; - if (!fn) { - clearEvent(this, evt); - return this; - } - var listeners = this._events[evt]; - if (listeners.fn) { - if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) { - clearEvent(this, evt); - } - } else { - for (var i = 0, events3 = [], length = listeners.length; i < length; i++) { - if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) { - events3.push(listeners[i]); - } - } - if (events3.length) this._events[evt] = events3.length === 1 ? events3[0] : events3; - else clearEvent(this, evt); - } - return this; - }; - EventEmitter5.prototype.removeAllListeners = function removeAllListeners(event) { - var evt; - if (event) { - evt = prefix ? prefix + event : event; - if (this._events[evt]) clearEvent(this, evt); - } else { - this._events = new Events(); - this._eventsCount = 0; - } - return this; - }; - EventEmitter5.prototype.off = EventEmitter5.prototype.removeListener; - EventEmitter5.prototype.addListener = EventEmitter5.prototype.on; - EventEmitter5.prefixed = prefix; - EventEmitter5.EventEmitter = EventEmitter5; - if ("undefined" !== typeof module) { - module.exports = EventEmitter5; - } - } -}); - -// node_modules/.deno/neverthrow@8.1.1/node_modules/neverthrow/dist/index.es.js -var defaultErrorConfig = { - withStackTrace: false -}; -var createNeverThrowError = (message, result, config = defaultErrorConfig) => { - const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error }; - const maybeStack = config.withStackTrace ? new Error().stack : void 0; - return { - data, - message, - stack: maybeStack - }; -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function() { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function awaitReturn(f) { - return function(v) { - return Promise.resolve(v).then(f, reject); - }; - } - function verb(n, f) { - if (g[n]) { - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - if (f) i[n] = f(i[n]); - } - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -var ResultAsync = class _ResultAsync { - constructor(res) { - this._promise = res; - } - static fromSafePromise(promise) { - const newPromise = promise.then((value) => new Ok(value)); - return new _ResultAsync(newPromise); - } - static fromPromise(promise, errorFn) { - const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e))); - return new _ResultAsync(newPromise); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static fromThrowable(fn, errorFn) { - return (...args) => { - return new _ResultAsync((() => __awaiter(this, void 0, void 0, function* () { - try { - return new Ok(yield fn(...args)); - } catch (error) { - return new Err(errorFn ? errorFn(error) : error); - } - }))()); - }; - } - static combine(asyncResultList) { - return combineResultAsyncList(asyncResultList); - } - static combineWithAllErrors(asyncResultList) { - return combineResultAsyncListWithAllErrors(asyncResultList); - } - map(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - return new Ok(yield f(res.value)); - }))); - } - andThrough(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - const newRes = yield f(res.value); - if (newRes.isErr()) { - return new Err(newRes.error); - } - return new Ok(res.value); - }))); - } - andTee(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return new Err(res.error); - } - try { - yield f(res.value); - } catch (e) { - } - return new Ok(res.value); - }))); - } - mapErr(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isOk()) { - return new Ok(res.value); - } - return new Err(yield f(res.error)); - }))); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return new _ResultAsync(this._promise.then((res) => { - if (res.isErr()) { - return new Err(res.error); - } - const newValue = f(res.value); - return newValue instanceof _ResultAsync ? newValue._promise : newValue; - })); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return new _ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () { - if (res.isErr()) { - return f(res.error); - } - return new Ok(res.value); - }))); - } - match(ok2, _err) { - return this._promise.then((res) => res.match(ok2, _err)); - } - unwrapOr(t) { - return this._promise.then((res) => res.unwrapOr(t)); - } - /** - * @deprecated will be removed in 9.0.0. - * - * You can use `safeTry` without this method. - * @example - * ```typescript - * safeTry(async function* () { - * const okValue = yield* yourResult - * }) - * ``` - * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`. - */ - safeUnwrap() { - return __asyncGenerator(this, arguments, function* safeUnwrap_1() { - return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap())))))); - }); - } - // Makes ResultAsync implement PromiseLike - then(successCallback, failureCallback) { - return this._promise.then(successCallback, failureCallback); - } - [Symbol.asyncIterator]() { - return __asyncGenerator(this, arguments, function* _a() { - const result = yield __await(this._promise); - if (result.isErr()) { - yield yield __await(errAsync(result.error)); - } - return yield __await(result.value); - }); - } -}; -var okAsync = (value) => new ResultAsync(Promise.resolve(new Ok(value))); -var errAsync = (err2) => new ResultAsync(Promise.resolve(new Err(err2))); -var fromPromise = ResultAsync.fromPromise; -var fromSafePromise = ResultAsync.fromSafePromise; -var fromAsyncThrowable = ResultAsync.fromThrowable; -var combineResultList = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr()) { - acc = err(result.error); - break; - } else { - acc.map((list) => list.push(result.value)); - } - } - return acc; -}; -var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList); -var combineResultListWithAllErrors = (resultList) => { - let acc = ok([]); - for (const result of resultList) { - if (result.isErr() && acc.isErr()) { - acc.error.push(result.error); - } else if (result.isErr() && acc.isOk()) { - acc = err([result.error]); - } else if (result.isOk() && acc.isOk()) { - acc.value.push(result.value); - } - } - return acc; -}; -var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors); -var Result; -(function(Result2) { - function fromThrowable2(fn, errorFn) { - return (...args) => { - try { - const result = fn(...args); - return ok(result); - } catch (e) { - return err(errorFn ? errorFn(e) : e); - } - }; - } - Result2.fromThrowable = fromThrowable2; - function combine(resultList) { - return combineResultList(resultList); - } - Result2.combine = combine; - function combineWithAllErrors(resultList) { - return combineResultListWithAllErrors(resultList); - } - Result2.combineWithAllErrors = combineWithAllErrors; -})(Result || (Result = {})); -var ok = (value) => new Ok(value); -function err(err2) { - return new Err(err2); -} -var Ok = class { - constructor(value) { - this.value = value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } - map(f) { - return ok(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - mapErr(_f) { - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThrough(f) { - return f(this.value).map((_value) => this.value); - } - andTee(f) { - try { - f(this.value); - } catch (e) { - } - return ok(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(_f) { - return ok(this.value); - } - asyncAndThen(f) { - return f(this.value); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - asyncAndThrough(f) { - return f(this.value).map(() => this.value); - } - asyncMap(f) { - return ResultAsync.fromSafePromise(f(this.value)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - unwrapOr(_v) { - return this.value; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - match(ok2, _err) { - return ok2(this.value); - } - safeUnwrap() { - const value = this.value; - return function* () { - return value; - }(); - } - _unsafeUnwrap(_) { - return this.value; - } - _unsafeUnwrapErr(config) { - throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config); - } - // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield - *[Symbol.iterator]() { - return this.value; - } -}; -var Err = class { - constructor(error) { - this.error = error; - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - map(_f) { - return err(this.error); - } - mapErr(f) { - return err(f(this.error)); - } - andThrough(_f) { - return err(this.error); - } - andTee(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - andThen(_f) { - return err(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - orElse(f) { - return f(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncAndThen(_f) { - return errAsync(this.error); - } - asyncAndThrough(_f) { - return errAsync(this.error); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - asyncMap(_f) { - return errAsync(this.error); - } - unwrapOr(v) { - return v; - } - match(_ok, err2) { - return err2(this.error); - } - safeUnwrap() { - const error = this.error; - return function* () { - yield err(error); - throw new Error("Do not use this generator out of `safeTry`"); - }(); - } - _unsafeUnwrap(config) { - throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config); - } - _unsafeUnwrapErr(_) { - return this.error; - } - *[Symbol.iterator]() { - const self2 = this; - yield self2; - return self2; - } -}; -var fromThrowable = Result.fromThrowable; - -// src/error/base-error.ts -var BaseError = class extends Error { - constructor(message, options = {}) { - const { cause, context } = options; - super(message, { cause }); - __publicField(this, "context"); - this.name = this.constructor.name; - this.context = context; - } -}; - -// src/error/websocket/websocket-error.ts -var WebSocketError = class extends BaseError { -}; - -// src/error/websocket/websocket-connection-error.ts -var WebSocketConnectionError = class extends WebSocketError { - constructor() { - super(...arguments); - __publicField(this, "message", "An error occured while trying to connect to WebSocket"); - } -}; - -// src/utils.ts -var ensureError = (value) => { - if (value instanceof Error) return value; - let stringified = "[Unable to stringify the thrown value]"; - try { - stringified = JSON.stringify(value); - } catch (_error) { - } - return new Error(stringified); -}; -var isDenoRuntime = () => typeof Deno !== "undefined"; -var workerUrl = (relativePath) => { - return isDenoRuntime() ? new URL(`./worker/${relativePath}.ts`, new URL(".", import.meta.url).href) : new URL( - import.meta.resolve( - `./${relativePath !== "encrypt" ? `worker/${relativePath}` : relativePath}.js` - ) - ); -}; - -// src/worker/shared.ts -var import_events = __toESM(require_events()); -var events = new import_events.default(); -var updateFile = (lufiFile2, args) => { - Object.assign(lufiFile2, args); - if (typeof WorkerGlobalScope !== "undefined") { - self.postMessage({ - event: "FILE_UPDATED" /* FILE_UPDATED */, - lufiFile: lufiFile2 - }); - } - return lufiFile2; -}; -var sendFileError = (lufiFile2, error) => { - updateFile(lufiFile2, { uploadStatus: 2 /* FAILED */ }); - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); -}; -var init = () => { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - self.postMessage({ - event: "SOCKET_OPENED" /* SOCKET_OPENED */ - }); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, (error) => { - self.postMessage({ event: "OPERATION_FAILED" /* OPERATION_FAILED */, error }); - }); -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/encoding.js -var Encoding = class { - /** - * - * @param charset Charset to use for base64 encoding. This must be 64-characters long. - * @param noPadding If true, encoded strings won't include padding. - */ - constructor(charset, noPadding) { - if (!charset || charset.length != 64) { - throw Error("Charset must contain 64 characters"); - } - this._charset = charset; - this._noPadding = !!noPadding; - this._valid = new RegExp("^[" + this._charset.replace("-", "\\-") + "]+={0,2}$"); - } - /** - * Encode an ArrayBuffer to base64 in a string. - * @param ab Data to encode to base64 - * @returns Base64-encoded string - */ - Encode(ab) { - const len = ab.byteLength; - if (!len) { - return ""; - } - const view = new Uint8Array(ab); - let res = ""; - for (let i = 0; i < len; i += 3) { - res += this._charset[view[i] >> 2] + this._charset[(view[i] & 3) << 4 | view[i + 1] >> 4] + this._charset[(view[i + 1] & 15) << 2 | view[i + 2] >> 6] + this._charset[view[i + 2] & 63]; - } - if (len % 3 == 2) { - res = res.substring(0, res.length - 1); - if (!this._noPadding) { - res += "="; - } - } else if (len % 3 == 1) { - res = res.substring(0, res.length - 2); - if (!this._noPadding) { - res += "=="; - } - } - return res; - } - /** - * Decode a string from base64. Padding is always optional. - * @param str Base64-encoded string - * @returns Data decoded from the base64 string - */ - Decode(str) { - str = (str || "").replace(/[\s]/g, ""); - if (!str) { - return new ArrayBuffer(0); - } - if (!this._valid.test(str)) { - throw Error("Invalid base64 input sequence"); - } - let viewLen = Math.floor(str.length * 0.75); - if (str[str.length - 2] == "=") { - viewLen -= 2; - } else if (str[str.length - 1] == "=") { - viewLen--; - } - const view = new Uint8Array(viewLen); - let enc1, enc2, enc3, enc4, i = 0, j = 0; - while (i < str.length * 0.75) { - enc1 = this._charset.indexOf(str.charAt(j++)); - enc2 = this._charset.indexOf(str.charAt(j++)); - enc3 = this._charset.indexOf(str.charAt(j++)); - enc4 = this._charset.indexOf(str.charAt(j++)); - view[i++] = enc1 << 2 | enc2 >> 4; - view[i++] = (enc2 & 15) << 4 | enc3 >> 2; - view[i++] = (enc3 & 3) << 6 | enc4; - } - return view.buffer; - } -}; - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/standard.js -var obj = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -function Encode(ab) { - return obj.Encode(ab); -} -function Decode(str) { - return obj.Decode(str); -} - -// node_modules/.deno/arraybuffer-encoding@1.1.0/node_modules/arraybuffer-encoding/dist/esm/base64/url.js -var obj2 = new Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", true); -function Decode2(str) { - return obj2.Decode(str); -} - -// src/api/crypto/sjcl.ts -var import_lufi_sjcl = __toESM(require_sjcl()); - -// src/error/crypto/crypto-error.ts -var CryptoError = class extends BaseError { -}; - -// src/error/crypto/decryption-error.ts -var DecryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to decrypt the provided data"); - } -}; - -// src/error/crypto/encryption-error.ts -var EncryptionError = class extends CryptoError { - constructor() { - super(...arguments); - __publicField(this, "message", "Unable to encrypt the provided data"); - } -}; - -// src/api/crypto/sjcl.ts -var decrypt = (key, encryptedData) => { - try { - const data = typeof encryptedData === "string" ? encryptedData : new TextDecoder().decode(encryptedData.data); - return okAsync(Decode(import_lufi_sjcl.default.decrypt(key, data))); - } catch (error) { - return errAsync( - new DecryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; -var encrypt = (key, value) => { - try { - const encrypted = import_lufi_sjcl.default.encrypt(key, Encode(value)); - return okAsync({ - algo: 0 /* Sjcl */, - data: new TextEncoder().encode(encrypted).buffer, - iv: JSON.parse(encrypted).iv - }); - } catch (error) { - return errAsync( - new EncryptionError(void 0, { cause: ensureError(error) }) - ); - } -}; - -// src/api/crypto/web.ts -var decrypt2 = (key, encrypted) => { - return importKey(key).andThen( - (importedKey) => ResultAsync.fromPromise( - crypto.subtle.decrypt( - { - name: "AES-GCM", - iv: encrypted.iv - }, - importedKey, - encrypted.data - ), - (error) => new DecryptionError(void 0, { cause: ensureError(error) }) - ) - ); -}; -var encrypt2 = (key, value) => { - return importKey(key).andThen((importedKey) => { - const iv = crypto.getRandomValues(new Uint8Array(12)); - return ResultAsync.fromPromise( - crypto.subtle.encrypt( - { - name: "AES-GCM", - iv - }, - importedKey, - value - ), - (error) => new EncryptionError(void 0, { - cause: ensureError(error) - }) - ).andThen((encrypted) => { - return okAsync({ - algo: 1 /* WebCrypto */, - data: encrypted, - iv - }); - }); - }); -}; -var importKey = (key) => { - return ResultAsync.fromPromise( - crypto.subtle.importKey( - "raw", - Decode2(key), - { name: "AES-GCM" }, - false, - [ - "encrypt", - "decrypt" - ] - ), - (error) => new CryptoError("Unable to import cryptography key", { - cause: ensureError(error) - }) - ); -}; - -// src/api/crypto.ts -var decrypt3 = (key, value) => value.algo === void 0 || value.algo === 0 /* Sjcl */ ? decrypt(key, value) : decrypt2(key, value); -var encrypt3 = (key, value, algo) => algo === 0 /* Sjcl */ ? encrypt(key, value) : encrypt2(key, value); - -// src/api/websocket.ts -var sockets = {}; -var MAX_ERRORS = 5; -var onCancelMessage = (data) => { - events.emit("UPLOAD_CANCELLED" /* UPLOAD_CANCELLED */, data.success); - return okAsync(void 0); -}; -var onDownloadMessage = (response, lufiFile2) => { - const result = response.split("XXMOJOXX"); - const metadataString = result.shift(); - if (metadataString !== void 0) { - const metadata = JSON.parse(metadataString); - if (isServerDownloadChunkSuccessMetadata(metadata)) { - const dataString = result.shift(); - if (dataString) { - const encryptedData = JSON.parse(dataString); - if (encryptedData.iv) { - encryptedData.iv = new Uint8Array(Object.values(encryptedData.iv)); - encryptedData.data = Decode(encryptedData.data); - } - return decrypt3(lufiFile2.keys.client, encryptedData).andThen( - (decryptedPart) => { - const buffer = typeof decryptedPart === "string" ? new TextEncoder().encode(decryptedPart).buffer : decryptedPart; - if (metadata.part === 0) { - updateFile(lufiFile2, { - chunksReady: lufiFile2.chunksReady + 1, - delAtFirstView: metadata.del_at_first_view, - delay: metadata.delay, - name: metadata.name, - size: metadata.size, - totalChunks: metadata.total, - type: metadata.type, - zipped: metadata.zipped - }); - events.emit("DOWNLOAD_STARTED" /* DOWNLOAD_STARTED */); - } else { - updateFile(lufiFile2, { chunksReady: lufiFile2.chunksReady + 1 }); - } - events.emit("CHUNK_DOWNLOADED" /* CHUNK_DOWNLOADED */, buffer, metadata.part); - if (lufiFile2.chunksReady === metadata.total) { - return endDownload(lufiFile2).andThen(() => { - events.emit("DOWNLOAD_COMPLETE" /* DOWNLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - return okAsync(void 0); - }); - } - return okAsync(void 0); - } - ); - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError(metadata.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } - } else { - const error = new WebSocketError( - "Cannot retrieve metadata from data received by the server" - ); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onUploadMessage = (response, lufiFile2) => { - if (response.success) { - if (response.j === 0) { - updateFile(lufiFile2, { - keys: { client: lufiFile2.keys.client, server: response.short }, - actionToken: response.token, - queueIndex: response.i - }); - events.emit("UPLOAD_STARTED" /* UPLOAD_STARTED */); - } - updateFile(lufiFile2, { - chunksReady: lufiFile2.chunksReady + 1, - createdAt: response.created_at - }); - events.emit("CHUNK_UPLOADED" /* CHUNK_UPLOADED */); - if (lufiFile2.chunksReady === lufiFile2.totalChunks) { - updateFile(lufiFile2, { uploadStatus: 1 /* COMPLETE */ }); - events.emit("UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */); - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - } - return okAsync(void 0); - } else { - const error = new WebSocketError(response.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } -}; -var onMessage = (e, lufiFile2) => { - const data = tryParseJson(e.data); - let callback; - if (data) { - if (!data.action && data.msg) { - const error = new WebSocketError(data.msg); - events.emit("OPERATION_FAILED" /* OPERATION_FAILED */, error); - return errAsync(error); - } else { - if ("delay" in data) { - callback = onUploadMessage(data, lufiFile2); - } else { - callback = onCancelMessage(data); - } - } - } else { - callback = onDownloadMessage(e.data, lufiFile2); - } - return callback; -}; -var isConnecting = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.CONNECTING; -var isSpawned = (socketKey) => sockets !== void 0 && sockets[socketKey] !== void 0 && sockets[socketKey].readyState === WebSocket.OPEN; -var endDownload = (lufiFile2) => { - let message; - if (lufiFile2.password) { - message = { ended: true, file_pwd: lufiFile2.password }; - } else { - message = { ended: true }; - } - return sendMessage( - downloadSocketUrl(lufiFile2), - lufiFile2, - JSON.stringify(message) - ); -}; -var uploadChunk = (lufiFile2, metadata, encryptedData) => { - encryptedData.data = Encode(encryptedData.data); - return sendMessage( - uploadSocketUrl(lufiFile2), - lufiFile2, - `${JSON.stringify(metadata)}XXMOJOXX${JSON.stringify(encryptedData)}` - ); -}; -var sendMessage = (socketUrl, lufiFile2, message) => { - if (!isSpawned(socketUrl)) { - return spawn(socketUrl).andThen(() => { - sockets[socketUrl].onmessage = (e) => onMessage(e, lufiFile2); - return sendMessage(socketUrl, lufiFile2, message); - }); - } else { - sockets[socketUrl].send(message); - return okAsync(void 0); - } -}; -var spawn = (socketKey, errorCount = 0) => { - if (!isSpawned(socketKey) && !isConnecting(socketKey)) { - sockets[socketKey] = new WebSocket(socketKey); - events.once("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */, () => { - sockets[socketKey].close(); - }); - events.once("OPERATION_FAILED" /* OPERATION_FAILED */, () => { - events.emit("SOCKET_OPERATION_TERMINATED" /* SOCKET_OPERATION_TERMINATED */); - }); - sockets[socketKey].onopen = () => { - events.emit("SOCKET_OPENED" /* SOCKET_OPENED */); - }; - sockets[socketKey].onclose = () => { - }; - sockets[socketKey].onerror = (event) => { - if (++errorCount <= MAX_ERRORS) { - console.error( - `An error happened while trying to connect to WebSocket "${socketKey}". Trying again. ${errorCount} / ${MAX_ERRORS}`, - event.error - ); - return spawn(socketKey, errorCount); - } else { - events.emit("SOCKET_ONERROR" /* SOCKET_ONERROR */); - return errAsync( - new WebSocketConnectionError( - `Unable to connect to WebSocket ${socketKey}.` - ) - ); - } - }; - } - return waitForConnection(socketKey).andThen(() => okAsync(socketKey)).orElse((error) => errAsync(error)); -}; -var waitForConnection = (socketKey) => ResultAsync.fromPromise( - new Promise((resolve, reject) => { - if (!isSpawned(socketKey)) { - events.once("SOCKET_OPENED" /* SOCKET_OPENED */, () => { - resolve(void 0); - }); - events.on("SOCKET_ONERROR" /* SOCKET_ONERROR */, () => { - reject(new WebSocketConnectionError()); - }); - } else { - resolve(void 0); - } - }), - (error) => { - return ensureError(error); - } -); -var buildSocketUrl = (instanceUrl, pathname) => { - const url = new URL(instanceUrl); - if (!["ws:", "wss:"].includes(url.protocol)) { - url.protocol = url.protocol === "http:" ? "ws:" : "wss:"; - } - url.pathname += pathname; - return new URL(url.origin + url.pathname); -}; -var downloadSocketUrl = (lufiFile2) => { - return buildSocketUrl( - new URL(lufiFile2.serverUrl), - "download" /* DOWNLOAD */ + `/${lufiFile2.keys.server}` - ).toString(); -}; -var uploadSocketUrl = (lufiFile2) => { - return buildSocketUrl(new URL(lufiFile2.serverUrl), "upload" /* UPLOAD */).toString(); -}; -var tryParseJson = (data) => { - try { - const parsedObject = JSON.parse(data); - if (parsedObject && typeof parsedObject === "object") { - return parsedObject; - } - } catch (_e) { - } - return false; -}; -var isServerDownloadChunkSuccessMetadata = (message) => typeof message === "object" && message !== null && !("msg" in message); - -// src/api/lufi.ts -var import_events3 = __toESM(require_events()); - -// src/entities/lufi-job.ts -var import_events2 = __toESM(require_events()); - -// src/api/lufi.ts -var files = {}; -var events2 = new import_events3.default(); -var getFilesQueued = () => Object.values(files).filter( - (file) => file.uploadStatus === 4 /* QUEUED */ -); -var getFileIndexInQueue = (clientKey) => Object.keys(getFilesQueued()).indexOf(clientKey); - -// node_modules/.deno/eventemitter3@5.0.1/node_modules/eventemitter3/index.mjs -var import_index = __toESM(require_eventemitter3(), 1); - -// node_modules/.deno/p-timeout@6.1.3/node_modules/p-timeout/index.js -var TimeoutError = class extends Error { - constructor(message) { - super(message); - this.name = "TimeoutError"; - } -}; -var AbortError = class extends Error { - constructor(message) { - super(); - this.name = "AbortError"; - this.message = message; - } -}; -var getDOMException = (errorMessage) => globalThis.DOMException === void 0 ? new AbortError(errorMessage) : new DOMException(errorMessage); -var getAbortedReason = (signal) => { - const reason = signal.reason === void 0 ? getDOMException("This operation was aborted.") : signal.reason; - return reason instanceof Error ? reason : getDOMException(reason); -}; -function pTimeout(promise, options) { - const { - milliseconds, - fallback, - message, - customTimers = { setTimeout, clearTimeout } - } = options; - let timer; - const wrappedPromise = new Promise((resolve, reject) => { - if (typeof milliseconds !== "number" || Math.sign(milliseconds) !== 1) { - throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${milliseconds}\``); - } - if (options.signal) { - const { signal } = options; - if (signal.aborted) { - reject(getAbortedReason(signal)); - } - const abortHandler = () => { - reject(getAbortedReason(signal)); - }; - signal.addEventListener("abort", abortHandler, { once: true }); - promise.finally(() => { - signal.removeEventListener("abort", abortHandler); - }); - } - if (milliseconds === Number.POSITIVE_INFINITY) { - promise.then(resolve, reject); - return; - } - const timeoutError = new TimeoutError(); - timer = customTimers.setTimeout.call(void 0, () => { - if (fallback) { - try { - resolve(fallback()); - } catch (error) { - reject(error); - } - return; - } - if (typeof promise.cancel === "function") { - promise.cancel(); - } - if (message === false) { - resolve(); - } else if (message instanceof Error) { - reject(message); - } else { - timeoutError.message = message != null ? message : `Promise timed out after ${milliseconds} milliseconds`; - reject(timeoutError); - } - }, milliseconds); - (async () => { - try { - resolve(await promise); - } catch (error) { - reject(error); - } - })(); - }); - const cancelablePromise = wrappedPromise.finally(() => { - cancelablePromise.clear(); - }); - cancelablePromise.clear = () => { - customTimers.clearTimeout.call(void 0, timer); - timer = void 0; - }; - return cancelablePromise; -} - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/lower-bound.js -function lowerBound(array, value, comparator) { - let first = 0; - let count = array.length; - while (count > 0) { - const step = Math.trunc(count / 2); - let it = first + step; - if (comparator(array[it], value) <= 0) { - first = ++it; - count -= step + 1; - } else { - count = step; - } - } - return first; -} - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/priority-queue.js -var _queue; -var PriorityQueue = class { - constructor() { - __privateAdd(this, _queue, []); - } - enqueue(run, options) { - options = { - priority: 0, - ...options - }; - const element = { - priority: options.priority, - run - }; - if (this.size && __privateGet(this, _queue)[this.size - 1].priority >= options.priority) { - __privateGet(this, _queue).push(element); - return; - } - const index = lowerBound(__privateGet(this, _queue), element, (a, b) => b.priority - a.priority); - __privateGet(this, _queue).splice(index, 0, element); - } - dequeue() { - const item = __privateGet(this, _queue).shift(); - return item == null ? void 0 : item.run; - } - filter(options) { - return __privateGet(this, _queue).filter((element) => element.priority === options.priority).map((element) => element.run); - } - get size() { - return __privateGet(this, _queue).length; - } -}; -_queue = new WeakMap(); - -// node_modules/.deno/p-queue@8.0.1/node_modules/p-queue/dist/index.js -var _carryoverConcurrencyCount, _isIntervalIgnored, _intervalCount, _intervalCap, _interval, _intervalEnd, _intervalId, _timeoutId, _queue2, _queueClass, _pending, _concurrency, _isPaused, _throwOnTimeout, _PQueue_instances, doesIntervalAllowAnother_get, doesConcurrentAllowAnother_get, next_fn, onResumeInterval_fn, isIntervalPaused_get, tryToStartAnother_fn, initializeIntervalIfNeeded_fn, onInterval_fn, processQueue_fn, throwOnAbort_fn, onEvent_fn; -var PQueue = class extends import_index.default { - // TODO: The `throwOnTimeout` option should affect the return types of `add()` and `addAll()` - constructor(options) { - var _a, _b, _c, _d; - super(); - __privateAdd(this, _PQueue_instances); - __privateAdd(this, _carryoverConcurrencyCount); - __privateAdd(this, _isIntervalIgnored); - __privateAdd(this, _intervalCount, 0); - __privateAdd(this, _intervalCap); - __privateAdd(this, _interval); - __privateAdd(this, _intervalEnd, 0); - __privateAdd(this, _intervalId); - __privateAdd(this, _timeoutId); - __privateAdd(this, _queue2); - __privateAdd(this, _queueClass); - __privateAdd(this, _pending, 0); - // The `!` is needed because of https://github.com/microsoft/TypeScript/issues/32194 - __privateAdd(this, _concurrency); - __privateAdd(this, _isPaused); - __privateAdd(this, _throwOnTimeout); - /** - Per-operation timeout in milliseconds. Operations fulfill once `timeout` elapses if they haven't already. - - Applies to each future operation. - */ - __publicField(this, "timeout"); - options = { - carryoverConcurrencyCount: false, - intervalCap: Number.POSITIVE_INFINITY, - interval: 0, - concurrency: Number.POSITIVE_INFINITY, - autoStart: true, - queueClass: PriorityQueue, - ...options - }; - if (!(typeof options.intervalCap === "number" && options.intervalCap >= 1)) { - throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(_b = (_a = options.intervalCap) == null ? void 0 : _a.toString()) != null ? _b : ""}\` (${typeof options.intervalCap})`); - } - if (options.interval === void 0 || !(Number.isFinite(options.interval) && options.interval >= 0)) { - throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(_d = (_c = options.interval) == null ? void 0 : _c.toString()) != null ? _d : ""}\` (${typeof options.interval})`); - } - __privateSet(this, _carryoverConcurrencyCount, options.carryoverConcurrencyCount); - __privateSet(this, _isIntervalIgnored, options.intervalCap === Number.POSITIVE_INFINITY || options.interval === 0); - __privateSet(this, _intervalCap, options.intervalCap); - __privateSet(this, _interval, options.interval); - __privateSet(this, _queue2, new options.queueClass()); - __privateSet(this, _queueClass, options.queueClass); - this.concurrency = options.concurrency; - this.timeout = options.timeout; - __privateSet(this, _throwOnTimeout, options.throwOnTimeout === true); - __privateSet(this, _isPaused, options.autoStart === false); - } - get concurrency() { - return __privateGet(this, _concurrency); - } - set concurrency(newConcurrency) { - if (!(typeof newConcurrency === "number" && newConcurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${newConcurrency}\` (${typeof newConcurrency})`); - } - __privateSet(this, _concurrency, newConcurrency); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); - } - async add(function_, options = {}) { - options = { - timeout: this.timeout, - throwOnTimeout: __privateGet(this, _throwOnTimeout), - ...options - }; - return new Promise((resolve, reject) => { - __privateGet(this, _queue2).enqueue(async () => { - var _a; - __privateWrapper(this, _pending)._++; - __privateWrapper(this, _intervalCount)._++; - try { - (_a = options.signal) == null ? void 0 : _a.throwIfAborted(); - let operation = function_({ signal: options.signal }); - if (options.timeout) { - operation = pTimeout(Promise.resolve(operation), { milliseconds: options.timeout }); - } - if (options.signal) { - operation = Promise.race([operation, __privateMethod(this, _PQueue_instances, throwOnAbort_fn).call(this, options.signal)]); - } - const result = await operation; - resolve(result); - this.emit("completed", result); - } catch (error) { - if (error instanceof TimeoutError && !options.throwOnTimeout) { - resolve(); - return; - } - reject(error); - this.emit("error", error); - } finally { - __privateMethod(this, _PQueue_instances, next_fn).call(this); - } - }, options); - this.emit("add"); - __privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this); - }); - } - async addAll(functions, options) { - return Promise.all(functions.map(async (function_) => this.add(function_, options))); - } - /** - Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.) - */ - start() { - if (!__privateGet(this, _isPaused)) { - return this; - } - __privateSet(this, _isPaused, false); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); - return this; - } - /** - Put queue execution on hold. - */ - pause() { - __privateSet(this, _isPaused, true); - } - /** - Clear the queue. - */ - clear() { - __privateSet(this, _queue2, new (__privateGet(this, _queueClass))()); - } - /** - Can be called multiple times. Useful if you for example add additional items at a later time. - - @returns A promise that settles when the queue becomes empty. - */ - async onEmpty() { - if (__privateGet(this, _queue2).size === 0) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "empty"); - } - /** - @returns A promise that settles when the queue size is less than the given limit: `queue.size < limit`. - - If you want to avoid having the queue grow beyond a certain size you can `await queue.onSizeLessThan()` before adding a new item. - - Note that this only limits the number of items waiting to start. There could still be up to `concurrency` jobs already running that this call does not include in its calculation. - */ - async onSizeLessThan(limit) { - if (__privateGet(this, _queue2).size < limit) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "next", () => __privateGet(this, _queue2).size < limit); - } - /** - The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet. - - @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`. - */ - async onIdle() { - if (__privateGet(this, _pending) === 0 && __privateGet(this, _queue2).size === 0) { - return; - } - await __privateMethod(this, _PQueue_instances, onEvent_fn).call(this, "idle"); - } - /** - Size of the queue, the number of queued items waiting to run. - */ - get size() { - return __privateGet(this, _queue2).size; - } - /** - Size of the queue, filtered by the given options. - - For example, this can be used to find the number of items remaining in the queue with a specific priority level. - */ - sizeBy(options) { - return __privateGet(this, _queue2).filter(options).length; - } - /** - Number of running items (no longer in the queue). - */ - get pending() { - return __privateGet(this, _pending); - } - /** - Whether the queue is currently paused. - */ - get isPaused() { - return __privateGet(this, _isPaused); - } -}; -_carryoverConcurrencyCount = new WeakMap(); -_isIntervalIgnored = new WeakMap(); -_intervalCount = new WeakMap(); -_intervalCap = new WeakMap(); -_interval = new WeakMap(); -_intervalEnd = new WeakMap(); -_intervalId = new WeakMap(); -_timeoutId = new WeakMap(); -_queue2 = new WeakMap(); -_queueClass = new WeakMap(); -_pending = new WeakMap(); -_concurrency = new WeakMap(); -_isPaused = new WeakMap(); -_throwOnTimeout = new WeakMap(); -_PQueue_instances = new WeakSet(); -doesIntervalAllowAnother_get = function() { - return __privateGet(this, _isIntervalIgnored) || __privateGet(this, _intervalCount) < __privateGet(this, _intervalCap); -}; -doesConcurrentAllowAnother_get = function() { - return __privateGet(this, _pending) < __privateGet(this, _concurrency); -}; -next_fn = function() { - __privateWrapper(this, _pending)._--; - __privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this); - this.emit("next"); -}; -onResumeInterval_fn = function() { - __privateMethod(this, _PQueue_instances, onInterval_fn).call(this); - __privateMethod(this, _PQueue_instances, initializeIntervalIfNeeded_fn).call(this); - __privateSet(this, _timeoutId, void 0); -}; -isIntervalPaused_get = function() { - const now = Date.now(); - if (__privateGet(this, _intervalId) === void 0) { - const delay = __privateGet(this, _intervalEnd) - now; - if (delay < 0) { - __privateSet(this, _intervalCount, __privateGet(this, _carryoverConcurrencyCount) ? __privateGet(this, _pending) : 0); - } else { - if (__privateGet(this, _timeoutId) === void 0) { - __privateSet(this, _timeoutId, setTimeout(() => { - __privateMethod(this, _PQueue_instances, onResumeInterval_fn).call(this); - }, delay)); - } - return true; - } - } - return false; -}; -tryToStartAnother_fn = function() { - if (__privateGet(this, _queue2).size === 0) { - if (__privateGet(this, _intervalId)) { - clearInterval(__privateGet(this, _intervalId)); - } - __privateSet(this, _intervalId, void 0); - this.emit("empty"); - if (__privateGet(this, _pending) === 0) { - this.emit("idle"); - } - return false; - } - if (!__privateGet(this, _isPaused)) { - const canInitializeInterval = !__privateGet(this, _PQueue_instances, isIntervalPaused_get); - if (__privateGet(this, _PQueue_instances, doesIntervalAllowAnother_get) && __privateGet(this, _PQueue_instances, doesConcurrentAllowAnother_get)) { - const job = __privateGet(this, _queue2).dequeue(); - if (!job) { - return false; - } - this.emit("active"); - job(); - if (canInitializeInterval) { - __privateMethod(this, _PQueue_instances, initializeIntervalIfNeeded_fn).call(this); - } - return true; - } - } - return false; -}; -initializeIntervalIfNeeded_fn = function() { - if (__privateGet(this, _isIntervalIgnored) || __privateGet(this, _intervalId) !== void 0) { - return; - } - __privateSet(this, _intervalId, setInterval(() => { - __privateMethod(this, _PQueue_instances, onInterval_fn).call(this); - }, __privateGet(this, _interval))); - __privateSet(this, _intervalEnd, Date.now() + __privateGet(this, _interval)); -}; -onInterval_fn = function() { - if (__privateGet(this, _intervalCount) === 0 && __privateGet(this, _pending) === 0 && __privateGet(this, _intervalId)) { - clearInterval(__privateGet(this, _intervalId)); - __privateSet(this, _intervalId, void 0); - } - __privateSet(this, _intervalCount, __privateGet(this, _carryoverConcurrencyCount) ? __privateGet(this, _pending) : 0); - __privateMethod(this, _PQueue_instances, processQueue_fn).call(this); -}; -/** -Executes all queued functions until it reaches the limit. -*/ -processQueue_fn = function() { - while (__privateMethod(this, _PQueue_instances, tryToStartAnother_fn).call(this)) { - } -}; -throwOnAbort_fn = async function(signal) { - return new Promise((_resolve, reject) => { - signal.addEventListener("abort", () => { - reject(signal.reason); - }, { once: true }); - }); -}; -onEvent_fn = async function(event, filter) { - return new Promise((resolve) => { - const listener = () => { - if (filter && !filter()) { - return; - } - this.off(event, listener); - resolve(); - }; - this.on(event, listener); - }); -}; - -// src/error/worker/worker-error.ts -var WorkerError = class extends BaseError { -}; - -// src/error/worker/worker-undefined-parameter-error.ts -var WorkerUndefinedParameterError = class extends WorkerError { - constructor() { - super(...arguments); - __publicField(this, "message", "Parameter must be defined"); - } -}; - -// src/worker/upload.ts -var isInitialized = false; -var QUEUE_CONCURRENCY_LIMIT = navigator.hardwareConcurrency || 1; -var queue = new PQueue({ - concurrency: QUEUE_CONCURRENCY_LIMIT, - autoStart: false -}); -var itemsInQueue = 0; -var isPaused = false; -var lufiFile; -var encryptJob = new Worker(workerUrl("encrypt"), { type: "module" }); -self.onmessage = (event) => { - if (!isInitialized) { - init(); - isInitialized = true; - lufiFile = event.data.args.lufiFile; - events.once("UPLOAD_STARTED" /* UPLOAD_STARTED */, () => { - self.postMessage({ event: "UPLOAD_STARTED" /* UPLOAD_STARTED */ }); - }); - events.on("CHUNK_UPLOADED" /* CHUNK_UPLOADED */, () => { - self.postMessage({ event: "CHUNK_UPLOADED" /* CHUNK_UPLOADED */ }); - itemsInQueue--; - if (queue.isPaused && !isPaused && itemsInQueue < QUEUE_CONCURRENCY_LIMIT) { - resumeQueue(); - } - }); - events.once("UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */, () => { - self.postMessage({ - event: "UPLOAD_COMPLETE" /* UPLOAD_COMPLETE */ - }); - }); - events.on("FILE_UPDATED" /* FILE_UPDATED */, updateFile); - } - if (event.data.args.chunk) { - event.data.args.lufiFile = lufiFile; - return startUpload( - event.data, - getFileIndexInQueue(lufiFile.keys.client) - ).mapErr((error) => { - sendFileError(lufiFile, error); - }); - } else { - if (event.data.action === 0 /* PAUSE */) { - isPaused = true; - pauseQueue(); - } else if (event.data.action === 2 /* RESUME */) { - isPaused = false; - resumeQueue(); - } else { - sendFileError(lufiFile, new WorkerUndefinedParameterError()); - } - } -}; -var startUpload = (workerMessage, serverQueueIndex) => { - const { lufiFile: lufiFile2, algo } = workerMessage.args; - if (workerMessage.args.chunk !== void 0 && algo !== void 0) { - if (workerMessage.args.chunk.index === 0) { - encrypt3(lufiFile2.keys.client, workerMessage.args.chunk.buffer, algo).map( - (encryptedData) => { - uploadChunk( - lufiFile2, - { - total: lufiFile2.totalChunks, - part: 0, - size: lufiFile2.size, - name: lufiFile2.name, - type: lufiFile2.type, - delay: lufiFile2.delay, - del_at_first_view: lufiFile2.delAtFirstView, - zipped: lufiFile2.zipped, - id: null, - i: serverQueueIndex, - file_pwd: lufiFile2.password - }, - encryptedData - ); - itemsInQueue++; - } - ); - } else { - queue.add(() => { - if (workerMessage.args.chunk) { - const waitForEncryption = () => { - itemsInQueue++; - return new Promise((resolve) => { - encryptJob.onmessage = (event) => { - resolve(uploadChunk( - lufiFile2, - { - total: lufiFile2.totalChunks, - part: event.data.chunkIndex, - size: lufiFile2.size, - name: lufiFile2.name, - type: lufiFile2.type, - delay: lufiFile2.delay, - del_at_first_view: lufiFile2.delAtFirstView, - zipped: lufiFile2.zipped, - id: lufiFile2.keys.server, - i: serverQueueIndex, - file_pwd: lufiFile2.password - }, - event.data.encryptedData - )); - }; - }); - }; - encryptJob.postMessage(workerMessage, [ - workerMessage.args.chunk.buffer - ]); - if (!queue.isPaused && (isPaused || itemsInQueue === QUEUE_CONCURRENCY_LIMIT)) { - pauseQueue(); - } - waitForEncryption(); - } - }); - } - } else { - return errAsync( - new WorkerUndefinedParameterError() - ); - } - return okAsync(void 0); -}; -var pauseQueue = () => { - queue.pause(); - self.postMessage({ event: "JOB_PAUSED" /* JOB_PAUSED */ }); -}; -var resumeQueue = () => { - queue.start(); - self.postMessage({ event: "JOB_RESUMED" /* JOB_RESUMED */ }); -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50c0AzLjMuMC9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbHVmaS1zamNsQDEuMC44L25vZGVfbW9kdWxlcy9sdWZpLXNqY2wvc2pjbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vZXZlbnRlbWl0dGVyM0A1LjAuMS9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vbmV2ZXJ0aHJvd0A4LjEuMS9ub2RlX21vZHVsZXMvbmV2ZXJ0aHJvdy9kaXN0L2luZGV4LmVzLmpzIiwgIi4uLy4uL3NyYy9lcnJvci9iYXNlLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWNvbm5lY3Rpb24tZXJyb3IudHMiLCAiLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvc2hhcmVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9hcnJheWJ1ZmZlci1lbmNvZGluZ0AxLjEuMC9ub2RlX21vZHVsZXMvYXJyYXlidWZmZXItZW5jb2Rpbmcvc3JjL2Jhc2U2NC9lbmNvZGluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vYXJyYXlidWZmZXItZW5jb2RpbmdAMS4xLjAvbm9kZV9tb2R1bGVzL2FycmF5YnVmZmVyLWVuY29kaW5nL3NyYy9iYXNlNjQvc3RhbmRhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2FycmF5YnVmZmVyLWVuY29kaW5nQDEuMS4wL25vZGVfbW9kdWxlcy9hcnJheWJ1ZmZlci1lbmNvZGluZy9zcmMvYmFzZTY0L3VybC50cyIsICIuLi8uLi9zcmMvYXBpL2NyeXB0by9zamNsLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzIiwgIi4uLy4uL3NyYy9lcnJvci9jcnlwdG8vZGVjcnlwdGlvbi1lcnJvci50cyIsICIuLi8uLi9zcmMvZXJyb3IvY3J5cHRvL2VuY3J5cHRpb24tZXJyb3IudHMiLCAiLi4vLi4vc3JjL2FwaS9jcnlwdG8vd2ViLnRzIiwgIi4uLy4uL3NyYy9hcGkvY3J5cHRvLnRzIiwgIi4uLy4uL3NyYy9hcGkvd2Vic29ja2V0LnRzIiwgIi4uLy4uL3NyYy9hcGkvbHVmaS50cyIsICIuLi8uLi9zcmMvZW50aXRpZXMvbHVmaS1qb2IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL2V2ZW50ZW1pdHRlcjNANS4wLjEvbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9wLXRpbWVvdXRANi4xLjMvbm9kZV9tb2R1bGVzL3AtdGltZW91dC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLmRlbm8vcC1xdWV1ZUA4LjAuMS9ub2RlX21vZHVsZXMvcC1xdWV1ZS9kaXN0L2xvd2VyLWJvdW5kLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8uZGVuby9wLXF1ZXVlQDguMC4xL25vZGVfbW9kdWxlcy9wLXF1ZXVlL2Rpc3QvcHJpb3JpdHktcXVldWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5kZW5vL3AtcXVldWVAOC4wLjEvbm9kZV9tb2R1bGVzL3AtcXVldWUvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50cyIsICIuLi8uLi9zcmMvZXJyb3Ivd29ya2VyL3dvcmtlci11bmRlZmluZWQtcGFyYW1ldGVyLWVycm9yLnRzIiwgIi4uLy4uL3NyYy93b3JrZXIvdXBsb2FkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO3ZhciBzamNsPXtjaXBoZXI6e30saGFzaDp7fSxrZXlleGNoYW5nZTp7fSxtb2RlOnt9LG1pc2M6e30sY29kZWM6e30sZXhjZXB0aW9uOntjb3JydXB0OmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkNPUlJVUFQ6IFwiK3RoaXMubWVzc2FnZX07dGhpcy5tZXNzYWdlPWF9LGludmFsaWQ6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiSU5WQUxJRDogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0sYnVnOmZ1bmN0aW9uKGEpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkJVRzogXCIrdGhpcy5tZXNzYWdlfTt0aGlzLm1lc3NhZ2U9YX0sbm90UmVhZHk6ZnVuY3Rpb24oYSl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiTk9UIFJFQURZOiBcIit0aGlzLm1lc3NhZ2V9O3RoaXMubWVzc2FnZT1hfX19O1xuc2pjbC5jaXBoZXIuYWVzPWZ1bmN0aW9uKGEpe3RoaXMud1swXVswXVswXXx8dGhpcy5DKCk7dmFyIGIsYyxkLGUsZj10aGlzLndbMF1bNF0sZz10aGlzLndbMV07Yj1hLmxlbmd0aDt2YXIgaD0xO2lmKDQhPT1iJiY2IT09YiYmOCE9PWIpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZhbGlkIGFlcyBrZXkgc2l6ZVwiKTt0aGlzLmI9W2Q9YS5zbGljZSgwKSxlPVtdXTtmb3IoYT1iO2E8NCpiKzI4O2ErKyl7Yz1kW2EtMV07aWYoMD09PWElYnx8OD09PWImJjQ9PT1hJWIpYz1mW2M+Pj4yNF08PDI0XmZbYz4+MTYmMjU1XTw8MTZeZltjPj44JjI1NV08PDheZltjJjI1NV0sMD09PWElYiYmKGM9Yzw8OF5jPj4+MjReaDw8MjQsaD1oPDwxXjI4MyooaD4+NykpO2RbYV09ZFthLWJdXmN9Zm9yKGI9MDthO2IrKyxhLS0pYz1kW2ImMz9hOmEtNF0sZVtiXT00Pj1hfHw0PmI/YzpnWzBdW2ZbYz4+PjI0XV1eZ1sxXVtmW2M+PjE2JjI1NV1dXmdbMl1bZltjPj44JjI1NV1dXmdbM11bZltjJlxuMjU1XV19O1xuc2pjbC5jaXBoZXIuYWVzLnByb3RvdHlwZT17ZW5jcnlwdDpmdW5jdGlvbihhKXtyZXR1cm4gYWEodGhpcyxhLDApfSxkZWNyeXB0OmZ1bmN0aW9uKGEpe3JldHVybiBhYSh0aGlzLGEsMSl9LHc6W1tbXSxbXSxbXSxbXSxbXV0sW1tdLFtdLFtdLFtdLFtdXV0sQzpmdW5jdGlvbigpe3ZhciBhPXRoaXMud1swXSxiPXRoaXMud1sxXSxjPWFbNF0sZD1iWzRdLGUsZixnLGg9W10saz1bXSxuLGwsbSxwO2ZvcihlPTA7MHgxMDA+ZTtlKyspa1soaFtlXT1lPDwxXjI4MyooZT4+NykpXmVdPWU7Zm9yKGY9Zz0wOyFjW2ZdO2ZePW58fDEsZz1rW2ddfHwxKWZvcihtPWdeZzw8MV5nPDwyXmc8PDNeZzw8NCxtPW0+PjhebSYyNTVeOTksY1tmXT1tLGRbbV09ZixsPWhbZT1oW249aFtmXV1dLHA9MHgxMDEwMTAxKmxeMHgxMDAwMSplXjB4MTAxKm5eMHgxMDEwMTAwKmYsbD0weDEwMSpoW21dXjB4MTAxMDEwMCptLGU9MDs0PmU7ZSsrKWFbZV1bZl09bD1sPDwyNF5sPj4+OCxiW2VdW21dPXA9cDw8MjRecD4+Pjg7Zm9yKGU9XG4wOzU+ZTtlKyspYVtlXT1hW2VdLnNsaWNlKDApLGJbZV09YltlXS5zbGljZSgwKX19O1xuZnVuY3Rpb24gYWEoYSxiLGMpe2lmKDQhPT1iLmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGJsb2NrIHNpemVcIik7dmFyIGQ9YS5iW2NdLGU9YlswXV5kWzBdLGY9YltjPzM6MV1eZFsxXSxnPWJbMl1eZFsyXTtiPWJbYz8xOjNdXmRbM107dmFyIGgsayxuLGw9ZC5sZW5ndGgvNC0yLG0scD00LHo9WzAsMCwwLDBdO2g9YS53W2NdO2E9aFswXTt2YXIgQT1oWzFdLEM9aFsyXSxCPWhbM10sRD1oWzRdO2ZvcihtPTA7bTxsO20rKyloPWFbZT4+PjI0XV5BW2Y+PjE2JjI1NV1eQ1tnPj44JjI1NV1eQltiJjI1NV1eZFtwXSxrPWFbZj4+PjI0XV5BW2c+PjE2JjI1NV1eQ1tiPj44JjI1NV1eQltlJjI1NV1eZFtwKzFdLG49YVtnPj4+MjRdXkFbYj4+MTYmMjU1XV5DW2U+PjgmMjU1XV5CW2YmMjU1XV5kW3ArMl0sYj1hW2I+Pj4yNF1eQVtlPj4xNiYyNTVdXkNbZj4+OCYyNTVdXkJbZyYyNTVdXmRbcCszXSxwKz00LGU9aCxmPWssZz1uO2ZvcihtPVxuMDs0Pm07bSsrKXpbYz8zJi1tOm1dPURbZT4+PjI0XTw8MjReRFtmPj4xNiYyNTVdPDwxNl5EW2c+PjgmMjU1XTw8OF5EW2ImMjU1XV5kW3ArK10saD1lLGU9ZixmPWcsZz1iLGI9aDtyZXR1cm4gen1cbnNqY2wuYml0QXJyYXk9e2JpdFNsaWNlOmZ1bmN0aW9uKGEsYixjKXthPXNqY2wuYml0QXJyYXkuWShhLnNsaWNlKGIvMzIpLDMyLShiJjMxKSkuc2xpY2UoMSk7cmV0dXJuIHZvaWQgMD09PWM/YTpzamNsLmJpdEFycmF5LmNsYW1wKGEsYy1iKX0sZXh0cmFjdDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TWF0aC5mbG9vcigtYi1jJjMxKTtyZXR1cm4oKGIrYy0xXmIpJi0zMj9hW2IvMzJ8MF08PDMyLWReYVtiLzMyKzF8MF0+Pj5kOmFbYi8zMnwwXT4+PmQpJigxPDxjKS0xfSxjb25jYXQ6ZnVuY3Rpb24oYSxiKXtpZigwPT09YS5sZW5ndGh8fDA9PT1iLmxlbmd0aClyZXR1cm4gYS5jb25jYXQoYik7dmFyIGM9YVthLmxlbmd0aC0xXSxkPXNqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChjKTtyZXR1cm4gMzI9PT1kP2EuY29uY2F0KGIpOnNqY2wuYml0QXJyYXkuWShiLGQsY3wwLGEuc2xpY2UoMCxhLmxlbmd0aC0xKSl9LGJpdExlbmd0aDpmdW5jdGlvbihhKXt2YXIgYj1hLmxlbmd0aDtyZXR1cm4gMD09PVxuYj8wOjMyKihiLTEpK3NqY2wuYml0QXJyYXkuZ2V0UGFydGlhbChhW2ItMV0pfSxjbGFtcDpmdW5jdGlvbihhLGIpe2lmKDMyKmEubGVuZ3RoPGIpcmV0dXJuIGE7YT1hLnNsaWNlKDAsTWF0aC5jZWlsKGIvMzIpKTt2YXIgYz1hLmxlbmd0aDtiPWImMzE7MDxjJiZiJiYoYVtjLTFdPXNqY2wuYml0QXJyYXkucGFydGlhbChiLGFbYy0xXSYyMTQ3NDgzNjQ4Pj5iLTEsMSkpO3JldHVybiBhfSxwYXJ0aWFsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMzI9PT1hP2I6KGM/YnwwOmI8PDMyLWEpKzB4MTAwMDAwMDAwMDAqYX0sZ2V0UGFydGlhbDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChhLzB4MTAwMDAwMDAwMDApfHwzMn0sZXF1YWw6ZnVuY3Rpb24oYSxiKXtpZihzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKSE9PXNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGIpKXJldHVybiExO3ZhciBjPTAsZDtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWN8PWFbZF1eYltkXTtyZXR1cm4gMD09PVxuY30sWTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtlPTA7Zm9yKHZvaWQgMD09PWQmJihkPVtdKTszMjw9YjtiLT0zMilkLnB1c2goYyksYz0wO2lmKDA9PT1iKXJldHVybiBkLmNvbmNhdChhKTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWQucHVzaChjfGFbZV0+Pj5iKSxjPWFbZV08PDMyLWI7ZT1hLmxlbmd0aD9hW2EubGVuZ3RoLTFdOjA7YT1zamNsLmJpdEFycmF5LmdldFBhcnRpYWwoZSk7ZC5wdXNoKHNqY2wuYml0QXJyYXkucGFydGlhbChiK2EmMzEsMzI8YithP2M6ZC5wb3AoKSwxKSk7cmV0dXJuIGR9LFA6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYVswXV5iWzBdLGFbMV1eYlsxXSxhWzJdXmJbMl0sYVszXV5iWzNdXX0sYnl0ZXN3YXBNOmZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtiPGEubGVuZ3RoOysrYiljPWFbYl0sYVtiXT1jPj4+MjR8Yz4+PjgmMHhmZjAwfChjJjB4ZmYwMCk8PDh8Yzw8MjQ7cmV0dXJuIGF9fTtcbnNqY2wuY29kZWMudXRmOFN0cmluZz17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7dmFyIGI9XCJcIixjPXNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGEpLGQsZTtmb3IoZD0wO2Q8Yy84O2QrKykwPT09KGQmMykmJihlPWFbZC80XSksYis9U3RyaW5nLmZyb21DaGFyQ29kZShlPj4+OD4+Pjg+Pj44KSxlPDw9ODtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShiKSl9LHRvQml0czpmdW5jdGlvbihhKXthPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhKSk7dmFyIGI9W10sYyxkPTA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkPWQ8PDh8YS5jaGFyQ29kZUF0KGMpLDM9PT0oYyYzKSYmKGIucHVzaChkKSxkPTApO2MmMyYmYi5wdXNoKHNqY2wuYml0QXJyYXkucGFydGlhbCg4KihjJjMpLGQpKTtyZXR1cm4gYn19O1xuc2pjbC5jb2RlYy5oZXg9e2Zyb21CaXRzOmZ1bmN0aW9uKGEpe3ZhciBiPVwiXCIsYztmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIrPSgoYVtjXXwwKSsweGYwMDAwMDAwMDAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cig0KTtyZXR1cm4gYi5zdWJzdHIoMCxzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKS80KX0sdG9CaXRzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZDthPWEucmVwbGFjZSgvXFxzfDB4L2csXCJcIik7ZD1hLmxlbmd0aDthPWErXCIwMDAwMDAwMFwiO2ZvcihiPTA7YjxhLmxlbmd0aDtiKz04KWMucHVzaChwYXJzZUludChhLnN1YnN0cihiLDgpLDE2KV4wKTtyZXR1cm4gc2pjbC5iaXRBcnJheS5jbGFtcChjLDQqZCl9fTtcbnNqY2wuY29kZWMuYmFzZTY0PXtTOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLGZyb21CaXRzOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1cIlwiLGU9MCxmPXNqY2wuY29kZWMuYmFzZTY0LlMsZz0wLGg9c2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSk7YyYmKGY9Zi5zdWJzdHIoMCw2MikrXCItX1wiKTtmb3IoYz0wOzYqZC5sZW5ndGg8aDspZCs9Zi5jaGFyQXQoKGdeYVtjXT4+PmUpPj4+MjYpLDY+ZT8oZz1hW2NdPDw2LWUsZSs9MjYsYysrKTooZzw8PTYsZS09Nik7Zm9yKDtkLmxlbmd0aCYzJiYhYjspZCs9XCI9XCI7cmV0dXJuIGR9LHRvQml0czpmdW5jdGlvbihhLGIpe2E9YS5yZXBsYWNlKC9cXHN8PS9nLFwiXCIpO3ZhciBjPVtdLGQsZT0wLGY9c2pjbC5jb2RlYy5iYXNlNjQuUyxnPTAsaDtiJiYoZj1mLnN1YnN0cigwLDYyKStcIi1fXCIpO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspe2g9Zi5pbmRleE9mKGEuY2hhckF0KGQpKTtcbmlmKDA+aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcInRoaXMgaXNuJ3QgYmFzZTY0IVwiKTsyNjxlPyhlLT0yNixjLnB1c2goZ15oPj4+ZSksZz1oPDwzMi1lKTooZSs9NixnXj1oPDwzMi1lKX1lJjU2JiZjLnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKGUmNTYsZywxKSk7cmV0dXJuIGN9fTtzamNsLmNvZGVjLmJhc2U2NHVybD17ZnJvbUJpdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHNqY2wuY29kZWMuYmFzZTY0LmZyb21CaXRzKGEsMSwxKX0sdG9CaXRzOmZ1bmN0aW9uKGEpe3JldHVybiBzamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYSwxKX19O3NqY2wuaGFzaC5zaGEyNTY9ZnVuY3Rpb24oYSl7dGhpcy5iWzBdfHx0aGlzLkMoKTthPyh0aGlzLmc9YS5nLnNsaWNlKDApLHRoaXMuZj1hLmYuc2xpY2UoMCksdGhpcy5jPWEuYyk6dGhpcy5yZXNldCgpfTtzamNsLmhhc2guc2hhMjU2Lmhhc2g9ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyBzamNsLmhhc2guc2hhMjU2KS51cGRhdGUoYSkuZmluYWxpemUoKX07XG5zamNsLmhhc2guc2hhMjU2LnByb3RvdHlwZT17YmxvY2tTaXplOjUxMixyZXNldDpmdW5jdGlvbigpe3RoaXMuZz10aGlzLm8uc2xpY2UoMCk7dGhpcy5mPVtdO3RoaXMuYz0wO3JldHVybiB0aGlzfSx1cGRhdGU6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYoYT1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGEpKTt2YXIgYixjPXRoaXMuZj1zamNsLmJpdEFycmF5LmNvbmNhdCh0aGlzLmYsYSk7Yj10aGlzLmM7YT10aGlzLmM9YitzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtpZigweDFmZmZmZmZmZmZmZmZmPGEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0c1wiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt2YXIgZD1uZXcgVWludDMyQXJyYXkoYyksZT0wO2ZvcihiPTUxMitiLSg1MTIrYiYweDFmZik7Yjw9YTtiKz01MTIpdGhpcy5sKGQuc3ViYXJyYXkoMTYqZSxcbjE2KihlKzEpKSksZSs9MTtjLnNwbGljZSgwLDE2KmUpfWVsc2UgZm9yKGI9NTEyK2ItKDUxMitiJjB4MWZmKTtiPD1hO2IrPTUxMil0aGlzLmwoYy5zcGxpY2UoMCwxNikpO3JldHVybiB0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5mLGM9dGhpcy5nLGI9c2pjbC5iaXRBcnJheS5jb25jYXQoYixbc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDEsMSldKTtmb3IoYT1iLmxlbmd0aCsyO2EmMTU7YSsrKWIucHVzaCgwKTtiLnB1c2goTWF0aC5mbG9vcih0aGlzLmMvMHgxMDAwMDAwMDApKTtmb3IoYi5wdXNoKHRoaXMuY3wwKTtiLmxlbmd0aDspdGhpcy5sKGIuc3BsaWNlKDAsMTYpKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGN9LG86W10sYjpbXSxDOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gMHgxMDAwMDAwMDAqKGEtTWF0aC5mbG9vcihhKSl8MH1mb3IodmFyIGI9MCxjPTIsZCxlOzY0PmI7YysrKXtlPSEwO2ZvcihkPTI7ZCpkPD1jO2QrKylpZigwPT09YyVkKXtlPVxuITE7YnJlYWt9ZSYmKDg+YiYmKHRoaXMub1tiXT1hKE1hdGgucG93KGMsLjUpKSksdGhpcy5iW2JdPWEoTWF0aC5wb3coYywxLzMpKSxiKyspfX0sbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzLmcsZj10aGlzLmIsZz1lWzBdLGg9ZVsxXSxrPWVbMl0sbj1lWzNdLGw9ZVs0XSxtPWVbNV0scD1lWzZdLHo9ZVs3XTtmb3IoYj0wOzY0PmI7YisrKTE2PmI/Yz1hW2JdOihjPWFbYisxJjE1XSxkPWFbYisxNCYxNV0sYz1hW2ImMTVdPShjPj4+N15jPj4+MTheYz4+PjNeYzw8MjVeYzw8MTQpKyhkPj4+MTdeZD4+PjE5XmQ+Pj4xMF5kPDwxNV5kPDwxMykrYVtiJjE1XSthW2IrOSYxNV18MCksYz1jK3orKGw+Pj42Xmw+Pj4xMV5sPj4+MjVebDw8MjZebDw8MjFebDw8NykrKHBebCYobV5wKSkrZltiXSx6PXAscD1tLG09bCxsPW4rY3wwLG49ayxrPWgsaD1nLGc9YysoaCZrXm4mKGheaykpKyhoPj4+Ml5oPj4+MTNeaD4+PjIyXmg8PDMwXmg8PDE5Xmg8PDEwKXwwO2VbMF09ZVswXStnfFxuMDtlWzFdPWVbMV0raHwwO2VbMl09ZVsyXStrfDA7ZVszXT1lWzNdK258MDtlWzRdPWVbNF0rbHwwO2VbNV09ZVs1XSttfDA7ZVs2XT1lWzZdK3B8MDtlWzddPWVbN10renwwfX07c2pjbC5oYXNoLnNoYTUxMj1mdW5jdGlvbihhKXt0aGlzLmJbMF18fHRoaXMuQygpO2E/KHRoaXMuZz1hLmcuc2xpY2UoMCksdGhpcy5mPWEuZi5zbGljZSgwKSx0aGlzLmM9YS5jKTp0aGlzLnJlc2V0KCl9O3NqY2wuaGFzaC5zaGE1MTIuaGFzaD1mdW5jdGlvbihhKXtyZXR1cm4obmV3IHNqY2wuaGFzaC5zaGE1MTIpLnVwZGF0ZShhKS5maW5hbGl6ZSgpfTtcbnNqY2wuaGFzaC5zaGE1MTIucHJvdG90eXBlPXtibG9ja1NpemU6MTAyNCxyZXNldDpmdW5jdGlvbigpe3RoaXMuZz10aGlzLm8uc2xpY2UoMCk7dGhpcy5mPVtdO3RoaXMuYz0wO3JldHVybiB0aGlzfSx1cGRhdGU6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09PXR5cGVvZiBhJiYoYT1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGEpKTt2YXIgYixjPXRoaXMuZj1zamNsLmJpdEFycmF5LmNvbmNhdCh0aGlzLmYsYSk7Yj10aGlzLmM7YT10aGlzLmM9YitzamNsLmJpdEFycmF5LmJpdExlbmd0aChhKTtpZigweDFmZmZmZmZmZmZmZmZmPGEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0c1wiKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIFVpbnQzMkFycmF5KXt2YXIgZD1uZXcgVWludDMyQXJyYXkoYyksZT0wO2ZvcihiPTEwMjQrYi0oMTAyNCtiJjEwMjMpO2I8PWE7Yis9MTAyNCl0aGlzLmwoZC5zdWJhcnJheSgzMipcbmUsMzIqKGUrMSkpKSxlKz0xO2Muc3BsaWNlKDAsMzIqZSl9ZWxzZSBmb3IoYj0xMDI0K2ItKDEwMjQrYiYxMDIzKTtiPD1hO2IrPTEwMjQpdGhpcy5sKGMuc3BsaWNlKDAsMzIpKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuZixjPXRoaXMuZyxiPXNqY2wuYml0QXJyYXkuY29uY2F0KGIsW3NqY2wuYml0QXJyYXkucGFydGlhbCgxLDEpXSk7Zm9yKGE9Yi5sZW5ndGgrNDthJjMxO2ErKyliLnB1c2goMCk7Yi5wdXNoKDApO2IucHVzaCgwKTtiLnB1c2goTWF0aC5mbG9vcih0aGlzLmMvMHgxMDAwMDAwMDApKTtmb3IoYi5wdXNoKHRoaXMuY3wwKTtiLmxlbmd0aDspdGhpcy5sKGIuc3BsaWNlKDAsMzIpKTt0aGlzLnJlc2V0KCk7cmV0dXJuIGN9LG86W10saWE6WzEyMzcyMjMyLDEzMjgxMDgzLDk3NjI4NTksMTkxNDYwOSwxNTEwNjc2OSw0MDkwOTExLDQzMDgzMzEsODI2NjEwNV0sYjpbXSxrYTpbMjY2NjAxOCwxNTY4OTE2NSw1MDYxNDIzLDkwMzQ2ODQsXG40NzY0OTg0LDM4MDk1MywxNjU4Nzc5LDcxNzY0NzIsMTk3MTg2LDczNjg2MzgsMTQ5ODc5MTYsMTY3NTc5ODYsODA5NjExMSwxNDgwMzY5LDEzMDQ2MzI1LDY4OTExNTYsMTU4MTMzMzAsNTE4NzA0Myw5MjI5NzQ5LDExMzEyMjI5LDI4MTg2NzcsMTA5Mzc0NzUsNDMyNDMwOCwxMTM1NTQxLDY3NDE5MzEsMTE4MDkyOTYsMTY0NTgwNDcsMTU2NjY5MTYsMTEwNDY4NTAsNjk4MTQ5LDIyOTk5OSw5NDU3NzYsMTM3NzQ4NDQsMjU0MTg2MiwxMjg1NjA0NSw5ODEwOTExLDExNDk0MzY2LDc4NDQ1MjAsMTU1NzY4MDYsODUzMzMwNywxNTc5NTA0NCw0MzM3NjY1LDE2MjkxNzI5LDU1NTM3MTIsMTU2ODQxMjAsNjY2MjQxNiw3NDEzODAyLDEyMzA4OTIwLDEzODE2MDA4LDQzMDM2OTksOTM2NjQyNSwxMDE3NjY4MCwxMzE5NTg3NSw0Mjk1MzcxLDY1NDYyOTEsMTE3MTI2NzUsMTU3MDg5MjQsMTUxOTQ1NiwxNTc3MjUzMCw2NTY4NDI4LDY0OTU3ODQsODU2ODI5NywxMzAwNzEyNSw3NDkyMzk1LDI1MTUzNTYsXG4xMjYzMjU4MywxNDc0MDI1NCw3MjYyNTg0LDE1MzU5MzAsMTMxNDYyNzgsMTYzMjE5NjYsMTg1MzIxMSwyOTQyNzYsMTMwNTEwMjcsMTMyMjE1NjQsMTA1MTk4MCw0MDgwMzEwLDY2NTE0MzQsMTQwODg5NDAsNDY3NTYwN10sQzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIDB4MTAwMDAwMDAwKihhLU1hdGguZmxvb3IoYSkpfDB9ZnVuY3Rpb24gYihhKXtyZXR1cm4gMHgxMDAwMDAwMDAwMCooYS1NYXRoLmZsb29yKGEpKSYyNTV9Zm9yKHZhciBjPTAsZD0yLGUsZjs4MD5jO2QrKyl7Zj0hMDtmb3IoZT0yO2UqZTw9ZDtlKyspaWYoMD09PWQlZSl7Zj0hMTticmVha31mJiYoOD5jJiYodGhpcy5vWzIqY109YShNYXRoLnBvdyhkLC41KSksdGhpcy5vWzIqYysxXT1iKE1hdGgucG93KGQsLjUpKTw8MjR8dGhpcy5pYVtjXSksdGhpcy5iWzIqY109YShNYXRoLnBvdyhkLDEvMykpLHRoaXMuYlsyKmMrMV09YihNYXRoLnBvdyhkLDEvMykpPDwyNHx0aGlzLmthW2NdLGMrKyl9fSxsOmZ1bmN0aW9uKGEpe3ZhciBiLFxuYyxkPXRoaXMuZyxlPXRoaXMuYixmPWRbMF0sZz1kWzFdLGg9ZFsyXSxrPWRbM10sbj1kWzRdLGw9ZFs1XSxtPWRbNl0scD1kWzddLHo9ZFs4XSxBPWRbOV0sQz1kWzEwXSxCPWRbMTFdLEQ9ZFsxMl0sUD1kWzEzXSxlYT1kWzE0XSxRPWRbMTVdLHQ7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSl7dD1BcnJheSgxNjApO2Zvcih2YXIgcj0wOzMyPnI7cisrKXRbcl09YVtyXX1lbHNlIHQ9YTt2YXIgcj1mLHU9ZyxHPWgsRT1rLEg9bixGPWwsVj1tLEk9cCx3PXosdj1BLFI9QyxKPUIsUz1ELEs9UCxXPWVhLEw9UTtmb3IoYT0wOzgwPmE7YSsrKXtpZigxNj5hKWI9dFsyKmFdLGM9dFsyKmErMV07ZWxzZXtjPXRbMiooYS0xNSldO3ZhciBxPXRbMiooYS0xNSkrMV07Yj0ocTw8MzF8Yz4+PjEpXihxPDwyNHxjPj4+OCleYz4+Pjc7dmFyIHg9KGM8PDMxfHE+Pj4xKV4oYzw8MjR8cT4+PjgpXihjPDwyNXxxPj4+Nyk7Yz10WzIqKGEtMildO3ZhciB5PXRbMiooYS0yKSsxXSxcbnE9KHk8PDEzfGM+Pj4xOSleKGM8PDN8eT4+PjI5KV5jPj4+Nix5PShjPDwxM3x5Pj4+MTkpXih5PDwzfGM+Pj4yOSleKGM8PDI2fHk+Pj42KSxYPXRbMiooYS03KV0sWT10WzIqKGEtMTYpXSxNPXRbMiooYS0xNikrMV07Yz14K3RbMiooYS03KSsxXTtiPWIrWCsoYz4+PjA8eD4+PjA/MTowKTtjKz15O2IrPXErKGM+Pj4wPHk+Pj4wPzE6MCk7Yys9TTtiKz1ZKyhjPj4+MDxNPj4+MD8xOjApfXRbMiphXT1ifD0wO3RbMiphKzFdPWN8PTA7dmFyIFg9dyZSXn53JlMsZmE9diZKXn52JksseT1yJkdeciZIXkcmSCxqYT11JkVedSZGXkUmRixZPSh1PDw0fHI+Pj4yOCleKHI8PDMwfHU+Pj4yKV4ocjw8MjV8dT4+PjcpLE09KHI8PDR8dT4+PjI4KV4odTw8MzB8cj4+PjIpXih1PDwyNXxyPj4+Nyksa2E9ZVsyKmFdLGdhPWVbMiphKzFdLHE9TCsoKHc8PDE4fHY+Pj4xNCleKHc8PDE0fHY+Pj4xOCleKHY8PDIzfHc+Pj45KSkseD1XKygodjw8MTh8dz4+PjE0KV4odjw8MTR8dz4+PjE4KV4odzw8XG4yM3x2Pj4+OSkpKyhxPj4+MDxMPj4+MD8xOjApLHE9cStmYSx4PXgrKFgrKHE+Pj4wPGZhPj4+MD8xOjApKSxxPXErZ2EseD14KyhrYSsocT4+PjA8Z2E+Pj4wPzE6MCkpLHE9cStjfDAseD14KyhiKyhxPj4+MDxjPj4+MD8xOjApKTtjPU0ramE7Yj1ZK3krKGM+Pj4wPE0+Pj4wPzE6MCk7Vz1TO0w9SztTPVI7Sz1KO1I9dztKPXY7dj1JK3F8MDt3PVYreCsodj4+PjA8ST4+PjA/MTowKXwwO1Y9SDtJPUY7SD1HO0Y9RTtHPXI7RT11O3U9cStjfDA7cj14K2IrKHU+Pj4wPHE+Pj4wPzE6MCl8MH1nPWRbMV09Zyt1fDA7ZFswXT1mK3IrKGc+Pj4wPHU+Pj4wPzE6MCl8MDtrPWRbM109aytFfDA7ZFsyXT1oK0crKGs+Pj4wPEU+Pj4wPzE6MCl8MDtsPWRbNV09bCtGfDA7ZFs0XT1uK0grKGw+Pj4wPEY+Pj4wPzE6MCl8MDtwPWRbN109cCtJfDA7ZFs2XT1tK1YrKHA+Pj4wPEk+Pj4wPzE6MCl8MDtBPWRbOV09QSt2fDA7ZFs4XT16K3crKEE+Pj4wPHY+Pj4wPzE6MCl8MDtCPWRbMTFdPUIrSnxcbjA7ZFsxMF09QytSKyhCPj4+MDxKPj4+MD8xOjApfDA7UD1kWzEzXT1QK0t8MDtkWzEyXT1EK1MrKFA+Pj4wPEs+Pj4wPzE6MCl8MDtRPWRbMTVdPVErTHwwO2RbMTRdPWVhK1crKFE+Pj4wPEw+Pj4wPzE6MCl8MH19O1xuc2pjbC5tb2RlLmNjbT17bmFtZTpcImNjbVwiLEY6W10sbGlzdGVuUHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7c2pjbC5tb2RlLmNjbS5GLnB1c2goYSl9LHVuTGlzdGVuUHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT1zamNsLm1vZGUuY2NtLkYuaW5kZXhPZihhKTstMTxhJiZzamNsLm1vZGUuY2NtLkYuc3BsaWNlKGEsMSl9LGRhOmZ1bmN0aW9uKGEpe3ZhciBiPXNqY2wubW9kZS5jY20uRi5zbGljZSgpLGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrPTEpYltjXShhKX0sZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc9Yi5zbGljZSgwKSxoPXNqY2wuYml0QXJyYXksaz1oLmJpdExlbmd0aChjKS84LG49aC5iaXRMZW5ndGgoZykvODtlPWV8fDY0O2Q9ZHx8W107aWYoNz5rKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpdiBtdXN0IGJlIGF0IGxlYXN0IDcgYnl0ZXNcIik7Zm9yKGY9Mjs0PmYmJm4+Pj44KmY7ZisrKTtmPDE1LWsmJihmPTE1LWspO2M9aC5jbGFtcChjLFxuOCooMTUtZikpO2I9c2pjbC5tb2RlLmNjbS5VKGEsYixjLGQsZSxmKTtnPXNqY2wubW9kZS5jY20uVihhLGcsYyxiLGUsZik7cmV0dXJuIGguY29uY2F0KGcuZGF0YSxnLnRhZyl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXtlPWV8fDY0O2Q9ZHx8W107dmFyIGY9c2pjbC5iaXRBcnJheSxnPWYuYml0TGVuZ3RoKGMpLzgsaD1mLmJpdExlbmd0aChiKSxrPWYuY2xhbXAoYixoLWUpLG49Zi5iaXRTbGljZShiLGgtZSksaD0oaC1lKS84O2lmKDc+Zyl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImNjbTogaXYgbXVzdCBiZSBhdCBsZWFzdCA3IGJ5dGVzXCIpO2ZvcihiPTI7ND5iJiZoPj4+OCpiO2IrKyk7YjwxNS1nJiYoYj0xNS1nKTtjPWYuY2xhbXAoYyw4KigxNS1iKSk7az1zamNsLm1vZGUuY2NtLlYoYSxrLGMsbixlLGIpO2E9c2pjbC5tb2RlLmNjbS5VKGEsay5kYXRhLGMsZCxlLGIpO2lmKCFmLmVxdWFsKGsudGFnLGEpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5jb3JydXB0KFwiY2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKTtcbnJldHVybiBrLmRhdGF9LG1hOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1bXSxoPXNqY2wuYml0QXJyYXksaz1oLlA7ZD1baC5wYXJ0aWFsKDgsKGIubGVuZ3RoPzY0OjApfGQtMjw8MnxmLTEpXTtkPWguY29uY2F0KGQsYyk7ZFszXXw9ZTtkPWEuZW5jcnlwdChkKTtpZihiLmxlbmd0aClmb3IoYz1oLmJpdExlbmd0aChiKS84LDY1Mjc5Pj1jP2c9W2gucGFydGlhbCgxNixjKV06MHhmZmZmZmZmZj49YyYmKGc9aC5jb25jYXQoW2gucGFydGlhbCgxNiw2NTUzNCldLFtjXSkpLGc9aC5jb25jYXQoZyxiKSxiPTA7YjxnLmxlbmd0aDtiKz00KWQ9YS5lbmNyeXB0KGsoZCxnLnNsaWNlKGIsYis0KS5jb25jYXQoWzAsMCwwXSkpKTtyZXR1cm4gZH0sVTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9c2pjbC5iaXRBcnJheSxoPWcuUDtlLz04O2lmKGUlMnx8ND5lfHwxNjxlKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5pZigweGZmZmZmZmZmPGQubGVuZ3RofHwweGZmZmZmZmZmPGIubGVuZ3RoKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJjY206IGNhbid0IGRlYWwgd2l0aCA0R2lCIG9yIG1vcmUgZGF0YVwiKTtjPXNqY2wubW9kZS5jY20ubWEoYSxkLGMsZSxnLmJpdExlbmd0aChiKS84LGYpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKz00KWM9YS5lbmNyeXB0KGgoYyxiLnNsaWNlKGQsZCs0KS5jb25jYXQoWzAsMCwwXSkpKTtyZXR1cm4gZy5jbGFtcChjLDgqZSl9LFY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnLGg9c2pjbC5iaXRBcnJheTtnPWguUDt2YXIgaz1iLmxlbmd0aCxuPWguYml0TGVuZ3RoKGIpLGw9ay81MCxtPWw7Yz1oLmNvbmNhdChbaC5wYXJ0aWFsKDgsZi0xKV0sYykuY29uY2F0KFswLDAsMF0pLnNsaWNlKDAsNCk7ZD1oLmJpdFNsaWNlKGcoZCxhLmVuY3J5cHQoYykpLDAsZSk7aWYoIWspcmV0dXJue3RhZzpkLGRhdGE6W119O2ZvcihnPTA7ZzxrO2crPTQpZz5sJiYoc2pjbC5tb2RlLmNjbS5kYShnL1xuayksbCs9bSksY1szXSsrLGU9YS5lbmNyeXB0KGMpLGJbZ11ePWVbMF0sYltnKzFdXj1lWzFdLGJbZysyXV49ZVsyXSxiW2crM11ePWVbM107cmV0dXJue3RhZzpkLGRhdGE6aC5jbGFtcChiLG4pfX19O3NqY2wubWlzYy5obWFjPWZ1bmN0aW9uKGEsYil7dGhpcy5XPWI9Ynx8c2pjbC5oYXNoLnNoYTI1Njt2YXIgYz1bW10sW11dLGQsZT1iLnByb3RvdHlwZS5ibG9ja1NpemUvMzI7dGhpcy5CPVtuZXcgYixuZXcgYl07YS5sZW5ndGg+ZSYmKGE9Yi5oYXNoKGEpKTtmb3IoZD0wO2Q8ZTtkKyspY1swXVtkXT1hW2RdXjkwOTUyMjQ4NixjWzFdW2RdPWFbZF1eMTU0OTU1NjgyODt0aGlzLkJbMF0udXBkYXRlKGNbMF0pO3RoaXMuQlsxXS51cGRhdGUoY1sxXSk7dGhpcy5PPW5ldyBiKHRoaXMuQlswXSl9O1xuc2pjbC5taXNjLmhtYWMucHJvdG90eXBlLmVuY3J5cHQ9c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLm1hYz1mdW5jdGlvbihhKXtpZih0aGlzLlopdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJlbmNyeXB0IG9uIGFscmVhZHkgdXBkYXRlZCBobWFjIGNhbGxlZCFcIik7dGhpcy51cGRhdGUoYSk7cmV0dXJuIHRoaXMuZGlnZXN0KGEpfTtzamNsLm1pc2MuaG1hYy5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLk89bmV3IHRoaXMuVyh0aGlzLkJbMF0pO3RoaXMuWj0hMX07c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLlo9ITA7dGhpcy5PLnVwZGF0ZShhKX07c2pjbC5taXNjLmhtYWMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuTy5maW5hbGl6ZSgpLGE9KG5ldyB0aGlzLlcodGhpcy5CWzFdKSkudXBkYXRlKGEpLmZpbmFsaXplKCk7dGhpcy5yZXNldCgpO3JldHVybiBhfTtcbnNqY2wubWlzYy5wYmtkZjI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtjPWN8fDFFNDtpZigwPmR8fDA+Yyl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgcGFyYW1zIHRvIHBia2RmMlwiKTtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoYSkpO1wic3RyaW5nXCI9PT10eXBlb2YgYiYmKGI9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhiKSk7ZT1lfHxzamNsLm1pc2MuaG1hYzthPW5ldyBlKGEpO3ZhciBmLGcsaCxrLG49W10sbD1zamNsLmJpdEFycmF5O2ZvcihrPTE7MzIqbi5sZW5ndGg8KGR8fDEpO2srKyl7ZT1mPWEuZW5jcnlwdChsLmNvbmNhdChiLFtrXSkpO2ZvcihnPTE7ZzxjO2crKylmb3IoZj1hLmVuY3J5cHQoZiksaD0wO2g8Zi5sZW5ndGg7aCsrKWVbaF1ePWZbaF07bj1uLmNvbmNhdChlKX1kJiYobj1sLmNsYW1wKG4sZCkpO3JldHVybiBufTtcbnNqY2wucHJuZz1mdW5jdGlvbihhKXt0aGlzLmg9W25ldyBzamNsLmhhc2guc2hhMjU2XTt0aGlzLnM9WzBdO3RoaXMuTj0wO3RoaXMuRz17fTt0aGlzLk09MDt0aGlzLlQ9e307dGhpcy5YPXRoaXMuaT10aGlzLnU9dGhpcy5mYT0wO3RoaXMuYj1bMCwwLDAsMCwwLDAsMCwwXTt0aGlzLm09WzAsMCwwLDBdO3RoaXMuSz12b2lkIDA7dGhpcy5MPWE7dGhpcy5EPSExO3RoaXMuSj17cHJvZ3Jlc3M6e30sc2VlZGVkOnt9fTt0aGlzLkE9dGhpcy5lYT0wO3RoaXMuSD0xO3RoaXMuST0yO3RoaXMuYWE9MHgxMDAwMDt0aGlzLlI9WzAsNDgsNjQsOTYsMTI4LDE5MiwweDEwMCwzODQsNTEyLDc2OCwxMDI0XTt0aGlzLmJhPTNFNDt0aGlzLiQ9ODB9O1xuc2pjbC5wcm5nLnByb3RvdHlwZT17cmFuZG9tV29yZHM6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkO2Q9dGhpcy5pc1JlYWR5KGIpO3ZhciBlO2lmKGQ9PT10aGlzLkEpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLm5vdFJlYWR5KFwiZ2VuZXJhdG9yIGlzbid0IHNlZWRlZFwiKTtpZihkJnRoaXMuSSl7ZD0hKGQmdGhpcy5IKTtlPVtdO3ZhciBmPTAsZzt0aGlzLlg9ZVswXT0obmV3IERhdGUpLnZhbHVlT2YoKSt0aGlzLmJhO2ZvcihnPTA7MTY+ZztnKyspZS5wdXNoKDB4MTAwMDAwMDAwKk1hdGgucmFuZG9tKCl8MCk7Zm9yKGc9MDtnPHRoaXMuaC5sZW5ndGgmJihlPWUuY29uY2F0KHRoaXMuaFtnXS5maW5hbGl6ZSgpKSxmKz10aGlzLnNbZ10sdGhpcy5zW2ddPTAsZHx8ISh0aGlzLk4mMTw8ZykpO2crKyk7dGhpcy5OPj0xPDx0aGlzLmgubGVuZ3RoJiYodGhpcy5oLnB1c2gobmV3IHNqY2wuaGFzaC5zaGEyNTYpLHRoaXMucy5wdXNoKDApKTt0aGlzLmktPWY7Zj50aGlzLnUmJih0aGlzLnU9XG5mKTt0aGlzLk4rKzt0aGlzLmI9c2pjbC5oYXNoLnNoYTI1Ni5oYXNoKHRoaXMuYi5jb25jYXQoZSkpO3RoaXMuSz1uZXcgc2pjbC5jaXBoZXIuYWVzKHRoaXMuYik7Zm9yKGQ9MDs0PmQmJih0aGlzLm1bZF09dGhpcy5tW2RdKzF8MCwhdGhpcy5tW2RdKTtkKyspO31mb3IoZD0wO2Q8YTtkKz00KTA9PT0oZCsxKSV0aGlzLmFhJiZiYSh0aGlzKSxlPU4odGhpcyksYy5wdXNoKGVbMF0sZVsxXSxlWzJdLGVbM10pO2JhKHRoaXMpO3JldHVybiBjLnNsaWNlKDAsYSl9LHNldERlZmF1bHRQYXJhbm9pYTpmdW5jdGlvbihhLGIpe2lmKDA9PT1hJiZcIlNldHRpbmcgcGFyYW5vaWE9MCB3aWxsIHJ1aW4geW91ciBzZWN1cml0eTsgdXNlIGl0IG9ubHkgZm9yIHRlc3RpbmdcIiE9PWIpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJTZXR0aW5nIHBhcmFub2lhPTAgd2lsbCBydWluIHlvdXIgc2VjdXJpdHk7IHVzZSBpdCBvbmx5IGZvciB0ZXN0aW5nXCIpO3RoaXMuTD1hfSxhZGRFbnRyb3B5OmZ1bmN0aW9uKGEsXG5iLGMpe2M9Y3x8XCJ1c2VyXCI7dmFyIGQsZSxmPShuZXcgRGF0ZSkudmFsdWVPZigpLGc9dGhpcy5HW2NdLGg9dGhpcy5pc1JlYWR5KCksaz0wO2Q9dGhpcy5UW2NdO3ZvaWQgMD09PWQmJihkPXRoaXMuVFtjXT10aGlzLmZhKyspO3ZvaWQgMD09PWcmJihnPXRoaXMuR1tjXT0wKTt0aGlzLkdbY109KHRoaXMuR1tjXSsxKSV0aGlzLmgubGVuZ3RoO3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcIm51bWJlclwiOnZvaWQgMD09PWImJihiPTEpO3RoaXMuaFtnXS51cGRhdGUoW2QsdGhpcy5NKyssMSxiLGYsMSxhfDBdKTticmVhaztjYXNlIFwib2JqZWN0XCI6Yz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk7aWYoXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiPT09Yyl7ZT1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdKTthPWV9ZWxzZSBmb3IoXCJbb2JqZWN0IEFycmF5XVwiIT09YyYmKGs9MSksYz0wO2M8YS5sZW5ndGgmJiFrO2MrKylcIm51bWJlclwiIT09dHlwZW9mIGFbY10mJlxuKGs9MSk7aWYoIWspe2lmKHZvaWQgMD09PWIpZm9yKGM9Yj0wO2M8YS5sZW5ndGg7YysrKWZvcihlPWFbY107MDxlOyliKyssZT1lPj4+MTt0aGlzLmhbZ10udXBkYXRlKFtkLHRoaXMuTSsrLDIsYixmLGEubGVuZ3RoXS5jb25jYXQoYSkpfWJyZWFrO2Nhc2UgXCJzdHJpbmdcIjp2b2lkIDA9PT1iJiYoYj1hLmxlbmd0aCk7dGhpcy5oW2ddLnVwZGF0ZShbZCx0aGlzLk0rKywzLGIsZixhLmxlbmd0aF0pO3RoaXMuaFtnXS51cGRhdGUoYSk7YnJlYWs7ZGVmYXVsdDprPTF9aWYoayl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwicmFuZG9tOiBhZGRFbnRyb3B5IG9ubHkgc3VwcG9ydHMgbnVtYmVyLCBhcnJheSBvZiBudW1iZXJzIG9yIHN0cmluZ1wiKTt0aGlzLnNbZ10rPWI7dGhpcy5pKz1iO2g9PT10aGlzLkEmJih0aGlzLmlzUmVhZHkoKSE9PXRoaXMuQSYmY2EoXCJzZWVkZWRcIixNYXRoLm1heCh0aGlzLnUsdGhpcy5pKSksY2EoXCJwcm9ncmVzc1wiLHRoaXMuZ2V0UHJvZ3Jlc3MoKSkpfSxcbmlzUmVhZHk6ZnVuY3Rpb24oYSl7YT10aGlzLlJbdm9pZCAwIT09YT9hOnRoaXMuTF07cmV0dXJuIHRoaXMudSYmdGhpcy51Pj1hP3RoaXMuc1swXT50aGlzLiQmJihuZXcgRGF0ZSkudmFsdWVPZigpPnRoaXMuWD90aGlzLkl8dGhpcy5IOnRoaXMuSDp0aGlzLmk+PWE/dGhpcy5JfHRoaXMuQTp0aGlzLkF9LGdldFByb2dyZXNzOmZ1bmN0aW9uKGEpe2E9dGhpcy5SW2E/YTp0aGlzLkxdO3JldHVybiB0aGlzLnU+PWE/MTp0aGlzLmk+YT8xOnRoaXMuaS9hfSxzdGFydENvbGxlY3RvcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5EKXt0aGlzLmE9e2xvYWRUaW1lQ29sbGVjdG9yOk8odGhpcyx0aGlzLmxhKSxtb3VzZUNvbGxlY3RvcjpPKHRoaXMsdGhpcy5uYSksa2V5Ym9hcmRDb2xsZWN0b3I6Tyh0aGlzLHRoaXMuamEpLGFjY2VsZXJvbWV0ZXJDb2xsZWN0b3I6Tyh0aGlzLHRoaXMuY2EpLHRvdWNoQ29sbGVjdG9yOk8odGhpcyx0aGlzLnBhKX07aWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsXG50aGlzLmEubG9hZFRpbWVDb2xsZWN0b3IsITEpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5hLm1vdXNlQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsdGhpcy5hLmtleWJvYXJkQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRldmljZW1vdGlvblwiLHRoaXMuYS5hY2NlbGVyb21ldGVyQ29sbGVjdG9yLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMuYS50b3VjaENvbGxlY3RvciwhMSk7ZWxzZSBpZihkb2N1bWVudC5hdHRhY2hFdmVudClkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ubG9hZFwiLHRoaXMuYS5sb2FkVGltZUNvbGxlY3RvciksZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbm1vdXNlbW92ZVwiLHRoaXMuYS5tb3VzZUNvbGxlY3RvciksZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3Rvcik7ZWxzZSB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwiY2FuJ3QgYXR0YWNoIGV2ZW50XCIpO1xudGhpcy5EPSEwfX0sc3RvcENvbGxlY3RvcnM6ZnVuY3Rpb24oKXt0aGlzLkQmJih3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcj8od2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuYS5tb3VzZUNvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLHRoaXMuYS5rZXlib2FyZENvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkZXZpY2Vtb3Rpb25cIix0aGlzLmEuYWNjZWxlcm9tZXRlckNvbGxlY3RvciwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLmEudG91Y2hDb2xsZWN0b3IsITEpKTpkb2N1bWVudC5kZXRhY2hFdmVudCYmKGRvY3VtZW50LmRldGFjaEV2ZW50KFwib25sb2FkXCIsdGhpcy5hLmxvYWRUaW1lQ29sbGVjdG9yKSxkb2N1bWVudC5kZXRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsXG50aGlzLmEubW91c2VDb2xsZWN0b3IpLGRvY3VtZW50LmRldGFjaEV2ZW50KFwia2V5cHJlc3NcIix0aGlzLmEua2V5Ym9hcmRDb2xsZWN0b3IpKSx0aGlzLkQ9ITEpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5KW2FdW3RoaXMuZWErK109Yn0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT10aGlzLkpbYV0sZj1bXTtmb3IoZCBpbiBlKWUuaGFzT3duUHJvcGVydHkoZCkmJmVbZF09PT1iJiZmLnB1c2goZCk7Zm9yKGM9MDtjPGYubGVuZ3RoO2MrKylkPWZbY10sZGVsZXRlIGVbZF19LGphOmZ1bmN0aW9uKCl7VCh0aGlzLDEpfSxuYTpmdW5jdGlvbihhKXt2YXIgYixjO3RyeXtiPWEueHx8YS5jbGllbnRYfHxhLm9mZnNldFh8fDAsYz1hLnl8fGEuY2xpZW50WXx8YS5vZmZzZXRZfHwwfWNhdGNoKGQpe2M9Yj0wfTAhPWImJjAhPWMmJnRoaXMuYWRkRW50cm9weShbYixjXSwyLFwibW91c2VcIik7VCh0aGlzLDApfSxwYTpmdW5jdGlvbihhKXthPVxuYS50b3VjaGVzWzBdfHxhLmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuYWRkRW50cm9weShbYS5wYWdlWHx8YS5jbGllbnRYLGEucGFnZVl8fGEuY2xpZW50WV0sMSxcInRvdWNoXCIpO1QodGhpcywwKX0sbGE6ZnVuY3Rpb24oKXtUKHRoaXMsMil9LGNhOmZ1bmN0aW9uKGEpe2E9YS5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lnh8fGEuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS55fHxhLmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkuejtpZih3aW5kb3cub3JpZW50YXRpb24pe3ZhciBiPXdpbmRvdy5vcmllbnRhdGlvbjtcIm51bWJlclwiPT09dHlwZW9mIGImJnRoaXMuYWRkRW50cm9weShiLDEsXCJhY2NlbGVyb21ldGVyXCIpfWEmJnRoaXMuYWRkRW50cm9weShhLDIsXCJhY2NlbGVyb21ldGVyXCIpO1QodGhpcywwKX19O1xuZnVuY3Rpb24gY2EoYSxiKXt2YXIgYyxkPXNqY2wucmFuZG9tLkpbYV0sZT1bXTtmb3IoYyBpbiBkKWQuaGFzT3duUHJvcGVydHkoYykmJmUucHVzaChkW2NdKTtmb3IoYz0wO2M8ZS5sZW5ndGg7YysrKWVbY10oYil9ZnVuY3Rpb24gVChhLGIpe1widW5kZWZpbmVkXCIhPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93P2EuYWRkRW50cm9weSh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCksYixcImxvYWR0aW1lXCIpOmEuYWRkRW50cm9weSgobmV3IERhdGUpLnZhbHVlT2YoKSxiLFwibG9hZHRpbWVcIil9ZnVuY3Rpb24gYmEoYSl7YS5iPU4oYSkuY29uY2F0KE4oYSkpO2EuSz1uZXcgc2pjbC5jaXBoZXIuYWVzKGEuYil9ZnVuY3Rpb24gTihhKXtmb3IodmFyIGI9MDs0PmImJihhLm1bYl09YS5tW2JdKzF8MCwhYS5tW2JdKTtiKyspO3JldHVybiBhLksuZW5jcnlwdChhLm0pfVxuZnVuY3Rpb24gTyhhLGIpe3JldHVybiBmdW5jdGlvbigpe2IuYXBwbHkoYSxhcmd1bWVudHMpfX1zamNsLnJhbmRvbT1uZXcgc2pjbC5wcm5nKDYpO1xuYTp0cnl7dmFyIFUsZGEsWixoYTtpZihoYT1cInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMpe3ZhciBpYTt0cnl7aWE9cmVxdWlyZShcImNyeXB0b1wiKX1jYXRjaChhKXtpYT1udWxsfWhhPWRhPWlhfWlmKGhhJiZkYS5yYW5kb21CeXRlcylVPWRhLnJhbmRvbUJ5dGVzKDEyOCksVT1uZXcgVWludDMyQXJyYXkoKG5ldyBVaW50OEFycmF5KFUpKS5idWZmZXIpLHNqY2wucmFuZG9tLmFkZEVudHJvcHkoVSwxMDI0LFwiY3J5cHRvWydyYW5kb21CeXRlcyddXCIpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDMyQXJyYXkpe1o9bmV3IFVpbnQzMkFycmF5KDMyKTtpZih3aW5kb3cuY3J5cHRvJiZ3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyl3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhaKTtlbHNlIGlmKHdpbmRvdy5tc0NyeXB0byYmd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyl3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFopO1xuZWxzZSBicmVhayBhO3NqY2wucmFuZG9tLmFkZEVudHJvcHkoWiwxMDI0LFwiY3J5cHRvWydnZXRSYW5kb21WYWx1ZXMnXVwiKX19Y2F0Y2goYSl7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYoY29uc29sZS5sb2coXCJUaGVyZSB3YXMgYW4gZXJyb3IgY29sbGVjdGluZyBlbnRyb3B5IGZyb20gdGhlIGJyb3dzZXI6XCIpLGNvbnNvbGUubG9nKGEpKX1cbnNqY2wuanNvbj17ZGVmYXVsdHM6e3Y6MSxpdGVyOjFFNCxrczoxMjgsdHM6NjQsbW9kZTpcImNjbVwiLGFkYXRhOlwiXCIsY2lwaGVyOlwiYWVzXCJ9LGhhOmZ1bmN0aW9uKGEsYixjLGQpe2M9Y3x8e307ZD1kfHx7fTt2YXIgZT1zamNsLmpzb24sZj1lLmooe2l2OnNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDQsMCl9LGUuZGVmYXVsdHMpLGc7ZS5qKGYsYyk7Yz1mLmFkYXRhO1wic3RyaW5nXCI9PT10eXBlb2YgZi5zYWx0JiYoZi5zYWx0PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhmLnNhbHQpKTtcInN0cmluZ1wiPT09dHlwZW9mIGYuaXYmJihmLml2PXNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhmLml2KSk7aWYoIXNqY2wubW9kZVtmLm1vZGVdfHwhc2pjbC5jaXBoZXJbZi5jaXBoZXJdfHxcInN0cmluZ1wiPT09dHlwZW9mIGEmJjEwMD49Zi5pdGVyfHw2NCE9PWYudHMmJjk2IT09Zi50cyYmMTI4IT09Zi50c3x8MTI4IT09Zi5rcyYmMTkyIT09Zi5rcyYmMHgxMDAhPT1mLmtzfHwyPmYuaXYubGVuZ3RofHxcbjQ8Zi5pdi5sZW5ndGgpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGVuY3J5cHQ6IGludmFsaWQgcGFyYW1ldGVyc1wiKTtcInN0cmluZ1wiPT09dHlwZW9mIGE/KGc9c2pjbC5taXNjLmNhY2hlZFBia2RmMihhLGYpLGE9Zy5rZXkuc2xpY2UoMCxmLmtzLzMyKSxmLnNhbHQ9Zy5zYWx0KTpzamNsLmVjYyYmYSBpbnN0YW5jZW9mIHNqY2wuZWNjLmVsR2FtYWwucHVibGljS2V5JiYoZz1hLmtlbSgpLGYua2VtdGFnPWcudGFnLGE9Zy5rZXkuc2xpY2UoMCxmLmtzLzMyKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGIpKTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihmLmFkYXRhPWM9c2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhjKSk7Zz1uZXcgc2pjbC5jaXBoZXJbZi5jaXBoZXJdKGEpO2UuaihkLGYpO2Qua2V5PWE7Zi5jdD1cImNjbVwiPT09Zi5tb2RlJiZzamNsLmFycmF5QnVmZmVyJiZzamNsLmFycmF5QnVmZmVyLmNjbSYmXG5iIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/c2pjbC5hcnJheUJ1ZmZlci5jY20uZW5jcnlwdChnLGIsZi5pdixjLGYudHMpOnNqY2wubW9kZVtmLm1vZGVdLmVuY3J5cHQoZyxiLGYuaXYsYyxmLnRzKTtyZXR1cm4gZn0sZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1zamNsLmpzb24sZj1lLmhhLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gZS5lbmNvZGUoZil9LGdhOmZ1bmN0aW9uKGEsYixjLGQpe2M9Y3x8e307ZD1kfHx7fTt2YXIgZT1zamNsLmpzb247Yj1lLmooZS5qKGUuaih7fSxlLmRlZmF1bHRzKSxiKSxjLCEwKTt2YXIgZixnO2Y9Yi5hZGF0YTtcInN0cmluZ1wiPT09dHlwZW9mIGIuc2FsdCYmKGIuc2FsdD1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5zYWx0KSk7XCJzdHJpbmdcIj09PXR5cGVvZiBiLml2JiYoYi5pdj1zamNsLmNvZGVjLmJhc2U2NC50b0JpdHMoYi5pdikpO2lmKCFzamNsLm1vZGVbYi5tb2RlXXx8IXNqY2wuY2lwaGVyW2IuY2lwaGVyXXx8XCJzdHJpbmdcIj09PVxudHlwZW9mIGEmJjEwMD49Yi5pdGVyfHw2NCE9PWIudHMmJjk2IT09Yi50cyYmMTI4IT09Yi50c3x8MTI4IT09Yi5rcyYmMTkyIT09Yi5rcyYmMHgxMDAhPT1iLmtzfHwhYi5pdnx8Mj5iLml2Lmxlbmd0aHx8NDxiLml2Lmxlbmd0aCl0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYT8oZz1zamNsLm1pc2MuY2FjaGVkUGJrZGYyKGEsYiksYT1nLmtleS5zbGljZSgwLGIua3MvMzIpLGIuc2FsdD1nLnNhbHQpOnNqY2wuZWNjJiZhIGluc3RhbmNlb2Ygc2pjbC5lY2MuZWxHYW1hbC5zZWNyZXRLZXkmJihhPWEudW5rZW0oc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGIua2VtdGFnKSkuc2xpY2UoMCxiLmtzLzMyKSk7XCJzdHJpbmdcIj09PXR5cGVvZiBmJiYoZj1zamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKGYpKTtnPW5ldyBzamNsLmNpcGhlcltiLmNpcGhlcl0oYSk7Zj1cImNjbVwiPT09XG5iLm1vZGUmJnNqY2wuYXJyYXlCdWZmZXImJnNqY2wuYXJyYXlCdWZmZXIuY2NtJiZiLmN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/c2pjbC5hcnJheUJ1ZmZlci5jY20uZGVjcnlwdChnLGIuY3QsYi5pdixiLnRhZyxmLGIudHMpOnNqY2wubW9kZVtiLm1vZGVdLmRlY3J5cHQoZyxiLmN0LGIuaXYsZixiLnRzKTtlLmooZCxiKTtkLmtleT1hO3JldHVybiAxPT09Yy5yYXc/ZjpzamNsLmNvZGVjLnV0ZjhTdHJpbmcuZnJvbUJpdHMoZil9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9c2pjbC5qc29uO3JldHVybiBlLmdhKGEsZS5kZWNvZGUoYiksYyxkKX0sZW5jb2RlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJ7XCIsZD1cIlwiO2ZvcihiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7aWYoIWIubWF0Y2goL15bYS16MC05XSskL2kpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBlbmNvZGU6IGludmFsaWQgcHJvcGVydHkgbmFtZVwiKTtjKz1kKydcIicrXG5iKydcIjonO2Q9XCIsXCI7c3dpdGNoKHR5cGVvZiBhW2JdKXtjYXNlIFwibnVtYmVyXCI6Y2FzZSBcImJvb2xlYW5cIjpjKz1hW2JdO2JyZWFrO2Nhc2UgXCJzdHJpbmdcIjpjKz0nXCInK2VzY2FwZShhW2JdKSsnXCInO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpjKz0nXCInK3NqY2wuY29kZWMuYmFzZTY0LmZyb21CaXRzKGFbYl0sMCkrJ1wiJzticmVhaztkZWZhdWx0OnRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJqc29uIGVuY29kZTogdW5zdXBwb3J0ZWQgdHlwZVwiKTt9fXJldHVybiBjK1wifVwifSxkZWNvZGU6ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoL1xccy9nLFwiXCIpO2lmKCFhLm1hdGNoKC9eXFx7LipcXH0kLykpdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY29kZTogdGhpcyBpc24ndCBqc29uIVwiKTthPWEucmVwbGFjZSgvXlxce3xcXH0kL2csXCJcIikuc3BsaXQoLywvKTt2YXIgYj17fSxjLGQ7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7aWYoIShkPWFbY10ubWF0Y2goL15cXHMqKD86KFtcIiddPykoW2Etel1bYS16MC05XSopXFwxKVxccyo6XFxzKig/OigtP1xcZCspfFwiKFthLXowLTkrXFwvJSpfLkA9XFwtXSopXCJ8KHRydWV8ZmFsc2UpKSQvaSkpKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwianNvbiBkZWNvZGU6IHRoaXMgaXNuJ3QganNvbiFcIik7XG5udWxsIT1kWzNdP2JbZFsyXV09cGFyc2VJbnQoZFszXSwxMCk6bnVsbCE9ZFs0XT9iW2RbMl1dPWRbMl0ubWF0Y2goL14oY3R8YWRhdGF8c2FsdHxpdikkLyk/c2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKGRbNF0pOnVuZXNjYXBlKGRbNF0pOm51bGwhPWRbNV0mJihiW2RbMl1dPVwidHJ1ZVwiPT09ZFs1XSl9cmV0dXJuIGJ9LGo6ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWEmJihhPXt9KTtpZih2b2lkIDA9PT1iKXJldHVybiBhO2Zvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkpe2lmKGMmJnZvaWQgMCE9PWFbZF0mJmFbZF0hPT1iW2RdKXRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwicmVxdWlyZWQgcGFyYW1ldGVyIG92ZXJyaWRkZW5cIik7YVtkXT1iW2RdfXJldHVybiBhfSxyYTpmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZhW2RdIT09YltkXSYmKGNbZF09YVtkXSk7cmV0dXJuIGN9LHFhOmZ1bmN0aW9uKGEsXG5iKXt2YXIgYz17fSxkO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspdm9pZCAwIT09YVtiW2RdXSYmKGNbYltkXV09YVtiW2RdXSk7cmV0dXJuIGN9fTtzamNsLmVuY3J5cHQ9c2pjbC5qc29uLmVuY3J5cHQ7c2pjbC5kZWNyeXB0PXNqY2wuanNvbi5kZWNyeXB0O3NqY2wubWlzYy5vYT17fTtzamNsLm1pc2MuY2FjaGVkUGJrZGYyPWZ1bmN0aW9uKGEsYil7dmFyIGM9c2pjbC5taXNjLm9hLGQ7Yj1ifHx7fTtkPWIuaXRlcnx8MUUzO2M9Y1thXT1jW2FdfHx7fTtkPWNbZF09Y1tkXXx8e2ZpcnN0U2FsdDpiLnNhbHQmJmIuc2FsdC5sZW5ndGg/Yi5zYWx0LnNsaWNlKDApOnNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDIsMCl9O2M9dm9pZCAwPT09Yi5zYWx0P2QuZmlyc3RTYWx0OmIuc2FsdDtkW2NdPWRbY118fHNqY2wubWlzYy5wYmtkZjIoYSxjLGIuaXRlcik7cmV0dXJue2tleTpkW2NdLnNsaWNlKDApLHNhbHQ6Yy5zbGljZSgwKX19O1xuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9c2pjbCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHNqY2x9KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCAiY29uc3QgZGVmYXVsdEVycm9yQ29uZmlnID0ge1xyXG4gICAgd2l0aFN0YWNrVHJhY2U6IGZhbHNlLFxyXG59O1xyXG4vLyBDdXN0b20gZXJyb3Igb2JqZWN0XHJcbi8vIENvbnRleHQgLyBkaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtYWNyby9uZXZlcnRocm93L3B1bGwvMjE1XHJcbmNvbnN0IGNyZWF0ZU5ldmVyVGhyb3dFcnJvciA9IChtZXNzYWdlLCByZXN1bHQsIGNvbmZpZyA9IGRlZmF1bHRFcnJvckNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHJlc3VsdC5pc09rKClcclxuICAgICAgICA/IHsgdHlwZTogJ09rJywgdmFsdWU6IHJlc3VsdC52YWx1ZSB9XHJcbiAgICAgICAgOiB7IHR5cGU6ICdFcnInLCB2YWx1ZTogcmVzdWx0LmVycm9yIH07XHJcbiAgICBjb25zdCBtYXliZVN0YWNrID0gY29uZmlnLndpdGhTdGFja1RyYWNlID8gbmV3IEVycm9yKCkuc3RhY2sgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBzdGFjazogbWF5YmVTdGFjayxcclxuICAgIH07XHJcbn07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuY2xhc3MgUmVzdWx0QXN5bmMge1xyXG4gICAgY29uc3RydWN0b3IocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU2FmZVByb21pc2UocHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBwcm9taXNlLnRoZW4oKHZhbHVlKSA9PiBuZXcgT2sodmFsdWUpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKG5ld1Byb21pc2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2UsIGVycm9yRm4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gcHJvbWlzZVxyXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IG5ldyBPayh2YWx1ZSkpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbmV3IEVycihlcnJvckZuKGUpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuZXdQcm9taXNlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBzdGF0aWMgZnJvbVRocm93YWJsZShmbiwgZXJyb3JGbikge1xyXG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKCgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZm4oLi4uYXJncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoZXJyb3JGbiA/IGVycm9yRm4oZXJyb3IpIDogZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSkoKSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjb21iaW5lKGFzeW5jUmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0QXN5bmNMaXN0KGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29tYmluZVdpdGhBbGxFcnJvcnMoYXN5bmNSZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzKGFzeW5jUmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2soeWllbGQgZihyZXMudmFsdWUpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgYW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3UmVzID0geWllbGQgZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyKG5ld1Jlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBmKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRlZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2socmVzLnZhbHVlKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgbWFwRXJyKGYpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdEFzeW5jKHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuaXNPaygpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9rKHJlcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnIoeWllbGQgZihyZXMuZXJyb3IpKTtcclxuICAgICAgICB9KSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0QXN5bmModGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycihyZXMuZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZihyZXMudmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRBc3luYyA/IG5ld1ZhbHVlLl9wcm9taXNlIDogbmV3VmFsdWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIG9yRWxzZShmKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyh0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmKHJlcy5lcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPayhyZXMudmFsdWUpO1xyXG4gICAgICAgIH0pKSk7XHJcbiAgICB9XHJcbiAgICBtYXRjaChvaywgX2Vycikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oKHJlcykgPT4gcmVzLm1hdGNoKG9rLCBfZXJyKSk7XHJcbiAgICB9XHJcbiAgICB1bndyYXBPcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UudGhlbigocmVzKSA9PiByZXMudW53cmFwT3IodCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gOS4wLjAuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiB1c2UgYHNhZmVUcnlgIHdpdGhvdXQgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAgICogc2FmZVRyeShhc3luYyBmdW5jdGlvbiogKCkge1xyXG4gICAgICogICBjb25zdCBva1ZhbHVlID0geWllbGQqIHlvdXJSZXN1bHRcclxuICAgICAqIH0pXHJcbiAgICAgKiBgYGBcclxuICAgICAqIEVtdWxhdGVzIFJ1c3QncyBgP2Agb3BlcmF0b3IgaW4gYHNhZmVUcnlgJ3MgYm9keS4gU2VlIGFsc28gYHNhZmVUcnlgLlxyXG4gICAgICovXHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHNhZmVVbndyYXBfMSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHlpZWxkIF9fYXdhaXQodGhpcy5fcHJvbWlzZS50aGVuKChyZXMpID0+IHJlcy5zYWZlVW53cmFwKCkpKSkpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBNYWtlcyBSZXN1bHRBc3luYyBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8UmVzdWx0PlxyXG4gICAgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcclxuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgX19hd2FpdCh0aGlzLl9wcm9taXNlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQoZXJyQXN5bmMocmVzdWx0LmVycm9yKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KHJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb2tBc3luYyA9ICh2YWx1ZSkgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgT2sodmFsdWUpKSk7XHJcbmNvbnN0IGVyckFzeW5jID0gKGVycikgPT4gbmV3IFJlc3VsdEFzeW5jKFByb21pc2UucmVzb2x2ZShuZXcgRXJyKGVycikpKTtcclxuY29uc3QgZnJvbVByb21pc2UgPSBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZTtcclxuY29uc3QgZnJvbVNhZmVQcm9taXNlID0gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlO1xyXG5jb25zdCBmcm9tQXN5bmNUaHJvd2FibGUgPSBSZXN1bHRBc3luYy5mcm9tVGhyb3dhYmxlO1xuXG4vKipcclxuICogU2hvcnQgY2lyY3VpdHMgb24gdGhlIEZJUlNUIEVyciB2YWx1ZSB0aGF0IHdlIGZpbmRcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRMaXN0ID0gKHJlc3VsdExpc3QpID0+IHtcclxuICAgIGxldCBhY2MgPSBvayhbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XHJcbiAgICAgICAgICAgIGFjYyA9IGVycihyZXN1bHQuZXJyb3IpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFjYy5tYXAoKGxpc3QpID0+IGxpc3QucHVzaChyZXN1bHQudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG59O1xyXG4vKiBUaGlzIGlzIHRoZSB0eXBlc2FmZSB2ZXJzaW9uIG9mIFByb21pc2UuYWxsXHJcbiAqXHJcbiAqIFRha2VzIGEgbGlzdCBvZiBSZXN1bHRBc3luYzxULCBFPiBhbmQgc3VjY2VzcyBpZiBhbGwgaW5uZXIgcmVzdWx0cyBhcmUgT2sgdmFsdWVzXHJcbiAqIG9yIGZhaWxzIGlmIG9uZSAob3IgbW9yZSkgb2YgdGhlIGlubmVyIHJlc3VsdHMgYXJlIEVyciB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3QgPSAoYXN5bmNSZXN1bHRMaXN0KSA9PiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRMaXN0KSkuYW5kVGhlbihjb21iaW5lUmVzdWx0TGlzdCk7XHJcbi8qKlxyXG4gKiBHaXZlIGEgbGlzdCBvZiBhbGwgdGhlIGVycm9ycyB3ZSBmaW5kXHJcbiAqL1xyXG5jb25zdCBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMgPSAocmVzdWx0TGlzdCkgPT4ge1xyXG4gICAgbGV0IGFjYyA9IG9rKFtdKTtcclxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdExpc3QpIHtcclxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzRXJyKCkpIHtcclxuICAgICAgICAgICAgYWNjLmVycm9yLnB1c2gocmVzdWx0LmVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRXJyKCkgJiYgYWNjLmlzT2soKSkge1xyXG4gICAgICAgICAgICBhY2MgPSBlcnIoW3Jlc3VsdC5lcnJvcl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNPaygpICYmIGFjYy5pc09rKCkpIHtcclxuICAgICAgICAgICAgYWNjLnZhbHVlLnB1c2gocmVzdWx0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gbm90aGluZyB3aGVuIHJlc3VsdC5pc09rKCkgJiYgYWNjLmlzRXJyKClcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbn07XHJcbmNvbnN0IGNvbWJpbmVSZXN1bHRBc3luY0xpc3RXaXRoQWxsRXJyb3JzID0gKGFzeW5jUmVzdWx0TGlzdCkgPT4gUmVzdWx0QXN5bmMuZnJvbVNhZmVQcm9taXNlKFByb21pc2UuYWxsKGFzeW5jUmVzdWx0TGlzdCkpLmFuZFRoZW4oY29tYmluZVJlc3VsdExpc3RXaXRoQWxsRXJyb3JzKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcclxudmFyIFJlc3VsdDtcclxuKGZ1bmN0aW9uIChSZXN1bHQpIHtcclxuICAgIC8qKlxyXG4gICAgICogV3JhcHMgYSBmdW5jdGlvbiB3aXRoIGEgdHJ5IGNhdGNoLCBjcmVhdGluZyBhIG5ldyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lXHJcbiAgICAgKiBhcmd1bWVudHMgYnV0IHJldHVybmluZyBgT2tgIGlmIHN1Y2Nlc3NmdWwsIGBFcnJgIGlmIHRoZSBmdW5jdGlvbiB0aHJvd3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gd3JhcCB3aXRoIG9rIG9uIHN1Y2Nlc3Mgb3IgZXJyIG9uIGZhaWx1cmVcclxuICAgICAqIEBwYXJhbSBlcnJvckZuIHdoZW4gYW4gZXJyb3IgaXMgdGhyb3duLCB0aGlzIHdpbGwgd3JhcCB0aGUgZXJyb3IgcmVzdWx0IGlmIHByb3ZpZGVkXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBmdW5jdGlvbiBmcm9tVGhyb3dhYmxlKGZuLCBlcnJvckZuKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyKGVycm9yRm4gPyBlcnJvckZuKGUpIDogZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmZyb21UaHJvd2FibGUgPSBmcm9tVGhyb3dhYmxlO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZShyZXN1bHRMaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZXN1bHRMaXN0KHJlc3VsdExpc3QpO1xyXG4gICAgfVxyXG4gICAgUmVzdWx0LmNvbWJpbmUgPSBjb21iaW5lO1xyXG4gICAgZnVuY3Rpb24gY29tYmluZVdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCkge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lUmVzdWx0TGlzdFdpdGhBbGxFcnJvcnMocmVzdWx0TGlzdCk7XHJcbiAgICB9XHJcbiAgICBSZXN1bHQuY29tYmluZVdpdGhBbGxFcnJvcnMgPSBjb21iaW5lV2l0aEFsbEVycm9ycztcclxufSkoUmVzdWx0IHx8IChSZXN1bHQgPSB7fSkpO1xyXG5jb25zdCBvayA9ICh2YWx1ZSkgPT4gbmV3IE9rKHZhbHVlKTtcclxuZnVuY3Rpb24gZXJyKGVycikge1xyXG4gICAgcmV0dXJuIG5ldyBFcnIoZXJyKTtcclxufVxyXG5mdW5jdGlvbiBzYWZlVHJ5KGJvZHkpIHtcclxuICAgIGNvbnN0IG4gPSBib2R5KCkubmV4dCgpO1xyXG4gICAgaWYgKG4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRBc3luYyhuLnRoZW4oKHIpID0+IHIudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuLnZhbHVlO1xyXG59XHJcbmNsYXNzIE9rIHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgaXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlzRXJyKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5pc09rKCk7XHJcbiAgICB9XHJcbiAgICBtYXAoZikge1xyXG4gICAgICAgIHJldHVybiBvayhmKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcEVycihfZikge1xyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaGVuKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBhbmRUaHJvdWdoKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLnZhbHVlKS5tYXAoKF92YWx1ZSkgPT4gdGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhbmRUZWUoZikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGYodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRlZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvayh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXHJcbiAgICBvckVsc2UoX2YpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luY0FuZFRoZW4oZikge1xyXG4gICAgICAgIHJldHVybiBmKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcclxuICAgIGFzeW5jQW5kVGhyb3VnaChmKSB7XHJcbiAgICAgICAgcmV0dXJuIGYodGhpcy52YWx1ZSkubWFwKCgpID0+IHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmNNYXAoZikge1xyXG4gICAgICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tU2FmZVByb21pc2UoZih0aGlzLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB1bndyYXBPcihfdikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbWF0Y2gob2ssIF9lcnIpIHtcclxuICAgICAgICByZXR1cm4gb2sodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzYWZlVW53cmFwKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS15aWVsZCAqL1xyXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKF8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuICAgIF91bnNhZmVVbndyYXBFcnIoY29uZmlnKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlTmV2ZXJUaHJvd0Vycm9yKCdDYWxsZWQgYF91bnNhZmVVbndyYXBFcnJgIG9uIGFuIE9rJywgdGhpcywgY29uZmlnKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgcmVxdWlyZS15aWVsZFxyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVyciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGlzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaXNFcnIoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzT2soKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG1hcChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICBtYXBFcnIoZikge1xyXG4gICAgICAgIHJldHVybiBlcnIoZih0aGlzLmVycm9yKSk7XHJcbiAgICB9XHJcbiAgICBhbmRUaHJvdWdoKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVycih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFuZFRlZShfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgYW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnIodGhpcy5lcnJvcik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgb3JFbHNlKGYpIHtcclxuICAgICAgICByZXR1cm4gZih0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jQW5kVGhlbihfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIGFzeW5jQW5kVGhyb3VnaChfZikge1xyXG4gICAgICAgIHJldHVybiBlcnJBc3luYyh0aGlzLmVycm9yKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFzeW5jTWFwKF9mKSB7XHJcbiAgICAgICAgcmV0dXJuIGVyckFzeW5jKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwT3Iodikge1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgbWF0Y2goX29rLCBlcnIpIHtcclxuICAgICAgICByZXR1cm4gZXJyKHRoaXMuZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgc2FmZVVud3JhcCgpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB5aWVsZCBlcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvIG5vdCB1c2UgdGhpcyBnZW5lcmF0b3Igb3V0IG9mIGBzYWZlVHJ5YCcpO1xyXG4gICAgICAgIH0pKCk7XHJcbiAgICB9XHJcbiAgICBfdW5zYWZlVW53cmFwKGNvbmZpZykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZU5ldmVyVGhyb3dFcnJvcignQ2FsbGVkIGBfdW5zYWZlVW53cmFwYCBvbiBhbiBFcnInLCB0aGlzLCBjb25maWcpO1xyXG4gICAgfVxyXG4gICAgX3Vuc2FmZVVud3JhcEVycihfKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBUaGlzIGlzIHN0cnVjdHVyYWxseSBlcXVpdmFsZW50IGFuZCBzYWZlXHJcbiAgICAgICAgeWllbGQgc2VsZjtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIFRoaXMgaXMgc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgYW5kIHNhZmVcclxuICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgIH1cclxufVxyXG5jb25zdCBmcm9tVGhyb3dhYmxlID0gUmVzdWx0LmZyb21UaHJvd2FibGU7XHJcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgeyBFcnIsIE9rLCBSZXN1bHQsIFJlc3VsdEFzeW5jLCBlcnIsIGVyckFzeW5jLCBmcm9tQXN5bmNUaHJvd2FibGUsIGZyb21Qcm9taXNlLCBmcm9tU2FmZVByb21pc2UsIGZyb21UaHJvd2FibGUsIG9rLCBva0FzeW5jLCBzYWZlVHJ5IH07XG4iLCAidHlwZSBKc29uYWJsZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCByZWFkb25seSBKc29uYWJsZVtdXG4gIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uYWJsZSB9XG4gIHwgeyB0b0pTT04oKTogSnNvbmFibGUgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQ/OiBKc29uYWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiBFcnJvcjsgY29udGV4dD86IEpzb25hYmxlIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBjYXVzZSwgY29udGV4dCB9ID0gb3B0aW9ucztcblxuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgV2ViU29ja2V0RXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBXZWJTb2NrZXRFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0XCI7XG59XG4iLCAiaW1wb3J0IHsgZXJyQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Nvbm5lY3Rpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IFNlcnZlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivc2VydmVyLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZyB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItY29uZmlnLnRzXCI7XG5cbi8qKlxuICogRW5zdXJlIGFuIGVycm9yIG1lc3NhZ2UgaXMgdHJhbnNmb3JtZWQgaW4gYW4gRXJyb3Igb2JqZWN0XG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZW5zdXJlRXJyb3IgPSAodmFsdWU6IHVua25vd24pOiBFcnJvciA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsdWU7XG5cbiAgbGV0IHN0cmluZ2lmaWVkID0gXCJbVW5hYmxlIHRvIHN0cmluZ2lmeSB0aGUgdGhyb3duIHZhbHVlXVwiO1xuICB0cnkge1xuICAgIHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcihzdHJpbmdpZmllZCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIEx1ZmkncyBjb25maWcgZnJvbSBpdHMgQVBJXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVXJsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgZmV0Y2hTZXJ2ZXJDb25maWcgPSAoXG4gIGluc3RhbmNlVXJsOiBVUkwsXG4pOiBSZXN1bHRBc3luYzxTZXJ2ZXJDb25maWcsIEVycm9yPiA9PiB7XG4gIGNvbnN0IG9yaWdpbk1hdGNoZXMgPSBpbnN0YW5jZVVybC5ocmVmLm1hdGNoKFxuICAgIC8oLio/KVxcLz8oPzpcXC9bZHJdezF9XFwvfGxvZ2luXFwvP3xmaWxlc1xcLz8pLyxcbiAgKTtcblxuICBjb25zdCB1cmxPcmlnaW4gPSBvcmlnaW5NYXRjaGVzICYmIG9yaWdpbk1hdGNoZXNbMV1cbiAgICA/IG9yaWdpbk1hdGNoZXNbMV1cbiAgICA6IGluc3RhbmNlVXJsLm9yaWdpbjtcblxuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgZmV0Y2godXJsT3JpZ2luICsgXCIvYWJvdXQvY29uZmlnXCIpLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDb25uZWN0aW9uRXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKS5hbmRUaGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICByZXNwb25zZS5qc29uKCksXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgICBuZXcgU2VydmVyRXJyb3IodW5kZWZpbmVkLCB7IGNvbnRleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEZW5vUnVudGltZSA9ICgpOiBib29sZWFuID0+IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgY29uc3QgaXNTZWN1cmVDb250ZXh0ID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpIHx8IGdsb2JhbFRoaXMuaXNTZWN1cmVDb250ZXh0IHx8XG4gICAgZ2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbn07XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJVcmwgPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBVUkwgPT4ge1xuICByZXR1cm4gaXNEZW5vUnVudGltZSgpXG4gICAgPyBuZXcgVVJMKGAuL3dvcmtlci8ke3JlbGF0aXZlUGF0aH0udHNgLCBuZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLmhyZWYpXG4gICAgOiBuZXcgVVJMKFxuICAgICAgaW1wb3J0Lm1ldGEucmVzb2x2ZShcbiAgICAgICAgYC4vJHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggIT09IFwiZW5jcnlwdFwiID8gYHdvcmtlci8ke3JlbGF0aXZlUGF0aH1gIDogcmVsYXRpdmVQYXRoXG4gICAgICAgIH0uanNgLFxuICAgICAgKSxcbiAgICApO1xufTtcbiIsICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7IFdPUktFUl9BQ1RJT04gfSBmcm9tIFwifi9lbnVtL3dvcmtlci1hY3Rpb24udHNcIjtcbmltcG9ydCB0eXBlIHsgTHVmaUZpbGUgfSBmcm9tIFwifi9lbnRpdGllcy9sdWZpLWZpbGUudHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWN0aW9uTWVzc2FnZSB9IGZyb20gXCJ+L2ludGVyZmFjZS93b3JrZXItYWN0aW9uLW1lc3NhZ2UudHNcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuaW1wb3J0IHsgVVBMT0FEX1NUQVRVUyB9IGZyb20gXCJ+L2VudW0vZmlsZS1zdGF0dXMudHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyRXZlbnQgfSBmcm9tIFwifi9pbnRlcmZhY2Uvd29ya2VyLWV2ZW50LnRzXCI7XG5cbmRlY2xhcmUgbGV0IHNlbGY6IFdvcmtlcjtcblxuZXhwb3J0IGNvbnN0IGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuLyoqXG4gKiBVcGRhdGUgZmlsZSBpbiB3b3JrZXJzIGFuZCBwcm92aWRlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gdGhyZWFkXG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUZpbGUgPSAobHVmaUZpbGU6IEx1ZmlGaWxlLCBhcmdzOiBQYXJ0aWFsPEx1ZmlGaWxlPikgPT4ge1xuICBPYmplY3QuYXNzaWduKGx1ZmlGaWxlLCBhcmdzKTtcblxuICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBldmVudDogRVZFTlQuRklMRV9VUERBVEVELFxuICAgICAgbHVmaUZpbGUsXG4gICAgfSBhcyBXb3JrZXJFdmVudCk7XG4gIH1cblxuICByZXR1cm4gbHVmaUZpbGU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZEZpbGVFcnJvciA9IChsdWZpRmlsZTogTHVmaUZpbGUsIGVycm9yOiBFcnJvcikgPT4ge1xuICB1cGRhdGVGaWxlKGx1ZmlGaWxlLCB7IHVwbG9hZFN0YXR1czogVVBMT0FEX1NUQVRVUy5GQUlMRUQgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvciB9IGFzIFdvcmtlckV2ZW50KTtcbn07XG5cbi8qKlxuICogSW5pdCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNoaWxkIHdvcmtlcidzIG9ubWVzc2FnZSBldmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gIGV2ZW50cy5vbmNlKEVWRU5ULlNPQ0tFVF9PUEVORUQsICgpID0+IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBFVkVOVC5TT0NLRVRfT1BFTkVELFxuICAgIH0pO1xuICB9KTtcblxuICBldmVudHMub25jZShFVkVOVC5PUEVSQVRJT05fRkFJTEVELCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvciB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNXb3JrZXJBY3Rpb25NZXNzYWdlID0gKFxuICAvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICBtZXNzYWdlOiBhbnksXG4pOiBtZXNzYWdlIGlzIFdvcmtlckFjdGlvbk1lc3NhZ2UgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBtZXNzYWdlID09PSBcIm9iamVjdFwiICYmXG4gICAgbWVzc2FnZSAhPT0gbnVsbCAmJlxuICAgIFwiYWN0aW9uXCIgaW4gbWVzc2FnZSAmJlxuICAgIE9iamVjdC52YWx1ZXMoV09SS0VSX0FDVElPTikuaW5jbHVkZXMobWVzc2FnZS5hY3Rpb24pXG4gICk7XG59O1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgImltcG9ydCB7XG4gIERlY29kZSBhcyBiNjRkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjRlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjRcIjtcbmltcG9ydCB7IGVyckFzeW5jLCBva0FzeW5jLCBSZXN1bHRBc3luYyB9IGZyb20gXCJuZXZlcnRocm93XCI7XG5pbXBvcnQgc2pjbCBmcm9tIFwibHVmaS1zamNsXCI7XG5pbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IENyeXB0b0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2NyeXB0by1lcnJvci50c1wiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBFbmNyeXB0ZWREYXRhIG9yIGEgc3RyaW5nIHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkRGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICBlbmNyeXB0ZWREYXRhOiBFbmNyeXB0ZWREYXRhIHwgc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgZW5jcnlwdGVkRGF0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBlbmNyeXB0ZWREYXRhXG4gICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNyeXB0ZWREYXRhLmRhdGEgYXMgQXJyYXlCdWZmZXIpO1xuXG4gICAgcmV0dXJuIG9rQXN5bmMoYjY0ZGVjb2RlKHNqY2wuZGVjcnlwdChrZXksIGRhdGEpKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IERlY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuY3J5cHQgYW4gQXJyYXlCdWZmZXIgaW50byBhbiBFbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gc2pjbC5lbmNyeXB0KGtleSwgYjY0ZW5jb2RlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gb2tBc3luYyh7XG4gICAgICBhbGdvOiBDcnlwdG9BbGdvcml0aG0uU2pjbCxcbiAgICAgIGRhdGE6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlbmNyeXB0ZWQpLmJ1ZmZlcixcbiAgICAgIGl2OiBKU09OLnBhcnNlKGVuY3J5cHRlZCBhcyB1bmtub3duIGFzIHN0cmluZykuaXYsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IEVuY3J5cHRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZyB1c2luZyBTamNsIEFQSVxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9ICgpOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoc2pjbC5yYW5kb20ucmFuZG9tV29yZHMoOCwgMTApKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVyckFzeW5jKFxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIGtleVwiLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyBTamNsIEFQSVxuICpcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc2hQYXNzd29yZCA9IChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgSGFzaGluZ0Vycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9rQXN5bmMoc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoc2pjbC5oYXNoLnNoYTUxMi5oYXNoKHBhc3N3b3JkKSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhuZXcgSGFzaGluZ0Vycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIGtleSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgU2pjbC4gU2luY2Ugd2UncmUgbm90IGdlbmVyYXRpbmcgYW4gZXF1YWwgc3ltYm9sIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBXZWJDcnlwdG8gQVBJIChieSB1c2luZyBiYXNlNjR1cmwpLCBpdCdzIGVhc3kgdG8gZGV0ZWN0XG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2pjbEtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4ga2V5W2tleS5sZW5ndGggLSAxXSA9PT0gXCI9XCI7XG59O1xuIiwgImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2Jhc2UtZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIENyeXB0b0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWNyeXB0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2U6IHN0cmluZyA9IFwiVW5hYmxlIHRvIGRlY3J5cHQgdGhlIHByb3ZpZGVkIGRhdGFcIjtcbn1cbiIsICJpbXBvcnQgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRpb25FcnJvciBleHRlbmRzIENyeXB0b0Vycm9yIHtcbiAgb3ZlcnJpZGUgbWVzc2FnZTogc3RyaW5nID0gXCJVbmFibGUgdG8gZW5jcnlwdCB0aGUgcHJvdmlkZWQgZGF0YVwiO1xufVxuIiwgImltcG9ydCB7XG4gIERlY29kZSBhcyBiNjR1cmxkZWNvZGUsXG4gIEVuY29kZSBhcyBiNjR1cmxlbmNvZGUsXG59IGZyb20gXCJhcnJheWJ1ZmZlci1lbmNvZGluZy9iYXNlNjQvdXJsXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCB7IENyeXB0b0FsZ29yaXRobSB9IGZyb20gXCJ+L2VudW0vY3J5cHRvLWFsZ29yaXRobS50c1wiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkVycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2RlY3J5cHRpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcbmltcG9ydCB7IEhhc2hpbmdFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9oYXNoaW5nLWVycm9yLnRzXCI7XG5cbi8qKlxuICogRGVjcnlwdCBhbiBlbmNyeXB0ZWREYXRhIHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvblxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkOiBFbmNyeXB0ZWREYXRhLFxuKTogUmVzdWx0QXN5bmM8QXJyYXlCdWZmZXIsIERlY3J5cHRpb25FcnJvcj4gPT4ge1xuICByZXR1cm4gaW1wb3J0S2V5KGtleSkuYW5kVGhlbigoaW1wb3J0ZWRLZXkpID0+XG4gICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICBpdjogZW5jcnlwdGVkLml2IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgIH0sXG4gICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICBlbmNyeXB0ZWQuZGF0YSBhcyBBcnJheUJ1ZmZlcixcbiAgICAgICksXG4gICAgICAoZXJyb3IpID0+IG5ldyBEZWNyeXB0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgKVxuICApO1xufTtcblxuLyoqXG4gKiBFbmNyeXB0IGFuIEFycmF5QnVmZmVyIGludG8gYW4gRW5jcnlwdGVkRGF0YSB1c2luZyB0aGUgcHJvdmlkZWQga2V5XG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuKTogUmVzdWx0QXN5bmM8RW5jcnlwdGVkRGF0YSwgRW5jcnlwdGlvbkVycm9yPiA9PiB7XG4gIHJldHVybiBpbXBvcnRLZXkoa2V5KS5hbmRUaGVuKChpbXBvcnRlZEtleSkgPT4ge1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxMikpO1xuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgIGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgIGl2LFxuICAgICAgICB9LFxuICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICApLFxuICAgICAgKGVycm9yKSA9PlxuICAgICAgICBuZXcgRW5jcnlwdGlvbkVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIH0pLFxuICAgICkuYW5kVGhlbigoZW5jcnlwdGVkKSA9PiB7XG4gICAgICByZXR1cm4gb2tBc3luYyh7XG4gICAgICAgIGFsZ286IENyeXB0b0FsZ29yaXRobS5XZWJDcnlwdG8sXG4gICAgICAgIGRhdGE6IGVuY3J5cHRlZCxcbiAgICAgICAgaXYsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhIHN0cmluZyBpbnRvIGEgQ3J5cHRvS2V5LCB1c2FibGUgaW4gV2ViIENyeXB0byBBUElcbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaW1wb3J0S2V5ID0gKGtleTogc3RyaW5nKTogUmVzdWx0QXN5bmM8Q3J5cHRvS2V5LCBDcnlwdG9FcnJvcj4gPT4ge1xuICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInJhd1wiLFxuICAgICAgYjY0dXJsZGVjb2RlKGtleSksXG4gICAgICB7IG5hbWU6IFwiQUVTLUdDTVwiIH0sXG4gICAgICBmYWxzZSxcbiAgICAgIFtcbiAgICAgICAgXCJlbmNyeXB0XCIsXG4gICAgICAgIFwiZGVjcnlwdFwiLFxuICAgICAgXSxcbiAgICApLFxuICAgIChlcnJvcikgPT5cbiAgICAgIG5ldyBDcnlwdG9FcnJvcihcIlVuYWJsZSB0byBpbXBvcnQgY3J5cHRvZ3JhcGh5IGtleVwiLCB7XG4gICAgICAgIGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gc3RyaW5nIHVzaW5nIFdlYiBDcnlwdG8gQVBJLlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleSA9ICgpOiBSZXN1bHRBc3luYzxzdHJpbmcsIENyeXB0b0Vycm9yPiA9PiB7XG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgY3J5cHRvLnN1YnRsZVxuICAgICAgICAuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICBsZW5ndGg6IDI1NixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0sXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oKGdlbmVyYXRlZEtleSkgPT5cbiAgICAgICAgICBjcnlwdG8uc3VidGxlXG4gICAgICAgICAgICAuZXhwb3J0S2V5KFwicmF3XCIsIGdlbmVyYXRlZEtleSlcbiAgICAgICAgICAgIC50aGVuKChrZXkpID0+IHJlc29sdmUoYjY0dXJsZW5jb2RlKGtleSkpKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGJhc2U2NCBlbmNvZGUgdGhlIHVybFwiLCB7XG4gICAgICAgICAgICAgICAgICBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKVxuICAgICksXG4gICAgKGVycm9yKSA9PlxuICAgICAgbmV3IENyeXB0b0Vycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIGtleVwiLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEhhc2ggYSBwYXNzd29yZCB1c2luZyBXZWJDcnlwdG8gQVBJXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaGFzaFBhc3N3b3JkID0gKFxuICBwYXNzd29yZDogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBIYXNoaW5nRXJyb3I+ID0+IHtcbiAgY29uc3QgcHJvbWlzZSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcbiAgICAgICAgICBcIlNIQS01MTJcIixcbiAgICAgICAgICBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGFzc3dvcmQpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBwcm9taXNlKCksXG4gICAgKGVycm9yKSA9PiBuZXcgSGFzaGluZ0Vycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICApO1xufTtcbiIsICJpbXBvcnQgeyBDcnlwdG9BbGdvcml0aG0gfSBmcm9tIFwifi9lbnVtL2NyeXB0by1hbGdvcml0aG0udHNcIjtcbmltcG9ydCB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB0eXBlIHsgQ3J5cHRvRXJyb3IgfSBmcm9tIFwifi9lcnJvci9jcnlwdG8vY3J5cHRvLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IERlY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9kZWNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEVuY3J5cHRpb25FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9lbmNyeXB0aW9uLWVycm9yLnRzXCI7XG5pbXBvcnQgeyB0eXBlIEVuY3J5cHRlZERhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2UvZW5jcnlwdGVkLWRhdGEudHNcIjtcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSBcIn4vYXBpL2NyeXB0by9zamNsLnRzXCI7XG5pbXBvcnQgKiBhcyB3ZWIgZnJvbSBcIn4vYXBpL2NyeXB0by93ZWIudHNcIjtcbmltcG9ydCB0eXBlIHsgSGFzaGluZ0Vycm9yIH0gZnJvbSBcIn4vZXJyb3IvY3J5cHRvL2hhc2hpbmctZXJyb3IudHNcIjtcblxuLyoqXG4gKiBEZWNyeXB0IGFuIEVuY3J5cHRlZERhdGEgb2JqZWN0IHVzaW5nIHRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvblxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY3J5cHQgPSAoXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogRW5jcnlwdGVkRGF0YSxcbik6IFJlc3VsdEFzeW5jPEFycmF5QnVmZmVyLCBEZWNyeXB0aW9uRXJyb3I+ID0+XG4gIHZhbHVlLmFsZ28gPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5hbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbFxuICAgID8gc2pjbC5kZWNyeXB0KGtleSwgdmFsdWUpXG4gICAgOiB3ZWIuZGVjcnlwdChrZXksIHZhbHVlKTtcblxuLyoqXG4gKiBFbmNyeXB0IGFuIEFycmF5QnVmZmVyIHVzaW5nIHRoZSBwcm92aWRlZCBrZXkgYW5kIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNyeXB0ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IEFycmF5QnVmZmVyLFxuICBhbGdvOiBDcnlwdG9BbGdvcml0aG0sXG4pOiBSZXN1bHRBc3luYzxFbmNyeXB0ZWREYXRhLCBFbmNyeXB0aW9uRXJyb3I+ID0+XG4gIChhbGdvID09PSBDcnlwdG9BbGdvcml0aG0uU2pjbClcbiAgICA/IHNqY2wuZW5jcnlwdChrZXksIHZhbHVlKVxuICAgIDogd2ViLmVuY3J5cHQoa2V5LCB2YWx1ZSk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBuZXcga2V5IGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb25cbiAqXG4gKiBAcGFyYW0gYWxnb1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5ID0gKFxuICBhbGdvID0gQ3J5cHRvQWxnb3JpdGhtLldlYkNyeXB0byxcbik6IFJlc3VsdEFzeW5jPHN0cmluZywgQ3J5cHRvRXJyb3I+ID0+XG4gIGFsZ28gPT09IENyeXB0b0FsZ29yaXRobS5TamNsID8gc2pjbC5nZW5lcmF0ZUtleSgpIDogd2ViLmdlbmVyYXRlS2V5KCk7XG5cbi8qKlxuICogSGFzaCBhIHBhc3N3b3JkIHVzaW5nIHRoZSBwcm92aWRlZCBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEBwYXJhbSBhbGdvXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaGFzaFBhc3N3b3JkID0gKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBhbGdvOiBDcnlwdG9BbGdvcml0aG0sXG4pOiBSZXN1bHRBc3luYzxzdHJpbmcsIEhhc2hpbmdFcnJvcj4gPT5cbiAgYWxnbyA9PT0gQ3J5cHRvQWxnb3JpdGhtLlNqY2xcbiAgICA/IHNqY2wuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKVxuICAgIDogd2ViLmhhc2hQYXNzd29yZChwYXNzd29yZCk7XG4iLCAiaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IEx1ZmlGaWxlIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1maWxlLnRzXCI7XG5pbXBvcnQgeyBFVkVOVCB9IGZyb20gXCJ+L2VudW0vZXZlbnQudHNcIjtcbmltcG9ydCB7IFVQTE9BRF9TVEFUVVMgfSBmcm9tIFwifi9lbnVtL2ZpbGUtc3RhdHVzLnRzXCI7XG5pbXBvcnQgeyBTb2NrZXRQYXRoIH0gZnJvbSBcIn4vZW51bS9zb2NrZXQtcGF0aC50c1wiO1xuaW1wb3J0IHsgVXBsb2FkRXJyb3IgfSBmcm9tIFwifi9lcnJvci91cGxvYWQvdXBsb2FkLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IgfSBmcm9tIFwifi9lcnJvci93ZWJzb2NrZXQvd2Vic29ja2V0LWNvbm5lY3Rpb24tZXJyb3IudHNcIjtcbmltcG9ydCB7IFdlYlNvY2tldEVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd2Vic29ja2V0L3dlYnNvY2tldC1lcnJvci50c1wiO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRVcGxvYWRDaHVua01ldGFkYXRhIH0gZnJvbSBcIn4vaW50ZXJmYWNlL2NsaWVudC11cGxvYWQtY2h1bmstbWV0YWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgRW5jcnlwdGVkRGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9lbmNyeXB0ZWQtZGF0YS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJDYW5jZWxNZXRhZGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItY2FuY2VsLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckRvd25sb2FkQ2h1bmtTdWNjZXNzTWV0YWRhdGEgfSBmcm9tIFwifi9pbnRlcmZhY2Uvc2VydmVyLWRvd25sb2FkLWNodW5rLXN1Y2Nlc3MtbWV0YWRhdGEudHNcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyVXBsb2FkQ2h1bmtNZXRhZGF0YSB9IGZyb20gXCJ+L2ludGVyZmFjZS9zZXJ2ZXItdXBsb2FkLWNodW5rLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckRvd25sb2FkQ2h1bmtNZXRhZGF0YSB9IGZyb20gXCJ+L3R5cGUvc2VydmVyLWRvd25sb2FkLWNodW5rLW1ldGFkYXRhLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gXCJ+L3V0aWxzLnRzXCI7XG5pbXBvcnQgeyBldmVudHMsIHVwZGF0ZUZpbGUgfSBmcm9tIFwifi93b3JrZXIvc2hhcmVkLnRzXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIn4vYXBpL2NyeXB0by50c1wiO1xuaW1wb3J0IHtcbiAgRGVjb2RlIGFzIGI2NGRlY29kZSxcbiAgRW5jb2RlIGFzIGI2NGVuY29kZSxcbn0gZnJvbSBcImFycmF5YnVmZmVyLWVuY29kaW5nL2Jhc2U2NFwiO1xuXG5leHBvcnQgY29uc3Qgc29ja2V0czoge1xuICBba2V5OiBzdHJpbmddOiBXZWJTb2NrZXQ7XG59ID0ge307XG5cbmNvbnN0IE1BWF9FUlJPUlMgPSA1O1xuXG4vKipcbiAqIEhhbmRsZSBXZWJTb2NrZXQgcmVzcG9uc2UgZm9yIGNhbmNlbCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uQ2FuY2VsTWVzc2FnZSA9IChcbiAgZGF0YTogU2VydmVyQ2FuY2VsTWV0YWRhdGEsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBFcnJvcj4gPT4ge1xuICBldmVudHMuZW1pdChFVkVOVC5VUExPQURfQ0FOQ0VMTEVELCBkYXRhLnN1Y2Nlc3MpO1xuXG4gIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG59O1xuXG4vKipcbiAqIEhhbmRsZSBXZWJTb2NrZXQgcmVzcG9uc2UgZm9yIGRvd25sb2FkIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0gcmVzcG9uc2VcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuY29uc3Qgb25Eb3dubG9hZE1lc3NhZ2UgPSAoXG4gIHJlc3BvbnNlOiBzdHJpbmcsXG4gIGx1ZmlGaWxlOiBMdWZpRmlsZSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnNwbGl0KFwiWFhNT0pPWFhcIik7XG4gIGNvbnN0IG1ldGFkYXRhU3RyaW5nID0gcmVzdWx0LnNoaWZ0KCk7XG5cbiAgaWYgKG1ldGFkYXRhU3RyaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UobWV0YWRhdGFTdHJpbmcpIGFzIFNlcnZlckRvd25sb2FkQ2h1bmtNZXRhZGF0YTtcblxuICAgIGlmIChpc1NlcnZlckRvd25sb2FkQ2h1bmtTdWNjZXNzTWV0YWRhdGEobWV0YWRhdGEpKSB7XG4gICAgICBjb25zdCBkYXRhU3RyaW5nID0gcmVzdWx0LnNoaWZ0KCk7XG5cbiAgICAgIGlmIChkYXRhU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZERhdGE6IEVuY3J5cHRlZERhdGEgPSBKU09OLnBhcnNlKGRhdGFTdHJpbmcpO1xuXG4gICAgICAgIC8vIElmIGZpbGUgd2FzIHVwbG9hZGVkIHVzaW5nIEx1ZmkgQVBJXG4gICAgICAgIGlmIChlbmNyeXB0ZWREYXRhLml2KSB7XG4gICAgICAgICAgZW5jcnlwdGVkRGF0YS5pdiA9IG5ldyBVaW50OEFycmF5KE9iamVjdC52YWx1ZXMoZW5jcnlwdGVkRGF0YS5pdikpO1xuICAgICAgICAgIGVuY3J5cHRlZERhdGEuZGF0YSA9IGI2NGRlY29kZShlbmNyeXB0ZWREYXRhLmRhdGEgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcnlwdG8uZGVjcnlwdChsdWZpRmlsZS5rZXlzLmNsaWVudCwgZW5jcnlwdGVkRGF0YSkuYW5kVGhlbihcbiAgICAgICAgICAoZGVjcnlwdGVkUGFydCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdHlwZW9mIGRlY3J5cHRlZFBhcnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyAobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRlY3J5cHRlZFBhcnQpLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcilcbiAgICAgICAgICAgICAgOiBkZWNyeXB0ZWRQYXJ0O1xuXG4gICAgICAgICAgICAvLyBJZiBmaXJzdCBjaHVua1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnBhcnQgPT09IDApIHtcbiAgICAgICAgICAgICAgdXBkYXRlRmlsZShsdWZpRmlsZSwge1xuICAgICAgICAgICAgICAgIGNodW5rc1JlYWR5OiBsdWZpRmlsZS5jaHVua3NSZWFkeSArIDEsXG4gICAgICAgICAgICAgICAgZGVsQXRGaXJzdFZpZXc6IG1ldGFkYXRhLmRlbF9hdF9maXJzdF92aWV3LFxuICAgICAgICAgICAgICAgIGRlbGF5OiBtZXRhZGF0YS5kZWxheSxcbiAgICAgICAgICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIHNpemU6IG1ldGFkYXRhLnNpemUsXG4gICAgICAgICAgICAgICAgdG90YWxDaHVua3M6IG1ldGFkYXRhLnRvdGFsLFxuICAgICAgICAgICAgICAgIHR5cGU6IG1ldGFkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgemlwcGVkOiBtZXRhZGF0YS56aXBwZWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULkRPV05MT0FEX1NUQVJURUQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXBkYXRlRmlsZShsdWZpRmlsZSwgeyBjaHVua3NSZWFkeTogbHVmaUZpbGUuY2h1bmtzUmVhZHkgKyAxIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmVudHMuZW1pdChFVkVOVC5DSFVOS19ET1dOTE9BREVELCBidWZmZXIsIG1ldGFkYXRhLnBhcnQpO1xuXG4gICAgICAgICAgICBpZiAobHVmaUZpbGUuY2h1bmtzUmVhZHkgPT09IG1ldGFkYXRhLnRvdGFsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbmREb3dubG9hZChsdWZpRmlsZSkuYW5kVGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuRE9XTkxPQURfQ09NUExFVEUpO1xuICAgICAgICAgICAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULlNPQ0tFVF9PUEVSQVRJT05fVEVSTUlOQVRFRCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViU29ja2V0RXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgcmV0cmlldmUgbWV0YWRhdGEgZnJvbSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXJcIixcbiAgICAgICAgKTtcblxuICAgICAgICBldmVudHMuZW1pdChFVkVOVC5PUEVSQVRJT05fRkFJTEVELCBlcnJvcik7XG4gICAgICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKG1ldGFkYXRhLm1zZyk7XG5cbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcbiAgICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKFxuICAgICAgXCJDYW5ub3QgcmV0cmlldmUgbWV0YWRhdGEgZnJvbSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXJcIixcbiAgICApO1xuXG4gICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuICAgIHJldHVybiBlcnJBc3luYyhlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogSGFuZGxlIFdlYlNvY2tldCByZXNwb25zZSBmb3IgdXBsb2FkIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0gcmVzcG9uc2VcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuY29uc3Qgb25VcGxvYWRNZXNzYWdlID0gKFxuICByZXNwb25zZTogU2VydmVyVXBsb2FkQ2h1bmtNZXRhZGF0YSxcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgVXBsb2FkRXJyb3I+ID0+IHtcbiAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAvLyBJZiBmaXJzdCBjaHVua1xuICAgIGlmIChyZXNwb25zZS5qID09PSAwKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oYFVwbG9hZCBvZiAke2x1ZmlGaWxlLmtleXMuY2xpZW50fSBzdGFydGVkYCk7XG5cbiAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHtcbiAgICAgICAga2V5czogeyBjbGllbnQ6IGx1ZmlGaWxlLmtleXMuY2xpZW50LCBzZXJ2ZXI6IHJlc3BvbnNlLnNob3J0IH0sXG4gICAgICAgIGFjdGlvblRva2VuOiByZXNwb25zZS50b2tlbixcbiAgICAgICAgcXVldWVJbmRleDogcmVzcG9uc2UuaSxcbiAgICAgIH0pO1xuXG4gICAgICBldmVudHMuZW1pdChFVkVOVC5VUExPQURfU1RBUlRFRCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRmlsZShsdWZpRmlsZSwge1xuICAgICAgY2h1bmtzUmVhZHk6IGx1ZmlGaWxlLmNodW5rc1JlYWR5ICsgMSxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZF9hdCxcbiAgICB9KTtcblxuICAgIGV2ZW50cy5lbWl0KEVWRU5ULkNIVU5LX1VQTE9BREVEKTtcblxuICAgIGlmIChsdWZpRmlsZS5jaHVua3NSZWFkeSA9PT0gbHVmaUZpbGUudG90YWxDaHVua3MpIHtcbiAgICAgIHVwZGF0ZUZpbGUobHVmaUZpbGUsIHsgdXBsb2FkU3RhdHVzOiBVUExPQURfU1RBVFVTLkNPTVBMRVRFIH0pO1xuXG4gICAgICBldmVudHMuZW1pdChFVkVOVC5VUExPQURfQ09NUExFVEUpO1xuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuU09DS0VUX09QRVJBVElPTl9URVJNSU5BVEVEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKHJlc3BvbnNlLm1zZyk7XG4gICAgZXZlbnRzLmVtaXQoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgZXJyb3IpO1xuXG4gICAgcmV0dXJuIGVyckFzeW5jKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgb24gc29ja2V0cyBcIm9ubWVzc2FnZVwiIGV2ZW50XG4gKlxuICogQHBhcmFtIGVcbiAqIEBwYXJhbSBzb2NrZXRVcmxcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IG9uTWVzc2FnZSA9IChcbiAgZTogTWVzc2FnZUV2ZW50LFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBVcGxvYWRFcnJvcj4gPT4ge1xuICBjb25zdCBkYXRhID0gdHJ5UGFyc2VKc29uKGUuZGF0YSk7XG5cbiAgbGV0IGNhbGxiYWNrO1xuXG4gIGlmIChkYXRhKSB7XG4gICAgaWYgKCFkYXRhLmFjdGlvbiAmJiBkYXRhLm1zZykge1xuICAgICAgLy8gSWYgZXJyb3JcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFdlYlNvY2tldEVycm9yKGRhdGEubXNnKTtcbiAgICAgIGV2ZW50cy5lbWl0KEVWRU5ULk9QRVJBVElPTl9GQUlMRUQsIGVycm9yKTtcblxuICAgICAgcmV0dXJuIGVyckFzeW5jKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFwiZGVsYXlcIiBpbiBkYXRhKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb25VcGxvYWRNZXNzYWdlKGRhdGEsIGx1ZmlGaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gb25DYW5jZWxNZXNzYWdlKGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayA9IG9uRG93bmxvYWRNZXNzYWdlKGUuZGF0YSwgbHVmaUZpbGUpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBJcyBzb2NrZXQgY29ubmVjdGluZz9cbiAqXG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNDb25uZWN0aW5nID0gKHNvY2tldEtleTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICBzb2NrZXRzICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldICE9PSB1bmRlZmluZWQgJiZcbiAgc29ja2V0c1tzb2NrZXRLZXldLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HO1xuXG4vKipcbiAqIElzIHNvY2tldCBzcGF3bmVkP1xuICpcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NwYXduZWQgPSAoc29ja2V0S2V5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gIHNvY2tldHMgIT09IHVuZGVmaW5lZCAmJlxuICBzb2NrZXRzW3NvY2tldEtleV0gIT09IHVuZGVmaW5lZCAmJlxuICBzb2NrZXRzW3NvY2tldEtleV0ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG5cbi8qKlxuICogQXNrIFdlYlNvY2tldCB0byBjYW5jZWwgYW4gdXBsb2FkXG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgY2FuY2VsVXBsb2FkID0gKFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgdXBsb2FkU29ja2V0VXJsKGx1ZmlGaWxlKSxcbiAgICBsdWZpRmlsZSxcbiAgICBgJHtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgaWQ6IGx1ZmlGaWxlLmtleXMuc2VydmVyLFxuICAgICAgICBtb2RfdG9rZW46IGx1ZmlGaWxlLmFjdGlvblRva2VuLFxuICAgICAgICBjYW5jZWw6IHRydWUsXG4gICAgICAgIGk6IGx1ZmlGaWxlLnF1ZXVlSW5kZXgsXG4gICAgICB9KVxuICAgIH1YWE1PSk9YWHVzZWxlc3NgLFxuICApO1xufTtcblxuLyoqXG4gKiBEb3dubG9hZCBhIHBhcnQgb2YgdGhlIGZpbGUgdGhyb3VnaCB0aGUgV2ViU29ja2V0XG4gKlxuICogQHBhcmFtIGx1ZmlGaWxlXG4gKiBAcGFyYW0gY2h1bmtOdW1iZXJcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkb3dubG9hZENodW5rID0gKFxuICBsdWZpRmlsZTogTHVmaUZpbGUsXG4gIGNodW5rTnVtYmVyOiBudW1iZXIsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBsZXQgbWVzc2FnZTtcblxuICBpZiAobHVmaUZpbGUucGFzc3dvcmQpIHtcbiAgICBtZXNzYWdlID0geyBwYXJ0OiBjaHVua051bWJlciwgZmlsZV9wd2Q6IGx1ZmlGaWxlLnBhc3N3b3JkIH07XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IHsgcGFydDogY2h1bmtOdW1iZXIgfTtcbiAgfVxuXG4gIHJldHVybiBzZW5kTWVzc2FnZShcbiAgICBkb3dubG9hZFNvY2tldFVybChsdWZpRmlsZSksXG4gICAgbHVmaUZpbGUsXG4gICAgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksXG4gICk7XG59O1xuXG4vKipcbiAqIFRlbGwgdGhlIFdlYlNvY2tldCB0aGUgZG93bmxvYWQgZW5kZWRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBlbmREb3dubG9hZCA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+IHtcbiAgbGV0IG1lc3NhZ2U6IHsgZW5kZWQ6IHRydWU7IGZpbGVfcHdkPzogc3RyaW5nIH07XG5cbiAgaWYgKGx1ZmlGaWxlLnBhc3N3b3JkKSB7XG4gICAgbWVzc2FnZSA9IHsgZW5kZWQ6IHRydWUsIGZpbGVfcHdkOiBsdWZpRmlsZS5wYXNzd29yZCB9O1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSB7IGVuZGVkOiB0cnVlIH07XG4gIH1cblxuICByZXR1cm4gc2VuZE1lc3NhZ2UoXG4gICAgZG93bmxvYWRTb2NrZXRVcmwobHVmaUZpbGUpLFxuICAgIGx1ZmlGaWxlLFxuICAgIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLFxuICApO1xufTtcblxuLyoqXG4gKiBVcGxvYWQgYSBjaHVuayBvZiB0aGUgZmlsZSB0aHJvdWdoIHRoZSBXZWJTb2NrZXRcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEBwYXJhbSBtZXRhZGF0YVxuICogQHBhcmFtIGVuY3J5cHRlZERhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB1cGxvYWRDaHVuayA9IChcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuICBtZXRhZGF0YTogQ2xpZW50VXBsb2FkQ2h1bmtNZXRhZGF0YSxcbiAgZW5jcnlwdGVkRGF0YTogRW5jcnlwdGVkRGF0YSxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIFdlYlNvY2tldEVycm9yPiA9PiB7XG4gIGVuY3J5cHRlZERhdGEuZGF0YSA9IGI2NGVuY29kZShlbmNyeXB0ZWREYXRhLmRhdGEgYXMgQXJyYXlCdWZmZXIpO1xuXG4gIHJldHVybiBzZW5kTWVzc2FnZShcbiAgICB1cGxvYWRTb2NrZXRVcmwobHVmaUZpbGUpLFxuICAgIGx1ZmlGaWxlLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KG1ldGFkYXRhKX1YWE1PSk9YWCR7SlNPTi5zdHJpbmdpZnkoZW5jcnlwdGVkRGF0YSl9YCxcbiAgKTtcbn07XG5cbi8qKlxuICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFdlYlNvY2tldFxuICpcbiAqIEBwYXJhbSBzb2NrZXRVcmxcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcGFyYW0gaGFzUHJpb3JpdHlcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IHNlbmRNZXNzYWdlID0gKFxuICBzb2NrZXRVcmw6IHN0cmluZyxcbiAgbHVmaUZpbGU6IEx1ZmlGaWxlLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBpZiAoIWlzU3Bhd25lZChzb2NrZXRVcmwpKSB7XG4gICAgcmV0dXJuIHNwYXduKHNvY2tldFVybCkuYW5kVGhlbigoKSA9PiB7XG4gICAgICBzb2NrZXRzW3NvY2tldFVybF0ub25tZXNzYWdlID0gKGUpID0+IG9uTWVzc2FnZShlLCBsdWZpRmlsZSk7XG4gICAgICByZXR1cm4gc2VuZE1lc3NhZ2Uoc29ja2V0VXJsLCBsdWZpRmlsZSwgbWVzc2FnZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc29ja2V0c1tzb2NrZXRVcmxdLnNlbmQobWVzc2FnZSk7XG5cbiAgICByZXR1cm4gb2tBc3luYyh1bmRlZmluZWQpO1xuICB9XG59O1xuXG4vKipcbiAqIFNwYXduIGEgbmV3IFdlYlNvY2tldCBvciByZXVzZSBhbiBleGlzdGluZyBvbmUuXG4gKlxuICogQHBhcmFtIHNvY2tldEtleVxuICogQHBhcmFtIGVycm9yQ291bnRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBzcGF3biA9IChcbiAgc29ja2V0S2V5OiBzdHJpbmcsXG4gIGVycm9yQ291bnQgPSAwLFxuKTogUmVzdWx0QXN5bmM8c3RyaW5nLCBXZWJTb2NrZXRFcnJvcj4gPT4ge1xuICBpZiAoIWlzU3Bhd25lZChzb2NrZXRLZXkpICYmICFpc0Nvbm5lY3Rpbmcoc29ja2V0S2V5KSkge1xuICAgIC8vIGNvbnNvbGUuaW5mbyhgU3Bhd25pbmcgV2ViU29ja2V0ICR7c29ja2V0VXJsfWApO1xuICAgIHNvY2tldHNbc29ja2V0S2V5XSA9IG5ldyBXZWJTb2NrZXQoc29ja2V0S2V5KTtcblxuICAgIGV2ZW50cy5vbmNlKEVWRU5ULlNPQ0tFVF9PUEVSQVRJT05fVEVSTUlOQVRFRCwgKCkgPT4ge1xuICAgICAgc29ja2V0c1tzb2NrZXRLZXldLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBldmVudHMub25jZShFVkVOVC5PUEVSQVRJT05fRkFJTEVELCAoKSA9PiB7XG4gICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT1BFUkFUSU9OX1RFUk1JTkFURUQpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0c1tzb2NrZXRLZXldLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbyhgV2Vic29ja2V0ICR7c29ja2V0S2V5fSBoYXMgYmVlbiBvcGVuYCk7XG4gICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT1BFTkVEKTtcbiAgICB9O1xuXG4gICAgc29ja2V0c1tzb2NrZXRLZXldLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oYFdlYnNvY2tldCAke3NvY2tldEtleX0gaGFzIGJlZW4gY2xvc2VkYCk7XG4gICAgfTtcblxuICAgIHNvY2tldHNbc29ja2V0S2V5XS5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgaWYgKCsrZXJyb3JDb3VudCA8PSBNQVhfRVJST1JTKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYEFuIGVycm9yIGhhcHBlbmVkIHdoaWxlIHRyeWluZyB0byBjb25uZWN0IHRvIFdlYlNvY2tldCBcIiR7c29ja2V0S2V5fVwiLiBUcnlpbmcgYWdhaW4uICR7ZXJyb3JDb3VudH0gLyAke01BWF9FUlJPUlN9YCxcbiAgICAgICAgICAoZXZlbnQgYXMgRXJyb3JFdmVudCkuZXJyb3IsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHNwYXduKHNvY2tldEtleSwgZXJyb3JDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudHMuZW1pdChFVkVOVC5TT0NLRVRfT05FUlJPUik7XG4gICAgICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgICAgICBuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkVycm9yKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBjb25uZWN0IHRvIFdlYlNvY2tldCAke3NvY2tldEtleX0uYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gd2FpdEZvckNvbm5lY3Rpb24oc29ja2V0S2V5KVxuICAgIC5hbmRUaGVuKCgpID0+IG9rQXN5bmMoc29ja2V0S2V5KSlcbiAgICAub3JFbHNlKChlcnJvcikgPT4gZXJyQXN5bmMoZXJyb3IpKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgV2ViU29ja2V0IHRvIG9wZW4uIFJldHVybnMgYW4gZXJyb3IgaWYgdG9vIG1hbnkgY29ubmVjdGlvbiBhdHRlbXB0cyBhcmUgbWFkZS5cbiAqXG4gKiBAcGFyYW0gc29ja2V0S2V5XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3Qgd2FpdEZvckNvbm5lY3Rpb24gPSAoXG4gIHNvY2tldEtleTogc3RyaW5nLFxuKTogUmVzdWx0QXN5bmM8dm9pZCwgV2ViU29ja2V0RXJyb3I+ID0+XG4gIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghaXNTcGF3bmVkKHNvY2tldEtleSkpIHtcbiAgICAgICAgZXZlbnRzLm9uY2UoRVZFTlQuU09DS0VUX09QRU5FRCwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRzLm9uKEVWRU5ULlNPQ0tFVF9PTkVSUk9SLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBXZWJTb2NrZXRDb25uZWN0aW9uRXJyb3IoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgcmV0dXJuIGVuc3VyZUVycm9yKGVycm9yKTtcbiAgICB9LFxuICApO1xuXG4vKipcbiAqIENsb3NlIHRoZSBXZWJTb2NrZXRcbiAqIEBwYXJhbSBzb2NrZXRLZXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBjbG9zZSA9IChzb2NrZXRLZXk6IHN0cmluZyk6IFJlc3VsdEFzeW5jPHN0cmluZywgV2ViU29ja2V0RXJyb3I+ID0+XG4gIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChpc1NwYXduZWQoc29ja2V0S2V5KSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IFdlYlNvY2tldEVycm9yKFwiVW5hYmxlIHRvIGNsb3NlIHRoZSBXZWJTb2NrZXRcIikpO1xuICAgICAgICB9LCAxMDAwKTtcblxuICAgICAgICBzb2NrZXRzW3NvY2tldEtleV0ub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICAgICAgICByZXNvbHZlKHNvY2tldEtleSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc29ja2V0c1tzb2NrZXRLZXldLmNsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHNvY2tldEtleSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbiBpbnN0YW5jZSBVUkwgaW4gYSBXZWJTb2NrZXQgVVJMXG4gKlxuICogQHBhcmFtIGluc3RhbmNlVXJsXG4gKiBAcGFyYW0gcGF0aG5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZFNvY2tldFVybCA9IChpbnN0YW5jZVVybDogVVJMLCBwYXRobmFtZTogc3RyaW5nKTogVVJMID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChpbnN0YW5jZVVybCk7XG5cbiAgaWYgKCFbXCJ3czpcIiwgXCJ3c3M6XCJdLmluY2x1ZGVzKHVybC5wcm90b2NvbCkpIHtcbiAgICB1cmwucHJvdG9jb2wgPSB1cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiA/IFwid3M6XCIgOiBcIndzczpcIjtcbiAgfVxuICB1cmwucGF0aG5hbWUgKz0gcGF0aG5hbWU7XG5cbiAgcmV0dXJuIG5ldyBVUkwodXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBkb3dubG9hZCBVUkwgZm9yIHRoZSBzb2NrZXQuIFJldHVybnMgYSBzdHJpbmcgc2luY2UgaXQncyBtb3N0bHkgdXNlZCBhcyBzb2NrZXRzIGtleVxuICpcbiAqIEBwYXJhbSBsdWZpRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkU29ja2V0VXJsID0gKGx1ZmlGaWxlOiBMdWZpRmlsZSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBidWlsZFNvY2tldFVybChcbiAgICBuZXcgVVJMKGx1ZmlGaWxlLnNlcnZlclVybCksXG4gICAgU29ja2V0UGF0aC5ET1dOTE9BRCArIGAvJHtsdWZpRmlsZS5rZXlzLnNlcnZlcn1gLFxuICApLnRvU3RyaW5nKCk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSB1cGxvYWQgVVJMIGZvciB0aGUgc29ja2V0LiBSZXR1cm5zIGEgc3RyaW5nIHNpbmNlIGl0J3MgbW9zdGx5IHVzZWQgYXMgc29ja2V0cyBrZXlcbiAqXG4gKiBAcGFyYW0gbHVmaUZpbGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB1cGxvYWRTb2NrZXRVcmwgPSAobHVmaUZpbGU6IEx1ZmlGaWxlKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGJ1aWxkU29ja2V0VXJsKG5ldyBVUkwobHVmaUZpbGUuc2VydmVyVXJsKSwgU29ja2V0UGF0aC5VUExPQUQpXG4gICAgLnRvU3RyaW5nKCk7XG59O1xuXG4vKipcbiAqIFRyeSB0byBwYXJzZSBhIHN0cmluZyBpbnRvIGEgSlNPTi4gUmV0dXJucyBmYWxzZSBpZiBub3QgcG9zc2libGUuXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IHRyeVBhcnNlSnNvbiA9IChkYXRhOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBKU09OLnBhcnNlKGRhdGEpO1xuXG4gICAgaWYgKHBhcnNlZE9iamVjdCAmJiB0eXBlb2YgcGFyc2VkT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gcGFyc2VkT2JqZWN0O1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgLyogZW1wdHkgKi9cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBTZXJ2ZXJEb3dubG9hZENodW5rTWV0YWRhdGFcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2VydmVyRG93bmxvYWRDaHVua1N1Y2Nlc3NNZXRhZGF0YSA9IChcbiAgbWVzc2FnZTogU2VydmVyRG93bmxvYWRDaHVua01ldGFkYXRhLFxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJEb3dubG9hZENodW5rU3VjY2Vzc01ldGFkYXRhID0+XG4gIHR5cGVvZiBtZXNzYWdlID09PSBcIm9iamVjdFwiICYmIG1lc3NhZ2UgIT09IG51bGwgJiYgIShcIm1zZ1wiIGluIG1lc3NhZ2UpO1xuIiwgImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IEx1ZmlGaWxlIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1maWxlLnRzXCI7XG5pbXBvcnQgeyBMdWZpSm9iIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1qb2IudHNcIjtcbmltcG9ydCB7IEpvYlN0YXR1cyB9IGZyb20gXCJ+L2VudW0vam9iLXN0YXR1cy50c1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyBVUExPQURfU1RBVFVTIH0gZnJvbSBcIn4vZW51bS9maWxlLXN0YXR1cy50c1wiO1xuaW1wb3J0IHsgV09SS0VSX0FDVElPTiB9IGZyb20gXCJ+L2VudW0vd29ya2VyLWFjdGlvbi50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRXJyb3IsIGZldGNoU2VydmVyQ29uZmlnLCBpc1NlY3VyZUNvbnRleHQgfSBmcm9tIFwifi91dGlscy50c1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJ+L2FwaS9jcnlwdG8udHNcIjtcbmltcG9ydCB7IEZpbGVTbGljaW5nRXJyb3IgfSBmcm9tIFwifi9lcnJvci9maWxlL2ZpbGUtc2xpY2luZy1lcnJvci50c1wiO1xuaW1wb3J0IHsgQ3J5cHRvQWxnb3JpdGhtIH0gZnJvbSBcIn4vZW51bS9jcnlwdG8tYWxnb3JpdGhtLnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9FcnJvciB9IGZyb20gXCJ+L2Vycm9yL2NyeXB0by9jcnlwdG8tZXJyb3IudHNcIjtcbmltcG9ydCB7IERvd25sb2FkRXJyb3IgfSBmcm9tIFwifi9lcnJvci9kb3dubG9hZC9kb3dubG9hZC1lcnJvci50c1wiO1xuaW1wb3J0IHsgSW5mb3NFcnJvciB9IGZyb20gXCJ+L2Vycm9yL2luZm9zLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBKb2JQYXVzZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL2pvYi9qb2ItcGF1c2UtZXJyb3IudHNcIjtcbmltcG9ydCB7IEpvYlJlc3VtZUVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivam9iL2pvYi1yZXN1bWUtZXJyb3IudHNcIjtcbmltcG9ydCB7IEpvYkVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivam9iL2pvYi1lcnJvci50c1wiO1xuaW1wb3J0IHsgVXBsb2FkRXJyb3IgfSBmcm9tIFwifi9lcnJvci91cGxvYWQvdXBsb2FkLWVycm9yLnRzXCI7XG5pbXBvcnQgeyBoYXNoUGFzc3dvcmQgfSBmcm9tIFwifi9hcGkvY3J5cHRvLnRzXCI7XG5pbXBvcnQgeyBXT1JLRVJfVFlQRSB9IGZyb20gXCJ+L2VudW0vd29ya2VyLXR5cGUudHNcIjtcbmltcG9ydCB7IHR5cGUgQXN5bmNaaXBwYWJsZSB9IGZyb20gXCJmZmxhdGVcIjtcblxuY29uc3QgQ0hVTktfTEVOR1RIID0gMV81MDBfMDAwOyAvLyAxLjUgTUJcblxuY29uc3QgZmlsZXM6IHsgW2NsaWVudEtleTogc3RyaW5nXTogTHVmaUZpbGUgfSA9IHt9O1xuZXhwb3J0IGNvbnN0IGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuLyoqXG4gKiBDYW5jZWwgYW4gdXBsb2FkXG4gKlxuICogQHBhcmFtIHVwbG9hZEpvYlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbmNlbCA9ICh1cGxvYWRKb2I6IEx1ZmlKb2IpOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj4gPT4ge1xuICB1cGxvYWRKb2IudGVybWluYXRlKCk7XG5cbiAgY29uc3Qgam9iID0gbmV3IEx1ZmlKb2IodXBsb2FkSm9iLmx1ZmlGaWxlLCBXT1JLRVJfVFlQRS5DQU5DRUwpO1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBqb2JcbiAgICAgICAgLm9uTWVzc2FnZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gRVZFTlQuVVBMT0FEX0NBTkNFTExFRCkge1xuICAgICAgICAgICAgZmlsZXNbam9iLmx1ZmlGaWxlLmtleXMuY2xpZW50XS51cGxvYWRTdGF0dXMgPVxuICAgICAgICAgICAgICBVUExPQURfU1RBVFVTLkNBTkNFTEVEO1xuXG4gICAgICAgICAgICByZXNvbHZlKGpvYik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgbmV3IEpvYkVycm9yKFxuICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY2FuY2VsIGFuIHVwbG9hZFwiLFxuICAgICAgICAgICAgICAgIHsgY2F1c2U6IGV2ZW50LmRhdGEuZXJyb3IgfSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucmVxdWVzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIGx1ZmlGaWxlOiBqb2IubHVmaUZpbGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSksXG4gICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcGFzc2VkIHRvIGNvbXByZXNzKClcbiAqXG4gKiBAcGFyYW0gZmlsZXNcbiAqIEBwYXJhbSBhcmNoaXZlRW50cmllc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEZpbGVzVG9BcmNoaXZlID0gKFxuICBmaWxlczogRmlsZVtdLFxuICBhcmNoaXZlRW50cmllczogQXN5bmNaaXBwYWJsZSA9IHt9LFxuKTogUmVzdWx0QXN5bmM8QXN5bmNaaXBwYWJsZSwgRXJyb3I+ID0+IHtcbiAgY29uc3QgYXN5bmNMb29wID0gYXN5bmMgKFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICkgPT4ge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgY29uc3QgbmFtZVdpdGhFeHRlbnNpb24gPSBmaWxlLm5hbWUuc3BsaXQoXCIvXCIpPy5wb3AoKSB8fCBmaWxlLm5hbWU7XG5cbiAgICAgIGNvbnN0IG5hbWVXaXRob3V0RXh0ZW5zaW9uID0gbmFtZVdpdGhFeHRlbnNpb24uc3BsaXQoXCIuXCIpLnNoaWZ0KCk7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBuYW1lV2l0aEV4dGVuc2lvbi5zcGxpdChcIi5cIikubGVuZ3RoID4gMVxuICAgICAgICA/IGAuJHtuYW1lV2l0aEV4dGVuc2lvbi5zcGxpdChcIi5cIikucG9wKCl9YFxuICAgICAgICA6IFwiXCI7XG5cbiAgICAgIGxldCBuYW1lID0gbmFtZVdpdGhFeHRlbnNpb247XG5cbiAgICAgIGlmIChhcmNoaXZlRW50cmllc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG5hbWUgPSBgJHtuYW1lV2l0aG91dEV4dGVuc2lvbn0oJHtpfSkke2V4dGVuc2lvbn1gO1xuXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9IHdoaWxlIChhcmNoaXZlRW50cmllc1tuYW1lXSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRzLmVtaXQoRVZFTlQuQVJDSElWRV9BRERFRF9GSUxFLCB7IG5hbWUsIHNpemU6IGZpbGUuc2l6ZSB9KTtcblxuICAgICAgYXJjaGl2ZUVudHJpZXNbbmFtZV0gPSBhd2FpdCBmaWxlLmJ5dGVzKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICBhc3luY0xvb3AoZmlsZXMpLFxuICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICApLmFuZFRoZW4oKCkgPT4gb2tBc3luYyhhcmNoaXZlRW50cmllcykpO1xufTtcblxuLyoqXG4gKiBDb21wcmVzcyBmaWxlcyBpbnRvIGEgemlwXG4gKlxuICogQHBhcmFtIGFyY2hpdmVFbnRyaWVzXG4gKiBAcGFyYW0gYXJjaGl2ZU5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wcmVzcyA9IChcbiAgYXJjaGl2ZUVudHJpZXM6IEFzeW5jWmlwcGFibGUsXG4gIGFyY2hpdmVOYW1lOiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj4gPT4ge1xuICBjb25zdCBsdWZpRmlsZSA9IG5ldyBMdWZpRmlsZShcIlwiKTsgLy8gRHVtbXkgTHVmaSBGaWxlIHRvIGF2b2lkIHRvIGNoZWNrIGZvciBMdWZpRmlsZSBleGlzdGFuY2UgaW4gb3RoZXIgam9ic1xuICBjb25zdCBqb2IgPSBuZXcgTHVmaUpvYihsdWZpRmlsZSwgV09SS0VSX1RZUEUuQ09NUFJFU1MpO1xuXG4gIHJldHVybiBva0FzeW5jKFxuICAgIGpvYlxuICAgICAgLm9uTWVzc2FnZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IEVWRU5ULkFSQ0hJVkVfQ1JFQVRFRCkge1xuICAgICAgICAgIGpvYi5hcmNoaXZlRmlsZSA9IG5ldyBGaWxlKFtldmVudC5kYXRhLmJ1ZmZlcl0sIGFyY2hpdmVOYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3ppcFwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgam9iLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pLnJlcXVlc3RNZXNzYWdlKHtcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIGx1ZmlGaWxlLFxuICAgICAgICAgIGFyY2hpdmU6IHsgZW50cmllczogYXJjaGl2ZUVudHJpZXMgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBEZWNvbXByZXNzIGEgemlwIGZpbGVcbiAqXG4gKiBAcGFyYW0gemlwRmlsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3MgPSAoXG4gIHppcEZpbGU6IEZpbGUsXG4pOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj4gPT4ge1xuICBjb25zdCBsdWZpRmlsZSA9IG5ldyBMdWZpRmlsZShcIlwiKTsgLy8gRHVtbXkgTHVmaSBGaWxlIHRvIGF2b2lkIHRvIGNoZWNrIGZvciBMdWZpRmlsZSBleGlzdGFuY2UgaW4gb3RoZXIgam9ic1xuICBjb25zdCBqb2IgPSBuZXcgTHVmaUpvYihsdWZpRmlsZSwgV09SS0VSX1RZUEUuREVDT01QUkVTUyk7XG5cbiAgcmV0dXJuIG9rQXN5bmMoXG4gICAgam9iXG4gICAgICAub25NZXNzYWdlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gRVZFTlQuQVJDSElWRV9ERUNPTVBSRVNTRUQpIHtcbiAgICAgICAgICBqb2IuY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kYXRhLmV2ZW50ID09PSBFVkVOVC5BUkNISVZFX1JFVFJJRVZFRF9GSUxFKSB7XG4gICAgICAgICAgam9iLmFyY2hpdmVGaWxlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZpbGUoW2V2ZW50LmRhdGEuZmlsZS5idWZmZXJdLCBldmVudC5kYXRhLmZpbGUucGF0aCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5yZXF1ZXN0TWVzc2FnZSh7XG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBsdWZpRmlsZSxcbiAgICAgICAgICBhcmNoaXZlOiB7IGZpbGU6IHppcEZpbGUgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgbG9naWNzIG9mIHBhc3N3b3JkIGhhc2hpbmdcbiAqXG4gKiBAcGFyYW0gZG93bmxvYWRVcmxcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuY29uc3QgaGFuZGxlUGFzc3dvcmRIYXNoaW5nID0gKFxuICBkb3dubG9hZFVybDogVVJMLFxuICBwYXNzd29yZD86IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPEx1ZmlGaWxlLCBFcnJvcj4gPT4ge1xuICBpZiAocGFzc3dvcmQpIHtcbiAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJDb25maWcoZG93bmxvYWRVcmwpLmFuZFRoZW4oKGNvbmZpZykgPT4ge1xuICAgICAgLy8gUGFzc3dvcmQgaGFzaGluZyBvbiBjbGllbnQgc2lkZSBpcyBvbmx5IHN1cHBvcnRlZCBieSByZWNlbnQgdmVyc2lvbnMgb2YgTHVmaSBTZXJ2ZXJcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLnZlcnNpb24udGFnID4gXCIwLjA3LjBcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFsZ28gPSBpc1NlY3VyZUNvbnRleHQoKVxuICAgICAgICAgID8gQ3J5cHRvQWxnb3JpdGhtLldlYkNyeXB0b1xuICAgICAgICAgIDogQ3J5cHRvQWxnb3JpdGhtLlNqY2w7XG5cbiAgICAgICAgcmV0dXJuIGhhc2hQYXNzd29yZChwYXNzd29yZCwgYWxnbykuYW5kVGhlbigoaGFzaGVkUGFzc3dvcmQpID0+XG4gICAgICAgICAgb2tBc3luYyhMdWZpRmlsZS5mcm9tRG93bmxvYWRVcmwoZG93bmxvYWRVcmwsIGhhc2hlZFBhc3N3b3JkKSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBva0FzeW5jKEx1ZmlGaWxlLmZyb21Eb3dubG9hZFVybChkb3dubG9hZFVybCwgcGFzc3dvcmQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2tBc3luYyhMdWZpRmlsZS5mcm9tRG93bmxvYWRVcmwoZG93bmxvYWRVcmwpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEb3dubG9hZCBhIGZpbGUgZnJvbSB0aGUgc2VydmVyXG4gKlxuICogQHBhcmFtIGRvd25sb2FkVXJsXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBkb3dubG9hZCA9IChcbiAgZG93bmxvYWRVcmw6IFVSTCxcbiAgcGFzc3dvcmQ/OiBzdHJpbmcsXG4pOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj4gPT5cbiAgaGFuZGxlUGFzc3dvcmRIYXNoaW5nKGRvd25sb2FkVXJsLCBwYXNzd29yZCkuYW5kVGhlbihcbiAgICAobHVmaUZpbGU6IEx1ZmlGaWxlKSA9PiB7XG4gICAgICBjb25zdCBqb2IgPSBuZXcgTHVmaUpvYihsdWZpRmlsZSwgV09SS0VSX1RZUEUuRE9XTkxPQUQpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVua3M6IEJsb2JbXSA9IFtdO1xuXG4gICAgICAgICAgcmV0dXJuIGpvYlxuICAgICAgICAgICAgLm9uTWVzc2FnZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaGFuZGxlU29ja2V0UmVzdWx0cyhyZXNvbHZlLCByZWplY3QsIGpvYiwgZXZlbnQpO1xuXG4gICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmV2ZW50ID09PSBFVkVOVC5DSFVOS19ET1dOTE9BREVEKSB7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goZXZlbnQuZGF0YS5jaHVuay5idWZmZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNodW5rcy5sZW5ndGggPj0gNTApIHtcbiAgICAgICAgICAgICAgICAgIGpvYi5kb3dubG9hZGVkRmlsZSA9IG5ldyBGaWxlKFxuICAgICAgICAgICAgICAgICAgICBqb2IuZG93bmxvYWRlZEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICA/IFtqb2IuZG93bmxvYWRlZEZpbGUuc2xpY2UoKV0uY29uY2F0KGNodW5rcylcbiAgICAgICAgICAgICAgICAgICAgICA6IGNodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgbHVmaUZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGx1ZmlGaWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBjaHVua3MubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gRVZFTlQuRE9XTkxPQURfQ09NUExFVEUpIHtcbiAgICAgICAgICAgICAgICBqb2IuZG93bmxvYWRlZEZpbGUgPSBuZXcgRmlsZShcbiAgICAgICAgICAgICAgICAgIGpvYi5kb3dubG9hZGVkRmlsZVxuICAgICAgICAgICAgICAgICAgICA/IFtqb2IuZG93bmxvYWRlZEZpbGUuc2xpY2UoKV0uY29uY2F0KGNodW5rcylcbiAgICAgICAgICAgICAgICAgICAgOiBjaHVua3MsXG4gICAgICAgICAgICAgICAgICBsdWZpRmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBsdWZpRmlsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY2h1bmtzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgICAgICBqb2IuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXF1ZXN0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICBsdWZpRmlsZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSBhcyBQcm9taXNlPEx1ZmlKb2I+LFxuICAgICAgICAoZXJyb3IpID0+IG5ldyBEb3dubG9hZEVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4vKipcbiAqIFJldHJpZXZlIGluZm9ybWF0aW9ucyBhYm91dCBhIGZpbGVcbiAqXG4gKiBAcGFyYW0gZG93bmxvYWRVcmxcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluZm9zID0gKFxuICBkb3dubG9hZFVybDogVVJMLFxuICBwYXNzd29yZD86IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPEx1ZmlKb2IsIEluZm9zRXJyb3IgfCBDcnlwdG9FcnJvcj4gPT5cbiAgaGFuZGxlUGFzc3dvcmRIYXNoaW5nKGRvd25sb2FkVXJsLCBwYXNzd29yZCkuYW5kVGhlbigobHVmaUZpbGUpID0+XG4gICAgb2tBc3luYyhuZXcgTHVmaUpvYihsdWZpRmlsZSwgV09SS0VSX1RZUEUuSU5GT1MpKVxuICApXG4gICAgLmFuZFRoZW4oKGpvYjogTHVmaUpvYikgPT5cbiAgICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgam9iXG4gICAgICAgICAgICAub25NZXNzYWdlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gRVZFTlQuSU5GT1NfUkVUUklFVkVEKSB7XG4gICAgICAgICAgICAgICAgam9iLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShqb2IpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IEVWRU5ULk9QRVJBVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgICBuZXcgSm9iRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gcmV0cmlldmUgaW5mb3JtYXRpb25zIG9mIHRoZSBmaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGV2ZW50LmRhdGEuZXJyb3IgfSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXF1ZXN0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGFyZ3M6IHsgbHVmaUZpbGU6IGpvYi5sdWZpRmlsZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pIGFzIFByb21pc2U8THVmaUpvYj4sXG4gICAgICAgIChlcnJvcikgPT4gbmV3IEluZm9zRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlbnN1cmVFcnJvcihlcnJvcikgfSksXG4gICAgICApXG4gICAgKTtcblxuLyoqXG4gKiBQYXVzZSBhbiB1cGxvYWQvZG93bmxvYWQgam9iXG4gKiBAcGFyYW0gam9iXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgcGF1c2UgPSAoam9iOiBMdWZpSm9iKTogUmVzdWx0QXN5bmM8THVmaUpvYiwgRXJyb3I+ID0+IHtcbiAgdHJ5IHtcbiAgICBqb2Iuc3RhdHVzID0gSm9iU3RhdHVzLlBBVVNFRDtcbiAgICByZXR1cm4gb2tBc3luYyhcbiAgICAgIGpvYi5yZXF1ZXN0TWVzc2FnZSh7XG4gICAgICAgIGFjdGlvbjogV09SS0VSX0FDVElPTi5QQVVTRSxcbiAgICAgICAgYXJnczogeyBsdWZpRmlsZTogam9iLmx1ZmlGaWxlIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBKb2JQYXVzZUVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZW5zdXJlRXJyb3IoZXJyb3IpIH0pLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZmlsZSB1cGxvYWRlZCBvbiB0aGUgc2VydmVyXG4gKiBAcGFyYW0gcmVtb3ZlVXJsXG4gKiBAcGFyYW0gcGFzc3dvcmRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmUgPSAoXG4gIHJlbW92ZVVybDogVVJMLFxuICBwYXNzd29yZD86IHN0cmluZyxcbik6IFJlc3VsdEFzeW5jPEx1ZmlKb2IsIEVycm9yPiA9PiB7XG4gIGNvbnN0IGx1ZmlGaWxlID0gTHVmaUZpbGUuZnJvbVJlbW92ZVVybChyZW1vdmVVcmwsIHBhc3N3b3JkKTtcbiAgY29uc3Qgam9iID0gbmV3IEx1ZmlKb2IobHVmaUZpbGUsIFdPUktFUl9UWVBFLlJFTU9WRSk7XG5cbiAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGpvYlxuICAgICAgICAub25NZXNzYWdlKChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLmV2ZW50ID09PSBFVkVOVC5GSUxFX1JFTU9WRUQpIHtcbiAgICAgICAgICAgIGpvYi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShqb2IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5kYXRhLmV2ZW50ID09PSBFVkVOVC5PUEVSQVRJT05fRkFJTEVEKSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBKb2JFcnJvcihcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlbW92ZSBhIGZpbGVcIiwge1xuICAgICAgICAgICAgICAgIGNhdXNlOiBldmVudC5kYXRhLmVycm9yLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucmVxdWVzdE1lc3NhZ2UoeyBhcmdzOiB7IGx1ZmlGaWxlIH0gfSk7XG4gICAgfSksXG4gICAgKGVycm9yKSA9PiBlbnN1cmVFcnJvcihlcnJvciksXG4gICk7XG59O1xuXG4vKipcbiAqIFJlc3VtZSBhbiB1cGxvYWQvZG93bmxvYWQgam9iXG4gKiBAcGFyYW0gam9iXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgcmVzdW1lID0gKGpvYjogTHVmaUpvYik6IFJlc3VsdEFzeW5jPEx1ZmlKb2IsIEVycm9yPiA9PiB7XG4gIHRyeSB7XG4gICAgam9iLnN0YXR1cyA9IEpvYlN0YXR1cy5PTkdPSU5HO1xuICAgIHJldHVybiBva0FzeW5jKFxuICAgICAgam9iLnJlcXVlc3RNZXNzYWdlKHtcbiAgICAgICAgYWN0aW9uOiBXT1JLRVJfQUNUSU9OLlJFU1VNRSxcbiAgICAgICAgYXJnczogeyBsdWZpRmlsZTogam9iLmx1ZmlGaWxlIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJBc3luYyhcbiAgICAgIG5ldyBKb2JSZXN1bWVFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVuc3VyZUVycm9yKGVycm9yKSB9KSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFNsaWNlIGEgZmlsZSBpbiBtdWx0aXBsZSBjaHVua3NcbiAqXG4gKiBAcGFyYW0gY2h1bmtMZW5ndGhcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IHNsaWNlQW5kVXBsb2FkID0gKFxuICBqb2I6IEx1ZmlKb2IsXG4gIGZpbGU6IEZpbGUsXG4gIGFsZ286IENyeXB0b0FsZ29yaXRobSxcbiAgY2h1bmtMZW5ndGg6IG51bWJlciA9IENIVU5LX0xFTkdUSCxcbik6IFJlc3VsdEFzeW5jPHZvaWQsIEZpbGVTbGljaW5nRXJyb3I+ID0+IHtcbiAgZXZlbnRzLmVtaXQoRVZFTlQuU0xJQ0VfU1RBUlRFRCwgZmlsZXNbam9iLmx1ZmlGaWxlLmtleXMuY2xpZW50XSk7XG4gIGNvbnN0IHRvdGFsQ2h1bmtzID0gTWF0aC5jZWlsKGZpbGUuc2l6ZSAvIGNodW5rTGVuZ3RoKSB8fCAxO1xuICBjb25zdCBjb25jdXJyZW5jeSA9IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDE7XG5cbiAgZmlsZXNbam9iLmx1ZmlGaWxlLmtleXMuY2xpZW50XS50b3RhbENodW5rcyA9IHRvdGFsQ2h1bmtzO1xuXG4gIGNvbnN0IHNlcXVlbnRpYWxMb29wID0gYXN5bmMgKCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBpICogY2h1bmtMZW5ndGg7XG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIGNodW5rTGVuZ3RoLCBmaWxlLnNpemUpO1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZmlsZS5zbGljZShzdGFydCwgZW5kLCBmaWxlLnR5cGUpLmFycmF5QnVmZmVyKCk7XG5cbiAgICAgIGpvYi5yZXF1ZXN0TWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIGNodW5rOiB7XG4gICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbHVmaUZpbGU6IGZpbGVzW2pvYi5sdWZpRmlsZS5rZXlzLmNsaWVudF0sXG4gICAgICAgICAgICBhbGdvLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFtidWZmZXJdLFxuICAgICAgKTtcblxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgY29uc3Qgd2FpdFVudGlsVXBsb2FkU3RhcnRlZCA9ICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGpvYi5ldmVudHMub25jZShFVkVOVC5VUExPQURfU1RBUlRFRCwgKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB3YWl0VW50aWxVcGxvYWRTdGFydGVkKCk7XG4gICAgICB9IGVsc2UgaWYgKGkgJSBjb25jdXJyZW5jeSA9PT0gMCkge1xuICAgICAgICBjb25zdCB3YWl0Rm9yUXVldWVBdmFpbGFiaWxpdHkgPSAoKSA9PlxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBqb2IuZXZlbnRzLm9uY2UoRVZFTlQuQ0hVTktfVVBMT0FERUQsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgd2FpdEZvclF1ZXVlQXZhaWxhYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHNlcXVlbnRpYWxMb29wKCk7XG5cbiAgcmV0dXJuIG9rQXN5bmModW5kZWZpbmVkKTtcbn07XG5cbi8qKlxuICogU3RhcnQgdGhlIHVwbG9hZCBvbiB0aGUgc2VydmVyXG4gKiBAcGFyYW0gc2VydmVyVXJsXG4gKiBAcGFyYW0gZmlsZVxuICogQHBhcmFtIGRlbGF5XG4gKiBAcGFyYW0gZGVsQXRGaXJzdFZpZXdcbiAqIEBwYXJhbSB6aXBwZWRcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IHN0YXJ0VXBsb2FkID0gKFxuICBzZXJ2ZXJVcmw6IFVSTCxcbiAgZmlsZTogRmlsZSxcbiAgZGVsYXk6IG51bWJlcixcbiAgZGVsQXRGaXJzdFZpZXc6IGJvb2xlYW4sXG4gIHppcHBlZDogYm9vbGVhbixcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgYWxnbzogQ3J5cHRvQWxnb3JpdGhtLFxuKSA9PlxuICBjcnlwdG8uZ2VuZXJhdGVLZXkoXG4gICAgYWxnbyxcbiAgKS5hbmRUaGVuKFxuICAgIChjbGllbnRLZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICAgIHJldHVybiBoYXNoUGFzc3dvcmQocGFzc3dvcmQsIGFsZ28pLmFuZFRoZW4oKGhhc2hlZFBhc3N3b3JkKSA9PlxuICAgICAgICAgIG9rQXN5bmMoeyBwYXNzd29yZDogaGFzaGVkUGFzc3dvcmQsIGNsaWVudEtleSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9rQXN5bmMoeyBwYXNzd29yZCwgY2xpZW50S2V5IH0pO1xuICAgICAgfVxuICAgIH0sXG4gICkuYW5kVGhlbigoeyBwYXNzd29yZCwgY2xpZW50S2V5IH0pID0+IHtcbiAgICBmaWxlc1tjbGllbnRLZXldID0gbmV3IEx1ZmlGaWxlKHNlcnZlclVybC50b1N0cmluZygpLCB7XG4gICAgICBkZWxheSxcbiAgICAgIGRlbEF0Rmlyc3RWaWV3LFxuICAgICAgemlwcGVkLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBuYW1lOiBmaWxlLm5hbWUuc3BsaXQoXCIvXCIpLnBvcCgpLCAvLyBSZW1vdmUgcGF0aCBmcm9tIGZpbGVuYW1lXG4gICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBrZXlzOiB7IGNsaWVudDogY2xpZW50S2V5LCBzZXJ2ZXI6IFwiXCIgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGpvYiA9IG5ldyBMdWZpSm9iKGZpbGVzW2NsaWVudEtleV0sIFdPUktFUl9UWVBFLlVQTE9BRCk7XG5cbiAgICBmaWxlc1tjbGllbnRLZXldLnVwbG9hZFN0YXR1cyA9IFVQTE9BRF9TVEFUVVMuUVVFVUVEO1xuXG4gICAgcmV0dXJuIHNsaWNlQW5kVXBsb2FkKGpvYiwgZmlsZSwgYWxnbykuYW5kVGhlbigoKSA9PlxuICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBqb2Iub25NZXNzYWdlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaGFuZGxlU29ja2V0UmVzdWx0cyhyZXNvbHZlLCByZWplY3QsIGpvYiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmRhdGEuZXZlbnQpIHtcbiAgICAgICAgICAgICAgY2FzZSBFVkVOVC5VUExPQURfQ09NUExFVEU6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgam9iLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICBqb2IubHVmaUZpbGUudXBsb2FkU3RhdHVzID0gVVBMT0FEX1NUQVRVUy5DT01QTEVURTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pIGFzIFByb21pc2U8THVmaUpvYj4sXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuXG4vKipcbiAqIFVwbG9hZCBhIGZpbGUgdG8gdGhlIHNlcnZlclxuICpcbiAqIEBwYXJhbSBzZXJ2ZXJVcmxcbiAqIEBwYXJhbSBmaWxlc1RvVXBsb2FkXG4gKiBAcGFyYW0gZGVsYXlcbiAqIEBwYXJhbSBkZWxBdEZpcnN0Vmlld1xuICogQHBhcmFtIHppcHBlZFxuICogQHBhcmFtIHppcE5hbWVcbiAqIEBwYXJhbSBwYXNzd29yZFxuICogQHBhcmFtIGFsZ29cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB1cGxvYWQgPSAoXG4gIHNlcnZlclVybDogVVJMLFxuICBmaWxlc1RvVXBsb2FkOiBGaWxlW10sXG4gIGRlbGF5OiBudW1iZXIgPSAwLFxuICBkZWxBdEZpcnN0VmlldzogYm9vbGVhbiA9IGZhbHNlLFxuICB6aXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgemlwTmFtZTogc3RyaW5nID0gXCJkb2N1bWVudHMuemlwXCIsXG4gIHBhc3N3b3JkOiBzdHJpbmcgPSBcIlwiLFxuICBhbGdvOiBDcnlwdG9BbGdvcml0aG0gPSBDcnlwdG9BbGdvcml0aG0uV2ViQ3J5cHRvLFxuKTogUmVzdWx0QXN5bmM8THVmaUpvYltdLCBFcnJvcj4gPT4ge1xuICBjb25zdCBvcGVyYXRpb25zOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj5bXSA9IFtdO1xuXG4gIGlmICghemlwcGVkKSB7XG4gICAgZmlsZXNUb1VwbG9hZC5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBvcGVyYXRpb25zLnB1c2goc3RhcnRVcGxvYWQoXG4gICAgICAgIHNlcnZlclVybCxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZGVsYXksXG4gICAgICAgIGRlbEF0Rmlyc3RWaWV3LFxuICAgICAgICB6aXBwZWQsXG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICBhbGdvLFxuICAgICAgKSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgd2UganVzdCB3YW50IHRvIHVwbG9hZCBhIHNpbmdsZSB6aXAgZmlsZSAocHJvYmFibHkgY3JlYXRlZCBieSBtYW51YWxseSB1c2luZyBjb21wcmVzcygpKVxuICAgIGlmIChcbiAgICAgIGZpbGVzVG9VcGxvYWQubGVuZ3RoID09PSAxICYmIGZpbGVzVG9VcGxvYWRbMF0udHlwZSA9PT0gXCJhcHBsaWNhdGlvbi96aXBcIlxuICAgICkge1xuICAgICAgb3BlcmF0aW9ucy5wdXNoKFxuICAgICAgICBzdGFydFVwbG9hZChcbiAgICAgICAgICBzZXJ2ZXJVcmwsXG4gICAgICAgICAgZmlsZXNUb1VwbG9hZFswXSxcbiAgICAgICAgICBkZWxheSxcbiAgICAgICAgICBkZWxBdEZpcnN0VmlldyxcbiAgICAgICAgICB6aXBwZWQsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgYWxnbyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdGlvbnMucHVzaChcbiAgICAgICAgYWRkRmlsZXNUb0FyY2hpdmUoZmlsZXNUb1VwbG9hZClcbiAgICAgICAgICAuYW5kVGhlbigoYXJjaGl2ZUVudHJpZXMpID0+XG4gICAgICAgICAgICBjb21wcmVzcyhcbiAgICAgICAgICAgICAgYXJjaGl2ZUVudHJpZXMsXG4gICAgICAgICAgICAgIHppcE5hbWUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5hbmRUaGVuKChqb2IpID0+IGpvYi53YWl0Rm9yQ29tcGxldGlvbigpKVxuICAgICAgICAgICAgICAuYW5kVGhlbigoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGpvYi5hcmNoaXZlRmlsZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0VXBsb2FkKFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJVcmwsXG4gICAgICAgICAgICAgICAgICAgIGpvYi5hcmNoaXZlRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgZGVsYXksXG4gICAgICAgICAgICAgICAgICAgIGRlbEF0Rmlyc3RWaWV3LFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgYWxnbyxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJBc3luYyhuZXcgSm9iRXJyb3IoXCJhcmNoaXZlRmlsZSBtdXN0IGJlIGRlZmluZWRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVzdWx0QXN5bmMuY29tYmluZShvcGVyYXRpb25zKS5vckVsc2UoKGVycm9yKSA9PlxuICAgIGVyckFzeW5jKG5ldyBVcGxvYWRFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pKVxuICApO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgc29ja2V0IG9wZW5pbmcgb3BlcmF0aW9uIGluIGEgcHJvbWlzZVxuICpcbiAqIEBwYXJhbSByZXNvbHZlXG4gKiBAcGFyYW0gcmVqZWN0XG4gKiBAcGFyYW0gam9iXG4gKiBAcGFyYW0gZXZlbnRcbiAqL1xuY29uc3QgaGFuZGxlU29ja2V0UmVzdWx0cyA9IChcbiAgcmVzb2x2ZToge1xuICAgICh2YWx1ZTogTHVmaUpvYiB8IFByb21pc2VMaWtlPEx1ZmlKb2I+KTogdm9pZDtcbiAgICAoYXJnMDogTHVmaUpvYik6IHZvaWQ7XG4gIH0sXG4gIHJlamVjdDogeyAocmVhc29uPzogdW5rbm93bik6IHZvaWQ7IChhcmcwOiB1bmtub3duKTogdm9pZCB9LFxuICBqb2I6IEx1ZmlKb2IsXG4gIGV2ZW50OiBNZXNzYWdlRXZlbnQsXG4pID0+IHtcbiAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IEVWRU5ULlNPQ0tFVF9PUEVORUQpIHtcbiAgICByZXNvbHZlKGpvYik7XG4gIH1cblxuICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCkge1xuICAgIHJlamVjdChcbiAgICAgIG5ldyBKb2JFcnJvcihcIlRoZSBqb2IgcmV0dXJuZWQgYW4gZXJyb3JcIiwgeyBjYXVzZTogZXZlbnQuZGF0YS5lcnJvciB9KSxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBnZXRGaWxlc1F1ZXVlZCA9ICgpOiBMdWZpRmlsZVtdID0+XG4gIE9iamVjdC52YWx1ZXMoZmlsZXMpLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLnVwbG9hZFN0YXR1cyA9PT0gVVBMT0FEX1NUQVRVUy5RVUVVRURcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVJbmRleEluUXVldWUgPSAoY2xpZW50S2V5OiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgT2JqZWN0LmtleXMoZ2V0RmlsZXNRdWV1ZWQoKSkuaW5kZXhPZihjbGllbnRLZXkpO1xuIiwgImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgZXJyQXN5bmMsIG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB0eXBlIHsgTHVmaUZpbGUgfSBmcm9tIFwifi9lbnRpdGllcy9sdWZpLWZpbGUudHNcIjtcbmltcG9ydCB7IEVWRU5UIH0gZnJvbSBcIn4vZW51bS9ldmVudC50c1wiO1xuaW1wb3J0IHsgSm9iU3RhdHVzIH0gZnJvbSBcIn4vZW51bS9qb2Itc3RhdHVzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlclJlcXVlc3RNZXNzYWdlIH0gZnJvbSBcIn4vdHlwZS93b3JrZXItcmVxdWVzdC1tZXNzYWdlLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFcnJvciwgd29ya2VyVXJsIH0gZnJvbSBcIn4vdXRpbHMudHNcIjtcbmltcG9ydCB7IFVQTE9BRF9TVEFUVVMgfSBmcm9tIFwifi9lbnVtL2ZpbGUtc3RhdHVzLnRzXCI7XG5pbXBvcnQgeyBXT1JLRVJfVFlQRSB9IGZyb20gXCJ+L2VudW0vd29ya2VyLXR5cGUudHNcIjtcblxuZXhwb3J0IGNsYXNzIEx1ZmlKb2Ige1xuICBwdWJsaWMgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgbHVmaUZpbGU6IEx1ZmlGaWxlO1xuICBwdWJsaWMgc3RhdHVzID0gSm9iU3RhdHVzLk9OR09JTkc7XG4gIHB1YmxpYyBhcmNoaXZlRmlsZTogRmlsZSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGFyY2hpdmVGaWxlczogRmlsZVtdID0gW107XG4gIHB1YmxpYyBkb3dubG9hZGVkRmlsZTogRmlsZSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHdvcmtlcjogV29ya2VyO1xuXG4gIHByaXZhdGUgaXNUZXJtaW5hdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IobHVmaUZpbGU6IEx1ZmlGaWxlLCB3b3JrZXJUeXBlOiBXT1JLRVJfVFlQRSkge1xuICAgIHN3aXRjaCAod29ya2VyVHlwZSkge1xuICAgICAgY2FzZSBXT1JLRVJfVFlQRS5DQU5DRUw6XG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKFwiY2FuY2VsXCIpLCB7IHR5cGU6IFwibW9kdWxlXCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgV09SS0VSX1RZUEUuQ09NUFJFU1M6XG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKFwiY29tcHJlc3NcIiksIHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBXT1JLRVJfVFlQRS5ERUNPTVBSRVNTOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybChcImRlY29tcHJlc3NcIiksIHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBXT1JLRVJfVFlQRS5ET1dOTE9BRDpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwoXCJkb3dubG9hZFwiKSwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFdPUktFUl9UWVBFLklORk9TOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybChcImluZm9zXCIpLCB7IHR5cGU6IFwibW9kdWxlXCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgV09SS0VSX1RZUEUuUkVNT1ZFOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybChcInJlbW92ZVwiKSwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFdPUktFUl9UWVBFLlVQTE9BRDpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwoXCJ1cGxvYWRcIiksIHsgdHlwZTogXCJtb2R1bGVcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmx1ZmlGaWxlID0gbHVmaUZpbGU7XG4gICAgdGhpcy5ldmVudHMub25jZShFVkVOVC5KT0JfVEVSTUlOQVRFRCwgKCkgPT4ge1xuICAgICAgdGhpcy5pc1Rlcm1pbmF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy50ZXJtaW5hdGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRzLm9uY2UoRVZFTlQuT1BFUkFUSU9OX0ZBSUxFRCwgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhpcy5zdGF0dXMgPSBKb2JTdGF0dXMuRkFJTEVEO1xuICAgICAgdGhpcy5sdWZpRmlsZS51cGxvYWRTdGF0dXMgPSBVUExPQURfU1RBVFVTLkZBSUxFRDtcblxuICAgICAgdGhpcy5ldmVudHMuZW1pdChFVkVOVC5KT0JfVEVSTUlOQVRFRCwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkVycm9yKChldmVudCkgPT4gY29uc29sZS5lcnJvcihldmVudC5lcnJvcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlbGxzIHRoZSB3b3JrZXIgdGhlIGpvYiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdHVzID0gSm9iU3RhdHVzLkNPTVBMRVRFO1xuICAgIHRoaXMuZXZlbnRzLmVtaXQoRVZFTlQuSk9CX1RFUk1JTkFURUQpO1xuICB9O1xuXG4gIHB1YmxpYyBoYXNGYWlsZWQgPSAoKSA9PiB0aGlzLnN0YXR1cyA9PT0gSm9iU3RhdHVzLkZBSUxFRDtcblxuICBwdWJsaWMgb25FcnJvciA9IChjYWxsYmFjazogKGFyZzogRXJyb3JFdmVudCkgPT4gdm9pZCkgPT4ge1xuICAgIHRoaXMud29ya2VyLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcHVibGljIG9uTWVzc2FnZSA9IChjYWxsYmFjaz86IChhcmc6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZCkgPT4ge1xuICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV2ZW50ID0gZS5kYXRhLmV2ZW50O1xuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09PSBFVkVOVC5GSUxFX1VQREFURUQpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubHVmaUZpbGUsIGUuZGF0YS5sdWZpRmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBlLmRhdGEuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHB1YmxpYyBvbk1lc3NhZ2VFcnJvciA9IChjYWxsYmFjazogKGFyZzogTWVzc2FnZUV2ZW50KSA9PiB2b2lkKSA9PiB7XG4gICAgdGhpcy53b3JrZXIub25tZXNzYWdlZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcHVibGljIG9uUHJvZ3Jlc3MgPSAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHtcbiAgICB0aGlzLmV2ZW50cy5vbihFVkVOVC5DSFVOS19VUExPQURFRCwgKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50cy5vbihFVkVOVC5DSFVOS19ET1dOTE9BREVELCAoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcHVibGljIHJlcXVlc3RNZXNzYWdlID0gKFxuICAgIG1zZzogV29ya2VyUmVxdWVzdE1lc3NhZ2UsXG4gICAgdHJhbnNmZXJhYmxlOiBUcmFuc2ZlcmFibGVbXSA9IFtdLFxuICApID0+IHtcbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZShtc2csIHRyYW5zZmVyYWJsZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBwdWJsaWMgdGVybWluYXRlID0gKCkgPT4ge1xuICAgIHRoaXMud29ya2VyLnRlcm1pbmF0ZSgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcHVibGljIHdhaXRGb3JDb21wbGV0aW9uID0gKCk6IFJlc3VsdEFzeW5jPEx1ZmlKb2IsIEVycm9yPiA9PiB7XG4gICAgaWYgKHRoaXMuaXNUZXJtaW5hdGVkKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09IEpvYlN0YXR1cy5DT01QTEVURSkge1xuICAgICAgICByZXR1cm4gb2tBc3luYyh0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlcnJBc3luYyhlbnN1cmVFcnJvcihcIkpvYiBoYXMgZmFpbGVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdGhpcy5ldmVudHMub25jZShFVkVOVC5PUEVSQVRJT05fRkFJTEVELCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5ldmVudHMub25jZShFVkVOVC5KT0JfVEVSTUlOQVRFRCwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBKb2JTdGF0dXMuQ09NUExFVEUpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIChlcnJvcikgPT4gZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHdhaXRGb3JTdGFydCA9ICgpOiBSZXN1bHRBc3luYzxMdWZpSm9iLCBFcnJvcj4gPT5cbiAgICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMub25jZShFVkVOVC5PUEVSQVRJT05fRkFJTEVELCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMub25jZShFVkVOVC5VUExPQURfU1RBUlRFRCwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoRVZFTlQuRE9XTkxPQURfU1RBUlRFRCwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICAoZXJyb3IpID0+IGVuc3VyZUVycm9yKGVycm9yKSxcbiAgICApO1xuXG4gIHByaXZhdGUgZGlzcGF0Y2hFdmVudCA9IChldmVudDogRVZFTlQsIGVycm9yOiB1bmRlZmluZWQgfCBFcnJvcikgPT4ge1xuICAgIHRoaXMuZXZlbnRzLmVtaXQoZXZlbnQsIGVycm9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJy4vaW5kZXguanMnXG5cbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXJcbiIsICJleHBvcnQgY2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG5cdH1cbn1cblxuLyoqXG5BbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiB0aGUgcmVxdWVzdCBpcyBhYm9ydGVkIGJ5IEFib3J0Q29udHJvbGxlci5cbkRPTUV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiB0aGlzIEVycm9yIHdoZW4gRE9NRXhjZXB0aW9uIGlzIGF2YWlsYWJsZS5cbiovXG5leHBvcnQgY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InO1xuXHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH1cbn1cblxuLyoqXG5UT0RPOiBSZW1vdmUgQWJvcnRFcnJvciBhbmQganVzdCB0aHJvdyBET01FeGNlcHRpb24gd2hlbiB0YXJnZXRpbmcgTm9kZSAxOC5cbiovXG5jb25zdCBnZXRET01FeGNlcHRpb24gPSBlcnJvck1lc3NhZ2UgPT4gZ2xvYmFsVGhpcy5ET01FeGNlcHRpb24gPT09IHVuZGVmaW5lZFxuXHQ/IG5ldyBBYm9ydEVycm9yKGVycm9yTWVzc2FnZSlcblx0OiBuZXcgRE9NRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7XG5cbi8qKlxuVE9ETzogUmVtb3ZlIGJlbG93IGZ1bmN0aW9uIGFuZCBqdXN0ICdyZWplY3Qoc2lnbmFsLnJlYXNvbiknIHdoZW4gdGFyZ2V0aW5nIE5vZGUgMTguXG4qL1xuY29uc3QgZ2V0QWJvcnRlZFJlYXNvbiA9IHNpZ25hbCA9PiB7XG5cdGNvbnN0IHJlYXNvbiA9IHNpZ25hbC5yZWFzb24gPT09IHVuZGVmaW5lZFxuXHRcdD8gZ2V0RE9NRXhjZXB0aW9uKCdUaGlzIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nKVxuXHRcdDogc2lnbmFsLnJlYXNvbjtcblxuXHRyZXR1cm4gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBnZXRET01FeGNlcHRpb24ocmVhc29uKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBUaW1lb3V0KHByb21pc2UsIG9wdGlvbnMpIHtcblx0Y29uc3Qge1xuXHRcdG1pbGxpc2Vjb25kcyxcblx0XHRmYWxsYmFjayxcblx0XHRtZXNzYWdlLFxuXHRcdGN1c3RvbVRpbWVycyA9IHtzZXRUaW1lb3V0LCBjbGVhclRpbWVvdXR9LFxuXHR9ID0gb3B0aW9ucztcblxuXHRsZXQgdGltZXI7XG5cblx0Y29uc3Qgd3JhcHBlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgIT09ICdudW1iZXInIHx8IE1hdGguc2lnbihtaWxsaXNlY29uZHMpICE9PSAxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBtaWxsaXNlY29uZHNcXGAgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCBcXGAke21pbGxpc2Vjb25kc31cXGBgKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zaWduYWwpIHtcblx0XHRcdGNvbnN0IHtzaWduYWx9ID0gb3B0aW9ucztcblx0XHRcdGlmIChzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0XHRyZWplY3QoZ2V0QWJvcnRlZFJlYXNvbihzaWduYWwpKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuXHRcdFx0XHRyZWplY3QoZ2V0QWJvcnRlZFJlYXNvbihzaWduYWwpKTtcblx0XHRcdH07XG5cblx0XHRcdHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0SGFuZGxlciwge29uY2U6IHRydWV9KTtcblxuXHRcdFx0cHJvbWlzZS5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChtaWxsaXNlY29uZHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuXHRcdFx0cHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY3JlYXRlIHRoZSBlcnJvciBvdXRzaWRlIG9mIGBzZXRUaW1lb3V0YCB0byBwcmVzZXJ2ZSB0aGUgc3RhY2sgdHJhY2UuXG5cdFx0Y29uc3QgdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcigpO1xuXG5cdFx0dGltZXIgPSBjdXN0b21UaW1lcnMuc2V0VGltZW91dC5jYWxsKHVuZGVmaW5lZCwgKCkgPT4ge1xuXHRcdFx0aWYgKGZhbGxiYWNrKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShmYWxsYmFjaygpKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mIHByb21pc2UuY2FuY2VsID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHByb21pc2UuY2FuY2VsKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0XHRyZWplY3QobWVzc2FnZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aW1lb3V0RXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UgPz8gYFByb21pc2UgdGltZWQgb3V0IGFmdGVyICR7bWlsbGlzZWNvbmRzfSBtaWxsaXNlY29uZHNgO1xuXHRcdFx0XHRyZWplY3QodGltZW91dEVycm9yKTtcblx0XHRcdH1cblx0XHR9LCBtaWxsaXNlY29uZHMpO1xuXG5cdFx0KGFzeW5jICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJlc29sdmUoYXdhaXQgcHJvbWlzZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pKCk7XG5cdH0pO1xuXG5cdGNvbnN0IGNhbmNlbGFibGVQcm9taXNlID0gd3JhcHBlZFByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdFx0Y2FuY2VsYWJsZVByb21pc2UuY2xlYXIoKTtcblx0fSk7XG5cblx0Y2FuY2VsYWJsZVByb21pc2UuY2xlYXIgPSAoKSA9PiB7XG5cdFx0Y3VzdG9tVGltZXJzLmNsZWFyVGltZW91dC5jYWxsKHVuZGVmaW5lZCwgdGltZXIpO1xuXHRcdHRpbWVyID0gdW5kZWZpbmVkO1xuXHR9O1xuXG5cdHJldHVybiBjYW5jZWxhYmxlUHJvbWlzZTtcbn1cbiIsICIvLyBQb3J0IG9mIGxvd2VyX2JvdW5kIGZyb20gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2FsZ29yaXRobS9sb3dlcl9ib3VuZFxuLy8gVXNlZCB0byBjb21wdXRlIGluc2VydGlvbiBpbmRleCB0byBrZWVwIHF1ZXVlIHNvcnRlZCBhZnRlciBpbnNlcnRpb25cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gICAgbGV0IGZpcnN0ID0gMDtcbiAgICBsZXQgY291bnQgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zdCBzdGVwID0gTWF0aC50cnVuYyhjb3VudCAvIDIpO1xuICAgICAgICBsZXQgaXQgPSBmaXJzdCArIHN0ZXA7XG4gICAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2l0XSwgdmFsdWUpIDw9IDApIHtcbiAgICAgICAgICAgIGZpcnN0ID0gKytpdDtcbiAgICAgICAgICAgIGNvdW50IC09IHN0ZXAgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY291bnQgPSBzdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaXJzdDtcbn1cbiIsICJpbXBvcnQgbG93ZXJCb3VuZCBmcm9tICcuL2xvd2VyLWJvdW5kLmpzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByaW9yaXR5UXVldWUge1xuICAgICNxdWV1ZSA9IFtdO1xuICAgIGVucXVldWUocnVuLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBwcmlvcml0eTogMCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgICAgICAgICBwcmlvcml0eTogb3B0aW9ucy5wcmlvcml0eSxcbiAgICAgICAgICAgIHJ1bixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAmJiB0aGlzLiNxdWV1ZVt0aGlzLnNpemUgLSAxXS5wcmlvcml0eSA+PSBvcHRpb25zLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLiNxdWV1ZS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG93ZXJCb3VuZCh0aGlzLiNxdWV1ZSwgZWxlbWVudCwgKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcbiAgICAgICAgdGhpcy4jcXVldWUuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gICAgZGVxdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuI3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiBpdGVtPy5ydW47XG4gICAgfVxuICAgIGZpbHRlcihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWV1ZS5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQucHJpb3JpdHkgPT09IG9wdGlvbnMucHJpb3JpdHkpLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5ydW4pO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXVlLmxlbmd0aDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgcFRpbWVvdXQsIHsgVGltZW91dEVycm9yIH0gZnJvbSAncC10aW1lb3V0JztcbmltcG9ydCBQcmlvcml0eVF1ZXVlIGZyb20gJy4vcHJpb3JpdHktcXVldWUuanMnO1xuLyoqXG5Qcm9taXNlIHF1ZXVlIHdpdGggY29uY3VycmVuY3kgY29udHJvbC5cbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQUXVldWUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50O1xuICAgICNpc0ludGVydmFsSWdub3JlZDtcbiAgICAjaW50ZXJ2YWxDb3VudCA9IDA7XG4gICAgI2ludGVydmFsQ2FwO1xuICAgICNpbnRlcnZhbDtcbiAgICAjaW50ZXJ2YWxFbmQgPSAwO1xuICAgICNpbnRlcnZhbElkO1xuICAgICN0aW1lb3V0SWQ7XG4gICAgI3F1ZXVlO1xuICAgICNxdWV1ZUNsYXNzO1xuICAgICNwZW5kaW5nID0gMDtcbiAgICAvLyBUaGUgYCFgIGlzIG5lZWRlZCBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzIxOTRcbiAgICAjY29uY3VycmVuY3k7XG4gICAgI2lzUGF1c2VkO1xuICAgICN0aHJvd09uVGltZW91dDtcbiAgICAvKipcbiAgICBQZXItb3BlcmF0aW9uIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBPcGVyYXRpb25zIGZ1bGZpbGwgb25jZSBgdGltZW91dGAgZWxhcHNlcyBpZiB0aGV5IGhhdmVuJ3QgYWxyZWFkeS5cblxuICAgIEFwcGxpZXMgdG8gZWFjaCBmdXR1cmUgb3BlcmF0aW9uLlxuICAgICovXG4gICAgdGltZW91dDtcbiAgICAvLyBUT0RPOiBUaGUgYHRocm93T25UaW1lb3V0YCBvcHRpb24gc2hvdWxkIGFmZmVjdCB0aGUgcmV0dXJuIHR5cGVzIG9mIGBhZGQoKWAgYW5kIGBhZGRBbGwoKWBcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQ6IGZhbHNlLFxuICAgICAgICAgICAgaW50ZXJ2YWxDYXA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIGludGVydmFsOiAwLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICAgIGF1dG9TdGFydDogdHJ1ZSxcbiAgICAgICAgICAgIHF1ZXVlQ2xhc3M6IFByaW9yaXR5UXVldWUsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoISh0eXBlb2Ygb3B0aW9ucy5pbnRlcnZhbENhcCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5pbnRlcnZhbENhcCA+PSAxKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW50ZXJ2YWxDYXBcXGAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCwgZ290IFxcYCR7b3B0aW9ucy5pbnRlcnZhbENhcD8udG9TdHJpbmcoKSA/PyAnJ31cXGAgKCR7dHlwZW9mIG9wdGlvbnMuaW50ZXJ2YWxDYXB9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludGVydmFsID09PSB1bmRlZmluZWQgfHwgIShOdW1iZXIuaXNGaW5pdGUob3B0aW9ucy5pbnRlcnZhbCkgJiYgb3B0aW9ucy5pbnRlcnZhbCA+PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW50ZXJ2YWxcXGAgdG8gYmUgYSBmaW5pdGUgbnVtYmVyID49IDAsIGdvdCBcXGAke29wdGlvbnMuaW50ZXJ2YWw/LnRvU3RyaW5nKCkgPz8gJyd9XFxgICgke3R5cGVvZiBvcHRpb25zLmludGVydmFsfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50ID0gb3B0aW9ucy5jYXJyeW92ZXJDb25jdXJyZW5jeUNvdW50O1xuICAgICAgICB0aGlzLiNpc0ludGVydmFsSWdub3JlZCA9IG9wdGlvbnMuaW50ZXJ2YWxDYXAgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBvcHRpb25zLmludGVydmFsID09PSAwO1xuICAgICAgICB0aGlzLiNpbnRlcnZhbENhcCA9IG9wdGlvbnMuaW50ZXJ2YWxDYXA7XG4gICAgICAgIHRoaXMuI2ludGVydmFsID0gb3B0aW9ucy5pbnRlcnZhbDtcbiAgICAgICAgdGhpcy4jcXVldWUgPSBuZXcgb3B0aW9ucy5xdWV1ZUNsYXNzKCk7XG4gICAgICAgIHRoaXMuI3F1ZXVlQ2xhc3MgPSBvcHRpb25zLnF1ZXVlQ2xhc3M7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQ7XG4gICAgICAgIHRoaXMuI3Rocm93T25UaW1lb3V0ID0gb3B0aW9ucy50aHJvd09uVGltZW91dCA9PT0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jaXNQYXVzZWQgPSBvcHRpb25zLmF1dG9TdGFydCA9PT0gZmFsc2U7XG4gICAgfVxuICAgIGdldCAjZG9lc0ludGVydmFsQWxsb3dBbm90aGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNJbnRlcnZhbElnbm9yZWQgfHwgdGhpcy4jaW50ZXJ2YWxDb3VudCA8IHRoaXMuI2ludGVydmFsQ2FwO1xuICAgIH1cbiAgICBnZXQgI2RvZXNDb25jdXJyZW50QWxsb3dBbm90aGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGVuZGluZyA8IHRoaXMuI2NvbmN1cnJlbmN5O1xuICAgIH1cbiAgICAjbmV4dCgpIHtcbiAgICAgICAgdGhpcy4jcGVuZGluZy0tO1xuICAgICAgICB0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpO1xuICAgICAgICB0aGlzLmVtaXQoJ25leHQnKTtcbiAgICB9XG4gICAgI29uUmVzdW1lSW50ZXJ2YWwoKSB7XG4gICAgICAgIHRoaXMuI29uSW50ZXJ2YWwoKTtcbiAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZUludGVydmFsSWZOZWVkZWQoKTtcbiAgICAgICAgdGhpcy4jdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgI2lzSW50ZXJ2YWxQYXVzZWQoKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLiNpbnRlcnZhbElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy4jaW50ZXJ2YWxFbmQgLSBub3c7XG4gICAgICAgICAgICBpZiAoZGVsYXkgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWN0IGFzIHRoZSBpbnRlcnZhbCB3YXMgZG9uZVxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVzdW1lIGl0IGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHJlc3VtZWQgb24gbGluZSAxNjBcbiAgICAgICAgICAgICAgICB0aGlzLiNpbnRlcnZhbENvdW50ID0gKHRoaXMuI2NhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQpID8gdGhpcy4jcGVuZGluZyA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBY3QgYXMgdGhlIGludGVydmFsIGlzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jdGltZW91dElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNvblJlc3VtZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAjdHJ5VG9TdGFydEFub3RoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNxdWV1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4gY2xlYXIgdGhlIGludGVydmFsIChcInBhdXNlXCIpXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbiByZWRvIGl0IGxhdGVyIChcInJlc3VtZVwiKVxuICAgICAgICAgICAgaWYgKHRoaXMuI2ludGVydmFsSWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuI2ludGVydmFsSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW50ZXJ2YWxJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW1wdHknKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiNpc1BhdXNlZCkge1xuICAgICAgICAgICAgY29uc3QgY2FuSW5pdGlhbGl6ZUludGVydmFsID0gIXRoaXMuI2lzSW50ZXJ2YWxQYXVzZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy4jZG9lc0ludGVydmFsQWxsb3dBbm90aGVyICYmIHRoaXMuI2RvZXNDb25jdXJyZW50QWxsb3dBbm90aGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy4jcXVldWUuZGVxdWV1ZSgpO1xuICAgICAgICAgICAgICAgIGlmICgham9iKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBqb2IoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FuSW5pdGlhbGl6ZUludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVJbnRlcnZhbElmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgI2luaXRpYWxpemVJbnRlcnZhbElmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy4jaXNJbnRlcnZhbElnbm9yZWQgfHwgdGhpcy4jaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uSW50ZXJ2YWwoKTtcbiAgICAgICAgfSwgdGhpcy4jaW50ZXJ2YWwpO1xuICAgICAgICB0aGlzLiNpbnRlcnZhbEVuZCA9IERhdGUubm93KCkgKyB0aGlzLiNpbnRlcnZhbDtcbiAgICB9XG4gICAgI29uSW50ZXJ2YWwoKSB7XG4gICAgICAgIGlmICh0aGlzLiNpbnRlcnZhbENvdW50ID09PSAwICYmIHRoaXMuI3BlbmRpbmcgPT09IDAgJiYgdGhpcy4jaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNpbnRlcnZhbElkKTtcbiAgICAgICAgICAgIHRoaXMuI2ludGVydmFsSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxDb3VudCA9IHRoaXMuI2NhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQgPyB0aGlzLiNwZW5kaW5nIDogMDtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc1F1ZXVlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4ZWN1dGVzIGFsbCBxdWV1ZWQgZnVuY3Rpb25zIHVudGlsIGl0IHJlYWNoZXMgdGhlIGxpbWl0LlxuICAgICovXG4gICAgI3Byb2Nlc3NRdWV1ZSgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgICAgIHdoaWxlICh0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpKSB7IH1cbiAgICB9XG4gICAgZ2V0IGNvbmN1cnJlbmN5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29uY3VycmVuY3k7XG4gICAgfVxuICAgIHNldCBjb25jdXJyZW5jeShuZXdDb25jdXJyZW5jeSkge1xuICAgICAgICBpZiAoISh0eXBlb2YgbmV3Q29uY3VycmVuY3kgPT09ICdudW1iZXInICYmIG5ld0NvbmN1cnJlbmN5ID49IDEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb25jdXJyZW5jeVxcYCB0byBiZSBhIG51bWJlciBmcm9tIDEgYW5kIHVwLCBnb3QgXFxgJHtuZXdDb25jdXJyZW5jeX1cXGAgKCR7dHlwZW9mIG5ld0NvbmN1cnJlbmN5fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjb25jdXJyZW5jeSA9IG5ld0NvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLiNwcm9jZXNzUXVldWUoKTtcbiAgICB9XG4gICAgYXN5bmMgI3Rocm93T25BYm9ydChzaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgYWRkKGZ1bmN0aW9uXywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICB0aHJvd09uVGltZW91dDogdGhpcy4jdGhyb3dPblRpbWVvdXQsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcXVldWUuZW5xdWV1ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGVuZGluZysrO1xuICAgICAgICAgICAgICAgIHRoaXMuI2ludGVydmFsQ291bnQrKztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9IGZ1bmN0aW9uXyh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IHBUaW1lb3V0KFByb21pc2UucmVzb2x2ZShvcGVyYXRpb24pLCB7IG1pbGxpc2Vjb25kczogb3B0aW9ucy50aW1lb3V0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gUHJvbWlzZS5yYWNlKFtvcGVyYXRpb24sIHRoaXMuI3Rocm93T25BYm9ydChvcHRpb25zLnNpZ25hbCldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb21wbGV0ZWQnLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yICYmICFvcHRpb25zLnRocm93T25UaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI25leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWRkJyk7XG4gICAgICAgICAgICB0aGlzLiN0cnlUb1N0YXJ0QW5vdGhlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgYWRkQWxsKGZ1bmN0aW9ucywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZnVuY3Rpb25zLm1hcChhc3luYyAoZnVuY3Rpb25fKSA9PiB0aGlzLmFkZChmdW5jdGlvbl8sIG9wdGlvbnMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IChvciByZXN1bWUpIGV4ZWN1dGluZyBlbnF1ZXVlZCB0YXNrcyB3aXRoaW4gY29uY3VycmVuY3kgbGltaXQuIE5vIG5lZWQgdG8gY2FsbCB0aGlzIGlmIHF1ZXVlIGlzIG5vdCBwYXVzZWQgKHZpYSBgb3B0aW9ucy5hdXRvU3RhcnQgPSBmYWxzZWAgb3IgYnkgYC5wYXVzZSgpYCBtZXRob2QuKVxuICAgICovXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NRdWV1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IHF1ZXVlIGV4ZWN1dGlvbiBvbiBob2xkLlxuICAgICovXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuI2lzUGF1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYXIgdGhlIHF1ZXVlLlxuICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI3F1ZXVlID0gbmV3IHRoaXMuI3F1ZXVlQ2xhc3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVXNlZnVsIGlmIHlvdSBmb3IgZXhhbXBsZSBhZGQgYWRkaXRpb25hbCBpdGVtcyBhdCBhIGxhdGVyIHRpbWUuXG5cbiAgICBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBzZXR0bGVzIHdoZW4gdGhlIHF1ZXVlIGJlY29tZXMgZW1wdHkuXG4gICAgKi9cbiAgICBhc3luYyBvbkVtcHR5KCkge1xuICAgICAgICAvLyBJbnN0YW50bHkgcmVzb2x2ZSBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNvbkV2ZW50KCdlbXB0eScpO1xuICAgIH1cbiAgICAvKipcbiAgICBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBzZXR0bGVzIHdoZW4gdGhlIHF1ZXVlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBsaW1pdDogYHF1ZXVlLnNpemUgPCBsaW1pdGAuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhdm9pZCBoYXZpbmcgdGhlIHF1ZXVlIGdyb3cgYmV5b25kIGEgY2VydGFpbiBzaXplIHlvdSBjYW4gYGF3YWl0IHF1ZXVlLm9uU2l6ZUxlc3NUaGFuKClgIGJlZm9yZSBhZGRpbmcgYSBuZXcgaXRlbS5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9ubHkgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgd2FpdGluZyB0byBzdGFydC4gVGhlcmUgY291bGQgc3RpbGwgYmUgdXAgdG8gYGNvbmN1cnJlbmN5YCBqb2JzIGFscmVhZHkgcnVubmluZyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBpbmNsdWRlIGluIGl0cyBjYWxjdWxhdGlvbi5cbiAgICAqL1xuICAgIGFzeW5jIG9uU2l6ZUxlc3NUaGFuKGxpbWl0KSB7XG4gICAgICAgIC8vIEluc3RhbnRseSByZXNvbHZlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgICAgaWYgKHRoaXMuI3F1ZXVlLnNpemUgPCBsaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXZlbnQoJ25leHQnLCAoKSA9PiB0aGlzLiNxdWV1ZS5zaXplIDwgbGltaXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGlmZmVyZW5jZSB3aXRoIGAub25FbXB0eWAgaXMgdGhhdCBgLm9uSWRsZWAgZ3VhcmFudGVlcyB0aGF0IGFsbCB3b3JrIGZyb20gdGhlIHF1ZXVlIGhhcyBmaW5pc2hlZC4gYC5vbkVtcHR5YCBtZXJlbHkgc2lnbmFscyB0aGF0IHRoZSBxdWV1ZSBpcyBlbXB0eSwgYnV0IGl0IGNvdWxkIG1lYW4gdGhhdCBzb21lIHByb21pc2VzIGhhdmVuJ3QgY29tcGxldGVkIHlldC5cblxuICAgIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHNldHRsZXMgd2hlbiB0aGUgcXVldWUgYmVjb21lcyBlbXB0eSwgYW5kIGFsbCBwcm9taXNlcyBoYXZlIGNvbXBsZXRlZDsgYHF1ZXVlLnNpemUgPT09IDAgJiYgcXVldWUucGVuZGluZyA9PT0gMGAuXG4gICAgKi9cbiAgICBhc3luYyBvbklkbGUoKSB7XG4gICAgICAgIC8vIEluc3RhbnRseSByZXNvbHZlIGlmIG5vbmUgcGVuZGluZyBhbmQgaWYgbm90aGluZyBlbHNlIGlzIHF1ZXVlZFxuICAgICAgICBpZiAodGhpcy4jcGVuZGluZyA9PT0gMCAmJiB0aGlzLiNxdWV1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jb25FdmVudCgnaWRsZScpO1xuICAgIH1cbiAgICBhc3luYyAjb25FdmVudChldmVudCwgZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2l6ZSBvZiB0aGUgcXVldWUsIHRoZSBudW1iZXIgb2YgcXVldWVkIGl0ZW1zIHdhaXRpbmcgdG8gcnVuLlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWV1ZS5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBTaXplIG9mIHRoZSBxdWV1ZSwgZmlsdGVyZWQgYnkgdGhlIGdpdmVuIG9wdGlvbnMuXG5cbiAgICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZSB3aXRoIGEgc3BlY2lmaWMgcHJpb3JpdHkgbGV2ZWwuXG4gICAgKi9cbiAgICBzaXplQnkob3B0aW9ucykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1hcnJheS1jYWxsYmFjay1yZWZlcmVuY2VcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXVlLmZpbHRlcihvcHRpb25zKS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIE51bWJlciBvZiBydW5uaW5nIGl0ZW1zIChubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS5cbiAgICAqL1xuICAgIGdldCBwZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGVuZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgcXVldWUgaXMgY3VycmVudGx5IHBhdXNlZC5cbiAgICAqL1xuICAgIGdldCBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUGF1c2VkO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwifi9lcnJvci9iYXNlLWVycm9yLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3JrZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7fVxuIiwgImltcG9ydCB7IFdvcmtlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci1lcnJvci50c1wiO1xuXG5leHBvcnQgY2xhc3MgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IgZXh0ZW5kcyBXb3JrZXJFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBcIlBhcmFtZXRlciBtdXN0IGJlIGRlZmluZWRcIjtcbn1cbiIsICJpbXBvcnQgeyBlcnJBc3luYywgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuaW1wb3J0IHsgRVZFTlQgfSBmcm9tIFwifi9lbnVtL2V2ZW50LnRzXCI7XG5pbXBvcnQgeyB1cGxvYWRDaHVuayB9IGZyb20gXCJ+L2FwaS93ZWJzb2NrZXQudHNcIjtcbmltcG9ydCB7IGdldEZpbGVJbmRleEluUXVldWUgfSBmcm9tIFwifi9hcGkvbHVmaS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXJBY3Rpb25NZXNzYWdlIH0gZnJvbSBcIn4vaW50ZXJmYWNlL3dvcmtlci1hY3Rpb24tbWVzc2FnZS50c1wiO1xuaW1wb3J0IHsgZXZlbnRzLCBpbml0LCBzZW5kRmlsZUVycm9yLCB1cGRhdGVGaWxlIH0gZnJvbSBcIn4vd29ya2VyL3NoYXJlZC50c1wiO1xuaW1wb3J0IFBRdWV1ZSBmcm9tIFwicC1xdWV1ZVwiO1xuaW1wb3J0IHsgV09SS0VSX0FDVElPTiB9IGZyb20gXCJ+L2VudW0vd29ya2VyLWFjdGlvbi50c1wiO1xuaW1wb3J0IHsgZW5jcnlwdCB9IGZyb20gXCJ+L2FwaS9jcnlwdG8udHNcIjtcbmltcG9ydCB7IFdvcmtlclVuZGVmaW5lZFBhcmFtZXRlckVycm9yIH0gZnJvbSBcIn4vZXJyb3Ivd29ya2VyL3dvcmtlci11bmRlZmluZWQtcGFyYW1ldGVyLWVycm9yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEx1ZmlGaWxlIH0gZnJvbSBcIn4vZW50aXRpZXMvbHVmaS1maWxlLnRzXCI7XG5pbXBvcnQgeyB3b3JrZXJVcmwgfSBmcm9tIFwifi91dGlscy50c1wiO1xuXG5kZWNsYXJlIGNvbnN0IHNlbGY6IFdvcmtlcjtcblxubGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmNvbnN0IFFVRVVFX0NPTkNVUlJFTkNZX0xJTUlUID0gbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgfHwgMTtcbmNvbnN0IHF1ZXVlID0gbmV3IFBRdWV1ZSh7XG4gIGNvbmN1cnJlbmN5OiBRVUVVRV9DT05DVVJSRU5DWV9MSU1JVCxcbiAgYXV0b1N0YXJ0OiBmYWxzZSxcbn0pO1xubGV0IGl0ZW1zSW5RdWV1ZSA9IDA7XG5sZXQgaXNQYXVzZWQgPSBmYWxzZTtcbmxldCBsdWZpRmlsZTogTHVmaUZpbGU7XG5jb25zdCBlbmNyeXB0Sm9iID0gbmV3IFdvcmtlcih3b3JrZXJVcmwoXCJlbmNyeXB0XCIpLCB7IHR5cGU6IFwibW9kdWxlXCIgfSk7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgaWYgKCFpc0luaXRpYWxpemVkKSB7XG4gICAgaW5pdCgpO1xuICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgbHVmaUZpbGUgPSBldmVudC5kYXRhLmFyZ3MubHVmaUZpbGU7XG5cbiAgICBldmVudHMub25jZShFVkVOVC5VUExPQURfU1RBUlRFRCwgKCkgPT4ge1xuICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5VUExPQURfU1RBUlRFRCB9KTtcbiAgICB9KTtcblxuICAgIGV2ZW50cy5vbihFVkVOVC5DSFVOS19VUExPQURFRCwgKCkgPT4ge1xuICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5DSFVOS19VUExPQURFRCB9KTtcblxuICAgICAgaXRlbXNJblF1ZXVlLS07XG5cbiAgICAgIGlmIChcbiAgICAgICAgcXVldWUuaXNQYXVzZWQgJiYgIWlzUGF1c2VkICYmIGl0ZW1zSW5RdWV1ZSA8IFFVRVVFX0NPTkNVUlJFTkNZX0xJTUlUXG4gICAgICApIHtcbiAgICAgICAgcmVzdW1lUXVldWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGV2ZW50cy5vbmNlKEVWRU5ULlVQTE9BRF9DT01QTEVURSwgKCkgPT4ge1xuICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGV2ZW50OiBFVkVOVC5VUExPQURfQ09NUExFVEUsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGV2ZW50cy5vbihFVkVOVC5GSUxFX1VQREFURUQsIHVwZGF0ZUZpbGUpO1xuICB9XG5cbiAgaWYgKGV2ZW50LmRhdGEuYXJncy5jaHVuaykge1xuICAgIGV2ZW50LmRhdGEuYXJncy5sdWZpRmlsZSA9IGx1ZmlGaWxlO1xuICAgIHJldHVybiBzdGFydFVwbG9hZChcbiAgICAgIGV2ZW50LmRhdGEsXG4gICAgICBnZXRGaWxlSW5kZXhJblF1ZXVlKGx1ZmlGaWxlLmtleXMuY2xpZW50KSxcbiAgICApLm1hcEVycigoZXJyb3IpID0+IHtcbiAgICAgIHNlbmRGaWxlRXJyb3IobHVmaUZpbGUsIGVycm9yKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZXZlbnQuZGF0YS5hY3Rpb24gPT09IFdPUktFUl9BQ1RJT04uUEFVU0UpIHtcbiAgICAgIGlzUGF1c2VkID0gdHJ1ZTtcbiAgICAgIHBhdXNlUXVldWUoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEuYWN0aW9uID09PSBXT1JLRVJfQUNUSU9OLlJFU1VNRSkge1xuICAgICAgaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIHJlc3VtZVF1ZXVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRGaWxlRXJyb3IobHVmaUZpbGUsIG5ldyBXb3JrZXJVbmRlZmluZWRQYXJhbWV0ZXJFcnJvcigpKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHN0YXJ0VXBsb2FkID0gKFxuICB3b3JrZXJNZXNzYWdlOiBXb3JrZXJBY3Rpb25NZXNzYWdlLFxuICBzZXJ2ZXJRdWV1ZUluZGV4OiBudW1iZXIsXG4pOiBSZXN1bHRBc3luYzx2b2lkLCBFcnJvcj4gPT4ge1xuICBjb25zdCB7IGx1ZmlGaWxlLCBhbGdvIH0gPSB3b3JrZXJNZXNzYWdlLmFyZ3M7XG5cbiAgaWYgKFxuICAgIHdvcmtlck1lc3NhZ2UuYXJncy5jaHVuayAhPT0gdW5kZWZpbmVkICYmXG4gICAgYWxnbyAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIC8vIFVwbG9hZCBmaXJzdCBjaHVuayBiZWZvcmUgdG8gZ2V0IHNlcnZlcktleSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVwbG9hZCBvdGhlciBjaHVua3NcbiAgICBpZiAod29ya2VyTWVzc2FnZS5hcmdzLmNodW5rLmluZGV4ID09PSAwKSB7XG4gICAgICBlbmNyeXB0KGx1ZmlGaWxlLmtleXMuY2xpZW50LCB3b3JrZXJNZXNzYWdlLmFyZ3MuY2h1bmsuYnVmZmVyLCBhbGdvKS5tYXAoXG4gICAgICAgIChlbmNyeXB0ZWREYXRhKSA9PiB7XG4gICAgICAgICAgdXBsb2FkQ2h1bmsoXG4gICAgICAgICAgICBsdWZpRmlsZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG90YWw6IGx1ZmlGaWxlLnRvdGFsQ2h1bmtzLFxuICAgICAgICAgICAgICBwYXJ0OiAwLFxuICAgICAgICAgICAgICBzaXplOiBsdWZpRmlsZS5zaXplLFxuICAgICAgICAgICAgICBuYW1lOiBsdWZpRmlsZS5uYW1lLFxuICAgICAgICAgICAgICB0eXBlOiBsdWZpRmlsZS50eXBlLFxuICAgICAgICAgICAgICBkZWxheTogbHVmaUZpbGUuZGVsYXksXG4gICAgICAgICAgICAgIGRlbF9hdF9maXJzdF92aWV3OiBsdWZpRmlsZS5kZWxBdEZpcnN0VmlldyxcbiAgICAgICAgICAgICAgemlwcGVkOiBsdWZpRmlsZS56aXBwZWQsXG4gICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICBpOiBzZXJ2ZXJRdWV1ZUluZGV4LFxuICAgICAgICAgICAgICBmaWxlX3B3ZDogbHVmaUZpbGUucGFzc3dvcmQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGVkRGF0YSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaXRlbXNJblF1ZXVlKys7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZS5hZGQoKCkgPT4ge1xuICAgICAgICBpZiAod29ya2VyTWVzc2FnZS5hcmdzLmNodW5rKSB7XG4gICAgICAgICAgY29uc3Qgd2FpdEZvckVuY3J5cHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBpdGVtc0luUXVldWUrKztcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIGVuY3J5cHRKb2Iub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1cGxvYWRDaHVuayhcbiAgICAgICAgICAgICAgICAgIGx1ZmlGaWxlLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbDogbHVmaUZpbGUudG90YWxDaHVua3MsXG4gICAgICAgICAgICAgICAgICAgIHBhcnQ6IGV2ZW50LmRhdGEuY2h1bmtJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogbHVmaUZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbHVmaUZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbHVmaUZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZGVsYXk6IGx1ZmlGaWxlLmRlbGF5LFxuICAgICAgICAgICAgICAgICAgICBkZWxfYXRfZmlyc3RfdmlldzogbHVmaUZpbGUuZGVsQXRGaXJzdFZpZXcsXG4gICAgICAgICAgICAgICAgICAgIHppcHBlZDogbHVmaUZpbGUuemlwcGVkLFxuICAgICAgICAgICAgICAgICAgICBpZDogbHVmaUZpbGUua2V5cy5zZXJ2ZXIsXG4gICAgICAgICAgICAgICAgICAgIGk6IHNlcnZlclF1ZXVlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfcHdkOiBsdWZpRmlsZS5wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVuY3J5cHRlZERhdGEsXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZW5jcnlwdEpvYi5wb3N0TWVzc2FnZSh3b3JrZXJNZXNzYWdlLCBbXG4gICAgICAgICAgICB3b3JrZXJNZXNzYWdlLmFyZ3MuY2h1bmsuYnVmZmVyLFxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXF1ZXVlLmlzUGF1c2VkICYmIChpc1BhdXNlZCB8fFxuICAgICAgICAgICAgICBpdGVtc0luUXVldWUgPT09IFFVRVVFX0NPTkNVUlJFTkNZX0xJTUlUKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGF1c2VRdWV1ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdhaXRGb3JFbmNyeXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyQXN5bmMoXG4gICAgICBuZXcgV29ya2VyVW5kZWZpbmVkUGFyYW1ldGVyRXJyb3IoKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBva0FzeW5jKHVuZGVmaW5lZCk7XG59O1xuXG5jb25zdCBwYXVzZVF1ZXVlID0gKCkgPT4ge1xuICBxdWV1ZS5wYXVzZSgpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHsgZXZlbnQ6IEVWRU5ULkpPQl9QQVVTRUQgfSk7XG59O1xuXG5jb25zdCByZXN1bWVRdWV1ZSA9ICgpID0+IHtcbiAgcXVldWUuc3RhcnQoKTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IGV2ZW50OiBFVkVOVC5KT0JfUkVTVU1FRCB9KTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUF1QkEsUUFBSSxJQUFJLE9BQU8sWUFBWSxXQUFXLFVBQVU7QUFDaEQsUUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLFVBQVUsYUFDdkMsRUFBRSxRQUNGLFNBQVNBLGNBQWEsUUFBUSxVQUFVLE1BQU07QUFDOUMsYUFBTyxTQUFTLFVBQVUsTUFBTSxLQUFLLFFBQVEsVUFBVSxJQUFJO0FBQUEsSUFDN0Q7QUFFRixRQUFJO0FBQ0osUUFBSSxLQUFLLE9BQU8sRUFBRSxZQUFZLFlBQVk7QUFDeEMsdUJBQWlCLEVBQUU7QUFBQSxJQUNyQixXQUFXLE9BQU8sdUJBQXVCO0FBQ3ZDLHVCQUFp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O0FBQUE7QUFBYSxRQUFJRSxRQUFLLEVBQUMsUUFBTyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsYUFBWSxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsTUFBSyxDQUFDLEdBQUUsT0FBTSxDQUFDLEdBQUUsV0FBVSxFQUFDLFNBQVEsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGNBQVksS0FBSztBQUFBLE1BQU87QUFBRSxXQUFLLFVBQVE7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUU7QUFBQyxXQUFLLFdBQVMsV0FBVTtBQUFDLGVBQU0sY0FBWSxLQUFLO0FBQUEsTUFBTztBQUFFLFdBQUssVUFBUTtBQUFBLElBQUMsR0FBRSxLQUFJLFNBQVMsR0FBRTtBQUFDLFdBQUssV0FBUyxXQUFVO0FBQUMsZUFBTSxVQUFRLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxHQUFFLFVBQVMsU0FBUyxHQUFFO0FBQUMsV0FBSyxXQUFTLFdBQVU7QUFBQyxlQUFNLGdCQUFjLEtBQUs7QUFBQSxNQUFPO0FBQUUsV0FBSyxVQUFRO0FBQUEsSUFBQyxFQUFDLEVBQUM7QUFDM2MsSUFBQUEsTUFBSyxPQUFPLE1BQUksU0FBUyxHQUFFO0FBQUMsV0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFHLEtBQUssRUFBRTtBQUFFLFVBQUksR0FBRSxHQUFFLEdBQUUsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSyxFQUFFLENBQUM7QUFBRSxVQUFFLEVBQUU7QUFBTyxVQUFJLElBQUU7QUFBRSxVQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsc0JBQXNCO0FBQUUsV0FBSyxJQUFFLENBQUMsSUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxJQUFFLElBQUUsSUFBRyxLQUFJO0FBQUMsWUFBRSxFQUFFLElBQUUsQ0FBQztBQUFFLFlBQUcsTUFBSSxJQUFFLEtBQUcsTUFBSSxLQUFHLE1BQUksSUFBRSxFQUFFLEtBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLEdBQUUsTUFBSSxJQUFFLE1BQUksSUFBRSxLQUFHLElBQUUsTUFBSSxLQUFHLEtBQUcsSUFBRyxJQUFFLEtBQUcsSUFBRSxPQUFLLEtBQUc7QUFBSSxVQUFFLENBQUMsSUFBRSxFQUFFLElBQUUsQ0FBQyxJQUFFO0FBQUEsTUFBQztBQUFDLFdBQUksSUFBRSxHQUFFLEdBQUUsS0FBSSxJQUFJLEtBQUUsRUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxLQUFHLEtBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFDM2YsR0FBRyxDQUFDO0FBQUEsSUFBQztBQUNMLElBQUFBLE1BQUssT0FBTyxJQUFJLFlBQVUsRUFBQyxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRTtBQUFDLGFBQU8sR0FBRyxNQUFLLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsR0FBRSxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRSxHQUFFLFdBQVU7QUFBQyxVQUFJLElBQUUsS0FBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUssRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUUsV0FBSSxJQUFFLEdBQUUsTUFBTSxHQUFFLElBQUksSUFBRyxFQUFFLENBQUMsSUFBRSxLQUFHLElBQUUsT0FBSyxLQUFHLE1BQUksQ0FBQyxJQUFFO0FBQUUsV0FBSSxJQUFFLElBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxHQUFFLEtBQUcsS0FBRyxHQUFFLElBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHLElBQUUsS0FBRyxJQUFFLEtBQUcsSUFBRSxLQUFHLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxNQUFJLElBQUcsRUFBRSxDQUFDLElBQUUsR0FBRSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUUsSUFBRSxXQUFVLElBQUUsUUFBUSxJQUFFLE1BQU0sSUFBRSxXQUFVLEdBQUUsSUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFFLFdBQVUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksR0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSTtBQUFFLFdBQUksSUFDbGdCLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQ2hELGFBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUcsTUFBSSxFQUFFLE9BQU8sT0FBTSxJQUFJQSxNQUFLLFVBQVUsUUFBUSx3QkFBd0I7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxJQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxHQUFFLEdBQUUsR0FBRSxJQUFFLEVBQUUsU0FBTyxJQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksS0FBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsTUFBSSxFQUFFLElBQUUsRUFBRSxLQUFHLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLE1BQUksRUFBRSxJQUFFLEVBQUUsS0FBRyxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLEdBQUcsSUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFJLEVBQUUsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLElBQUUsRUFBRSxLQUFHLElBQUUsR0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFO0FBQUUsV0FBSSxJQUNyZixHQUFFLElBQUUsR0FBRSxJQUFJLEdBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxDQUFDLElBQUUsRUFBRSxNQUFJLEVBQUUsS0FBRyxLQUFHLEVBQUUsS0FBRyxLQUFHLEdBQUcsS0FBRyxLQUFHLEVBQUUsS0FBRyxJQUFFLEdBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxHQUFHLElBQUUsRUFBRSxHQUFHLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUU7QUFBRSxhQUFPO0FBQUEsSUFBQztBQUNoSCxJQUFBQSxNQUFLLFdBQVMsRUFBQyxVQUFTLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFFQSxNQUFLLFNBQVMsRUFBRSxFQUFFLE1BQU0sSUFBRSxFQUFFLEdBQUUsTUFBSSxJQUFFLEdBQUcsRUFBRSxNQUFNLENBQUM7QUFBRSxhQUFPLFdBQVMsSUFBRSxJQUFFQSxNQUFLLFNBQVMsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBSyxNQUFNLENBQUMsSUFBRSxJQUFFLEVBQUU7QUFBRSxlQUFRLElBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsS0FBRyxDQUFDLEtBQUcsS0FBRyxJQUFFLEVBQUUsSUFBRSxLQUFHLElBQUUsQ0FBQyxNQUFJLElBQUUsRUFBRSxJQUFFLEtBQUcsQ0FBQyxNQUFJLE1BQUksS0FBRyxLQUFHO0FBQUEsSUFBQyxHQUFFLFFBQU8sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLE1BQUksRUFBRSxVQUFRLE1BQUksRUFBRSxPQUFPLFFBQU8sRUFBRSxPQUFPLENBQUM7QUFBRSxVQUFJLElBQUUsRUFBRSxFQUFFLFNBQU8sQ0FBQyxHQUFFLElBQUVBLE1BQUssU0FBUyxXQUFXLENBQUM7QUFBRSxhQUFPLE9BQUssSUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFFQSxNQUFLLFNBQVMsRUFBRSxHQUFFLEdBQUUsSUFBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLEVBQUUsU0FBTyxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFPLGFBQU8sTUFDMWYsSUFBRSxJQUFFLE1BQUksSUFBRSxLQUFHQSxNQUFLLFNBQVMsV0FBVyxFQUFFLElBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQyxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHLEtBQUcsRUFBRSxTQUFPLEVBQUUsUUFBTztBQUFFLFVBQUUsRUFBRSxNQUFNLEdBQUUsS0FBSyxLQUFLLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBSSxJQUFFLEVBQUU7QUFBTyxVQUFFLElBQUU7QUFBRyxVQUFFLEtBQUcsTUFBSSxFQUFFLElBQUUsQ0FBQyxJQUFFQSxNQUFLLFNBQVMsUUFBUSxHQUFFLEVBQUUsSUFBRSxDQUFDLElBQUUsY0FBWSxJQUFFLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsYUFBTyxPQUFLLElBQUUsS0FBRyxJQUFFLElBQUUsSUFBRSxLQUFHLEtBQUcsS0FBRyxnQkFBYztBQUFBLElBQUMsR0FBRSxZQUFXLFNBQVMsR0FBRTtBQUFDLGFBQU8sS0FBSyxNQUFNLElBQUUsYUFBYSxLQUFHO0FBQUEsSUFBRSxHQUFFLE9BQU0sU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFHQSxNQUFLLFNBQVMsVUFBVSxDQUFDLE1BQUlBLE1BQUssU0FBUyxVQUFVLENBQUMsRUFBRSxRQUFNO0FBQUcsVUFBSSxJQUFFLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLE1BQUcsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUUsYUFBTyxNQUNsZjtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUk7QUFBRSxVQUFFO0FBQUUsV0FBSSxXQUFTLE1BQUksSUFBRSxDQUFDLElBQUcsTUFBSSxHQUFFLEtBQUcsR0FBRyxHQUFFLEtBQUssQ0FBQyxHQUFFLElBQUU7QUFBRSxVQUFHLE1BQUksRUFBRSxRQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUUsV0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxHQUFFLEtBQUssSUFBRSxFQUFFLENBQUMsTUFBSSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsS0FBRyxLQUFHO0FBQUUsVUFBRSxFQUFFLFNBQU8sRUFBRSxFQUFFLFNBQU8sQ0FBQyxJQUFFO0FBQUUsVUFBRUEsTUFBSyxTQUFTLFdBQVcsQ0FBQztBQUFFLFFBQUUsS0FBS0EsTUFBSyxTQUFTLFFBQVEsSUFBRSxJQUFFLElBQUcsS0FBRyxJQUFFLElBQUUsSUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLENBQUM7QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsU0FBUyxHQUFFLEdBQUU7QUFBQyxhQUFNLENBQUMsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUM7QUFBQSxJQUFDLEdBQUUsV0FBVSxTQUFTLEdBQUU7QUFBQyxVQUFJLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxFQUFFLEVBQUUsS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxNQUFJLEtBQUcsTUFBSSxJQUFFLFNBQVEsSUFBRSxVQUFTLElBQUUsS0FBRztBQUFHLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFDcGQsSUFBQUEsTUFBSyxNQUFNLGFBQVcsRUFBQyxVQUFTLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRSxJQUFHLElBQUVBLE1BQUss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RyxLQUFHO0FBQUEsTUFBRTtBQUFDLFVBQUUsTUFBSSxFQUFFLEtBQUtBLE1BQUssU0FBUyxRQUFRLElBQUUsSUFBRyxHQUFFLENBQUMsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFDLEVBQUM7QUFBRSxJQUFBQSxNQUFLLE1BQU0sWUFBVSxFQUFDLFVBQVMsU0FBUyxHQUFFO0FBQUMsYUFBT0EsTUFBSyxNQUFNLE9BQU8sU0FBUyxHQUFFLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRTtBQUFDLGFBQU9BLE1BQUssTUFBTSxPQUFPLE9BQU8sR0FBRSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLFNBQU8sU0FBUyxHQUFFO0FBQUMsV0FBSyxFQUFFLENBQUMsS0FBRyxLQUFLLEVBQUU7QUFBRSxXQUFHLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxLQUFLLElBQUUsRUFBRSxLQUFHLEtBQUssTUFBTTtBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssT0FBTyxPQUFLLFNBQVMsR0FBRTtBQUFDLGFBQU8sSUFBSUEsTUFBSyxLQUFLLFNBQVEsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFBLElBQUM7QUFDeGdCLElBQUFBLE1BQUssS0FBSyxPQUFPLFlBQVUsRUFBQyxXQUFVLEtBQUksT0FBTSxXQUFVO0FBQUMsV0FBSyxJQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBSSxHQUFFLElBQUUsS0FBSyxJQUFFQSxNQUFLLFNBQVMsT0FBTyxLQUFLLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSztBQUFFLFVBQUUsS0FBSyxJQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxVQUFHLG1CQUFpQixFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEscUNBQXFDO0FBQUUsVUFBRyxnQkFBYyxPQUFPLGFBQVk7QUFBQyxZQUFJLElBQUUsSUFBSSxZQUFZLENBQUMsR0FBRSxJQUFFO0FBQUUsYUFBSSxJQUFFLE1BQUksS0FBRyxNQUFJLElBQUUsTUFBTyxLQUFHLEdBQUUsS0FBRyxJQUFJLE1BQUssRUFBRSxFQUFFO0FBQUEsVUFBUyxLQUFHO0FBQUEsVUFDdGYsTUFBSSxJQUFFO0FBQUEsUUFBRSxDQUFDLEdBQUUsS0FBRztBQUFFLFVBQUUsT0FBTyxHQUFFLEtBQUcsQ0FBQztBQUFBLE1BQUMsTUFBTSxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxNQUFPLEtBQUcsR0FBRSxLQUFHLElBQUksTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFFLFVBQVcsQ0FBQztBQUFFLFdBQUksRUFBRSxLQUFLLEtBQUssSUFBRSxDQUFDLEdBQUUsRUFBRSxTQUFRLE1BQUssRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLENBQUM7QUFBRSxXQUFLLE1BQU07QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsV0FBVTtBQUFDLGVBQVMsRUFBRUMsSUFBRTtBQUFDLGVBQU8sY0FBYUEsS0FBRSxLQUFLLE1BQU1BLEVBQUMsS0FBRztBQUFBLE1BQUM7QUFBQyxlQUFRLElBQUUsR0FBRSxJQUFFLEdBQUUsR0FBRSxHQUFFLEtBQUcsR0FBRSxLQUFJO0FBQUMsWUFBRTtBQUFHLGFBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxHQUFFLElBQUksS0FBRyxNQUFJLElBQUUsR0FBRTtBQUFDLGNBQ3pmO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLEdBQUUsQ0FBQyxJQUFHLEtBQUssRUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLENBQUMsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FBRSxHQUFFLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFFLFdBQUksSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLE1BQUcsSUFBRSxJQUFFLEVBQUUsQ0FBQyxLQUFHLElBQUUsRUFBRSxJQUFFLElBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEtBQUcsRUFBRSxHQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksSUFBRSxLQUFHLEtBQUcsS0FBRyxPQUFLLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxLQUFHLEtBQUcsS0FBRyxLQUFHLE1BQUksRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLElBQUUsSUFBRSxFQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSSxJQUFFLEtBQUcsSUFBRSxNQUFJLEVBQUUsQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxLQUFHLElBQUUsSUFBRSxLQUFHLElBQUUsT0FBSyxNQUFJLElBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxLQUFHLEtBQUcsS0FBRyxLQUFHLEtBQUcsTUFBSTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQ3BmO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsSUFBRTtBQUFBLElBQUMsRUFBQztBQUFFLElBQUFELE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRTtBQUFDLFdBQUssRUFBRSxDQUFDLEtBQUcsS0FBSyxFQUFFO0FBQUUsV0FBRyxLQUFLLElBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFFLEtBQUssSUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUUsS0FBSyxJQUFFLEVBQUUsS0FBRyxLQUFLLE1BQU07QUFBQSxJQUFDO0FBQUUsSUFBQUEsTUFBSyxLQUFLLE9BQU8sT0FBSyxTQUFTLEdBQUU7QUFBQyxhQUFPLElBQUlBLE1BQUssS0FBSyxTQUFRLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUFDO0FBQy9TLElBQUFBLE1BQUssS0FBSyxPQUFPLFlBQVUsRUFBQyxXQUFVLE1BQUssT0FBTSxXQUFVO0FBQUMsV0FBSyxJQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsUUFBTyxTQUFTLEdBQUU7QUFBQyxtQkFBVyxPQUFPLE1BQUksSUFBRUEsTUFBSyxNQUFNLFdBQVcsT0FBTyxDQUFDO0FBQUcsVUFBSSxHQUFFLElBQUUsS0FBSyxJQUFFQSxNQUFLLFNBQVMsT0FBTyxLQUFLLEdBQUUsQ0FBQztBQUFFLFVBQUUsS0FBSztBQUFFLFVBQUUsS0FBSyxJQUFFLElBQUVBLE1BQUssU0FBUyxVQUFVLENBQUM7QUFBRSxVQUFHLG1CQUFpQixFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEscUNBQXFDO0FBQUUsVUFBRyxnQkFBYyxPQUFPLGFBQVk7QUFBQyxZQUFJLElBQUUsSUFBSSxZQUFZLENBQUMsR0FBRSxJQUFFO0FBQUUsYUFBSSxJQUFFLE9BQUssS0FBRyxPQUFLLElBQUUsT0FBTSxLQUFHLEdBQUUsS0FBRyxLQUFLLE1BQUssRUFBRSxFQUFFLFNBQVMsS0FDdGYsR0FBRSxNQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsS0FBRztBQUFFLFVBQUUsT0FBTyxHQUFFLEtBQUcsQ0FBQztBQUFBLE1BQUMsTUFBTSxNQUFJLElBQUUsT0FBSyxLQUFHLE9BQUssSUFBRSxPQUFNLEtBQUcsR0FBRSxLQUFHLEtBQUssTUFBSyxFQUFFLEVBQUUsT0FBTyxHQUFFLEVBQUUsQ0FBQztBQUFFLGFBQU87QUFBQSxJQUFJLEdBQUUsVUFBUyxXQUFVO0FBQUMsVUFBSSxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUUsS0FBSyxHQUFFLElBQUVBLE1BQUssU0FBUyxPQUFPLEdBQUUsQ0FBQ0EsTUFBSyxTQUFTLFFBQVEsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLFdBQUksSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFLElBQUcsSUFBSSxHQUFFLEtBQUssQ0FBQztBQUFFLFFBQUUsS0FBSyxDQUFDO0FBQUUsUUFBRSxLQUFLLENBQUM7QUFBRSxRQUFFLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBRSxVQUFXLENBQUM7QUFBRSxXQUFJLEVBQUUsS0FBSyxLQUFLLElBQUUsQ0FBQyxHQUFFLEVBQUUsU0FBUSxNQUFLLEVBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxDQUFDO0FBQUUsV0FBSyxNQUFNO0FBQUUsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLENBQUMsR0FBRSxJQUFHLENBQUMsVUFBUyxVQUFTLFNBQVEsU0FBUSxVQUFTLFNBQVEsU0FBUSxPQUFPLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRztBQUFBLE1BQUM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUNsZjtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFPO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFPO0FBQUEsTUFBTztBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVE7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQ3BmO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUTtBQUFBLE1BQU87QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVE7QUFBQSxNQUFRO0FBQUEsTUFBUTtBQUFBLE1BQVM7QUFBQSxJQUFPLEdBQUUsR0FBRSxXQUFVO0FBQUMsZUFBUyxFQUFFQyxJQUFFO0FBQUMsZUFBTyxjQUFhQSxLQUFFLEtBQUssTUFBTUEsRUFBQyxLQUFHO0FBQUEsTUFBQztBQUFDLGVBQVMsRUFBRUEsSUFBRTtBQUFDLGVBQU8saUJBQWVBLEtBQUUsS0FBSyxNQUFNQSxFQUFDLEtBQUc7QUFBQSxNQUFHO0FBQUMsZUFBUSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUU7QUFBRyxhQUFJLElBQUUsR0FBRSxJQUFFLEtBQUcsR0FBRSxJQUFJLEtBQUcsTUFBSSxJQUFFLEdBQUU7QUFBQyxjQUFFO0FBQUc7QUFBQSxRQUFLO0FBQUMsY0FBSSxJQUFFLE1BQUksS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsR0FBRSxDQUFDLEdBQUUsS0FBSyxFQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsRUFBRSxLQUFLLElBQUksR0FBRSxHQUFFLENBQUMsS0FBRyxLQUFHLEtBQUssR0FBRyxDQUFDLElBQUcsS0FBSyxFQUFFLElBQUUsQ0FBQyxJQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUUsSUFBRSxDQUFDLENBQUMsR0FBRSxLQUFLLEVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUssSUFBSSxHQUFFLElBQUUsQ0FBQyxDQUFDLEtBQUcsS0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFFO0FBQUEsTUFBSTtBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRTtBQUFDLFVBQUksR0FDdmdCLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxLQUFLLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsRUFBRSxHQUFFLEtBQUcsRUFBRSxFQUFFLEdBQUUsSUFBRSxFQUFFLEVBQUUsR0FBRTtBQUFFLFVBQUcsZ0JBQWMsT0FBTyxhQUFZO0FBQUMsWUFBRSxNQUFNLEdBQUc7QUFBRSxpQkFBUSxJQUFFLEdBQUUsS0FBRyxHQUFFLElBQUksR0FBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUEsTUFBQyxNQUFNLEtBQUU7QUFBRSxVQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxJQUFHLElBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxLQUFHLEdBQUUsS0FBSTtBQUFDLFlBQUcsS0FBRyxFQUFFLEtBQUUsRUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsSUFBRSxJQUFFLENBQUM7QUFBQSxhQUFNO0FBQUMsY0FBRSxFQUFFLEtBQUcsSUFBRSxHQUFHO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGVBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxLQUFHLE1BQUk7QUFBRSxjQUFJLEtBQUcsS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxNQUFJLEtBQUcsS0FBRyxNQUFJO0FBQUcsY0FBRSxFQUFFLEtBQUcsSUFBRSxFQUFFO0FBQUUsY0FBSSxJQUFFLEVBQUUsS0FBRyxJQUFFLEtBQUcsQ0FBQyxHQUNuZixLQUFHLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxJQUFFLE1BQUksTUFBSSxNQUFJLEdBQUUsS0FBRyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksSUFBRyxJQUFFLEVBQUUsS0FBRyxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLEdBQUcsR0FBRSxJQUFFLEVBQUUsS0FBRyxJQUFFLE1BQUksQ0FBQztBQUFFLGNBQUUsSUFBRSxFQUFFLEtBQUcsSUFBRSxLQUFHLENBQUM7QUFBRSxjQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUU7QUFBRyxlQUFHO0FBQUUsZUFBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLGVBQUc7QUFBRSxlQUFHLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFO0FBQUEsUUFBRTtBQUFDLFVBQUUsSUFBRSxDQUFDLElBQUUsS0FBRztBQUFFLFVBQUUsSUFBRSxJQUFFLENBQUMsSUFBRSxLQUFHO0FBQUUsWUFBSSxJQUFFLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxLQUFHLElBQUUsSUFBRSxDQUFDLElBQUUsR0FBRSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUUsSUFBRSxHQUFFLEtBQUcsSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFLEdBQUUsS0FBRyxLQUFHLElBQUUsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLE1BQUksS0FBRyxLQUFHLE1BQUksSUFBRyxLQUFHLEtBQUcsSUFBRSxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksTUFBSSxLQUFHLEtBQUcsTUFBSSxJQUFHLEtBQUcsRUFBRSxJQUFFLENBQUMsR0FBRSxLQUFHLEVBQUUsSUFBRSxJQUFFLENBQUMsR0FBRSxJQUFFLE1BQUksS0FBRyxLQUFHLE1BQUksT0FBSyxLQUFHLEtBQUcsTUFBSSxPQUFLLEtBQUcsS0FBRyxNQUFJLEtBQUksSUFBRSxNQUFJLEtBQUcsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLE1BQUksT0FBSyxLQUNwZixLQUFHLE1BQUksT0FBSyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsSUFBRyxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsS0FBRyxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRyxJQUFFLEtBQUcsTUFBSSxNQUFJLElBQUUsT0FBSyxJQUFFLElBQUUsS0FBSSxJQUFFLElBQUUsSUFBRSxHQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFJLFlBQUUsSUFBRTtBQUFHLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRTtBQUFHLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUUsSUFBRSxJQUFFO0FBQUUsWUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBRSxZQUFFLElBQUUsSUFBRTtBQUFFLFlBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsTUFBQztBQUFDLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsQ0FBQyxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsQ0FBQyxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxDQUFDLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxDQUFDLElBQUUsSUFBRSxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUUsVUFBRSxFQUFFLENBQUMsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFFLENBQUMsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFDbmY7QUFBRSxRQUFFLEVBQUUsSUFBRSxJQUFFLEtBQUcsTUFBSSxJQUFFLE1BQUksSUFBRSxJQUFFLEtBQUc7QUFBRSxVQUFFLEVBQUUsRUFBRSxJQUFFLElBQUUsSUFBRTtBQUFFLFFBQUUsRUFBRSxJQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsTUFBSSxJQUFFLElBQUUsS0FBRztBQUFFLFVBQUUsRUFBRSxFQUFFLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBRSxFQUFFLElBQUUsS0FBRyxLQUFHLE1BQUksSUFBRSxNQUFJLElBQUUsSUFBRSxLQUFHO0FBQUEsSUFBQyxFQUFDO0FBQ3pILElBQUFELE1BQUssS0FBSyxNQUFJLEVBQUMsTUFBSyxPQUFNLEdBQUUsQ0FBQyxHQUFFLGdCQUFlLFNBQVMsR0FBRTtBQUFDLE1BQUFBLE1BQUssS0FBSyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUEsSUFBQyxHQUFFLGtCQUFpQixTQUFTLEdBQUU7QUFBQyxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUFFLFdBQUcsS0FBR0EsTUFBSyxLQUFLLElBQUksRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxJQUFHLFNBQVMsR0FBRTtBQUFDLFVBQUksSUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUU7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQztBQUFBLElBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxHQUFFLElBQUUsRUFBRSxNQUFNLENBQUMsR0FBRSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFO0FBQUUsVUFBRSxLQUFHO0FBQUcsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFHLElBQUUsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLGtDQUFrQztBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsS0FBRyxNQUFJLElBQUUsR0FBRSxJQUFJO0FBQUMsVUFBRSxLQUFHLE1BQUksSUFBRSxLQUFHO0FBQUcsVUFBRSxFQUFFO0FBQUEsUUFBTTtBQUFBLFFBQ3RmLEtBQUcsS0FBRztBQUFBLE1BQUU7QUFBRSxVQUFFQSxNQUFLLEtBQUssSUFBSSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBRUEsTUFBSyxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLGFBQU8sRUFBRSxPQUFPLEVBQUUsTUFBSyxFQUFFLEdBQUc7QUFBQSxJQUFDLEdBQUUsU0FBUSxTQUFTLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQUUsS0FBRztBQUFHLFVBQUUsS0FBRyxDQUFDO0FBQUUsVUFBSSxJQUFFQSxNQUFLLFVBQVMsSUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLFNBQVMsR0FBRSxJQUFFLENBQUMsR0FBRSxLQUFHLElBQUUsS0FBRztBQUFFLFVBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsa0NB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QyxHQUFFLEdBQUUsQ0FBQztBQUFFLFVBQUcsQ0FBQyxFQUFFLFFBQU0sRUFBQyxLQUFJLEdBQUUsTUFBSyxDQUFDLEVBQUM7QUFBRSxXQUFJLElBQUUsR0FBRSxJQUFFLEdBQUUsS0FBRyxFQUFFLEtBQUUsTUFBSUEsTUFBSyxLQUFLLElBQUksR0FBRyxJQUNyZ0IsQ0FBQyxHQUFFLEtBQUcsSUFBRyxFQUFFLENBQUMsS0FBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsRUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDLEdBQUUsRUFBRSxJQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLElBQUUsQ0FBQyxLQUFHLEVBQUUsQ0FBQyxHQUFFLEVBQUUsSUFBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsYUFBTSxFQUFDLEtBQUksR0FBRSxNQUFLLEVBQUUsTUFBTSxHQUFFLENBQUMsRUFBQztBQUFBLElBQUMsRUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxPQUFLLFNBQVMsR0FBRSxHQUFFO0FBQUMsV0FBSyxJQUFFLElBQUUsS0FBR0EsTUFBSyxLQUFLO0FBQU8sVUFBSSxJQUFFLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxHQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVUsWUFBVTtBQUFHLFdBQUssSUFBRSxDQUFDLElBQUksS0FBRSxJQUFJLEdBQUM7QUFBRSxRQUFFLFNBQU8sTUFBSSxJQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUcsV0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFLFdBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQVcsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFBQztBQUMzWSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFVBQVFBLE1BQUssS0FBSyxLQUFLLFVBQVUsTUFBSSxTQUFTLEdBQUU7QUFBQyxVQUFHLEtBQUssRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLHlDQUF5QztBQUFFLFdBQUssT0FBTyxDQUFDO0FBQUUsYUFBTyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssS0FBSyxVQUFVLFFBQU0sV0FBVTtBQUFDLFdBQUssSUFBRSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUUsV0FBSyxJQUFFO0FBQUEsSUFBRTtBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUU7QUFBRyxXQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFBQztBQUFFLElBQUFBLE1BQUssS0FBSyxLQUFLLFVBQVUsU0FBTyxXQUFVO0FBQUMsVUFBSSxJQUFFLEtBQUssRUFBRSxTQUFTLEdBQUUsSUFBRyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUcsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFFLFdBQUssTUFBTTtBQUFFLGFBQU87QUFBQSxJQUFDO0FBQ3ZlLElBQUFBLE1BQUssS0FBSyxTQUFPLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRSxLQUFHO0FBQUksVUFBRyxJQUFFLEtBQUcsSUFBRSxFQUFFLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsMEJBQTBCO0FBQUUsbUJBQVcsT0FBTyxNQUFJLElBQUVBLE1BQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFHLG1CQUFXLE9BQU8sTUFBSSxJQUFFQSxNQUFLLE1BQU0sV0FBVyxPQUFPLENBQUM7QUFBRyxVQUFFLEtBQUdBLE1BQUssS0FBSztBQUFLLFVBQUUsSUFBSSxFQUFFLENBQUM7QUFBRSxVQUFJLEdBQUUsR0FBRSxHQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRUEsTUFBSztBQUFTLFdBQUksSUFBRSxHQUFFLEtBQUcsRUFBRSxVQUFRLEtBQUcsSUFBRyxLQUFJO0FBQUMsWUFBRSxJQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUUsYUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUksTUFBSSxJQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksR0FBRSxDQUFDLEtBQUcsRUFBRSxDQUFDO0FBQUUsWUFBRSxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQUM7QUFBQyxZQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFHLGFBQU87QUFBQSxJQUFDO0FBQ25kLElBQUFBLE1BQUssT0FBSyxTQUFTLEdBQUU7QUFBQyxXQUFLLElBQUUsQ0FBQyxJQUFJQSxNQUFLLEtBQUssUUFBTTtBQUFFLFdBQUssSUFBRSxDQUFDLENBQUM7QUFBRSxXQUFLLElBQUU7QUFBRSxXQUFLLElBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLEtBQUssSUFBRSxLQUFLLElBQUUsS0FBSyxLQUFHO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsV0FBSyxJQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFdBQUssSUFBRTtBQUFPLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRTtBQUFHLFdBQUssSUFBRSxFQUFDLFVBQVMsQ0FBQyxHQUFFLFFBQU8sQ0FBQyxFQUFDO0FBQUUsV0FBSyxJQUFFLEtBQUssS0FBRztBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssSUFBRTtBQUFFLFdBQUssS0FBRztBQUFRLFdBQUssSUFBRSxDQUFDLEdBQUUsSUFBRyxJQUFHLElBQUcsS0FBSSxLQUFJLEtBQU0sS0FBSSxLQUFJLEtBQUksSUFBSTtBQUFFLFdBQUss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RUFBRSxFQUFFLElBQUVBLE1BQUssS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEdBQUUsR0FBRSxFQUFFLElBQUcsR0FBRSxFQUFFLEVBQUU7QUFBRSxhQUFPO0FBQUEsSUFBQyxHQUFFLFNBQVEsU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBSSxJQUFFQSxNQUFLLE1BQUssSUFBRSxFQUFFLEdBQUcsTUFBTSxHQUFFLFNBQVM7QUFBRSxhQUFPLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFBQyxHQUFFLElBQUcsU0FBUyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBRSxLQUFHLENBQUM7QUFBRSxVQUFFLEtBQUcsQ0FBQztBQUFFLFVBQUksSUFBRUEsTUFBSztBQUFLLFVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFFLEVBQUUsUUFBUSxHQUFFLENBQUMsR0FBRSxHQUFFLElBQUU7QUFBRSxVQUFJLEdBQUU7QUFBRSxVQUFFLEVBQUU7QUFBTSxtQkFBVyxPQUFPLEVBQUUsU0FBTyxFQUFFLE9BQUtBLE1BQUssTUFBTSxPQUFPLE9BQU8sRUFBRSxJQUFJO0FBQUcsbUJBQVcsT0FBTyxFQUFFLE9BQUssRUFBRSxLQUFHQSxNQUFLLE1BQU0sT0FBTyxPQUFPLEVBQUUsRUFBRTtBQUFHLFVBQUcsQ0FBQ0EsTUFBSyxLQUFLLEVBQUUsSUFBSSxLQUFHLENBQUNBLE1BQUssT0FBTyxFQUFFLE1BQU0sS0FBRyxhQUNsZixPQUFPLEtBQUcsT0FBSyxFQUFFLFFBQU0sT0FBSyxFQUFFLE1BQUksT0FBSyxFQUFFLE1BQUksUUFBTSxFQUFFLE1BQUksUUFBTSxFQUFFLE1BQUksUUFBTSxFQUFFLE1BQUksUUFBUSxFQUFFLE1BQUksQ0FBQyxFQUFFLE1BQUksSUFBRSxFQUFFLEdBQUcsVUFBUSxJQUFFLEVBQUUsR0FBRyxPQUFPLE9BQU0sSUFBSUEsTUFBSyxVQUFVLFFBQVEsa0NBQWtDO0FBQUUsbUJBQVcsT0FBTyxLQUFHLElBQUVBLE1BQUssS0FBSyxhQUFhLEdBQUUs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UUFBTSxFQUFFLENBQUMsTUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUUsV0FBUyxFQUFFLENBQUM7QUFBQSxNQUFFO0FBQUMsYUFBTztBQUFBLElBQUMsR0FBRSxHQUFFLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxpQkFBUyxNQUFJLElBQUUsQ0FBQztBQUFHLFVBQUcsV0FBUyxFQUFFLFFBQU87QUFBRSxlQUFRLEtBQUssRUFBRSxLQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUU7QUFBQyxZQUFHLEtBQUcsV0FBUyxFQUFFLENBQUMsS0FBRyxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsRUFBRSxPQUFNLElBQUlBLE1BQUssVUFBVSxRQUFRLCtCQUErQjtBQUFFLFVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFBLE1BQUM7QUFBQyxhQUFPO0FBQUEsSUFBQyxHQUFFLElBQUcsU0FBUyxHQUFFLEdBQUU7QUFBQyxVQUFJLElBQUUsQ0FBQyxHQUFFO0FBQUUsV0FBSSxLQUFLLEVBQUUsR0FBRSxlQUFlLENBQUMsS0FBRyxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUM7QUFBRyxhQUFPO0FBQUEsSUFBQyxHQUFFLElBQUcsU0FBUyxHQUM1ZixHQUFFO0FBQUMsVUFBSSxJQUFFLENBQUMsR0FBRTtBQUFFLFdBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksWUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFBRyxhQUFPO0FBQUEsSUFBQyxFQUFDO0FBQUUsSUFBQUEsTUFBSyxVQUFRQSxNQUFLLEtBQUs7QUFBUSxJQUFBQSxNQUFLLFVBQVFBLE1BQUssS0FBSztBQUFRLElBQUFBLE1BQUssS0FBSyxLQUFHLENBQUM7QUFBRSxJQUFBQSxNQUFLLEtBQUssZUFBYSxTQUFTLEdBQUUsR0FBRTtBQUFDLFVBQUksSUFBRUEsTUFBSyxLQUFLLElBQUc7QUFB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LFVBQVM7QUFBQSxvQkFDNUIsUUFBUUEsVUFBUztBQUFBLG9CQUNqQixJQUFJQSxVQUFTLEtBQUs7QUFBQSxvQkFDbEIsR0FBRztBQUFBLG9CQUNILFVBQVVBLFVBQVM7QUFBQSxrQkFDckI7QUFBQSxrQkFDQSxNQUFNLEtBQUs7QUFBQSxnQkFDYixDQUFDO0FBQUEsY0FDSDtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFFQSxxQkFBVyxZQUFZLGVBQWU7QUFBQSxZQUNwQyxjQUFjLEtBQUssTUFBTTtBQUFBLFVBQzNCLENBQUM7QUFFRCxjQUNFLENBQUMsTUFBTSxhQUFhLFlBQ2xCLGlCQUFpQiwwQkFDbkI7QUFDQSx1QkFBVztBQUFBLFVBQ2I7QUFFQSw0QkFBa0I7QUFBQSxRQUNwQjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGLE9BQU87QUFDTCxXQUFPO0FBQUEsTUFDTCxJQUFJLDhCQUE4QjtBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUNBLFNBQU8sUUFBUSxNQUFTO0FBQzFCO0FBRUEsSUFBTSxhQUFhLE1BQU07QUFDdkIsUUFBTSxNQUFNO0FBQ1osT0FBSyxZQUFZLEVBQUUscUNBQXdCLENBQUM7QUFDOUM7QUFFQSxJQUFNLGNBQWMsTUFBTTtBQUN4QixRQUFNLE1BQU07QUFDWixPQUFLLFlBQVksRUFBRSx1Q0FBeUIsQ0FBQztBQUMvQzsiLAogICJuYW1lcyI6IFsiUmVmbGVjdEFwcGx5IiwgIlJlZmxlY3RPd25LZXlzIiwgIk51bWJlcklzTmFOIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAiZXJyIiwgIm9uY2UiLCAic2pjbCIsICJhIiwgIkV2ZW50RW1pdHRlciIsICJldmVudHMiLCAidiIsICJvayIsICJlcnIiLCAiUmVzdWx0IiwgImZyb21UaHJvd2FibGUiLCAib2siLCAiZXJyIiwgInNlbGYiLCAiRXZlbnRFbWl0dGVyIiwgImx1ZmlGaWxlIiwgIm9iaiIsICJEZWNvZGUiLCAib2JqIiwgInNqY2wiLCAiZGVjcnlwdCIsICJlbmNyeXB0IiwgIkRlY29kZSIsICJkZWNyeXB0IiwgImVuY3J5cHQiLCAibHVmaUZpbGUiLCAiZGVjcnlwdCIsICJsdWZpRmlsZSIsICJsdWZpRmlsZSIsICJpbXBvcnRfZXZlbnRzIiwgImltcG9ydF9ldmVudHMiLCAiZXZlbnRzIiwgIkV2ZW50RW1pdHRlciIsICJfcXVldWUiLCAiRXZlbnRFbWl0dGVyIiwgImx1ZmlGaWxlIiwgImVuY3J5cHQiXQp9Cg==