try { (() => { 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 __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a2, b) => (typeof require !== "undefined" ? require : a2)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); var __esm = (fn2, res) => function __init() { return fn2 && (res = (0, fn2[__getOwnPropNames(fn2)[0]])(fn2 = 0)), res; }; var __commonJS = (cb, mod) => function __require2() { 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 )); // source/constants.mjs var internalSymbol, internalStateSymbol, instanceSymbol, proxyInstanceMarker; var init_constants = __esm({ "source/constants.mjs"() { internalSymbol = Symbol.for("@schukai/monster/internal"); internalStateSymbol = Symbol.for("@schukai/monster/state"); instanceSymbol = Symbol.for("@schukai/monster/instance"); proxyInstanceMarker = Symbol.for( "@schukai/monster/proxy-instance-marker" ); } }); // source/types/is.mjs function isProxy(value) { return value?.[proxyInstanceMarker] === proxyInstanceMarker; } function isIterable(value) { if (value === void 0) return false; if (value === null) return false; return typeof value?.[Symbol.iterator] === "function"; } function isPrimitive(value) { var type3; if (value === void 0 || value === null) { return true; } type3 = typeof value; if (type3 === "string" || type3 === "number" || type3 === "boolean" || type3 === "symbol") { return true; } return false; } function isSymbol(value) { return "symbol" === typeof value ? true : false; } function isBoolean(value) { if (value === true || value === false) { return true; } return false; } function isString(value) { if (value === void 0 || typeof value !== "string") { return false; } return true; } function isObject(value) { if (isArray(value)) return false; if (isPrimitive(value)) return false; if (typeof value === "object") { return true; } return false; } function isInstance(value, instance) { if (!isObject(value)) return false; if (!isFunction(instance)) return false; if (!instance.hasOwnProperty("prototype")) return false; if (value instanceof instance) return true; let proto = Object.getPrototypeOf(value); while (proto != null) { if (proto === instance.prototype) return true; proto = Object.getPrototypeOf(proto); } return false; } function isArray(value) { return Array.isArray(value); } function isFunction(value) { if (isArray(value)) return false; if (isPrimitive(value)) return false; if (typeof value === "function") { return true; } return false; } function isInteger(value) { return Number.isInteger(value); } var init_is = __esm({ "source/types/is.mjs"() { init_constants(); } }); // source/types/validate.mjs function validateIterable(value) { if (!isIterable(value)) { throw new TypeError("value is not iterable"); } return value; } function validatePrimitive(value) { if (!isPrimitive(value)) { throw new TypeError("value is not a primitive"); } return value; } function validateBoolean(value) { if (!isBoolean(value)) { throw new TypeError("value is not a boolean"); } return value; } function validateString(value) { if (!isString(value)) { throw new TypeError("value is not a string"); } return value; } function validateObject(value) { if (!isObject(value)) { throw new TypeError("value is not a object"); } return value; } function validateInstance(value, instance) { if (!isInstance(value, instance)) { let n = ""; if (isObject(instance) || isFunction(instance)) { n = instance?.["name"]; } if (n) { n = ` ${n}`; } throw new TypeError(`value is not an instance of${n}`); } return value; } function validateArray(value) { if (!isArray(value)) { throw new TypeError("value is not an array"); } return value; } function validateSymbol(value) { if (!isSymbol(value)) { throw new TypeError("value is not an symbol"); } return value; } function validateFunction(value) { if (!isFunction(value)) { throw new TypeError("value is not a function"); } return value; } function validateInteger(value) { if (!isInteger(value)) { throw new TypeError("value is not an integer"); } return value; } var init_validate = __esm({ "source/types/validate.mjs"() { init_is(); } }); // source/types/global.mjs function getGlobal() { return globalReference; } function getGlobalObject(name) { validateString(name); const o = globalReference?.[name]; if (typeof o === "undefined") throw new Error(`the object ${name} is not defined`); validateObject(o); return o; } function getGlobalFunction(name) { validateString(name); const f = globalReference?.[name]; if (typeof f === "undefined") throw new Error(`the function ${name} is not defined`); validateFunction(f); return f; } var globalReference; var init_global = __esm({ "source/types/global.mjs"() { init_validate(); (function() { if (typeof globalThis === "object") { globalReference = globalThis; return; } if (typeof self !== "undefined") { globalReference = self; return; } else if (typeof window !== "undefined") { globalReference = window; return; } Object.defineProperty(Object.prototype, "__monster__", { get: function() { return this; }, configurable: true }); if (typeof __monster__ === "object") { __monster__.globalThis = __monster__; delete Object.prototype.__monster__; globalReference = globalThis; return; } try { globalReference = Function("return this")(); } catch (e) { } throw new Error("unsupported environment."); })(); } }); // source/types/typeof.mjs function typeOf(value) { let type3 = {}.toString.call(value).match(/\s([a-zA-Z]+)/)[1]; if ("Object" === type3) { const name = value.constructor.name; if (name) { return name.toLowerCase(); } const results = /^(class|function)\s+(\w+)/.exec( value.constructor.toString() ); type3 = results && results.length > 2 ? results[2] : ""; } return type3.toLowerCase(); } var init_typeof = __esm({ "source/types/typeof.mjs"() { } }); // source/data/extend.mjs function extend(...args) { let o; let i; if (typeof args !== "object" || args[0] === null) { throw new Error(`unsupported argument ${JSON.stringify(args[0])}`); } for (i = 0; i < args.length; i++) { const a2 = args[i]; if (!(isObject(a2) || isArray(a2))) { throw new Error(`unsupported argument ${JSON.stringify(a2)}`); } if (o === void 0) { o = a2; continue; } for (const k in a2) { const v = a2?.[k]; if (k in o && v === o?.[k]) { continue; } if (isObject(v) && typeOf(v) === "object" || isArray(v)) { if (o[k] === void 0) { if (isArray(v)) { o[k] = []; } else { o[k] = {}; } } else { if (typeOf(o[k]) !== typeOf(v)) { throw new Error( `type mismatch: ${JSON.stringify(o[k])}(${typeOf( o[k] )}) != ${JSON.stringify(v)}(${typeOf(v)})` ); } } if (isArray(o[k])) { o[k] = []; o[k].push(...v); continue; } o[k] = extend(o[k], v); } else { if (isArray(o)) { o.push(v); continue; } o[k] = v; } } } return o; } var init_extend = __esm({ "source/data/extend.mjs"() { init_is(); init_typeof(); } }); // node_modules/.pnpm/dom-storage@2.1.0/node_modules/dom-storage/lib/index.js var require_lib = __commonJS({ "node_modules/.pnpm/dom-storage@2.1.0/node_modules/dom-storage/lib/index.js"(exports, module) { (function() { "use strict"; var fs = __require("fs"); function Storage2(path, opts) { opts = opts || {}; var db; Object.defineProperty(this, "___priv_bk___", { value: { path }, writable: false, enumerable: false }); Object.defineProperty(this, "___priv_strict___", { value: !!opts.strict, writable: false, enumerable: false }); Object.defineProperty(this, "___priv_ws___", { value: opts.ws || " ", writable: false, enumerable: false }); try { db = JSON.parse(fs.readFileSync(path)); } catch (e) { db = {}; } Object.keys(db).forEach(function(key) { this[key] = db[key]; }, this); } Storage2.prototype.getItem = function(key) { if (this.hasOwnProperty(key)) { if (this.___priv_strict___) { return String(this[key]); } else { return this[key]; } } return null; }; Storage2.prototype.setItem = function(key, val) { if (val === void 0) { this[key] = null; } else if (this.___priv_strict___) { this[key] = String(val); } else { this[key] = val; } this.___save___(); }; Storage2.prototype.removeItem = function(key) { delete this[key]; this.___save___(); }; Storage2.prototype.clear = function() { var self2 = this; Object.keys(self2).forEach(function(key) { self2[key] = void 0; delete self2[key]; }); }; Storage2.prototype.key = function(i) { i = i || 0; return Object.keys(this)[i]; }; Object.defineProperty(Storage2.prototype, "length", { get: function() { return Object.keys(this).length; } }); Storage2.prototype.___save___ = function() { var self2 = this; if (!this.___priv_bk___.path) { return; } if (this.___priv_bk___.lock) { this.___priv_bk___.wait = true; return; } this.___priv_bk___.lock = true; fs.writeFile( this.___priv_bk___.path, JSON.stringify(this, null, this.___priv_ws___), "utf8", function(e) { self2.___priv_bk___.lock = false; if (e) { console.error("Could not write to database", self2.___priv_bk___.path); console.error(e); return; } if (self2.___priv_bk___.wait) { self2.___priv_bk___.wait = false; self2.___save___(); } } ); }; Object.defineProperty(Storage2, "create", { value: function(path, opts) { return new Storage2(path, opts); }, writable: false, enumerable: false }); module.exports = Storage2; })(); } }); // node_modules/.pnpm/element-internals-polyfill@1.3.12/node_modules/element-internals-polyfill/dist/index.js var dist_exports = {}; var init_dist = __esm({ "node_modules/.pnpm/element-internals-polyfill@1.3.12/node_modules/element-internals-polyfill/dist/index.js"() { (function(exports) { "use strict"; const refMap = /* @__PURE__ */ new WeakMap(); const validityMap = /* @__PURE__ */ new WeakMap(); const hiddenInputMap = /* @__PURE__ */ new WeakMap(); const internalsMap = /* @__PURE__ */ new WeakMap(); const validationMessageMap = /* @__PURE__ */ new WeakMap(); const formsMap = /* @__PURE__ */ new WeakMap(); const shadowHostsMap = /* @__PURE__ */ new WeakMap(); const formElementsMap = /* @__PURE__ */ new WeakMap(); const refValueMap = /* @__PURE__ */ new WeakMap(); const upgradeMap = /* @__PURE__ */ new WeakMap(); const shadowRootMap = /* @__PURE__ */ new WeakMap(); const validationAnchorMap = /* @__PURE__ */ new WeakMap(); const documentFragmentMap = /* @__PURE__ */ new WeakMap(); const connectedCallbackMap = /* @__PURE__ */ new WeakMap(); const validityUpgradeMap = /* @__PURE__ */ new WeakMap(); const aom = { ariaAtomic: "aria-atomic", ariaAutoComplete: "aria-autocomplete", ariaBusy: "aria-busy", ariaChecked: "aria-checked", ariaColCount: "aria-colcount", ariaColIndex: "aria-colindex", ariaColIndexText: "aria-colindextext", ariaColSpan: "aria-colspan", ariaCurrent: "aria-current", ariaDescription: "aria-description", ariaDisabled: "aria-disabled", ariaExpanded: "aria-expanded", ariaHasPopup: "aria-haspopup", ariaHidden: "aria-hidden", ariaInvalid: "aria-invalid", ariaKeyShortcuts: "aria-keyshortcuts", ariaLabel: "aria-label", ariaLevel: "aria-level", ariaLive: "aria-live", ariaModal: "aria-modal", ariaMultiLine: "aria-multiline", ariaMultiSelectable: "aria-multiselectable", ariaOrientation: "aria-orientation", ariaPlaceholder: "aria-placeholder", ariaPosInSet: "aria-posinset", ariaPressed: "aria-pressed", ariaReadOnly: "aria-readonly", ariaRelevant: "aria-relevant", ariaRequired: "aria-required", ariaRoleDescription: "aria-roledescription", ariaRowCount: "aria-rowcount", ariaRowIndex: "aria-rowindex", ariaRowIndexText: "aria-rowindextext", ariaRowSpan: "aria-rowspan", ariaSelected: "aria-selected", ariaSetSize: "aria-setsize", ariaSort: "aria-sort", ariaValueMax: "aria-valuemax", ariaValueMin: "aria-valuemin", ariaValueNow: "aria-valuenow", ariaValueText: "aria-valuetext", role: "role" }; const initAom = (ref, internals) => { for (let key in aom) { internals[key] = null; let closureValue = null; const attributeName = aom[key]; Object.defineProperty(internals, key, { get() { return closureValue; }, set(value) { closureValue = value; if (ref.isConnected) { ref.setAttribute(attributeName, value); } else { upgradeMap.set(ref, internals); } } }); } }; function initNode(node) { const internals = internalsMap.get(node); const { form } = internals; initForm(node, form, internals); initLabels(node, internals.labels); } const walkFieldset = (node, firstRender = false) => { const walker = document.createTreeWalker(node, NodeFilter.SHOW_ELEMENT, { acceptNode(node2) { return internalsMap.has(node2) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); let current = walker.nextNode(); const isCallNecessary = !firstRender || node.disabled; while (current) { if (current.formDisabledCallback && isCallNecessary) { setDisabled(current, node.disabled); } current = walker.nextNode(); } }; const disabledOrNameObserverConfig = { attributes: true, attributeFilter: ["disabled", "name"] }; const disabledOrNameObserver = mutationObserverExists() ? new MutationObserver((mutationsList) => { for (const mutation of mutationsList) { const target = mutation.target; if (mutation.attributeName === "disabled") { if (target.constructor["formAssociated"]) { setDisabled(target, target.hasAttribute("disabled")); } else if (target.localName === "fieldset") { walkFieldset(target); } } if (mutation.attributeName === "name") { if (target.constructor["formAssociated"]) { const internals = internalsMap.get(target); const value = refValueMap.get(target); internals.setFormValue(value); } } } }) : {}; function observerCallback(mutationList) { mutationList.forEach((mutationRecord) => { const { addedNodes: addedNodes2, removedNodes } = mutationRecord; const added = Array.from(addedNodes2); const removed = Array.from(removedNodes); added.forEach((node) => { var _a2; if (internalsMap.has(node) && node.constructor["formAssociated"]) { initNode(node); } if (upgradeMap.has(node)) { const internals = upgradeMap.get(node); const aomKeys = Object.keys(aom); aomKeys.filter((key) => internals[key] !== null).forEach((key) => { node.setAttribute(aom[key], internals[key]); }); upgradeMap.delete(node); } if (validityUpgradeMap.has(node)) { const internals = validityUpgradeMap.get(node); node.setAttribute("internals-valid", internals.validity.valid.toString()); node.setAttribute("internals-invalid", (!internals.validity.valid).toString()); node.setAttribute("aria-invalid", (!internals.validity.valid).toString()); validityUpgradeMap.delete(node); } if (node.localName === "form") { const formElements = formElementsMap.get(node); const walker = document.createTreeWalker(node, NodeFilter.SHOW_ELEMENT, { acceptNode(node2) { return internalsMap.has(node2) && node2.constructor["formAssociated"] && !(formElements && formElements.has(node2)) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }); let current = walker.nextNode(); while (current) { initNode(current); current = walker.nextNode(); } } if (node.localName === "fieldset") { (_a2 = disabledOrNameObserver.observe) === null || _a2 === void 0 ? void 0 : _a2.call(disabledOrNameObserver, node, disabledOrNameObserverConfig); walkFieldset(node, true); } }); removed.forEach((node) => { const internals = internalsMap.get(node); if (internals && hiddenInputMap.get(internals)) { removeHiddenInputs(internals); } if (shadowHostsMap.has(node)) { const observer = shadowHostsMap.get(node); observer.disconnect(); } }); }); } function fragmentObserverCallback(mutationList) { mutationList.forEach((mutation) => { const { removedNodes } = mutation; removedNodes.forEach((node) => { const observer = documentFragmentMap.get(mutation.target); if (internalsMap.has(node)) { upgradeInternals(node); } observer.disconnect(); }); }); } const deferUpgrade = (fragment) => { var _a2, _b; const observer = new MutationObserver(fragmentObserverCallback); if (((_a2 = window === null || window === void 0 ? void 0 : window.ShadyDOM) === null || _a2 === void 0 ? void 0 : _a2.inUse) && fragment.mode && fragment.host) { fragment = fragment.host; } (_b = observer.observe) === null || _b === void 0 ? void 0 : _b.call(observer, fragment, { childList: true }); documentFragmentMap.set(fragment, observer); }; mutationObserverExists() ? new MutationObserver(observerCallback) : {}; const observerConfig = { childList: true, subtree: true }; const setDisabled = (ref, disabled) => { ref.toggleAttribute("internals-disabled", disabled); if (disabled) { ref.setAttribute("aria-disabled", "true"); } else { ref.removeAttribute("aria-disabled"); } if (ref.formDisabledCallback) { ref.formDisabledCallback.apply(ref, [disabled]); } }; const removeHiddenInputs = (internals) => { const hiddenInputs = hiddenInputMap.get(internals); hiddenInputs.forEach((hiddenInput) => { hiddenInput.remove(); }); hiddenInputMap.set(internals, []); }; const createHiddenInput = (ref, internals) => { const input = document.createElement("input"); input.type = "hidden"; input.name = ref.getAttribute("name"); ref.after(input); hiddenInputMap.get(internals).push(input); return input; }; const initRef = (ref, internals) => { var _a2; hiddenInputMap.set(internals, []); (_a2 = disabledOrNameObserver.observe) === null || _a2 === void 0 ? void 0 : _a2.call(disabledOrNameObserver, ref, disabledOrNameObserverConfig); }; const initLabels = (ref, labels) => { if (labels.length) { Array.from(labels).forEach((label) => label.addEventListener("click", ref.click.bind(ref))); let firstLabelId = labels[0].id; if (!labels[0].id) { firstLabelId = `${labels[0].htmlFor}_Label`; labels[0].id = firstLabelId; } ref.setAttribute("aria-labelledby", firstLabelId); } }; const setFormValidity = (form) => { const nativeControlValidity = Array.from(form.elements).filter((element) => !element.tagName.includes("-") && element.validity).map((element) => element.validity.valid); const polyfilledElements = formElementsMap.get(form) || []; const polyfilledValidity = Array.from(polyfilledElements).filter((control) => control.isConnected).map((control) => internalsMap.get(control).validity.valid); const hasInvalid = [...nativeControlValidity, ...polyfilledValidity].includes(false); form.toggleAttribute("internals-invalid", hasInvalid); form.toggleAttribute("internals-valid", !hasInvalid); }; const formInputCallback = (event) => { setFormValidity(findParentForm(event.target)); }; const formChangeCallback = (event) => { setFormValidity(findParentForm(event.target)); }; const wireSubmitLogic = (form) => { const submitButtonSelector = ["button[type=submit]", "input[type=submit]", "button:not([type])"].map((sel) => `${sel}:not([disabled])`).map((sel) => `${sel}:not([form])${form.id ? `,${sel}[form='${form.id}']` : ""}`).join(","); form.addEventListener("click", (event) => { const target = event.target; if (target.closest(submitButtonSelector)) { const elements = formElementsMap.get(form); if (form.noValidate) { return; } if (elements.size) { const nodes = Array.from(elements); const validityList = nodes.reverse().map((node) => { const internals = internalsMap.get(node); return internals.reportValidity(); }); if (validityList.includes(false)) { event.preventDefault(); } } } }); }; const formResetCallback = (event) => { const elements = formElementsMap.get(event.target); if (elements && elements.size) { elements.forEach((element) => { if (element.constructor.formAssociated && element.formResetCallback) { element.formResetCallback.apply(element); } }); } }; const initForm = (ref, form, internals) => { if (form) { const formElements = formElementsMap.get(form); if (formElements) { formElements.add(ref); } else { const initSet = /* @__PURE__ */ new Set(); initSet.add(ref); formElementsMap.set(form, initSet); wireSubmitLogic(form); form.addEventListener("reset", formResetCallback); form.addEventListener("input", formInputCallback); form.addEventListener("change", formChangeCallback); } formsMap.set(form, { ref, internals }); if (ref.constructor["formAssociated"] && ref.formAssociatedCallback) { setTimeout(() => { ref.formAssociatedCallback.apply(ref, [form]); }, 0); } setFormValidity(form); } }; const findParentForm = (elem) => { let parent = elem.parentNode; if (parent && parent.tagName !== "FORM") { parent = findParentForm(parent); } return parent; }; const throwIfNotFormAssociated = (ref, message, ErrorType = DOMException) => { if (!ref.constructor["formAssociated"]) { throw new ErrorType(message); } }; const overrideFormMethod = (form, returnValue, method) => { const elements = formElementsMap.get(form); if (elements && elements.size) { elements.forEach((element) => { const internals = internalsMap.get(element); const valid = internals[method](); if (!valid) { returnValue = false; } }); } return returnValue; }; const upgradeInternals = (ref) => { if (ref.constructor["formAssociated"]) { const internals = internalsMap.get(ref); const { labels, form } = internals; initLabels(ref, labels); initForm(ref, form, internals); } }; function mutationObserverExists() { return typeof MutationObserver !== "undefined"; } class ValidityState { constructor() { this.badInput = false; this.customError = false; this.patternMismatch = false; this.rangeOverflow = false; this.rangeUnderflow = false; this.stepMismatch = false; this.tooLong = false; this.tooShort = false; this.typeMismatch = false; this.valid = true; this.valueMissing = false; Object.seal(this); } } const setValid = (validityObject) => { validityObject.badInput = false; validityObject.customError = false; validityObject.patternMismatch = false; validityObject.rangeOverflow = false; validityObject.rangeUnderflow = false; validityObject.stepMismatch = false; validityObject.tooLong = false; validityObject.tooShort = false; validityObject.typeMismatch = false; validityObject.valid = true; validityObject.valueMissing = false; return validityObject; }; const reconcileValidity = (validityObject, newState, form) => { validityObject.valid = isValid(newState); Object.keys(newState).forEach((key) => validityObject[key] = newState[key]); if (form) { setFormValidity(form); } return validityObject; }; const isValid = (validityState) => { let valid = true; for (let key in validityState) { if (key !== "valid" && validityState[key] !== false) { valid = false; } } return valid; }; const customStateMap = /* @__PURE__ */ new WeakMap(); function addState(ref, stateName) { ref.toggleAttribute(stateName, true); if (ref.part) { ref.part.add(stateName); } } class CustomStateSet extends Set { static get isPolyfilled() { return true; } constructor(ref) { super(); if (!ref || !ref.tagName || ref.tagName.indexOf("-") === -1) { throw new TypeError("Illegal constructor"); } customStateMap.set(this, ref); } add(state) { if (!/^--/.test(state) || typeof state !== "string") { throw new DOMException(`Failed to execute 'add' on 'CustomStateSet': The specified value ${state} must start with '--'.`); } const result = super.add(state); const ref = customStateMap.get(this); const stateName = `state${state}`; if (ref.isConnected) { addState(ref, stateName); } else { setTimeout(() => { addState(ref, stateName); }); } return result; } clear() { for (let [entry] of this.entries()) { this.delete(entry); } super.clear(); } delete(state) { const result = super.delete(state); const ref = customStateMap.get(this); if (ref.isConnected) { ref.toggleAttribute(`state${state}`, false); if (ref.part) { ref.part.remove(`state${state}`); } } else { setTimeout(() => { ref.toggleAttribute(`state${state}`, false); if (ref.part) { ref.part.remove(`state${state}`); } }); } return result; } } function __classPrivateFieldGet(receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); } function __classPrivateFieldSet(receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; } var _HTMLFormControlsCollection_elements; class HTMLFormControlsCollection { constructor(elements) { _HTMLFormControlsCollection_elements.set(this, void 0); __classPrivateFieldSet(this, _HTMLFormControlsCollection_elements, elements, "f"); for (let i = 0; i < elements.length; i++) { let element = elements[i]; this[i] = element; if (element.hasAttribute("name")) { this[element.getAttribute("name")] = element; } } Object.freeze(this); } get length() { return __classPrivateFieldGet(this, _HTMLFormControlsCollection_elements, "f").length; } [(_HTMLFormControlsCollection_elements = /* @__PURE__ */ new WeakMap(), Symbol.iterator)]() { return __classPrivateFieldGet(this, _HTMLFormControlsCollection_elements, "f")[Symbol.iterator](); } item(i) { return this[i] == null ? null : this[i]; } namedItem(name) { return this[name] == null ? null : this[name]; } } function patchFormPrototype() { const checkValidity = HTMLFormElement.prototype.checkValidity; HTMLFormElement.prototype.checkValidity = checkValidityOverride; const reportValidity = HTMLFormElement.prototype.reportValidity; HTMLFormElement.prototype.reportValidity = reportValidityOverride; function checkValidityOverride(...args) { let returnValue = checkValidity.apply(this, args); return overrideFormMethod(this, returnValue, "checkValidity"); } function reportValidityOverride(...args) { let returnValue = reportValidity.apply(this, args); return overrideFormMethod(this, returnValue, "reportValidity"); } const { get: get2 } = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, "elements"); Object.defineProperty(HTMLFormElement.prototype, "elements", { get(...args) { const elements = get2.call(this, ...args); const polyfilledElements = Array.from(formElementsMap.get(this) || []); if (polyfilledElements.length === 0) { return elements; } const orderedElements = Array.from(elements).concat(polyfilledElements).sort((a2, b) => { if (a2.compareDocumentPosition) { return a2.compareDocumentPosition(b) & 2 ? 1 : -1; } return 0; }); return new HTMLFormControlsCollection(orderedElements); } }); } class ElementInternals { static get isPolyfilled() { return true; } constructor(ref) { if (!ref || !ref.tagName || ref.tagName.indexOf("-") === -1) { throw new TypeError("Illegal constructor"); } const rootNode = ref.getRootNode(); const validity = new ValidityState(); this.states = new CustomStateSet(ref); refMap.set(this, ref); validityMap.set(this, validity); internalsMap.set(ref, this); initAom(ref, this); initRef(ref, this); Object.seal(this); if (rootNode instanceof DocumentFragment) { deferUpgrade(rootNode); } } checkValidity() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to execute 'checkValidity' on 'ElementInternals': The target element is not a form-associated custom element.`); if (!this.willValidate) { return true; } const validity = validityMap.get(this); if (!validity.valid) { const validityEvent = new Event("invalid", { bubbles: false, cancelable: true, composed: false }); ref.dispatchEvent(validityEvent); } return validity.valid; } get form() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to read the 'form' property from 'ElementInternals': The target element is not a form-associated custom element.`); let form; if (ref.constructor["formAssociated"] === true) { form = findParentForm(ref); } return form; } get labels() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to read the 'labels' property from 'ElementInternals': The target element is not a form-associated custom element.`); const id = ref.getAttribute("id"); const hostRoot = ref.getRootNode(); if (hostRoot && id) { return hostRoot.querySelectorAll(`[for="${id}"]`); } return []; } reportValidity() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to execute 'reportValidity' on 'ElementInternals': The target element is not a form-associated custom element.`); if (!this.willValidate) { return true; } const valid = this.checkValidity(); const anchor = validationAnchorMap.get(this); if (anchor && !ref.constructor["formAssociated"]) { throw new DOMException(`Failed to execute 'reportValidity' on 'ElementInternals': The target element is not a form-associated custom element.`); } if (!valid && anchor) { ref.focus(); anchor.focus(); } return valid; } setFormValue(value) { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to execute 'setFormValue' on 'ElementInternals': The target element is not a form-associated custom element.`); removeHiddenInputs(this); if (value != null && !(value instanceof FormData)) { if (ref.getAttribute("name")) { const hiddenInput = createHiddenInput(ref, this); hiddenInput.value = value; } } else if (value != null && value instanceof FormData) { Array.from(value).reverse().forEach(([formDataKey, formDataValue]) => { if (typeof formDataValue === "string") { const hiddenInput = createHiddenInput(ref, this); hiddenInput.name = formDataKey; hiddenInput.value = formDataValue; } }); } refValueMap.set(ref, value); } setValidity(validityChanges, validationMessage, anchor) { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to execute 'setValidity' on 'ElementInternals': The target element is not a form-associated custom element.`); if (!validityChanges) { throw new TypeError("Failed to execute 'setValidity' on 'ElementInternals': 1 argument required, but only 0 present."); } validationAnchorMap.set(this, anchor); const validity = validityMap.get(this); const validityChangesObj = {}; for (const key in validityChanges) { validityChangesObj[key] = validityChanges[key]; } if (Object.keys(validityChangesObj).length === 0) { setValid(validity); } const check = Object.assign(Object.assign({}, validity), validityChangesObj); delete check.valid; const { valid } = reconcileValidity(validity, check, this.form); if (!valid && !validationMessage) { throw new DOMException(`Failed to execute 'setValidity' on 'ElementInternals': The second argument should not be empty if one or more flags in the first argument are true.`); } validationMessageMap.set(this, valid ? "" : validationMessage); if (ref.isConnected) { ref.toggleAttribute("internals-invalid", !valid); ref.toggleAttribute("internals-valid", valid); ref.setAttribute("aria-invalid", `${!valid}`); } else { validityUpgradeMap.set(ref, this); } } get shadowRoot() { const ref = refMap.get(this); const shadowRoot = shadowRootMap.get(ref); if (shadowRoot) { return shadowRoot; } return null; } get validationMessage() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to read the 'validationMessage' property from 'ElementInternals': The target element is not a form-associated custom element.`); return validationMessageMap.get(this); } get validity() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to read the 'validity' property from 'ElementInternals': The target element is not a form-associated custom element.`); const validity = validityMap.get(this); return validity; } get willValidate() { const ref = refMap.get(this); throwIfNotFormAssociated(ref, `Failed to read the 'willValidate' property from 'ElementInternals': The target element is not a form-associated custom element.`); if (ref.disabled || ref.hasAttribute("disabled") || ref.hasAttribute("readonly")) { return false; } return true; } } function isElementInternalsSupported() { if (typeof window === "undefined" || !window.ElementInternals || !HTMLElement.prototype.attachInternals) { return false; } class ElementInternalsFeatureDetection extends HTMLElement { constructor() { super(); this.internals = this.attachInternals(); } } const randomName = `element-internals-feature-detection-${Math.random().toString(36).replace(/[^a-z]+/g, "")}`; customElements.define(randomName, ElementInternalsFeatureDetection); const featureDetectionElement = new ElementInternalsFeatureDetection(); return [ "shadowRoot", "form", "willValidate", "validity", "validationMessage", "labels", "setFormValue", "setValidity", "checkValidity", "reportValidity" ].every((prop) => prop in featureDetectionElement.internals); } let hasElementInternalsPolyfillBeenApplied = false; let hasCustomStateSetPolyfillBeenApplied = false; function forceCustomStateSetPolyfill(attachInternals) { if (hasCustomStateSetPolyfillBeenApplied) { return; } hasCustomStateSetPolyfillBeenApplied = true; window.CustomStateSet = CustomStateSet; if (attachInternals) { HTMLElement.prototype.attachInternals = function(...args) { const internals = attachInternals.call(this, args); internals.states = new CustomStateSet(this); return internals; }; } } function forceElementInternalsPolyfill(forceCustomStateSet = true) { if (hasElementInternalsPolyfillBeenApplied) { return; } hasElementInternalsPolyfillBeenApplied = true; if (typeof window !== "undefined") { window.ElementInternals = ElementInternals; } if (typeof CustomElementRegistry !== "undefined") { const define = CustomElementRegistry.prototype.define; CustomElementRegistry.prototype.define = function(name, constructor, options2) { if (constructor.formAssociated) { const connectedCallback = constructor.prototype.connectedCallback; constructor.prototype.connectedCallback = function() { if (!connectedCallbackMap.has(this)) { connectedCallbackMap.set(this, true); if (this.hasAttribute("disabled")) { setDisabled(this, true); } } if (connectedCallback != null) { connectedCallback.apply(this); } upgradeInternals(this); }; } define.call(this, name, constructor, options2); }; } if (typeof HTMLElement !== "undefined") { HTMLElement.prototype.attachInternals = function() { if (!this.tagName) { return {}; } else if (this.tagName.indexOf("-") === -1) { throw new Error(`Failed to execute 'attachInternals' on 'HTMLElement': Unable to attach ElementInternals to non-custom elements.`); } if (internalsMap.has(this)) { throw new DOMException(`DOMException: Failed to execute 'attachInternals' on 'HTMLElement': ElementInternals for the specified element was already attached.`); } return new ElementInternals(this); }; } if (typeof Element !== "undefined") { let attachShadowObserver = function(...args) { const shadowRoot = attachShadow.apply(this, args); shadowRootMap.set(this, shadowRoot); if (mutationObserverExists()) { const observer = new MutationObserver(observerCallback); if (window.ShadyDOM) { observer.observe(this, observerConfig); } else { observer.observe(shadowRoot, observerConfig); } shadowHostsMap.set(this, observer); } return shadowRoot; }; const attachShadow = Element.prototype.attachShadow; Element.prototype.attachShadow = attachShadowObserver; } if (mutationObserverExists() && typeof document !== "undefined") { const documentObserver = new MutationObserver(observerCallback); documentObserver.observe(document.documentElement, observerConfig); } if (typeof HTMLFormElement !== "undefined") { patchFormPrototype(); } if (forceCustomStateSet || typeof window !== "undefined" && !window.CustomStateSet) { forceCustomStateSetPolyfill(); } } const isCePolyfill = !!customElements.polyfillWrapFlushCallback; if (!isCePolyfill) { if (!isElementInternalsSupported()) { forceElementInternalsPolyfill(false); } else if (typeof window !== "undefined" && !window.CustomStateSet) { forceCustomStateSetPolyfill(HTMLElement.prototype.attachInternals); } } exports.forceCustomStateSetPolyfill = forceCustomStateSetPolyfill; exports.forceElementInternalsPolyfill = forceElementInternalsPolyfill; Object.defineProperty(exports, "__esModule", { value: true }); return exports; })({}); } }); // node_modules/.pnpm/pvtsutils@1.3.6/node_modules/pvtsutils/build/index.js var require_build = __commonJS({ "node_modules/.pnpm/pvtsutils@1.3.6/node_modules/pvtsutils/build/index.js"(exports) { "use strict"; var ARRAY_BUFFER_NAME = "[object ArrayBuffer]"; var BufferSourceConverter8 = class _BufferSourceConverter { static isArrayBuffer(data) { return Object.prototype.toString.call(data) === ARRAY_BUFFER_NAME; } static toArrayBuffer(data) { if (this.isArrayBuffer(data)) { return data; } if (data.byteLength === data.buffer.byteLength) { return data.buffer; } if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) { return data.buffer; } return this.toUint8Array(data.buffer).slice(data.byteOffset, data.byteOffset + data.byteLength).buffer; } static toUint8Array(data) { return this.toView(data, Uint8Array); } static toView(data, type3) { if (data.constructor === type3) { return data; } if (this.isArrayBuffer(data)) { return new type3(data); } if (this.isArrayBufferView(data)) { return new type3(data.buffer, data.byteOffset, data.byteLength); } throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'"); } static isBufferSource(data) { return this.isArrayBufferView(data) || this.isArrayBuffer(data); } static isArrayBufferView(data) { return ArrayBuffer.isView(data) || data && this.isArrayBuffer(data.buffer); } static isEqual(a2, b) { const aView = _BufferSourceConverter.toUint8Array(a2); const bView = _BufferSourceConverter.toUint8Array(b); if (aView.length !== bView.byteLength) { return false; } for (let i = 0; i < aView.length; i++) { if (aView[i] !== bView[i]) { return false; } } return true; } static concat(...args) { let buffers; if (Array.isArray(args[0]) && !(args[1] instanceof Function)) { buffers = args[0]; } else if (Array.isArray(args[0]) && args[1] instanceof Function) { buffers = args[0]; } else { if (args[args.length - 1] instanceof Function) { buffers = args.slice(0, args.length - 1); } else { buffers = args; } } let size3 = 0; for (const buffer of buffers) { size3 += buffer.byteLength; } const res = new Uint8Array(size3); let offset4 = 0; for (const buffer of buffers) { const view = this.toUint8Array(buffer); res.set(view, offset4); offset4 += view.length; } if (args[args.length - 1] instanceof Function) { return this.toView(res, args[args.length - 1]); } return res.buffer; } }; var STRING_TYPE = "string"; var HEX_REGEX = /^[0-9a-f\s]+$/i; var BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; var BASE64URL_REGEX = /^[a-zA-Z0-9-_]+$/; var Utf8Converter = class { static fromString(text) { const s = unescape(encodeURIComponent(text)); const uintArray = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) { uintArray[i] = s.charCodeAt(i); } return uintArray.buffer; } static toString(buffer) { const buf = BufferSourceConverter8.toUint8Array(buffer); let encodedString = ""; for (let i = 0; i < buf.length; i++) { encodedString += String.fromCharCode(buf[i]); } const decodedString = decodeURIComponent(escape(encodedString)); return decodedString; } }; var Utf16Converter = class { static toString(buffer, littleEndian = false) { const arrayBuffer = BufferSourceConverter8.toArrayBuffer(buffer); const dataView = new DataView(arrayBuffer); let res = ""; for (let i = 0; i < arrayBuffer.byteLength; i += 2) { const code = dataView.getUint16(i, littleEndian); res += String.fromCharCode(code); } return res; } static fromString(text, littleEndian = false) { const res = new ArrayBuffer(text.length * 2); const dataView = new DataView(res); for (let i = 0; i < text.length; i++) { dataView.setUint16(i * 2, text.charCodeAt(i), littleEndian); } return res; } }; var Convert4 = class _Convert { static isHex(data) { return typeof data === STRING_TYPE && HEX_REGEX.test(data); } static isBase64(data) { return typeof data === STRING_TYPE && BASE64_REGEX.test(data); } static isBase64Url(data) { return typeof data === STRING_TYPE && BASE64URL_REGEX.test(data); } static ToString(buffer, enc = "utf8") { const buf = BufferSourceConverter8.toUint8Array(buffer); switch (enc.toLowerCase()) { case "utf8": return this.ToUtf8String(buf); case "binary": return this.ToBinary(buf); case "hex": return this.ToHex(buf); case "base64": return this.ToBase64(buf); case "base64url": return this.ToBase64Url(buf); case "utf16le": return Utf16Converter.toString(buf, true); case "utf16": case "utf16be": return Utf16Converter.toString(buf); default: throw new Error(`Unknown type of encoding '${enc}'`); } } static FromString(str, enc = "utf8") { if (!str) { return new ArrayBuffer(0); } switch (enc.toLowerCase()) { case "utf8": return this.FromUtf8String(str); case "binary": return this.FromBinary(str); case "hex": return this.FromHex(str); case "base64": return this.FromBase64(str); case "base64url": return this.FromBase64Url(str); case "utf16le": return Utf16Converter.fromString(str, true); case "utf16": case "utf16be": return Utf16Converter.fromString(str); default: throw new Error(`Unknown type of encoding '${enc}'`); } } static ToBase64(buffer) { const buf = BufferSourceConverter8.toUint8Array(buffer); if (typeof btoa !== "undefined") { const binary = this.ToString(buf, "binary"); return btoa(binary); } else { return Buffer.from(buf).toString("base64"); } } static FromBase64(base64) { const formatted = this.formatString(base64); if (!formatted) { return new ArrayBuffer(0); } if (!_Convert.isBase64(formatted)) { throw new TypeError("Argument 'base64Text' is not Base64 encoded"); } if (typeof atob !== "undefined") { return this.FromBinary(atob(formatted)); } else { return new Uint8Array(Buffer.from(formatted, "base64")).buffer; } } static FromBase64Url(base64url) { const formatted = this.formatString(base64url); if (!formatted) { return new ArrayBuffer(0); } if (!_Convert.isBase64Url(formatted)) { throw new TypeError("Argument 'base64url' is not Base64Url encoded"); } return this.FromBase64(this.Base64Padding(formatted.replace(/\-/g, "+").replace(/\_/g, "/"))); } static ToBase64Url(data) { return this.ToBase64(data).replace(/\+/g, "-").replace(/\//g, "_").replace(/\=/g, ""); } static FromUtf8String(text, encoding = _Convert.DEFAULT_UTF8_ENCODING) { switch (encoding) { case "ascii": return this.FromBinary(text); case "utf8": return Utf8Converter.fromString(text); case "utf16": case "utf16be": return Utf16Converter.fromString(text); case "utf16le": case "usc2": return Utf16Converter.fromString(text, true); default: throw new Error(`Unknown type of encoding '${encoding}'`); } } static ToUtf8String(buffer, encoding = _Convert.DEFAULT_UTF8_ENCODING) { switch (encoding) { case "ascii": return this.ToBinary(buffer); case "utf8": return Utf8Converter.toString(buffer); case "utf16": case "utf16be": return Utf16Converter.toString(buffer); case "utf16le": case "usc2": return Utf16Converter.toString(buffer, true); default: throw new Error(`Unknown type of encoding '${encoding}'`); } } static FromBinary(text) { const stringLength = text.length; const resultView = new Uint8Array(stringLength); for (let i = 0; i < stringLength; i++) { resultView[i] = text.charCodeAt(i); } return resultView.buffer; } static ToBinary(buffer) { const buf = BufferSourceConverter8.toUint8Array(buffer); let res = ""; for (let i = 0; i < buf.length; i++) { res += String.fromCharCode(buf[i]); } return res; } static ToHex(buffer) { const buf = BufferSourceConverter8.toUint8Array(buffer); let result = ""; const len = buf.length; for (let i = 0; i < len; i++) { const byte = buf[i]; if (byte < 16) { result += "0"; } result += byte.toString(16); } return result; } static FromHex(hexString) { let formatted = this.formatString(hexString); if (!formatted) { return new ArrayBuffer(0); } if (!_Convert.isHex(formatted)) { throw new TypeError("Argument 'hexString' is not HEX encoded"); } if (formatted.length % 2) { formatted = `0${formatted}`; } const res = new Uint8Array(formatted.length / 2); for (let i = 0; i < formatted.length; i = i + 2) { const c = formatted.slice(i, i + 2); res[i / 2] = parseInt(c, 16); } return res.buffer; } static ToUtf16String(buffer, littleEndian = false) { return Utf16Converter.toString(buffer, littleEndian); } static FromUtf16String(text, littleEndian = false) { return Utf16Converter.fromString(text, littleEndian); } static Base64Padding(base64) { const padCount = 4 - base64.length % 4; if (padCount < 4) { for (let i = 0; i < padCount; i++) { base64 += "="; } } return base64; } static formatString(data) { return (data === null || data === void 0 ? void 0 : data.replace(/[\n\r\t ]/g, "")) || ""; } }; Convert4.DEFAULT_UTF8_ENCODING = "utf8"; function assign(target, ...sources) { const res = arguments[0]; for (let i = 1; i < arguments.length; i++) { const obj = arguments[i]; for (const prop in obj) { res[prop] = obj[prop]; } } return res; } function combine2(...buf) { const totalByteLength = buf.map((item) => item.byteLength).reduce((prev, cur) => prev + cur); const res = new Uint8Array(totalByteLength); let currentPos = 0; buf.map((item) => new Uint8Array(item)).forEach((arr) => { for (const item2 of arr) { res[currentPos++] = item2; } }); return res.buffer; } function isEqual(bytes1, bytes2) { if (!(bytes1 && bytes2)) { return false; } if (bytes1.byteLength !== bytes2.byteLength) { return false; } const b1 = new Uint8Array(bytes1); const b2 = new Uint8Array(bytes2); for (let i = 0; i < bytes1.byteLength; i++) { if (b1[i] !== b2[i]) { return false; } } return true; } exports.BufferSourceConverter = BufferSourceConverter8; exports.Convert = Convert4; exports.assign = assign; exports.combine = combine2; exports.isEqual = isEqual; } }); // node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js function utilFromBase(inputBuffer, inputBase) { let result = 0; if (inputBuffer.length === 1) { return inputBuffer[0]; } for (let i = inputBuffer.length - 1; i >= 0; i--) { result += inputBuffer[inputBuffer.length - 1 - i] * Math.pow(2, inputBase * i); } return result; } function utilToBase(value, base, reserved = -1) { const internalReserved = reserved; let internalValue = value; let result = 0; let biggest = Math.pow(2, base); for (let i = 1; i < 8; i++) { if (value < biggest) { let retBuf; if (internalReserved < 0) { retBuf = new ArrayBuffer(i); result = i; } else { if (internalReserved < i) { return new ArrayBuffer(0); } retBuf = new ArrayBuffer(internalReserved); result = internalReserved; } const retView = new Uint8Array(retBuf); for (let j = i - 1; j >= 0; j--) { const basis = Math.pow(2, j * base); retView[result - j - 1] = Math.floor(internalValue / basis); internalValue -= retView[result - j - 1] * basis; } return retBuf; } biggest *= Math.pow(2, base); } return new ArrayBuffer(0); } function utilConcatView(...views) { let outputLength = 0; let prevLength = 0; for (const view of views) { outputLength += view.length; } const retBuf = new ArrayBuffer(outputLength); const retView = new Uint8Array(retBuf); for (const view of views) { retView.set(view, prevLength); prevLength += view.length; } return retView; } function utilDecodeTC() { const buf = new Uint8Array(this.valueHex); if (this.valueHex.byteLength >= 2) { const condition1 = buf[0] === 255 && buf[1] & 128; const condition2 = buf[0] === 0 && (buf[1] & 128) === 0; if (condition1 || condition2) { this.warnings.push("Needlessly long format"); } } const bigIntBuffer = new ArrayBuffer(this.valueHex.byteLength); const bigIntView = new Uint8Array(bigIntBuffer); for (let i = 0; i < this.valueHex.byteLength; i++) { bigIntView[i] = 0; } bigIntView[0] = buf[0] & 128; const bigInt = utilFromBase(bigIntView, 8); const smallIntBuffer = new ArrayBuffer(this.valueHex.byteLength); const smallIntView = new Uint8Array(smallIntBuffer); for (let j = 0; j < this.valueHex.byteLength; j++) { smallIntView[j] = buf[j]; } smallIntView[0] &= 127; const smallInt = utilFromBase(smallIntView, 8); return smallInt - bigInt; } function utilEncodeTC(value) { const modValue = value < 0 ? value * -1 : value; let bigInt = 128; for (let i = 1; i < 8; i++) { if (modValue <= bigInt) { if (value < 0) { const smallInt = bigInt - modValue; const retBuf2 = utilToBase(smallInt, 8, i); const retView2 = new Uint8Array(retBuf2); retView2[0] |= 128; return retBuf2; } let retBuf = utilToBase(modValue, 8, i); let retView = new Uint8Array(retBuf); if (retView[0] & 128) { const tempBuf = retBuf.slice(0); const tempView = new Uint8Array(tempBuf); retBuf = new ArrayBuffer(retBuf.byteLength + 1); retView = new Uint8Array(retBuf); for (let k = 0; k < tempBuf.byteLength; k++) { retView[k + 1] = tempView[k]; } retView[0] = 0; } return retBuf; } bigInt *= Math.pow(2, 8); } return new ArrayBuffer(0); } function isEqualBuffer(inputBuffer1, inputBuffer2) { if (inputBuffer1.byteLength !== inputBuffer2.byteLength) { return false; } const view1 = new Uint8Array(inputBuffer1); const view2 = new Uint8Array(inputBuffer2); for (let i = 0; i < view1.length; i++) { if (view1[i] !== view2[i]) { return false; } } return true; } function padNumber(inputNumber, fullLength) { const str = inputNumber.toString(10); if (fullLength < str.length) { return ""; } const dif = fullLength - str.length; const padding = new Array(dif); for (let i = 0; i < dif; i++) { padding[i] = "0"; } const paddingString = padding.join(""); return paddingString.concat(str); } var log2; var init_utils_es = __esm({ "node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js"() { log2 = Math.log(2); } }); // node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js var index_es_exports = {}; __export(index_es_exports, { Any: () => Any, BaseBlock: () => BaseBlock, BaseStringBlock: () => BaseStringBlock, BitString: () => BitString, BmpString: () => BmpString, Boolean: () => Boolean2, CharacterString: () => CharacterString, Choice: () => Choice, Constructed: () => Constructed, DATE: () => DATE, DateTime: () => DateTime, Duration: () => Duration, EndOfContent: () => EndOfContent, Enumerated: () => Enumerated, GeneralString: () => GeneralString, GeneralizedTime: () => GeneralizedTime, GraphicString: () => GraphicString, HexBlock: () => HexBlock, IA5String: () => IA5String, Integer: () => Integer, Null: () => Null, NumericString: () => NumericString, ObjectIdentifier: () => ObjectIdentifier, OctetString: () => OctetString, Primitive: () => Primitive, PrintableString: () => PrintableString, RawData: () => RawData, RelativeObjectIdentifier: () => RelativeObjectIdentifier, Repeated: () => Repeated, Sequence: () => Sequence, Set: () => Set2, TIME: () => TIME, TeletexString: () => TeletexString, TimeOfDay: () => TimeOfDay, UTCTime: () => UTCTime, UniversalString: () => UniversalString, Utf8String: () => Utf8String, ValueBlock: () => ValueBlock, VideotexString: () => VideotexString, ViewWriter: () => ViewWriter, VisibleString: () => VisibleString, compareSchema: () => compareSchema, fromBER: () => fromBER, verifySchema: () => verifySchema }); function assertBigInt() { if (typeof BigInt === "undefined") { throw new Error("BigInt is not defined. Your environment doesn't implement BigInt."); } } function concat(buffers) { let outputLength = 0; let prevLength = 0; for (let i = 0; i < buffers.length; i++) { const buffer = buffers[i]; outputLength += buffer.byteLength; } const retView = new Uint8Array(outputLength); for (let i = 0; i < buffers.length; i++) { const buffer = buffers[i]; retView.set(new Uint8Array(buffer), prevLength); prevLength += buffer.byteLength; } return retView.buffer; } function checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength) { if (!(inputBuffer instanceof Uint8Array)) { baseBlock.error = "Wrong parameter: inputBuffer must be 'Uint8Array'"; return false; } if (!inputBuffer.byteLength) { baseBlock.error = "Wrong parameter: inputBuffer has zero length"; return false; } if (inputOffset < 0) { baseBlock.error = "Wrong parameter: inputOffset less than zero"; return false; } if (inputLength < 0) { baseBlock.error = "Wrong parameter: inputLength less than zero"; return false; } if (inputBuffer.byteLength - inputOffset - inputLength < 0) { baseBlock.error = "End of input reached before message was fully decoded (inconsistent offset and length values)"; return false; } return true; } function HexBlock(BaseClass) { var _a2; return _a2 = class Some extends BaseClass { constructor(...args) { var _a3; super(...args); const params = args[0] || {}; this.isHexOnly = (_a3 = params.isHexOnly) !== null && _a3 !== void 0 ? _a3 : false; this.valueHexView = params.valueHex ? pvtsutils.BufferSourceConverter.toUint8Array(params.valueHex) : EMPTY_VIEW; } get valueHex() { return this.valueHexView.slice().buffer; } set valueHex(value) { this.valueHexView = new Uint8Array(value); } fromBER(inputBuffer, inputOffset, inputLength) { const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer; if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } const endLength = inputOffset + inputLength; this.valueHexView = view.subarray(inputOffset, endLength); if (!this.valueHexView.length) { this.warnings.push("Zero buffer length"); return inputOffset; } this.blockLength = inputLength; return endLength; } toBER(sizeOnly = false) { if (!this.isHexOnly) { this.error = "Flag 'isHexOnly' is not set, abort"; return EMPTY_BUFFER; } if (sizeOnly) { return new ArrayBuffer(this.valueHexView.byteLength); } return this.valueHexView.byteLength === this.valueHexView.buffer.byteLength ? this.valueHexView.buffer : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), isHexOnly: this.isHexOnly, valueHex: pvtsutils.Convert.ToHex(this.valueHexView) }; } }, _a2.NAME = "hexBlock", _a2; } function prepareIndefiniteForm(baseBlock) { if (baseBlock instanceof typeStore.Constructed) { for (const value of baseBlock.valueBlock.value) { if (prepareIndefiniteForm(value)) { baseBlock.lenBlock.isIndefiniteForm = true; } } } return !!baseBlock.lenBlock.isIndefiniteForm; } function localChangeType(inputObject, newType) { if (inputObject instanceof newType) { return inputObject; } const newObject = new newType(); newObject.idBlock = inputObject.idBlock; newObject.lenBlock = inputObject.lenBlock; newObject.warnings = inputObject.warnings; newObject.valueBeforeDecodeView = inputObject.valueBeforeDecodeView; return newObject; } function localFromBER(inputBuffer, inputOffset = 0, inputLength = inputBuffer.length) { const incomingOffset = inputOffset; let returnObject = new BaseBlock({}, ValueBlock); const baseBlock = new LocalBaseBlock(); if (!checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength)) { returnObject.error = baseBlock.error; return { offset: -1, result: returnObject }; } const intBuffer = inputBuffer.subarray(inputOffset, inputOffset + inputLength); if (!intBuffer.length) { returnObject.error = "Zero buffer length"; return { offset: -1, result: returnObject }; } let resultOffset = returnObject.idBlock.fromBER(inputBuffer, inputOffset, inputLength); if (returnObject.idBlock.warnings.length) { returnObject.warnings.concat(returnObject.idBlock.warnings); } if (resultOffset === -1) { returnObject.error = returnObject.idBlock.error; return { offset: -1, result: returnObject }; } inputOffset = resultOffset; inputLength -= returnObject.idBlock.blockLength; resultOffset = returnObject.lenBlock.fromBER(inputBuffer, inputOffset, inputLength); if (returnObject.lenBlock.warnings.length) { returnObject.warnings.concat(returnObject.lenBlock.warnings); } if (resultOffset === -1) { returnObject.error = returnObject.lenBlock.error; return { offset: -1, result: returnObject }; } inputOffset = resultOffset; inputLength -= returnObject.lenBlock.blockLength; if (!returnObject.idBlock.isConstructed && returnObject.lenBlock.isIndefiniteForm) { returnObject.error = "Indefinite length form used for primitive encoding form"; return { offset: -1, result: returnObject }; } let newASN1Type = BaseBlock; switch (returnObject.idBlock.tagClass) { case 1: if (returnObject.idBlock.tagNumber >= 37 && returnObject.idBlock.isHexOnly === false) { returnObject.error = "UNIVERSAL 37 and upper tags are reserved by ASN.1 standard"; return { offset: -1, result: returnObject }; } switch (returnObject.idBlock.tagNumber) { case 0: if (returnObject.idBlock.isConstructed && returnObject.lenBlock.length > 0) { returnObject.error = "Type [UNIVERSAL 0] is reserved"; return { offset: -1, result: returnObject }; } newASN1Type = typeStore.EndOfContent; break; case 1: newASN1Type = typeStore.Boolean; break; case 2: newASN1Type = typeStore.Integer; break; case 3: newASN1Type = typeStore.BitString; break; case 4: newASN1Type = typeStore.OctetString; break; case 5: newASN1Type = typeStore.Null; break; case 6: newASN1Type = typeStore.ObjectIdentifier; break; case 10: newASN1Type = typeStore.Enumerated; break; case 12: newASN1Type = typeStore.Utf8String; break; case 13: newASN1Type = typeStore.RelativeObjectIdentifier; break; case 14: newASN1Type = typeStore.TIME; break; case 15: returnObject.error = "[UNIVERSAL 15] is reserved by ASN.1 standard"; return { offset: -1, result: returnObject }; case 16: newASN1Type = typeStore.Sequence; break; case 17: newASN1Type = typeStore.Set; break; case 18: newASN1Type = typeStore.NumericString; break; case 19: newASN1Type = typeStore.PrintableString; break; case 20: newASN1Type = typeStore.TeletexString; break; case 21: newASN1Type = typeStore.VideotexString; break; case 22: newASN1Type = typeStore.IA5String; break; case 23: newASN1Type = typeStore.UTCTime; break; case 24: newASN1Type = typeStore.GeneralizedTime; break; case 25: newASN1Type = typeStore.GraphicString; break; case 26: newASN1Type = typeStore.VisibleString; break; case 27: newASN1Type = typeStore.GeneralString; break; case 28: newASN1Type = typeStore.UniversalString; break; case 29: newASN1Type = typeStore.CharacterString; break; case 30: newASN1Type = typeStore.BmpString; break; case 31: newASN1Type = typeStore.DATE; break; case 32: newASN1Type = typeStore.TimeOfDay; break; case 33: newASN1Type = typeStore.DateTime; break; case 34: newASN1Type = typeStore.Duration; break; default: { const newObject = returnObject.idBlock.isConstructed ? new typeStore.Constructed() : new typeStore.Primitive(); newObject.idBlock = returnObject.idBlock; newObject.lenBlock = returnObject.lenBlock; newObject.warnings = returnObject.warnings; returnObject = newObject; } } break; case 2: case 3: case 4: default: { newASN1Type = returnObject.idBlock.isConstructed ? typeStore.Constructed : typeStore.Primitive; } } returnObject = localChangeType(returnObject, newASN1Type); resultOffset = returnObject.fromBER(inputBuffer, inputOffset, returnObject.lenBlock.isIndefiniteForm ? inputLength : returnObject.lenBlock.length); returnObject.valueBeforeDecodeView = inputBuffer.subarray(incomingOffset, incomingOffset + returnObject.blockLength); return { offset: resultOffset, result: returnObject }; } function fromBER(inputBuffer) { if (!inputBuffer.byteLength) { const result = new BaseBlock({}, ValueBlock); result.error = "Input buffer has zero length"; return { offset: -1, result }; } return localFromBER(pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer).slice(), 0, inputBuffer.byteLength); } function checkLen(indefiniteLength, length) { if (indefiniteLength) { return 1; } return length; } function viewAdd(first, second) { const c = new Uint8Array([0]); const firstView = new Uint8Array(first); const secondView = new Uint8Array(second); let firstViewCopy = firstView.slice(0); const firstViewCopyLength = firstViewCopy.length - 1; const secondViewCopy = secondView.slice(0); const secondViewCopyLength = secondViewCopy.length - 1; let value = 0; const max3 = secondViewCopyLength < firstViewCopyLength ? firstViewCopyLength : secondViewCopyLength; let counter = 0; for (let i = max3; i >= 0; i--, counter++) { switch (true) { case counter < secondViewCopy.length: value = firstViewCopy[firstViewCopyLength - counter] + secondViewCopy[secondViewCopyLength - counter] + c[0]; break; default: value = firstViewCopy[firstViewCopyLength - counter] + c[0]; } c[0] = value / 10; switch (true) { case counter >= firstViewCopy.length: firstViewCopy = utilConcatView(new Uint8Array([value % 10]), firstViewCopy); break; default: firstViewCopy[firstViewCopyLength - counter] = value % 10; } } if (c[0] > 0) firstViewCopy = utilConcatView(c, firstViewCopy); return firstViewCopy; } function power2(n) { if (n >= powers2.length) { for (let p = powers2.length; p <= n; p++) { const c = new Uint8Array([0]); let digits = powers2[p - 1].slice(0); for (let i = digits.length - 1; i >= 0; i--) { const newValue = new Uint8Array([(digits[i] << 1) + c[0]]); c[0] = newValue[0] / 10; digits[i] = newValue[0] % 10; } if (c[0] > 0) digits = utilConcatView(c, digits); powers2.push(digits); } } return powers2[n]; } function viewSub(first, second) { let b = 0; const firstView = new Uint8Array(first); const secondView = new Uint8Array(second); const firstViewCopy = firstView.slice(0); const firstViewCopyLength = firstViewCopy.length - 1; const secondViewCopy = secondView.slice(0); const secondViewCopyLength = secondViewCopy.length - 1; let value; let counter = 0; for (let i = secondViewCopyLength; i >= 0; i--, counter++) { value = firstViewCopy[firstViewCopyLength - counter] - secondViewCopy[secondViewCopyLength - counter] - b; switch (true) { case value < 0: b = 1; firstViewCopy[firstViewCopyLength - counter] = value + 10; break; default: b = 0; firstViewCopy[firstViewCopyLength - counter] = value; } } if (b > 0) { for (let i = firstViewCopyLength - secondViewCopyLength + 1; i >= 0; i--, counter++) { value = firstViewCopy[firstViewCopyLength - counter] - b; if (value < 0) { b = 1; firstViewCopy[firstViewCopyLength - counter] = value + 10; } else { b = 0; firstViewCopy[firstViewCopyLength - counter] = value; break; } } } return firstViewCopy.slice(); } function compareSchema(root, inputData, inputSchema) { if (inputSchema instanceof Choice) { for (let j = 0; j < inputSchema.value.length; j++) { const result = compareSchema(root, inputData, inputSchema.value[j]); if (result.verified) { return { verified: true, result: root }; } } { const _result = { verified: false, result: { error: "Wrong values for Choice type" } }; if (inputSchema.hasOwnProperty(NAME)) _result.name = inputSchema.name; return _result; } } if (inputSchema instanceof Any) { if (inputSchema.hasOwnProperty(NAME)) root[inputSchema.name] = inputData; return { verified: true, result: root }; } if (root instanceof Object === false) { return { verified: false, result: { error: "Wrong root object" } }; } if (inputData instanceof Object === false) { return { verified: false, result: { error: "Wrong ASN.1 data" } }; } if (inputSchema instanceof Object === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (ID_BLOCK in inputSchema === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (FROM_BER in inputSchema.idBlock === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (TO_BER in inputSchema.idBlock === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } const encodedId = inputSchema.idBlock.toBER(false); if (encodedId.byteLength === 0) { return { verified: false, result: { error: "Error encoding idBlock for ASN.1 schema" } }; } const decodedOffset = inputSchema.idBlock.fromBER(encodedId, 0, encodedId.byteLength); if (decodedOffset === -1) { return { verified: false, result: { error: "Error decoding idBlock for ASN.1 schema" } }; } if (inputSchema.idBlock.hasOwnProperty(TAG_CLASS) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.tagClass !== inputData.idBlock.tagClass) { return { verified: false, result: root }; } if (inputSchema.idBlock.hasOwnProperty(TAG_NUMBER) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.tagNumber !== inputData.idBlock.tagNumber) { return { verified: false, result: root }; } if (inputSchema.idBlock.hasOwnProperty(IS_CONSTRUCTED) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.isConstructed !== inputData.idBlock.isConstructed) { return { verified: false, result: root }; } if (!(IS_HEX_ONLY in inputSchema.idBlock)) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.isHexOnly !== inputData.idBlock.isHexOnly) { return { verified: false, result: root }; } if (inputSchema.idBlock.isHexOnly) { if (VALUE_HEX_VIEW in inputSchema.idBlock === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } const schemaView = inputSchema.idBlock.valueHexView; const asn1View = inputData.idBlock.valueHexView; if (schemaView.length !== asn1View.length) { return { verified: false, result: root }; } for (let i = 0; i < schemaView.length; i++) { if (schemaView[i] !== asn1View[1]) { return { verified: false, result: root }; } } } if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) root[inputSchema.name] = inputData; } if (inputSchema instanceof typeStore.Constructed) { let admission = 0; let result = { verified: false, result: { error: "Unknown error" } }; let maxLength = inputSchema.valueBlock.value.length; if (maxLength > 0) { if (inputSchema.valueBlock.value[0] instanceof Repeated) { maxLength = inputData.valueBlock.value.length; } } if (maxLength === 0) { return { verified: true, result: root }; } if (inputData.valueBlock.value.length === 0 && inputSchema.valueBlock.value.length !== 0) { let _optional = true; for (let i = 0; i < inputSchema.valueBlock.value.length; i++) _optional = _optional && (inputSchema.valueBlock.value[i].optional || false); if (_optional) { return { verified: true, result: root }; } if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } root.error = "Inconsistent object length"; return { verified: false, result: root }; } for (let i = 0; i < maxLength; i++) { if (i - admission >= inputData.valueBlock.value.length) { if (inputSchema.valueBlock.value[i].optional === false) { const _result = { verified: false, result: root }; root.error = "Inconsistent length between ASN.1 data and schema"; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } } else { if (inputSchema.valueBlock.value[0] instanceof Repeated) { result = compareSchema(root, inputData.valueBlock.value[i], inputSchema.valueBlock.value[0].value); if (result.verified === false) { if (inputSchema.valueBlock.value[0].optional) admission++; else { if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } return result; } } if (NAME in inputSchema.valueBlock.value[0] && inputSchema.valueBlock.value[0].name.length > 0) { let arrayRoot = {}; if (LOCAL in inputSchema.valueBlock.value[0] && inputSchema.valueBlock.value[0].local) arrayRoot = inputData; else arrayRoot = root; if (typeof arrayRoot[inputSchema.valueBlock.value[0].name] === "undefined") arrayRoot[inputSchema.valueBlock.value[0].name] = []; arrayRoot[inputSchema.valueBlock.value[0].name].push(inputData.valueBlock.value[i]); } } else { result = compareSchema(root, inputData.valueBlock.value[i - admission], inputSchema.valueBlock.value[i]); if (result.verified === false) { if (inputSchema.valueBlock.value[i].optional) admission++; else { if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } return result; } } } } } if (result.verified === false) { const _result = { verified: false, result: root }; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } return { verified: true, result: root }; } if (inputSchema.primitiveSchema && VALUE_HEX_VIEW in inputData.valueBlock) { const asn1 = localFromBER(inputData.valueBlock.valueHexView); if (asn1.offset === -1) { const _result = { verified: false, result: asn1.result }; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } return compareSchema(root, asn1.result, inputSchema.primitiveSchema); } return { verified: true, result: root }; } function verifySchema(inputBuffer, inputSchema) { if (inputSchema instanceof Object === false) { return { verified: false, result: { error: "Wrong ASN.1 schema type" } }; } const asn1 = localFromBER(pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer)); if (asn1.offset === -1) { return { verified: false, result: asn1.result }; } return compareSchema(asn1.result, asn1.result, inputSchema); } var pvtsutils, ViewWriter, powers2, digitsString, NAME, VALUE_HEX_VIEW, IS_HEX_ONLY, ID_BLOCK, TAG_CLASS, TAG_NUMBER, IS_CONSTRUCTED, FROM_BER, TO_BER, LOCAL, EMPTY_STRING, EMPTY_BUFFER, EMPTY_VIEW, END_OF_CONTENT_NAME, OCTET_STRING_NAME, BIT_STRING_NAME, LocalBaseBlock, ValueBlock, LocalIdentificationBlock, LocalLengthBlock, typeStore, BaseBlock, BaseStringBlock, LocalPrimitiveValueBlock, _a$w, Primitive, LocalConstructedValueBlock, _a$v, Constructed, LocalEndOfContentValueBlock, _a$u, EndOfContent, _a$t, Null, LocalBooleanValueBlock, _a$s, Boolean2, LocalOctetStringValueBlock, _a$r, OctetString, LocalBitStringValueBlock, _a$q, BitString, _a$p, LocalIntegerValueBlock, _a$o, Integer, _a$n, Enumerated, LocalSidValueBlock, LocalObjectIdentifierValueBlock, _a$m, ObjectIdentifier, LocalRelativeSidValueBlock, LocalRelativeObjectIdentifierValueBlock, _a$l, RelativeObjectIdentifier, _a$k, Sequence, _a$j, Set2, LocalStringValueBlock, LocalSimpleStringValueBlock, LocalSimpleStringBlock, LocalUtf8StringValueBlock, _a$i, Utf8String, LocalBmpStringValueBlock, _a$h, BmpString, LocalUniversalStringValueBlock, _a$g, UniversalString, _a$f, NumericString, _a$e, PrintableString, _a$d, TeletexString, _a$c, VideotexString, _a$b, IA5String, _a$a, GraphicString, _a$9, VisibleString, _a$8, GeneralString, _a$7, CharacterString, _a$6, UTCTime, _a$5, GeneralizedTime, _a$4, DATE, _a$3, TimeOfDay, _a$2, DateTime, _a$1, Duration, _a, TIME, Any, Choice, Repeated, RawData; var init_index_es = __esm({ "node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js"() { pvtsutils = __toESM(require_build()); init_utils_es(); ViewWriter = class { constructor() { this.items = []; } write(buf) { this.items.push(buf); } final() { return concat(this.items); } }; powers2 = [new Uint8Array([1])]; digitsString = "0123456789"; NAME = "name"; VALUE_HEX_VIEW = "valueHexView"; IS_HEX_ONLY = "isHexOnly"; ID_BLOCK = "idBlock"; TAG_CLASS = "tagClass"; TAG_NUMBER = "tagNumber"; IS_CONSTRUCTED = "isConstructed"; FROM_BER = "fromBER"; TO_BER = "toBER"; LOCAL = "local"; EMPTY_STRING = ""; EMPTY_BUFFER = new ArrayBuffer(0); EMPTY_VIEW = new Uint8Array(0); END_OF_CONTENT_NAME = "EndOfContent"; OCTET_STRING_NAME = "OCTET STRING"; BIT_STRING_NAME = "BIT STRING"; LocalBaseBlock = class { constructor({ blockLength = 0, error = EMPTY_STRING, warnings = [], valueBeforeDecode = EMPTY_VIEW } = {}) { this.blockLength = blockLength; this.error = error; this.warnings = warnings; this.valueBeforeDecodeView = pvtsutils.BufferSourceConverter.toUint8Array(valueBeforeDecode); } static blockName() { return this.NAME; } get valueBeforeDecode() { return this.valueBeforeDecodeView.slice().buffer; } set valueBeforeDecode(value) { this.valueBeforeDecodeView = new Uint8Array(value); } toJSON() { return { blockName: this.constructor.NAME, blockLength: this.blockLength, error: this.error, warnings: this.warnings, valueBeforeDecode: pvtsutils.Convert.ToHex(this.valueBeforeDecodeView) }; } }; LocalBaseBlock.NAME = "baseBlock"; ValueBlock = class extends LocalBaseBlock { fromBER(inputBuffer, inputOffset, inputLength) { throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'"); } toBER(sizeOnly, writer) { throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'"); } }; ValueBlock.NAME = "valueBlock"; LocalIdentificationBlock = class extends HexBlock(LocalBaseBlock) { constructor({ idBlock = {} } = {}) { var _a2, _b, _c, _d; super(); if (idBlock) { this.isHexOnly = (_a2 = idBlock.isHexOnly) !== null && _a2 !== void 0 ? _a2 : false; this.valueHexView = idBlock.valueHex ? pvtsutils.BufferSourceConverter.toUint8Array(idBlock.valueHex) : EMPTY_VIEW; this.tagClass = (_b = idBlock.tagClass) !== null && _b !== void 0 ? _b : -1; this.tagNumber = (_c = idBlock.tagNumber) !== null && _c !== void 0 ? _c : -1; this.isConstructed = (_d = idBlock.isConstructed) !== null && _d !== void 0 ? _d : false; } else { this.tagClass = -1; this.tagNumber = -1; this.isConstructed = false; } } toBER(sizeOnly = false) { let firstOctet = 0; switch (this.tagClass) { case 1: firstOctet |= 0; break; case 2: firstOctet |= 64; break; case 3: firstOctet |= 128; break; case 4: firstOctet |= 192; break; default: this.error = "Unknown tag class"; return EMPTY_BUFFER; } if (this.isConstructed) firstOctet |= 32; if (this.tagNumber < 31 && !this.isHexOnly) { const retView2 = new Uint8Array(1); if (!sizeOnly) { let number = this.tagNumber; number &= 31; firstOctet |= number; retView2[0] = firstOctet; } return retView2.buffer; } if (!this.isHexOnly) { const encodedBuf = utilToBase(this.tagNumber, 7); const encodedView = new Uint8Array(encodedBuf); const size3 = encodedBuf.byteLength; const retView2 = new Uint8Array(size3 + 1); retView2[0] = firstOctet | 31; if (!sizeOnly) { for (let i = 0; i < size3 - 1; i++) retView2[i + 1] = encodedView[i] | 128; retView2[size3] = encodedView[size3 - 1]; } return retView2.buffer; } const retView = new Uint8Array(this.valueHexView.byteLength + 1); retView[0] = firstOctet | 31; if (!sizeOnly) { const curView = this.valueHexView; for (let i = 0; i < curView.length - 1; i++) retView[i + 1] = curView[i] | 128; retView[this.valueHexView.byteLength] = curView[curView.length - 1]; } return retView.buffer; } fromBER(inputBuffer, inputOffset, inputLength) { const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); if (intBuffer.length === 0) { this.error = "Zero buffer length"; return -1; } const tagClassMask = intBuffer[0] & 192; switch (tagClassMask) { case 0: this.tagClass = 1; break; case 64: this.tagClass = 2; break; case 128: this.tagClass = 3; break; case 192: this.tagClass = 4; break; default: this.error = "Unknown tag class"; return -1; } this.isConstructed = (intBuffer[0] & 32) === 32; this.isHexOnly = false; const tagNumberMask = intBuffer[0] & 31; if (tagNumberMask !== 31) { this.tagNumber = tagNumberMask; this.blockLength = 1; } else { let count = 1; let intTagNumberBuffer = this.valueHexView = new Uint8Array(255); let tagNumberBufferMaxLength = 255; while (intBuffer[count] & 128) { intTagNumberBuffer[count - 1] = intBuffer[count] & 127; count++; if (count >= intBuffer.length) { this.error = "End of input reached before message was fully decoded"; return -1; } if (count === tagNumberBufferMaxLength) { tagNumberBufferMaxLength += 255; const tempBufferView2 = new Uint8Array(tagNumberBufferMaxLength); for (let i = 0; i < intTagNumberBuffer.length; i++) tempBufferView2[i] = intTagNumberBuffer[i]; intTagNumberBuffer = this.valueHexView = new Uint8Array(tagNumberBufferMaxLength); } } this.blockLength = count + 1; intTagNumberBuffer[count - 1] = intBuffer[count] & 127; const tempBufferView = new Uint8Array(count); for (let i = 0; i < count; i++) tempBufferView[i] = intTagNumberBuffer[i]; intTagNumberBuffer = this.valueHexView = new Uint8Array(count); intTagNumberBuffer.set(tempBufferView); if (this.blockLength <= 9) this.tagNumber = utilFromBase(intTagNumberBuffer, 7); else { this.isHexOnly = true; this.warnings.push("Tag too long, represented as hex-coded"); } } if (this.tagClass === 1 && this.isConstructed) { switch (this.tagNumber) { case 1: case 2: case 5: case 6: case 9: case 13: case 14: case 23: case 24: case 31: case 32: case 33: case 34: this.error = "Constructed encoding used for primitive type"; return -1; } } return inputOffset + this.blockLength; } toJSON() { return { ...super.toJSON(), tagClass: this.tagClass, tagNumber: this.tagNumber, isConstructed: this.isConstructed }; } }; LocalIdentificationBlock.NAME = "identificationBlock"; LocalLengthBlock = class extends LocalBaseBlock { constructor({ lenBlock = {} } = {}) { var _a2, _b, _c; super(); this.isIndefiniteForm = (_a2 = lenBlock.isIndefiniteForm) !== null && _a2 !== void 0 ? _a2 : false; this.longFormUsed = (_b = lenBlock.longFormUsed) !== null && _b !== void 0 ? _b : false; this.length = (_c = lenBlock.length) !== null && _c !== void 0 ? _c : 0; } fromBER(inputBuffer, inputOffset, inputLength) { const view = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } const intBuffer = view.subarray(inputOffset, inputOffset + inputLength); if (intBuffer.length === 0) { this.error = "Zero buffer length"; return -1; } if (intBuffer[0] === 255) { this.error = "Length block 0xFF is reserved by standard"; return -1; } this.isIndefiniteForm = intBuffer[0] === 128; if (this.isIndefiniteForm) { this.blockLength = 1; return inputOffset + this.blockLength; } this.longFormUsed = !!(intBuffer[0] & 128); if (this.longFormUsed === false) { this.length = intBuffer[0]; this.blockLength = 1; return inputOffset + this.blockLength; } const count = intBuffer[0] & 127; if (count > 8) { this.error = "Too big integer"; return -1; } if (count + 1 > intBuffer.length) { this.error = "End of input reached before message was fully decoded"; return -1; } const lenOffset = inputOffset + 1; const lengthBufferView = view.subarray(lenOffset, lenOffset + count); if (lengthBufferView[count - 1] === 0) this.warnings.push("Needlessly long encoded length"); this.length = utilFromBase(lengthBufferView, 8); if (this.longFormUsed && this.length <= 127) this.warnings.push("Unnecessary usage of long length form"); this.blockLength = count + 1; return inputOffset + this.blockLength; } toBER(sizeOnly = false) { let retBuf; let retView; if (this.length > 127) this.longFormUsed = true; if (this.isIndefiniteForm) { retBuf = new ArrayBuffer(1); if (sizeOnly === false) { retView = new Uint8Array(retBuf); retView[0] = 128; } return retBuf; } if (this.longFormUsed) { const encodedBuf = utilToBase(this.length, 8); if (encodedBuf.byteLength > 127) { this.error = "Too big length"; return EMPTY_BUFFER; } retBuf = new ArrayBuffer(encodedBuf.byteLength + 1); if (sizeOnly) return retBuf; const encodedView = new Uint8Array(encodedBuf); retView = new Uint8Array(retBuf); retView[0] = encodedBuf.byteLength | 128; for (let i = 0; i < encodedBuf.byteLength; i++) retView[i + 1] = encodedView[i]; return retBuf; } retBuf = new ArrayBuffer(1); if (sizeOnly === false) { retView = new Uint8Array(retBuf); retView[0] = this.length; } return retBuf; } toJSON() { return { ...super.toJSON(), isIndefiniteForm: this.isIndefiniteForm, longFormUsed: this.longFormUsed, length: this.length }; } }; LocalLengthBlock.NAME = "lengthBlock"; typeStore = {}; BaseBlock = class extends LocalBaseBlock { constructor({ name = EMPTY_STRING, optional = false, primitiveSchema, ...parameters } = {}, valueBlockType) { super(parameters); this.name = name; this.optional = optional; if (primitiveSchema) { this.primitiveSchema = primitiveSchema; } this.idBlock = new LocalIdentificationBlock(parameters); this.lenBlock = new LocalLengthBlock(parameters); this.valueBlock = valueBlockType ? new valueBlockType(parameters) : new ValueBlock(parameters); } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, this.lenBlock.isIndefiniteForm ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } toBER(sizeOnly, writer) { const _writer = writer || new ViewWriter(); if (!writer) { prepareIndefiniteForm(this); } const idBlockBuf = this.idBlock.toBER(sizeOnly); _writer.write(idBlockBuf); if (this.lenBlock.isIndefiniteForm) { _writer.write(new Uint8Array([128]).buffer); this.valueBlock.toBER(sizeOnly, _writer); _writer.write(new ArrayBuffer(2)); } else { const valueBlockBuf = this.valueBlock.toBER(sizeOnly); this.lenBlock.length = valueBlockBuf.byteLength; const lenBlockBuf = this.lenBlock.toBER(sizeOnly); _writer.write(lenBlockBuf); _writer.write(valueBlockBuf); } if (!writer) { return _writer.final(); } return EMPTY_BUFFER; } toJSON() { const object = { ...super.toJSON(), idBlock: this.idBlock.toJSON(), lenBlock: this.lenBlock.toJSON(), valueBlock: this.valueBlock.toJSON(), name: this.name, optional: this.optional }; if (this.primitiveSchema) object.primitiveSchema = this.primitiveSchema.toJSON(); return object; } toString(encoding = "ascii") { if (encoding === "ascii") { return this.onAsciiEncoding(); } return pvtsutils.Convert.ToHex(this.toBER()); } onAsciiEncoding() { return `${this.constructor.NAME} : ${pvtsutils.Convert.ToHex(this.valueBlock.valueBeforeDecodeView)}`; } isEqual(other) { if (this === other) { return true; } if (!(other instanceof this.constructor)) { return false; } const thisRaw = this.toBER(); const otherRaw = other.toBER(); return isEqualBuffer(thisRaw, otherRaw); } }; BaseBlock.NAME = "BaseBlock"; BaseStringBlock = class extends BaseBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}, stringValueBlockType) { super(parameters, stringValueBlockType); if (value) { this.fromString(value); } } getValue() { return this.valueBlock.value; } setValue(value) { this.valueBlock.value = value; } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, this.lenBlock.isIndefiniteForm ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } this.fromBuffer(this.valueBlock.valueHexView); if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } onAsciiEncoding() { return `${this.constructor.NAME} : '${this.valueBlock.value}'`; } }; BaseStringBlock.NAME = "BaseStringBlock"; LocalPrimitiveValueBlock = class extends HexBlock(ValueBlock) { constructor({ isHexOnly = true, ...parameters } = {}) { super(parameters); this.isHexOnly = isHexOnly; } }; LocalPrimitiveValueBlock.NAME = "PrimitiveValueBlock"; Primitive = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalPrimitiveValueBlock); this.idBlock.isConstructed = false; } }; _a$w = Primitive; (() => { typeStore.Primitive = _a$w; })(); Primitive.NAME = "PRIMITIVE"; LocalConstructedValueBlock = class extends ValueBlock { constructor({ value = [], isIndefiniteForm = false, ...parameters } = {}) { super(parameters); this.value = value; this.isIndefiniteForm = isIndefiniteForm; } fromBER(inputBuffer, inputOffset, inputLength) { const view = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } this.valueBeforeDecodeView = view.subarray(inputOffset, inputOffset + inputLength); if (this.valueBeforeDecodeView.length === 0) { this.warnings.push("Zero buffer length"); return inputOffset; } let currentOffset = inputOffset; while (checkLen(this.isIndefiniteForm, inputLength) > 0) { const returnObject = localFromBER(view, currentOffset, inputLength); if (returnObject.offset === -1) { this.error = returnObject.result.error; this.warnings.concat(returnObject.result.warnings); return -1; } currentOffset = returnObject.offset; this.blockLength += returnObject.result.blockLength; inputLength -= returnObject.result.blockLength; this.value.push(returnObject.result); if (this.isIndefiniteForm && returnObject.result.constructor.NAME === END_OF_CONTENT_NAME) { break; } } if (this.isIndefiniteForm) { if (this.value[this.value.length - 1].constructor.NAME === END_OF_CONTENT_NAME) { this.value.pop(); } else { this.warnings.push("No EndOfContent block encoded"); } } return currentOffset; } toBER(sizeOnly, writer) { const _writer = writer || new ViewWriter(); for (let i = 0; i < this.value.length; i++) { this.value[i].toBER(sizeOnly, _writer); } if (!writer) { return _writer.final(); } return EMPTY_BUFFER; } toJSON() { const object = { ...super.toJSON(), isIndefiniteForm: this.isIndefiniteForm, value: [] }; for (const value of this.value) { object.value.push(value.toJSON()); } return object; } }; LocalConstructedValueBlock.NAME = "ConstructedValueBlock"; Constructed = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalConstructedValueBlock); this.idBlock.isConstructed = true; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, this.lenBlock.isIndefiniteForm ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } onAsciiEncoding() { const values = []; for (const value of this.valueBlock.value) { values.push(value.toString("ascii").split("\n").map((o) => ` ${o}`).join("\n")); } const blockName = this.idBlock.tagClass === 3 ? `[${this.idBlock.tagNumber}]` : this.constructor.NAME; return values.length ? `${blockName} : ${values.join("\n")}` : `${blockName} :`; } }; _a$v = Constructed; (() => { typeStore.Constructed = _a$v; })(); Constructed.NAME = "CONSTRUCTED"; LocalEndOfContentValueBlock = class extends ValueBlock { fromBER(inputBuffer, inputOffset, inputLength) { return inputOffset; } toBER(sizeOnly) { return EMPTY_BUFFER; } }; LocalEndOfContentValueBlock.override = "EndOfContentValueBlock"; EndOfContent = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalEndOfContentValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 0; } }; _a$u = EndOfContent; (() => { typeStore.EndOfContent = _a$u; })(); EndOfContent.NAME = END_OF_CONTENT_NAME; Null = class extends BaseBlock { constructor(parameters = {}) { super(parameters, ValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 5; } fromBER(inputBuffer, inputOffset, inputLength) { if (this.lenBlock.length > 0) this.warnings.push("Non-zero length of value block for Null type"); if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; this.blockLength += inputLength; if (inputOffset + inputLength > inputBuffer.byteLength) { this.error = "End of input reached before message was fully decoded (inconsistent offset and length values)"; return -1; } return inputOffset + inputLength; } toBER(sizeOnly, writer) { const retBuf = new ArrayBuffer(2); if (!sizeOnly) { const retView = new Uint8Array(retBuf); retView[0] = 5; retView[1] = 0; } if (writer) { writer.write(retBuf); } return retBuf; } onAsciiEncoding() { return `${this.constructor.NAME}`; } }; _a$t = Null; (() => { typeStore.Null = _a$t; })(); Null.NAME = "NULL"; LocalBooleanValueBlock = class extends HexBlock(ValueBlock) { constructor({ value, ...parameters } = {}) { super(parameters); if (parameters.valueHex) { this.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(parameters.valueHex); } else { this.valueHexView = new Uint8Array(1); } if (value) { this.value = value; } } get value() { for (const octet of this.valueHexView) { if (octet > 0) { return true; } } return false; } set value(value) { this.valueHexView[0] = value ? 255 : 0; } fromBER(inputBuffer, inputOffset, inputLength) { const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } this.valueHexView = inputView.subarray(inputOffset, inputOffset + inputLength); if (inputLength > 1) this.warnings.push("Boolean value encoded in more then 1 octet"); this.isHexOnly = true; utilDecodeTC.call(this); this.blockLength = inputLength; return inputOffset + inputLength; } toBER() { return this.valueHexView.slice(); } toJSON() { return { ...super.toJSON(), value: this.value }; } }; LocalBooleanValueBlock.NAME = "BooleanValueBlock"; Boolean2 = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalBooleanValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 1; } getValue() { return this.valueBlock.value; } setValue(value) { this.valueBlock.value = value; } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.getValue}`; } }; _a$s = Boolean2; (() => { typeStore.Boolean = _a$s; })(); Boolean2.NAME = "BOOLEAN"; LocalOctetStringValueBlock = class extends HexBlock(LocalConstructedValueBlock) { constructor({ isConstructed = false, ...parameters } = {}) { super(parameters); this.isConstructed = isConstructed; } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = 0; if (this.isConstructed) { this.isHexOnly = false; resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength); if (resultOffset === -1) return resultOffset; for (let i = 0; i < this.value.length; i++) { const currentBlockName = this.value[i].constructor.NAME; if (currentBlockName === END_OF_CONTENT_NAME) { if (this.isIndefiniteForm) break; else { this.error = "EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only"; return -1; } } if (currentBlockName !== OCTET_STRING_NAME) { this.error = "OCTET STRING may consists of OCTET STRINGs only"; return -1; } } } else { this.isHexOnly = true; resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength); this.blockLength = inputLength; } return resultOffset; } toBER(sizeOnly, writer) { if (this.isConstructed) return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer); return sizeOnly ? new ArrayBuffer(this.valueHexView.byteLength) : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), isConstructed: this.isConstructed }; } }; LocalOctetStringValueBlock.NAME = "OctetStringValueBlock"; OctetString = class _OctetString extends BaseBlock { constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) { var _b, _c; (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length); super({ idBlock: { isConstructed: parameters.isConstructed, ...idBlock }, lenBlock: { ...lenBlock, isIndefiniteForm: !!parameters.isIndefiniteForm }, ...parameters }, LocalOctetStringValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 4; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isConstructed = this.idBlock.isConstructed; this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; if (inputLength === 0) { if (this.idBlock.error.length === 0) this.blockLength += this.idBlock.blockLength; if (this.lenBlock.error.length === 0) this.blockLength += this.lenBlock.blockLength; return inputOffset; } if (!this.valueBlock.isConstructed) { const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer; const buf = view.subarray(inputOffset, inputOffset + inputLength); try { if (buf.byteLength) { const asn = localFromBER(buf, 0, buf.byteLength); if (asn.offset !== -1 && asn.offset === inputLength) { this.valueBlock.value = [asn.result]; } } } catch (e) { } } return super.fromBER(inputBuffer, inputOffset, inputLength); } onAsciiEncoding() { if (this.valueBlock.isConstructed || this.valueBlock.value && this.valueBlock.value.length) { return Constructed.prototype.onAsciiEncoding.call(this); } return `${this.constructor.NAME} : ${pvtsutils.Convert.ToHex(this.valueBlock.valueHexView)}`; } getValue() { if (!this.idBlock.isConstructed) { return this.valueBlock.valueHexView.slice().buffer; } const array = []; for (const content of this.valueBlock.value) { if (content instanceof _OctetString) { array.push(content.valueBlock.valueHexView); } } return pvtsutils.BufferSourceConverter.concat(array); } }; _a$r = OctetString; (() => { typeStore.OctetString = _a$r; })(); OctetString.NAME = OCTET_STRING_NAME; LocalBitStringValueBlock = class extends HexBlock(LocalConstructedValueBlock) { constructor({ unusedBits = 0, isConstructed = false, ...parameters } = {}) { super(parameters); this.unusedBits = unusedBits; this.isConstructed = isConstructed; this.blockLength = this.valueHexView.byteLength; } fromBER(inputBuffer, inputOffset, inputLength) { if (!inputLength) { return inputOffset; } let resultOffset = -1; if (this.isConstructed) { resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength); if (resultOffset === -1) return resultOffset; for (const value of this.value) { const currentBlockName = value.constructor.NAME; if (currentBlockName === END_OF_CONTENT_NAME) { if (this.isIndefiniteForm) break; else { this.error = "EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only"; return -1; } } if (currentBlockName !== BIT_STRING_NAME) { this.error = "BIT STRING may consists of BIT STRINGs only"; return -1; } const valueBlock = value.valueBlock; if (this.unusedBits > 0 && valueBlock.unusedBits > 0) { this.error = 'Using of "unused bits" inside constructive BIT STRING allowed for least one only'; return -1; } this.unusedBits = valueBlock.unusedBits; } return resultOffset; } const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.unusedBits = intBuffer[0]; if (this.unusedBits > 7) { this.error = "Unused bits for BitString must be in range 0-7"; return -1; } if (!this.unusedBits) { const buf = intBuffer.subarray(1); try { if (buf.byteLength) { const asn = localFromBER(buf, 0, buf.byteLength); if (asn.offset !== -1 && asn.offset === inputLength - 1) { this.value = [asn.result]; } } } catch (e) { } } this.valueHexView = intBuffer.subarray(1); this.blockLength = intBuffer.length; return inputOffset + inputLength; } toBER(sizeOnly, writer) { if (this.isConstructed) { return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer); } if (sizeOnly) { return new ArrayBuffer(this.valueHexView.byteLength + 1); } if (!this.valueHexView.byteLength) { return EMPTY_BUFFER; } const retView = new Uint8Array(this.valueHexView.length + 1); retView[0] = this.unusedBits; retView.set(this.valueHexView, 1); return retView.buffer; } toJSON() { return { ...super.toJSON(), unusedBits: this.unusedBits, isConstructed: this.isConstructed }; } }; LocalBitStringValueBlock.NAME = "BitStringValueBlock"; BitString = class extends BaseBlock { constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) { var _b, _c; (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length); super({ idBlock: { isConstructed: parameters.isConstructed, ...idBlock }, lenBlock: { ...lenBlock, isIndefiniteForm: !!parameters.isIndefiniteForm }, ...parameters }, LocalBitStringValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 3; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isConstructed = this.idBlock.isConstructed; this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; return super.fromBER(inputBuffer, inputOffset, inputLength); } onAsciiEncoding() { if (this.valueBlock.isConstructed || this.valueBlock.value && this.valueBlock.value.length) { return Constructed.prototype.onAsciiEncoding.call(this); } else { const bits = []; const valueHex = this.valueBlock.valueHexView; for (const byte of valueHex) { bits.push(byte.toString(2).padStart(8, "0")); } const bitsStr = bits.join(""); return `${this.constructor.NAME} : ${bitsStr.substring(0, bitsStr.length - this.valueBlock.unusedBits)}`; } } }; _a$q = BitString; (() => { typeStore.BitString = _a$q; })(); BitString.NAME = BIT_STRING_NAME; LocalIntegerValueBlock = class extends HexBlock(ValueBlock) { constructor({ value, ...parameters } = {}) { super(parameters); this._valueDec = 0; if (parameters.valueHex) { this.setValueHex(); } if (value !== void 0) { this.valueDec = value; } } setValueHex() { if (this.valueHexView.length >= 4) { this.warnings.push("Too big Integer for decoding, hex only"); this.isHexOnly = true; this._valueDec = 0; } else { this.isHexOnly = false; if (this.valueHexView.length > 0) { this._valueDec = utilDecodeTC.call(this); } } } set valueDec(v) { this._valueDec = v; this.isHexOnly = false; this.valueHexView = new Uint8Array(utilEncodeTC(v)); } get valueDec() { return this._valueDec; } fromDER(inputBuffer, inputOffset, inputLength, expectedLength = 0) { const offset4 = this.fromBER(inputBuffer, inputOffset, inputLength); if (offset4 === -1) return offset4; const view = this.valueHexView; if (view[0] === 0 && (view[1] & 128) !== 0) { this.valueHexView = view.subarray(1); } else { if (expectedLength !== 0) { if (view.length < expectedLength) { if (expectedLength - view.length > 1) expectedLength = view.length + 1; this.valueHexView = view.subarray(expectedLength - view.length); } } } return offset4; } toDER(sizeOnly = false) { const view = this.valueHexView; switch (true) { case (view[0] & 128) !== 0: { const updatedView = new Uint8Array(this.valueHexView.length + 1); updatedView[0] = 0; updatedView.set(view, 1); this.valueHexView = updatedView; } break; case (view[0] === 0 && (view[1] & 128) === 0): { this.valueHexView = this.valueHexView.subarray(1); } break; } return this.toBER(sizeOnly); } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength); if (resultOffset === -1) { return resultOffset; } this.setValueHex(); return resultOffset; } toBER(sizeOnly) { return sizeOnly ? new ArrayBuffer(this.valueHexView.length) : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec }; } toString() { const firstBit = this.valueHexView.length * 8 - 1; let digits = new Uint8Array(this.valueHexView.length * 8 / 3); let bitNumber = 0; let currentByte; const asn1View = this.valueHexView; let result = ""; let flag3 = false; for (let byteNumber = asn1View.byteLength - 1; byteNumber >= 0; byteNumber--) { currentByte = asn1View[byteNumber]; for (let i = 0; i < 8; i++) { if ((currentByte & 1) === 1) { switch (bitNumber) { case firstBit: digits = viewSub(power2(bitNumber), digits); result = "-"; break; default: digits = viewAdd(digits, power2(bitNumber)); } } bitNumber++; currentByte >>= 1; } } for (let i = 0; i < digits.length; i++) { if (digits[i]) flag3 = true; if (flag3) result += digitsString.charAt(digits[i]); } if (flag3 === false) result += digitsString.charAt(0); return result; } }; _a$p = LocalIntegerValueBlock; LocalIntegerValueBlock.NAME = "IntegerValueBlock"; (() => { Object.defineProperty(_a$p.prototype, "valueHex", { set: function(v) { this.valueHexView = new Uint8Array(v); this.setValueHex(); }, get: function() { return this.valueHexView.slice().buffer; } }); })(); Integer = class _Integer extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalIntegerValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 2; } toBigInt() { assertBigInt(); return BigInt(this.valueBlock.toString()); } static fromBigInt(value) { assertBigInt(); const bigIntValue = BigInt(value); const writer = new ViewWriter(); const hex2 = bigIntValue.toString(16).replace(/^-/, ""); const view = new Uint8Array(pvtsutils.Convert.FromHex(hex2)); if (bigIntValue < 0) { const first = new Uint8Array(view.length + (view[0] & 128 ? 1 : 0)); first[0] |= 128; const firstInt = BigInt(`0x${pvtsutils.Convert.ToHex(first)}`); const secondInt = firstInt + bigIntValue; const second = pvtsutils.BufferSourceConverter.toUint8Array(pvtsutils.Convert.FromHex(secondInt.toString(16))); second[0] |= 128; writer.write(second); } else { if (view[0] & 128) { writer.write(new Uint8Array([0])); } writer.write(view); } const res = new _Integer({ valueHex: writer.final() }); return res; } convertToDER() { const integer = new _Integer({ valueHex: this.valueBlock.valueHexView }); integer.valueBlock.toDER(); return integer; } convertFromDER() { return new _Integer({ valueHex: this.valueBlock.valueHexView[0] === 0 ? this.valueBlock.valueHexView.subarray(1) : this.valueBlock.valueHexView }); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString()}`; } }; _a$o = Integer; (() => { typeStore.Integer = _a$o; })(); Integer.NAME = "INTEGER"; Enumerated = class extends Integer { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 10; } }; _a$n = Enumerated; (() => { typeStore.Enumerated = _a$n; })(); Enumerated.NAME = "ENUMERATED"; LocalSidValueBlock = class extends HexBlock(ValueBlock) { constructor({ valueDec = -1, isFirstSid = false, ...parameters } = {}) { super(parameters); this.valueDec = valueDec; this.isFirstSid = isFirstSid; } fromBER(inputBuffer, inputOffset, inputLength) { if (!inputLength) { return inputOffset; } const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.valueHexView = new Uint8Array(inputLength); for (let i = 0; i < inputLength; i++) { this.valueHexView[i] = intBuffer[i] & 127; this.blockLength++; if ((intBuffer[i] & 128) === 0) break; } const tempView = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength; i++) { tempView[i] = this.valueHexView[i]; } this.valueHexView = tempView; if ((intBuffer[this.blockLength - 1] & 128) !== 0) { this.error = "End of input reached before message was fully decoded"; return -1; } if (this.valueHexView[0] === 0) this.warnings.push("Needlessly long format of SID encoding"); if (this.blockLength <= 8) this.valueDec = utilFromBase(this.valueHexView, 7); else { this.isHexOnly = true; this.warnings.push("Too big SID for decoding, hex only"); } return inputOffset + this.blockLength; } set valueBigInt(value) { assertBigInt(); let bits = BigInt(value).toString(2); while (bits.length % 7) { bits = "0" + bits; } const bytes = new Uint8Array(bits.length / 7); for (let i = 0; i < bytes.length; i++) { bytes[i] = parseInt(bits.slice(i * 7, i * 7 + 7), 2) + (i + 1 < bytes.length ? 128 : 0); } this.fromBER(bytes.buffer, 0, bytes.length); } toBER(sizeOnly) { if (this.isHexOnly) { if (sizeOnly) return new ArrayBuffer(this.valueHexView.byteLength); const curView = this.valueHexView; const retView2 = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength - 1; i++) retView2[i] = curView[i] | 128; retView2[this.blockLength - 1] = curView[this.blockLength - 1]; return retView2.buffer; } const encodedBuf = utilToBase(this.valueDec, 7); if (encodedBuf.byteLength === 0) { this.error = "Error during encoding SID value"; return EMPTY_BUFFER; } const retView = new Uint8Array(encodedBuf.byteLength); if (!sizeOnly) { const encodedView = new Uint8Array(encodedBuf); const len = encodedBuf.byteLength - 1; for (let i = 0; i < len; i++) retView[i] = encodedView[i] | 128; retView[len] = encodedView[len]; } return retView; } toString() { let result = ""; if (this.isHexOnly) result = pvtsutils.Convert.ToHex(this.valueHexView); else { if (this.isFirstSid) { let sidValue = this.valueDec; if (this.valueDec <= 39) result = "0."; else { if (this.valueDec <= 79) { result = "1."; sidValue -= 40; } else { result = "2."; sidValue -= 80; } } result += sidValue.toString(); } else result = this.valueDec.toString(); } return result; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec, isFirstSid: this.isFirstSid }; } }; LocalSidValueBlock.NAME = "sidBlock"; LocalObjectIdentifierValueBlock = class extends ValueBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}) { super(parameters); this.value = []; if (value) { this.fromString(value); } } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = inputOffset; while (inputLength > 0) { const sidBlock = new LocalSidValueBlock(); resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength); if (resultOffset === -1) { this.blockLength = 0; this.error = sidBlock.error; return resultOffset; } if (this.value.length === 0) sidBlock.isFirstSid = true; this.blockLength += sidBlock.blockLength; inputLength -= sidBlock.blockLength; this.value.push(sidBlock); } return resultOffset; } toBER(sizeOnly) { const retBuffers = []; for (let i = 0; i < this.value.length; i++) { const valueBuf = this.value[i].toBER(sizeOnly); if (valueBuf.byteLength === 0) { this.error = this.value[i].error; return EMPTY_BUFFER; } retBuffers.push(valueBuf); } return concat(retBuffers); } fromString(string) { this.value = []; let pos1 = 0; let pos2 = 0; let sid = ""; let flag3 = false; do { pos2 = string.indexOf(".", pos1); if (pos2 === -1) sid = string.substring(pos1); else sid = string.substring(pos1, pos2); pos1 = pos2 + 1; if (flag3) { const sidBlock = this.value[0]; let plus = 0; switch (sidBlock.valueDec) { case 0: break; case 1: plus = 40; break; case 2: plus = 80; break; default: this.value = []; return; } const parsedSID = parseInt(sid, 10); if (isNaN(parsedSID)) return; sidBlock.valueDec = parsedSID + plus; flag3 = false; } else { const sidBlock = new LocalSidValueBlock(); if (sid > Number.MAX_SAFE_INTEGER) { assertBigInt(); const sidValue = BigInt(sid); sidBlock.valueBigInt = sidValue; } else { sidBlock.valueDec = parseInt(sid, 10); if (isNaN(sidBlock.valueDec)) return; } if (!this.value.length) { sidBlock.isFirstSid = true; flag3 = true; } this.value.push(sidBlock); } } while (pos2 !== -1); } toString() { let result = ""; let isHexOnly = false; for (let i = 0; i < this.value.length; i++) { isHexOnly = this.value[i].isHexOnly; let sidStr = this.value[i].toString(); if (i !== 0) result = `${result}.`; if (isHexOnly) { sidStr = `{${sidStr}}`; if (this.value[i].isFirstSid) result = `2.{${sidStr} - 80}`; else result += sidStr; } else result += sidStr; } return result; } toJSON() { const object = { ...super.toJSON(), value: this.toString(), sidArray: [] }; for (let i = 0; i < this.value.length; i++) { object.sidArray.push(this.value[i].toJSON()); } return object; } }; LocalObjectIdentifierValueBlock.NAME = "ObjectIdentifierValueBlock"; ObjectIdentifier = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalObjectIdentifierValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 6; } getValue() { return this.valueBlock.toString(); } setValue(value) { this.valueBlock.fromString(value); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString() || "empty"}`; } toJSON() { return { ...super.toJSON(), value: this.getValue() }; } }; _a$m = ObjectIdentifier; (() => { typeStore.ObjectIdentifier = _a$m; })(); ObjectIdentifier.NAME = "OBJECT IDENTIFIER"; LocalRelativeSidValueBlock = class extends HexBlock(LocalBaseBlock) { constructor({ valueDec = 0, ...parameters } = {}) { super(parameters); this.valueDec = valueDec; } fromBER(inputBuffer, inputOffset, inputLength) { if (inputLength === 0) return inputOffset; const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) return -1; const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.valueHexView = new Uint8Array(inputLength); for (let i = 0; i < inputLength; i++) { this.valueHexView[i] = intBuffer[i] & 127; this.blockLength++; if ((intBuffer[i] & 128) === 0) break; } const tempView = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength; i++) tempView[i] = this.valueHexView[i]; this.valueHexView = tempView; if ((intBuffer[this.blockLength - 1] & 128) !== 0) { this.error = "End of input reached before message was fully decoded"; return -1; } if (this.valueHexView[0] === 0) this.warnings.push("Needlessly long format of SID encoding"); if (this.blockLength <= 8) this.valueDec = utilFromBase(this.valueHexView, 7); else { this.isHexOnly = true; this.warnings.push("Too big SID for decoding, hex only"); } return inputOffset + this.blockLength; } toBER(sizeOnly) { if (this.isHexOnly) { if (sizeOnly) return new ArrayBuffer(this.valueHexView.byteLength); const curView = this.valueHexView; const retView2 = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength - 1; i++) retView2[i] = curView[i] | 128; retView2[this.blockLength - 1] = curView[this.blockLength - 1]; return retView2.buffer; } const encodedBuf = utilToBase(this.valueDec, 7); if (encodedBuf.byteLength === 0) { this.error = "Error during encoding SID value"; return EMPTY_BUFFER; } const retView = new Uint8Array(encodedBuf.byteLength); if (!sizeOnly) { const encodedView = new Uint8Array(encodedBuf); const len = encodedBuf.byteLength - 1; for (let i = 0; i < len; i++) retView[i] = encodedView[i] | 128; retView[len] = encodedView[len]; } return retView.buffer; } toString() { let result = ""; if (this.isHexOnly) result = pvtsutils.Convert.ToHex(this.valueHexView); else { result = this.valueDec.toString(); } return result; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec }; } }; LocalRelativeSidValueBlock.NAME = "relativeSidBlock"; LocalRelativeObjectIdentifierValueBlock = class extends ValueBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}) { super(parameters); this.value = []; if (value) { this.fromString(value); } } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = inputOffset; while (inputLength > 0) { const sidBlock = new LocalRelativeSidValueBlock(); resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength); if (resultOffset === -1) { this.blockLength = 0; this.error = sidBlock.error; return resultOffset; } this.blockLength += sidBlock.blockLength; inputLength -= sidBlock.blockLength; this.value.push(sidBlock); } return resultOffset; } toBER(sizeOnly, writer) { const retBuffers = []; for (let i = 0; i < this.value.length; i++) { const valueBuf = this.value[i].toBER(sizeOnly); if (valueBuf.byteLength === 0) { this.error = this.value[i].error; return EMPTY_BUFFER; } retBuffers.push(valueBuf); } return concat(retBuffers); } fromString(string) { this.value = []; let pos1 = 0; let pos2 = 0; let sid = ""; do { pos2 = string.indexOf(".", pos1); if (pos2 === -1) sid = string.substring(pos1); else sid = string.substring(pos1, pos2); pos1 = pos2 + 1; const sidBlock = new LocalRelativeSidValueBlock(); sidBlock.valueDec = parseInt(sid, 10); if (isNaN(sidBlock.valueDec)) return true; this.value.push(sidBlock); } while (pos2 !== -1); return true; } toString() { let result = ""; let isHexOnly = false; for (let i = 0; i < this.value.length; i++) { isHexOnly = this.value[i].isHexOnly; let sidStr = this.value[i].toString(); if (i !== 0) result = `${result}.`; if (isHexOnly) { sidStr = `{${sidStr}}`; result += sidStr; } else result += sidStr; } return result; } toJSON() { const object = { ...super.toJSON(), value: this.toString(), sidArray: [] }; for (let i = 0; i < this.value.length; i++) object.sidArray.push(this.value[i].toJSON()); return object; } }; LocalRelativeObjectIdentifierValueBlock.NAME = "RelativeObjectIdentifierValueBlock"; RelativeObjectIdentifier = class extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalRelativeObjectIdentifierValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 13; } getValue() { return this.valueBlock.toString(); } setValue(value) { this.valueBlock.fromString(value); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString() || "empty"}`; } toJSON() { return { ...super.toJSON(), value: this.getValue() }; } }; _a$l = RelativeObjectIdentifier; (() => { typeStore.RelativeObjectIdentifier = _a$l; })(); RelativeObjectIdentifier.NAME = "RelativeObjectIdentifier"; Sequence = class extends Constructed { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 16; } }; _a$k = Sequence; (() => { typeStore.Sequence = _a$k; })(); Sequence.NAME = "SEQUENCE"; Set2 = class extends Constructed { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 17; } }; _a$j = Set2; (() => { typeStore.Set = _a$j; })(); Set2.NAME = "SET"; LocalStringValueBlock = class extends HexBlock(ValueBlock) { constructor({ ...parameters } = {}) { super(parameters); this.isHexOnly = true; this.value = EMPTY_STRING; } toJSON() { return { ...super.toJSON(), value: this.value }; } }; LocalStringValueBlock.NAME = "StringValueBlock"; LocalSimpleStringValueBlock = class extends LocalStringValueBlock { }; LocalSimpleStringValueBlock.NAME = "SimpleStringValueBlock"; LocalSimpleStringBlock = class extends BaseStringBlock { constructor({ ...parameters } = {}) { super(parameters, LocalSimpleStringValueBlock); } fromBuffer(inputBuffer) { this.valueBlock.value = String.fromCharCode.apply(null, pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer)); } fromString(inputString) { const strLen = inputString.length; const view = this.valueBlock.valueHexView = new Uint8Array(strLen); for (let i = 0; i < strLen; i++) view[i] = inputString.charCodeAt(i); this.valueBlock.value = inputString; } }; LocalSimpleStringBlock.NAME = "SIMPLE STRING"; LocalUtf8StringValueBlock = class extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { this.valueBlock.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); try { this.valueBlock.value = pvtsutils.Convert.ToUtf8String(inputBuffer); } catch (ex) { this.warnings.push(`Error during "decodeURIComponent": ${ex}, using raw string`); this.valueBlock.value = pvtsutils.Convert.ToBinary(inputBuffer); } } fromString(inputString) { this.valueBlock.valueHexView = new Uint8Array(pvtsutils.Convert.FromUtf8String(inputString)); this.valueBlock.value = inputString; } }; LocalUtf8StringValueBlock.NAME = "Utf8StringValueBlock"; Utf8String = class extends LocalUtf8StringValueBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 12; } }; _a$i = Utf8String; (() => { typeStore.Utf8String = _a$i; })(); Utf8String.NAME = "UTF8String"; LocalBmpStringValueBlock = class extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { this.valueBlock.value = pvtsutils.Convert.ToUtf16String(inputBuffer); this.valueBlock.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer); } fromString(inputString) { this.valueBlock.value = inputString; this.valueBlock.valueHexView = new Uint8Array(pvtsutils.Convert.FromUtf16String(inputString)); } }; LocalBmpStringValueBlock.NAME = "BmpStringValueBlock"; BmpString = class extends LocalBmpStringValueBlock { constructor({ ...parameters } = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 30; } }; _a$h = BmpString; (() => { typeStore.BmpString = _a$h; })(); BmpString.NAME = "BMPString"; LocalUniversalStringValueBlock = class extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { const copyBuffer = ArrayBuffer.isView(inputBuffer) ? inputBuffer.slice().buffer : inputBuffer.slice(0); const valueView = new Uint8Array(copyBuffer); for (let i = 0; i < valueView.length; i += 4) { valueView[i] = valueView[i + 3]; valueView[i + 1] = valueView[i + 2]; valueView[i + 2] = 0; valueView[i + 3] = 0; } this.valueBlock.value = String.fromCharCode.apply(null, new Uint32Array(copyBuffer)); } fromString(inputString) { const strLength = inputString.length; const valueHexView = this.valueBlock.valueHexView = new Uint8Array(strLength * 4); for (let i = 0; i < strLength; i++) { const codeBuf = utilToBase(inputString.charCodeAt(i), 8); const codeView = new Uint8Array(codeBuf); if (codeView.length > 4) continue; const dif = 4 - codeView.length; for (let j = codeView.length - 1; j >= 0; j--) valueHexView[i * 4 + j + dif] = codeView[j]; } this.valueBlock.value = inputString; } }; LocalUniversalStringValueBlock.NAME = "UniversalStringValueBlock"; UniversalString = class extends LocalUniversalStringValueBlock { constructor({ ...parameters } = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 28; } }; _a$g = UniversalString; (() => { typeStore.UniversalString = _a$g; })(); UniversalString.NAME = "UniversalString"; NumericString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 18; } }; _a$f = NumericString; (() => { typeStore.NumericString = _a$f; })(); NumericString.NAME = "NumericString"; PrintableString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 19; } }; _a$e = PrintableString; (() => { typeStore.PrintableString = _a$e; })(); PrintableString.NAME = "PrintableString"; TeletexString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 20; } }; _a$d = TeletexString; (() => { typeStore.TeletexString = _a$d; })(); TeletexString.NAME = "TeletexString"; VideotexString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 21; } }; _a$c = VideotexString; (() => { typeStore.VideotexString = _a$c; })(); VideotexString.NAME = "VideotexString"; IA5String = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 22; } }; _a$b = IA5String; (() => { typeStore.IA5String = _a$b; })(); IA5String.NAME = "IA5String"; GraphicString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 25; } }; _a$a = GraphicString; (() => { typeStore.GraphicString = _a$a; })(); GraphicString.NAME = "GraphicString"; VisibleString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 26; } }; _a$9 = VisibleString; (() => { typeStore.VisibleString = _a$9; })(); VisibleString.NAME = "VisibleString"; GeneralString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 27; } }; _a$8 = GeneralString; (() => { typeStore.GeneralString = _a$8; })(); GeneralString.NAME = "GeneralString"; CharacterString = class extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 29; } }; _a$7 = CharacterString; (() => { typeStore.CharacterString = _a$7; })(); CharacterString.NAME = "CharacterString"; UTCTime = class extends VisibleString { constructor({ value, valueDate, ...parameters } = {}) { super(parameters); this.year = 0; this.month = 0; this.day = 0; this.hour = 0; this.minute = 0; this.second = 0; if (value) { this.fromString(value); this.valueBlock.valueHexView = new Uint8Array(value.length); for (let i = 0; i < value.length; i++) this.valueBlock.valueHexView[i] = value.charCodeAt(i); } if (valueDate) { this.fromDate(valueDate); this.valueBlock.valueHexView = new Uint8Array(this.toBuffer()); } this.idBlock.tagClass = 1; this.idBlock.tagNumber = 23; } fromBuffer(inputBuffer) { this.fromString(String.fromCharCode.apply(null, pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer))); } toBuffer() { const str = this.toString(); const buffer = new ArrayBuffer(str.length); const view = new Uint8Array(buffer); for (let i = 0; i < str.length; i++) view[i] = str.charCodeAt(i); return buffer; } fromDate(inputDate) { this.year = inputDate.getUTCFullYear(); this.month = inputDate.getUTCMonth() + 1; this.day = inputDate.getUTCDate(); this.hour = inputDate.getUTCHours(); this.minute = inputDate.getUTCMinutes(); this.second = inputDate.getUTCSeconds(); } toDate() { return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second)); } fromString(inputString) { const parser = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z/ig; const parserArray = parser.exec(inputString); if (parserArray === null) { this.error = "Wrong input string for conversion"; return; } const year = parseInt(parserArray[1], 10); if (year >= 50) this.year = 1900 + year; else this.year = 2e3 + year; this.month = parseInt(parserArray[2], 10); this.day = parseInt(parserArray[3], 10); this.hour = parseInt(parserArray[4], 10); this.minute = parseInt(parserArray[5], 10); this.second = parseInt(parserArray[6], 10); } toString(encoding = "iso") { if (encoding === "iso") { const outputArray = new Array(7); outputArray[0] = padNumber(this.year < 2e3 ? this.year - 1900 : this.year - 2e3, 2); outputArray[1] = padNumber(this.month, 2); outputArray[2] = padNumber(this.day, 2); outputArray[3] = padNumber(this.hour, 2); outputArray[4] = padNumber(this.minute, 2); outputArray[5] = padNumber(this.second, 2); outputArray[6] = "Z"; return outputArray.join(""); } return super.toString(encoding); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.toDate().toISOString()}`; } toJSON() { return { ...super.toJSON(), year: this.year, month: this.month, day: this.day, hour: this.hour, minute: this.minute, second: this.second }; } }; _a$6 = UTCTime; (() => { typeStore.UTCTime = _a$6; })(); UTCTime.NAME = "UTCTime"; GeneralizedTime = class extends UTCTime { constructor(parameters = {}) { var _b; super(parameters); (_b = this.millisecond) !== null && _b !== void 0 ? _b : this.millisecond = 0; this.idBlock.tagClass = 1; this.idBlock.tagNumber = 24; } fromDate(inputDate) { super.fromDate(inputDate); this.millisecond = inputDate.getUTCMilliseconds(); } toDate() { return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)); } fromString(inputString) { let isUTC = false; let timeString = ""; let dateTimeString = ""; let fractionPart = 0; let parser; let hourDifference = 0; let minuteDifference = 0; if (inputString[inputString.length - 1] === "Z") { timeString = inputString.substring(0, inputString.length - 1); isUTC = true; } else { const number = new Number(inputString[inputString.length - 1]); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); timeString = inputString; } if (isUTC) { if (timeString.indexOf("+") !== -1) throw new Error("Wrong input string for conversion"); if (timeString.indexOf("-") !== -1) throw new Error("Wrong input string for conversion"); } else { let multiplier = 1; let differencePosition = timeString.indexOf("+"); let differenceString = ""; if (differencePosition === -1) { differencePosition = timeString.indexOf("-"); multiplier = -1; } if (differencePosition !== -1) { differenceString = timeString.substring(differencePosition + 1); timeString = timeString.substring(0, differencePosition); if (differenceString.length !== 2 && differenceString.length !== 4) throw new Error("Wrong input string for conversion"); let number = parseInt(differenceString.substring(0, 2), 10); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); hourDifference = multiplier * number; if (differenceString.length === 4) { number = parseInt(differenceString.substring(2, 4), 10); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); minuteDifference = multiplier * number; } } } let fractionPointPosition = timeString.indexOf("."); if (fractionPointPosition === -1) fractionPointPosition = timeString.indexOf(","); if (fractionPointPosition !== -1) { const fractionPartCheck = new Number(`0${timeString.substring(fractionPointPosition)}`); if (isNaN(fractionPartCheck.valueOf())) throw new Error("Wrong input string for conversion"); fractionPart = fractionPartCheck.valueOf(); dateTimeString = timeString.substring(0, fractionPointPosition); } else dateTimeString = timeString; switch (true) { case dateTimeString.length === 8: parser = /(\d{4})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) throw new Error("Wrong input string for conversion"); break; case dateTimeString.length === 10: parser = /(\d{4})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { let fractionResult = 60 * fractionPart; this.minute = Math.floor(fractionResult); fractionResult = 60 * (fractionResult - this.minute); this.second = Math.floor(fractionResult); fractionResult = 1e3 * (fractionResult - this.second); this.millisecond = Math.floor(fractionResult); } break; case dateTimeString.length === 12: parser = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { let fractionResult = 60 * fractionPart; this.second = Math.floor(fractionResult); fractionResult = 1e3 * (fractionResult - this.second); this.millisecond = Math.floor(fractionResult); } break; case dateTimeString.length === 14: parser = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { const fractionResult = 1e3 * fractionPart; this.millisecond = Math.floor(fractionResult); } break; default: throw new Error("Wrong input string for conversion"); } const parserArray = parser.exec(dateTimeString); if (parserArray === null) throw new Error("Wrong input string for conversion"); for (let j = 1; j < parserArray.length; j++) { switch (j) { case 1: this.year = parseInt(parserArray[j], 10); break; case 2: this.month = parseInt(parserArray[j], 10); break; case 3: this.day = parseInt(parserArray[j], 10); break; case 4: this.hour = parseInt(parserArray[j], 10) + hourDifference; break; case 5: this.minute = parseInt(parserArray[j], 10) + minuteDifference; break; case 6: this.second = parseInt(parserArray[j], 10); break; default: throw new Error("Wrong input string for conversion"); } } if (isUTC === false) { const tempDate = new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond); this.year = tempDate.getUTCFullYear(); this.month = tempDate.getUTCMonth(); this.day = tempDate.getUTCDay(); this.hour = tempDate.getUTCHours(); this.minute = tempDate.getUTCMinutes(); this.second = tempDate.getUTCSeconds(); this.millisecond = tempDate.getUTCMilliseconds(); } } toString(encoding = "iso") { if (encoding === "iso") { const outputArray = []; outputArray.push(padNumber(this.year, 4)); outputArray.push(padNumber(this.month, 2)); outputArray.push(padNumber(this.day, 2)); outputArray.push(padNumber(this.hour, 2)); outputArray.push(padNumber(this.minute, 2)); outputArray.push(padNumber(this.second, 2)); if (this.millisecond !== 0) { outputArray.push("."); outputArray.push(padNumber(this.millisecond, 3)); } outputArray.push("Z"); return outputArray.join(""); } return super.toString(encoding); } toJSON() { return { ...super.toJSON(), millisecond: this.millisecond }; } }; _a$5 = GeneralizedTime; (() => { typeStore.GeneralizedTime = _a$5; })(); GeneralizedTime.NAME = "GeneralizedTime"; DATE = class extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 31; } }; _a$4 = DATE; (() => { typeStore.DATE = _a$4; })(); DATE.NAME = "DATE"; TimeOfDay = class extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 32; } }; _a$3 = TimeOfDay; (() => { typeStore.TimeOfDay = _a$3; })(); TimeOfDay.NAME = "TimeOfDay"; DateTime = class extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 33; } }; _a$2 = DateTime; (() => { typeStore.DateTime = _a$2; })(); DateTime.NAME = "DateTime"; Duration = class extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 34; } }; _a$1 = Duration; (() => { typeStore.Duration = _a$1; })(); Duration.NAME = "Duration"; TIME = class extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 14; } }; _a = TIME; (() => { typeStore.TIME = _a; })(); TIME.NAME = "TIME"; Any = class { constructor({ name = EMPTY_STRING, optional = false } = {}) { this.name = name; this.optional = optional; } }; Choice = class extends Any { constructor({ value = [], ...parameters } = {}) { super(parameters); this.value = value; } }; Repeated = class extends Any { constructor({ value = new Any(), local = false, ...parameters } = {}) { super(parameters); this.value = value; this.local = local; } }; RawData = class { constructor({ data = EMPTY_VIEW } = {}) { this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(data); } get data() { return this.dataView.slice().buffer; } set data(value) { this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(value); } fromBER(inputBuffer, inputOffset, inputLength) { const endLength = inputOffset + inputLength; this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer).subarray(inputOffset, endLength); return endLength; } toBER(sizeOnly) { return this.dataView.slice().buffer; } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/enums.js var AsnTypeTypes, AsnPropTypes; var init_enums = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/enums.js"() { (function(AsnTypeTypes2) { AsnTypeTypes2[AsnTypeTypes2["Sequence"] = 0] = "Sequence"; AsnTypeTypes2[AsnTypeTypes2["Set"] = 1] = "Set"; AsnTypeTypes2[AsnTypeTypes2["Choice"] = 2] = "Choice"; })(AsnTypeTypes || (AsnTypeTypes = {})); (function(AsnPropTypes2) { AsnPropTypes2[AsnPropTypes2["Any"] = 1] = "Any"; AsnPropTypes2[AsnPropTypes2["Boolean"] = 2] = "Boolean"; AsnPropTypes2[AsnPropTypes2["OctetString"] = 3] = "OctetString"; AsnPropTypes2[AsnPropTypes2["BitString"] = 4] = "BitString"; AsnPropTypes2[AsnPropTypes2["Integer"] = 5] = "Integer"; AsnPropTypes2[AsnPropTypes2["Enumerated"] = 6] = "Enumerated"; AsnPropTypes2[AsnPropTypes2["ObjectIdentifier"] = 7] = "ObjectIdentifier"; AsnPropTypes2[AsnPropTypes2["Utf8String"] = 8] = "Utf8String"; AsnPropTypes2[AsnPropTypes2["BmpString"] = 9] = "BmpString"; AsnPropTypes2[AsnPropTypes2["UniversalString"] = 10] = "UniversalString"; AsnPropTypes2[AsnPropTypes2["NumericString"] = 11] = "NumericString"; AsnPropTypes2[AsnPropTypes2["PrintableString"] = 12] = "PrintableString"; AsnPropTypes2[AsnPropTypes2["TeletexString"] = 13] = "TeletexString"; AsnPropTypes2[AsnPropTypes2["VideotexString"] = 14] = "VideotexString"; AsnPropTypes2[AsnPropTypes2["IA5String"] = 15] = "IA5String"; AsnPropTypes2[AsnPropTypes2["GraphicString"] = 16] = "GraphicString"; AsnPropTypes2[AsnPropTypes2["VisibleString"] = 17] = "VisibleString"; AsnPropTypes2[AsnPropTypes2["GeneralString"] = 18] = "GeneralString"; AsnPropTypes2[AsnPropTypes2["CharacterString"] = 19] = "CharacterString"; AsnPropTypes2[AsnPropTypes2["UTCTime"] = 20] = "UTCTime"; AsnPropTypes2[AsnPropTypes2["GeneralizedTime"] = 21] = "GeneralizedTime"; AsnPropTypes2[AsnPropTypes2["DATE"] = 22] = "DATE"; AsnPropTypes2[AsnPropTypes2["TimeOfDay"] = 23] = "TimeOfDay"; AsnPropTypes2[AsnPropTypes2["DateTime"] = 24] = "DateTime"; AsnPropTypes2[AsnPropTypes2["Duration"] = 25] = "Duration"; AsnPropTypes2[AsnPropTypes2["TIME"] = 26] = "TIME"; AsnPropTypes2[AsnPropTypes2["Null"] = 27] = "Null"; })(AsnPropTypes || (AsnPropTypes = {})); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js var import_pvtsutils; var init_bit_string = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js"() { init_index_es(); import_pvtsutils = __toESM(require_build()); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js var import_pvtsutils2; var init_octet_string = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js"() { init_index_es(); import_pvtsutils2 = __toESM(require_build()); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js var init_types = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js"() { init_bit_string(); init_octet_string(); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/converters.js function createStringConverter(Asn1Type) { return { fromASN: (value) => value.valueBlock.value, toASN: (value) => new Asn1Type({ value }) }; } function defaultConverter(type3) { switch (type3) { case AsnPropTypes.Any: return AsnAnyConverter; case AsnPropTypes.BitString: return AsnBitStringConverter; case AsnPropTypes.BmpString: return AsnBmpStringConverter; case AsnPropTypes.Boolean: return AsnBooleanConverter; case AsnPropTypes.CharacterString: return AsnCharacterStringConverter; case AsnPropTypes.Enumerated: return AsnEnumeratedConverter; case AsnPropTypes.GeneralString: return AsnGeneralStringConverter; case AsnPropTypes.GeneralizedTime: return AsnGeneralizedTimeConverter; case AsnPropTypes.GraphicString: return AsnGraphicStringConverter; case AsnPropTypes.IA5String: return AsnIA5StringConverter; case AsnPropTypes.Integer: return AsnIntegerConverter; case AsnPropTypes.Null: return AsnNullConverter; case AsnPropTypes.NumericString: return AsnNumericStringConverter; case AsnPropTypes.ObjectIdentifier: return AsnObjectIdentifierConverter; case AsnPropTypes.OctetString: return AsnOctetStringConverter; case AsnPropTypes.PrintableString: return AsnPrintableStringConverter; case AsnPropTypes.TeletexString: return AsnTeletexStringConverter; case AsnPropTypes.UTCTime: return AsnUTCTimeConverter; case AsnPropTypes.UniversalString: return AsnUniversalStringConverter; case AsnPropTypes.Utf8String: return AsnUtf8StringConverter; case AsnPropTypes.VideotexString: return AsnVideotexStringConverter; case AsnPropTypes.VisibleString: return AsnVisibleStringConverter; default: return null; } } var AsnAnyConverter, AsnIntegerConverter, AsnEnumeratedConverter, AsnBitStringConverter, AsnObjectIdentifierConverter, AsnBooleanConverter, AsnOctetStringConverter, AsnUtf8StringConverter, AsnBmpStringConverter, AsnUniversalStringConverter, AsnNumericStringConverter, AsnPrintableStringConverter, AsnTeletexStringConverter, AsnVideotexStringConverter, AsnIA5StringConverter, AsnGraphicStringConverter, AsnVisibleStringConverter, AsnGeneralStringConverter, AsnCharacterStringConverter, AsnUTCTimeConverter, AsnGeneralizedTimeConverter, AsnNullConverter; var init_converters = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/converters.js"() { init_index_es(); init_enums(); init_types(); AsnAnyConverter = { fromASN: (value) => value instanceof Null ? null : value.valueBeforeDecodeView, toASN: (value) => { if (value === null) { return new Null(); } const schema = fromBER(value); if (schema.result.error) { throw new Error(schema.result.error); } return schema.result; } }; AsnIntegerConverter = { fromASN: (value) => value.valueBlock.valueHexView.byteLength >= 4 ? value.valueBlock.toString() : value.valueBlock.valueDec, toASN: (value) => new Integer({ value: +value }) }; AsnEnumeratedConverter = { fromASN: (value) => value.valueBlock.valueDec, toASN: (value) => new Enumerated({ value }) }; AsnBitStringConverter = { fromASN: (value) => value.valueBlock.valueHexView, toASN: (value) => new BitString({ valueHex: value }) }; AsnObjectIdentifierConverter = { fromASN: (value) => value.valueBlock.toString(), toASN: (value) => new ObjectIdentifier({ value }) }; AsnBooleanConverter = { fromASN: (value) => value.valueBlock.value, toASN: (value) => new Boolean2({ value }) }; AsnOctetStringConverter = { fromASN: (value) => value.valueBlock.valueHexView, toASN: (value) => new OctetString({ valueHex: value }) }; AsnUtf8StringConverter = createStringConverter(Utf8String); AsnBmpStringConverter = createStringConverter(BmpString); AsnUniversalStringConverter = createStringConverter(UniversalString); AsnNumericStringConverter = createStringConverter(NumericString); AsnPrintableStringConverter = createStringConverter(PrintableString); AsnTeletexStringConverter = createStringConverter(TeletexString); AsnVideotexStringConverter = createStringConverter(VideotexString); AsnIA5StringConverter = createStringConverter(IA5String); AsnGraphicStringConverter = createStringConverter(GraphicString); AsnVisibleStringConverter = createStringConverter(VisibleString); AsnGeneralStringConverter = createStringConverter(GeneralString); AsnCharacterStringConverter = createStringConverter(CharacterString); AsnUTCTimeConverter = { fromASN: (value) => value.toDate(), toASN: (value) => new UTCTime({ valueDate: value }) }; AsnGeneralizedTimeConverter = { fromASN: (value) => value.toDate(), toASN: (value) => new GeneralizedTime({ valueDate: value }) }; AsnNullConverter = { fromASN: () => null, toASN: () => { return new Null(); } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/helper.js function isConvertible(target) { if (typeof target === "function" && target.prototype) { if (target.prototype.toASN && target.prototype.fromASN) { return true; } else { return isConvertible(target.prototype); } } else { return !!(target && typeof target === "object" && "toASN" in target && "fromASN" in target); } } function isTypeOfArray(target) { var _a2; if (target) { const proto = Object.getPrototypeOf(target); if (((_a2 = proto === null || proto === void 0 ? void 0 : proto.prototype) === null || _a2 === void 0 ? void 0 : _a2.constructor) === Array) { return true; } return isTypeOfArray(proto); } return false; } function isArrayEqual(bytes1, bytes2) { if (!(bytes1 && bytes2)) { return false; } if (bytes1.byteLength !== bytes2.byteLength) { return false; } const b1 = new Uint8Array(bytes1); const b2 = new Uint8Array(bytes2); for (let i = 0; i < bytes1.byteLength; i++) { if (b1[i] !== b2[i]) { return false; } } return true; } var init_helper = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/helper.js"() { } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/schema.js var AsnSchemaStorage; var init_schema = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/schema.js"() { init_index_es(); init_enums(); init_helper(); AsnSchemaStorage = class { constructor() { this.items = /* @__PURE__ */ new WeakMap(); } has(target) { return this.items.has(target); } get(target, checkSchema = false) { const schema = this.items.get(target); if (!schema) { throw new Error(`Cannot get schema for '${target.prototype.constructor.name}' target`); } if (checkSchema && !schema.schema) { throw new Error(`Schema '${target.prototype.constructor.name}' doesn't contain ASN.1 schema. Call 'AsnSchemaStorage.cache'.`); } return schema; } cache(target) { const schema = this.get(target); if (!schema.schema) { schema.schema = this.create(target, true); } } createDefault(target) { const schema = { type: AsnTypeTypes.Sequence, items: {} }; const parentSchema = this.findParentSchema(target); if (parentSchema) { Object.assign(schema, parentSchema); schema.items = Object.assign({}, schema.items, parentSchema.items); } return schema; } create(target, useNames) { const schema = this.items.get(target) || this.createDefault(target); const asn1Value = []; for (const key in schema.items) { const item = schema.items[key]; const name = useNames ? key : ""; let asn1Item; if (typeof item.type === "number") { const Asn1TypeName = AsnPropTypes[item.type]; const Asn1Type = index_es_exports[Asn1TypeName]; if (!Asn1Type) { throw new Error(`Cannot get ASN1 class by name '${Asn1TypeName}'`); } asn1Item = new Asn1Type({ name }); } else if (isConvertible(item.type)) { const instance = new item.type(); asn1Item = instance.toSchema(name); } else if (item.optional) { const itemSchema = this.get(item.type); if (itemSchema.type === AsnTypeTypes.Choice) { asn1Item = new Any({ name }); } else { asn1Item = this.create(item.type, false); asn1Item.name = name; } } else { asn1Item = new Any({ name }); } const optional = !!item.optional || item.defaultValue !== void 0; if (item.repeated) { asn1Item.name = ""; const Container = item.repeated === "set" ? Set2 : Sequence; asn1Item = new Container({ name: "", value: [ new Repeated({ name, value: asn1Item }) ] }); } if (item.context !== null && item.context !== void 0) { if (item.implicit) { if (typeof item.type === "number" || isConvertible(item.type)) { const Container = item.repeated ? Constructed : Primitive; asn1Value.push(new Container({ name, optional, idBlock: { tagClass: 3, tagNumber: item.context } })); } else { this.cache(item.type); const isRepeated = !!item.repeated; let value = !isRepeated ? this.get(item.type, true).schema : asn1Item; value = "valueBlock" in value ? value.valueBlock.value : value.value; asn1Value.push(new Constructed({ name: !isRepeated ? name : "", optional, idBlock: { tagClass: 3, tagNumber: item.context }, value })); } } else { asn1Value.push(new Constructed({ optional, idBlock: { tagClass: 3, tagNumber: item.context }, value: [asn1Item] })); } } else { asn1Item.optional = optional; asn1Value.push(asn1Item); } } switch (schema.type) { case AsnTypeTypes.Sequence: return new Sequence({ value: asn1Value, name: "" }); case AsnTypeTypes.Set: return new Set2({ value: asn1Value, name: "" }); case AsnTypeTypes.Choice: return new Choice({ value: asn1Value, name: "" }); default: throw new Error(`Unsupported ASN1 type in use`); } } set(target, schema) { this.items.set(target, schema); return this; } findParentSchema(target) { const parent = Object.getPrototypeOf(target); if (parent) { const schema = this.items.get(parent); return schema || this.findParentSchema(parent); } return null; } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/storage.js var schemaStorage; var init_storage = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/storage.js"() { init_schema(); schemaStorage = new AsnSchemaStorage(); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js var AsnType, AsnProp; var init_decorators = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js"() { init_converters(); init_enums(); init_storage(); AsnType = (options2) => (target) => { let schema; if (!schemaStorage.has(target)) { schema = schemaStorage.createDefault(target); schemaStorage.set(target, schema); } else { schema = schemaStorage.get(target); } Object.assign(schema, options2); }; AsnProp = (options2) => (target, propertyKey) => { let schema; if (!schemaStorage.has(target.constructor)) { schema = schemaStorage.createDefault(target.constructor); schemaStorage.set(target.constructor, schema); } else { schema = schemaStorage.get(target.constructor); } const copyOptions = Object.assign({}, options2); if (typeof copyOptions.type === "number" && !copyOptions.converter) { const defaultConverter2 = defaultConverter(options2.type); if (!defaultConverter2) { throw new Error(`Cannot get default converter for property '${propertyKey}' of ${target.constructor.name}`); } copyOptions.converter = defaultConverter2; } schema.items[propertyKey] = copyOptions; }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js var AsnSchemaValidationError; var init_schema_validation = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js"() { AsnSchemaValidationError = class extends Error { constructor() { super(...arguments); this.schemas = []; } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js var init_errors = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js"() { init_schema_validation(); } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/parser.js var AsnParser; var init_parser = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/parser.js"() { init_index_es(); init_enums(); init_converters(); init_errors(); init_helper(); init_storage(); AsnParser = class { static parse(data, target) { const asn1Parsed = fromBER(data); if (asn1Parsed.result.error) { throw new Error(asn1Parsed.result.error); } const res = this.fromASN(asn1Parsed.result, target); return res; } static fromASN(asn1Schema, target) { var _a2; try { if (isConvertible(target)) { const value = new target(); return value.fromASN(asn1Schema); } const schema = schemaStorage.get(target); schemaStorage.cache(target); let targetSchema = schema.schema; if (asn1Schema.constructor === Constructed && schema.type !== AsnTypeTypes.Choice) { targetSchema = new Constructed({ idBlock: { tagClass: 3, tagNumber: asn1Schema.idBlock.tagNumber }, value: schema.schema.valueBlock.value }); for (const key in schema.items) { delete asn1Schema[key]; } } const asn1ComparedSchema = compareSchema({}, asn1Schema, targetSchema); if (!asn1ComparedSchema.verified) { throw new AsnSchemaValidationError(`Data does not match to ${target.name} ASN1 schema. ${asn1ComparedSchema.result.error}`); } const res = new target(); if (isTypeOfArray(target)) { if (!("value" in asn1Schema.valueBlock && Array.isArray(asn1Schema.valueBlock.value))) { throw new Error(`Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed.`); } const itemType = schema.itemType; if (typeof itemType === "number") { const converter = defaultConverter(itemType); if (!converter) { throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`); } return target.from(asn1Schema.valueBlock.value, (element) => converter.fromASN(element)); } else { return target.from(asn1Schema.valueBlock.value, (element) => this.fromASN(element, itemType)); } } for (const key in schema.items) { const asn1SchemaValue = asn1ComparedSchema.result[key]; if (!asn1SchemaValue) { continue; } const schemaItem = schema.items[key]; const schemaItemType = schemaItem.type; if (typeof schemaItemType === "number" || isConvertible(schemaItemType)) { const converter = (_a2 = schemaItem.converter) !== null && _a2 !== void 0 ? _a2 : isConvertible(schemaItemType) ? new schemaItemType() : null; if (!converter) { throw new Error("Converter is empty"); } if (schemaItem.repeated) { if (schemaItem.implicit) { const Container = schemaItem.repeated === "sequence" ? Sequence : Set2; const newItem = new Container(); newItem.valueBlock = asn1SchemaValue.valueBlock; const newItemAsn = fromBER(newItem.toBER(false)); if (newItemAsn.offset === -1) { throw new Error(`Cannot parse the child item. ${newItemAsn.result.error}`); } if (!("value" in newItemAsn.result.valueBlock && Array.isArray(newItemAsn.result.valueBlock.value))) { throw new Error("Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed."); } const value = newItemAsn.result.valueBlock.value; res[key] = Array.from(value, (element) => converter.fromASN(element)); } else { res[key] = Array.from(asn1SchemaValue, (element) => converter.fromASN(element)); } } else { let value = asn1SchemaValue; if (schemaItem.implicit) { let newItem; if (isConvertible(schemaItemType)) { newItem = new schemaItemType().toSchema(""); } else { const Asn1TypeName = AsnPropTypes[schemaItemType]; const Asn1Type = index_es_exports[Asn1TypeName]; if (!Asn1Type) { throw new Error(`Cannot get '${Asn1TypeName}' class from asn1js module`); } newItem = new Asn1Type(); } newItem.valueBlock = value.valueBlock; value = fromBER(newItem.toBER(false)).result; } res[key] = converter.fromASN(value); } } else { if (schemaItem.repeated) { if (!Array.isArray(asn1SchemaValue)) { throw new Error("Cannot get list of items from the ASN.1 parsed value. ASN.1 value should be iterable."); } res[key] = Array.from(asn1SchemaValue, (element) => this.fromASN(element, schemaItemType)); } else { res[key] = this.fromASN(asn1SchemaValue, schemaItemType); } } } return res; } catch (error) { if (error instanceof AsnSchemaValidationError) { error.schemas.push(target.name); } throw error; } } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js var AsnSerializer; var init_serializer = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js"() { init_index_es(); init_converters(); init_enums(); init_helper(); init_storage(); AsnSerializer = class _AsnSerializer { static serialize(obj) { if (obj instanceof BaseBlock) { return obj.toBER(false); } return this.toASN(obj).toBER(false); } static toASN(obj) { if (obj && typeof obj === "object" && isConvertible(obj)) { return obj.toASN(); } if (!(obj && typeof obj === "object")) { throw new TypeError("Parameter 1 should be type of Object."); } const target = obj.constructor; const schema = schemaStorage.get(target); schemaStorage.cache(target); let asn1Value = []; if (schema.itemType) { if (!Array.isArray(obj)) { throw new TypeError("Parameter 1 should be type of Array."); } if (typeof schema.itemType === "number") { const converter = defaultConverter(schema.itemType); if (!converter) { throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`); } asn1Value = obj.map((o) => converter.toASN(o)); } else { asn1Value = obj.map((o) => this.toAsnItem({ type: schema.itemType }, "[]", target, o)); } } else { for (const key in schema.items) { const schemaItem = schema.items[key]; const objProp = obj[key]; if (objProp === void 0 || schemaItem.defaultValue === objProp || typeof schemaItem.defaultValue === "object" && typeof objProp === "object" && isArrayEqual(this.serialize(schemaItem.defaultValue), this.serialize(objProp))) { continue; } const asn1Item = _AsnSerializer.toAsnItem(schemaItem, key, target, objProp); if (typeof schemaItem.context === "number") { if (schemaItem.implicit) { if (!schemaItem.repeated && (typeof schemaItem.type === "number" || isConvertible(schemaItem.type))) { const value = {}; value.valueHex = asn1Item instanceof Null ? asn1Item.valueBeforeDecodeView : asn1Item.valueBlock.toBER(); asn1Value.push(new Primitive({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context }, ...value })); } else { asn1Value.push(new Constructed({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context }, value: asn1Item.valueBlock.value })); } } else { asn1Value.push(new Constructed({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context }, value: [asn1Item] })); } } else if (schemaItem.repeated) { asn1Value = asn1Value.concat(asn1Item); } else { asn1Value.push(asn1Item); } } } let asnSchema; switch (schema.type) { case AsnTypeTypes.Sequence: asnSchema = new Sequence({ value: asn1Value }); break; case AsnTypeTypes.Set: asnSchema = new Set2({ value: asn1Value }); break; case AsnTypeTypes.Choice: if (!asn1Value[0]) { throw new Error(`Schema '${target.name}' has wrong data. Choice cannot be empty.`); } asnSchema = asn1Value[0]; break; } return asnSchema; } static toAsnItem(schemaItem, key, target, objProp) { let asn1Item; if (typeof schemaItem.type === "number") { const converter = schemaItem.converter; if (!converter) { throw new Error(`Property '${key}' doesn't have converter for type ${AsnPropTypes[schemaItem.type]} in schema '${target.name}'`); } if (schemaItem.repeated) { if (!Array.isArray(objProp)) { throw new TypeError("Parameter 'objProp' should be type of Array."); } const items = Array.from(objProp, (element) => converter.toASN(element)); const Container = schemaItem.repeated === "sequence" ? Sequence : Set2; asn1Item = new Container({ value: items }); } else { asn1Item = converter.toASN(objProp); } } else { if (schemaItem.repeated) { if (!Array.isArray(objProp)) { throw new TypeError("Parameter 'objProp' should be type of Array."); } const items = Array.from(objProp, (element) => this.toASN(element)); const Container = schemaItem.repeated === "sequence" ? Sequence : Set2; asn1Item = new Container({ value: items }); } else { asn1Item = this.toASN(objProp); } } return asn1Item; } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/objects.js var init_objects = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/objects.js"() { } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/convert.js var import_pvtsutils3, AsnConvert; var init_convert = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/convert.js"() { init_index_es(); import_pvtsutils3 = __toESM(require_build()); init_parser(); init_serializer(); AsnConvert = class _AsnConvert { static serialize(obj) { return AsnSerializer.serialize(obj); } static parse(data, target) { return AsnParser.parse(data, target); } static toString(data) { const buf = import_pvtsutils3.BufferSourceConverter.isBufferSource(data) ? import_pvtsutils3.BufferSourceConverter.toArrayBuffer(data) : _AsnConvert.serialize(data); const asn = fromBER(buf); if (asn.offset === -1) { throw new Error(`Cannot decode ASN.1 data. ${asn.result.error}`); } return asn.result.toString(); } }; } }); // node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/index.js var init_es2015 = __esm({ "node_modules/.pnpm/@peculiar+asn1-schema@2.3.15/node_modules/@peculiar/asn1-schema/build/es2015/index.js"() { init_converters(); init_types(); init_decorators(); init_enums(); init_parser(); init_serializer(); init_errors(); init_objects(); init_convert(); } }); // node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } var init_tslib_es6 = __esm({ "node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs"() { } }); // node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js function checkType(value, type3) { switch (type3) { case JsonPropTypes.Boolean: return typeof value === "boolean"; case JsonPropTypes.Number: return typeof value === "number"; case JsonPropTypes.String: return typeof value === "string"; } return true; } function throwIfTypeIsWrong(value, type3) { if (!checkType(value, type3)) { throw new TypeError(`Value must be ${JsonPropTypes[type3]}`); } } function isConvertible2(target) { if (target && target.prototype) { if (target.prototype.toJSON && target.prototype.fromJSON) { return true; } else { return isConvertible2(target.prototype); } } else { return !!(target && target.toJSON && target.fromJSON); } } function getValidations(item) { const validations = []; if (item.pattern) { validations.push(new PatternValidation(item.pattern)); } if (item.type === JsonPropTypes.Number || item.type === JsonPropTypes.Any) { if (item.minInclusive !== void 0 || item.maxInclusive !== void 0) { validations.push(new InclusiveValidation(item.minInclusive, item.maxInclusive)); } if (item.minExclusive !== void 0 || item.maxExclusive !== void 0) { validations.push(new ExclusiveValidation(item.minExclusive, item.maxExclusive)); } if (item.enumeration !== void 0) { validations.push(new EnumerationValidation(item.enumeration)); } } if (item.type === JsonPropTypes.String || item.repeated || item.type === JsonPropTypes.Any) { if (item.length !== void 0 || item.minLength !== void 0 || item.maxLength !== void 0) { validations.push(new LengthValidation(item.length, item.minLength, item.maxLength)); } } return validations; } var JsonError, TransformError, ParserError, ValidationError, SerializerError, KeyError, JsonPropTypes, JsonSchemaStorage, DEFAULT_SCHEMA, schemaStorage2, PatternValidation, InclusiveValidation, ExclusiveValidation, LengthValidation, EnumerationValidation, JsonTransform, JsonSerializer, JsonParser, JsonProp; var init_index_es2 = __esm({ "node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js"() { JsonError = class extends Error { constructor(message, innerError) { super(innerError ? `${message}. See the inner exception for more details.` : message); this.message = message; this.innerError = innerError; } }; TransformError = class extends JsonError { constructor(schema, message, innerError) { super(message, innerError); this.schema = schema; } }; ParserError = class extends TransformError { constructor(schema, message, innerError) { super(schema, `JSON doesn't match to '${schema.target.name}' schema. ${message}`, innerError); } }; ValidationError = class extends JsonError { }; SerializerError = class extends JsonError { constructor(schemaName, message, innerError) { super(`Cannot serialize by '${schemaName}' schema. ${message}`, innerError); this.schemaName = schemaName; } }; KeyError = class extends ParserError { constructor(schema, keys, errors = {}) { super(schema, "Some keys doesn't match to schema"); this.keys = keys; this.errors = errors; } }; (function(JsonPropTypes2) { JsonPropTypes2[JsonPropTypes2["Any"] = 0] = "Any"; JsonPropTypes2[JsonPropTypes2["Boolean"] = 1] = "Boolean"; JsonPropTypes2[JsonPropTypes2["Number"] = 2] = "Number"; JsonPropTypes2[JsonPropTypes2["String"] = 3] = "String"; })(JsonPropTypes || (JsonPropTypes = {})); JsonSchemaStorage = class { constructor() { this.items = /* @__PURE__ */ new Map(); } has(target) { return this.items.has(target) || !!this.findParentSchema(target); } get(target) { const schema = this.items.get(target) || this.findParentSchema(target); if (!schema) { throw new Error("Cannot get schema for current target"); } return schema; } create(target) { const schema = { names: {} }; const parentSchema = this.findParentSchema(target); if (parentSchema) { Object.assign(schema, parentSchema); schema.names = {}; for (const name in parentSchema.names) { schema.names[name] = Object.assign({}, parentSchema.names[name]); } } schema.target = target; return schema; } set(target, schema) { this.items.set(target, schema); return this; } findParentSchema(target) { const parent = target.__proto__; if (parent) { const schema = this.items.get(parent); return schema || this.findParentSchema(parent); } return null; } }; DEFAULT_SCHEMA = "default"; schemaStorage2 = new JsonSchemaStorage(); PatternValidation = class { constructor(pattern) { this.pattern = new RegExp(pattern); } validate(value) { const pattern = new RegExp(this.pattern.source, this.pattern.flags); if (typeof value !== "string") { throw new ValidationError("Incoming value must be string"); } if (!pattern.exec(value)) { throw new ValidationError(`Value doesn't match to pattern '${pattern.toString()}'`); } } }; InclusiveValidation = class { constructor(min3 = Number.MIN_VALUE, max3 = Number.MAX_VALUE) { this.min = min3; this.max = max3; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.Number); if (!(this.min <= value && value <= this.max)) { const min3 = this.min === Number.MIN_VALUE ? "MIN" : this.min; const max3 = this.max === Number.MAX_VALUE ? "MAX" : this.max; throw new ValidationError(`Value doesn't match to diapason [${min3},${max3}]`); } } }; ExclusiveValidation = class { constructor(min3 = Number.MIN_VALUE, max3 = Number.MAX_VALUE) { this.min = min3; this.max = max3; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.Number); if (!(this.min < value && value < this.max)) { const min3 = this.min === Number.MIN_VALUE ? "MIN" : this.min; const max3 = this.max === Number.MAX_VALUE ? "MAX" : this.max; throw new ValidationError(`Value doesn't match to diapason (${min3},${max3})`); } } }; LengthValidation = class { constructor(length, minLength, maxLength) { this.length = length; this.minLength = minLength; this.maxLength = maxLength; } validate(value) { if (this.length !== void 0) { if (value.length !== this.length) { throw new ValidationError(`Value length must be exactly ${this.length}.`); } return; } if (this.minLength !== void 0) { if (value.length < this.minLength) { throw new ValidationError(`Value length must be more than ${this.minLength}.`); } } if (this.maxLength !== void 0) { if (value.length > this.maxLength) { throw new ValidationError(`Value length must be less than ${this.maxLength}.`); } } } }; EnumerationValidation = class { constructor(enumeration) { this.enumeration = enumeration; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.String); if (!this.enumeration.includes(value)) { throw new ValidationError(`Value must be one of ${this.enumeration.map((v) => `'${v}'`).join(", ")}`); } } }; JsonTransform = class { static checkValues(data, schemaItem) { const values = Array.isArray(data) ? data : [data]; for (const value of values) { for (const validation of schemaItem.validations) { if (validation instanceof LengthValidation && schemaItem.repeated) { validation.validate(data); } else { validation.validate(value); } } } } static checkTypes(value, schemaItem) { if (schemaItem.repeated && !Array.isArray(value)) { throw new TypeError("Value must be Array"); } if (typeof schemaItem.type === "number") { const values = Array.isArray(value) ? value : [value]; for (const v of values) { throwIfTypeIsWrong(v, schemaItem.type); } } } static getSchemaByName(schema, name = DEFAULT_SCHEMA) { return { ...schema.names[DEFAULT_SCHEMA], ...schema.names[name] }; } }; JsonSerializer = class extends JsonTransform { static serialize(obj, options2, replacer, space) { const json = this.toJSON(obj, options2); return JSON.stringify(json, replacer, space); } static toJSON(obj, options2 = {}) { let res; let targetSchema = options2.targetSchema; const schemaName = options2.schemaName || DEFAULT_SCHEMA; if (isConvertible2(obj)) { return obj.toJSON(); } if (Array.isArray(obj)) { res = []; for (const item of obj) { res.push(this.toJSON(item, options2)); } } else if (typeof obj === "object") { if (targetSchema && !schemaStorage2.has(targetSchema)) { throw new JsonError("Cannot get schema for `targetSchema` param"); } targetSchema = targetSchema || obj.constructor; if (schemaStorage2.has(targetSchema)) { const schema = schemaStorage2.get(targetSchema); res = {}; const namedSchema = this.getSchemaByName(schema, schemaName); for (const key in namedSchema) { try { const item = namedSchema[key]; const objItem = obj[key]; let value; if (item.optional && objItem === void 0 || item.defaultValue !== void 0 && objItem === item.defaultValue) { continue; } if (!item.optional && objItem === void 0) { throw new SerializerError(targetSchema.name, `Property '${key}' is required.`); } if (typeof item.type === "number") { if (item.converter) { if (item.repeated) { value = objItem.map((el) => item.converter.toJSON(el, obj)); } else { value = item.converter.toJSON(objItem, obj); } } else { value = objItem; } } else { if (item.repeated) { value = objItem.map((el) => this.toJSON(el, { schemaName })); } else { value = this.toJSON(objItem, { schemaName }); } } this.checkTypes(value, item); this.checkValues(value, item); res[item.name || key] = value; } catch (e) { if (e instanceof SerializerError) { throw e; } else { throw new SerializerError(schema.target.name, `Property '${key}' is wrong. ${e.message}`, e); } } } } else { res = {}; for (const key in obj) { res[key] = this.toJSON(obj[key], { schemaName }); } } } else { res = obj; } return res; } }; JsonParser = class _JsonParser extends JsonTransform { static parse(data, options2) { const obj = JSON.parse(data); return this.fromJSON(obj, options2); } static fromJSON(target, options2) { const targetSchema = options2.targetSchema; const schemaName = options2.schemaName || DEFAULT_SCHEMA; const obj = new targetSchema(); if (isConvertible2(obj)) { return obj.fromJSON(target); } const schema = schemaStorage2.get(targetSchema); const namedSchema = this.getSchemaByName(schema, schemaName); const keyErrors = {}; if (options2.strictProperty && !Array.isArray(target)) { _JsonParser.checkStrictProperty(target, namedSchema, schema); } for (const key in namedSchema) { try { const item = namedSchema[key]; const name = item.name || key; const value = target[name]; if (value === void 0 && (item.optional || item.defaultValue !== void 0)) { continue; } if (!item.optional && value === void 0) { throw new ParserError(schema, `Property '${name}' is required.`); } this.checkTypes(value, item); this.checkValues(value, item); if (typeof item.type === "number") { if (item.converter) { if (item.repeated) { obj[key] = value.map((el) => item.converter.fromJSON(el, obj)); } else { obj[key] = item.converter.fromJSON(value, obj); } } else { obj[key] = value; } } else { const newOptions = { ...options2, targetSchema: item.type, schemaName }; if (item.repeated) { obj[key] = value.map((el) => this.fromJSON(el, newOptions)); } else { obj[key] = this.fromJSON(value, newOptions); } } } catch (e) { if (!(e instanceof ParserError)) { e = new ParserError(schema, `Property '${key}' is wrong. ${e.message}`, e); } if (options2.strictAllKeys) { keyErrors[key] = e; } else { throw e; } } } const keys = Object.keys(keyErrors); if (keys.length) { throw new KeyError(schema, keys, keyErrors); } return obj; } static checkStrictProperty(target, namedSchema, schema) { const jsonProps = Object.keys(target); const schemaProps = Object.keys(namedSchema); const keys = []; for (const key of jsonProps) { if (schemaProps.indexOf(key) === -1) { keys.push(key); } } if (keys.length) { throw new KeyError(schema, keys); } } }; JsonProp = (options2 = {}) => (target, propertyKey) => { const errorMessage = `Cannot set type for ${propertyKey} property of ${target.constructor.name} schema`; let schema; if (!schemaStorage2.has(target.constructor)) { schema = schemaStorage2.create(target.constructor); schemaStorage2.set(target.constructor, schema); } else { schema = schemaStorage2.get(target.constructor); if (schema.target !== target.constructor) { schema = schemaStorage2.create(target.constructor); schemaStorage2.set(target.constructor, schema); } } const defaultSchema = { type: JsonPropTypes.Any, validations: [] }; const copyOptions = Object.assign(defaultSchema, options2); copyOptions.validations = getValidations(copyOptions); if (typeof copyOptions.type !== "number") { if (!schemaStorage2.has(copyOptions.type) && !isConvertible2(copyOptions.type)) { throw new Error(`${errorMessage}. Assigning type doesn't have schema.`); } } let schemaNames; if (Array.isArray(options2.schema)) { schemaNames = options2.schema; } else { schemaNames = [options2.schema || DEFAULT_SCHEMA]; } for (const schemaName of schemaNames) { if (!schema.names[schemaName]) { schema.names[schemaName] = {}; } const namedSchema = schema.names[schemaName]; namedSchema[propertyKey] = copyOptions; } }; } }); // node_modules/.pnpm/webcrypto-core@1.8.1/node_modules/webcrypto-core/build/webcrypto-core.es.js function isJWK(data) { return typeof data === "object" && "kty" in data; } var import_pvtsutils4, import_pvtsutils5, CryptoError, AlgorithmError, UnsupportedOperationError, OperationError, RequiredPropertyError, PemConverter, ProviderCrypto, AesProvider, AesCbcProvider, AesCmacProvider, AesCtrProvider, AesEcbProvider, AesGcmProvider, AesKwProvider, DesProvider, RsaProvider, RsaSsaProvider, RsaPssProvider, RsaOaepProvider, EllipticProvider, EcdsaProvider, KEY_TYPES, CryptoKey, EcdhProvider, EcdhEsProvider, EdDsaProvider, ObjectIdentifier2, AlgorithmIdentifier, PrivateKeyInfo, PublicKeyInfo, JsonBase64UrlArrayBufferConverter, AsnIntegerArrayBufferConverter, RsaPrivateKey, RsaPublicKey, EcPublicKey, EcPrivateKey, AsnIntegerWithoutPaddingConverter, index$2, EcUtils, EcDsaSignature, OneAsymmetricKey, EdPrivateKey, EdPublicKey, CurvePrivateKey, idSecp256r1, idEllipticCurve, idSecp384r1, idSecp521r1, idSecp256k1, idVersionOne, idBrainpoolP160r1, idBrainpoolP160t1, idBrainpoolP192r1, idBrainpoolP192t1, idBrainpoolP224r1, idBrainpoolP224t1, idBrainpoolP256r1, idBrainpoolP256t1, idBrainpoolP320r1, idBrainpoolP320t1, idBrainpoolP384r1, idBrainpoolP384t1, idBrainpoolP512r1, idBrainpoolP512t1, idX25519, idX448, idEd25519, idEd448, index$1, EcCurves, X25519Provider, Ed25519Provider, HmacProvider, Pbkdf2Provider, HkdfProvider, ShakeProvider, Shake128Provider, Shake256Provider, Crypto, ProviderStorage, keyFormatMap, sourceBufferKeyFormats, SubtleCrypto; var init_webcrypto_core_es = __esm({ "node_modules/.pnpm/webcrypto-core@1.8.1/node_modules/webcrypto-core/build/webcrypto-core.es.js"() { import_pvtsutils4 = __toESM(require_build()); import_pvtsutils5 = __toESM(require_build()); init_es2015(); init_tslib_es6(); init_index_es2(); init_index_es(); CryptoError = class extends Error { }; AlgorithmError = class extends CryptoError { }; UnsupportedOperationError = class extends CryptoError { constructor(methodName) { super(`Unsupported operation: ${methodName ? `${methodName}` : ""}`); } }; OperationError = class extends CryptoError { }; RequiredPropertyError = class extends CryptoError { constructor(propName) { super(`${propName}: Missing required property`); } }; PemConverter = class { static toArrayBuffer(pem) { const base64 = pem.replace(/-{5}(BEGIN|END) .*-{5}/g, "").replace("\r", "").replace("\n", ""); return import_pvtsutils4.Convert.FromBase64(base64); } static toUint8Array(pem) { const bytes = this.toArrayBuffer(pem); return new Uint8Array(bytes); } static fromBufferSource(buffer, tag) { const base64 = import_pvtsutils4.Convert.ToBase64(buffer); let sliced; let offset4 = 0; const rows = []; while (offset4 < base64.length) { sliced = base64.slice(offset4, offset4 + 64); if (sliced.length) { rows.push(sliced); } else { break; } offset4 += 64; } const upperCaseTag = tag.toUpperCase(); return `-----BEGIN ${upperCaseTag}----- ${rows.join("\n")} -----END ${upperCaseTag}-----`; } static isPEM(data) { return /-----BEGIN .+-----[A-Za-z0-9+/+=\s\n]+-----END .+-----/i.test(data); } static getTagName(pem) { if (!this.isPEM(pem)) { throw new Error("Bad parameter. Incoming data is not right PEM"); } const res = /-----BEGIN (.+)-----/.exec(pem); if (!res) { throw new Error("Cannot get tag from PEM"); } return res[1]; } static hasTagName(pem, tagName) { const tag = this.getTagName(pem); return tagName.toLowerCase() === tag.toLowerCase(); } static isCertificate(pem) { return this.hasTagName(pem, "certificate"); } static isCertificateRequest(pem) { return this.hasTagName(pem, "certificate request"); } static isCRL(pem) { return this.hasTagName(pem, "x509 crl"); } static isPublicKey(pem) { return this.hasTagName(pem, "public key"); } }; ProviderCrypto = class { async digest(...args) { this.checkDigest.apply(this, args); return this.onDigest.apply(this, args); } checkDigest(algorithm, _data) { this.checkAlgorithmName(algorithm); } async onDigest(_algorithm, _data) { throw new UnsupportedOperationError("digest"); } async generateKey(...args) { this.checkGenerateKey.apply(this, args); return this.onGenerateKey.apply(this, args); } checkGenerateKey(algorithm, _extractable, keyUsages, ..._args) { this.checkAlgorithmName(algorithm); this.checkGenerateKeyParams(algorithm); if (!(keyUsages && keyUsages.length)) { throw new TypeError(`Usages cannot be empty when creating a key.`); } let allowedUsages; if (Array.isArray(this.usages)) { allowedUsages = this.usages; } else { allowedUsages = this.usages.privateKey.concat(this.usages.publicKey); } this.checkKeyUsages(keyUsages, allowedUsages); } checkGenerateKeyParams(_algorithm) { } async onGenerateKey(_algorithm, _extractable, _keyUsages, ..._args) { throw new UnsupportedOperationError("generateKey"); } async sign(...args) { this.checkSign.apply(this, args); return this.onSign.apply(this, args); } checkSign(algorithm, key, _data, ..._args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, "sign"); } async onSign(_algorithm, _key, _data, ..._args) { throw new UnsupportedOperationError("sign"); } async verify(...args) { this.checkVerify.apply(this, args); return this.onVerify.apply(this, args); } checkVerify(algorithm, key, _signature, _data, ..._args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, "verify"); } async onVerify(_algorithm, _key, _signature, _data, ..._args) { throw new UnsupportedOperationError("verify"); } async encrypt(...args) { this.checkEncrypt.apply(this, args); return this.onEncrypt.apply(this, args); } checkEncrypt(algorithm, key, _data, options2 = {}, ..._args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, options2.keyUsage ? "encrypt" : void 0); } async onEncrypt(_algorithm, _key, _data, ..._args) { throw new UnsupportedOperationError("encrypt"); } async decrypt(...args) { this.checkDecrypt.apply(this, args); return this.onDecrypt.apply(this, args); } checkDecrypt(algorithm, key, _data, options2 = {}, ..._args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, options2.keyUsage ? "decrypt" : void 0); } async onDecrypt(_algorithm, _key, _data, ..._args) { throw new UnsupportedOperationError("decrypt"); } async deriveBits(...args) { this.checkDeriveBits.apply(this, args); return this.onDeriveBits.apply(this, args); } checkDeriveBits(algorithm, baseKey, length, options2 = {}, ..._args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(baseKey, options2.keyUsage ? "deriveBits" : void 0); if (length % 8 !== 0) { throw new OperationError("length: Is not multiple of 8"); } } async onDeriveBits(_algorithm, _baseKey, _length, ..._args) { throw new UnsupportedOperationError("deriveBits"); } async exportKey(...args) { this.checkExportKey.apply(this, args); return this.onExportKey.apply(this, args); } checkExportKey(format2, key, ..._args) { this.checkKeyFormat(format2); this.checkCryptoKey(key); if (!key.extractable) { throw new CryptoError("key: Is not extractable"); } } async onExportKey(_format, _key, ..._args) { throw new UnsupportedOperationError("exportKey"); } async importKey(...args) { this.checkImportKey.apply(this, args); return this.onImportKey.apply(this, args); } checkImportKey(format2, keyData, algorithm, _extractable, keyUsages, ..._args) { this.checkKeyFormat(format2); this.checkKeyData(format2, keyData); this.checkAlgorithmName(algorithm); this.checkImportParams(algorithm); if (Array.isArray(this.usages)) { this.checkKeyUsages(keyUsages, this.usages); } } async onImportKey(_format, _keyData, _algorithm, _extractable, _keyUsages, ..._args) { throw new UnsupportedOperationError("importKey"); } checkAlgorithmName(algorithm) { if (algorithm.name.toLowerCase() !== this.name.toLowerCase()) { throw new AlgorithmError("Unrecognized name"); } } checkAlgorithmParams(_algorithm) { } checkDerivedKeyParams(_algorithm) { } checkKeyUsages(usages, allowed) { for (const usage of usages) { if (allowed.indexOf(usage) === -1) { throw new TypeError("Cannot create a key using the specified key usages"); } } } checkCryptoKey(key, keyUsage) { this.checkAlgorithmName(key.algorithm); if (keyUsage && key.usages.indexOf(keyUsage) === -1) { throw new CryptoError(`key does not match that of operation`); } } checkRequiredProperty(data, propName) { if (!(propName in data)) { throw new RequiredPropertyError(propName); } } checkHashAlgorithm(algorithm, hashAlgorithms) { for (const item of hashAlgorithms) { if (item.toLowerCase() === algorithm.name.toLowerCase()) { return; } } throw new OperationError(`hash: Must be one of ${hashAlgorithms.join(", ")}`); } checkImportParams(_algorithm) { } checkKeyFormat(format2) { switch (format2) { case "raw": case "pkcs8": case "spki": case "jwk": break; default: throw new TypeError("format: Is invalid value. Must be 'jwk', 'raw', 'spki', or 'pkcs8'"); } } checkKeyData(format2, keyData) { if (!keyData) { throw new TypeError("keyData: Cannot be empty on empty on key importing"); } if (format2 === "jwk") { if (!isJWK(keyData)) { throw new TypeError("keyData: Is not JsonWebToken"); } } else if (!import_pvtsutils4.BufferSourceConverter.isBufferSource(keyData)) { throw new TypeError("keyData: Is not ArrayBufferView or ArrayBuffer"); } } prepareData(data) { return import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); } }; AesProvider = class extends ProviderCrypto { checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not of type Number"); } switch (algorithm.length) { case 128: case 192: case 256: break; default: throw new TypeError("length: Must be 128, 192, or 256"); } } checkDerivedKeyParams(algorithm) { this.checkGenerateKeyParams(algorithm); } }; AesCbcProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-CBC"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength !== 16) { throw new TypeError("iv: Must have length 16 bytes"); } } }; AesCmacProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-CMAC"; this.usages = ["sign", "verify"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new OperationError("length: Must be more than 0"); } } }; AesCtrProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-CTR"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "counter"); if (!(algorithm.counter instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.counter))) { throw new TypeError("counter: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.counter.byteLength !== 16) { throw new TypeError("iv: Must have length 16 bytes"); } this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new OperationError("length: Must be more than 0"); } } }; AesEcbProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-ECB"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } }; AesGcmProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-GCM"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { var _a2; this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength < 1) { throw new OperationError("iv: Must have length more than 0 and less than 2^64 - 1"); } (_a2 = algorithm.tagLength) !== null && _a2 !== void 0 ? _a2 : algorithm.tagLength = 128; switch (algorithm.tagLength) { case 32: case 64: case 96: case 104: case 112: case 120: case 128: break; default: throw new OperationError("tagLength: Must be one of 32, 64, 96, 104, 112, 120 or 128"); } } }; AesKwProvider = class extends AesProvider { constructor() { super(...arguments); this.name = "AES-KW"; this.usages = ["wrapKey", "unwrapKey"]; } }; DesProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { if (this.ivSize) { this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength !== this.ivSize) { throw new TypeError(`iv: Must have length ${this.ivSize} bytes`); } } } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not of type Number"); } if (algorithm.length !== this.keySizeBits) { throw new OperationError(`algorithm.length: Must be ${this.keySizeBits}`); } } checkDerivedKeyParams(algorithm) { this.checkGenerateKeyParams(algorithm); } }; RsaProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "publicExponent"); if (!(algorithm.publicExponent && algorithm.publicExponent instanceof Uint8Array)) { throw new TypeError("publicExponent: Missing or not a Uint8Array"); } const publicExponent = import_pvtsutils4.Convert.ToBase64(algorithm.publicExponent); if (!(publicExponent === "Aw==" || publicExponent === "AQAB")) { throw new TypeError("publicExponent: Must be [3] or [1,0,1]"); } this.checkRequiredProperty(algorithm, "modulusLength"); if (algorithm.modulusLength % 8 || algorithm.modulusLength < 256 || algorithm.modulusLength > 16384) { throw new TypeError("The modulus length must be a multiple of 8 bits and >= 256 and <= 16384"); } } checkImportParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } }; RsaSsaProvider = class extends RsaProvider { constructor() { super(...arguments); this.name = "RSASSA-PKCS1-v1_5"; this.usages = { privateKey: ["sign"], publicKey: ["verify"] }; } }; RsaPssProvider = class extends RsaProvider { constructor() { super(...arguments); this.name = "RSA-PSS"; this.usages = { privateKey: ["sign"], publicKey: ["verify"] }; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "saltLength"); if (typeof algorithm.saltLength !== "number") { throw new TypeError("saltLength: Is not a Number"); } if (algorithm.saltLength < 0) { throw new RangeError("saltLength: Must be positive number"); } } }; RsaOaepProvider = class extends RsaProvider { constructor() { super(...arguments); this.name = "RSA-OAEP"; this.usages = { privateKey: ["decrypt", "unwrapKey"], publicKey: ["encrypt", "wrapKey"] }; } checkAlgorithmParams(algorithm) { if (algorithm.label && !(algorithm.label instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.label))) { throw new TypeError("label: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } } }; EllipticProvider = class extends ProviderCrypto { checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "namedCurve"); this.checkNamedCurve(algorithm.namedCurve); } checkNamedCurve(namedCurve) { for (const item of this.namedCurves) { if (item.toLowerCase() === namedCurve.toLowerCase()) { return; } } throw new OperationError(`namedCurve: Must be one of ${this.namedCurves.join(", ")}`); } }; EcdsaProvider = class extends EllipticProvider { constructor() { super(...arguments); this.name = "ECDSA"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = { privateKey: ["sign"], publicKey: ["verify"] }; this.namedCurves = ["P-256", "P-384", "P-521", "K-256"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } }; KEY_TYPES = ["secret", "private", "public"]; CryptoKey = class { static create(algorithm, type3, extractable, usages) { const key = new this(); key.algorithm = algorithm; key.type = type3; key.extractable = extractable; key.usages = usages; return key; } static isKeyType(data) { return KEY_TYPES.indexOf(data) !== -1; } get [Symbol.toStringTag]() { return "CryptoKey"; } }; EcdhProvider = class extends EllipticProvider { constructor() { super(...arguments); this.name = "ECDH"; this.usages = { privateKey: ["deriveBits", "deriveKey"], publicKey: [] }; this.namedCurves = ["P-256", "P-384", "P-521", "K-256"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "public"); if (!(algorithm.public instanceof CryptoKey)) { throw new TypeError("public: Is not a CryptoKey"); } if (algorithm.public.type !== "public") { throw new OperationError("public: Is not a public key"); } if (algorithm.public.algorithm.name !== this.name) { throw new OperationError(`public: Is not ${this.name} key`); } } }; EcdhEsProvider = class extends EcdhProvider { constructor() { super(...arguments); this.name = "ECDH-ES"; this.namedCurves = ["X25519", "X448"]; } }; EdDsaProvider = class extends EllipticProvider { constructor() { super(...arguments); this.name = "EdDSA"; this.usages = { privateKey: ["sign"], publicKey: ["verify"] }; this.namedCurves = ["Ed25519", "Ed448"]; } }; ObjectIdentifier2 = class ObjectIdentifier3 { constructor(value) { if (value) { this.value = value; } } }; __decorate([ AsnProp({ type: AsnPropTypes.ObjectIdentifier }) ], ObjectIdentifier2.prototype, "value", void 0); ObjectIdentifier2 = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], ObjectIdentifier2); AlgorithmIdentifier = class { constructor(params) { Object.assign(this, params); } }; __decorate([ AsnProp({ type: AsnPropTypes.ObjectIdentifier }) ], AlgorithmIdentifier.prototype, "algorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true }) ], AlgorithmIdentifier.prototype, "parameters", void 0); PrivateKeyInfo = class { constructor() { this.version = 0; this.privateKeyAlgorithm = new AlgorithmIdentifier(); this.privateKey = new ArrayBuffer(0); } }; __decorate([ AsnProp({ type: AsnPropTypes.Integer }) ], PrivateKeyInfo.prototype, "version", void 0); __decorate([ AsnProp({ type: AlgorithmIdentifier }) ], PrivateKeyInfo.prototype, "privateKeyAlgorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], PrivateKeyInfo.prototype, "privateKey", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true }) ], PrivateKeyInfo.prototype, "attributes", void 0); PublicKeyInfo = class { constructor() { this.publicKeyAlgorithm = new AlgorithmIdentifier(); this.publicKey = new ArrayBuffer(0); } }; __decorate([ AsnProp({ type: AlgorithmIdentifier }) ], PublicKeyInfo.prototype, "publicKeyAlgorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.BitString }) ], PublicKeyInfo.prototype, "publicKey", void 0); JsonBase64UrlArrayBufferConverter = { fromJSON: (value) => import_pvtsutils4.Convert.FromBase64Url(value), toJSON: (value) => import_pvtsutils4.Convert.ToBase64Url(new Uint8Array(value)) }; AsnIntegerArrayBufferConverter = { fromASN: (value) => { const valueHex = value.valueBlock.valueHex; return !new Uint8Array(valueHex)[0] ? value.valueBlock.valueHex.slice(1) : value.valueBlock.valueHex; }, toASN: (value) => { const valueHex = new Uint8Array(value)[0] > 127 ? (0, import_pvtsutils4.combine)(new Uint8Array([0]).buffer, value) : value; return new Integer({ valueHex }); } }; RsaPrivateKey = class { constructor() { this.version = 0; this.modulus = new ArrayBuffer(0); this.publicExponent = new ArrayBuffer(0); this.privateExponent = new ArrayBuffer(0); this.prime1 = new ArrayBuffer(0); this.prime2 = new ArrayBuffer(0); this.exponent1 = new ArrayBuffer(0); this.exponent2 = new ArrayBuffer(0); this.coefficient = new ArrayBuffer(0); } }; __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerConverter }) ], RsaPrivateKey.prototype, "version", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "n", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "modulus", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "e", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "publicExponent", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "d", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "privateExponent", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "p", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "prime1", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "q", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "prime2", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "dp", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "exponent1", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "dq", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "exponent2", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "qi", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey.prototype, "coefficient", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true }) ], RsaPrivateKey.prototype, "otherPrimeInfos", void 0); RsaPublicKey = class { constructor() { this.modulus = new ArrayBuffer(0); this.publicExponent = new ArrayBuffer(0); } }; __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "n", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPublicKey.prototype, "modulus", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "e", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPublicKey.prototype, "publicExponent", void 0); EcPublicKey = class EcPublicKey2 { constructor(value) { this.value = new ArrayBuffer(0); if (value) { this.value = value; } } toJSON() { let bytes = new Uint8Array(this.value); if (bytes[0] !== 4) { throw new CryptoError("Wrong ECPoint. Current version supports only Uncompressed (0x04) point"); } bytes = new Uint8Array(this.value.slice(1)); const size3 = bytes.length / 2; const offset4 = 0; const json = { x: import_pvtsutils4.Convert.ToBase64Url(bytes.buffer.slice(offset4, offset4 + size3)), y: import_pvtsutils4.Convert.ToBase64Url(bytes.buffer.slice(offset4 + size3, offset4 + size3 + size3)) }; return json; } fromJSON(json) { if (!("x" in json)) { throw new Error("x: Missing required property"); } if (!("y" in json)) { throw new Error("y: Missing required property"); } const x = import_pvtsutils4.Convert.FromBase64Url(json.x); const y = import_pvtsutils4.Convert.FromBase64Url(json.y); const value = (0, import_pvtsutils4.combine)(new Uint8Array([4]).buffer, x, y); this.value = new Uint8Array(value).buffer; return this; } }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EcPublicKey.prototype, "value", void 0); EcPublicKey = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EcPublicKey); EcPrivateKey = class { constructor() { this.version = 1; this.privateKey = new ArrayBuffer(0); } fromJSON(json) { if (!("d" in json)) { throw new Error("d: Missing required property"); } this.privateKey = import_pvtsutils4.Convert.FromBase64Url(json.d); if ("x" in json) { const publicKey = new EcPublicKey(); publicKey.fromJSON(json); const asn = AsnSerializer.toASN(publicKey); if ("valueHex" in asn.valueBlock) { this.publicKey = asn.valueBlock.valueHex; } } return this; } toJSON() { const jwk = {}; jwk.d = import_pvtsutils4.Convert.ToBase64Url(this.privateKey); if (this.publicKey) { Object.assign(jwk, new EcPublicKey(this.publicKey).toJSON()); } return jwk; } }; __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerConverter }) ], EcPrivateKey.prototype, "version", void 0); __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EcPrivateKey.prototype, "privateKey", void 0); __decorate([ AsnProp({ context: 0, type: AsnPropTypes.Any, optional: true }) ], EcPrivateKey.prototype, "parameters", void 0); __decorate([ AsnProp({ context: 1, type: AsnPropTypes.BitString, optional: true }) ], EcPrivateKey.prototype, "publicKey", void 0); AsnIntegerWithoutPaddingConverter = { fromASN: (value) => { const bytes = new Uint8Array(value.valueBlock.valueHex); return bytes[0] === 0 ? bytes.buffer.slice(1) : bytes.buffer; }, toASN: (value) => { const bytes = new Uint8Array(value); if (bytes[0] > 127) { const newValue = new Uint8Array(bytes.length + 1); newValue.set(bytes, 1); return new Integer({ valueHex: newValue.buffer }); } return new Integer({ valueHex: value }); } }; index$2 = /* @__PURE__ */ Object.freeze({ __proto__: null, AsnIntegerWithoutPaddingConverter }); EcUtils = class { static decodePoint(data, pointSize) { const view = import_pvtsutils4.BufferSourceConverter.toUint8Array(data); if (view.length === 0 || view[0] !== 4) { throw new Error("Only uncompressed point format supported"); } const n = (view.length - 1) / 2; if (n !== Math.ceil(pointSize / 8)) { throw new Error("Point does not match field size"); } const xb = view.slice(1, n + 1); const yb = view.slice(n + 1, n + 1 + n); return { x: xb, y: yb }; } static encodePoint(point, pointSize) { const size3 = Math.ceil(pointSize / 8); if (point.x.byteLength !== size3 || point.y.byteLength !== size3) { throw new Error("X,Y coordinates don't match point size criteria"); } const x = import_pvtsutils4.BufferSourceConverter.toUint8Array(point.x); const y = import_pvtsutils4.BufferSourceConverter.toUint8Array(point.y); const res = new Uint8Array(size3 * 2 + 1); res[0] = 4; res.set(x, 1); res.set(y, size3 + 1); return res; } static getSize(pointSize) { return Math.ceil(pointSize / 8); } static encodeSignature(signature, pointSize) { const size3 = this.getSize(pointSize); const r = import_pvtsutils4.BufferSourceConverter.toUint8Array(signature.r); const s = import_pvtsutils4.BufferSourceConverter.toUint8Array(signature.s); const res = new Uint8Array(size3 * 2); res.set(this.padStart(r, size3)); res.set(this.padStart(s, size3), size3); return res; } static decodeSignature(data, pointSize) { const size3 = this.getSize(pointSize); const view = import_pvtsutils4.BufferSourceConverter.toUint8Array(data); if (view.length !== size3 * 2) { throw new Error("Incorrect size of the signature"); } const r = view.slice(0, size3); const s = view.slice(size3); return { r: this.trimStart(r), s: this.trimStart(s) }; } static trimStart(data) { let i = 0; while (i < data.length - 1 && data[i] === 0) { i++; } if (i === 0) { return data; } return data.slice(i, data.length); } static padStart(data, size3) { if (size3 === data.length) { return data; } const res = new Uint8Array(size3); res.set(data, size3 - data.length); return res; } }; EcDsaSignature = class _EcDsaSignature { constructor() { this.r = new ArrayBuffer(0); this.s = new ArrayBuffer(0); } static fromWebCryptoSignature(value) { const pointSize = value.byteLength / 2; const point = EcUtils.decodeSignature(value, pointSize * 8); const ecSignature = new _EcDsaSignature(); ecSignature.r = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(point.r); ecSignature.s = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(point.s); return ecSignature; } toWebCryptoSignature(pointSize) { if (!pointSize) { const maxPointLength = Math.max(this.r.byteLength, this.s.byteLength); if (maxPointLength <= 32) { pointSize = 256; } else if (maxPointLength <= 48) { pointSize = 384; } else { pointSize = 521; } } const signature = EcUtils.encodeSignature(this, pointSize); return signature.buffer; } }; __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerWithoutPaddingConverter }) ], EcDsaSignature.prototype, "r", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerWithoutPaddingConverter }) ], EcDsaSignature.prototype, "s", void 0); OneAsymmetricKey = class extends PrivateKeyInfo { }; __decorate([ AsnProp({ context: 1, implicit: true, type: AsnPropTypes.BitString, optional: true }) ], OneAsymmetricKey.prototype, "publicKey", void 0); EdPrivateKey = class EdPrivateKey2 { constructor() { this.value = new ArrayBuffer(0); } fromJSON(json) { if (!json.d) { throw new Error("d: Missing required property"); } this.value = import_pvtsutils4.Convert.FromBase64Url(json.d); return this; } toJSON() { const jwk = { d: import_pvtsutils4.Convert.ToBase64Url(this.value) }; return jwk; } }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EdPrivateKey.prototype, "value", void 0); EdPrivateKey = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EdPrivateKey); EdPublicKey = class EdPublicKey2 { constructor(value) { this.value = new ArrayBuffer(0); if (value) { this.value = value; } } toJSON() { const json = { x: import_pvtsutils4.Convert.ToBase64Url(this.value) }; return json; } fromJSON(json) { if (!("x" in json)) { throw new Error("x: Missing required property"); } this.value = import_pvtsutils4.Convert.FromBase64Url(json.x); return this; } }; __decorate([ AsnProp({ type: AsnPropTypes.BitString }) ], EdPublicKey.prototype, "value", void 0); EdPublicKey = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EdPublicKey); CurvePrivateKey = class CurvePrivateKey2 { }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }), JsonProp({ type: JsonPropTypes.String, converter: JsonBase64UrlArrayBufferConverter }) ], CurvePrivateKey.prototype, "d", void 0); CurvePrivateKey = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], CurvePrivateKey); idSecp256r1 = "1.2.840.10045.3.1.7"; idEllipticCurve = "1.3.132.0"; idSecp384r1 = `${idEllipticCurve}.34`; idSecp521r1 = `${idEllipticCurve}.35`; idSecp256k1 = `${idEllipticCurve}.10`; idVersionOne = "1.3.36.3.3.2.8.1.1"; idBrainpoolP160r1 = `${idVersionOne}.1`; idBrainpoolP160t1 = `${idVersionOne}.2`; idBrainpoolP192r1 = `${idVersionOne}.3`; idBrainpoolP192t1 = `${idVersionOne}.4`; idBrainpoolP224r1 = `${idVersionOne}.5`; idBrainpoolP224t1 = `${idVersionOne}.6`; idBrainpoolP256r1 = `${idVersionOne}.7`; idBrainpoolP256t1 = `${idVersionOne}.8`; idBrainpoolP320r1 = `${idVersionOne}.9`; idBrainpoolP320t1 = `${idVersionOne}.10`; idBrainpoolP384r1 = `${idVersionOne}.11`; idBrainpoolP384t1 = `${idVersionOne}.12`; idBrainpoolP512r1 = `${idVersionOne}.13`; idBrainpoolP512t1 = `${idVersionOne}.14`; idX25519 = "1.3.101.110"; idX448 = "1.3.101.111"; idEd25519 = "1.3.101.112"; idEd448 = "1.3.101.113"; index$1 = /* @__PURE__ */ Object.freeze({ __proto__: null, AlgorithmIdentifier, get CurvePrivateKey() { return CurvePrivateKey; }, EcDsaSignature, EcPrivateKey, get EcPublicKey() { return EcPublicKey; }, get EdPrivateKey() { return EdPrivateKey; }, get EdPublicKey() { return EdPublicKey; }, get ObjectIdentifier() { return ObjectIdentifier2; }, OneAsymmetricKey, PrivateKeyInfo, PublicKeyInfo, RsaPrivateKey, RsaPublicKey, converters: index$2, idBrainpoolP160r1, idBrainpoolP160t1, idBrainpoolP192r1, idBrainpoolP192t1, idBrainpoolP224r1, idBrainpoolP224t1, idBrainpoolP256r1, idBrainpoolP256t1, idBrainpoolP320r1, idBrainpoolP320t1, idBrainpoolP384r1, idBrainpoolP384t1, idBrainpoolP512r1, idBrainpoolP512t1, idEd25519, idEd448, idEllipticCurve, idSecp256k1, idSecp256r1, idSecp384r1, idSecp521r1, idVersionOne, idX25519, idX448 }); EcCurves = class { constructor() { } static register(item) { const oid = new ObjectIdentifier2(); oid.value = item.id; const raw = AsnConvert.serialize(oid); this.items.push({ ...item, raw }); this.names.push(item.name); } static find(nameOrId) { nameOrId = nameOrId.toUpperCase(); for (const item of this.items) { if (item.name.toUpperCase() === nameOrId || item.id.toUpperCase() === nameOrId) { return item; } } return null; } static get(nameOrId) { const res = this.find(nameOrId); if (!res) { throw new Error(`Unsupported EC named curve '${nameOrId}'`); } return res; } }; EcCurves.items = []; EcCurves.names = []; EcCurves.register({ name: "P-256", id: idSecp256r1, size: 256 }); EcCurves.register({ name: "P-384", id: idSecp384r1, size: 384 }); EcCurves.register({ name: "P-521", id: idSecp521r1, size: 521 }); EcCurves.register({ name: "K-256", id: idSecp256k1, size: 256 }); EcCurves.register({ name: "brainpoolP160r1", id: idBrainpoolP160r1, size: 160 }); EcCurves.register({ name: "brainpoolP160t1", id: idBrainpoolP160t1, size: 160 }); EcCurves.register({ name: "brainpoolP192r1", id: idBrainpoolP192r1, size: 192 }); EcCurves.register({ name: "brainpoolP192t1", id: idBrainpoolP192t1, size: 192 }); EcCurves.register({ name: "brainpoolP224r1", id: idBrainpoolP224r1, size: 224 }); EcCurves.register({ name: "brainpoolP224t1", id: idBrainpoolP224t1, size: 224 }); EcCurves.register({ name: "brainpoolP256r1", id: idBrainpoolP256r1, size: 256 }); EcCurves.register({ name: "brainpoolP256t1", id: idBrainpoolP256t1, size: 256 }); EcCurves.register({ name: "brainpoolP320r1", id: idBrainpoolP320r1, size: 320 }); EcCurves.register({ name: "brainpoolP320t1", id: idBrainpoolP320t1, size: 320 }); EcCurves.register({ name: "brainpoolP384r1", id: idBrainpoolP384r1, size: 384 }); EcCurves.register({ name: "brainpoolP384t1", id: idBrainpoolP384t1, size: 384 }); EcCurves.register({ name: "brainpoolP512r1", id: idBrainpoolP512r1, size: 512 }); EcCurves.register({ name: "brainpoolP512t1", id: idBrainpoolP512t1, size: 512 }); X25519Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "X25519"; this.usages = { privateKey: ["deriveKey", "deriveBits"], publicKey: [] }; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "public"); } }; Ed25519Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "Ed25519"; this.usages = { privateKey: ["sign"], publicKey: ["verify"] }; } }; HmacProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "HMAC"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["sign", "verify"]; } getDefaultLength(algName) { switch (algName.toUpperCase()) { case "SHA-1": case "SHA-256": case "SHA-384": case "SHA-512": return 512; default: throw new Error(`Unknown algorithm name '${algName}'`); } } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); if ("length" in algorithm) { if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new RangeError("length: Number is out of range"); } } } checkImportParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } }; Pbkdf2Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "PBKDF2"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["deriveBits", "deriveKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "salt"); if (!(algorithm.salt instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.salt))) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } this.checkRequiredProperty(algorithm, "iterations"); if (typeof algorithm.iterations !== "number") { throw new TypeError("iterations: Is not a Number"); } if (algorithm.iterations < 1) { throw new TypeError("iterations: Is less than 1"); } } checkImportKey(format2, keyData, algorithm, extractable, keyUsages, ...args) { super.checkImportKey(format2, keyData, algorithm, extractable, keyUsages, ...args); if (extractable) { throw new SyntaxError("extractable: Must be 'false'"); } } }; HkdfProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "HKDF"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["deriveKey", "deriveBits"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "salt"); if (!import_pvtsutils4.BufferSourceConverter.isBufferSource(algorithm.salt)) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } this.checkRequiredProperty(algorithm, "info"); if (!import_pvtsutils4.BufferSourceConverter.isBufferSource(algorithm.info)) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } } checkImportKey(format2, keyData, algorithm, extractable, keyUsages, ...args) { super.checkImportKey(format2, keyData, algorithm, extractable, keyUsages, ...args); if (extractable) { throw new SyntaxError("extractable: Must be 'false'"); } } }; ShakeProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.usages = []; this.defaultLength = 0; } digest(...args) { args[0] = { length: this.defaultLength, ...args[0] }; return super.digest.apply(this, args); } checkDigest(algorithm, data) { super.checkDigest(algorithm, data); const length = algorithm.length || 0; if (typeof length !== "number") { throw new TypeError("length: Is not a Number"); } if (length < 0) { throw new TypeError("length: Is negative"); } } }; Shake128Provider = class extends ShakeProvider { constructor() { super(...arguments); this.name = "shake128"; this.defaultLength = 16; } }; Shake256Provider = class extends ShakeProvider { constructor() { super(...arguments); this.name = "shake256"; this.defaultLength = 32; } }; Crypto = class { get [Symbol.toStringTag]() { return "Crypto"; } randomUUID() { const b = this.getRandomValues(new Uint8Array(16)); b[6] = b[6] & 15 | 64; b[8] = b[8] & 63 | 128; const uuid = import_pvtsutils4.Convert.ToHex(b).toLowerCase(); return `${uuid.substring(0, 8)}-${uuid.substring(8, 12)}-${uuid.substring(12, 16)}-${uuid.substring(16, 20)}-${uuid.substring(20)}`; } }; ProviderStorage = class { constructor() { this.items = {}; } get(algorithmName) { return this.items[algorithmName.toLowerCase()] || null; } set(provider) { this.items[provider.name.toLowerCase()] = provider; } removeAt(algorithmName) { const provider = this.get(algorithmName.toLowerCase()); if (provider) { delete this.items[algorithmName]; } return provider; } has(name) { return !!this.get(name); } get length() { return Object.keys(this.items).length; } get algorithms() { const algorithms = []; for (const key in this.items) { const provider = this.items[key]; algorithms.push(provider.name); } return algorithms.sort(); } }; keyFormatMap = { "jwk": ["private", "public", "secret"], "pkcs8": ["private"], "spki": ["public"], "raw": ["secret", "public"] }; sourceBufferKeyFormats = ["pkcs8", "spki", "raw"]; SubtleCrypto = class _SubtleCrypto { constructor() { this.providers = new ProviderStorage(); } static isHashedAlgorithm(data) { return data && typeof data === "object" && "name" in data && "hash" in data ? true : false; } get [Symbol.toStringTag]() { return "SubtleCrypto"; } async digest(...args) { this.checkRequiredArguments(args, 2, "digest"); const [algorithm, data, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.digest(preparedAlgorithm, preparedData, ...params); return result; } async generateKey(...args) { this.checkRequiredArguments(args, 3, "generateKey"); const [algorithm, extractable, keyUsages, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.generateKey({ ...preparedAlgorithm, name: provider.name }, extractable, keyUsages, ...params); return result; } async sign(...args) { this.checkRequiredArguments(args, 3, "sign"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.sign({ ...preparedAlgorithm, name: provider.name }, key, preparedData, ...params); return result; } async verify(...args) { this.checkRequiredArguments(args, 4, "verify"); const [algorithm, key, signature, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); const preparedSignature = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(signature); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.verify({ ...preparedAlgorithm, name: provider.name }, key, preparedSignature, preparedData, ...params); return result; } async encrypt(...args) { this.checkRequiredArguments(args, 3, "encrypt"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.encrypt({ ...preparedAlgorithm, name: provider.name }, key, preparedData, { keyUsage: true }, ...params); return result; } async decrypt(...args) { this.checkRequiredArguments(args, 3, "decrypt"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.decrypt({ ...preparedAlgorithm, name: provider.name }, key, preparedData, { keyUsage: true }, ...params); return result; } async deriveBits(...args) { this.checkRequiredArguments(args, 3, "deriveBits"); const [algorithm, baseKey, length, ...params] = args; this.checkCryptoKey(baseKey); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.deriveBits({ ...preparedAlgorithm, name: provider.name }, baseKey, length, { keyUsage: true }, ...params); return result; } async deriveKey(...args) { this.checkRequiredArguments(args, 5, "deriveKey"); const [algorithm, baseKey, derivedKeyType, extractable, keyUsages, ...params] = args; const preparedDerivedKeyType = this.prepareAlgorithm(derivedKeyType); const importProvider = this.getProvider(preparedDerivedKeyType.name); importProvider.checkDerivedKeyParams(preparedDerivedKeyType); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); provider.checkCryptoKey(baseKey, "deriveKey"); const derivedBits = await provider.deriveBits({ ...preparedAlgorithm, name: provider.name }, baseKey, derivedKeyType.length || 512, { keyUsage: false }, ...params); return this.importKey("raw", derivedBits, derivedKeyType, extractable, keyUsages, ...params); } async exportKey(...args) { this.checkRequiredArguments(args, 2, "exportKey"); const [format2, key, ...params] = args; this.checkCryptoKey(key); if (!keyFormatMap[format2]) { throw new TypeError("Invalid keyFormat argument"); } if (!keyFormatMap[format2].includes(key.type)) { throw new DOMException("The key is not of the expected type"); } const provider = this.getProvider(key.algorithm.name); const result = await provider.exportKey(format2, key, ...params); return result; } async importKey(...args) { this.checkRequiredArguments(args, 5, "importKey"); const [format2, keyData, algorithm, extractable, keyUsages, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); if (format2 === "jwk") { if (typeof keyData !== "object" || !keyData.kty) { throw new TypeError("Key data must be an object for JWK import"); } } else if (sourceBufferKeyFormats.includes(format2)) { if (!import_pvtsutils4.BufferSourceConverter.isBufferSource(keyData)) { throw new TypeError("Key data must be a BufferSource for non-JWK formats"); } } else { throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'"); } return provider.importKey(format2, keyData, { ...preparedAlgorithm, name: provider.name }, extractable, keyUsages, ...params); } async wrapKey(format2, key, wrappingKey, wrapAlgorithm, ...args) { let keyData = await this.exportKey(format2, key, ...args); if (format2 === "jwk") { const json = JSON.stringify(keyData); keyData = import_pvtsutils4.Convert.FromUtf8String(json); } const preparedAlgorithm = this.prepareAlgorithm(wrapAlgorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(keyData); const provider = this.getProvider(preparedAlgorithm.name); return provider.encrypt({ ...preparedAlgorithm, name: provider.name }, wrappingKey, preparedData, { keyUsage: false }, ...args); } async unwrapKey(format2, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages, ...args) { const preparedAlgorithm = this.prepareAlgorithm(unwrapAlgorithm); const preparedData = import_pvtsutils4.BufferSourceConverter.toArrayBuffer(wrappedKey); const provider = this.getProvider(preparedAlgorithm.name); let keyData = await provider.decrypt({ ...preparedAlgorithm, name: provider.name }, unwrappingKey, preparedData, { keyUsage: false }, ...args); if (format2 === "jwk") { try { keyData = JSON.parse(import_pvtsutils4.Convert.ToUtf8String(keyData)); } catch (e) { const error = new TypeError("wrappedKey: Is not a JSON"); error.internal = e; throw error; } } return this.importKey(format2, keyData, unwrappedKeyAlgorithm, extractable, keyUsages, ...args); } checkRequiredArguments(args, size3, methodName) { if (args.length < size3) { throw new TypeError(`Failed to execute '${methodName}' on 'SubtleCrypto': ${size3} arguments required, but only ${args.length} present`); } } prepareAlgorithm(algorithm) { if (typeof algorithm === "string") { return { name: algorithm }; } if (_SubtleCrypto.isHashedAlgorithm(algorithm)) { const preparedAlgorithm = { ...algorithm }; preparedAlgorithm.hash = this.prepareAlgorithm(algorithm.hash); return preparedAlgorithm; } return { ...algorithm }; } getProvider(name) { const provider = this.providers.get(name); if (!provider) { throw new AlgorithmError("Unrecognized name"); } return provider; } checkCryptoKey(key) { if (!(key instanceof CryptoKey)) { throw new TypeError(`Key is not of type 'CryptoKey'`); } } }; } }); // node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js var require_base64_js = __commonJS({ "node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js"(exports) { "use strict"; exports.byteLength = byteLength; exports.toByteArray = toByteArray; exports.fromByteArray = fromByteArray; var lookup = []; var revLookup = []; var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i]; revLookup[code.charCodeAt(i)] = i; } var i; var len; revLookup["-".charCodeAt(0)] = 62; revLookup["_".charCodeAt(0)] = 63; function getLens(b64) { var len2 = b64.length; if (len2 % 4 > 0) { throw new Error("Invalid string. Length must be a multiple of 4"); } var validLen = b64.indexOf("="); if (validLen === -1) validLen = len2; var placeHoldersLen = validLen === len2 ? 0 : 4 - validLen % 4; return [validLen, placeHoldersLen]; } function byteLength(b64) { var lens = getLens(b64); var validLen = lens[0]; var placeHoldersLen = lens[1]; return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; } function _byteLength(b64, validLen, placeHoldersLen) { return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; } function toByteArray(b64) { var tmp; var lens = getLens(b64); var validLen = lens[0]; var placeHoldersLen = lens[1]; var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); var curByte = 0; var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen; var i2; for (i2 = 0; i2 < len2; i2 += 4) { tmp = revLookup[b64.charCodeAt(i2)] << 18 | revLookup[b64.charCodeAt(i2 + 1)] << 12 | revLookup[b64.charCodeAt(i2 + 2)] << 6 | revLookup[b64.charCodeAt(i2 + 3)]; arr[curByte++] = tmp >> 16 & 255; arr[curByte++] = tmp >> 8 & 255; arr[curByte++] = tmp & 255; } if (placeHoldersLen === 2) { tmp = revLookup[b64.charCodeAt(i2)] << 2 | revLookup[b64.charCodeAt(i2 + 1)] >> 4; arr[curByte++] = tmp & 255; } if (placeHoldersLen === 1) { tmp = revLookup[b64.charCodeAt(i2)] << 10 | revLookup[b64.charCodeAt(i2 + 1)] << 4 | revLookup[b64.charCodeAt(i2 + 2)] >> 2; arr[curByte++] = tmp >> 8 & 255; arr[curByte++] = tmp & 255; } return arr; } function tripletToBase64(num) { return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63]; } function encodeChunk(uint8, start2, end2) { var tmp; var output = []; for (var i2 = start2; i2 < end2; i2 += 3) { tmp = (uint8[i2] << 16 & 16711680) + (uint8[i2 + 1] << 8 & 65280) + (uint8[i2 + 2] & 255); output.push(tripletToBase64(tmp)); } return output.join(""); } function fromByteArray(uint8) { var tmp; var len2 = uint8.length; var extraBytes = len2 % 3; var parts = []; var maxChunkLength = 16383; for (var i2 = 0, len22 = len2 - extraBytes; i2 < len22; i2 += maxChunkLength) { parts.push(encodeChunk(uint8, i2, i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength)); } if (extraBytes === 1) { tmp = uint8[len2 - 1]; parts.push( lookup[tmp >> 2] + lookup[tmp << 4 & 63] + "==" ); } else if (extraBytes === 2) { tmp = (uint8[len2 - 2] << 8) + uint8[len2 - 1]; parts.push( lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + "=" ); } return parts.join(""); } } }); // node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js var require_ieee754 = __commonJS({ "node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js"(exports) { exports.read = function(buffer, offset4, isLE, mLen, nBytes) { var e, m; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = -7; var i = isLE ? nBytes - 1 : 0; var d = isLE ? -1 : 1; var s = buffer[offset4 + i]; i += d; e = s & (1 << -nBits) - 1; s >>= -nBits; nBits += eLen; for (; nBits > 0; e = e * 256 + buffer[offset4 + i], i += d, nBits -= 8) { } m = e & (1 << -nBits) - 1; e >>= -nBits; nBits += mLen; for (; nBits > 0; m = m * 256 + buffer[offset4 + i], i += d, nBits -= 8) { } if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : (s ? -1 : 1) * Infinity; } else { m = m + Math.pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * Math.pow(2, e - mLen); }; exports.write = function(buffer, value, offset4, isLE, mLen, nBytes) { var e, m, c; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; var i = isLE ? 0 : nBytes - 1; var d = isLE ? 1 : -1; var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(value) / Math.LN2); if (value * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * Math.pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen); e = e + eBias; } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset4 + i] = m & 255, i += d, m /= 256, mLen -= 8) { } e = e << mLen | m; eLen += mLen; for (; eLen > 0; buffer[offset4 + i] = e & 255, i += d, e /= 256, eLen -= 8) { } buffer[offset4 + i - d] |= s * 128; }; } }); // node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.js var require_buffer = __commonJS({ "node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.js"(exports) { "use strict"; var base64 = require_base64_js(); var ieee754 = require_ieee754(); var customInspectSymbol = typeof Symbol === "function" && typeof Symbol["for"] === "function" ? Symbol["for"]("nodejs.util.inspect.custom") : null; exports.Buffer = Buffer2; exports.SlowBuffer = SlowBuffer; exports.INSPECT_MAX_BYTES = 50; var K_MAX_LENGTH = 2147483647; exports.kMaxLength = K_MAX_LENGTH; Buffer2.TYPED_ARRAY_SUPPORT = typedArraySupport(); if (!Buffer2.TYPED_ARRAY_SUPPORT && typeof console !== "undefined" && typeof console.error === "function") { console.error( "This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support." ); } function typedArraySupport() { try { var arr = new Uint8Array(1); var proto = { foo: function() { return 42; } }; Object.setPrototypeOf(proto, Uint8Array.prototype); Object.setPrototypeOf(arr, proto); return arr.foo() === 42; } catch (e) { return false; } } Object.defineProperty(Buffer2.prototype, "parent", { enumerable: true, get: function() { if (!Buffer2.isBuffer(this)) return void 0; return this.buffer; } }); Object.defineProperty(Buffer2.prototype, "offset", { enumerable: true, get: function() { if (!Buffer2.isBuffer(this)) return void 0; return this.byteOffset; } }); function createBuffer(length) { if (length > K_MAX_LENGTH) { throw new RangeError('The value "' + length + '" is invalid for option "size"'); } var buf = new Uint8Array(length); Object.setPrototypeOf(buf, Buffer2.prototype); return buf; } function Buffer2(arg, encodingOrOffset, length) { if (typeof arg === "number") { if (typeof encodingOrOffset === "string") { throw new TypeError( 'The "string" argument must be of type string. Received type number' ); } return allocUnsafe(arg); } return from(arg, encodingOrOffset, length); } Buffer2.poolSize = 8192; function from(value, encodingOrOffset, length) { if (typeof value === "string") { return fromString(value, encodingOrOffset); } if (ArrayBuffer.isView(value)) { return fromArrayView(value); } if (value == null) { throw new TypeError( "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value ); } if (isInstance2(value, ArrayBuffer) || value && isInstance2(value.buffer, ArrayBuffer)) { return fromArrayBuffer(value, encodingOrOffset, length); } if (typeof SharedArrayBuffer !== "undefined" && (isInstance2(value, SharedArrayBuffer) || value && isInstance2(value.buffer, SharedArrayBuffer))) { return fromArrayBuffer(value, encodingOrOffset, length); } if (typeof value === "number") { throw new TypeError( 'The "value" argument must not be of type number. Received type number' ); } var valueOf = value.valueOf && value.valueOf(); if (valueOf != null && valueOf !== value) { return Buffer2.from(valueOf, encodingOrOffset, length); } var b = fromObject(value); if (b) return b; if (typeof Symbol !== "undefined" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === "function") { return Buffer2.from( value[Symbol.toPrimitive]("string"), encodingOrOffset, length ); } throw new TypeError( "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value ); } Buffer2.from = function(value, encodingOrOffset, length) { return from(value, encodingOrOffset, length); }; Object.setPrototypeOf(Buffer2.prototype, Uint8Array.prototype); Object.setPrototypeOf(Buffer2, Uint8Array); function assertSize(size3) { if (typeof size3 !== "number") { throw new TypeError('"size" argument must be of type number'); } else if (size3 < 0) { throw new RangeError('The value "' + size3 + '" is invalid for option "size"'); } } function alloc(size3, fill, encoding) { assertSize(size3); if (size3 <= 0) { return createBuffer(size3); } if (fill !== void 0) { return typeof encoding === "string" ? createBuffer(size3).fill(fill, encoding) : createBuffer(size3).fill(fill); } return createBuffer(size3); } Buffer2.alloc = function(size3, fill, encoding) { return alloc(size3, fill, encoding); }; function allocUnsafe(size3) { assertSize(size3); return createBuffer(size3 < 0 ? 0 : checked(size3) | 0); } Buffer2.allocUnsafe = function(size3) { return allocUnsafe(size3); }; Buffer2.allocUnsafeSlow = function(size3) { return allocUnsafe(size3); }; function fromString(string, encoding) { if (typeof encoding !== "string" || encoding === "") { encoding = "utf8"; } if (!Buffer2.isEncoding(encoding)) { throw new TypeError("Unknown encoding: " + encoding); } var length = byteLength(string, encoding) | 0; var buf = createBuffer(length); var actual = buf.write(string, encoding); if (actual !== length) { buf = buf.slice(0, actual); } return buf; } function fromArrayLike(array) { var length = array.length < 0 ? 0 : checked(array.length) | 0; var buf = createBuffer(length); for (var i = 0; i < length; i += 1) { buf[i] = array[i] & 255; } return buf; } function fromArrayView(arrayView) { if (isInstance2(arrayView, Uint8Array)) { var copy = new Uint8Array(arrayView); return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength); } return fromArrayLike(arrayView); } function fromArrayBuffer(array, byteOffset, length) { if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('"offset" is outside of buffer bounds'); } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('"length" is outside of buffer bounds'); } var buf; if (byteOffset === void 0 && length === void 0) { buf = new Uint8Array(array); } else if (length === void 0) { buf = new Uint8Array(array, byteOffset); } else { buf = new Uint8Array(array, byteOffset, length); } Object.setPrototypeOf(buf, Buffer2.prototype); return buf; } function fromObject(obj) { if (Buffer2.isBuffer(obj)) { var len = checked(obj.length) | 0; var buf = createBuffer(len); if (buf.length === 0) { return buf; } obj.copy(buf, 0, 0, len); return buf; } if (obj.length !== void 0) { if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { return createBuffer(0); } return fromArrayLike(obj); } if (obj.type === "Buffer" && Array.isArray(obj.data)) { return fromArrayLike(obj.data); } } function checked(length) { if (length >= K_MAX_LENGTH) { throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + K_MAX_LENGTH.toString(16) + " bytes"); } return length | 0; } function SlowBuffer(length) { if (+length != length) { length = 0; } return Buffer2.alloc(+length); } Buffer2.isBuffer = function isBuffer(b) { return b != null && b._isBuffer === true && b !== Buffer2.prototype; }; Buffer2.compare = function compare(a2, b) { if (isInstance2(a2, Uint8Array)) a2 = Buffer2.from(a2, a2.offset, a2.byteLength); if (isInstance2(b, Uint8Array)) b = Buffer2.from(b, b.offset, b.byteLength); if (!Buffer2.isBuffer(a2) || !Buffer2.isBuffer(b)) { throw new TypeError( 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' ); } if (a2 === b) return 0; var x = a2.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a2[i] !== b[i]) { x = a2[i]; y = b[i]; break; } } if (x < y) return -1; if (y < x) return 1; return 0; }; Buffer2.isEncoding = function isEncoding(encoding) { switch (String(encoding).toLowerCase()) { case "hex": case "utf8": case "utf-8": case "ascii": case "latin1": case "binary": case "base64": case "ucs2": case "ucs-2": case "utf16le": case "utf-16le": return true; default: return false; } }; Buffer2.concat = function concat2(list, length) { if (!Array.isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers'); } if (list.length === 0) { return Buffer2.alloc(0); } var i; if (length === void 0) { length = 0; for (i = 0; i < list.length; ++i) { length += list[i].length; } } var buffer = Buffer2.allocUnsafe(length); var pos = 0; for (i = 0; i < list.length; ++i) { var buf = list[i]; if (isInstance2(buf, Uint8Array)) { if (pos + buf.length > buffer.length) { Buffer2.from(buf).copy(buffer, pos); } else { Uint8Array.prototype.set.call( buffer, buf, pos ); } } else if (!Buffer2.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers'); } else { buf.copy(buffer, pos); } pos += buf.length; } return buffer; }; function byteLength(string, encoding) { if (Buffer2.isBuffer(string)) { return string.length; } if (ArrayBuffer.isView(string) || isInstance2(string, ArrayBuffer)) { return string.byteLength; } if (typeof string !== "string") { throw new TypeError( 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string ); } var len = string.length; var mustMatch = arguments.length > 2 && arguments[2] === true; if (!mustMatch && len === 0) return 0; var loweredCase = false; for (; ; ) { switch (encoding) { case "ascii": case "latin1": case "binary": return len; case "utf8": case "utf-8": return utf8ToBytes(string).length; case "ucs2": case "ucs-2": case "utf16le": case "utf-16le": return len * 2; case "hex": return len >>> 1; case "base64": return base64ToBytes(string).length; default: if (loweredCase) { return mustMatch ? -1 : utf8ToBytes(string).length; } encoding = ("" + encoding).toLowerCase(); loweredCase = true; } } } Buffer2.byteLength = byteLength; function slowToString(encoding, start2, end2) { var loweredCase = false; if (start2 === void 0 || start2 < 0) { start2 = 0; } if (start2 > this.length) { return ""; } if (end2 === void 0 || end2 > this.length) { end2 = this.length; } if (end2 <= 0) { return ""; } end2 >>>= 0; start2 >>>= 0; if (end2 <= start2) { return ""; } if (!encoding) encoding = "utf8"; while (true) { switch (encoding) { case "hex": return hexSlice(this, start2, end2); case "utf8": case "utf-8": return utf8Slice(this, start2, end2); case "ascii": return asciiSlice(this, start2, end2); case "latin1": case "binary": return latin1Slice(this, start2, end2); case "base64": return base64Slice(this, start2, end2); case "ucs2": case "ucs-2": case "utf16le": case "utf-16le": return utf16leSlice(this, start2, end2); default: if (loweredCase) throw new TypeError("Unknown encoding: " + encoding); encoding = (encoding + "").toLowerCase(); loweredCase = true; } } } Buffer2.prototype._isBuffer = true; function swap(b, n, m) { var i = b[n]; b[n] = b[m]; b[m] = i; } Buffer2.prototype.swap16 = function swap16() { var len = this.length; if (len % 2 !== 0) { throw new RangeError("Buffer size must be a multiple of 16-bits"); } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1); } return this; }; Buffer2.prototype.swap32 = function swap32() { var len = this.length; if (len % 4 !== 0) { throw new RangeError("Buffer size must be a multiple of 32-bits"); } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3); swap(this, i + 1, i + 2); } return this; }; Buffer2.prototype.swap64 = function swap64() { var len = this.length; if (len % 8 !== 0) { throw new RangeError("Buffer size must be a multiple of 64-bits"); } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7); swap(this, i + 1, i + 6); swap(this, i + 2, i + 5); swap(this, i + 3, i + 4); } return this; }; Buffer2.prototype.toString = function toString2() { var length = this.length; if (length === 0) return ""; if (arguments.length === 0) return utf8Slice(this, 0, length); return slowToString.apply(this, arguments); }; Buffer2.prototype.toLocaleString = Buffer2.prototype.toString; Buffer2.prototype.equals = function equals(b) { if (!Buffer2.isBuffer(b)) throw new TypeError("Argument must be a Buffer"); if (this === b) return true; return Buffer2.compare(this, b) === 0; }; Buffer2.prototype.inspect = function inspect3() { var str = ""; var max3 = exports.INSPECT_MAX_BYTES; str = this.toString("hex", 0, max3).replace(/(.{2})/g, "$1 ").trim(); if (this.length > max3) str += " ... "; return "<Buffer " + str + ">"; }; if (customInspectSymbol) { Buffer2.prototype[customInspectSymbol] = Buffer2.prototype.inspect; } Buffer2.prototype.compare = function compare(target, start2, end2, thisStart, thisEnd) { if (isInstance2(target, Uint8Array)) { target = Buffer2.from(target, target.offset, target.byteLength); } if (!Buffer2.isBuffer(target)) { throw new TypeError( 'The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target ); } if (start2 === void 0) { start2 = 0; } if (end2 === void 0) { end2 = target ? target.length : 0; } if (thisStart === void 0) { thisStart = 0; } if (thisEnd === void 0) { thisEnd = this.length; } if (start2 < 0 || end2 > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError("out of range index"); } if (thisStart >= thisEnd && start2 >= end2) { return 0; } if (thisStart >= thisEnd) { return -1; } if (start2 >= end2) { return 1; } start2 >>>= 0; end2 >>>= 0; thisStart >>>= 0; thisEnd >>>= 0; if (this === target) return 0; var x = thisEnd - thisStart; var y = end2 - start2; var len = Math.min(x, y); var thisCopy = this.slice(thisStart, thisEnd); var targetCopy = target.slice(start2, end2); for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i]; y = targetCopy[i]; break; } } if (x < y) return -1; if (y < x) return 1; return 0; }; function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { if (buffer.length === 0) return -1; if (typeof byteOffset === "string") { encoding = byteOffset; byteOffset = 0; } else if (byteOffset > 2147483647) { byteOffset = 2147483647; } else if (byteOffset < -2147483648) { byteOffset = -2147483648; } byteOffset = +byteOffset; if (numberIsNaN(byteOffset)) { byteOffset = dir ? 0 : buffer.length - 1; } if (byteOffset < 0) byteOffset = buffer.length + byteOffset; if (byteOffset >= buffer.length) { if (dir) return -1; else byteOffset = buffer.length - 1; } else if (byteOffset < 0) { if (dir) byteOffset = 0; else return -1; } if (typeof val === "string") { val = Buffer2.from(val, encoding); } if (Buffer2.isBuffer(val)) { if (val.length === 0) { return -1; } return arrayIndexOf(buffer, val, byteOffset, encoding, dir); } else if (typeof val === "number") { val = val & 255; if (typeof Uint8Array.prototype.indexOf === "function") { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); } } return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); } throw new TypeError("val must be string, number or Buffer"); } function arrayIndexOf(arr, val, byteOffset, encoding, dir) { var indexSize = 1; var arrLength = arr.length; var valLength = val.length; if (encoding !== void 0) { encoding = String(encoding).toLowerCase(); if (encoding === "ucs2" || encoding === "ucs-2" || encoding === "utf16le" || encoding === "utf-16le") { if (arr.length < 2 || val.length < 2) { return -1; } indexSize = 2; arrLength /= 2; valLength /= 2; byteOffset /= 2; } } function read2(buf, i2) { if (indexSize === 1) { return buf[i2]; } else { return buf.readUInt16BE(i2 * indexSize); } } var i; if (dir) { var foundIndex = -1; for (i = byteOffset; i < arrLength; i++) { if (read2(arr, i) === read2(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i; if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; } else { if (foundIndex !== -1) i -= i - foundIndex; foundIndex = -1; } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; for (i = byteOffset; i >= 0; i--) { var found = true; for (var j = 0; j < valLength; j++) { if (read2(arr, i + j) !== read2(val, j)) { found = false; break; } } if (found) return i; } } return -1; } Buffer2.prototype.includes = function includes(val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1; }; Buffer2.prototype.indexOf = function indexOf(val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true); }; Buffer2.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false); }; function hexWrite(buf, string, offset4, length) { offset4 = Number(offset4) || 0; var remaining = buf.length - offset4; if (!length) { length = remaining; } else { length = Number(length); if (length > remaining) { length = remaining; } } var strLen = string.length; if (length > strLen / 2) { length = strLen / 2; } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16); if (numberIsNaN(parsed)) return i; buf[offset4 + i] = parsed; } return i; } function utf8Write(buf, string, offset4, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset4), buf, offset4, length); } function asciiWrite(buf, string, offset4, length) { return blitBuffer(asciiToBytes(string), buf, offset4, length); } function base64Write(buf, string, offset4, length) { return blitBuffer(base64ToBytes(string), buf, offset4, length); } function ucs2Write(buf, string, offset4, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset4), buf, offset4, length); } Buffer2.prototype.write = function write2(string, offset4, length, encoding) { if (offset4 === void 0) { encoding = "utf8"; length = this.length; offset4 = 0; } else if (length === void 0 && typeof offset4 === "string") { encoding = offset4; length = this.length; offset4 = 0; } else if (isFinite(offset4)) { offset4 = offset4 >>> 0; if (isFinite(length)) { length = length >>> 0; if (encoding === void 0) encoding = "utf8"; } else { encoding = length; length = void 0; } } else { throw new Error( "Buffer.write(string, encoding, offset[, length]) is no longer supported" ); } var remaining = this.length - offset4; if (length === void 0 || length > remaining) length = remaining; if (string.length > 0 && (length < 0 || offset4 < 0) || offset4 > this.length) { throw new RangeError("Attempt to write outside buffer bounds"); } if (!encoding) encoding = "utf8"; var loweredCase = false; for (; ; ) { switch (encoding) { case "hex": return hexWrite(this, string, offset4, length); case "utf8": case "utf-8": return utf8Write(this, string, offset4, length); case "ascii": case "latin1": case "binary": return asciiWrite(this, string, offset4, length); case "base64": return base64Write(this, string, offset4, length); case "ucs2": case "ucs-2": case "utf16le": case "utf-16le": return ucs2Write(this, string, offset4, length); default: if (loweredCase) throw new TypeError("Unknown encoding: " + encoding); encoding = ("" + encoding).toLowerCase(); loweredCase = true; } } }; Buffer2.prototype.toJSON = function toJSON() { return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) }; }; function base64Slice(buf, start2, end2) { if (start2 === 0 && end2 === buf.length) { return base64.fromByteArray(buf); } else { return base64.fromByteArray(buf.slice(start2, end2)); } } function utf8Slice(buf, start2, end2) { end2 = Math.min(buf.length, end2); var res = []; var i = start2; while (i < end2) { var firstByte = buf[i]; var codePoint = null; var bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1; if (i + bytesPerSequence <= end2) { var secondByte, thirdByte, fourthByte, tempCodePoint; switch (bytesPerSequence) { case 1: if (firstByte < 128) { codePoint = firstByte; } break; case 2: secondByte = buf[i + 1]; if ((secondByte & 192) === 128) { tempCodePoint = (firstByte & 31) << 6 | secondByte & 63; if (tempCodePoint > 127) { codePoint = tempCodePoint; } } break; case 3: secondByte = buf[i + 1]; thirdByte = buf[i + 2]; if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) { tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63; if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) { codePoint = tempCodePoint; } } break; case 4: secondByte = buf[i + 1]; thirdByte = buf[i + 2]; fourthByte = buf[i + 3]; if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) { tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63; if (tempCodePoint > 65535 && tempCodePoint < 1114112) { codePoint = tempCodePoint; } } } } if (codePoint === null) { codePoint = 65533; bytesPerSequence = 1; } else if (codePoint > 65535) { codePoint -= 65536; res.push(codePoint >>> 10 & 1023 | 55296); codePoint = 56320 | codePoint & 1023; } res.push(codePoint); i += bytesPerSequence; } return decodeCodePointsArray(res); } var MAX_ARGUMENTS_LENGTH = 4096; function decodeCodePointsArray(codePoints) { var len = codePoints.length; if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints); } var res = ""; var i = 0; while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ); } return res; } function asciiSlice(buf, start2, end2) { var ret = ""; end2 = Math.min(buf.length, end2); for (var i = start2; i < end2; ++i) { ret += String.fromCharCode(buf[i] & 127); } return ret; } function latin1Slice(buf, start2, end2) { var ret = ""; end2 = Math.min(buf.length, end2); for (var i = start2; i < end2; ++i) { ret += String.fromCharCode(buf[i]); } return ret; } function hexSlice(buf, start2, end2) { var len = buf.length; if (!start2 || start2 < 0) start2 = 0; if (!end2 || end2 < 0 || end2 > len) end2 = len; var out = ""; for (var i = start2; i < end2; ++i) { out += hexSliceLookupTable[buf[i]]; } return out; } function utf16leSlice(buf, start2, end2) { var bytes = buf.slice(start2, end2); var res = ""; for (var i = 0; i < bytes.length - 1; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); } return res; } Buffer2.prototype.slice = function slice(start2, end2) { var len = this.length; start2 = ~~start2; end2 = end2 === void 0 ? len : ~~end2; if (start2 < 0) { start2 += len; if (start2 < 0) start2 = 0; } else if (start2 > len) { start2 = len; } if (end2 < 0) { end2 += len; if (end2 < 0) end2 = 0; } else if (end2 > len) { end2 = len; } if (end2 < start2) end2 = start2; var newBuf = this.subarray(start2, end2); Object.setPrototypeOf(newBuf, Buffer2.prototype); return newBuf; }; function checkOffset(offset4, ext, length) { if (offset4 % 1 !== 0 || offset4 < 0) throw new RangeError("offset is not uint"); if (offset4 + ext > length) throw new RangeError("Trying to access beyond buffer length"); } Buffer2.prototype.readUintLE = Buffer2.prototype.readUIntLE = function readUIntLE(offset4, byteLength2, noAssert) { offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) checkOffset(offset4, byteLength2, this.length); var val = this[offset4]; var mul = 1; var i = 0; while (++i < byteLength2 && (mul *= 256)) { val += this[offset4 + i] * mul; } return val; }; Buffer2.prototype.readUintBE = Buffer2.prototype.readUIntBE = function readUIntBE(offset4, byteLength2, noAssert) { offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) { checkOffset(offset4, byteLength2, this.length); } var val = this[offset4 + --byteLength2]; var mul = 1; while (byteLength2 > 0 && (mul *= 256)) { val += this[offset4 + --byteLength2] * mul; } return val; }; Buffer2.prototype.readUint8 = Buffer2.prototype.readUInt8 = function readUInt8(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 1, this.length); return this[offset4]; }; Buffer2.prototype.readUint16LE = Buffer2.prototype.readUInt16LE = function readUInt16LE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 2, this.length); return this[offset4] | this[offset4 + 1] << 8; }; Buffer2.prototype.readUint16BE = Buffer2.prototype.readUInt16BE = function readUInt16BE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 2, this.length); return this[offset4] << 8 | this[offset4 + 1]; }; Buffer2.prototype.readUint32LE = Buffer2.prototype.readUInt32LE = function readUInt32LE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return (this[offset4] | this[offset4 + 1] << 8 | this[offset4 + 2] << 16) + this[offset4 + 3] * 16777216; }; Buffer2.prototype.readUint32BE = Buffer2.prototype.readUInt32BE = function readUInt32BE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return this[offset4] * 16777216 + (this[offset4 + 1] << 16 | this[offset4 + 2] << 8 | this[offset4 + 3]); }; Buffer2.prototype.readIntLE = function readIntLE(offset4, byteLength2, noAssert) { offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) checkOffset(offset4, byteLength2, this.length); var val = this[offset4]; var mul = 1; var i = 0; while (++i < byteLength2 && (mul *= 256)) { val += this[offset4 + i] * mul; } mul *= 128; if (val >= mul) val -= Math.pow(2, 8 * byteLength2); return val; }; Buffer2.prototype.readIntBE = function readIntBE(offset4, byteLength2, noAssert) { offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) checkOffset(offset4, byteLength2, this.length); var i = byteLength2; var mul = 1; var val = this[offset4 + --i]; while (i > 0 && (mul *= 256)) { val += this[offset4 + --i] * mul; } mul *= 128; if (val >= mul) val -= Math.pow(2, 8 * byteLength2); return val; }; Buffer2.prototype.readInt8 = function readInt8(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 1, this.length); if (!(this[offset4] & 128)) return this[offset4]; return (255 - this[offset4] + 1) * -1; }; Buffer2.prototype.readInt16LE = function readInt16LE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 2, this.length); var val = this[offset4] | this[offset4 + 1] << 8; return val & 32768 ? val | 4294901760 : val; }; Buffer2.prototype.readInt16BE = function readInt16BE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 2, this.length); var val = this[offset4 + 1] | this[offset4] << 8; return val & 32768 ? val | 4294901760 : val; }; Buffer2.prototype.readInt32LE = function readInt32LE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return this[offset4] | this[offset4 + 1] << 8 | this[offset4 + 2] << 16 | this[offset4 + 3] << 24; }; Buffer2.prototype.readInt32BE = function readInt32BE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return this[offset4] << 24 | this[offset4 + 1] << 16 | this[offset4 + 2] << 8 | this[offset4 + 3]; }; Buffer2.prototype.readFloatLE = function readFloatLE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return ieee754.read(this, offset4, true, 23, 4); }; Buffer2.prototype.readFloatBE = function readFloatBE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 4, this.length); return ieee754.read(this, offset4, false, 23, 4); }; Buffer2.prototype.readDoubleLE = function readDoubleLE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 8, this.length); return ieee754.read(this, offset4, true, 52, 8); }; Buffer2.prototype.readDoubleBE = function readDoubleBE(offset4, noAssert) { offset4 = offset4 >>> 0; if (!noAssert) checkOffset(offset4, 8, this.length); return ieee754.read(this, offset4, false, 52, 8); }; function checkInt(buf, value, offset4, ext, max3, min3) { if (!Buffer2.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance'); if (value > max3 || value < min3) throw new RangeError('"value" argument is out of bounds'); if (offset4 + ext > buf.length) throw new RangeError("Index out of range"); } Buffer2.prototype.writeUintLE = Buffer2.prototype.writeUIntLE = function writeUIntLE(value, offset4, byteLength2, noAssert) { value = +value; offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength2) - 1; checkInt(this, value, offset4, byteLength2, maxBytes, 0); } var mul = 1; var i = 0; this[offset4] = value & 255; while (++i < byteLength2 && (mul *= 256)) { this[offset4 + i] = value / mul & 255; } return offset4 + byteLength2; }; Buffer2.prototype.writeUintBE = Buffer2.prototype.writeUIntBE = function writeUIntBE(value, offset4, byteLength2, noAssert) { value = +value; offset4 = offset4 >>> 0; byteLength2 = byteLength2 >>> 0; if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength2) - 1; checkInt(this, value, offset4, byteLength2, maxBytes, 0); } var i = byteLength2 - 1; var mul = 1; this[offset4 + i] = value & 255; while (--i >= 0 && (mul *= 256)) { this[offset4 + i] = value / mul & 255; } return offset4 + byteLength2; }; Buffer2.prototype.writeUint8 = Buffer2.prototype.writeUInt8 = function writeUInt8(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 1, 255, 0); this[offset4] = value & 255; return offset4 + 1; }; Buffer2.prototype.writeUint16LE = Buffer2.prototype.writeUInt16LE = function writeUInt16LE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 2, 65535, 0); this[offset4] = value & 255; this[offset4 + 1] = value >>> 8; return offset4 + 2; }; Buffer2.prototype.writeUint16BE = Buffer2.prototype.writeUInt16BE = function writeUInt16BE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 2, 65535, 0); this[offset4] = value >>> 8; this[offset4 + 1] = value & 255; return offset4 + 2; }; Buffer2.prototype.writeUint32LE = Buffer2.prototype.writeUInt32LE = function writeUInt32LE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 4, 4294967295, 0); this[offset4 + 3] = value >>> 24; this[offset4 + 2] = value >>> 16; this[offset4 + 1] = value >>> 8; this[offset4] = value & 255; return offset4 + 4; }; Buffer2.prototype.writeUint32BE = Buffer2.prototype.writeUInt32BE = function writeUInt32BE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 4, 4294967295, 0); this[offset4] = value >>> 24; this[offset4 + 1] = value >>> 16; this[offset4 + 2] = value >>> 8; this[offset4 + 3] = value & 255; return offset4 + 4; }; Buffer2.prototype.writeIntLE = function writeIntLE(value, offset4, byteLength2, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) { var limit = Math.pow(2, 8 * byteLength2 - 1); checkInt(this, value, offset4, byteLength2, limit - 1, -limit); } var i = 0; var mul = 1; var sub = 0; this[offset4] = value & 255; while (++i < byteLength2 && (mul *= 256)) { if (value < 0 && sub === 0 && this[offset4 + i - 1] !== 0) { sub = 1; } this[offset4 + i] = (value / mul >> 0) - sub & 255; } return offset4 + byteLength2; }; Buffer2.prototype.writeIntBE = function writeIntBE(value, offset4, byteLength2, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) { var limit = Math.pow(2, 8 * byteLength2 - 1); checkInt(this, value, offset4, byteLength2, limit - 1, -limit); } var i = byteLength2 - 1; var mul = 1; var sub = 0; this[offset4 + i] = value & 255; while (--i >= 0 && (mul *= 256)) { if (value < 0 && sub === 0 && this[offset4 + i + 1] !== 0) { sub = 1; } this[offset4 + i] = (value / mul >> 0) - sub & 255; } return offset4 + byteLength2; }; Buffer2.prototype.writeInt8 = function writeInt8(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 1, 127, -128); if (value < 0) value = 255 + value + 1; this[offset4] = value & 255; return offset4 + 1; }; Buffer2.prototype.writeInt16LE = function writeInt16LE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 2, 32767, -32768); this[offset4] = value & 255; this[offset4 + 1] = value >>> 8; return offset4 + 2; }; Buffer2.prototype.writeInt16BE = function writeInt16BE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 2, 32767, -32768); this[offset4] = value >>> 8; this[offset4 + 1] = value & 255; return offset4 + 2; }; Buffer2.prototype.writeInt32LE = function writeInt32LE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 4, 2147483647, -2147483648); this[offset4] = value & 255; this[offset4 + 1] = value >>> 8; this[offset4 + 2] = value >>> 16; this[offset4 + 3] = value >>> 24; return offset4 + 4; }; Buffer2.prototype.writeInt32BE = function writeInt32BE(value, offset4, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) checkInt(this, value, offset4, 4, 2147483647, -2147483648); if (value < 0) value = 4294967295 + value + 1; this[offset4] = value >>> 24; this[offset4 + 1] = value >>> 16; this[offset4 + 2] = value >>> 8; this[offset4 + 3] = value & 255; return offset4 + 4; }; function checkIEEE754(buf, value, offset4, ext, max3, min3) { if (offset4 + ext > buf.length) throw new RangeError("Index out of range"); if (offset4 < 0) throw new RangeError("Index out of range"); } function writeFloat(buf, value, offset4, littleEndian, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) { checkIEEE754(buf, value, offset4, 4, 34028234663852886e22, -34028234663852886e22); } ieee754.write(buf, value, offset4, littleEndian, 23, 4); return offset4 + 4; } Buffer2.prototype.writeFloatLE = function writeFloatLE(value, offset4, noAssert) { return writeFloat(this, value, offset4, true, noAssert); }; Buffer2.prototype.writeFloatBE = function writeFloatBE(value, offset4, noAssert) { return writeFloat(this, value, offset4, false, noAssert); }; function writeDouble(buf, value, offset4, littleEndian, noAssert) { value = +value; offset4 = offset4 >>> 0; if (!noAssert) { checkIEEE754(buf, value, offset4, 8, 17976931348623157e292, -17976931348623157e292); } ieee754.write(buf, value, offset4, littleEndian, 52, 8); return offset4 + 8; } Buffer2.prototype.writeDoubleLE = function writeDoubleLE(value, offset4, noAssert) { return writeDouble(this, value, offset4, true, noAssert); }; Buffer2.prototype.writeDoubleBE = function writeDoubleBE(value, offset4, noAssert) { return writeDouble(this, value, offset4, false, noAssert); }; Buffer2.prototype.copy = function copy(target, targetStart, start2, end2) { if (!Buffer2.isBuffer(target)) throw new TypeError("argument should be a Buffer"); if (!start2) start2 = 0; if (!end2 && end2 !== 0) end2 = this.length; if (targetStart >= target.length) targetStart = target.length; if (!targetStart) targetStart = 0; if (end2 > 0 && end2 < start2) end2 = start2; if (end2 === start2) return 0; if (target.length === 0 || this.length === 0) return 0; if (targetStart < 0) { throw new RangeError("targetStart out of bounds"); } if (start2 < 0 || start2 >= this.length) throw new RangeError("Index out of range"); if (end2 < 0) throw new RangeError("sourceEnd out of bounds"); if (end2 > this.length) end2 = this.length; if (target.length - targetStart < end2 - start2) { end2 = target.length - targetStart + start2; } var len = end2 - start2; if (this === target && typeof Uint8Array.prototype.copyWithin === "function") { this.copyWithin(targetStart, start2, end2); } else { Uint8Array.prototype.set.call( target, this.subarray(start2, end2), targetStart ); } return len; }; Buffer2.prototype.fill = function fill(val, start2, end2, encoding) { if (typeof val === "string") { if (typeof start2 === "string") { encoding = start2; start2 = 0; end2 = this.length; } else if (typeof end2 === "string") { encoding = end2; end2 = this.length; } if (encoding !== void 0 && typeof encoding !== "string") { throw new TypeError("encoding must be a string"); } if (typeof encoding === "string" && !Buffer2.isEncoding(encoding)) { throw new TypeError("Unknown encoding: " + encoding); } if (val.length === 1) { var code = val.charCodeAt(0); if (encoding === "utf8" && code < 128 || encoding === "latin1") { val = code; } } } else if (typeof val === "number") { val = val & 255; } else if (typeof val === "boolean") { val = Number(val); } if (start2 < 0 || this.length < start2 || this.length < end2) { throw new RangeError("Out of range index"); } if (end2 <= start2) { return this; } start2 = start2 >>> 0; end2 = end2 === void 0 ? this.length : end2 >>> 0; if (!val) val = 0; var i; if (typeof val === "number") { for (i = start2; i < end2; ++i) { this[i] = val; } } else { var bytes = Buffer2.isBuffer(val) ? val : Buffer2.from(val, encoding); var len = bytes.length; if (len === 0) { throw new TypeError('The value "' + val + '" is invalid for argument "value"'); } for (i = 0; i < end2 - start2; ++i) { this[i + start2] = bytes[i % len]; } } return this; }; var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; function base64clean(str) { str = str.split("=")[0]; str = str.trim().replace(INVALID_BASE64_RE, ""); if (str.length < 2) return ""; while (str.length % 4 !== 0) { str = str + "="; } return str; } function utf8ToBytes(string, units) { units = units || Infinity; var codePoint; var length = string.length; var leadSurrogate = null; var bytes = []; for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i); if (codePoint > 55295 && codePoint < 57344) { if (!leadSurrogate) { if (codePoint > 56319) { if ((units -= 3) > -1) bytes.push(239, 191, 189); continue; } else if (i + 1 === length) { if ((units -= 3) > -1) bytes.push(239, 191, 189); continue; } leadSurrogate = codePoint; continue; } if (codePoint < 56320) { if ((units -= 3) > -1) bytes.push(239, 191, 189); leadSurrogate = codePoint; continue; } codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536; } else if (leadSurrogate) { if ((units -= 3) > -1) bytes.push(239, 191, 189); } leadSurrogate = null; if (codePoint < 128) { if ((units -= 1) < 0) break; bytes.push(codePoint); } else if (codePoint < 2048) { if ((units -= 2) < 0) break; bytes.push( codePoint >> 6 | 192, codePoint & 63 | 128 ); } else if (codePoint < 65536) { if ((units -= 3) < 0) break; bytes.push( codePoint >> 12 | 224, codePoint >> 6 & 63 | 128, codePoint & 63 | 128 ); } else if (codePoint < 1114112) { if ((units -= 4) < 0) break; bytes.push( codePoint >> 18 | 240, codePoint >> 12 & 63 | 128, codePoint >> 6 & 63 | 128, codePoint & 63 | 128 ); } else { throw new Error("Invalid code point"); } } return bytes; } function asciiToBytes(str) { var byteArray = []; for (var i = 0; i < str.length; ++i) { byteArray.push(str.charCodeAt(i) & 255); } return byteArray; } function utf16leToBytes(str, units) { var c, hi, lo; var byteArray = []; for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break; c = str.charCodeAt(i); hi = c >> 8; lo = c % 256; byteArray.push(lo); byteArray.push(hi); } return byteArray; } function base64ToBytes(str) { return base64.toByteArray(base64clean(str)); } function blitBuffer(src, dst, offset4, length) { for (var i = 0; i < length; ++i) { if (i + offset4 >= dst.length || i >= src.length) break; dst[i + offset4] = src[i]; } return i; } function isInstance2(obj, type3) { return obj instanceof type3 || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type3.name; } function numberIsNaN(obj) { return obj !== obj; } var hexSliceLookupTable = function() { var alphabet = "0123456789abcdef"; var table = new Array(256); for (var i = 0; i < 16; ++i) { var i16 = i * 16; for (var j = 0; j < 16; ++j) { table[i16 + j] = alphabet[i] + alphabet[j]; } } return table; }(); } }); // node_modules/.pnpm/@peculiar+webcrypto@1.5.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js var webcrypto_es_exports = {}; __export(webcrypto_es_exports, { Crypto: () => Crypto2, CryptoKey: () => CryptoKey }); function getCryptoKey(key) { const res = keyStorage.get(key); if (!res) { throw new OperationError("Cannot get CryptoKey from secure storage"); } return res; } function setCryptoKey(value) { const key = CryptoKey.create(value.algorithm, value.type, value.extractable, value.usages); Object.freeze(key); keyStorage.set(key, value); return key; } function bitShiftLeft(buffer) { const shifted = import_buffer.Buffer.alloc(buffer.length); const last = buffer.length - 1; for (let index = 0; index < last; index++) { shifted[index] = buffer[index] << 1; if (buffer[index + 1] & 128) { shifted[index] += 1; } } shifted[last] = buffer[last] << 1; return shifted; } function xor(a2, b) { const length = Math.min(a2.length, b.length); const output = import_buffer.Buffer.alloc(length); for (let index = 0; index < length; index++) { output[index] = a2[index] ^ b[index]; } return output; } function aes(key, message) { const cipher = import_crypto.default.createCipheriv(`aes${key.length << 3}`, key, zero); const result = cipher.update(message); cipher.final(); return result; } function getMessageBlock(message, blockIndex) { const block = import_buffer.Buffer.alloc(blockSize); const start2 = blockIndex * blockSize; const end2 = start2 + blockSize; message.copy(block, 0, start2, end2); return block; } function getPaddedMessageBlock(message, blockIndex) { const block = import_buffer.Buffer.alloc(blockSize); const start2 = blockIndex * blockSize; const end2 = message.length; block.fill(0); message.copy(block, 0, start2, end2); block[end2 - start2] = 128; return block; } function generateSubkeys(key) { const l = aes(key, zero); let subkey1 = bitShiftLeft(l); if (l[0] & 128) { subkey1 = xor(subkey1, rb); } let subkey2 = bitShiftLeft(subkey1); if (subkey1[0] & 128) { subkey2 = xor(subkey2, rb); } return { subkey1, subkey2 }; } function aesCmac(key, message) { const subkeys = generateSubkeys(key); let blockCount = Math.ceil(message.length / blockSize); let lastBlockCompleteFlag; let lastBlock; if (blockCount === 0) { blockCount = 1; lastBlockCompleteFlag = false; } else { lastBlockCompleteFlag = message.length % blockSize === 0; } const lastBlockIndex = blockCount - 1; if (lastBlockCompleteFlag) { lastBlock = xor(getMessageBlock(message, lastBlockIndex), subkeys.subkey1); } else { lastBlock = xor(getPaddedMessageBlock(message, lastBlockIndex), subkeys.subkey2); } let x = zero; let y; for (let index = 0; index < lastBlockIndex; index++) { y = xor(x, getMessageBlock(message, index)); x = aes(key, y); } y = xor(lastBlock, x); return aes(key, y); } function getJwkAlgorithm(algorithm) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": { const mdSize = /(\d+)$/.exec(algorithm.hash.name)[1]; return `RSA-OAEP${mdSize !== "1" ? `-${mdSize}` : ""}`; } case "RSASSA-PKCS1-V1_5": return `RS${/(\d+)$/.exec(algorithm.hash.name)[1]}`; case "RSA-PSS": return `PS${/(\d+)$/.exec(algorithm.hash.name)[1]}`; case "RSA-PKCS1": return `RS1`; default: throw new OperationError("algorithm: Is not recognized"); } } function getOidByNamedCurve$1(namedCurve) { const oid = namedOIDs[namedCurve]; if (!oid) { throw new OperationError(`Cannot convert WebCrypto named curve '${namedCurve}' to OID`); } return oid; } function getOidByNamedCurve(namedCurve) { const oid = edOIDs[namedCurve.toLowerCase()]; if (!oid) { throw new OperationError(`Cannot convert WebCrypto named curve '${namedCurve}' to OID`); } return oid; } var import_buffer, import_crypto, process2, import_pvtsutils6, JsonBase64UrlConverter, CryptoKey2, SymmetricKey, AsymmetricKey, AesCryptoKey, AesCrypto, keyStorage, AesCbcProvider2, zero, rb, blockSize, AesCmacProvider2, AesCtrProvider2, AesGcmProvider2, AesKwProvider2, AesEcbProvider2, DesCryptoKey, DesCrypto, DesCbcProvider, DesEde3CbcProvider, RsaPrivateKey2, RsaPublicKey2, RsaCrypto, RsaSsaProvider2, RsaPssProvider2, ShaCrypto, RsaOaepProvider2, RsaEsProvider, namedOIDs, EcPrivateKey2, EcPublicKey3, Sha1Provider, Sha256Provider, Sha384Provider, Sha512Provider, Sha3256Provider, Sha3384Provider, Sha3512Provider, EcCrypto, EcdsaProvider2, EcdhProvider2, edOIDs, EdPrivateKey3, EdPublicKey3, EdCrypto, EdDsaProvider2, EcdhEsProvider2, Ed25519CryptoKey, Ed25519PrivateKey, Ed25519PublicKey, Ed25519Crypto, Ed25519Provider2, X25519Provider2, PbkdfCryptoKey, Pbkdf2Provider2, HmacCryptoKey, HmacProvider2, HkdfCryptoKey, HkdfProvider2, ShakeCrypto, Shake128Provider2, Shake256Provider2, SubtleCrypto2, Crypto2; var init_webcrypto_es = __esm({ "node_modules/.pnpm/@peculiar+webcrypto@1.5.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js"() { init_webcrypto_core_es(); init_webcrypto_core_es(); init_webcrypto_core_es(); import_buffer = __toESM(require_buffer()); import_crypto = __toESM(__require("crypto")); process2 = __toESM(__require("process")); init_tslib_es6(); init_index_es2(); import_pvtsutils6 = __toESM(require_build()); init_es2015(); JsonBase64UrlConverter = { fromJSON: (value) => import_buffer.Buffer.from(import_pvtsutils6.Convert.FromBase64Url(value)), toJSON: (value) => import_pvtsutils6.Convert.ToBase64Url(value) }; CryptoKey2 = class extends CryptoKey { constructor() { super(...arguments); this.data = import_buffer.Buffer.alloc(0); this.algorithm = { name: "" }; this.extractable = false; this.type = "secret"; this.usages = []; this.kty = "oct"; this.alg = ""; } }; __decorate([ JsonProp({ name: "ext", type: JsonPropTypes.Boolean, optional: true }) ], CryptoKey2.prototype, "extractable", void 0); __decorate([ JsonProp({ name: "key_ops", type: JsonPropTypes.String, repeated: true, optional: true }) ], CryptoKey2.prototype, "usages", void 0); __decorate([ JsonProp({ type: JsonPropTypes.String }) ], CryptoKey2.prototype, "kty", void 0); __decorate([ JsonProp({ type: JsonPropTypes.String, optional: true }) ], CryptoKey2.prototype, "alg", void 0); SymmetricKey = class extends CryptoKey2 { constructor() { super(...arguments); this.kty = "oct"; this.type = "secret"; } }; AsymmetricKey = class extends CryptoKey2 { }; AesCryptoKey = class extends SymmetricKey { get alg() { switch (this.algorithm.name.toUpperCase()) { case "AES-CBC": return `A${this.algorithm.length}CBC`; case "AES-CTR": return `A${this.algorithm.length}CTR`; case "AES-GCM": return `A${this.algorithm.length}GCM`; case "AES-KW": return `A${this.algorithm.length}KW`; case "AES-CMAC": return `A${this.algorithm.length}CMAC`; case "AES-ECB": return `A${this.algorithm.length}ECB`; default: throw new AlgorithmError("Unsupported algorithm name"); } } set alg(value) { } }; __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], AesCryptoKey.prototype, "data", void 0); AesCrypto = class { static async generateKey(algorithm, extractable, keyUsages) { const key = new AesCryptoKey(); key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; key.data = import_crypto.default.randomBytes(algorithm.length >> 3); return key; } static async exportKey(format2, key) { if (!(key instanceof AesCryptoKey)) { throw new Error("key: Is not AesCryptoKey"); } switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "raw": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { let key; switch (format2.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: AesCryptoKey }); break; case "raw": key = new AesCryptoKey(); key.data = import_buffer.Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = algorithm; key.algorithm.length = key.data.length << 3; key.extractable = extractable; key.usages = keyUsages; switch (key.algorithm.length) { case 128: case 192: case 256: break; default: throw new OperationError("keyData: Is wrong key length"); } return key; } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "AES-CBC": return this.encryptAesCBC(algorithm, key, import_buffer.Buffer.from(data)); case "AES-CTR": return this.encryptAesCTR(algorithm, key, import_buffer.Buffer.from(data)); case "AES-GCM": return this.encryptAesGCM(algorithm, key, import_buffer.Buffer.from(data)); case "AES-KW": return this.encryptAesKW(algorithm, key, import_buffer.Buffer.from(data)); case "AES-ECB": return this.encryptAesECB(algorithm, key, import_buffer.Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { if (!(key instanceof AesCryptoKey)) { throw new Error("key: Is not AesCryptoKey"); } switch (algorithm.name.toUpperCase()) { case "AES-CBC": return this.decryptAesCBC(algorithm, key, import_buffer.Buffer.from(data)); case "AES-CTR": return this.decryptAesCTR(algorithm, key, import_buffer.Buffer.from(data)); case "AES-GCM": return this.decryptAesGCM(algorithm, key, import_buffer.Buffer.from(data)); case "AES-KW": return this.decryptAesKW(algorithm, key, import_buffer.Buffer.from(data)); case "AES-ECB": return this.decryptAesECB(algorithm, key, import_buffer.Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async encryptAesCBC(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`aes-${key.algorithm.length}-cbc`, key.data, new Uint8Array(algorithm.iv)); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesCBC(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`aes-${key.algorithm.length}-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesCTR(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`aes-${key.algorithm.length}-ctr`, key.data, import_buffer.Buffer.from(algorithm.counter)); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesCTR(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`aes-${key.algorithm.length}-ctr`, key.data, new Uint8Array(algorithm.counter)); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesGCM(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`aes-${key.algorithm.length}-gcm`, key.data, import_buffer.Buffer.from(algorithm.iv), { authTagLength: (algorithm.tagLength || 128) >> 3 }); if (algorithm.additionalData) { cipher.setAAD(import_buffer.Buffer.from(algorithm.additionalData)); } let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final(), cipher.getAuthTag()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesGCM(algorithm, key, data) { const tagLength = (algorithm.tagLength || 128) >> 3; const decipher = import_crypto.default.createDecipheriv(`aes-${key.algorithm.length}-gcm`, key.data, new Uint8Array(algorithm.iv), { authTagLength: tagLength }); const enc = data.slice(0, data.length - tagLength); const tag = data.slice(data.length - tagLength); if (algorithm.additionalData) { decipher.setAAD(import_buffer.Buffer.from(algorithm.additionalData)); } decipher.setAuthTag(tag); let dec = decipher.update(enc); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesKW(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`id-aes${key.algorithm.length}-wrap`, key.data, this.AES_KW_IV); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); return new Uint8Array(enc).buffer; } static async decryptAesKW(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`id-aes${key.algorithm.length}-wrap`, key.data, this.AES_KW_IV); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesECB(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`aes-${key.algorithm.length}-ecb`, key.data, new Uint8Array(0)); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesECB(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`aes-${key.algorithm.length}-ecb`, key.data, new Uint8Array(0)); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } }; AesCrypto.AES_KW_IV = import_buffer.Buffer.from("A6A6A6A6A6A6A6A6", "hex"); keyStorage = /* @__PURE__ */ new WeakMap(); AesCbcProvider2 = class extends AesCbcProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; zero = import_buffer.Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); rb = import_buffer.Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135]); blockSize = 16; AesCmacProvider2 = class extends AesCmacProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(key); } async onSign(algorithm, key, data) { const result = aesCmac(getCryptoKey(key).data, import_buffer.Buffer.from(data)); return new Uint8Array(result).buffer; } async onVerify(algorithm, key, signature, data) { const signature2 = await this.sign(algorithm, key, data); return import_buffer.Buffer.from(signature).compare(import_buffer.Buffer.from(signature2)) === 0; } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; AesCtrProvider2 = class extends AesCtrProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; AesGcmProvider2 = class extends AesGcmProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; AesKwProvider2 = class extends AesKwProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const res = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(res); } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; AesEcbProvider2 = class extends AesEcbProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return AesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format2, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } }; DesCryptoKey = class extends SymmetricKey { get alg() { switch (this.algorithm.name.toUpperCase()) { case "DES-CBC": return `DES-CBC`; case "DES-EDE3-CBC": return `3DES-CBC`; default: throw new AlgorithmError("Unsupported algorithm name"); } } set alg(value) { } }; __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], DesCryptoKey.prototype, "data", void 0); DesCrypto = class { static async generateKey(algorithm, extractable, keyUsages) { const key = new DesCryptoKey(); key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; key.data = import_crypto.default.randomBytes(algorithm.length >> 3); return key; } static async exportKey(format2, key) { switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "raw": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { let key; switch (format2.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: DesCryptoKey }); break; case "raw": key = new DesCryptoKey(); key.data = import_buffer.Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; return key; } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "DES-CBC": return this.encryptDesCBC(algorithm, key, import_buffer.Buffer.from(data)); case "DES-EDE3-CBC": return this.encryptDesEDE3CBC(algorithm, key, import_buffer.Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { if (!(key instanceof DesCryptoKey)) { throw new Error("key: Is not DesCryptoKey"); } switch (algorithm.name.toUpperCase()) { case "DES-CBC": return this.decryptDesCBC(algorithm, key, import_buffer.Buffer.from(data)); case "DES-EDE3-CBC": return this.decryptDesEDE3CBC(algorithm, key, import_buffer.Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async encryptDesCBC(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`des-cbc`, key.data, new Uint8Array(algorithm.iv)); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptDesCBC(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`des-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptDesEDE3CBC(algorithm, key, data) { const cipher = import_crypto.default.createCipheriv(`des-ede3-cbc`, key.data, import_buffer.Buffer.from(algorithm.iv)); let enc = cipher.update(data); enc = import_buffer.Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptDesEDE3CBC(algorithm, key, data) { const decipher = import_crypto.default.createDecipheriv(`des-ede3-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = import_buffer.Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } }; DesCbcProvider = class extends DesProvider { constructor() { super(...arguments); this.keySizeBits = 64; this.ivSize = 8; this.name = "DES-CBC"; } async onGenerateKey(algorithm, extractable, keyUsages) { const key = await DesCrypto.generateKey({ name: this.name, length: this.keySizeBits }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return DesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return DesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return DesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await DesCrypto.importKey(format2, keyData, { name: this.name, length: this.keySizeBits }, extractable, keyUsages); if (key.data.length !== this.keySizeBits >> 3) { throw new OperationError("keyData: Wrong key size"); } return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof DesCryptoKey)) { throw new TypeError("key: Is not a DesCryptoKey"); } } }; DesEde3CbcProvider = class extends DesProvider { constructor() { super(...arguments); this.keySizeBits = 192; this.ivSize = 8; this.name = "DES-EDE3-CBC"; } async onGenerateKey(algorithm, extractable, keyUsages) { const key = await DesCrypto.generateKey({ name: this.name, length: this.keySizeBits }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return DesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return DesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format2, key) { return DesCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await DesCrypto.importKey(format2, keyData, { name: this.name, length: this.keySizeBits }, extractable, keyUsages); if (key.data.length !== this.keySizeBits >> 3) { throw new OperationError("keyData: Wrong key size"); } return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof DesCryptoKey)) { throw new TypeError("key: Is not a DesCryptoKey"); } } }; RsaPrivateKey2 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.RsaPrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "RSA", alg: getJwkAlgorithm(this.algorithm), key_ops: this.usages, ext: this.extractable }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { const key = JsonParser.fromJSON(json, { targetSchema: index$1.RsaPrivateKey }); const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.privateKeyAlgorithm.parameters = null; keyInfo.privateKey = AsnSerializer.serialize(key); this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); } }; RsaPublicKey2 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return AsnParser.parse(keyInfo.publicKey, index$1.RsaPublicKey); } toJSON() { const key = this.getKey(); const json = { kty: "RSA", alg: getJwkAlgorithm(this.algorithm), key_ops: this.usages, ext: this.extractable }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { const key = JsonParser.fromJSON(json, { targetSchema: index$1.RsaPublicKey }); const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.publicKeyAlgorithm.parameters = null; keyInfo.publicKey = AsnSerializer.serialize(key); this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); } }; RsaCrypto = class { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new RsaPrivateKey2(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new RsaPublicKey2(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const publicExponent = import_buffer.Buffer.concat([ import_buffer.Buffer.alloc(4 - algorithm.publicExponent.byteLength, 0), import_buffer.Buffer.from(algorithm.publicExponent) ]).readInt32BE(0); const keys = import_crypto.default.generateKeyPairSync("rsa", { modulusLength: algorithm.modulusLength, publicExponent, publicKeyEncoding: { format: "der", type: "spki" }, privateKeyEncoding: { format: "der", type: "pkcs8" } }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey }; return res; } static async exportKey(format2, key) { switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'"); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { switch (format2.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.RsaPrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.RsaPublicKey }); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); const asnKey = AsnParser.parse(keyInfo.publicKey, index$1.RsaPublicKey); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.RsaPrivateKey); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'"); } } static async sign(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-PSS": case "RSASSA-PKCS1-V1_5": return this.signRsa(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static async verify(algorithm, key, signature, data) { switch (algorithm.name.toUpperCase()) { case "RSA-PSS": case "RSASSA-PKCS1-V1_5": return this.verifySSA(algorithm, key, data, signature); default: throw new OperationError("algorithm: Is not recognized"); } } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": return this.encryptOAEP(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": return this.decryptOAEP(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.privateKeyAlgorithm.parameters = null; keyInfo.privateKey = AsnSerializer.serialize(asnKey); const key = new RsaPrivateKey2(); key.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.algorithm.publicExponent = new Uint8Array(asnKey.publicExponent); key.algorithm.modulusLength = asnKey.modulus.byteLength << 3; key.extractable = extractable; key.usages = keyUsages; return key; } static importPublicKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.publicKeyAlgorithm.parameters = null; keyInfo.publicKey = AsnSerializer.serialize(asnKey); const key = new RsaPublicKey2(); key.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.algorithm.publicExponent = new Uint8Array(asnKey.publicExponent); key.algorithm.modulusLength = asnKey.modulus.byteLength << 3; key.extractable = extractable; key.usages = keyUsages; return key; } static getCryptoAlgorithm(alg) { switch (alg.hash.name.toUpperCase()) { case "SHA-1": return "RSA-SHA1"; case "SHA-256": return "RSA-SHA256"; case "SHA-384": return "RSA-SHA384"; case "SHA-512": return "RSA-SHA512"; case "SHA3-256": return "RSA-SHA3-256"; case "SHA3-384": return "RSA-SHA3-384"; case "SHA3-512": return "RSA-SHA3-512"; default: throw new OperationError("algorithm.hash: Is not recognized"); } } static signRsa(algorithm, key, data) { const cryptoAlg = this.getCryptoAlgorithm(key.algorithm); const signer = import_crypto.default.createSign(cryptoAlg); signer.update(import_buffer.Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY----- ${key.data.toString("base64")} -----END PRIVATE KEY-----`; } const options2 = { key: key.pem }; if (algorithm.name.toUpperCase() === "RSA-PSS") { options2.padding = import_crypto.default.constants.RSA_PKCS1_PSS_PADDING; options2.saltLength = algorithm.saltLength; } const signature = signer.sign(options2); return new Uint8Array(signature).buffer; } static verifySSA(algorithm, key, data, signature) { const cryptoAlg = this.getCryptoAlgorithm(key.algorithm); const signer = import_crypto.default.createVerify(cryptoAlg); signer.update(import_buffer.Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY----- ${key.data.toString("base64")} -----END PUBLIC KEY-----`; } const options2 = { key: key.pem }; if (algorithm.name.toUpperCase() === "RSA-PSS") { options2.padding = import_crypto.default.constants.RSA_PKCS1_PSS_PADDING; options2.saltLength = algorithm.saltLength; } const ok = signer.verify(options2, signature); return ok; } static encryptOAEP(algorithm, key, data) { const options2 = { key: `-----BEGIN PUBLIC KEY----- ${key.data.toString("base64")} -----END PUBLIC KEY-----`, padding: import_crypto.default.constants.RSA_PKCS1_OAEP_PADDING }; if (algorithm.label) ; return new Uint8Array(import_crypto.default.publicEncrypt(options2, data)).buffer; } static decryptOAEP(algorithm, key, data) { const options2 = { key: `-----BEGIN PRIVATE KEY----- ${key.data.toString("base64")} -----END PRIVATE KEY-----`, padding: import_crypto.default.constants.RSA_PKCS1_OAEP_PADDING }; if (algorithm.label) ; return new Uint8Array(import_crypto.default.privateDecrypt(options2, data)).buffer; } }; RsaCrypto.publicKeyUsages = ["verify", "encrypt", "wrapKey"]; RsaCrypto.privateKeyUsages = ["sign", "decrypt", "unwrapKey"]; RsaSsaProvider2 = class extends RsaSsaProvider { constructor() { super(...arguments); this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onSign(algorithm, key, data) { return RsaCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return RsaCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format2, key) { return RsaCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey2 || internalKey instanceof RsaPublicKey2)) { throw new TypeError("key: Is not RSA CryptoKey"); } } }; RsaPssProvider2 = class extends RsaPssProvider { constructor() { super(...arguments); this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onSign(algorithm, key, data) { return RsaCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return RsaCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format2, key) { return RsaCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey2 || internalKey instanceof RsaPublicKey2)) { throw new TypeError("key: Is not RSA CryptoKey"); } } }; ShaCrypto = class { static size(algorithm) { switch (algorithm.name.toUpperCase()) { case "SHA-1": return 160; case "SHA-256": case "SHA3-256": return 256; case "SHA-384": case "SHA3-384": return 384; case "SHA-512": case "SHA3-512": return 512; default: throw new Error("Unrecognized name"); } } static getAlgorithmName(algorithm) { switch (algorithm.name.toUpperCase()) { case "SHA-1": return "sha1"; case "SHA-256": return "sha256"; case "SHA-384": return "sha384"; case "SHA-512": return "sha512"; case "SHA3-256": return "sha3-256"; case "SHA3-384": return "sha3-384"; case "SHA3-512": return "sha3-512"; default: throw new Error("Unrecognized name"); } } static digest(algorithm, data) { const hashAlg = this.getAlgorithmName(algorithm); const hash3 = import_crypto.default.createHash(hashAlg).update(import_buffer.Buffer.from(data)).digest(); return new Uint8Array(hash3).buffer; } }; RsaOaepProvider2 = class extends RsaOaepProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onEncrypt(algorithm, key, data) { const internalKey = getCryptoKey(key); const dataView = new Uint8Array(data); const keySize = Math.ceil(internalKey.algorithm.modulusLength >> 3); const hashSize = ShaCrypto.size(internalKey.algorithm.hash) >> 3; const dataLength = dataView.byteLength; const psLength = keySize - dataLength - 2 * hashSize - 2; if (dataLength > keySize - 2 * hashSize - 2) { throw new Error("Data too large"); } const message = new Uint8Array(keySize); const seed = message.subarray(1, hashSize + 1); const dataBlock = message.subarray(hashSize + 1); dataBlock.set(dataView, hashSize + psLength + 1); const labelHash = import_crypto.default.createHash(internalKey.algorithm.hash.name.replace("-", "")).update(import_pvtsutils5.BufferSourceConverter.toUint8Array(algorithm.label || new Uint8Array(0))).digest(); dataBlock.set(labelHash, 0); dataBlock[hashSize + psLength] = 1; import_crypto.default.randomFillSync(seed); const dataBlockMask = this.mgf1(internalKey.algorithm.hash, seed, dataBlock.length); for (let i = 0; i < dataBlock.length; i++) { dataBlock[i] ^= dataBlockMask[i]; } const seedMask = this.mgf1(internalKey.algorithm.hash, dataBlock, seed.length); for (let i = 0; i < seed.length; i++) { seed[i] ^= seedMask[i]; } if (!internalKey.pem) { internalKey.pem = `-----BEGIN PUBLIC KEY----- ${internalKey.data.toString("base64")} -----END PUBLIC KEY-----`; } const pkcs0 = import_crypto.default.publicEncrypt({ key: internalKey.pem, padding: import_crypto.default.constants.RSA_NO_PADDING }, import_buffer.Buffer.from(message)); return new Uint8Array(pkcs0).buffer; } async onDecrypt(algorithm, key, data) { const internalKey = getCryptoKey(key); const keySize = Math.ceil(internalKey.algorithm.modulusLength >> 3); const hashSize = ShaCrypto.size(internalKey.algorithm.hash) >> 3; const dataLength = data.byteLength; if (dataLength !== keySize) { throw new Error("Bad data"); } if (!internalKey.pem) { internalKey.pem = `-----BEGIN PRIVATE KEY----- ${internalKey.data.toString("base64")} -----END PRIVATE KEY-----`; } let pkcs0 = import_crypto.default.privateDecrypt({ key: internalKey.pem, padding: import_crypto.default.constants.RSA_NO_PADDING }, import_buffer.Buffer.from(data)); const z = pkcs0[0]; const seed = pkcs0.subarray(1, hashSize + 1); const dataBlock = pkcs0.subarray(hashSize + 1); if (z !== 0) { throw new Error("Decryption failed"); } const seedMask = this.mgf1(internalKey.algorithm.hash, dataBlock, seed.length); for (let i = 0; i < seed.length; i++) { seed[i] ^= seedMask[i]; } const dataBlockMask = this.mgf1(internalKey.algorithm.hash, seed, dataBlock.length); for (let i = 0; i < dataBlock.length; i++) { dataBlock[i] ^= dataBlockMask[i]; } const labelHash = import_crypto.default.createHash(internalKey.algorithm.hash.name.replace("-", "")).update(import_pvtsutils5.BufferSourceConverter.toUint8Array(algorithm.label || new Uint8Array(0))).digest(); for (let i = 0; i < hashSize; i++) { if (labelHash[i] !== dataBlock[i]) { throw new Error("Decryption failed"); } } let psEnd = hashSize; for (; psEnd < dataBlock.length; psEnd++) { const psz = dataBlock[psEnd]; if (psz === 1) { break; } if (psz !== 0) { throw new Error("Decryption failed"); } } if (psEnd === dataBlock.length) { throw new Error("Decryption failed"); } pkcs0 = dataBlock.subarray(psEnd + 1); return new Uint8Array(pkcs0).buffer; } async onExportKey(format2, key) { return RsaCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey2 || internalKey instanceof RsaPublicKey2)) { throw new TypeError("key: Is not RSA CryptoKey"); } } mgf1(algorithm, seed, length = 0) { const hashSize = ShaCrypto.size(algorithm) >> 3; const mask = new Uint8Array(length); const counter = new Uint8Array(4); const chunks = Math.ceil(length / hashSize); for (let i = 0; i < chunks; i++) { counter[0] = i >>> 24; counter[1] = i >>> 16 & 255; counter[2] = i >>> 8 & 255; counter[3] = i & 255; const submask = mask.subarray(i * hashSize); let chunk = import_crypto.default.createHash(algorithm.name.replace("-", "")).update(seed).update(counter).digest(); if (chunk.length > submask.length) { chunk = chunk.subarray(0, submask.length); } submask.set(chunk); } return mask; } }; RsaEsProvider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "RSAES-PKCS1-v1_5"; this.usages = { publicKey: ["encrypt", "wrapKey"], privateKey: ["decrypt", "unwrapKey"] }; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "publicExponent"); if (!(algorithm.publicExponent && algorithm.publicExponent instanceof Uint8Array)) { throw new TypeError("publicExponent: Missing or not a Uint8Array"); } const publicExponent = import_pvtsutils6.Convert.ToBase64(algorithm.publicExponent); if (!(publicExponent === "Aw==" || publicExponent === "AQAB")) { throw new TypeError("publicExponent: Must be [3] or [1,0,1]"); } this.checkRequiredProperty(algorithm, "modulusLength"); switch (algorithm.modulusLength) { case 1024: case 2048: case 4096: break; default: throw new TypeError("modulusLength: Must be 1024, 2048, or 4096"); } } async onEncrypt(algorithm, key, data) { const options2 = this.toCryptoOptions(key); const enc = import_crypto.default.publicEncrypt(options2, new Uint8Array(data)); return new Uint8Array(enc).buffer; } async onDecrypt(algorithm, key, data) { const options2 = this.toCryptoOptions(key); const dec = import_crypto.default.privateDecrypt(options2, new Uint8Array(data)); return new Uint8Array(dec).buffer; } async onExportKey(format2, key) { return RsaCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey2 || internalKey instanceof RsaPublicKey2)) { throw new TypeError("key: Is not RSA CryptoKey"); } } toCryptoOptions(key) { const type3 = key.type.toUpperCase(); return { key: `-----BEGIN ${type3} KEY----- ${getCryptoKey(key).data.toString("base64")} -----END ${type3} KEY-----`, padding: import_crypto.default.constants.RSA_PKCS1_PADDING }; } }; namedOIDs = { "1.2.840.10045.3.1.7": "P-256", "P-256": "1.2.840.10045.3.1.7", "1.3.132.0.34": "P-384", "P-384": "1.3.132.0.34", "1.3.132.0.35": "P-521", "P-521": "1.3.132.0.35", "1.3.132.0.10": "K-256", "K-256": "1.3.132.0.10", "brainpoolP160r1": "1.3.36.3.3.2.8.1.1.1", "1.3.36.3.3.2.8.1.1.1": "brainpoolP160r1", "brainpoolP160t1": "1.3.36.3.3.2.8.1.1.2", "1.3.36.3.3.2.8.1.1.2": "brainpoolP160t1", "brainpoolP192r1": "1.3.36.3.3.2.8.1.1.3", "1.3.36.3.3.2.8.1.1.3": "brainpoolP192r1", "brainpoolP192t1": "1.3.36.3.3.2.8.1.1.4", "1.3.36.3.3.2.8.1.1.4": "brainpoolP192t1", "brainpoolP224r1": "1.3.36.3.3.2.8.1.1.5", "1.3.36.3.3.2.8.1.1.5": "brainpoolP224r1", "brainpoolP224t1": "1.3.36.3.3.2.8.1.1.6", "1.3.36.3.3.2.8.1.1.6": "brainpoolP224t1", "brainpoolP256r1": "1.3.36.3.3.2.8.1.1.7", "1.3.36.3.3.2.8.1.1.7": "brainpoolP256r1", "brainpoolP256t1": "1.3.36.3.3.2.8.1.1.8", "1.3.36.3.3.2.8.1.1.8": "brainpoolP256t1", "brainpoolP320r1": "1.3.36.3.3.2.8.1.1.9", "1.3.36.3.3.2.8.1.1.9": "brainpoolP320r1", "brainpoolP320t1": "1.3.36.3.3.2.8.1.1.10", "1.3.36.3.3.2.8.1.1.10": "brainpoolP320t1", "brainpoolP384r1": "1.3.36.3.3.2.8.1.1.11", "1.3.36.3.3.2.8.1.1.11": "brainpoolP384r1", "brainpoolP384t1": "1.3.36.3.3.2.8.1.1.12", "1.3.36.3.3.2.8.1.1.12": "brainpoolP384t1", "brainpoolP512r1": "1.3.36.3.3.2.8.1.1.13", "1.3.36.3.3.2.8.1.1.13": "brainpoolP512r1", "brainpoolP512t1": "1.3.36.3.3.2.8.1.1.14", "1.3.36.3.3.2.8.1.1.14": "brainpoolP512t1" }; EcPrivateKey2 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.EcPrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "EC", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.privateKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(json.crv))); const key = JsonParser.fromJSON(json, { targetSchema: index$1.EcPrivateKey }); keyInfo.privateKey = AsnSerializer.serialize(key); this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } }; EcPublicKey3 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return new index$1.EcPublicKey(keyInfo.publicKey); } toJSON() { const key = this.getKey(); const json = { kty: "EC", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const key = JsonParser.fromJSON(json, { targetSchema: index$1.EcPublicKey }); const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.publicKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(json.crv))); keyInfo.publicKey = AsnSerializer.toASN(key).valueHex; this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } }; Sha1Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-1"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha256Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-256"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha384Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-384"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha512Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-512"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha3256Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-256"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha3384Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-384"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; Sha3512Provider = class extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-512"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } }; EcCrypto = class { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new EcPrivateKey2(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new EcPublicKey3(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const keys = import_crypto.default.generateKeyPairSync("ec", { namedCurve: this.getOpenSSLNamedCurve(algorithm.namedCurve), publicKeyEncoding: { format: "der", type: "spki" }, privateKeyEncoding: { format: "der", type: "pkcs8" } }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey }; return res; } static async sign(algorithm, key, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(algorithm.hash); const signer = import_crypto.default.createSign(cryptoAlg); signer.update(import_buffer.Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY----- ${key.data.toString("base64")} -----END PRIVATE KEY-----`; } const options2 = { key: key.pem }; const signature = signer.sign(options2); const ecSignature = AsnParser.parse(signature, index$1.EcDsaSignature); const signatureRaw = EcUtils.encodeSignature(ecSignature, EcCurves.get(key.algorithm.namedCurve).size); return signatureRaw.buffer; } static async verify(algorithm, key, signature, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(algorithm.hash); const signer = import_crypto.default.createVerify(cryptoAlg); signer.update(import_buffer.Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY----- ${key.data.toString("base64")} -----END PUBLIC KEY-----`; } const options2 = { key: key.pem }; const ecSignature = new index$1.EcDsaSignature(); const namedCurve = EcCurves.get(key.algorithm.namedCurve); const signaturePoint = EcUtils.decodeSignature(signature, namedCurve.size); ecSignature.r = import_pvtsutils6.BufferSourceConverter.toArrayBuffer(signaturePoint.r); ecSignature.s = import_pvtsutils6.BufferSourceConverter.toArrayBuffer(signaturePoint.s); const ecSignatureRaw = import_buffer.Buffer.from(AsnSerializer.serialize(ecSignature)); const ok = signer.verify(options2, ecSignatureRaw); return ok; } static async deriveBits(algorithm, baseKey, length) { const cryptoAlg = this.getOpenSSLNamedCurve(baseKey.algorithm.namedCurve); const ecdh = import_crypto.default.createECDH(cryptoAlg); const asnPrivateKey = AsnParser.parse(baseKey.data, index$1.PrivateKeyInfo); const asnEcPrivateKey = AsnParser.parse(asnPrivateKey.privateKey, index$1.EcPrivateKey); ecdh.setPrivateKey(import_buffer.Buffer.from(asnEcPrivateKey.privateKey)); const asnPublicKey = AsnParser.parse(algorithm.public.data, index$1.PublicKeyInfo); const bits = ecdh.computeSecret(import_buffer.Buffer.from(asnPublicKey.publicKey)); if (length === null) { return bits; } return new Uint8Array(bits).buffer.slice(0, length >> 3); } static async exportKey(format2, key) { switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; case "raw": { const publicKeyInfo = AsnParser.parse(key.data, index$1.PublicKeyInfo); return publicKeyInfo.publicKey; } default: throw new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'"); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { switch (format2.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.EcPrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.EcPublicKey }); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } } case "raw": { const asnKey = new index$1.EcPublicKey(keyData); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); const asnKey = new index$1.EcPublicKey(keyInfo.publicKey); this.assertKeyParameters(keyInfo.publicKeyAlgorithm.parameters, algorithm.namedCurve); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.EcPrivateKey); this.assertKeyParameters(keyInfo.privateKeyAlgorithm.parameters, algorithm.namedCurve); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'"); } } static assertKeyParameters(parameters, namedCurve) { if (!parameters) { throw new CryptoError("Key info doesn't have required parameters"); } let namedCurveIdentifier = ""; try { namedCurveIdentifier = AsnParser.parse(parameters, index$1.ObjectIdentifier).value; } catch (e) { throw new CryptoError("Cannot read key info parameters"); } if (getOidByNamedCurve$1(namedCurve) !== namedCurveIdentifier) { throw new CryptoError("Key info parameter doesn't match to named curve"); } } static async importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.privateKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(algorithm.namedCurve))); keyInfo.privateKey = AsnSerializer.serialize(asnKey); const key = new EcPrivateKey2(); key.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static async importPublicKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; const namedCurve = getOidByNamedCurve$1(algorithm.namedCurve); keyInfo.publicKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(namedCurve)); keyInfo.publicKey = asnKey.value; const key = new EcPublicKey3(); key.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static getOpenSSLNamedCurve(curve) { switch (curve.toUpperCase()) { case "P-256": return "prime256v1"; case "K-256": return "secp256k1"; case "P-384": return "secp384r1"; case "P-521": return "secp521r1"; default: return curve; } } }; EcCrypto.publicKeyUsages = ["verify"]; EcCrypto.privateKeyUsages = ["sign", "deriveKey", "deriveBits"]; EcdsaProvider2 = class extends EcdsaProvider { constructor() { super(...arguments); this.namedCurves = EcCurves.names; this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EcCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onSign(algorithm, key, data) { return EcCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return EcCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format2, key) { return EcCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await EcCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof EcPrivateKey2 || internalKey instanceof EcPublicKey3)) { throw new TypeError("key: Is not EC CryptoKey"); } } }; EcdhProvider2 = class extends EcdhProvider { constructor() { super(...arguments); this.namedCurves = EcCurves.names; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EcCrypto.generateKey({ ...algorithm, name: this.name }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onExportKey(format2, key) { return EcCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await EcCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof EcPrivateKey2 || internalKey instanceof EcPublicKey3)) { throw new TypeError("key: Is not EC CryptoKey"); } } async onDeriveBits(algorithm, baseKey, length) { const bits = await EcCrypto.deriveBits({ ...algorithm, public: getCryptoKey(algorithm.public) }, getCryptoKey(baseKey), length); return bits; } }; edOIDs = { [index$1.idEd448]: "Ed448", "ed448": index$1.idEd448, [index$1.idX448]: "X448", "x448": index$1.idX448, [index$1.idEd25519]: "Ed25519", "ed25519": index$1.idEd25519, [index$1.idX25519]: "X25519", "x25519": index$1.idX25519 }; EdPrivateKey3 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.CurvePrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "OKP", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = getOidByNamedCurve(json.crv); const key = JsonParser.fromJSON(json, { targetSchema: index$1.CurvePrivateKey }); keyInfo.privateKey = AsnSerializer.serialize(key); this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } }; EdPublicKey3 = class extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return keyInfo.publicKey; } toJSON() { const key = this.getKey(); const json = { kty: "OKP", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable }; return Object.assign(json, { x: import_pvtsutils6.Convert.ToBase64Url(key) }); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } if (!json.x) { throw new OperationError(`Cannot get property from JWK. Property 'x' is required`); } const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = getOidByNamedCurve(json.crv); keyInfo.publicKey = import_pvtsutils6.Convert.FromBase64Url(json.x); this.data = import_buffer.Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } }; EdCrypto = class { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new EdPrivateKey3(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new EdPublicKey3(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const type3 = algorithm.namedCurve.toLowerCase(); const keys = import_crypto.default.generateKeyPairSync(type3, { publicKeyEncoding: { format: "der", type: "spki" }, privateKeyEncoding: { format: "der", type: "pkcs8" } }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey }; return res; } static async sign(algorithm, key, data) { if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY----- ${key.data.toString("base64")} -----END PRIVATE KEY-----`; } const options2 = { key: key.pem }; const signature = import_crypto.default.sign(null, import_buffer.Buffer.from(data), options2); return import_pvtsutils5.BufferSourceConverter.toArrayBuffer(signature); } static async verify(algorithm, key, signature, data) { if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY----- ${key.data.toString("base64")} -----END PUBLIC KEY-----`; } const options2 = { key: key.pem }; const ok = import_crypto.default.verify(null, import_buffer.Buffer.from(data), options2, import_buffer.Buffer.from(signature)); return ok; } static async deriveBits(algorithm, baseKey, length) { const publicKey = import_crypto.default.createPublicKey({ key: algorithm.public.data, format: "der", type: "spki" }); const privateKey = import_crypto.default.createPrivateKey({ key: baseKey.data, format: "der", type: "pkcs8" }); const bits = import_crypto.default.diffieHellman({ publicKey, privateKey }); return new Uint8Array(bits).buffer.slice(0, length >> 3); } static async exportKey(format2, key) { switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; case "raw": { const publicKeyInfo = AsnParser.parse(key.data, index$1.PublicKeyInfo); return publicKeyInfo.publicKey; } default: throw new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'"); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { switch (format2.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.CurvePrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { if (!jwk.x) { throw new TypeError("keyData: Cannot get required 'x' filed"); } return this.importPublicKey(import_pvtsutils6.Convert.FromBase64Url(jwk.x), algorithm, extractable, keyUsages); } } case "raw": { return this.importPublicKey(keyData, algorithm, extractable, keyUsages); } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); return this.importPublicKey(keyInfo.publicKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.CurvePrivateKey); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'"); } } static importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const key = new EdPrivateKey3(); key.fromJSON({ crv: algorithm.namedCurve, d: import_pvtsutils6.Convert.ToBase64Url(asnKey.d) }); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static async importPublicKey(asnKey, algorithm, extractable, keyUsages) { const key = new EdPublicKey3(); key.fromJSON({ crv: algorithm.namedCurve, x: import_pvtsutils6.Convert.ToBase64Url(asnKey) }); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } }; EdCrypto.publicKeyUsages = ["verify"]; EdCrypto.privateKeyUsages = ["sign", "deriveKey", "deriveBits"]; EdDsaProvider2 = class extends EdDsaProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EdCrypto.generateKey({ name: this.name, namedCurve: algorithm.namedCurve.replace(/^ed/i, "Ed") }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onSign(algorithm, key, data) { return EdCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return EdCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format2, key) { return EdCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await EdCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } }; EcdhEsProvider2 = class extends EcdhEsProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EdCrypto.generateKey({ name: this.name, namedCurve: algorithm.namedCurve.toUpperCase() }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onDeriveBits(algorithm, baseKey, length) { const bits = await EdCrypto.deriveBits({ ...algorithm, public: getCryptoKey(algorithm.public) }, getCryptoKey(baseKey), length); return bits; } async onExportKey(format2, key) { return EdCrypto.exportKey(format2, getCryptoKey(key)); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await EdCrypto.importKey(format2, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } }; Ed25519CryptoKey = class extends CryptoKey2 { constructor(algorithm, extractable, usages, data) { super(); this.algorithm = algorithm; this.extractable = extractable; this.usages = usages; this.data = Buffer.from(data); } toJWK() { return { kty: "OKP", crv: this.algorithm.name, key_ops: this.usages, ext: this.extractable }; } }; Ed25519PrivateKey = class extends Ed25519CryptoKey { constructor() { super(...arguments); this.type = "private"; } toJWK() { const pubJwk = import_crypto.default.createPublicKey({ key: this.data, format: "pem" }).export({ format: "jwk" }); const raw = PemConverter.toUint8Array(this.data.toString()); const pkcs8 = AsnConvert.parse(raw, index$1.PrivateKeyInfo); const d = AsnConvert.parse(pkcs8.privateKey, index$1.EdPrivateKey).value; return { ...super.toJWK(), ...pubJwk, d: Buffer.from(new Uint8Array(d)).toString("base64url") }; } }; Ed25519PublicKey = class extends Ed25519CryptoKey { constructor() { super(...arguments); this.type = "public"; } toJWK() { const jwk = import_crypto.default.createPublicKey({ key: this.data, format: "pem" }).export({ format: "jwk" }); return { ...super.toJWK(), ...jwk }; } }; Ed25519Crypto = class { static async generateKey(algorithm, extractable, keyUsages) { const type3 = algorithm.name.toLowerCase(); const keys = import_crypto.default.generateKeyPairSync(type3, { publicKeyEncoding: { format: "pem", type: "spki" }, privateKeyEncoding: { format: "pem", type: "pkcs8" } }); const keyAlg = { name: type3 === "ed25519" ? "Ed25519" : "X25519" }; const privateKeyUsages = keyUsages.filter((usage) => this.privateKeyUsages.includes(usage)); const publicKeyUsages = keyUsages.filter((usage) => this.publicKeyUsages.includes(usage)); return { privateKey: new Ed25519PrivateKey(keyAlg, extractable, privateKeyUsages, keys.privateKey), publicKey: new Ed25519PublicKey(keyAlg, true, publicKeyUsages, keys.publicKey) }; } static async sign(algorithm, key, data) { const signature = import_crypto.default.sign(null, Buffer.from(data), key.data); return import_pvtsutils5.BufferSourceConverter.toArrayBuffer(signature); } static async verify(algorithm, key, signature, data) { return import_crypto.default.verify(null, Buffer.from(data), key.data, signature); } static async exportKey(format2, key) { switch (format2) { case "jwk": return key.toJWK(); case "pkcs8": { return PemConverter.toArrayBuffer(key.data.toString()); } case "spki": { return PemConverter.toArrayBuffer(key.data.toString()); } case "raw": { const jwk = key.toJWK(); return import_pvtsutils6.Convert.FromBase64Url(jwk.x); } default: return Promise.reject(new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'")); } } static async importKey(format2, keyData, algorithm, extractable, keyUsages) { switch (format2) { case "jwk": { const jwk = keyData; if (jwk.d) { const privateData = new index$1.EdPrivateKey(); privateData.value = import_pvtsutils5.BufferSourceConverter.toArrayBuffer(Buffer.from(jwk.d, "base64url")); const pkcs8 = new index$1.PrivateKeyInfo(); pkcs8.privateKeyAlgorithm.algorithm = algorithm.name.toLowerCase() === "ed25519" ? index$1.idEd25519 : index$1.idX25519; pkcs8.privateKey = AsnConvert.serialize(privateData); const raw = AsnConvert.serialize(pkcs8); const pem = PemConverter.fromBufferSource(raw, "PRIVATE KEY"); return new Ed25519PrivateKey(algorithm, extractable, keyUsages, pem); } else if (jwk.x) { const pubKey = import_crypto.default.createPublicKey({ format: "jwk", key: jwk }); const pem = pubKey.export({ format: "pem", type: "spki" }); return new Ed25519PublicKey(algorithm, extractable, keyUsages, pem); } else { throw new OperationError("keyData: Cannot import JWK. 'd' or 'x' must be presented"); } } case "pkcs8": { const pem = PemConverter.fromBufferSource(keyData, "PRIVATE KEY"); return new Ed25519PrivateKey(algorithm, extractable, keyUsages, pem); } case "spki": { const pem = PemConverter.fromBufferSource(keyData, "PUBLIC KEY"); return new Ed25519PublicKey(algorithm, extractable, keyUsages, pem); } case "raw": { const raw = keyData; const key = import_crypto.default.createPublicKey({ format: "jwk", key: { kty: "OKP", crv: algorithm.name.toLowerCase() === "ed25519" ? "Ed25519" : "X25519", x: import_pvtsutils6.Convert.ToBase64Url(raw) } }); const pem = key.export({ format: "pem", type: "spki" }); return new Ed25519PublicKey(algorithm, extractable, keyUsages, pem); } default: return Promise.reject(new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'")); } } }; Ed25519Crypto.privateKeyUsages = ["sign", "deriveBits", "deriveKey"]; Ed25519Crypto.publicKeyUsages = ["verify"]; Ed25519Provider2 = class extends Ed25519Provider { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await Ed25519Crypto.generateKey(algorithm, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onSign(algorithm, key, data) { const internalKey = getCryptoKey(key); const signature = Ed25519Crypto.sign(algorithm, internalKey, new Uint8Array(data)); return signature; } onVerify(algorithm, key, signature, data) { const internalKey = getCryptoKey(key); return Ed25519Crypto.verify(algorithm, internalKey, new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format2, key) { const internalKey = getCryptoKey(key); return Ed25519Crypto.exportKey(format2, internalKey); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const internalKey = await Ed25519Crypto.importKey(format2, keyData, algorithm, extractable, keyUsages); return setCryptoKey(internalKey); } }; X25519Provider2 = class extends X25519Provider { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await Ed25519Crypto.generateKey(algorithm, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey) }; } async onDeriveBits(algorithm, baseKey, length) { const internalBaseKey = getCryptoKey(baseKey); const internalPublicKey = getCryptoKey(algorithm.public); const publicKey = import_crypto.default.createPublicKey({ key: internalPublicKey.data.toString(), format: "pem", type: "spki" }); const privateKey = import_crypto.default.createPrivateKey({ key: internalBaseKey.data.toString(), format: "pem", type: "pkcs8" }); const bits = import_crypto.default.diffieHellman({ publicKey, privateKey }); return new Uint8Array(bits).buffer.slice(0, length >> 3); } async onExportKey(format2, key) { const internalKey = getCryptoKey(key); return Ed25519Crypto.exportKey(format2, internalKey); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { const key = await Ed25519Crypto.importKey(format2, keyData, algorithm, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof Ed25519CryptoKey)) { throw new TypeError("key: Is not a Ed25519CryptoKey"); } } }; PbkdfCryptoKey = class extends CryptoKey2 { }; Pbkdf2Provider2 = class extends Pbkdf2Provider { async onDeriveBits(algorithm, baseKey, length) { return new Promise((resolve, reject) => { const salt = import_pvtsutils5.BufferSourceConverter.toArrayBuffer(algorithm.salt); const hash3 = algorithm.hash.name.replace("-", ""); import_crypto.default.pbkdf2(getCryptoKey(baseKey).data, import_buffer.Buffer.from(salt), algorithm.iterations, length >> 3, hash3, (err, derivedBits) => { if (err) { reject(err); } else { resolve(new Uint8Array(derivedBits).buffer); } }); }); } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { if (format2 === "raw") { const key = new PbkdfCryptoKey(); key.data = import_buffer.Buffer.from(keyData); key.algorithm = { name: this.name }; key.extractable = false; key.usages = keyUsages; return setCryptoKey(key); } throw new OperationError("format: Must be 'raw'"); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof PbkdfCryptoKey)) { throw new TypeError("key: Is not PBKDF CryptoKey"); } } }; HmacCryptoKey = class extends CryptoKey2 { get alg() { const hash3 = this.algorithm.hash.name.toUpperCase(); return `HS${hash3.replace("SHA-", "")}`; } set alg(value) { } }; __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], HmacCryptoKey.prototype, "data", void 0); HmacProvider2 = class extends HmacProvider { async onGenerateKey(algorithm, extractable, keyUsages) { const length = (algorithm.length || this.getDefaultLength(algorithm.hash.name)) >> 3 << 3; const key = new HmacCryptoKey(); key.algorithm = { ...algorithm, length, name: this.name }; key.extractable = extractable; key.usages = keyUsages; key.data = import_crypto.default.randomBytes(length >> 3); return setCryptoKey(key); } async onSign(algorithm, key, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(key.algorithm.hash); const hmac = import_crypto.default.createHmac(cryptoAlg, getCryptoKey(key).data).update(import_buffer.Buffer.from(data)).digest(); return new Uint8Array(hmac).buffer; } async onVerify(algorithm, key, signature, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(key.algorithm.hash); const hmac = import_crypto.default.createHmac(cryptoAlg, getCryptoKey(key).data).update(import_buffer.Buffer.from(data)).digest(); return hmac.compare(import_buffer.Buffer.from(signature)) === 0; } async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { let key; switch (format2.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: HmacCryptoKey }); break; case "raw": key = new HmacCryptoKey(); key.data = import_buffer.Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = { hash: { name: algorithm.hash.name }, name: this.name, length: key.data.length << 3 }; key.extractable = extractable; key.usages = keyUsages; return setCryptoKey(key); } async onExportKey(format2, key) { switch (format2.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(getCryptoKey(key)); case "raw": return new Uint8Array(getCryptoKey(key).data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof HmacCryptoKey)) { throw new TypeError("key: Is not HMAC CryptoKey"); } } }; HkdfCryptoKey = class extends CryptoKey2 { }; HkdfProvider2 = class extends HkdfProvider { async onImportKey(format2, keyData, algorithm, extractable, keyUsages) { if (format2.toLowerCase() !== "raw") { throw new OperationError("Operation not supported"); } const key = new HkdfCryptoKey(); key.data = import_buffer.Buffer.from(keyData); key.algorithm = { name: this.name }; key.extractable = extractable; key.usages = keyUsages; return setCryptoKey(key); } async onDeriveBits(params, baseKey, length) { const hash3 = params.hash.name.replace("-", ""); const hashLength = import_crypto.default.createHash(hash3).digest().length; const byteLength = length / 8; const info = import_pvtsutils5.BufferSourceConverter.toUint8Array(params.info); const PRK = import_crypto.default.createHmac(hash3, import_pvtsutils5.BufferSourceConverter.toUint8Array(params.salt)).update(import_pvtsutils5.BufferSourceConverter.toUint8Array(getCryptoKey(baseKey).data)).digest(); const blocks = [import_buffer.Buffer.alloc(0)]; const blockCount = Math.ceil(byteLength / hashLength) + 1; for (let i = 1; i < blockCount; ++i) { blocks.push(import_crypto.default.createHmac(hash3, PRK).update(import_buffer.Buffer.concat([blocks[i - 1], info, import_buffer.Buffer.from([i])])).digest()); } return import_buffer.Buffer.concat(blocks).slice(0, byteLength); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof HkdfCryptoKey)) { throw new TypeError("key: Is not HKDF CryptoKey"); } } }; ShakeCrypto = class { static digest(algorithm, data) { const hash3 = import_crypto.default.createHash(algorithm.name.toLowerCase(), { outputLength: algorithm.length }).update(import_buffer.Buffer.from(data)).digest(); return new Uint8Array(hash3).buffer; } }; Shake128Provider2 = class extends Shake128Provider { async onDigest(algorithm, data) { return ShakeCrypto.digest(algorithm, data); } }; Shake256Provider2 = class extends Shake256Provider { async onDigest(algorithm, data) { return ShakeCrypto.digest(algorithm, data); } }; SubtleCrypto2 = class extends SubtleCrypto { constructor() { var _a2; super(); this.providers.set(new AesCbcProvider2()); this.providers.set(new AesCtrProvider2()); this.providers.set(new AesGcmProvider2()); this.providers.set(new AesCmacProvider2()); this.providers.set(new AesKwProvider2()); this.providers.set(new AesEcbProvider2()); const ciphers = import_crypto.default.getCiphers(); if (ciphers.includes("des-cbc")) { this.providers.set(new DesCbcProvider()); } this.providers.set(new DesEde3CbcProvider()); this.providers.set(new RsaSsaProvider2()); this.providers.set(new RsaPssProvider2()); this.providers.set(new RsaOaepProvider2()); this.providers.set(new RsaEsProvider()); this.providers.set(new EcdsaProvider2()); this.providers.set(new EcdhProvider2()); this.providers.set(new Sha1Provider()); this.providers.set(new Sha256Provider()); this.providers.set(new Sha384Provider()); this.providers.set(new Sha512Provider()); this.providers.set(new Pbkdf2Provider2()); this.providers.set(new HmacProvider2()); this.providers.set(new HkdfProvider2()); const nodeMajorVersion = (_a2 = /^v(\d+)/.exec(process2.version)) === null || _a2 === void 0 ? void 0 : _a2[1]; if (nodeMajorVersion && parseInt(nodeMajorVersion, 10) >= 12) { this.providers.set(new Shake128Provider2()); this.providers.set(new Shake256Provider2()); } const hashes = import_crypto.default.getHashes(); if (hashes.includes("sha3-256")) { this.providers.set(new Sha3256Provider()); } if (hashes.includes("sha3-384")) { this.providers.set(new Sha3384Provider()); } if (hashes.includes("sha3-512")) { this.providers.set(new Sha3512Provider()); } if (nodeMajorVersion && parseInt(nodeMajorVersion, 10) >= 14) { this.providers.set(new EdDsaProvider2()); this.providers.set(new EcdhEsProvider2()); this.providers.set(new Ed25519Provider2()); this.providers.set(new X25519Provider2()); } } }; Crypto2 = class extends Crypto { constructor() { super(...arguments); this.subtle = new SubtleCrypto2(); } getRandomValues(array) { if (!ArrayBuffer.isView(array)) { throw new TypeError("Failed to execute 'getRandomValues' on 'Crypto': parameter 1 is not of type 'ArrayBufferView'"); } const buffer = import_buffer.Buffer.from(array.buffer, array.byteOffset, array.byteLength); import_crypto.default.randomFillSync(buffer); return array; } }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/enums.js var top, bottom, right, left, auto, basePlacements, start, end, clippingParents, viewport, popper, reference, variationPlacements, placements, beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite, modifierPhases; var init_enums2 = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/enums.js"() { top = "top"; bottom = "bottom"; right = "right"; left = "left"; auto = "auto"; basePlacements = [top, bottom, right, left]; start = "start"; end = "end"; clippingParents = "clippingParents"; viewport = "viewport"; popper = "popper"; reference = "reference"; variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { return acc.concat([placement + "-" + start, placement + "-" + end]); }, []); placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { return acc.concat([placement, placement + "-" + start, placement + "-" + end]); }, []); beforeRead = "beforeRead"; read = "read"; afterRead = "afterRead"; beforeMain = "beforeMain"; main = "main"; afterMain = "afterMain"; beforeWrite = "beforeWrite"; write = "write"; afterWrite = "afterWrite"; modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js function getNodeName(element) { return element ? (element.nodeName || "").toLowerCase() : null; } var init_getNodeName = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindow.js function getWindow(node) { if (node == null) { return window; } if (node.toString() !== "[object Window]") { var ownerDocument = node.ownerDocument; return ownerDocument ? ownerDocument.defaultView || window : window; } return node; } var init_getWindow = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindow.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js function isElement(node) { var OwnElement = getWindow(node).Element; return node instanceof OwnElement || node instanceof Element; } function isHTMLElement(node) { var OwnElement = getWindow(node).HTMLElement; return node instanceof OwnElement || node instanceof HTMLElement; } function isShadowRoot(node) { if (typeof ShadowRoot === "undefined") { return false; } var OwnElement = getWindow(node).ShadowRoot; return node instanceof OwnElement || node instanceof ShadowRoot; } var init_instanceOf = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"() { init_getWindow(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/applyStyles.js function applyStyles(_ref) { var state = _ref.state; Object.keys(state.elements).forEach(function(name) { var style = state.styles[name] || {}; var attributes = state.attributes[name] || {}; var element = state.elements[name]; if (!isHTMLElement(element) || !getNodeName(element)) { return; } Object.assign(element.style, style); Object.keys(attributes).forEach(function(name2) { var value = attributes[name2]; if (value === false) { element.removeAttribute(name2); } else { element.setAttribute(name2, value === true ? "" : value); } }); }); } function effect(_ref2) { var state = _ref2.state; var initialStyles = { popper: { position: state.options.strategy, left: "0", top: "0", margin: "0" }, arrow: { position: "absolute" }, reference: {} }; Object.assign(state.elements.popper.style, initialStyles.popper); state.styles = initialStyles; if (state.elements.arrow) { Object.assign(state.elements.arrow.style, initialStyles.arrow); } return function() { Object.keys(state.elements).forEach(function(name) { var element = state.elements[name]; var attributes = state.attributes[name] || {}; var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); var style = styleProperties.reduce(function(style2, property) { style2[property] = ""; return style2; }, {}); if (!isHTMLElement(element) || !getNodeName(element)) { return; } Object.assign(element.style, style); Object.keys(attributes).forEach(function(attribute) { element.removeAttribute(attribute); }); }); }; } var applyStyles_default; var init_applyStyles = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/applyStyles.js"() { init_getNodeName(); init_instanceOf(); applyStyles_default = { name: "applyStyles", enabled: true, phase: "write", fn: applyStyles, effect, requires: ["computeStyles"] }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getBasePlacement.js function getBasePlacement(placement) { return placement.split("-")[0]; } var init_getBasePlacement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getBasePlacement.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/math.js var max, min, round; var init_math = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/math.js"() { max = Math.max; min = Math.min; round = Math.round; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/userAgent.js function getUAString() { var uaData = navigator.userAgentData; if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { return uaData.brands.map(function(item) { return item.brand + "/" + item.version; }).join(" "); } return navigator.userAgent; } var init_userAgent = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/userAgent.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js function isLayoutViewport() { return !/^((?!chrome|android).)*safari/i.test(getUAString()); } var init_isLayoutViewport = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js"() { init_userAgent(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js function getBoundingClientRect(element, includeScale, isFixedStrategy) { if (includeScale === void 0) { includeScale = false; } if (isFixedStrategy === void 0) { isFixedStrategy = false; } var clientRect = element.getBoundingClientRect(); var scaleX = 1; var scaleY = 1; if (includeScale && isHTMLElement(element)) { scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; } var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport; var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; var width = clientRect.width / scaleX; var height = clientRect.height / scaleY; return { width, height, top: y, right: x + width, bottom: y + height, left: x, x, y }; } var init_getBoundingClientRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"() { init_instanceOf(); init_math(); init_getWindow(); init_isLayoutViewport(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js function getLayoutRect(element) { var clientRect = getBoundingClientRect(element); var width = element.offsetWidth; var height = element.offsetHeight; if (Math.abs(clientRect.width - width) <= 1) { width = clientRect.width; } if (Math.abs(clientRect.height - height) <= 1) { height = clientRect.height; } return { x: element.offsetLeft, y: element.offsetTop, width, height }; } var init_getLayoutRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"() { init_getBoundingClientRect(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/contains.js function contains(parent, child) { var rootNode = child.getRootNode && child.getRootNode(); if (parent.contains(child)) { return true; } else if (rootNode && isShadowRoot(rootNode)) { var next = child; do { if (next && parent.isSameNode(next)) { return true; } next = next.parentNode || next.host; } while (next); } return false; } var init_contains = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/contains.js"() { init_instanceOf(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js function getComputedStyle2(element) { return getWindow(element).getComputedStyle(element); } var init_getComputedStyle = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"() { init_getWindow(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js function isTableElement(element) { return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; } var init_isTableElement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js"() { init_getNodeName(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js function getDocumentElement(element) { return ((isElement(element) ? element.ownerDocument : ( // $FlowFixMe[prop-missing] element.document )) || window.document).documentElement; } var init_getDocumentElement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"() { init_instanceOf(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js function getParentNode(element) { if (getNodeName(element) === "html") { return element; } return ( // this is a quicker (but less type safe) way to save quite some bytes from the bundle // $FlowFixMe[incompatible-return] // $FlowFixMe[prop-missing] element.assignedSlot || // step into the shadow DOM of the parent of a slotted node element.parentNode || // DOM Element detected (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected // $FlowFixMe[incompatible-call]: HTMLElement is a Node getDocumentElement(element) ); } var init_getParentNode = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"() { init_getNodeName(); init_getDocumentElement(); init_instanceOf(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js function getTrueOffsetParent(element) { if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 getComputedStyle2(element).position === "fixed") { return null; } return element.offsetParent; } function getContainingBlock(element) { var isFirefox = /firefox/i.test(getUAString()); var isIE = /Trident/i.test(getUAString()); if (isIE && isHTMLElement(element)) { var elementCss = getComputedStyle2(element); if (elementCss.position === "fixed") { return null; } } var currentNode = getParentNode(element); if (isShadowRoot(currentNode)) { currentNode = currentNode.host; } while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { var css = getComputedStyle2(currentNode); if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { return currentNode; } else { currentNode = currentNode.parentNode; } } return null; } function getOffsetParent(element) { var window2 = getWindow(element); var offsetParent = getTrueOffsetParent(element); while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") { offsetParent = getTrueOffsetParent(offsetParent); } if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) { return window2; } return offsetParent || getContainingBlock(element) || window2; } var init_getOffsetParent = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"() { init_getWindow(); init_getNodeName(); init_getComputedStyle(); init_instanceOf(); init_isTableElement(); init_getParentNode(); init_userAgent(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js function getMainAxisFromPlacement(placement) { return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; } var init_getMainAxisFromPlacement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/within.js function within(min3, value, max3) { return max(min3, min(value, max3)); } function withinMaxClamp(min3, value, max3) { var v = within(min3, value, max3); return v > max3 ? max3 : v; } var init_within = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/within.js"() { init_math(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js function getFreshSideObject() { return { top: 0, right: 0, bottom: 0, left: 0 }; } var init_getFreshSideObject = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js function mergePaddingObject(paddingObject) { return Object.assign({}, getFreshSideObject(), paddingObject); } var init_mergePaddingObject = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"() { init_getFreshSideObject(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/expandToHashMap.js function expandToHashMap(value, keys) { return keys.reduce(function(hashMap, key) { hashMap[key] = value; return hashMap; }, {}); } var init_expandToHashMap = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/expandToHashMap.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/arrow.js function arrow(_ref) { var _state$modifiersData$; var state = _ref.state, name = _ref.name, options2 = _ref.options; var arrowElement = state.elements.arrow; var popperOffsets2 = state.modifiersData.popperOffsets; var basePlacement = getBasePlacement(state.placement); var axis = getMainAxisFromPlacement(basePlacement); var isVertical = [left, right].indexOf(basePlacement) >= 0; var len = isVertical ? "height" : "width"; if (!arrowElement || !popperOffsets2) { return; } var paddingObject = toPaddingObject(options2.padding, state); var arrowRect = getLayoutRect(arrowElement); var minProp = axis === "y" ? top : left; var maxProp = axis === "y" ? bottom : right; var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; var arrowOffsetParent = getOffsetParent(arrowElement); var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; var centerToReference = endDiff / 2 - startDiff / 2; var min3 = paddingObject[minProp]; var max3 = clientSize - arrowRect[len] - paddingObject[maxProp]; var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; var offset4 = within(min3, center, max3); var axisProp = axis; state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset4, _state$modifiersData$.centerOffset = offset4 - center, _state$modifiersData$); } function effect2(_ref2) { var state = _ref2.state, options2 = _ref2.options; var _options$element = options2.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; if (arrowElement == null) { return; } if (typeof arrowElement === "string") { arrowElement = state.elements.popper.querySelector(arrowElement); if (!arrowElement) { return; } } if (!contains(state.elements.popper, arrowElement)) { return; } state.elements.arrow = arrowElement; } var toPaddingObject, arrow_default; var init_arrow = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/arrow.js"() { init_getBasePlacement(); init_getLayoutRect(); init_contains(); init_getOffsetParent(); init_getMainAxisFromPlacement(); init_within(); init_mergePaddingObject(); init_expandToHashMap(); init_enums2(); toPaddingObject = function toPaddingObject2(padding, state) { padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { placement: state.placement })) : padding; return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); }; arrow_default = { name: "arrow", enabled: true, phase: "main", fn: arrow, effect: effect2, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getVariation.js function getVariation(placement) { return placement.split("-")[1]; } var init_getVariation = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getVariation.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/computeStyles.js function roundOffsetsByDPR(_ref, win) { var x = _ref.x, y = _ref.y; var dpr = win.devicePixelRatio || 1; return { x: round(x * dpr) / dpr || 0, y: round(y * dpr) / dpr || 0 }; } function mapToStyles(_ref2) { var _Object$assign2; var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ x, y }) : { x, y }; x = _ref3.x; y = _ref3.y; var hasX = offsets.hasOwnProperty("x"); var hasY = offsets.hasOwnProperty("y"); var sideX = left; var sideY = top; var win = window; if (adaptive) { var offsetParent = getOffsetParent(popper2); var heightProp = "clientHeight"; var widthProp = "clientWidth"; if (offsetParent === getWindow(popper2)) { offsetParent = getDocumentElement(popper2); if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") { heightProp = "scrollHeight"; widthProp = "scrollWidth"; } } offsetParent = offsetParent; if (placement === top || (placement === left || placement === right) && variation === end) { sideY = bottom; var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : ( // $FlowFixMe[prop-missing] offsetParent[heightProp] ); y -= offsetY - popperRect.height; y *= gpuAcceleration ? 1 : -1; } if (placement === left || (placement === top || placement === bottom) && variation === end) { sideX = right; var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : ( // $FlowFixMe[prop-missing] offsetParent[widthProp] ); x -= offsetX - popperRect.width; x *= gpuAcceleration ? 1 : -1; } } var commonStyles = Object.assign({ position }, adaptive && unsetSides); var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ x, y }, getWindow(popper2)) : { x, y }; x = _ref4.x; y = _ref4.y; if (gpuAcceleration) { var _Object$assign; return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); } return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); } function computeStyles(_ref5) { var state = _ref5.state, options2 = _ref5.options; var _options$gpuAccelerat = options2.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options2.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options2.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; var commonStyles = { placement: getBasePlacement(state.placement), variation: getVariation(state.placement), popper: state.elements.popper, popperRect: state.rects.popper, gpuAcceleration, isFixed: state.options.strategy === "fixed" }; if (state.modifiersData.popperOffsets != null) { state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.popperOffsets, position: state.options.strategy, adaptive, roundOffsets }))); } if (state.modifiersData.arrow != null) { state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.arrow, position: "absolute", adaptive: false, roundOffsets }))); } state.attributes.popper = Object.assign({}, state.attributes.popper, { "data-popper-placement": state.placement }); } var unsetSides, computeStyles_default; var init_computeStyles = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/computeStyles.js"() { init_enums2(); init_getOffsetParent(); init_getWindow(); init_getDocumentElement(); init_getComputedStyle(); init_getBasePlacement(); init_getVariation(); init_math(); unsetSides = { top: "auto", right: "auto", bottom: "auto", left: "auto" }; computeStyles_default = { name: "computeStyles", enabled: true, phase: "beforeWrite", fn: computeStyles, data: {} }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/eventListeners.js function effect3(_ref) { var state = _ref.state, instance = _ref.instance, options2 = _ref.options; var _options$scroll = options2.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options2.resize, resize = _options$resize === void 0 ? true : _options$resize; var window2 = getWindow(state.elements.popper); var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); if (scroll) { scrollParents.forEach(function(scrollParent) { scrollParent.addEventListener("scroll", instance.update, passive); }); } if (resize) { window2.addEventListener("resize", instance.update, passive); } return function() { if (scroll) { scrollParents.forEach(function(scrollParent) { scrollParent.removeEventListener("scroll", instance.update, passive); }); } if (resize) { window2.removeEventListener("resize", instance.update, passive); } }; } var passive, eventListeners_default; var init_eventListeners = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/eventListeners.js"() { init_getWindow(); passive = { passive: true }; eventListeners_default = { name: "eventListeners", enabled: true, phase: "write", fn: function fn() { }, effect: effect3, data: {} }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, function(matched) { return hash[matched]; }); } var hash; var init_getOppositePlacement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js"() { hash = { left: "right", right: "left", bottom: "top", top: "bottom" }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js function getOppositeVariationPlacement(placement) { return placement.replace(/start|end/g, function(matched) { return hash2[matched]; }); } var hash2; var init_getOppositeVariationPlacement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js"() { hash2 = { start: "end", end: "start" }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js function getWindowScroll(node) { var win = getWindow(node); var scrollLeft = win.pageXOffset; var scrollTop = win.pageYOffset; return { scrollLeft, scrollTop }; } var init_getWindowScroll = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"() { init_getWindow(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js function getWindowScrollBarX(element) { return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; } var init_getWindowScrollBarX = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"() { init_getBoundingClientRect(); init_getDocumentElement(); init_getWindowScroll(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js function getViewportRect(element, strategy) { var win = getWindow(element); var html = getDocumentElement(element); var visualViewport = win.visualViewport; var width = html.clientWidth; var height = html.clientHeight; var x = 0; var y = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; var layoutViewport = isLayoutViewport(); if (layoutViewport || !layoutViewport && strategy === "fixed") { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width, height, x: x + getWindowScrollBarX(element), y }; } var init_getViewportRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js"() { init_getWindow(); init_getDocumentElement(); init_getWindowScrollBarX(); init_isLayoutViewport(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js function getDocumentRect(element) { var _element$ownerDocumen; var html = getDocumentElement(element); var winScroll = getWindowScroll(element); var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); var x = -winScroll.scrollLeft + getWindowScrollBarX(element); var y = -winScroll.scrollTop; if (getComputedStyle2(body || html).direction === "rtl") { x += max(html.clientWidth, body ? body.clientWidth : 0) - width; } return { width, height, x, y }; } var init_getDocumentRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js"() { init_getDocumentElement(); init_getComputedStyle(); init_getWindowScrollBarX(); init_getWindowScroll(); init_math(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js function isScrollParent(element) { var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); } var init_isScrollParent = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"() { init_getComputedStyle(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js function getScrollParent(node) { if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { return node.ownerDocument.body; } if (isHTMLElement(node) && isScrollParent(node)) { return node; } return getScrollParent(getParentNode(node)); } var init_getScrollParent = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js"() { init_getParentNode(); init_isScrollParent(); init_getNodeName(); init_instanceOf(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js function listScrollParents(element, list) { var _element$ownerDocumen; if (list === void 0) { list = []; } var scrollParent = getScrollParent(element); var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); var win = getWindow(scrollParent); var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; var updatedList = list.concat(target); return isBody ? updatedList : ( // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here updatedList.concat(listScrollParents(getParentNode(target))) ); } var init_listScrollParents = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"() { init_getScrollParent(); init_getParentNode(); init_getWindow(); init_isScrollParent(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/rectToClientRect.js function rectToClientRect(rect) { return Object.assign({}, rect, { left: rect.x, top: rect.y, right: rect.x + rect.width, bottom: rect.y + rect.height }); } var init_rectToClientRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/rectToClientRect.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js function getInnerBoundingClientRect(element, strategy) { var rect = getBoundingClientRect(element, false, strategy === "fixed"); rect.top = rect.top + element.clientTop; rect.left = rect.left + element.clientLeft; rect.bottom = rect.top + element.clientHeight; rect.right = rect.left + element.clientWidth; rect.width = element.clientWidth; rect.height = element.clientHeight; rect.x = rect.left; rect.y = rect.top; return rect; } function getClientRectFromMixedType(element, clippingParent, strategy) { return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); } function getClippingParents(element) { var clippingParents2 = listScrollParents(getParentNode(element)); var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0; var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; if (!isElement(clipperElement)) { return []; } return clippingParents2.filter(function(clippingParent) { return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; }); } function getClippingRect(element, boundary, rootBoundary, strategy) { var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); var firstClippingParent = clippingParents2[0]; var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { var rect = getClientRectFromMixedType(element, clippingParent, strategy); accRect.top = max(rect.top, accRect.top); accRect.right = min(rect.right, accRect.right); accRect.bottom = min(rect.bottom, accRect.bottom); accRect.left = max(rect.left, accRect.left); return accRect; }, getClientRectFromMixedType(element, firstClippingParent, strategy)); clippingRect.width = clippingRect.right - clippingRect.left; clippingRect.height = clippingRect.bottom - clippingRect.top; clippingRect.x = clippingRect.left; clippingRect.y = clippingRect.top; return clippingRect; } var init_getClippingRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js"() { init_enums2(); init_getViewportRect(); init_getDocumentRect(); init_listScrollParents(); init_getOffsetParent(); init_getDocumentElement(); init_getComputedStyle(); init_instanceOf(); init_getBoundingClientRect(); init_getParentNode(); init_contains(); init_getNodeName(); init_rectToClientRect(); init_math(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeOffsets.js function computeOffsets(_ref) { var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; var basePlacement = placement ? getBasePlacement(placement) : null; var variation = placement ? getVariation(placement) : null; var commonX = reference2.x + reference2.width / 2 - element.width / 2; var commonY = reference2.y + reference2.height / 2 - element.height / 2; var offsets; switch (basePlacement) { case top: offsets = { x: commonX, y: reference2.y - element.height }; break; case bottom: offsets = { x: commonX, y: reference2.y + reference2.height }; break; case right: offsets = { x: reference2.x + reference2.width, y: commonY }; break; case left: offsets = { x: reference2.x - element.width, y: commonY }; break; default: offsets = { x: reference2.x, y: reference2.y }; } var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; if (mainAxis != null) { var len = mainAxis === "y" ? "height" : "width"; switch (variation) { case start: offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); break; case end: offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); break; default: } } return offsets; } var init_computeOffsets = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeOffsets.js"() { init_getBasePlacement(); init_getVariation(); init_getMainAxisFromPlacement(); init_enums2(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/detectOverflow.js function detectOverflow(state, options2) { if (options2 === void 0) { options2 = {}; } var _options = options2, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); var altContext = elementContext === popper ? reference : popper; var popperRect = state.rects.popper; var element = state.elements[altBoundary ? altContext : elementContext]; var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); var referenceClientRect = getBoundingClientRect(state.elements.reference); var popperOffsets2 = computeOffsets({ reference: referenceClientRect, element: popperRect, strategy: "absolute", placement }); var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; var overflowOffsets = { top: clippingClientRect.top - elementClientRect.top + paddingObject.top, bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, left: clippingClientRect.left - elementClientRect.left + paddingObject.left, right: elementClientRect.right - clippingClientRect.right + paddingObject.right }; var offsetData = state.modifiersData.offset; if (elementContext === popper && offsetData) { var offset4 = offsetData[placement]; Object.keys(overflowOffsets).forEach(function(key) { var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; overflowOffsets[key] += offset4[axis] * multiply; }); } return overflowOffsets; } var init_detectOverflow = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/detectOverflow.js"() { init_getClippingRect(); init_getDocumentElement(); init_getBoundingClientRect(); init_computeOffsets(); init_rectToClientRect(); init_enums2(); init_instanceOf(); init_mergePaddingObject(); init_expandToHashMap(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js function computeAutoPlacement(state, options2) { if (options2 === void 0) { options2 = {}; } var _options = options2, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; var variation = getVariation(placement); var placements3 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { return getVariation(placement2) === variation; }) : basePlacements; var allowedPlacements = placements3.filter(function(placement2) { return allowedAutoPlacements.indexOf(placement2) >= 0; }); if (allowedPlacements.length === 0) { allowedPlacements = placements3; } var overflows = allowedPlacements.reduce(function(acc, placement2) { acc[placement2] = detectOverflow(state, { placement: placement2, boundary, rootBoundary, padding })[getBasePlacement(placement2)]; return acc; }, {}); return Object.keys(overflows).sort(function(a2, b) { return overflows[a2] - overflows[b]; }); } var init_computeAutoPlacement = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js"() { init_getVariation(); init_enums2(); init_detectOverflow(); init_getBasePlacement(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/flip.js function getExpandedFallbackPlacements(placement) { if (getBasePlacement(placement) === auto) { return []; } var oppositePlacement = getOppositePlacement(placement); return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; } function flip(_ref) { var state = _ref.state, options2 = _ref.options, name = _ref.name; if (state.modifiersData[name]._skip) { return; } var _options$mainAxis = options2.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options2.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options2.fallbackPlacements, padding = options2.padding, boundary = options2.boundary, rootBoundary = options2.rootBoundary, altBoundary = options2.altBoundary, _options$flipVariatio = options2.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options2.allowedAutoPlacements; var preferredPlacement = state.options.placement; var basePlacement = getBasePlacement(preferredPlacement); var isBasePlacement = basePlacement === preferredPlacement; var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); var placements3 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { placement: placement2, boundary, rootBoundary, padding, flipVariations, allowedAutoPlacements }) : placement2); }, []); var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var checksMap = /* @__PURE__ */ new Map(); var makeFallbackChecks = true; var firstFittingPlacement = placements3[0]; for (var i = 0; i < placements3.length; i++) { var placement = placements3[i]; var _basePlacement = getBasePlacement(placement); var isStartVariation = getVariation(placement) === start; var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; var len = isVertical ? "width" : "height"; var overflow = detectOverflow(state, { placement, boundary, rootBoundary, altBoundary, padding }); var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; if (referenceRect[len] > popperRect[len]) { mainVariationSide = getOppositePlacement(mainVariationSide); } var altVariationSide = getOppositePlacement(mainVariationSide); var checks = []; if (checkMainAxis) { checks.push(overflow[_basePlacement] <= 0); } if (checkAltAxis) { checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); } if (checks.every(function(check) { return check; })) { firstFittingPlacement = placement; makeFallbackChecks = false; break; } checksMap.set(placement, checks); } if (makeFallbackChecks) { var numberOfChecks = flipVariations ? 3 : 1; var _loop = function _loop2(_i2) { var fittingPlacement = placements3.find(function(placement2) { var checks2 = checksMap.get(placement2); if (checks2) { return checks2.slice(0, _i2).every(function(check) { return check; }); } }); if (fittingPlacement) { firstFittingPlacement = fittingPlacement; return "break"; } }; for (var _i = numberOfChecks; _i > 0; _i--) { var _ret = _loop(_i); if (_ret === "break") break; } } if (state.placement !== firstFittingPlacement) { state.modifiersData[name]._skip = true; state.placement = firstFittingPlacement; state.reset = true; } } var flip_default; var init_flip = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/flip.js"() { init_getOppositePlacement(); init_getBasePlacement(); init_getOppositeVariationPlacement(); init_detectOverflow(); init_computeAutoPlacement(); init_enums2(); init_getVariation(); flip_default = { name: "flip", enabled: true, phase: "main", fn: flip, requiresIfExists: ["offset"], data: { _skip: false } }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/hide.js function getSideOffsets(overflow, rect, preventedOffsets) { if (preventedOffsets === void 0) { preventedOffsets = { x: 0, y: 0 }; } return { top: overflow.top - rect.height - preventedOffsets.y, right: overflow.right - rect.width + preventedOffsets.x, bottom: overflow.bottom - rect.height + preventedOffsets.y, left: overflow.left - rect.width - preventedOffsets.x }; } function isAnySideFullyClipped(overflow) { return [top, right, bottom, left].some(function(side) { return overflow[side] >= 0; }); } function hide2(_ref) { var state = _ref.state, name = _ref.name; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var preventedOffsets = state.modifiersData.preventOverflow; var referenceOverflow = detectOverflow(state, { elementContext: "reference" }); var popperAltOverflow = detectOverflow(state, { altBoundary: true }); var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); state.modifiersData[name] = { referenceClippingOffsets, popperEscapeOffsets, isReferenceHidden, hasPopperEscaped }; state.attributes.popper = Object.assign({}, state.attributes.popper, { "data-popper-reference-hidden": isReferenceHidden, "data-popper-escaped": hasPopperEscaped }); } var hide_default; var init_hide = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/hide.js"() { init_enums2(); init_detectOverflow(); hide_default = { name: "hide", enabled: true, phase: "main", requiresIfExists: ["preventOverflow"], fn: hide2 }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/offset.js function distanceAndSkiddingToXY(placement, rects, offset4) { var basePlacement = getBasePlacement(placement); var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; var _ref = typeof offset4 === "function" ? offset4(Object.assign({}, rects, { placement })) : offset4, skidding = _ref[0], distance = _ref[1]; skidding = skidding || 0; distance = (distance || 0) * invertDistance; return [left, right].indexOf(basePlacement) >= 0 ? { x: distance, y: skidding } : { x: skidding, y: distance }; } function offset(_ref2) { var state = _ref2.state, options2 = _ref2.options, name = _ref2.name; var _options$offset = options2.offset, offset4 = _options$offset === void 0 ? [0, 0] : _options$offset; var data = placements.reduce(function(acc, placement) { acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset4); return acc; }, {}); var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; if (state.modifiersData.popperOffsets != null) { state.modifiersData.popperOffsets.x += x; state.modifiersData.popperOffsets.y += y; } state.modifiersData[name] = data; } var offset_default; var init_offset = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/offset.js"() { init_getBasePlacement(); init_enums2(); offset_default = { name: "offset", enabled: true, phase: "main", requires: ["popperOffsets"], fn: offset }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js function popperOffsets(_ref) { var state = _ref.state, name = _ref.name; state.modifiersData[name] = computeOffsets({ reference: state.rects.reference, element: state.rects.popper, strategy: "absolute", placement: state.placement }); } var popperOffsets_default; var init_popperOffsets = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"() { init_computeOffsets(); popperOffsets_default = { name: "popperOffsets", enabled: true, phase: "read", fn: popperOffsets, data: {} }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getAltAxis.js function getAltAxis(axis) { return axis === "x" ? "y" : "x"; } var init_getAltAxis = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getAltAxis.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js function preventOverflow(_ref) { var state = _ref.state, options2 = _ref.options, name = _ref.name; var _options$mainAxis = options2.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options2.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options2.boundary, rootBoundary = options2.rootBoundary, altBoundary = options2.altBoundary, padding = options2.padding, _options$tether = options2.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options2.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; var overflow = detectOverflow(state, { boundary, rootBoundary, padding, altBoundary }); var basePlacement = getBasePlacement(state.placement); var variation = getVariation(state.placement); var isBasePlacement = !variation; var mainAxis = getMainAxisFromPlacement(basePlacement); var altAxis = getAltAxis(mainAxis); var popperOffsets2 = state.modifiersData.popperOffsets; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { placement: state.placement })) : tetherOffset; var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { mainAxis: tetherOffsetValue, altAxis: tetherOffsetValue } : Object.assign({ mainAxis: 0, altAxis: 0 }, tetherOffsetValue); var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; var data = { x: 0, y: 0 }; if (!popperOffsets2) { return; } if (checkMainAxis) { var _offsetModifierState$; var mainSide = mainAxis === "y" ? top : left; var altSide = mainAxis === "y" ? bottom : right; var len = mainAxis === "y" ? "height" : "width"; var offset4 = popperOffsets2[mainAxis]; var min3 = offset4 + overflow[mainSide]; var max3 = offset4 - overflow[altSide]; var additive = tether ? -popperRect[len] / 2 : 0; var minLen = variation === start ? referenceRect[len] : popperRect[len]; var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; var arrowElement = state.elements.arrow; var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { width: 0, height: 0 }; var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); var arrowPaddingMin = arrowPaddingObject[mainSide]; var arrowPaddingMax = arrowPaddingObject[altSide]; var arrowLen = within(0, referenceRect[len], arrowRect[len]); var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; var tetherMin = offset4 + minOffset - offsetModifierValue - clientOffset; var tetherMax = offset4 + maxOffset - offsetModifierValue; var preventedOffset = within(tether ? min(min3, tetherMin) : min3, offset4, tether ? max(max3, tetherMax) : max3); popperOffsets2[mainAxis] = preventedOffset; data[mainAxis] = preventedOffset - offset4; } if (checkAltAxis) { var _offsetModifierState$2; var _mainSide = mainAxis === "x" ? top : left; var _altSide = mainAxis === "x" ? bottom : right; var _offset = popperOffsets2[altAxis]; var _len = altAxis === "y" ? "height" : "width"; var _min = _offset + overflow[_mainSide]; var _max = _offset - overflow[_altSide]; var isOriginSide = [top, left].indexOf(basePlacement) !== -1; var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); popperOffsets2[altAxis] = _preventedOffset; data[altAxis] = _preventedOffset - _offset; } state.modifiersData[name] = data; } var preventOverflow_default; var init_preventOverflow = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js"() { init_enums2(); init_getBasePlacement(); init_getMainAxisFromPlacement(); init_getAltAxis(); init_within(); init_getLayoutRect(); init_getOffsetParent(); init_detectOverflow(); init_getVariation(); init_getFreshSideObject(); init_math(); preventOverflow_default = { name: "preventOverflow", enabled: true, phase: "main", fn: preventOverflow, requiresIfExists: ["offset"] }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/index.js var init_modifiers = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/index.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js function getHTMLElementScroll(element) { return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; } var init_getHTMLElementScroll = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js function getNodeScroll(node) { if (node === getWindow(node) || !isHTMLElement(node)) { return getWindowScroll(node); } else { return getHTMLElementScroll(node); } } var init_getNodeScroll = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js"() { init_getWindowScroll(); init_getWindow(); init_instanceOf(); init_getHTMLElementScroll(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js function isElementScaled(element) { var rect = element.getBoundingClientRect(); var scaleX = round(rect.width) / element.offsetWidth || 1; var scaleY = round(rect.height) / element.offsetHeight || 1; return scaleX !== 1 || scaleY !== 1; } function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { if (isFixed === void 0) { isFixed = false; } var isOffsetParentAnElement = isHTMLElement(offsetParent); var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); var documentElement = getDocumentElement(offsetParent); var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); var scroll = { scrollLeft: 0, scrollTop: 0 }; var offsets = { x: 0, y: 0 }; if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 isScrollParent(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { offsets = getBoundingClientRect(offsetParent, true); offsets.x += offsetParent.clientLeft; offsets.y += offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX(documentElement); } } return { x: rect.left + scroll.scrollLeft - offsets.x, y: rect.top + scroll.scrollTop - offsets.y, width: rect.width, height: rect.height }; } var init_getCompositeRect = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js"() { init_getBoundingClientRect(); init_getNodeScroll(); init_getNodeName(); init_instanceOf(); init_getWindowScrollBarX(); init_getDocumentElement(); init_isScrollParent(); init_math(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/orderModifiers.js function order(modifiers) { var map = /* @__PURE__ */ new Map(); var visited = /* @__PURE__ */ new Set(); var result = []; modifiers.forEach(function(modifier) { map.set(modifier.name, modifier); }); function sort(modifier) { visited.add(modifier.name); var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); requires.forEach(function(dep) { if (!visited.has(dep)) { var depModifier = map.get(dep); if (depModifier) { sort(depModifier); } } }); result.push(modifier); } modifiers.forEach(function(modifier) { if (!visited.has(modifier.name)) { sort(modifier); } }); return result; } function orderModifiers(modifiers) { var orderedModifiers = order(modifiers); return modifierPhases.reduce(function(acc, phase) { return acc.concat(orderedModifiers.filter(function(modifier) { return modifier.phase === phase; })); }, []); } var init_orderModifiers = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/orderModifiers.js"() { init_enums2(); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/debounce.js function debounce(fn2) { var pending; return function() { if (!pending) { pending = new Promise(function(resolve) { Promise.resolve().then(function() { pending = void 0; resolve(fn2()); }); }); } return pending; }; } var init_debounce = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/debounce.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergeByName.js function mergeByName(modifiers) { var merged = modifiers.reduce(function(merged2, current) { var existing = merged2[current.name]; merged2[current.name] = existing ? Object.assign({}, existing, current, { options: Object.assign({}, existing.options, current.options), data: Object.assign({}, existing.data, current.data) }) : current; return merged2; }, {}); return Object.keys(merged).map(function(key) { return merged[key]; }); } var init_mergeByName = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergeByName.js"() { } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/createPopper.js function areValidElements() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return !args.some(function(element) { return !(element && typeof element.getBoundingClientRect === "function"); }); } function popperGenerator(generatorOptions) { if (generatorOptions === void 0) { generatorOptions = {}; } var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; return function createPopper2(reference2, popper2, options2) { if (options2 === void 0) { options2 = defaultOptions; } var state = { placement: "bottom", orderedModifiers: [], options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), modifiersData: {}, elements: { reference: reference2, popper: popper2 }, attributes: {}, styles: {} }; var effectCleanupFns = []; var isDestroyed = false; var instance = { state, setOptions: function setOptions(setOptionsAction) { var options3 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; cleanupModifierEffects(); state.options = Object.assign({}, defaultOptions, state.options, options3); state.scrollParents = { reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], popper: listScrollParents(popper2) }; var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); state.orderedModifiers = orderedModifiers.filter(function(m) { return m.enabled; }); runModifierEffects(); return instance.update(); }, // Sync update – it will always be executed, even if not necessary. This // is useful for low frequency updates where sync behavior simplifies the // logic. // For high frequency updates (e.g. `resize` and `scroll` events), always // prefer the async Popper#update method forceUpdate: function forceUpdate() { if (isDestroyed) { return; } var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; if (!areValidElements(reference3, popper3)) { return; } state.rects = { reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), popper: getLayoutRect(popper3) }; state.reset = false; state.placement = state.options.placement; state.orderedModifiers.forEach(function(modifier) { return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); }); for (var index = 0; index < state.orderedModifiers.length; index++) { if (state.reset === true) { state.reset = false; index = -1; continue; } var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; if (typeof fn2 === "function") { state = fn2({ state, options: _options, name, instance }) || state; } } }, // Async and optimistically optimized update – it will not be executed if // not necessary (debounced to run at most once-per-tick) update: debounce(function() { return new Promise(function(resolve) { instance.forceUpdate(); resolve(state); }); }), destroy: function destroy() { cleanupModifierEffects(); isDestroyed = true; } }; if (!areValidElements(reference2, popper2)) { return instance; } instance.setOptions(options2).then(function(state2) { if (!isDestroyed && options2.onFirstUpdate) { options2.onFirstUpdate(state2); } }); function runModifierEffects() { state.orderedModifiers.forEach(function(_ref) { var name = _ref.name, _ref$options = _ref.options, options3 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect; if (typeof effect4 === "function") { var cleanupFn = effect4({ state, name, instance, options: options3 }); var noopFn = function noopFn2() { }; effectCleanupFns.push(cleanupFn || noopFn); } }); } function cleanupModifierEffects() { effectCleanupFns.forEach(function(fn2) { return fn2(); }); effectCleanupFns = []; } return instance; }; } var DEFAULT_OPTIONS; var init_createPopper = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/createPopper.js"() { init_getCompositeRect(); init_getLayoutRect(); init_listScrollParents(); init_getOffsetParent(); init_orderModifiers(); init_debounce(); init_mergeByName(); init_instanceOf(); DEFAULT_OPTIONS = { placement: "bottom", modifiers: [], strategy: "absolute" }; } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper.js var defaultModifiers, createPopper; var init_popper = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper.js"() { init_createPopper(); init_eventListeners(); init_popperOffsets(); init_computeStyles(); init_applyStyles(); init_offset(); init_flip(); init_preventOverflow(); init_arrow(); init_hide(); init_modifiers(); defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; createPopper = /* @__PURE__ */ popperGenerator({ defaultModifiers }); } }); // node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/index.js var init_lib = __esm({ "node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/index.js"() { init_enums2(); init_modifiers(); init_popper(); } }); // source/types/base.mjs function checkInstanceSymbol(obj) { if (this.hasOwnProperty(instanceSymbol) === false) { return false; } const proto = obj?.constructor; if (proto === void 0 || proto === null || typeof proto !== "object" && typeof proto !== "function") { return false; } if (proto.hasOwnProperty(instanceSymbol) !== true) { return checkInstanceSymbol.apply(this, [obj.__proto__]); } const symbol2 = proto[instanceSymbol]; if (symbol2 === void 0) { if (obj.__proto__) { return checkInstanceSymbol(obj.__proto__); } else { return false; } } if (symbol2 === this[instanceSymbol]) { return true; } return checkInstanceSymbol.apply(this, [obj.__proto__]); } var Base; var init_base = __esm({ "source/types/base.mjs"() { init_constants(); Base = class extends Object { /** * @return {string} */ toString() { return JSON.stringify(this); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/base"); } /** * This method is called by the `instanceof` operator. * @param that * @return {boolean} * @since 2.1.0 */ static [Symbol.hasInstance](that) { if (that === void 0 || that === null || typeof that !== "object" && typeof that !== "function") { return false; } const thatClass = Object.getPrototypeOf(that); if (thatClass === void 0 || thatClass === null || typeof thatClass !== "object" && typeof thatClass !== "function") { return false; } if (checkInstanceSymbol.apply(this, [thatClass]) === true) { return true; } return super[Symbol.hasInstance](that); } }; } }); // source/types/stack.mjs var Stack; var init_stack = __esm({ "source/types/stack.mjs"() { init_base(); init_constants(); Stack = class extends Base { /** * */ constructor() { super(); this.data = []; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/stack"); } /** * @return {boolean} */ isEmpty() { return this.data.length === 0; } /** * looks at the object at the top of this stack without removing it from the stack. * * @return {*} */ peek() { if (this.isEmpty()) { return void 0; } return this.data?.[this.data.length - 1]; } /** * pushes an item onto the top of this stack. * * @param {*} value * @return {Queue} */ push(value) { this.data.push(value); return this; } /** * remove all entries * * @return {Queue} */ clear() { this.data = []; return this; } /** * removes the object at the top of this stack and returns * that object as the value of this function. is the stack empty * the return value is undefined. * * @return {*} */ pop() { if (this.isEmpty()) { return void 0; } return this.data.pop(); } }; } }); // source/data/pathfinder.mjs function iterate(subject, path, check) { if (check === void 0) { check = false; } validateBoolean(check); const result = /* @__PURE__ */ new Map(); if (isArray(path)) { path = path.join(DELIMITER); } if (isObject(subject) || isArray(subject)) { for (const [key, value] of Object.entries(subject)) { result.set(key, getValueViaPath.call(this, value, path, check)); } } else { const key = path.split(DELIMITER).shift(); result.set(key, getValueViaPath.call(this, subject, path, check)); } return result; } function getValueViaPath(subject, path, check) { if (check === void 0) { check = false; } validateBoolean(check); if (!(isArray(path) || isString(path))) { throw new Error( "type error: a path must be a string or an array in getValueViaPath" ); } let parts; if (isString(path)) { if (path === "") { return subject; } parts = path.split(DELIMITER); } let current = parts.shift(); if (current === this.wildCard) { return iterate.call(this, subject, parts.join(DELIMITER), check); } if (isObject(subject) || isArray(subject)) { let anchor; if (subject instanceof Map || subject instanceof WeakMap) { anchor = subject.get(current); } else if (subject instanceof Set || subject instanceof WeakSet) { current = parseInt(current); validateInteger(current); anchor = [...subject]?.[current]; } else if (typeof WeakRef === "function" && subject instanceof WeakRef) { throw Error("unsupported action for this data type (WeakRef)"); } else if (isArray(subject)) { current = parseInt(current); validateInteger(current); anchor = subject?.[current]; } else { anchor = subject?.[current]; } if (isObject(anchor) || isArray(anchor)) { return getValueViaPath.call(this, anchor, parts.join(DELIMITER), check); } if (parts.length > 0) { throw Error(`the journey is not at its end (${parts.join(DELIMITER)})`); } if (check === true) { const descriptor = Object.getOwnPropertyDescriptor( Object.getPrototypeOf(subject), current ); if (!subject.hasOwnProperty(current) && descriptor === void 0) { throw Error("unknown value " + current); } } return anchor; } throw TypeError(`unsupported type ${typeof subject} for path ${path}`); } function setValueViaPath(subject, path, value) { if (!(isArray(path) || isString(path))) { throw new Error("type error: a path must be a string or an array"); } let parts; if (isArray(path)) { if (path.length === 0) { return; } parts = path; } else { parts = path.split(DELIMITER); } let last = parts.pop(); const subpath = parts.join(DELIMITER); const stack = new Stack(); let current = subpath; while (true) { try { getValueViaPath.call(this, subject, current, true); break; } catch (e) { } stack.push(current); parts.pop(); current = parts.join(DELIMITER); if (current === "") break; } while (!stack.isEmpty()) { current = stack.pop(); let obj = {}; if (!stack.isEmpty()) { const n = stack.peek().split(DELIMITER).pop(); if (isInteger(parseInt(n))) { obj = []; } } setValueViaPath.call(this, subject, current, obj); } const anchor = getValueViaPath.call(this, subject, subpath); if (!(isObject(subject) || isArray(subject))) { throw TypeError(`unsupported type: ${typeof subject} in setValueViaPath`); } if (anchor instanceof Map || anchor instanceof WeakMap) { anchor.set(last, value); } else if (anchor instanceof Set || anchor instanceof WeakSet) { anchor.append(value); } else if (typeof WeakRef === "function" && anchor instanceof WeakRef) { throw Error("unsupported action for this data type in setValueViaPath"); } else if (isArray(anchor)) { last = parseInt(last); validateInteger(last); assignProperty(anchor, "" + last, value); } else { assignProperty(anchor, last, value); } } function assignProperty(object, key, value) { if (!object.hasOwnProperty(key)) { object[key] = value; return; } if (value === void 0) { delete object[key]; } object[key] = value; } function deleteValueViaPath(subject, path) { if (!(isArray(path) || isString(path))) { throw new Error( "type error: a path must be a string or an array in deleteValueViaPath" ); } let parts; if (isArray(path)) { if (path.length === 0) { return; } parts = path; } else { parts = path.split(DELIMITER); } let last = parts.pop(); const subPath = parts.join(DELIMITER); const anchor = getValueViaPath.call(this, subject, subPath); if (anchor instanceof Map) { anchor.delete(last); } else if (anchor instanceof Set || anchor instanceof WeakMap || anchor instanceof WeakSet || typeof WeakRef === "function" && anchor instanceof WeakRef) { throw Error("unsupported action for this data type in deleteValueViaPath"); } else if (isArray(anchor)) { last = parseInt(last); validateInteger(last); delete anchor[last]; } else { delete anchor[last]; } } var DELIMITER, WILDCARD, Pathfinder; var init_pathfinder = __esm({ "source/data/pathfinder.mjs"() { init_base(); init_is(); init_stack(); init_validate(); DELIMITER = "."; WILDCARD = "*"; Pathfinder = class extends Base { /** * Creates a new instance of the constructor. * * @param {object} object - The object parameter for the constructor. * * @throws {Error} Throws an error if the provided object parameter is a simple type. */ constructor(object) { super(); if (isPrimitive(object)) { throw new Error("the parameter must not be a simple type"); } this.object = object; this.wildCard = WILDCARD; } /** * set wildcard * * @param {string} wildcard * @return {Pathfinder} * @since 1.7.0 */ setWildCard(wildcard) { validateString(wildcard); this.wildCard = wildcard; return this; } /** * * @param {string|array} path * @since 1.4.0 * @return {*} * @throws {TypeError} unsupported type * @throws {Error} the journey is not at its end * @throws {TypeError} value is not a string * @throws {TypeError} value is not an integer * @throws {Error} unsupported action for this data type */ getVia(path) { return getValueViaPath.call(this, this.object, path); } /** * * @param {string|array} path * @param {*} value * @return {Pathfinder} * @since 1.4.0 * @throws {TypeError} unsupported type * @throws {TypeError} value is not a string * @throws {TypeError} value is not an integer * @throws {Error} unsupported action for this data type */ setVia(path, value) { setValueViaPath.call(this, this.object, path, value); return this; } /** * Delete Via Path * * @param {string|array} path * @return {Pathfinder} * @since 1.6.0 * @throws {TypeError} unsupported type * @throws {TypeError} value is not a string * @throws {TypeError} value is not an integer * @throws {Error} unsupported action for this data type */ deleteVia(path) { deleteValueViaPath.call(this, this.object, path); return this; } /** * * @param {string|array} path * @return {bool} * @throws {TypeError} unsupported type * @throws {TypeError} value is not a string * @throws {TypeError} value is not an integer * @since 1.4.0 */ exists(path) { try { getValueViaPath.call(this, this.object, path, true); return true; } catch (e) { } return false; } }; } }); // source/types/tokenlist.mjs function toggleValue(token) { if (!(this instanceof TokenList)) throw Error("must be called with TokenList.call"); validateString(token); token = token.trim(); if (this.contains(token)) { this.remove(token); return this; } this.add(token); return this; } var TokenList; var init_tokenlist = __esm({ "source/types/tokenlist.mjs"() { init_is(); init_validate(); init_base(); TokenList = class extends Base { /** * * @param {array|string|iteratable} init */ constructor(init3) { super(); this.tokens = /* @__PURE__ */ new Set(); if (typeof init3 !== "undefined") { this.add(init3); } } /** * Iterator protocol * * @return {Symbol.iterator} */ getIterator() { return this[Symbol.iterator](); } /** * Iterator * * @return {{next: ((function(): ({value: *, done: boolean}))|*)}} */ [Symbol.iterator]() { let index = 0; const entries = this.entries(); return { next: () => { if (index < entries.length) { return { value: entries?.[index++], done: false }; } else { return { done: true }; } } }; } /** * Returns true if it contains token, otherwise false * * @externalExample ../../example/types/tokenlist-2.mjs * @param {array|string|iteratable} value * @return {boolean} */ contains(value) { if (isString(value)) { value = value.trim(); let counter = 0; value.split(" ").forEach((token) => { if (this.tokens.has(token.trim()) === false) return false; counter++; }); return counter > 0 ? true : false; } if (isIterable(value)) { let counter = 0; for (const token of value) { validateString(token); if (this.tokens.has(token.trim()) === false) return false; counter++; } return counter > 0 ? true : false; } return false; } /** * Add tokens * * @externalExample ../../example/types/tokenlist-3.mjs * @param {array|string|iteratable} value * @return {TokenList} * @throws {TypeError} unsupported value */ add(value) { if (isString(value)) { value.split(" ").forEach((token) => { this.tokens.add(token.trim()); }); } else if (isIterable(value)) { for (const token of value) { validateString(token); this.tokens.add(token.trim()); } } else if (typeof value !== "undefined") { throw new TypeError("unsupported value"); } return this; } /** * remove all tokens * * @return {TokenList} */ clear() { this.tokens.clear(); return this; } /** * Removes token * * @externalExample ../../example/types/tokenlist-4.mjs * @param {array|string|iteratable} value * @return {TokenList} * @throws {TypeError} unsupported value */ remove(value) { if (isString(value)) { value.split(" ").forEach((token) => { this.tokens.delete(token.trim()); }); } else if (isIterable(value)) { for (const token of value) { validateString(token); this.tokens.delete(token.trim()); } } else if (typeof value !== "undefined") { throw new TypeError("unsupported value", "types/tokenlist.mjs"); } return this; } /** * this method replaces a token with a new token. * * if the passed token exists, it is replaced with newToken and TokenList is returned. * if the token does not exist, newToken is not set and TokenList is returned. * * @param {string} token * @param {string} newToken * @return {TokenList} */ replace(token, newToken) { validateString(token); validateString(newToken); if (!this.contains(token)) { return this; } const a2 = Array.from(this.tokens); const i = a2.indexOf(token); if (i === -1) return this; a2.splice(i, 1, newToken); this.tokens = /* @__PURE__ */ new Set(); this.add(a2); return this; } /** * Removes token from string. If token doesn't exist it's added. * * @externalExample ../../example/types/tokenlist-5.mjs * @param {array|string|iteratable} value * @return {boolean} * @throws {TypeError} unsupported value */ toggle(value) { if (isString(value)) { value.split(" ").forEach((token) => { toggleValue.call(this, token); }); } else if (isIterable(value)) { for (const token of value) { toggleValue.call(this, token); } } else if (typeof value !== "undefined") { throw new TypeError("unsupported value", "types/tokenlist.mjs"); } return this; } /** * returns an array with all tokens * * @return {array} */ entries() { return Array.from(this.tokens); } /** * executes the provided function with each value of the set * * @param {function} callback * @return {TokenList} */ forEach(callback) { validateFunction(callback); this.tokens.forEach(callback); return this; } /** * returns the individual tokens separated by a blank character * * @return {string} */ toString() { return this.entries().join(" "); } }; } }); // source/dom/constants.mjs var DEFAULT_THEME, ATTRIBUTE_PREFIX, ATTRIBUTE_OPTIONS, ATTRIBUTE_SCRIPT_HOST, ATTRIBUTE_OPTIONS_SELECTOR, ATTRIBUTE_INIT_CALLBACK, initControlCallbackName, ATTRIBUTE_THEME_PREFIX, ATTRIBUTE_THEME_NAME, ATTRIBUTE_UPDATER_ATTRIBUTES, ATTRIBUTE_UPDATER_SELECT_THIS, ATTRIBUTE_UPDATER_REPLACE, ATTRIBUTE_UPDATER_INSERT, ATTRIBUTE_UPDATER_INSERT_REFERENCE, ATTRIBUTE_UPDATER_REMOVE, ATTRIBUTE_UPDATER_BIND, ATTRIBUTE_UPDATER_BIND_TYPE, ATTRIBUTE_FORM_BIND, ATTRIBUTE_FORM_BIND_TYPE, ATTRIBUTE_TEMPLATE_PREFIX, ATTRIBUTE_ROLE, ATTRIBUTE_DISABLED, ATTRIBUTE_OBJECTLINK, ATTRIBUTE_ERRORMESSAGE, objectUpdaterLinkSymbol, customElementUpdaterLinkSymbol, TAG_SCRIPT, TAG_LINK, ATTRIBUTE_ID, ATTRIBUTE_CLASS, ATTRIBUTE_TITLE, ATTRIBUTE_SRC, ATTRIBUTE_HREF, ATTRIBUTE_TYPE, ATTRIBUTE_NONCE; var init_constants2 = __esm({ "source/dom/constants.mjs"() { DEFAULT_THEME = "monster"; ATTRIBUTE_PREFIX = "data-monster-"; ATTRIBUTE_OPTIONS = `${ATTRIBUTE_PREFIX}options`; ATTRIBUTE_SCRIPT_HOST = `${ATTRIBUTE_PREFIX}script-host`; ATTRIBUTE_OPTIONS_SELECTOR = `${ATTRIBUTE_PREFIX}options-selector`; ATTRIBUTE_INIT_CALLBACK = `${ATTRIBUTE_PREFIX}init-callback`; initControlCallbackName = `initCustomControlCallback`; ATTRIBUTE_THEME_PREFIX = `${ATTRIBUTE_PREFIX}theme-`; ATTRIBUTE_THEME_NAME = `${ATTRIBUTE_THEME_PREFIX}name`; ATTRIBUTE_UPDATER_ATTRIBUTES = `${ATTRIBUTE_PREFIX}attributes`; ATTRIBUTE_UPDATER_SELECT_THIS = `${ATTRIBUTE_PREFIX}select-this`; ATTRIBUTE_UPDATER_REPLACE = `${ATTRIBUTE_PREFIX}replace`; ATTRIBUTE_UPDATER_INSERT = `${ATTRIBUTE_PREFIX}insert`; ATTRIBUTE_UPDATER_INSERT_REFERENCE = `${ATTRIBUTE_PREFIX}insert-reference`; ATTRIBUTE_UPDATER_REMOVE = `${ATTRIBUTE_PREFIX}remove`; ATTRIBUTE_UPDATER_BIND = `${ATTRIBUTE_PREFIX}bind`; ATTRIBUTE_UPDATER_BIND_TYPE = `${ATTRIBUTE_UPDATER_BIND}-type`; ATTRIBUTE_FORM_BIND = `${ATTRIBUTE_PREFIX}form-bind`; ATTRIBUTE_FORM_BIND_TYPE = `${ATTRIBUTE_PREFIX}form-bind-type`; ATTRIBUTE_TEMPLATE_PREFIX = `${ATTRIBUTE_PREFIX}template-prefix`; ATTRIBUTE_ROLE = `${ATTRIBUTE_PREFIX}role`; ATTRIBUTE_DISABLED = "disabled"; ATTRIBUTE_OBJECTLINK = `${ATTRIBUTE_PREFIX}objectlink`; ATTRIBUTE_ERRORMESSAGE = `${ATTRIBUTE_PREFIX}error`; objectUpdaterLinkSymbol = Symbol.for( "@schukai/monster/dom/@@object-updater-link" ); customElementUpdaterLinkSymbol = Symbol.for( "@schukai/monster/dom/custom-element@@options-updater-link" ); TAG_SCRIPT = "script"; TAG_LINK = "link"; ATTRIBUTE_ID = "id"; ATTRIBUTE_CLASS = "class"; ATTRIBUTE_TITLE = "title"; ATTRIBUTE_SRC = "src"; ATTRIBUTE_HREF = "href"; ATTRIBUTE_TYPE = "type"; ATTRIBUTE_NONCE = "nonce"; } }); // source/dom/attributes.mjs function findClosestObjectLink(element) { return findClosestByAttribute(element, ATTRIBUTE_OBJECTLINK); } function addToObjectLink(element, symbol2, object) { validateInstance(element, HTMLElement); validateSymbol(symbol2); if (element?.[symbol2] === void 0) { element[symbol2] = /* @__PURE__ */ new Set(); } addAttributeToken(element, ATTRIBUTE_OBJECTLINK, symbol2.toString()); element[symbol2].add(object); return element; } function removeObjectLink(element, symbol2) { validateInstance(element, HTMLElement); validateSymbol(symbol2); if (element?.[symbol2] === void 0) { return element; } removeAttributeToken(element, ATTRIBUTE_OBJECTLINK, symbol2.toString()); delete element[symbol2]; return element; } function hasObjectLink(element, symbol2) { validateInstance(element, HTMLElement); validateSymbol(symbol2); if (element?.[symbol2] === void 0) { return false; } return containsAttributeToken( element, ATTRIBUTE_OBJECTLINK, symbol2.toString() ); } function getLinkedObjects(element, symbol2) { validateInstance(element, HTMLElement); validateSymbol(symbol2); if (element?.[symbol2] === void 0) { throw new Error(`there is no object link for ${symbol2.toString()}`); } return element?.[symbol2][Symbol.iterator](); } function toggleAttributeToken(element, key, token) { validateInstance(element, HTMLElement); validateString(token); validateString(key); if (!element.hasAttribute(key)) { element.setAttribute(key, token); return element; } element.setAttribute( key, new TokenList(element.getAttribute(key)).toggle(token).toString() ); return element; } function addAttributeToken(element, key, token) { validateInstance(element, HTMLElement); validateString(token); validateString(key); if (!element.hasAttribute(key)) { element.setAttribute(key, token); return element; } element.setAttribute( key, new TokenList(element.getAttribute(key)).add(token).toString() ); return element; } function removeAttributeToken(element, key, token) { validateInstance(element, HTMLElement); validateString(token); validateString(key); if (!element.hasAttribute(key)) { return element; } element.setAttribute( key, new TokenList(element.getAttribute(key)).remove(token).toString() ); return element; } function containsAttributeToken(element, key, token) { validateInstance(element, HTMLElement); validateString(token); validateString(key); if (!element.hasAttribute(key)) { return false; } return new TokenList(element.getAttribute(key)).contains(token); } function replaceAttributeToken(element, key, from, to) { validateInstance(element, HTMLElement); validateString(from); validateString(to); validateString(key); if (!element.hasAttribute(key)) { return element; } element.setAttribute( key, new TokenList(element.getAttribute(key)).replace(from, to).toString() ); return element; } function clearAttributeTokens(element, key) { validateInstance(element, HTMLElement); validateString(key); if (!element.hasAttribute(key)) { return element; } element.setAttribute(key, ""); return element; } function findClosestByAttribute(element, key, value) { validateInstance(element, getGlobalFunction("HTMLElement")); if (element.hasAttribute(key)) { if (value === void 0) { return element; } if (element.getAttribute(key) === value) { return element; } } let selector = validateString(key); if (value !== void 0) selector += `=${validateString(value)}`; const result = element.closest(`[${selector}]`); if (result instanceof HTMLElement) { return result; } return void 0; } function findClosestByClass(element, className) { validateInstance(element, getGlobalFunction("HTMLElement")); if (element?.classList?.contains(validateString(className))) { return element; } const result = element.closest(`.${className}`); if (result instanceof HTMLElement) { return result; } return void 0; } var init_attributes = __esm({ "source/dom/attributes.mjs"() { init_global(); init_tokenlist(); init_validate(); init_constants2(); } }); // source/dom/util.mjs function getDocument() { const document2 = getGlobal()?.["document"]; if (typeof document2 !== "object") { throw new Error("not supported environment"); } return document2; } function getWindow2() { const window2 = getGlobal()?.["window"]; if (typeof window2 !== "object") { throw new Error("not supported environment"); } return window2; } function getDocumentFragmentFromString(html) { validateString(html); const document2 = getDocument(); const template = document2.createElement("template"); template.innerHTML = html; return template.content; } function findElementWithIdUpwards(element, targetId) { if (!element) { return null; } if (element.id === targetId) { return element; } if (element.shadowRoot) { const target = element.shadowRoot.getElementById(targetId); if (target) { return target; } } if (element === document.documentElement || element === document) { const target = document.getElementById(targetId); if (target) { return target; } } const rootNode = element.getRootNode(); if (rootNode && rootNode instanceof ShadowRoot) { return findElementWithIdUpwards(rootNode.host, targetId); } return findElementWithIdUpwards(element.parentElement, targetId); } function findElementWithSelectorUpwards(element, selector) { if (!element || !selector) { return null; } if (element.shadowRoot) { const target = element.shadowRoot.querySelector(selector); if (target) { return target; } } if (element === document.documentElement) { const target = document.querySelector(selector); if (target) { return target; } } const rootNode = element.getRootNode(); if (rootNode && rootNode instanceof ShadowRoot) { return findElementWithSelectorUpwards(rootNode.host, selector); } return findElementWithSelectorUpwards(element.parentElement, selector); } function traverseShadowRoots(element) { let currentRoot = element.shadowRoot; let currentParent = element.parentNode; while (currentParent && currentParent.nodeType !== Node.DOCUMENT_NODE && currentParent.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { if (currentRoot && currentRoot.parentNode) { currentParent = currentRoot.parentNode; currentRoot = currentParent.shadowRoot; } else if (currentParent.parentNode) { currentParent = currentParent.parentNode; currentRoot = null; } else if (currentRoot && currentRoot.host && currentRoot.host.nodeType === Node.DOCUMENT_NODE) { currentParent = currentRoot.host; currentRoot = null; } else { currentParent = null; currentRoot = null; } } return currentParent; } function getContainingDocument(element) { if (!element || !(element instanceof HTMLElement || element instanceof element.ownerDocument.defaultView.HTMLElement)) { throw new Error("Invalid argument. Expected an HTMLElement."); } return traverseShadowRoots(element) || null; } var init_util = __esm({ "source/dom/util.mjs"() { init_global(); init_validate(); } }); // source/util/clone.mjs function clone(obj) { if (null === obj) { return obj; } if (isPrimitive(obj)) { return obj; } if (isFunction(obj)) { return obj; } if (isArray(obj)) { const copy = []; for (let i = 0, len = obj.length; i < len; i++) { copy[i] = clone(obj[i]); } return copy; } if (isObject(obj)) { if (obj instanceof Date) { const copy = /* @__PURE__ */ new Date(); copy.setTime(obj.getTime()); return copy; } if (typeof Element !== "undefined" && obj instanceof Element) return obj; if (typeof Document !== "undefined" && obj instanceof Document) return obj; if (typeof DocumentFragment !== "undefined" && obj instanceof DocumentFragment) return obj; if (obj === getGlobal()) return obj; if (typeof window !== "undefined" && obj === window) return obj; if (typeof document !== "undefined" && obj === document) return obj; if (typeof navigator !== "undefined" && obj === navigator) return obj; if (typeof JSON !== "undefined" && obj === JSON) return obj; if (isProxy(obj)) return obj; return cloneObject(obj); } throw new Error("unable to clone obj! its type isn't supported."); } function cloneObject(obj) { validateObject(obj); const fkt = obj?.["constructor"]; if (typeOf(fkt) === "function") { const prototype = fkt?.prototype; if (typeof prototype === "object") { if (prototype.hasOwnProperty("getClone") && typeOf(obj.getClone) === "function") { return obj.getClone(); } } } let copy = {}; if (typeof obj.constructor === "function" && typeof obj.constructor.call === "function") { copy = new obj.constructor(); } for (const key in obj) { if (!obj.hasOwnProperty(key)) { continue; } if (isPrimitive(obj[key])) { copy[key] = obj[key]; continue; } copy[key] = clone(obj[key]); } return copy; } var init_clone = __esm({ "source/util/clone.mjs"() { init_global(); init_is(); init_typeof(); init_validate(); } }); // source/i18n/locale.mjs function parseLocale(locale) { locale = validateString(locale).replace(/_/g, "-"); let language; let region; let variants; let parts; let script; let extlang; const regexRegular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)"; const regexIrregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)"; const regexGrandfathered = `(${regexIrregular}|${regexRegular})`; const regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)"; const regexSingleton = "[0-9A-WY-Za-wy-z]"; const regexExtension = `(${regexSingleton}(-[A-Za-z0-9]{2,8})+)`; const regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})"; const regexRegion = "([A-Za-z]{2}|[0-9]{3})"; const regexScript = "([A-Za-z]{4})"; const regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})"; const regexLanguage = `(([A-Za-z]{2,3}(-${regexExtlang})?)|[A-Za-z]{4}|[A-Za-z]{5,8})`; const regexLangtag = `(${regexLanguage}(-${regexScript})?(-${regexRegion})?(-${regexVariant})*(-${regexExtension})*(-${regexPrivateUse})?)`; const regexLanguageTag = `^(${regexGrandfathered}|${regexLangtag}|${regexPrivateUse})$`; const regex = new RegExp(regexLanguageTag); let match; if ((match = regex.exec(locale)) !== null) { if (match.index === regex.lastIndex) { regex.lastIndex++; } } if (match === void 0 || match === null) { throw new Error("unsupported locale"); } if (match[6] !== void 0) { language = match[6]; parts = language.split("-"); if (parts.length > 1) { language = parts[0]; extlang = parts[1]; } } if (match[14] !== void 0) { region = match[14]; } if (match[12] !== void 0) { script = match[12]; } if (match[16] !== void 0) { variants = match[16]; } return new Locale(language, region, script, variants, extlang); } var propertiesSymbol, localeStringSymbol, Locale; var init_locale = __esm({ "source/i18n/locale.mjs"() { init_constants(); init_base(); init_validate(); init_clone(); propertiesSymbol = Symbol("properties"); localeStringSymbol = Symbol("localeString"); Locale = class extends Base { /** * @param {string} language * @param {string} [region] * @param {string} [script] * @param {string} [variants] * @param {string} [extlang] * @param {string} [privateUse] * @throws {Error} unsupported locale */ constructor(language, region, script, variants, extlang, privateUse) { super(); this[propertiesSymbol] = { language: language === void 0 ? void 0 : validateString(language), script: script === void 0 ? void 0 : validateString(script), region: region === void 0 ? void 0 : validateString(region), variants: variants === void 0 ? void 0 : validateString(variants), extlang: extlang === void 0 ? void 0 : validateString(extlang), privateUse: privateUse === void 0 ? void 0 : validateString(privateUse) }; const s = []; if (language !== void 0) s.push(language); if (script !== void 0) s.push(script); if (region !== void 0) s.push(region); if (variants !== void 0) s.push(variants); if (extlang !== void 0) s.push(extlang); if (privateUse !== void 0) s.push(privateUse); if (s.length === 0) { throw new Error("unsupported locale"); } this[localeStringSymbol] = s.join("-"); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 3.27.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/i18n/locale@@instance"); } /** * @return {string} */ get localeString() { return this[localeStringSymbol]; } /** * @return {string|undefined} */ get language() { return this[propertiesSymbol].language; } /** * @return {string|undefined} */ get region() { return this[propertiesSymbol].region; } /** * @return {string|undefined} */ get script() { return this[propertiesSymbol].script; } /** * @return {string|undefined} */ get variants() { return this[propertiesSymbol].variants; } /** * @return {string|undefined} */ get extlang() { return this[propertiesSymbol].extlang; } /** * @return {string|undefined} */ get privateUse() { return this[propertiesSymbol].privateValue; } /** * @return {string} */ toString() { return `${this.localeString}`; } /** * The structure has the following: language, script, region, variants, extlang, privateUse * * @return {Monster.I18n.LocaleMap} */ getMap() { return clone(this[propertiesSymbol]); } }; } }); // source/dom/locale.mjs function getLocaleOfDocument() { const document2 = getDocument(); const html = document2.querySelector("html"); if (html instanceof HTMLElement && html.hasAttribute("lang")) { const locale = html.getAttribute("lang"); if (locale) { return new parseLocale(locale); } } const navigatorLanguage = getNavigatorLanguage(); if (navigatorLanguage) { return parseLocale(navigatorLanguage); } return parseLocale(DEFAULT_LANGUAGE); } var DEFAULT_LANGUAGE, getNavigatorLanguage; var init_locale2 = __esm({ "source/dom/locale.mjs"() { init_locale(); init_util(); init_global(); DEFAULT_LANGUAGE = "en"; getNavigatorLanguage = () => { const navigator2 = getGlobalObject("navigator"); if (navigator2 === void 0) { return void 0; } if (navigator2.hasOwnProperty("language")) { const language = navigator2.language; if (typeof language === "string" && language.length > 0) { return language; } } const languages2 = navigator2?.languages; if (Array.isArray(languages2) && languages2.length > 0) { return languages2[0]; } return void 0; }; } }); // source/types/id.mjs var internalCounter, ID; var init_id = __esm({ "source/types/id.mjs"() { init_base(); init_validate(); internalCounter = /* @__PURE__ */ new Map(); ID = class extends Base { /** * create new id with prefix * * @param {string} prefix */ constructor(prefix) { super(); if (prefix === void 0) { prefix = "id"; } validateString(prefix); if (!internalCounter.has(prefix)) { internalCounter.set(prefix, 1); } let count = internalCounter.get(prefix); this.id = prefix + count; internalCounter.set(prefix, ++count); } /** * @return {string} */ toString() { return this.id; } }; } }); // source/types/basewithoptions.mjs var BaseWithOptions; var init_basewithoptions = __esm({ "source/types/basewithoptions.mjs"() { init_constants(); init_extend(); init_pathfinder(); init_base(); init_validate(); BaseWithOptions = class extends Base { /** * * @param {object} options */ constructor(options2) { super(); if (options2 === void 0) { options2 = {}; } this[internalSymbol] = extend({}, this.defaults, validateObject(options2)); } /** * This getter provides the options. Derived classes overwrite * this getter with their own values. It is a good karma to always include * the values from the parent class. * * ```javascript * get defaults() { * return Object.assign({}, super.defaults, { * mykey: true * }); * } * * ``` * * @return {object} */ get defaults() { return {}; } /** * nested options can be specified by path `a.b.c` * * @param {string} path * @param {*} defaultValue * @return {*} * @since 1.10.0 */ getOption(path, defaultValue) { let value; try { value = new Pathfinder(this[internalSymbol]).getVia(path); } catch (e) { } if (value === void 0) return defaultValue; return value; } }; } }); // source/i18n/provider.mjs var translationsLinkSymbol, Provider; var init_provider = __esm({ "source/i18n/provider.mjs"() { init_constants(); init_attributes(); init_locale2(); init_basewithoptions(); init_locale(); init_translations(); translationsLinkSymbol = Symbol.for( "@schukai/monster/i18n/translations@@link" ); Provider = class extends BaseWithOptions { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 3.27.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/i18n/provider@@instance"); } /** * @param {Locale|string} locale * @return {Promise} */ getTranslations(locale) { if (locale === void 0) { locale = getLocaleOfDocument(); } return new Promise((resolve, reject) => { try { resolve(new Translations(locale)); } catch (e) { reject(e); } }); } /** * @param {Locale|string} locale * @param {HTMLElement} element * @return {Provider} */ assignToElement(locale, element) { if (locale === void 0) { locale = getLocaleOfDocument(); } if (!(locale instanceof Locale)) { throw new Error("Locale is not an instance of Locale"); } if (!(element instanceof HTMLElement)) { element = document.querySelector("body"); } if (!(element instanceof HTMLElement)) { throw new Error("Element is not an HTMLElement"); } return this.getTranslations(locale).then((obj) => { let translations2 = null; if (hasObjectLink(element, translationsLinkSymbol)) { const objects = getLinkedObjects(element, translationsLinkSymbol); for (const o of objects) { if (o instanceof Translations) { translations2 = o; break; } } if (!(translations2 instanceof Translations)) { throw new Error("Object is not an instance of Translations"); } translations2.assignTranslations(obj); } else { addToObjectLink(element, translationsLinkSymbol, obj); } return obj; }); } }; } }); // source/i18n/translations.mjs function getDocumentTranslations(element) { const d = getDocument(); if (!(element instanceof HTMLElement)) { element = d.querySelector( `[${ATTRIBUTE_OBJECTLINK}~="${translationsLinkSymbol.toString()}"]` ); if (element === null) { throw new Error( "Cannot find the element with translations. Add the translation object to the document." ); } } if (!(element instanceof HTMLElement)) { throw new Error("Element is not an HTMLElement."); } if (!hasObjectLink(element, translationsLinkSymbol)) { throw new Error("This element has no translations."); } const obj = getLinkedObjects(element, translationsLinkSymbol); for (const t of obj) { if (t instanceof Translations) { return t; } } throw new Error("Missing translations."); } var Translations; var init_translations = __esm({ "source/i18n/translations.mjs"() { init_constants(); init_attributes(); init_constants2(); init_util(); init_base(); init_is(); init_validate(); init_locale(); init_provider(); Translations = class _Translations extends Base { /** * * @param {Locale} locale */ constructor(locale) { super(); if (locale instanceof Locale) { this.locale = locale; } else { this.locale = parseLocale(validateString(locale)); } this.storage = /* @__PURE__ */ new Map(); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 3.27.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/i18n/translations@@instance"); } /** * Fetches a text using the specified key. * If no suitable key is found, `defaultText` is taken. * * @param {string} key * @param {string|undefined} defaultText * @return {string} * @throws {Error} key not found */ getText(key, defaultText) { if (!this.storage.has(key)) { if (defaultText === void 0) { throw new Error(`key ${key} not found`); } return validateString(defaultText); } const r = this.storage.get(key); if (isObject(r)) { return this.getPluralRuleText(key, "other", defaultText); } return this.storage.get(key); } /** * A number `count` can be passed to this method. In addition to a number, one of the keywords can also be passed directly. * "zero", "one", "two", "few", "many" and "other". Remember: not every language has all rules. * * The appropriate text for this number is then selected. If no suitable key is found, `defaultText` is taken. * * @param {string} key * @param {integer|string} count * @param {string|undefined} defaultText * @return {string} */ getPluralRuleText(key, count, defaultText) { if (!this.storage.has(key)) { return validateString(defaultText); } const r = validateObject(this.storage.get(key)); let keyword; if (isString(count)) { keyword = count.toLocaleString(); } else { count = validateInteger(count); if (count === 0) { if (r.hasOwnProperty("zero")) { return validateString(r?.zero); } } keyword = new Intl.PluralRules(this.locale.toString()).select( validateInteger(count) ); } if (r.hasOwnProperty(keyword)) { return validateString(r[keyword]); } return validateString(defaultText); } /** * Set a text for a key * * ``` * translations.setText("text1", "Make my day!"); * // plural rules * translations.setText("text6", { * "zero": "There are no files on Disk.", * "one": "There is one file on Disk.", * "other": "There are files on Disk." * "default": "There are files on Disk." * }); * ``` * * @param {string} key * @param {string|object} text * @return {Translations} * @throws {TypeError} value is not a string or object */ setText(key, text) { if (isString(text) || isObject(text)) { this.storage.set(validateString(key), text); return this; } throw new TypeError("value is not a string or object"); } /** * This method can be used to transfer overlays from an object. The keys are transferred, and the values are entered * as text. * * The values can either be character strings or, in the case of texts with plural forms, objects. The plural forms * must be stored as text via a standard key "zero", "one", "two", "few", "many" and "other". * * Additionally, the key default can be specified, which will be used if no other key fits. * * In some languages, like for example in German, there is no own more number at the value 0. In these languages, * the function applies additionally zero. * * ``` * translations.assignTranslations({ * "text1": "Make my day!", * "text2": "I'll be back!", * "text6": { * "zero": "There are no files on Disk.", * "one": "There is one file on Disk.", * "other": "There are files on Disk." * "default": "There are files on Disk." * }); * ``` * * @param {object} translations * @return {Translations} */ assignTranslations(translations2) { validateObject(translations2); if (translations2 instanceof _Translations) { translations2.storage.forEach((v, k) => { this.setText(k, v); }); return this; } for (const [k, v] of Object.entries(translations2)) { this.setText(k, v); } return this; } }; } }); // source/i18n/time-ago.mjs function formatTimeAgo(date, locale) { const now = new Date(Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3) * 1e3); const roundedDate = new Date(Math.floor(date.getTime() / 1e3) * 1e3); const diffInSeconds = Math.floor((roundedDate - now) / 1e3); const absDiff = Math.abs(diffInSeconds); const translation = translations[normalizeLocale(locale)]; if (absDiff === 0) { return translation.template.justNow(); } if (absDiff > 31536e3) { return translation.template.on( new Intl.DateTimeFormat(locale, { dateStyle: "full", timeStyle: "short" }).format(date) ); } const units = [ { name: "year", length: 31536e3 }, // Hinzugefügt für Konsistenz, auch wenn nicht genutzt in dieser spezifischen Logik { name: "day", length: 86400 }, { name: "hour", length: 3600 }, { name: "minute", length: 60 }, { name: "second", length: 1 } ]; let remainder = absDiff; const parts = []; for (const unit of units) { if (remainder >= unit.length) { const count = Math.floor(remainder / unit.length); remainder %= unit.length; const formatted = formatUnitCount(count, unit.name, locale); parts.push(formatted); } } if (parts.length === 0) { return translation.template.justNow(); } const joined = new Intl.ListFormat(locale, { style: "long", type: "conjunction" }).format(parts); if (diffInSeconds > 0) { return translation.template.future(joined); } else { return translation.template.past(joined); } } function formatUnitCount(count, unit, locale) { const lang = normalizeLocale(locale); const fallback = translations[lang] || translations["en"]; const dictForUnit = fallback.units[unit]; const pr = new Intl.PluralRules(lang); const category = pr.select(count); const phrase = dictForUnit[category] || dictForUnit.other; return `${count} ${phrase}`; } function normalizeLocale(locale) { return locale.split("-")[0].toLowerCase(); } var translations; var init_time_ago = __esm({ "source/i18n/time-ago.mjs"() { translations = { en: { template: { on: (value) => `on ${value}`, past: (value) => `${value} ago`, future: (value) => `in ${value}`, justNow: () => `just now` }, units: { day: { zero: "days", one: "day", two: "days", few: "days", many: "days", other: "days" }, hour: { zero: "hours", one: "hour", two: "hours", few: "hours", many: "hours", other: "hours" }, minute: { zero: "minutes", one: "minute", two: "minutes", few: "minutes", many: "minutes", other: "minutes" }, second: { zero: "seconds", one: "second", two: "seconds", few: "seconds", many: "seconds", other: "seconds" } } }, zh: { template: { on: (value) => `\u5728${value}`, past: (value) => `${value}\u524D`, future: (value) => `${value}\u540E`, justNow: () => `\u521A\u521A` }, units: { day: { zero: "\u5929", one: "\u5929", two: "\u5929", few: "\u5929", many: "\u5929", other: "\u5929" }, hour: { zero: "\u5C0F\u65F6", one: "\u5C0F\u65F6", two: "\u5C0F\u65F6", few: "\u5C0F\u65F6", many: "\u5C0F\u65F6", other: "\u5C0F\u65F6" }, minute: { zero: "\u5206\u949F", one: "\u5206\u949F", two: "\u5206\u949F", few: "\u5206\u949F", many: "\u5206\u949F", other: "\u5206\u949F" }, second: { zero: "\u79D2", one: "\u79D2", two: "\u79D2", few: "\u79D2", many: "\u79D2", other: "\u79D2" } } }, es: { template: { on: (value) => `el ${value}`, past: (value) => `hace ${value}`, future: (value) => `en ${value}`, justNow: () => `justo ahora` }, units: { day: { zero: "d\xEDas", one: "d\xEDa", two: "d\xEDas", few: "d\xEDas", many: "d\xEDas", other: "d\xEDas" }, hour: { zero: "horas", one: "hora", two: "horas", few: "horas", many: "horas", other: "horas" }, minute: { zero: "minutos", one: "minuto", two: "minutos", few: "minutos", many: "minutos", other: "minutos" }, second: { zero: "segundos", one: "segundo", two: "segundos", few: "segundos", many: "segundos", other: "segundos" } } }, de: { template: { on: (value) => `am ${value}`, past: (value) => `vor ${value}`, future: (value) => `in ${value}`, justNow: () => `gerade eben` }, units: { day: { zero: "Tagen", one: "Tag", two: "Tagen", few: "Tagen", many: "Tagen", other: "Tagen" }, hour: { zero: "Stunden", one: "Stunde", two: "Stunden", few: "Stunden", many: "Stunden", other: "Stunden" }, minute: { zero: "Minuten", one: "Minute", two: "Minuten", few: "Minuten", many: "Minuten", other: "Minuten" }, second: { zero: "Sekunden", one: "Sekunde", two: "Sekunden", few: "Sekunden", many: "Sekunden", other: "Sekunden" } } }, fr: { template: { on: (value) => `le ${value}`, past: (value) => `il y a ${value}`, future: (value) => `dans ${value}`, justNow: () => `\xE0 l'instant` }, units: { day: { zero: "jours", one: "jour", two: "jours", few: "jours", many: "jours", other: "jours" }, hour: { zero: "heures", one: "heure", two: "heures", few: "heures", many: "heures", other: "heures" }, minute: { zero: "minutes", one: "minute", two: "minutes", few: "minutes", many: "minutes", other: "minutes" }, second: { zero: "secondes", one: "seconde", two: "secondes", few: "secondes", many: "secondes", other: "secondes" } } }, ru: { template: { on: (value) => `\u043D\u0430 ${value}`, past: (value) => `${value} \u043D\u0430\u0437\u0430\u0434`, future: (value) => `\u0447\u0435\u0440\u0435\u0437 ${value}`, justNow: () => `\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u043E` }, units: { day: { zero: "\u0434\u043D\u0435\u0439", one: "\u0434\u0435\u043D\u044C", two: "\u0434\u043D\u044F", few: "\u0434\u043D\u044F", many: "\u0434\u043D\u0435\u0439", other: "\u0434\u043D\u0435\u0439" }, hour: { zero: "\u0447\u0430\u0441\u043E\u0432", one: "\u0447\u0430\u0441", two: "\u0447\u0430\u0441\u0430", few: "\u0447\u0430\u0441\u0430", many: "\u0447\u0430\u0441\u043E\u0432", other: "\u0447\u0430\u0441\u043E\u0432" }, minute: { zero: "\u043C\u0438\u043D\u0443\u0442", one: "\u043C\u0438\u043D\u0443\u0442\u0430", two: "\u043C\u0438\u043D\u0443\u0442\u044B", few: "\u043C\u0438\u043D\u0443\u0442\u044B", many: "\u043C\u0438\u043D\u0443\u0442", other: "\u043C\u0438\u043D\u0443\u0442" }, second: { zero: "\u0441\u0435\u043A\u0443\u043D\u0434", one: "\u0441\u0435\u043A\u0443\u043D\u0434\u0430", two: "\u0441\u0435\u043A\u0443\u043D\u0434\u044B", few: "\u0441\u0435\u043A\u0443\u043D\u0434\u044B", many: "\u0441\u0435\u043A\u0443\u043D\u0434", other: "\u0441\u0435\u043A\u0443\u043D\u0434" } } }, ar: { template: { on: (value) => `\u0641\u064A ${value}`, past: (value) => `\u0645\u0646\u0630 ${value}`, future: (value) => `\u0628\u0639\u062F ${value}`, justNow: () => `\u0627\u0644\u0622\u0646` }, units: { day: { zero: "\u0623\u064A\u0627\u0645", one: "\u064A\u0648\u0645", two: "\u064A\u0648\u0645\u064A\u0646", few: "\u0623\u064A\u0627\u0645", many: "\u0623\u064A\u0627\u0645", other: "\u0623\u064A\u0627\u0645" }, hour: { zero: "\u0633\u0627\u0639\u0627\u062A", one: "\u0633\u0627\u0639\u0629", two: "\u0633\u0627\u0639\u062A\u064A\u0646", few: "\u0633\u0627\u0639\u0627\u062A", many: "\u0633\u0627\u0639\u0627\u062A", other: "\u0633\u0627\u0639\u0627\u062A" }, minute: { zero: "\u062F\u0642\u0627\u0626\u0642", one: "\u062F\u0642\u064A\u0642\u0629", two: "\u062F\u0642\u064A\u0642\u062A\u064A\u0646", few: "\u062F\u0642\u0627\u0626\u0642", many: "\u062F\u0642\u0627\u0626\u0642", other: "\u062F\u0642\u0627\u0626\u0642" }, second: { zero: "\u062B\u0648\u0627\u0646\u064A", one: "\u062B\u0627\u0646\u064A\u0629", two: "\u062B\u0627\u0646\u064A\u062A\u064A\u0646", few: "\u062B\u0648\u0627\u0646\u064A", many: "\u062B\u0648\u0627\u0646\u064A", other: "\u062B\u0648\u0627\u0646\u064A" } } }, hi: { template: { on: (value) => `${value} \u0915\u094B`, past: (value) => `${value} \u092A\u0939\u0932\u0947`, future: (value) => `${value} \u092E\u0947\u0902`, justNow: () => `\u0905\u092D\u0940` }, units: { day: { zero: "\u0926\u093F\u0928", one: "\u0926\u093F\u0928", two: "\u0926\u093F\u0928", few: "\u0926\u093F\u0928", many: "\u0926\u093F\u0928", other: "\u0926\u093F\u0928" }, hour: { zero: "\u0918\u0902\u091F\u0947", one: "\u0918\u0902\u091F\u093E", two: "\u0918\u0902\u091F\u0947", few: "\u0918\u0902\u091F\u0947", many: "\u0918\u0902\u091F\u0947", other: "\u0918\u0902\u091F\u0947" }, minute: { zero: "\u092E\u093F\u0928\u091F", one: "\u092E\u093F\u0928\u091F", two: "\u092E\u093F\u0928\u091F", few: "\u092E\u093F\u0928\u091F", many: "\u092E\u093F\u0928\u091F", other: "\u092E\u093F\u0928\u091F" }, second: { zero: "\u0938\u0947\u0915\u0902\u0921", one: "\u0938\u0947\u0915\u0902\u0921", two: "\u0938\u0947\u0915\u0902\u0921", few: "\u0938\u0947\u0915\u0902\u0921", many: "\u0938\u0947\u0915\u0902\u0921", other: "\u0938\u0947\u0915\u0902\u0921" } } }, pt: { template: { on: (value) => `em ${value}`, past: (value) => `h\xE1 ${value}`, future: (value) => `em ${value}`, justNow: () => `agora mesmo` }, units: { day: { zero: "dias", one: "dia", two: "dias", few: "dias", many: "dias", other: "dias" }, hour: { zero: "horas", one: "hora", two: "horas", few: "horas", many: "horas", other: "horas" }, minute: { zero: "minutos", one: "minuto", two: "minutos", few: "minutos", many: "minutos", other: "minutos" }, second: { zero: "segundos", one: "segundo", two: "segundos", few: "segundos", many: "segundos", other: "segundos" } } }, ja: { template: { on: (value) => `${value}\u306B`, past: (value) => `${value}\u524D`, future: (value) => `${value}\u5F8C`, justNow: () => `\u305F\u3063\u305F\u4ECA` }, units: { day: { zero: "\u65E5", one: "\u65E5", two: "\u65E5", few: "\u65E5", many: "\u65E5", other: "\u65E5" }, hour: { zero: "\u6642\u9593", one: "\u6642\u9593", two: "\u6642\u9593", few: "\u6642\u9593", many: "\u6642\u9593", other: "\u6642\u9593" }, minute: { zero: "\u5206", one: "\u5206", two: "\u5206", few: "\u5206", many: "\u5206", other: "\u5206" }, second: { zero: "\u79D2", one: "\u79D2", two: "\u79D2", few: "\u79D2", many: "\u79D2", other: "\u79D2" } } }, it: { template: { on: (value) => `il ${value}`, past: (value) => `${value} fa`, future: (value) => `in ${value}`, justNow: () => `proprio ora` }, units: { day: { zero: "giorni", one: "giorno", two: "giorni", few: "giorni", many: "giorni", other: "giorni" }, hour: { zero: "ore", one: "ora", two: "ore", few: "ore", many: "ore", other: "ore" }, minute: { zero: "minuti", one: "minuto", two: "minuti", few: "minuti", many: "minuti", other: "minuti" }, second: { zero: "secondi", one: "secondo", two: "secondi", few: "secondi", many: "secondi", other: "secondi" } } }, ko: { template: { on: (value) => `${value}\uC5D0`, past: (value) => `${value} \uC804`, future: (value) => `${value} \uD6C4`, justNow: () => `\uBC29\uAE08` }, units: { day: { zero: "\uC77C", one: "\uC77C", two: "\uC77C", few: "\uC77C", many: "\uC77C", other: "\uC77C" }, hour: { zero: "\uC2DC\uAC04", one: "\uC2DC\uAC04", two: "\uC2DC\uAC04", few: "\uC2DC\uAC04", many: "\uC2DC\uAC04", other: "\uC2DC\uAC04" }, minute: { zero: "\uBD84", one: "\uBD84", two: "\uBD84", few: "\uBD84", many: "\uBD84", other: "\uBD84" }, second: { zero: "\uCD08", one: "\uCD08", two: "\uCD08", few: "\uCD08", many: "\uCD08", other: "\uCD08" } } }, sw: { template: { on: (value) => `kwa ${value}`, past: (value) => `${value} iliyopita`, future: (value) => `katika ${value}`, justNow: () => `hivi punde` }, units: { day: { zero: "siku", one: "siku", two: "siku", few: "siku", many: "siku", other: "siku" }, hour: { zero: "masaa", one: "saa", two: "masaa", few: "masaa", many: "masaa", other: "masaa" }, minute: { zero: "dakika", one: "dakika", two: "dakika", few: "dakika", many: "dakika", other: "dakika" }, second: { zero: "sekunde", one: "sekunde", two: "sekunde", few: "sekunde", many: "sekunde", other: "sekunde" } } }, nl: { template: { on: (value) => `op ${value}`, past: (value) => `${value} geleden`, future: (value) => `over ${value}`, justNow: () => `net` }, units: { day: { zero: "dagen", one: "dag", two: "dagen", few: "dagen", many: "dagen", other: "dagen" }, hour: { zero: "uren", one: "uur", two: "uren", few: "uren", many: "uren", other: "uren" }, minute: { zero: "minuten", one: "minuut", two: "minuten", few: "minuten", many: "minuten", other: "minuten" }, second: { zero: "seconden", one: "seconde", two: "seconden", few: "seconden", many: "seconden", other: "seconden" } } }, ms: { template: { on: (value) => `pada ${value}`, past: (value) => `${value} yang lalu`, future: (value) => `${value} lagi`, justNow: () => `tadi` }, units: { day: { zero: "hari", one: "hari", two: "hari", few: "hari", many: "hari", other: "hari" }, hour: { zero: "jam", one: "jam", two: "jam", few: "jam", many: "jam", other: "jam" }, minute: { zero: "minit", one: "minit", two: "minit", few: "minit", many: "minit", other: "minit" }, second: { zero: "saat", one: "saat", two: "saat", few: "saat", many: "saat", other: "saat" } } }, id: { template: { on: (value) => `pada ${value}`, past: (value) => `${value} yang lalu`, future: (value) => `dalam ${value}`, justNow: () => `tadi` }, units: { day: { zero: "hari", one: "hari", two: "hari", few: "hari", many: "hari", other: "hari" }, hour: { zero: "jam", one: "jam", two: "jam", few: "jam", many: "jam", other: "jam" }, minute: { zero: "menit", one: "menit", two: "menit", few: "menit", many: "menit", other: "menit" }, second: { zero: "detik", one: "detik", two: "detik", few: "detik", many: "detik", other: "detik" } } }, tr: { template: { on: (value) => `${value} tarihinde`, past: (value) => `${value} \xF6nce`, future: (value) => `${value} sonra`, justNow: () => `az \xF6nce` }, units: { day: { zero: "g\xFCnler", one: "g\xFCn", two: "g\xFCn", few: "g\xFCn", many: "g\xFCn", other: "g\xFCn" }, hour: { zero: "saatler", one: "saat", two: "saat", few: "saat", many: "saat", other: "saat" }, minute: { zero: "dakikalar", one: "dakika", two: "dakika", few: "dakika", many: "dakika", other: "dakika" }, second: { zero: "saniyeler", one: "saniye", two: "saniye", few: "saniye", many: "saniye", other: "saniye" } } }, pl: { template: { on: (value) => `w dniu ${value}`, past: (value) => `${value} temu`, future: (value) => `za ${value}`, justNow: () => `przed chwil\u0105` }, units: { day: { zero: "dni", one: "dzie\u0144", two: "dni", few: "dni", many: "dni", other: "dni" }, hour: { zero: "godzin", one: "godzina", two: "godziny", few: "godziny", many: "godzin", other: "godzin" }, minute: { zero: "minut", one: "minuta", two: "minuty", few: "minuty", many: "minut", other: "minut" }, second: { zero: "sekund", one: "sekunda", two: "sekundy", few: "sekundy", many: "sekund", other: "sekund" } } }, sv: { template: { on: (value) => `den ${value}`, past: (value) => `f\xF6r ${value} sedan`, future: (value) => `om ${value}`, justNow: () => `nyss` }, units: { day: { zero: "dagar", one: "dag", two: "dagar", few: "dagar", many: "dagar", other: "dagar" }, hour: { zero: "timmar", one: "timme", two: "timmar", few: "timmar", many: "timmar", other: "timmar" }, minute: { zero: "minuter", one: "minut", two: "minuter", few: "minuter", many: "minuter", other: "minuter" }, second: { zero: "sekunder", one: "sekund", two: "sekunder", few: "sekunder", many: "sekunder", other: "sekunder" } } }, ro: { template: { on: (value) => `pe ${value}`, past: (value) => `acum ${value}`, future: (value) => `peste ${value}`, justNow: () => `chiar acum` }, units: { day: { zero: "zile", one: "zi", two: "zile", few: "zile", many: "zile", other: "zile" }, hour: { zero: "ore", one: "or\u0103", two: "ore", few: "ore", many: "ore", other: "ore" }, minute: { zero: "minute", one: "minut", two: "minute", few: "minute", many: "minute", other: "minute" }, second: { zero: "secunde", one: "secund\u0103", two: "secunde", few: "secunde", many: "secunde", other: "secunde" } } }, bg: { template: { on: (value) => `\u043D\u0430 ${value}`, past: (value) => `\u043F\u0440\u0435\u0434\u0438 ${value}`, future: (value) => `\u0441\u043B\u0435\u0434 ${value}`, justNow: () => `\u0442\u043E\u043A\u0443-\u0449\u043E` }, units: { day: { zero: "\u0434\u043D\u0438", one: "\u0434\u0435\u043D", two: "\u0434\u043D\u0438", few: "\u0434\u043D\u0438", many: "\u0434\u043D\u0438", other: "\u0434\u043D\u0438" }, hour: { zero: "\u0447\u0430\u0441\u0430", one: "\u0447\u0430\u0441", two: "\u0447\u0430\u0441\u0430", few: "\u0447\u0430\u0441\u0430", many: "\u0447\u0430\u0441\u0430", other: "\u0447\u0430\u0441\u0430" }, minute: { zero: "\u043C\u0438\u043D\u0443\u0442\u0438", one: "\u043C\u0438\u043D\u0443\u0442\u0430", two: "\u043C\u0438\u043D\u0443\u0442\u0438", few: "\u043C\u0438\u043D\u0443\u0442\u0438", many: "\u043C\u0438\u043D\u0443\u0442\u0438", other: "\u043C\u0438\u043D\u0443\u0442\u0438" }, second: { zero: "\u0441\u0435\u043A\u0443\u043D\u0434\u0438", one: "\u0441\u0435\u043A\u0443\u043D\u0434\u0430", two: "\u0441\u0435\u043A\u0443\u043D\u0434\u0438", few: "\u0441\u0435\u043A\u0443\u043D\u0434\u0438", many: "\u0441\u0435\u043A\u0443\u043D\u0434\u0438", other: "\u0441\u0435\u043A\u0443\u043D\u0434\u0438" } } }, da: { template: { on: (value) => `den ${value}`, past: (value) => `for ${value} siden`, future: (value) => `om ${value}`, justNow: () => `lige nu` }, units: { day: { zero: "dage", one: "dag", two: "dage", few: "dage", many: "dage", other: "dage" }, hour: { zero: "timer", one: "time", two: "timer", few: "timer", many: "timer", other: "timer" }, minute: { zero: "minutter", one: "minut", two: "minutter", few: "minutter", many: "minutter", other: "minutter" }, second: { zero: "sekunder", one: "sekund", two: "sekunder", few: "sekunder", many: "sekunder", other: "sekunder" } } }, fi: { template: { on: (value) => `p\xE4iv\xE4n\xE4 ${value}`, past: (value) => `${value} sitten`, future: (value) => `${value} kuluttua`, justNow: () => `juuri nyt` }, units: { day: { zero: "p\xE4iv\xE4\xE4", one: "p\xE4iv\xE4", two: "p\xE4iv\xE4\xE4", few: "p\xE4iv\xE4\xE4", many: "p\xE4iv\xE4\xE4", other: "p\xE4iv\xE4\xE4" }, hour: { zero: "tuntia", one: "tunti", two: "tuntia", few: "tuntia", many: "tuntia", other: "tuntia" }, minute: { zero: "minuuttia", one: "minuutti", two: "minuuttia", few: "minuuttia", many: "minuuttia", other: "minuuttia" }, second: { zero: "sekuntia", one: "sekunti", two: "sekuntia", few: "sekuntia", many: "sekuntia", other: "sekuntia" } } }, cs: { template: { on: (value) => `dne ${value}`, past: (value) => `p\u0159ed ${value}`, future: (value) => `za ${value}`, justNow: () => `pr\xE1v\u011B te\u010F` }, units: { day: { zero: "dny", one: "den", two: "dny", few: "dny", many: "dn\u016F", other: "dny" }, hour: { zero: "hodin", one: "hodina", two: "hodiny", few: "hodiny", many: "hodin", other: "hodin" }, minute: { zero: "minut", one: "minuta", two: "minuty", few: "minuty", many: "minut", other: "minut" }, second: { zero: "sekund", one: "sekunda", two: "sekundy", few: "sekundy", many: "sekund", other: "sekund" } } }, el: { template: { on: (value) => `\u03C3\u03C4\u03B9\u03C2 ${value}`, past: (value) => `\u03C0\u03C1\u03B9\u03BD ${value}`, future: (value) => `\u03C3\u03B5 ${value}`, justNow: () => `\u03BC\u03CC\u03BB\u03B9\u03C2 \u03C4\u03CE\u03C1\u03B1` }, units: { day: { zero: "\u03B7\u03BC\u03AD\u03C1\u03B5\u03C2", one: "\u03B7\u03BC\u03AD\u03C1\u03B1", two: "\u03B7\u03BC\u03AD\u03C1\u03B5\u03C2", few: "\u03B7\u03BC\u03AD\u03C1\u03B5\u03C2", many: "\u03B7\u03BC\u03AD\u03C1\u03B5\u03C2", other: "\u03B7\u03BC\u03AD\u03C1\u03B5\u03C2" }, hour: { zero: "\u03CE\u03C1\u03B5\u03C2", one: "\u03CE\u03C1\u03B1", two: "\u03CE\u03C1\u03B5\u03C2", few: "\u03CE\u03C1\u03B5\u03C2", many: "\u03CE\u03C1\u03B5\u03C2", other: "\u03CE\u03C1\u03B5\u03C2" }, minute: { zero: "\u03BB\u03B5\u03C0\u03C4\u03AC", one: "\u03BB\u03B5\u03C0\u03C4\u03CC", two: "\u03BB\u03B5\u03C0\u03C4\u03AC", few: "\u03BB\u03B5\u03C0\u03C4\u03AC", many: "\u03BB\u03B5\u03C0\u03C4\u03AC", other: "\u03BB\u03B5\u03C0\u03C4\u03AC" }, second: { zero: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1", one: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03BF", two: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1", few: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1", many: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1", other: "\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1" } } }, hr: { template: { on: (value) => `na ${value}`, past: (value) => `prije ${value}`, future: (value) => `za ${value}`, justNow: () => `prije trenutka` }, units: { day: { zero: "dana", one: "dan", two: "dana", few: "dana", many: "dana", other: "dana" }, hour: { zero: "sati", one: "sat", two: "sata", few: "sata", many: "sati", other: "sati" }, minute: { zero: "minuta", one: "minuta", two: "minute", few: "minute", many: "minuta", other: "minuta" }, second: { zero: "sekundi", one: "sekunda", two: "sekunde", few: "sekunde", many: "sekundi", other: "sekundi" } } }, sk: { template: { on: (value) => `v de\u0148 ${value}`, past: (value) => `pred ${value}`, future: (value) => `za ${value}`, justNow: () => `pr\xE1ve teraz` }, units: { day: { zero: "dni", one: "de\u0148", two: "dni", few: "dni", many: "dn\xED", other: "dni" }, hour: { zero: "hodiny", one: "hodina", two: "hodiny", few: "hodiny", many: "hod\xEDn", other: "hodiny" }, minute: { zero: "min\xFAty", one: "min\xFAta", two: "min\xFAty", few: "min\xFAty", many: "min\xFAt", other: "min\xFAty" }, second: { zero: "sekundy", one: "sekunda", two: "sekundy", few: "sekundy", many: "sek\xFAnd", other: "sekundy" } } }, no: { template: { on: (value) => `p\xE5 ${value}`, past: (value) => `${value} siden`, future: (value) => `om ${value}`, justNow: () => `nettopp` }, units: { day: { zero: "dager", one: "dag", two: "dager", few: "dager", many: "dager", other: "dager" }, hour: { zero: "timer", one: "time", two: "timer", few: "timer", many: "timer", other: "timer" }, minute: { zero: "minutter", one: "minutt", two: "minutter", few: "minutter", many: "minutter", other: "minutter" }, second: { zero: "sekunder", one: "sekund", two: "sekunder", few: "sekunder", many: "sekunder", other: "sekunder" } } }, sl: { template: { on: (value) => `na ${value}`, past: (value) => `pred ${value}`, future: (value) => `\u010Dez ${value}`, justNow: () => `ravno zdaj` }, units: { day: { zero: "dni", one: "dan", two: "dni", few: "dni", many: "dni", other: "dni" }, hour: { zero: "ure", one: "ura", two: "ure", few: "ure", many: "ure", other: "ure" }, minute: { zero: "minute", one: "minuta", two: "minute", few: "minute", many: "minute", other: "minute" }, second: { zero: "sekunde", one: "sekunda", two: "sekunde", few: "sekunde", many: "sekund", other: "sekund" } } }, vi: { template: { on: (value) => `v\xE0o ${value}`, past: (value) => `${value} tr\u01B0\u1EDBc`, future: (value) => `${value} sau`, justNow: () => `v\u1EEBa m\u1EDBi` }, units: { day: { zero: "ng\xE0y", one: "ng\xE0y", two: "ng\xE0y", few: "ng\xE0y", many: "ng\xE0y", other: "ng\xE0y" }, hour: { zero: "gi\u1EDD", one: "gi\u1EDD", two: "gi\u1EDD", few: "gi\u1EDD", many: "gi\u1EDD", other: "gi\u1EDD" }, minute: { zero: "ph\xFAt", one: "ph\xFAt", two: "ph\xFAt", few: "ph\xFAt", many: "ph\xFAt", other: "ph\xFAt" }, second: { zero: "gi\xE2y", one: "gi\xE2y", two: "gi\xE2y", few: "gi\xE2y", many: "gi\xE2y", other: "gi\xE2y" } } } }; } }); // source/data/transformer.mjs function disassemble(command) { validateString(command); const placeholder = /* @__PURE__ */ new Map(); const regex = /((?<pattern>\\(?<char>.)){1})/gim; const result = command.matchAll(regex); for (const m of result) { const g = m?.["groups"]; if (!isObject(g)) { continue; } const p = g?.["pattern"]; const c = g?.["char"]; if (p && c) { const r = `__${new ID().toString()}__`; placeholder.set(r, c); command = command.replace(p, r); } } let parts = command.split(":"); parts = parts.map(function(value) { let v = value.trim(); for (const k of placeholder) { v = v.replace(k[0], k[1]); } return v; }); return parts; } function convertToString(value) { if (isObject(value) && value.hasOwnProperty("toString")) { value = value.toString(); } validateString(value); return value; } function transform(value) { const console2 = getGlobalObject("console"); const args = clone(this.args); let key; let defaultValue; let translations2; let date; let locale; let timestamp; let map; let keyValue; switch (this.command) { case "static": return this.args.join(":"); case "tolower": case "strtolower": case "tolowercase": validateString(value); return value.toLowerCase(); case "contains": if (isString(value)) { return value.includes(args[0]); } if (isArray(value)) { return value.includes(args[0]); } if (isObject(value)) { return value.hasOwnProperty(args[0]); } return false; case "has-entries": case "hasentries": if (isObject(value)) { return Object.keys(value).length > 0; } if (isArray(value)) { return value.length > 0; } return false; case "isundefined": case "is-undefined": return value === void 0; case "isnull": case "is-null": return value === null; case "isset": case "is-set": return value !== void 0 && value !== null; case "isnumber": case "is-number": return isPrimitive(value) && !isNaN(value); case "isinteger": case "is-integer": return isPrimitive(value) && !isNaN(value) && value % 1 === 0; case "isfloat": case "is-float": return isPrimitive(value) && !isNaN(value) && value % 1 !== 0; case "isobject": case "is-object": return isObject(value); case "isarray": case "is-array": return Array.isArray(value); case "not": validateBoolean(value); return !value; case "toupper": case "strtoupper": case "touppercase": validateString(value); return value.toUpperCase(); case "to-string": case "tostring": return `${value}`; case "to-integer": case "tointeger": const n = parseInt(value); validateInteger(n); return n; case "to-json": case "tojson": return JSON.stringify(value); case "from-json": case "fromjson": return JSON.parse(value); case "trim": validateString(value); return value.trim(); case "rawurlencode": validateString(value); return encodeURIComponent(value).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A"); case "call": let callback; const callbackName = args.shift(); let context = getGlobal(); if (isObject(value) && value.hasOwnProperty(callbackName)) { callback = value[callbackName]; } else if (this.callbacks.has(callbackName)) { const s = this.callbacks.get(callbackName); callback = s?.["callback"]; context = s?.["context"]; } else if (typeof window === "object" && window.hasOwnProperty(callbackName)) { callback = window[callbackName]; } validateFunction(callback); args.unshift(value); return callback.call(context, ...args); case "plain": case "plaintext": validateString(value); const doc = new DOMParser().parseFromString(value, "text/html"); return doc.body.textContent || ""; case "if": case "?": validatePrimitive(value); let trueStatement = args.shift() || void 0; let falseStatement = args.shift() || void 0; trueStatement = convertSpecialStrings(trueStatement, value); falseStatement = convertSpecialStrings(falseStatement, value); const condition = evaluateCondition(value); return condition ? trueStatement : falseStatement; case "ucfirst": validateString(value); const firstchar = value.charAt(0).toUpperCase(); return firstchar + value.substr(1); case "ucwords": validateString(value); return value.replace( /^([a-z\u00E0-\u00FC])|\s+([a-z\u00E0-\u00FC])/g, function(v) { return v.toUpperCase(); } ); case "count": case "length": if ((isString(value) || isObject(value) || isArray(value)) && value.hasOwnProperty("length")) { return value.length; } throw new TypeError(`unsupported type ${typeof value}`); case "to-base64": case "btoa": case "base64": return btoa(convertToString(value)); case "atob": case "from-base64": return atob(convertToString(value)); case "empty": return ""; case "undefined": return void 0; case "debug": if (isObject(console2)) { console2.log(value); } return value; case "prefix": validateString(value); const prefix = args?.[0]; return prefix + value; case "suffix": validateString(value); const suffix = args?.[0]; return value + suffix; case "uniqid": return new ID().toString(); case "first-key": case "last-key": case "nth-last-key": case "nth-key": if (!isObject(value)) { throw new Error("type not supported"); } const keys = Object.keys(value).sort(); if (this.command === "first-key") { key = 0; } else if (this.command === "last-key") { key = keys.length - 1; } else { key = validateInteger(parseInt(args.shift())); if (this.command === "nth-last-key") { key = keys.length - key - 1; } } defaultValue = args.shift() || ""; const useKey = keys?.[key]; if (value?.[useKey]) { return value?.[useKey]; } return defaultValue; case "key": case "property": case "index": key = args.shift() || void 0; if (key === void 0) { throw new Error("missing key parameter"); } defaultValue = args.shift() || void 0; if (value instanceof Map) { if (!value.has(key)) { return defaultValue; } return value.get(key); } if (isObject(value) || isArray(value)) { if (value?.[key]) { return value?.[key]; } return defaultValue; } throw new Error("type not supported"); case "path-exists": key = args.shift(); if (key === void 0) { throw new Error("missing key parameter"); } return new Pathfinder(value).exists(key); case "concat": const pf2 = new Pathfinder(value); let concat2 = ""; while (args.length > 0) { key = args.shift(); if (key === void 0) { throw new Error("missing key parameter"); } if (isString(key) && key.trim() === "") { concat2 += key; continue; } if (!pf2.exists(key)) { concat2 += key; continue; } const v = pf2.getVia(key); if (!isPrimitive(v)) { throw new Error("value is not primitive"); } concat2 += v; } return concat2; case "path": key = args.shift(); if (key === void 0) { throw new Error("missing key parameter"); } const pf = new Pathfinder(value); if (!pf.exists(key)) { return void 0; } return pf.getVia(key); case "substring": validateString(value); const start2 = parseInt(args[0]) || 0; const end2 = (parseInt(args[1]) || 0) + start2; return value.substring(start2, end2); case "nop": return value; case "??": case "default": if (value !== void 0 && value !== null) { return value; } defaultValue = args.shift(); let defaultType = args.shift(); if (defaultType === void 0) { defaultType = "string"; } switch (defaultType) { case "int": case "integer": return parseInt(defaultValue); case "float": return parseFloat(defaultValue); case "undefined": return void 0; case "bool": case "boolean": defaultValue = defaultValue.toLowerCase(); return defaultValue !== "undefined" && defaultValue !== "" && defaultValue !== "off" && defaultValue !== "false" && defaultValue !== "false" || defaultValue === "on" || defaultValue === "true" || defaultValue === "true"; case "string": return `${defaultValue}`; case "object": return JSON.parse(atob(defaultValue)); } throw new Error("type not supported"); case "map": map = /* @__PURE__ */ new Map(); while (args.length > 0) { keyValue = args.shift(); if (keyValue === void 0) { throw new Error("missing key parameter"); } keyValue = keyValue.split("="); map.set(keyValue[0], keyValue[1]); } return map.get(value); case "equals": if (args.length === 0) { throw new Error("missing value parameter"); } validatePrimitive(value); const equalsValue = args.shift(); if (value === null) { return equalsValue === "null"; } const typeOfValue = typeof value; switch (typeOfValue) { case "string": return value === equalsValue; case "number": return value === parseFloat(equalsValue); case "boolean": return value === (equalsValue === "true" || equalsValue === "on"); case "undefined": return equalsValue === "undefined"; default: throw new Error("type not supported"); } case "money": case "currency": try { locale = getLocaleOfDocument(); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } const match = value.match(/^([A-Z]{3})[\s-]*(\d+(\.\d+)?)$/); if (!match) { throw new Error("invalid currency format"); } const currency = match[1]; const amount = match[2]; const maximumFractionDigits = args?.[0] || 2; const roundingIncrement = args?.[1] || 5; const nf = new Intl.NumberFormat(locale.toString(), { style: "currency", currency, maximumFractionDigits, roundingIncrement }); return nf.format(amount); case "timestamp": date = new Date(value); timestamp = date.getTime(); if (isNaN(timestamp)) { throw new Error("invalid date"); } return timestamp; case "time": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } try { locale = getLocaleOfDocument(); return date.toLocaleTimeString(locale.toString(), { hour12: false }); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } case "datetimeformat": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } const options2 = { dateStyle: "medium", timeStyle: "medium", hour12: false }; if (args.length > 0) { options2.dateStyle = args.shift(); } if (args.length > 0) { options2.timeStyle = args.shift(); } try { locale = getLocaleOfDocument().toString(); return new Intl.DateTimeFormat(locale, options2).format(date); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } case "datetime": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } try { locale = getLocaleOfDocument(); return date.toLocaleString(locale.toString(), { hour12: false }); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } case "date": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } try { locale = getLocaleOfDocument(); return date.toLocaleDateString(locale.toString(), { year: "numeric", month: "2-digit", day: "2-digit" }); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } case "time-ago": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } try { locale = getLocaleOfDocument(); return formatTimeAgo(date, locale.toString()); } catch (e) { throw new Error(`unsupported locale or missing format (${e.message})`); } case "year": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getFullYear(); case "month": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getMonth() + 1; case "day": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getDate(); case "weekday": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getDay(); case "hour": case "hours": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getHours(); case "minute": case "minutes": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getMinutes(); case "second": case "seconds": date = new Date(value); if (isNaN(date.getTime())) { throw new Error("invalid date"); } return date.getSeconds(); case "i18n": case "translation": translations2 = getDocumentTranslations(); if (!(translations2 instanceof Translations)) { throw new Error("missing translations"); } key = args.shift() || void 0; if (key === void 0) { key = value; } defaultValue = args.shift() || void 0; defaultValue = convertSpecialStrings(defaultValue, value); return translations2.getText(key, defaultValue); case "set-toggle": case "set-set": case "set-remove": const modifier = args.shift(); let delimiter = args.shift(); if (delimiter === void 0) { delimiter = " "; } const set2 = new Set(value.split(delimiter)); const toggle2 = new Set(modifier.split(delimiter)); if (this.command === "set-toggle") { for (const t of toggle2) { if (set2.has(t)) { set2.delete(t); } else { set2.add(t); } } } else if (this.command === "set-set") { for (const t of toggle2) { set2.add(t); } } else if (this.command === "set-remove") { for (const t of toggle2) { set2.delete(t); } } return Array.from(set2).join(delimiter); default: throw new Error(`unknown command ${this.command}`); } } function convertSpecialStrings(input, value) { switch (input) { case "value": return value; case "\\value": return "value"; case "\\undefined": return void 0; case "\\null": return null; default: return input; } } function evaluateCondition(value) { const lowerValue = typeof value === "string" ? value.toLowerCase() : value; return value !== void 0 && value !== null && value !== "" && lowerValue !== "off" && lowerValue !== "false" && value !== false || lowerValue === "on" || lowerValue === "true" || value === true; } var Transformer; var init_transformer = __esm({ "source/data/transformer.mjs"() { init_locale2(); init_base(); init_global(); init_id(); init_is(); init_translations(); init_validate(); init_clone(); init_pathfinder(); init_time_ago(); Transformer = class extends Base { /** * * @param {string} definition */ constructor(definition) { super(); this.args = disassemble(definition); this.command = this.args.shift(); this.callbacks = /* @__PURE__ */ new Map(); } /** * * @param {string} name * @param {function} callback * @param {object} context * @return {Transformer} * @throws {TypeError} value is not a string * @throws {TypeError} value is not a function */ setCallback(name, callback, context) { validateString(name); validateFunction(callback); if (context !== void 0) { validateObject(context); } this.callbacks.set(name, { callback, context }); return this; } /** * * @param {*} value * @return {*} * @throws {Error} unknown command * @throws {TypeError} unsupported type * @throws {Error} type not supported */ run(value) { return transform.apply(this, [value]); } }; } }); // source/data/pipe.mjs var DELIMITER2, Pipe; var init_pipe = __esm({ "source/data/pipe.mjs"() { init_base(); init_validate(); init_transformer(); DELIMITER2 = "|"; Pipe = class extends Base { /** * @param {string} pipe a pipe consists of commands whose input and output are connected with the pipe symbol `|`. * @throws {TypeError} */ constructor(pipe) { super(); validateString(pipe); this.pipe = pipe.split(DELIMITER2).map((v) => { return new Transformer(v); }); } /** * @param {string} name * @param {function} callback * @param {object} context * @return {Transformer} * @throws {TypeError} value is not a string * @throws {TypeError} value is not a function */ setCallback(name, callback, context) { for (const [, t] of Object.entries(this.pipe)) { t.setCallback(name, callback, context); } return this; } /** * run a pipe * * @param {*} value * @return {*} */ run(value) { return this.pipe.reduce((accumulator, transformer, currentIndex, array) => { return transformer.run(accumulator); }, value); } }; } }); // source/text/formatter.mjs function format(text) { this[watchdogSymbol]++; if (this[watchdogSymbol] > 20) { throw new Error("too deep nesting"); } const openMarker = this[internalSymbol]["marker"]["open"]?.[this[markerOpenIndexSymbol]]; const closeMarker = this[internalSymbol]["marker"]["close"]?.[this[markerCloseIndexSymbol]]; if (text.indexOf(openMarker) === -1 || text.indexOf(closeMarker) === -1) { return text; } let result = tokenize.call( this, validateString(text), openMarker, closeMarker ); if (this[internalSymbol]["marker"]["open"]?.[this[markerOpenIndexSymbol] + 1]) { this[markerOpenIndexSymbol]++; } if (this[internalSymbol]["marker"]["close"]?.[this[markerCloseIndexSymbol] + 1]) { this[markerCloseIndexSymbol]++; } result = format.call(this, result); return result; } function tokenize(text, openMarker, closeMarker) { const formatted = []; const parameterAssignment = this[internalSymbol]["parameter"]["assignment"]; const parameterDelimiter = this[internalSymbol]["parameter"]["delimiter"]; const callbacks = this[internalSymbol]["callbacks"]; while (true) { const startIndex = text.indexOf(openMarker); if (startIndex === -1) { formatted.push(text); break; } else if (startIndex > 0) { formatted.push(text.substring(0, startIndex)); text = text.substring(startIndex); } let endIndex = text.substring(openMarker.length).indexOf(closeMarker); if (endIndex !== -1) endIndex += openMarker.length; let insideStartIndex = text.substring(openMarker.length).indexOf(openMarker); if (insideStartIndex !== -1) { insideStartIndex += openMarker.length; if (insideStartIndex < endIndex) { const result = tokenize.call( this, text.substring(insideStartIndex), openMarker, closeMarker ); text = text.substring(0, insideStartIndex) + result; endIndex = text.substring(openMarker.length).indexOf(closeMarker); if (endIndex !== -1) endIndex += openMarker.length; } } if (endIndex === -1) { throw new Error("syntax error in formatter template"); } const key = text.substring(openMarker.length, endIndex); const parts = key.split(parameterDelimiter); const currentPipe = parts.shift(); this[workingDataSymbol] = extend( {}, this[internalObjectSymbol], this[workingDataSymbol] ); for (const kv of parts) { const [k, v] = kv.split(parameterAssignment); this[workingDataSymbol][k] = v; } const t1 = key.split("|").shift().trim(); const t2 = t1.split("::").shift().trim(); const t3 = t2.split(".").shift().trim(); const prefix = t3 in this[workingDataSymbol] ? "path:" : "static:"; let command = ""; if (prefix && key.indexOf(prefix) !== 0 && key.indexOf("path:") !== 0 && key.indexOf("static:") !== 0) { command = prefix; } command += currentPipe; const pipe = new Pipe(command); if (isObject(callbacks)) { for (const [name, callback] of Object.entries(callbacks)) { pipe.setCallback(name, callback); } } formatted.push(validateString(pipe.run(this[workingDataSymbol]))); text = text.substring(endIndex + closeMarker.length); } return formatted.join(""); } var internalObjectSymbol, watchdogSymbol, markerOpenIndexSymbol, markerCloseIndexSymbol, workingDataSymbol, Formatter; var init_formatter = __esm({ "source/text/formatter.mjs"() { init_constants(); init_extend(); init_pipe(); init_basewithoptions(); init_is(); init_validate(); internalObjectSymbol = Symbol("internalObject"); watchdogSymbol = Symbol("watchdog"); markerOpenIndexSymbol = Symbol("markerOpenIndex"); markerCloseIndexSymbol = Symbol("markercloseIndex"); workingDataSymbol = Symbol("workingData"); Formatter = class extends BaseWithOptions { /** * Default values for the markers are `${` and `}` * * @param object * @param options */ constructor(object, options2) { super(options2); this[internalObjectSymbol] = object || {}; this[markerOpenIndexSymbol] = 0; this[markerCloseIndexSymbol] = 0; } /** * @property {object} marker * @property {array} marker.open=["${"] * @property {array} marker.close=["${"] * @property {object} parameter * @property {string} parameter.delimiter="::" * @property {string} parameter.assignment="=" * @property {object} callbacks={} */ get defaults() { return extend({}, super.defaults, { marker: { open: ["${"], close: ["}"] }, parameter: { delimiter: "::", assignment: "=" }, callbacks: {} }); } /** * Set new Parameter Character * * Default values for the chars are `::` and `=` * * ``` * formatter.setParameterChars('#'); * formatter.setParameterChars('[',']'); * formatter.setParameterChars('i18n{','}'); * ``` * * @param {string} delimiter * @param {string} assignment * @return {Formatter} * @since 1.24.0 * @throws {TypeError} value is not a string */ setParameterChars(delimiter, assignment) { if (delimiter !== void 0) { this[internalSymbol]["parameter"]["delimiter"] = validateString(delimiter); } if (assignment !== void 0) { this[internalSymbol]["parameter"]["assignment"] = validateString(assignment); } return this; } /** * Set new Marker * * Default values for the markers are `${` and `}` * * ``` * formatter.setMarker('#'); // open and close are both # * formatter.setMarker('[',']'); * formatter.setMarker('i18n{','}'); * ``` * * @param {array|string} open * @param {array|string|undefined} close * @return {Formatter} * @since 1.12.0 * @throws {TypeError} value is not a string */ setMarker(open, close) { if (close === void 0) { close = open; } if (isString(open)) open = [open]; if (isString(close)) close = [close]; this[internalSymbol]["marker"]["open"] = validateArray(open); this[internalSymbol]["marker"]["close"] = validateArray(close); return this; } /** * * @param {string} text * @return {string} * @throws {TypeError} value is not a string * @throws {Error} too deep nesting */ format(text) { this[watchdogSymbol] = 0; this[markerOpenIndexSymbol] = 0; this[markerCloseIndexSymbol] = 0; this[workingDataSymbol] = {}; return format.call(this, text); } }; } }); // source/types/mediatype.mjs function parseMediaType(mediatype) { const regex = /(?<type>[A-Za-z]+|\*)\/(?<subtype>([a-zA-Z0-9.\+_\-]+)|\*|)(?<parameter>\s*;\s*([a-zA-Z0-9]+)\s*(=\s*("?[A-Za-z0-9_\-]+"?))?)*/g; const result = regex.exec(validateString(mediatype)); const groups = result?.["groups"]; if (groups === void 0) { throw new TypeError("the mimetype can not be parsed"); } const type3 = groups?.["type"]; const subtype = groups?.["subtype"]; const parameter = groups?.["parameter"]; if (subtype === "" || type3 === "") { throw new TypeError("blank value is not allowed"); } return new MediaType(type3, subtype, parseParameter(parameter)); } function parseParameter(parameter) { if (!isString(parameter)) { return void 0; } const result = []; parameter.split(";").forEach((entry) => { entry = entry.trim(); if (entry === "") { return; } const kv = entry.split("="); const key = validateString(kv?.[0]).trim(); const value = validateString(kv?.[1]).trim(); result.push({ key, value }); }); return result; } var internal, MediaType; var init_mediatype = __esm({ "source/types/mediatype.mjs"() { init_base(); init_is(); init_validate(); init_constants(); internal = Symbol("internal"); MediaType = class extends Base { /** * * @param {String} type * @param {String} subtype * @param {Monster.Types.Parameter[]} parameter */ constructor(type3, subtype, parameter) { super(); this[internal] = { type: validateString(type3).toLowerCase(), subtype: validateString(subtype).toLowerCase(), parameter: [] }; if (parameter !== void 0) { this[internal]["parameter"] = validateArray(parameter); } } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/media-type"); } /** * @return {String} */ get type() { return this[internal].type; } /** * @return {String} */ get subtype() { return this[internal].subtype; } // /** // * @return {Monster.Types.Parameter[]} // */ // get parameter() { // return this[internal].parameter; // } /** * * * @return {Map} */ get parameter() { const result = /* @__PURE__ */ new Map(); this[internal]["parameter"].forEach((p) => { let value = p.value; if (value.startsWith('"') && value.endsWith('"')) { value = value.substring(1, value.length - 1); } result.set(p.key, value); }); return result; } /** * * @return {string} */ toString() { const parameter = []; for (const a2 of this[internal].parameter) { parameter.push(`${a2.key}=${a2.value}`); } return `${this[internal].type}/${this[internal].subtype}${parameter.length > 0 ? `;${parameter.join(";")}` : ""}`; } }; } }); // source/types/dataurl.mjs function parseDataURL(dataurl) { validateString(dataurl); dataurl = dataurl.trim(); if (dataurl.substring(0, 5) !== "data:") { throw new TypeError("incorrect or missing data protocol"); } dataurl = dataurl.substring(5); const p = dataurl.indexOf(","); if (p === -1) { throw new TypeError("malformed data url"); } let content = dataurl.substring(p + 1); const mediatypeAndBase64 = dataurl.substring(0, p).trim(); let mediatype = "text/plain;charset=US-ASCII"; let base64Flag = false; if (mediatypeAndBase64 !== "") { mediatype = mediatypeAndBase64; if (mediatypeAndBase64.endsWith("base64")) { const i = mediatypeAndBase64.lastIndexOf(";"); mediatype = mediatypeAndBase64.substring(0, i); base64Flag = true; } else { content = decodeURIComponent(content); } mediatype = parseMediaType(mediatype); } else { content = decodeURIComponent(content); } return new DataUrl(content, mediatype, base64Flag); } var internal2, DataUrl; var init_dataurl = __esm({ "source/types/dataurl.mjs"() { init_base(); init_is(); init_mediatype(); init_validate(); init_constants(); internal2 = Symbol("internal"); DataUrl = class extends Base { /** * * @param {String} content * @param {String|MediaType} mediatype * @param {boolean} base64=true */ constructor(content, mediatype, base64) { super(); if (isString(mediatype)) { mediatype = parseMediaType(mediatype); } this[internal2] = { content: validateString(content), mediatype: validateInstance(mediatype, MediaType), base64: validateBoolean(base64 === void 0 ? true : base64) }; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/data-url"); } get content() { return this[internal2].base64 ? atob(this[internal2].content) : this[internal2].content; } get mediatype() { return this[internal2].mediatype; } /** * * @return {string} * @see https://datatracker.ietf.org/doc/html/rfc2397 */ toString() { let content = this[internal2].content; if (this[internal2].base64 === true) { content = `;base64,${content}`; } else { content = `,${encodeURIComponent(content)}`; } return `data:${this[internal2].mediatype.toString()}${content}`; } }; } }); // source/types/queue.mjs var Queue; var init_queue = __esm({ "source/types/queue.mjs"() { init_base(); init_constants(); Queue = class extends Base { /** * */ constructor() { super(); this.data = []; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/queue"); } /** * @return {boolean} */ isEmpty() { return this.data.length === 0; } /** * Read the element at the front of the queue without removing it. * * @return {*} */ peek() { if (this.isEmpty()) { return void 0; } return this.data[0]; } /** * Add a new element to the end of the queue. * * @param {*} value * @return {Queue} */ add(value) { this.data.push(value); return this; } /** * remove all entries * * @return {Queue} */ clear() { this.data = []; return this; } /** * Remove the element at the front of the queue * If the queue is empty, return undefined. * * @return {*} */ poll() { if (this.isEmpty()) { return void 0; } return this.data.shift(); } }; } }); // source/types/uniquequeue.mjs var UniqueQueue; var init_uniquequeue = __esm({ "source/types/uniquequeue.mjs"() { init_queue(); init_constants(); init_validate(); UniqueQueue = class extends Queue { /** * */ constructor() { super(); this[internalSymbol] = { unique: /* @__PURE__ */ new WeakSet() }; } /** * Add a new element to the end of the queue. * * @param {object} value * @return {Queue} * @throws {TypeError} value is not a object */ add(value) { validateObject(value); if (!this[internalSymbol].unique.has(value)) { this[internalSymbol].unique.add(value); super.add(value); } return this; } /** * remove all entries * * @return {Queue} */ clear() { super.clear(); this[internalSymbol].unique = /* @__PURE__ */ new WeakSet(); return this; } /** * Remove the element at the front of the queue * If the queue is empty, return undefined. * * @return {object} */ poll() { if (this.isEmpty()) { return void 0; } const value = this.data.shift(); this[internalSymbol].unique.delete(value); return value; } }; } }); // source/types/observer.mjs var Observer; var init_observer = __esm({ "source/types/observer.mjs"() { init_base(); init_is(); init_tokenlist(); init_uniquequeue(); init_constants(); Observer = class extends Base { /** * * @param {function} callback * @param {*} args */ constructor(callback, ...args) { super(); if (typeof callback !== "function") { throw new Error("observer callback must be a function"); } this.callback = callback; this.arguments = args; this.tags = new TokenList(); this.queue = new UniqueQueue(); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/observer"); } /** * * @param {string} tag * @return {Observer} */ addTag(tag) { this.tags.add(tag); return this; } /** * * @param {string} tag * @return {Observer} */ removeTag(tag) { this.tags.remove(tag); return this; } /** * * @return {Array} */ getTags() { return this.tags.entries(); } /** * * @param {string} tag * @return {boolean} */ hasTag(tag) { return this.tags.contains(tag); } /** * * @param {object} subject * @return {Promise} */ update(subject) { const self2 = this; if (!isObject(subject)) { return Promise.reject("subject must be an object"); } return new Promise(function(resolve, reject) { self2.queue.add(subject); queueMicrotask(() => { try { if (self2.queue.isEmpty()) { resolve(); return; } const s = self2.queue.poll(); const result = self2.callback.apply(s, self2.arguments); if (isObject(result) && result instanceof Promise) { result.then(resolve).catch(reject); return; } resolve(result); } catch (e) { reject(e); } }); }); } }; } }); // source/types/observerlist.mjs var ObserverList; var init_observerlist = __esm({ "source/types/observerlist.mjs"() { init_base(); init_observer(); init_validate(); ObserverList = class extends Base { /** * */ constructor() { super(); this.observers = []; } /** * * @param {Observer} observer * @return {ObserverList} * @throws {TypeError} value is not an instance of Observer */ attach(observer) { validateInstance(observer, Observer); this.observers.push(observer); return this; } /** * * @param {Observer} observer * @return {ObserverList} * @throws {TypeError} value is not an instance of Observer */ detach(observer) { validateInstance(observer, Observer); var i = 0; var l = this.observers.length; for (; i < l; i++) { if (this.observers[i] === observer) { this.observers.splice(i, 1); } } return this; } /** * * @param {Observer} observer * @return {boolean} * @throws {TypeError} value is not an instance of Observer */ contains(observer) { validateInstance(observer, Observer); var i = 0; var l = this.observers.length; for (; i < l; i++) { if (this.observers[i] === observer) { return true; } } return false; } /** * * @param subject * @return {Promise} */ notify(subject) { const pomises = []; let i = 0; const l = this.observers.length; for (; i < l; i++) { pomises.push(this.observers[i].update(subject)); } return Promise.all(pomises); } }; } }); // source/types/proxyobserver.mjs function getHandler() { const proxy = this; const handler = { // https://262.ecma-international.org/9.0/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver get: function(target, key, receiver) { if (key === proxyInstanceMarker) { return proxyInstanceMarker; } const value = Reflect.get(target, key, receiver); if (typeof key === "symbol") { return value; } if (isPrimitive(value)) { return value; } if (isArray(value) || isObject(value)) { if (proxy.objectMap.has(value)) { return proxy.objectMap.get(value); } else if (proxy.proxyMap.has(value)) { return value; } else { const p = new Proxy(value, handler); proxy.objectMap.set(value, p); proxy.proxyMap.set(p, value); return p; } } return value; }, // https://262.ecma-international.org/9.0/#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver set: function(target, key, value, receiver) { if (proxy.proxyMap.has(value)) { value = proxy.proxyMap.get(value); } if (proxy.proxyMap.has(target)) { target = proxy.proxyMap.get(target); } let current = Reflect.get(target, key, receiver); if (proxy.proxyMap.has(current)) { current = proxy.proxyMap.get(current); } if (current === value) { return true; } let result; let descriptor = Reflect.getOwnPropertyDescriptor(target, key); if (descriptor === void 0) { descriptor = { writable: true, enumerable: true, configurable: true }; } descriptor["value"] = value; result = Reflect.defineProperty(target, key, descriptor); if (typeof key !== "symbol") { proxy.observers.notify(proxy); } return result; }, // https://262.ecma-international.org/9.0/#sec-proxy-object-internal-methods-and-internal-slots-delete-p deleteProperty: function(target, key) { if (key in target) { delete target[key]; if (typeof key !== "symbol") { proxy.observers.notify(proxy); } return true; } return false; }, // https://262.ecma-international.org/9.0/#sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc defineProperty: function(target, key, descriptor) { const result = Reflect.defineProperty(target, key, descriptor); if (typeof key !== "symbol") { proxy.observers.notify(proxy); } return result; }, // https://262.ecma-international.org/9.0/#sec-proxy-object-internal-methods-and-internal-slots-setprototypeof-v setPrototypeOf: function(target, key) { const result = Reflect.setPrototypeOf(object1, key); if (typeof key !== "symbol") { proxy.observers.notify(proxy); } return result; } }; return handler; } var ProxyObserver; var init_proxyobserver = __esm({ "source/types/proxyobserver.mjs"() { init_base(); init_is(); init_observer(); init_observerlist(); init_validate(); init_extend(); init_constants(); init_clone(); ProxyObserver = class extends Base { /** * * @param {object} object * @throws {TypeError} value is not a object */ constructor(object) { super(); this.realSubject = validateObject(object); this.subject = new Proxy(object, getHandler.call(this)); this.objectMap = /* @__PURE__ */ new WeakMap(); this.objectMap.set(this.realSubject, this.subject); this.proxyMap = /* @__PURE__ */ new WeakMap(); this.proxyMap.set(this.subject, this.realSubject); this.observers = new ObserverList(); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/proxy-observer"); } /** * @return {object} */ getSubject() { return this.subject; } /** * @since 1.24.0 * @param {Object} obj * @return {ProxyObserver} */ setSubject(obj) { let i; const clonedObject = clone(obj); const k = Object.keys(this.subject); for (i = 0; i < k.length; i++) { delete this.subject[k[i]]; } this.subject = extend(this.subject, clonedObject); return this; } /** * Get the real object * * Changes to this object are not noticed by the observers, so you can make a large number of changes and inform the observers later. * * @return {object} */ getRealSubject() { return this.realSubject; } /** * attach a new observer * * @param {Observer} observer * @return {ProxyObserver} */ attachObserver(observer) { this.observers.attach(observer); return this; } /** * detach a observer * * @param {Observer} observer * @return {ProxyObserver} */ detachObserver(observer) { this.observers.detach(observer); return this; } /** * notify all observer * * @return {Promise} */ notifyObservers() { return this.observers.notify(this); } /** * @param {Observer} observer * @return {boolean} */ containsObserver(observer) { return this.observers.contains(observer); } }; } }); // source/dom/theme.mjs function getDocumentTheme() { const document2 = getGlobalObject("document"); let name = DEFAULT_THEME; const element = document2.querySelector("html"); if (element instanceof HTMLElement) { const theme = element.getAttribute(ATTRIBUTE_THEME_NAME); if (theme) { name = theme; } } return new Theme(name); } var Theme; var init_theme = __esm({ "source/dom/theme.mjs"() { init_base(); init_global(); init_validate(); init_constants2(); init_constants(); Theme = class extends Base { /** * * @param name * @throws {TypeError} value is not a string */ constructor(name) { super(); validateString(name); this.name = name; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/theme"); } /** * * @return {string} */ getName() { return this.name; } }; } }); // source/dom/template.mjs function findDocumentTemplate(id, currentNode) { validateString(id); const document2 = getGlobalObject("document"); const HTMLTemplateElement2 = getGlobalFunction("HTMLTemplateElement"); const DocumentFragment2 = getGlobalFunction("DocumentFragment"); const Document2 = getGlobalFunction("Document"); let prefixID; if (!(currentNode instanceof Document2 || currentNode instanceof DocumentFragment2)) { if (currentNode instanceof Node) { if (currentNode.hasAttribute(ATTRIBUTE_TEMPLATE_PREFIX)) { prefixID = currentNode.getAttribute(ATTRIBUTE_TEMPLATE_PREFIX); } currentNode = currentNode.getRootNode(); if (!(currentNode instanceof Document2 || currentNode instanceof DocumentFragment2)) { currentNode = currentNode.ownerDocument; } } if (!(currentNode instanceof Document2 || currentNode instanceof DocumentFragment2)) { currentNode = document2; } } let template; const theme = getDocumentTheme(); if (prefixID) { const themedPrefixID = `${prefixID}-${id}-${theme.getName()}`; template = findElementWithIdUpwards(currentNode, themedPrefixID); if (template instanceof HTMLTemplateElement2) { return new Template(template); } } const themedID = `${id}-${theme.getName()}`; template = findElementWithIdUpwards(currentNode, themedID); if (template instanceof HTMLTemplateElement2) { return new Template(template); } template = findElementWithIdUpwards(currentNode, id); if (template instanceof HTMLTemplateElement2) { return new Template(template); } throw new Error(`template ${id} not found.`); } var Template; var init_template = __esm({ "source/dom/template.mjs"() { init_base(); init_global(); init_validate(); init_constants2(); init_theme(); init_constants(); init_util(); Template = class extends Base { /** * * @param {HTMLTemplateElement} template * @throws {TypeError} value is not an instance of * @throws {TypeError} value is not a function * @throws {Error} the function is not defined */ constructor(template) { super(); const HTMLTemplateElement2 = getGlobalFunction("HTMLTemplateElement"); validateInstance(template, HTMLTemplateElement2); this.template = template; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource/template"); } /** * * @return {HTMLTemplateElement} */ getTemplateElement() { return this.template; } /** * * @return {DocumentFragment} * @throws {TypeError} value is not an instance of */ createDocumentFragment() { return this.template.content.cloneNode(true); } }; } }); // source/data/diff.mjs function diff(first, second) { return doDiff(first, second); } function getKeys(a2, b, type3) { if (isArray(type3)) { const keys = a2.length > b.length ? new Array(a2.length) : new Array(b.length); keys.fill(0); return new Set(keys.map((_, i) => i)); } return new Set(Object.keys(a2).concat(Object.keys(b))); } function doDiff(a2, b, path, diff2) { const typeA = typeOf(a2); const typeB = typeOf(b); const currPath = path || []; const currDiff = diff2 || []; if (typeA === typeB && (typeA === "object" || typeA === "array")) { getKeys(a2, b, typeA).forEach((v) => { if (!Object.prototype.hasOwnProperty.call(a2, v)) { currDiff.push(buildResult(a2[v], b[v], "add", currPath.concat(v))); } else if (!Object.prototype.hasOwnProperty.call(b, v)) { currDiff.push(buildResult(a2[v], b[v], "delete", currPath.concat(v))); } else { doDiff(a2[v], b[v], currPath.concat(v), currDiff); } }); } else { const o = getOperator2(a2, b, typeA, typeB); if (o !== void 0) { currDiff.push(buildResult(a2, b, o, path)); } } return currDiff; } function buildResult(a2, b, operator, path) { const result = { operator, path }; if (operator !== "add") { result.first = { value: a2, type: typeof a2 }; if (isObject(a2)) { const name = Object.getPrototypeOf(a2)?.constructor?.name; if (name !== void 0) { result.first.instance = name; } } } if (operator === "add" || operator === "update") { result.second = { value: b, type: typeof b }; if (isObject(b)) { const name = Object.getPrototypeOf(b)?.constructor?.name; if (name !== void 0) { result.second.instance = name; } } } return result; } function isNotEqual(a2, b) { if (typeof a2 !== typeof b) { return true; } if (a2 instanceof Date && b instanceof Date) { return a2.getTime() !== b.getTime(); } return a2 !== b; } function getOperator2(a2, b) { let operator; const typeA = typeof a2; const typeB = typeof b; if (typeA === "undefined" && typeB !== "undefined") { operator = "add"; } else if (typeA !== "undefined" && typeB === "undefined") { operator = "delete"; } else if (isNotEqual(a2, b)) { operator = "update"; } return operator; } var init_diff = __esm({ "source/data/diff.mjs"() { init_is(); init_typeof(); } }); // source/util/trimspaces.mjs function trimSpaces(value) { validateString(value); const placeholder = /* @__PURE__ */ new Map(); const regex = /((?<pattern>\\(?<char>.)){1})/gim; const result = value.matchAll(regex); for (const m of result) { const g = m?.["groups"]; if (!isObject(g)) { continue; } const p = g?.["pattern"]; const c = g?.["char"]; if (p && c) { const r = `__${new ID().toString()}__`; placeholder.set(r, c); value = value.replace(p, r); } } value = value.trim(); placeholder.forEach((v, k) => { value = value.replace(k, `\\${v}`); }); return value; } var init_trimspaces = __esm({ "source/util/trimspaces.mjs"() { init_id(); init_is(); init_validate(); } }); // source/dom/events.mjs function fireEvent(element, type3) { const document2 = getDocument(); if (element instanceof HTMLElement) { if (type3 === "click") { element.click(); return; } const event = new Event(validateString(type3), { bubbles: true, cancelable: true, composed: true }); element.dispatchEvent(event); } else if (element instanceof HTMLCollection || element instanceof NodeList) { for (const e of element) { fireEvent(e, type3); } } else { throw new TypeError( "value is not an instance of HTMLElement or HTMLCollection" ); } } function fireCustomEvent(element, type3, detail) { if (element instanceof HTMLElement) { if (!isObject(detail)) { detail = { detail }; } const event = new CustomEvent(validateString(type3), { bubbles: true, cancelable: true, composed: true, detail }); element.dispatchEvent(event); } else if (element instanceof HTMLCollection || element instanceof NodeList) { for (const e of element) { fireCustomEvent(e, type3, detail); } } else { throw new TypeError( "element is not an instance of HTMLElement or HTMLCollection" ); } } function findTargetElementFromEvent(event, attributeName, attributeValue) { validateInstance(event, Event); if (typeof event.composedPath !== "function") { throw new Error("unsupported event"); } const path = event.composedPath(); if (isArray(path)) { for (let i = 0; i < path.length; i++) { const o = path[i]; if (o instanceof HTMLElement && o.hasAttribute(attributeName) && (attributeValue === void 0 || o.getAttribute(attributeName) === attributeValue)) { return o; } } } return void 0; } var init_events = __esm({ "source/dom/events.mjs"() { init_is(); init_validate(); init_util(); } }); // source/dom/updater.mjs var updater_exports = {}; __export(updater_exports, { Updater: () => Updater, addObjectWithUpdaterToElement: () => addObjectWithUpdaterToElement }); function getCheckStateCallback() { return function(current) { if (this instanceof HTMLInputElement) { if (["radio", "checkbox"].indexOf(this.type) !== -1) { return `${this.value}` === `${current}` ? "true" : void 0; } } else if (this instanceof HTMLOptionElement) { if (isArray(current) && current.indexOf(this.value) !== -1) { return "true"; } return void 0; } }; } function getControlEventHandler() { if (this[symbol]) { return this[symbol]; } this[symbol] = (event) => { const element = findTargetElementFromEvent(event, ATTRIBUTE_UPDATER_BIND); if (element === void 0) { return; } queueMicrotask(() => { try { retrieveAndSetValue.call(this, element); } catch (e) { addAttributeToken(element, ATTRIBUTE_ERRORMESSAGE, e.message || `${e}`); } }); }; return this[symbol]; } function retrieveAndSetValue(element) { const pathfinder = new Pathfinder(this[internalSymbol].subject.getSubject()); let path = element.getAttribute(ATTRIBUTE_UPDATER_BIND); if (path === null) throw new Error("the bind argument must start as a value with a path"); if (path.indexOf("path:") !== 0) { throw new Error("the bind argument must start as a value with a path"); } path = path.substring(5); let value; if (element instanceof HTMLInputElement) { switch (element.type) { case "checkbox": value = element.checked ? element.value : void 0; break; default: value = element.value; break; } } else if (element instanceof HTMLTextAreaElement) { value = element.value; } else if (element instanceof HTMLSelectElement) { switch (element.type) { case "select-one": value = element.value; break; case "select-multiple": value = element.value; let options2 = element?.selectedOptions; if (options2 === void 0) options2 = element.querySelectorAll(":scope option:checked"); value = Array.from(options2).map(({ value: value2 }) => value2); break; } } else if (element?.constructor?.prototype && !!Object.getOwnPropertyDescriptor( element.constructor.prototype, "value" )?.["get"] || element.hasOwnProperty("value")) { value = element?.["value"]; } else { throw new Error("unsupported object"); } if (isString(value)) { const type3 = element.getAttribute(ATTRIBUTE_UPDATER_BIND_TYPE); switch (type3) { case "number": case "int": case "float": case "integer": value = Number(value); if (isNaN(value)) { value = 0; } break; case "boolean": case "bool": case "checkbox": value = value === "true" || value === "1" || value === "on"; break; case "array": case "list": value = value.split(","); break; case "object": case "json": value = JSON.parse(value); break; default: break; } } const copy = clone(this[internalSymbol].subject.getRealSubject()); const pf = new Pathfinder(copy); pf.setVia(path, value); const diffResult = diff(copy, this[internalSymbol].subject.getRealSubject()); if (diffResult.length > 0) { pathfinder.setVia(path, value); } } function retrieveFromBindings() { if (this[internalSymbol].element.matches(`[${ATTRIBUTE_UPDATER_BIND}]`)) { retrieveAndSetValue.call(this, this[internalSymbol].element); } for (const [, element] of this[internalSymbol].element.querySelectorAll(`[${ATTRIBUTE_UPDATER_BIND}]`).entries()) { retrieveAndSetValue.call(this, element); } } function removeElement(change) { for (const [, element] of this[internalSymbol].element.querySelectorAll(`:scope [${ATTRIBUTE_UPDATER_REMOVE}]`).entries()) { element.parentNode.removeChild(element); } } function insertElement(change) { const subject = this[internalSymbol].subject.getRealSubject(); const mem = /* @__PURE__ */ new WeakSet(); let wd = 0; const container = this[internalSymbol].element; while (true) { let found = false; wd++; const p = clone(change?.["path"]); if (!isArray(p)) return; while (p.length > 0) { const current = p.join("."); let iterator = /* @__PURE__ */ new Set(); const query = `[${ATTRIBUTE_UPDATER_INSERT}*="path:${current}"]`; const e = container.querySelectorAll(query); if (e.length > 0) { iterator = /* @__PURE__ */ new Set([...e]); } if (container.matches(query)) { iterator.add(container); } for (const [, containerElement] of iterator.entries()) { if (mem.has(containerElement)) continue; mem.add(containerElement); found = true; const attributes = containerElement.getAttribute( ATTRIBUTE_UPDATER_INSERT ); if (attributes === null) continue; const def = trimSpaces(attributes); const i = def.indexOf(" "); const key = trimSpaces(def.substr(0, i)); const refPrefix = `${key}-`; const cmd = trimSpaces(def.substr(i)); if (cmd.indexOf("|") > 0) { throw new Error("pipes are not allowed when cloning a node."); } const pipe = new Pipe(cmd); this[internalSymbol].callbacks.forEach((f, n) => { pipe.setCallback(n, f); }); let value; try { containerElement.removeAttribute(ATTRIBUTE_ERRORMESSAGE); value = pipe.run(subject); } catch (e2) { containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, e2.message); } const dataPath = cmd.split(":").pop(); let insertPoint; if (containerElement.hasChildNodes()) { insertPoint = containerElement.lastChild; } if (!isIterable(value)) { throw new Error("the value is not iterable"); } const available = /* @__PURE__ */ new Set(); for (const [i2] of Object.entries(value)) { const ref = refPrefix + i2; const currentPath = `${dataPath}.${i2}`; available.add(ref); const refElement = containerElement.querySelector( `[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}="${ref}"]` ); if (refElement instanceof HTMLElement) { insertPoint = refElement; continue; } appendNewDocumentFragment(containerElement, key, ref, currentPath); } const nodes = containerElement.querySelectorAll( `[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}*="${refPrefix}"]` ); for (const [, node] of Object.entries(nodes)) { if (!available.has( node.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE) )) { try { containerElement.removeChild(node); } catch (e2) { containerElement.setAttribute( ATTRIBUTE_ERRORMESSAGE, `${containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e2.message}`.trim() ); } } } } p.pop(); } if (found === false) break; if (wd++ > 200) { throw new Error("the maximum depth for the recursion is reached."); } } } function appendNewDocumentFragment(container, key, ref, path) { const template = findDocumentTemplate(key, container); const nodes = template.createDocumentFragment(); for (const [, node] of Object.entries(nodes.childNodes)) { if (node instanceof HTMLElement) { applyRecursive(node, key, path); node.setAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE, ref); } container.appendChild(node); } } function applyRecursive(node, key, path) { if (node instanceof HTMLElement) { if (node.hasAttribute(ATTRIBUTE_UPDATER_REPLACE)) { const value = node.getAttribute(ATTRIBUTE_UPDATER_REPLACE); node.setAttribute( ATTRIBUTE_UPDATER_REPLACE, value.replaceAll(`path:${key}`, `path:${path}`) ); } if (node.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) { const value = node.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES); node.setAttribute( ATTRIBUTE_UPDATER_ATTRIBUTES, value.replaceAll(`path:${key}`, `path:${path}`) ); } for (const [, child] of Object.entries(node.childNodes)) { applyRecursive(child, key, path); } } } function updateContent(change) { const subject = this[internalSymbol].subject.getRealSubject(); const p = clone(change?.["path"]); runUpdateContent.call(this, this[internalSymbol].element, p, subject); const slots = this[internalSymbol].element.querySelectorAll("slot"); if (slots.length > 0) { for (const [, slot] of Object.entries(slots)) { for (const [, element] of Object.entries(slot.assignedNodes())) { runUpdateContent.call(this, element, p, subject); } } } } function runUpdateContent(container, parts, subject) { if (!isArray(parts)) return; if (!(container instanceof HTMLElement)) return; parts = clone(parts); const mem = /* @__PURE__ */ new WeakSet(); while (parts.length > 0) { const current = parts.join("."); parts.pop(); const query = `[${ATTRIBUTE_UPDATER_REPLACE}^="path:${current}"], [${ATTRIBUTE_UPDATER_REPLACE}^="static:"], [${ATTRIBUTE_UPDATER_REPLACE}^="i18n:"]`; const e = container.querySelectorAll(`${query}`); const iterator = /* @__PURE__ */ new Set([...e]); if (container.matches(query)) { iterator.add(container); } for (const [element] of iterator.entries()) { if (mem.has(element)) return; mem.add(element); const attributes = element.getAttribute(ATTRIBUTE_UPDATER_REPLACE); const cmd = trimSpaces(attributes); const pipe = new Pipe(cmd); this[internalSymbol].callbacks.forEach((f, n) => { pipe.setCallback(n, f); }); let value; try { element.removeAttribute(ATTRIBUTE_ERRORMESSAGE); value = pipe.run(subject); } catch (e2) { element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e2.message); } if (value instanceof HTMLElement) { while (element.firstChild) { element.removeChild(element.firstChild); } try { element.appendChild(value); } catch (e2) { element.setAttribute( ATTRIBUTE_ERRORMESSAGE, `${element.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e2.message}`.trim() ); } } else { element.innerHTML = value; } } } } function updateAttributes(change) { const subject = this[internalSymbol].subject.getRealSubject(); const p = clone(change?.["path"]); runUpdateAttributes.call(this, this[internalSymbol].element, p, subject); } function runUpdateAttributes(container, parts, subject) { if (!isArray(parts)) return; parts = clone(parts); const mem = /* @__PURE__ */ new WeakSet(); while (parts.length > 0) { const current = parts.join("."); parts.pop(); let iterator = /* @__PURE__ */ new Set(); const query = `[${ATTRIBUTE_UPDATER_SELECT_THIS}][${ATTRIBUTE_UPDATER_ATTRIBUTES}], [${ATTRIBUTE_UPDATER_ATTRIBUTES}*="path:${current}"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="static:"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="i18n:"]`; const e = container.querySelectorAll(query); if (e.length > 0) { iterator = /* @__PURE__ */ new Set([...e]); } if (container.matches(query)) { iterator.add(container); } for (const [element] of iterator.entries()) { if (mem.has(element)) return; mem.add(element); if (!element.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) { continue; } const attributes = element.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES); for (let [, def] of Object.entries(attributes.split(","))) { def = trimSpaces(def); const i = def.indexOf(" "); const name = trimSpaces(def.substr(0, i)); const cmd = trimSpaces(def.substr(i)); const pipe = new Pipe(cmd); this[internalSymbol].callbacks.forEach((f, n) => { pipe.setCallback(n, f, element); }); let value; try { element.removeAttribute(ATTRIBUTE_ERRORMESSAGE); value = pipe.run(subject); } catch (e2) { element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e2.message); } if (value === void 0) { element.removeAttribute(name); } else if (element.getAttribute(name) !== value) { element.setAttribute(name, value); } handleInputControlAttributeUpdate.call(this, element, name, value); } } } } function handleInputControlAttributeUpdate(element, name, value) { if (element instanceof HTMLSelectElement) { switch (element.type) { case "select-multiple": for (const [index, opt] of Object.entries(element.options)) { opt.selected = value.indexOf(opt.value) !== -1; } break; case "select-one": for (const [index, opt] of Object.entries(element.options)) { if (opt.value === value) { element.selectedIndex = index; break; } } break; } } else if (element instanceof HTMLInputElement) { switch (element.type) { case "radio": if (name === "checked") { element.checked = value !== void 0; } break; case "checkbox": if (name === "checked") { element.checked = value !== void 0; } break; case "text": default: if (name === "value") { element.value = value === void 0 ? "" : value; } break; } } else if (element instanceof HTMLTextAreaElement) { if (name === "value") { element.value = value === void 0 ? "" : value; } } } function addObjectWithUpdaterToElement(elements, symbol2, object, config2 = {}) { if (!(this instanceof HTMLElement)) { throw new TypeError( "the context of this function must be an instance of HTMLElement" ); } if (!(typeof symbol2 === "symbol")) { throw new TypeError("symbol must be an instance of Symbol"); } const updaters = /* @__PURE__ */ new Set(); if (elements instanceof NodeList) { elements = /* @__PURE__ */ new Set([...elements]); } else if (elements instanceof HTMLElement) { elements = /* @__PURE__ */ new Set([elements]); } else if (elements instanceof Set) { } else { throw new TypeError( `elements is not a valid type. (actual: ${typeof elements})` ); } const result = []; const updaterCallbacks = []; const cb = this?.[updaterTransformerMethodsSymbol]; if (this instanceof HTMLElement && typeof cb === "function") { const callbacks = cb.call(this); if (typeof callbacks === "object") { for (const [name, callback] of Object.entries(callbacks)) { if (typeof callback === "function") { updaterCallbacks.push([name, callback]); } else { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, `onUpdaterPipeCallbacks: ${name} is not a function` ); } } } else { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, `onUpdaterPipeCallbacks do not return an object with functions` ); } } elements.forEach((element) => { if (!(element instanceof HTMLElement)) return; if (element instanceof HTMLTemplateElement) return; const u = new Updater(element, object); updaters.add(u); if (updaterCallbacks.length > 0) { for (const [name, callback] of updaterCallbacks) { u.setCallback(name, callback); } } result.push( u.run().then(() => { if (config2.eventProcessing === true) { u.enableEventProcessing(); } return u; }) ); }); if (updaters.size > 0) { addToObjectLink(this, symbol2, updaters); } return result; } var Updater, symbol; var init_updater = __esm({ "source/dom/updater.mjs"() { init_constants(); init_diff(); init_pathfinder(); init_pipe(); init_constants2(); init_base(); init_is(); init_observer(); init_proxyobserver(); init_validate(); init_clone(); init_trimspaces(); init_attributes(); init_customelement(); init_events(); init_template(); init_util(); Updater = class extends Base { /** * @since 1.8.0 * @param {HTMLElement} element * @param {object|ProxyObserver|undefined} subject * @throws {TypeError} value is not a object * @throws {TypeError} value is not an instance of HTMLElement * @see {@link findDocumentTemplate} */ constructor(element, subject) { super(); if (subject === void 0) subject = {}; if (!isInstance(subject, ProxyObserver)) { subject = new ProxyObserver(subject); } this[internalSymbol] = { element: validateInstance(element, HTMLElement), last: {}, callbacks: /* @__PURE__ */ new Map(), eventTypes: ["keyup", "click", "change", "drop", "touchend", "input"], subject }; this[internalSymbol].callbacks.set( "checkstate", getCheckStateCallback.call(this) ); this[internalSymbol].subject.attachObserver( new Observer(() => { const s = this[internalSymbol].subject.getRealSubject(); const diffResult = diff(this[internalSymbol].last, s); this[internalSymbol].last = clone(s); const promises = []; for (const [, change] of Object.entries(diffResult)) { promises.push( new Promise((resolve, reject) => { getWindow2().requestAnimationFrame(() => { try { removeElement.call(this, change); insertElement.call(this, change); updateContent.call(this, change); updateAttributes.call(this, change); resolve(); } catch (error) { reject(error); } }); }) ); } return Promise.all(promises); }) ); } /** * Defaults: 'keyup', 'click', 'change', 'drop', 'touchend' * * @see {@link https://developer.mozilla.org/de/docs/Web/Events} * @since 1.9.0 * @param {Array} types * @return {Updater} */ setEventTypes(types) { this[internalSymbol].eventTypes = validateArray(types); return this; } /** * With this method, the eventlisteners are hooked in and the magic begins. * * ```js * updater.run().then(() => { * updater.enableEventProcessing(); * }); * ``` * * @since 1.9.0 * @return {Updater} * @throws {Error} the bind argument must start as a value with a path */ enableEventProcessing() { this.disableEventProcessing(); for (const type3 of this[internalSymbol].eventTypes) { this[internalSymbol].element.addEventListener( type3, getControlEventHandler.call(this), { capture: true, passive: true } ); } return this; } /** * This method turns off the magic or who loves it more profane it removes the eventListener. * * @since 1.9.0 * @return {Updater} */ disableEventProcessing() { for (const type3 of this[internalSymbol].eventTypes) { this[internalSymbol].element.removeEventListener( type3, getControlEventHandler.call(this) ); } return this; } /** * The run method must be called for the update to start working. * The method ensures that changes are detected. * * ```js * updater.run().then(() => { * updater.enableEventProcessing(); * }); * ``` * * @summary Let the magic begin * @return {Promise} */ run() { this[internalSymbol].last = { __init__: true }; return this[internalSymbol].subject.notifyObservers(); } /** * Gets the values of bound elements and changes them in subject * * @since 1.27.0 * @return {Monster.DOM.Updater} */ retrieve() { retrieveFromBindings.call(this); return this; } /** * If you have passed a ProxyObserver in the constructor, you will get the object that the ProxyObserver manages here. * However, if you passed a simple object, here you will get a proxy for that object. * * For changes, the ProxyObserver must be used. * * @since 1.8.0 * @return {Proxy} */ getSubject() { return this[internalSymbol].subject.getSubject(); } /** * This method can be used to register commands that can be called via call: instruction. * This can be used to provide a pipe with its own functionality. * * @param {string} name * @param {function} callback * @return {Transformer} * @throws {TypeError} value is not a string * @throws {TypeError} value is not a function */ setCallback(name, callback) { this[internalSymbol].callbacks.set(name, callback); return this; } }; symbol = Symbol("@schukai/monster/updater@@EventHandler"); } }); // source/dom/slotted.mjs function getSlottedNodes(query, name) { const result = /* @__PURE__ */ new Set(); if (!this.shadowRoot) { return result; } let selector = "slot"; if (name !== void 0) { if (name === null) { selector += ":not([name])"; } else { selector += `[name=${validateString(name)}]`; } } const slots = this.shadowRoot.querySelectorAll(selector); for (const [, slot] of Object.entries(slots)) { slot.assignedNodes().forEach(function(node) { if (node === null || node === void 0) { return; } if (isString(query)) { node.querySelectorAll(query).forEach(function(n) { result.add(n); }); if (node.matches(query)) { result.add(node); } } else if (query !== void 0) { throw new Error("query must be a string"); } else { result.add(node); } }); } return result; } function getSlottedElements(query, name) { const result = /* @__PURE__ */ new Set(); if (!(this.shadowRoot instanceof ShadowRoot)) { return result; } let selector = "slot"; if (name !== void 0) { if (name === null) { selector += ":not([name])"; } else { selector += `[name=${validateString(name)}]`; } } const slots = this.shadowRoot.querySelectorAll(selector); for (const [, slot] of Object.entries(slots)) { slot.assignedElements().forEach(function(node) { if (!(node instanceof HTMLElement) && !(node instanceof SVGElement) && !(node instanceof MathMLElement)) return; if (isString(query)) { if (query.length > 0) { node.querySelectorAll(query).forEach(function(n) { result.add(n); }); if (node.matches(query)) { result.add(node); } } else { result.add(node); } } else if (query !== void 0) { throw new Error("query must be a string and not empty"); } else { result.add(node); } }); } return result; } var init_slotted = __esm({ "source/dom/slotted.mjs"() { init_is(); init_validate(); } }); // source/dom/util/extract-keys.mjs function extractKeys(obj, keyPrefix = "", keySeparator = "-", valueSeparator = ".") { const resultMap = /* @__PURE__ */ new Map(); function helper(currentObj, currentKeyPrefix, currentValuePrefix) { for (const key in currentObj) { if (currentObj[key] !== null && typeof currentObj[key] === "object" && !Array.isArray(currentObj[key])) { const newKeyPrefix = currentKeyPrefix ? currentKeyPrefix + keySeparator + key.toLowerCase() : key.toLowerCase(); const newValuePrefix = currentValuePrefix ? currentValuePrefix + valueSeparator + key : key; helper(currentObj[key], newKeyPrefix, newValuePrefix); } else { const finalKey = currentKeyPrefix ? currentKeyPrefix + keySeparator + key.toLowerCase() : key.toLowerCase(); const finalValue = currentValuePrefix ? currentValuePrefix + valueSeparator + key : key; resultMap.set(finalKey, finalValue); } } } helper(obj, keyPrefix, keyPrefix); return resultMap; } var init_extract_keys = __esm({ "source/dom/util/extract-keys.mjs"() { } }); // source/dom/util/init-options-from-attributes.mjs var init_options_from_attributes_exports = {}; __export(init_options_from_attributes_exports, { initOptionsFromAttributes: () => initOptionsFromAttributes }); function initOptionsFromAttributes(element, options2, mapping = {}, prefix = "data-monster-option-") { if (!(element instanceof HTMLElement)) return options2; if (!element.hasAttributes()) return options2; const keyMap = extractKeys(options2); const finder = new Pathfinder(options2); element.getAttributeNames().forEach((name) => { if (!name.startsWith(prefix)) return; const optionName = keyMap.get(name.substring(prefix.length).toLowerCase()); if (!finder.exists(optionName)) return; if (element.hasAttribute(name)) { let value = element.getAttribute(name); if (mapping.hasOwnProperty(optionName) && isFunction(mapping[optionName])) { value = mapping[optionName](value); } let optionValue = finder.getVia(optionName); if (optionValue === null || optionValue === void 0) { optionValue = value; } if (optionValue === null || optionValue === void 0) { value = null; } else if (isBoolean(optionValue)) { value = value === "true"; } else if (isInteger(optionValue)) { value = Number(value); } else if (isString(optionValue)) { value = String(value); } else if (isObject(optionValue)) { value = JSON.parse(value); } else if (isArray(optionValue)) { value = value.split("::"); } else { value = optionValue; } finder.setVia(optionName, value); } }); return options2; } var init_init_options_from_attributes = __esm({ "source/dom/util/init-options-from-attributes.mjs"() { init_pathfinder(); init_is(); init_extract_keys(); } }); // source/dom/util/set-option-from-attribute.mjs function setOptionFromAttribute(element, name, options2, mapping = {}, prefix = "data-monster-option-") { if (!(element instanceof HTMLElement)) return options2; if (!element.hasAttributes()) return options2; const keyMap = extractKeys(options2); const finder = new Pathfinder(options2); const optionName = keyMap.get(name.substring(prefix.length).toLowerCase()); if (!finder.exists(optionName)) return; if (!element.hasAttribute(name)) { return options2; } let value = element.getAttribute(name); if (mapping.hasOwnProperty(optionName) && isFunction(mapping[optionName])) { value = mapping[optionName](value); } const typeOfOptionValue = typeof finder.getVia(optionName); if (typeOfOptionValue === "boolean") { value = value === "true"; } else if (typeOfOptionValue === "number") { value = Number(value); } else if (typeOfOptionValue === "string") { value = String(value); } else if (typeOfOptionValue === "object") { value = JSON.parse(value); } finder.setVia(optionName, value); return options2; } var init_set_option_from_attribute = __esm({ "source/dom/util/set-option-from-attribute.mjs"() { init_pathfinder(); init_is(); init_customelement(); init_extract_keys(); } }); // source/dom/error.mjs function addErrorAttribute(element, message) { validateInstance(element, HTMLElement); if (message instanceof Error) { message = message.message; } if (typeof message !== "string") { if (typeof message === "object" && message !== null) { if (typeof message.toString === "function") { message = message.toString(); } else { message = JSON.stringify(message); } } else { message = String(message); } } validateString(message); if (!element.hasAttribute(ATTRIBUTE_ERRORMESSAGE)) { element.setAttribute(ATTRIBUTE_ERRORMESSAGE, message); return element; } const current = element.getAttribute(ATTRIBUTE_ERRORMESSAGE); const list = current.split("::"); for (let i = 0; i < list.length; i++) { if (list[i] === message) { return element; } } list.push(message); element.setAttribute( ATTRIBUTE_ERRORMESSAGE, list.join("::") ); return element; } var init_error = __esm({ "source/dom/error.mjs"() { init_validate(); init_constants2(); } }); // source/dom/customelement.mjs var customelement_exports = {}; __export(customelement_exports, { CustomElement: () => CustomElement, assembleMethodSymbol: () => assembleMethodSymbol, attributeObserverSymbol: () => attributeObserverSymbol, getSlottedElements: () => getSlottedElements, initMethodSymbol: () => initMethodSymbol, registerCustomElement: () => registerCustomElement, updaterTransformerMethodsSymbol: () => updaterTransformerMethodsSymbol }); function callControlCallback(callBackFunctionName, ...args) { if (!isString(callBackFunctionName) || callBackFunctionName === "") { return; } if (callBackFunctionName in this) { return this[callBackFunctionName](this, ...args); } if (!this.hasAttribute(ATTRIBUTE_SCRIPT_HOST)) { return; } if (this[scriptHostElementSymbol].length === 0) { const targetId = this.getAttribute(ATTRIBUTE_SCRIPT_HOST); if (!targetId) { return; } const list = targetId.split(","); for (const id of list) { const host = findElementWithIdUpwards(this, targetId); if (!(host instanceof HTMLElement)) { continue; } this[scriptHostElementSymbol].push(host); } } for (const host of this[scriptHostElementSymbol]) { if (callBackFunctionName in host) { try { return host[callBackFunctionName](this, ...args); } catch (e) { addErrorAttribute(this, e); } } } addErrorAttribute( this, `callback ${callBackFunctionName} not found` ); } function initFromCallbackHost() { let callBackFunctionName = initControlCallbackName; if (this.hasAttribute(ATTRIBUTE_INIT_CALLBACK)) { callBackFunctionName = this.getAttribute(ATTRIBUTE_INIT_CALLBACK); } callControlCallback.call(this, callBackFunctionName); } function attachAttributeChangeMutationObserver() { const self2 = this; if (typeof self2[attributeMutationObserverSymbol] !== "undefined") { return; } self2[attributeMutationObserverSymbol] = new MutationObserver( function(mutations, observer) { for (const mutation of mutations) { if (mutation.type === "attributes") { self2.attributeChangedCallback( mutation.attributeName, mutation.oldValue, mutation.target.getAttribute(mutation.attributeName) ); } } } ); try { self2[attributeMutationObserverSymbol].observe(self2, { attributes: true, attributeOldValue: true }); } catch (e) { addErrorAttribute(self2, e); } } function containChildNode(node) { if (this.contains(node)) { return true; } for (const [, e] of Object.entries(this.childNodes)) { if (e.contains(node)) { return true; } containChildNode.call(e, node); } return false; } function initOptionObserver() { const self2 = this; let lastDisabledValue = void 0; self2.attachObserver( new Observer(function() { const flag3 = self2.getOption("disabled"); if (flag3 === lastDisabledValue) { return; } lastDisabledValue = flag3; if (!(self2.shadowRoot instanceof ShadowRoot)) { return; } const query = "button, command, fieldset, keygen, optgroup, option, select, textarea, input, [data-monster-objectlink]"; const elements = self2.shadowRoot.querySelectorAll(query); let nodeList; try { nodeList = /* @__PURE__ */ new Set([ ...elements, ...getSlottedElements.call(self2, query) ]); } catch (e) { nodeList = elements; } for (const element of [...nodeList]) { if (flag3 === true) { element.setAttribute(ATTRIBUTE_DISABLED, ""); } else { element.removeAttribute(ATTRIBUTE_DISABLED); } } }) ); self2.attachObserver( new Observer(function() { if (!hasObjectLink(self2, customElementUpdaterLinkSymbol)) { return; } const updaters = getLinkedObjects(self2, customElementUpdaterLinkSymbol); for (const list of updaters) { for (const updater of list) { const d = clone(self2[internalSymbol].getRealSubject()["options"]); Object.assign(updater.getSubject(), d); } } }) ); self2[attributeObserverSymbol][ATTRIBUTE_DISABLED] = () => { if (self2.hasAttribute(ATTRIBUTE_DISABLED)) { self2.setOption(ATTRIBUTE_DISABLED, true); } else { self2.setOption(ATTRIBUTE_DISABLED, void 0); } }; self2[attributeObserverSymbol][ATTRIBUTE_OPTIONS] = () => { const options2 = getOptionsFromAttributes.call(self2); if (isObject(options2) && Object.keys(options2).length > 0) { self2.setOptions(options2); } }; self2[attributeObserverSymbol][ATTRIBUTE_OPTIONS_SELECTOR] = () => { const options2 = getOptionsFromScriptTag.call(self2); if (isObject(options2) && Object.keys(options2).length > 0) { self2.setOptions(options2); } }; } function getOptionsFromScriptTag() { if (!this.hasAttribute(ATTRIBUTE_OPTIONS_SELECTOR)) { return {}; } const node = document.querySelector( this.getAttribute(ATTRIBUTE_OPTIONS_SELECTOR) ); if (!(node instanceof HTMLScriptElement)) { addErrorAttribute( this, `the selector ${ATTRIBUTE_OPTIONS_SELECTOR} for options was specified (${this.getAttribute( ATTRIBUTE_OPTIONS_SELECTOR )}) but not found.` ); return {}; } let obj = {}; try { obj = parseOptionsJSON.call(this, node.textContent.trim()); } catch (e) { addErrorAttribute( this, `when analyzing the configuration from the script tag there was an error. ${e}` ); } return obj; } function getOptionsFromAttributes() { if (this.hasAttribute(ATTRIBUTE_OPTIONS)) { try { return parseOptionsJSON.call(this, this.getAttribute(ATTRIBUTE_OPTIONS)); } catch (e) { addErrorAttribute( this, `the options attribute ${ATTRIBUTE_OPTIONS} does not contain a valid json definition (actual: ${this.getAttribute( ATTRIBUTE_OPTIONS )}).${e}` ); } } return {}; } function parseOptionsJSON(data) { let obj = {}; if (!isString(data)) { return obj; } try { const dataUrl = parseDataURL(data); data = dataUrl.content; } catch (e) { } try { obj = JSON.parse(data); } catch (e) { throw e; } return validateObject(obj); } function initHtmlContent() { try { const template = findDocumentTemplate(this.constructor.getTag()); this.appendChild(template.createDocumentFragment()); } catch (e) { let html = this.getOption("templates.main", ""); if (isString(html) && html.length > 0) { const mapping = this.getOption("templateMapping", {}); if (isObject(mapping)) { html = new Formatter(mapping, {}).format(html); } this.innerHTML = html; } } return this; } function initCSSStylesheet() { if (!(this.shadowRoot instanceof ShadowRoot)) { return this; } const styleSheet = this.constructor.getCSSStyleSheet(); if (styleSheet instanceof CSSStyleSheet) { if (styleSheet.cssRules.length > 0) { this.shadowRoot.adoptedStyleSheets = [styleSheet]; } } else if (isArray(styleSheet)) { const assign = []; for (const s of styleSheet) { if (isString(s)) { const trimedStyleSheet = s.trim(); if (trimedStyleSheet !== "") { const style = document.createElement("style"); style.innerHTML = trimedStyleSheet; this.shadowRoot.prepend(style); } continue; } validateInstance(s, CSSStyleSheet); if (s.cssRules.length > 0) { assign.push(s); } } if (assign.length > 0) { this.shadowRoot.adoptedStyleSheets = assign; } } else if (isString(styleSheet)) { const trimedStyleSheet = styleSheet.trim(); if (trimedStyleSheet !== "") { const style = document.createElement("style"); style.innerHTML = styleSheet; this.shadowRoot.prepend(style); } } return this; } function initShadowRoot() { let template; let html; try { template = findDocumentTemplate(this.constructor.getTag()); } catch (e) { html = this.getOption("templates.main", ""); if (!isString(html) || html === void 0 || html === "") { throw new Error("html is not set."); } } this.attachShadow({ mode: this.getOption("shadowMode", "open"), delegatesFocus: this.getOption("delegatesFocus", true) }); if (template instanceof Template) { this.shadowRoot.appendChild(template.createDocumentFragment()); return this; } const mapping = this.getOption("templateMapping", {}); if (isObject(mapping)) { const formatter = new Formatter(mapping); if (this.getOption("templateFormatter.marker.open") !== null) { formatter.setMarker( this.getOption("templateFormatter.marker.open"), this.getOption("templateFormatter.marker.close") ); } html = formatter.format(html); } this.shadowRoot.innerHTML = html; return this; } function registerCustomElement(element) { validateFunction(element); const customElements2 = getGlobalObject("customElements"); if (customElements2 === void 0) { throw new Error("customElements is not supported."); } const tag = element?.getTag(); if (!isString(tag) || tag === "") { throw new Error("tag is not set."); } if (customElements2.get(tag) !== void 0) { return; } customElements2.define(tag, element); } var initMethodSymbol, assembleMethodSymbol, updaterTransformerMethodsSymbol, attributeObserverSymbol, attributeMutationObserverSymbol, updateCloneDataSymbol, scriptHostElementSymbol, CustomElement; var init_customelement = __esm({ "source/dom/customelement.mjs"() { init_util(); init_constants(); init_extend(); init_pathfinder(); init_formatter(); init_dataurl(); init_global(); init_is(); init_observer(); init_proxyobserver(); init_validate(); init_clone(); init_attributes(); init_constants2(); init_template(); init_updater(); init_constants(); init_translations(); init_slotted(); init_init_options_from_attributes(); init_set_option_from_attribute(); init_error(); initMethodSymbol = Symbol.for("@schukai/monster/dom/@@initMethodSymbol"); assembleMethodSymbol = Symbol.for( "@schukai/monster/dom/@@assembleMethodSymbol" ); updaterTransformerMethodsSymbol = Symbol.for( "@schukai/monster/dom/@@updaterTransformerMethodsSymbol" ); attributeObserverSymbol = Symbol.for( "@schukai/monster/dom/@@attributeObserver" ); attributeMutationObserverSymbol = Symbol( "@schukai/monster/dom/@@mutationObserver" ); updateCloneDataSymbol = Symbol("@schukai/monster/dom/@@updateCloneData"); scriptHostElementSymbol = Symbol("scriptHostElement"); CustomElement = class extends HTMLElement { /** * A new object is created. First, the `initOptions` method is called. Here the * options can be defined in derived classes. Subsequently, the shadowRoot is initialized. * * IMPORTANT: CustomControls instances are not created via the constructor, but either via a tag in the HTML or via <code>document.createElement()</code>. * * @throws {Error} the option attribute does not contain a valid JSON definition. */ constructor() { super(); this[attributeObserverSymbol] = {}; this[internalSymbol] = new ProxyObserver({ options: initOptionsFromAttributes(this, extend({}, this.defaults)) }); this[initMethodSymbol](); initOptionObserver.call(this); this[scriptHostElementSymbol] = []; } /** * This method is called by the `instanceof` operator. * * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/custom-element@@instance"); } /** * This method determines which attributes are to be * monitored by `attributeChangedCallback()`. Unfortunately, this method is static. * Therefore, the `observedAttributes` property cannot be changed during runtime. * * @return {string[]} * @since 1.15.0 */ static get observedAttributes() { return []; } /** * * @param attribute * @param callback * @return {CustomElement} */ addAttributeObserver(attribute, callback) { validateFunction(callback); this[attributeObserverSymbol][attribute] = callback; return this; } /** * * @param attribute * @return {CustomElement} */ removeAttributeObserver(attribute) { delete this[attributeObserverSymbol][attribute]; return this; } /** * The `defaults` property defines the default values for a control. If you want to override these, * you can use various methods, which are described in the documentation available at * {@link https://monsterjs.orgendocconfigurate-a-monster-control}. * * The individual configuration values are listed below: * * More information about the shadowRoot can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow), * in the [HTML Standard](https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements) or in the [WHATWG Wiki](https://wiki.whatwg.org/wiki/Custom_Elements). * * More information about the template element can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template). * * More information about the slot element can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot). * * @property {boolean} disabled=false Specifies whether the control is disabled. When present, it makes the element non-mutable, non-focusable, and non-submittable with the form. * @property {string} shadowMode=open Specifies the mode of the shadow root. When set to `open`, elements in the shadow root are accessible from JavaScript outside the root, while setting it to `closed` denies access to the root's nodes from JavaScript outside it. * @property {Boolean} delegatesFocus=true Specifies the behavior of the control with respect to focusability. When set to `true`, it mitigates custom element issues around focusability. When a non-focusable part of the shadow DOM is clicked, the first focusable part is given focus, and the shadow host is given any available :focus styling. * @property {Object} templates Specifies the templates used by the control. * @property {string} templates.main=undefined Specifies the main template used by the control. * @property {Object} templateMapping Specifies the mapping of templates. * @property {Object} templateFormatter Specifies the formatter for the templates. * @property {Object} templateFormatter.marker Specifies the marker for the templates. * @property {Function} templateFormatter.marker.open=null Specifies the opening marker for the templates. * @property {Function} templateFormatter.marker.close=null Specifies the closing marker for the templates. * @property {Boolean} eventProcessing=false Specifies whether the control processes events. * @since 1.8.0 */ get defaults() { return { disabled: false, shadowMode: "open", delegatesFocus: true, templates: { main: void 0 }, templateMapping: {}, templateFormatter: { marker: { open: null, close: null } }, eventProcessing: false }; } /** * This method updates the labels of the element. * The labels are defined in the option object. * The key of the label is used to retrieve the translation from the document. * If the translation is different from the label, the label is updated. * * Before you can use this method, you must have loaded the translations. * * @return {CustomElement} * @throws {Error} Cannot find an element with translations. Add a translation object to the document. */ updateI18n() { let translations2; try { translations2 = getDocumentTranslations(); } catch (e) { addErrorAttribute(this, e); return this; } if (!translations2) { return this; } const labels = this.getOption("labels"); if (!(isObject(labels) || isIterable(labels))) { return this; } for (const key in labels) { const def = labels[key]; if (isString(def)) { const text = translations2.getText(key, def); if (text !== def) { this.setOption(`labels.${key}`, text); } continue; } else if (isObject(def)) { for (const k in def) { const d = def[k]; const text = translations2.getPluralRuleText(key, k, d); if (!isString(text)) { throw new Error("Invalid labels definition"); } if (text !== d) { this.setOption(`labels.${key}.${k}`, text); } } continue; } throw new Error("Invalid labels definition"); } return this; } /** * The `getTag()` method returns the tag name associated with the custom element. This method should be overwritten * by the derived class. * * Note that there is no check on the name of the tag in this class. It is the responsibility of * the developer to assign an appropriate tag name. If the name is not valid, the * `registerCustomElement()` method will issue an error. * * @see https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name * @throws {Error} This method must be overridden by the derived class. * @return {string} The tag name associated with the custom element. * @since 1.7.0 */ static getTag() { throw new Error( "The method `getTag()` must be overridden by the derived class." ); } /** * The `getCSSStyleSheet()` method returns a `CSSStyleSheet` object that defines the styles for the custom element. * If the environment does not support the `CSSStyleSheet` constructor, then an object can be built using the provided detour. * * If `undefined` is returned, then the shadow root does not receive a stylesheet. * * Example usage: * * ```js * class MyElement extends CustomElement { * static getCSSStyleSheet() { * const sheet = new CSSStyleSheet(); * sheet.replaceSync("p { color: red; }"); * return sheet; * } * } * ``` * * If the environment does not support the `CSSStyleSheet` constructor, * you can use the following workaround to create the stylesheet: * * ```js * const doc = document.implementation.createHTMLDocument('title'); * let style = doc.createElement("style"); * style.innerHTML = "p { color: red; }"; * style.appendChild(document.createTextNode("")); * doc.head.appendChild(style); * return doc.styleSheets[0]; * ``` * * @return {CSSStyleSheet|CSSStyleSheet[]|string|undefined} A `CSSStyleSheet` object or an array of such objects that define the styles for the custom element, or `undefined` if no stylesheet should be applied. */ static getCSSStyleSheet() { return void 0; } /** * attach a new observer * * @param {Observer} observer * @return {CustomElement} */ attachObserver(observer) { this[internalSymbol].attachObserver(observer); return this; } /** * detach a observer * * @param {Observer} observer * @return {CustomElement} */ detachObserver(observer) { this[internalSymbol].detachObserver(observer); return this; } /** * @param {Observer} observer * @return {ProxyObserver} */ containsObserver(observer) { return this[internalSymbol].containsObserver(observer); } /** * nested options can be specified by path `a.b.c` * * @param {string} path * @param {*} defaultValue * @return {*} * @since 1.10.0 */ getOption(path, defaultValue = void 0) { let value; try { value = new Pathfinder( this[internalSymbol].getRealSubject()["options"] ).getVia(path); } catch (e) { } if (value === void 0) return defaultValue; return value; } /** * Set option and inform elements * * @param {string} path * @param {*} value * @return {CustomElement} * @since 1.14.0 */ setOption(path, value) { new Pathfinder(this[internalSymbol].getSubject()["options"]).setVia( path, value ); return this; } /** * @since 1.15.0 * @param {string|object} options * @return {CustomElement} */ setOptions(options2) { if (isString(options2)) { options2 = parseOptionsJSON.call(this, options2); } extend(this[internalSymbol].getSubject()["options"], options2); return this; } /** * Is called once via the constructor * * @return {CustomElement} * @since 1.8.0 */ [initMethodSymbol]() { return this; } /** * This method is called once when the object is equipped with update for the dynamic change of the dom. * The functions returned here can be used as pipe functions in the template. * * In the example, the function `my-transformer` is defined. In the template, you can use it as follows: * * ```html * <my-element * data-monster-option-transformer="path:my-value | call:my-transformer"> * </my-element> * ``` * * The function `my-transformer` is called with the value of `my-value` as a parameter. * * ```js * class MyElement extends CustomElement { * [updaterTransformerMethodsSymbol]() { * return { * "my-transformer": (value) => { * switch (typeof Wert) { * case "string": * return value + "!"; * case "Zahl": * return value + 1; * default: * return value; * } * } * }; * }; * } * ``` * * @return {object} * @since 2.43.0 */ [updaterTransformerMethodsSymbol]() { return {}; } /** * This method is called once when the object is included in the DOM for the first time. It performs the following actions: * * <ol> * <li>Extracts the options from the attributes and the script tag of the element and sets them.</li> * <li>Initializes the shadow root and its CSS stylesheet (if specified).</li> * <li>Initializes the HTML content of the element.</li> * <li>Initializes the custom elements inside the shadow root and the slotted elements.</li> * <li>Attaches a mutation observer to observe changes to the attributes of the element.</li> * * @return {CustomElement} - The updated custom element. * @since 1.8.0 */ [assembleMethodSymbol]() { let elements; let nodeList; const AttributeOptions = getOptionsFromAttributes.call(this); if (isObject(AttributeOptions) && Object.keys(AttributeOptions).length > 0) { this.setOptions(AttributeOptions); } const ScriptOptions = getOptionsFromScriptTag.call(this); if (isObject(ScriptOptions) && Object.keys(ScriptOptions).length > 0) { this.setOptions(ScriptOptions); } if (this.getOption("shadowMode", false) !== false) { try { initShadowRoot.call(this); elements = this.shadowRoot.childNodes; } catch (e) { addErrorAttribute(this, e); } try { initCSSStylesheet.call(this); } catch (e) { addErrorAttribute(this, e); } } if (!(elements instanceof NodeList)) { initHtmlContent.call(this); elements = this.childNodes; } initFromCallbackHost.call(this); try { nodeList = /* @__PURE__ */ new Set([...elements, ...getSlottedElements.call(this)]); } catch (e) { nodeList = elements; } try { this[updateCloneDataSymbol] = clone( this[internalSymbol].getRealSubject()["options"] ); } catch (e) { addErrorAttribute(this, e); } const cfg = {}; if (this.getOption("eventProcessing") === true) { cfg.eventProcessing = true; } addObjectWithUpdaterToElement.call( this, nodeList, customElementUpdaterLinkSymbol, this[updateCloneDataSymbol], cfg ); attachAttributeChangeMutationObserver.call(this); return this; } /** * You know what you are doing? This function is only for advanced users. * The result is a clone of the internal data. * * @return {*} */ getInternalUpdateCloneData() { return clone(this[updateCloneDataSymbol]); } /** * This method is called every time the element is inserted into the DOM. It checks if the custom element * has already been initialized and if not, calls the assembleMethod to initialize it. * * @return {void} * @since 1.7.0 * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/connectedCallback */ connectedCallback() { if (!hasObjectLink(this, customElementUpdaterLinkSymbol)) { this[assembleMethodSymbol](); } } /** * Called every time the element is removed from the DOM. Useful for running clean up code. * * @return {void} * @since 1.7.0 */ disconnectedCallback() { } /** * The custom element has been moved into a new document (e.g. someone called document.adoptNode(el)). * * @return {void} * @since 1.7.0 */ adoptedCallback() { } /** * Called when an observed attribute has been added, removed, updated, or replaced. Also called for initial * values when an element is created by the parser, or upgraded. Note: only attributes listed in the observedAttributes * property will receive this callback. * * @param {string} attrName * @param {string} oldVal * @param {string} newVal * @return {void} * @since 1.15.0 */ attributeChangedCallback(attrName, oldVal, newVal) { if (attrName.startsWith("data-monster-option-")) { setOptionFromAttribute( this, attrName, this[internalSymbol].getSubject()["options"] ); } const callback = this[attributeObserverSymbol]?.[attrName]; if (isFunction(callback)) { try { callback.call(this, newVal, oldVal); } catch (e) { addErrorAttribute(this, e); } } } /** * * @param {Node} node * @return {boolean} * @throws {TypeError} value is not an instance of * @since 1.19.0 */ hasNode(node) { if (containChildNode.call(this, validateInstance(node, Node))) { return true; } if (!(this.shadowRoot instanceof ShadowRoot)) { return false; } return containChildNode.call(this.shadowRoot, node); } /** * Calls a callback function if it exists. * * @param {string} name * @param {*} args * @return {*} */ callCallback(name, args) { return callControlCallback.call(this, name, ...args); } }; } }); // source/math/random.mjs var random_exports = {}; __export(random_exports, { random: () => random }); function random(min3, max3) { if (min3 === void 0) { min3 = 0; } if (max3 === void 0) { max3 = MAX; } if (max3 < min3) { throw new Error("max must be greater than min"); } return Math.round(create(min3, max3)); } function create(min3, max3) { const globalReference2 = getGlobal(); const crypt = globalReference2?.["crypto"] || globalReference2?.["msCrypto"] || globalReference2?.["crypto"] || void 0; if (typeof crypt === "undefined") { throw new Error("missing crypt"); } let rval = 0; const range = max3 - min3; if (range < 2) { throw new Error("the distance is too small to create a random number."); } const bitsNeeded = Math.ceil(Math.log2(range)); if (bitsNeeded > 53) { throw new Error("we cannot generate numbers larger than 53 bits."); } const bytesNeeded = Math.ceil(bitsNeeded / 8); const mask = Math.pow(2, bitsNeeded) - 1; const byteArray = new Uint8Array(bytesNeeded); crypt.getRandomValues(byteArray); let p = (bytesNeeded - 1) * 8; for (let i = 0; i < bytesNeeded; i++) { rval += byteArray[i] * Math.pow(2, p); p -= 8; } rval = rval & mask; if (rval >= range) { return create(min3, max3); } if (rval < min3) { rval += min3; } return rval; } var MAX; var init_random = __esm({ "source/math/random.mjs"() { init_global(); MAX = 1e9; Math.log2 = Math.log2 || function(n) { return Math.log(n) / Math.log(2); }; } }); // source/util/deadmansswitch.mjs function initCallback() { this[internalSymbol]["timer"] = setTimeout(() => { this[internalSymbol]["isAlreadyRun"] = true; this[internalSymbol]["callback"](); }, this[internalSymbol]["delay"]); } function init(delay, callback) { this[internalSymbol] = { callback, delay, isAlreadyRun: false, timer: void 0 }; initCallback.call(this); } var DeadMansSwitch; var init_deadmansswitch = __esm({ "source/util/deadmansswitch.mjs"() { init_constants(); init_base(); init_is(); init_validate(); DeadMansSwitch = class extends Base { /** * Create new dead man's switch * * @param {Integer} delay * @param {function} callback * @throw {TypeError} the arguments must be either integer or functions * @throws {TypeError} value is not an integer */ constructor(delay, callback) { super(); init.call(this, validateInteger(delay), validateFunction(callback)); } /** * @param delay * @returns {DeadMansSwitch} * @throws {Error} has already run * @throws {Error} unsupported argument */ touch(delay) { if (this[internalSymbol]["isAlreadyRun"] === true) { throw new Error("has already run"); } if (isInteger(delay)) { this[internalSymbol]["delay"] = delay; } else if (delay !== void 0) { throw new Error("unsupported argument"); } clearTimeout(this[internalSymbol]["timer"]); initCallback.call(this); return this; } /** * @throws {Error} has already run * @returns {DeadMansSwitch} */ defuse() { if (this[internalSymbol]["isAlreadyRun"] === true) { throw new Error("has already run"); } clearTimeout(this[internalSymbol]["timer"]); return this; } }; } }); // source/util/processing/callback.mjs var Callback; var init_callback = __esm({ "source/util/processing/callback.mjs"() { init_constants(); init_global(); init_validate(); Callback = class { /** * * @param {function} callback * @param {int|undefined} time * @throws {TypeError} value is not a function * @throws {TypeError} value is not an integer * @private */ constructor(callback, time) { this[internalSymbol] = { callback: validateFunction(callback), time: validateInteger(time ?? 0) }; } /** * @private * @param {*} data * @return {Promise} */ run(data) { return new Promise((resolve, reject) => { getGlobalFunction("setTimeout")(() => { try { resolve(this[internalSymbol].callback(data)); } catch (e) { reject(e); } }, this[internalSymbol].time); }); } }; } }); // source/util/processing.mjs var Processing; var init_processing = __esm({ "source/util/processing.mjs"() { init_constants(); init_base(); init_is(); init_queue(); init_callback(); Processing = class extends Base { /** * Create new Processing * * Functions and timeouts can be passed. If a timeout is passed, it applies to all further functions. * In the example * * `timeout1, function1, function2, function3, timeout2, function4` * * the timeout1 is valid for the functions 1, 2 and 3 and the timeout2 for the function4. * * So the execution time is timeout1+timeout1+timeout1+timeout2 * * @throw {TypeError} the arguments must be either integer or functions * @param {...(int|function)} args */ constructor(...args) { super(); this[internalSymbol] = { queue: new Queue() }; let time = 0; if (typeof args !== "object" || args[0] === null) { throw new TypeError("the arguments must be either integer or functions"); } for (const [, arg] of Object.entries(args)) { if (isInteger(arg) && arg >= 0) { time = arg; } else if (isFunction(arg)) { this[internalSymbol].queue.add(new Callback(arg, time)); } else { throw new TypeError( "the arguments must be either integer or functions" ); } } } /** * Adds a function with the desired timeout * If no timeout is specified, the timeout of the previous function is used. * * @param {function} callback * @param {int|undefined} time * @throws {TypeError} value is not a function * @throws {TypeError} value is not an integer */ add(callback, time) { this[internalSymbol].queue.add(new Callback(callback, time)); return this; } /** * Executes the defined functions in order. * * @param {*} data * @return {Promise} */ run(data) { if (this[internalSymbol].queue.isEmpty()) { return Promise.resolve(data); } const callback = this[internalSymbol].queue.poll(); if (callback === null || callback === void 0) { return Promise.resolve(data); } return callback.run(data).then((result) => { return this.run(result); }); } }; } }); // source/components/form/constants.mjs var STYLE_DISPLAY_MODE_BLOCK, ATTRIBUTE_FORM_URL, ATTRIBUTE_FORM_RELOAD, ATTRIBUTE_VISIBILITY, ATTRIBUTE_BUTTON_CLASS, ATTRIBUTE_INTEND, ATTRIBUTE_HAS_CHILDREN, ATTRIBUTE_FORM_DATASOURCE, ATTRIBUTE_FORM_DATASOURCE_ARGUMENTS, ATTRIBUTE_BUTTON_LABEL; var init_constants3 = __esm({ "source/components/form/constants.mjs"() { init_constants2(); STYLE_DISPLAY_MODE_BLOCK = "block"; ATTRIBUTE_FORM_URL = `${ATTRIBUTE_PREFIX}url`; ATTRIBUTE_FORM_RELOAD = `${ATTRIBUTE_PREFIX}reload`; ATTRIBUTE_VISIBILITY = `${ATTRIBUTE_PREFIX}visibility`; ATTRIBUTE_BUTTON_CLASS = `${ATTRIBUTE_PREFIX}button-class`; ATTRIBUTE_INTEND = `${ATTRIBUTE_PREFIX}intend`; ATTRIBUTE_HAS_CHILDREN = `${ATTRIBUTE_PREFIX}has-children`; ATTRIBUTE_FORM_DATASOURCE = `${ATTRIBUTE_PREFIX}datasource`; ATTRIBUTE_FORM_DATASOURCE_ARGUMENTS = `${ATTRIBUTE_PREFIX}datasource-arguments`; ATTRIBUTE_BUTTON_LABEL = `${ATTRIBUTE_PREFIX}button-label`; } }); // source/components/layout/stylesheet/tabs.mjs var TabsStyleSheet; var init_tabs = __esm({ "source/components/layout/stylesheet/tabs.mjs"() { init_attributes(); init_constants2(); TabsStyleSheet = new CSSStyleSheet(); try { TabsStyleSheet.insertRule( ` @layer tabs { :after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}.monster-theme-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-theme-primary-disabled-1{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1)}.monster-theme-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-theme-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-theme-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-theme-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-theme-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-theme-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-theme-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-border-color-1{border-color:var(--monster-color-border-1)}.monster-color-neutral-1{color:var(--monster-color-primary-1)}.monster-bg-color-primary-1{background-color:var(--monster-bg-color-primary-1)}.monster-bg-color-secondary-1{background-color:var(--monster-bg-color-secondary-1)}.monster-bg-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1)}.monster-color-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-color-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-color-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-color-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-color-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-color-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-color-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-theme-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-theme-primary-disabled-2{background-color:var(--monster-bg-color-primary-disabled-2);color:var(--monster-color-primary-disabled-2)}.monster-theme-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-theme-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-theme-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-theme-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-theme-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-theme-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-theme-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-border-color-2{border-color:var(--monster-color-border-2)}.monster-color-neutral-2{color:var(--monster-color-primary-2)}.monster-bg-color-primary-2{background-color:var(--monster-bg-color-primary-2)}.monster-bg-color-secondary-2{background-color:var(--monster-bg-color-secondary-2)}.monster-bg-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2)}.monster-color-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-color-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-color-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-color-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-color-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-color-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-color-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-theme-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-theme-primary-disabled-3{background-color:var(--monster-bg-color-primary-disabled-3);color:var(--monster-color-primary-disabled-3)}.monster-theme-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-theme-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-theme-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-theme-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-theme-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-theme-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-theme-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-border-color-3{border-color:var(--monster-color-border-3)}.monster-color-neutral-3{color:var(--monster-color-primary-3)}.monster-bg-color-primary-3{background-color:var(--monster-bg-color-primary-3)}.monster-bg-color-secondary-3{background-color:var(--monster-bg-color-secondary-3)}.monster-bg-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3)}.monster-color-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-color-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-color-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-color-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-color-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-color-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-color-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-theme-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-theme-primary-disabled-4{background-color:var(--monster-bg-color-primary-disabled-4);color:var(--monster-color-primary-disabled-4)}.monster-theme-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-theme-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-theme-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-theme-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-theme-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-theme-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-theme-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-border-color-4{border-color:var(--monster-color-border-4)}.monster-color-neutral-4{color:var(--monster-color-primary-4)}.monster-bg-color-primary-4{background-color:var(--monster-bg-color-primary-4)}.monster-bg-color-secondary-4{background-color:var(--monster-bg-color-secondary-4)}.monster-bg-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4)}.monster-color-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-color-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-color-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-color-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-color-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-color-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-color-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-theme-control-container-1,.monster-theme-control-row-1{border:1px solid var(--monster-theme-control-border-color)}.monster-theme-control-container-1,.monster-theme-control-element,.monster-theme-control-row-1{background-color:var(--monster-theme-control-bg-color);color:var(--monster-theme-control-color)}.monster-theme-control-background{background-color:var(--monster-theme-control-bg-color)}.monster-theme-background-inherit{background-color:inherit!important}.monster-theme-on{background-color:var(--monster-theme-on-bg-color);color:var(--monster-theme-on-color)}.monster-theme-off{background-color:var(--monster-theme-off-bg-color);color:var(--monster-theme-off-color)}div[data-monster-role=popper]{background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;padding:1.1em;z-index:var(--monster-z-index-modal)}[data-popper-arrow],[data-popper-arrow]:before{background:inherit;height:calc(max(var(--monster-popper-witharrrow-distance), -1*var(--monster-popper-witharrrow-distance))*2);position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1*var(--monster-popper-witharrrow-distance))*2)}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:before{box-sizing:border-box;content:"";transform:rotate(45deg);visibility:visible}div[data-popper-placement^=top]>[data-popper-arrow]{bottom:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width)/2)}div[data-popper-placement^=top]>[data-popper-arrow]:before{border-bottom:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-left:transparent;border-right:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-top:transparent}div[data-popper-placement^=bottom]>[data-popper-arrow]{top:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width))}div[data-popper-placement^=bottom]>[data-popper-arrow]:before{border-bottom:transparent;border-left:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-right:transparent;border-top:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4)}div[data-popper-placement^=left]>[data-popper-arrow]{right:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width))}div[data-popper-placement^=left]>[data-popper-arrow]:before{border-bottom:transparent;border-left:transparent;border-right:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-top:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4)}div[data-popper-placement^=right]>[data-popper-arrow]{left:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width)/2)}div[data-popper-placement^=right]>[data-popper-arrow]:before{border-bottom:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-left:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-right:transparent;border-top:transparent}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}.monster-badge-primary{padding:.25em .4em}.monster-badge-primary,.monster-badge-primary-pill{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-primary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-secondary{padding:.25em .4em}.monster-badge-secondary,.monster-badge-secondary-pill{background-color:var(--monster-bg-color-secondary-3);border-radius:.25rem;color:var(--monster-color-secondary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-secondary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-tertiary{padding:.25em .4em}.monster-badge-tertiary,.monster-badge-tertiary-pill{background-color:var(--monster-bg-color-tertiary-3);border-radius:.25rem;color:var(--monster-color-tertiary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-tertiary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-destructive{padding:.25em .4em}.monster-badge-destructive,.monster-badge-destructive-pill{background-color:var(--monster-bg-color-destructive-1);border-radius:.25rem;color:var(--monster-color-destructive-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-destructive-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-success{padding:.25em .4em}.monster-badge-success,.monster-badge-success-pill{background-color:var(--monster-bg-color-success-1);border-radius:.25rem;color:var(--monster-color-success-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-success-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-warning{padding:.25em .4em}.monster-badge-warning,.monster-badge-warning-pill{background-color:var(--monster-bg-color-warning-1);border-radius:.25rem;color:var(--monster-color-warning-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-warning-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-error{padding:.25em .4em}.monster-badge-error,.monster-badge-error-pill{background-color:var(--monster-bg-color-error-1);border-radius:.25rem;color:var(--monster-color-error-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-error-pill{border-radius:10rem;padding:.25em .6em}[data-monster-role=nav] button.hidden{display:none}nav[data-monster-role=nav]{align-items:flex-end;border-bottom-style:var(--monster-border-style);border-bottom-width:thin;border-color:var(--monster-bg-color-primary-2);border-radius:var(--monster-border-radius);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;margin-bottom:.75rem;overflow:hidden}[data-monster-role=nav] button .remove-tab{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");background-position:100% 100%;background-repeat:no-repeat;background-size:16px;flex-wrap:nowrap;height:16px;min-height:16px;order:2;width:16px}[data-monster-role=nav] button span{display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4;white-space:pre}[data-monster-role=nav] button{align-content:center;align-items:center;align-self:stretch;border:none;border-bottom:var(--monster-border-style);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-size:1rem;font-weight:400;justify-content:center;line-height:1.5;margin-right:.75rem;outline:none;padding:.375rem 0;text-align:center;text-decoration:none;transition:color .8s;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}[data-monster-role=nav] button:not([disabled]):hover{border-bottom-style:var(--monster-border-style);border-color:var(--monster-bg-color-secondary-3);border-radius:var(--monster-border-radius);box-shadow:var(--monster-box-shadow-1);color:var(--monster-bg-color-secondary-3)}[data-monster-role=nav] button[data-monster-state=active],[data-monster-role=nav] button[data-monster-state=active]:not([disabled]):hover{background-color:inherit;border-bottom-style:var(--monster-border-style);border-color:var(--monster-bg-color-secondary-3);border-radius:var(--monster-border-radius);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-secondary-1)!important}@media (prefers-color-scheme:dark){[data-monster-role=nav] button[data-monster-state=active],[data-monster-role=nav] button[data-monster-state=active]:not([disabled]):hover{border-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)!important}}[data-monster-role=nav] button[disabled]{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1);cursor:not-allowed}[data-monster-role=nav] button[data-monster-role=switch]{align-self:center;border:0;order:2;touch-action:none}[data-monster-role=nav] button[data-monster-role=switch]:not([disabled]):hover{border-bottom-width:0}[data-monster-role=nav] button img{height:1.3rem;margin-left:.4rem;width:1.3rem}::slotted(:not([slot]):not(.active)){display:none}::slotted(*){align-self:center}::slotted([slot]){border-bottom-style:var(--monster-border-style);border-bottom-width:var(--monster-border-width);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);box-shadow:var(--monster-box-shadow-1)}::slotted([slot=start]){margin-right:.75rem;order:0}::slotted([slot=end]){margin-left:.75rem;order:3}[data-monster-role=nav] [data-monster-role=popper-nav] button:not([disabled]){border:0;justify-content:left;padding-left:15px;padding-right:15px;width:100%}[data-monster-role=nav] [data-monster-role=popper-nav] button:hover,[data-monster-role=nav] [data-monster-role=popper-nav] button[data-monster-state=active],[data-monster-role=nav] [data-monster-role=popper-nav] button[data-monster-state=active]:not([disabled]):hover{border:0}@media (prefers-color-scheme:dark){[data-monster-role=nav] [data-monster-role=popper-nav] button[data-monster-state=active],[data-monster-role=nav] [data-monster-role=popper-nav] button[data-monster-state=active]:not([disabled]):hover{color:var(--monster-color-secondary-4)!important}} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/util/fetch.mjs function findShadowRoot(element) { if (element instanceof ShadowRoot) return element; if (!element.parentNode) return null; return findShadowRoot(element.parentNode); } function loadAndAssignContent(element, url, options2, filter) { return loadContent(url, options2).then((response) => { let content = response.content; if (isString(filter) && filter !== "") { const t2 = document.createElement("div"); const c = document.createElement("div"); c.innerHTML = content; for (const [, node] of c.querySelectorAll(filter).entries()) { t2.appendChild(node); } content = t2.innerHTML; } const t = document.createElement("div"); t.innerHTML = content; const scripts = t.querySelectorAll("script"); for (const [, script] of scripts.entries()) { const s = document.createElement("script"); s.innerHTML = script.innerHTML; if (script.src) s.src = script.src; if (script.type) s.type = script.type; if (script.async) s.async = script.async; if (script.defer) s.defer = script.defer; if (script.crossOrigin) s.crossOrigin = script.crossOrigin; if (script.integrity) s.integrity = script.integrity; if (script.referrerPolicy) s.referrerPolicy = script.referrerPolicy; document.head.appendChild(s); t.removeChild(script); } validateInstance(element, HTMLElement).innerHTML = t.innerHTML; const root = findShadowRoot(element); if (root !== null) { element = root.host; } fireCustomEvent(element, "monster-fetched", { url }); return response; }); } function loadContent(url, options2) { if (url instanceof URL) { url = url.toString(); } return fetch(validateString(url), options2).then((response) => { if (response?.ok !== true) { if (["error", "opaque", "opaqueredirect"].indexOf(response?.type) !== -1) { throw new Error( `we won't be able to read the data (${response?.type})` ); } const statusClass = `${response?.status}`.substring(0, 1); switch (statusClass) { case "4": throw new Error(`client error ${response?.statusText}`); break; default: throw new Error( `undefined status (${response?.status} / ${response?.statusText}) or type (${response?.type})` ); } } return new Promise(function(resolve, reject) { response.text().then((content) => { resolve({ content, type: response.headers.get("Content-Type") }); }).catch(reject); }); }); } var init_fetch = __esm({ "source/components/form/util/fetch.mjs"() { init_is(); init_events(); init_validate(); } }); // source/components/stylesheet/theme.mjs var ThemeStyleSheet; var init_theme2 = __esm({ "source/components/stylesheet/theme.mjs"() { init_attributes(); init_constants2(); ThemeStyleSheet = new CSSStyleSheet(); try { ThemeStyleSheet.insertRule( ` @layer theme { .monster-theme-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-theme-primary-disabled-1{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1)}.monster-theme-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-theme-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-theme-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-theme-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-theme-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-theme-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-theme-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-border-color-1{border-color:var(--monster-color-border-1)}.monster-color-neutral-1{color:var(--monster-color-primary-1)}.monster-bg-color-primary-1{background-color:var(--monster-bg-color-primary-1)}.monster-bg-color-secondary-1{background-color:var(--monster-bg-color-secondary-1)}.monster-bg-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1)}.monster-color-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-color-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-color-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-color-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-color-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-color-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-color-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-theme-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-theme-primary-disabled-2{background-color:var(--monster-bg-color-primary-disabled-2);color:var(--monster-color-primary-disabled-2)}.monster-theme-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-theme-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-theme-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-theme-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-theme-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-theme-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-theme-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-border-color-2{border-color:var(--monster-color-border-2)}.monster-color-neutral-2{color:var(--monster-color-primary-2)}.monster-bg-color-primary-2{background-color:var(--monster-bg-color-primary-2)}.monster-bg-color-secondary-2{background-color:var(--monster-bg-color-secondary-2)}.monster-bg-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2)}.monster-color-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-color-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-color-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-color-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-color-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-color-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-color-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-theme-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-theme-primary-disabled-3{background-color:var(--monster-bg-color-primary-disabled-3);color:var(--monster-color-primary-disabled-3)}.monster-theme-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-theme-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-theme-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-theme-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-theme-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-theme-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-theme-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-border-color-3{border-color:var(--monster-color-border-3)}.monster-color-neutral-3{color:var(--monster-color-primary-3)}.monster-bg-color-primary-3{background-color:var(--monster-bg-color-primary-3)}.monster-bg-color-secondary-3{background-color:var(--monster-bg-color-secondary-3)}.monster-bg-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3)}.monster-color-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-color-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-color-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-color-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-color-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-color-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-color-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-theme-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-theme-primary-disabled-4{background-color:var(--monster-bg-color-primary-disabled-4);color:var(--monster-color-primary-disabled-4)}.monster-theme-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-theme-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-theme-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-theme-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-theme-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-theme-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-theme-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-border-color-4{border-color:var(--monster-color-border-4)}.monster-color-neutral-4{color:var(--monster-color-primary-4)}.monster-bg-color-primary-4{background-color:var(--monster-bg-color-primary-4)}.monster-bg-color-secondary-4{background-color:var(--monster-bg-color-secondary-4)}.monster-bg-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4)}.monster-color-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-color-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-color-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-color-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-color-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-color-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-color-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-theme-control-container-1,.monster-theme-control-row-1{border:1px solid var(--monster-theme-control-border-color)}.monster-theme-control-container-1,.monster-theme-control-element,.monster-theme-control-row-1{background-color:var(--monster-theme-control-bg-color);color:var(--monster-theme-control-color)}.monster-theme-control-background{background-color:var(--monster-theme-control-bg-color)}.monster-theme-background-inherit{background-color:inherit!important}.monster-theme-on{background-color:var(--monster-theme-on-bg-color);color:var(--monster-theme-on-color)}.monster-theme-off{background-color:var(--monster-theme-off-bg-color);color:var(--monster-theme-off-color)} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/util/popper.mjs function setEventListenersModifiers(mode) { const options2 = extend({}, this.getOption("popper")); const modifiers = options2?.["modifiers"]; if (!isArray(modifiers)) { options2["modifiers"] = []; } if (options2["modifiers"].filter((entry) => { if (entry?.["name"] === "eventListeners") { entry["enabled"] = validateBoolean(mode); } }).length === 0) { options2["modifiers"].push({ name: "eventListeners", enabled: validateBoolean(mode) }); } this[popperInstanceSymbol].setOptions(options2); } var popperInstanceSymbol; var init_popper2 = __esm({ "source/components/form/util/popper.mjs"() { init_extend(); init_is(); init_validate(); popperInstanceSymbol = Symbol("popperInstance"); } }); // source/components/layout/tabs.mjs var tabs_exports = {}; __export(tabs_exports, { Tabs: () => Tabs }); function getTranslations() { const locale = getLocaleOfDocument(); switch (locale.language) { case "de": return { "new-tab-label": "Neuer Tab" }; case "fr": return { "new-tab-label": "Nouvel Onglet" }; case "sp": return { "new-tab-label": "Nueva Pesta\xF1a" }; case "it": return { "new-tab-label": "Nuova Scheda" }; case "pl": return { "new-tab-label": "Nowa Karta" }; case "no": return { "new-tab-label": "Ny Fane" }; case "dk": return { "new-tab-label": "Ny Fane" }; case "sw": return { "new-tab-label": "Ny Flik" }; default: case "en": return { "new-tab-label": "New Tab" }; } } function initPopperSwitch() { const nodes = getSlottedElements.call(this, `[${ATTRIBUTE_ROLE}="switch"]`); let switchButton; if (nodes.size === 0) { switchButton = document.createElement("button"); switchButton.setAttribute(ATTRIBUTE_ROLE, "switch"); switchButton.setAttribute("part", "switch"); switchButton.classList.add("hidden"); const classList = this.getOption("classes.button"); if (classList) { switchButton.classList.add(classList); } switchButton.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/></svg>'; this[navElementSymbol].prepend(switchButton); } else { switchButton = nodes.next(); } this[popperSwitchEventHandler] = (event) => { const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "switch"); if (element instanceof HTMLButtonElement) { togglePopper.call(this); } }; for (const type3 of ["click", "touch"]) { switchButton.addEventListener(type3, this[popperSwitchEventHandler]); } this[switchElementSymbol] = switchButton; } function hidePopper() { if (!this[popperInstanceSymbol]) { return; } this[popperElementSymbol].style.display = "none"; setEventListenersModifiers.call(this, false); } function showPopper() { if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) { return; } this[popperElementSymbol].style.visibility = "hidden"; this[popperElementSymbol].style.display = STYLE_DISPLAY_MODE_BLOCK; setEventListenersModifiers.call(this, true); this[popperInstanceSymbol].update(); new Processing(() => { this[popperElementSymbol].style.removeProperty("visibility"); }).run(void 0).then(() => { }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } function togglePopper() { if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) { hidePopper.call(this); } else { showPopper.call(this); } } function attachResizeObserver() { this[resizeObserverSymbol] = new ResizeObserver((entries) => { if (this[timerCallbackSymbol] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol].touch(); return; } catch (e) { delete this[timerCallbackSymbol]; } } this[timerCallbackSymbol] = new DeadMansSwitch(200, () => { this[dimensionsSymbol].setVia("data.calculated", false); checkAndRearrangeButtons.call(this); }); }); this[resizeObserverSymbol].observe(this[navElementSymbol]); } function attachTabChangeObserver() { new MutationObserver((mutations) => { let runUpdate = false; for (const mutation of mutations) { if (mutation.type === "childList") { if (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0) { runUpdate = true; break; } } } if (runUpdate === true) { this[dimensionsSymbol].setVia("data.calculated", false); initTabButtons.call(this); } }).observe(this, { childList: true }); } function initPopper() { const self2 = this; const options2 = extend({}, self2.getOption("popper")); self2[popperInstanceSymbol] = createPopper( self2[switchElementSymbol], self2[popperElementSymbol], options2 ); const observer1 = new MutationObserver(function(mutations) { let runUpdate = false; for (const mutation of mutations) { if (mutation.type === "childList") { if (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0) { runUpdate = true; break; } } } if (runUpdate === true) { self2[popperInstanceSymbol].update(); } }); observer1.observe(self2[popperNavElementSymbol], { childList: true, subtree: true }); return self2; } function show2(element) { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } const reference2 = element.getAttribute(`${ATTRIBUTE_PREFIX}tab-reference`); const nodes = getSlottedElements.call(this); for (const node of nodes) { const id = node.getAttribute("id"); if (id === reference2) { node.classList.add("active"); const openDelay = parseInt(this.getOption("features.openDelay"), 10); if (!isNaN(openDelay) && openDelay > 0) { node.style.visibility = "hidden"; setTimeout(() => { node.style.visibility = "visible"; }, openDelay); } const data = {}; const mask = [ "data-monster-attributes", "data-monster-insert-reference", "data-monster-state", "data-monster-button-label", "data-monster-objectlink", "data-monster-role" ]; for (const [, attr] of Object.entries(node.attributes)) { if (attr.name.startsWith("data-") && mask.indexOf(attr.name) === -1) { data[attr.name] = attr.value; } } if (node.hasAttribute(ATTRIBUTE_FORM_URL)) { const url = node.getAttribute(ATTRIBUTE_FORM_URL); if (!node.hasAttribute(ATTRIBUTE_FORM_RELOAD) || node.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase() === "onshow") { node.removeAttribute(ATTRIBUTE_FORM_URL); } const options2 = this.getOption("fetch", {}); const filter = void 0; loadAndAssignContent(node, url, options2, filter).then(() => { fireCustomEvent(this, "monster-tab-changed", { reference: reference2 }); }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } else { fireCustomEvent(this, "monster-tab-changed", { reference: reference2, data }); } } else { node.classList.remove("active"); } } const standardButtons = this.getOption("buttons.standard"); for (const index in standardButtons) { const button = standardButtons[index]; const state = button["reference"] === reference2 ? "active" : "inactive"; this.setOption(`buttons.standard.${index}.state`, state); } const popperButton = this.getOption("buttons.popper"); for (const index in popperButton) { const button = popperButton[index]; const state = button["reference"] === reference2 ? "active" : "inactive"; this.setOption(`buttons.popper.${index}.state`, state); } hidePopper.call(this); } function initEventHandler() { const self2 = this; if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[removeTabEventHandler] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "remove-tab" ); if (element instanceof HTMLElement) { const button = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "button" ); if (button instanceof HTMLButtonElement && button.disabled !== true) { const reference2 = button.getAttribute( `${ATTRIBUTE_PREFIX}tab-reference` ); let doChange = false; let nextName = null; let previousName = null; const btn = this.getOption("buttons"); for (let i = 0; i < btn.standard.length; i++) { if (btn.standard[i].reference === reference2) { if (btn.standard[i].state === "active") { doChange = i; if (i < btn.standard.length - 1) { nextName = btn.standard[i + 1]?.reference; } if (i > 0) { previousName = btn.standard[i - 1]?.reference; } } break; } } if (reference2) { const container = this.querySelector(`[id=${reference2}]`); if (container instanceof HTMLElement) { if (doChange) { switch (this.getOption("features.removeBehavior")) { case "auto": if (nextName !== null) { self2.activeTab(nextName); } else { if (previousName !== null) { self2.activeTab(previousName); } } break; case "next": if (nextName !== null) { self2.activeTab(nextName); } break; case "previous": if (previousName !== null) { self2.activeTab(previousName); } break; default: break; } } container.remove(); initTabButtons.call(this); fireCustomEvent(this, "monster-tab-remove", { reference: reference2 }); } } } } }; this[changeTabEventHandler] = (event) => { const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "button"); if (element instanceof HTMLButtonElement && element.disabled !== true) { show2.call(this, element); } }; this[closeEventHandler] = (event) => { const path = event.composedPath(); for (const [, element] of Object.entries(path)) { if (element === this) { return; } } hidePopper.call(this); }; this[navElementSymbol].addEventListener("touch", this[removeTabEventHandler]); this[navElementSymbol].addEventListener("click", this[removeTabEventHandler]); this[navElementSymbol].addEventListener("touch", this[changeTabEventHandler]); this[navElementSymbol].addEventListener("click", this[changeTabEventHandler]); return this; } function attachTabMutationObserver(observedNode) { const self2 = this; if (hasObjectLink(observedNode, mutationObserverSymbol)) { return; } const observer = new MutationObserver(function(mutations) { if (isArray(mutations)) { const mutation = mutations.pop(); if (mutation instanceof MutationRecord) { initTabButtons.call(self2); } } }); observer.observe(observedNode, { childList: false, attributes: true, subtree: false, attributeFilter: [ "disabled", ATTRIBUTE_BUTTON_LABEL, `${ATTRIBUTE_PREFIX}button-icon` ] }); addToObjectLink(observedNode, mutationObserverSymbol, observer); } function initControlReferences() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[controlElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=control]` ); this[navElementSymbol] = this.shadowRoot.querySelector( `nav[${ATTRIBUTE_ROLE}=nav]` ); this[popperElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=popper]` ); this[popperNavElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=popper-nav]` ); } function initTabButtons() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } let activeReference; const dimensionsCalculated = this[dimensionsSymbol].getVia( "data.calculated", false ); const buttons = []; const nodes = getSlottedElements.call(this, void 0, null); for (const node of nodes) { if (!(node instanceof HTMLElement)) continue; let label = getButtonLabel.call(this, node); let reference2; if (node.hasAttribute("id")) { reference2 = node.getAttribute("id"); } let disabled; if (node.hasAttribute("disabled") || node.disabled === true) { disabled = true; } if (!reference2) { reference2 = new ID("tab").toString(); node.setAttribute("id", reference2); } if (node.hasAttribute(`${ATTRIBUTE_PREFIX}button-icon`)) { label = `<span part="label">${label}</span><img part="icon" alt="this is an icon" src="${node.getAttribute( `${ATTRIBUTE_PREFIX}button-icon` )}">`; } let remove = false; if (node.hasAttribute(`${ATTRIBUTE_PREFIX}removable`)) { remove = true; } if (node.matches(".active") === true && disabled !== true) { node.classList.remove("active"); activeReference = reference2; } const state = ""; const classes = dimensionsCalculated ? "" : "invisible"; buttons.push({ reference: reference2, label, state, class: classes, disabled, remove }); attachTabMutationObserver.call(this, node); } this.setOption("buttons.standard", clone(buttons)); this.setOption("buttons.popper", []); this.setOption("marker", random()); return adjustButtonVisibility.call(this).then(() => { if (!activeReference && this.getOption("features.openFirst") === true) { const firstButton = this.getOption("buttons.standard").find( (button) => button.disabled !== true ); if (firstButton) { activeReference = firstButton.reference; } } if (activeReference) { return new Processing(() => { const button = this.shadowRoot.querySelector( `[${ATTRIBUTE_PREFIX}tab-reference="${activeReference}"]` ); if (button instanceof HTMLButtonElement && button.disabled !== true) { show2.call(this, button); } }).run(void 0).then(() => { }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } return Promise.resolve(); }); } function checkAndRearrangeButtons() { if (this[dimensionsSymbol].getVia("data.calculated", false) !== true) { calculateNavigationButtonsDimensions.call(this); } rearrangeButtons.call(this); } function adjustButtonVisibility() { const self2 = this; return new Promise((resolve) => { const observer = new MutationObserver(function(mutations) { const defCount = self2.getOption("buttons.standard").length; const domCount = self2[navElementSymbol].querySelectorAll( 'button[data-monster-role="button"]' ).length; if (defCount !== domCount) return; observer.disconnect(); checkAndRearrangeButtons.call(self2); resolve(); }); observer.observe(self2[navElementSymbol], { attributes: true }); }); } function getDimValue(value) { if ([void 0, null].indexOf(value) !== -1) { return 0; } const valueAsInt = parseInt(value, 10); if (isNaN(valueAsInt)) { return 0; } return valueAsInt; } function calcBoxWidth(node) { const dim = getGlobal("window").getComputedStyle(node); const bounding = node.getBoundingClientRect(); return getDimValue(dim["border-left-width"]) + getDimValue(dim["padding-left"]) + getDimValue(dim["margin-left"]) + getDimValue(bounding["width"]) + getDimValue(dim["border-right-width"]) + getDimValue(dim["margin-right"]) + getDimValue(dim["padding-left"]); } function rearrangeButtons() { getWindow2().requestAnimationFrame(() => { const standardButtons = []; const popperButtons = []; let sum = 0; const space = this[dimensionsSymbol].getVia("data.space"); if (space <= 0) { return; } const buttons = this.getOption("buttons.standard"); for (const [, button] of buttons.entries()) { const ref = button?.reference; sum += this[dimensionsSymbol].getVia(`data.button.${ref}`); if (sum > space) { popperButtons.push(clone(button)); } else { standardButtons.push(clone(button)); } } this.setOption("buttons.standard", standardButtons); this.setOption("buttons.popper", popperButtons); if (this[switchElementSymbol]) { if (popperButtons.length > 0) { this[switchElementSymbol].classList.remove("hidden"); } else { this[switchElementSymbol].classList.add("hidden"); } } }); } function calculateNavigationButtonsDimensions() { const width = this[navElementSymbol].getBoundingClientRect().width; let startEndWidth = 0; getSlottedElements.call(this, void 0, "start").forEach((node) => { startEndWidth += calcBoxWidth.call(this, node); }); getSlottedElements.call(this, void 0, "end").forEach((node) => { startEndWidth += calcBoxWidth.call(this, node); }); this[dimensionsSymbol].setVia("data.space", width - startEndWidth - 2); this[dimensionsSymbol].setVia("data.visible", !(width === 0)); const buttons = this.getOption("buttons.standard").concat( this.getOption("buttons.popper") ); for (const [i, button] of buttons.entries()) { const ref = button?.reference; const element = this[navElementSymbol].querySelector( `:scope > [${ATTRIBUTE_PREFIX}tab-reference="${ref}"]` ); if (!(element instanceof HTMLButtonElement)) continue; this[dimensionsSymbol].setVia( `data.button.${ref}`, calcBoxWidth.call(this, element) ); button["class"] = new TokenList(button["class"]).remove("invisible").toString(); } const slots = this[controlElementSymbol].querySelectorAll( `nav[${ATTRIBUTE_PREFIX}role=nav] > slot.invisible, slot[${ATTRIBUTE_PREFIX}role=slot].invisible` ); for (const [, slot] of slots.entries()) { slot.classList.remove("invisible"); } this.setOption("buttons.standard", clone(buttons)); getWindow2().requestAnimationFrame(() => { this[dimensionsSymbol].setVia("data.calculated", true); }); } function getButtonLabel(node) { let label; let setLabel = false; if (node.hasAttribute(ATTRIBUTE_BUTTON_LABEL)) { label = node.getAttribute(ATTRIBUTE_BUTTON_LABEL); } else { label = node.innerText; setLabel = true; } if (!isString(label)) { label = ""; } label = label.trim(); if (label === "") { label = this.getOption("labels.new-tab-label", "New Tab"); } if (label.length > 100) { label = `${label.substring(0, 99)}\u2026`; } if (setLabel === true) { node.setAttribute(ATTRIBUTE_BUTTON_LABEL, label); } return label; } function getTemplate() { return ` <template id="buttons"> <button part="button" data-monster-role="button" data-monster-attributes=" class path:classes.button, data-monster-state path:buttons.state, disabled path:buttons.disabled | if:true, data-monster-tab-reference path:buttons.reference"><span data-monster-replace="path:buttons.label"></span><span part="remove-tab" data-monster-attributes="class path:buttons.remove | ?:remove-tab:hidden " data-monster-role="remove-tab" tabindex="-1"></span></button> </template> <div data-monster-role="control" part="control"> <nav data-monster-role="nav" part="nav" data-monster-attributes="data-monster-marker path:marker, class path:classes.navigation" data-monster-insert="buttons path:buttons.standard"> <slot name="start" class="invisible"></slot> <div data-monster-role="popper" part="popper" tabindex="-1" data-monster-attributes="class path:classes.popper"> <div data-popper-arrow></div> <div part="popper-nav" data-monster-role="popper-nav" data-monster-insert="buttons path:buttons.popper" tabindex="-1"></div> </div> <slot name="popper" class="invisible"></slot> <slot name="end" class="invisible"></slot> </nav> <slot data-monster-role="slot" class="invisible"></slot> </div>`; } var popperElementSymbol, popperNavElementSymbol, controlElementSymbol, navElementSymbol, switchElementSymbol, changeTabEventHandler, removeTabEventHandler, popperSwitchEventHandler, closeEventHandler, mutationObserverSymbol, dimensionsSymbol, timerCallbackSymbol, resizeObserverSymbol, Tabs; var init_tabs2 = __esm({ "source/components/layout/tabs.mjs"() { init_constants(); init_lib(); init_extend(); init_pathfinder(); init_attributes(); init_constants2(); init_customelement(); init_events(); init_util(); init_random(); init_global(); init_id(); init_is(); init_tokenlist(); init_clone(); init_deadmansswitch(); init_processing(); init_constants3(); init_tabs(); init_fetch(); init_theme2(); init_popper2(); init_locale2(); popperElementSymbol = Symbol("popperElement"); popperNavElementSymbol = Symbol("popperNavElement"); controlElementSymbol = Symbol("controlElement"); navElementSymbol = Symbol("navElement"); switchElementSymbol = Symbol("switchElement"); changeTabEventHandler = Symbol("changeTabEventHandler"); removeTabEventHandler = Symbol("removeTabEventHandler"); popperSwitchEventHandler = Symbol("popperSwitchEventHandler"); closeEventHandler = Symbol("closeEventHandler"); mutationObserverSymbol = Symbol("mutationObserver"); dimensionsSymbol = Symbol("dimensions"); timerCallbackSymbol = Symbol("timerCallback"); resizeObserverSymbol = Symbol("resizeObserver"); Tabs = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/tabs"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} labels * @property {string} labels.new-tab-label="New Tab" * @property {Object} features * @property {number} features.openDelay=500 Open delay in milliseconds * @property {string} features.removeBehavior="auto" Remove behavior, auto (default), next, previous and none * @property {boolean} features.openFirst=true Open the first tab * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) * @property {String} fetch.redirect=error * @property {String} fetch.method=GET * @property {String} fetch.mode=same-origin * @property {String} fetch.credentials=same-origin * @property {Object} fetch.headers={"accept":"text/html"}} * @property {Object} popper [PopperJS Options](https://popper.js.org/docs/v2/) * @property {string} popper.placement=bottom PopperJS placement * @property {Object[]} modifiers={name:offset} PopperJS placement */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate() }, labels: getTranslations(), buttons: { standard: [], popper: [] }, fetch: { redirect: "error", method: "GET", mode: "same-origin", credentials: "same-origin", headers: { accept: "text/html" } }, features: { openDelay: null, removeBehavior: "auto", openFirst: true }, classes: { button: "monster-theme-primary-1", popper: "monster-theme-primary-1", navigation: "monster-theme-primary-1" }, popper: { placement: "bottom", modifiers: [ { name: "offset", options: { offset: [0, 2] } }, { name: "eventListeners", enabled: false } ] } }); } /** * This method is called internal and should not be called directly. */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences.call(this); this[dimensionsSymbol] = new Pathfinder({ data: {} }); initEventHandler.call(this); initTabButtons.call(this).then(() => { initPopperSwitch.call(this); initPopper.call(this); attachResizeObserver.call(this); attachTabChangeObserver.call(this); }); } /** * This method is called internal and should not be called directly. * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [TabsStyleSheet]; } /** * This method is called internal and should not be called directly. * * @return {string} */ static getTag() { return "monster-tabs"; } /** * A function that activates a tab based on the provided name. * * The tabs have to be named with the `data-monster-name` attribute. * * @param {type} idOrName - the name or id of the tab to activate * @return {Tabs} - The current instance */ activeTab(idOrName) { let found = false; getSlottedElements.call(this).forEach((node) => { if (found === true) { return; } if (node.getAttribute("data-monster-name") === idOrName) { this.shadowRoot.querySelector( `[data-monster-tab-reference="${node.getAttribute("id")}"]` ).click(); found = true; } if (node.getAttribute("id") === idOrName) { this.shadowRoot.querySelector( `[data-monster-tab-reference="${node.getAttribute("id")}"]` ).click(); found = true; } }); return this; } /** * A function that returns the name or id of the currently active tab. * * The tabs have to be named with the `data-monster-name` attribute. * * @return {string|null} */ getActiveTab() { const nodes = getSlottedElements.call(this); for (const node of nodes) { if (node.matches(".active") === true) { if (node.hasAttribute("data-monster-name")) { return node.getAttribute("data-monster-name"); } return node.getAttribute("id"); } } return null; } /** * This method is called by the dom and should not be called directly. * * @return {void} */ connectedCallback() { super.connectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.addEventListener(type3, this[closeEventHandler]); } } /** * This method is called by the dom and should not be called directly. * * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.removeEventListener(type3, this[closeEventHandler]); } } }; registerCustomElement(Tabs); } }); // source/components/notify/stylesheet/message.mjs var MessageStyleSheet; var init_message = __esm({ "source/components/notify/stylesheet/message.mjs"() { init_attributes(); init_constants2(); MessageStyleSheet = new CSSStyleSheet(); try { MessageStyleSheet.insertRule( ` @layer message { :where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}html{height:100%}body,html{min-height:calc(100vh - 40px)}body{box-sizing:border-box;margin:0;padding:0;word-break:break-word}body:focus-visible{outline:none}:focus-visible{outline:none}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}:after,:before,:root{--monster-color-gray-1:#f6f6f6;--monster-color-gray-2:#e2e2e2;--monster-color-gray-3:#8b8b8b;--monster-color-gray-4:#6f6f6f;--monster-color-gray-5:#3e3e3e;--monster-color-gray-6:#222;--monster-color-rose-1:#fff7f9;--monster-color-rose-2:#ffdce5;--monster-color-rose-3:#ff3b8d;--monster-color-rose-4:#db0072;--monster-color-rose-5:#800040;--monster-color-rose-6:#4c0023;--monster-color-raspberry-1:#fff8f8;--monster-color-raspberry-2:#ffdddf;--monster-color-raspberry-3:#ff426c;--monster-color-raspberry-4:#de0051;--monster-color-raspberry-5:#82002c;--monster-color-raspberry-6:#510018;--monster-color-red-1:#fff8f6;--monster-color-red-2:#ffddd8;--monster-color-red-3:#ff4647;--monster-color-red-4:#e0002b;--monster-color-red-5:#830014;--monster-color-red-6:#530003;--monster-color-orange-1:#fff8f5;--monster-color-orange-2:#ffded1;--monster-color-orange-3:#fd4d00;--monster-color-orange-4:#cd3c00;--monster-color-orange-5:#752100;--monster-color-orange-6:#401600;--monster-color-cinnamon-1:#fff8f3;--monster-color-cinnamon-2:#ffdfc6;--monster-color-cinnamon-3:#d57300;--monster-color-cinnamon-4:#ac5c00;--monster-color-cinnamon-5:#633300;--monster-color-cinnamon-6:#371d00;--monster-color-amber-1:#fff8ef;--monster-color-amber-2:#ffe0b2;--monster-color-amber-3:#b98300;--monster-color-amber-4:#926700;--monster-color-amber-5:#523800;--monster-color-amber-6:#302100;--monster-color-yellow-1:#fff9e5;--monster-color-yellow-2:#ffe53e;--monster-color-yellow-3:#9c8b00;--monster-color-yellow-4:#7d6f00;--monster-color-yellow-5:#463d00;--monster-color-yellow-6:#292300;--monster-color-lime-1:#f7ffac;--monster-color-lime-2:#d5f200;--monster-color-lime-3:#819300;--monster-color-lime-4:#677600;--monster-color-lime-5:#394100;--monster-color-lime-6:#222600;--monster-color-chartreuse-1:#e5ffc3;--monster-color-chartreuse-2:#98fb00;--monster-color-chartreuse-3:#5c9b00;--monster-color-chartreuse-4:#497c00;--monster-color-chartreuse-5:#264500;--monster-color-chartreuse-6:#182600;--monster-color-green-1:#e0ffd9;--monster-color-green-2:#72ff6c;--monster-color-green-3:#00a21f;--monster-color-green-4:#008217;--monster-color-green-5:#004908;--monster-color-green-6:#062800;--monster-color-emerald-1:#dcffe6;--monster-color-emerald-2:#5dffa2;--monster-color-emerald-3:#00a05a;--monster-color-emerald-4:#008147;--monster-color-emerald-5:#004825;--monster-color-emerald-6:#002812;--monster-color-aquamarine-1:#daffef;--monster-color-aquamarine-2:#42ffc6;--monster-color-aquamarine-3:#009f78;--monster-color-aquamarine-4:#007f5f;--monster-color-aquamarine-5:#004734;--monster-color-aquamarine-6:#00281b;--monster-color-teal-1:#d7fff7;--monster-color-teal-2:#00ffe4;--monster-color-teal-3:#009e8c;--monster-color-teal-4:#007c6e;--monster-color-teal-5:#00443c;--monster-color-teal-6:#002722;--monster-color-cyan-1:#c4fffe;--monster-color-cyan-2:#00fafb;--monster-color-cyan-3:#00999a;--monster-color-cyan-4:#007a7b;--monster-color-cyan-5:#004344;--monster-color-cyan-6:#002525;--monster-color-powder-1:#dafaff;--monster-color-powder-2:#8df0ff;--monster-color-powder-3:#0098a9;--monster-color-powder-4:#007987;--monster-color-powder-5:#004048;--monster-color-powder-6:#002227;--monster-color-sky-1:#e3f7ff;--monster-color-sky-2:#aee9ff;--monster-color-sky-3:#0094b4;--monster-color-sky-4:#007590;--monster-color-sky-5:#00404f;--monster-color-sky-6:#001f28;--monster-color-cerulean-1:#e8f6ff;--monster-color-cerulean-2:#b9e3ff;--monster-color-cerulean-3:#0092c5;--monster-color-cerulean-4:#00749d;--monster-color-cerulean-5:#003c54;--monster-color-cerulean-6:#001d2a;--monster-color-azure-1:#e8f2ff;--monster-color-azure-2:#c6e0ff;--monster-color-azure-3:#008fdb;--monster-color-azure-4:#0071af;--monster-color-azure-5:#003b5e;--monster-color-azure-6:#001c30;--monster-color-blue-1:#f0f4ff;--monster-color-blue-2:#d4e0ff;--monster-color-blue-3:#0089fc;--monster-color-blue-4:#006dca;--monster-color-blue-5:#00386d;--monster-color-blue-6:#001a39;--monster-color-indigo-1:#f3f3ff;--monster-color-indigo-2:#deddff;--monster-color-indigo-3:#657eff;--monster-color-indigo-4:#0061fc;--monster-color-indigo-5:#00328a;--monster-color-indigo-6:#001649;--monster-color-violet-1:#f7f1ff;--monster-color-violet-2:#e8daff;--monster-color-violet-3:#9b70ff;--monster-color-violet-4:#794aff;--monster-color-violet-5:#2d0fbf;--monster-color-violet-6:#0b0074;--monster-color-purple-1:#fdf4ff;--monster-color-purple-2:#f7d9ff;--monster-color-purple-3:#d150ff;--monster-color-purple-4:#b01fe3;--monster-color-purple-5:#660087;--monster-color-purple-6:#3a004f;--monster-color-magenta-1:#fff3fc;--monster-color-magenta-2:#ffd7f6;--monster-color-magenta-3:#f911e0;--monster-color-magenta-4:#ca00b6;--monster-color-magenta-5:#740068;--monster-color-magenta-6:#44003c;--monster-color-pink-1:#fff7fb;--monster-color-pink-2:#ffdcec;--monster-color-pink-3:#ff2fb2;--monster-color-pink-4:#d2008f;--monster-color-pink-5:#790051;--monster-color-pink-6:#4b0030;--monster-gradient-tangerine-1:#e5b875;--monster-gradient-tangerine-2:#d9a362;--monster-gradient-tangerine-3:#c08a4e;--monster-gradient-tangerine-4:#a7713b;--monster-gradient-tangerine-5:#8f5a28;--monster-gradient-tangerine-6:#360505;--monster-color-seashell-1:#f7f5ef;--monster-color-seashell-2:#e5e2d9;--monster-color-seashell-3:#cbc6b3;--monster-color-seashell-4:#a19d8a;--monster-color-seashell-5:#7a7566;--monster-color-seashell-6:#514d3f}.monster-theme-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-theme-primary-disabled-1{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1)}.monster-theme-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-theme-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-theme-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-theme-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-theme-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-theme-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-theme-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-border-color-1{border-color:var(--monster-color-border-1)}.monster-color-neutral-1{color:var(--monster-color-primary-1)}.monster-bg-color-primary-1{background-color:var(--monster-bg-color-primary-1)}.monster-bg-color-secondary-1{background-color:var(--monster-bg-color-secondary-1)}.monster-bg-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1)}.monster-color-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-color-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-color-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-color-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-color-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-color-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-color-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-theme-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-theme-primary-disabled-2{background-color:var(--monster-bg-color-primary-disabled-2);color:var(--monster-color-primary-disabled-2)}.monster-theme-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-theme-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-theme-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-theme-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-theme-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-theme-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-theme-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-border-color-2{border-color:var(--monster-color-border-2)}.monster-color-neutral-2{color:var(--monster-color-primary-2)}.monster-bg-color-primary-2{background-color:var(--monster-bg-color-primary-2)}.monster-bg-color-secondary-2{background-color:var(--monster-bg-color-secondary-2)}.monster-bg-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2)}.monster-color-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-color-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-color-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-color-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-color-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-color-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-color-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-theme-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-theme-primary-disabled-3{background-color:var(--monster-bg-color-primary-disabled-3);color:var(--monster-color-primary-disabled-3)}.monster-theme-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-theme-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-theme-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-theme-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-theme-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-theme-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-theme-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-border-color-3{border-color:var(--monster-color-border-3)}.monster-color-neutral-3{color:var(--monster-color-primary-3)}.monster-bg-color-primary-3{background-color:var(--monster-bg-color-primary-3)}.monster-bg-color-secondary-3{background-color:var(--monster-bg-color-secondary-3)}.monster-bg-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3)}.monster-color-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-color-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-color-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-color-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-color-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-color-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-color-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-theme-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-theme-primary-disabled-4{background-color:var(--monster-bg-color-primary-disabled-4);color:var(--monster-color-primary-disabled-4)}.monster-theme-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-theme-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-theme-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-theme-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-theme-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-theme-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-theme-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-border-color-4{border-color:var(--monster-color-border-4)}.monster-color-neutral-4{color:var(--monster-color-primary-4)}.monster-bg-color-primary-4{background-color:var(--monster-bg-color-primary-4)}.monster-bg-color-secondary-4{background-color:var(--monster-bg-color-secondary-4)}.monster-bg-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4)}.monster-color-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-color-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-color-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-color-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-color-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-color-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-color-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-theme-control-container-1,.monster-theme-control-row-1{border:1px solid var(--monster-theme-control-border-color)}.monster-theme-control-container-1,.monster-theme-control-element,.monster-theme-control-row-1{background-color:var(--monster-theme-control-bg-color);color:var(--monster-theme-control-color)}.monster-theme-control-background{background-color:var(--monster-theme-control-bg-color)}.monster-theme-background-inherit{background-color:inherit!important}.monster-theme-on{background-color:var(--monster-theme-on-bg-color);color:var(--monster-theme-on-color)}.monster-theme-off{background-color:var(--monster-theme-off-bg-color);color:var(--monster-theme-off-color)}[data-monster-role=control]{box-sizing:border-box;outline:none}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}[data-monster-role=message]{align-items:center;display:flex;flex-direction:row;position:relative;width:100%}[data-monster-role=control]{align-items:center;background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1);display:flex;justify-content:space-between;padding:8px;width:100%}[data-monster-role=content]{flex-grow:2;@mixins paragraph}[data-monster-role=control] [data-monster-role=close]{cursor:pointer;height:16px;position:absolute;right:-10px;top:-5px;width:16px;z-index:var(--monster-z-index-modal-overlay)}[data-monster-role=control] [data-monster-role=close]:before{background-color:var(--monster-color-primary-1);content:"";display:block;height:100%;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/notify/message.mjs var message_exports = {}; __export(message_exports, { Message: () => Message }); function startFadeout() { if (!this?.[timerSymbol]) { this[timerSymbol] = setTimeout( () => { removeSelf.call(this); }, this.getOption("timeout", 1e3) ); } } function removeSelf() { stopFadeout(); this.classList.add("fadeout"); setTimeout(() => { this.remove(); }, 200); } function stopFadeout() { if (this?.[timerSymbol]) { clearTimeout(this[timerSymbol]); this[timerSymbol] = void 0; } } function initControlReferences2() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[controlElementSymbol2] = this.shadowRoot.querySelector( "[" + ATTRIBUTE_ROLE + "=control]" ); this[removeElementSymbol] = this.shadowRoot.querySelector( "[" + ATTRIBUTE_ROLE + "=close]" ); } function initEventHandler2() { this[mouseenterEventHandlerSymbol] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "control" ); if (element instanceof HTMLElement) { this.removeEventListener( "mouseenter", this[mouseenterEventHandlerSymbol] ); this.addEventListener("mouseleave", this[mouseleaveEventHandlerSymbol]); stopFadeout.call(this); } }; this[mouseleaveEventHandlerSymbol] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "control" ); if (element instanceof HTMLElement) { this.removeEventListener( "mouseleave", this[mouseleaveEventHandlerSymbol] ); this.addEventListener("mouseenter", this[mouseenterEventHandlerSymbol]); startFadeout.call(this); } }; this[removeEventHandlerSymbol] = (event) => { const element = findTargetElementFromEvent(event, ATTRIBUTE_ROLE, "close"); if (element instanceof HTMLElement) { removeSelf.call(this); } }; if (this.getOption("features.close") === true) { this[removeElementSymbol].addEventListener( "click", this[removeEventHandlerSymbol] ); this[removeElementSymbol].addEventListener( "touch", this[removeEventHandlerSymbol] ); } return this; } function getTemplate2() { return ` <div data-monster-role="control" part="control" class="center"> <div data-monster-role="message" part="message" data-monster-attributes="data-monster-orientation path:orientation"> <div data-monster-replace="path:content" part="content" data-monster-role="content"> </div> <div part="remove" data-monster-attributes="class path:features.close | ?::hidden " data-monster-role="close" tabindex="-1"></div> </div> </div> `; } var controlElementSymbol2, removeElementSymbol, timerSymbol, mouseenterEventHandlerSymbol, mouseleaveEventHandlerSymbol, removeEventHandlerSymbol, Message; var init_message2 = __esm({ "source/components/notify/message.mjs"() { init_constants2(); init_customelement(); init_events(); init_is(); init_message(); controlElementSymbol2 = Symbol("controlElement"); removeElementSymbol = Symbol("removeElement"); timerSymbol = Symbol("timer"); mouseenterEventHandlerSymbol = Symbol("mouseenterEventHandler"); mouseleaveEventHandlerSymbol = Symbol("mouseleaveEventHandler"); removeEventHandlerSymbol = Symbol("removeEventHandler"); Message = class extends CustomElement { /** * The defaults can be set either directly in the object or via an attribute in the HTML tag. * The value of the attribute `data-monster-options` in the HTML tag must be a JSON string. * * ``` * <monster-message data-monster-options="{}"></monster-message> * ``` * * Since 1.18.0 the JSON can be specified as a DataURI. * * ``` * new Monster.Types.DataUrl(btoa(JSON.stringify({ * timeout: 3000, * features: { * close: true, * disappear: true * } * })),'application/json',true).toString() * ``` * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {number} timeout The time in milliseconds after which the message disappears * @property {Object} features The features of the message * @property {boolean} features.close Whether the message can be closed * @property {boolean} features.disappear Whether the message disappears after a certain time * @property {string} content The content of the message */ get defaults() { return Object.assign({}, super.defaults, { timeout: 6e3, features: { close: true, disappear: true }, content: "<slot></slot>", templates: { main: getTemplate2() } }); } /** * * @return {Monster.Components.Notify.Message} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences2.call(this); initEventHandler2.call(this); return this; } /** * * @return {string} */ static getTag() { return "monster-notify-message"; } /** * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [MessageStyleSheet]; } /** * */ [initMethodSymbol]() { super[initMethodSymbol](); } /** * @return {void} */ connectedCallback() { super.connectedCallback(); if (this.getOption("features.disappear") === true) { startFadeout.call(this); this.addEventListener("mouseenter", this[mouseenterEventHandlerSymbol]); } } /** * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); stopFadeout.call(this); if (this.getOption("features.disappear") === true) { this.removeEventListener( "mouseenter", this[mouseenterEventHandlerSymbol] ); this.removeEventListener( "mouseenter", this[mouseleaveEventHandlerSymbol] ); } } }; registerCustomElement(Message); } }); // source/components/notify/stylesheet/notify.mjs var NotifyStyleSheet; var init_notify = __esm({ "source/components/notify/stylesheet/notify.mjs"() { init_attributes(); init_constants2(); NotifyStyleSheet = new CSSStyleSheet(); try { NotifyStyleSheet.insertRule( ` @layer notify { .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=control]{align-items:flex-start;border:0;box-sizing:border-box;display:flex;flex-direction:row;justify-content:space-between;margin:0;max-height:100vH;pointer-events:none;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:25rem;z-index:var(--monster-z-index-modal-overlay)}div[data-monster-role=control]:not(.inline){position:absolute}div[data-monster-role=control].inline{--monster-message-border-shadow:none}[data-monster-role=control][data-monster-orientation*=left]{left:0;right:auto}[data-monster-role=control][data-monster-orientation*=right]{left:auto;right:0}[data-monster-role=control][data-monster-orientation*=center]{left:50%;transform:translate(-50%)}[data-monster-role=control][data-monster-orientation*=bottom]{align-items:flex-end;bottom:0}[data-monster-role=control][data-monster-orientation*=top]{align-items:flex-start;top:0}[data-monster-role=container]{width:100%}[data-monster-role=message]{background-clip:padding-box;background-color:var(--monster-bg-color-primary-1);border-color:var(--monster-message-border-color,rgba(0,0,0,.1));border-radius:var(--monster-message-border-radius,.25rem);border-style:var(--monster-message-border-style,solid);border-width:var(--monster-message-border-width,1px);box-shadow:var(--monster-message-border-shadow,0 .5rem 1rem rgba(0,0,0,.15));color:var(--monster-color-primary-1);display:flex;font-size:.875rem;margin:var(--monster-message-margin-top,15px) var(--monster-message-margin-right,5px) var(--monster-message-margin-bottom,0) var(--monster-message-margin-left,0);max-height:200px;max-width:100%;overflow:hidden;padding:var(--monster-message-padding-top,5px) var(--monster-message-padding-right,5px) var(--monster-message-padding-bottom,5px) var(--monster-message-padding-left,5px);pointer-events:auto;position:relative;text-overflow:ellipsis;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:100%}[data-monster-role=message]:first-child{margin-top:0}[data-monster-role=message].fadeout{border:0;margin-bottom:0;margin-top:0;max-height:0;padding-bottom:0;padding-top:0;transition:all .2s cubic-bezier(1,-.04,0,1.03)} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/notify/notify.mjs var notify_exports = {}; __export(notify_exports, { Notify: () => Notify }); function initControlReferences3() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[controlElementSymbol3] = this.shadowRoot.querySelector( "[" + ATTRIBUTE_ROLE + "=control]" ); this[containerElementSymbol] = this.shadowRoot.querySelector( "[" + ATTRIBUTE_ROLE + "=container]" ); } function getTemplate3() { return ` <div data-monster-role="control" part="control" data-monster-attributes="data-monster-orientation path:orientation, class path:classes.control"> <div data-monster-attributes="class path:classes.container" part="container" data-monster-role="container"></div> </div> `; } var controlElementSymbol3, containerElementSymbol, queueSymbol, Notify; var init_notify2 = __esm({ "source/components/notify/notify.mjs"() { init_constants2(); init_customelement(); init_validate(); init_message2(); init_notify(); init_queue(); init_events(); controlElementSymbol3 = Symbol("controlElement"); containerElementSymbol = Symbol("containerElement"); queueSymbol = Symbol("queue"); Notify = class extends CustomElement { constructor() { super(); this[queueSymbol] = new Queue(); } /** * @property {string} orientation The orientation of the notify element. Allowed values for horizontal orientation are "left", "center", "right". Allowed values for vertical orientation are "top" and "bottom". * @property {object} templates The templates of the notify element. * @property {string} templates.main The main template of the notify element. * @property {object} classes The classes of the notify element. * @property {string} classes.container The container class of the notify element. * @property {string} classes.control The control class of the notify element. */ get defaults() { return Object.assign({}, super.defaults, { orientation: "left top", templates: { main: getTemplate3() }, classes: { container: "", control: "center" } }); } /** * @return {Notify} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences3.call(this); if (this[containerElementSymbol]) { while (this[queueSymbol].isEmpty() === false) { this.push(this[queueSymbol].poll()); } } return this; } /** * @return {string} */ static getTag() { return "monster-notify"; } /** * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [NotifyStyleSheet]; } /** * @param {Massage|String} message * @return {Notify} */ push(message) { let messageElement = message; if (!(message instanceof Message)) { const text = validateString(message); messageElement = document.createElement("monster-notify-message"); messageElement.setOption("content", text); } validateInstance(messageElement, Message); messageElement.setAttribute(ATTRIBUTE_ROLE, "message"); if (!this[containerElementSymbol]) { this[queueSymbol].add(messageElement); return this; } fireCustomEvent(this, "monster-notify-message", { messageElement }); this[containerElementSymbol].appendChild(messageElement); return this; } }; registerCustomElement(Notify); } }); // source/components/layout/stylesheet/split-panel.mjs var SplitPanelStyleSheet; var init_split_panel = __esm({ "source/components/layout/stylesheet/split-panel.mjs"() { init_attributes(); init_constants2(); SplitPanelStyleSheet = new CSSStyleSheet(); try { SplitPanelStyleSheet.insertRule( ` @layer splitpanel { [data-monster-role=split-panel]{box-sizing:border-box;display:flex;flex-direction:row;height:auto;margin:0;padding:0;width:100%}[data-monster-role=split-panel] .panel{flex-grow:1;overflow:auto}[data-monster-role=split-panel] [data-monster-role=dragger]{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4);height:auto;position:relative;width:var(--monster-dragger-width)}:is([data-monster-role=split-panel] [data-monster-role=dragger]) [data-monster-role=handle]{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3);cursor:pointer;height:var(--monster-dragger-handle-height);left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:var(--monster-dragger-handle-width);z-index:var(--monster-z-index-outline)}.horizontal[data-monster-role=split-panel]{flex-direction:column}.horizontal[data-monster-role=split-panel] [data-monster-role=dragger]{height:var(--monster-dragger-width);width:100%}:is(.horizontal[data-monster-role=split-panel] [data-monster-role=dragger]) [data-monster-role=handle]{height:var(--monster-dragger-handle-width);width:var(--monster-dragger-handle-height)} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/layout/split-panel.mjs var split_panel_exports = {}; __export(split_panel_exports, { SplitPanel: () => SplitPanel, TYPE_HORIZONTAL: () => TYPE_HORIZONTAL, TYPE_VERTICAL: () => TYPE_VERTICAL }); function applyPanelDimensions() { const splitType = this.getOption("splitType"); const dimension = this[internalSymbol].getSubject().currentDimension; if (splitType === TYPE_VERTICAL) { this[startPanelElementSymbol].style.width = dimension; this[endPanelElementSymbol].style.width = `calc(100% - ${dimension} - 5px)`; this[draggerElementSymbol].style.cursor = "ew-resize"; this[splitScreenElementSymbol].classList.add("vertical"); this[splitScreenElementSymbol].classList.remove("horizontal"); } else { this[startPanelElementSymbol].style.height = dimension; this[endPanelElementSymbol].style.height = `calc(100% - ${dimension} - 5px)`; this[draggerElementSymbol].style.cursor = "ns-resize"; this[splitScreenElementSymbol].classList.add("horizontal"); this[splitScreenElementSymbol].classList.remove("vertical"); } fireCustomEvent(this, "monster-dimension-changed", { controller: this, dimension }); } function initControlReferences4() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[splitScreenElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=split-panel]" ); this[draggerElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=dragger]" ); this[handleElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=handle]" ); this[startPanelElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=startPanel]" ); this[endPanelElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=endPanel]" ); } function initEventHandler3() { const self2 = this; let lastDimension = this[internalSymbol].getSubject().currentDimension; let lastType = this.getOption("splitType"); this[internalSymbol].getSubject().isDragging = false; const eventTypes = ["dblclick", "touchstart"]; for (const eventType of eventTypes) { this[draggerElementSymbol].addEventListener(eventType, () => { self2[internalSymbol].getSubject().isDragging = false; lastDimension = void 0; let currentDimension; if (self2.getOption("splitType") === TYPE_VERTICAL) { const topPanel = self2[startPanelElementSymbol]; currentDimension = topPanel.style.width; } else { const topPanel = self2[startPanelElementSymbol]; currentDimension = topPanel.style.height; } if (currentDimension === self2.getOption("dimension").initial) { self2.setDimension(self2.getOption("dimension").max); } else if (currentDimension === self2.getOption("dimension").max) { self2.setDimension(self2.getOption("dimension").min); } else if (currentDimension === self2.getOption("dimension").min) { self2.setDimension(self2.getOption("dimension").initial); } else { self2.setDimension(self2.getOption("dimension").initial); } }); } this[draggerElementSymbol].addEventListener("mousedown", () => { self2[internalSymbol].getSubject().isDragging = true; const eventListener = (e) => { e.preventDefault(); let draggerWidth = getComputedStyle( self2[draggerElementSymbol] ).getPropertyValue("--monster-dragger-width"); if (draggerWidth === "" || draggerWidth === void 0 || draggerWidth === null) { draggerWidth = "0"; } if (!self2[internalSymbol].getSubject().isDragging) { return; } if (self2.getOption("splitType") === TYPE_HORIZONTAL) { const containerOffsetTop = self2[splitScreenElementSymbol].offsetTop; const topPanel = self2[startPanelElementSymbol]; const bottomPanel = self2[endPanelElementSymbol]; let newTopHeight = e.clientY - containerOffsetTop; const min3 = this.getOption("dimension").min; const max3 = this.getOption("dimension").max; const topAsPercent = newTopHeight / this[splitScreenElementSymbol].offsetHeight * 100; if (parseInt(min3) > topAsPercent) { newTopHeight = min3; } else if (parseInt(max3) < topAsPercent) { newTopHeight = max3; } else { newTopHeight = topAsPercent + "%"; } const newTopHeightPx = parseInt(newTopHeight) / 100 * this[splitScreenElementSymbol].offsetHeight; topPanel.style.height = `${newTopHeightPx}px`; bottomPanel.style.height = `calc(100% - ${newTopHeightPx}px - ${draggerWidth})`; } else { const containerOffsetLeft = self2[splitScreenElementSymbol].offsetLeft; const leftPanel = self2[startPanelElementSymbol]; const rightPanel = self2[endPanelElementSymbol]; let newLeftWidth = e.clientX - containerOffsetLeft; const min3 = this.getOption("dimension").min; const max3 = this.getOption("dimension").max; const leftAsPercent = newLeftWidth / this[splitScreenElementSymbol].offsetWidth * 100; if (parseInt(min3) > leftAsPercent) { newLeftWidth = min3; } else if (parseInt(max3) < leftAsPercent) { newLeftWidth = max3; } else { newLeftWidth = leftAsPercent + "%"; } leftPanel.style.width = `${newLeftWidth}`; rightPanel.style.width = `calc(100% - ${newLeftWidth} - ${draggerWidth})`; } }; const dragEventHandler = (e) => { self2[internalSymbol].getSubject().isDragging = false; document.removeEventListener("mousemove", eventListener); document.removeEventListener("mouseup", eventListener); }; document.addEventListener("mousemove", eventListener); document.addEventListener("mouseup", dragEventHandler); }); this[internalSymbol].attachObserver( new Observer(() => { let apply2 = false; if (lastDimension !== this[internalSymbol].getSubject().currentDimension) { lastDimension = this[internalSymbol].getSubject().currentDimension; apply2 = true; } if (lastType !== this.getOption("splitType")) { lastType = this.getOption("splitType"); apply2 = true; } if (apply2) { applyPanelDimensions.call(this); } }) ); return this; } function getTemplate4() { return ` <div data-monster-role="split-panel" part="control"> <div data-monster-role="startPanel" class="panel" part="startPanel"> <slot name="start"></slot> </div> <div data-monster-role="dragger" part="dragger"> <div data-monster-role="handle" part="handle"></div> </div> <div data-monster-role="endPanel" class="panel" part="endPanel"> <slot name="end"></slot> </div> </div>`; } var splitScreenElementSymbol, draggerElementSymbol, startPanelElementSymbol, endPanelElementSymbol, handleElementSymbol, TYPE_VERTICAL, TYPE_HORIZONTAL, SplitPanel; var init_split_panel2 = __esm({ "source/components/layout/split-panel.mjs"() { init_customelement(); init_notify2(); init_events(); init_observer(); init_split_panel(); init_constants(); init_constants(); splitScreenElementSymbol = Symbol("splitScreenElement"); draggerElementSymbol = Symbol("draggerElement"); startPanelElementSymbol = Symbol("startPanelElement"); endPanelElementSymbol = Symbol("endPanelElement"); handleElementSymbol = Symbol("handleElement"); TYPE_VERTICAL = "vertical"; TYPE_HORIZONTAL = "horizontal"; SplitPanel = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/split-panel"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} splitType Split type (vertical or horizontal) * @property {string} dimension Dimension * @property {string} dimension.initial Initial dimension of the start panel * @property {string} dimension.max Maximum dimension of the start panel (in percentage) * @property {string} dimension.min Minimum dimension of the start panel (in percentage) */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate4() }, splitType: TYPE_VERTICAL, dimension: { initial: "60%", max: "80%", min: "20%" } }); } fullStartScreen() { this.setDimension("100%"); return this; } fullEndScreen() { this.setDimension("0%"); return this; } isFullStartScreen() { return this[internalSymbol].getSubject().currentDimension === "100%"; } isFullEndScreen() { return this[internalSymbol].getSubject().currentDimension === "0%"; } isInitialScreen() { return this[internalSymbol].getSubject().currentDimension === this.getOption("dimension").initial; } resetScreen() { this.setDimension(this.getOption("dimension").initial); return this; } setContent(html) { this.setOption("content", html); return this; } /** * * @return {Monster.Components.Host.Viewer} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences4.call(this); initEventHandler3.call(this); this.setDimension(this.getOption("dimension").initial); } /** * Check if the dimension is a percentage and within a valid range, then set the dimension option. * * @param {string} dimension - The dimension to be set, can be in percentage or absolute value. * @return {Object} - Returns the current object instance for chaining. */ setDimension(dimension) { if (dimension.includes("%")) { if (parseInt(dimension) > 100) { throw new Error("dimension must be less than 100%"); } else if (parseInt(dimension) < 0) { throw new Error("dimension must be greater than 0%"); } } this[internalSymbol].getSubject().currentDimension = dimension; return this; } /** * * @return {string} */ static getTag() { return "monster-split-panel"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [SplitPanelStyleSheet]; } }; registerCustomElement(SplitPanel); } }); // source/components/layout/stylesheet/panel.mjs var PanelStyleSheet; var init_panel = __esm({ "source/components/layout/stylesheet/panel.mjs"() { init_attributes(); init_constants2(); PanelStyleSheet = new CSSStyleSheet(); try { PanelStyleSheet.insertRule( ` @layer panel { :after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}.monster-theme-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-theme-primary-disabled-1{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1)}.monster-theme-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-theme-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-theme-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-theme-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-theme-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-theme-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-theme-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-border-color-1{border-color:var(--monster-color-border-1)}.monster-color-neutral-1{color:var(--monster-color-primary-1)}.monster-bg-color-primary-1{background-color:var(--monster-bg-color-primary-1)}.monster-bg-color-secondary-1{background-color:var(--monster-bg-color-secondary-1)}.monster-bg-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1)}.monster-color-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-color-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-color-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-color-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-color-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-color-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-color-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-theme-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-theme-primary-disabled-2{background-color:var(--monster-bg-color-primary-disabled-2);color:var(--monster-color-primary-disabled-2)}.monster-theme-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-theme-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-theme-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-theme-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-theme-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-theme-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-theme-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-border-color-2{border-color:var(--monster-color-border-2)}.monster-color-neutral-2{color:var(--monster-color-primary-2)}.monster-bg-color-primary-2{background-color:var(--monster-bg-color-primary-2)}.monster-bg-color-secondary-2{background-color:var(--monster-bg-color-secondary-2)}.monster-bg-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2)}.monster-color-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-color-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-color-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-color-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-color-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-color-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-color-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-theme-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-theme-primary-disabled-3{background-color:var(--monster-bg-color-primary-disabled-3);color:var(--monster-color-primary-disabled-3)}.monster-theme-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-theme-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-theme-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-theme-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-theme-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-theme-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-theme-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-border-color-3{border-color:var(--monster-color-border-3)}.monster-color-neutral-3{color:var(--monster-color-primary-3)}.monster-bg-color-primary-3{background-color:var(--monster-bg-color-primary-3)}.monster-bg-color-secondary-3{background-color:var(--monster-bg-color-secondary-3)}.monster-bg-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3)}.monster-color-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-color-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-color-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-color-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-color-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-color-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-color-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-theme-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-theme-primary-disabled-4{background-color:var(--monster-bg-color-primary-disabled-4);color:var(--monster-color-primary-disabled-4)}.monster-theme-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-theme-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-theme-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-theme-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-theme-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-theme-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-theme-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-border-color-4{border-color:var(--monster-color-border-4)}.monster-color-neutral-4{color:var(--monster-color-primary-4)}.monster-bg-color-primary-4{background-color:var(--monster-bg-color-primary-4)}.monster-bg-color-secondary-4{background-color:var(--monster-bg-color-secondary-4)}.monster-bg-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4)}.monster-color-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-color-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-color-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-color-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-color-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-color-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-color-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-theme-control-container-1,.monster-theme-control-row-1{border:1px solid var(--monster-theme-control-border-color)}.monster-theme-control-container-1,.monster-theme-control-element,.monster-theme-control-row-1{background-color:var(--monster-theme-control-bg-color);color:var(--monster-theme-control-color)}.monster-theme-control-background{background-color:var(--monster-theme-control-bg-color)}.monster-theme-background-inherit{background-color:inherit!important}.monster-theme-on{background-color:var(--monster-theme-on-bg-color);color:var(--monster-theme-on-color)}.monster-theme-off{background-color:var(--monster-theme-off-bg-color);color:var(--monster-theme-off-color)}div[data-monster-role=popper]{background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;padding:1.1em;z-index:var(--monster-z-index-modal)}[data-popper-arrow],[data-popper-arrow]:before{background:inherit;height:calc(max(var(--monster-popper-witharrrow-distance), -1*var(--monster-popper-witharrrow-distance))*2);position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1*var(--monster-popper-witharrrow-distance))*2)}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:before{box-sizing:border-box;content:"";transform:rotate(45deg);visibility:visible}div[data-popper-placement^=top]>[data-popper-arrow]{bottom:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width)/2)}div[data-popper-placement^=top]>[data-popper-arrow]:before{border-bottom:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-left:transparent;border-right:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-top:transparent}div[data-popper-placement^=bottom]>[data-popper-arrow]{top:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width))}div[data-popper-placement^=bottom]>[data-popper-arrow]:before{border-bottom:transparent;border-left:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-right:transparent;border-top:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4)}div[data-popper-placement^=left]>[data-popper-arrow]{right:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width))}div[data-popper-placement^=left]>[data-popper-arrow]:before{border-bottom:transparent;border-left:transparent;border-right:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-top:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4)}div[data-popper-placement^=right]>[data-popper-arrow]{left:calc(var(--monster-popper-witharrrow-distance) - var(--monster-border-width)/2)}div[data-popper-placement^=right]>[data-popper-arrow]:before{border-bottom:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-left:var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4);border-right:transparent;border-top:transparent}[data-monster-role=control]{width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}.monster-badge-primary{padding:.25em .4em}.monster-badge-primary,.monster-badge-primary-pill{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-primary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-secondary{padding:.25em .4em}.monster-badge-secondary,.monster-badge-secondary-pill{background-color:var(--monster-bg-color-secondary-3);border-radius:.25rem;color:var(--monster-color-secondary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-secondary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-tertiary{padding:.25em .4em}.monster-badge-tertiary,.monster-badge-tertiary-pill{background-color:var(--monster-bg-color-tertiary-3);border-radius:.25rem;color:var(--monster-color-tertiary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-tertiary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-destructive{padding:.25em .4em}.monster-badge-destructive,.monster-badge-destructive-pill{background-color:var(--monster-bg-color-destructive-1);border-radius:.25rem;color:var(--monster-color-destructive-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-destructive-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-success{padding:.25em .4em}.monster-badge-success,.monster-badge-success-pill{background-color:var(--monster-bg-color-success-1);border-radius:.25rem;color:var(--monster-color-success-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-success-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-warning{padding:.25em .4em}.monster-badge-warning,.monster-badge-warning-pill{background-color:var(--monster-bg-color-warning-1);border-radius:.25rem;color:var(--monster-color-warning-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-warning-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-error{padding:.25em .4em}.monster-badge-error,.monster-badge-error-pill{background-color:var(--monster-bg-color-error-1);border-radius:.25rem;color:var(--monster-color-error-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-error-pill{border-radius:10rem;padding:.25em .6em}:host{box-sizing:border-box;display:block;height:-webkit-fill-available;height:fill-available;height:-moz-available;height:stretch;overflow:auto;width:100%}[data-monster-role=control]{border:0;box-sizing:border-box;height:-webkit-fill-available;height:fill-available;height:-moz-available;height:stretch;margin:0;outline:none;overflow:auto;padding:0;scrollbar-color:var(--monster-color-primary-1) var(--monster-bg-color-primary-1);scrollbar-width:thin;//position:fixed;//top:0;//left:0;//right:0;//bottom:0;//overflow:auto;//box-sizing:border-box} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/layout/panel.mjs var panel_exports = {}; __export(panel_exports, { Panel: () => Panel }); function calcHeight() { this.style.boxSizing = "border-box"; const height = calculateMaximumHeight.call(this, this); if (height < 0) { return; } this.style.height = `${height}px`; } function calculateMaximumHeight(element) { let totalBottomBorder = 0; let totalBottomPadding = 0; let totalBottomMargin = 0; let totalOutlineHeight = 0; let totalBoxShadowHeight = 0; let currentElement = element; const distanceFromTop = element.getBoundingClientRect().top; while (currentElement && currentElement !== document.body) { const style = window.getComputedStyle(currentElement); const boxSizing = style.boxSizing; const borderBottomWidth = parseFloat(style.borderBottomWidth); const paddingBottom = parseFloat(style.paddingBottom); const marginBottom = parseFloat(style.marginBottom); const outlineHeight = parseFloat(style.outlineWidth); const boxShadowVertical = parseFloat(style.boxShadow.split(" ")[3] || 0); totalBottomBorder += isNaN(borderBottomWidth) ? 0 : borderBottomWidth; totalBottomPadding += isNaN(paddingBottom) || boxSizing === "border-box" ? 0 : paddingBottom; totalBottomMargin += isNaN(marginBottom) ? 0 : marginBottom; totalOutlineHeight += isNaN(outlineHeight) ? 0 : outlineHeight; totalBoxShadowHeight += isNaN(boxShadowVertical) ? 0 : boxShadowVertical; currentElement = currentElement.parentNode || currentElement.host; } const maximumHeight = window.innerHeight - distanceFromTop - totalBottomBorder - totalBottomPadding - totalBottomMargin - totalOutlineHeight - totalBoxShadowHeight; return maximumHeight + this.getOption("heightAdjustment"); } function attachResizeObserver2() { this[resizeObserverSymbol2] = new ResizeObserver(() => { if (this[timerCallbackSymbol2] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol2].touch(); return; } catch (e) { delete this[timerCallbackSymbol2]; } } this[timerCallbackSymbol2] = new DeadMansSwitch(200, () => { calcHeight.call(this); }); }); this[resizeObserverSymbol2].observe(this.ownerDocument.body); this[resizeObserverSymbol2].observe(document.scrollingElement); } function disconnectResizeObserver() { if (this[resizeObserverSymbol2] instanceof ResizeObserver) { this[resizeObserverSymbol2].disconnect(); } } function initControlReferences5() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[PanelElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=control]" ); } function initEventHandler4() { return this; } function getTemplate5() { return ` <div data-monster-role="control" part="control"> <slot></slot> </div>`; } var PanelElementSymbol, resizeObserverSymbol2, timerCallbackSymbol2, Panel; var init_panel2 = __esm({ "source/components/layout/panel.mjs"() { init_customelement(); init_deadmansswitch(); init_panel(); init_constants(); PanelElementSymbol = Symbol("PanelElement"); resizeObserverSymbol2 = Symbol("resizeObserver"); timerCallbackSymbol2 = Symbol("timerCallback"); Panel = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/panel"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} heightAdjustment Height adjustment */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate5() }, heightAdjustment: 4 }); } /** * * @return {Monster.Components.Host.Viewer} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences5.call(this); initEventHandler4.call(this); calcHeight.call(this); } /** * This method is called by the dom and should not be called directly. * * @return {void} */ connectedCallback() { super.connectedCallback(); attachResizeObserver2.call(this); if (this.parentNode && this.parentNode instanceof HTMLElement) { this.parentNode.style.overflow = "hidden"; } } /** * This method is called by the dom and should not be called directly. * * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); disconnectResizeObserver.call(this); } /** * @return {string} */ static getTag() { return "monster-panel"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [PanelStyleSheet]; } }; registerCustomElement(Panel); } }); // source/components/form/reload.mjs var reload_exports = {}; __export(reload_exports, { Reload: () => Reload }); function initOptionsFromArguments() { const options2 = {}; const url = this.getAttribute(ATTRIBUTE_FORM_URL); if (isString(url)) { options2["url"] = new URL(url, document.location).toString(); } if (this.hasAttribute(ATTRIBUTE_FORM_RELOAD)) { options2["reload"] = this.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase(); } return options2; } function initIntersectionObserver() { if (this[intersectionObserverWasInitialized] === true) { return; } this[intersectionObserverWasInitialized] = true; const options2 = { threshold: [0.5] }; const callback = (entries, observer2) => { for (const [, entry] of entries.entries()) { if (entry.isIntersecting === true) { if (this.getOption("reload") === "onshow") { observer2.disconnect(); } try { loadContent2.call(this).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString()); }); } catch (e) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString()); } } } }; const observer = new IntersectionObserver(callback, options2); observer.observe(this); } function loadContent2() { const url = this.getOption("url", void 0); if (!isString(url) || url === "") { throw new Error("missing url"); } const options2 = this.getOption("fetch", {}); let parentNode = this; if (this.shadowRoot) { parentNode = this.shadowRoot; } let container = parentNode.querySelector(`[${ATTRIBUTE_ROLE}=container]`); let currentDisplayMode = container?.style?.display; if (currentDisplayMode === void 0) { currentDisplayMode = "inherit"; } if (!(container instanceof HTMLElement)) { container = document.createElement("div"); container.style.display = "none"; container.setAttribute(ATTRIBUTE_ROLE, "container"); parentNode.appendChild(container); } return loadAndAssignContent(container, url, options2, this.getOption("filter")).then(() => { if (currentDisplayMode !== void 0) { container.style.display = currentDisplayMode; } }).catch((e) => { throw e; }); } function getTemplate6() { return this.innerHTML; } var intersectionObserverWasInitialized, Reload; var init_reload = __esm({ "source/components/form/reload.mjs"() { init_constants(); init_attributes(); init_constants2(); init_customelement(); init_is(); init_constants3(); init_fetch(); init_error(); intersectionObserverWasInitialized = Symbol("wasInitialized"); Reload = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/form/reload"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} url=undefined * @property {string} reload=undefined currently the values defined are `onshow` and `always`. The default `onshow` removes the IntersectionObserver. This means that the content is only loaded once. reloading of the content does not occur. * @property {string} filter=undefined dom selectors to search for elements, if undefined then everything is taken * @property {Object[]} processors * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) * @property {String} fetch.redirect=error * @property {String} fetch.method=GET * @property {String} fetch.mode=same-origin * @property {String} fetch.credentials=same-origin * @property {Object} fetch.headers={"accept":"text/html"}} */ get defaults() { return Object.assign( {}, super.defaults, { templates: { main: getTemplate6.call(this) }, shadowMode: null, url: null, reload: "onshow", filter: null, fetch: { redirect: "error", method: "GET", mode: "same-origin", credentials: "same-origin", headers: { accept: "text/html" } } }, initOptionsFromArguments.call(this) ); } /** * This method determines which attributes are to be monitored by `attributeChangedCallback()`. * * @return {string[]} */ static get observedAttributes() { const list = super.observedAttributes; list.push(ATTRIBUTE_FORM_URL); return list; } /** * @return {void} */ [initMethodSymbol]() { super[initMethodSymbol](); this[attributeObserverSymbol][ATTRIBUTE_FORM_URL] = (url) => { if (this.hasAttribute(ATTRIBUTE_FORM_URL)) { this.setOption("url", new URL(url, document.location).toString()); } else { this.setOption("url", void 0); } }; } /** * This method is called internal and should not be called directly. * @throws {Error} missing default slot * @throws {Error} no shadow-root is defined * @throws {Error} missing url * @throws {Error} we won't be able to read the data * @throws {Error} request failed * @throws {Error} not found * @throws {Error} undefined status or type * @fires monster-fetched * @return {Monster.Components.Form.Form} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initIntersectionObserver.call(this); } /** * This method is called internal and should not be called directly. * * @return {string} */ static getTag() { return "monster-reload"; } /** * load content from url * * It is important to know that with this function the loading is executed * directly. it is loaded as well when the element is not visible. * * @param {string|undefined} url */ fetch(url) { if (isString(url) || url instanceof URL) { this.setAttribute(ATTRIBUTE_FORM_URL, `${url}`); } return loadContent2.call(this); } }; registerCustomElement(Reload); } }); // source/dom/customcontrol.mjs var customcontrol_exports = {}; __export(customcontrol_exports, { CustomControl: () => CustomControl }); function getInternal() { if (!(attachedInternalSymbol in this)) { throw new Error( "ElementInternals is not supported and a polyfill is necessary" ); } return this[attachedInternalSymbol]; } function initObserver() { this[attributeObserverSymbol]["value"] = () => { this.setOption("value", this.getAttribute("value")); }; } var attachedInternalSymbol, CustomControl; var init_customcontrol = __esm({ "source/dom/customcontrol.mjs"() { init_extend(); init_attributes(); init_constants2(); init_customelement(); init_constants(); attachedInternalSymbol = Symbol("attachedInternal"); CustomControl = class extends CustomElement { /** * The constructor method of CustomControl, which is called when creating a new instance. * It checks whether the element supports `attachInternals()` and initializes an internal form-associated element * if supported. Additionally, it initializes a MutationObserver to watch for attribute changes. * * See the links below for more information: * {@link https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-define|CustomElementRegistry.define()} * {@link https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-get|CustomElementRegistry.get()} * and {@link https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals|ElementInternals} * * @inheritdoc * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ constructor() { super(); if (typeof this["attachInternals"] === "function") { this[attachedInternalSymbol] = this.attachInternals(); } else { throw Error( "the ElementInternals is not supported and a polyfill is necessary" ); } initObserver.call(this); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/custom-control@@instance"); } /** * This method determines which attributes are to be monitored by `attributeChangedCallback()`. * * @return {string[]} * @since 1.15.0 */ static get observedAttributes() { return super.observedAttributes; } /** * Adding a static `formAssociated` property, with a true value, makes an autonomous custom element a form-associated custom element. * * @see [attachInternals()]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals} * @see [Custom Elements Face Example]{@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-face-example} * @return {boolean} */ static formAssociated = true; /** * @inheritdoc **/ get defaults() { return extend({}, super.defaults); } /** * Must be overridden by a derived class and return the value of the control. * * This is a method of [internal API](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals), which is a part of the web standard for custom elements. * * @throws {Error} the value getter must be overwritten by the derived class */ get value() { throw Error("the value getter must be overwritten by the derived class"); } /** * Must be overridden by a derived class and set the value of the control. * * This is a method of [internal API](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals), which is a part of the web standard for custom elements. * * @param {*} value The value to set. * @throws {Error} the value setter must be overwritten by the derived class */ set value(value) { throw Error("the value setter must be overwritten by the derived class"); } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {NodeList} * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/labels} * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ get labels() { return getInternal.call(this)?.labels; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {string|null} */ get name() { return this.getAttribute("name"); } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {string} */ get type() { return this.constructor.getTag(); } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {ValidityState} * @throws {Error} the ElementInternals is not supported and a polyfill is necessary * @see [ValidityState]{@link https://developer.mozilla.org/en-US/docs/Web/API/ValidityState} * @see [validity]{@link https://developer.mozilla.org/en-US/docs/Web/API/validity} */ get validity() { return getInternal.call(this)?.validity; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {string} * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/validationMessage * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ get validationMessage() { return getInternal.call(this)?.validationMessage; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {boolean} * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/willValidate * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ get willValidate() { return getInternal.call(this)?.willValidate; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {boolean} * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/states * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ get states() { return getInternal.call(this)?.states; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {HTMLFontElement|null} * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/form * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ get form() { return getInternal.call(this)?.form; } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * ``` * // Use the control's name as the base name for submitted data * const n = this.getAttribute('name'); * const entries = new FormData(); * entries.append(n + '-first-name', this.firstName_); * entries.append(n + '-last-name', this.lastName_); * this.setFormValue(entries); * ``` * * @param {File|string|FormData} value * @param {File|string|FormData} state * @return {undefined} * @throws {DOMException} NotSupportedError * @throws {Error} the ElementInternals is not supported and a polyfill is necessary * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/setFormValue */ setFormValue(value, state) { getInternal.call(this).setFormValue(value, state); } /** * * @param {object} flags * @param {string|undefined} message * @param {HTMLElement} anchor * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/setValidity * @return {undefined} * @throws {DOMException} NotSupportedError * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ setValidity(flags, message, anchor) { getInternal.call(this).setValidity(flags, message, anchor); } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/checkValidity * @return {boolean} * @throws {DOMException} NotSupportedError * @throws {Error} the ElementInternals is not supported and a polyfill is necessary */ checkValidity() { return getInternal.call(this)?.checkValidity(); } /** * This is a method of [internal api](https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals) * * @return {boolean} * @see https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals/reportValidity * @throws {Error} the ElementInternals is not supported and a polyfill is necessary * @throws {DOMException} NotSupportedError */ reportValidity() { return getInternal.call(this)?.reportValidity(); } /** * Sets the `form` attribute of the custom control to the `id` of the passed form element. * If no form element is passed, removes the `form` attribute. * * @param {HTMLFormElement} form - The form element to associate with the control */ formAssociatedCallback(form) { if (form) { if (form.id) { this.setAttribute("form", form.id); } } else { this.removeAttribute("form"); } } /** * Sets or removes the `disabled` attribute of the custom control based on the passed value. * * @param {boolean} disabled - Whether or not the control should be disabled */ formDisabledCallback(disabled) { if (disabled) { if (!this.hasAttribute("disabled")) { this.setAttribute("disabled", ""); } } else { if (this.hasAttribute("disabled")) { this.removeAttribute("disabled"); } } } /** * @param {string} state * @param {string} mode */ formStateRestoreCallback(state, mode) { } /** * */ formResetCallback() { this.value = ""; } }; } }); // source/components/form/stylesheet/button.mjs var ButtonStyleSheet; var init_button = __esm({ "source/components/form/stylesheet/button.mjs"() { init_attributes(); init_constants2(); ButtonStyleSheet = new CSSStyleSheet(); try { ButtonStyleSheet.insertRule( ` @layer button { [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}.monster-button-primary,button{align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-primary{background-color:var(--monster-bg-color-primary-4);border-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-button-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-secondary-4)}.monster-button-secondary,.monster-button-tertiary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-tertiary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-tertiary-4);border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-tertiary-4)}.monster-button-outline-primary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-primary-4);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-primary-4)}.monster-button-outline-primary,.monster-button-outline-secondary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-outline-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-secondary-4)}.monster-button-outline-tertiary{align-items:center;background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-tertiary-4);background-position:50%;border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);color:var(--monster-bg-color-tertiary-4);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}button:active,button:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}button:active{z-index:var(--monster-z-index-outline)}.monster-button-bar,.monster-button-group{align-content:center;align-items:stretch;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.monster-button-group{box-sizing:border-box;gap:0;margin:1rem 0}.monster-button-group>:not(:last-child){margin-right:calc(var(--monster-border-width)*-1)}.monster-button-group :hover{box-shadow:none}button:focus{outline:1px dashed var(--monster-color-selection-4);outline-offset:2px;z-index:var(--monster-z-index-outline)}@media (prefers-color-scheme:light){button:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:2px;z-index:var(--monster-z-index-outline)}}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}:host(monster-button){display:flex}[data-monster-role=control]{align-items:stretch;display:flex}button{min-width:-moz-max-content;min-width:max-content;width:100%} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/stylesheet/ripple.mjs var RippleStyleSheet; var init_ripple = __esm({ "source/components/stylesheet/ripple.mjs"() { init_attributes(); init_constants2(); RippleStyleSheet = new CSSStyleSheet(); try { RippleStyleSheet.insertRule( ` @layer ripple { span.monster-fx-ripple{animation:monster-fx-ripple .6s linear;background-color:hsla(0,0%,100%,.7);border-radius:50%;position:absolute;transform:scale(0)}@keyframes monster-fx-ripple{to{opacity:0;transform:scale(4)}} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/button.mjs var button_exports = {}; __export(button_exports, { Button: () => Button, buttonElementSymbol: () => buttonElementSymbol }); function initEventHandler5() { const self2 = this; const button = this[buttonElementSymbol]; const type3 = "click"; button.addEventListener(type3, function(event) { const callback = self2.getOption("actions.click"); fireCustomEvent(self2, "monster-button-clicked", { button: self2 }); if (!isFunction(callback)) { return; } const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "control" ); if (!(element instanceof Node && self2.hasNode(element))) { return; } callback.call(self2, event); }); if (self2.getOption("effects.ripple")) { button.addEventListener("click", createRipple.bind(self2)); } self2[attributeObserverSymbol][ATTRIBUTE_BUTTON_CLASS] = function(value) { self2.setOption("classes.button", value); }; return this; } function initControlReferences6() { this[buttonElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=button]` ); } function getTemplate7() { return ` <div data-monster-role="control" part="control"> <button data-monster-attributes="disabled path:disabled | if:true, class path:classes.button type path:type" data-monster-role="button" part="button" data-monster-replace="path:labels.button"></button> </div>`; } function createRipple(event) { const button = this[buttonElementSymbol]; const circle = document.createElement("span"); const diameter = Math.max(button.clientWidth, button.clientHeight); const radius = diameter / 2; circle.style.width = circle.style.height = `${diameter}px`; circle.style.left = `${event.clientX - button.offsetLeft - radius}px`; circle.style.top = `${event.clientY - button.offsetTop - radius}px`; circle.classList.add("monster-fx-ripple"); const ripples = button.getElementsByClassName("monster-fx-ripple"); for (const ripple of ripples) { ripple.remove(); } button.appendChild(circle); } var buttonElementSymbol, Button; var init_button2 = __esm({ "source/components/form/button.mjs"() { init_constants(); init_attributes(); init_constants2(); init_customcontrol(); init_customelement(); init_events(); init_is(); init_constants3(); init_button(); init_ripple(); init_events(); init_error(); buttonElementSymbol = Symbol("buttonElement"); Button = class extends CustomControl { /** * This method is called by the <code>instanceof</code> operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/form/button@@instance"); } /** * * @return {Button} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences6.call(this); initEventHandler5.call(this); return this; } /** * The <code>Button.click()</code> method simulates a click on the internal button element. * * @since 3.27.0 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click} */ click() { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol] && isFunction(this[buttonElementSymbol].click)) { this[buttonElementSymbol].click(); } } /** * The Button.focus() method sets focus on the internal button element. * * @since 3.27.0 * @param {Object} options * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus} */ focus(options2) { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol] && isFunction(this[buttonElementSymbol].focus)) { this[buttonElementSymbol].focus(options2); } } /** * The Button.blur() method removes focus from the internal button element. */ blur() { if (this[buttonElementSymbol] && isFunction(this[buttonElementSymbol].blur)) { this[buttonElementSymbol].blur(); } } /** * This method determines which attributes are to be monitored by `attributeChangedCallback()`. * * @return {string[]} */ static get observedAttributes() { const attributes = super.observedAttributes; attributes.push(ATTRIBUTE_BUTTON_CLASS); return attributes; } /** * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals} * @return {boolean} */ static get formAssociated() { return true; } /** * The current value of the button. * * ```javascript * e = document.querySelector('monster-button'); * console.log(e.value) * ``` * * @return {string} The value of the button */ get value() { return this.getOption("value"); } /** * Set the value of the button. * * ```javascript * e = document.querySelector('monster-button'); * e.value=1 * ``` * * @param {string} value * @return {void} * @throws {Error} unsupported type */ set value(value) { this.setOption("value", value); try { this?.setFormValue(this.value); } catch (e) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); } } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} labels Labels * @property {string} labels.button="<slot></slot>" Button label * @property {Object} actions Callbacks * @property {string} actions.click="throw Error" Callback when clicked * @property {Object} classes CSS classes * @property {string} classes.button="monster-button-primary" CSS class for the button * @property {boolean} disabled=false Disabled state * @property {Object} effects Effects * @property {boolean} effects.ripple=true Ripple effect * @property {string} type="button" The default behavior of the button. Possible values are: submit, reset, button */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate7() }, labels: { button: "<slot></slot>" }, classes: { button: "monster-button-primary" }, disabled: false, actions: { click: () => { } }, effects: { ripple: true }, value: null, type: "button" }); } /** * * @return {string} */ static getTag() { return "monster-button"; } /** * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [RippleStyleSheet, ButtonStyleSheet]; } }; registerCustomElement(Button); } }); // source/components/form/stylesheet/state-button.mjs var StateButtonStyleSheet; var init_state_button = __esm({ "source/components/form/stylesheet/state-button.mjs"() { init_attributes(); init_constants2(); StateButtonStyleSheet = new CSSStyleSheet(); try { StateButtonStyleSheet.insertRule( ` @layer statebutton { [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}:after,:before,:root{--monster-color-gray-1:#f6f6f6;--monster-color-gray-2:#e2e2e2;--monster-color-gray-3:#8b8b8b;--monster-color-gray-4:#6f6f6f;--monster-color-gray-5:#3e3e3e;--monster-color-gray-6:#222;--monster-color-rose-1:#fff7f9;--monster-color-rose-2:#ffdce5;--monster-color-rose-3:#ff3b8d;--monster-color-rose-4:#db0072;--monster-color-rose-5:#800040;--monster-color-rose-6:#4c0023;--monster-color-raspberry-1:#fff8f8;--monster-color-raspberry-2:#ffdddf;--monster-color-raspberry-3:#ff426c;--monster-color-raspberry-4:#de0051;--monster-color-raspberry-5:#82002c;--monster-color-raspberry-6:#510018;--monster-color-red-1:#fff8f6;--monster-color-red-2:#ffddd8;--monster-color-red-3:#ff4647;--monster-color-red-4:#e0002b;--monster-color-red-5:#830014;--monster-color-red-6:#530003;--monster-color-orange-1:#fff8f5;--monster-color-orange-2:#ffded1;--monster-color-orange-3:#fd4d00;--monster-color-orange-4:#cd3c00;--monster-color-orange-5:#752100;--monster-color-orange-6:#401600;--monster-color-cinnamon-1:#fff8f3;--monster-color-cinnamon-2:#ffdfc6;--monster-color-cinnamon-3:#d57300;--monster-color-cinnamon-4:#ac5c00;--monster-color-cinnamon-5:#633300;--monster-color-cinnamon-6:#371d00;--monster-color-amber-1:#fff8ef;--monster-color-amber-2:#ffe0b2;--monster-color-amber-3:#b98300;--monster-color-amber-4:#926700;--monster-color-amber-5:#523800;--monster-color-amber-6:#302100;--monster-color-yellow-1:#fff9e5;--monster-color-yellow-2:#ffe53e;--monster-color-yellow-3:#9c8b00;--monster-color-yellow-4:#7d6f00;--monster-color-yellow-5:#463d00;--monster-color-yellow-6:#292300;--monster-color-lime-1:#f7ffac;--monster-color-lime-2:#d5f200;--monster-color-lime-3:#819300;--monster-color-lime-4:#677600;--monster-color-lime-5:#394100;--monster-color-lime-6:#222600;--monster-color-chartreuse-1:#e5ffc3;--monster-color-chartreuse-2:#98fb00;--monster-color-chartreuse-3:#5c9b00;--monster-color-chartreuse-4:#497c00;--monster-color-chartreuse-5:#264500;--monster-color-chartreuse-6:#182600;--monster-color-green-1:#e0ffd9;--monster-color-green-2:#72ff6c;--monster-color-green-3:#00a21f;--monster-color-green-4:#008217;--monster-color-green-5:#004908;--monster-color-green-6:#062800;--monster-color-emerald-1:#dcffe6;--monster-color-emerald-2:#5dffa2;--monster-color-emerald-3:#00a05a;--monster-color-emerald-4:#008147;--monster-color-emerald-5:#004825;--monster-color-emerald-6:#002812;--monster-color-aquamarine-1:#daffef;--monster-color-aquamarine-2:#42ffc6;--monster-color-aquamarine-3:#009f78;--monster-color-aquamarine-4:#007f5f;--monster-color-aquamarine-5:#004734;--monster-color-aquamarine-6:#00281b;--monster-color-teal-1:#d7fff7;--monster-color-teal-2:#00ffe4;--monster-color-teal-3:#009e8c;--monster-color-teal-4:#007c6e;--monster-color-teal-5:#00443c;--monster-color-teal-6:#002722;--monster-color-cyan-1:#c4fffe;--monster-color-cyan-2:#00fafb;--monster-color-cyan-3:#00999a;--monster-color-cyan-4:#007a7b;--monster-color-cyan-5:#004344;--monster-color-cyan-6:#002525;--monster-color-powder-1:#dafaff;--monster-color-powder-2:#8df0ff;--monster-color-powder-3:#0098a9;--monster-color-powder-4:#007987;--monster-color-powder-5:#004048;--monster-color-powder-6:#002227;--monster-color-sky-1:#e3f7ff;--monster-color-sky-2:#aee9ff;--monster-color-sky-3:#0094b4;--monster-color-sky-4:#007590;--monster-color-sky-5:#00404f;--monster-color-sky-6:#001f28;--monster-color-cerulean-1:#e8f6ff;--monster-color-cerulean-2:#b9e3ff;--monster-color-cerulean-3:#0092c5;--monster-color-cerulean-4:#00749d;--monster-color-cerulean-5:#003c54;--monster-color-cerulean-6:#001d2a;--monster-color-azure-1:#e8f2ff;--monster-color-azure-2:#c6e0ff;--monster-color-azure-3:#008fdb;--monster-color-azure-4:#0071af;--monster-color-azure-5:#003b5e;--monster-color-azure-6:#001c30;--monster-color-blue-1:#f0f4ff;--monster-color-blue-2:#d4e0ff;--monster-color-blue-3:#0089fc;--monster-color-blue-4:#006dca;--monster-color-blue-5:#00386d;--monster-color-blue-6:#001a39;--monster-color-indigo-1:#f3f3ff;--monster-color-indigo-2:#deddff;--monster-color-indigo-3:#657eff;--monster-color-indigo-4:#0061fc;--monster-color-indigo-5:#00328a;--monster-color-indigo-6:#001649;--monster-color-violet-1:#f7f1ff;--monster-color-violet-2:#e8daff;--monster-color-violet-3:#9b70ff;--monster-color-violet-4:#794aff;--monster-color-violet-5:#2d0fbf;--monster-color-violet-6:#0b0074;--monster-color-purple-1:#fdf4ff;--monster-color-purple-2:#f7d9ff;--monster-color-purple-3:#d150ff;--monster-color-purple-4:#b01fe3;--monster-color-purple-5:#660087;--monster-color-purple-6:#3a004f;--monster-color-magenta-1:#fff3fc;--monster-color-magenta-2:#ffd7f6;--monster-color-magenta-3:#f911e0;--monster-color-magenta-4:#ca00b6;--monster-color-magenta-5:#740068;--monster-color-magenta-6:#44003c;--monster-color-pink-1:#fff7fb;--monster-color-pink-2:#ffdcec;--monster-color-pink-3:#ff2fb2;--monster-color-pink-4:#d2008f;--monster-color-pink-5:#790051;--monster-color-pink-6:#4b0030;--monster-gradient-tangerine-1:#e5b875;--monster-gradient-tangerine-2:#d9a362;--monster-gradient-tangerine-3:#c08a4e;--monster-gradient-tangerine-4:#a7713b;--monster-gradient-tangerine-5:#8f5a28;--monster-gradient-tangerine-6:#360505;--monster-color-seashell-1:#f7f5ef;--monster-color-seashell-2:#e5e2d9;--monster-color-seashell-3:#cbc6b3;--monster-color-seashell-4:#a19d8a;--monster-color-seashell-5:#7a7566;--monster-color-seashell-6:#514d3f}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}div[data-monster-role=control]{height:100%}button{min-width:-moz-max-content;min-width:max-content;width:100%}[data-monster-role=button]{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;transition:width 10s ease-in-out}div[data-monster-role=label]{align-items:center;display:flex;gap:.4rem;justify-content:center;width:100%}[data-monster-role=state]{align-content:center;align-items:center;align-self:stretch;display:flex;transition:width 12s ease-in-out}[data-monster-role=state]>img,[data-monster-role=state]>svg{margin-left:.3em}[data-monster-role=state]>svg.successful{animation:bouncy .5s linear forwards;color:var(--monster-color-successful)}[data-monster-role=state]>svg.activity{animation:bouncy .5s linear forwards;color:var(--monster-color-activity)}[data-monster-role=state]>svg.failed{animation:bouncy .5s linear forwards;color:var(--monster-color-failed)}[data-monster-role=state]>svg.activity{animation-duration:1s;animation-iteration-count:infinite;animation-name:activity;animation-timing-function:cubic-bezier(0,0,.2,1)}[data-monster-role=state].stateless{display:none}@keyframes activity{0%{transform:scale(1)}50%{transform:scale(.1)}to{transform:scale(1)}}@keyframes bouncy{0%{opacity:0;transform:scale(.1)}80%{opacity:1;transform:scale(1.15)}90%{transform:scale(.9)}to{transform:scale(1)}} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/types/state.mjs function getStateInstanceFor(state) { switch (state) { case "stateless": return new State("stateless", ""); case "successful": return new State( "successful", '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="successful" viewBox="0 0 16 16"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/><path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z"/></svg>' ); case "activity": return new State( "activity", '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="activity" viewBox="0 0 16 16"><circle cx="8" cy="8" r="8"/></svg>' ); case "failed": return new State( "failed", '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="failed" viewBox="0 0 16 16"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/><path d="M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995z"/></svg>' ); default: return new State(state, ""); } } var internalSymbol2, State; var init_state = __esm({ "source/components/form/types/state.mjs"() { init_base(); init_validate(); internalSymbol2 = Symbol("internalSymbol"); State = class _State extends Base { /** * * @param {string} state * @param {string} presentation * @throws {TypeError} value is not a string */ constructor(state, presentation) { super(); this[internalSymbol2] = {}; this[internalSymbol2].state = validateString(state); this[internalSymbol2].presentation = validateString(presentation); } /** * @property {String} state */ get state() { return this[internalSymbol2].state; } /** * @property {String} presentation */ get presentation() { return this[internalSymbol2].presentation; } /** * @return {Monster.Components.Form.Types.State} */ getClone() { return new _State( this[internalSymbol2].state, this[internalSymbol2].presentation ); } }; } }); // source/components/form/state-button.mjs var state_button_exports = {}; __export(state_button_exports, { StateButton: () => StateButton }); function getTemplate8() { return `<div data-monster-role="control" part="control"> <button data-monster-attributes="disabled path:disabled | if:true, class path:classes.button" data-monster-role="button" part="button"> <div data-monster-role="label" data-monster-replace="path:labels.button"></div> <div data-monster-role="state" data-monster-attributes="class path:current.state" data-monster-replace="path:current.presentation"></div> </button> </div>`; } var StateButton; var init_state_button2 = __esm({ "source/components/form/state-button.mjs"() { init_constants(); init_customelement(); init_is(); init_validate(); init_button2(); init_state_button(); init_state(); StateButton = class extends Button { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/components/form/state-button@@instance" ); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} states Available status * @property {Monster.Components.Form.Types.State} states.successful= successful * @property {Monster.Components.Form.Types.State} states.activity= activity * @property {Monster.Components.Form.Types.State} states.failed= failed * @property {Monster.Components.Form.Types.State} current current status * @property {Monster.Components.Form~exampleActionCallback} actions.click * @extends {Button} * @see {@link https://github.com/twbs/icons/blob/main/LICENSE.md|Bootstrap icons license} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate8() }, states: { successful: getStateInstanceFor("successful"), activity: getStateInstanceFor("activity"), failed: getStateInstanceFor("failed") }, current: getStateInstanceFor("stateless") }); } /** * This method sets the current state of the button. * If a timeout is set, the state is automatically removed after the * specified time. * * @since 3.18.0 a previously set timeout is cleared * * @param {string} state * @param {number} timeout * @return {Monster.Components.Form.StateButton} * @throws {TypeError} value is not a string * @throws {TypeError} value is not an instance */ setState(state, timeout) { const timeoutSymbol = Symbol.for("timeout"); if (this[timeoutSymbol] !== void 0) { clearTimeout(this[timeoutSymbol]); delete this[timeoutSymbol]; } const obj = this.getOption(`states.${validateString(state)}`); if (obj === void 0) { throw new Error("not found"); } this.setOption("current", validateInstance(obj, State)); if (isInteger(timeout) && timeout > 0) { this[timeoutSymbol] = setTimeout(() => { this.removeState(); delete this[timeoutSymbol]; }, timeout); } return this; } /** * * @return {Monster.Components.Form.StateButton} */ removeState() { this.setOption("current", getStateInstanceFor("stateless")); return this; } /** * @return {Monster.Components.Form.Types.State|undefined} */ getState() { return this.getOption("current"); } /** * * @return {string} */ static getTag() { return "monster-state-button"; } /** * * @return {Array<CSSStyleSheet>} */ static getCSSStyleSheet() { const styles2 = Button.getCSSStyleSheet(); styles2.push(StateButtonStyleSheet); return styles2; } }; registerCustomElement(StateButton); } }); // source/data/buildmap.mjs function buildMap(subject, selector, valueTemplate, keyTemplate, filter) { return assembleParts(subject, selector, filter, function(v, k, m) { k = build(v, keyTemplate, k); v = build(v, valueTemplate); this.set(k, v); }); } function assembleParts(subject, selector, filter, callback) { const result = /* @__PURE__ */ new Map(); let map; if (isFunction(selector)) { map = selector(subject); if (!(map instanceof Map)) { throw new TypeError("the selector callback must return a map"); } } else if (isString(selector)) { map = /* @__PURE__ */ new Map(); buildFlatMap.call(map, subject, selector); } else { throw new TypeError("selector is neither a string nor a function"); } if (!(map instanceof Map)) { return result; } map.forEach((v, k, m) => { if (isFunction(filter)) { if (filter.call(m, v, k) !== true) return; } callback.call(result, v, k, m); }); return result; } function buildFlatMap(subject, selector, key, parentMap) { const currentMap = /* @__PURE__ */ new Map(); const resultLength = this.size; if (key === void 0) key = []; const parts = selector.split(DELIMITER); let current = ""; const currentPath = []; do { current = parts.shift(); currentPath.push(current); if (current === WILDCARD) { const finder = new Pathfinder(subject); let map; try { map = finder.getVia(currentPath.join(DELIMITER)); } catch (e) { const a2 = e; map = /* @__PURE__ */ new Map(); } for (const [k, o] of map) { const copyKey = clone(key); currentPath.map((a2) => { copyKey.push(a2 === WILDCARD ? k : a2); }); const kk = copyKey.join(DELIMITER); const sub = buildFlatMap.call( this, o, parts.join(DELIMITER), copyKey, o ); if (isObject(sub) && parentMap !== void 0) { sub[PARENT] = parentMap; } currentMap.set(kk, sub); } } } while (parts.length > 0); if (resultLength === this.size) { for (const [k, o] of currentMap) { this.set(k, o); } } return subject; } function build(subject, definition, defaultValue) { if (definition === void 0) return defaultValue ? defaultValue : subject; validateString(definition); const regexp = /(?<placeholder>\${(?<path>[a-z\^A-Z.\-_0-9]*)})/gm; const array = [...definition.matchAll(regexp)]; const finder = new Pathfinder(subject); if (array.length === 0) { return finder.getVia(definition); } array.forEach((a2) => { const groups = a2?.["groups"]; const placeholder = groups?.["placeholder"]; if (placeholder === void 0) return; const path = groups?.["path"]; let v = finder.getVia(path); if (v === void 0) v = defaultValue; definition = definition.replaceAll(placeholder, v); }); return definition; } var PARENT; var init_buildmap = __esm({ "source/data/buildmap.mjs"() { init_is(); init_validate(); init_clone(); init_pathfinder(); PARENT = "^"; } }); // node_modules/.pnpm/@floating-ui+utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs function clamp(start2, value, end2) { return max2(start2, min2(value, end2)); } function evaluate(value, param) { return typeof value === "function" ? value(param) : value; } function getSide(placement) { return placement.split("-")[0]; } function getAlignment(placement) { return placement.split("-")[1]; } function getOppositeAxis(axis) { return axis === "x" ? "y" : "x"; } function getAxisLength(axis) { return axis === "y" ? "height" : "width"; } function getSideAxis(placement) { return ["top", "bottom"].includes(getSide(placement)) ? "y" : "x"; } function getAlignmentAxis(placement) { return getOppositeAxis(getSideAxis(placement)); } function getAlignmentSides(placement, rects, rtl) { if (rtl === void 0) { rtl = false; } const alignment = getAlignment(placement); const alignmentAxis = getAlignmentAxis(placement); const length = getAxisLength(alignmentAxis); let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; if (rects.reference[length] > rects.floating[length]) { mainAlignmentSide = getOppositePlacement2(mainAlignmentSide); } return [mainAlignmentSide, getOppositePlacement2(mainAlignmentSide)]; } function getExpandedPlacements(placement) { const oppositePlacement = getOppositePlacement2(placement); return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; } function getOppositeAlignmentPlacement(placement) { return placement.replace(/start|end/g, (alignment) => oppositeAlignmentMap[alignment]); } function getSideList(side, isStart, rtl) { const lr = ["left", "right"]; const rl = ["right", "left"]; const tb = ["top", "bottom"]; const bt = ["bottom", "top"]; switch (side) { case "top": case "bottom": if (rtl) return isStart ? rl : lr; return isStart ? lr : rl; case "left": case "right": return isStart ? tb : bt; default: return []; } } function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { const alignment = getAlignment(placement); let list = getSideList(getSide(placement), direction === "start", rtl); if (alignment) { list = list.map((side) => side + "-" + alignment); if (flipAlignment) { list = list.concat(list.map(getOppositeAlignmentPlacement)); } } return list; } function getOppositePlacement2(placement) { return placement.replace(/left|right|bottom|top/g, (side) => oppositeSideMap[side]); } function expandPaddingObject(padding) { return { top: 0, right: 0, bottom: 0, left: 0, ...padding }; } function getPaddingObject(padding) { return typeof padding !== "number" ? expandPaddingObject(padding) : { top: padding, right: padding, bottom: padding, left: padding }; } function rectToClientRect2(rect) { const { x, y, width, height } = rect; return { width, height, top: y, left: x, right: x + width, bottom: y + height, x, y }; } var sides, alignments, placements2, min2, max2, round2, floor, createCoords, oppositeSideMap, oppositeAlignmentMap; var init_floating_ui_utils = __esm({ "node_modules/.pnpm/@floating-ui+utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs"() { sides = ["top", "right", "bottom", "left"]; alignments = ["start", "end"]; placements2 = /* @__PURE__ */ sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []); min2 = Math.min; max2 = Math.max; round2 = Math.round; floor = Math.floor; createCoords = (v) => ({ x: v, y: v }); oppositeSideMap = { left: "right", right: "left", bottom: "top", top: "bottom" }; oppositeAlignmentMap = { start: "end", end: "start" }; } }); // node_modules/.pnpm/@floating-ui+core@1.6.9/node_modules/@floating-ui/core/dist/floating-ui.core.mjs function computeCoordsFromPlacement(_ref, placement, rtl) { let { reference: reference2, floating } = _ref; const sideAxis = getSideAxis(placement); const alignmentAxis = getAlignmentAxis(placement); const alignLength = getAxisLength(alignmentAxis); const side = getSide(placement); const isVertical = sideAxis === "y"; const commonX = reference2.x + reference2.width / 2 - floating.width / 2; const commonY = reference2.y + reference2.height / 2 - floating.height / 2; const commonAlign = reference2[alignLength] / 2 - floating[alignLength] / 2; let coords; switch (side) { case "top": coords = { x: commonX, y: reference2.y - floating.height }; break; case "bottom": coords = { x: commonX, y: reference2.y + reference2.height }; break; case "right": coords = { x: reference2.x + reference2.width, y: commonY }; break; case "left": coords = { x: reference2.x - floating.width, y: commonY }; break; default: coords = { x: reference2.x, y: reference2.y }; } switch (getAlignment(placement)) { case "start": coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); break; case "end": coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); break; } return coords; } async function detectOverflow2(state, options2) { var _await$platform$isEle; if (options2 === void 0) { options2 = {}; } const { x, y, platform: platform2, rects, elements, strategy } = state; const { boundary = "clippingAncestors", rootBoundary = "viewport", elementContext = "floating", altBoundary = false, padding = 0 } = evaluate(options2, state); const paddingObject = getPaddingObject(padding); const altContext = elementContext === "floating" ? "reference" : "floating"; const element = elements[altBoundary ? altContext : elementContext]; const clippingClientRect = rectToClientRect2(await platform2.getClippingRect({ element: ((_await$platform$isEle = await (platform2.isElement == null ? void 0 : platform2.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform2.getDocumentElement == null ? void 0 : platform2.getDocumentElement(elements.floating)), boundary, rootBoundary, strategy })); const rect = elementContext === "floating" ? { x, y, width: rects.floating.width, height: rects.floating.height } : rects.reference; const offsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(elements.floating)); const offsetScale = await (platform2.isElement == null ? void 0 : platform2.isElement(offsetParent)) ? await (platform2.getScale == null ? void 0 : platform2.getScale(offsetParent)) || { x: 1, y: 1 } : { x: 1, y: 1 }; const elementClientRect = rectToClientRect2(platform2.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform2.convertOffsetParentRelativeRectToViewportRelativeRect({ elements, rect, offsetParent, strategy }) : rect); return { top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x }; } function getPlacementList(alignment, autoAlignment, allowedPlacements) { const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter((placement) => getAlignment(placement) === alignment), ...allowedPlacements.filter((placement) => getAlignment(placement) !== alignment)] : allowedPlacements.filter((placement) => getSide(placement) === placement); return allowedPlacementsSortedByAlignment.filter((placement) => { if (alignment) { return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false); } return true; }); } async function convertValueToCoords(state, options2) { const { placement, platform: platform2, elements } = state; const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); const side = getSide(placement); const alignment = getAlignment(placement); const isVertical = getSideAxis(placement) === "y"; const mainAxisMulti = ["left", "top"].includes(side) ? -1 : 1; const crossAxisMulti = rtl && isVertical ? -1 : 1; const rawValue = evaluate(options2, state); let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === "number" ? { mainAxis: rawValue, crossAxis: 0, alignmentAxis: null } : { mainAxis: rawValue.mainAxis || 0, crossAxis: rawValue.crossAxis || 0, alignmentAxis: rawValue.alignmentAxis }; if (alignment && typeof alignmentAxis === "number") { crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; } return isVertical ? { x: crossAxis * crossAxisMulti, y: mainAxis * mainAxisMulti } : { x: mainAxis * mainAxisMulti, y: crossAxis * crossAxisMulti }; } var computePosition, arrow2, autoPlacement, flip2, offset2, shift, size; var init_floating_ui_core = __esm({ "node_modules/.pnpm/@floating-ui+core@1.6.9/node_modules/@floating-ui/core/dist/floating-ui.core.mjs"() { init_floating_ui_utils(); init_floating_ui_utils(); computePosition = async (reference2, floating, config2) => { const { placement = "bottom", strategy = "absolute", middleware = [], platform: platform2 } = config2; const validMiddleware = middleware.filter(Boolean); const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(floating)); let rects = await platform2.getElementRects({ reference: reference2, floating, strategy }); let { x, y } = computeCoordsFromPlacement(rects, placement, rtl); let statefulPlacement = placement; let middlewareData = {}; let resetCount = 0; for (let i = 0; i < validMiddleware.length; i++) { const { name, fn: fn2 } = validMiddleware[i]; const { x: nextX, y: nextY, data, reset } = await fn2({ x, y, initialPlacement: placement, placement: statefulPlacement, strategy, middlewareData, rects, platform: platform2, elements: { reference: reference2, floating } }); x = nextX != null ? nextX : x; y = nextY != null ? nextY : y; middlewareData = { ...middlewareData, [name]: { ...middlewareData[name], ...data } }; if (reset && resetCount <= 50) { resetCount++; if (typeof reset === "object") { if (reset.placement) { statefulPlacement = reset.placement; } if (reset.rects) { rects = reset.rects === true ? await platform2.getElementRects({ reference: reference2, floating, strategy }) : reset.rects; } ({ x, y } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); } i = -1; } } return { x, y, placement: statefulPlacement, strategy, middlewareData }; }; arrow2 = (options2) => ({ name: "arrow", options: options2, async fn(state) { const { x, y, placement, rects, platform: platform2, elements, middlewareData } = state; const { element, padding = 0 } = evaluate(options2, state) || {}; if (element == null) { return {}; } const paddingObject = getPaddingObject(padding); const coords = { x, y }; const axis = getAlignmentAxis(placement); const length = getAxisLength(axis); const arrowDimensions = await platform2.getDimensions(element); const isYAxis = axis === "y"; const minProp = isYAxis ? "top" : "left"; const maxProp = isYAxis ? "bottom" : "right"; const clientProp = isYAxis ? "clientHeight" : "clientWidth"; const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; const startDiff = coords[axis] - rects.reference[axis]; const arrowOffsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(element)); let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; if (!clientSize || !await (platform2.isElement == null ? void 0 : platform2.isElement(arrowOffsetParent))) { clientSize = elements.floating[clientProp] || rects.floating[length]; } const centerToReference = endDiff / 2 - startDiff / 2; const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; const minPadding = min2(paddingObject[minProp], largestPossiblePadding); const maxPadding = min2(paddingObject[maxProp], largestPossiblePadding); const min$1 = minPadding; const max3 = clientSize - arrowDimensions[length] - maxPadding; const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; const offset4 = clamp(min$1, center, max3); const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset4 && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max3 : 0; return { [axis]: coords[axis] + alignmentOffset, data: { [axis]: offset4, centerOffset: center - offset4 - alignmentOffset, ...shouldAddOffset && { alignmentOffset } }, reset: shouldAddOffset }; } }); autoPlacement = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "autoPlacement", options: options2, async fn(state) { var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE; const { rects, middlewareData, placement, platform: platform2, elements } = state; const { crossAxis = false, alignment, allowedPlacements = placements2, autoAlignment = true, ...detectOverflowOptions } = evaluate(options2, state); const placements$1 = alignment !== void 0 || allowedPlacements === placements2 ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements; const overflow = await detectOverflow2(state, detectOverflowOptions); const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0; const currentPlacement = placements$1[currentIndex]; if (currentPlacement == null) { return {}; } const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating))); if (placement !== currentPlacement) { return { reset: { placement: placements$1[0] } }; } const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]]; const allOverflows = [...((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || [], { placement: currentPlacement, overflows: currentOverflows }]; const nextPlacement = placements$1[currentIndex + 1]; if (nextPlacement) { return { data: { index: currentIndex + 1, overflows: allOverflows }, reset: { placement: nextPlacement } }; } const placementsSortedByMostSpace = allOverflows.map((d) => { const alignment2 = getAlignment(d.placement); return [d.placement, alignment2 && crossAxis ? ( // Check along the mainAxis and main crossAxis side. d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) ) : ( // Check only the mainAxis. d.overflows[0] ), d.overflows]; }).sort((a2, b) => a2[1] - b[1]); const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter((d) => d[2].slice( 0, // Aligned placements should not check their opposite crossAxis // side. getAlignment(d[0]) ? 2 : 3 ).every((v) => v <= 0)); const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0]; if (resetPlacement !== placement) { return { data: { index: currentIndex + 1, overflows: allOverflows }, reset: { placement: resetPlacement } }; } return {}; } }; }; flip2 = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "flip", options: options2, async fn(state) { var _middlewareData$arrow, _middlewareData$flip; const { placement, middlewareData, rects, initialPlacement, platform: platform2, elements } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = "bestFit", fallbackAxisSideDirection = "none", flipAlignment = true, ...detectOverflowOptions } = evaluate(options2, state); if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } const side = getSide(placement); const initialSideAxis = getSideAxis(initialPlacement); const isBasePlacement = getSide(initialPlacement) === initialPlacement; const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement2(initialPlacement)] : getExpandedPlacements(initialPlacement)); const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); } const placements3 = [initialPlacement, ...fallbackPlacements]; const overflow = await detectOverflow2(state, detectOverflowOptions); const overflows = []; let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; if (checkMainAxis) { overflows.push(overflow[side]); } if (checkCrossAxis) { const sides2 = getAlignmentSides(placement, rects, rtl); overflows.push(overflow[sides2[0]], overflow[sides2[1]]); } overflowsData = [...overflowsData, { placement, overflows }]; if (!overflows.every((side2) => side2 <= 0)) { var _middlewareData$flip2, _overflowsData$filter; const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; const nextPlacement = placements3[nextIndex]; if (nextPlacement) { return { data: { index: nextIndex, overflows: overflowsData }, reset: { placement: nextPlacement } }; } let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a2, b) => a2.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; if (!resetPlacement) { switch (fallbackStrategy) { case "bestFit": { var _overflowsData$filter2; const placement2 = (_overflowsData$filter2 = overflowsData.filter((d) => { if (hasFallbackAxisSideDirection) { const currentSideAxis = getSideAxis(d.placement); return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal // reading directions favoring greater width. currentSideAxis === "y"; } return true; }).map((d) => [d.placement, d.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a2, b) => a2[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; if (placement2) { resetPlacement = placement2; } break; } case "initialPlacement": resetPlacement = initialPlacement; break; } } if (placement !== resetPlacement) { return { reset: { placement: resetPlacement } }; } } return {}; } }; }; offset2 = function(options2) { if (options2 === void 0) { options2 = 0; } return { name: "offset", options: options2, async fn(state) { var _middlewareData$offse, _middlewareData$arrow; const { x, y, placement, middlewareData } = state; const diffCoords = await convertValueToCoords(state, options2); if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } return { x: x + diffCoords.x, y: y + diffCoords.y, data: { ...diffCoords, placement } }; } }; }; shift = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "shift", options: options2, async fn(state) { const { x, y, placement } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { fn: (_ref) => { let { x: x2, y: y2 } = _ref; return { x: x2, y: y2 }; } }, ...detectOverflowOptions } = evaluate(options2, state); const coords = { x, y }; const overflow = await detectOverflow2(state, detectOverflowOptions); const crossAxis = getSideAxis(getSide(placement)); const mainAxis = getOppositeAxis(crossAxis); let mainAxisCoord = coords[mainAxis]; let crossAxisCoord = coords[crossAxis]; if (checkMainAxis) { const minSide = mainAxis === "y" ? "top" : "left"; const maxSide = mainAxis === "y" ? "bottom" : "right"; const min3 = mainAxisCoord + overflow[minSide]; const max3 = mainAxisCoord - overflow[maxSide]; mainAxisCoord = clamp(min3, mainAxisCoord, max3); } if (checkCrossAxis) { const minSide = crossAxis === "y" ? "top" : "left"; const maxSide = crossAxis === "y" ? "bottom" : "right"; const min3 = crossAxisCoord + overflow[minSide]; const max3 = crossAxisCoord - overflow[maxSide]; crossAxisCoord = clamp(min3, crossAxisCoord, max3); } const limitedCoords = limiter.fn({ ...state, [mainAxis]: mainAxisCoord, [crossAxis]: crossAxisCoord }); return { ...limitedCoords, data: { x: limitedCoords.x - x, y: limitedCoords.y - y, enabled: { [mainAxis]: checkMainAxis, [crossAxis]: checkCrossAxis } } }; } }; }; size = function(options2) { if (options2 === void 0) { options2 = {}; } return { name: "size", options: options2, async fn(state) { var _state$middlewareData, _state$middlewareData2; const { placement, rects, platform: platform2, elements } = state; const { apply: apply2 = () => { }, ...detectOverflowOptions } = evaluate(options2, state); const overflow = await detectOverflow2(state, detectOverflowOptions); const side = getSide(placement); const alignment = getAlignment(placement); const isYAxis = getSideAxis(placement) === "y"; const { width, height } = rects.floating; let heightSide; let widthSide; if (side === "top" || side === "bottom") { heightSide = side; widthSide = alignment === (await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right"; } else { widthSide = side; heightSide = alignment === "end" ? "top" : "bottom"; } const maximumClippingHeight = height - overflow.top - overflow.bottom; const maximumClippingWidth = width - overflow.left - overflow.right; const overflowAvailableHeight = min2(height - overflow[heightSide], maximumClippingHeight); const overflowAvailableWidth = min2(width - overflow[widthSide], maximumClippingWidth); const noShift = !state.middlewareData.shift; let availableHeight = overflowAvailableHeight; let availableWidth = overflowAvailableWidth; if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { availableWidth = maximumClippingWidth; } if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { availableHeight = maximumClippingHeight; } if (noShift && !alignment) { const xMin = max2(overflow.left, 0); const xMax = max2(overflow.right, 0); const yMin = max2(overflow.top, 0); const yMax = max2(overflow.bottom, 0); if (isYAxis) { availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max2(overflow.left, overflow.right)); } else { availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max2(overflow.top, overflow.bottom)); } } await apply2({ ...state, availableWidth, availableHeight }); const nextDimensions = await platform2.getDimensions(elements.floating); if (width !== nextDimensions.width || height !== nextDimensions.height) { return { reset: { rects: true } }; } return {}; } }; }; } }); // node_modules/.pnpm/@floating-ui+utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs function hasWindow() { return typeof window !== "undefined"; } function getNodeName2(node) { if (isNode2(node)) { return (node.nodeName || "").toLowerCase(); } return "#document"; } function getWindow3(node) { var _node$ownerDocument; return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; } function getDocumentElement2(node) { var _ref; return (_ref = (isNode2(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; } function isNode2(value) { if (!hasWindow()) { return false; } return value instanceof Node || value instanceof getWindow3(value).Node; } function isElement2(value) { if (!hasWindow()) { return false; } return value instanceof Element || value instanceof getWindow3(value).Element; } function isHTMLElement2(value) { if (!hasWindow()) { return false; } return value instanceof HTMLElement || value instanceof getWindow3(value).HTMLElement; } function isShadowRoot2(value) { if (!hasWindow() || typeof ShadowRoot === "undefined") { return false; } return value instanceof ShadowRoot || value instanceof getWindow3(value).ShadowRoot; } function isOverflowElement(element) { const { overflow, overflowX, overflowY, display } = getComputedStyle3(element); return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !["inline", "contents"].includes(display); } function isTableElement2(element) { return ["table", "td", "th"].includes(getNodeName2(element)); } function isTopLayer(element) { return [":popover-open", ":modal"].some((selector) => { try { return element.matches(selector); } catch (e) { return false; } }); } function isContainingBlock(elementOrCss) { const webkit = isWebKit(); const css = isElement2(elementOrCss) ? getComputedStyle3(elementOrCss) : elementOrCss; return ["transform", "translate", "scale", "rotate", "perspective"].some((value) => css[value] ? css[value] !== "none" : false) || (css.containerType ? css.containerType !== "normal" : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== "none" : false) || !webkit && (css.filter ? css.filter !== "none" : false) || ["transform", "translate", "scale", "rotate", "perspective", "filter"].some((value) => (css.willChange || "").includes(value)) || ["paint", "layout", "strict", "content"].some((value) => (css.contain || "").includes(value)); } function getContainingBlock2(element) { let currentNode = getParentNode2(element); while (isHTMLElement2(currentNode) && !isLastTraversableNode(currentNode)) { if (isContainingBlock(currentNode)) { return currentNode; } else if (isTopLayer(currentNode)) { return null; } currentNode = getParentNode2(currentNode); } return null; } function isWebKit() { if (typeof CSS === "undefined" || !CSS.supports) return false; return CSS.supports("-webkit-backdrop-filter", "none"); } function isLastTraversableNode(node) { return ["html", "body", "#document"].includes(getNodeName2(node)); } function getComputedStyle3(element) { return getWindow3(element).getComputedStyle(element); } function getNodeScroll2(element) { if (isElement2(element)) { return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; } return { scrollLeft: element.scrollX, scrollTop: element.scrollY }; } function getParentNode2(node) { if (getNodeName2(node) === "html") { return node; } const result = ( // Step into the shadow DOM of the parent of a slotted node. node.assignedSlot || // DOM Element detected. node.parentNode || // ShadowRoot detected. isShadowRoot2(node) && node.host || // Fallback. getDocumentElement2(node) ); return isShadowRoot2(result) ? result.host : result; } function getNearestOverflowAncestor(node) { const parentNode = getParentNode2(node); if (isLastTraversableNode(parentNode)) { return node.ownerDocument ? node.ownerDocument.body : node.body; } if (isHTMLElement2(parentNode) && isOverflowElement(parentNode)) { return parentNode; } return getNearestOverflowAncestor(parentNode); } function getOverflowAncestors(node, list, traverseIframes) { var _node$ownerDocument2; if (list === void 0) { list = []; } if (traverseIframes === void 0) { traverseIframes = true; } const scrollableAncestor = getNearestOverflowAncestor(node); const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); const win = getWindow3(scrollableAncestor); if (isBody) { const frameElement = getFrameElement(win); return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); } return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); } function getFrameElement(win) { return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; } var init_floating_ui_utils_dom = __esm({ "node_modules/.pnpm/@floating-ui+utils@0.2.9/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs"() { } }); // node_modules/.pnpm/@floating-ui+dom@1.6.13/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs function getCssDimensions(element) { const css = getComputedStyle3(element); let width = parseFloat(css.width) || 0; let height = parseFloat(css.height) || 0; const hasOffset = isHTMLElement2(element); const offsetWidth = hasOffset ? element.offsetWidth : width; const offsetHeight = hasOffset ? element.offsetHeight : height; const shouldFallback = round2(width) !== offsetWidth || round2(height) !== offsetHeight; if (shouldFallback) { width = offsetWidth; height = offsetHeight; } return { width, height, $: shouldFallback }; } function unwrapElement(element) { return !isElement2(element) ? element.contextElement : element; } function getScale(element) { const domElement = unwrapElement(element); if (!isHTMLElement2(domElement)) { return createCoords(1); } const rect = domElement.getBoundingClientRect(); const { width, height, $ } = getCssDimensions(domElement); let x = ($ ? round2(rect.width) : rect.width) / width; let y = ($ ? round2(rect.height) : rect.height) / height; if (!x || !Number.isFinite(x)) { x = 1; } if (!y || !Number.isFinite(y)) { y = 1; } return { x, y }; } function getVisualOffsets(element) { const win = getWindow3(element); if (!isWebKit() || !win.visualViewport) { return noOffsets; } return { x: win.visualViewport.offsetLeft, y: win.visualViewport.offsetTop }; } function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { if (isFixed === void 0) { isFixed = false; } if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow3(element)) { return false; } return isFixed; } function getBoundingClientRect2(element, includeScale, isFixedStrategy, offsetParent) { if (includeScale === void 0) { includeScale = false; } if (isFixedStrategy === void 0) { isFixedStrategy = false; } const clientRect = element.getBoundingClientRect(); const domElement = unwrapElement(element); let scale = createCoords(1); if (includeScale) { if (offsetParent) { if (isElement2(offsetParent)) { scale = getScale(offsetParent); } } else { scale = getScale(element); } } const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); let x = (clientRect.left + visualOffsets.x) / scale.x; let y = (clientRect.top + visualOffsets.y) / scale.y; let width = clientRect.width / scale.x; let height = clientRect.height / scale.y; if (domElement) { const win = getWindow3(domElement); const offsetWin = offsetParent && isElement2(offsetParent) ? getWindow3(offsetParent) : offsetParent; let currentWin = win; let currentIFrame = getFrameElement(currentWin); while (currentIFrame && offsetParent && offsetWin !== currentWin) { const iframeScale = getScale(currentIFrame); const iframeRect = currentIFrame.getBoundingClientRect(); const css = getComputedStyle3(currentIFrame); const left2 = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; const top2 = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; x *= iframeScale.x; y *= iframeScale.y; width *= iframeScale.x; height *= iframeScale.y; x += left2; y += top2; currentWin = getWindow3(currentIFrame); currentIFrame = getFrameElement(currentWin); } } return rectToClientRect2({ width, height, x, y }); } function getWindowScrollBarX2(element, rect) { const leftScroll = getNodeScroll2(element).scrollLeft; if (!rect) { return getBoundingClientRect2(getDocumentElement2(element)).left + leftScroll; } return rect.left + leftScroll; } function getHTMLOffset(documentElement, scroll, ignoreScrollbarX) { if (ignoreScrollbarX === void 0) { ignoreScrollbarX = false; } const htmlRect = documentElement.getBoundingClientRect(); const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 : ( // RTL <body> scrollbar. getWindowScrollBarX2(documentElement, htmlRect) )); const y = htmlRect.top + scroll.scrollTop; return { x, y }; } function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { let { elements, rect, offsetParent, strategy } = _ref; const isFixed = strategy === "fixed"; const documentElement = getDocumentElement2(offsetParent); const topLayer = elements ? isTopLayer(elements.floating) : false; if (offsetParent === documentElement || topLayer && isFixed) { return rect; } let scroll = { scrollLeft: 0, scrollTop: 0 }; let scale = createCoords(1); const offsets = createCoords(0); const isOffsetParentAnElement = isHTMLElement2(offsetParent); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName2(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll2(offsetParent); } if (isHTMLElement2(offsetParent)) { const offsetRect = getBoundingClientRect2(offsetParent); scale = getScale(offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0); return { width: rect.width * scale.x, height: rect.height * scale.y, x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y }; } function getClientRects(element) { return Array.from(element.getClientRects()); } function getDocumentRect2(element) { const html = getDocumentElement2(element); const scroll = getNodeScroll2(element); const body = element.ownerDocument.body; const width = max2(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); const height = max2(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); let x = -scroll.scrollLeft + getWindowScrollBarX2(element); const y = -scroll.scrollTop; if (getComputedStyle3(body).direction === "rtl") { x += max2(html.clientWidth, body.clientWidth) - width; } return { width, height, x, y }; } function getViewportRect2(element, strategy) { const win = getWindow3(element); const html = getDocumentElement2(element); const visualViewport = win.visualViewport; let width = html.clientWidth; let height = html.clientHeight; let x = 0; let y = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; const visualViewportBased = isWebKit(); if (!visualViewportBased || visualViewportBased && strategy === "fixed") { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width, height, x, y }; } function getInnerBoundingClientRect2(element, strategy) { const clientRect = getBoundingClientRect2(element, true, strategy === "fixed"); const top2 = clientRect.top + element.clientTop; const left2 = clientRect.left + element.clientLeft; const scale = isHTMLElement2(element) ? getScale(element) : createCoords(1); const width = element.clientWidth * scale.x; const height = element.clientHeight * scale.y; const x = left2 * scale.x; const y = top2 * scale.y; return { width, height, x, y }; } function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { let rect; if (clippingAncestor === "viewport") { rect = getViewportRect2(element, strategy); } else if (clippingAncestor === "document") { rect = getDocumentRect2(getDocumentElement2(element)); } else if (isElement2(clippingAncestor)) { rect = getInnerBoundingClientRect2(clippingAncestor, strategy); } else { const visualOffsets = getVisualOffsets(element); rect = { x: clippingAncestor.x - visualOffsets.x, y: clippingAncestor.y - visualOffsets.y, width: clippingAncestor.width, height: clippingAncestor.height }; } return rectToClientRect2(rect); } function hasFixedPositionAncestor(element, stopNode) { const parentNode = getParentNode2(element); if (parentNode === stopNode || !isElement2(parentNode) || isLastTraversableNode(parentNode)) { return false; } return getComputedStyle3(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); } function getClippingElementAncestors(element, cache) { const cachedResult = cache.get(element); if (cachedResult) { return cachedResult; } let result = getOverflowAncestors(element, [], false).filter((el) => isElement2(el) && getNodeName2(el) !== "body"); let currentContainingBlockComputedStyle = null; const elementIsFixed = getComputedStyle3(element).position === "fixed"; let currentNode = elementIsFixed ? getParentNode2(element) : element; while (isElement2(currentNode) && !isLastTraversableNode(currentNode)) { const computedStyle = getComputedStyle3(currentNode); const currentNodeIsContaining = isContainingBlock(currentNode); if (!currentNodeIsContaining && computedStyle.position === "fixed") { currentContainingBlockComputedStyle = null; } const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && ["absolute", "fixed"].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); if (shouldDropCurrentNode) { result = result.filter((ancestor) => ancestor !== currentNode); } else { currentContainingBlockComputedStyle = computedStyle; } currentNode = getParentNode2(currentNode); } cache.set(element, result); return result; } function getClippingRect2(_ref) { let { element, boundary, rootBoundary, strategy } = _ref; const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); const clippingAncestors = [...elementClippingAncestors, rootBoundary]; const firstClippingAncestor = clippingAncestors[0]; const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); accRect.top = max2(rect.top, accRect.top); accRect.right = min2(rect.right, accRect.right); accRect.bottom = min2(rect.bottom, accRect.bottom); accRect.left = max2(rect.left, accRect.left); return accRect; }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); return { width: clippingRect.right - clippingRect.left, height: clippingRect.bottom - clippingRect.top, x: clippingRect.left, y: clippingRect.top }; } function getDimensions(element) { const { width, height } = getCssDimensions(element); return { width, height }; } function getRectRelativeToOffsetParent(element, offsetParent, strategy) { const isOffsetParentAnElement = isHTMLElement2(offsetParent); const documentElement = getDocumentElement2(offsetParent); const isFixed = strategy === "fixed"; const rect = getBoundingClientRect2(element, true, isFixed, offsetParent); let scroll = { scrollLeft: 0, scrollTop: 0 }; const offsets = createCoords(0); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName2(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll2(offsetParent); } if (isOffsetParentAnElement) { const offsetRect = getBoundingClientRect2(offsetParent, true, isFixed, offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX2(documentElement); } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; return { x, y, width: rect.width, height: rect.height }; } function isStaticPositioned(element) { return getComputedStyle3(element).position === "static"; } function getTrueOffsetParent2(element, polyfill) { if (!isHTMLElement2(element) || getComputedStyle3(element).position === "fixed") { return null; } if (polyfill) { return polyfill(element); } let rawOffsetParent = element.offsetParent; if (getDocumentElement2(element) === rawOffsetParent) { rawOffsetParent = rawOffsetParent.ownerDocument.body; } return rawOffsetParent; } function getOffsetParent2(element, polyfill) { const win = getWindow3(element); if (isTopLayer(element)) { return win; } if (!isHTMLElement2(element)) { let svgOffsetParent = getParentNode2(element); while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { if (isElement2(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { return svgOffsetParent; } svgOffsetParent = getParentNode2(svgOffsetParent); } return win; } let offsetParent = getTrueOffsetParent2(element, polyfill); while (offsetParent && isTableElement2(offsetParent) && isStaticPositioned(offsetParent)) { offsetParent = getTrueOffsetParent2(offsetParent, polyfill); } if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { return win; } return offsetParent || getContainingBlock2(element) || win; } function isRTL(element) { return getComputedStyle3(element).direction === "rtl"; } function rectsAreEqual(a2, b) { return a2.x === b.x && a2.y === b.y && a2.width === b.width && a2.height === b.height; } function observeMove(element, onMove) { let io = null; let timeoutId; const root = getDocumentElement2(element); function cleanup() { var _io; clearTimeout(timeoutId); (_io = io) == null || _io.disconnect(); io = null; } function refresh(skip, threshold) { if (skip === void 0) { skip = false; } if (threshold === void 0) { threshold = 1; } cleanup(); const elementRectForRootMargin = element.getBoundingClientRect(); const { left: left2, top: top2, width, height } = elementRectForRootMargin; if (!skip) { onMove(); } if (!width || !height) { return; } const insetTop = floor(top2); const insetRight = floor(root.clientWidth - (left2 + width)); const insetBottom = floor(root.clientHeight - (top2 + height)); const insetLeft = floor(left2); const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; const options2 = { rootMargin, threshold: max2(0, min2(1, threshold)) || 1 }; let isFirstUpdate = true; function handleObserve(entries) { const ratio = entries[0].intersectionRatio; if (ratio !== threshold) { if (!isFirstUpdate) { return refresh(); } if (!ratio) { timeoutId = setTimeout(() => { refresh(false, 1e-7); }, 1e3); } else { refresh(false, ratio); } } if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { refresh(); } isFirstUpdate = false; } try { io = new IntersectionObserver(handleObserve, { ...options2, // Handle <iframe>s root: root.ownerDocument }); } catch (e) { io = new IntersectionObserver(handleObserve, options2); } io.observe(element); } refresh(true); return cleanup; } function autoUpdate(reference2, floating, update, options2) { if (options2 === void 0) { options2 = {}; } const { ancestorScroll = true, ancestorResize = true, elementResize = typeof ResizeObserver === "function", layoutShift = typeof IntersectionObserver === "function", animationFrame = false } = options2; const referenceEl = unwrapElement(reference2); const ancestors = ancestorScroll || ancestorResize ? [...referenceEl ? getOverflowAncestors(referenceEl) : [], ...getOverflowAncestors(floating)] : []; ancestors.forEach((ancestor) => { ancestorScroll && ancestor.addEventListener("scroll", update, { passive: true }); ancestorResize && ancestor.addEventListener("resize", update); }); const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null; let reobserveFrame = -1; let resizeObserver = null; if (elementResize) { resizeObserver = new ResizeObserver((_ref) => { let [firstEntry] = _ref; if (firstEntry && firstEntry.target === referenceEl && resizeObserver) { resizeObserver.unobserve(floating); cancelAnimationFrame(reobserveFrame); reobserveFrame = requestAnimationFrame(() => { var _resizeObserver; (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating); }); } update(); }); if (referenceEl && !animationFrame) { resizeObserver.observe(referenceEl); } resizeObserver.observe(floating); } let frameId; let prevRefRect = animationFrame ? getBoundingClientRect2(reference2) : null; if (animationFrame) { frameLoop(); } function frameLoop() { const nextRefRect = getBoundingClientRect2(reference2); if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) { update(); } prevRefRect = nextRefRect; frameId = requestAnimationFrame(frameLoop); } update(); return () => { var _resizeObserver2; ancestors.forEach((ancestor) => { ancestorScroll && ancestor.removeEventListener("scroll", update); ancestorResize && ancestor.removeEventListener("resize", update); }); cleanupIo == null || cleanupIo(); (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect(); resizeObserver = null; if (animationFrame) { cancelAnimationFrame(frameId); } }; } var noOffsets, getElementRects, platform, detectOverflow3, offset3, autoPlacement2, shift2, flip3, size2, arrow3, computePosition2; var init_floating_ui_dom = __esm({ "node_modules/.pnpm/@floating-ui+dom@1.6.13/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs"() { init_floating_ui_core(); init_floating_ui_utils(); init_floating_ui_utils_dom(); noOffsets = /* @__PURE__ */ createCoords(0); getElementRects = async function(data) { const getOffsetParentFn = this.getOffsetParent || getOffsetParent2; const getDimensionsFn = this.getDimensions; const floatingDimensions = await getDimensionsFn(data.floating); return { reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), floating: { x: 0, y: 0, width: floatingDimensions.width, height: floatingDimensions.height } }; }; platform = { convertOffsetParentRelativeRectToViewportRelativeRect, getDocumentElement: getDocumentElement2, getClippingRect: getClippingRect2, getOffsetParent: getOffsetParent2, getElementRects, getClientRects, getDimensions, getScale, isElement: isElement2, isRTL }; detectOverflow3 = detectOverflow2; offset3 = offset2; autoPlacement2 = autoPlacement; shift2 = shift; flip3 = flip2; size2 = size; arrow3 = arrow2; computePosition2 = (reference2, floating, options2) => { const cache = /* @__PURE__ */ new Map(); const mergedOptions = { platform, ...options2 }; const platformWithCache = { ...mergedOptions.platform, _c: cache }; return computePosition(reference2, floating, { ...mergedOptions, platform: platformWithCache }); }; } }); // source/components/form/util/floating-ui.mjs function positionPopper(controlElement, popperElement, options2) { const body = getDocument().body; return new Processing(() => { const arrowElement = controlElement.querySelector( "[data-monster-role=arrow]" ); const config2 = Object.assign( {}, { placement: "top" }, options2 ); const middleware = config2?.["middleware"]; if (!isArray(middleware)) { if (isString(middleware)) { config2["middleware"] = middleware.split(",").filter((line) => { return line.trim().length > 0; }); } else { config2["middleware"] = []; } } for (const key in middleware) { const line = middleware[key]; if (isFunction(line)) { continue; } if (isObject(line)) { continue; } if (!isString(line)) { throw new Error( `Middleware must be a string, a function or an object. Got ${typeof line}` ); } const kv = line.split(":"); const fn2 = kv.shift(); switch (fn2) { case "flip": config2["middleware"][key] = flip3(); break; case "shift": config2["middleware"][key] = shift2(); break; case "autoPlacement": let defaultAllowedPlacements = ["top", "bottom", "left", "right"]; const defPlacement = kv?.shift(); if (isString(defPlacement) && defPlacement.trim().length > 0) { defaultAllowedPlacements = defPlacement.split(",").filter((line2) => { return line2.trim().length > 0; }); } if (defaultAllowedPlacements.includes(config2.placement)) { defaultAllowedPlacements.splice( defaultAllowedPlacements.indexOf(config2.placement), 1 ); } defaultAllowedPlacements.unshift(config2.placement); config2["middleware"][key] = autoPlacement2({ crossAxis: true, autoAlignment: true, allowedPlacements: defaultAllowedPlacements }); break; case "detectOverflow": config2["middleware"][key] = detectOverflow3(); break; case "arrow": if (arrowElement) { config2["middleware"][key] = arrow3({ element: arrowElement }); } break; case "size": config2["middleware"][key] = size2({ apply({ availableWidth, availableHeight, elements }) { const maxWidth = body.clientWidth; const maxHeight = body.clientHeight; if (availableWidth < 0) { availableWidth = 0; } if (availableHeight < 0) { availableHeight = 0; } if (availableWidth > maxWidth) { availableWidth = maxWidth; } if (availableHeight > maxHeight) { availableHeight = maxHeight; } Object.assign(elements.floating.style, { boxSizing: "border-box", maxWidth: `${availableWidth}px`, maxHeight: `${availableHeight}px` }); } }); break; case "offset": const o = kv?.shift(); config2["middleware"][key] = offset3(parseInt(o) || 10); break; case "hide": config2["middleware"][key] = hide(); break; default: throw new Error(`Unknown function: ${fn2}`); } } popperElement.style.removeProperty("visibility"); popperElement.style.display = "block"; autoUpdate(controlElement, popperElement, () => { computePosition2(controlElement, popperElement, config2).then( ({ x, y, placement, middlewareData }) => { Object.assign(popperElement.style, { top: "0", left: "0", transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)` }); if (middlewareData.arrow) { const side = placement.split("-")[0]; const staticSide = { top: "bottom", right: "left", bottom: "top", left: "right" }[side]; const arrowLen = arrowElement.offsetWidth + 4; const borderStyle = { borderLeft: "transparent", borderRight: "transparent", borderBottom: "transparent", borderTop: "transparent" }; const defaultBorder = "var(--monster-border-width) var(--monster-border-style) var(--monster-bg-color-primary-4)"; switch (side) { case "top": borderStyle.borderRight = defaultBorder; borderStyle.borderBottom = defaultBorder; break; case "bottom": borderStyle.borderTop = defaultBorder; borderStyle.borderLeft = defaultBorder; break; case "left": borderStyle.borderRight = defaultBorder; borderStyle.borderTop = defaultBorder; break; case "right": borderStyle.borderBottom = defaultBorder; borderStyle.borderLeft = defaultBorder; break; } const { x: x2, y: y2 } = middlewareData.arrow; Object.assign( arrowElement.style, { left: x2 != null ? `${x2}px` : "", top: y2 != null ? `${y2}px` : "", // Ensure the static side gets unset when // flipping to other placements' axes. right: "", bottom: "", [staticSide]: `${-arrowLen / 2}px`, transform: "rotate(45deg)" }, borderStyle ); } } ); }); }).run(); } function roundByDPR(value) { const dpr = window.devicePixelRatio || 1; return Math.round(value * dpr) / dpr; } var init_floating_ui = __esm({ "source/components/form/util/floating-ui.mjs"() { init_floating_ui_dom(); init_processing(); init_util(); init_is(); } }); // source/components/form/stylesheet/select.mjs var SelectStyleSheet; var init_select = __esm({ "source/components/form/stylesheet/select.mjs"() { init_attributes(); init_constants2(); SelectStyleSheet = new CSSStyleSheet(); try { SelectStyleSheet.insertRule( ` @layer select { .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}[data-monster-role=control]{width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}.monster-badge-primary{padding:.25em .4em}.monster-badge-primary,.monster-badge-primary-pill{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-primary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-secondary{padding:.25em .4em}.monster-badge-secondary,.monster-badge-secondary-pill{background-color:var(--monster-bg-color-secondary-3);border-radius:.25rem;color:var(--monster-color-secondary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-secondary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-tertiary{padding:.25em .4em}.monster-badge-tertiary,.monster-badge-tertiary-pill{background-color:var(--monster-bg-color-tertiary-3);border-radius:.25rem;color:var(--monster-color-tertiary-3);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-tertiary-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-destructive{padding:.25em .4em}.monster-badge-destructive,.monster-badge-destructive-pill{background-color:var(--monster-bg-color-destructive-1);border-radius:.25rem;color:var(--monster-color-destructive-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-destructive-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-success{padding:.25em .4em}.monster-badge-success,.monster-badge-success-pill{background-color:var(--monster-bg-color-success-1);border-radius:.25rem;color:var(--monster-color-success-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-success-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-warning{padding:.25em .4em}.monster-badge-warning,.monster-badge-warning-pill{background-color:var(--monster-bg-color-warning-1);border-radius:.25rem;color:var(--monster-color-warning-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-warning-pill{border-radius:10rem;padding:.25em .6em}.monster-badge-error{padding:.25em .4em}.monster-badge-error,.monster-badge-error-pill{background-color:var(--monster-bg-color-error-1);border-radius:.25rem;color:var(--monster-color-error-1);display:inline-block;font-size:75%;font-weight:700;line-height:1;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}.monster-badge-error-pill{border-radius:10rem;padding:.25em .6em}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=container]{-webkit-appearance:none;-moz-appearance:none;appearance:none;flex:4 0 90%;min-height:1.4em;overflow:auto;scrollbar-color:var(--monster-color-primary-1) var(--monster-bg-color-primary-1);scrollbar-width:thin;width:100%}.d-none{display:none!important}div[data-monster-role=control]{display:flex;height:100%;position:relative}[data-monster-role=container].open{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708z'/%3E%3C/svg%3E")}[data-monster-role=container].clear,[data-monster-role=container].open{background-color:var(--monster-bg-color-primary-2);-webkit-mask-position:center center;mask-position:center center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:.8em;mask-size:.8em}[data-monster-role=container].clear{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E")}[data-monster-role=control]{accent-color:var(--monster-color-secondary-2);background-color:var(--monster-bg-color-primary-1);border-color:var(--monster-theme-control-border-color);-o-border-image:initial;border-image:initial;border-radius:var(--monster-theme-control-border-radius);border-style:var(--monster-theme-control-border-style);border-width:var(--monster-theme-control-border-width);box-sizing:border-box;color:var(--monster-color-primary-1);display:flex;font-family:inherit;font-size:100%;margin:0;outline:none;padding:.4rem .6rem;width:-webkit-fill-available;width:-moz-available;width:fill-available}@media (prefers-color-scheme:light){[data-monster-role=control]{background-color:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-1)}[data-monster-role=control]:focus{outline:1px dashed var(--monster-color-selection-4);outline-offset:2px}}[data-monster-role=control]:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}div[data-monster-role=selection]{align-items:center;display:flex;flex-direction:row;flex-wrap:wrap;gap:5px;justify-content:flex-start;margin:5px}[data-monster-role=option-control]{margin-right:8px}[data-monster-role=badge]{display:inline-flex}[data-monster-role=badge-label]{align-content:center;align-items:center;display:flex;flex-direction:row;gap:7px;justify-content:space-between}[data-monster-role=filter],[data-monster-role=popper-filter]{display:flex;flex-grow:200;order:99999999;visibility:hidden}[data-monster-role=filter].active{background-color:var(--monster-bg-color-primary-2);border:0;border-color:var(--monster-bg-color-primary-3);border-bottom:1px solid var(--monster-bg-color-primary-3);color:var(--monster-color-primary-2);min-width:40%;outline:none;visibility:visible}.active[data-monster-role=filter][name=popper-filter]{height:1.5em;margin:2.5em;padding:2px;width:calc(100% - var(--monster-border-width)*2)}.option-filter-control{align-items:center;background-color:var(--monster-bg-color-primary-2);display:flex;height:2.5em;margin:-1.1em -1.1em .3em}[data-monster-role=remove-badge]{background-color:var(--monster-bg-color-primary-2);height:16px;margin-left:5px;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");order:2}[data-monster-role=remove-badge],[data-monster-role=status-or-remove-badges]{-webkit-mask-position:center center;mask-position:center center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:.8em;mask-size:.8em;min-height:16px;width:16px}[data-monster-role=status-or-remove-badges]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--monster-bg-color-primary-4);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E")}.open[data-monster-role=status-or-remove-badges]{background-color:var(--monster-bg-color-primary-4);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708z'/%3E%3C/svg%3E")}.empty[data-monster-role=status-or-remove-badges]{background-color:var(--monster-bg-color-primary-4);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-dash-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16'/%3E%3Cpath d='M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-dash-circle' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16'/%3E%3Cpath d='M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8'/%3E%3C/svg%3E")}.clear[data-monster-role=status-or-remove-badges]{background-color:var(--monster-bg-color-primary-4);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E")}.error[data-monster-role=status-or-remove-badges]{background-color:var(--monster-bg-color-error-1);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16'/%3E%3Cpath d='M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0M7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16'/%3E%3Cpath d='M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0M7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0z'/%3E%3C/svg%3E")}.loading[data-monster-role=status-or-remove-badges]{animation-duration:1s;animation-iteration-count:infinite;animation-name:activity;animation-timing-function:cubic-bezier(0,0,.2,1);background-color:var(--monster-bg-color-primary-4);-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='activity' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='activity' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='8'/%3E%3C/svg%3E")}@keyframes activity{0%{transform:scale(1)}50%{transform:scale(.1)}to{transform:scale(1)}}[data-monster-role=options]{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;scrollbar-color:var(--monster-color-primary-1) var(--monster-bg-color-primary-1);scrollbar-width:thin}[data-monster-role=option]{align-items:center;box-sizing:border-box;display:flex;padding:6px 5px}[data-monster-role=option] label{align-items:center;display:flex;flex-direction:row;justify-content:flex-start;width:100%}[data-monster-role=option] label>div{align-items:center;display:flex;flex-direction:row;justify-content:space-between;outline:none;width:100%}[data-monster-role=no-options]{background-color:var(--monster-bg-color-warning-4);border-radius:.2em;color:var(--monster-color-warning-4);margin:1.1em 1.1em 0;padding:.3em .8em}.selected{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}[data-monster-role=option][data-monster-filtered=true],[data-monster-role=option][data-monster-visibility=hidden]{display:none}[data-monster-role=option][data-monster-focused=true]{outline:1px dashed var(--monster-color-selection-2);outline-offset:-2px}[data-monster-role=option]>input:focus,[data-monster-role=option]>label:focus{outline:none} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/select.mjs var select_exports = {}; __export(select_exports, { Select: () => Select, getSelectionTemplate: () => getSelectionTemplate, getSummaryTemplate: () => getSummaryTemplate, popperElementSymbol: () => popperElementSymbol2 }); function getTranslations2() { const locale = getLocaleOfDocument(); switch (locale.language) { case "de": return { "cannot-be-loaded": "Kann nicht geladen werden", "no-options-available": "Keine Optionen verf\xFCgbar.", "click-to-load-options": "Klicken, um Optionen zu laden.", "select-an-option": "W\xE4hle eine Option", "summary-text": { zero: "Keine Eintr\xE4ge ausgew\xE4hlt", one: '<span class="monster-badge-primary-pill">1</span> Eintrag ausgew\xE4hlt', other: '<span class="monster-badge-primary-pill">${count}</span> Eintr\xE4ge ausgew\xE4hlt' }, "no-options": "Leider gibt es keine Optionen in der Liste.", "no-options-found": "Keine Optionen in der Liste verf\xFCgbar. Bitte \xE4ndern Sie den Filter." }; case "fr": return { "cannot-be-loaded": "Impossible de charger", "no-options-available": "Aucune option disponible.", "click-to-load-options": "Cliquez pour charger les options.", "select-an-option": "S\xE9lectionnez une option", "summary-text": { zero: "Aucune entr\xE9e s\xE9lectionn\xE9e", one: '<span class="monster-badge-primary-pill">1</span> entr\xE9e s\xE9lectionn\xE9e', other: '<span class="monster-badge-primary-pill">${count}</span> entr\xE9es s\xE9lectionn\xE9es' }, "no-options": "Malheureusement, il n'y a pas d'options disponibles dans la liste.", "no-options-found": "Aucune option disponible dans la liste. Veuillez modifier le filtre." }; case "sp": return { "cannot-be-loaded": "No se puede cargar", "no-options-available": "No hay opciones disponibles.", "click-to-load-options": "Haga clic para cargar opciones.", "select-an-option": "Seleccione una opci\xF3n", "summary-text": { zero: "No se seleccionaron entradas", one: '<span class="monster-badge-primary-pill">1</span> entrada seleccionada', other: '<span class="monster-badge-primary-pill">${count}</span> entradas seleccionadas' }, "no-options": "Desafortunadamente, no hay opciones disponibles en la lista.", "no-options-found": "No hay opciones disponibles en la lista. Considere modificar el filtro." }; case "it": return { "cannot-be-loaded": "Non pu\xF2 essere caricato", "no-options-available": "Nessuna opzione disponibile.", "click-to-load-options": "Clicca per caricare le opzioni.", "select-an-option": "Seleziona un'opzione", "summary-text": { zero: "Nessuna voce selezionata", one: '<span class="monster-badge-primary-pill">1</span> voce selezionata', other: '<span class="monster-badge-primary-pill">${count}</span> voci selezionate' }, "no-options": "Purtroppo, non ci sono opzioni disponibili nella lista.", "no-options-found": "Nessuna opzione disponibile nella lista. Si prega di modificare il filtro." }; case "pl": return { "cannot-be-loaded": "Nie mo\u017Cna za\u0142adowa\u0107", "no-options-available": "Brak dost\u0119pnych opcji.", "click-to-load-options": "Kliknij, aby za\u0142adowa\u0107 opcje.", "select-an-option": "Wybierz opcj\u0119", "summary-text": { zero: "Nie wybrano \u017Cadnych wpis\xF3w", one: '<span class="monster-badge-primary-pill">1</span> wpis zosta\u0142 wybrany', other: '<span class="monster-badge-primary-pill">${count}</span> wpisy zosta\u0142y wybrane' }, "no-options": "Niestety, nie ma dost\u0119pnych opcji na li\u015Bcie.", "no-options-found": "Brak dost\u0119pnych opcji na li\u015Bcie. Rozwa\u017C zmian\u0119 filtra." }; case "no": return { "cannot-be-loaded": "Kan ikke lastes", "no-options-available": "Ingen alternativer tilgjengelig.", "click-to-load-options": "Klikk for \xE5 laste alternativer.", "select-an-option": "Velg et alternativ", "summary-text": { zero: "Ingen oppf\xF8ringer ble valgt", one: '<span class="monster-badge-primary-pill">1</span> oppf\xF8ring valgt', other: '<span class="monster-badge-primary-pill">${count}</span> oppf\xF8ringer valgt' }, "no-options": "Dessverre er det ingen alternativer tilgjengelig i listen.", "no-options-found": "Ingen alternativer tilgjengelig p\xE5 listen. Vurder \xE5 endre filteret." }; case "dk": return { "cannot-be-loaded": "Kan ikke indl\xE6ses", "no-options-available": "Ingen muligheder tilg\xE6ngelige.", "click-to-load-options": "Klik for at indl\xE6se muligheder.", "select-an-option": "V\xE6lg en mulighed", "summary-text": { zero: "Ingen indl\xE6g blev valgt", one: '<span class="monster-badge-primary-pill">1</span> indl\xE6g blev valgt', other: '<span class="monster-badge-primary-pill">${count}</span> indl\xE6g blev valgt' }, "no-options": "Desv\xE6rre er der ingen muligheder tilg\xE6ngelige p\xE5 listen.", "no-options-found": "Ingen muligheder tilg\xE6ngelige p\xE5 listen. Overvej at \xE6ndre filteret." }; case "sw": return { "cannot-be-loaded": "Kan inte laddas", "no-options-available": "Inga alternativ tillg\xE4ngliga.", "click-to-load-options": "Klicka f\xF6r att ladda alternativ.", "select-an-option": "V\xE4lj ett alternativ", "summary-text": { zero: "Inga poster valdes", one: '<span class="monster-badge-primary-pill">1</span> post valdes', other: '<span class="monster-badge-primary-pill">${count}</span> poster valdes' }, "no-options": "Tyv\xE4rr finns det inga alternativ tillg\xE4ngliga i listan.", "no-options-found": "Inga alternativ finns tillg\xE4ngliga i listan. \xD6verv\xE4g att modifiera filtret." }; default: case "en": return { "cannot-be-loaded": "Cannot be loaded", "no-options-available": "No options available.", "click-to-load-options": "Click to load options.", "select-an-option": "Select an option", "summary-text": { zero: "No entries were selected", one: '<span class="monster-badge-primary-pill">1</span> entry was selected', other: '<span class="monster-badge-primary-pill">${count}</span> entries were selected' }, "no-options": "Unfortunately, there are no options available in the list.", "no-options-found": "No options are available in the list. Please consider modifying the filter." }; } } function lookupSelection() { const self2 = this; setTimeout(() => { const selection = self2.getOption("selection"); if (selection.length === 0) { return; } if (self2[isLoadingSymbol] === true) { return; } if (self2[lazyLoadDoneSymbol] === true) { return; } let url = self2.getOption("url"); let lookupUrl = self2.getOption("lookup.url"); if (lookupUrl !== null) { url = lookupUrl; } if (this.getOption("lookup.grouping") === true) { filterFromRemoteByValue.call( self2, url, selection.map((s) => s?.["value"]) ).catch((e) => { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); return; } for (const s of selection) { if (s?.["value"]) { filterFromRemoteByValue.call(self2, url, s?.["value"]).catch((e) => { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } } }, 100); } function fetchIt(url, controlOptions) { if (url instanceof URL) { url = url.toString(); } if (url !== void 0 && url !== null) { url = validateString(url); } else { url = this.getOption("url"); if (url === null) { return Promise.reject(new Error("No url defined")); } } return new Promise((resolve, reject) => { setStatusOrRemoveBadges.call(this, "loading"); new Processing(10, () => { fetchData.call(this, url).then((map) => { if (isObject(map) || isArray(map) || map instanceof Set || map instanceof Map) { try { this.importOptions(map); } catch (e) { setStatusOrRemoveBadges.call(this, "error"); reject(e); return; } this[lastFetchedDataSymbol] = map; let result; const selection = this.getOption("selection"); let newValue = []; if (selection) { newValue = selection; } else if (this.hasAttribute("value")) { newValue = this.getAttribute("value"); } result = setSelection.call(this, newValue); requestAnimationFrame(() => { checkOptionState.call(this); setStatusOrRemoveBadges.call(this, "closed"); updatePopper.call(this); resolve(result); }); return; } setStatusOrRemoveBadges.call(this, "error"); reject(new Error("invalid response")); }).catch((e) => { setStatusOrRemoveBadges.call(this, "error"); reject(e); }); }).run().catch((e) => { setStatusOrRemoveBadges.call(this, "error"); addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); reject(e); }); }); } function initOptionsFromArguments2() { const options2 = {}; const template = this.getAttribute("data-monster-selected-template"); if (isString(template)) { if (!options2["templateMapping"]) options2["templateMapping"] = {}; switch (template) { case "summary": case "default": options2["templateMapping"]["selected"] = getSummaryTemplate(); break; case "selected": options2["templateMapping"]["selected"] = getSelectionTemplate(); break; default: addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "invalid template, use summary or selected" ); } } return options2; } function attachResizeObserver3() { this[resizeObserverSymbol3] = new ResizeObserver((entries) => { if (this[timerCallbackSymbol3] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol3].touch(); return; } catch (e) { delete this[timerCallbackSymbol3]; } } this[timerCallbackSymbol3] = new DeadMansSwitch(200, () => { updatePopper.call(this); delete this[timerCallbackSymbol3]; }); }); this[resizeObserverSymbol3].observe(this.parentElement); } function disconnectResizeObserver2() { if (this[resizeObserverSymbol3] instanceof ResizeObserver) { this[resizeObserverSymbol3].disconnect(); } } function getSelectionTemplate() { return `<div data-monster-role="selection" part="selection" data-monster-insert="selection path:selection" role="search" ><input type="text" role="searchbox" part="inline-filter" name="inline-filter" data-monster-role="filter" autocomplete="off" tabindex="0" ><div data-monster-replace="path:messages.control"></div> </div>`; } function getSummaryTemplate() { return `<div data-monster-role="selection" role="search" part="summary"> <input type="text" role="searchbox" part="inline-filter" name="inline-filter" data-monster-role="filter" autocomplete="off" tabindex="0" > <div data-monster-replace="path:messages.selected"></div> </div>`; } function parseSlotsToOptions() { let options2 = this.getOption("options"); if (!isIterable(options2)) { options2 = []; } let counter = 1; getSlottedElements.call(this, "div").forEach((node) => { let value = (counter++).toString(); let visibility = "visible"; if (node.hasAttribute("data-monster-value")) { value = node.getAttribute("data-monster-value"); } let label = node.outerHTML; if (node.style.display === "none") { visibility = "hidden"; } options2.push({ value, label, visibility }); }); runAsOptionLengthChanged.call(this, options2.length); this.setOption("options", options2); } function runAsOptionLengthChanged(targetLength) { const self2 = this; if (!self2[optionsElementSymbol]) { return; } const callback = function(mutationsList, observer2) { const run = false; for (const mutation of mutationsList) { if (mutation.type === "childList") { const run2 = true; break; } } if (run === true) { const nodes = self2[optionsElementSymbol].querySelectorAll( `div[${ATTRIBUTE_ROLE}=option]` ); if (nodes.length === targetLength) { checkOptionState.call(self2); observer2.disconnect(); } } }; const observer = new MutationObserver(callback); observer.observe(self2[optionsElementSymbol], { attributes: false, childList: true, subtree: true }); } function buildSelectionLabel(value) { const options2 = this.getOption("options"); for (let i = 0; i < options2.length; i++) { let o = options2?.[i]; let l, v, v2; if (this.getOption("features.useStrictValueComparison") === true) { v = value; } else { v = `${value}`; } if (isPrimitive(o) && o === value) { return o; } else if (!isObject(o)) { continue; } if (this.getOption("features.useStrictValueComparison") === true) { l = o?.["label"]; v2 = o?.["value"]; } else { l = `${o?.["label"]}`; v2 = `${o?.["value"]}`; } if (v2 === v) { return l; } } return void 0; } function getSelectionLabel(value) { const callback = this.getOption("formatter.selection"); if (isFunction(callback)) { const label = callback.call(this, value); if (isString(label)) return label; } if (isString(value) || isInteger(value)) { return `${value}`; } return this.getOption("labels.cannot-be-loaded", value); } function handleToggleKeyboardEvents(event) { switch (event?.["code"]) { case "Escape": toggle.call(this); event.preventDefault(); break; case "Space": toggle.call(this); event.preventDefault(); break; case "ArrowDown": show3.call(this); activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN); event.preventDefault(); break; case "ArrowUp": hide4.call(this); event.preventDefault(); break; } } function initOptionObserver2() { const self2 = this; self2.attachObserver( new Observer(function() { new Processing(() => { try { self2.updateI18n(); } catch (e) { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, e.message); requestAnimationFrame(() => { setStatusOrRemoveBadges.call(self2, "error"); }); } try { areOptionsAvailableAndInit.call(self2); } catch (e) { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, e.message); requestAnimationFrame(() => { setStatusOrRemoveBadges.call(self2, "error"); }); } setSummaryAndControlText.call(self2); }).run(); }) ); } function getDefaultTranslation() { const translation = new Translations("en").assignTranslations( this.getOption("labels", {}) ); try { const doc = getDocumentTranslations(); translation.locale = doc.locale; } catch (e) { } return translation; } function setSummaryAndControlText() { const translations2 = getDefaultTranslation.call(this); const selections = this.getOption("selection"); const text = translations2.getPluralRuleText( "summary-text", selections.length, "" ); const selectedText = new Formatter({ count: String(selections.length) }).format(text); this.setOption("messages.selected", selectedText); const current = this.getOption("messages.control"); const msg = this.getOption("labels.select-an-option"); if (current === "" || current === void 0 || current === msg || current === null) { if (selections.length === 0) { this.setOption("messages.control", msg); } else { this.setOption("messages.control", ""); } } } function getOptionElements() { return this[optionsElementSymbol].querySelectorAll( `[${ATTRIBUTE_ROLE}=option]` ); } function calcAndSetOptionsDimension() { const options2 = getOptionElements.call(this); const container = this[optionsElementSymbol]; if (!(container instanceof HTMLElement && options2 instanceof NodeList)) { return; } let visible = 0; let optionHeight = 0; const max3 = this.getOption("showMaxOptions", 10); let scrollFlag = false; for (const [, option] of Object.entries(options2)) { const computedStyle = getGlobal().getComputedStyle(option); if (computedStyle.display === "none") continue; let h = option.getBoundingClientRect().height; h += parseInt(computedStyle.getPropertyValue("margin-top"), 10); h += parseInt(computedStyle.getPropertyValue("margin-bottom"), 10); optionHeight += h; visible++; if (visible > max3) { break; } } if (visible > max3) { visible = max3; scrollFlag = true; } if (visible === 0) { if (getFilterMode.call(this) === FILTER_MODE_DISABLED) { this.setOption( "messages.emptyOptions", this.getOption("labels.no-options-available") ); } else { this.setOption( "messages.emptyOptions", this.getOption("labels.no-options-found") ); } this[noOptionsAvailableElementSymbol].classList.remove("d-none"); } else { this[noOptionsAvailableElementSymbol].classList.add("d-none"); } const styles2 = getGlobal().getComputedStyle(this[optionsElementSymbol]); let padding = parseInt(styles2.getPropertyValue("padding-top"), 10); padding += parseInt(styles2.getPropertyValue("padding-bottom"), 10); let margin = parseInt(styles2.getPropertyValue("margin-top"), 10); margin += parseInt(styles2.getPropertyValue("margin-bottom"), 10); const containerHeight = optionHeight + padding + margin; container.style.height = `${containerHeight}px`; if (scrollFlag === true) { container.style.overflowY = "scroll"; } else { container.style.overflowY = "auto"; } const domRect = this[controlElementSymbol4].getBoundingClientRect(); this[popperElementSymbol2].style.width = `${domRect.width}px`; container.style.overflowX = "auto"; } function activateCurrentOption(direction) { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } let focused = this.shadowRoot.querySelector(`[${ATTRIBUTE_PREFIX}focused]`); if (!(focused instanceof HTMLElement) || focused.matches("[data-monster-visibility=hidden]")) { for (const [, e] of Object.entries( this.shadowRoot.querySelectorAll(`[${ATTRIBUTE_ROLE}=option]`) )) { if (e.matches("[data-monster-visibility=visible]")) { focused = e; break; } } } else { if (direction === FOCUS_DIRECTION_DOWN) { while (focused.nextSibling) { focused = focused.nextSibling; if (focused instanceof HTMLElement && focused.hasAttribute(ATTRIBUTE_ROLE) && focused.getAttribute(ATTRIBUTE_ROLE) === "option" && focused.matches("[data-monster-visibility=visible]") && focused.matches(":not([data-monster-filtered=true])")) { break; } } } else { let found = false; while (focused.previousSibling) { focused = focused.previousSibling; if (focused instanceof HTMLElement && focused.hasAttribute(ATTRIBUTE_ROLE) && focused.getAttribute(ATTRIBUTE_ROLE) === "option" && focused.matches("[data-monster-visibility=visible]") && focused.matches(":not([data-monster-filtered=true])")) { found = true; break; } } if (found === false) { focusFilter2.call(this); } } } new Processing(() => { if (focused instanceof HTMLElement) { this.shadowRoot.querySelectorAll(`[${ATTRIBUTE_PREFIX}focused]`).forEach((e) => { e.removeAttribute(`${ATTRIBUTE_PREFIX}focused`); }); focused.focus(); focused.setAttribute(`${ATTRIBUTE_PREFIX}focused`, true); } }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } function filterOptions() { new Processing(() => { let filterValue; switch (this.getOption("filter.position")) { case FILTER_POSITION_INLINE: if (this[inlineFilterElementSymbol] instanceof HTMLElement) { filterValue = this[inlineFilterElementSymbol].value.toLowerCase(); } else { return; } break; case FILTER_POSITION_POPPER: default: if (this[popperFilterElementSymbol] instanceof HTMLInputElement) { filterValue = this[popperFilterElementSymbol].value.toLowerCase(); } else { return; } } const options2 = this.getOption("options"); for (const [i, option] of Object.entries(options2)) { if (option.label.toLowerCase().indexOf(filterValue) === -1) { this.setOption(`options.${i}.filtered`, "true"); } else { this.setOption(`options.${i}.filtered`, void 0); } } }).run().then(() => { new Processing(100, () => { calcAndSetOptionsDimension.call(this); focusFilter2.call(this); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } function handleFilterKeyboardEvents(event) { const shiftKey = event?.["shiftKey"]; switch (event?.["code"]) { case "Tab": activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN); event.preventDefault(); break; case "Escape": toggle.call(this); event.preventDefault(); break; case shiftKey === true: case "ArrowUp": activateCurrentOption.call(this, FOCUS_DIRECTION_UP); event.preventDefault(); break; case !shiftKey: case "ArrowDown": activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN); event.preventDefault(); break; default: if (this.getOption("features.lazyLoad") === true && this[lazyLoadDoneSymbol] !== true) { this.click(); } handleFilterKeyEvents.call(this); } } function handleFilterKeyEvents() { if (this[keyFilterEventSymbol] instanceof DeadMansSwitch) { try { this[keyFilterEventSymbol].touch(); return; } catch (e) { delete this[keyFilterEventSymbol]; } } this[keyFilterEventSymbol] = new DeadMansSwitch(200, () => { if (getFilterMode.call(this) !== FILTER_MODE_REMOTE) { filterOptions.call(this); } else { filterFromRemote.call(this).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } delete this[keyFilterEventSymbol]; }); } function filterFromRemote() { if (!(this[inlineFilterElementSymbol] instanceof HTMLElement) && !(this[popperFilterElementSymbol] instanceof HTMLElement)) { return; } show3.call(this); const url = this.getOption("url"); if (!url) { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "Missing URL for Remote Filter." ); return; } let filterValue; switch (this.getOption("filter.position")) { case FILTER_POSITION_INLINE: if (this[inlineFilterElementSymbol] instanceof HTMLElement) { filterValue = this[inlineFilterElementSymbol].value.toLowerCase(); } break; case FILTER_POSITION_POPPER: default: if (this[popperFilterElementSymbol] instanceof HTMLInputElement) { filterValue = this[popperFilterElementSymbol].value.toLowerCase(); } } return filterFromRemoteByValue.call(this, url, filterValue); } function formatURL(url, value) { if (value === void 0 || value === null || value === "") { value = this.getOption("filter.defaultValue"); if (value === void 0 || value === null || value === "") { value = disabledRequestMarker.toString(); } } const formatter = new Formatter({ filter: encodeURI(value) }); const openMarker = this.getOption("filter.marker.open"); let closeMarker = this.getOption("filter.marker.close"); if (!closeMarker) { closeMarker = openMarker; } if (openMarker && closeMarker) { formatter.setMarker(openMarker, closeMarker); } return formatter.format(url); } function filterFromRemoteByValue(optionUrl, value) { return new Processing(() => { let url = formatURL.call(this, optionUrl, value); if (url.indexOf(disabledRequestMarker.toString()) !== -1) { return; } fetchIt.call(this, url, { disableHiding: true }).then(() => { checkOptionState.call(this); show3.call(this); }).catch((e) => { throw e; }); }).run().catch((e) => { throw e; }); } function handleOptionKeyboardEvents(event) { const shiftKey = event?.["shiftKey"]; switch (event?.["code"]) { case "Escape": toggle.call(this); event.preventDefault(); break; case "Enter": case "Space": const path = event.composedPath(); const element = path?.[0]; if (element instanceof HTMLElement) { const input = element.getElementsByTagName("input"); if (!input) { return; } fireEvent(input, "click"); } event.preventDefault(); break; case shiftKey === true: case "ArrowUp": activateCurrentOption.call(this, FOCUS_DIRECTION_UP); event.preventDefault(); break; case !shiftKey: case "ArrowLeft": case "ArrowRight": break; case "ArrowDown": activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN); event.preventDefault(); break; default: const p = event.composedPath(); if (p?.[0] instanceof HTMLInputElement) { return; } focusFilter2.call(this); break; } } function getFilterMode() { switch (this.getOption("filter.mode")) { case FILTER_MODE_OPTIONS: return FILTER_MODE_OPTIONS; case FILTER_MODE_REMOTE: return FILTER_MODE_REMOTE; default: return FILTER_MODE_DISABLED; } } function blurFilter() { if (!(this[inlineFilterElementSymbol] instanceof HTMLElement)) { return; } if (getFilterMode.call(this) === FILTER_MODE_DISABLED) { return; } this[popperFilterContainerElementSymbol].classList.remove("active"); this[popperFilterContainerElementSymbol].blur(); this[inlineFilterElementSymbol].classList.remove("active"); this[inlineFilterElementSymbol].blur(); } function focusPopperFilter(focusOptions) { this[popperFilterContainerElementSymbol].classList.remove("d-none"); this[popperFilterElementSymbol].classList.add("active"); this[inlineFilterElementSymbol].classList.remove("active"); this[inlineFilterElementSymbol].classList.add("d-none"); if (!(this[popperFilterElementSymbol] instanceof HTMLElement)) { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "Missing Popper Filter Element." ); return; } setTimeout(() => { if (focusOptions === void 0 || focusOptions === null) { this[popperFilterElementSymbol].focus(); } else { this[popperFilterElementSymbol].focus(focusOptions); } }, 100); } function focusInlineFilter(focusOptions) { const options2 = this.getOption("options"); if ((!isArray(options2) || options2.length === 0) && getFilterMode.call(this) !== FILTER_MODE_REMOTE) { return; } this[popperFilterContainerElementSymbol].classList.add("d-none"); this[inlineFilterElementSymbol].classList.add("active"); this[inlineFilterElementSymbol].classList.remove("d-none"); setTimeout(() => { if (focusOptions === void 0 || focusOptions === null) { this[inlineFilterElementSymbol].focus(); } else { this[inlineFilterElementSymbol].focus(focusOptions); } }, 100); } function focusFilter2(focusOptions) { if (getFilterMode.call(this) === FILTER_MODE_DISABLED) { this[popperFilterContainerElementSymbol].classList.add("d-none"); this[inlineFilterElementSymbol].classList.add("d-none"); return; } if (this.getOption("filter.position") === FILTER_POSITION_INLINE) { return focusInlineFilter.call(this, focusOptions); } return focusPopperFilter.call(this, focusOptions); } function gatherState() { const type3 = this.getOption("type"); if (["radio", "checkbox"].indexOf(type3) === -1) { throw new Error("unsupported type"); } if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } const selection = []; const elements = this.shadowRoot.querySelectorAll( `input[type=${type3}]:checked` ); for (const e of elements) { selection.push({ label: getSelectionLabel.call(this, e.value), value: e.value }); } setSelection.call(this, selection).then(() => { }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); if (this.getOption("features.closeOnSelect") === true) { toggle.call(this); } return this; } function clearSelection() { const type3 = this.getOption("type"); if (["radio", "checkbox"].indexOf(type3) === -1) { throw new Error("unsupported type"); } if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } setSelection.call(this, []).then(() => { }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } function areOptionsAvailableAndInit() { if (this[areOptionsAvailableAndInitSymbol] === void 0) { this[areOptionsAvailableAndInitSymbol] = 0; } if (this[areOptionsAvailableAndInitSymbol] > 0) { this[areOptionsAvailableAndInitSymbol]--; return true; } this[areOptionsAvailableAndInitSymbol]++; const options2 = this.getOption("options"); if (options2 === void 0 || options2 === null || isArray(options2) && options2.length === 0) { setStatusOrRemoveBadges.call(this, "empty"); let msg = this.getOption("labels.no-options-available"); if (this.getOption("url") !== null && this.getOption("features.lazyLoad") === true && this[lazyLoadDoneSymbol] !== true) { msg = this.getOption("labels.click-to-load-options"); } this.setOption("messages.control", msg); this.setOption("messages.summary", ""); if (this.getOption("features.emptyValueIfNoOptions") === true) { this.value = ""; } addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "No options available."); return false; } const selections = this.getOption("selection"); if (selections === void 0 || selections === null || selections.length === 0) { this.setOption( "messages.control", this.getOption("labels.select-an-option") ); } else { this.setOption("messages.control", ""); } this.setOption("messages.summary", setSummaryAndControlText.call(this)); let updated = false; let valueCounter = 1; for (const option of options2) { if (option?.visibility === void 0) { option.visibility = "visible"; updated = true; } if (option?.value === void 0 && option?.label === void 0) { option.value = `${valueCounter++}`; option.label = option.value; updated = true; continue; } if (option?.value === void 0) { option.value = option.label; updated = true; } if (option?.label === void 0) { option.label = option.value; updated = true; } } if (updated) { this.setOption("options", options2); } setStatusOrRemoveBadges.call(this); removeAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "No options available."); return true; } function checkOptionState() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } const elements = this.shadowRoot.querySelectorAll( `[${ATTRIBUTE_ROLE}=option] input` ); let selection = this.getOption("selection"); if (!isArray(selection)) { selection = []; } const checkedValues = selection.map((a2) => { return a2.value; }); for (const e of elements) { if (checkedValues.indexOf(e.value) !== -1) { if (e.checked !== true) e.checked = true; } else { if (e.checked !== false) e.checked = false; } } } function convertValueToSelection(value) { const selection = []; if (isString(value)) { value = value.split(",").map((a2) => { return a2.trim(); }).filter((a2) => { return a2 !== ""; }); } if (isString(value) || isInteger(value)) { selection.push({ label: getSelectionLabel.call(this, value), value }); } else if (isArray(value)) { for (const v of value) { selection.push({ label: getSelectionLabel.call(this, v), value: v }); } value = value.join(","); } else { throw new Error("unsupported type"); } return { selection, value }; } function convertSelectionToValue(selection) { const value = []; if (isArray(selection)) { for (const obj of selection) { const v = obj?.["value"]; if (v !== void 0) value.push(`${v}`); } } if (value.length === 0) { return ""; } else if (value.length === 1) { const v = value.pop(); if (v === void 0) return ""; if (v === null) return ""; return `${v}`; } return value.join(","); } function setSelection(selection) { if (isString(selection) || isInteger(selection)) { const result = convertValueToSelection.call(this, selection); selection = result?.selection; } else if (selection === void 0 || selection === null) { selection = []; } validateArray(selection); for (let i = 0; i < selection.length; i++) { let l = getSelectionLabel.call(this, selection[i].value); if (l === selection[i].value) { l = selection[i].label; } selection[i] = { label: l, value: selection[i].value }; } this.setOption("selection", selection); checkOptionState.call(this); setSummaryAndControlText.call(this); try { this?.setFormValue(this.value); } catch (e) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); } fireCustomEvent(this, "monster-selected", { selection }); fireEvent(this, "change"); return new Processing(() => { const CLASSNAME = "selected"; if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } const notSelected = this.shadowRoot.querySelectorAll(":not(:checked)"); if (notSelected) { notSelected.forEach((node) => { const parent = node.closest(`[${ATTRIBUTE_ROLE}=option]`); if (parent) { parent.classList.remove(CLASSNAME); } }); } const selected = this.shadowRoot.querySelectorAll(":checked"); if (selected) { selected.forEach((node) => { const parent = node.closest(`[${ATTRIBUTE_ROLE}=option]`); if (parent) { parent.classList.add(CLASSNAME); } }); } }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } function fetchData(url) { const self2 = this; if (!url) url = this.getOption("url"); if (!url) return Promise.resolve(); const fetchOptions = this.getOption("fetch", {}); let delayWatch = false; requestAnimationFrame(() => { if (delayWatch === true) return; setStatusOrRemoveBadges.call(this, "loading"); delayWatch = true; }); url = formatURL.call(this, url); self2[isLoadingSymbol] = true; const global20 = getGlobal(); return global20.fetch(url, fetchOptions).then((response) => { self2[isLoadingSymbol] = false; delayWatch = true; const contentType = response.headers.get("content-type"); if (contentType && contentType.indexOf("application/json") !== -1) { return response.text(); } throw new TypeError(`unsupported response ${contentType}`); }).then((text) => { try { return Promise.resolve(JSON.parse(String(text))); } catch (e) { throw new TypeError("the result cannot be parsed, check the URL"); } }).catch((e) => { self2[isLoadingSymbol] = false; delayWatch = true; throw e; }); } function hide4() { this[popperElementSymbol2].style.display = "none"; setStatusOrRemoveBadges.call(this, "closed"); removeAttributeToken(this[controlElementSymbol4], "class", "open"); } function show3() { if (this.getOption("disabled", void 0) === true) { return; } if (this[popperElementSymbol2].style.display === STYLE_DISPLAY_MODE_BLOCK) { return; } focusFilter2.call(this); const lazyLoadFlag = this.getOption("features.lazyLoad") && this[lazyLoadDoneSymbol] !== true; if (lazyLoadFlag === true) { this[lazyLoadDoneSymbol] = true; setStatusOrRemoveBadges.call(this, "loading"); new Processing(200, () => { this.fetch().then(() => { checkOptionState.call(this); requestAnimationFrame(() => { show3.call(this); }); }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); setStatusOrRemoveBadges.call(this, "error"); }); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); setStatusOrRemoveBadges.call(this, "error"); }); return; } const hasPopperFilterFlag = this.getOption("filter.position") === FILTER_POSITION_POPPER && getFilterMode.call(this) !== FILTER_MODE_DISABLED; const options2 = getOptionElements.call(this); if (options2.length === 0 && hasPopperFilterFlag === false) { return; } this[popperElementSymbol2].style.visibility = "hidden"; this[popperElementSymbol2].style.display = STYLE_DISPLAY_MODE_BLOCK; setStatusOrRemoveBadges.call(this, "open"); addAttributeToken(this[controlElementSymbol4], "class", "open"); new Processing(() => { calcAndSetOptionsDimension.call(this); focusFilter2.call(this); this[popperElementSymbol2].style.removeProperty("visibility"); updatePopper.call(this); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } function toggle() { if (this[popperElementSymbol2].style.display === STYLE_DISPLAY_MODE_BLOCK) { hide4.call(this); } else { show3.call(this); } } function initEventHandler6() { const self2 = this; self2[clearOptionEventHandler] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "remove-badge" ); if (element instanceof HTMLElement) { const badge = findClosestByAttribute(element, ATTRIBUTE_ROLE, "badge"); if (badge instanceof HTMLElement) { const value = badge.getAttribute(`${ATTRIBUTE_PREFIX}value`); let selection = self2.getOption("selection"); selection = selection.filter((b) => { return value !== b.value; }); setSelection.call(self2, selection).then(() => { fireCustomEvent(self2, "monster-selection-removed", { value }); }).catch((e) => { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, e.message); }); } } }; self2[closeEventHandler2] = (event) => { const path = event.composedPath(); for (const [, element] of Object.entries(path)) { if (element === self2) { return; } } hide4.call(self2); }; self2[inputEventHandler] = (event) => { const path = event.composedPath(); const element = path?.[0]; if (element instanceof HTMLElement) { if (element.hasAttribute(ATTRIBUTE_ROLE) && element.getAttribute(ATTRIBUTE_ROLE) === "option-control") { fireCustomEvent(self2, "monster-change", { type: event.type, value: element.value, checked: element.checked }); } else if (element.hasAttribute(ATTRIBUTE_ROLE) && element.getAttribute(ATTRIBUTE_ROLE) === "filter") { } } }; self2[changeEventHandler] = (event) => { gatherState.call(self2); fireCustomEvent(self2, "monster-changed", event?.detail); }; self2[keyEventHandler] = (event) => { const path = event.composedPath(); const element = path.shift(); let role; if (element instanceof HTMLElement) { if (element.hasAttribute(ATTRIBUTE_ROLE)) { role = element.getAttribute(ATTRIBUTE_ROLE); } else if (element === this) { show3.call(this); } else { const e = element.closest(`[${ATTRIBUTE_ROLE}]`); if (e instanceof HTMLElement && e.hasAttribute(ATTRIBUTE_ROLE)) { role = e.getAttribute(ATTRIBUTE_ROLE); } } } else { return; } switch (role) { case "filter": handleFilterKeyboardEvents.call(self2, event); break; case "option-label": case "option-control": case "option": handleOptionKeyboardEvents.call(self2, event); break; case "control": case "toggle": handleToggleKeyboardEvents.call(self2, event); break; } }; const types = self2.getOption("toggleEventType", ["click"]); for (const [, type3] of Object.entries(types)) { self2[controlElementSymbol4].querySelector(`[${ATTRIBUTE_ROLE}="container"]`).addEventListener(type3, function(event) { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "remove-badge" ); if (element instanceof HTMLElement) { return; } toggle.call(self2); }); self2[controlElementSymbol4].querySelector(`[${ATTRIBUTE_ROLE}="status-or-remove-badges"]`).addEventListener(type3, function(event) { if (self2.getOption("disabled", void 0) === true) { return; } const path = event.composedPath(); const element = path?.[0]; if (element instanceof HTMLElement) { const control = element.closest( `[${ATTRIBUTE_ROLE}="status-or-remove-badges"]` ); if (control instanceof HTMLElement) { if (control.classList.contains("clear")) { clearSelection.call(self2); fireCustomEvent(self2, "monster-selection-cleared", {}); } else { const element2 = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "remove-badge" ); if (element2 instanceof HTMLElement) { return; } toggle.call(self2); } } } }); self2.addEventListener(type3, self2[clearOptionEventHandler]); } self2.addEventListener("monster-change", self2[changeEventHandler]); self2.addEventListener("input", self2[inputEventHandler]); self2.addEventListener("keydown", self2[keyEventHandler]); return self2; } function setStatusOrRemoveBadges(suggestion) { requestAnimationFrame(() => { const selection = this.getOption("selection"); const clearAllFlag = isArray(selection) && selection.length > 0 && this.getOption("features.clearAll") === true; const current = this.getOption("classes.statusOrRemoveBadge"); if (suggestion === "error") { if (current !== "error") { this.setOption("classes.statusOrRemoveBadge", "error"); } return; } if (this[isLoadingSymbol] === true) { if (current !== "loading") { this.setOption("classes.statusOrRemoveBadge", "loading"); } return; } if (suggestion === "loading") { if (current !== "loading") { this.setOption("classes.statusOrRemoveBadge", "loading"); } return; } if (clearAllFlag) { if (current !== "clear") { this.setOption("classes.statusOrRemoveBadge", "clear"); } return; } if (this[controlElementSymbol4].classList.contains("open")) { if (current !== "open") { this.setOption("classes.statusOrRemoveBadge", "open"); } return; } const options2 = this.getOption("options"); if (options2 === void 0 || options2 === null || isArray(options2) && options2.length === 0) { if (current !== "empty") { this.setOption("classes.statusOrRemoveBadge", "empty"); } return; } if (suggestion) { if (current !== suggestion) { this.setOption("classes.statusOrRemoveBadge", suggestion); } return; } }); } function initControlReferences7() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[controlElementSymbol4] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=control]` ); this[selectionElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=selection]` ); this[containerElementSymbol2] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=container]` ); this[popperElementSymbol2] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=popper]` ); this[inlineFilterElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=filter][name="inline-filter"]` ); this[popperFilterElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=filter][name="popper-filter"]` ); this[popperFilterContainerElementSymbol] = this[popperFilterElementSymbol].parentElement; this[optionsElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=options]` ); this[noOptionsAvailableElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}="no-options"]` ); this[statusOrRemoveBadgesElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=status-or-remove-badges]` ); } function updatePopper() { if (this[popperElementSymbol2].style.display !== STYLE_DISPLAY_MODE_BLOCK) { return; } if (this.getOption("disabled", false) === true) { return; } new Processing(() => { calcAndSetOptionsDimension.call(this); positionPopper.call( this, this[controlElementSymbol4], this[popperElementSymbol2], this.getOption("popper", {}) ); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); return this; } function getTemplate9() { return ` <template id="options"> <div data-monster-role="option" tabindex="-1" data-monster-attributes=" data-monster-filtered path:options.filtered, data-monster-visibility path:options.visibility"> <label part="option"> <input data-monster-role="option-control" data-monster-attributes=" type path:type, role path:role, value path:options | index:value, name path:name, part path:type | prefix:option- | suffix: form, class path:options.class " tabindex="-1"> <div data-monster-replace="path:options | index:label" part="option-label"></div> </label> </div> </template> <template id="selection"> <div data-monster-role="badge" part="badge" data-monster-attributes=" data-monster-value path:selection | index:value, class path:classes | index:badge, part path:type | suffix:-option | prefix: form-" tabindex="-1"> <div data-monster-replace="path:selection | index:label" part="badge-label" data-monster-role="badge-label"></div> <div part="remove-badge" data-monster-select-this data-monster-attributes="class path:features.clear | ?::hidden " data-monster-role="remove-badge" tabindex="-1"></div> </div> </template> <slot class="hidden"></slot> <div data-monster-role="control" part="control" tabindex="0"> <div data-monster-role="container"> \${selected} </div> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div class="option-filter-control" role="search"> <input type="text" role="searchbox" part="popper-filter" name="popper-filter" data-monster-role="filter" autocomplete="off" tabindex="0"> </div> <div part="content" class="flex" data-monster-replace="path:content"> <div part="options" data-monster-role="options" data-monster-insert="options path:options" tabindex="-1"></div> </div> <div part="no-options" data-monster-role="no-options" data-monster-replace="path:messages.emptyOptions"></div> </div> <div part="status-or-remove-badges" data-monster-role="status-or-remove-badges" data-monster-attributes="class path:classes.statusOrRemoveBadge"></div> </div> `; } var timerCallbackSymbol3, keyFilterEventSymbol, lazyLoadDoneSymbol, isLoadingSymbol, closeEventHandler2, clearOptionEventHandler, resizeObserverSymbol3, keyEventHandler, lastFetchedDataSymbol, inputEventHandler, changeEventHandler, controlElementSymbol4, selectionElementSymbol, containerElementSymbol2, popperElementSymbol2, inlineFilterElementSymbol, popperFilterElementSymbol, popperFilterContainerElementSymbol, optionsElementSymbol, noOptionsAvailableElementSymbol, statusOrRemoveBadgesElementSymbol, areOptionsAvailableAndInitSymbol, disabledRequestMarker, FOCUS_DIRECTION_UP, FOCUS_DIRECTION_DOWN, FILTER_MODE_REMOTE, FILTER_MODE_OPTIONS, FILTER_MODE_DISABLED, FILTER_POSITION_POPPER, FILTER_POSITION_INLINE, Select; var init_select2 = __esm({ "source/components/form/select.mjs"() { init_constants(); init_constants(); init_buildmap(); init_deadmansswitch(); init_floating_ui(); init_attributes(); init_constants2(); init_customcontrol(); init_customelement(); init_events(); init_util(); init_formatter(); init_global(); init_id(); init_is(); init_observer(); init_proxyobserver(); init_validate(); init_processing(); init_constants3(); init_select(); init_translations(); init_locale2(); timerCallbackSymbol3 = Symbol("timerCallback"); keyFilterEventSymbol = Symbol("keyFilterEvent"); lazyLoadDoneSymbol = Symbol("lazyLoadDone"); isLoadingSymbol = Symbol("isLoading"); closeEventHandler2 = Symbol("closeEventHandler"); clearOptionEventHandler = Symbol("clearOptionEventHandler"); resizeObserverSymbol3 = Symbol("resizeObserver"); keyEventHandler = Symbol("keyEventHandler"); lastFetchedDataSymbol = Symbol("lastFetchedData"); inputEventHandler = Symbol("inputEventHandler"); changeEventHandler = Symbol("changeEventHandler"); controlElementSymbol4 = Symbol("controlElement"); selectionElementSymbol = Symbol("selectionElement"); containerElementSymbol2 = Symbol("containerElement"); popperElementSymbol2 = Symbol("popperElement"); inlineFilterElementSymbol = Symbol("inlineFilterElement"); popperFilterElementSymbol = Symbol("popperFilterElement"); popperFilterContainerElementSymbol = Symbol( "popperFilterContainerElement" ); optionsElementSymbol = Symbol("optionsElement"); noOptionsAvailableElementSymbol = Symbol("noOptionsAvailableElement"); statusOrRemoveBadgesElementSymbol = Symbol("statusOrRemoveBadgesElement"); areOptionsAvailableAndInitSymbol = Symbol("@@areOptionsAvailableAndInit"); disabledRequestMarker = Symbol("@@disabledRequestMarker"); FOCUS_DIRECTION_UP = 1; FOCUS_DIRECTION_DOWN = 2; FILTER_MODE_REMOTE = "remote"; FILTER_MODE_OPTIONS = "options"; FILTER_MODE_DISABLED = "disabled"; FILTER_POSITION_POPPER = "popper"; FILTER_POSITION_INLINE = "inline"; Select = class extends CustomControl { /** * */ constructor() { super(); initOptionObserver2.call(this); } /** * This method is called by the `instanceof` operator. * @return {Symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/form/select@@instance"); } /** * The current selection of the Select * * ``` * e = document.querySelector('monster-select'); * console.log(e.value) * // ↦ 1 * // ↦ ['1','2'] * ``` * * @return {string} */ get value() { return convertSelectionToValue.call(this, this.getOption("selection")); } /** * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals} * @return {boolean} */ static get formAssociated() { return true; } /** * Set selection * * ``` * e = document.querySelector('monster-select'); * e.value=1 * ``` * * @property {string|array} value * @throws {Error} unsupported type * @fires monster-selected this event is fired when the selection is set */ set value(value) { const result = convertValueToSelection.call(this, value); setSelection.call(this, result.selection).then(() => { }).catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} toggleEventType=click,touch List of event types to be observed for opening the dropdown * @property {boolean} delegatesFocus=false lorem [see mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/delegatesFocus) * @property {Object[]} options Selection of key identifier pairs available for selection and displayed in the dropdown. * @property {string} options[].label * @property {string} options[].value * @property {string} options[].visibility hidden or visible * @property {Array} selection Selected options * @property {Integer} showMaxOptions=10 Maximum number of visible options before a scroll bar should be displayed. * @property {string} type=radio Multiple (checkbox) or single selection (radio) * @property {string} name=(random id) Name of the form field * @property {string} url Load options from server per url * @property {object} lookup Load options from server per url * @property {string} lookup.url=null Load options from server per url * @property {boolean} lookup.grouping=false Load all selected options from server per url at once (true) or one by one (false) * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) * @property {String} fetch.redirect=error * @property {String} fetch.method=GET * @property {String} fetch.mode=same-origin * @property {String} fetch.credentials=same-origin * @property {Object} fetch.headers={"accept":"application/json"}} * @property {Object} labels * @property {string} labels.cannot-be-loaded cannot be loaded * @property {string} labels.no-options-available no options available * @property {string} labels.select-an-option select an option * @property {string} labels.no-option no option in the list, maybe you have to change the filter * @property {Object} features List with features * @property {Boolean} features.clearAll=true Display of a delete button to delete the entire selection * @property {Boolean} features.clear=true Display of a delete key for deleting the specific selection * @property {Boolean} features.lazyLoad=false Load options when first opening the dropdown. (Hint; lazylLoad is not supported with remote filter) * @property {Boolean} features.closeOnSelect=false Close the dropdown when an option is selected (since 3.54.0) * @property {Boolean} features.emptyValueIfNoOptions=false If no options are available, the selection is set to an empty array * @property {Boolean} features.storeFetchedData=false Store fetched data in the object * @property {Boolean} features.useStrictValueComparison=true Use strict value comparison for the selection * @property {string} filter.defaultValue=null Default filter value, if the filter is empty, if the default value is null, then no request is made * @property {Boolean} filter.mode=options Filter mode, values: options, remote, disabled (Hint; lazylLoad is not supported with remote filter, if you use remote filter, the lazyLoad is disabled) * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} templateMapping Mapping of the template placeholders * @property {string} templateMapping.selected Selected Template * @property {Object} popper [PopperJS Options](https://popper.js.org/docs/v2/) * @property {string} popper.placement=bottom PopperJS placement * @property {Object[]} modifiers={name:offset} PopperJS placement * @property {Object} mapping * @property {String} mapping.selector=* Path to select the appropriate entries * @property {String} mapping.labelTemplate="" template with the label placeholders in the form ${name}, where name is the key (**) * @property {String} mapping.valueTemplate="" template with the value placeholders in the form ${name}, where name is the key * @property {Monster.Components.Form~exampleFilterCallback|undefined} mapping.filter Filtering of values via a function * @property {Object} formatter * @property {Monster.Components.Form~formatterSelectionCallback|undefined} formatter.selection format selection label */ get defaults() { return Object.assign( {}, super.defaults, { toggleEventType: ["click", "touch"], delegatesFocus: false, options: [], selection: [], showMaxOptions: 10, type: "radio", name: new ID("s").toString(), features: { clearAll: true, clear: true, lazyLoad: false, closeOnSelect: false, emptyValueIfNoOptions: false, storeFetchedData: false, useStrictValueComparison: false }, url: null, lookup: { url: null, grouping: false }, labels: getTranslations2(), messages: { control: null, selected: null, emptyOptions: null }, fetch: { redirect: "error", method: "GET", mode: "same-origin", credentials: "same-origin", headers: { accept: "application/json" } }, filter: { defaultValue: null, mode: FILTER_MODE_DISABLED, position: FILTER_POSITION_INLINE, marker: { open: "{", close: "}" } }, classes: { badge: "monster-badge-primary", statusOrRemoveBadge: "empty" }, mapping: { selector: "*", labelTemplate: "", valueTemplate: "", filter: null }, formatter: { selection: buildSelectionLabel }, templates: { main: getTemplate9() }, templateMapping: { /** with the attribute `data-monster-selected-template` the template for the selected options can be defined. */ selected: getSelectionTemplate() }, popper: { placement: "bottom", middleware: ["flip", "offset:1"] } }, initOptionsFromArguments2.call(this) ); } /** * @return {Select} */ [assembleMethodSymbol]() { const self2 = this; super[assembleMethodSymbol](); initControlReferences7.call(self2); initEventHandler6.call(self2); let lazyLoadFlag = self2.getOption("features.lazyLoad", false); let remoteFilterFlag = getFilterMode.call(this) === FILTER_MODE_REMOTE; if (getFilterMode.call(this) === FILTER_MODE_REMOTE) { self2.getOption("features.lazyLoad", false); if (lazyLoadFlag === true) { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "lazyLoad is not supported with remote filter" ); lazyLoadFlag = false; } } if (self2.hasAttribute("value")) { new Processing(10, () => { this.value = this.getAttribute("value"); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message); }); } if (self2.getOption("url") !== null) { if (lazyLoadFlag || remoteFilterFlag) { lookupSelection.call(self2); } else { self2.fetch().catch((e) => { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } } let lastValue = self2.value; self2[internalSymbol].attachObserver( new Observer(function() { if (isObject(this) && this instanceof ProxyObserver) { const n = this.getSubject()?.options?.value; if (lastValue !== n) { lastValue = n; setSelection.call(self2, n).then(() => { }).catch((e) => { addAttributeToken(self2, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } } }) ); areOptionsAvailableAndInit.call(self2); return this; } /** * * @return {*} * @throws {Error} storeFetchedData is not enabled * @since 3.66.0 */ getLastFetchedData() { if (this.getOption("features.storeFetchedData") === false) { throw new Error("storeFetchedData is not enabled"); } return this?.[lastFetchedDataSymbol]; } /** * The Button.click() method simulates a click on the internal button element. * * @since 3.27.0 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click} */ click() { if (this.getOption("disabled") === true) { return; } toggle.call(this); } /** * The Button.focus() method sets focus on the internal button element. * * @since 3.27.0 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus} */ focus(options2) { if (this.getOption("disabled") === true) { return; } new Processing(() => { gatherState.call(this); focusFilter2.call(this, options2); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } /** * The Button.blur() method removes focus from the internal button element. * @link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/blur */ blur() { new Processing(() => { gatherState.call(this); blurFilter.call(this); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } /** * If no url is specified, the options are taken from the Component itself. * * @param {string|URL} url URL to fetch the options * @return {Promise} */ fetch(url) { return fetchIt.call(this, url); } /** * @return {void} */ connectedCallback() { super.connectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.addEventListener(type3, this[closeEventHandler2]); } parseSlotsToOptions.call(this); attachResizeObserver3.call(this); updatePopper.call(this); new Processing(() => { gatherState.call(this); focusFilter2.call(this); }).run().catch((e) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`); }); } /** * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.removeEventListener(type3, this[closeEventHandler2]); } disconnectResizeObserver2.call(this); } /** * Import Select Options from dataset * Not to be confused with the control defaults/options * * @param {array|object|Map|Set} data * @return {Select} * @throws {Error} map is not iterable * @throws {Error} missing label configuration * @fires monster-options-set this event is fired when the options are set */ importOptions(data) { const mappingOptions = this.getOption("mapping", {}); const selector = mappingOptions?.["selector"]; const labelTemplate = mappingOptions?.["labelTemplate"]; const valueTemplate = mappingOptions?.["valueTemplate"]; const filter = mappingOptions?.["filter"]; let flag3 = false; if (labelTemplate === "") { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "empty label template"); flag3 = true; } if (valueTemplate === "") { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "empty value template"); flag3 = true; } if (flag3 === true) { throw new Error("missing label configuration"); } const map = buildMap(data, selector, labelTemplate, valueTemplate, filter); const options2 = []; if (!isIterable(map)) { throw new Error("map is not iterable"); } const visibility = "visible"; map.forEach((label, value) => { options2.push({ value, label, visibility, data: map.get(value) }); }); runAsOptionLengthChanged.call(this, map.size); this.setOption("options", options2); fireCustomEvent(this, "monster-options-set", { options: options2 }); return this; } /** * @private * @return {Select} */ calcAndSetOptionsDimension() { calcAndSetOptionsDimension.call(this); return this; } /** * * @return {string} */ static getTag() { return "monster-select"; } /** * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [SelectStyleSheet]; } }; registerCustomElement(Select); } }); // source/components/layout/stylesheet/popper.mjs var PopperStyleSheet; var init_popper3 = __esm({ "source/components/layout/stylesheet/popper.mjs"() { init_attributes(); init_constants2(); PopperStyleSheet = new CSSStyleSheet(); try { PopperStyleSheet.insertRule( ` @layer popper { [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=control]{display:flex;position:relative} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/layout/popper.mjs function initEventHandler7() { this[closeEventHandler3] = (event) => { const path = event.composedPath(); for (const [, element] of Object.entries(path)) { if (element === this) { return; } } hide5.call(this); }; let modes = null; const modeOption = this.getOption("mode"); if (typeof modeOption === "string") { modes = modeOption.split(" "); } if (modes === null || modes === void 0 || isArray(modes) === false || modes.length === 0) { modes = ["manual"]; } for (const [, mode] of Object.entries(modes)) { initEventHandlerByMode.call(this, mode); } return this; } function initEventHandlerByMode(mode) { switch (mode) { case "manual": break; case "focus": this[buttonElementSymbol2].addEventListener("focus", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.showDialog(); }); this[buttonElementSymbol2].addEventListener("blur", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.hideDialog(); }); break; case "click": this[buttonElementSymbol2].addEventListener("click", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.toggleDialog(); }); break; case "enter": this[buttonElementSymbol2].addEventListener("mouseenter", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.showDialog(); }); break; case "auto": this[buttonElementSymbol2].addEventListener("mouseenter", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.showDialog(); }); this[buttonElementSymbol2].addEventListener("mouseleave", (event) => { if (this.getOption("features.preventOpenEventSent") === true) { event.preventDefault(); } this.hideDialog(); }); break; default: throw new Error(`Unknown mode ${mode}`); } } function attachResizeObserver4() { this[resizeObserverSymbol4] = new ResizeObserver((entries) => { if (this[timerCallbackSymbol4] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol4].touch(); return; } catch (e) { delete this[timerCallbackSymbol4]; } } this[timerCallbackSymbol4] = new DeadMansSwitch(200, () => { updatePopper2.call(this); }); }); this[resizeObserverSymbol4].observe(this.parentElement); } function disconnectResizeObserver3() { if (this[resizeObserverSymbol4] instanceof ResizeObserver) { this[resizeObserverSymbol4].disconnect(); } } function hide5() { const self2 = this; fireCustomEvent(self2, "monster-popper-hide", { self: self2 }); self2[popperElementSymbol3].style.display = "none"; removeAttributeToken(self2[controlElementSymbol5], "class", "open"); setTimeout(() => { fireCustomEvent(self2, "monster-popper-hidden", { self: self2 }); }, 0); } function show4() { const self2 = this; if (self2.getOption("disabled", false) === true) { return; } if (self2[popperElementSymbol3].style.display === STYLE_DISPLAY_MODE_BLOCK) { return; } fireCustomEvent(self2, "monster-popper-open", { self: self2 }); self2[popperElementSymbol3].style.visibility = "hidden"; self2[popperElementSymbol3].style.display = STYLE_DISPLAY_MODE_BLOCK; addAttributeToken(self2[controlElementSymbol5], "class", "open"); updatePopper2.call(self2); setTimeout(() => { fireCustomEvent(self2, "monster-popper-opened", { self: self2 }); }, 0); } function updatePopper2() { if (this[popperElementSymbol3].style.display !== STYLE_DISPLAY_MODE_BLOCK) { return; } if (this.getOption("disabled", false) === true) { return; } positionPopper.call( this, this[controlElementSymbol5], this[popperElementSymbol3], this.getOption("popper", {}) ); } function initControlReferences8() { this[controlElementSymbol5] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=control]` ); this[buttonElementSymbol2] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=button]` ); this[popperElementSymbol3] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=popper]` ); this[arrowElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=arrow]` ); return this; } function getTemplate10() { return ` <div data-monster-role="control" part="control"> <slot name="button" data-monster-role="button"></slot> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div data-monster-role="arrow"></div> <div part="content" class="flex" data-monster-replace="path:content"> </div> </div> </div> `; } var timerCallbackSymbol4, resizeObserverSymbol4, closeEventHandler3, controlElementSymbol5, buttonElementSymbol2, popperElementSymbol3, arrowElementSymbol, Popper; var init_popper4 = __esm({ "source/components/layout/popper.mjs"() { init_constants(); init_attributes(); init_constants2(); init_customelement(); init_events(); init_util(); init_deadmansswitch(); init_constants3(); init_floating_ui(); init_popper3(); init_is(); timerCallbackSymbol4 = Symbol("timerCallback"); resizeObserverSymbol4 = Symbol("resizeObserver"); closeEventHandler3 = Symbol("closeEventHandler"); controlElementSymbol5 = Symbol("controlElement"); buttonElementSymbol2 = Symbol("buttonElement"); popperElementSymbol3 = Symbol("popperElement"); arrowElementSymbol = Symbol("arrowElement"); Popper = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/popper@@instance"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates The templates for the control. * @property {string} templates.main The main template. * @property {string} mode The mode of the popper. Possible values are `click`, `enter`, `manual`, `focus`, "auto" or a combination of them. * @property {string} content The content of the popper. * @property {object} popper The popper options. * @property {string} popper.placement The placement of the popper. Possible values are `top`, `bottom`, `left` and `right`. * @property {function[]} popper.middleware The middleware functions of the popper. * @property {Object} features The features of the popper. * @property {boolean} features.preventOpenEventSent Prevents the open event from being sent. */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate10() }, mode: "auto focus", content: "<slot></slot>", popper: { placement: "top", middleware: ["autoPlacement", "shift", "offset:15", "arrow"] }, features: { preventOpenEventSent: false } }); } /** * This method is called by the `connectedCallback` method on the first call. * * @return {Void} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences8.call(this); initEventHandler7.call(this); } /** * This method returns the tag name of the element. * * @return {string} */ static getTag() { return "monster-popper"; } /** * This method returns the css styles of the element. * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [PopperStyleSheet]; } /** * This method is called when the element is connected to the dom. * * @return {void} */ connectedCallback() { super.connectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.addEventListener(type3, this[closeEventHandler3]); } updatePopper2.call(this); attachResizeObserver4.call(this); } /** * This method is called when the element is disconnected from the dom. * * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); for (const [, type3] of Object.entries(["click", "touch"])) { document.removeEventListener(type3, this[closeEventHandler3]); } disconnectResizeObserver3.call(this); } /** * With this method you can show the popper. * * @return {Popper} */ showDialog() { show4.call(this); return this; } /** * With this method you can hide the popper. * * @return {Popper} */ hideDialog() { hide5.call(this); return this; } /** * With this method you can toggle the popper. * * @return {Popper} */ toggleDialog() { if (this[popperElementSymbol3].style.display === STYLE_DISPLAY_MODE_BLOCK) { this.hideDialog(); } else { this.showDialog(); } return this; } }; registerCustomElement(Popper); } }); // source/components/form/popper.mjs var Popper2; var init_popper5 = __esm({ "source/components/form/popper.mjs"() { init_popper4(); Popper2 = class extends Popper { }; } }); // source/components/form/stylesheet/popper-button.mjs var PopperButtonStyleSheet; var init_popper_button = __esm({ "source/components/form/stylesheet/popper-button.mjs"() { init_attributes(); init_constants2(); PopperButtonStyleSheet = new CSSStyleSheet(); try { PopperButtonStyleSheet.insertRule( ` @layer popperbutton { [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}.monster-button-primary,button{align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-primary{background-color:var(--monster-bg-color-primary-4);border-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-button-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-secondary-4)}.monster-button-secondary,.monster-button-tertiary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-tertiary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-tertiary-4);border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-tertiary-4)}.monster-button-outline-primary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-primary-4);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-primary-4)}.monster-button-outline-primary,.monster-button-outline-secondary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-outline-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-secondary-4)}.monster-button-outline-tertiary{align-items:center;background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-tertiary-4);background-position:50%;border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);color:var(--monster-bg-color-tertiary-4);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}button:active,button:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}button:active{z-index:var(--monster-z-index-outline)}.monster-button-bar,.monster-button-group{align-content:center;align-items:stretch;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.monster-button-group{box-sizing:border-box;gap:0;margin:1rem 0}.monster-button-group>:not(:last-child){margin-right:calc(var(--monster-border-width)*-1)}.monster-button-group :hover{box-shadow:none}button:focus{outline:1px dashed var(--monster-color-selection-4);outline-offset:2px;z-index:var(--monster-z-index-outline)}@media (prefers-color-scheme:light){button:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:2px;z-index:var(--monster-z-index-outline)}}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}[data-monster-role=control]{display:flex;position:relative}[data-monster-role=control] button{width:100%}[data-monster-role=button]{width:-moz-max-content;width:max-content}div[data-monster-role=control]{height:100%} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/popper-button.mjs function initEventHandler8() { this[closeEventHandler4] = (event) => { const path = event.composedPath(); for (const [, element] of Object.entries(path)) { if (element === this) { return; } } this.hideDialog(); }; return this; } function attachResizeObserver5() { this[resizeObserverSymbol5] = new ResizeObserver(() => { if (this[timerCallbackSymbol5] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol5].touch(); return; } catch (e) { delete this[timerCallbackSymbol5]; } } this[timerCallbackSymbol5] = new DeadMansSwitch(200, () => { updatePopper3.call(this); }); }); this[resizeObserverSymbol5].observe(this.parentElement); } function disconnectResizeObserver4() { if (this[resizeObserverSymbol5] instanceof ResizeObserver) { this[resizeObserverSymbol5].disconnect(); } } function updatePopper3() { if (this[popperElementSymbol4].style.display !== STYLE_DISPLAY_MODE_BLOCK) { return; } if (this.getOption("disabled", false) === true) { return; } positionPopper.call( this, this[controlElementSymbol6], this[popperElementSymbol4], this.getOption("popper", {}) ); } function initControlReferences9() { this[controlElementSymbol6] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=control]` ); this[buttonElementSymbol3] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=button]` ); this[popperElementSymbol4] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=popper]` ); this[arrowElementSymbol2] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=arrow]` ); } function getTemplate11() { return ` <div data-monster-role="control" part="control"> <button data-monster-attributes="disabled path:disabled | if:true, class path:classes.button" data-monster-role="button" part="button" data-monster-replace="path:labels.button"></button> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div data-monster-role="arrow"></div> <div part="content" class="flex" data-monster-replace="path:content"> </div> </div> </div> `; } var timerCallbackSymbol5, resizeObserverSymbol5, closeEventHandler4, controlElementSymbol6, buttonElementSymbol3, popperElementSymbol4, arrowElementSymbol2, PopperButton; var init_popper_button2 = __esm({ "source/components/form/popper-button.mjs"() { init_constants(); init_attributes(); init_constants2(); init_customelement(); init_util(); init_is(); init_deadmansswitch(); init_popper5(); init_constants3(); init_popper_button(); init_floating_ui(); init_button2(); init_error(); timerCallbackSymbol5 = Symbol("timerCallback"); resizeObserverSymbol5 = Symbol("resizeObserver"); closeEventHandler4 = Symbol("closeEventHandler"); controlElementSymbol6 = Symbol("controlElement"); buttonElementSymbol3 = Symbol("buttonElement"); popperElementSymbol4 = Symbol("popperElement"); arrowElementSymbol2 = Symbol("arrowElement"); PopperButton = class extends Popper2 { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/components/form/popper-button@@instance" ); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates - The templates for the control. * @property {string} templates.main - The main template. * @property {object} labels - The labels for the control. * @property {string} labels.button - The label for the button. * @property {string} content - The content of the popper. * @property {object} popper - The popper options. * @extends {Button.defaults} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate11() }, actions: { click: (e) => { this.toggleDialog(); } }, classes: { button: "monster-button" }, labels: { button: '<slot name="button"></slot>' }, mode: "click", value: null }); } /** * * @return {Monster.Components.Form.PopperButton} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences9.call(this); initEventHandler8.call(this); return this; } /** * @return {string} */ static getTag() { return "monster-popper-button"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { const styles2 = super.getCSSStyleSheet(); styles2.push(PopperButtonStyleSheet); return styles2; } /** * @return {void} */ connectedCallback() { super.connectedCallback(); const document2 = getDocument(); for (const [, type3] of Object.entries(["click", "touch"])) { document2.addEventListener(type3, this[closeEventHandler4]); } updatePopper3.call(this); attachResizeObserver5.call(this); } /** * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); for (const [, type3] of Object.entries(["click", "touch"])) { document.removeEventListener(type3, this[closeEventHandler4]); } disconnectResizeObserver4.call(this); } /** * The Button.click() method simulates a click on the internal button element. * * @since 3.27.0 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click} */ click() { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol3] && isFunction(this[buttonElementSymbol3].click)) { this[buttonElementSymbol3].click(); } } /** * The Button.focus() method sets focus on the internal button element. * * @since 3.27.0 * @param {Object} options * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus} */ focus(options2) { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol3] && isFunction(this[buttonElementSymbol3].focus)) { this[buttonElementSymbol3].focus(options2); } } /** * The Button.blur() method removes focus from the internal button element. */ blur() { if (this[buttonElementSymbol3] && isFunction(this[buttonElementSymbol3].blur)) { this[buttonElementSymbol3].blur(); } } /** * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals} * @return {boolean} */ static get formAssociated() { return true; } /** * The current selection of the Select * * ``` * e = document.querySelector('monster-select'); * console.log(e.value) * // ↦ 1 * // ↦ ['1','2'] * ``` * * @property {string|array} */ get value() { return this.getOption("value"); } /** * Set selection * * ``` * e = document.querySelector('monster-select'); * e.value=1 * ``` * * @property {string|array} value * @throws {Error} unsupported type */ set value(value) { this.setOption("value", value); try { this?.setFormValue(this.value); } catch (e) { addErrorAttribute(this, e); } } }; registerCustomElement(PopperButton); } }); // source/components/form/stylesheet/confirm-button.mjs var ConfirmButtonStyleSheet; var init_confirm_button = __esm({ "source/components/form/stylesheet/confirm-button.mjs"() { init_attributes(); init_constants2(); ConfirmButtonStyleSheet = new CSSStyleSheet(); try { ConfirmButtonStyleSheet.insertRule( ` @layer confirmbutton { .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}div[data-monster-role=decision]{align-items:center;display:flex;justify-content:space-evenly;margin:1rem 0 .4rem;width:-moz-max-content;width:max-content}div[data-monster-role=control]{height:100%;width:-moz-max-content;width:max-content}button{width:100%} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/stylesheet/message-state-button.mjs var MessageStateButtonStyleSheet; var init_message_state_button = __esm({ "source/components/form/stylesheet/message-state-button.mjs"() { init_attributes(); init_constants2(); MessageStateButtonStyleSheet = new CSSStyleSheet(); try { MessageStateButtonStyleSheet.insertRule( ` @layer messagestatebutton { @font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}[data-monster-role=control] [data-monster-role=button]{min-width:-moz-max-content;min-width:max-content;width:100%}button{width:-moz-max-content;width:max-content} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/message-state-button.mjs function initEventHandlerByMode2(mode) { switch (mode) { case "manual": this[buttonElementSymbol4].setOption("actions.click", (e) => { const callback = this.getOption("actions.click"); if (isFunction(callback)) { callback(e); } }); break; case "submit": this[buttonElementSymbol4].setOption("actions.click", (e) => { const form = this.form; if (form instanceof HTMLFormElement) { form.requestSubmit(); } }); break; } } function initControlReferences10() { this[buttonElementSymbol4] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=button]` ); } function getTemplate12() { return ` <div data-monster-role="control" part="control"> <monster-state-button exportparts="button:button-button,control:button-control" data-monster-attributes="data-monster-option-classes-button path:classes.button, disabled path:features.disableButton | if:true" part="button" name="button" data-monster-role="button"> <span data-monster-replace="path:labels.button"></span> </monster-state-button> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div data-monster-role="arrow"></div> <div data-monster-role="message" part="message" class="flex" data-monster-replace="path:message.content"></div> </div> </div> </div> `; } var buttonElementSymbol4, MessageStateButton; var init_message_state_button2 = __esm({ "source/components/form/message-state-button.mjs"() { init_constants(); init_constants2(); init_customelement(); init_is(); init_validate(); init_popper5(); init_message_state_button(); init_state_button(); init_state_button2(); init_is(); buttonElementSymbol4 = Symbol("buttonElement"); MessageStateButton = class extends Popper2 { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/components/form/message-state-button@@instance" ); } /** * * @param {string} state * @param {number} timeout * @return {MessageStateButton} * @throws {TypeError} value is not a string * @throws {TypeError} value is not an instance */ setState(state, timeout) { return this[buttonElementSymbol4].setState(state, timeout); } /** * * @return {MessageStateButton} */ removeState() { return this[buttonElementSymbol4].removeState(); } /** * @return {Monster.Components.Form.Types.State|undefined} */ getState() { return this[buttonElementSymbol4].getState(); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} labels Label definitions * @property {string} labels.button Button label * @property {Object} mode Mode definitions (manual, submit) */ get defaults() { return Object.assign({}, super.defaults, { message: { title: void 0, content: void 0, icon: void 0 }, templates: { main: getTemplate12() }, mode: "manual", labels: { button: "<slot></slot>" }, classes: { button: "monster-button-primary" }, actions: { click: (e) => { } }, features: { disableButton: false } }); } /** */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences10.call(this); let modes = null; const modeOption = this.getOption("mode"); if (typeof modeOption === "string") { modes = modeOption.split(" "); } if (modes === null || modes === void 0 || isArray(modes) === false || modes.length === 0) { modes = ["manual"]; } for (const [, mode] of Object.entries(modes)) { initEventHandlerByMode2.call(this, mode); } return this; } /** * Sets the message * * @param {string|HTMLElement}message * @param {string} title * @param {string} icon * @return {MessageStateButton} */ setMessage(message, title, icon) { if (isString(message)) { if (message === "") { throw new TypeError("message must not be empty"); } const containerDiv = document.createElement("div"); const messageDiv = document.createElement("div"); const titleDiv = document.createElement("div"); titleDiv.setAttribute(ATTRIBUTE_ROLE, "message-title-box"); let titleElement, iconElement; if (title !== void 0) { title = validateString(title); titleElement = document.createElement("div"); titleElement.setAttribute("class", ""); titleElement.innerHTML = title; titleElement.setAttribute(ATTRIBUTE_ROLE, "message-title"); titleDiv.appendChild(titleElement); } if (icon !== void 0) { icon = validateString(icon); iconElement = document.createElement("div"); iconElement.setAttribute("class", ""); iconElement.innerHTML = icon; iconElement.setAttribute(ATTRIBUTE_ROLE, "message-icon"); titleDiv.appendChild(iconElement); } messageDiv.innerHTML = message; containerDiv.appendChild(titleDiv); containerDiv.appendChild(messageDiv); this.setOption("message.content", containerDiv); } else if (message instanceof HTMLElement) { this.setOption("message.content", message); } else { throw new TypeError( "message must be a string or an instance of HTMLElement" ); } return this; } /** * clears the Message * * @return {MessageStateButton} */ clearMessage() { this.setOption("message.title", void 0); this.setOption("message.content", void 0); this.setOption("message.icon", void 0); return this; } /** * With this method you can show the popper with timeout feature. * * @param {number} timeout * @return {MessageStateButton} */ showMessage(timeout) { this.showDialog.call(this); if (timeout !== void 0) { setTimeout(() => { super.hideDialog(); }, timeout); } return this; } /** * With this method you can show the popper. * * @return {MessageStateButton} */ showDialog() { if (this.getOption("message.content") === void 0) { return; } super.showDialog(); return this; } /** * * @return {MessageStateButton} */ hideMessage() { super.hideDialog(); return this; } /** * * @return {MessageStateButton} */ toggleMessage() { super.toggleDialog(); return this; } /** * * @return {Object} */ getMessage() { return this.getOption("message"); } /** * * @return {string} */ static getTag() { return "monster-message-state-button"; } /** * * @return {Array<CSSStyleSheet>} */ static getCSSStyleSheet() { const styles2 = Popper2.getCSSStyleSheet(); styles2.push(StateButtonStyleSheet); styles2.push(MessageStateButtonStyleSheet); return styles2; } /** * The Button.click() method simulates a click on the internal button element. * * @since 3.27.0 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click} */ click() { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol4] && isFunction(this[buttonElementSymbol4].click)) { this[buttonElementSymbol4].click(); } } /** * The Button.focus() method sets focus on the internal button element. * * @since 3.27.0 * @param {Object} options * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus} */ focus(options2) { if (this.getOption("disabled") === true) { return; } if (this[buttonElementSymbol4] && isFunction(this[buttonElementSymbol4].focus)) { this[buttonElementSymbol4].focus(options2); } } /** * The Button.blur() method removes focus from the internal button element. */ blur() { if (this[buttonElementSymbol4] && isFunction(this[buttonElementSymbol4].blur)) { this[buttonElementSymbol4].blur(); } } }; registerCustomElement(MessageStateButton); } }); // source/components/form/confirm-button.mjs var confirm_button_exports = {}; __export(confirm_button_exports, { ConfirmButton: () => ConfirmButton }); function getAction(type3) { const self2 = this; return function(event) { const callback = self2.getOption(`actions.${type3}`); if (typeOf(callback) !== "function") { return; } callback.call(this, event); }; } function initEventhandler() { this[cancelButtonElementSymbol].setOption( "clickEventType", this.getOption("clickEventType", ["click"]) ); this[cancelButtonElementSymbol].setOption( "actions.click", getAction.call(this, "cancel") ); this[confirmButtonElementSymbol].setOption( "clickEventType", this.getOption("clickEventType", ["click"]) ); this[confirmButtonElementSymbol].setOption("actions.click", () => { const callback = getAction.call(this, "confirm"); fireCustomEvent(this, "monster-confirm", {}); callback.call(this); fireCustomEvent(this, "monster-confirmed", {}); }); return this; } function initControlReferences11() { this[confirmButtonElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=confirm]` ); this[cancelButtonElementSymbol] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=cancel]` ); } function getTemplate13() { return ` <div data-monster-role="control" part="control"> <button data-monster-attributes="disabled path:disabled | if:true, class path:classes.button" data-monster-role="button" part="button" data-monster-replace="path:labels.button"></button> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div data-monster-role="arrow"></div> <div part="message" class="flex" data-monster-replace="path:labels.message"></div> <div data-monster-role="decision"> <monster-message-state-button exportparts="monster-state-button:confirm-button, control:confirm-control, button-button:confirm-control-button, button-control:confirm-button-control, popper:confirm-popper, message:confirm-popper-message-message, icon:confirm-popper-message-icon, title:confirm-popper-message-title" data-monster-attributes="data-monster-button-class path:classes.confirmButton" data-monster-role="confirm" part="confirm"> <span data-monster-replace="path:labels.confirm"></span> </monster-message-state-button> <monster-button exportparts="button:cancel-button,control:cancel-control" data-monster-attributes="data-monster-button-class path:classes.cancelButton" data-monster-role="cancel" part="cancel"> <span data-monster-replace="path:labels.cancel"></span> </monster-button> </div> </div> </div> `; } var confirmButtonElementSymbol, cancelButtonElementSymbol, ConfirmButton; var init_confirm_button2 = __esm({ "source/components/form/confirm-button.mjs"() { init_constants(); init_constants2(); init_customelement(); init_typeof(); init_button2(); init_popper_button2(); init_confirm_button(); init_events(); init_button2(); init_message_state_button2(); init_popper_button(); init_state_button(); confirmButtonElementSymbol = Symbol("confirmButtonElement"); cancelButtonElementSymbol = Symbol("cancelButtonElement"); ConfirmButton = class extends PopperButton { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/components/form/confirm-button@@instance" ); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} toggleEventType=click,touch List of event types to be observed for opening the confirm message * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} labels.button='<slot name="button"></slot>' Button label * @property {string} labels.message='<slot>Should I Stay or Should I Go?</slot>' Message * @property {string} labels.confirm='<slot name="confirm">Confirm</slot>' Confirm button label * @property {string} labels.cancel='<slot name="cancel">Cancel</slot>' Cancel button label * @property {Monster.Components.Form~exampleActionCallback} actions.confirm * @property {Monster.Components.Form~exampleActionCallback} actions.cancel List of event types to be observed for opening the dropdown * @property {Object} popper [PopperJS Options](https://popper.js.org/docs/v2/) * @property {string} popper.placement=top PopperJS placement * @extends {PopperButton} */ get defaults() { const obj = Object.assign({}, super.defaults, { templates: { main: getTemplate13() }, labels: { button: '<slot name="button"></slot>', message: "<slot>Should I Stay or Should I Go?</slot>", confirm: '<slot name="confirm">Confirm</slot>', cancel: '<slot name="cancel">Cancel</slot>' } }); obj["classes"]["confirmButton"] = "monster-button-primary"; obj["classes"]["cancelButton"] = "monster-button-secondary"; obj["actions"]["cancel"] = (e) => { this.hideDialog(); }; obj["actions"]["confirm"] = (e) => { throw new Error("this callback must be implemented"); }; return obj; } hideDialog() { super.hideDialog(); this[confirmButtonElementSymbol].removeState(); return this; } /** * * @return {Monster.Components.Form.PopperButton} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences11.call(this); initEventhandler.call(this); } /** * @return {string} */ static getTag() { return "monster-confirm-button"; } /** * @return {Array} */ static getCSSStyleSheet() { const styles2 = PopperButton.getCSSStyleSheet(); styles2.push(ConfirmButtonStyleSheet); return styles2; } /** * * @return {Monster.Components.Form.PopperButton} */ showDialog() { const confirmButtonClass = this.getOption("classes.confirmButton"); if (confirmButtonClass) { this[confirmButtonElementSymbol].setOption( "classes.button", confirmButtonClass ); } const cancelButtonClass = this.getOption("classes.cancelButton"); if (cancelButtonClass) { this[cancelButtonElementSymbol].setOption( "classes.button", cancelButtonClass ); } return super.showDialog(); } /** * Set the confirm button state * * @param {string} state * @param {number} timeout * @return {Monster.Components.Form.ConfirmButton} */ setConfirmButtonState(state, timeout) { this[confirmButtonElementSymbol].setState(state, timeout); return this; } /** * Set and show the confirm button message * * @param {string} message * @param {number} timeout * @return {Monster.Components.Form.ConfirmButton} */ showConfirmButtonMessage(message, timeout) { this[confirmButtonElementSymbol].setMessage(message); setTimeout(() => { this[confirmButtonElementSymbol].showMessage(timeout); }, 0); return this; } }; registerCustomElement(ConfirmButton); } }); // source/types/nodelist.mjs var NodeList2; var init_nodelist = __esm({ "source/types/nodelist.mjs"() { init_is(); init_node(); init_validate(); init_constants(); NodeList2 = class _NodeList extends Set { /** * @throws {Error} invalid value type * @param {NodeList|Node|Array<Node>}values */ constructor(values) { super(); if (values === void 0) return; if (isArray(values)) { values.forEach((value) => this.add(value)); } else if (isInstance(values, _NodeList)) { values.forEach((value) => this.add(value)); } else if (isInstance(values, Node2)) { this.add(values); } else { throw new Error("invalid value type"); } } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/node-list"); } /** * * @param {Node} node * @return {Monster.Types.NodeList} */ add(node) { super.add(validateInstance(node, Node2)); return this; } /** * @param {Node} node * @return {NodeList} */ remove(node) { super.delete(validateInstance(node, Node2)); return this; } /** * @param {Node} node * @return {boolean} */ has(node) { return super.has(validateInstance(node, Node2)); } /** * @return {NodeList} */ clear() { super.clear(); return this; } /** * @return {NodeList} */ toArray() { return Array.from(this); } /** * @return {NodeList} */ toJSON() { return this.toArray(); } /** * @return {NodeList} */ toString() { const parts = []; for (const node of this.toArray()) { parts.push(node.toString()); } return parts.join("\n"); } get length() { return super.size; } }; } }); // source/types/node.mjs function setChildLevelAndParent(node, operand, visitedNodes) { const self2 = this; if (visitedNodes.has(node)) { throw new Error( "the node has already been visited and cannot be traversed again" ); } visitedNodes.add(node); if (node !== this) { node[treeStructureSymbol].parent = this; } node[treeStructureSymbol].childNodes.forEach(function(child) { child[treeStructureSymbol].parent = node; child[treeStructureSymbol].level = node[treeStructureSymbol].level + operand; setChildLevelAndParent.call(self2, child, operand, visitedNodes); }); return this; } var internalValueSymbol, treeStructureSymbol, Node2; var init_node = __esm({ "source/types/node.mjs"() { init_base(); init_is(); init_nodelist(); init_validate(); init_constants(); internalValueSymbol = Symbol("internalData"); treeStructureSymbol = Symbol("treeStructure"); Node2 = class _Node extends Base { /** * @param {*} [value] */ constructor(value) { super(); this[internalValueSymbol] = value; this[treeStructureSymbol] = { parent: null, childNodes: new NodeList2(), level: 0 }; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/node"); } /** * @property {*} */ get value() { return this[internalValueSymbol]; } /** * @property {*} */ set value(value) { this[internalValueSymbol] = value; } /** * @property {Monster.Types.Node|null} */ get parent() { return this[treeStructureSymbol].parent; } /** * @property {integer} */ get level() { return this[treeStructureSymbol].level; } /** * * @property {NodeList} */ get childNodes() { return this[treeStructureSymbol].childNodes; } /** * * @property {NodeList} */ set childNodes(childNodes) { this[treeStructureSymbol].childNodes = validateInstance( childNodes, NodeList2 ); setChildLevelAndParent.call(this, this, 1, /* @__PURE__ */ new Set()); } /** * @return {Monster.Types.Node} * @param {Node} node */ appendChild(node) { this[treeStructureSymbol].childNodes.add(validateInstance(node, _Node)); node[treeStructureSymbol].parent = this; node[treeStructureSymbol].level = this.level + 1; setChildLevelAndParent.call(this, node, 1, /* @__PURE__ */ new Set()); return this; } /** * @return {Monster.Types.Node} * @param {Node} node */ removeChild(node) { this[treeStructureSymbol].childNodes.remove(validateInstance(node, _Node)); node[treeStructureSymbol].parent = null; node[treeStructureSymbol].level = 0; setChildLevelAndParent.call(this, node, -1, /* @__PURE__ */ new Set()); return this; } /** * * @return {boolean} */ hasChildNodes() { return this[treeStructureSymbol].childNodes.length > 0; } /** * @return {Monster.Types.Node} * @param {Node} node */ hasChild(node) { return this[treeStructureSymbol].childNodes.has( validateInstance(node, _Node) ); } /** * @since 1.28.0 * @return {string} */ toString() { const parts = []; if (this[internalValueSymbol]) { let label = this[internalValueSymbol]; if (!isPrimitive(label)) label = JSON.stringify(this[internalValueSymbol]); parts.push(label); } if (!this.hasChildNodes()) { return parts.join("\n"); } const count = this.childNodes.length; let counter = 0; for (const node of this.childNodes) { counter++; const prefix = (count === counter ? "\u2514" : "\u251C").padStart( 2 * node.level, " |" ); parts.push(prefix + node.toString()); } return parts.join("\n"); } }; } }); // source/data/buildtree.mjs function buildTree(subject, selector, idKey, parentIDKey, options2) { const nodes = /* @__PURE__ */ new Map(); const maxDepth = 100; if (!isObject(options2)) { options2 = {}; } options2 = extend( {}, { rootReferences: [null, void 0], filter: void 0 }, options2 ); const filter = options2?.filter; let rootReferences = options2.rootReferences; if (!isArray(rootReferences)) { rootReferences = [rootReferences]; } const childMap = assembleParts(subject, selector, filter, function(o, k, m) { const key = o?.[idKey]; let ref = o?.[parentIDKey]; if (rootReferences.indexOf(ref) !== -1) ref = rootSymbol; if (key === void 0) { throw new Error("the object has no value for the specified id"); } o[parentSymbol] = ref; const node = new Node2(o); this.has(ref) ? this.get(ref).add(node) : this.set(ref, new NodeList2().add(node)); nodes.set(key, node); }); nodes.forEach((node) => { const id = node?.["value"]?.[idKey]; if (id === void 0) { throw new Error("the object has no value for the specified id"); } if (childMap.has(id)) { node.childNodes = childMap.get(id); childMap.delete(id); } }); const list = new NodeList2(); childMap.forEach((s) => { if (s instanceof Set) { s.forEach((n) => { list.add(n); }); } }); return list; } var parentSymbol, rootSymbol; var init_buildtree = __esm({ "source/data/buildtree.mjs"() { init_is(); init_node(); init_nodelist(); init_clone(); init_buildmap(); init_extend(); parentSymbol = Symbol("parent"); rootSymbol = Symbol("root"); } }); // source/types/noderecursiveiterator.mjs var isNodeListSymbol, NodeRecursiveIterator; var init_noderecursiveiterator = __esm({ "source/types/noderecursiveiterator.mjs"() { init_constants(); init_base(); init_is(); init_node(); init_nodelist(); init_validate(); isNodeListSymbol = Symbol("isNodeList"); NodeRecursiveIterator = class _NodeRecursiveIterator extends Base { /** * @param node */ constructor(node) { super(); this[isNodeListSymbol] = false; if (isInstance(node, NodeList2)) { const children = node; const n = new Node2(); n.childNodes = children; this[isNodeListSymbol] = true; this[internalSymbol] = n; return; } this[internalSymbol] = validateInstance(node, Node2); } /** * @private * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield */ [Symbol.iterator] = function* () { if (this[internalSymbol] === void 0) { return; } if (this[isNodeListSymbol] !== true) { yield this[internalSymbol]; } if (this[internalSymbol].hasChildNodes()) { const childNodes = this[internalSymbol].childNodes; for (const node of childNodes) { yield* new _NodeRecursiveIterator(node); } } }; /** * @param {function} callback * @return {NodeRecursiveIterator} */ forEach(callback) { for (const node of this) { callback(node); } return this; } }; } }); // source/components/form/stylesheet/tree-select.mjs var TreeSelectStyleSheet; var init_tree_select = __esm({ "source/components/form/stylesheet/tree-select.mjs"() { init_attributes(); init_constants2(); TreeSelectStyleSheet = new CSSStyleSheet(); try { TreeSelectStyleSheet.insertRule( ` @layer treeselect { [data-monster-role=badge]{display:inline-flex}[data-monster-role=option]{display:flex}[data-monster-role=option][data-monster-state=open][data-monster-has-children=true] [data-monster-role=folder-handler]{content:url('data:image/svg+xml; utf8, <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M2.5 0c-.166 0-.33.016-.487.048l.194.98A1.51 1.51 0 0 1 2.5 1h.458V0H2.5zm2.292 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zm1.833 0h-.916v1h.916V0zm1.834 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zM13.5 0h-.458v1h.458c.1 0 .199.01.293.029l.194-.981A2.51 2.51 0 0 0 13.5 0zm2.079 1.11a2.511 2.511 0 0 0-.69-.689l-.556.831c.164.11.305.251.415.415l.83-.556zM1.11.421a2.511 2.511 0 0 0-.689.69l.831.556c.11-.164.251-.305.415-.415L1.11.422zM16 2.5c0-.166-.016-.33-.048-.487l-.98.194c.018.094.028.192.028.293v.458h1V2.5zM.048 2.013A2.51 2.51 0 0 0 0 2.5v.458h1V2.5c0-.1.01-.199.029-.293l-.981-.194zM0 3.875v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 5.708v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 7.542v.916h1v-.916H0zm15 .916h1v-.916h-1v.916zM0 9.375v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .916v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .917v.458c0 .166.016.33.048.487l.98-.194A1.51 1.51 0 0 1 1 13.5v-.458H0zm16 .458v-.458h-1v.458c0 .1-.01.199-.029.293l.981.194c.032-.158.048-.32.048-.487zM.421 14.89c.183.272.417.506.69.689l.556-.831a1.51 1.51 0 0 1-.415-.415l-.83.556zm14.469.689c.272-.183.506-.417.689-.69l-.831-.556c-.11.164-.251.305-.415.415l.556.83zm-12.877.373c.158.032.32.048.487.048h.458v-1H2.5c-.1 0-.199-.01-.293-.029l-.194.981zM13.5 16c.166 0 .33-.016.487-.048l-.194-.98A1.51 1.51 0 0 1 13.5 15h-.458v1h.458zm-9.625 0h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zm1.834 0h.916v-1h-.916v1zm1.833 0h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zM4.5 7.5a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1h-7z"/></svg>');display:block;height:13px;margin-right:8px;width:13px}[data-monster-role=option][data-monster-state=close][data-monster-has-children=true] [data-monster-role=folder-handler]{content:url('data:image/svg+xml; utf8, <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M2.5 0c-.166 0-.33.016-.487.048l.194.98A1.51 1.51 0 0 1 2.5 1h.458V0H2.5zm2.292 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zm1.833 0h-.916v1h.916V0zm1.834 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zM13.5 0h-.458v1h.458c.1 0 .199.01.293.029l.194-.981A2.51 2.51 0 0 0 13.5 0zm2.079 1.11a2.511 2.511 0 0 0-.69-.689l-.556.831c.164.11.305.251.415.415l.83-.556zM1.11.421a2.511 2.511 0 0 0-.689.69l.831.556c.11-.164.251-.305.415-.415L1.11.422zM16 2.5c0-.166-.016-.33-.048-.487l-.98.194c.018.094.028.192.028.293v.458h1V2.5zM.048 2.013A2.51 2.51 0 0 0 0 2.5v.458h1V2.5c0-.1.01-.199.029-.293l-.981-.194zM0 3.875v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 5.708v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 7.542v.916h1v-.916H0zm15 .916h1v-.916h-1v.916zM0 9.375v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .916v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .917v.458c0 .166.016.33.048.487l.98-.194A1.51 1.51 0 0 1 1 13.5v-.458H0zm16 .458v-.458h-1v.458c0 .1-.01.199-.029.293l.981.194c.032-.158.048-.32.048-.487zM.421 14.89c.183.272.417.506.69.689l.556-.831a1.51 1.51 0 0 1-.415-.415l-.83.556zm14.469.689c.272-.183.506-.417.689-.69l-.831-.556c-.11.164-.251.305-.415.415l.556.83zm-12.877.373c.158.032.32.048.487.048h.458v-1H2.5c-.1 0-.199-.01-.293-.029l-.194.981zM13.5 16c.166 0 .33-.016.487-.048l-.194-.98A1.51 1.51 0 0 1 13.5 15h-.458v1h.458zm-9.625 0h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zm1.834-1v1h.916v-1h-.916zm1.833 1h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zM8.5 4.5a.5.5 0 0 0-1 0v3h-3a.5.5 0 0 0 0 1h3v3a.5.5 0 0 0 1 0v-3h3a.5.5 0 0 0 0-1h-3v-3z"/></svg>');display:block;height:13px;margin-right:8px;width:13px}[data-monster-role=option][data-monster-visibility=hidden]{display:none}[data-monster-role=option][data-monster-visibility=visible]{display:flex}[data-monster-role=option][data-monster-has-children=false] [data-monster-role=folder-handler]{content:" ";display:block;height:13px;margin-right:8px;width:13px}[data-monster-role=option][data-monster-intend="0"]{display:flex;margin:0}[data-monster-role=option][data-monster-intend="1"]{margin:0 0 0 20px}[data-monster-role=option][data-monster-intend="2"]{margin:0 0 0 40px}[data-monster-role=option][data-monster-intend="3"]{margin:0 0 0 60px}[data-monster-role=option][data-monster-intend="4"]{margin:0 0 0 80px}[data-monster-role=option][data-monster-intend="5"]{margin:0 0 0 100px}[data-monster-role=option][data-monster-intend="6"]{margin:0 0 0 110px}[data-monster-role=option][data-monster-intend="7"]{margin:0 0 0 120px}[data-monster-role=option][data-monster-intend="8"]{margin:0 0 0 130px}[data-monster-role=option][data-monster-filtered=true]{display:none} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/tree-select.mjs var tree_select_exports = {}; __export(tree_select_exports, { TreeSelect: () => TreeSelect, formatHierarchicalSelection: () => formatHierarchicalSelection }); function handleOptionKeyboardEvents2(event) { switch (event?.["code"]) { case "ArrowLeft": closeOrOpenCurrentOption.call(this, event, "close"); event.preventDefault(); break; case "ArrowRight": closeOrOpenCurrentOption.call(this, event, "open"); event.preventDefault(); break; } } function closeOrOpenCurrentOption(event, mode) { validateInstance(event, Event); if (typeof event.composedPath !== "function") { throw new Error("unsupported event"); } const path = event.composedPath(); const optionNode = path.shift(); const state = optionNode.getAttribute("data-monster-state"); if (state !== mode) { const handler = optionNode.querySelector( "[data-monster-role=folder-handler]" ); if (handler instanceof HTMLElement) { fireEvent(handler, "click"); } } } function formatKeyLabel(node) { validateInstance(node, Node2); const v = node.value; if (v === void 0) { throw new Error("the object has no value for the specified id"); } const label = new Formatter(v).format( this.getOption("mapping.labelTemplate", "") ); const value = new Formatter(v).format( this.getOption("mapping.valueTemplate", "") ); return { value, label }; } function buildTreeLabels(value) { let node = this[internalNodesSymbol].get(value); if (node === void 0) { node = this[internalNodesSymbol].get(parseInt(value)); } const parts = []; if (node instanceof Node2) { let ptr = node; while (ptr) { const formattedValues = formatKeyLabel.call(this, ptr); parts.unshift(formattedValues.label); ptr = ptr.parent; } } return parts; } function formatHierarchicalSelection(value) { return buildTreeLabels.call(this, value).join(this.getOption("formatter.separator", " / ")); } function initEventHandler9() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[openOptionEventHandler] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, "folder-handler" ); if (!(element instanceof HTMLElement)) { return; } const container = findClosestByAttribute(element, ATTRIBUTE_ROLE, "option"); const index = container.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE).split("-").pop(); const currentState = this.getOption(`options.${index}.state`); const newState = currentState === "close" ? "open" : "close"; this.setOption(`options.${index}.state`, newState); const newVisibility = newState === "open" ? "visible" : "hidden"; if (container.hasAttribute(ATTRIBUTE_INTEND)) { const intend = container.getAttribute(ATTRIBUTE_INTEND); let ref = container.nextElementSibling; const childIntend = parseInt(intend) + 1; const cmp = (a2, b) => { if (newState === "open") { return a2 === b; } return a2 >= b; }; while (ref?.hasAttribute(ATTRIBUTE_INTEND) && cmp(parseInt(ref.getAttribute(ATTRIBUTE_INTEND)), childIntend)) { const refIndex = ref.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE).split("-").pop(); this.setOption(`options.${refIndex}.visibility`, newVisibility); if (newState === "close") { this.setOption(`options.${refIndex}.state`, "close"); } ref = ref.nextElementSibling; } } }; this[keyEventHandler2] = (event) => { const path = event.composedPath(); const element = path?.[0]; let role; if (element instanceof HTMLElement) { if (element.hasAttribute(ATTRIBUTE_ROLE)) { role = element.getAttribute(ATTRIBUTE_ROLE); } else if (element === this) { show.call(this); focusFilter.call(this); } else { const e = element.closest(`[${ATTRIBUTE_ROLE}]`); if (e instanceof HTMLElement && e.hasAttribute()) { role = e.getAttribute(ATTRIBUTE_ROLE); } } } else { return; } switch (role) { case "option-label": case "option-control": case "option": handleOptionKeyboardEvents2.call(this, event); break; } }; this.shadowRoot.addEventListener("keydown", this[keyEventHandler2]); this.shadowRoot.addEventListener("click", this[openOptionEventHandler]); } function initOptionsFromArguments3() { const options2 = {}; const url = this.getAttribute(ATTRIBUTE_FORM_URL); if (isString(url)) { options2["url"] = new URL(url).toString(); } return options2; } function getTemplate14() { return ` <template id="options"> <div data-monster-role="option" tabindex="-1" data-monster-attributes=" data-monster-intend path:options.intend, data-monster-state path:options.state, data-monster-visibility path:options.visibility, data-monster-filtered path:options.filtered, data-monster-has-children path:options.has-children"> <div data-monster-role="folder-handler"></div> <label part="option" role="option"> <input data-monster-role="option-control" data-monster-attributes=" type path:type, role path:role, value path:options.value, name path:name, part path:type | prefix:option- | suffix: form " tabindex="-1"> <span data-monster-replace="path:options | index:label" part="option-label"></span> </label> </div> </template> <template id="selection"> <div data-monster-role="badge" part="badge" data-monster-attributes=" data-monster-value path:selection | index:value, class path:classes | index:badge, part path:type | suffix:-option | prefix: form-" tabindex="-1"> <div data-monster-replace="path:selection | index:label" part="badge-label" data-monster-role="badge-label"></div> <div part="remove-badge" data-monster-select-this data-monster-attributes="class path:features.clear | ?::hidden " data-monster-role="remove-badge" tabindex="-1"></div> </div> </template> <slot class="hidden"></slot> <div data-monster-role="control" part="control" tabindex="0"> <div data-monster-role="container"> \${selected} </div> <div data-monster-role="popper" part="popper" tabindex="-1" class="monster-color-primary-1"> <div class="option-filter-control" role="search"> <input type="text" role="searchbox" part="popper-filter" name="popper-filter" data-monster-role="filter" autocomplete="off" tabindex="0"> </div> <div part="content" class="flex" data-monster-replace="path:content"> <div part="options" data-monster-role="options" data-monster-insert="options path:options" tabindex="-1"></div> </div> <div part="no-options" data-monster-role="no-options" data-monster-replace="path:messages.emptyOptions"></div> </div> <div part="status-or-remove-badges" data-monster-role="status-or-remove-badges" data-monster-attributes="class path:classes.statusOrRemoveBadge | suffix:\\ status-or-remove-badges"></div> </div> `; } var internalNodesSymbol, keyEventHandler2, TreeSelect, openOptionEventHandler; var init_tree_select2 = __esm({ "source/components/form/tree-select.mjs"() { init_buildtree(); init_attributes(); init_constants2(); init_constants(); init_customelement(); init_events(); init_formatter(); init_is(); init_node(); init_noderecursiveiterator(); init_validate(); init_constants3(); init_select2(); init_select(); init_tree_select(); internalNodesSymbol = Symbol("internalNodes"); keyEventHandler2 = Symbol("keyEventHandler"); TreeSelect = class extends Select { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/form/tree-select@@instance"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @extends Select * @property {String} mapping.rootReferences=['0', undefined, null] * @property {String} mapping.idTemplate=id * @property {String} mapping.parentTemplate=parent * @property {String} mapping.selection * @property {Object} formatter * @property {String} formatter.separator=" / " */ get defaults() { return Object.assign( {}, super.defaults, { mapping: { rootReferences: ["0", void 0, null], id: "id", parent: "parent", selector: "*", labelTemplate: "", valueTemplate: "" }, formatter: { selection: formatHierarchicalSelection, separator: " / " }, templates: { main: getTemplate14() } }, initOptionsFromArguments3.call(this) ); } /** * * @return {string} */ static getTag() { return "monster-tree-select"; } /** * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [SelectStyleSheet, TreeSelectStyleSheet]; } /** * Import Select Options from dataset * Not to be confused with the control defaults/options * * @param {array|object|Map|Set} data * @return {Select} * @throws {Error} map is not iterable */ importOptions(data) { this[internalNodesSymbol] = /* @__PURE__ */ new Map(); const mappingOptions = this.getOption("mapping", {}); const filter = mappingOptions?.["filter"]; const rootReferences = mappingOptions?.["rootReferences"]; const id = this.getOption("mapping.id", "id"); const parentID = this.getOption("mapping.parent", "parent"); const selector = mappingOptions?.["selector"]; const options2 = []; try { const nodes = buildTree(data, selector, id, parentID, { filter, rootReferences }); for (const node of nodes) { const iterator = new NodeRecursiveIterator(node); for (const n of iterator) { const formattedValues = formatKeyLabel.call(this, n); const label = formattedValues.label; const value = formattedValues.value; const intend = n.level; const visibility = intend > 0 ? "hidden" : "visible"; const state = "close"; this[internalNodesSymbol].set(value, n); options2.push({ value, label, intend, state, visibility, ["has-children"]: n.hasChildNodes() }); } } this.setOption("options", options2); fireCustomEvent(this, "monster-options-set", { options: options2 }); } catch (e) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e?.message || e); } return this; } /** * * @return {TreeSelect} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initEventHandler9.call(this); } }; openOptionEventHandler = Symbol("openOptionEventHandler"); registerCustomElement(TreeSelect); } }); // source/components/form/stylesheet/toggle-switch.mjs var ToggleSwitchStyleSheet; var init_toggle_switch = __esm({ "source/components/form/stylesheet/toggle-switch.mjs"() { init_attributes(); init_constants2(); ToggleSwitchStyleSheet = new CSSStyleSheet(); try { ToggleSwitchStyleSheet.insertRule( ` @layer toggleswitch { :after,:before,:root{--monster-color-gray-1:#f6f6f6;--monster-color-gray-2:#e2e2e2;--monster-color-gray-3:#8b8b8b;--monster-color-gray-4:#6f6f6f;--monster-color-gray-5:#3e3e3e;--monster-color-gray-6:#222;--monster-color-rose-1:#fff7f9;--monster-color-rose-2:#ffdce5;--monster-color-rose-3:#ff3b8d;--monster-color-rose-4:#db0072;--monster-color-rose-5:#800040;--monster-color-rose-6:#4c0023;--monster-color-raspberry-1:#fff8f8;--monster-color-raspberry-2:#ffdddf;--monster-color-raspberry-3:#ff426c;--monster-color-raspberry-4:#de0051;--monster-color-raspberry-5:#82002c;--monster-color-raspberry-6:#510018;--monster-color-red-1:#fff8f6;--monster-color-red-2:#ffddd8;--monster-color-red-3:#ff4647;--monster-color-red-4:#e0002b;--monster-color-red-5:#830014;--monster-color-red-6:#530003;--monster-color-orange-1:#fff8f5;--monster-color-orange-2:#ffded1;--monster-color-orange-3:#fd4d00;--monster-color-orange-4:#cd3c00;--monster-color-orange-5:#752100;--monster-color-orange-6:#401600;--monster-color-cinnamon-1:#fff8f3;--monster-color-cinnamon-2:#ffdfc6;--monster-color-cinnamon-3:#d57300;--monster-color-cinnamon-4:#ac5c00;--monster-color-cinnamon-5:#633300;--monster-color-cinnamon-6:#371d00;--monster-color-amber-1:#fff8ef;--monster-color-amber-2:#ffe0b2;--monster-color-amber-3:#b98300;--monster-color-amber-4:#926700;--monster-color-amber-5:#523800;--monster-color-amber-6:#302100;--monster-color-yellow-1:#fff9e5;--monster-color-yellow-2:#ffe53e;--monster-color-yellow-3:#9c8b00;--monster-color-yellow-4:#7d6f00;--monster-color-yellow-5:#463d00;--monster-color-yellow-6:#292300;--monster-color-lime-1:#f7ffac;--monster-color-lime-2:#d5f200;--monster-color-lime-3:#819300;--monster-color-lime-4:#677600;--monster-color-lime-5:#394100;--monster-color-lime-6:#222600;--monster-color-chartreuse-1:#e5ffc3;--monster-color-chartreuse-2:#98fb00;--monster-color-chartreuse-3:#5c9b00;--monster-color-chartreuse-4:#497c00;--monster-color-chartreuse-5:#264500;--monster-color-chartreuse-6:#182600;--monster-color-green-1:#e0ffd9;--monster-color-green-2:#72ff6c;--monster-color-green-3:#00a21f;--monster-color-green-4:#008217;--monster-color-green-5:#004908;--monster-color-green-6:#062800;--monster-color-emerald-1:#dcffe6;--monster-color-emerald-2:#5dffa2;--monster-color-emerald-3:#00a05a;--monster-color-emerald-4:#008147;--monster-color-emerald-5:#004825;--monster-color-emerald-6:#002812;--monster-color-aquamarine-1:#daffef;--monster-color-aquamarine-2:#42ffc6;--monster-color-aquamarine-3:#009f78;--monster-color-aquamarine-4:#007f5f;--monster-color-aquamarine-5:#004734;--monster-color-aquamarine-6:#00281b;--monster-color-teal-1:#d7fff7;--monster-color-teal-2:#00ffe4;--monster-color-teal-3:#009e8c;--monster-color-teal-4:#007c6e;--monster-color-teal-5:#00443c;--monster-color-teal-6:#002722;--monster-color-cyan-1:#c4fffe;--monster-color-cyan-2:#00fafb;--monster-color-cyan-3:#00999a;--monster-color-cyan-4:#007a7b;--monster-color-cyan-5:#004344;--monster-color-cyan-6:#002525;--monster-color-powder-1:#dafaff;--monster-color-powder-2:#8df0ff;--monster-color-powder-3:#0098a9;--monster-color-powder-4:#007987;--monster-color-powder-5:#004048;--monster-color-powder-6:#002227;--monster-color-sky-1:#e3f7ff;--monster-color-sky-2:#aee9ff;--monster-color-sky-3:#0094b4;--monster-color-sky-4:#007590;--monster-color-sky-5:#00404f;--monster-color-sky-6:#001f28;--monster-color-cerulean-1:#e8f6ff;--monster-color-cerulean-2:#b9e3ff;--monster-color-cerulean-3:#0092c5;--monster-color-cerulean-4:#00749d;--monster-color-cerulean-5:#003c54;--monster-color-cerulean-6:#001d2a;--monster-color-azure-1:#e8f2ff;--monster-color-azure-2:#c6e0ff;--monster-color-azure-3:#008fdb;--monster-color-azure-4:#0071af;--monster-color-azure-5:#003b5e;--monster-color-azure-6:#001c30;--monster-color-blue-1:#f0f4ff;--monster-color-blue-2:#d4e0ff;--monster-color-blue-3:#0089fc;--monster-color-blue-4:#006dca;--monster-color-blue-5:#00386d;--monster-color-blue-6:#001a39;--monster-color-indigo-1:#f3f3ff;--monster-color-indigo-2:#deddff;--monster-color-indigo-3:#657eff;--monster-color-indigo-4:#0061fc;--monster-color-indigo-5:#00328a;--monster-color-indigo-6:#001649;--monster-color-violet-1:#f7f1ff;--monster-color-violet-2:#e8daff;--monster-color-violet-3:#9b70ff;--monster-color-violet-4:#794aff;--monster-color-violet-5:#2d0fbf;--monster-color-violet-6:#0b0074;--monster-color-purple-1:#fdf4ff;--monster-color-purple-2:#f7d9ff;--monster-color-purple-3:#d150ff;--monster-color-purple-4:#b01fe3;--monster-color-purple-5:#660087;--monster-color-purple-6:#3a004f;--monster-color-magenta-1:#fff3fc;--monster-color-magenta-2:#ffd7f6;--monster-color-magenta-3:#f911e0;--monster-color-magenta-4:#ca00b6;--monster-color-magenta-5:#740068;--monster-color-magenta-6:#44003c;--monster-color-pink-1:#fff7fb;--monster-color-pink-2:#ffdcec;--monster-color-pink-3:#ff2fb2;--monster-color-pink-4:#d2008f;--monster-color-pink-5:#790051;--monster-color-pink-6:#4b0030;--monster-gradient-tangerine-1:#e5b875;--monster-gradient-tangerine-2:#d9a362;--monster-gradient-tangerine-3:#c08a4e;--monster-gradient-tangerine-4:#a7713b;--monster-gradient-tangerine-5:#8f5a28;--monster-gradient-tangerine-6:#360505;--monster-color-seashell-1:#f7f5ef;--monster-color-seashell-2:#e5e2d9;--monster-color-seashell-3:#cbc6b3;--monster-color-seashell-4:#a19d8a;--monster-color-seashell-5:#7a7566;--monster-color-seashell-6:#514d3f}.monster-theme-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-theme-primary-disabled-1{background-color:var(--monster-bg-color-primary-disabled-1);color:var(--monster-color-primary-disabled-1)}.monster-theme-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-theme-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-theme-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-theme-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-theme-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-theme-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-theme-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-border-color-1{border-color:var(--monster-color-border-1)}.monster-color-neutral-1{color:var(--monster-color-primary-1)}.monster-bg-color-primary-1{background-color:var(--monster-bg-color-primary-1)}.monster-bg-color-secondary-1{background-color:var(--monster-bg-color-secondary-1)}.monster-bg-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1)}.monster-color-primary-1{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-color-secondary-1{background-color:var(--monster-bg-color-secondary-1);color:var(--monster-color-secondary-1)}.monster-color-tertiary-1{background-color:var(--monster-bg-color-tertiary-1);color:var(--monster-color-tertiary-1)}.monster-color-destructive-1{background-color:var(--monster-bg-color-destructive-1);color:var(--monster-color-destructive-1)}.monster-color-success-1{background-color:var(--monster-bg-color-success-1);color:var(--monster-color-success-1)}.monster-color-warning-1{background-color:var(--monster-bg-color-warning-1);color:var(--monster-color-warning-1)}.monster-color-error-1{background-color:var(--monster-bg-color-error-1);color:var(--monster-color-error-1)}.monster-color-selection-1{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}.monster-theme-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-theme-primary-disabled-2{background-color:var(--monster-bg-color-primary-disabled-2);color:var(--monster-color-primary-disabled-2)}.monster-theme-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-theme-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-theme-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-theme-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-theme-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-theme-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-theme-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-border-color-2{border-color:var(--monster-color-border-2)}.monster-color-neutral-2{color:var(--monster-color-primary-2)}.monster-bg-color-primary-2{background-color:var(--monster-bg-color-primary-2)}.monster-bg-color-secondary-2{background-color:var(--monster-bg-color-secondary-2)}.monster-bg-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2)}.monster-color-primary-2{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2)}.monster-color-secondary-2{background-color:var(--monster-bg-color-secondary-2);color:var(--monster-color-secondary-2)}.monster-color-tertiary-2{background-color:var(--monster-bg-color-tertiary-2);color:var(--monster-color-tertiary-2)}.monster-color-destructive-2{background-color:var(--monster-bg-color-destructive-2);color:var(--monster-color-destructive-2)}.monster-color-success-2{background-color:var(--monster-bg-color-success-2);color:var(--monster-color-success-2)}.monster-color-warning-2{background-color:var(--monster-bg-color-warning-2);color:var(--monster-color-warning-2)}.monster-color-error-2{background-color:var(--monster-bg-color-error-2);color:var(--monster-color-error-2)}.monster-color-selection-2{background-color:var(--monster-bg-color-selection-2);color:var(--monster-color-selection-2)}.monster-theme-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-theme-primary-disabled-3{background-color:var(--monster-bg-color-primary-disabled-3);color:var(--monster-color-primary-disabled-3)}.monster-theme-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-theme-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-theme-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-theme-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-theme-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-theme-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-theme-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-border-color-3{border-color:var(--monster-color-border-3)}.monster-color-neutral-3{color:var(--monster-color-primary-3)}.monster-bg-color-primary-3{background-color:var(--monster-bg-color-primary-3)}.monster-bg-color-secondary-3{background-color:var(--monster-bg-color-secondary-3)}.monster-bg-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3)}.monster-color-primary-3{background-color:var(--monster-bg-color-primary-3);color:var(--monster-color-primary-3)}.monster-color-secondary-3{background-color:var(--monster-bg-color-secondary-3);color:var(--monster-color-secondary-3)}.monster-color-tertiary-3{background-color:var(--monster-bg-color-tertiary-3);color:var(--monster-color-tertiary-3)}.monster-color-destructive-3{background-color:var(--monster-bg-color-destructive-3);color:var(--monster-color-destructive-3)}.monster-color-success-3{background-color:var(--monster-bg-color-success-3);color:var(--monster-color-success-3)}.monster-color-warning-3{background-color:var(--monster-bg-color-warning-3);color:var(--monster-color-warning-3)}.monster-color-error-3{background-color:var(--monster-bg-color-error-3);color:var(--monster-color-error-3)}.monster-color-selection-3{background-color:var(--monster-bg-color-selection-3);color:var(--monster-color-selection-3)}.monster-theme-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-theme-primary-disabled-4{background-color:var(--monster-bg-color-primary-disabled-4);color:var(--monster-color-primary-disabled-4)}.monster-theme-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-theme-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-theme-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-theme-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-theme-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-theme-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-theme-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-border-color-4{border-color:var(--monster-color-border-4)}.monster-color-neutral-4{color:var(--monster-color-primary-4)}.monster-bg-color-primary-4{background-color:var(--monster-bg-color-primary-4)}.monster-bg-color-secondary-4{background-color:var(--monster-bg-color-secondary-4)}.monster-bg-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4)}.monster-color-primary-4{background-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-color-secondary-4{background-color:var(--monster-bg-color-secondary-4);color:var(--monster-color-secondary-4)}.monster-color-tertiary-4{background-color:var(--monster-bg-color-tertiary-4);color:var(--monster-color-tertiary-4)}.monster-color-destructive-4{background-color:var(--monster-bg-color-destructive-4);color:var(--monster-color-destructive-4)}.monster-color-success-4{background-color:var(--monster-bg-color-success-4);color:var(--monster-color-success-4)}.monster-color-warning-4{background-color:var(--monster-bg-color-warning-4);color:var(--monster-color-warning-4)}.monster-color-error-4{background-color:var(--monster-bg-color-error-4);color:var(--monster-color-error-4)}.monster-color-selection-4{background-color:var(--monster-bg-color-selection-4);color:var(--monster-color-selection-4)}.monster-theme-control-container-1,.monster-theme-control-row-1{border:1px solid var(--monster-theme-control-border-color)}.monster-theme-control-container-1,.monster-theme-control-element,.monster-theme-control-row-1{background-color:var(--monster-theme-control-bg-color);color:var(--monster-theme-control-color)}.monster-theme-control-background{background-color:var(--monster-theme-control-bg-color)}.monster-theme-background-inherit{background-color:inherit!important}.monster-theme-on{background-color:var(--monster-theme-on-bg-color);color:var(--monster-theme-on-color)}.monster-theme-off{background-color:var(--monster-theme-off-bg-color);color:var(--monster-theme-off-color)}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}[data-monster-role=control]{box-sizing:border-box;font-family:inherit;font-size:inherit;margin:0;outline:none}[data-monster-role=control]:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:2px}[data-monster-role=control] .switch{border-color:var(--monster-theme-control-border-color);border-radius:var(--monster-theme-control-border-radius);border-style:var(--monster-theme-control-border-style);border-width:var(--monster-theme-control-border-width);box-sizing:border-box;display:inline-grid;grid-template-columns:1fr 1fr;position:relative;transition:background-color .2s;width:100%}[data-monster-role=control] .label{display:block;max-width:100%;overflow:hidden;padding:0 .2em;text-align:center;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}[data-monster-role=control] .switch-slider{bottom:4px;left:4px;position:absolute;right:4px;top:4px;transition:.2s;width:calc(50% - 4px)}[data-monster-role=control] .switch[data-monster-state=on] .label.off{visibility:hidden}[data-monster-role=control] .switch[data-monster-state=off] .label.off,[data-monster-role=control] .switch[data-monster-state=on] .label.on{visibility:visible}[data-monster-role=control] .switch[data-monster-state=off] .label.on{visibility:hidden}[data-monster-role=control] .switch[data-monster-state=on] .switch-slider{transform:translateX(100%)}[data-monster-role=control] .switch[data-monster-state=off] .switch-slider{transform:translateX(0)}:host{cursor:pointer}:host([disabled]){cursor:not-allowed} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/form/toggle-switch.mjs var toggle_switch_exports = {}; __export(toggle_switch_exports, { STATE_OFF: () => STATE_OFF, STATE_ON: () => STATE_ON, ToggleSwitch: () => ToggleSwitch }); function initControlReferences12() { this[switchElementSymbol2] = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=switch]` ); } function toggleOn() { if (!this[switchElementSymbol2]) { return; } this[switchElementSymbol2].classList.remove(this.getOption("classes.off")); this[switchElementSymbol2].classList.add(this.getOption("classes.on")); const callback = this.getOption("actions.on"); if (isFunction(callback)) { callback.call(this); } if (typeof this.setFormValue === "function") { this.setFormValue(this.getOption("values.on")); } } function toggleOff() { if (!this[switchElementSymbol2]) { return; } this[switchElementSymbol2].classList.remove(this.getOption("classes.on")); this[switchElementSymbol2].classList.add(this.getOption("classes.off")); const callback = this.getOption("actions.off"); if (isFunction(callback)) { callback.call(this); } if (typeof this.setFormValue === "function") { this.setFormValue(this.getOption("values.off")); } } function showError() { if (!this[switchElementSymbol2]) { return; } this[switchElementSymbol2].classList.remove(this.getOption("classes.on")); this[switchElementSymbol2].classList.remove(this.getOption("classes.off")); this[switchElementSymbol2].classList.add(this.getOption("classes.error")); } function validateAndSetValue() { const value = this.getOption("value"); const validatedValues = []; validatedValues.push(this.getOption("values.on")); validatedValues.push(this.getOption("values.off")); if (validatedValues.includes(value) === false) { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, 'The value "' + value + '" must be "' + this.getOption("values.on") + '" or "' + this.getOption("values.off") ); this.setOption("disabled", true); this.formDisabledCallback(true); showError.call(this); return; } this.setOption("disabled", false); this.formDisabledCallback(false); if (value === this.getOption("values.on")) { toggleOn.call(this); return; } toggleOff.call(this); } function initEventHandler10() { const self2 = this; let lastValue = self2.value; self2[internalSymbol].attachObserver( new Observer(function() { if (isObject(this) && this instanceof ProxyObserver) { const n = this.getSubject()?.options?.value; if (lastValue !== n) { lastValue = n; validateAndSetValue.call(self2); } } }) ); self2.addEventListener("keyup", (event) => { if (event.keyCode === 32) { self2.toggle(); } }); self2.addEventListener("click", (event) => { self2.toggle(); }); self2.addEventListener("touch", (event) => { self2.toggle(); }); return this; } function getTemplate15() { return ` <div data-monster-role="control" part="control" tabindex="0"> <div class="switch" data-monster-role="switch" data-monster-attributes="data-monster-state path:value | call:state-callback"> <div class="label on" data-monster-replace="path:labels.toggleSwitchOn"></div> <div class="label off" data-monster-replace="path:labels.toggleSwitchOff"></div> <div data-monster-attributes="class path:classes.handle | suffix:\\ switch-slider"></div> </div> </div>`; } var switchElementSymbol2, STATE_ON, STATE_OFF, ToggleSwitch; var init_toggle_switch2 = __esm({ "source/components/form/toggle-switch.mjs"() { init_constants(); init_customcontrol(); init_observer(); init_proxyobserver(); init_attributes(); init_customelement(); init_is(); init_toggle_switch(); init_constants2(); init_util(); init_events(); init_error(); switchElementSymbol2 = Symbol("switchElement"); STATE_ON = "on"; STATE_OFF = "off"; ToggleSwitch = class extends CustomControl { /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {string} value=current value of the element * @property {Boolean} disabled=disabled=false Disabled state * @property {Object} classes * @property {string} classes.on=specifies the class for the on state. * @property {string} classes.off=specifies the class for the off state. * @property {Object} values * @property {string} values.off=specifies the value of the element if it is not selected * @property {Object} labels * @property {string} labels.on=specifies the label for the on state. * @property {string} labels.off=specifies the label for the off state. * @property {string} actions * @property {string} actions.on=specifies the action for the on state. * @property {string} actions.off=specifies the action for the off state. * @property {Object} templates * @property {string} templates.main the main template used by the control. */ get defaults() { return Object.assign({}, super.defaults, { value: null, disabled: false, classes: { on: "monster-theme-on", off: "monster-theme-off", handle: "monster-theme-primary-1", error: "monster-theme-error-1" }, values: { on: "on", off: "off" }, labels: { toggleSwitchOn: "\u2714", toggleSwitchOff: "\u2716" }, templates: { main: getTemplate15() }, actions: { on: () => { }, off: () => { } } }); } /** * @return {void} */ [assembleMethodSymbol]() { const self2 = this; super[assembleMethodSymbol](); initControlReferences12.call(this); initEventHandler10.call(this); getWindow2().requestAnimationFrame(() => { if (self2.getOption("value") === null) { self2.setOption("value", self2.getOption("values.off")); } if (self2.hasAttribute("value")) { self2.setOption("value", self2.getAttribute("value")); } validateAndSetValue.call(self2); if (this.state === STATE_ON) { toggleOn.call(self2); } else { toggleOff.call(self2); } }); } /** * updater transformer methods for pipe * * @return {function} */ [updaterTransformerMethodsSymbol]() { return { "state-callback": (Wert) => { return this.state; } }; } /** * @return [CSSStyleSheet] */ static getCSSStyleSheet() { return [ToggleSwitchStyleSheet]; } /** * toggle switch * * ``` * e = document.querySelector('monster-toggle-switch'); * e.click() * ``` */ click() { this.toggle(); } /** * toggle switch on/off * * ``` * e = document.querySelector('monster-toggle-switch'); * e.toggle() * ``` * * @return {ToggleSwitch} */ toggle() { if (this.getOption("value") === this.getOption("values.on")) { return this.toggleOff(); } return this.toggleOn(); } /** * toggle switch on * * ``` * e = document.querySelector('monster-toggle-switch'); * e.toggleOn() * ``` * * @return {ToggleSwitch} */ toggleOn() { this.setOption("value", this.getOption("values.on")); fireEvent(this, "change"); return this; } /** * toggle switch off * * ``` * e = document.querySelector('monster-toggle-switch'); * e.toggleOff() * ``` * * @return {ToggleSwitch} */ toggleOff() { this.setOption("value", this.getOption("values.off")); fireEvent(this, "change"); return this; } /** * returns the status of the element * * ``` * e = document.querySelector('monster-toggle-switch'); * console.log(e.state) * // ↦ off * ``` * * @return {string} */ get state() { return this.getOption("value") === this.getOption("values.on") ? STATE_ON : STATE_OFF; } /** * The current value of the Switch * * ``` * e = document.querySelector('monster-toggle-switch'); * console.log(e.value) * // ↦ on * ``` * * @return {string} */ get value() { return this.getOption("value"); } /** * Set value * * ``` * e = document.querySelector('monster-toggle-switch'); * e.value="on" * ``` * * @property {string} value */ set value(value) { if (value === this.getOption("values.on") || value === this.getOption("values.off")) { if (this.state !== (value === this.getOption("values.on") ? STATE_ON : STATE_OFF)) { this.setOption("value", value); } return; } addErrorAttribute( this, 'The value "' + value + '" must be "' + this.getOption("values.on") + '" or "' + this.getOption("values.off") ); showError.call(this); } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/components/form/toggle-switch@@instance" ); } /** * * @returns {string} */ static getTag() { return "monster-toggle-switch"; } }; registerCustomElement(ToggleSwitch); } }); // source/components/form/template.mjs var template_exports = {}; __export(template_exports, { Template: () => Template2 }); function initOptionsFromArguments4() { const options2 = {}; const url = this.getAttribute(ATTRIBUTE_FORM_URL); if (isString(url)) { options2["url"] = new URL(url, document.location).toString(); } if (this.hasAttribute(ATTRIBUTE_FORM_RELOAD)) { options2["reload"] = this.getAttribute(ATTRIBUTE_FORM_RELOAD).toLowerCase(); } return options2; } function initIntersectionObserver2() { if (this[intersectionObserverWasInitialized2] === true) { return; } this[intersectionObserverWasInitialized2] = true; const options2 = { threshold: [0.5] }; const callback = (entries, observer2) => { for (const [, entry] of entries.entries()) { if (entry.isIntersecting === true) { if (this.getOption("reload") === "onshow") { observer2.disconnect(); } try { loadContent3.call(this); } catch (e) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.toString()); } } } }; const observer = new IntersectionObserver(callback, options2); observer.observe(this); } function loadContent3() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } let url = this.getOption("url", void 0); if (url instanceof URL) { url = url.toString(); } if (!isString(url) || url === "") { throw new Error("missing url"); } const options2 = this.getOption("fetch", {}); const defaultSlot = this.shadowRoot.querySelector("slot[name=default]"); if (!(defaultSlot instanceof HTMLElement)) { throw new Error("missing default slot"); } defaultSlot.style.display = "block"; let container = this.shadowRoot.querySelector( `[${ATTRIBUTE_ROLE}=container]` ); if (!(container instanceof HTMLElement)) { container = document.createElement("div"); container.style.display = "none"; container.setAttribute(ATTRIBUTE_ROLE, "container"); this.shadowRoot.appendChild(container); } loadAndAssignContent(container, url, options2).then(() => { defaultSlot.style.display = "none"; container.style.display = "block"; runProcessors.call(this); }).catch((e) => { throw e; }); } function runProcessors() { const processors = this.getOption("processors"); if (!isArray(processors)) return this; for (const [, processor] of processors.entries()) { const source = processor?.source; let destination = processor?.destination; if (source === null) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "missing source"); continue; } if (destination === null || destination === void 0 || destination === "") { destination = "[" + ATTRIBUTE_ROLE + "=container]"; } if (isString(source) && isString(destination)) { const sourceNode = this.shadowRoot.querySelector(source); let destinationNode = document.querySelector(destination); if (destinationNode === null) { destinationNode = this.shadowRoot.querySelector(destination); if (destinationNode === null) { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "destination not found" ); continue; } } if (sourceNode instanceof HTMLElement && destinationNode instanceof HTMLElement) { destinationNode.innerHTML = sourceNode.cloneNode(true).innerHTML; } } else { addAttributeToken( this, ATTRIBUTE_ERRORMESSAGE, "invalid source or destination" ); } } return this; } function getTemplate16() { return ` <slot name="default"></slot> `; } var intersectionObserverWasInitialized2, Template2; var init_template2 = __esm({ "source/components/form/template.mjs"() { init_constants(); init_attributes(); init_constants2(); init_customelement(); init_is(); init_constants3(); init_fetch(); intersectionObserverWasInitialized2 = Symbol("wasInitialized"); Template2 = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/form/template"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {string} url=undefined * @property {string} reload=undefined currently the only value defined is `onshow`. Currently the only value defined is onshow. this removes the IntersectionObserver. this means that the content is only loaded once. reloading of the content does not occur. * @property {Object[]} processors * @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) * @property {String} fetch.redirect=error * @property {String} fetch.method=GET * @property {String} fetch.mode=same-origin * @property {String} fetch.credentials=same-origin * @property {Object} fetch.headers={"accept":"text/html"}} */ get defaults() { return Object.assign( {}, super.defaults, { templates: { main: getTemplate16() }, url: null, reload: null, processors: [], fetch: { redirect: "error", method: "GET", mode: "same-origin", credentials: "same-origin", headers: { accept: "text/html" } } }, initOptionsFromArguments4.call(this) ); } /** * This method determines which attributes are to be monitored by `attributeChangedCallback()`. * * @return {string[]} */ static get observedAttributes() { const list = super.observedAttributes; list.push(ATTRIBUTE_FORM_URL); return list; } /** * */ [initMethodSymbol]() { super[initMethodSymbol](); this[attributeObserverSymbol][ATTRIBUTE_FORM_URL] = (url) => { if (this.hasAttribute(ATTRIBUTE_FORM_URL)) { this.setOption("url", new URL(url, document.location).toString()); } }; } /** * This method is called internal and should not be called directly. * @throws {Error} missing default slot * @throws {Error} no shadow-root is defined * @throws {Error} missing url * @throws {Error} we won't be able to read the data * @throws {Error} request failed * @throws {Error} not found * @throws {Error} undefined status or type * @fires monster-fetched * @return {void} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initIntersectionObserver2.call(this); } /** * This method is called internal and should not be called directly. * * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return []; } /** * This method is called internal and should not be called directly. * * @return {string} */ static getTag() { return "monster-template"; } /** * load content from url * * It is important to know that with this function the loading is executed * directly. it is loaded as well when the element is not visible. * * @param {string|undefined} url */ fetch(url) { if (isString(url) || url instanceof URL) { this.setAttribute(ATTRIBUTE_FORM_URL, `${url}`); } return loadContent3.call(this); } }; registerCustomElement(Template2); } }); // source/components/host/stylesheet/host.mjs var HostStyleSheet; var init_host = __esm({ "source/components/host/stylesheet/host.mjs"() { init_attributes(); init_constants2(); HostStyleSheet = new CSSStyleSheet(); try { HostStyleSheet.insertRule( ` @layer host { .block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}:where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}html{height:100%}body,html{min-height:calc(100vh - 40px)}body{box-sizing:border-box;margin:0;padding:0;word-break:break-word}body:focus-visible{outline:none}:focus-visible{outline:none}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}input,meter,progress,select,textarea{accent-color:var(--monster-color-secondary-2);background-color:var(--monster-bg-color-primary-1);border-color:var(--monster-theme-control-border-color);border-radius:var(--monster-theme-control-border-radius);border-style:var(--monster-theme-control-border-style);border-width:var(--monster-theme-control-border-width);box-sizing:border-box;color:var(--monster-color-primary-1);font-family:inherit;font-size:100%;margin:0;outline:none}input,select,textarea{height:-moz-fit-content;height:fit-content;padding:.4rem .6rem}textarea{min-height:6rem;resize:vertical}input[type=color]{height:2rem;margin:0;padding:.1rem;width:2rem}input:hover:not([type=radio]):not([type=checkbox]):not([type=range]),select:hover,textarea:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}input:focus,select:focus,textarea:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:3px}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}[data-monster-role=control]{outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}:after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}[data-monster-role=control]{align-content:stretch;border:0;box-sizing:border-box;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;margin:0;min-height:100vh;padding:0}[data-monster-role=header]{height:64px;margin:0 0 0 60px}[data-monster-role=content],[data-monster-role=footer],[data-monster-role=header]{align-items:center;display:flex;justify-content:space-between} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/i18n/providers/embed.mjs var Embed; var init_embed = __esm({ "source/i18n/providers/embed.mjs"() { init_constants(); init_extend(); init_util(); init_is(); init_validate(); init_locale(); init_provider(); init_translations(); Embed = class _Embed extends Provider { /** * ```html * <script id="translations" type="application/json"> * { * "hello": "Hallo" * } * <\/script> * ``` * * * ```javascript * new Embed('translations') * ``` * * @param {HTMLElement|string} elementOrId * @param {Object} options */ constructor(elementOrId, options2) { super(options2); if (options2 === void 0) { options2 = {}; } if (elementOrId instanceof HTMLElement) { this.translateElement = elementOrId; } else { this.translateElement = getDocument().getElementById( validateString(elementOrId) ); } this[internalSymbol] = extend( {}, super.defaults, this.defaults, validateObject(options2) ); } /** * Defaults * * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API} */ get defaults() { return extend({}, super.defaults); } /** * * @param {Locale|string} locale * @return {Promise} */ getTranslations(locale) { if (isString(locale)) { locale = parseLocale(locale); } return new Promise((resolve, reject) => { if (this.translateElement === null) { reject(new Error("Text not found")); return; } if (!(this.translateElement instanceof HTMLScriptElement)) { reject(new Error("Element is not a script tag")); return; } if (this.translateElement.type !== "application/json") { reject( new Error("Element is not a script tag with type application/json") ); return; } let translations2 = null; try { translations2 = JSON.parse(this.translateElement.innerHTML.trim()); } catch (e) { reject(e); return; } if (translations2 === null) { reject(new Error("Translations not found or invalid")); return; } const t = new Translations(locale); t.assignTranslations(translations2); resolve(t); }); } /** * Initializes the translations for the current document. * * `script[data-monster-role=translations]` is searched for and the translations are assigned to the element. * * @param element * @returns {Promise<Awaited<*[]>>|Promise<Awaited<unknown>[]>} */ static assignTranslationsToElement(element) { const d = getDocument(); if (!(element instanceof HTMLElement)) { element = d.querySelector("body"); } const list = d.querySelectorAll("script[data-monster-role=translations]"); if (list === null) { return Promise.resolve([]); } const promises = []; list.forEach((translationElement) => { const p = new _Embed(translationElement, {}); promises.push(p.assignToElement(void 0, element)); }); return Promise.all(promises); } }; } }); // source/dom/ready.mjs var ready_exports = {}; __export(ready_exports, { domReady: () => domReady, windowReady: () => windowReady }); var domReady, windowReady; var init_ready = __esm({ "source/dom/ready.mjs"() { init_util(); domReady = new Promise((resolve) => { const document2 = getDocument(); if (document2.readyState === "loading") { document2.addEventListener("DOMContentLoaded", resolve); } else { resolve(); } }); windowReady = new Promise((resolve) => { const document2 = getDocument(); const window2 = getWindow2(); if (document2.readyState === "complete") { resolve(); } else { window2.addEventListener("load", resolve); } }); } }); // source/dom/focusmanager.mjs var KEY_DOCUMENT, KEY_CONTEXT, stackSymbol, FocusManager; var init_focusmanager = __esm({ "source/dom/focusmanager.mjs"() { init_extend(); init_basewithoptions(); init_global(); init_is(); init_stack(); init_validate(); init_constants(); KEY_DOCUMENT = "document"; KEY_CONTEXT = "context"; stackSymbol = Symbol("stack"); FocusManager = class extends BaseWithOptions { /** * * @param {Object|undefined} options */ constructor(options2) { super(options2); validateInstance(this.getOption(KEY_DOCUMENT), HTMLDocument); this[stackSymbol] = new Stack(); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/focusmanager"); } /** * @property {HTMLDocument} document the document object into which the node is to be appended */ get defaults() { return extend({}, super.defaults, { [KEY_DOCUMENT]: getGlobalObject("document"), [KEY_CONTEXT]: void 0 }); } /** * Remembers the current focus on a stack. * Several focus can be stored. * * @return {Monster.DOM.FocusManager} */ storeFocus() { const active = this.getActive(); if (active instanceof Node) { this[stackSymbol].push(active); } return this; } /** * The last focus on the stack is set again * * @return {Monster.DOM.FocusManager} */ restoreFocus() { const last = this[stackSymbol].pop(); if (last instanceof Node) { this.focus(last); } return this; } /** * * @param {Node} element * @param {boolean} preventScroll * @throws {TypeError} value is not an instance of * @return {Monster.DOM.FocusManager} */ focus(element, preventScroll) { validateInstance(element, Node); element.focus({ preventScroll: preventScroll ?? false }); return this; } /** * * @return {Element} */ getActive() { return this.getOption(KEY_DOCUMENT).activeElement; } /** * Select all elements that can be focused * * @param {string|undefined} query * @return {array} * @throws {TypeError} value is not an instance of */ getFocusable(query) { let contextElement = this.getOption(KEY_CONTEXT); if (contextElement === void 0) { contextElement = this.getOption(KEY_DOCUMENT); } validateInstance(contextElement, Node); if (query !== void 0) { validateString(query); } return [ ...contextElement.querySelectorAll( 'details, button, input, [tabindex]:not([tabindex="-1"]), select, textarea, a[href], body' ) ].filter((element) => { if (query !== void 0 && !element.matches(query)) { return false; } if (element.hasAttribute("disabled")) return false; if (element.getAttribute("aria-hidden") === "true") return false; const rect = element.getBoundingClientRect(); if (rect.width === 0) return false; if (rect.height === 0) return false; return true; }); } /** * @param {string} query * @return {Monster.DOM.FocusManager} */ focusNext(query) { const current = this.getActive(); const focusable = this.getFocusable(query); if (!isArray(focusable) || focusable.length === 0) { return this; } if (current instanceof Node) { const index = focusable.indexOf(current); if (index > -1) { this.focus(focusable[index + 1] || focusable[0]); } else { this.focus(focusable[0]); } } else { this.focus(focusable[0]); } return this; } /** * @param {string} query * @return {Monster.DOM.FocusManager} */ focusPrev(query) { const current = this.getActive(); const focusable = this.getFocusable(query); if (!isArray(focusable) || focusable.length === 0) { return this; } if (current instanceof Node) { const index = focusable.indexOf(current); if (index > -1) { this.focus(focusable[index - 1] || focusable[focusable.length - 1]); } else { this.focus(focusable[focusable.length - 1]); } } else { this.focus(focusable[focusable.length - 1]); } return this; } }; } }); // source/types/internal.mjs function equipWithInternal() { validateObject(this); if (!hasGetter(this, propertyName)) { Object.defineProperty(this, propertyName, { get: function() { return {}; } }); } const defaults = extend({}, this[propertyName] || {}); this[internalSymbol] = new ProxyObserver(defaults); this["attachInternalObserver"] = (observer) => { this[internalSymbol].attachObserver(observer); return this; }; this["detachInternalObserver"] = (observer) => { this[internalSymbol].detachObserver(observer); return this; }; this["containsInternalObserver"] = (observer) => { return this[internalSymbol].containsObserver(observer); }; this["setInternal"] = (path, value) => { new Pathfinder(this[internalSymbol].getSubject()).setVia(path, value); return this; }; this["setInternals"] = (options2) => { if (isString(options2)) { options2 = parseOptionsJSON3(options2); } extend(this[internalSymbol].getSubject(), defaults, options2); return this; }; this["getInternal"] = (path, defaultValue) => { let value; try { value = new Pathfinder(this[internalSymbol].getRealSubject()).getVia( path ); } catch (e) { } if (value === void 0) return defaultValue; return value; }; } function hasGetter(obj, prop) { while (isObject(obj)) { if (Object.getOwnPropertyDescriptor(obj, prop)?.["get"]) { return true; } obj = Object.getPrototypeOf(obj); } return false; } function parseOptionsJSON3(data) { let obj = {}; if (!isString(data)) { return obj; } try { const dataUrl = parseDataURL(data); data = dataUrl.content; } catch (e) { } try { obj = JSON.parse(data); } catch (e) { throw e; } return validateObject(obj); } var propertyName; var init_internal = __esm({ "source/types/internal.mjs"() { init_constants(); init_extend(); init_pathfinder(); init_dataurl(); init_is(); init_observer(); init_proxyobserver(); init_validate(); init_is(); propertyName = "internalDefaults"; } }); // source/dom/resource.mjs var resource_exports = {}; __export(resource_exports, { KEY_DOCUMENT: () => KEY_DOCUMENT2, KEY_QUERY: () => KEY_QUERY, Resource: () => Resource, referenceSymbol: () => referenceSymbol }); function appendToDocument() { const targetNode = document.querySelector(this.getOption(KEY_QUERY, "head")); if (!(targetNode instanceof HTMLElement)) { throw new Error("target not found"); } addEvents.call(this); targetNode.appendChild(this[referenceSymbol]); return this; } function addEvents() { const onError = () => { this[referenceSymbol].removeEventListener("error", onError); this[referenceSymbol].removeEventListener("load", onLoad); this[internalStateSymbol].setSubject({ loaded: true, error: `${this[referenceSymbol][this.constructor.getURLAttribute()]} is not available` }); return; }; const onLoad = () => { this[referenceSymbol].removeEventListener("error", onError); this[referenceSymbol].removeEventListener("load", onLoad); this[internalStateSymbol].getSubject()["loaded"] = true; }; this[referenceSymbol].addEventListener("load", onLoad, false); this[referenceSymbol].addEventListener("error", onError, false); return this; } var KEY_DOCUMENT2, KEY_QUERY, KEY_TIMEOUT, referenceSymbol, Resource; var init_resource = __esm({ "source/dom/resource.mjs"() { init_constants(); init_extend(); init_basewithoptions(); init_global(); init_id(); init_is(); init_observer(); init_proxyobserver(); init_constants2(); init_constants(); KEY_DOCUMENT2 = "document"; KEY_QUERY = "query"; KEY_TIMEOUT = "timeout"; referenceSymbol = Symbol("reference"); Resource = class extends BaseWithOptions { /** * * @param {Object|undefined} options */ constructor(options2) { super(options2); let uri = this.getOption(this.constructor.getURLAttribute()); if (uri === void 0) { throw new Error("missing source"); } else if (uri instanceof URL) { uri = uri.toString(); } else if (!isString(uri)) { throw new Error("unsupported url type"); } this[internalSymbol][this.constructor.getURLAttribute()] = uri; this[internalStateSymbol] = new ProxyObserver({ loaded: false, error: void 0 }); this[referenceSymbol] = void 0; } /** * @return {boolean} */ isConnected() { if (this[referenceSymbol] instanceof HTMLElement) { return this[referenceSymbol].isConnected; } return false; } /** * This method is overridden by the special classes and creates the DOM object. * This method is also called implicitly, if not yet done explicitly, by calling `connect()`. * * @throws {Error} this method must be implemented by derived classes * @return {Monster.DOM.Resource} */ create() { throw new Error("this method must be implemented by derived classes"); } /** * This method appends the HTMLElement to the specified document. * If the element has not yet been created, `create()` is called implicitly. * * throws {Error} target not found * @return {Monster.DOM.Resource} */ connect() { if (!(this[referenceSymbol] instanceof HTMLElement)) { this.create(); } appendToDocument.call(this); return this; } /** * @property {Document} document the document object into which the node is to be appended * @property {string} src/href url to the corresponding resource * @property {string} query defines the location where the resource is to be hooked into the dom. * @property {string} id element attribute id * @property {string} title element attribute title * @property {string} class element attribute class * @property {int} timeout timeout */ get defaults() { return extend({}, super.defaults, { [this.constructor.getURLAttribute()]: void 0, [KEY_DOCUMENT2]: getGlobalObject("document"), [KEY_QUERY]: "head", [KEY_TIMEOUT]: 1e4, [ATTRIBUTE_ID]: new ID("resource").toString(), [ATTRIBUTE_CLASS]: void 0, [ATTRIBUTE_TITLE]: void 0 }); } /** * With `available()` you can check if a resource is available. * This is the case when the tag is included and the resource is loaded. * * @return {Promise} */ available() { const self2 = this; if (!(self2[referenceSymbol] instanceof HTMLElement)) { return Promise.reject("no element"); } if (!self2.isConnected()) { return Promise.reject("element not connected"); } if (self2[internalStateSymbol].getSubject()["loaded"] === true) { if (self2[internalStateSymbol].getSubject()["error"] !== void 0) { return Promise.reject(self2[internalStateSymbol].getSubject()["error"]); } return Promise.resolve(); } return new Promise(function(resolve, reject) { const timeout = setTimeout(() => { reject("timeout"); }, self2.getOption("timeout")); const observer = new Observer(() => { clearTimeout(timeout); self2[internalStateSymbol].detachObserver(observer); resolve(); }); self2[internalStateSymbol].attachObserver(observer); }); } /** * @return {string} */ static getURLAttribute() { throw new Error("this method must be implemented by derived classes"); } /** * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource"); } }; } }); // source/dom/resource/data.mjs function createElement() { const document2 = this.getOption(KEY_DOCUMENT2); this[referenceSymbol] = document2.createElement(TAG_SCRIPT); for (const key of [ ATTRIBUTE_TYPE, ATTRIBUTE_ID, ATTRIBUTE_CLASS, ATTRIBUTE_TITLE ]) { if (this.getOption(key) !== void 0) { this[referenceSymbol][key] = this.getOption(key); } } return this; } function appendToDocument2() { const targetNode = document.querySelector(this.getOption(KEY_QUERY, "head")); if (!(targetNode instanceof HTMLElement)) { throw new Error("target not found"); } targetNode.appendChild(this[referenceSymbol]); getGlobalFunction("fetch")(this.getOption(ATTRIBUTE_SRC), { method: "GET", // *GET, POST, PUT, DELETE, etc. mode: this.getOption("mode", "cors"), // no-cors, *cors, same-origin cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached credentials: this.getOption("credentials", "same-origin"), // include, *same-origin, omit headers: { Accept: this.getOption("type", "application/json") }, redirect: "follow", // manual, *follow, error referrerPolicy: "no-referrer" // no-referrer, }).then((response) => { return response.text(); }).then((text) => { const textNode = document.createTextNode(text); this[referenceSymbol].appendChild(textNode); this[internalStateSymbol].getSubject()["loaded"] = true; }).catch((e) => { this[internalStateSymbol].setSubject({ loaded: true, error: e.toString() }); targetNode.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.toString()); }); return this; } var Data; var init_data = __esm({ "source/dom/resource/data.mjs"() { init_constants(); init_extend(); init_global(); init_attributes(); init_constants2(); init_resource(); init_constants(); Data = class extends Resource { /** * @property {string} mode=cors https://developer.mozilla.org/en-US/docs/Web/API/fetch * @property {string} credentials=same-origin https://developer.mozilla.org/en-US/docs/Web/API/fetch * @property {string} type=application/json {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-type} */ get defaults() { return extend({}, super.defaults, { mode: "cors", credentials: "same-origin", type: "application/json" }); } /** * * @return {Monster.DOM.Resource.Data} */ create() { createElement.call(this); return this; } /** * This method appends the HTMLElement to the specified document * * throws {Error} target not found * @return {Monster.DOM.Resource} */ connect() { const self2 = this; if (!(this[referenceSymbol] instanceof HTMLElement)) { this.create(); } appendToDocument2.call(this); return this; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource/data"); } /** * @return {string} */ static getURLAttribute() { return ATTRIBUTE_SRC; } }; } }); // source/dom/resource/link.mjs function createElement2() { const document2 = this.getOption(KEY_DOCUMENT2); this[referenceSymbol] = document2.createElement(TAG_LINK); for (const key of [ "as", "crossOrigin", "disabled", "href", "hreflang", "imagesizes", "imagesrcset", "integrity", "media", "prefetch", "referrerpolicy", "sizes", "rel", "type", ATTRIBUTE_HREF, ATTRIBUTE_ID, ATTRIBUTE_CLASS, ATTRIBUTE_TITLE, ATTRIBUTE_NONCE ]) { if (this.getOption(key) !== void 0) { this[referenceSymbol][key] = this.getOption(key); } } return this; } var Link; var init_link = __esm({ "source/dom/resource/link.mjs"() { init_extend(); init_constants2(); init_resource(); init_constants(); Link = class extends Resource { /** * @property {string} as {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-as} * @property {string} crossOrigin=anonymous {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-crossorigin} * @property {boolean} disabled * @property {string} href {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-href} * @property {string} hreflang {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-hreflang} * @property {string} imagesizes {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-imagesizes} * @property {string} imagesrcset {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-imagesrcset} * @property {string} integrity {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-integrity} * @property {string} media {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-media} * @property {string} prefetch {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-prefetch} * @property {string} referrerpolicy {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-referrerpolicy} * @property {string} rel {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel} * @property {string} type {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-type} * @property {string} sizes {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-sizes} * @property {string} nonce {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-nonce} */ get defaults() { return extend({}, super.defaults, { as: void 0, crossOrigin: "anonymous", disabled: void 0, href: void 0, hreflang: void 0, imagesizes: void 0, imagesrcset: void 0, integrity: void 0, media: void 0, prefetch: void 0, referrerpolicy: void 0, rel: void 0, sizes: void 0, type: void 0, nonce: void 0 }); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource/link"); } /** * * @return {Monster.DOM.Resource.Link} */ create() { createElement2.call(this); return this; } /** * @return {string} */ static getURLAttribute() { return ATTRIBUTE_HREF; } }; } }); // source/dom/resource/link/stylesheet.mjs var Stylesheet; var init_stylesheet = __esm({ "source/dom/resource/link/stylesheet.mjs"() { init_extend(); init_link(); init_constants(); Stylesheet = class extends Link { /** * @property {string} rel {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel} */ get defaults() { return extend({}, super.defaults, { rel: "stylesheet" }); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource/link/stylesheet"); } }; } }); // source/dom/resource/script.mjs function createElement3() { const document2 = this.getOption(KEY_DOCUMENT2); this[referenceSymbol] = document2.createElement(TAG_SCRIPT); for (const key of [ "crossOrigin", "defer", "async", "integrity", "nomodule", ATTRIBUTE_NONCE, "referrerpolicy", ATTRIBUTE_TYPE, ATTRIBUTE_SRC, ATTRIBUTE_ID, ATTRIBUTE_CLASS, ATTRIBUTE_TITLE ]) { if (this.getOption(key) !== void 0) { this[referenceSymbol][key] = this.getOption(key); } } return this; } var Script; var init_script = __esm({ "source/dom/resource/script.mjs"() { init_extend(); init_constants2(); init_resource(); init_constants(); Script = class extends Resource { /** * @property {boolean} async=true {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-async} * @property {string} crossOrigin=anonymous {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-crossorigin} * @property {boolean} defer=false {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-defer} * @property {string} integrity {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-integrity} * @property {boolean} nomodule {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-nomodule} * @property {string} nonce {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-nonce} * @property {string} referrerpolicy {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-referrerpolicy} * @property {string} type {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-type} */ get defaults() { return extend({}, super.defaults, { async: true, crossOrigin: "anonymous", defer: false, integrity: void 0, nomodule: false, nonce: void 0, referrerpolicy: void 0, type: "text/javascript" }); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/dom/resource/script"); } /** * * @return {Monster.DOM.Resource.Script} */ create() { createElement3.call(this); return this; } /** * @return {string} */ static getURLAttribute() { return ATTRIBUTE_SRC; } }; } }); // source/dom/resourcemanager.mjs function runResourceMethod(method) { const result = []; for (const type3 of ["scripts", "stylesheets", "data"]) { const resources = this.getOption(`resources.${type3}`); if (!isArray(resources)) { continue; } for (const resource of resources) { if (!(resource instanceof Resource)) { throw new Error("unsupported resource definition"); } result.push(resource[method]()); } } return result; } function addResource(type3, url, options2) { if (url instanceof URL) { url = url.toString(); } options2 = options2 || {}; let resource; switch (type3) { case "scripts": resource = new Script(extend({}, options2, { [ATTRIBUTE_SRC]: url })); break; case "stylesheets": resource = new Stylesheet(extend({}, options2, { [ATTRIBUTE_HREF]: url })); break; case "data": resource = new Data(extend({}, options2, { [ATTRIBUTE_SRC]: url })); break; default: throw new Error(`unsupported type ${type3}`); } this.getOption("resources")?.[type3].push(resource); return this; } var ResourceManager; var init_resourcemanager = __esm({ "source/dom/resourcemanager.mjs"() { init_extend(); init_base(); init_global(); init_internal(); init_is(); init_constants2(); init_resource(); init_data(); init_stylesheet(); init_script(); ResourceManager = class extends Base { /** * * @param {Object} options * throw {Error} unsupported document type */ constructor(options2) { super(options2); equipWithInternal.call(this); if (!(this.getOption("document") instanceof Document)) { throw new Error("unsupported document type"); } } /** * @deprecated since 3.15.0 use getInternal instead * @property {string} baseurl */ getOption(key) { return this.getInternal(key); } /** * @property {string} baseurl */ getBaseURL() { this.getOption("document")?.baseURL; } /** * @property {string} baseurl * @deprecated since 3.15.0 use internalDefaults instead */ get defaults() { return this.internalDefaults; } /** * * @property {HTMLDocument} document=document Document * @property {Object} resources * @property {Array} resources.scripts=[] array with {@link Monster.DOM.Resource.Script} objects * @property {Array} resources.stylesheets=[] array with {@link Monster.DOM.Resource.Link.Stylesheet} objects * @property {Array} resources.data=[] array with {@link Monster.DOM.Resource.Data} objects */ get internalDefaults() { return Object.assign( {}, { document: getGlobalObject("document"), resources: { scripts: [], stylesheets: [], data: [] } } ); } /** * Append Tags to DOM * * @return {Monster.DOM.ResourceManager} * @throws {Error} unsupported resource definition */ connect() { runResourceMethod.call(this, "connect"); return this; } /** * Check if available * * @return {Promise} * @throws {Error} unsupported resource definition */ available() { return Promise.all(runResourceMethod.call(this, "available")); } /** * Add a script * * @param {string|URL} url * @param [Object|undefined} options * @return {Monster.DOM.ResourceManager} * @see Monster.DOM.Resource.Script */ addScript(url, options2) { return addResource.call(this, "scripts", url, options2); } /** * Add Stylesheet * * @param {string|URL} url * @param [Object|undefined} options * @return {Monster.DOM.ResourceManager} * @see Monster.DOM.Resource.Link.Stylesheet */ addStylesheet(url, options2) { return addResource.call(this, "stylesheets", url, options2); } /** * Add Data Tag * * @param {string|URL} url * @param [Object|undefined} options * @return {Monster.DOM.ResourceManager} * @see Monster.DOM.Resource.Data */ addData(url, options2) { return addResource.call(this, "data", url, options2); } }; } }); // source/components/host/stylesheet/config-manager.mjs var ConfigManagerStyleSheet; var init_config_manager = __esm({ "source/components/host/stylesheet/config-manager.mjs"() { init_attributes(); init_constants2(); ConfigManagerStyleSheet = new CSSStyleSheet(); try { ConfigManagerStyleSheet.insertRule( ` @layer configmanager { [data-monster-role=control]{display:none} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/host/config-manager.mjs function openDatabase() { const window2 = getWindow2(); const name = this.getOption("indexDB.name"); const version2 = this.getOption("indexDB.version"); const storageName = this.getOption("indexDB.objectStore.name"); const KeyPath = this.getOption("indexDB.objectStore.keyPath"); if (!name || !version2) { throw new Error("The database name and version must be set."); } const request = window2.indexedDB.open(name, version2); return new Promise((resolve, reject) => { request.onerror = (event) => { console.error("Error opening database", event); reject(request.error); }; request.onsuccess = (event) => { this[indexDBInstanceSymbol] = event?.target?.result; resolve(request.result); }; request.onupgradeneeded = (event) => { const db = event.target.result; let objectStore; if (!db.objectStoreNames.contains(storageName)) { objectStore = db.createObjectStore(storageName, { keyPath: KeyPath }); } objectStore.transaction.oncomplete = (event2) => { console.log("Database upgrade complete"); resolve(); }; }; }); } function getObjectStore(mode) { const storageName = this.getOption("indexDB.objectStore.name"); if (!this[indexDBInstanceSymbol]) { throw new Error("The database is not open."); } const tx = this[indexDBInstanceSymbol].transaction(storageName, mode); return tx.objectStore(storageName); } function getBlob(key) { const store = getObjectStore.call(this, MODE_READONLY); const req = store.get(key); return new Promise((resolve, reject) => { req.onsuccess = function(evt) { const value = evt.target.result; if (value) { resolve(value.blob); return; } reject(new Error("The value of the key '" + key + "' is not defined.")); }; }); } function deleteBlob(key) { const store = getObjectStore.call(this, MODE_READ_WRITE); const req = store.delete(key); return new Promise((resolve, reject) => { req.onsuccess = function(evt) { resolve(); }; req.onerror = function(evt) { console.error("deleteBlob:", evt.target.errorCode); reject(evt.target.errorCode); }; }); } function setBlob(key, blob) { const store = getObjectStore.call(this, MODE_READ_WRITE); const KeyPath = this.getOption("indexDB.objectStore.keyPath"); const obj = {}; obj[KeyPath] = key; obj.blob = blob; const req = store.put(obj); return new Promise((resolve, reject) => { req.onsuccess = function(evt) { resolve(); }; req.onerror = function(evt) { console.error("setBlob:", evt.target.errorCode); reject(evt.target.errorCode); }; }); } function getTemplate17() { return ` <div data-monster-role="control" part="control"> <slot></slot> </div>`; } var indexDBInstanceSymbol, initializedPromiseSymbol, MODE_READONLY, MODE_READ_WRITE, ConfigManager; var init_config_manager2 = __esm({ "source/components/host/config-manager.mjs"() { init_customelement(); init_config_manager(); init_util(); init_constants(); indexDBInstanceSymbol = Symbol("indexDBInstance"); initializedPromiseSymbol = Symbol("initializedPromiseSymbol"); MODE_READONLY = "readonly"; MODE_READ_WRITE = "readwrite"; ConfigManager = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/component-host/config-manager@@instance"); } constructor() { super(); this[initializedPromiseSymbol] = []; this[indexDBInstanceSymbol] = null; this[initializedPromiseSymbol].push(openDatabase.call(this)); } /** * @return {Promise} */ ready() { return Promise.all(this[initializedPromiseSymbol]); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate17() }, indexDB: { name: "monster", version: 2, objectStore: { name: "config", keyPath: "key" } } }); } /** * @param {string} key * @return {Promise<unknown>} */ getConfig(key) { return this.ready().then(() => { return getBlob.call(this, key); }); } /** * @param {string} key * @return {Promise<boolean>} */ hasConfig(key) { return this.ready().then(() => { return getBlob.call(this, key); }).then(() => { return true; }).catch(() => { return false; }); } /** * @param {string} key * @param {*} value * @return {Promise<unknown>} */ setConfig(key, value) { return this.ready().then(() => { return setBlob.call(this, key, value); }); } deleteConfig(key) { return this.ready().then(() => { return deleteBlob.call(this, key); }); } /** * * @return {string} */ static getTag() { return "monster-config-manager"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [ConfigManagerStyleSheet]; } /** */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); } }; registerCustomElement(ConfigManager); } }); // source/components/host/host.mjs var host_exports = {}; __export(host_exports, { Host: () => Host }); function initControlReferences13() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[overlayElementSymbol] = this.querySelector("monster-overlay"); this[notifyElementSymbol] = this.querySelector("monster-notify"); this[configManagerElementSymbol] = this.querySelector( "monster-config-manager" ); } function initTranslations() { if (isIterable(this[promisesSymbol]) === false) { this[promisesSymbol] = []; } this[promisesSymbol].push(Embed.assignTranslationsToElement()); } function initEventHandler11() { return this; } function getTemplate18() { return ` <template id="host-container"> <div data-monster-replace="path:host-container.content" data-monster-attributes="part path:host-container.name, data-monster-role path:host-container.name"></div> </template> <div data-monster-role="host-container"> <slot></slot> </div>`; } var promisesSymbol, notifyElementSymbol, overlayElementSymbol, configManagerElementSymbol, focusManagerSymbol, resourceManagerSymbol, Host; var init_host2 = __esm({ "source/components/host/host.mjs"() { init_customelement(); init_notify2(); init_host(); init_locale2(); init_embed(); init_translations(); init_ready(); init_focusmanager(); init_resourcemanager(); init_events(); init_is(); init_config_manager2(); init_constants(); promisesSymbol = Symbol("promisesSymbol"); notifyElementSymbol = Symbol("notifyElement"); overlayElementSymbol = Symbol("overlayElement"); configManagerElementSymbol = Symbol("configManagerElement"); focusManagerSymbol = Symbol("focusManager"); resourceManagerSymbol = Symbol("resourceManager"); Host = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/component-host/Host@@instance"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} features Feature definitions */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate18() } }); } /** * @param key * @return {Promise} */ getConfig(key) { if (this[configManagerElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no config manager element"); } return this[configManagerElementSymbol].getConfig(key); } hasConfig(key) { if (this[configManagerElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no config manager element"); } return this[configManagerElementSymbol].hasConfig(key); } deleteConfig(key) { if (this[configManagerElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no config manager element"); } return this[configManagerElementSymbol].deleteConfig(key); } /** * * @param {string} key * @param {*} value * @return {Promise} */ setConfig(key, value) { if (this[configManagerElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no config manager element"); } return this[configManagerElementSymbol].setConfig(key, value); } /** * @private * @fires Monster.Components.Host.Host#monster-host-connected */ connectedCallback() { super.connectedCallback(); document.documentElement.style.overflowY = "scroll"; const classNames = this.getOption("classes.body"); if (document.body.classList.contains(classNames)) { document.body.classList.remove(classNames); } fireCustomEvent(this, "monster-host-connected"); } /** * @private * @fires Monster.Components.Host.Host#monster-host-disconnected */ disconnectedCallback() { super.disconnectedCallback(); document.documentElement.style.overflowY = ""; const classNames = this.getOption("classes.body"); if (!document.body.classList.contains(classNames)) { document.body.classList.add(classNames); } if (isIterable(this[promisesSymbol]) === false) { this[promisesSymbol] = []; } this[promisesSymbol].push( new Promise((resolve, reject) => { this.addEventListener( "monster-host-connected", () => { resolve(); }, { once: true } ); }) ); fireCustomEvent(this, "monster-host-disconnected"); } /** * * @return {Monster.Components.Host.Host} */ [assembleMethodSymbol]() { this[promisesSymbol] = []; this[promisesSymbol].push(windowReady); super[assembleMethodSymbol](); initControlReferences13.call(this); initEventHandler11.call(this); initTranslations.call(this); this[focusManagerSymbol] = new FocusManager(this); this[resourceManagerSymbol] = new ResourceManager(this); try { this[promisesSymbol].push(this[resourceManagerSymbol].available()); } catch (e) { return Promise.reject(e); } if (this.isConnected === false) { this[promisesSymbol].push( new Promise((resolve, reject) => { this.addEventListener( "monster-host-connected", () => { resolve(); }, { once: true } ); }) ); } } /** * The Promise is resolved when the element is connected to the DOM and all resources are available. * If the element is not connected to the DOM, the Promise is rejected. * * @return {Promise} */ onReady() { if (isIterable(this[promisesSymbol]) === false) { this[promisesSymbol] = []; } return Promise.all(this[promisesSymbol]).then(() => { this[promisesSymbol] = []; return this; }); } /** * @see {@link https://monsterjs.org/en/doc/monster/Monster.DOM.FocusManager.html|Monster.DOM.FocusManager} * @return {*} */ get focusManager() { return this[focusManagerSymbol]; } /** * @see {@link https://monsterjs.org/en/doc/monster/Monster.DOM.ResourceManager.html|Monster.DOM.ResourceManager} * @return {*} */ get resourceManager() { return this[resourceManagerSymbol]; } /** * * @return {Monster.Components.Host.Host} * @throws {Error} There is no overlay element defined. */ toggleOverlay() { if (this[overlayElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no overlay element defined."); } this[overlayElementSymbol].toggle(); return this; } /** * @return {Host} * @throws {Error} There is no overlay element defined. */ openOverlay() { if (this[overlayElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no overlay element defined."); } this[overlayElementSymbol].open(); return this; } /** * @return {Host} * @throws {Error} There is no overlay element defined. */ closeOverlay() { if (this[overlayElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no overlay element defined."); } this[overlayElementSymbol].close(); return this; } /** * * @return {string} */ static getTag() { return "monster-host"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [HostStyleSheet]; } /** * * @return {Monster.I18n.Locale} */ get locale() { return getLocaleOfDocument(); } /** * * @return {Translations} */ get translations() { return getDocumentTranslations(); } /** * * @param {string|Message} message */ pushNotification(message) { if (this[notifyElementSymbol] instanceof HTMLElement === false) { throw new Error("There is no notify element defined."); } this[notifyElementSymbol].push(message); return this; } }; registerCustomElement(Host); } }); // source/components/host/stylesheet/overlay.mjs var OverlayStyleSheet; var init_overlay = __esm({ "source/components/host/stylesheet/overlay.mjs"() { init_attributes(); init_constants2(); OverlayStyleSheet = new CSSStyleSheet(); try { OverlayStyleSheet.insertRule( ` @layer overlay { :where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}html{height:100%}body,html{min-height:calc(100vh - 40px)}body{box-sizing:border-box;margin:0;padding:0;word-break:break-word}body:focus-visible{outline:none}:focus-visible{outline:none}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-border-primary-1,.monster-border-primary-2,.monster-border-primary-3,.monster-border-primary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-0{border-radius:0;border-style:none;border-width:0}.monster-border-primary-1{border-color:var(--monster-bg-color-primary-1)}.monster-border-primary-2{border-color:var(--monster-bg-color-primary-2)}.monster-border-primary-3{border-color:var(--monster-bg-color-primary-3)}.monster-border-primary-4{border-color:var(--monster-bg-color-primary-4)}.monster-border-secondary-1,.monster-border-secondary-2,.monster-border-secondary-3,.monster-border-secondary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-secondary-1{border-color:var(--monster-bg-color-secondary-1)}.monster-border-secondary-2{border-color:var(--monster-bg-color-secondary-2)}.monster-border-secondary-3{border-color:var(--monster-bg-color-secondary-3)}.monster-border-secondary-4{border-color:var(--monster-bg-color-secondary-4)}.monster-border-tertiary-1,.monster-border-tertiary-2,.monster-border-tertiary-3,.monster-border-tertiary-4{border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width)}.monster-border-tertiary-1{border-color:var(--monster-bg-color-tertiary-1)}.monster-border-tertiary-2{border-color:var(--monster-bg-color-tertiary-2)}.monster-border-tertiary-3{border-color:var(--monster-bg-color-tertiary-3)}.monster-border-tertiary-4{border-color:var(--monster-bg-color-tertiary-4)}input,meter,progress,select,textarea{accent-color:var(--monster-color-secondary-2);background-color:var(--monster-bg-color-primary-1);border-color:var(--monster-theme-control-border-color);border-radius:var(--monster-theme-control-border-radius);border-style:var(--monster-theme-control-border-style);border-width:var(--monster-theme-control-border-width);box-sizing:border-box;color:var(--monster-color-primary-1);font-family:inherit;font-size:100%;margin:0;outline:none}input,select,textarea{height:-moz-fit-content;height:fit-content;padding:.4rem .6rem}textarea{min-height:6rem;resize:vertical}input[type=color]{height:2rem;margin:0;padding:.1rem;width:2rem}input:hover:not([type=radio]):not([type=checkbox]):not([type=range]),select:hover,textarea:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}input:focus,select:focus,textarea:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:3px}@font-face{font-display:swap;font-family:Raleway;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Quicksand;font-style:normal;font-weight:300;src:url(data:application/x-font-woff2;charset=utf-8;base64,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) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}body,html{font-family:var(--monster-font-family);font-size:1rem;font-weight:400;line-height:1.4}html{background-color:var(--monster-bg-color-primary-1);color:var(--monster-color-primary-1)}.monster-paragraph,p{font-size:1rem;font-weight:400;line-height:1.6;text-align:justify}.monster-h1,h1{font-size:3rem;font-weight:400;line-height:1.15;margin:4rem 0 1.5rem}.monster-h2,h2{font-size:2.5rem;font-weight:400;line-height:1.2;margin:4rem 0 1.5rem}.monster-h3,h3{font-size:2rem;font-weight:400;line-height:1.25;margin:4rem 0 1.25rem}.monster-h4,h4{font-size:1.5rem;font-weight:400;line-height:1.3;margin:4rem 0 1.25rem}.monster-h5,h5{font-size:1.4rem;font-weight:bolder;line-height:1.3;margin:4rem 0 1.25rem}.monster-h6,h6{font-size:1.3rem;font-weight:700;line-height:1.3;margin:4rem 0 1.25rem}p+h1{margin-top:3.75rem}p+h2{margin-top:3rem}p+h3{margin-top:2.25rem}p+h4{margin-top:1.5rem}p+h5{margin-top:.75rem}div+h1,div+h2,div+h3,div+h4,div+h5,div+h6,p+h6{margin-top:0}.deco{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);-webkit-background-clip:text;background-clip:text;background-size:cover;color:var(--monster-color-secondary-1);text-fill-color:transparent;-webkit-text-fill-color:transparent}::-moz-selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}::selection{background-color:var(--monster-bg-color-selection-1);color:var(--monster-color-selection-1)}kbd{background-color:var(--monster-bg-color-primary-4);border-radius:.25rem;border-radius:10rem;color:var(--monster-color-primary-4);display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .6em;text-align:center;text-decoration:none;vertical-align:baseline;white-space:nowrap}details{margin-bottom:1rem}summary{cursor:pointer;font-feature-settings:"tnum";font-weight:700;letter-spacing:.1em;padding:.6rem 1rem}details[open]{padding:.6rem 1rem .75rem}details[open] summary{margin-bottom:.5rem;padding:0}.monster-no-user-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}@keyframes details-show{0%{opacity:0;transform:translateY(-.5em)}}details[open]>:not(summary){animation:details-show .15s ease-in-out}details[open]>:last-child{margin-bottom:0}.monospace{font-family:var(--monster-font-family-monospace)}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}:after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}[data-monster-role=overlay].hide-empty{display:none}[data-monster-role=overlay]{background-color:var(--monster-bg-color-primary-2);color:var(--monster-color-primary-2);height:100%;left:0;overflow-x:hidden;position:fixed;top:0;transition:.5s;width:0;z-index:var(--monster-z-index-offcanvas)}[data-monster-role=overlay] [data-monster-role=overlay-close]{cursor:pointer;height:40px;left:10px;position:absolute;top:10px;width:40px}[data-monster-role=overlay] [data-monster-role=overlay-close]:before{background-color:var(--monster-color-primary-1);content:"";display:block;height:100%;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z'/%3E%3C/svg%3E");-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[data-monster-role=overlay-open]{cursor:pointer;height:40px;left:10px;position:absolute;top:10px;width:40px}[data-monster-role=overlay-open]:before{background-color:var(--monster-color-primary-1);content:"";display:block;height:100%;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M1 2a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1zM1 7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1zM1 12a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' viewBox='0 0 16 16'%3E%3Cpath d='M1 2a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1zM1 7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1zM1 12a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1z'/%3E%3C/svg%3E");-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[data-monster-role=overlay].open{width:100%} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/host/overlay.mjs var overlay_exports = {}; __export(overlay_exports, { Overlay: () => Overlay }); function initControlReferences14() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[overlayElementSymbol2] = this.shadowRoot.getElementById("overlay"); this[overlayCloseElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=overlay-close]" ); this[overlayOpenElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=overlay-open]" ); } function initEventHandler12() { this[closeEventHandlerSymbol] = (event) => { this.close(); }; this[overlayCloseElementSymbol].addEventListener( "click", this[closeEventHandlerSymbol] ); this[openEventHandlerSymbol] = (event) => { const element = findTargetElementFromEvent( event, ATTRIBUTE_ROLE, ATTRIBUTE_VALUE_OVERLAY_OPEN ); if (element) { this.open(); } }; this.addEventListener("click", this[openEventHandlerSymbol]); if (this.getOption("features.escapeKey") === true) { this.addEventListener("keydown", (event) => { if (event.key === "Escape") { const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey); if (isNotCombinedKey) { this.toggleOverlay(); } } }); } return this; } function getTemplate19() { return ` <template id="host-overlay"> <div data-monster-replace="path:host-overlay.content" data-monster-attributes="part path:host-overlay.name, data-monster-role path:host-container.overlay"></div> </template> <div data-monster-role="overlay-open" part="open" data-monster-attributes="class path:features.openButton | if:visible:hidden"></div> <div id="overlay" data-monster-role="overlay" part="overlay" data-monster-insert="host-overlay path:overlay" data-monster-attributes="class path:classes.overlay"> <div data-monster-role="overlay-close" part="close"></div> </div>`; } var overlayElementSymbol2, overlayCloseElementSymbol, overlayOpenElementSymbol, closeEventHandlerSymbol, openEventHandlerSymbol, ATTRIBUTE_VALUE_OVERLAY_OPEN, Overlay; var init_overlay2 = __esm({ "source/components/host/overlay.mjs"() { init_customelement(); init_notify2(); init_overlay(); init_constants2(); init_events(); init_constants(); overlayElementSymbol2 = Symbol("overlayElement"); overlayCloseElementSymbol = Symbol("overlayCloserElement"); overlayOpenElementSymbol = Symbol("overlayOpenElement"); closeEventHandlerSymbol = Symbol("closeEventHandler"); openEventHandlerSymbol = Symbol("openEventHandler"); ATTRIBUTE_VALUE_OVERLAY_OPEN = "overlay-open"; Overlay = class extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/host/overlay@@instance"); } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} container Container definitions * @property {array} container Container definitions * @property {string} container[].name Name of the container * @property {string} container[].content Content of the container * @property {string} container[].class Css class of the container * @property {Object} classes Css classes * @property {string} classes.body Css class to hide the body. This class is removed when the component is ready. * @property {string} classes.overlay Css class to hide the overlay. This class is removed when the component is ready. * @property {Object} features Feature definitions * @property {boolean} features.escapeKey If true the overlay can be closed with the escape key * @property {boolean} features.openButton If true the overlay can be opened with a button */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate19() }, overlay: [ { name: "content", content: "<slot></slot>", class: "" } ], classes: { body: "hidden", overlay: "hide-empty" }, features: { escapeKey: true, openButton: true } }); } /** * @private */ connectedCallback() { super.connectedCallback(); document.documentElement.style.overflowY = "scroll"; const classNames = this.getOption("classes.body"); if (document.body.classList.contains(classNames)) { document.body.classList.remove(classNames); } } /** * * @return {Monster.Components.Host.Overlay} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences14.call(this); initEventHandler12.call(this); } /** * * @return {Monster.Components.Host.Overlay} */ toggle() { if (this[overlayElementSymbol2].classList.contains("open")) { this.close(); } else { this.open(); } return this; } /** * @return {Monster.Components.Host.Overlay} * @fires monster-overlay-before-open * @fires monster-overlay-open * @fires monster-overlay-before-close * @fires monster-overlay-closed */ open() { fireCustomEvent(this, "monster-overlay-before-open", {}); this[overlayElementSymbol2].classList.remove("hide-empty"); setTimeout(() => { this[overlayElementSymbol2].classList.add("open"); setTimeout(() => { fireCustomEvent(this, "monster-overlay-open", {}); }, 0); }, 0); return this; } /** * @return {Monster.Components.Host.Overlay} */ close() { fireCustomEvent(this, "monster-overlay-before-close", {}); setTimeout(() => { this[overlayElementSymbol2].classList.remove("open"); setTimeout(() => { fireCustomEvent(this, "monster-overlay-closed", {}); }, 0); }, 0); return this; } /** * * @return {string} */ static getTag() { return "monster-overlay"; } /** * @return {CSSStyleSheet[]} */ static getCSSStyleSheet() { return [OverlayStyleSheet]; } }; registerCustomElement(Overlay); } }); // source/components/host/util.mjs function generateUniqueConfigKey(componentName, id, prefix) { const urlWithoutParams = getWindow2().location.href.split("?")[0]; const urlWithoutParamsAndHash = urlWithoutParams.split("#")[0]; const uniqueKey = `${prefix}_${urlWithoutParamsAndHash}_${componentName}_${id}`; return uniqueKey.replace(/[^\w\s]/gi, "_").replace(/\s+/g, "_"); } var init_util2 = __esm({ "source/components/host/util.mjs"() { init_util(); } }); // source/components/layout/stylesheet/details.mjs var DetailsStyleSheet; var init_details = __esm({ "source/components/layout/stylesheet/details.mjs"() { init_attributes(); init_constants2(); DetailsStyleSheet = new CSSStyleSheet(); try { DetailsStyleSheet.insertRule( ` @layer details { :where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}html{height:100%}body,html{min-height:calc(100vh - 40px)}body{box-sizing:border-box;margin:0;padding:0;word-break:break-word}body:focus-visible{outline:none}:focus-visible{outline:none}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-button-primary,button{align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-primary{background-color:var(--monster-bg-color-primary-4);border-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-button-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-secondary-4)}.monster-button-secondary,.monster-button-tertiary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-tertiary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-tertiary-4);border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-tertiary-4)}.monster-button-outline-primary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-primary-4);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-primary-4)}.monster-button-outline-primary,.monster-button-outline-secondary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-outline-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-secondary-4)}.monster-button-outline-tertiary{align-items:center;background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-tertiary-4);background-position:50%;border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);color:var(--monster-bg-color-tertiary-4);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}button:active,button:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}button:active{z-index:var(--monster-z-index-outline)}.monster-button-bar,.monster-button-group{align-content:center;align-items:stretch;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.monster-button-group{box-sizing:border-box;gap:0;margin:1rem 0}.monster-button-group>:not(:last-child){margin-right:calc(var(--monster-border-width)*-1)}.monster-button-group :hover{box-shadow:none}button:focus{outline:1px dashed var(--monster-color-selection-4);outline-offset:2px;z-index:var(--monster-z-index-outline)}@media (prefers-color-scheme:light){button:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:2px;z-index:var(--monster-z-index-outline)}}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}:after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}span.monster-fx-ripple{animation:monster-fx-ripple .6s linear;background-color:hsla(0,0%,100%,.7);border-radius:50%;position:absolute;transform:scale(0)}@keyframes monster-fx-ripple{to{opacity:0;transform:scale(4)}}[data-monster-role=control]{flex-direction:column} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/host/constants.mjs var ATTRIBUTE_BUTTON_LABEL2; var init_constants4 = __esm({ "source/components/host/constants.mjs"() { init_constants2(); ATTRIBUTE_BUTTON_LABEL2 = `${ATTRIBUTE_PREFIX}button-label`; } }); // source/components/layout/stylesheet/collapse.mjs var CollapseStyleSheet; var init_collapse = __esm({ "source/components/layout/stylesheet/collapse.mjs"() { init_attributes(); init_constants2(); CollapseStyleSheet = new CSSStyleSheet(); try { CollapseStyleSheet.insertRule( ` @layer collapse { :where(html){line-height:1.15;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}html{height:100%}body,html{min-height:calc(100vh - 40px)}body{box-sizing:border-box;margin:0;padding:0;word-break:break-word}body:focus-visible{outline:none}:focus-visible{outline:none}.block{display:block}.inline{display:inline}.inline-block{display:inline-block}.grid{display:grid}.inline-grid{display:inline-grid}.flex{display:flex}.inline-flex{display:inline-flex}.hidden,.hide,.none{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.monster-button-primary,button{align-items:center;background-color:var(--monster-bg-color-primary-1);background-position:50%;border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-primary{background-color:var(--monster-bg-color-primary-4);border-color:var(--monster-bg-color-primary-4);color:var(--monster-color-primary-4)}.monster-button-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-secondary-4)}.monster-button-secondary,.monster-button-tertiary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-tertiary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-bg-color-tertiary-4);border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-color-tertiary-4)}.monster-button-outline-primary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-primary-4);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-primary-4)}.monster-button-outline-primary,.monster-button-outline-secondary{align-items:center;background-position:50%;box-shadow:var(--monster-box-shadow-1);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}.monster-button-outline-secondary{background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-secondary-4);border-color:var(--monster-bg-color-secondary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);color:var(--monster-color-primary-1);color:var(--monster-bg-color-secondary-4)}.monster-button-outline-tertiary{align-items:center;background-color:var(--monster-bg-color-primary-1);background-color:var(--monster-color-tertiary-4);background-position:50%;border-color:var(--monster-bg-color-tertiary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);color:var(--monster-color-primary-1);color:var(--monster-bg-color-tertiary-4);cursor:pointer;display:flex;font-family:var(--monster-font-family);font-size:1rem;font-weight:400;gap:.4rem;justify-content:center;line-height:1.5;outline:none;overflow:hidden;padding:.375rem .75rem;position:relative;text-align:center;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:-webkit-fill-available;width:-moz-available;width:stretch}button:active,button:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}button:active{z-index:var(--monster-z-index-outline)}.monster-button-bar,.monster-button-group{align-content:center;align-items:stretch;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.monster-button-group{box-sizing:border-box;gap:0;margin:1rem 0}.monster-button-group>:not(:last-child){margin-right:calc(var(--monster-border-width)*-1)}.monster-button-group :hover{box-shadow:none}button:focus{outline:1px dashed var(--monster-color-selection-4);outline-offset:2px;z-index:var(--monster-z-index-outline)}@media (prefers-color-scheme:light){button:focus{outline:1px dashed var(--monster-color-selection-3);outline-offset:2px;z-index:var(--monster-z-index-outline)}}[data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}:after,:before,:root{--monster-font-family:-apple-system,BlinkMacSystemFont,"Quicksand","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--monster-font-family-monospace:"Consolas","Courier New","Roboto Mono","Source Code Pro","Fira Mono",monospace;--monster-color-primary-1:var(--monster-color-gray-6);--monster-color-primary-2:var(--monster-color-gray-6);--monster-color-primary-3:var(--monster-color-cinnamon-1);--monster-color-primary-4:var(--monster-color-cinnamon-1);--monster-bg-color-primary-1:var(--monster-color-gray-1);--monster-bg-color-primary-2:var(--monster-color-gray-2);--monster-bg-color-primary-3:var(--monster-color-gray-6);--monster-bg-color-primary-4:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-1:var(--monster-color-gray-1);--monster-color-primary-2:var(--monster-color-gray-1);--monster-color-primary-3:var(--monster-color-gray-6);--monster-color-primary-4:var(--monster-color-gray-6);--monster-bg-color-primary-1:var(--monster-color-gray-6);--monster-bg-color-primary-2:var(--monster-color-gray-3);--monster-bg-color-primary-3:var(--monster-color-gray-2);--monster-bg-color-primary-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-4);--monster-color-secondary-2:var(--monster-color-red-4);--monster-color-secondary-3:var(--monster-color-red-1);--monster-color-secondary-4:var(--monster-color-red-1);--monster-bg-color-secondary-1:var(--monster-color-gray-1);--monster-bg-color-secondary-2:var(--monster-color-red-2);--monster-bg-color-secondary-3:var(--monster-color-red-3);--monster-bg-color-secondary-4:var(--monster-color-red-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-secondary-1:var(--monster-color-red-1);--monster-color-secondary-2:var(--monster-color-red-1);--monster-color-secondary-3:var(--monster-color-red-6);--monster-color-secondary-4:var(--monster-color-red-4);--monster-bg-color-secondary-1:var(--monster-color-gray-6);--monster-bg-color-secondary-2:var(--monster-color-red-3);--monster-bg-color-secondary-3:var(--monster-color-red-2);--monster-bg-color-secondary-4:var(--monster-color-red-1)}}:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-4);--monster-color-tertiary-2:var(--monster-color-magenta-4);--monster-color-tertiary-3:var(--monster-color-magenta-6);--monster-color-tertiary-4:var(--monster-color-magenta-1);--monster-bg-color-tertiary-1:var(--monster-color-gray-1);--monster-bg-color-tertiary-2:var(--monster-color-magenta-1);--monster-bg-color-tertiary-3:var(--monster-color-magenta-2);--monster-bg-color-tertiary-4:var(--monster-color-magenta-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-tertiary-1:var(--monster-color-magenta-1);--monster-color-tertiary-2:var(--monster-color-magenta-6);--monster-color-tertiary-3:var(--monster-color-magenta-4);--monster-color-tertiary-4:var(--monster-color-magenta-4);--monster-bg-color-tertiary-1:var(--monster-color-gray-6);--monster-bg-color-tertiary-2:var(--monster-color-magenta-2);--monster-bg-color-tertiary-3:var(--monster-color-magenta-1);--monster-bg-color-tertiary-4:var(--monster-color-magenta-1)}}:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-4);--monster-color-destructive-3:var(--monster-color-red-6);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-4);--monster-bg-color-destructive-2:var(--monster-color-gray-1);--monster-bg-color-destructive-3:var(--monster-color-red-2);--monster-bg-color-destructive-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-destructive-1:var(--monster-color-red-1);--monster-color-destructive-2:var(--monster-color-red-3);--monster-color-destructive-3:var(--monster-color-red-4);--monster-color-destructive-4:var(--monster-color-red-1);--monster-bg-color-destructive-1:var(--monster-color-red-5);--monster-bg-color-destructive-2:var(--monster-color-gray-6);--monster-bg-color-destructive-3:var(--monster-color-red-1);--monster-bg-color-destructive-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-4);--monster-color-success-3:var(--monster-color-green-6);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-3);--monster-bg-color-success-2:var(--monster-color-gray-1);--monster-bg-color-success-3:var(--monster-color-green-2);--monster-bg-color-success-4:var(--monster-color-green-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-success-1:var(--monster-color-green-1);--monster-color-success-2:var(--monster-color-green-2);--monster-color-success-3:var(--monster-color-green-4);--monster-color-success-4:var(--monster-color-green-1);--monster-bg-color-success-1:var(--monster-color-green-5);--monster-bg-color-success-2:var(--monster-color-gray-6);--monster-bg-color-success-3:var(--monster-color-green-1);--monster-bg-color-success-4:var(--monster-color-green-3)}}:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-4);--monster-color-warning-3:var(--monster-color-orange-6);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-3);--monster-bg-color-warning-2:var(--monster-color-gray-1);--monster-bg-color-warning-3:var(--monster-color-orange-2);--monster-bg-color-warning-4:var(--monster-color-orange-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-warning-1:var(--monster-color-orange-1);--monster-color-warning-2:var(--monster-color-orange-3);--monster-color-warning-3:var(--monster-color-orange-4);--monster-color-warning-4:var(--monster-color-orange-1);--monster-bg-color-warning-1:var(--monster-color-orange-5);--monster-bg-color-warning-2:var(--monster-color-gray-6);--monster-bg-color-warning-3:var(--monster-color-orange-1);--monster-bg-color-warning-4:var(--monster-color-orange-3)}}:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-4);--monster-color-error-3:var(--monster-color-red-6);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-4);--monster-bg-color-error-2:var(--monster-color-gray-1);--monster-bg-color-error-3:var(--monster-color-red-2);--monster-bg-color-error-4:var(--monster-color-red-5)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-error-1:var(--monster-color-red-1);--monster-color-error-2:var(--monster-color-red-3);--monster-color-error-3:var(--monster-color-red-4);--monster-color-error-4:var(--monster-color-red-1);--monster-bg-color-error-1:var(--monster-color-red-5);--monster-bg-color-error-2:var(--monster-color-gray-6);--monster-bg-color-error-3:var(--monster-color-red-1);--monster-bg-color-error-4:var(--monster-color-red-4)}}:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-selection-1:var(--monster-color-gray-6);--monster-color-selection-2:var(--monster-color-gray-6);--monster-color-selection-3:var(--monster-color-gray-6);--monster-color-selection-4:var(--monster-color-gray-1);--monster-bg-color-selection-1:var(--monster-color-yellow-2);--monster-bg-color-selection-2:var(--monster-color-yellow-1);--monster-bg-color-selection-3:var(--monster-color-yellow-2);--monster-bg-color-selection-4:var(--monster-color-yellow-6)}}:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-4);--monster-color-primary-disabled-4:var(--monster-color-gray-4);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-1);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-6)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-color-primary-disabled-1:var(--monster-color-gray-4);--monster-color-primary-disabled-2:var(--monster-color-gray-4);--monster-color-primary-disabled-3:var(--monster-color-gray-3);--monster-color-primary-disabled-4:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-1:var(--monster-color-gray-6);--monster-bg-color-primary-disabled-2:var(--monster-color-gray-3);--monster-bg-color-primary-disabled-3:var(--monster-color-gray-2);--monster-bg-color-primary-disabled-4:var(--monster-color-gray-1)}}:after,:before,:root{--monster-color-gradient-1:#833ab4;--monster-color-gradient-2:#fd1d1d;--monster-color-gradient-3:#fcb045;--monster-box-shadow-1:none;--monster-box-shadow-2:-1px 1px 10px 1px hsla(0,0%,76%,.61);--monster-text-shadow:none;--monster-theme-control-bg-color:var(--monster-color-seashell-1);--monster-theme-control-color:var(--monster-color-seashell-6);--monster-theme-control-hover-color:var(--monster-color-seashell-6);--monster-theme-control-hover-bg-color:var(--monster-color-seashell-2);--monster-theme-control-border-width:2px;--monster-theme-control-border-style:solid;--monster-theme-control-border-radius:0;--monster-theme-control-border-color:var(--monster-color-primary-1)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-control-bg-color:var(--monster-color-gray-5);--monster-theme-control-color:var(--monster-color-gray-1);--monster-theme-control-border-color:var(--monster-color-gray-3);--monster-theme-control-hover-color:var(--monster-color-gray-1);--monster-theme-control-hover-bg-color:var(--monster-color-gray-6)}}:after,:before,:root{--monster-theme-on-color:var(--monster-color-green-1);--monster-theme-on-bg-color:var(--monster-color-green-5);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-4)}@media (prefers-color-scheme:dark){:after,:before,:root{--monster-theme-on-color:var(--monster-color-gray-6);--monster-theme-on-bg-color:var(--monster-color-gray-1);--monster-theme-off-color:var(--monster-color-gray-1);--monster-theme-off-bg-color:var(--monster-color-gray-5)}}:after,:before,:root{--monster-border-style:solid;--monster-border-width:3px;--monster-border-radius:0;--monster-outline-width:1px;--monster-popper-witharrrow-distance:-4px;--monster-z-index-default:0;--monster-z-index-outline:10;--monster-z-index-dropdown:200;--monster-z-index-dropdown-overlay:210;--monster-z-index-sticky:300;--monster-z-index-sticky-overlay:310;--monster-z-index-fixed:400;--monster-z-index-fixed-overlay:410;--monster-z-index-modal-backdrop:500;--monster-z-index-modal-backdrop-overlay:510;--monster-z-index-offcanvas:600;--monster-z-index-offcanvas-overlay:610;--monster-z-index-modal:700;--monster-z-index-modal-overlay:710;--monster-z-index-popover:800;--monster-z-index-popover-overlay:810;--monster-z-index-tooltip:800;--monster-z-index-tooltip-overlay:910;--monster-space-0:0;--monster-space-1:2px;--monster-space-2:4px;--monster-space-3:6px;--monster-space-4:10px;--monster-space-5:16px;--monster-space-6:26px;--monster-space-7:42px;--monster-breakpoint-0:480px;--monster-breakpoint-4:480px;--monster-breakpoint-7:768px;--monster-breakpoint-9:992px;--monster-breakpoint-12:1200px;--monster-dragger-width:2px;--monster-dragger-handle-width:4px;--monster-dragger-handle-height:50px}span.monster-fx-ripple{animation:monster-fx-ripple .6s linear;background-color:hsla(0,0%,100%,.7);border-radius:50%;position:absolute;transform:scale(0)}@keyframes monster-fx-ripple{to{opacity:0;transform:scale(4)}}[data-monster-role=control]{font-size:1rem;font-weight:400;line-height:1.6}.overflow-hidden[data-monster-role=control]{overflow:hidden}[data-monster-role=control] button{border-left:0;border-right:0;border-top:0}[data-monster-role=control] .button:hover{box-shadow:var(--monster-box-shadow-2);transition:background .8s,color .25s .0833333333s}[data-monster-role=control] [data-monster-role=detail]{box-sizing:border-box;font-size:1rem;font-weight:400;height:0;line-height:1.6;transition:height .4s ease-in-out;width:100%}:is([data-monster-role=control] [data-monster-role=detail]) .padding{padding:1rem}:is([data-monster-role=control] [data-monster-role=detail]) .deco-line{background:linear-gradient(to right,var(--monster-color-gradient-1) 0,var(--monster-color-gradient-2) 50%,var(--monster-color-gradient-3) 100%);border:0;height:2px;margin:0;padding:0}@media (prefers-color-scheme:dark){:is([data-monster-role=control] [data-monster-role=detail]) .deco-line{background:var(--monster-color-primary-1)}}:is([data-monster-role=control] [data-monster-role=detail]) .deco-line{transition:background .4s ease-in-out}[data-monster-role=control] .active[data-monster-role=detail]{height:var(--monster-height);transition:height .4s ease-in-out} }`, 0 ); } catch (e) { addAttributeToken( document.getRootNode().querySelector("html"), ATTRIBUTE_ERRORMESSAGE, e + "" ); } } }); // source/components/layout/collapse.mjs function adjustHeight() { let height = 0; if (this[detailsContainerElementSymbol]) { if (this.getOption("features.useScrollValues")) { height += this[detailsContainerElementSymbol].scrollHeight; } else { height += this[detailsContainerElementSymbol].clientHeight; } } if (this[detailsDecoElementSymbol]) { if (this.getOption("features.useScrollValues")) { height += this[detailsDecoElementSymbol].scrollHeight; } else { height += this[detailsDecoElementSymbol].clientHeight + 1; } } if (height === 0) { if (this.getOption("features.useScrollValues")) { height = this[detailsElementSymbol].scrollHeight; } else { height = this[detailsElementSymbol].clientHeight; } if (height === 0) { height = "auto"; } } else { height += "px"; } this[detailsElementSymbol].style.setProperty( "--monster-height", height, "important" ); fireCustomEvent(this, "monster-" + this[nameSymbol] + "-adjust-height", { height }); } function updateResizeObserverObservation() { this[resizeObserverSymbol6].disconnect(); const slottedNodes = getSlottedElements.call(this); slottedNodes.forEach((node) => { this[resizeObserverSymbol6].observe(node); }); if (this[detailsContainerElementSymbol]) { this[resizeObserverSymbol6].observe(this[detailsContainerElementSymbol]); } this.adjustHeight(); } function initEventHandler13() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } initSlotChangedHandler.call(this); return this; } function initSlotChangedHandler() { this[detailsSlotElementSymbol].addEventListener("slotchange", () => { updateResizeObserverObservation.call(this); }); } function initControlReferences15() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[controlElementSymbol7] = this.shadowRoot.querySelector( "[data-monster-role=control]" ); this[detailsElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=detail]" ); this[detailsSlotElementSymbol] = this.shadowRoot.querySelector("slot"); this[detailsContainerElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=container]" ); this[detailsDecoElementSymbol] = this.shadowRoot.querySelector( "[data-monster-role=deco]" ); } function getConfigKey() { return generateUniqueConfigKey(this[nameSymbol], this.id, "state"); } function updateStateConfig() { if (!this.getOption("features.persistState")) { return; } if (!this[detailsElementSymbol]) { return; } const document2 = getDocument(); const host = document2.querySelector("monster-host"); if (!(host && this.id)) { return; } const configKey = getConfigKey.call(this); try { host.setConfig(configKey, this.isOpen()); } catch (error) { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error)); } } function initStateFromHostConfig() { if (!this.getOption("features.persistState")) { return Promise.resolve({}); } const document2 = getDocument(); const host = document2.querySelector("monster-host"); if (!(host && this.id)) { return Promise.resolve({}); } const configKey = getConfigKey.call(this); return host.getConfig(configKey).then((state) => { if (state === true) { this.open(); } else { this.close(); } }).catch((error) => { addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error.toString()); }); } function initResizeObserver() { this[resizeObserverSymbol6] = new ResizeObserver((entries) => { if (this[timerCallbackSymbol6] instanceof DeadMansSwitch) { try { this[timerCallbackSymbol6].touch(); return; } catch (e) { delete this[timerCallbackSymbol6]; } } this[timerCallbackSymbol6] = new DeadMansSwitch(200, () => { checkAndRearrangeContent.call(this); }); }); } function checkAndRearrangeContent() { this.adjustHeight(); } function getTemplate20() { return ` <div data-monster-role="control" part="control" class="overflow-hidden"> <div data-monster-role="detail"> <div data-monster-attributes="class path:classes.container" part="container" data-monster-role="container"> <slot></slot> </div> <div class="deco-line" data-monster-role="deco" part="deco"></div> </div> </div>`; } var timerCallbackSymbol6, detailsElementSymbol, controlElementSymbol7, resizeObserverSymbol6, detailsSlotElementSymbol, detailsContainerElementSymbol, detailsDecoElementSymbol, nameSymbol, Collapse; var init_collapse2 = __esm({ "source/components/layout/collapse.mjs"() { init_customelement(); init_collapse(); init_events(); init_util(); init_attributes(); init_constants2(); init_host2(); init_util2(); init_deadmansswitch(); init_constants(); timerCallbackSymbol6 = Symbol("timerCallback"); detailsElementSymbol = Symbol("detailsElement"); controlElementSymbol7 = Symbol("controlElement"); resizeObserverSymbol6 = Symbol("resizeObserver"); detailsSlotElementSymbol = Symbol("detailsSlotElement"); detailsContainerElementSymbol = Symbol("detailsContainerElement"); detailsDecoElementSymbol = Symbol("detailsDecoElement"); nameSymbol = Symbol("name"); Collapse = class _Collapse extends CustomElement { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/collapse@@instance"); } /** * */ constructor() { super(); this[nameSymbol] = "collapse"; } /** * To set the options via the HTML tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} classes CSS classes * @property {string} classes.container CSS class for the container * @property {Object} features Feature configuration * @property {boolean} features.accordion Enable accordion mode * @property {boolean} features.persistState Enable persist state (Host and Config-Manager required) * @property {boolean} features.useScrollValues Use scroll values (scrollHeight) instead of clientHeight for the height calculation * @property {boolean} openByDefault Open the details by default */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate20() }, classes: { container: "padding" }, features: { accordion: true, persistState: true, useScrollValues: false }, openByDefault: false }); } /** * * @return {void} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initControlReferences15.call(this); initStateFromHostConfig.call(this); initResizeObserver.call(this); initEventHandler13.call(this); if (this.getOption("openByDefault")) { this.open(); } } /** * @return {void} */ connectedCallback() { super.connectedCallback(); updateResizeObserverObservation.call(this); } /** * @return {void} */ disconnectedCallback() { super.disconnectedCallback(); } /** * @return {Collapse} */ toggle() { if (this[detailsElementSymbol].classList.contains("active")) { this.close(); } else { this.open(); } return this; } /** * @return {boolean} */ isClosed() { return !this[detailsElementSymbol].classList.contains("active"); } /** * @return {boolean} */ isOpen() { return !this.isClosed(); } /** * Open the collapse * @return {Collapse} * @fires monster-collapse-before-open This event is fired before the collapse is opened. * @fires monster-collapse-open This event is fired after the collapse is opened. */ open() { let node; if (this[detailsElementSymbol].classList.contains("active")) { return this; } fireCustomEvent(this, "monster-" + this[nameSymbol] + "-before-open", {}); adjustHeight.call(this); this[detailsElementSymbol].classList.add("active"); if (this.getOption("features.accordion") === true) { node = this; while (node.nextElementSibling instanceof _Collapse) { node = node.nextElementSibling; node.close(); } node = this; while (node.previousElementSibling instanceof _Collapse) { node = node.previousElementSibling; node.close(); } } setTimeout(() => { setTimeout(() => { updateStateConfig.call(this); fireCustomEvent(this, "monster-" + this[nameSymbol] + "-open", {}); setTimeout(() => { this[controlElementSymbol7].classList.remove("overflow-hidden"); }, 500); }, 0); }, 0); return this; } /** * Close the collapse * @return {Collapse} * @fires monster-collapse-before-close This event is fired before the collapse is closed. * @fires monster-collapse-closed This event is fired after the collapse is closed. */ close() { if (!this[detailsElementSymbol].classList.contains("active")) { return this; } fireCustomEvent(this, "monster-" + this[nameSymbol] + "-before-close", {}); this[controlElementSymbol7].classList.add("overflow-hidden"); setTimeout(() => { this[detailsElementSymbol].classList.remove("active"); setTimeout(() => { updateStateConfig.call(this); fireCustomEvent(this, "monster-" + this[nameSymbol] + "-closed", {}); }, 0); }, 0); return this; } /** * @return {string} */ static getTag() { return "monster-collapse"; } /** * @return {Array<CSSStyleSheet>} */ static getCSSStyleSheet() { return [CollapseStyleSheet]; } /** * This method is called when the element is inserted into a document, including into a shadow tree. * @return {Collapse} * @fires monster-collapse-adjust-height This event is fired when the height is adjusted. As a detail, the height is passed. */ adjustHeight() { adjustHeight.call(this); return this; } }; registerCustomElement(Collapse); } }); // source/components/layout/details.mjs function getTranslations3() { const locale = getLocaleOfDocument(); switch (locale.language) { case "de": return { button: "Details" }; case "fr": return { button: "D\xE9tails" }; case "sp": return { button: "Detalles" }; case "it": return { button: "Dettagli" }; case "pl": return { button: "Szczeg\xF3\u0142y" }; case "no": return { button: "Detaljer" }; case "dk": return { button: "Detaljer" }; case "sw": return { button: "Detaljer" }; default: case "en": return { button: "Details" }; } } function initControlReferences16() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[buttonElementSymbol5] = this.shadowRoot.querySelector( "[data-monster-role=button]" ); } function initEventHandler14() { if (!this.shadowRoot) { throw new Error("no shadow-root is defined"); } this[buttonEventHandlerSymbol] = (event) => { this.toggle(); }; this[buttonElementSymbol5].addEventListener( "click", this[buttonEventHandlerSymbol] ); return this; } function initButtonLabel() { let label; const setLabel = false; if (this.hasAttribute(ATTRIBUTE_BUTTON_LABEL2)) { label = this.getAttribute(ATTRIBUTE_BUTTON_LABEL2); } else { label = this.getOption("labels.button", "Details"); } if (!isString(label)) { label = ""; } if (label === "") { label = this.innerText; } label = label.trim(); if (label === "") { label = this.getOption("labels.button", "Details"); } if (label.length > 100) { label = `${label.substring(0, 99)}\u2026`; } this.setAttribute(ATTRIBUTE_BUTTON_LABEL2, label); this.setOption("labels.button", label); return label; } function getTemplate21() { return ` <div data-monster-role="control" part="control" class="overflow-hidden"> <div data-monster-role="summary" part="summary"> <button part="button" data-monster-attributes="class path:classes.button" data-monster-role="button" data-monster-replace="path:labels.button | default:click me">click me </button> </div> <div data-monster-role="detail"> <div data-monster-attributes="class path:classes.container" part="container" data-monster-role="container"> <slot part="slot"></slot> </div> <div part="deco-line" class="deco-line" data-monster-role="deco"></div> </div> </div>`; } var buttonElementSymbol5, buttonEventHandlerSymbol, Details; var init_details2 = __esm({ "source/components/layout/details.mjs"() { init_customelement(); init_details(); init_constants4(); init_is(); init_util2(); init_collapse2(); init_constants(); init_locale2(); buttonElementSymbol5 = Symbol("buttonElement"); buttonEventHandlerSymbol = Symbol("buttonEventHandler"); Details = class extends Collapse { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/components/layout/details@@instance"); } /** * */ constructor() { super(); this[nameSymbol] = "details"; } /** * To set the options via the HTML Tag, the attribute `data-monster-options` must be used. * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} * * The individual configuration values can be found in the table. * * @property {Object} templates Template definitions * @property {string} templates.main Main template * @property {Object} button Button configuration * @property {string} button.label Button label */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: getTemplate21() }, labels: getTranslations3() }); } /** * @return {void} */ [assembleMethodSymbol]() { super[assembleMethodSymbol](); initButtonLabel.call(this); initControlReferences16.call(this); initEventHandler14.call(this); } /** * @return {void} */ connectedCallback() { super.connectedCallback(); const containDocument = this.shadowRoot; if (containDocument !== null) { const previousElement = this.previousElementSibling; if (previousElement && previousElement.tagName === "MONSTER-DETAILS") { this[buttonElementSymbol5].style.borderTop = "0"; } } } /** * @return {string} */ static getTag() { return "monster-details"; } /** * @return {Array<CSSStyleSheet>} */ static getCSSStyleSheet() { const css = super.getCSSStyleSheet(); css.push(DetailsStyleSheet); return css; } }; registerCustomElement(Details); } }); // source/components/host/details.mjs var details_exports = {}; __export(details_exports, { Details: () => Details2 }); var Details2; var init_details3 = __esm({ "source/components/host/details.mjs"() { init_details2(); Details2 = class extends Details { }; } }); // source/types/randomid.mjs var randomid_exports = {}; __export(randomid_exports, { RandomID: () => RandomID }); var internalCounter2, RandomID; var init_randomid = __esm({ "source/types/randomid.mjs"() { init_random(); init_global(); init_id(); internalCounter2 = 0; RandomID = class extends ID { /** * create new object */ constructor() { super(); internalCounter2 += 1; this.id = getGlobal().btoa(random(1, 1e4)).replace(/=/g, "").replace(/^[0-9]+/, "X") + internalCounter2; } }; } }); // source/types/uuid.mjs var uuid_exports = {}; __export(uuid_exports, { UUID: () => UUID }); function createWithRandom() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { const r = random(0, 65e3) * 16 | 0; const v = c === "x" ? r : r & 3 | 8; return v.toString(16)[0]; }); } function createWithCrypto() { const crypt = getGlobalObject("crypto"); if (!isObject(crypt)) return; if (typeof crypt?.["randomUUID"]) return; return crypt.randomUUID(); } var UUID; var init_uuid = __esm({ "source/types/uuid.mjs"() { init_constants(); init_random(); init_is(); init_base(); init_global(); UUID = class extends Base { /** * */ constructor() { super(); let uuid = createWithCrypto(); if (uuid === void 0) { uuid = createWithRandom(); } if (uuid === void 0) { throw new Error("unsupported"); } this[internalSymbol] = { value: uuid }; } /** * * @return {string} */ toString() { return this[internalSymbol]["value"]; } }; } }); // source/i18n/map/languages.mjs var languages; var init_languages = __esm({ "source/i18n/map/languages.mjs"() { languages = { en: "English", "en-GB": "English (United Kingdom)", "en-US": "English (United States)", "en-CA": "English (Canada)", "en-AU": "English (Australia)", es: "Espa\xF1ol", "es-ES": "Espa\xF1ol (Espa\xF1a)", "es-MX": "Espa\xF1ol (M\xE9xico)", "es-AR": "Espa\xF1ol (Argentina)", zh: "\u4E2D\u6587", "zh-CN": "\u4E2D\u6587\uFF08\u7B80\u4F53\uFF09", "zh-TW": "\u4E2D\u6587\uFF08\u7E41\u9AD4\uFF09", "zh-HK": "\u4E2D\u6587\uFF08\u9999\u6E2F\uFF09", fr: "Fran\xE7ais", "fr-FR": "Fran\xE7ais (France)", "fr-CA": "Fran\xE7ais (Canada)", "fr-BE": "Fran\xE7ais (Belgique)", de: "Deutsch", "de-DE": "Deutsch (Deutschland)", "de-AT": "Deutsch (\xD6sterreich)", "de-CH": "Deutsch (Schweiz)", ja: "\u65E5\u672C\u8A9E", ru: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", "ru-RU": "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 (\u0420\u043E\u0441\u0441\u0438\u044F)", it: "Italiano", "it-IT": "Italiano (Italia)", pt: "Portugu\xEAs", "pt-PT": "Portugu\xEAs (Portugal)", "pt-BR": "Portugu\xEAs (Brasil)", ko: "\uD55C\uAD6D\uC5B4", ar: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", hi: "\u0939\u093F\u0928\u094D\u0926\u0940", bn: "\u09AC\u09BE\u0982\u09B2\u09BE", pa: "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40", id: "Bahasa Indonesia", vi: "Ti\u1EBFng Vi\u1EC7t", tr: "T\xFCrk\xE7e", "tr-TR": "T\xFCrk\xE7e (T\xFCrkiye)", pl: "Polski", "pl-PL": "Polski (Polska)", uk: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430", "uk-UA": "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 (\u0423\u043A\u0440\u0430\u0457\u043D\u0430)", ro: "Rom\xE2n\u0103", "ro-RO": "Rom\xE2n\u0103 (Rom\xE2nia)", nl: "Nederlands", "nl-NL": "Nederlands (Nederland)", el: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC", "el-GR": "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC (\u0395\u03BB\u03BB\u03AC\u03B4\u03B1)", hu: "Magyar", "hu-HU": "Magyar (Magyarorsz\xE1g)", sv: "Svenska", "sv-SE": "Svenska (Sverige)", cs: "\u010Ce\u0161tina", "cs-CZ": "\u010Ce\u0161tina (\u010Cesk\xE1 republika)", bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", "bg-BG": "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 (\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F)", da: "Dansk", "da-DK": "Dansk (Danmark)", fi: "Suomi", "fi-FI": "Suomi (Suomi)", sk: "Sloven\u010Dina", "sk-SK": "Sloven\u010Dina (Slovensko)", he: "\u05E2\u05D1\u05E8\u05D9\u05EA", th: "\u0E44\u0E17\u0E22", sr: "\u0421\u0440\u043F\u0441\u043A\u0438", "sr-RS": "\u0421\u0440\u043F\u0441\u043A\u0438 (\u0421\u0440\u0431\u0438\u0458\u0430)", no: "Norsk", "no-NO": "Norsk (Norge)", lt: "Lietuvi\u0173", "lt-LT": "Lietuvi\u0173 (Lietuva)", lv: "Latvie\u0161u", "lv-LV": "Latvie\u0161u (Latvija)", et: "Eesti", "et-EE": "Eesti (Eesti)", hr: "Hrvatski", "hr-HR": "Hrvatski (Hrvatska)", sl: "Sloven\u0161\u010Dina", "sl-SI": "Sloven\u0161\u010Dina (Slovenija)", mt: "Malti", "mt-MT": "Malti (Malta)", is: "\xCDslenska", "is-IS": "\xCDslenska (\xCDsland)", ga: "Gaeilge", "ga-IE": "Gaeilge (\xC9ire)", cy: "Cymraeg", "cy-GB": "Cymraeg (Y Deyrnas Unedig)", sq: "Shqip", "sq-AL": "Shqip (Shqip\xEBria)" }; } }); // source/i18n/util.mjs var util_exports = {}; __export(util_exports, { detectUserLanguagePreference: () => detectUserLanguagePreference }); function detectUserLanguagePreference() { const currentLang = document.documentElement.lang; let preferredLanguages = []; if (typeof navigator.language === "string" && navigator.language.length > 0) { preferredLanguages = [navigator.language]; } if (Array.isArray(navigator.languages) && navigator.languages.length > 0) { preferredLanguages = navigator.languages; } preferredLanguages = preferredLanguages.concat( preferredLanguages.map((lang) => lang.split("-")[0]) ); if (!currentLang && preferredLanguages.length === 0) { return { message: "No language information available." }; } const linkTags = document.querySelectorAll("link[hreflang]"); if (linkTags.length === 0) { return { current: currentLang || null, message: "No <link> tags with hreflang available." }; } const availableLanguages = [...linkTags].map((link) => { const fullLang = link.hreflang; const baseLang = fullLang.split("-")[0]; let label = link.getAttribute("data-monster-label"); if (!label) { label = link.getAttribute("title"); if (!label) { label = languages?.[fullLang]; if (!label) { label = languages?.[baseLang]; } } } return { fullLang, baseLang, label, href: link.href }; }); const offerableLanguages = availableLanguages.filter( (lang) => preferredLanguages.includes(lang.fullLang) || preferredLanguages.includes(lang.baseLang) ); if (offerableLanguages.length === 0) { return { current: currentLang || null, message: "No available languages match the user's preferences.", available: availableLanguages.map((lang) => ({ ...lang, weight: 1 })) }; } function getWeight(langEntry) { if (preferredLanguages.includes(langEntry.fullLang)) return 3; if (preferredLanguages.includes(langEntry.baseLang)) return 2; return 1; } offerableLanguages.sort((a2, b) => getWeight(b) - getWeight(a2)); const bestMatch = offerableLanguages[0]; const bestMatchWeight = getWeight(bestMatch); const currentLabel = languages?.[currentLang] || currentLang; if (bestMatchWeight > 0) { return { current: currentLang || null, currentLabel, preferred: { full: bestMatch.fullLang, base: bestMatch.baseLang, label: bestMatch.label, href: bestMatch.href }, available: availableLanguages.map((lang) => ({ ...lang, weight: getWeight(lang) })), offerable: offerableLanguages.map((lang) => ({ ...lang, weight: getWeight(lang) })) }; } return { current: currentLang || null, message: "None of the preferred languages are available.", available: availableLanguages.map((lang) => ({ ...lang, weight: getWeight(lang) })) }; } var init_util3 = __esm({ "source/i18n/util.mjs"() { init_languages(); } }); // test/web/prepare.js if (typeof window === "object") { (function() { let sayswho = function() { var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if (/trident/i.test(M[1])) { tem = /\brv[ :]+(\d+)/g.exec(ua) || []; return "IE " + (tem[1] || ""); } if (M[1] === "Chrome") { tem = ua.match(/\b(OPR|Edge)\/(\d+)/); if (tem != null) return tem.slice(1).join(" ").replace("OPR", "Opera"); } M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, "-?"]; if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]); return M.join(" "); }(); let element = document.querySelector("h1"); element.innerHTML += " " + sayswho; })(); } // test/cases/components/layout/tabs.mjs init_global(); // node_modules/.pnpm/chai@5.1.2/node_modules/chai/chai.js var __defProp2 = Object.defineProperty; var __getOwnPropNames2 = Object.getOwnPropertyNames; var __name = (target, value) => __defProp2(target, "name", { value, configurable: true }); var __commonJS2 = (cb, mod) => function __require2() { return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export2 = (target, all) => { for (var name in all) __defProp2(target, name, { get: all[name], enumerable: true }); }; var require_util = __commonJS2({ "(disabled):util"() { } }); var utils_exports = {}; __export2(utils_exports, { addChainableMethod: () => addChainableMethod, addLengthGuard: () => addLengthGuard, addMethod: () => addMethod, addProperty: () => addProperty, checkError: () => check_error_exports, compareByInspect: () => compareByInspect, eql: () => deep_eql_default, expectTypes: () => expectTypes, flag: () => flag, getActual: () => getActual, getMessage: () => getMessage2, getName: () => getName, getOperator: () => getOperator, getOwnEnumerableProperties: () => getOwnEnumerableProperties, getOwnEnumerablePropertySymbols: () => getOwnEnumerablePropertySymbols, getPathInfo: () => getPathInfo, hasProperty: () => hasProperty, inspect: () => inspect2, isNaN: () => isNaN22, isNumeric: () => isNumeric, isProxyEnabled: () => isProxyEnabled, isRegExp: () => isRegExp2, objDisplay: () => objDisplay, overwriteChainableMethod: () => overwriteChainableMethod, overwriteMethod: () => overwriteMethod, overwriteProperty: () => overwriteProperty, proxify: () => proxify, test: () => test, transferFlags: () => transferFlags, type: () => type }); var check_error_exports = {}; __export2(check_error_exports, { compatibleConstructor: () => compatibleConstructor, compatibleInstance: () => compatibleInstance, compatibleMessage: () => compatibleMessage, getConstructorName: () => getConstructorName, getMessage: () => getMessage }); function isErrorInstance(obj) { return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]"; } __name(isErrorInstance, "isErrorInstance"); function isRegExp(obj) { return Object.prototype.toString.call(obj) === "[object RegExp]"; } __name(isRegExp, "isRegExp"); function compatibleInstance(thrown, errorLike) { return isErrorInstance(errorLike) && thrown === errorLike; } __name(compatibleInstance, "compatibleInstance"); function compatibleConstructor(thrown, errorLike) { if (isErrorInstance(errorLike)) { return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; } else if ((typeof errorLike === "object" || typeof errorLike === "function") && errorLike.prototype) { return thrown.constructor === errorLike || thrown instanceof errorLike; } return false; } __name(compatibleConstructor, "compatibleConstructor"); function compatibleMessage(thrown, errMatcher) { const comparisonString = typeof thrown === "string" ? thrown : thrown.message; if (isRegExp(errMatcher)) { return errMatcher.test(comparisonString); } else if (typeof errMatcher === "string") { return comparisonString.indexOf(errMatcher) !== -1; } return false; } __name(compatibleMessage, "compatibleMessage"); function getConstructorName(errorLike) { let constructorName = errorLike; if (isErrorInstance(errorLike)) { constructorName = errorLike.constructor.name; } else if (typeof errorLike === "function") { constructorName = errorLike.name; if (constructorName === "") { const newConstructorName = new errorLike().name; constructorName = newConstructorName || constructorName; } } return constructorName; } __name(getConstructorName, "getConstructorName"); function getMessage(errorLike) { let msg = ""; if (errorLike && errorLike.message) { msg = errorLike.message; } else if (typeof errorLike === "string") { msg = errorLike; } return msg; } __name(getMessage, "getMessage"); function flag(obj, key, value) { var flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null)); if (arguments.length === 3) { flags[key] = value; } else { return flags[key]; } } __name(flag, "flag"); function test(obj, args) { var negate = flag(obj, "negate"), expr = args[0]; return negate ? !expr : expr; } __name(test, "test"); function type(obj) { if (typeof obj === "undefined") { return "undefined"; } if (obj === null) { return "null"; } const stringTag = obj[Symbol.toStringTag]; if (typeof stringTag === "string") { return stringTag; } const type3 = Object.prototype.toString.call(obj).slice(8, -1); return type3; } __name(type, "type"); var canElideFrames = "captureStackTrace" in Error; var AssertionError = class _AssertionError extends Error { static { __name(this, "AssertionError"); } message; get name() { return "AssertionError"; } get ok() { return false; } constructor(message = "Unspecified AssertionError", props, ssf) { super(message); this.message = message; if (canElideFrames) { Error.captureStackTrace(this, ssf || _AssertionError); } for (const key in props) { if (!(key in this)) { this[key] = props[key]; } } } toJSON(stack) { return { ...this, name: this.name, message: this.message, ok: false, stack: stack !== false ? this.stack : void 0 }; } }; function expectTypes(obj, types) { var flagMsg = flag(obj, "message"); var ssfi = flag(obj, "ssfi"); flagMsg = flagMsg ? flagMsg + ": " : ""; obj = flag(obj, "object"); types = types.map(function(t) { return t.toLowerCase(); }); types.sort(); var str = types.map(function(t, index) { var art = ~["a", "e", "i", "o", "u"].indexOf(t.charAt(0)) ? "an" : "a"; var or = types.length > 1 && index === types.length - 1 ? "or " : ""; return or + art + " " + t; }).join(", "); var objType = type(obj).toLowerCase(); if (!types.some(function(expected) { return objType === expected; })) { throw new AssertionError( flagMsg + "object tested must be " + str + ", but " + objType + " given", void 0, ssfi ); } } __name(expectTypes, "expectTypes"); function getActual(obj, args) { return args.length > 4 ? args[4] : obj._obj; } __name(getActual, "getActual"); var ansiColors = { bold: ["1", "22"], dim: ["2", "22"], italic: ["3", "23"], underline: ["4", "24"], // 5 & 6 are blinking inverse: ["7", "27"], hidden: ["8", "28"], strike: ["9", "29"], // 10-20 are fonts // 21-29 are resets for 1-9 black: ["30", "39"], red: ["31", "39"], green: ["32", "39"], yellow: ["33", "39"], blue: ["34", "39"], magenta: ["35", "39"], cyan: ["36", "39"], white: ["37", "39"], brightblack: ["30;1", "39"], brightred: ["31;1", "39"], brightgreen: ["32;1", "39"], brightyellow: ["33;1", "39"], brightblue: ["34;1", "39"], brightmagenta: ["35;1", "39"], brightcyan: ["36;1", "39"], brightwhite: ["37;1", "39"], grey: ["90", "39"] }; var styles = { special: "cyan", number: "yellow", bigint: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", symbol: "green", date: "magenta", regexp: "red" }; var truncator = "\u2026"; function colorise(value, styleType) { const color = ansiColors[styles[styleType]] || ansiColors[styleType] || ""; if (!color) { return String(value); } return `\x1B[${color[0]}m${String(value)}\x1B[${color[1]}m`; } __name(colorise, "colorise"); function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], // eslint-disable-next-line no-shadow truncate: truncate2 = Infinity, stylize = String } = {}, inspect3) { const options2 = { showHidden: Boolean(showHidden), depth: Number(depth), colors: Boolean(colors), customInspect: Boolean(customInspect), showProxy: Boolean(showProxy), maxArrayLength: Number(maxArrayLength), breakLength: Number(breakLength), truncate: Number(truncate2), seen, inspect: inspect3, stylize }; if (options2.colors) { options2.stylize = colorise; } return options2; } __name(normaliseOptions, "normaliseOptions"); function isHighSurrogate(char) { return char >= "\uD800" && char <= "\uDBFF"; } __name(isHighSurrogate, "isHighSurrogate"); function truncate(string, length, tail = truncator) { string = String(string); const tailLength = tail.length; const stringLength = string.length; if (tailLength > length && stringLength > tailLength) { return tail; } if (stringLength > length && stringLength > tailLength) { let end2 = length - tailLength; if (end2 > 0 && isHighSurrogate(string[end2 - 1])) { end2 = end2 - 1; } return `${string.slice(0, end2)}${tail}`; } return string; } __name(truncate, "truncate"); function inspectList(list, options2, inspectItem, separator = ", ") { inspectItem = inspectItem || options2.inspect; const size3 = list.length; if (size3 === 0) return ""; const originalLength = options2.truncate; let output = ""; let peek = ""; let truncated = ""; for (let i = 0; i < size3; i += 1) { const last = i + 1 === list.length; const secondToLast = i + 2 === list.length; truncated = `${truncator}(${list.length - i})`; const value = list[i]; options2.truncate = originalLength - output.length - (last ? 0 : separator.length); const string = peek || inspectItem(value, options2) + (last ? "" : separator); const nextLength = output.length + string.length; const truncatedLength = nextLength + truncated.length; if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { break; } if (!last && !secondToLast && truncatedLength > originalLength) { break; } peek = last ? "" : inspectItem(list[i + 1], options2) + (secondToLast ? "" : separator); if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { break; } output += string; if (!last && !secondToLast && nextLength + peek.length >= originalLength) { truncated = `${truncator}(${list.length - i - 1})`; break; } truncated = ""; } return `${output}${truncated}`; } __name(inspectList, "inspectList"); function quoteComplexKey(key) { if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { return key; } return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); } __name(quoteComplexKey, "quoteComplexKey"); function inspectProperty([key, value], options2) { options2.truncate -= 2; if (typeof key === "string") { key = quoteComplexKey(key); } else if (typeof key !== "number") { key = `[${options2.inspect(key, options2)}]`; } options2.truncate -= key.length; value = options2.inspect(value, options2); return `${key}: ${value}`; } __name(inspectProperty, "inspectProperty"); function inspectArray(array, options2) { const nonIndexProperties = Object.keys(array).slice(array.length); if (!array.length && !nonIndexProperties.length) return "[]"; options2.truncate -= 4; const listContents = inspectList(array, options2); options2.truncate -= listContents.length; let propertyContents = ""; if (nonIndexProperties.length) { propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options2, inspectProperty); } return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`; } __name(inspectArray, "inspectArray"); var getArrayName = /* @__PURE__ */ __name((array) => { if (typeof Buffer === "function" && array instanceof Buffer) { return "Buffer"; } if (array[Symbol.toStringTag]) { return array[Symbol.toStringTag]; } return array.constructor.name; }, "getArrayName"); function inspectTypedArray(array, options2) { const name = getArrayName(array); options2.truncate -= name.length + 4; const nonIndexProperties = Object.keys(array).slice(array.length); if (!array.length && !nonIndexProperties.length) return `${name}[]`; let output = ""; for (let i = 0; i < array.length; i++) { const string = `${options2.stylize(truncate(array[i], options2.truncate), "number")}${i === array.length - 1 ? "" : ", "}`; options2.truncate -= string.length; if (array[i] !== array.length && options2.truncate <= 3) { output += `${truncator}(${array.length - array[i] + 1})`; break; } output += string; } let propertyContents = ""; if (nonIndexProperties.length) { propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options2, inspectProperty); } return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`; } __name(inspectTypedArray, "inspectTypedArray"); function inspectDate(dateObject, options2) { const stringRepresentation = dateObject.toJSON(); if (stringRepresentation === null) { return "Invalid Date"; } const split = stringRepresentation.split("T"); const date = split[0]; return options2.stylize(`${date}T${truncate(split[1], options2.truncate - date.length - 1)}`, "date"); } __name(inspectDate, "inspectDate"); function inspectFunction(func, options2) { const functionType = func[Symbol.toStringTag] || "Function"; const name = func.name; if (!name) { return options2.stylize(`[${functionType}]`, "special"); } return options2.stylize(`[${functionType} ${truncate(name, options2.truncate - 11)}]`, "special"); } __name(inspectFunction, "inspectFunction"); function inspectMapEntry([key, value], options2) { options2.truncate -= 4; key = options2.inspect(key, options2); options2.truncate -= key.length; value = options2.inspect(value, options2); return `${key} => ${value}`; } __name(inspectMapEntry, "inspectMapEntry"); function mapToEntries(map) { const entries = []; map.forEach((value, key) => { entries.push([key, value]); }); return entries; } __name(mapToEntries, "mapToEntries"); function inspectMap(map, options2) { const size3 = map.size - 1; if (size3 <= 0) { return "Map{}"; } options2.truncate -= 7; return `Map{ ${inspectList(mapToEntries(map), options2, inspectMapEntry)} }`; } __name(inspectMap, "inspectMap"); var isNaN2 = Number.isNaN || ((i) => i !== i); function inspectNumber(number, options2) { if (isNaN2(number)) { return options2.stylize("NaN", "number"); } if (number === Infinity) { return options2.stylize("Infinity", "number"); } if (number === -Infinity) { return options2.stylize("-Infinity", "number"); } if (number === 0) { return options2.stylize(1 / number === Infinity ? "+0" : "-0", "number"); } return options2.stylize(truncate(String(number), options2.truncate), "number"); } __name(inspectNumber, "inspectNumber"); function inspectBigInt(number, options2) { let nums = truncate(number.toString(), options2.truncate - 1); if (nums !== truncator) nums += "n"; return options2.stylize(nums, "bigint"); } __name(inspectBigInt, "inspectBigInt"); function inspectRegExp(value, options2) { const flags = value.toString().split("/")[2]; const sourceLength = options2.truncate - (2 + flags.length); const source = value.source; return options2.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp"); } __name(inspectRegExp, "inspectRegExp"); function arrayFromSet(set2) { const values = []; set2.forEach((value) => { values.push(value); }); return values; } __name(arrayFromSet, "arrayFromSet"); function inspectSet(set2, options2) { if (set2.size === 0) return "Set{}"; options2.truncate -= 7; return `Set{ ${inspectList(arrayFromSet(set2), options2)} }`; } __name(inspectSet, "inspectSet"); var stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g"); var escapeCharacters = { "\b": "\\b", " ": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", "'": "\\'", "\\": "\\\\" }; var hex = 16; var unicodeLength = 4; function escape2(char) { return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`; } __name(escape2, "escape"); function inspectString(string, options2) { if (stringEscapeChars.test(string)) { string = string.replace(stringEscapeChars, escape2); } return options2.stylize(`'${truncate(string, options2.truncate - 2)}'`, "string"); } __name(inspectString, "inspectString"); function inspectSymbol(value) { if ("description" in Symbol.prototype) { return value.description ? `Symbol(${value.description})` : "Symbol()"; } return value.toString(); } __name(inspectSymbol, "inspectSymbol"); var getPromiseValue = /* @__PURE__ */ __name(() => "Promise{\u2026}", "getPromiseValue"); try { const { getPromiseDetails, kPending, kRejected } = process.binding("util"); if (Array.isArray(getPromiseDetails(Promise.resolve()))) { getPromiseValue = /* @__PURE__ */ __name((value, options2) => { const [state, innerValue] = getPromiseDetails(value); if (state === kPending) { return "Promise{<pending>}"; } return `Promise${state === kRejected ? "!" : ""}{${options2.inspect(innerValue, options2)}}`; }, "getPromiseValue"); } } catch (notNode) { } var promise_default = getPromiseValue; function inspectObject(object, options2) { const properties = Object.getOwnPropertyNames(object); const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; if (properties.length === 0 && symbols.length === 0) { return "{}"; } options2.truncate -= 4; options2.seen = options2.seen || []; if (options2.seen.includes(object)) { return "[Circular]"; } options2.seen.push(object); const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options2, inspectProperty); const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options2, inspectProperty); options2.seen.pop(); let sep = ""; if (propertyContents && symbolContents) { sep = ", "; } return `{ ${propertyContents}${sep}${symbolContents} }`; } __name(inspectObject, "inspectObject"); var toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false; function inspectClass(value, options2) { let name = ""; if (toStringTag && toStringTag in value) { name = value[toStringTag]; } name = name || value.constructor.name; if (!name || name === "_class") { name = "<Anonymous Class>"; } options2.truncate -= name.length; return `${name}${inspectObject(value, options2)}`; } __name(inspectClass, "inspectClass"); function inspectArguments(args, options2) { if (args.length === 0) return "Arguments[]"; options2.truncate -= 13; return `Arguments[ ${inspectList(args, options2)} ]`; } __name(inspectArguments, "inspectArguments"); var errorKeys = [ "stack", "line", "column", "name", "message", "fileName", "lineNumber", "columnNumber", "number", "description", "cause" ]; function inspectObject2(error, options2) { const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1); const name = error.name; options2.truncate -= name.length; let message = ""; if (typeof error.message === "string") { message = truncate(error.message, options2.truncate); } else { properties.unshift("message"); } message = message ? `: ${message}` : ""; options2.truncate -= message.length + 5; options2.seen = options2.seen || []; if (options2.seen.includes(error)) { return "[Circular]"; } options2.seen.push(error); const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options2, inspectProperty); return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`; } __name(inspectObject2, "inspectObject"); function inspectAttribute([key, value], options2) { options2.truncate -= 3; if (!value) { return `${options2.stylize(String(key), "yellow")}`; } return `${options2.stylize(String(key), "yellow")}=${options2.stylize(`"${value}"`, "string")}`; } __name(inspectAttribute, "inspectAttribute"); function inspectHTMLCollection(collection, options2) { return inspectList(collection, options2, inspectHTML, "\n"); } __name(inspectHTMLCollection, "inspectHTMLCollection"); function inspectHTML(element, options2) { const properties = element.getAttributeNames(); const name = element.tagName.toLowerCase(); const head = options2.stylize(`<${name}`, "special"); const headClose = options2.stylize(`>`, "special"); const tail = options2.stylize(`</${name}>`, "special"); options2.truncate -= name.length * 2 + 5; let propertyContents = ""; if (properties.length > 0) { propertyContents += " "; propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options2, inspectAttribute, " "); } options2.truncate -= propertyContents.length; const truncate2 = options2.truncate; let children = inspectHTMLCollection(element.children, options2); if (children && children.length > truncate2) { children = `${truncator}(${element.children.length})`; } return `${head}${propertyContents}${headClose}${children}${tail}`; } __name(inspectHTML, "inspectHTML"); var symbolsSupported = typeof Symbol === "function" && typeof Symbol.for === "function"; var chaiInspect = symbolsSupported ? Symbol.for("chai/inspect") : "@@chai/inspect"; var nodeInspect = false; try { const nodeUtil = require_util(); nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false; } catch (noNodeInspect) { nodeInspect = false; } var constructorMap = /* @__PURE__ */ new WeakMap(); var stringTagMap = {}; var baseTypesMap = { undefined: (value, options2) => options2.stylize("undefined", "undefined"), null: (value, options2) => options2.stylize("null", "null"), boolean: (value, options2) => options2.stylize(String(value), "boolean"), Boolean: (value, options2) => options2.stylize(String(value), "boolean"), number: inspectNumber, Number: inspectNumber, bigint: inspectBigInt, BigInt: inspectBigInt, string: inspectString, String: inspectString, function: inspectFunction, Function: inspectFunction, symbol: inspectSymbol, // A Symbol polyfill will return `Symbol` not `symbol` from typedetect Symbol: inspectSymbol, Array: inspectArray, Date: inspectDate, Map: inspectMap, Set: inspectSet, RegExp: inspectRegExp, Promise: promise_default, // WeakSet, WeakMap are totally opaque to us WeakSet: (value, options2) => options2.stylize("WeakSet{\u2026}", "special"), WeakMap: (value, options2) => options2.stylize("WeakMap{\u2026}", "special"), Arguments: inspectArguments, Int8Array: inspectTypedArray, Uint8Array: inspectTypedArray, Uint8ClampedArray: inspectTypedArray, Int16Array: inspectTypedArray, Uint16Array: inspectTypedArray, Int32Array: inspectTypedArray, Uint32Array: inspectTypedArray, Float32Array: inspectTypedArray, Float64Array: inspectTypedArray, Generator: () => "", DataView: () => "", ArrayBuffer: () => "", Error: inspectObject2, HTMLCollection: inspectHTMLCollection, NodeList: inspectHTMLCollection }; var inspectCustom = /* @__PURE__ */ __name((value, options2, type3) => { if (chaiInspect in value && typeof value[chaiInspect] === "function") { return value[chaiInspect](options2); } if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === "function") { return value[nodeInspect](options2.depth, options2); } if ("inspect" in value && typeof value.inspect === "function") { return value.inspect(options2.depth, options2); } if ("constructor" in value && constructorMap.has(value.constructor)) { return constructorMap.get(value.constructor)(value, options2); } if (stringTagMap[type3]) { return stringTagMap[type3](value, options2); } return ""; }, "inspectCustom"); var toString = Object.prototype.toString; function inspect(value, opts = {}) { const options2 = normaliseOptions(opts, inspect); const { customInspect } = options2; let type3 = value === null ? "null" : typeof value; if (type3 === "object") { type3 = toString.call(value).slice(8, -1); } if (type3 in baseTypesMap) { return baseTypesMap[type3](value, options2); } if (customInspect && value) { const output = inspectCustom(value, options2, type3); if (output) { if (typeof output === "string") return output; return inspect(output, options2); } } const proto = value ? Object.getPrototypeOf(value) : false; if (proto === Object.prototype || proto === null) { return inspectObject(value, options2); } if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) { return inspectHTML(value, options2); } if ("constructor" in value) { if (value.constructor !== Object) { return inspectClass(value, options2); } return inspectObject(value, options2); } if (value === Object(value)) { return inspectObject(value, options2); } return options2.stylize(String(value), type3); } __name(inspect, "inspect"); var config = { /** * ### config.includeStack * * User configurable property, influences whether stack trace * is included in Assertion error message. Default of false * suppresses stack trace in the error message. * * chai.config.includeStack = true; // enable stack on error * * @param {boolean} * @public */ includeStack: false, /** * ### config.showDiff * * User configurable property, influences whether or not * the `showDiff` flag should be included in the thrown * AssertionErrors. `false` will always be `false`; `true` * will be true when the assertion has requested a diff * be shown. * * @param {boolean} * @public */ showDiff: true, /** * ### config.truncateThreshold * * User configurable property, sets length threshold for actual and * expected values in assertion errors. If this threshold is exceeded, for * example for large data structures, the value is replaced with something * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. * * Set it to zero if you want to disable truncating altogether. * * This is especially userful when doing assertions on arrays: having this * set to a reasonable large value makes the failure messages readily * inspectable. * * chai.config.truncateThreshold = 0; // disable truncating * * @param {number} * @public */ truncateThreshold: 40, /** * ### config.useProxy * * User configurable property, defines if chai will use a Proxy to throw * an error when a non-existent property is read, which protects users * from typos when using property-based assertions. * * Set it to false if you want to disable this feature. * * chai.config.useProxy = false; // disable use of Proxy * * This feature is automatically disabled regardless of this config value * in environments that don't support proxies. * * @param {boolean} * @public */ useProxy: true, /** * ### config.proxyExcludedKeys * * User configurable property, defines which properties should be ignored * instead of throwing an error if they do not exist on the assertion. * This is only applied if the environment Chai is running in supports proxies and * if the `useProxy` configuration setting is enabled. * By default, `then` and `inspect` will not throw an error if they do not exist on the * assertion object because the `.inspect` property is read by `util.inspect` (for example, when * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking. * * // By default these keys will not throw an error if they do not exist on the assertion object * chai.config.proxyExcludedKeys = ['then', 'inspect']; * * @param {Array} * @public */ proxyExcludedKeys: ["then", "catch", "inspect", "toJSON"], /** * ### config.deepEqual * * User configurable property, defines which a custom function to use for deepEqual * comparisons. * By default, the function used is the one from the `deep-eql` package without custom comparator. * * // use a custom comparator * chai.config.deepEqual = (expected, actual) => { * return chai.util.eql(expected, actual, { * comparator: (expected, actual) => { * // for non number comparison, use the default behavior * if(typeof expected !== 'number') return null; * // allow a difference of 10 between compared numbers * return typeof actual === 'number' && Math.abs(actual - expected) < 10 * } * }) * }; * * @param {Function} * @public */ deepEqual: null }; function inspect2(obj, showHidden, depth, colors) { var options2 = { colors, depth: typeof depth === "undefined" ? 2 : depth, showHidden, truncate: config.truncateThreshold ? config.truncateThreshold : Infinity }; return inspect(obj, options2); } __name(inspect2, "inspect"); function objDisplay(obj) { var str = inspect2(obj), type3 = Object.prototype.toString.call(obj); if (config.truncateThreshold && str.length >= config.truncateThreshold) { if (type3 === "[object Function]") { return !obj.name || obj.name === "" ? "[Function]" : "[Function: " + obj.name + "]"; } else if (type3 === "[object Array]") { return "[ Array(" + obj.length + ") ]"; } else if (type3 === "[object Object]") { var keys = Object.keys(obj), kstr = keys.length > 2 ? keys.splice(0, 2).join(", ") + ", ..." : keys.join(", "); return "{ Object (" + kstr + ") }"; } else { return str; } } else { return str; } } __name(objDisplay, "objDisplay"); function getMessage2(obj, args) { var negate = flag(obj, "negate"), val = flag(obj, "object"), expected = args[3], actual = getActual(obj, args), msg = negate ? args[2] : args[1], flagMsg = flag(obj, "message"); if (typeof msg === "function") msg = msg(); msg = msg || ""; msg = msg.replace(/#\{this\}/g, function() { return objDisplay(val); }).replace(/#\{act\}/g, function() { return objDisplay(actual); }).replace(/#\{exp\}/g, function() { return objDisplay(expected); }); return flagMsg ? flagMsg + ": " + msg : msg; } __name(getMessage2, "getMessage"); function transferFlags(assertion, object, includeAll) { var flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null)); if (!object.__flags) { object.__flags = /* @__PURE__ */ Object.create(null); } includeAll = arguments.length === 3 ? includeAll : true; for (var flag3 in flags) { if (includeAll || flag3 !== "object" && flag3 !== "ssfi" && flag3 !== "lockSsfi" && flag3 != "message") { object.__flags[flag3] = flags[flag3]; } } } __name(transferFlags, "transferFlags"); function type2(obj) { if (typeof obj === "undefined") { return "undefined"; } if (obj === null) { return "null"; } const stringTag = obj[Symbol.toStringTag]; if (typeof stringTag === "string") { return stringTag; } const sliceStart = 8; const sliceEnd = -1; return Object.prototype.toString.call(obj).slice(sliceStart, sliceEnd); } __name(type2, "type"); function FakeMap() { this._key = "chai/deep-eql__" + Math.random() + Date.now(); } __name(FakeMap, "FakeMap"); FakeMap.prototype = { get: /* @__PURE__ */ __name(function get(key) { return key[this._key]; }, "get"), set: /* @__PURE__ */ __name(function set(key, value) { if (Object.isExtensible(key)) { Object.defineProperty(key, this._key, { value, configurable: true }); } }, "set") }; var MemoizeMap = typeof WeakMap === "function" ? WeakMap : FakeMap; function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { if (!memoizeMap || isPrimitive2(leftHandOperand) || isPrimitive2(rightHandOperand)) { return null; } var leftHandMap = memoizeMap.get(leftHandOperand); if (leftHandMap) { var result = leftHandMap.get(rightHandOperand); if (typeof result === "boolean") { return result; } } return null; } __name(memoizeCompare, "memoizeCompare"); function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { if (!memoizeMap || isPrimitive2(leftHandOperand) || isPrimitive2(rightHandOperand)) { return; } var leftHandMap = memoizeMap.get(leftHandOperand); if (leftHandMap) { leftHandMap.set(rightHandOperand, result); } else { leftHandMap = new MemoizeMap(); leftHandMap.set(rightHandOperand, result); memoizeMap.set(leftHandOperand, leftHandMap); } } __name(memoizeSet, "memoizeSet"); var deep_eql_default = deepEqual; function deepEqual(leftHandOperand, rightHandOperand, options2) { if (options2 && options2.comparator) { return extensiveDeepEqual(leftHandOperand, rightHandOperand, options2); } var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); if (simpleResult !== null) { return simpleResult; } return extensiveDeepEqual(leftHandOperand, rightHandOperand, options2); } __name(deepEqual, "deepEqual"); function simpleEqual(leftHandOperand, rightHandOperand) { if (leftHandOperand === rightHandOperand) { return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; } if (leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare rightHandOperand !== rightHandOperand) { return true; } if (isPrimitive2(leftHandOperand) || isPrimitive2(rightHandOperand)) { return false; } return null; } __name(simpleEqual, "simpleEqual"); function extensiveDeepEqual(leftHandOperand, rightHandOperand, options2) { options2 = options2 || {}; options2.memoize = options2.memoize === false ? false : options2.memoize || new MemoizeMap(); var comparator = options2 && options2.comparator; var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options2.memoize); if (memoizeResultLeft !== null) { return memoizeResultLeft; } var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options2.memoize); if (memoizeResultRight !== null) { return memoizeResultRight; } if (comparator) { var comparatorResult = comparator(leftHandOperand, rightHandOperand); if (comparatorResult === false || comparatorResult === true) { memoizeSet(leftHandOperand, rightHandOperand, options2.memoize, comparatorResult); return comparatorResult; } var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); if (simpleResult !== null) { return simpleResult; } } var leftHandType = type2(leftHandOperand); if (leftHandType !== type2(rightHandOperand)) { memoizeSet(leftHandOperand, rightHandOperand, options2.memoize, false); return false; } memoizeSet(leftHandOperand, rightHandOperand, options2.memoize, true); var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options2); memoizeSet(leftHandOperand, rightHandOperand, options2.memoize, result); return result; } __name(extensiveDeepEqual, "extensiveDeepEqual"); function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options2) { switch (leftHandType) { case "String": case "Number": case "Boolean": case "Date": return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); case "Promise": case "Symbol": case "function": case "WeakMap": case "WeakSet": return leftHandOperand === rightHandOperand; case "Error": return keysEqual(leftHandOperand, rightHandOperand, ["name", "message", "code"], options2); case "Arguments": case "Int8Array": case "Uint8Array": case "Uint8ClampedArray": case "Int16Array": case "Uint16Array": case "Int32Array": case "Uint32Array": case "Float32Array": case "Float64Array": case "Array": return iterableEqual(leftHandOperand, rightHandOperand, options2); case "RegExp": return regexpEqual(leftHandOperand, rightHandOperand); case "Generator": return generatorEqual(leftHandOperand, rightHandOperand, options2); case "DataView": return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options2); case "ArrayBuffer": return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options2); case "Set": return entriesEqual(leftHandOperand, rightHandOperand, options2); case "Map": return entriesEqual(leftHandOperand, rightHandOperand, options2); case "Temporal.PlainDate": case "Temporal.PlainTime": case "Temporal.PlainDateTime": case "Temporal.Instant": case "Temporal.ZonedDateTime": case "Temporal.PlainYearMonth": case "Temporal.PlainMonthDay": return leftHandOperand.equals(rightHandOperand); case "Temporal.Duration": return leftHandOperand.total("nanoseconds") === rightHandOperand.total("nanoseconds"); case "Temporal.TimeZone": case "Temporal.Calendar": return leftHandOperand.toString() === rightHandOperand.toString(); default: return objectEqual(leftHandOperand, rightHandOperand, options2); } } __name(extensiveDeepEqualByType, "extensiveDeepEqualByType"); function regexpEqual(leftHandOperand, rightHandOperand) { return leftHandOperand.toString() === rightHandOperand.toString(); } __name(regexpEqual, "regexpEqual"); function entriesEqual(leftHandOperand, rightHandOperand, options2) { try { if (leftHandOperand.size !== rightHandOperand.size) { return false; } if (leftHandOperand.size === 0) { return true; } } catch (sizeError) { return false; } var leftHandItems = []; var rightHandItems = []; leftHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) { leftHandItems.push([key, value]); }, "gatherEntries")); rightHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) { rightHandItems.push([key, value]); }, "gatherEntries")); return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options2); } __name(entriesEqual, "entriesEqual"); function iterableEqual(leftHandOperand, rightHandOperand, options2) { var length = leftHandOperand.length; if (length !== rightHandOperand.length) { return false; } if (length === 0) { return true; } var index = -1; while (++index < length) { if (deepEqual(leftHandOperand[index], rightHandOperand[index], options2) === false) { return false; } } return true; } __name(iterableEqual, "iterableEqual"); function generatorEqual(leftHandOperand, rightHandOperand, options2) { return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options2); } __name(generatorEqual, "generatorEqual"); function hasIteratorFunction(target) { return typeof Symbol !== "undefined" && typeof target === "object" && typeof Symbol.iterator !== "undefined" && typeof target[Symbol.iterator] === "function"; } __name(hasIteratorFunction, "hasIteratorFunction"); function getIteratorEntries(target) { if (hasIteratorFunction(target)) { try { return getGeneratorEntries(target[Symbol.iterator]()); } catch (iteratorError) { return []; } } return []; } __name(getIteratorEntries, "getIteratorEntries"); function getGeneratorEntries(generator) { var generatorResult = generator.next(); var accumulator = [generatorResult.value]; while (generatorResult.done === false) { generatorResult = generator.next(); accumulator.push(generatorResult.value); } return accumulator; } __name(getGeneratorEntries, "getGeneratorEntries"); function getEnumerableKeys(target) { var keys = []; for (var key in target) { keys.push(key); } return keys; } __name(getEnumerableKeys, "getEnumerableKeys"); function getEnumerableSymbols(target) { var keys = []; var allKeys = Object.getOwnPropertySymbols(target); for (var i = 0; i < allKeys.length; i += 1) { var key = allKeys[i]; if (Object.getOwnPropertyDescriptor(target, key).enumerable) { keys.push(key); } } return keys; } __name(getEnumerableSymbols, "getEnumerableSymbols"); function keysEqual(leftHandOperand, rightHandOperand, keys, options2) { var length = keys.length; if (length === 0) { return true; } for (var i = 0; i < length; i += 1) { if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options2) === false) { return false; } } return true; } __name(keysEqual, "keysEqual"); function objectEqual(leftHandOperand, rightHandOperand, options2) { var leftHandKeys = getEnumerableKeys(leftHandOperand); var rightHandKeys = getEnumerableKeys(rightHandOperand); var leftHandSymbols = getEnumerableSymbols(leftHandOperand); var rightHandSymbols = getEnumerableSymbols(rightHandOperand); leftHandKeys = leftHandKeys.concat(leftHandSymbols); rightHandKeys = rightHandKeys.concat(rightHandSymbols); if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) { return false; } return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options2); } var leftHandEntries = getIteratorEntries(leftHandOperand); var rightHandEntries = getIteratorEntries(rightHandOperand); if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { leftHandEntries.sort(); rightHandEntries.sort(); return iterableEqual(leftHandEntries, rightHandEntries, options2); } if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) { return true; } return false; } __name(objectEqual, "objectEqual"); function isPrimitive2(value) { return value === null || typeof value !== "object"; } __name(isPrimitive2, "isPrimitive"); function mapSymbols(arr) { return arr.map(/* @__PURE__ */ __name(function mapSymbol(entry) { if (typeof entry === "symbol") { return entry.toString(); } return entry; }, "mapSymbol")); } __name(mapSymbols, "mapSymbols"); function hasProperty(obj, name) { if (typeof obj === "undefined" || obj === null) { return false; } return name in Object(obj); } __name(hasProperty, "hasProperty"); function parsePath(path) { const str = path.replace(/([^\\])\[/g, "$1.["); const parts = str.match(/(\\\.|[^.]+?)+/g); return parts.map((value) => { if (value === "constructor" || value === "__proto__" || value === "prototype") { return {}; } const regexp = /^\[(\d+)\]$/; const mArr = regexp.exec(value); let parsed = null; if (mArr) { parsed = { i: parseFloat(mArr[1]) }; } else { parsed = { p: value.replace(/\\([.[\]])/g, "$1") }; } return parsed; }); } __name(parsePath, "parsePath"); function internalGetPathValue(obj, parsed, pathDepth) { let temporaryValue = obj; let res = null; pathDepth = typeof pathDepth === "undefined" ? parsed.length : pathDepth; for (let i = 0; i < pathDepth; i++) { const part = parsed[i]; if (temporaryValue) { if (typeof part.p === "undefined") { temporaryValue = temporaryValue[part.i]; } else { temporaryValue = temporaryValue[part.p]; } if (i === pathDepth - 1) { res = temporaryValue; } } } return res; } __name(internalGetPathValue, "internalGetPathValue"); function getPathInfo(obj, path) { const parsed = parsePath(path); const last = parsed[parsed.length - 1]; const info = { parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj, name: last.p || last.i, value: internalGetPathValue(obj, parsed) }; info.exists = hasProperty(info.parent, info.name); return info; } __name(getPathInfo, "getPathInfo"); function Assertion(obj, msg, ssfi, lockSsfi) { flag(this, "ssfi", ssfi || Assertion); flag(this, "lockSsfi", lockSsfi); flag(this, "object", obj); flag(this, "message", msg); flag(this, "eql", config.deepEqual || deep_eql_default); return proxify(this); } __name(Assertion, "Assertion"); Object.defineProperty(Assertion, "includeStack", { get: function() { console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead."); return config.includeStack; }, set: function(value) { console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead."); config.includeStack = value; } }); Object.defineProperty(Assertion, "showDiff", { get: function() { console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead."); return config.showDiff; }, set: function(value) { console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead."); config.showDiff = value; } }); Assertion.addProperty = function(name, fn2) { addProperty(this.prototype, name, fn2); }; Assertion.addMethod = function(name, fn2) { addMethod(this.prototype, name, fn2); }; Assertion.addChainableMethod = function(name, fn2, chainingBehavior) { addChainableMethod(this.prototype, name, fn2, chainingBehavior); }; Assertion.overwriteProperty = function(name, fn2) { overwriteProperty(this.prototype, name, fn2); }; Assertion.overwriteMethod = function(name, fn2) { overwriteMethod(this.prototype, name, fn2); }; Assertion.overwriteChainableMethod = function(name, fn2, chainingBehavior) { overwriteChainableMethod(this.prototype, name, fn2, chainingBehavior); }; Assertion.prototype.assert = function(expr, msg, negateMsg, expected, _actual, showDiff) { var ok = test(this, arguments); if (false !== showDiff) showDiff = true; if (void 0 === expected && void 0 === _actual) showDiff = false; if (true !== config.showDiff) showDiff = false; if (!ok) { msg = getMessage2(this, arguments); var actual = getActual(this, arguments); var assertionErrorObjectProperties = { actual, expected, showDiff }; var operator = getOperator(this, arguments); if (operator) { assertionErrorObjectProperties.operator = operator; } throw new AssertionError( msg, assertionErrorObjectProperties, config.includeStack ? this.assert : flag(this, "ssfi") ); } }; Object.defineProperty( Assertion.prototype, "_obj", { get: function() { return flag(this, "object"); }, set: function(val) { flag(this, "object", val); } } ); function isProxyEnabled() { return config.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined"; } __name(isProxyEnabled, "isProxyEnabled"); function addProperty(ctx, name, getter) { getter = getter === void 0 ? function() { } : getter; Object.defineProperty( ctx, name, { get: /* @__PURE__ */ __name(function propertyGetter() { if (!isProxyEnabled() && !flag(this, "lockSsfi")) { flag(this, "ssfi", propertyGetter); } var result = getter.call(this); if (result !== void 0) return result; var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "propertyGetter"), configurable: true } ); } __name(addProperty, "addProperty"); var fnLengthDesc = Object.getOwnPropertyDescriptor(function() { }, "length"); function addLengthGuard(fn2, assertionName, isChainable) { if (!fnLengthDesc.configurable) return fn2; Object.defineProperty(fn2, "length", { get: function() { if (isChainable) { throw Error("Invalid Chai property: " + assertionName + '.length. Due to a compatibility issue, "length" cannot directly follow "' + assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); } throw Error("Invalid Chai property: " + assertionName + '.length. See docs for proper usage of "' + assertionName + '".'); } }); return fn2; } __name(addLengthGuard, "addLengthGuard"); function getProperties(object) { var result = Object.getOwnPropertyNames(object); function addProperty2(property) { if (result.indexOf(property) === -1) { result.push(property); } } __name(addProperty2, "addProperty"); var proto = Object.getPrototypeOf(object); while (proto !== null) { Object.getOwnPropertyNames(proto).forEach(addProperty2); proto = Object.getPrototypeOf(proto); } return result; } __name(getProperties, "getProperties"); var builtins = ["__flags", "__methods", "_obj", "assert"]; function proxify(obj, nonChainableMethodName) { if (!isProxyEnabled()) return obj; return new Proxy(obj, { get: /* @__PURE__ */ __name(function proxyGetter(target, property) { if (typeof property === "string" && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) { if (nonChainableMethodName) { throw Error("Invalid Chai property: " + nonChainableMethodName + "." + property + '. See docs for proper usage of "' + nonChainableMethodName + '".'); } var suggestion = null; var suggestionDistance = 4; getProperties(target).forEach(function(prop) { if (!Object.prototype.hasOwnProperty(prop) && builtins.indexOf(prop) === -1) { var dist = stringDistanceCapped( property, prop, suggestionDistance ); if (dist < suggestionDistance) { suggestion = prop; suggestionDistance = dist; } } }); if (suggestion !== null) { throw Error("Invalid Chai property: " + property + '. Did you mean "' + suggestion + '"?'); } else { throw Error("Invalid Chai property: " + property); } } if (builtins.indexOf(property) === -1 && !flag(target, "lockSsfi")) { flag(target, "ssfi", proxyGetter); } return Reflect.get(target, property); }, "proxyGetter") }); } __name(proxify, "proxify"); function stringDistanceCapped(strA, strB, cap) { if (Math.abs(strA.length - strB.length) >= cap) { return cap; } var memo = []; for (var i = 0; i <= strA.length; i++) { memo[i] = Array(strB.length + 1).fill(0); memo[i][0] = i; } for (var j = 0; j < strB.length; j++) { memo[0][j] = j; } for (var i = 1; i <= strA.length; i++) { var ch = strA.charCodeAt(i - 1); for (var j = 1; j <= strB.length; j++) { if (Math.abs(i - j) >= cap) { memo[i][j] = cap; continue; } memo[i][j] = Math.min( memo[i - 1][j] + 1, memo[i][j - 1] + 1, memo[i - 1][j - 1] + (ch === strB.charCodeAt(j - 1) ? 0 : 1) ); } } return memo[strA.length][strB.length]; } __name(stringDistanceCapped, "stringDistanceCapped"); function addMethod(ctx, name, method) { var methodWrapper = /* @__PURE__ */ __name(function() { if (!flag(this, "lockSsfi")) { flag(this, "ssfi", methodWrapper); } var result = method.apply(this, arguments); if (result !== void 0) return result; var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "methodWrapper"); addLengthGuard(methodWrapper, name, false); ctx[name] = proxify(methodWrapper, name); } __name(addMethod, "addMethod"); function overwriteProperty(ctx, name, getter) { var _get = Object.getOwnPropertyDescriptor(ctx, name), _super = /* @__PURE__ */ __name(function() { }, "_super"); if (_get && "function" === typeof _get.get) _super = _get.get; Object.defineProperty( ctx, name, { get: /* @__PURE__ */ __name(function overwritingPropertyGetter() { if (!isProxyEnabled() && !flag(this, "lockSsfi")) { flag(this, "ssfi", overwritingPropertyGetter); } var origLockSsfi = flag(this, "lockSsfi"); flag(this, "lockSsfi", true); var result = getter(_super).call(this); flag(this, "lockSsfi", origLockSsfi); if (result !== void 0) { return result; } var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "overwritingPropertyGetter"), configurable: true } ); } __name(overwriteProperty, "overwriteProperty"); function overwriteMethod(ctx, name, method) { var _method = ctx[name], _super = /* @__PURE__ */ __name(function() { throw new Error(name + " is not a function"); }, "_super"); if (_method && "function" === typeof _method) _super = _method; var overwritingMethodWrapper = /* @__PURE__ */ __name(function() { if (!flag(this, "lockSsfi")) { flag(this, "ssfi", overwritingMethodWrapper); } var origLockSsfi = flag(this, "lockSsfi"); flag(this, "lockSsfi", true); var result = method(_super).apply(this, arguments); flag(this, "lockSsfi", origLockSsfi); if (result !== void 0) { return result; } var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "overwritingMethodWrapper"); addLengthGuard(overwritingMethodWrapper, name, false); ctx[name] = proxify(overwritingMethodWrapper, name); } __name(overwriteMethod, "overwriteMethod"); var canSetPrototype = typeof Object.setPrototypeOf === "function"; var testFn = /* @__PURE__ */ __name(function() { }, "testFn"); var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) { var propDesc = Object.getOwnPropertyDescriptor(testFn, name); if (typeof propDesc !== "object") return true; return !propDesc.configurable; }); var call = Function.prototype.call; var apply = Function.prototype.apply; function addChainableMethod(ctx, name, method, chainingBehavior) { if (typeof chainingBehavior !== "function") { chainingBehavior = /* @__PURE__ */ __name(function() { }, "chainingBehavior"); } var chainableBehavior = { method, chainingBehavior }; if (!ctx.__methods) { ctx.__methods = {}; } ctx.__methods[name] = chainableBehavior; Object.defineProperty( ctx, name, { get: /* @__PURE__ */ __name(function chainableMethodGetter() { chainableBehavior.chainingBehavior.call(this); var chainableMethodWrapper = /* @__PURE__ */ __name(function() { if (!flag(this, "lockSsfi")) { flag(this, "ssfi", chainableMethodWrapper); } var result = chainableBehavior.method.apply(this, arguments); if (result !== void 0) { return result; } var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "chainableMethodWrapper"); addLengthGuard(chainableMethodWrapper, name, true); if (canSetPrototype) { var prototype = Object.create(this); prototype.call = call; prototype.apply = apply; Object.setPrototypeOf(chainableMethodWrapper, prototype); } else { var asserterNames = Object.getOwnPropertyNames(ctx); asserterNames.forEach(function(asserterName) { if (excludeNames.indexOf(asserterName) !== -1) { return; } var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); Object.defineProperty(chainableMethodWrapper, asserterName, pd); }); } transferFlags(this, chainableMethodWrapper); return proxify(chainableMethodWrapper); }, "chainableMethodGetter"), configurable: true } ); } __name(addChainableMethod, "addChainableMethod"); function overwriteChainableMethod(ctx, name, method, chainingBehavior) { var chainableBehavior = ctx.__methods[name]; var _chainingBehavior = chainableBehavior.chainingBehavior; chainableBehavior.chainingBehavior = /* @__PURE__ */ __name(function overwritingChainableMethodGetter() { var result = chainingBehavior(_chainingBehavior).call(this); if (result !== void 0) { return result; } var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "overwritingChainableMethodGetter"); var _method = chainableBehavior.method; chainableBehavior.method = /* @__PURE__ */ __name(function overwritingChainableMethodWrapper() { var result = method(_method).apply(this, arguments); if (result !== void 0) { return result; } var newAssertion = new Assertion(); transferFlags(this, newAssertion); return newAssertion; }, "overwritingChainableMethodWrapper"); } __name(overwriteChainableMethod, "overwriteChainableMethod"); function compareByInspect(a2, b) { return inspect2(a2) < inspect2(b) ? -1 : 1; } __name(compareByInspect, "compareByInspect"); function getOwnEnumerablePropertySymbols(obj) { if (typeof Object.getOwnPropertySymbols !== "function") return []; return Object.getOwnPropertySymbols(obj).filter(function(sym) { return Object.getOwnPropertyDescriptor(obj, sym).enumerable; }); } __name(getOwnEnumerablePropertySymbols, "getOwnEnumerablePropertySymbols"); function getOwnEnumerableProperties(obj) { return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); } __name(getOwnEnumerableProperties, "getOwnEnumerableProperties"); function _isNaN(value) { return value !== value; } __name(_isNaN, "_isNaN"); var isNaN22 = Number.isNaN || _isNaN; function isObjectType(obj) { var objectType = type(obj); var objectTypes = ["Array", "Object", "Function"]; return objectTypes.indexOf(objectType) !== -1; } __name(isObjectType, "isObjectType"); function getOperator(obj, args) { var operator = flag(obj, "operator"); var negate = flag(obj, "negate"); var expected = args[3]; var msg = negate ? args[2] : args[1]; if (operator) { return operator; } if (typeof msg === "function") msg = msg(); msg = msg || ""; if (!msg) { return void 0; } if (/\shave\s/.test(msg)) { return void 0; } var isObject2 = isObjectType(expected); if (/\snot\s/.test(msg)) { return isObject2 ? "notDeepStrictEqual" : "notStrictEqual"; } return isObject2 ? "deepStrictEqual" : "strictEqual"; } __name(getOperator, "getOperator"); function getName(fn2) { return fn2.name; } __name(getName, "getName"); function isRegExp2(obj) { return Object.prototype.toString.call(obj) === "[object RegExp]"; } __name(isRegExp2, "isRegExp"); function isNumeric(obj) { return ["Number", "BigInt"].includes(type(obj)); } __name(isNumeric, "isNumeric"); var { flag: flag2 } = utils_exports; [ "to", "be", "been", "is", "and", "has", "have", "with", "that", "which", "at", "of", "same", "but", "does", "still", "also" ].forEach(function(chain) { Assertion.addProperty(chain); }); Assertion.addProperty("not", function() { flag2(this, "negate", true); }); Assertion.addProperty("deep", function() { flag2(this, "deep", true); }); Assertion.addProperty("nested", function() { flag2(this, "nested", true); }); Assertion.addProperty("own", function() { flag2(this, "own", true); }); Assertion.addProperty("ordered", function() { flag2(this, "ordered", true); }); Assertion.addProperty("any", function() { flag2(this, "any", true); flag2(this, "all", false); }); Assertion.addProperty("all", function() { flag2(this, "all", true); flag2(this, "any", false); }); var functionTypes = { "function": ["function", "asyncfunction", "generatorfunction", "asyncgeneratorfunction"], "asyncfunction": ["asyncfunction", "asyncgeneratorfunction"], "generatorfunction": ["generatorfunction", "asyncgeneratorfunction"], "asyncgeneratorfunction": ["asyncgeneratorfunction"] }; function an(type3, msg) { if (msg) flag2(this, "message", msg); type3 = type3.toLowerCase(); var obj = flag2(this, "object"), article = ~["a", "e", "i", "o", "u"].indexOf(type3.charAt(0)) ? "an " : "a "; const detectedType = type(obj).toLowerCase(); if (functionTypes["function"].includes(type3)) { this.assert( functionTypes[type3].includes(detectedType), "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3 ); } else { this.assert( type3 === detectedType, "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3 ); } } __name(an, "an"); Assertion.addChainableMethod("an", an); Assertion.addChainableMethod("a", an); function SameValueZero(a2, b) { return isNaN22(a2) && isNaN22(b) || a2 === b; } __name(SameValueZero, "SameValueZero"); function includeChainingBehavior() { flag2(this, "contains", true); } __name(includeChainingBehavior, "includeChainingBehavior"); function include(val, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), negate = flag2(this, "negate"), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), descriptor = isDeep ? "deep " : "", isEql = isDeep ? flag2(this, "eql") : SameValueZero; flagMsg = flagMsg ? flagMsg + ": " : ""; var included = false; switch (objType) { case "string": included = obj.indexOf(val) !== -1; break; case "weakset": if (isDeep) { throw new AssertionError( flagMsg + "unable to use .deep.include with WeakSet", void 0, ssfi ); } included = obj.has(val); break; case "map": obj.forEach(function(item) { included = included || isEql(item, val); }); break; case "set": if (isDeep) { obj.forEach(function(item) { included = included || isEql(item, val); }); } else { included = obj.has(val); } break; case "array": if (isDeep) { included = obj.some(function(item) { return isEql(item, val); }); } else { included = obj.indexOf(val) !== -1; } break; default: if (val !== Object(val)) { throw new AssertionError( flagMsg + "the given combination of arguments (" + objType + " and " + type(val).toLowerCase() + ") is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a " + type(val).toLowerCase(), void 0, ssfi ); } var props = Object.keys(val), firstErr = null, numErrs = 0; props.forEach(function(prop) { var propAssertion = new Assertion(obj); transferFlags(this, propAssertion, true); flag2(propAssertion, "lockSsfi", true); if (!negate || props.length === 1) { propAssertion.property(prop, val[prop]); return; } try { propAssertion.property(prop, val[prop]); } catch (err) { if (!check_error_exports.compatibleConstructor(err, AssertionError)) { throw err; } if (firstErr === null) firstErr = err; numErrs++; } }, this); if (negate && props.length > 1 && numErrs === props.length) { throw firstErr; } return; } this.assert( included, "expected #{this} to " + descriptor + "include " + inspect2(val), "expected #{this} to not " + descriptor + "include " + inspect2(val) ); } __name(include, "include"); Assertion.addChainableMethod("include", include, includeChainingBehavior); Assertion.addChainableMethod("contain", include, includeChainingBehavior); Assertion.addChainableMethod("contains", include, includeChainingBehavior); Assertion.addChainableMethod("includes", include, includeChainingBehavior); Assertion.addProperty("ok", function() { this.assert( flag2(this, "object"), "expected #{this} to be truthy", "expected #{this} to be falsy" ); }); Assertion.addProperty("true", function() { this.assert( true === flag2(this, "object"), "expected #{this} to be true", "expected #{this} to be false", flag2(this, "negate") ? false : true ); }); Assertion.addProperty("numeric", function() { const object = flag2(this, "object"); this.assert( ["Number", "BigInt"].includes(type(object)), "expected #{this} to be numeric", "expected #{this} to not be numeric", flag2(this, "negate") ? false : true ); }); Assertion.addProperty("callable", function() { const val = flag2(this, "object"); const ssfi = flag2(this, "ssfi"); const message = flag2(this, "message"); const msg = message ? `${message}: ` : ""; const negate = flag2(this, "negate"); const assertionMessage = negate ? `${msg}expected ${inspect2(val)} not to be a callable function` : `${msg}expected ${inspect2(val)} to be a callable function`; const isCallable = ["Function", "AsyncFunction", "GeneratorFunction", "AsyncGeneratorFunction"].includes(type(val)); if (isCallable && negate || !isCallable && !negate) { throw new AssertionError( assertionMessage, void 0, ssfi ); } }); Assertion.addProperty("false", function() { this.assert( false === flag2(this, "object"), "expected #{this} to be false", "expected #{this} to be true", flag2(this, "negate") ? true : false ); }); Assertion.addProperty("null", function() { this.assert( null === flag2(this, "object"), "expected #{this} to be null", "expected #{this} not to be null" ); }); Assertion.addProperty("undefined", function() { this.assert( void 0 === flag2(this, "object"), "expected #{this} to be undefined", "expected #{this} not to be undefined" ); }); Assertion.addProperty("NaN", function() { this.assert( isNaN22(flag2(this, "object")), "expected #{this} to be NaN", "expected #{this} not to be NaN" ); }); function assertExist() { var val = flag2(this, "object"); this.assert( val !== null && val !== void 0, "expected #{this} to exist", "expected #{this} to not exist" ); } __name(assertExist, "assertExist"); Assertion.addProperty("exist", assertExist); Assertion.addProperty("exists", assertExist); Assertion.addProperty("empty", function() { var val = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), itemsCount; flagMsg = flagMsg ? flagMsg + ": " : ""; switch (type(val).toLowerCase()) { case "array": case "string": itemsCount = val.length; break; case "map": case "set": itemsCount = val.size; break; case "weakmap": case "weakset": throw new AssertionError( flagMsg + ".empty was passed a weak collection", void 0, ssfi ); case "function": var msg = flagMsg + ".empty was passed a function " + getName(val); throw new AssertionError(msg.trim(), void 0, ssfi); default: if (val !== Object(val)) { throw new AssertionError( flagMsg + ".empty was passed non-string primitive " + inspect2(val), void 0, ssfi ); } itemsCount = Object.keys(val).length; } this.assert( 0 === itemsCount, "expected #{this} to be empty", "expected #{this} not to be empty" ); }); function checkArguments() { var obj = flag2(this, "object"), type3 = type(obj); this.assert( "Arguments" === type3, "expected #{this} to be arguments but got " + type3, "expected #{this} to not be arguments" ); } __name(checkArguments, "checkArguments"); Assertion.addProperty("arguments", checkArguments); Assertion.addProperty("Arguments", checkArguments); function assertEqual(val, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"); if (flag2(this, "deep")) { var prevLockSsfi = flag2(this, "lockSsfi"); flag2(this, "lockSsfi", true); this.eql(val); flag2(this, "lockSsfi", prevLockSsfi); } else { this.assert( val === obj, "expected #{this} to equal #{exp}", "expected #{this} to not equal #{exp}", val, this._obj, true ); } } __name(assertEqual, "assertEqual"); Assertion.addMethod("equal", assertEqual); Assertion.addMethod("equals", assertEqual); Assertion.addMethod("eq", assertEqual); function assertEql(obj, msg) { if (msg) flag2(this, "message", msg); var eql = flag2(this, "eql"); this.assert( eql(obj, flag2(this, "object")), "expected #{this} to deeply equal #{exp}", "expected #{this} to not deeply equal #{exp}", obj, this._obj, true ); } __name(assertEql, "assertEql"); Assertion.addMethod("eql", assertEql); Assertion.addMethod("eqls", assertEql); function assertAbove(n, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(); if (doLength && objType !== "map" && objType !== "set") { new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); } if (!doLength && (objType === "date" && nType !== "date")) { throw new AssertionError(msgPrefix + "the argument to above must be a date", void 0, ssfi); } else if (!isNumeric(n) && (doLength || isNumeric(obj))) { throw new AssertionError(msgPrefix + "the argument to above must be a number", void 0, ssfi); } else if (!doLength && (objType !== "date" && !isNumeric(obj))) { var printObj = objType === "string" ? "'" + obj + "'" : obj; throw new AssertionError(msgPrefix + "expected " + printObj + " to be a number or a date", void 0, ssfi); } if (doLength) { var descriptor = "length", itemsCount; if (objType === "map" || objType === "set") { descriptor = "size"; itemsCount = obj.size; } else { itemsCount = obj.length; } this.assert( itemsCount > n, "expected #{this} to have a " + descriptor + " above #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " above #{exp}", n, itemsCount ); } else { this.assert( obj > n, "expected #{this} to be above #{exp}", "expected #{this} to be at most #{exp}", n ); } } __name(assertAbove, "assertAbove"); Assertion.addMethod("above", assertAbove); Assertion.addMethod("gt", assertAbove); Assertion.addMethod("greaterThan", assertAbove); function assertLeast(n, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true; if (doLength && objType !== "map" && objType !== "set") { new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); } if (!doLength && (objType === "date" && nType !== "date")) { errorMessage = msgPrefix + "the argument to least must be a date"; } else if (!isNumeric(n) && (doLength || isNumeric(obj))) { errorMessage = msgPrefix + "the argument to least must be a number"; } else if (!doLength && (objType !== "date" && !isNumeric(obj))) { var printObj = objType === "string" ? "'" + obj + "'" : obj; errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date"; } else { shouldThrow = false; } if (shouldThrow) { throw new AssertionError(errorMessage, void 0, ssfi); } if (doLength) { var descriptor = "length", itemsCount; if (objType === "map" || objType === "set") { descriptor = "size"; itemsCount = obj.size; } else { itemsCount = obj.length; } this.assert( itemsCount >= n, "expected #{this} to have a " + descriptor + " at least #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " below #{exp}", n, itemsCount ); } else { this.assert( obj >= n, "expected #{this} to be at least #{exp}", "expected #{this} to be below #{exp}", n ); } } __name(assertLeast, "assertLeast"); Assertion.addMethod("least", assertLeast); Assertion.addMethod("gte", assertLeast); Assertion.addMethod("greaterThanOrEqual", assertLeast); function assertBelow(n, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true; if (doLength && objType !== "map" && objType !== "set") { new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); } if (!doLength && (objType === "date" && nType !== "date")) { errorMessage = msgPrefix + "the argument to below must be a date"; } else if (!isNumeric(n) && (doLength || isNumeric(obj))) { errorMessage = msgPrefix + "the argument to below must be a number"; } else if (!doLength && (objType !== "date" && !isNumeric(obj))) { var printObj = objType === "string" ? "'" + obj + "'" : obj; errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date"; } else { shouldThrow = false; } if (shouldThrow) { throw new AssertionError(errorMessage, void 0, ssfi); } if (doLength) { var descriptor = "length", itemsCount; if (objType === "map" || objType === "set") { descriptor = "size"; itemsCount = obj.size; } else { itemsCount = obj.length; } this.assert( itemsCount < n, "expected #{this} to have a " + descriptor + " below #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " below #{exp}", n, itemsCount ); } else { this.assert( obj < n, "expected #{this} to be below #{exp}", "expected #{this} to be at least #{exp}", n ); } } __name(assertBelow, "assertBelow"); Assertion.addMethod("below", assertBelow); Assertion.addMethod("lt", assertBelow); Assertion.addMethod("lessThan", assertBelow); function assertMost(n, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true; if (doLength && objType !== "map" && objType !== "set") { new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); } if (!doLength && (objType === "date" && nType !== "date")) { errorMessage = msgPrefix + "the argument to most must be a date"; } else if (!isNumeric(n) && (doLength || isNumeric(obj))) { errorMessage = msgPrefix + "the argument to most must be a number"; } else if (!doLength && (objType !== "date" && !isNumeric(obj))) { var printObj = objType === "string" ? "'" + obj + "'" : obj; errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date"; } else { shouldThrow = false; } if (shouldThrow) { throw new AssertionError(errorMessage, void 0, ssfi); } if (doLength) { var descriptor = "length", itemsCount; if (objType === "map" || objType === "set") { descriptor = "size"; itemsCount = obj.size; } else { itemsCount = obj.length; } this.assert( itemsCount <= n, "expected #{this} to have a " + descriptor + " at most #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " above #{exp}", n, itemsCount ); } else { this.assert( obj <= n, "expected #{this} to be at most #{exp}", "expected #{this} to be above #{exp}", n ); } } __name(assertMost, "assertMost"); Assertion.addMethod("most", assertMost); Assertion.addMethod("lte", assertMost); Assertion.addMethod("lessThanOrEqual", assertMost); Assertion.addMethod("within", function(start2, finish, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), startType = type(start2).toLowerCase(), finishType = type(finish).toLowerCase(), errorMessage, shouldThrow = true, range = startType === "date" && finishType === "date" ? start2.toISOString() + ".." + finish.toISOString() : start2 + ".." + finish; if (doLength && objType !== "map" && objType !== "set") { new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); } if (!doLength && (objType === "date" && (startType !== "date" || finishType !== "date"))) { errorMessage = msgPrefix + "the arguments to within must be dates"; } else if ((!isNumeric(start2) || !isNumeric(finish)) && (doLength || isNumeric(obj))) { errorMessage = msgPrefix + "the arguments to within must be numbers"; } else if (!doLength && (objType !== "date" && !isNumeric(obj))) { var printObj = objType === "string" ? "'" + obj + "'" : obj; errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date"; } else { shouldThrow = false; } if (shouldThrow) { throw new AssertionError(errorMessage, void 0, ssfi); } if (doLength) { var descriptor = "length", itemsCount; if (objType === "map" || objType === "set") { descriptor = "size"; itemsCount = obj.size; } else { itemsCount = obj.length; } this.assert( itemsCount >= start2 && itemsCount <= finish, "expected #{this} to have a " + descriptor + " within " + range, "expected #{this} to not have a " + descriptor + " within " + range ); } else { this.assert( obj >= start2 && obj <= finish, "expected #{this} to be within " + range, "expected #{this} to not be within " + range ); } }); function assertInstanceOf(constructor, msg) { if (msg) flag2(this, "message", msg); var target = flag2(this, "object"); var ssfi = flag2(this, "ssfi"); var flagMsg = flag2(this, "message"); try { var isInstanceOf = target instanceof constructor; } catch (err) { if (err instanceof TypeError) { flagMsg = flagMsg ? flagMsg + ": " : ""; throw new AssertionError( flagMsg + "The instanceof assertion needs a constructor but " + type(constructor) + " was given.", void 0, ssfi ); } throw err; } var name = getName(constructor); if (name == null) { name = "an unnamed constructor"; } this.assert( isInstanceOf, "expected #{this} to be an instance of " + name, "expected #{this} to not be an instance of " + name ); } __name(assertInstanceOf, "assertInstanceOf"); Assertion.addMethod("instanceof", assertInstanceOf); Assertion.addMethod("instanceOf", assertInstanceOf); function assertProperty(name, val, msg) { if (msg) flag2(this, "message", msg); var isNested = flag2(this, "nested"), isOwn = flag2(this, "own"), flagMsg = flag2(this, "message"), obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), nameType = typeof name; flagMsg = flagMsg ? flagMsg + ": " : ""; if (isNested) { if (nameType !== "string") { throw new AssertionError( flagMsg + "the argument to property must be a string when using nested syntax", void 0, ssfi ); } } else { if (nameType !== "string" && nameType !== "number" && nameType !== "symbol") { throw new AssertionError( flagMsg + "the argument to property must be a string, number, or symbol", void 0, ssfi ); } } if (isNested && isOwn) { throw new AssertionError( flagMsg + 'The "nested" and "own" flags cannot be combined.', void 0, ssfi ); } if (obj === null || obj === void 0) { throw new AssertionError( flagMsg + "Target cannot be null or undefined.", void 0, ssfi ); } var isDeep = flag2(this, "deep"), negate = flag2(this, "negate"), pathInfo = isNested ? getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name], isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2; var descriptor = ""; if (isDeep) descriptor += "deep "; if (isOwn) descriptor += "own "; if (isNested) descriptor += "nested "; descriptor += "property "; var hasProperty2; if (isOwn) hasProperty2 = Object.prototype.hasOwnProperty.call(obj, name); else if (isNested) hasProperty2 = pathInfo.exists; else hasProperty2 = hasProperty(obj, name); if (!negate || arguments.length === 1) { this.assert( hasProperty2, "expected #{this} to have " + descriptor + inspect2(name), "expected #{this} to not have " + descriptor + inspect2(name) ); } if (arguments.length > 1) { this.assert( hasProperty2 && isEql(val, value), "expected #{this} to have " + descriptor + inspect2(name) + " of #{exp}, but got #{act}", "expected #{this} to not have " + descriptor + inspect2(name) + " of #{act}", val, value ); } flag2(this, "object", value); } __name(assertProperty, "assertProperty"); Assertion.addMethod("property", assertProperty); function assertOwnProperty(name, value, msg) { flag2(this, "own", true); assertProperty.apply(this, arguments); } __name(assertOwnProperty, "assertOwnProperty"); Assertion.addMethod("ownProperty", assertOwnProperty); Assertion.addMethod("haveOwnProperty", assertOwnProperty); function assertOwnPropertyDescriptor(name, descriptor, msg) { if (typeof descriptor === "string") { msg = descriptor; descriptor = null; } if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"); var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); var eql = flag2(this, "eql"); if (actualDescriptor && descriptor) { this.assert( eql(descriptor, actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to match " + inspect2(descriptor) + ", got " + inspect2(actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to not match " + inspect2(descriptor), descriptor, actualDescriptor, true ); } else { this.assert( actualDescriptor, "expected #{this} to have an own property descriptor for " + inspect2(name), "expected #{this} to not have an own property descriptor for " + inspect2(name) ); } flag2(this, "object", actualDescriptor); } __name(assertOwnPropertyDescriptor, "assertOwnPropertyDescriptor"); Assertion.addMethod("ownPropertyDescriptor", assertOwnPropertyDescriptor); Assertion.addMethod("haveOwnPropertyDescriptor", assertOwnPropertyDescriptor); function assertLengthChain() { flag2(this, "doLength", true); } __name(assertLengthChain, "assertLengthChain"); function assertLength(n, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), descriptor = "length", itemsCount; switch (objType) { case "map": case "set": descriptor = "size"; itemsCount = obj.size; break; default: new Assertion(obj, flagMsg, ssfi, true).to.have.property("length"); itemsCount = obj.length; } this.assert( itemsCount == n, "expected #{this} to have a " + descriptor + " of #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " of #{act}", n, itemsCount ); } __name(assertLength, "assertLength"); Assertion.addChainableMethod("length", assertLength, assertLengthChain); Assertion.addChainableMethod("lengthOf", assertLength, assertLengthChain); function assertMatch(re, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"); this.assert( re.exec(obj), "expected #{this} to match " + re, "expected #{this} not to match " + re ); } __name(assertMatch, "assertMatch"); Assertion.addMethod("match", assertMatch); Assertion.addMethod("matches", assertMatch); Assertion.addMethod("string", function(str, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(obj, flagMsg, ssfi, true).is.a("string"); this.assert( ~obj.indexOf(str), "expected #{this} to contain " + inspect2(str), "expected #{this} to not contain " + inspect2(str) ); }); function assertKeys(keys) { var obj = flag2(this, "object"), objType = type(obj), keysType = type(keys), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), str, deepStr = "", actual, ok = true, flagMsg = flag2(this, "message"); flagMsg = flagMsg ? flagMsg + ": " : ""; var mixedArgsMsg = flagMsg + "when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments"; if (objType === "Map" || objType === "Set") { deepStr = isDeep ? "deeply " : ""; actual = []; obj.forEach(function(val, key) { actual.push(key); }); if (keysType !== "Array") { keys = Array.prototype.slice.call(arguments); } } else { actual = getOwnEnumerableProperties(obj); switch (keysType) { case "Array": if (arguments.length > 1) { throw new AssertionError(mixedArgsMsg, void 0, ssfi); } break; case "Object": if (arguments.length > 1) { throw new AssertionError(mixedArgsMsg, void 0, ssfi); } keys = Object.keys(keys); break; default: keys = Array.prototype.slice.call(arguments); } keys = keys.map(function(val) { return typeof val === "symbol" ? val : String(val); }); } if (!keys.length) { throw new AssertionError(flagMsg + "keys required", void 0, ssfi); } var len = keys.length, any = flag2(this, "any"), all = flag2(this, "all"), expected = keys, isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2; if (!any && !all) { all = true; } if (any) { ok = expected.some(function(expectedKey) { return actual.some(function(actualKey) { return isEql(expectedKey, actualKey); }); }); } if (all) { ok = expected.every(function(expectedKey) { return actual.some(function(actualKey) { return isEql(expectedKey, actualKey); }); }); if (!flag2(this, "contains")) { ok = ok && keys.length == actual.length; } } if (len > 1) { keys = keys.map(function(key) { return inspect2(key); }); var last = keys.pop(); if (all) { str = keys.join(", ") + ", and " + last; } if (any) { str = keys.join(", ") + ", or " + last; } } else { str = inspect2(keys[0]); } str = (len > 1 ? "keys " : "key ") + str; str = (flag2(this, "contains") ? "contain " : "have ") + str; this.assert( ok, "expected #{this} to " + deepStr + str, "expected #{this} to not " + deepStr + str, expected.slice(0).sort(compareByInspect), actual.sort(compareByInspect), true ); } __name(assertKeys, "assertKeys"); Assertion.addMethod("keys", assertKeys); Assertion.addMethod("key", assertKeys); function assertThrows(errorLike, errMsgMatcher, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), negate = flag2(this, "negate") || false; new Assertion(obj, flagMsg, ssfi, true).is.a("function"); if (isRegExp2(errorLike) || typeof errorLike === "string") { errMsgMatcher = errorLike; errorLike = null; } let caughtErr; let errorWasThrown = false; try { obj(); } catch (err) { errorWasThrown = true; caughtErr = err; } var everyArgIsUndefined = errorLike === void 0 && errMsgMatcher === void 0; var everyArgIsDefined = Boolean(errorLike && errMsgMatcher); var errorLikeFail = false; var errMsgMatcherFail = false; if (everyArgIsUndefined || !everyArgIsUndefined && !negate) { var errorLikeString = "an error"; if (errorLike instanceof Error) { errorLikeString = "#{exp}"; } else if (errorLike) { errorLikeString = check_error_exports.getConstructorName(errorLike); } let actual = caughtErr; if (caughtErr instanceof Error) { actual = caughtErr.toString(); } else if (typeof caughtErr === "string") { actual = caughtErr; } else if (caughtErr && (typeof caughtErr === "object" || typeof caughtErr === "function")) { try { actual = check_error_exports.getConstructorName(caughtErr); } catch (_err) { } } this.assert( errorWasThrown, "expected #{this} to throw " + errorLikeString, "expected #{this} to not throw an error but #{act} was thrown", errorLike && errorLike.toString(), actual ); } if (errorLike && caughtErr) { if (errorLike instanceof Error) { var isCompatibleInstance = check_error_exports.compatibleInstance(caughtErr, errorLike); if (isCompatibleInstance === negate) { if (everyArgIsDefined && negate) { errorLikeFail = true; } else { this.assert( negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr && !negate ? " but #{act} was thrown" : ""), errorLike.toString(), caughtErr.toString() ); } } } var isCompatibleConstructor = check_error_exports.compatibleConstructor(caughtErr, errorLike); if (isCompatibleConstructor === negate) { if (everyArgIsDefined && negate) { errorLikeFail = true; } else { this.assert( negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr) ); } } } if (caughtErr && errMsgMatcher !== void 0 && errMsgMatcher !== null) { var placeholder = "including"; if (isRegExp2(errMsgMatcher)) { placeholder = "matching"; } var isCompatibleMessage = check_error_exports.compatibleMessage(caughtErr, errMsgMatcher); if (isCompatibleMessage === negate) { if (everyArgIsDefined && negate) { errMsgMatcherFail = true; } else { this.assert( negate, "expected #{this} to throw error " + placeholder + " #{exp} but got #{act}", "expected #{this} to throw error not " + placeholder + " #{exp}", errMsgMatcher, check_error_exports.getMessage(caughtErr) ); } } } if (errorLikeFail && errMsgMatcherFail) { this.assert( negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr) ); } flag2(this, "object", caughtErr); } __name(assertThrows, "assertThrows"); Assertion.addMethod("throw", assertThrows); Assertion.addMethod("throws", assertThrows); Assertion.addMethod("Throw", assertThrows); function respondTo(method, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), itself = flag2(this, "itself"), context = "function" === typeof obj && !itself ? obj.prototype[method] : obj[method]; this.assert( "function" === typeof context, "expected #{this} to respond to " + inspect2(method), "expected #{this} to not respond to " + inspect2(method) ); } __name(respondTo, "respondTo"); Assertion.addMethod("respondTo", respondTo); Assertion.addMethod("respondsTo", respondTo); Assertion.addProperty("itself", function() { flag2(this, "itself", true); }); function satisfy(matcher, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"); var result = matcher(obj); this.assert( result, "expected #{this} to satisfy " + objDisplay(matcher), "expected #{this} to not satisfy" + objDisplay(matcher), flag2(this, "negate") ? false : true, result ); } __name(satisfy, "satisfy"); Assertion.addMethod("satisfy", satisfy); Assertion.addMethod("satisfies", satisfy); function closeTo(expected, delta, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(obj, flagMsg, ssfi, true).is.numeric; let message = "A `delta` value is required for `closeTo`"; if (delta == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi); new Assertion(delta, flagMsg, ssfi, true).is.numeric; message = "A `expected` value is required for `closeTo`"; if (expected == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi); new Assertion(expected, flagMsg, ssfi, true).is.numeric; const abs = /* @__PURE__ */ __name((x) => x < 0n ? -x : x, "abs"); this.assert( abs(obj - expected) <= delta, "expected #{this} to be close to " + expected + " +/- " + delta, "expected #{this} not to be close to " + expected + " +/- " + delta ); } __name(closeTo, "closeTo"); Assertion.addMethod("closeTo", closeTo); Assertion.addMethod("approximately", closeTo); function isSubsetOf(_subset, _superset, cmp, contains2, ordered) { let superset = Array.from(_superset); let subset = Array.from(_subset); if (!contains2) { if (subset.length !== superset.length) return false; superset = superset.slice(); } return subset.every(function(elem, idx) { if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx]; if (!cmp) { var matchIdx = superset.indexOf(elem); if (matchIdx === -1) return false; if (!contains2) superset.splice(matchIdx, 1); return true; } return superset.some(function(elem2, matchIdx2) { if (!cmp(elem, elem2)) return false; if (!contains2) superset.splice(matchIdx2, 1); return true; }); }); } __name(isSubsetOf, "isSubsetOf"); Assertion.addMethod("members", function(subset, msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(obj, flagMsg, ssfi, true).to.be.iterable; new Assertion(subset, flagMsg, ssfi, true).to.be.iterable; var contains2 = flag2(this, "contains"); var ordered = flag2(this, "ordered"); var subject, failMsg, failNegateMsg; if (contains2) { subject = ordered ? "an ordered superset" : "a superset"; failMsg = "expected #{this} to be " + subject + " of #{exp}"; failNegateMsg = "expected #{this} to not be " + subject + " of #{exp}"; } else { subject = ordered ? "ordered members" : "members"; failMsg = "expected #{this} to have the same " + subject + " as #{exp}"; failNegateMsg = "expected #{this} to not have the same " + subject + " as #{exp}"; } var cmp = flag2(this, "deep") ? flag2(this, "eql") : void 0; this.assert( isSubsetOf(subset, obj, cmp, contains2, ordered), failMsg, failNegateMsg, subset, obj, true ); }); Assertion.addProperty("iterable", function(msg) { if (msg) flag2(this, "message", msg); var obj = flag2(this, "object"); this.assert( obj != void 0 && obj[Symbol.iterator], "expected #{this} to be an iterable", "expected #{this} to not be an iterable", obj ); }); function oneOf(list, msg) { if (msg) flag2(this, "message", msg); var expected = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), contains2 = flag2(this, "contains"), isDeep = flag2(this, "deep"), eql = flag2(this, "eql"); new Assertion(list, flagMsg, ssfi, true).to.be.an("array"); if (contains2) { this.assert( list.some(function(possibility) { return expected.indexOf(possibility) > -1; }), "expected #{this} to contain one of #{exp}", "expected #{this} to not contain one of #{exp}", list, expected ); } else { if (isDeep) { this.assert( list.some(function(possibility) { return eql(expected, possibility); }), "expected #{this} to deeply equal one of #{exp}", "expected #{this} to deeply equal one of #{exp}", list, expected ); } else { this.assert( list.indexOf(expected) > -1, "expected #{this} to be one of #{exp}", "expected #{this} to not be one of #{exp}", list, expected ); } } } __name(oneOf, "oneOf"); Assertion.addMethod("oneOf", oneOf); function assertChanges(subject, prop, msg) { if (msg) flag2(this, "message", msg); var fn2 = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(fn2, flagMsg, ssfi, true).is.a("function"); var initial; if (!prop) { new Assertion(subject, flagMsg, ssfi, true).is.a("function"); initial = subject(); } else { new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); initial = subject[prop]; } fn2(); var final = prop === void 0 || prop === null ? subject() : subject[prop]; var msgObj = prop === void 0 || prop === null ? initial : "." + prop; flag2(this, "deltaMsgObj", msgObj); flag2(this, "initialDeltaValue", initial); flag2(this, "finalDeltaValue", final); flag2(this, "deltaBehavior", "change"); flag2(this, "realDelta", final !== initial); this.assert( initial !== final, "expected " + msgObj + " to change", "expected " + msgObj + " to not change" ); } __name(assertChanges, "assertChanges"); Assertion.addMethod("change", assertChanges); Assertion.addMethod("changes", assertChanges); function assertIncreases(subject, prop, msg) { if (msg) flag2(this, "message", msg); var fn2 = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(fn2, flagMsg, ssfi, true).is.a("function"); var initial; if (!prop) { new Assertion(subject, flagMsg, ssfi, true).is.a("function"); initial = subject(); } else { new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); initial = subject[prop]; } new Assertion(initial, flagMsg, ssfi, true).is.a("number"); fn2(); var final = prop === void 0 || prop === null ? subject() : subject[prop]; var msgObj = prop === void 0 || prop === null ? initial : "." + prop; flag2(this, "deltaMsgObj", msgObj); flag2(this, "initialDeltaValue", initial); flag2(this, "finalDeltaValue", final); flag2(this, "deltaBehavior", "increase"); flag2(this, "realDelta", final - initial); this.assert( final - initial > 0, "expected " + msgObj + " to increase", "expected " + msgObj + " to not increase" ); } __name(assertIncreases, "assertIncreases"); Assertion.addMethod("increase", assertIncreases); Assertion.addMethod("increases", assertIncreases); function assertDecreases(subject, prop, msg) { if (msg) flag2(this, "message", msg); var fn2 = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"); new Assertion(fn2, flagMsg, ssfi, true).is.a("function"); var initial; if (!prop) { new Assertion(subject, flagMsg, ssfi, true).is.a("function"); initial = subject(); } else { new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); initial = subject[prop]; } new Assertion(initial, flagMsg, ssfi, true).is.a("number"); fn2(); var final = prop === void 0 || prop === null ? subject() : subject[prop]; var msgObj = prop === void 0 || prop === null ? initial : "." + prop; flag2(this, "deltaMsgObj", msgObj); flag2(this, "initialDeltaValue", initial); flag2(this, "finalDeltaValue", final); flag2(this, "deltaBehavior", "decrease"); flag2(this, "realDelta", initial - final); this.assert( final - initial < 0, "expected " + msgObj + " to decrease", "expected " + msgObj + " to not decrease" ); } __name(assertDecreases, "assertDecreases"); Assertion.addMethod("decrease", assertDecreases); Assertion.addMethod("decreases", assertDecreases); function assertDelta(delta, msg) { if (msg) flag2(this, "message", msg); var msgObj = flag2(this, "deltaMsgObj"); var initial = flag2(this, "initialDeltaValue"); var final = flag2(this, "finalDeltaValue"); var behavior = flag2(this, "deltaBehavior"); var realDelta = flag2(this, "realDelta"); var expression; if (behavior === "change") { expression = Math.abs(final - initial) === Math.abs(delta); } else { expression = realDelta === Math.abs(delta); } this.assert( expression, "expected " + msgObj + " to " + behavior + " by " + delta, "expected " + msgObj + " to not " + behavior + " by " + delta ); } __name(assertDelta, "assertDelta"); Assertion.addMethod("by", assertDelta); Assertion.addProperty("extensible", function() { var obj = flag2(this, "object"); var isExtensible = obj === Object(obj) && Object.isExtensible(obj); this.assert( isExtensible, "expected #{this} to be extensible", "expected #{this} to not be extensible" ); }); Assertion.addProperty("sealed", function() { var obj = flag2(this, "object"); var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true; this.assert( isSealed, "expected #{this} to be sealed", "expected #{this} to not be sealed" ); }); Assertion.addProperty("frozen", function() { var obj = flag2(this, "object"); var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true; this.assert( isFrozen, "expected #{this} to be frozen", "expected #{this} to not be frozen" ); }); Assertion.addProperty("finite", function(msg) { var obj = flag2(this, "object"); this.assert( typeof obj === "number" && isFinite(obj), "expected #{this} to be a finite number", "expected #{this} to not be a finite number" ); }); function expect(val, message) { return new Assertion(val, message); } __name(expect, "expect"); expect.fail = function(actual, expected, message, operator) { if (arguments.length < 2) { message = actual; actual = void 0; } message = message || "expect.fail()"; throw new AssertionError(message, { actual, expected, operator }, expect.fail); }; var should_exports = {}; __export2(should_exports, { Should: () => Should, should: () => should }); function loadShould() { function shouldGetter() { if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === "function" && this instanceof Symbol || typeof BigInt === "function" && this instanceof BigInt) { return new Assertion(this.valueOf(), null, shouldGetter); } return new Assertion(this, null, shouldGetter); } __name(shouldGetter, "shouldGetter"); function shouldSetter(value) { Object.defineProperty(this, "should", { value, enumerable: true, configurable: true, writable: true }); } __name(shouldSetter, "shouldSetter"); Object.defineProperty(Object.prototype, "should", { set: shouldSetter, get: shouldGetter, configurable: true }); var should2 = {}; should2.fail = function(actual, expected, message, operator) { if (arguments.length < 2) { message = actual; actual = void 0; } message = message || "should.fail()"; throw new AssertionError(message, { actual, expected, operator }, should2.fail); }; should2.equal = function(actual, expected, message) { new Assertion(actual, message).to.equal(expected); }; should2.Throw = function(fn2, errt, errs, msg) { new Assertion(fn2, msg).to.Throw(errt, errs); }; should2.exist = function(val, msg) { new Assertion(val, msg).to.exist; }; should2.not = {}; should2.not.equal = function(actual, expected, msg) { new Assertion(actual, msg).to.not.equal(expected); }; should2.not.Throw = function(fn2, errt, errs, msg) { new Assertion(fn2, msg).to.not.Throw(errt, errs); }; should2.not.exist = function(val, msg) { new Assertion(val, msg).to.not.exist; }; should2["throw"] = should2["Throw"]; should2.not["throw"] = should2.not["Throw"]; return should2; } __name(loadShould, "loadShould"); var should = loadShould; var Should = loadShould; function assert(express, errmsg) { var test2 = new Assertion(null, null, assert, true); test2.assert( express, errmsg, "[ negation message unavailable ]" ); } __name(assert, "assert"); assert.fail = function(actual, expected, message, operator) { if (arguments.length < 2) { message = actual; actual = void 0; } message = message || "assert.fail()"; throw new AssertionError(message, { actual, expected, operator }, assert.fail); }; assert.isOk = function(val, msg) { new Assertion(val, msg, assert.isOk, true).is.ok; }; assert.isNotOk = function(val, msg) { new Assertion(val, msg, assert.isNotOk, true).is.not.ok; }; assert.equal = function(act, exp, msg) { var test2 = new Assertion(act, msg, assert.equal, true); test2.assert( exp == flag(test2, "object"), "expected #{this} to equal #{exp}", "expected #{this} to not equal #{act}", exp, act, true ); }; assert.notEqual = function(act, exp, msg) { var test2 = new Assertion(act, msg, assert.notEqual, true); test2.assert( exp != flag(test2, "object"), "expected #{this} to not equal #{exp}", "expected #{this} to equal #{act}", exp, act, true ); }; assert.strictEqual = function(act, exp, msg) { new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); }; assert.notStrictEqual = function(act, exp, msg) { new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); }; assert.deepEqual = assert.deepStrictEqual = function(act, exp, msg) { new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); }; assert.notDeepEqual = function(act, exp, msg) { new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); }; assert.isAbove = function(val, abv, msg) { new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); }; assert.isAtLeast = function(val, atlst, msg) { new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); }; assert.isBelow = function(val, blw, msg) { new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); }; assert.isAtMost = function(val, atmst, msg) { new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); }; assert.isTrue = function(val, msg) { new Assertion(val, msg, assert.isTrue, true).is["true"]; }; assert.isNotTrue = function(val, msg) { new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); }; assert.isFalse = function(val, msg) { new Assertion(val, msg, assert.isFalse, true).is["false"]; }; assert.isNotFalse = function(val, msg) { new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); }; assert.isNull = function(val, msg) { new Assertion(val, msg, assert.isNull, true).to.equal(null); }; assert.isNotNull = function(val, msg) { new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); }; assert.isNaN = function(val, msg) { new Assertion(val, msg, assert.isNaN, true).to.be.NaN; }; assert.isNotNaN = function(value, message) { new Assertion(value, message, assert.isNotNaN, true).not.to.be.NaN; }; assert.exists = function(val, msg) { new Assertion(val, msg, assert.exists, true).to.exist; }; assert.notExists = function(val, msg) { new Assertion(val, msg, assert.notExists, true).to.not.exist; }; assert.isUndefined = function(val, msg) { new Assertion(val, msg, assert.isUndefined, true).to.equal(void 0); }; assert.isDefined = function(val, msg) { new Assertion(val, msg, assert.isDefined, true).to.not.equal(void 0); }; assert.isCallable = function(value, message) { new Assertion(value, message, assert.isCallable, true).is.callable; }; assert.isNotCallable = function(value, message) { new Assertion(value, message, assert.isNotCallable, true).is.not.callable; }; assert.isObject = function(val, msg) { new Assertion(val, msg, assert.isObject, true).to.be.a("object"); }; assert.isNotObject = function(val, msg) { new Assertion(val, msg, assert.isNotObject, true).to.not.be.a("object"); }; assert.isArray = function(val, msg) { new Assertion(val, msg, assert.isArray, true).to.be.an("array"); }; assert.isNotArray = function(val, msg) { new Assertion(val, msg, assert.isNotArray, true).to.not.be.an("array"); }; assert.isString = function(val, msg) { new Assertion(val, msg, assert.isString, true).to.be.a("string"); }; assert.isNotString = function(val, msg) { new Assertion(val, msg, assert.isNotString, true).to.not.be.a("string"); }; assert.isNumber = function(val, msg) { new Assertion(val, msg, assert.isNumber, true).to.be.a("number"); }; assert.isNotNumber = function(val, msg) { new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a("number"); }; assert.isNumeric = function(val, msg) { new Assertion(val, msg, assert.isNumeric, true).is.numeric; }; assert.isNotNumeric = function(val, msg) { new Assertion(val, msg, assert.isNotNumeric, true).is.not.numeric; }; assert.isFinite = function(val, msg) { new Assertion(val, msg, assert.isFinite, true).to.be.finite; }; assert.isBoolean = function(val, msg) { new Assertion(val, msg, assert.isBoolean, true).to.be.a("boolean"); }; assert.isNotBoolean = function(val, msg) { new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a("boolean"); }; assert.typeOf = function(val, type3, msg) { new Assertion(val, msg, assert.typeOf, true).to.be.a(type3); }; assert.notTypeOf = function(value, type3, message) { new Assertion(value, message, assert.notTypeOf, true).to.not.be.a(type3); }; assert.instanceOf = function(val, type3, msg) { new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type3); }; assert.notInstanceOf = function(val, type3, msg) { new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type3); }; assert.include = function(exp, inc, msg) { new Assertion(exp, msg, assert.include, true).include(inc); }; assert.notInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notInclude, true).not.include(inc); }; assert.deepInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); }; assert.notDeepInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); }; assert.nestedInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); }; assert.notNestedInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc); }; assert.deepNestedInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc); }; assert.notDeepNestedInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc); }; assert.ownInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); }; assert.notOwnInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); }; assert.deepOwnInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc); }; assert.notDeepOwnInclude = function(exp, inc, msg) { new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc); }; assert.match = function(exp, re, msg) { new Assertion(exp, msg, assert.match, true).to.match(re); }; assert.notMatch = function(exp, re, msg) { new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); }; assert.property = function(obj, prop, msg) { new Assertion(obj, msg, assert.property, true).to.have.property(prop); }; assert.notProperty = function(obj, prop, msg) { new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop); }; assert.propertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val); }; assert.notPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val); }; assert.deepPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val); }; assert.notDeepPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val); }; assert.ownProperty = function(obj, prop, msg) { new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop); }; assert.notOwnProperty = function(obj, prop, msg) { new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop); }; assert.ownPropertyVal = function(obj, prop, value, msg) { new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value); }; assert.notOwnPropertyVal = function(obj, prop, value, msg) { new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value); }; assert.deepOwnPropertyVal = function(obj, prop, value, msg) { new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value); }; assert.notDeepOwnPropertyVal = function(obj, prop, value, msg) { new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value); }; assert.nestedProperty = function(obj, prop, msg) { new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop); }; assert.notNestedProperty = function(obj, prop, msg) { new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop); }; assert.nestedPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val); }; assert.notNestedPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val); }; assert.deepNestedPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val); }; assert.notDeepNestedPropertyVal = function(obj, prop, val, msg) { new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val); }; assert.lengthOf = function(exp, len, msg) { new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); }; assert.hasAnyKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); }; assert.hasAllKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); }; assert.containsAllKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys); }; assert.doesNotHaveAnyKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys); }; assert.doesNotHaveAllKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys); }; assert.hasAnyDeepKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys); }; assert.hasAllDeepKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys); }; assert.containsAllDeepKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys); }; assert.doesNotHaveAnyDeepKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys); }; assert.doesNotHaveAllDeepKeys = function(obj, keys, msg) { new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys); }; assert.throws = function(fn2, errorLike, errMsgMatcher, msg) { if ("string" === typeof errorLike || errorLike instanceof RegExp) { errMsgMatcher = errorLike; errorLike = null; } var assertErr = new Assertion(fn2, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher); return flag(assertErr, "object"); }; assert.doesNotThrow = function(fn2, errorLike, errMsgMatcher, message) { if ("string" === typeof errorLike || errorLike instanceof RegExp) { errMsgMatcher = errorLike; errorLike = null; } new Assertion(fn2, message, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher); }; assert.operator = function(val, operator, val2, msg) { var ok; switch (operator) { case "==": ok = val == val2; break; case "===": ok = val === val2; break; case ">": ok = val > val2; break; case ">=": ok = val >= val2; break; case "<": ok = val < val2; break; case "<=": ok = val <= val2; break; case "!=": ok = val != val2; break; case "!==": ok = val !== val2; break; default: msg = msg ? msg + ": " : msg; throw new AssertionError( msg + 'Invalid operator "' + operator + '"', void 0, assert.operator ); } var test2 = new Assertion(ok, msg, assert.operator, true); test2.assert( true === flag(test2, "object"), "expected " + inspect2(val) + " to be " + operator + " " + inspect2(val2), "expected " + inspect2(val) + " to not be " + operator + " " + inspect2(val2) ); }; assert.closeTo = function(act, exp, delta, msg) { new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); }; assert.approximately = function(act, exp, delta, msg) { new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta); }; assert.sameMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2); }; assert.notSameMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2); }; assert.sameDeepMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2); }; assert.notSameDeepMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2); }; assert.sameOrderedMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2); }; assert.notSameOrderedMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2); }; assert.sameDeepOrderedMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2); }; assert.notSameDeepOrderedMembers = function(set1, set2, msg) { new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2); }; assert.includeMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset); }; assert.notIncludeMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset); }; assert.includeDeepMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset); }; assert.notIncludeDeepMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset); }; assert.includeOrderedMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset); }; assert.notIncludeOrderedMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset); }; assert.includeDeepOrderedMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset); }; assert.notIncludeDeepOrderedMembers = function(superset, subset, msg) { new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset); }; assert.oneOf = function(inList, list, msg) { new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); }; assert.isIterable = function(obj, msg) { if (obj == void 0 || !obj[Symbol.iterator]) { msg = msg ? `${msg} expected ${inspect2(obj)} to be an iterable` : `expected ${inspect2(obj)} to be an iterable`; throw new AssertionError( msg, void 0, assert.isIterable ); } }; assert.changes = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } new Assertion(fn2, msg, assert.changes, true).to.change(obj, prop); }; assert.changesBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.changesBy, true).to.change(obj, prop).by(delta); }; assert.doesNotChange = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } return new Assertion(fn2, msg, assert.doesNotChange, true).to.not.change(obj, prop); }; assert.changesButNotBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta); }; assert.increases = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } return new Assertion(fn2, msg, assert.increases, true).to.increase(obj, prop); }; assert.increasesBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta); }; assert.doesNotIncrease = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } return new Assertion(fn2, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop); }; assert.increasesButNotBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta); }; assert.decreases = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } return new Assertion(fn2, msg, assert.decreases, true).to.decrease(obj, prop); }; assert.decreasesBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta); }; assert.doesNotDecrease = function(fn2, obj, prop, msg) { if (arguments.length === 3 && typeof obj === "function") { msg = prop; prop = null; } return new Assertion(fn2, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop); }; assert.doesNotDecreaseBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } return new Assertion(fn2, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta); }; assert.decreasesButNotBy = function(fn2, obj, prop, delta, msg) { if (arguments.length === 4 && typeof obj === "function") { var tmpMsg = delta; delta = prop; msg = tmpMsg; } else if (arguments.length === 3) { delta = prop; prop = null; } new Assertion(fn2, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta); }; assert.ifError = function(val) { if (val) { throw val; } }; assert.isExtensible = function(obj, msg) { new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; }; assert.isNotExtensible = function(obj, msg) { new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; }; assert.isSealed = function(obj, msg) { new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; }; assert.isNotSealed = function(obj, msg) { new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; }; assert.isFrozen = function(obj, msg) { new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; }; assert.isNotFrozen = function(obj, msg) { new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; }; assert.isEmpty = function(val, msg) { new Assertion(val, msg, assert.isEmpty, true).to.be.empty; }; assert.isNotEmpty = function(val, msg) { new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; }; (/* @__PURE__ */ __name(function alias(name, as) { assert[as] = assert[name]; return alias; }, "alias"))("isOk", "ok")("isNotOk", "notOk")("throws", "throw")("throws", "Throw")("isExtensible", "extensible")("isNotExtensible", "notExtensible")("isSealed", "sealed")("isNotSealed", "notSealed")("isFrozen", "frozen")("isNotFrozen", "notFrozen")("isEmpty", "empty")("isNotEmpty", "notEmpty")("isCallable", "isFunction")("isNotCallable", "isNotFunction"); var used = []; function use(fn2) { const exports = { AssertionError, util: utils_exports, config, expect, assert, Assertion, ...should_exports }; if (!~used.indexOf(fn2)) { fn2(exports, utils_exports); used.push(fn2); } return exports; } __name(use, "use"); // test/util/chai-dom.mjs function chaiDom(chai, utils) { var flag3 = utils.flag, elToString = function(el) { let desc; if (isNodeList(el)) { if (el.length === 0) return "empty NodeList"; desc = Array.prototype.slice.call(el, 0, 5).map(elToString).join(", "); return el.length > 5 ? desc + "... (+" + (el.length - 5) + " more)" : desc; } if (!isHTMLElement3(el)) { return String(el); } desc = el.tagName.toLowerCase(); if (el.id) { desc += "#" + el.id; } if (el.className) { desc += "." + String(el.className).replace(/\s+/g, "."); } Array.prototype.forEach.call(el.attributes, function(attr) { if (attr.name !== "class" && attr.name !== "id") { desc += "[" + attr.name + (attr.value ? '="' + attr.value + '"]' : "]"); } }); return desc; }, attrAssert = function(name, val) { let el = flag3(this, "object"), actual = el.getAttribute(name); if (!flag3(this, "negate") || void 0 === val) { this.assert( !!el.attributes[name], "expected " + elToString(el) + " to have an attribute #{exp}", "expected " + elToString(el) + " not to have an attribute #{exp}", name ); } if (void 0 !== val) { this.assert( val === actual, "expected " + elToString(el) + " to have an attribute " + utils.inspect(name) + " with the value #{exp}, but the value was #{act}", "expected " + elToString(el) + " not to have an attribute " + utils.inspect(name) + " with the value #{act}", val, actual ); } flag3(this, "object", actual); }, isHTMLElement3 = function(el) { return el.nodeType === 1; }, isNodeList = function(obj) { return Object.prototype.toString.call(obj) === "[object NodeList]"; }; utils.elToString = elToString; chai.Assertion.addMethod("attr", attrAssert); chai.Assertion.addMethod("attribute", attrAssert); chai.Assertion.addMethod("class", function(className) { var el = flag3(this, "object"); this.assert( el.classList.contains(className), "expected " + elToString(el) + " to have class #{exp}", "expected " + elToString(el) + " not to have class #{exp}", className ); }); chai.Assertion.addMethod("id", function(id) { var el = flag3(this, "object"); this.assert( el.id == id, "expected " + elToString(el) + " to have id #{exp}", "expected " + elToString(el) + " not to have id #{exp}", id ); }); chai.Assertion.addMethod("html", function(html) { var el = flag3(this, "object"), actual = flag3(this, "object").innerHTML; if (flag3(this, "contains")) { this.assert( actual.indexOf(html) >= 0, "expected #{act} to contain HTML #{exp}", "expected #{act} not to contain HTML #{exp}", html, actual ); } else { this.assert( actual === html, "expected " + elToString(el) + " to have HTML #{exp}, but the HTML was #{act}", "expected " + elToString(el) + " not to have HTML #{exp}", html, actual ); } }); chai.Assertion.addChainableMethod("trimmed", null, function() { flag3(this, "trim-text", true); }); chai.Assertion.addMethod("text", function(text) { var obj = flag3(this, "object"), contains2 = flag3(this, "contains"), trim = flag3(this, "trim-text"), actual, result; if (isNodeList(obj)) { actual = Array.prototype.map.call(obj, function(el) { return trim ? el.textContent.trim() : el.textContent; }); if (Array.isArray(text)) { result = contains2 ? text[flag3(this, "negate") ? "some" : "every"](function(t) { return Array.prototype.some.call(obj, function(el) { return (trim ? el.textContent.trim() : el.textContent) === t; }); }) : utils.eql(actual, text); actual = actual.join(); text = text.join(); } else { actual = actual.join(""); result = contains2 ? actual.indexOf(text) >= 0 : actual === text; } } else { actual = trim ? obj.textContent.trim() : obj.textContent; result = contains2 ? actual.indexOf(text) >= 0 : actual === text; } var objDesc = elToString(obj), textMsg = trim ? "trimmed text" : "text"; if (contains2) { this.assert( result, "expected " + objDesc + " to contain #{exp}, but the " + textMsg + " was #{act}", "expected " + objDesc + " not to contain #{exp}, but the " + textMsg + " was #{act}", text, actual ); } else { this.assert( result, "expected " + objDesc + " to have " + textMsg + " #{exp}, but the " + textMsg + " was #{act}", "expected " + objDesc + " not to have " + textMsg + " #{exp}", text, actual ); } }); chai.Assertion.addMethod("value", function(value) { var el = flag3(this, "object"), actual = flag3(this, "object").value; this.assert( flag3(this, "object").value === value, "expected " + elToString(el) + " to have value #{exp}, but the value was #{act}", "expected " + elToString(el) + " not to have value #{exp}", value, actual ); }); chai.Assertion.overwriteProperty("exist", function(_super) { return function() { var obj = flag3(this, "object"); if (isNodeList(obj)) { this.assert( obj.length > 0, "expected an empty NodeList to have nodes", "expected " + elToString(obj) + " to not exist" ); } else { _super.apply(this, arguments); } }; }); chai.Assertion.overwriteProperty("empty", function(_super) { return function() { var obj = flag3(this, "object"); if (isHTMLElement3(obj)) { this.assert( obj.children.length === 0, "expected " + elToString(obj) + " to be empty", "expected " + elToString(obj) + " to not be empty" ); } else if (isNodeList(obj)) { this.assert( obj.length === 0, "expected " + elToString(obj) + " to be empty", "expected " + elToString(obj) + " to not be empty" ); } else { _super.apply(this, arguments); } }; }); chai.Assertion.overwriteChainableMethod( "length", function(_super) { return function(length) { var obj = flag3(this, "object"); if (isNodeList(obj) || isHTMLElement3(obj)) { var actualLength = obj.children ? obj.children.length : obj.length; this.assert( actualLength === length, "expected " + elToString(obj) + " to have #{exp} children but it had #{act} children", "expected " + elToString(obj) + " to not have #{exp} children", length, actualLength ); } else { _super.apply(this, arguments); } }; }, function(_super) { return function() { _super.call(this); }; } ); chai.Assertion.overwriteMethod("match", function(_super) { return function(selector) { var obj = flag3(this, "object"); if (isHTMLElement3(obj)) { this.assert( obj.matches(selector), "expected " + elToString(obj) + " to match #{exp}", "expected " + elToString(obj) + " to not match #{exp}", selector ); } else if (isNodeList(obj)) { this.assert( !!obj.length && Array.prototype.every.call(obj, function(el) { return el.matches(selector); }), "expected " + elToString(obj) + " to match #{exp}", "expected " + elToString(obj) + " to not match #{exp}", selector ); } else { _super.apply(this, arguments); } }; }); chai.Assertion.overwriteChainableMethod( "contain", function(_super) { return function(subitem) { var obj = flag3(this, "object"); if (isHTMLElement3(obj)) { if (typeof subitem === "string") { this.assert( !!obj.querySelector(subitem), "expected " + elToString(obj) + " to contain #{exp}", "expected " + elToString(obj) + " to not contain #{exp}", subitem ); } else { this.assert( obj.contains(subitem), "expected " + elToString(obj) + " to contain " + elToString(subitem), "expected " + elToString(obj) + " to not contain " + elToString(subitem) ); } } else { _super.apply(this, arguments); } }; }, function(_super) { return function() { _super.call(this); }; } ); chai.Assertion.addMethod("descendant", function(subitem) { var obj = flag3(this, "object"), actual = subitem; if (typeof subitem === "string") { actual = obj.querySelector(subitem); this.assert( !!actual, "expected " + elToString(obj) + " to have descendant #{exp}", "expected " + elToString(obj) + " to not have descendant #{exp}", subitem ); } else { this.assert( obj.contains(subitem), "expected " + elToString(obj) + " to contain " + elToString(subitem), "expected " + elToString(obj) + " to not contain " + elToString(subitem) ); } flag3(this, "object", actual); }); chai.Assertion.addMethod("descendants", function(selector) { var obj = flag3(this, "object"), actual = obj.querySelectorAll(selector); this.assert( !!actual.length, "expected " + elToString(obj) + " to have descendants #{exp}", "expected " + elToString(obj) + " to not have descendants #{exp}", selector ); flag3(this, "object", actual); }); chai.Assertion.addProperty("displayed", function() { var el = flag3(this, "object"), actual = document.body.contains(el) ? window.getComputedStyle(el).display : el.style.display; this.assert( actual !== "none", "expected " + elToString(el) + " to be displayed, but it was not", "expected " + elToString(el) + " to not be displayed, but it was as " + actual, actual ); }); chai.Assertion.addProperty("visible", function() { var el = flag3(this, "object"), actual = document.body.contains(el) ? window.getComputedStyle(el).visibility : el.style.visibility; this.assert( actual !== "hidden" && actual !== "collapse", "expected " + elToString(el) + " to be visible, but it was " + (actual === "hidden" ? "hidden" : "collapsed"), "expected " + elToString(el) + " to not be visible, but it was", actual ); }); } // test/util/jsdom.mjs init_extend(); init_global(); var isBrowser = new Function("try {return this===window;}catch(e){ return false;}"); var isNode = new Function("try {return this===global;}catch(e){return false;}"); var JSDOMExport = null; function initJSDOM(options2) { if (typeof window === "object" && window["DOMParser"]) return Promise.resolve(); const g = getGlobal(); options2 = extend({}, { pretendToBeVisual: true, contentType: "text/html", includeNodeLocations: true, storageQuota: 1e7, runScripts: "dangerously", resources: "usable" }, options2 || {}); return import("jsdom").then(({ JSDOM }) => { JSDOMExport = JSDOM; const { window: window2 } = new JSDOM(`<!DOCTYPE html><html lang="en"><head><title>Test</title></head><body><div id="mocks"></div></body></html>`, options2); g["window"] = window2; return new Promise( (resolve, reject) => window2.addEventListener("load", () => { [ "Blob", "CSSStyleSheet", "customElements", "CustomEvent", "document", "DOMException", "DOMImplementation", "Document", "DocumentFragment", "DOMParser", "Element", "ElementInternals", "Event", "EventTarget", "getComputedStyle", "HTMLButtonElement", "HTMLCollection", "HTMLDivElement", "HTMLDocument", "HTMLElement", "HTMLFormElement", "HTMLInputElement", "HTMLScriptElement", "requestAnimationFrame", "HTMLSelectElement", "HTMLTemplateElement", "HTMLTextAreaElement", "InputEvent", "KeyboardEvent", "MutationObserver", "navigator", "Node", "NodeFilter", "NodeList", "self", "ShadowRoot", "XMLSerializer" ].forEach((key) => { try { g[key] = window2[key]; } catch (e) { console.error("Error setting key", key, e); } }); Promise.resolve().then(() => __toESM(require_lib(), 1)).then(({ default: Storage2 }) => { g.localStorage = new Storage2(null, { strict: true }); g.sessionStorage = new Storage2(null, { strict: true }); window2["localStorage"] = g.localStorage; window2["sessionStorage"] = g.sessionStorage; resolve(g); }).catch((e) => { console.error("Error loading dom-storage", e); reject(e); }); }) ); }); } // test/cases/components/layout/tabs.mjs var expect2 = expect; use(chaiDom); var global2 = getGlobal(); var html1 = ` <monster-tabs id="mytabs"> <div data-monster-button-label="TAB1"> <div> Das ist tab 1 </div> </div> <div data-monster-button-label="TAB2"> Das ist tab 2 </div> <div> Das ist tab 3 ohne button </div> <div></div> </monster-tabs> `; var Tabs2; describe("Tabs", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); let promises = []; if (!global2["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { const Crypto3 = m["Crypto"]; global2["crypto"] = new Crypto3(); })); } promises.push(Promise.resolve().then(() => (init_tabs2(), tabs_exports)).then((m) => { Tabs2 = m["Tabs"]; })); Promise.all(promises).then(() => { done(); }).catch((e) => done(e)); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have buttons and tabs", function(done) { let mocks = document.getElementById("mocks"); mocks.innerHTML = html1; setTimeout(() => { try { const tabs = document.getElementById("mytabs"); expect2(tabs).is.instanceof(Tabs2); setTimeout(() => { let nav = tabs.shadowRoot.querySelector("nav"); const buttons = tabs.shadowRoot.querySelectorAll("button[part=button]"); expect2(buttons[0]).is.instanceof(HTMLButtonElement); expect2(nav.hasChildNodes()).to.be.true; expect2(buttons.length).to.be.equal(4); done(); }, 100); } catch (e) { return done(e); } }, 0); }); }); }); // test/cases/components/layout/slit-panel.mjs init_global(); var expect3 = expect; use(chaiDom); var global3 = getGlobal(); var html12 = ` <monster-split-panel id="my-split-panel"> </monster-split-panel> `; var SplitScreen; describe("SplitScreen", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); let promises = []; if (!global3["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { const Crypto3 = m["Crypto"]; global3["crypto"] = new Crypto3(); })); } promises.push(Promise.resolve().then(() => (init_split_panel2(), split_panel_exports)).then((m) => { SplitScreen = m["SplitPanel"]; })); Promise.all(promises).then(() => { done(); }).catch((e) => done(e)); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have buttons and SplitScreen", function(done) { let mocks = document.getElementById("mocks"); mocks.innerHTML = html12; setTimeout(() => { try { const SplitScreen3 = document.getElementById("my-split-panel"); expect3(SplitScreen3).is.instanceof(HTMLElement); setTimeout(() => { let div = SplitScreen3.shadowRoot.querySelector("div"); expect3(div.hasChildNodes()).to.be.true; done(); }, 100); } catch (e) { return done(e); } }, 0); }); }); }); // test/cases/components/layout/panel.mjs init_global(); var expect4 = expect; use(chaiDom); var global4 = getGlobal(); var html13 = ` <monster-panel id="my-panel"> </monster-panel> `; var SplitScreen2; describe("SplitScreen", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); let promises = []; if (!global4["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { const Crypto3 = m["Crypto"]; global4["crypto"] = new Crypto3(); })); } promises.push(Promise.resolve().then(() => (init_panel2(), panel_exports)).then((m) => { SplitScreen2 = m["Panel"]; })); Promise.all(promises).then(() => { done(); }).catch((e) => done(e)); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have buttons and SplitScreen", function(done) { let mocks = document.getElementById("mocks"); mocks.innerHTML = html13; setTimeout(() => { try { const SplitScreen3 = document.getElementById("my-panel"); expect4(SplitScreen3).is.instanceof(HTMLElement); setTimeout(() => { let div = SplitScreen3.shadowRoot.querySelector("div"); expect4(div.hasChildNodes()).to.be.true; done(); }, 100); } catch (e) { return done(e); } }, 0); }); }); }); // test/cases/components/form/reload.mjs init_global(); // test/util/intersection-mock.mjs init_global(); var global5 = getGlobal(); function setupIntersectionObserverMock({ root = null, rootMargin = "", thresholds = [], disconnect = () => null, observe = () => null, takeRecords = () => [], unobserve = () => null } = {}) { const savedImplementation = window.IntersectionObserver; let lastObject; class MockIntersectionObserver { constructor(callback, options2) { this.root = root; this.rootMargin = rootMargin; this.thresholds = thresholds; this.disconnect = disconnect; this.observe = observe; this.takeRecords = takeRecords; this.unobserve = unobserve; this.callback = callback; this.options = options2; lastObject = this; } enterNode() { const entries = []; entries.push({ isIntersecting: true }); this["callback"](entries, this); } } Object.defineProperty(window, "IntersectionObserver", { writable: true, configurable: true, value: MockIntersectionObserver }); Object.defineProperty(global5, "IntersectionObserver", { writable: true, configurable: true, value: MockIntersectionObserver }); return { restore: function() { window.IntersectionObserver = savedImplementation; }, getInstance: function() { return lastObject; } }; } // test/cases/components/form/reload.mjs var expect5 = expect; use(chaiDom); var global6 = getGlobal(); var mockintersectionobserver; var html14 = ` <div id="test1"> </div> `; describe("Reload", function() { let Reload2, viewport2, mockViewport; after(function() { mockintersectionobserver.restore(); }); before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); mockintersectionobserver = setupIntersectionObserverMock(); Promise.resolve().then(() => (init_reload(), reload_exports)).then((m) => { Reload2 = m["Reload"]; done(); }).catch((e) => done(e)); }); }); describe("new Reload", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html14; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="test2"> <monster-reload></monster-reload> </div> `; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-reload", function() { expect5(document.getElementById("test2")).contain.html("<monster-reload"); }); }); }); describe("document.createElement", function() { it("should instance of reload", function() { expect5(document.createElement("monster-reload")).is.instanceof(Reload2); }); }); }); describe("document.createElement()", function() { let mocks; beforeEach(() => { mocks = document.getElementById("mocks"); }); afterEach(() => { mocks.innerHTML = ""; }); it("should have no options", function(done) { const reload = document.createElement("monster-reload"); mocks.appendChild(reload); setTimeout(() => { try { expect5(document.getElementById("mocks")).contain.html("<monster-reload"); } catch (e) { return done(e); } done(); }, 0); }); }); describe("load content", function() { let mocks, fetchReference4, intersectionObserver; beforeEach((done) => { mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="this-content"> </div> `; fetchReference4 = global6["fetch"]; global6["fetch"] = function(url, options2) { let headers = /* @__PURE__ */ new Map(); headers.set("content-type", "text/html"); return new Promise((resolve, reject) => { resolve({ ok: true, status: 200, headers, text: function() { return new Promise((resolve2, reject2) => { resolve2("hello world!"); }); } }); }); }; done(); }); afterEach(() => { mocks.innerHTML = ""; global6["fetch"] = fetchReference4; }); it("should load content from url", function(done) { const reload = document.createElement("monster-reload"); reload.setAttribute("data-monster-url", "http://localhost/"); reload.addEventListener("monster-fetched", (event) => { try { const element = document.querySelector("monster-reload"); expect5(element).contain.html("hello world"); done(); } catch (e) { done(e); } }); mocks.appendChild(reload); mockintersectionobserver.getInstance().enterNode(); }); }); }); // test/cases/components/form/state-button.mjs init_global(); // test/util/resize-observer.mjs var ResizeObserverMock = class { constructor(callback) { this.callback = callback; this.elements = []; } observe(element) { this.elements.push(element); } unobserve(element) { this.elements = this.elements.filter((el) => el !== element); } disconnect() { this.elements = []; } triggerResize(entries) { this.callback(entries, this); } }; // test/cases/components/form/state-button.mjs var expect6 = expect; use(chaiDom); var global7 = getGlobal(); var html15 = ` <div id="test1"> </div> `; var html2 = ` <div id="test2"> <monster-state-button tabindex="0" data-monster-bind="path:values.checkbox" data-monster-options='{ "url": "mock-data.json", "mapping": { "valuePath": "\${first_name} \${last_name}", "keyPath": "id" }, "type":"checkbox" }'></monster-state-button> </div> `; var StateButton2; describe("StateButton", function() { after(function() { }); before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); if (!global7.ResizeObserver) { global7.ResizeObserver = ResizeObserverMock; } Promise.resolve().then(() => (init_state_button2(), state_button_exports)).then((m) => { StateButton2 = m["StateButton"]; done(); }).catch((e) => done(e)); }); }); describe("new StateButton", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html15; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html2; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-state-button", function() { expect6(document.getElementById("test2")).contain.html("<monster-state-button"); }); }); }); describe("document.createElement", function() { it("should instance of state-button", function() { expect6(document.createElement("monster-state-button")).is.instanceof(StateButton2); }); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have no options", function(done) { let mocks = document.getElementById("mocks"); const button = document.createElement("monster-state-button"); mocks.appendChild(button); setTimeout(() => { try { const options2 = button.shadowRoot.querySelector("button"); expect6(options2).is.instanceof(HTMLButtonElement); expect6(options2.hasChildNodes()).to.be.true; } catch (e) { return done(e); } done(); }, 0); }); }); }); // test/cases/components/form/select.mjs init_global(); var expect7 = expect; use(chaiDom); var global8 = getGlobal(); var html16 = ` <div id="test1"> </div> `; var html22 = ` <div id="test2"> <monster-select tabindex="0" data-monster-bind="path:values.checkbox" data-monster-options='{ "url": "mock-data.json", "mapping": { "selector": "*", "valueTemplate": "\${first_name} \${last_name}", "labelTemplate": "id" }, "type":"checkbox" }'></monster-select> </div> `; var Select2; var fetchReference; describe("Select", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); fetchReference = global8["fetch"]; if (!global8.ResizeObserver) { global8.ResizeObserver = ResizeObserverMock; } Promise.resolve().then(() => (init_select2(), select_exports)).then((m) => { Select2 = m["Select"]; done(); }).catch((e) => done(e)); }); }); describe("With fetch", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html16; global8["fetch"] = function(url, options2) { let headers = /* @__PURE__ */ new Map(); headers.set("content-type", "application/json"); return new Promise((resolve, reject) => { resolve({ headers, text: function() { return new Promise((resolve2, reject2) => { let json = JSON.parse(`[ { "id": 1, "first_name": "Alexia", "last_name": "Oughtright", "email": "aoughtright0@exblog.jp", "gender": "Agender", "country": "mn" }, { "id": 2, "first_name": "Beth", "last_name": "Boddington", "email": "bboddington1@statcounter.com", "gender": "Non-binary", "country": "sy" }, { "id": 3, "first_name": "Shelli", "last_name": "A'Barrow", "email": "sabarrow2@google.co.uk", "gender": "Polygender", "country": "no" } ]`); resolve2(JSON.stringify(json)); }); } }); }); }; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; global8["fetch"] = fetchReference; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html22; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; global8["fetch"] = fetchReference; }); describe("create from template", function() { it("should contains monster-select", function() { expect7(document.getElementById("test2")).contain.html("<monster-select"); }); }); }); describe("document.createElement", function() { it("should instance of select", function() { const select = document.createElement("monster-select"); expect7(select).is.instanceof(Select2); }); it("should have options", function(done) { let mocks = document.getElementById("mocks"); const select = document.createElement("monster-select"); select.setOption("url", "https://example.com"); select.setOption("mapping.selector", "*"); select.setOption("mapping.labelTemplate", "${id}"); select.setOption("mapping.valueTemplate", "${id}"); select.addEventListener("monster-options-set", (e) => { setTimeout(() => { try { const options2 = select.shadowRoot.querySelectorAll("[data-monster-role=option]"); expect7(options2.length).is.equal(3); const optionHtml = select.shadowRoot.querySelector("[data-monster-role=options]"); expect7(optionHtml).contain.html('data-monster-insert-reference="options-0"'); expect7(optionHtml).contain.html('data-monster-insert-reference="options-1"'); expect7(optionHtml).contain.html('data-monster-insert-reference="options-2"'); expect7(optionHtml).contain.not.html('data-monster-insert-reference="options-3"'); } catch (e2) { done(e2); return; } done(); }, 100); }); mocks.appendChild(select); }); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have no options", function(done) { let mocks = document.getElementById("mocks"); const select = document.createElement("monster-select"); mocks.appendChild(select); setTimeout(() => { try { const options2 = select.shadowRoot.querySelector("[data-monster-role=options]"); expect7(options2).is.instanceof(HTMLDivElement); const a2 = options2.parentNode.outerHTML; const b = options2.childNodes.length; expect7(options2.hasChildNodes()).to.be.false; } catch (e) { return done(e); } done(); }, 0); }); }); }); // test/cases/components/form/confirm-button.mjs init_dataurl(); init_global(); var expect8 = expect; use(chaiDom); var global9 = getGlobal(); var html17; var options; var html23; var ConfirmButton2; describe("ConfirmButton", function() { before(function(done) { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); if (!global9.ResizeObserver) { global9.ResizeObserver = ResizeObserverMock; } options = new DataUrl(btoa(JSON.stringify({ popper: { placement: "top" } })), "application/json", true).toString(); html23 = ` <div id="test2"> <monster-confirm-button tabindex="0" data-monster-bind="path:values.checkbox" data-monster-options="` + options + `"></monster-confirm-button> </div> `; html17 = ` <div id="test1"> </div> `; initJSDOM().then(() => { Promise.resolve().then(() => (init_confirm_button2(), confirm_button_exports)).then((m) => { ConfirmButton2 = m["ConfirmButton"]; done(); }).catch((e) => done(e)); }); }); describe("new ConfirmButton", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html17; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html23; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-confirm-button", function() { expect8(document.getElementById("test2")).contain.html("<monster-confirm-button"); }); }); }); describe("document.createElement", function() { it("should instance of button", function() { expect8(document.createElement("monster-confirm-button")).is.instanceof(ConfirmButton2); }); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have childs", function(done) { let mocks = document.getElementById("mocks"); const button = document.createElement("monster-confirm-button"); mocks.appendChild(button); setTimeout(() => { try { const content = button.shadowRoot.querySelector("monster-button"); expect8(content.hasChildNodes()).to.be.true; } catch (e) { return done(e); } done(); }, 0); }); }); }); // test/cases/components/form/form.mjs init_global(); // source/data/datasource.mjs init_constants(); init_constants(); init_base(); init_dataurl(); init_is(); init_proxyobserver(); init_validate(); init_extend(); init_pathfinder(); var internalDataSymbol = Symbol.for( "@schukai/monster/data/datasource/@@data" ); var Datasource = class extends Base { /** * creates a new datasource * */ constructor() { super(); this[internalSymbol] = new ProxyObserver({ options: extend({}, this.defaults) }); this[internalDataSymbol] = new ProxyObserver({}); } /** * attach a new observer * * @param {Observer} observer * @return {Datasource} */ attachObserver(observer) { this[internalDataSymbol].attachObserver(observer); return this; } /** * detach a observer * * @param {Observer} observer * @return {Datasource} */ detachObserver(observer) { this[internalDataSymbol].detachObserver(observer); return this; } /** * @param {Observer} observer * @return {boolean} */ containsObserver(observer) { return this[internalDataSymbol].containsObserver(observer); } /** * Derived classes can override and extend this method as follows. * * ``` * get defaults() { * return Object.assign({}, super.defaults, { * myValue:true * }); * } * ``` */ get defaults() { return {}; } /** * Set option * * @param {string} path * @param {*} value * @return {Datasource} */ setOption(path, value) { new Pathfinder(this[internalSymbol].getSubject()["options"]).setVia( path, value ); return this; } /** * @param {string|object} options * @return {Datasource} * @throws {Error} the options does not contain a valid json definition */ setOptions(options2) { if (isString(options2)) { options2 = parseOptionsJSON2(options2); } extend( this[internalSymbol].getSubject()["options"], this.defaults, options2 ); return this; } /** * nested options can be specified by path `a.b.c` * * @param {string} path * @param {*} defaultValue * @return {*} */ getOption(path, defaultValue) { let value; try { value = new Pathfinder( this[internalSymbol].getRealSubject()["options"] ).getVia(path); } catch (e) { } if (value === void 0) return defaultValue; return value; } /** * @throws {Error} this method must be implemented by derived classes. * @return {Promise} */ read() { throw new Error("this method must be implemented by derived classes"); } /** * @throws {Error} this method must be implemented by derived classes. * @return {Promise} */ write() { throw new Error("this method must be implemented by derived classes"); } /** * Returns real object * * @return {Object|Array} */ get() { return this[internalDataSymbol].getRealSubject(); } /** * @param {Object|Array} data * @return {Datasource} */ set(data) { this[internalDataSymbol].setSubject(data); return this; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource"); } }; function parseOptionsJSON2(data) { if (isString(data)) { try { const dataUrl = parseDataURL(data); data = dataUrl.content; } catch (e) { } try { const obj = JSON.parse(data); validateObject(obj); return obj; } catch (e) { throw new Error( `the options does not contain a valid json definition (actual: ${data}).` ); } } return {}; } // test/cases/components/form/form.mjs init_processing(); // source/data/datasource/storage.mjs init_constants(); init_validate(); var storageObjectSymbol = Symbol.for( "@schukai/monster/data/datasource/storage/@@storageObject" ); var Storage = class _Storage extends Datasource { /** * * @param {string} key LocalStorage Key * @throws {TypeError} value is not a string */ constructor(key) { super(); this.setOption("key", validateString(key)); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/storage"); } /** * @property {string} key=undefined LocalStorage Key */ get defaults() { return Object.assign({}, super.defaults, { key: void 0 }); } /** * @throws {Error} this method must be implemented by derived classes. * @return {external:Storage} * @private */ [storageObjectSymbol]() { throw new Error("this method must be implemented by derived classes"); } /** * @return {Promise} * @throws {Error} the options does not contain a valid json definition * @throws {TypeError} value is not a object * @throws {Error} the data cannot be read */ read() { const self2 = this; const storage = self2[storageObjectSymbol](); return new Promise(function(resolve) { const data = JSON.parse(storage.getItem(self2.getOption("key"))); self2.set(data ?? {}); resolve(); }); } /** * @return {Storage} * @throws {Error} the data cannot be written */ write() { const self2 = this; const storage = self2[storageObjectSymbol](); return new Promise(function(resolve) { const data = self2.get(); if (data === void 0) { storage.removeItem(self2.getOption("key")); } else { storage.setItem(self2.getOption("key"), JSON.stringify(data)); } resolve(); }); } /** * @return {Storage} */ getClone() { return new _Storage(this[internalSymbol].getRealSubject()["options"].key); } }; // test/cases/components/form/form.mjs use(chaiDom); // test/cases/components/form/tree-select.mjs init_global(); var expect9 = expect; use(chaiDom); var global10 = getGlobal(); var html18 = ` <div id="test1"> </div> `; var html24 = ` <div id="test2"> <monster-tree-select tabindex="0" data-monster-bind="path:values.checkbox" data-monster-options='{ "url": "mock-data.json", "mapping": { "valueTemplate": "\${first_name} \${last_name}", "labelTemplate": "id", "selector": "*" }, "type":"checkbox" }'></monster-tree-select> </div> `; var TreeSelect2; var fetchReference2; describe("Treeselect", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); fetchReference2 = global10["fetch"]; Promise.resolve().then(() => (init_tree_select2(), tree_select_exports)).then((m) => { TreeSelect2 = m["TreeSelect"]; done(); }).catch((e) => done(e)); }); }); describe("With fetch", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html18; global10["fetch"] = function(url, options2) { let headers = /* @__PURE__ */ new Map(); headers.set("content-type", "application/json"); return new Promise((resolve, reject) => { resolve({ headers, text: function() { return new Promise((resolve2, reject2) => { let json = JSON.parse(`[ { "id": 1, "first_name": "Alexia", "last_name": "Oughtright", "email": "aoughtright0@exblog.jp", "gender": "Agender", "country": "mn" , "parent": "0" }, { "id": 2, "first_name": "Beth", "last_name": "Boddington", "email": "bboddington1@statcounter.com", "gender": "Non-binary", "country": "sy", "parent": "0" }, { "id": 3, "first_name": "Shelli", "last_name": "A'Barrow", "email": "sabarrow2@google.co.uk", "gender": "Polygender", "country": "no", "parent": "0" } ]`); resolve2(JSON.stringify(json)); }); } }); }); }; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; global10["fetch"] = fetchReference2; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html24; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; global10["fetch"] = fetchReference2; }); describe("create from template", function() { it("should contains monster-tree-select", function() { expect9(document.getElementById("test2")).contain.html("<monster-tree-select"); }); }); }); describe("document.createElement", function() { it("should instance of select", function() { expect9(document.createElement("monster-tree-select")).is.instanceof(TreeSelect2); }); it("should have options", function(done) { let mocks = document.getElementById("mocks"); const treeselect = document.createElement("monster-tree-select"); treeselect.setOption("url", "https://example.com"); treeselect.setOption("mapping.selector", "*"); treeselect.setOption("mapping.labelTemplate", "${last_name}"); treeselect.setOption("mapping.valueTemplate", "${id | tostring }"); treeselect.addEventListener("monster-options-set", (e) => { setTimeout(() => { try { const options2 = treeselect.shadowRoot.querySelectorAll("[data-monster-role=option]"); expect9(options2.length).is.equal(3); const optionHtml = treeselect.shadowRoot.querySelector("[data-monster-role=options]"); expect9(optionHtml).contain.html('data-monster-insert-reference="options-0"'); expect9(optionHtml).contain.html('data-monster-insert-reference="options-1"'); expect9(optionHtml).contain.html('data-monster-insert-reference="options-2"'); expect9(optionHtml).contain.not.html('data-monster-insert-reference="options-3"'); } catch (e2) { done(e2); return; } done(); }, 100); }); mocks.appendChild(treeselect); }); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have no options", function(done) { let mocks = document.getElementById("mocks"); const select = document.createElement("monster-tree-select"); mocks.appendChild(select); setTimeout(() => { try { const options2 = select.shadowRoot.querySelector("[data-monster-role=options]"); expect9(options2).is.instanceof(HTMLDivElement); expect9(options2.hasChildNodes()).to.be.false; } catch (e) { return done(e); } done(); }, 0); }); }); }); // test/cases/components/form/button.mjs init_global(); var expect10 = expect; use(chaiDom); var global11 = getGlobal(); var html19 = ` <div id="test1"> </div> `; var html25 = ` <div id="test2"> <monster-button tabindex="0" data-monster-bind="path:values.checkbox" data-monster-options='{ "url": "mock-data.json", "mapping": { "valuePath": "\${first_name} \${last_name}", "keyPath": "id" }, "type":"checkbox" }'></monster-button> </div> `; var Button2; describe("Button", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); Promise.resolve().then(() => (init_button2(), button_exports)).then((m) => { Button2 = m["Button"]; done(); }).catch((e) => done(e)); }); }); describe("new Button", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html19; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html25; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-button", function() { expect10(document.getElementById("test2")).contain.html("<monster-button"); }); }); }); describe("document.createElement", function() { it("should instance of button", function() { expect10(document.createElement("monster-button")).is.instanceof(Button2); }); }); }); describe("document.createElement()", function() { afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should have no options", function(done) { let mocks = document.getElementById("mocks"); const button = document.createElement("monster-button"); mocks.appendChild(button); setTimeout(() => { try { const options2 = button.shadowRoot.querySelector("button"); expect10(options2).is.instanceof(HTMLButtonElement); expect10(options2.hasChildNodes()).to.be.true; } catch (e) { return done(e); } done(); }, 100); }); }); }); // test/cases/components/form/toggle-switch.mjs init_global(); var expect11 = expect; use(chaiDom); var global12 = getGlobal(); var html110 = ` <div id="test1"> </div> `; var html26 = ` <div id="test2"> <monster-toggle-switch></monster-toggle-switch> </div> `; var ToggleSwitch2; describe("ToggleSwitch", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); Promise.resolve().then(() => (init_toggle_switch2(), toggle_switch_exports)).then((m) => { ToggleSwitch2 = m["ToggleSwitch"]; done(); }).catch((e) => done(e)); }); }); describe("new ToggleSwitch", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html110; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html26; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-toggle-switch", function() { expect11(document.getElementById("test2")).contain.html("<monster-toggle-switch"); }); }); }); describe("document.createElement", function() { it("should instance of monster-toggle-switch", function() { expect11(document.createElement("monster-toggle-switch")).is.instanceof(ToggleSwitch2); }); }); }); describe("toggle", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html110; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("toggle to on", function() { const toggleSwitch = document.createElement("monster-toggle-switch"); toggleSwitch.setOption("values.on", "true"); toggleSwitch.setOption("values.off", "false"); toggleSwitch.value = "true"; expect11("true").is.equal(toggleSwitch.value); expect11("on").is.equal(toggleSwitch.state); toggleSwitch.toggle(); expect11("false").is.equal(toggleSwitch.value); expect11("off").is.equal(toggleSwitch.state); toggleSwitch.toggle(); expect11("true").is.equal(toggleSwitch.value); expect11("on").is.equal(toggleSwitch.state); }); it("toggle on to off", function() { const toggleSwitch = document.createElement("monster-toggle-switch"); toggleSwitch.toggleOn(); expect11(toggleSwitch.value).is.equal("on"); expect11(toggleSwitch.state).is.equal("on"); toggleSwitch.toggleOff(); expect11(toggleSwitch.value).is.equal("off"); expect11(toggleSwitch.state).is.equal("off"); }); }); describe("describe css", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html110; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("css toggle", function(done) { const toggleSwitch = document.createElement("monster-toggle-switch"); toggleSwitch.value = "on"; document.getElementById("mocks").appendChild(toggleSwitch); setTimeout(() => { window.requestAnimationFrame(() => { let hasClassA = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption("classes.on")); expect11(hasClassA).is.true; toggleSwitch.value = "off"; window.requestAnimationFrame(() => { let hasClassB = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption("classes.on")); expect11(hasClassB).is.false; let hasClassC = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption("classes.off")); expect11(hasClassC).is.true; done(); }); }); }, 0); }); }); describe("describe value", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html110; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("the default value is off", function() { let toggleSwitch = document.createElement("monster-toggle-switch"); window.requestAnimationFrame(() => { expect11(null).is.equal(toggleSwitch.value); expect11(toggleSwitch.state).is.equal("off"); }); }); it("incorrect values are not accepted", function() { let toggleSwitch = document.createElement("monster-toggle-switch"); toggleSwitch.setOption("values.on", "true"); toggleSwitch.setOption("values.off", "false"); toggleSwitch.value = "test"; window.requestAnimationFrame(() => { expect11(null).is.equal(toggleSwitch.value); expect11(toggleSwitch.state).is.equal("off"); expect11(toggleSwitch.hasAttribute("disabled")).is.false; document.getElementById("mocks").appendChild(toggleSwitch); expect11(toggleSwitch.hasAttribute("disabled")).is.false; }); }); it("correct values are accepted", function() { const toggleSwitch = document.createElement("monster-toggle-switch"); toggleSwitch.setOption("values.on", "true"); toggleSwitch.setOption("values.off", "false"); toggleSwitch.value = "true"; expect11(toggleSwitch.value).is.equal("true"); expect11(toggleSwitch.state).is.equal("on"); document.getElementById("mocks").appendChild(toggleSwitch); expect11(toggleSwitch.hasAttribute("disabled")).is.false; }); }); }); // test/cases/components/form/template.mjs init_global(); var expect12 = expect; use(chaiDom); var global13 = getGlobal(); var mockintersectionobserver2; var html111 = ` <div id="test1"> </div> `; describe("Template", function() { let Template3, viewport2, mockViewport; after(function() { mockintersectionobserver2.restore(); }); before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); mockintersectionobserver2 = setupIntersectionObserverMock(); Promise.resolve().then(() => (init_template2(), template_exports)).then((m) => { Template3 = m["Template"]; done(); }).catch((e) => done(e)); }); }); describe("new Template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html111; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="test2"> <monster-template></monster-template> </div> `; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create from template", function() { it("should contains monster-template", function() { expect12(document.getElementById("test2")).contain.html("<monster-template"); }); }); }); describe("document.createElement", function() { it("should instance of template", function() { expect12(document.createElement("monster-template")).is.instanceof(Template3); }); }); }); describe("document.createElement()", function() { let mocks; beforeEach(() => { mocks = document.getElementById("mocks"); }); afterEach(() => { mocks.innerHTML = ""; }); it("should have no options", function(done) { const template = document.createElement("monster-template"); mocks.appendChild(template); setTimeout(() => { try { expect12(document.getElementById("mocks")).contain.html("<monster-template"); } catch (e) { return done(e); } done(); }, 0); }); }); describe("load content", function() { let mocks, fetchReference4, intersectionObserver; beforeEach((done) => { mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="this-content"> </div> `; fetchReference4 = global13["fetch"]; global13["fetch"] = function(url, options2) { let headers = /* @__PURE__ */ new Map(); headers.set("content-type", "text/html"); return new Promise((resolve, reject) => { resolve({ ok: true, status: 200, headers, text: function() { return new Promise((resolve2, reject2) => { resolve2("hello world!"); }); } }); }); }; done(); }); afterEach(() => { mocks.innerHTML = ""; global13["fetch"] = fetchReference4; }); it("should load content from url", function(done) { const template = document.createElement("monster-template"); template.setAttribute("data-monster-url", "http://localhost/"); mocks.appendChild(template); template.addEventListener("monster-fetched", (event) => { try { const element = document.querySelector("monster-template"); const shadowRoot = element.shadowRoot; expect12(shadowRoot).contain.html("hello world"); done(); } catch (e) { done(e); } }); mockintersectionobserver2.getInstance().enterNode(); }); }); }); // test/cases/components/notify/message.mjs var expect13 = expect; use(chaiDom); var Message2; describe("Message", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_message2(), message_exports)).then((m) => { Message2 = m["Message"]; done(); }).catch((e) => done(e)); }); }); describe("document.createElement", function() { it("should instance of Message", function() { const control = document.createElement("monster-notify-message"); expect13(control).is.instanceof(Message2); }); }); }); // test/cases/components/notify/notify.mjs var expect14 = expect; use(chaiDom); var Notify2; describe("Notify", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_notify2(), notify_exports)).then((m) => { Notify2 = m["Notify"]; done(); }).catch((e) => done(e)); }); }); describe("document.createElement", function() { it("should instance of notify", function() { expect14(document.createElement("monster-notify")).is.instanceof(Notify2); }); it("should have messages", function(done) { let mocks = document.getElementById("mocks"); const notify = document.createElement("monster-notify"); let i = 0; notify.push("this is message " + i++); notify.push("this is message " + i++); notify.push("this is message " + i++); const mutationobserver2 = new MutationObserver(function(mutations) { for (const [, mutation] of mutations.entries()) { if (mutation.addedNodes[0].tagName === "MONSTER-NOTIFY") { setTimeout(() => { mutationobserver2.disconnect(); try { const messages = notify.shadowRoot.querySelectorAll("monster-notify-message"); expect14(messages.length).is.equal(3); } catch (e) { return done(e); } done(); }, 0); } } }); mutationobserver2.observe(mocks, { childList: true }); mocks.appendChild(notify); }); }); }); // test/cases/components/host/host.mjs init_global(); var expect15 = expect; use(chaiDom); var global14 = getGlobal(); describe("Host", function() { let host; let html117 = ` <monster-host id="host1"></monster-host> `; before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_host2(), host_exports)).then((m) => { host = m["Host"]; done(); }).catch((e) => done(e)); }); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; localStorage.removeItem("test-key"); }); it("should run", function(done) { let mocks = document.getElementById("mocks"); const formControl = document.createElement("monster-host"); mocks.appendChild(formControl); setTimeout(() => { try { expect15(document.getElementById("mocks")).contain.html('<monster-host data-monster-objectlink="Symbol(@schukai/monster/dom/custom-element@@options-updater-link)"></monster-host>'); } catch (e) { return done(e); } done(); }, 0); }); }); // test/cases/components/host/overlay.mjs init_global(); var expect16 = expect; use(chaiDom); var global15 = getGlobal(); describe("Overlay", function() { let host; let html117 = ` <monster-overlay id="details1"></monster-overlay> `; before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_overlay2(), overlay_exports)).then((m) => { host = m["Details"]; done(); }).catch((e) => done(e)); }); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should run", function(done) { let mocks = document.getElementById("mocks"); const formControl = document.createElement("monster-overlay"); mocks.appendChild(formControl); setTimeout(() => { try { expect16(document.getElementById("mocks")).contain.html( ' <monster-overlay data-monster-objectlink="Symbol(@schukai/monster/dom/custom-element@@options-updater-link)"></monster-overlay>' ); } catch (e) { return done(e); } done(); }, 0); }); }); // test/cases/components/host/util.mjs init_util2(); describe("generateUniqueConfigKey", () => { before(function(done) { initJSDOM().then(() => { done(); }); }); after(() => { }); it("should generate a unique key with the given parameters", () => { const componentName = "MyComponent"; const id = "123"; const prefix = "myPrefix"; const uniqueKey = generateUniqueConfigKey(componentName, id, prefix); expect(uniqueKey).to.include(prefix); expect(uniqueKey).to.include(componentName); expect(uniqueKey).to.include(id); expect(uniqueKey).to.match(/^[a-zA-Z0-9_]+$/); }); it("should replace special characters and spaces with underscores", () => { const componentName = "My$Component"; const id = "12#3"; const prefix = "my Prefix"; const uniqueKey = generateUniqueConfigKey(componentName, id, prefix); expect(uniqueKey).to.match(/^[a-zA-Z0-9_]+$/); }); it("should include the browser location without parameters", () => { const componentName = "MyComponent"; const id = "123"; const prefix = "myPrefix"; const uniqueKey = generateUniqueConfigKey(componentName, id, prefix); const urlWithoutParams = window.location.href.split("?")[0]; const sanitizedUrl = urlWithoutParams.replace(/[^\w\s]/gi, "_").replace(/\s+/g, "_"); expect(uniqueKey).to.include(sanitizedUrl); }); }); // test/cases/components/host/details.mjs init_global(); var expect17 = expect; use(chaiDom); var global16 = getGlobal(); describe("Details", function() { let host; let html117 = ` <monster-details id="details1"></monster-details> `; before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_details3(), details_exports)).then((m) => { host = m["Details"]; if (!global16.ResizeObserver) { global16.ResizeObserver = ResizeObserverMock; } done(); }).catch((e) => done(e)); }); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should run", function(done) { let mocks = document.getElementById("mocks"); const formControl = document.createElement("monster-details"); setTimeout(() => { try { expect17(document.getElementById("mocks")).contain.html( '<monster-details id="details1" data-monster-objectlink="Symbol(@schukai/monster/dom/custom-element@@options-updater-link)" data-monster-button-label="Details"></monster-details>' ); } catch (e) { return done(e); } done(); }, 0); }); }); // test/cases/text/formatter.mjs init_formatter(); describe("Formatter", function() { describe("change empty handling", function() { it("modification 1", function() { const formatter = new Formatter({ a: null, b: void 0, c: 0 }); expect(formatter.format("${a | tostring}")).to.be.equal("null"); expect(formatter.format("${b | tostring}")).to.be.equal("undefined"); expect(formatter.format("${c | tostring}")).to.be.equal("0"); }); }); describe("examples", function() { it("rfc example should run", function() { expect(new Formatter({ a: { b: { c: "Hello" }, d: "World", e: 1 } }).format("${a.b.c} ${a.d | toupper}!")).to.be.equal("Hello WORLD!"); }); it("doc example should run", function() { expect(new Formatter({ a: { b: { c: "Hello" }, d: "world" } }).format("${a.b.c} ${a.d | ucfirst}!")).to.be.equal("Hello World!"); }); }); describe("set marker()", function() { [ ["#a#", "#", void 0, "test"], ["{a}", "{", "}", "test"], ["i18n{a}", "i18n{", "}", "test"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); it("format " + a2 + " with marker " + b + " and " + c + " should return " + b, function() { expect( new Formatter({ a: "test" }).setMarker(b, c).format(a2) ).to.equal(d); }); }); }); describe("examples()", function() { [ ["${a | tojson}", '{"b":{"c":"Hello"},"d":"World","e":1}'], ["click ${a.d} times", "click World times"], [" ${a.b.c} ", " Hello "], [" ${a.b.c}", " Hello"], ["${a.b.c} ", "Hello "], ["${a.b.c}", "Hello"], ["${a.b.c}${a.b.c}", "HelloHello"], ["${a.b.c} ${a.b.c}", "Hello Hello"], ["${a.b.c} ${a.b.c} ", "Hello Hello "], [" ${a.b.c} ${a.b.c} ", " Hello Hello "], [" ${a.b.c} ${a.d} ", " Hello World "], [" ${a.b.c} ${a.b.c | toupper | length | tostring} ", " Hello 5 "] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("format " + a2 + " should return " + b, function() { let obj = { a: { b: { c: "Hello" }, d: "World", e: 1 } }; expect(new Formatter(obj).format(a2)).is.equal(b); }); }); }); describe("Marker in marker", function() { let text = "${mykey${subkey}}"; let expected = "1"; it("format " + text + " should " + expected, function() { let obj = { mykey2: "1", subkey: "2" }; expect(new Formatter(obj).format(text)).is.equal(expected); }); }); describe("setParameterChars()", function() { it("setParameterChars() should return Instance", function() { expect(new Formatter({}).setParameterChars("a", "b")).is.instanceof(Formatter); }); }); describe("with callbacks", function() { it("add callback", function() { const formatter = new Formatter({ x: "1" }, { callbacks: { my: (value) => { return "!" + value + "!"; } } }); expect(formatter.format("${x | call:my}")).is.equal("!1!"); }); }); describe("Marker in marker with parameter", function() { let text = "${mykey::mykey=${subkey}}"; let expected = "2"; it("format " + text + " should " + expected, function() { let obj = { subkey: "2" }; expect(new Formatter(obj).format(text)).is.equal(expected); }); }); describe("exceptions", function() { [ ["${a.b.x}", TypeError], ["${a.b.d | toupper | length}", TypeError], ["${a.b.d}", TypeError], // a.b.d return undefined by pathfinder ["${a.b.d | tolower}", TypeError], // a.b.d return undefined by pathfinder ["${a | }", Error] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("format " + a2 + " should throw " + typeof b, function() { expect( () => { new Formatter({ a: { b: { c: "test", d: 4 } } }).format(a2); } ).to.throw(b); }); }); }); describe("Formatter", () => { it("should format a basic string with object values", () => { const formatter = new Formatter({ name: "John", age: 30 }); const result = formatter.format("My name is ${name} and I am ${age | tostring} years old."); expect(result).to.equal("My name is John and I am 30 years old."); }); it("should format a string with nested markers", () => { const text = "${mykey${subkey}}"; const obj = { mykey2: "1", subkey: "2" }; const formatter = new Formatter(obj); expect(formatter.format(text)).to.equal("1"); }); it("should format a string with custom markers", () => { const formatter = new Formatter({ name: "John", age: 30 }); formatter.setMarker("[", "]"); const result = formatter.format("My name is [name] and I am [age | tostring] years old."); expect(result).to.equal("My name is John and I am 30 years old."); }); it("should format a string using callback", () => { const formatter = new Formatter({ x: "1" }, { callbacks: { quote: (value) => { return '"' + value + '"'; } } }); expect(formatter.format("${x | call:quote}")).to.equal('"1"'); }); it("should format a string with parameters", () => { const obj = { a: { b: { c: "Hello" }, d: "world" } }; const formatter = new Formatter(obj); const result = formatter.format("${a.b.c} ${a.d | ucfirst}!"); expect(result).to.equal("Hello World!"); }); it("should throw a too deep nesting error", () => { const formatter = new Formatter({ name: "John" }); const nestedText = "${name${name${name${name${name${name${name${name${name${name${name${name${name${name${name${name${name${name${name}}}}}}}}}}}}}}}}}}"; expect(() => formatter.format(nestedText)).to.throw("syntax error in formatter template"); }); it("should throw a too deep nesting error", () => { const inputObj = { mykey: "${mykey}" }; const formatter = new Formatter(inputObj); const text = "${mykey}"; let formattedText = text; for (let i = 0; i < 21; i++) { formattedText = "${" + formattedText + "}"; } expect(() => formatter.format(formattedText)).to.throw("too deep nesting"); }); }); }); // source/text/generate-range-comparison-expression.mjs function generateRangeComparisonExpression(expression, valueName, options2 = {}) { const { urlEncode = false, andOp = "&&", orOp = "||", eqOp = "==", geOp = ">=", leOp = "<=" } = options2; const ranges = expression.split(","); let comparison = ""; for (let i = 0; i < ranges.length; i++) { const range = ranges[i].trim(); if (range === "") { throw new Error(`Invalid range '${range}'`); } else if (range.includes("-")) { const [start2, end2] = range.split("-").map((s) => s === "" ? null : parseFloat(s)); if (start2 !== null && isNaN(start2) || end2 !== null && isNaN(end2)) { throw new Error(`Invalid value in range '${range}'`); } if (start2 !== null && end2 !== null && start2 > end2) { throw new Error(`Invalid range '${range}'`); } const compStart = start2 !== null ? `${valueName}${urlEncode ? encodeURIComponent(geOp) : geOp}${start2}` : ""; const compEnd = end2 !== null ? `${valueName}${urlEncode ? encodeURIComponent(leOp) : leOp}${end2}` : ""; const compRange = `${compStart}${compStart && compEnd ? ` ${andOp} ` : ""}${compEnd}`; comparison += ranges.length > 1 ? `(${compRange})` : compRange; } else { const value = parseFloat(range); if (isNaN(value)) { throw new Error(`Invalid value '${range}'`); } const compValue = `${valueName}${urlEncode ? encodeURIComponent(eqOp) : eqOp}${value}`; comparison += ranges.length > 1 ? `(${compValue})` : compValue; } if (i < ranges.length - 1) { comparison += ` ${orOp} `; } } return comparison; } // test/cases/text/util.mjs describe("generateRangeComparisonExpression", () => { it("should generate correct comparison expression for single values", () => { const expression = "1,3,5"; const valueName = "x"; const result = generateRangeComparisonExpression(expression, valueName); expect(result).to.equal("(x==1) || (x==3) || (x==5)"); }); it("should generate correct comparison expression for ranges", () => { const expression = "1-3,6-8"; const valueName = "x"; const result = generateRangeComparisonExpression(expression, valueName); expect(result).to.equal("(x>=1 && x<=3) || (x>=6 && x<=8)"); }); it("should generate correct comparison expression for mixed ranges and single values", () => { const expression = "1-3,5,7-9"; const valueName = "x"; const result = generateRangeComparisonExpression(expression, valueName); expect(result).to.equal("(x>=1 && x<=3) || (x==5) || (x>=7 && x<=9)"); }); it("should throw an error for invalid range", () => { const expression = "1-3,5-4"; const valueName = "x"; expect(() => generateRangeComparisonExpression(expression, valueName)).to.throw(`Invalid range '5-4'`); }); it("should throw an error for invalid value", () => { const expression = "1-3,a"; const valueName = "x"; expect(() => generateRangeComparisonExpression(expression, valueName)).to.throw("Invalid value"); }); it("should generate correct comparison expression with custom operators", () => { const expression = "1-3,5"; const valueName = "x"; const options2 = { andOp: "AND", orOp: "OR", eqOp: "===", geOp: ">=", leOp: "<=" }; const result = generateRangeComparisonExpression(expression, valueName, options2); expect(result).to.equal("(x>=1 AND x<=3) OR (x===5)"); }); it("should generate correct comparison expression with urlEncode option", () => { const testCases = [ { expression: "1,3,5", valueName: "x", expected: "(x%3D%3D1) || (x%3D%3D3) || (x%3D%3D5)" }, { expression: "-10", valueName: "x", expected: "x%3C%3D10" }, { expression: "10-", valueName: "x", expected: "x%3E%3D10" }, { expression: "1-3,6-8", valueName: "y", expected: "(y%3E%3D1 && y%3C%3D3) || (y%3E%3D6 && y%3C%3D8)" }, { expression: "1-3,5,7-9", valueName: "z", expected: "(z%3E%3D1 && z%3C%3D3) || (z%3D%3D5) || (z%3E%3D7 && z%3C%3D9)" } ]; testCases.forEach(({ expression, valueName, expected }) => { const result = generateRangeComparisonExpression(expression, valueName, { urlEncode: true }); expect(result).to.equal(expected); }); }); it("should generate correct comparison expression for open-ended ranges with urlEncode option", () => { const testCases = [ { expression: "10-", valueName: "x", expected: "x%3E%3D10" }, { expression: "-10", valueName: "y", expected: "y%3C%3D10" } ]; testCases.forEach(({ expression, valueName, expected }) => { const result = generateRangeComparisonExpression(expression, valueName, { urlEncode: true }); expect(result).to.equal(expected); }); }); }); // source/text/bracketed-key-value-hash.mjs function parseBracketedKeyValueHash(hashString) { const selectors = {}; const trimmedHashString = hashString.trim(); const cleanedHashString = trimmedHashString.charAt(0) === "#" ? trimmedHashString.slice(1) : trimmedHashString; let currentSelector = ""; function addToResult(key, value) { if (currentSelector && key) { if (!selectors[currentSelector]) { selectors[currentSelector] = {}; } selectors[currentSelector][key] = value; } } let currentKey = ""; let currentValue = ""; let inKey = true; let inValue = false; let inQuotedValue = false; let inSelector = true; let escaped = false; let quotedValueStartChar = ""; for (let i = 0; i < cleanedHashString.length; i++) { const c = cleanedHashString[i]; const nextChar = cleanedHashString?.[i + 1]; if (c === "\\" && !escaped) { escaped = true; continue; } if (escaped) { if (inSelector) { currentSelector += c; } else if (inKey) { currentKey += c; } else if (inValue) { currentValue += c; } escaped = false; continue; } if (inQuotedValue && quotedValueStartChar !== c) { if (inSelector) { currentSelector += c; } else if (inKey) { currentKey += c; } else if (inValue) { currentValue += c; } continue; } if (c === ";" && inSelector) { inSelector = true; currentSelector = ""; continue; } if (inSelector === true && c !== "(") { currentSelector += c; continue; } if (c === "(" && inSelector) { inSelector = false; inKey = true; currentKey = ""; continue; } if (inKey === true && c !== "=") { currentKey += c; continue; } if (c === "=" && inKey) { inKey = false; inValue = true; if (nextChar === '"' || nextChar === "'") { inQuotedValue = true; quotedValueStartChar = nextChar; i++; continue; } currentValue = ""; continue; } if (inValue === true) { if (inQuotedValue) { if (c === quotedValueStartChar) { inQuotedValue = false; continue; } currentValue += c; continue; } if (c === ",") { inValue = false; inKey = true; const decodedCurrentValue = decodeURIComponent(currentValue); addToResult(currentKey, decodedCurrentValue); currentKey = ""; currentValue = ""; continue; } if (c === ")") { inValue = false; inSelector = true; const decodedCurrentValue = decodeURIComponent(currentValue); addToResult(currentKey, decodedCurrentValue); currentKey = ""; currentValue = ""; currentSelector = ""; continue; } currentValue += c; continue; } } if (inSelector) { return selectors; } return {}; } function createBracketedKeyValueHash(object, addHashPrefix = true) { if (!object) { return addHashPrefix ? "#" : ""; } let hashString = ""; function encodeKeyValue(key, value) { return encodeURIComponent(key) + "=" + encodeURIComponent(value); } for (const selector in object) { if (object.hasOwnProperty(selector)) { const keyValuePairs = object[selector]; let selectorString = selector; let keyValueString = ""; for (const key in keyValuePairs) { if (keyValuePairs.hasOwnProperty(key)) { const value = keyValuePairs[key]; keyValueString += keyValueString.length === 0 ? "" : ","; keyValueString += encodeKeyValue(key, value); } } if (keyValueString.length > 0) { selectorString += "(" + keyValueString + ")"; hashString += hashString.length === 0 ? "" : ";"; hashString += selectorString; } } } return addHashPrefix ? "#" + hashString : hashString; } // test/cases/text/bracketed-key-value-hash.mjs describe("parseBracketedKeyValueHash", () => { it("should return an empty object for an empty string", () => { const input = ""; const expectedResult = {}; expect(parseBracketedKeyValueHash(input)).to.deep.equal(expectedResult); }); it("should parse a single selector with one key-value pair", () => { const input = "#selector1(key1=value1)"; const expectedResult = { selector1: { key1: "value1" } }; expect(parseBracketedKeyValueHash(input)).to.deep.equal(expectedResult); }); it("should parse multiple selectors with multiple key-value pairs", () => { const input = "#selector1(key1=value1,key2=value2);selector2(key3=value3,key4=value4)"; const expectedResult = { selector1: { key1: "value1", key2: "value2" }, selector2: { key3: "value3", key4: "value4" } }; expect(parseBracketedKeyValueHash(input)).to.deep.equal(expectedResult); }); it("should decode URL-encoded values", () => { const input = "#selector1(key1=value1%2Cwith%20comma)"; const expectedResult = { selector1: { key1: "value1,with comma" } }; const result = parseBracketedKeyValueHash(input); expect(result.selector1.key1).to.equal(expectedResult.selector1.key1); }); it("should handle input without a leading hash", () => { const input = "selector1(key1=value1)"; const expectedResult = { selector1: { key1: "value1" } }; expect(parseBracketedKeyValueHash(input)).to.deep.equal(expectedResult); }); it("should return an empty object for invalid input", () => { const input = "#selector1(key1=value1,key2"; const expectedResult = {}; expect(parseBracketedKeyValueHash(input)).to.deep.equal(expectedResult); }); it("should return an empty object for an empty input string", () => { const hashString = ""; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should return an empty object for an invalid input string", () => { const hashString = "#invalid"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should parse a simple input string with one selector and one key-value pair", () => { const hashString = "#selector(key=value)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key: "value" } }); }); it("should parse an input string with multiple selectors and key-value pairs", () => { const hashString = "#selector1(key1=value1);selector2(key2=value2)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector1: { key1: "value1" }, selector2: { key2: "value2" } }); }); it("should handle empty values", () => { const hashString = "#selector(key1=,key2=)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key1: "", key2: "" } }); }); it("should handle percent-encoded values", () => { const hashString = "#selector(key1=value%201,key2=value%2C2)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key1: "value 1", key2: "value,2" } }); }); it("should handle double-quoted values with commas", () => { const hashString = '#selector(key1="value,1",key2="value,2")'; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key1: "value,1", key2: "value,2" } }); }); it("should ignore leading hash symbol (#)", () => { const hashString = "selector(key=value)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key: "value" } }); }); it("should ignore leading and trailing white space", () => { const hashString = " #selector(key=value) "; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key: "value" } }); }); it("should return an empty object if the input string ends prematurely", () => { const hashString = "#selector(key=value"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should return an empty object if a selector is missing", () => { const hashString = "#(key=value)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should return an empty object if a key is missing", () => { const hashString = "#selector(=value)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should return an empty object ifa value is missing", () => { const hashString = "#selector(key=)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key: "" } }); }); it("should return an empty object if there is no closing parenthesis for a selector", () => { const hashString = "#selector(key=value;"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({}); }); it("should return an empty object if there is no semicolon after a selector", () => { const hashString = "#selector(key=value)selector2(key2=value2)"; const result = parseBracketedKeyValueHash(hashString); expect(result).to.deep.equal({ selector: { key: "value" }, selector2: { key2: "value2" } }); }); describe("createBracketedKeyValueHash", () => { it("should return an hash string for a simple object", () => { const input = { ".example": { "color": "red", "font-size": "14px" }, ".other": { "background": "blue" } }; const result = createBracketedKeyValueHash(input); expect(result).to.deep.equal("#.example(color=red,font-size=14px);.other(background=blue)"); }); it("should return a url-encoded hash string for a simple object", () => { const input = { ".example": { "color": 'r"ed', "font-size": "14px" }, ".other": { "background": "blue" } }; const result = createBracketedKeyValueHash(input, true); expect(result).to.deep.equal("#.example(color=r%22ed,font-size=14px);.other(background=blue)"); }); it("should return an empty string for an empty object", () => { const input = {}; const result = createBracketedKeyValueHash(input, false); expect(result).to.deep.equal(""); }); it("should return an empty string for an empty object", () => { const input = {}; const result = createBracketedKeyValueHash(input, false); expect(result).to.deep.equal(""); }); }); }); // test/cases/math/random.mjs describe("Math", function() { let random2 = () => { }; before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } promises.push(Promise.resolve().then(() => (init_random(), random_exports)).then((m) => { random2 = m.random; return true; })); Promise.all(promises).then(() => { done(); }); }); describe(".random()", function() { it("a greater b should throw error ", function() { expect(() => random2(10, 2)).to.throw(Error); }); it(" should return a number ", function() { let r = random2(); expect(r).that.is.a("number"); }); it(" should return a number ", function() { expect(() => random2(5, 6)).to.throw(Error); }); it(" should throw Error we cannot generate numbers larger than 53 bits.", function() { expect(() => random2(-999999999, 1e20)).to.throw(Error); }); it(" should throw Error we cannot generate numbers larger than 53 bits.", function() { [ [1, 100], [500, 600], [100, 1e3] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let r = random2(a2, b); it(r + " should return value between " + a2 + " " + b, function() { expect(r >= a2).to.be.true; expect(r <= b).to.be.true; }); }); [ [1, 100], [500, 600], [100, 1e3] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let sum = 0; const rounds = 500; for (let i = 0, max3 = rounds; i < max3; i++) { sum += random2(a2, b); } let avg = sum / rounds; it(avg + " should between " + a2 + " " + b, function() { expect(avg > a2).to.be.true; expect(avg < b).to.be.true; }); }); }); }); }); // test/cases/util/trimspaces.mjs init_trimspaces(); describe("trimSpaces", function() { [ // one stroke is escped by the javascript interpreter, the second stroke escapes the stroke [" value ", "value"], [" value\\ ", "value\\ "], ["\\ value\\ ", "\\ value\\ "], [" value ", "value"], [" value ", "value"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("trimSpaces(" + JSON.stringify(a2) + ") should return " + JSON.stringify(b), function() { expect(trimSpaces(a2)).to.be.equal(b); }); }); }); // test/cases/util/processing.mjs init_processing(); describe("Processing", function() { describe("run instance", function() { it("should run many function", function(done) { let counter = 0; let t = +/* @__PURE__ */ new Date(); const desiredDelay = 200; this.timeout(desiredDelay + 100); new Processing((v) => { counter++; return v; }, (v) => { counter++; return v; }, function(v) { counter++; return v; }, desiredDelay, function(v) { counter++; return v; }).run("test").then((v) => { try { expect(counter).to.be.equal(4); expect(v === "test").to.be.true; expect(+/* @__PURE__ */ new Date() > t + desiredDelay + 1).to.be.true; } catch (e) { return done(e); } done(); }); }); it("should run one function", function(done) { let counter = 0; new Processing((value) => { counter++; return value; }).run("test").then((v) => { try { expect(v === "test").to.be.true; } catch (e) { return done(e); } done(); }).catch((e) => done(e)); }); it("should run no function", function(done) { let counter = 0; new Processing().run("test").then((v) => { try { expect(v === "test").to.be.true; } catch (e) { return done(e); } done(); }).catch((e) => done(e)); }); }); describe("create new instance", function() { it("should return a Processing object", function() { expect(new Processing()).to.be.a("object"); }); it("should return a Processing object", function() { expect(new Processing(function() { })).to.be.a("object"); }); it("should throw TypeError", function() { expect(() => new Processing(true)).to.throw(TypeError); }); it("should throw TypeError", function() { expect(() => new Processing("test")).to.throw(TypeError); }); }); }); // test/cases/util/deadmansswitch.mjs init_deadmansswitch(); describe("DeadMansSwitch", function() { describe("run instance", function() { it("should run", function(done) { const ms1 = Date.now(); new DeadMansSwitch(100, () => { const ms2 = Date.now(); const diff2 = ms2 - ms1; if (diff2 < 100) { done("to short " + diff2); return; } done(); }); }); }); describe("run instance and touch", function() { it("should run", function(done) { const ms1 = Date.now(); const deadmansswitch = new DeadMansSwitch(100, () => { const ms2 = Date.now(); const diff2 = ms2 - ms1; if (ms1 > ms2) { done(new Error("timing error")); return; } if (diff2 < 600) { done(new Error("to short " + diff2)); return; } done(); }); setTimeout(() => { deadmansswitch.touch(); setTimeout(() => { deadmansswitch.touch(500); }, 50); }, 50); }); }); }); // source/util/comparator.mjs init_base(); init_is(); var Comparator = class extends Base { /** * create new comparator * * @param {Monster.Util~exampleCallback} [callback] Comparator callback * @throw {TypeError} unsupported type * @throw {TypeError} impractical comparison */ constructor(callback) { super(); if (isFunction(callback)) { this.compare = callback; } else if (callback !== void 0) { throw new TypeError("unsupported type"); } else { this.compare = function(a2, b) { if (typeof a2 !== typeof b) { throw new TypeError("impractical comparison", "types/comparator.mjs"); } if (a2 === b) { return 0; } return a2 < b ? -1 : 1; }; } } /** * changes the order of the operators * * @return {Comparator} */ reverse() { const original = this.compare; this.compare = (a2, b) => original(b, a2); return this; } /** * Checks if two variables are equal. * * @param {*} a * @param {*} b * * @return {boolean} */ equal(a2, b) { return this.compare(a2, b) === 0; } /** * Checks if variable `a` is greater than `b` * * @param {*} a * @param {*} b * * @return {boolean} */ greaterThan(a2, b) { return this.compare(a2, b) > 0; } /** * Checks if variable `a` is greater than or equal to `b` * * @param {*} a * @param {*} b * * @return {boolean} */ greaterThanOrEqual(a2, b) { return this.greaterThan(a2, b) || this.equal(a2, b); } /** * Checks if variable `a` is less than or equal to `b` * * @param {*} a * @param {*} b * * @return {boolean} */ lessThanOrEqual(a2, b) { return this.lessThan(a2, b) || this.equal(a2, b); } /** * Checks if variable a is less than b * * @param {*} a * @param {*} b * * @return {boolean} */ lessThan(a2, b) { return this.compare(a2, b) < 0; } }; // test/cases/util/comparator.mjs describe("Comparator", function() { describe("create new instance", function() { it("should return a comparator object", function() { expect(new Comparator()).to.be.a("object"); }); it("should return a comparator object", function() { expect(new Comparator(function() { })).to.be.a("object"); }); it("should throw TypeError", function() { expect(() => new Comparator(true)).to.throw(TypeError); }); it("should throw TypeError", function() { expect(() => new Comparator("test")).to.throw(TypeError); }); }); describe("equal()", function() { [ ["test1", "test", false], [5.1, 5, false], [5.1, 5.1, true], [true, true, true], [false, true, false], [false, false, true], [-4, -4, true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().equal(a2, b)).is.equal(c); }); }); }); describe("equal()", function() { [ ["test1", true], ["test1", 5], ["test1", null], ["test1", parseInt("a")], [false, 5], [void 0, null] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("should compare " + a2 + " and " + b + " throw TypeError", function() { expect(() => new Comparator().equal(a2, b)).to.throw(TypeError); }); }); }); describe("greaterThan()", function() { [ ["test1", "test", true], [5.1, 5, true], [5.1, 5.1, false], [true, true, false], [false, true, false], [false, false, false], [-4, -4, false], [-4, 4, false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().greaterThan(a2, b)).is.equal(c); }); }); }); describe("reverse().greaterThan()", function() { [ ["test1", "test", true], [5.1, 5, true], [5.1, 5.1, false], [true, true, false], [false, true, false], [false, false, false], [-4, -4, false], [-4, 4, false] ].forEach(function(data) { let b = data.shift(); let a2 = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().reverse().greaterThan(a2, b)).is.equal(c); }); }); }); describe("greaterThanOrEqual()", function() { [ ["test1", "test", true], [5.1, 5, true], [5.1, 5.1, true], [true, true, true], [false, true, false], [false, false, true], [-4, -4, true], [-4, 4, false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().greaterThanOrEqual(a2, b)).is.equal(c); }); }); }); describe("lessThan()", function() { [ ["test1", "test", true], [5.1, 5, true], [5.1, 5.1, false], [true, true, false], [false, true, false], [false, false, false], [-4, -4, false], [-4, 4, false] ].forEach(function(data) { let b = data.shift(); let a2 = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().lessThan(a2, b)).is.equal(c); }); }); }); describe("documentations", function() { it("should run ...", function() { expect(new Comparator().lessThanOrEqual(2, 5)).to.be.true; expect(new Comparator().greaterThan(4, 2)).to.be.true; expect(new Comparator().equal(4, 4)).to.be.true; expect(new Comparator().equal(4, 5)).to.be.false; }); it("should run with own function ...", function() { expect(new Comparator(function(a2, b) { if (a2.v === b.v) return 0; return a2.v < b.v ? -1 : 1; }).equal({ v: 2 }, { v: 2 })).to.be.true; }); }); describe("lessThanOrEqual()", function() { [ ["test1", "test", true], [5.1, 5, true], [5.1, 5.1, true], [true, true, true], [false, true, false], [false, false, true], [-4, -4, true], [-4, 4, false] ].forEach(function(data) { let b = data.shift(); let a2 = data.shift(); let c = data.shift(); it("should compare " + a2 + " and " + b + " return " + c, function() { expect(new Comparator().lessThanOrEqual(a2, b)).is.equal(c); }); }); }); }); // source/util/freeze.mjs init_validate(); function deepFreeze(object) { validateObject(object); let propNames = Object.getOwnPropertyNames(object); for (const name of propNames) { const value = object[name]; object[name] = value && typeof value === "object" ? deepFreeze(value) : value; } return Object.freeze(object); } // test/cases/util/freeze.mjs describe("deepFreeze", function() { describe("deepFreeze an object", function() { it("should freeze object", function() { let obj1 = { a: { b: { c: 1 } } }; let obj2 = { a: { b: { c: 2 } } }; expect(obj2).to.not.eql(obj1); obj1.a.b.c = 2; expect(obj2).to.eql(obj1); const obj1Freezed = deepFreeze(obj1); expect(obj2).to.eql(obj1Freezed); try { obj1Freezed.a.b.c = 3; } catch (_) { } expect(obj2).to.eql(obj1Freezed); }); }); }); // test/cases/util/clone.mjs init_clone(); describe("Clone", function() { class A { constructor(b) { this.b = b; } a() { } } class B { constructor(b) { this.b = b; } a() { } getClone() { return "DONE"; } } describe(".clone(B) with getClone", function() { it(".clone(B) should object", function() { let b = new B({ x: { y: 1, d: new A(1), z: () => { } } }); let r = clone(b); expect(b).to.be.instanceOf(B); expect(r).not.equal(b); expect(JSON.stringify(r)).equal(JSON.stringify("DONE")); }); }); describe(".clone(A)", function() { it(".clone(A) should object", function() { let a2 = new A({ x: { y: 1, d: new A(1), z: () => { } } }); let b = clone(a2); expect(a2).to.be.instanceOf(A); expect(b).to.be.instanceOf(A); expect(b).not.equal(a2); expect(JSON.stringify(a2)).equal(JSON.stringify(b)); }); }); if (typeof DocumentFragment === "object") { describe(".clone(DocumentFragment)", function() { it(".clone(DocumentFragment) should same DocumentFragment", function() { let a2 = document.createDocumentFragment(); let b = clone(a2); expect(b).equal(a2); }); }); } describe(".clone(null)", function() { it(".clone(null) should null", function() { let a2 = null; let b = clone(a2); expect(b).equal(a2); expect(b).to.be.null; expect(a2).to.be.null; }); }); describe(".clone(undefined)", function() { it(".clone(undefined) should undefined", function() { let a2 = void 0; let b = clone(a2); expect(a2 === b).to.be.true; expect(typeof b === "undefined").to.be.true; expect(a2 === void 0).to.be.true; expect(b === void 0).to.be.true; }); }); describe(".clone(object)", function() { it(".clone({}) should object", function() { let a2 = {}; let b = clone(a2); expect(typeof b === "object").to.be.true; }); it(".clone({x:1}) should object", function() { let a2 = { x: 1 }; let b = clone(a2); expect(a2.x).is.equal(b.x); }); }); describe(".clone(function)", function() { it(".clone(function) should function", function() { let a2 = () => { }; let b = clone(a2); expect(typeof b === "function").to.be.true; }); }); describe(".clone()", function() { [ ["test1", "string"], [void 0, "undefined"], [null, "object"], // typeof null results in 'object'. https://2ality.com/2013/10/typeof-null.html [() => { }, "function"], [2, "number"], [false, "boolean"], [true, "boolean"], [4.5, "number"], [{}, "object"], [[1, 2, 3], "object"], // array ist auch type object [Symbol("foo"), "symbol"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".clone(" + JSON.stringify(a2) + ") should " + b + " ", function() { let c = clone(a2); expect(typeof c).is.equal(b); }); }); }); }); // source/logging/handler/console.mjs init_global(); // source/logging/handler.mjs init_base(); init_validate(); // source/logging/logentry.mjs init_base(); init_validate(); var LogEntry = class extends Base { /** * * @param {Integer} loglevel * @param {...*} args */ constructor(loglevel, ...args) { super(); validateInteger(loglevel); this.loglevel = loglevel; this.arguments = args; } /** * * @return {integerr} */ getLogLevel() { return this.loglevel; } /** * * @return {array} */ getArguments() { return this.arguments; } }; // source/logging/logger.mjs init_base(); init_validate(); var ALL = 255; var TRACE = 64; var DEBUG = 32; var INFO = 16; var WARN = 8; var ERROR = 4; var FATAL = 2; var OFF = 0; var Logger = class extends Base { /** * */ constructor() { super(); this.handler = /* @__PURE__ */ new Set(); } /** * * @param {Handler} handler * @return {Logger} * @throws {Error} the handler must be an instance of Handler */ addHandler(handler) { validateObject(handler); if (!(handler instanceof Handler)) { throw new Error("the handler must be an instance of Handler"); } this.handler.add(handler); return this; } /** * * @param {Handler} handler * @return {Logger} * @throws {Error} the handler must be an instance of Handler */ removeHandler(handler) { validateObject(handler); if (!(handler instanceof Handler)) { throw new Error("the handler must be an instance of Handler"); } this.handler.delete(handler); return this; } /** * log Trace message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logTrace(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [TRACE, ...args]); return this; } /** * log Debug message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logDebug(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [DEBUG, ...args]); return this; } /** * log Info message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logInfo(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [INFO, ...args]); return this; } /** * log Warn message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logWarn(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [WARN, ...args]); return this; } /** * log Error message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logError(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [ERROR, ...args]); return this; } /** * log Fatal message * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {*} arguments * @return {Logger} * @since 1.5.0 */ logFatal(...args) { if (typeof args !== "object" || args[0] === null) { throw new Error("the first argument must be an object"); } triggerLog.apply(this, [FATAL, ...args]); return this; } /** * Labels * * @param {integer} level * @return {string} */ getLabel(level) { validateInteger(level); if (level === ALL) return "ALL"; if (level === TRACE) return "TRACE"; if (level === DEBUG) return "DEBUG"; if (level === INFO) return "INFO"; if (level === WARN) return "WARN"; if (level === ERROR) return "ERROR"; if (level === FATAL) return "FATAL"; if (level === OFF) return "OFF"; return "unknown"; } /** * Level * * @param {string} label * @return {integer} */ getLevel(label) { validateString(label); if (label === "ALL") return ALL; if (label === "TRACE") return TRACE; if (label === "DEBUG") return DEBUG; if (label === "INFO") return INFO; if (label === "WARN") return WARN; if (label === "ERROR") return ERROR; if (label === "FATAL") return FATAL; if (label === "OFF") return OFF; return 0; } }; function triggerLog(loglevel, ...args) { for (const handler of this.handler) { handler.log(new LogEntry(loglevel, args)); } return this; } // source/logging/handler.mjs var Handler = class extends Base { constructor() { super(); this.loglevel = OFF; } /** * This is the central log function. this method must be * overwritten by derived handlers with their own logic. * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {LogEntry} entry * @return {boolean} */ log(entry) { validateInstance(entry, LogEntry); if (this.loglevel < entry.getLogLevel()) { return false; } return true; } /** * set loglevel * * @param {integer} loglevel * @return {Handler} * @since 1.5.0 */ setLogLevel(loglevel) { validateInteger(loglevel); this.loglevel = loglevel; return this; } /** * get loglevel * * @return {integer} * @since 1.5.0 */ getLogLevel() { return this.loglevel; } /** * Set log level to All * * @return {Handler} * @since 1.5.0 */ setAll() { this.setLogLevel(ALL); return this; } /** * Set log level to Trace * * @return {Handler} * @since 1.5.0 */ setTrace() { this.setLogLevel(TRACE); return this; } /** * Set log level to Debug * * @return {Handler} * @since 1.5.0 */ setDebug() { this.setLogLevel(DEBUG); return this; } /** * Set log level to Info * * @return {Handler} * @since 1.5.0 */ setInfo() { this.setLogLevel(INFO); return this; } /** * Set log level to Warn * * @return {undefined} * @since 1.5.0 */ setWarn() { this.setLogLevel(WARN); return this; } /** * Set log level to Error * * @return {Handler} * @since 1.5.0 */ setError() { this.setLogLevel(ERROR); return this; } /** * Set log level to Fatal * * @return {Handler} * @since 1.5.0 */ setFatal() { this.setLogLevel(FATAL); return this; } /** * Set log level to Off * * @return {Handler} * @since 1.5.0 */ setOff() { this.setLogLevel(OFF); return this; } }; // source/logging/handler/console.mjs var ConsoleHandler = class extends Handler { /** * This is the central log function. this method must be * overwritten by derived handlers with their own logic. * * ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; * * @param {LogEntry} entry * @return {boolean} */ log(entry) { if (super.log(entry)) { const console2 = getGlobalObject("console"); if (!console2) return false; if (!console2.error) console2.error = console2.log; if (!console2.warn) console2.warn = console2.log; switch (entry.getLogLevel()) { case TRACE: case DEBUG: case INFO: console2.log(entry.toString()); break; case FATAL: case ERROR: console2.error(entry.toString()); break; case WARN: console2.warn(entry.toString()); break; default: console2.log(entry.toString()); break; } return true; } return false; } }; // test/cases/logging/handler/console.mjs describe("Logging", function() { describe("ConsoleHandler", function() { it("should create ConsoleHandler", function() { expect(new ConsoleHandler()).to.be.instanceof(ConsoleHandler); }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(FATAL, [1, true, "fatal"]))).to.be.true; }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(TRACE, [1, true, "trace"]))).to.be.true; }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(WARN, [1, true, "warn"]))).to.be.true; }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(DEBUG, [1, true, "debug"]))).to.be.true; }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(ERROR, [1, true, "error"]))).to.be.true; }); it("should log to console", function() { expect(new ConsoleHandler().setAll().log(new LogEntry(INFO, [1, true, "info"]))).to.be.true; }); }); }); // test/cases/logging/logger.mjs describe("Logging", function() { describe("new Logger", function() { it("should return instanceof Logger", function() { expect(new Logger()).to.instanceOf(Logger); }); }); describe("Logger.logTrace()", function() { it("should return instanceof Logger", function() { expect(new Logger().logTrace("test")).to.instanceOf(Logger); }); }); describe("Logger.logDebug()", function() { it("should return instanceof Logger", function() { expect(new Logger().logDebug("test")).to.instanceOf(Logger); }); }); describe("Logger.logInfo()", function() { it("should return instanceof Logger", function() { expect(new Logger().logInfo("test")).to.instanceOf(Logger); }); }); describe("Logger.logWarn()", function() { it("should return instanceof Logger", function() { expect(new Logger().logWarn("test")).to.instanceOf(Logger); }); }); describe("Logger.logError()", function() { it("should return instanceof Logger", function() { expect(new Logger().logError("test")).to.instanceOf(Logger); }); }); describe("Logger.logFatal()", function() { it("should return instanceof Logger", function() { expect(new Logger().logFatal("test")).to.instanceOf(Logger); }); }); describe("Logger.getLevel()", function() { [ ["ALL", ALL], ["TRACE", TRACE], ["DEBUG", DEBUG], ["INFO", INFO], ["WARN", WARN], ["ERROR", ERROR], ["FATAL", FATAL], ["OFF", OFF] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(a2 + " should return " + b, function() { expect(new Logger().getLevel(a2)).to.be.equals(b); }); }); }); describe("Logger.getLabel()", function() { [ ["ALL", ALL], ["TRACE", TRACE], ["DEBUG", DEBUG], ["INFO", INFO], ["WARN", WARN], ["ERROR", ERROR], ["FATAL", FATAL], ["OFF", OFF] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(a2 + " should return " + b, function() { expect(new Logger().getLabel(b)).to.be.equals(a2); }); }); }); }); // test/cases/logging/handler.mjs describe("Logging", function() { describe("Handler.setLogLevel().getLogLevel()", function() { [ [ALL], [TRACE], [DEBUG], [INFO], [WARN], [ERROR], [FATAL], [OFF] ].forEach(function(data) { let a2 = data.shift(); it("the function should return the set value " + a2, function() { expect(new Handler().setLogLevel(a2).getLogLevel()).to.be.equal(a2); }); }); }); describe("Handler.log()", function() { it("should return instanceof Handler", function() { expect(new Handler().log(new LogEntry(0, "test"))).to.be.true; }); }); describe("Handler.log()", function() { let handler; class TestHandler extends Handler { log(entry) { super.log(entry); } } beforeEach(function() { let handler2 = new TestHandler(); }); it("should return instanceof Handler", function() { expect(new Handler().log(new LogEntry(0, "test"))).to.be.true; }); }); describe(".log() with loglevel", function() { let TestHandler; before(() => { TestHandler = class extends Handler { constructor() { super(); this.calls = 0; } log(loglevel) { if (super.log(loglevel) === true) { this.calls++; return true; } return false; } }; }); [ // ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF (ALL = 0xff;OFF = 0x00; [ALL, 6], [TRACE, 6], [DEBUG, 5], [INFO, 4], [WARN, 3], [ERROR, 2], [FATAL, 1], [OFF, 0] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.log(" + a2 + ") should log " + b, function() { let handler = new TestHandler().setLogLevel(a2); handler.log(new LogEntry(TRACE)); handler.log(new LogEntry(DEBUG)); handler.log(new LogEntry(INFO)); handler.log(new LogEntry(WARN)); handler.log(new LogEntry(ERROR)); handler.log(new LogEntry(FATAL)); expect(handler.calls).is.equal(b); }); }); }); describe("Handler.setLogLevel()", function() { it("should return instanceof Handler", function() { expect(new Handler().setLogLevel(ALL)).to.instanceOf(Handler); }); }); describe("Handler.getLogLevel()", function() { it("new logger should be 0", function() { expect(new Handler().getLogLevel()).to.be.equal(OFF); }); }); describe("Handler.setAll()", function() { it(" should instanceof Handler", function() { expect(new Handler().setAll()).to.instanceOf(Handler); }); }); describe("Handler.setTrace()", function() { it("new logger should instanceof Handler", function() { expect(new Handler().setTrace()).to.instanceOf(Handler); }); }); describe("Handler.setDebug()", function() { it(" should instanceof Handler", function() { expect(new Handler().setDebug()).to.instanceOf(Handler); }); }); describe("Handler.setInfo()", function() { it("should return instanceof Handler", function() { expect(new Handler().setInfo()).to.instanceOf(Handler); }); }); describe("Handler.setWarn()", function() { it(" should instanceof Handler", function() { expect(new Handler().setWarn()).to.instanceOf(Handler); }); }); describe("Handler.setError()", function() { it("should return instanceof Handler", function() { expect(new Handler().setError()).to.instanceOf(Handler); }); }); describe("Handler.setFatal()", function() { it("should return instanceof Handler", function() { expect(new Handler().setFatal()).to.instanceOf(Handler); }); }); describe("Handler.setOff()", function() { it("should return instanceof Handler", function() { expect(new Handler().setOff()).to.instanceOf(Handler); }); }); }); // test/cases/logging/logentry.mjs describe("Log", function() { describe("new Log", function() { it("should return instanceof Log", function() { expect(new LogEntry(1, "a", "b", "c")).to.instanceOf(LogEntry); }); }); describe("Log.loglevel", function() { let log; beforeEach(function() { log = new LogEntry(1, false, "test", 99, { a: true }); }); it("should return loglevel 1", function() { expect(log.getLogLevel()).to.be.equal(1); }); it("should return arguments", function() { expect(log.getArguments()).to.have.deep.members([false, "test", 99, { a: true }]); }); }); }); // source/net/webconnect.mjs init_constants(); init_is(); init_basewithoptions(); // source/types/observablequeue.mjs init_queue(); init_constants(); init_observerlist(); var ObservableQueue = class extends Queue { /** * */ constructor() { super(); this[internalSymbol] = { observers: new ObserverList() }; } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/observablequeue"); } /** * Add a new element to the end of the queue. * * @param {*} value * @return {Queue} */ add(value) { super.add(value); this.notifyObservers(); return this; } /** * remove all entries * * @return {Queue} */ clear() { super.clear(); this.notifyObservers(); return this; } /** * Attach a new observer * * @param {Observer} observer * @return {ProxyObserver} */ attachObserver(observer) { this[internalSymbol].observers.attach(observer); return this; } /** * Detach a observer * * @param {Observer} observer * @return {ProxyObserver} */ detachObserver(observer) { this[internalSymbol].observers.detach(observer); return this; } /** * Notify all observer * * @return {Promise} */ notifyObservers() { return this[internalSymbol].observers.notify(this); } /** * @param {Observer} observer * @return {boolean} */ containsObserver(observer) { return this[internalSymbol].observers.contains(observer); } }; // source/net/webconnect/message.mjs init_base(); init_validate(); var dataSymbol = Symbol("@@data"); var Message3 = class _Message extends Base { /** * @param {Object} data * @throws {TypeError} value is not a object */ constructor(data) { super(); this[dataSymbol] = validateObject(data); } /** * Returns the raw message. * * @return {object} */ getData() { return this[dataSymbol]; } /** * @return {*} */ toJSON() { return this[dataSymbol]; } /** * @param {string} json * @return {Message} * @throws {TypeError} value is not a string */ static fromJSON(json) { validateString(json); return new _Message(JSON.parse(json)); } }; // source/net/webconnect.mjs init_global(); var receiveQueueSymbol = Symbol("receiveQueue"); var sendQueueSymbol = Symbol("sendQueue"); var connectionSymbol = Symbol("connection"); var manualCloseSymbol = Symbol("manualClose"); function connectServer(resolve, reject) { const self2 = this; const url = self2.getOption("url"); if (!url) { reject("No url defined for web connect."); return; } let promiseAllredyResolved = false; let connectionTimeout = self2.getOption("connection.timeout"); if (!isInteger(connectionTimeout) || connectionTimeout < 100) { connectionTimeout = 5e3; } setTimeout(() => { if (promiseAllredyResolved) { return; } reject(new Error("Connection timeout")); }, connectionTimeout); let reconnectTimeout = self2.getOption("connection.reconnect.timeout"); if (!isInteger(reconnectTimeout) || reconnectTimeout < 1e3) reconnectTimeout = 1e3; let reconnectAttempts = self2.getOption("connection.reconnect.attempts"); if (!isInteger(reconnectAttempts) || reconnectAttempts < 1) reconnectAttempts = 1; let reconnectEnabled = self2.getOption("connection.reconnect.enabled"); if (reconnectEnabled !== true) reconnectEnabled = false; self2[manualCloseSymbol] = false; self2[connectionSymbol].reconnectCounter++; if (self2[connectionSymbol].socket && self2[connectionSymbol].socket.readyState < 2) { self2[connectionSymbol].socket.close(); } self2[connectionSymbol].socket = null; const WebSocket = getGlobalFunction("WebSocket"); if (!WebSocket) { reject(new Error("WebSocket is not available")); return; } self2[connectionSymbol].socket = new WebSocket(url); self2[connectionSymbol].socket.onmessage = function(event) { if (event.data instanceof Blob) { const reader = new FileReader(); reader.addEventListener("loadend", function() { self2[receiveQueueSymbol].add(new Message3(reader.result)); }); reader.readAsText(new Message3(event.data)); } else { self2[receiveQueueSymbol].add(Message3.fromJSON(event.data)); } }; self2[connectionSymbol].socket.onopen = function() { self2[connectionSymbol].reconnectCounter = 0; if (typeof resolve === "function" && !promiseAllredyResolved) { promiseAllredyResolved = true; resolve(); } }; self2[connectionSymbol].socket.close = function(event) { if (self2[manualCloseSymbol]) { self2[manualCloseSymbol] = false; return; } if (reconnectEnabled && this[connectionSymbol].reconnectCounter < reconnectAttempts) { setTimeout(() => { self2.connect(); }, reconnectTimeout * this[connectionSymbol].reconnectCounter); } }; self2[connectionSymbol].socket.onerror = (error) => { if (reconnectEnabled && self2[connectionSymbol].reconnectCounter < reconnectAttempts) { setTimeout(() => { self2.connect(); }, reconnectTimeout * this[connectionSymbol].reconnectCounter); } else { if (typeof reject === "function" && !promiseAllredyResolved) { promiseAllredyResolved = true; reject(error); } } }; } var WebConnect = class extends BaseWithOptions { /** * * @param {Object} [options] options contains definitions for the webconnect. */ constructor(options2) { if (isString(options2)) { options2 = { url: options2 }; } super(options2); this[receiveQueueSymbol] = new ObservableQueue(); this[sendQueueSymbol] = new ObservableQueue(); this[connectionSymbol] = {}; this[connectionSymbol].socket = null; this[connectionSymbol].reconnectCounter = 0; this[manualCloseSymbol] = false; } /** * * @return {Promise} */ connect() { return new Promise((resolve, reject) => { connectServer.call(this, resolve, reject); }); } /** * @return {boolean} */ isConnected() { return this[connectionSymbol]?.socket?.readyState === 1; } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/net/webconnect"); } /** * @property {string} url=undefined Defines the resource that you wish to fetch. * @property {Object} connection * @property {Object} connection.timeout=5000 Defines the timeout for the connection. * @property {Number} connection.reconnect.timeout The timeout in milliseconds for the reconnect. * @property {Number} connection.reconnect.attempts The maximum number of reconnects. * @property {Bool} connection.reconnect.enabled If the reconnect is enabled. */ get defaults() { return Object.assign({}, super.defaults, { url: void 0, connection: { timeout: 5e3, reconnect: { timeout: 1e3, attempts: 1, enabled: false } } }); } /** * This method closes the connection. * * @param {Number} [code=1000] The close code. * @param {String} [reason=""] The close reason. * @return {Promise} * @see https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1 */ close(statusCode, reason) { if (!isInteger(statusCode) || statusCode < 1e3 || statusCode > 4999) { statusCode = 1e3; } if (!isString(reason)) { reason = ""; } return new Promise((resolve, reject) => { try { this[manualCloseSymbol] = true; if (this[connectionSymbol].socket) { this[connectionSymbol].socket.close(statusCode, reason); } } catch (error) { reject(error); } resolve(); }); } /** * Polls the receive queue for new messages. * * @return {Message} */ poll() { return this[receiveQueueSymbol].poll(); } /** * Are there any messages in the receive queue? * * @return {boolean} */ dataReceived() { return !this[receiveQueueSymbol].isEmpty(); } /** * Get Message from the receive queue, but do not remove it. * * @return {Object} */ peek() { return this[receiveQueueSymbol].peek(); } /** * Attach a new observer * * @param {Observer} observer * @return {ProxyObserver} */ attachObserver(observer) { this[receiveQueueSymbol].attachObserver(observer); return this; } /** * Detach a observer * * @param {Observer} observer * @return {ProxyObserver} */ detachObserver(observer) { this[receiveQueueSymbol].detachObserver(observer); return this; } /** * @param {Observer} observer * @return {boolean} */ containsObserver(observer) { return this[receiveQueueSymbol].containsObserver(observer); } /** * @param {Message|Object} message * @return {Promise} */ send(message) { return new Promise((resolve, reject) => { if (this[connectionSymbol].socket.readyState !== 1) { reject("the socket is not ready"); } this[connectionSymbol].socket.send(JSON.stringify(message)); resolve(); }); } }; // test/cases/net/webconnect.mjs init_observer(); // test/util/websocket.mjs init_global(); function initWebSocket() { const isNode3 = typeof global === "object" && "[object global]" === global.toString.call(global); if (!isNode3) { return Promise.resolve(); } return import("ws").then((ws) => { getGlobal().WebSocket = class extends ws["WebSocket"] { constructor(url, protocols) { super(url, protocols, { handshakeTimeout: 1e3, maxPayload: 1024 * 1024 * 1024 }); } }; }); } // test/cases/net/webconnect.mjs var testUrl = "wss://ws.postman-echo.com/raw"; describe("Websocket", function() { let ds = void 0; before(function(done) { initWebSocket().then(() => { done(); }).catch((e) => { done(e); }); }); afterEach(function(done) { if (ds) { ds.close(); } for (const sym of Object.getOwnPropertySymbols(ds)) { if (sym.toString() === "Symbol(connection)") { if (typeof ds[sym]?.socket?.terminate === "function") { ds[sym]?.socket?.["terminate"](); } } } done(); }); it("should transform data", function(done) { ds = new WebConnect({ url: testUrl }); ds.connect().then(() => { ds.attachObserver(new Observer(() => { done(); })); ds.send({ data: { message: "Hello World" } }); }).catch((e) => { done(e); }); }); it("should connect", function(done) { ds = new WebConnect({ url: testUrl, reconnect: { enabled: false } }); ds.connect().then(() => { done(); }).catch((e) => { done(e); }); }); it("should send message", function(done) { ds = new WebConnect({ url: testUrl, reconnect: { enabled: false } }); ds.connect().then(() => { ds.attachObserver(new Observer(() => { expect(ds.dataReceived()).to.be.true; try { const msg = ds.poll(); expect(msg).to.be.instanceOf(Message3); const data = msg.getData(); expect(data).to.be.deep.equal({ message: "Hello World" }); } catch (e) { done(e); return; } done(); })); ds.send({ message: "Hello World" }); }).catch((e) => { done(e); }); }).timeout(1e4); }); // test/cases/net/webconnect/message.mjs describe("Message", function() { it("construct withouth parameters should throw", function(done) { try { new Message3(); done(new Error("should throw")); } catch (e) { done(); } }); it("from json should ", function(done) { const json = { "id": "123", "type": "test", "data": { "test": "test" } }; const message = Message3.fromJSON(JSON.stringify(json)); const data = message.getData(); expect(data.id).to.equal(json.id); expect(data.type).to.equal(json.type); expect(data.data).to.deep.equal(json.data); done(); }); it("to json should", function(done) { const obj = { "id": "123", "type": "test", "data": { "test": "test" } }; const message = new Message3(obj); const data = JSON.stringify(message); expect(data).to.equal('{"id":"123","type":"test","data":{"test":"test"}}'); done(); }); }); // source/types/version.mjs init_base(); init_constants(); var Version = class _Version extends Base { /** * * @param major * @param minor * @param patch * @throws {Error} major is not a number * @throws {Error} minor is not a number * @throws {Error} patch is not a number */ constructor(major, minor, patch) { super(); if (typeof major === "string" && minor === void 0 && patch === void 0) { const parts = major.toString().split("."); major = parseInt(parts[0] || 0); minor = parseInt(parts[1] || 0); patch = parseInt(parts[2] || 0); } if (major === void 0) { throw new Error("major version is undefined"); } if (minor === void 0) { minor = 0; } if (patch === void 0) { patch = 0; } this.major = parseInt(major); this.minor = parseInt(minor); this.patch = parseInt(patch); if (isNaN(this.major)) { throw new Error("major is not a number"); } if (isNaN(this.minor)) { throw new Error("minor is not a number"); } if (isNaN(this.patch)) { throw new Error("patch is not a number"); } } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/version"); } /** * * @return {string} */ toString() { return `${this.major}.${this.minor}.${this.patch}`; } /** * returns 0 if equal, -1 if the object version is less and 1 if greater * than the compared version * * @param {string|Version} version Version to compare * @return {number} */ compareTo(version2) { if (version2 instanceof _Version) { version2 = version2.toString(); } if (typeof version2 !== "string") { throw new Error("type exception"); } if (version2 === this.toString()) { return 0; } const a2 = [this.major, this.minor, this.patch]; const b = version2.split("."); const len = Math.max(a2.length, b.length); for (let i = 0; i < len; i += 1) { if (a2[i] && !b[i] && parseInt(a2[i]) > 0 || parseInt(a2[i]) > parseInt(b[i])) { return 1; } else if (b[i] && !a2[i] && parseInt(b[i]) > 0 || parseInt(a2[i]) < parseInt(b[i])) { return -1; } } return 0; } }; var monsterVersion; function getMonsterVersion() { if (monsterVersion instanceof Version) { return monsterVersion; } monsterVersion = new Version("3.98.3"); return monsterVersion; } // test/cases/monster.mjs describe("Monster", function() { describe(".getMonsterVersion()", function() { let monsterVersion2; monsterVersion2 = new Version("3.98.3"); let m = getMonsterVersion(); it("should " + monsterVersion2 + " is " + m, function() { expect(m.compareTo(monsterVersion2)).is.equal(0); }); }); }); // source/dom/dimension.mjs init_util(); init_validate(); var CURRENT_DEVICE_DPI = function() { let i = 0; for (i = 56; i < 2e3; i++) { if (getWindow2().matchMedia(`(max-resolution: ${i}dpi)`).matches === true) { return i; } } return i; }; function getDeviceDPI() { if (typeof CURRENT_DEVICE_DPI === "function") { CURRENT_DEVICE_DPI = CURRENT_DEVICE_DPI(); } return getWindow2().devicePixelRatio * CURRENT_DEVICE_DPI; } function convertToPixels(value, parentElement = document.documentElement, fontSizeElement = document.documentElement) { validateString(value); const regex = /^(-?[\d.]+)(.*)$/; const matchResult = value.match(regex); if (!matchResult) { throw new Error(`Invalid value format: ${value}`); } const [, num, unit] = matchResult; const number = parseFloat(num); const dpi = getDeviceDPI(); if (unit === "px") { return number; } else if (unit === "em") { const fontSize = parseFloat( window.getComputedStyle(fontSizeElement).fontSize ); return number * fontSize; } else if (unit === "rem") { const rootFontSize = parseFloat( window.getComputedStyle(parentElement).fontSize ); return number * rootFontSize; } else if (unit === "%") { const parentWidth = parseFloat( window.getComputedStyle(parentElement).width ); return number * parentWidth / 100; } else if (unit === "in") { return number * dpi; } else if (unit === "cm") { return number * dpi / 2.54; } else if (unit === "mm") { return number * dpi / 25.4; } else if (unit === "pt") { return number * dpi / 72; } else if (unit === "pc") { return number * dpi / 6; } else { throw new Error(`Unsupported unit: ${unit}`); } } // test/cases/dom/dimension.mjs init_util(); init_global(); // source/util/runtime.mjs var ENV_AWS_LAMBDA = "aws-lambda"; var ENV_GOOGLE_FUNCTIONS = "google-functions"; var ENV_ELECTRON = "electron"; var ENV_NODE = "node"; var ENV_BROWSER = "browser"; var ENV_WEB_WORKER = "web-worker"; var ENV_DENO = "deno"; var ENV_UNKNOWN = "unknown"; function detectRuntimeEnvironment() { if (typeof process !== "undefined" && process.env != null && process.env.AWS_LAMBDA_FUNCTION_NAME) { return ENV_AWS_LAMBDA; } if (typeof process !== "undefined" && process.env != null && process.env.FUNCTION_NAME) { return ENV_GOOGLE_FUNCTIONS; } if (typeof process !== "undefined" && process.versions != null && process.versions.node != null) { if (process.versions.electron != null) { return ENV_ELECTRON; } return ENV_NODE; } if (typeof window !== "undefined" && typeof window.document !== "undefined" && typeof navigator !== "undefined" && typeof navigator.userAgent === "string") { if (typeof self === "object" && typeof importScripts === "function") { return ENV_WEB_WORKER; } return ENV_BROWSER; } if (typeof Deno !== "undefined") { return ENV_DENO; } return ENV_UNKNOWN; } // test/cases/dom/dimension.mjs function getMockWindow(dpi) { if (detectRuntimeEnvironment() === "browser") { return getWindow2(); } const dom = new JSDOMExport("", { pretendToBeVisual: true, resources: "usable" }); dom.window.matchMedia = (query) => { const dpiRegex = /\(max-resolution: (\d+)dpi\)/; const match = query.match(dpiRegex); if (match) { const maxDpi = parseInt(match[1], 10); return { matches: dpi <= maxDpi }; } return { matches: false }; }; return dom.window; } describe("dimension", () => { let currentEnvironment; before(function(done) { initJSDOM().then(() => { done(); }); }); beforeEach(() => { const testDpi = 96; const testWindow = getMockWindow(testDpi); getGlobal().window = testWindow; }); afterEach(() => { delete getGlobal().window; }); describe("convertToPixels", () => { it("should correctly convert px values", () => { const result = convertToPixels("100px"); expect(result).to.equal(100); }); it("should throw an error when the input value has an invalid format", () => { const invalidValue = "invalid_value"; const errorFn = () => { convertToPixels(invalidValue); }; expect(errorFn).to.throw(Error, `Invalid value format: ${invalidValue}`); }); it("should handle negative values correctly", () => { const negativeValue = "-10px"; const expectedResult = -10; const result = convertToPixels(negativeValue); expect(result).to.equal(expectedResult); }); it("should correctly convert em values", () => { const testElement = document.createElement("div"); testElement.style.fontSize = "16px"; document.body.appendChild(testElement); const result = convertToPixels("2em", testElement, testElement); expect(result).to.equal(32); document.body.removeChild(testElement); }); it("should correctly convert rem values", () => { const testElement = document.createElement("div"); testElement.style.fontSize = "16px"; document.documentElement.appendChild(testElement); const result = convertToPixels("2rem", testElement); expect(result).to.equal(32); document.documentElement.removeChild(testElement); }); it("should correctly convert percentage values", () => { const testElement = document.createElement("div"); testElement.style.width = "500px"; document.body.appendChild(testElement); const result = convertToPixels("50%", testElement); expect(result).to.equal(250); document.body.removeChild(testElement); }); it("should throw an error for unsupported units", () => { expect(() => convertToPixels("10unsupportedUnit")).to.throw("Unsupported unit: unsupportedUnit"); }); }); describe("getDeviceDPI", () => { it("should return the correct device DPI", () => { const testDpi = 96; const testWindow = getMockWindow(testDpi); getGlobal().window = testWindow; const deviceDpi = getDeviceDPI(); expect(deviceDpi).to.equal(testDpi * testWindow.devicePixelRatio); delete getGlobal().window; }); it("should cache the result and return the same value", () => { const testDpi = 96; const testWindow = getMockWindow(testDpi); getGlobal().window = testWindow; const deviceDpi1 = getDeviceDPI(); const deviceDpi2 = getDeviceDPI(); expect(deviceDpi1).to.equal(deviceDpi2); delete getGlobal().window; }); }); }); // test/cases/dom/resource/link/stylesheet.mjs init_stylesheet(); init_dataurl(); init_id(); // test/util/cleanupdom.mjs var addedNodes; var mutationobserver; function init2() { addedNodes = []; mutationobserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === "childList" && mutation.removedNodes) { mutation.addedNodes.forEach((n) => { if (n instanceof HTMLElement) { addedNodes.push(n); } }); } }); }); } function initMutationObserverForTesting() { if (mutationobserver === void 0) { init2(); } mutationobserver.observe(document.querySelector("head"), { childList: true }); } function cleanupDOMFromTesting() { mutationobserver.disconnect(); for (const n of addedNodes) { n.remove(); } } // test/cases/dom/resource/link/stylesheet.mjs var expect18 = expect; use(chaiDom); describe("Stylesheet", function() { before(function(done) { initJSDOM({ runScripts: "dangerously", resources: "usable" }).then(() => { done(); }).catch((e) => done(e)); }); beforeEach(() => { initMutationObserverForTesting(); }); afterEach(() => { cleanupDOMFromTesting(); }); describe("Stylesheet()", function() { it("connect().available()", function(done) { const stylesheet = new Stylesheet({ href: new DataUrl("", "text/css").toString() }); stylesheet.connect().available().then(() => { const id = stylesheet.getOption("id"); done(); }).catch((e) => done(e)); }); }); describe("External Stylesheet", () => { let id = new ID("Stylesheet").toString(); let stylesheet, url = "https://alvine.io/main.min.css"; beforeEach(() => { stylesheet = new Stylesheet({ href: url, id }); }); it("append and remove Stylesheet ", (done) => { expect18(stylesheet.isConnected()).to.be.false; stylesheet.connect().available().then(() => { expect18(stylesheet.isConnected()).to.be.true; expect18(document.querySelector('[href="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect18(stylesheet.isConnected()).to.be.false; expect18(document.querySelector('[href="' + url + '"]')).not.to.exist; stylesheet.connect().available().then(() => { expect18(stylesheet.isConnected()).to.be.true; expect18(document.querySelector('[href="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect18(document.querySelector('[href="' + url + '"]')).not.to.exist; expect18(stylesheet.isConnected()).to.be.false; done(); }).catch((e) => done(e)); }).catch((e) => done(e)); }); }); }); // test/cases/dom/resource/link.mjs init_link(); init_dataurl(); init_id(); var expect19 = expect; use(chaiDom); describe("Link", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); beforeEach(() => { initMutationObserverForTesting(); }); afterEach(() => { cleanupDOMFromTesting(); }); describe("Link()", function() { this.timeout(5e3); it("connect().available()", function(done) { const link = new Link({ href: new DataUrl("", "text/css").toString(), rel: "stylesheet" }); link.connect().available().then(() => { done(); }).catch((e) => done(e)); }); }); describe("External Link", () => { this.timeout(5e3); let id = new ID("link").toString(); let link, url = "https://alvine.io/main.min.css"; beforeEach(() => { link = new Link({ href: url, id, rel: "stylesheet" }); }); it("append and remove Link ", (done) => { expect19(link.isConnected()).to.be.false; link.connect().available().then(() => { expect19(link.isConnected()).to.be.true; expect19(document.querySelector('[href="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect19(link.isConnected()).to.be.false; expect19(document.querySelector('[href="' + url + '"]')).not.to.exist; link.connect().available().then(() => { expect19(link.isConnected()).to.be.true; expect19(document.querySelector('[href="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect19(document.querySelector('[href="' + url + '"]')).not.to.exist; expect19(link.isConnected()).to.be.false; done(); }).catch((e) => done(e)); }).catch((e) => done(e)); }); }); }); // test/cases/dom/resource/script.mjs init_script(); init_dataurl(); init_id(); var expect20 = expect; use(chaiDom); describe("Script", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); beforeEach(() => { initMutationObserverForTesting(); }); afterEach(() => { cleanupDOMFromTesting(); }); describe("Script()", function() { it("setEventTypes()", function(done) { const script = new Script({ src: new DataUrl("", "text/javascript").toString(), async: true, crossOrigin: "anonymous", defer: false, integrity: void 0, nomodule: false, nonce: void 0, referrerpolicy: void 0, type: "text/javascript" }); script.connect().available().then(() => { const id = script.getOption("id"); done(); }).catch((e) => done(e)); }); }); describe("External JS", () => { let id = new ID("script").toString(); let server, script, url = "https://cdnjs.cloudflare.com/ajax/libs/layzr.js/2.2.2/layzr.min.js"; beforeEach(() => { script = new Script({ src: url, async: true, crossOrigin: "anonymous", defer: false, integrity: void 0, nomodule: false, nonce: void 0, referrerpolicy: void 0, type: "text/javascript", id }); }); it("append and remove script ", (done) => { expect20(script.isConnected()).to.be.false; script.connect().available().then(() => { expect20(script.isConnected()).to.be.true; expect20(document.querySelector('[src="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect20(script.isConnected()).to.be.false; expect20(document.querySelector('[src="' + url + '"]')).not.to.exist; script.connect().available().then(() => { expect20(script.isConnected()).to.be.true; expect20(document.querySelector('[src="' + url + '"]')).to.exist; document.getElementById(id).remove(); expect20(document.querySelector('[src="' + url + '"]')).not.to.exist; expect20(script.isConnected()).to.be.false; done(); }).catch((e) => done(e)); }).catch((e) => done(e)); }); }); }); // test/cases/dom/resource/data.mjs init_data(); init_dataurl(); init_id(); var expect21 = expect; use(chaiDom); describe("Data", function() { let fetchReference4, returnStatus, mutationobserver2, addedNodes2 = []; before(function(done) { initJSDOM().then(() => { done(); }); }); beforeEach(() => { initMutationObserverForTesting(); returnStatus = 200; fetchReference4 = globalThis["fetch"]; globalThis["fetch"] = function(url, options2) { if (!url) throw new Error("missing url"); return new Promise((resolve, reject) => { resolve({ text: function() { return JSON.stringify({ a: "test" }); }, status: returnStatus }); }); }; }); afterEach(() => { globalThis["fetch"] = fetchReference4; cleanupDOMFromTesting(); }); describe("Data()", function() { it("setEventTypes()", function(done) { const data = new Data({ src: new DataUrl("", "text/javascript").toString() }); data.connect().available().then(() => { done(); }).catch((e) => done(e)); }); }); describe("External Data", () => { let id = new ID("data").toString(); let server, data, url = "https://cdnjs.cloudflare.com/ajax/libs/layzr.js/2.2.2/layzr.min.js"; beforeEach(() => { data = new Data({ src: url, id }); }); it("data is not connected", () => { expect21(data.isConnected()).to.be.false; }); it("connect and check availability", (done) => { data.connect().available().then(() => { expect21(data.isConnected(), "isConnected 1").to.be.true; expect21(document.querySelector('[type="application/json"]'), "exists 1").to.exist; const e = document.getElementById(id).parentElement; document.getElementById(id).remove(); expect21(data.isConnected(), "isConnected 2").to.be.false; expect21(document.querySelector('[type="application/json"]'), "exists 2").not.to.exist; data.connect().available().then(() => { expect21(data.isConnected(), "isConnected 3").to.be.true; expect21(document.querySelector('[type="application/json"]'), "exists 3").to.exist; document.getElementById(id).remove(); expect21(document.querySelector('[type="application/json"]'), "exists 4").not.to.exist; expect21(data.isConnected(), "isConnected 4").to.be.false; done(); }).catch((e2) => done(e2)); }).catch((e) => done(e)); }); }); }); // test/cases/dom/util/init-options-from-attributes.mjs describe("initOptionsFromAttributes", () => { let element; let options2; let initOptionsFromAttributes2; before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_init_options_from_attributes(), init_options_from_attributes_exports)).then((m) => { initOptionsFromAttributes2 = m["initOptionsFromAttributes"]; done(); }); }); }); beforeEach(() => { options2 = { url: "", key: { subkey: "", caseSensitive: true } }; element = document.createElement("div"); }); it("should initialize options with matching attributes", () => { element.setAttribute("data-monster-option-url", "https://example.com"); element.setAttribute("data-monster-option-key-subkey", "test"); const result = initOptionsFromAttributes2(element, options2); expect(result.url).to.equal("https://example.com"); expect(result.key.subkey).to.equal("test"); }); it("should not modify options without matching attributes", () => { const result = initOptionsFromAttributes2(element, options2); expect(result.url).to.equal(""); expect(result.key.subkey).to.equal(""); }); it("should ignore attributes without the correct prefix", () => { element.setAttribute("data-some-option-url", "https://example.com"); const result = initOptionsFromAttributes2(element, options2); expect(result.url).to.equal(""); }); it("should ignore attributes with invalid option paths", () => { element.setAttribute("data-monster-option-nonexistent", "value"); const result = initOptionsFromAttributes2(element, options2); expect(result).to.deep.equal(options2); }); it("should apply mapping for a single attribute", () => { element.setAttribute("data-monster-option-url", "example"); const mapping = { "url": (value) => "https://" + value + ".com" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal("https://example.com"); }); it("should apply mapping for a nested attribute", () => { element.setAttribute("data-monster-option-key-subkey", "123"); const mapping = { "key.subkey": (value) => parseInt(value, 10) * 2 }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.key.subkey).to.equal("246"); }); it("should apply multiple mappings", () => { element.setAttribute("data-monster-option-url", "example"); element.setAttribute("data-monster-option-key-subkey", "123"); const mapping = { "url": (value) => "https://" + value + ".com", "key.subkey": (value) => parseInt(value, 10) * 2 }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal("https://example.com"); expect(result.key.subkey).to.equal("246"); }); it("should ignore mappings for non-existing attributes", () => { const mapping = { "url": (value) => "https://" + value + ".com" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal(""); }); it("should ignore mappings for invalid option paths", () => { element.setAttribute("data-monster-option-nonexistent", "value"); const mapping = { "nonexistent": (value) => value + "bar" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result).to.deep.equal(options2); }); it("should apply mapping only to specified attributes", () => { element.setAttribute("data-monster-option-url", "example"); element.setAttribute("data-monster-option-key-subkey", "123"); const mapping = { "url": (value) => "https://" + value + ".com" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal("https://example.com"); expect(result.key.subkey).to.equal("123"); }); it("should not apply mapping if not a function", () => { element.setAttribute("data-monster-option-url", "example"); const mapping = { "url": "https://example.com" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal("example"); }); it("should apply mapping with custom prefix", () => { element.setAttribute("data-custom-option-url", "example"); const mapping = { "url": (value) => "https://" + value + ".com" }; const result = initOptionsFromAttributes2(element, options2, mapping, "data-custom-option-"); expect(result.url).to.equal("https://example.com"); }); it("should not apply mapping with incorrect custom prefix", () => { element.setAttribute("data-custom-option-url", "example"); const mapping = { "url": (value) => "https://" + value + ".com" }; const result = initOptionsFromAttributes2(element, options2, mapping); expect(result.url).to.equal(""); }); it("should apply case sensitive mapping", () => { element.setAttribute("data-monster-option-key-caseSensitive", "false"); const result = initOptionsFromAttributes2(element, options2); expect(result.key.caseSensitive).to.equal(false); }); }); // test/cases/dom/util/extract-keys.mjs init_extract_keys(); describe("extractKeys", () => { it("should extract keys from the given object", () => { const obj = { firstName: "John", lastName: "Doe", address: { street: "123 Main St", city: "New York" } }; const expected = /* @__PURE__ */ new Map([ ["firstname", "firstName"], ["lastname", "lastName"], ["address-street", "address.street"], ["address-city", "address.city"] ]); const result = extractKeys(obj); expect(JSON.stringify(Array.from(result))).to.equal(JSON.stringify(Array.from(expected))); }); it("should use custom key and value separators", () => { const obj = { firstName: "John", lastName: "Doe" }; const expected = /* @__PURE__ */ new Map([ ["prefix+firstname", "prefix+firstName"], ["prefix+lastname", "prefix+lastName"] ]); const result = extractKeys(obj, "prefix", "+", "+"); expect(JSON.stringify(Array.from(result))).to.equal(JSON.stringify(Array.from(expected))); }); it("check if value is null", () => { const obj = { firstName: "John", lastName: "Doe", address: null }; const expected = /* @__PURE__ */ new Map([ ["firstname", "firstName"], ["lastname", "lastName"], ["address", "address"] ]); const result = extractKeys(obj); expect(JSON.stringify(Array.from(result))).to.equal(JSON.stringify(Array.from(expected))); }); }); // source/dom/worker/factory.mjs init_constants(); init_base(); init_global(); init_is(); init_validate(); var Factory = class extends Base { /** * */ constructor() { super(); this[internalSymbol] = { worker: /* @__PURE__ */ new WeakMap() }; } /** * Creates a worker from a URL * * @param {string|URL} url * @param {function} messageHandler * @param {function} errorHandler * @return {Worker} */ createFromURL = function(url, messageHandler, errorHandler) { if (url instanceof URL) { url = url.toString(); } const workerClass = getGlobalFunction("Worker"); var worker = new workerClass(validateString(url)); if (isFunction(messageHandler)) { worker.onmessage = (event) => { messageHandler.call(worker, event); }; } if (isFunction(errorHandler)) { worker.onerror = (event) => { errorHandler.call(worker, event); }; } return worker; }; /** * Creates a worker from a script * * @param {string} content * @param {function} messageHandler * @param {function} errorHandler * @return {Worker} * @see https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL */ createFromScript = function(content, messageHandler, errorHandler) { const blobFunction = new getGlobalFunction("Blob"); const blob = new blobFunction([validateString(content)], { type: "script/javascript" }); const url = getGlobalFunction("URL").createObjectURL(blob); const worker = this.createFromURL(url, messageHandler, errorHandler); this[internalSymbol]["worker"].set(worker, url); return worker; }; /** * Terminate the worker and call revokeObjectURL if necessary. * * @param worker * @return {Monster.DOM.Worker.Factory} */ terminate(worker) { const workerClass = getGlobalFunction("Worker"); validateInstance(worker, workerClass); worker.terminate(); if (this[internalSymbol]["worker"].has(worker)) { const url = this[internalSymbol]["worker"].get(worker); URL.revokeObjectURL(url); } return this; } }; // test/cases/dom/worker/factory.mjs init_global(); var global17 = getGlobal(); describe("Worker", function() { before(function(done) { if (isNode()) { Object.defineProperty(global17["URL"], "createObjectURL", { writable: true, value: () => { return "/example.mjs"; } }); global17["Worker"] = class { terminate() { } onerror() { } onmessage() { } }; let a2 = typeof global17["Worker"]; let a1 = typeof Worker; } const jsdom = initJSDOM().then(() => { done(); }); }); describe("Factory", function() { it("create worker", function() { const factory = new Factory(); const worker = factory.createFromScript('console.log("hello world");'); expect(worker).is.instanceof(Worker); expect(factory.terminate(worker)).is.instanceof(Factory); }); }); }); // test/cases/dom/updater.mjs init_id(); init_observer(); init_proxyobserver(); var expect22 = expect; use(chaiDom); var html112 = ` <template id="current"> <li data-monster-replace="path:current | tojson"></li> </template> <div id="test1"> <ul data-monster-insert="current path:a.b"> </ul> </div> <div id="test2"> <ul data-monster-insert="current path:a.b | doit"> </ul> </div> <div id="test3"> <div data-monster-attributes="class path:a.b"> <input data-monster-attributes="value path:a.c" id="input1"> <input data-monster-attributes="checked path:a.checkbox" type="checkbox" name="checkbox" id="checkbox"> <input data-monster-attributes="value path:a.text" type="text" name="text" id="text"> <input data-monster-attributes="checked path:a.radio" type="radio" name="radio" value="r1" id="radio"> <input type="radio" name="radio" value="r2" id="r2"> <input type="radio" name="radio" value="rx" id="rx"> <select data-monster-attributes="value path:a.select" name="select" id="select"> <option value="other-value">value1</option> <option>value2</option> </select> <select data-monster-attributes="value path:a.multiselect" name="multiselect" multiple id="multiselect"> <option>value1</option> <option>value2</option> <option>value3</option> <option>value4</option> <option value="other-value5">value5</option> </select> <textarea name="textarea" id="textarea" data-monster-attributes="value path:a.textarea"></textarea> </div> </div> `; var html27 = ` <div id="test1"> <div data-monster-replace="path:text | tolower"></div> <div data-monster-replace="path:text | call:myformatter"></div> <div data-monster-replace="static:hello\\ "></div> </div> `; var html3 = ` <template id="myinnerid"> <span data-monster-replace="path:myinnerid | tojson"></span> </template> <template id="myid"> <p data-monster-insert="myinnerid path:a.b"></p> </template> <div id="test1"> <div data-monster-insert="myid path:a.b"></div> </div> `; var html4 = ` <div> <form id="form1"> <input type="checkbox" value="checked" name="checkbox" data-monster-bind="path:state"> <input type="text" name="text"> <input type="radio" name="radio" value="r1" id="r1" data-monster-bind="path:radio"> <input type="radio" name="radio" value="r2" id="r2" data-monster-bind="path:radio"> <input type="radio" name="radio" value="rx" id="rx" data-comment="not called because no bind attribute"> <input type="button" name="button"> <select name="select1" id="select1" data-monster-bind="path:select"> <option>value1</option> <option>value2</option> </select> <select name="select2" multiple id="select2" data-monster-bind="path:multiselect"> <option>value1</option> <option>value2</option> <option>value3</option> <option>value4</option> <option>value5</option> </select> <textarea name="textarea" id="textarea" data-monster-bind="path:textarea"> </textarea> </form> </div> `; describe("DOM", function() { let Updater2 = null; before(function(done) { const options2 = {}; initJSDOM(options2).then(() => { Promise.resolve().then(() => (init_updater(), updater_exports)).then((m) => { Updater2 = m.Updater; done(); }).catch((e) => { done(e); }); }); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html112; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("Updater()", function() { describe("test Getter && Setter", function() { it("setEventTypes()", function() { let element = document.getElementById("test1"); expect22(new Updater2(element).setEventTypes(["touch"])).to.be.instanceof(Updater2); }); it("getSubject()", function() { let element = document.getElementById("test1"); let subject = { a: 1 }; expect22(new Updater2(element, subject).getSubject().a).to.be.equal(1); }); }); describe("test control methods", function() { it("enableEventProcessing()", function() { let element = document.getElementById("test1"); expect22(new Updater2(element).enableEventProcessing()).to.be.instanceof(Updater2); }); it("disableEventProcessing()", function() { let element = document.getElementById("test1"); expect22(new Updater2(element).disableEventProcessing()).to.be.instanceof(Updater2); }); }); describe("test Errors", function() { it("should throw value is not an instance of HTMLElement Error", function() { expect22(() => new Updater2()).to.throw(TypeError); }); it("should throw value is wrong", function() { let element = document.getElementById("test1"); expect22(() => new Updater2(element, null)).to.throw(TypeError); }); it("should throw Error: the value is not iterable", function(done) { let element = document.getElementById("test1"); let u = new Updater2( element, { a: { x: [] } } ); let promise = u.run(); setTimeout(() => { promise.then(() => { setTimeout(() => { done(new Error("should never called!")); }, 100); }).catch((e) => { expect22(e).is.instanceOf(Error); expect22(e + "").to.be.equal("Error: the value is not iterable"); done(); }); }, 100); }); }); }); describe("Updater()", function() { describe("new Updater", function() { it("should return document object", function() { let element = document.getElementById("test1"); let d = new Updater2( element, {} ); expect22(typeof d).is.equal("object"); }); }); }); describe("Updater()", function() { describe("Repeat", function() { it("should build 6 li elements", function(done) { let element = document.getElementById("test1"); let d = new Updater2( element, { a: { b: [ { i: "0" }, { i: "1" }, { i: "2" }, { i: "3" }, { i: "4" }, { i: "5" } ] } } ); d.run().then(() => { setTimeout(() => { expect22(typeof d).is.equal("object"); for (let i = 0; i < 6; i++) { expect22(element).contain.html('<li data-monster-replace="path:a.b.' + i + ' | tojson" data-monster-insert-reference="current-' + i + '">{"i":"' + i + '"}</li>'); } done(); }, 100); }).catch( (e) => { done(new Error(e)); } ); }); }); }); describe("Updater()", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html4; }); describe("Eventhandling", function() { let updater, form1, proxyobserver; beforeEach(() => { proxyobserver = new ProxyObserver({}); updater = new Updater2(document.getElementById("form1"), proxyobserver); form1 = document.getElementById("form1"); }); it("should handle checkbox click events", function(done) { updater.enableEventProcessing(); let subject = updater.getSubject(); expect22(subject).is.equal(proxyobserver.getSubject()); let expected = ["checked", void 0, "checked"]; proxyobserver.attachObserver(new Observer(function() { let e = expected.shift(); if (e === void 0 && expected.length === 0) done(new Error("to many calls")); if (this.getSubject()["state"] !== e) done(new Error(this.getSubject()["state"] + " should " + e)); if (expected.length === 0) { done(); } else { setTimeout(() => { form1.querySelector("[name=checkbox]").click(); }, 10); } })); setTimeout(() => { form1.querySelector("[name=checkbox]").click(); }, 10); }); it("should handle radio click events 1", function(done) { updater.enableEventProcessing(); let subject = updater.getSubject(); expect22(subject).is.equal(proxyobserver.getSubject()); let expected = ["r1", "r2", "r1"]; let clickTargets = ["r2", "r1"]; proxyobserver.attachObserver(new Observer(function() { let e = expected.shift(); if (e === void 0 && expected.length === 0) done(new Error("to many calls")); let v = this.getSubject()["radio"]; if (v !== e) done(new Error(v + " should " + e)); if (expected.length === 0) { done(); } else { setTimeout(() => { document.getElementById(clickTargets.shift()).click(); }, 10); } })); setTimeout(() => { document.getElementById("r1").click(); }, 10); setTimeout(() => { document.getElementById("rx").click(); }, 20); }); it("should handle select click events 2", function(done) { let selectElement = document.getElementById("select1"); updater.enableEventProcessing(); let subject = updater.getSubject(); expect22(subject).is.equal(proxyobserver.getSubject()); let expected = ["value2", "value1", "value2"]; proxyobserver.attachObserver(new Observer(function() { let e = expected.shift(); if (e === void 0 && expected.length === 0) done(new Error("to many calls")); let v = this.getSubject()["select"]; if (v !== e) done(new Error(v + " should " + e)); if (expected.length === 0) { done(); } else { setTimeout(() => { selectElement.selectedIndex = selectElement.selectedIndex === 1 ? 0 : 1; selectElement.click(); }, 10); } })); setTimeout(() => { selectElement.selectedIndex = 1; selectElement.click(); }, 20); }); it("should handle textarea events", function(done) { let textareaElement = document.getElementById("textarea"); updater.enableEventProcessing(); let subject = updater.getSubject(); expect22(subject).is.equal(proxyobserver.getSubject()); let expected = ["testX", "lorem ipsum", ""]; let testValues = ["lorem ipsum", ""]; proxyobserver.attachObserver(new Observer(function() { let e = expected.shift(); if (e === void 0 && expected.length === 0) done(new Error("to many calls")); let v = this.getSubject()["textarea"]; if (JSON.stringify(v) !== JSON.stringify(e)) done(new Error(JSON.stringify(v) + " should " + JSON.stringify(e))); if (expected.length === 0) { done(); } else { setTimeout(() => { textareaElement.value = testValues.shift(); textareaElement.click(); }, 10); } })); setTimeout(() => { textareaElement.value = "testX"; textareaElement.click(); }, 20); }); it("should handle multiple select events", function(done) { let selectElement = document.getElementById("select2"); updater.enableEventProcessing(); let subject = updater.getSubject(); expect22(subject).is.equal(proxyobserver.getSubject()); let expected = [ ["value1"], ["value2", "value3", "value4"], ["value1", "value4"] ]; let testSelections = [ [false, true, true, true], [true, false, false, true] ]; proxyobserver.attachObserver(new Observer(function() { let e = expected.shift(); if (e === void 0 && expected.length === 0) done(new Error("to many calls")); let v = this.getSubject()["multiselect"]; if (JSON.stringify(v) !== JSON.stringify(e)) done(new Error(JSON.stringify(v) + " should " + JSON.stringify(e))); if (expected.length === 0) { done(); } else { setTimeout(() => { let v2 = testSelections.shift(); selectElement.options[0].selected = v2[0]; selectElement.options[1].selected = v2[1]; selectElement.options[2].selected = v2[2]; selectElement.options[3].selected = v2[3]; selectElement.click(); }, 10); } })); setTimeout(() => { selectElement.options[0].selected = true; selectElement.options[1].selected = false; selectElement.options[2].selected = false; selectElement.options[3].selected = false; selectElement.click(); }, 20); }); }); }); describe("Updater()", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html27; }); describe("Replace", function() { it("should add lower hello and HELLOyes!", function(done) { let element = document.getElementById("test1"); let d = new Updater2( element, { text: "HALLO" } ); d.setCallback("myformatter", function(a2) { return a2 + "yes!"; }); d.run().then(() => { setTimeout(() => { expect22(typeof d).is.equal("object"); expect22(element).contain.html('<div data-monster-replace="path:text | tolower">hallo</div>'); expect22(element).contain.html('<div data-monster-replace="path:text | call:myformatter">HALLOyes!</div>'); expect22(element).contain.html('<div data-monster-replace="static:hello\\ ">hello </div>'); return done(); }, 100); }).catch( (e) => { done(new Error(e)); } ); }); }); }); describe("Updater()", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html3; }); describe("Replace", function() { it("should ", function(done) { let element = document.getElementById("test1"); let d = new Updater2( element, { a: { b: [ { i: "0" } ] } } ); d.run().then(() => { setTimeout(() => { expect22(typeof d).is.equal("object"); expect22(element).contain.html('<div data-monster-insert="myid path:a.b">'); expect22(element).contain.html('<p data-monster-insert="myinnerid path:a.b" data-monster-insert-reference="myid-0">'); expect22(element).contain.html('<span data-monster-replace="path:a.b.0 | tojson" data-monster-insert-reference="myinnerid-0">{"i":"0"}</span>'); done(); }, 100); }).catch( (e) => { done(new Error(e)); } ); }); }); }); describe("Updater()", function() { describe("Attributes", function() { it("should change attributes", function(done) { let element = document.getElementById("test3"); let text = document.getElementById("text"); expect22(text.value).to.be.equal(""); let radio = document.getElementById("radio"); expect22(radio.checked).to.be.false; let checkbox = document.getElementById("checkbox"); expect22(checkbox.checked).to.be.false; let select = document.getElementById("select"); expect22(select.selectedIndex).to.be.equal(0); let multiselect = document.getElementById("multiselect"); expect22(multiselect.selectedIndex).to.be.equal(-1); let textarea = document.getElementById("textarea"); expect22(textarea.value).to.be.equal(""); let d = new Updater2( element, { a: { b: "div-class", c: "hello", text: "hello", radio: "true", textarea: "test", multiselect: ["value3", "value4", "other-value5"], select: "value2", checkbox: "true" } } ); d.run().then(() => { setTimeout(() => { expect22(element).contain.html('<div data-monster-attributes="class path:a.b" class="div-class">'); expect22(element).contain.html('<input data-monster-attributes="value path:a.c" id="input1" value="hello">'); expect22(element).contain.html('<textarea name="textarea" id="textarea" data-monster-attributes="value path:a.textarea" value="test">'); expect22(element).contain.html('<input data-monster-attributes="checked path:a.radio" type="radio" name="radio" value="r1" id="radio" checked="true">'); expect22(text.value, "text control").to.be.equal(d.getSubject()["a"]["c"]); expect22(radio.checked, "radio control").to.be.equal(true); expect22(textarea.value, "textarea control").to.be.equal(d.getSubject()["a"]["textarea"]); expect22(select.selectedIndex, "select control").to.be.equal(1); let multiselectSelectedOptions = []; for (const [index, obj] of Object.entries(multiselect.selectedOptions)) { multiselectSelectedOptions.push(obj.value); } expect22(JSON.stringify(multiselectSelectedOptions), "multiselect control").to.be.equal(JSON.stringify(d.getSubject()["a"]["multiselect"])); expect22(checkbox.checked, "checkbox control").to.be.true; done(); }, 100); }).catch( (e) => { done(new Error(e)); } ); }); }); }); describe("Get Attribute Pipe", function() { let id, mocks; beforeEach(() => { mocks = document.getElementById("mocks"); id = new ID("monster"); mocks.innerHTML = ` <div id="` + id + `" data-monster-replace="path:a | if:value:\\ "></div>`; }); afterEach(() => { mocks.innerHTML = ""; }); it("should include space", function() { const div = document.getElementById(id.toString()); const pipe = div.getAttribute("data-monster-replace"); expect22(pipe.length).to.be.equal(20); }); }); describe("manuel update", function() { let id, mocks; beforeEach(() => { mocks = document.getElementById("mocks"); id = new ID("monster").toString(); mocks.innerHTML = `<input id="` + id + `"data-monster-bind="path:myvalue">`; }); afterEach(() => { mocks.innerHTML = ""; }); it("should get value", function() { document.getElementById(id).value = "hello"; const updater = new Updater2(mocks); const subject = updater.getSubject(); expect22(subject).to.not.have.property("myvalue"); updater.retrieve(); expect22(subject).to.have.property("myvalue"); }); }); describe("Updater() 20220107", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="container"> <div data-monster-replace="path:content"></div> </div> `; }); describe("Bugfix #112", function() { it("should add ", function(done) { let containerElement = document.getElementById("container"); let newElement = document.createElement("div"); newElement.innerHTML = "yeah! <b>Test</b>!"; const containerHTML = containerElement.innerHTML; const newHTML = newElement.innerHTML; let d = new Updater2( containerElement, { content: newElement } ); setTimeout(() => { d.run().then(() => { setTimeout(() => { try { expect22(containerElement).contain.html("<div>yeah! <b>Test</b>!</div>"); } catch (e) { return done(e); } done(); }, 100); }); }, 100); }); }); }); }); // test/cases/dom/locale.mjs init_locale(); init_locale2(); describe("Attributes", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); describe("getLocaleOfDocument", function() { [ ["de"], ["sl-IT-nedis"], ["en-GB"] ].forEach(function(data) { let a2 = data.shift(); it("return language " + a2, function() { let html = document.getElementsByTagName("html"); let node = html.item(0); node.setAttribute("lang", a2); expect(getLocaleOfDocument().toString()).to.be.equal(a2); }); }); }); it("return language en", function() { let html = document.getElementsByTagName("html"); let node = html.item(0); let lang = node.getAttribute("lang"); node.removeAttribute("lang"); const locale = getLocaleOfDocument(); expect(locale).to.be.instanceOf(Locale); expect(locale.localeString).to.be.equal(navigator.language); node.setAttribute("lang", lang); }); }); // test/cases/dom/theme.mjs init_util(); init_theme(); describe("Theme", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); describe("new Theme()", function() { it("should return Theme object", function() { expect(new Theme("my-theme")).is.a.instanceOf(Theme); }); it("should return Theme-Name", function() { expect(new Theme("my-theme").getName()).is.equal("my-theme"); }); it("should throw Error because empty argument", function() { expect(() => new Theme()).to.throw(TypeError); }); it("should throw Error because no string argument", function() { expect(() => new Theme(2)).to.throw(TypeError); }); }); describe("getDocumentTheme()", function() { it("should return Theme object", function() { expect(getDocumentTheme()).is.a.instanceOf(Theme); }); it("should return Default Theme name", function() { expect(getDocumentTheme().getName()).is.equal("monster"); }); }); describe("getDocumentTheme()", function() { beforeEach(() => { document.querySelector("html").setAttribute("data-monster-theme-name", "testtheme"); }); afterEach(() => { document.querySelector("html").removeAttribute("data-monster-theme-name"); }); it("should return testtheme Theme name", function() { expect(getDocumentTheme().getName()).is.equal("testtheme"); }); }); }); // test/cases/dom/customelement.mjs init_constants(); init_util(); init_proxyobserver(); var expect23 = expect; use(chaiDom); var html113 = ` <div id="test1"> </div> `; var html28 = ` <input data-monster-bind="path:a" id="test2" data-monster-attributes="value path:a"> `; var updaterSymbolKey = "@schukai/monster/dom/custom-element@@options-updater-link"; var updaterSymbolSymbol = Symbol.for(updaterSymbolKey); describe("DOM", function() { let CustomElement2, registerCustomElement2, TestComponent, document2, TestComponent2, assignUpdaterToElement, addObjectWithUpdaterToElement2; describe("assignUpdaterToElement", function() { before(function(done) { const options2 = {}; initJSDOM(options2).then(() => { Promise.resolve().then(() => (init_updater(), updater_exports)).then((yy) => { addObjectWithUpdaterToElement2 = yy["addObjectWithUpdaterToElement"]; Promise.resolve().then(() => (init_customelement(), customelement_exports)).then((m) => { try { CustomElement2 = m["CustomElement"]; assignUpdaterToElement = function(elements, object) { return addObjectWithUpdaterToElement2.call(this, elements, updaterSymbolSymbol, object); }; document2 = getDocument(); done(); } catch (e) { done(e); } }).catch((e) => { done(e); }); }).catch((e) => { done(e); }); }); }); beforeEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = html28; }); afterEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = ""; }); it("should assign an updater to an element", function(done) { let element = document2.getElementById("test2"); expect23(document2.getElementById("mocks").innerHTML).to.equal(html28); const a2 = { a: 1 }; const b = { b: 2 }; const ap = new ProxyObserver(a2); const bp = new ProxyObserver(b); const x = ap.getSubject(); const y = bp.getSubject(); const set2 = /* @__PURE__ */ new Set(); set2.add(element); assignUpdaterToElement.call(element, set2, ap); assignUpdaterToElement.call(element, set2, bp); expect23(JSON.stringify(x)).to.equal('{"a":1}'); expect23(JSON.stringify(y)).to.equal('{"b":2}'); const sy = updaterSymbolSymbol; let v = element.getAttribute("data-monster-objectlink"); expect23(v).to.equal("Symbol(" + updaterSymbolKey + ")"); const updater = element[sy]; for (const v2 of updater) { for (const u of v2) { u.run().then(() => { u.enableEventProcessing(); }); } } expect23(updater).to.be.an.instanceof(Set); expect23(updater).to.be.a("Set"); x.a = 3; bp.getSubject().b = 4; setTimeout(() => { let mockHTML = document2.getElementById("mocks"); expect23(mockHTML.querySelector("#test2")).to.have.value("3"); expect23(mockHTML.querySelector("#test2")).to.have.attribute("data-monster-objectlink", "Symbol(" + updaterSymbolKey + ")"); expect23(element.value).to.equal("3"); expect23(JSON.stringify(ap.getRealSubject())).to.equal('{"a":3}'); expect23(JSON.stringify(bp.getRealSubject())).to.equal('{"b":4}'); done(); }, 50); }); }); describe("CustomElement()", function() { before(function(done) { initJSDOM({}).then(() => { Promise.resolve().then(() => (init_customelement(), customelement_exports)).then((m) => { try { CustomElement2 = m["CustomElement"]; registerCustomElement2 = m["registerCustomElement"]; TestComponent = class extends CustomElement2 { static getTag() { return "monster-testclass"; } }; registerCustomElement2(TestComponent); TestComponent2 = class extends CustomElement2 { static getTag() { return "monster-testclass2"; } /** * * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { demotest: void 0, templates: { main: '<h1></h1><article><p>test</p><div id="container"></div></article>' } }); } }; registerCustomElement2(TestComponent2); document2 = getDocument(); done(); } catch (e) { done(e); } }); }); }); beforeEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; }); afterEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = ""; }); describe("CustomElement() with Config", function() { it("should read config from tag", function() { let mocks = document2.getElementById("mocks"); mocks.innerHTML = ` <script id="config1" type="application/json"> { "demotest":1425 } <\/script> <monster-testclass2 id="thisisatest" data-monster-options-selector="#config1"> </monster-testclass2> `; let monster = document2.getElementById("thisisatest"); expect23(monster.getOption("demotest")).is.eql(1425); }); }); describe("create", function() { it("should return custom-element object", function() { let d = new TestComponent(); expect23(typeof d).is.equal("object"); }); }); describe("connect empty element", function() { it("document should contain monster-testclass", function() { let d = document2.createElement("monster-testclass"); document2.getElementById("test1").appendChild(d); expect23(document2.getElementsByTagName("monster-testclass").length).is.equal(1); expect23(document2.getElementById("test1")).contain.html('<monster-testclass data-monster-error="Error: html is not set."></monster-testclass>'); }); }); describe("connect element with html", function() { it("document should contain monster-testclass2", function(done) { let d = document2.createElement("monster-testclass2"); document2.getElementById("test1").appendChild(d); setTimeout(function() { try { expect23(document2.getElementsByTagName("monster-testclass2").length).is.equal(1); expect23(document2.getElementsByTagName("monster-testclass2").item(0).shadowRoot.innerHTML).is.equal('<h1></h1><article><p>test</p><div id="container"></div></article>'); expect23(document2.getElementById("test1")).contain.html('<monster-testclass2 data-monster-objectlink="Symbol(' + updaterSymbolKey + ')"></monster-testclass2>'); return done(); } catch (e) { done(e); } }, 10); }); }); describe("Options change", function() { it("delegatesFocus should change from true to false", function() { let element = document2.createElement("monster-testclass"); const o = element[internalSymbol].realSubject; expect23(Object.is(element[internalSymbol].realSubject, o)).to.be.true; expect23(element[internalSymbol].realSubject.options.delegatesFocus).to.be.true; expect23(element[internalSymbol].subject.options.delegatesFocus).to.be.true; expect23(element.getOption("delegatesFocus")).to.be.true; expect23(Object.is(element[internalSymbol].realSubject, o)).to.be.true; }); }); describe("setOptions()", function() { [ ["shadowMode", "x1"], ["templates.main", "x2"], // is explicitly set to undefined ["delegatesFocus", "x4"] ].forEach(function(data) { let key = data.shift(); let newValue = data.shift(); let text = key + " should return " + newValue; if (newValue !== void 0) { text = key + " was not set, therefore default " + newValue; } it(text, function() { let d = document2.createElement("monster-testclass"); expect23(d.getOption(key)).to.be.not.equal(newValue); let x = d.setOption(key, newValue); expect23(d.getOption(key)).to.be.equal(newValue); }); }); }); describe("getOptions()", function() { [ ["shadowMode", "open"], ["templates.main", void 0], // is explicitly set to undefined ["delegatesFocus", true], ["x.y.z", true, true], // x.y.z isnt set, defaultValue is used ["x", true, true] // x isnt set, defaultValue is used ].forEach(function(data) { let key = data.shift(); let value = data.shift(); let defaultValue = data.shift(); let text = key + " should return " + value; if (defaultValue !== void 0) { text = key + " was not set, therefore default " + defaultValue; } it(text, function() { let d = document2.createElement("monster-testclass"); let x = d.getOption(key, defaultValue); expect23(x).to.be.equal(value); }); }); }); describe("Assign CSSStyle as Array with wrong type", function() { const htmlTAG = "monster-testclass-x1"; let mocks, TestComponentX1; beforeEach(() => { mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; TestComponentX1 = class extends CustomElement2 { static getTag() { return htmlTAG; } static getCSSStyleSheet() { return [true]; } /** * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: "<h1>test</h1>" } }); } }; registerCustomElement2(TestComponentX1); }); it(htmlTAG + " should throw Exception", function(done) { let d = document2.createElement(htmlTAG); let div = document2.getElementById("test1"); div.append(d); expect23(div).contain.html('data-monster-error="TypeError: value is not an instance of CSSStyleSheet"'); done(); }); }); describe("Assign CSSStyle as Array and CSSStylesheet", function() { const htmlTAG = "monster-testclass-x113-2"; let mocks, TestComponentX113X2; beforeEach(() => { mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; TestComponentX113X2 = class extends CustomElement2 { static getTag() { return htmlTAG; } /** * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: "<h1>test</h1>" } }); } static getCSSStyleSheet() { const s = new CSSStyleSheet(); s.insertRule("a { color : red}"); return [s]; } }; registerCustomElement2(TestComponentX113X2); }); it(htmlTAG + " should throw Exception 2", function(done) { let d = document2.createElement(htmlTAG); let div = document2.getElementById("test1"); div.append(d); expect23(d.shadowRoot.innerHTML).is.eq("<h1>test</h1>"); done(); }); }); describe("Assign CSSStyle as Array and CSS as string", function() { const htmlTAG = "monster-testclass-x113-21"; let mocks, TestComponentX113X22; beforeEach(() => { mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; TestComponentX113X22 = class extends CustomElement2 { static getTag() { return htmlTAG; } /** * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: "<h1>test</h1>" } }); } static getCSSStyleSheet() { return "a { color:red }"; } }; registerCustomElement2(TestComponentX113X22); }); it(htmlTAG + " should eq <style>a { color:red }</style><h1>test</h1>", function(done) { let d = document2.createElement(htmlTAG); let div = document2.getElementById("test1"); div.append(d); expect23(d.shadowRoot.innerHTML).is.eq("<style>a { color:red }</style><h1>test</h1>"); done(); }); }); describe("Assign CSSStyle as Array and CSS as string", function() { const htmlTAG = "monster-testclass-x113-22"; let mocks, TestComponentX113X223; beforeEach(() => { mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; TestComponentX113X223 = class extends CustomElement2 { static getTag() { return htmlTAG; } /** * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { templates: { main: "<h1>test</h1>" } }); } static getCSSStyleSheet() { return ["a { color:red }"]; } }; registerCustomElement2(TestComponentX113X223); }); it(htmlTAG + " should eq <style>a { color:red }</style><h1>test</h1>", function(done) { let d = document2.createElement(htmlTAG); let div = document2.getElementById("test1"); div.append(d); expect23(d.shadowRoot.innerHTML).is.eq("<style>a { color:red }</style><h1>test</h1>"); done(); }); }); describe("hasNode()", function() { let mocks; beforeEach(() => { mocks = document2.getElementById("mocks"); mocks.innerHTML = html113; }); it("hasNode monster-testclass should return ...", function() { let d = document2.createElement("monster-testclass"); let p1 = document2.createElement("p"); let t1 = document2.createTextNode("test1"); p1.appendChild(t1); let p = document2.createElement("div"); let t = document2.createTextNode("test"); p.appendChild(p1); p.appendChild(t); d.appendChild(p); let div = document2.getElementById("test1"); div.append(d); let n1 = document2.createElement("p"); expect23(d.hasNode(n1)).to.be.false; expect23(d.hasNode(t)).to.be.true; expect23(d.hasNode(p)).to.be.true; expect23(d.hasNode(p1)).to.be.true; expect23(d.hasNode(t1)).to.be.true; }); it("hasNode monster-testclass2 should return ...", function() { let d = document2.createElement("monster-testclass2"); let p1 = document2.createElement("p"); let t1 = document2.createTextNode("test1"); p1.appendChild(t1); let p = document2.createElement("div"); let t = document2.createTextNode("test"); p.appendChild(p1); p.appendChild(t); let div = document2.getElementById("test1"); div.append(d); let a2 = d.shadowRoot.getElementById("container"); d.shadowRoot.getElementById("container").appendChild(p); let n1 = document2.createElement("p"); expect23(d.hasNode(n1)).to.be.false; expect23(d.hasNode(t)).to.be.true; expect23(d.hasNode(p)).to.be.true; expect23(d.hasNode(p1)).to.be.true; expect23(d.hasNode(t1)).to.be.true; }); }); }); }); // test/cases/dom/focusmanager.mjs init_focusmanager(); describe("FocusManager", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); beforeEach(() => { initMutationObserverForTesting(); }); afterEach(() => { cleanupDOMFromTesting(); document.getElementById("mocks").innerHTML = ""; }); describe("new", function() { it("should instance of FocusManager", function() { expect(new FocusManager()).is.instanceof(FocusManager); }); }); describe("store and restore", function() { let manager; beforeEach(() => { manager = new FocusManager(); document.getElementById("mocks").innerHTML = ` <input class="testit" id="tx1"> <input class="testit" id="tx2"> <input class="testit" id="tx3" disabled> <input class="testit" id="tx4"> <p class="testit" tabindex="2" id="tx5">hello</p> <input class="testit" id="tx6" aria-hidden="true"> <button class="testit" id="tx7"></button> `; for (const [, element] of Object.entries(document.querySelectorAll(".testit"))) { element.getBoundingClientRect = () => ({ width: 200, height: 200, top: 0, left: 0, right: 200, bottom: 200 }); } }); it("run ist", function() { manager.focus(document.getElementById("tx1")); manager.storeFocus(); const e1 = manager.getActive(); expect(e1.getAttribute("id"), "error1").to.be.equal("tx1"); manager.focus(document.getElementById("tx2")); manager.storeFocus(); expect(manager.getActive().getAttribute("id"), "error2").to.be.equal("tx2"); manager.focusNext(); expect(manager.getActive().getAttribute("id"), "error3").to.be.equal("tx4"); manager.focusNext(); expect(manager.getActive().getAttribute("id"), "error4").to.be.equal("tx5"); manager.restoreFocus(); expect(manager.getActive().getAttribute("id"), "error5").to.be.equal("tx2"); manager.restoreFocus(); expect(manager.getActive().getAttribute("id"), "error6").to.be.equal("tx1"); manager.restoreFocus(); expect(manager.getActive().getAttribute("id"), "error7").to.be.equal("tx1"); }); }); describe("returntype", function() { let focusmanager; beforeEach(() => { focusmanager = new FocusManager(); }); it("check returns", function() { expect(focusmanager.getFocusable()).is.instanceof(Array); expect(focusmanager.getActive()).is.instanceof(HTMLElement); expect(focusmanager.focusNext()).is.instanceof(FocusManager); expect(focusmanager.focusPrev()).is.instanceof(FocusManager); expect(focusmanager.storeFocus()).is.instanceof(FocusManager); expect(focusmanager.focus(document.body)).is.instanceof(FocusManager); expect(focusmanager.restoreFocus()).is.instanceof(FocusManager); }); }); }); // test/cases/dom/find.mjs init_util(); function setupTestEnvironment() { class TestComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); } } if (!customElements.get("test-component")) { customElements.define("test-component", TestComponent); } } function cleanupTestEnvironment() { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; } describe("findElementWithIdUpwards", () => { before((done) => { initJSDOM().then(() => { setupTestEnvironment(); done(); }); }); after(() => { cleanupTestEnvironment(); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <div id="container"> <div id="parent"> <div id="child"></div> </div> </div>`; const shadowHost = document.createElement("div"); document.body.appendChild(shadowHost); const shadowRoot = shadowHost.attachShadow({ mode: "open" }); const innerElement = document.createElement("div"); innerElement.id = "inner"; shadowRoot.appendChild(innerElement); }); it("should find the element with the target ID in the normal DOM", () => { const child = document.getElementById("child"); const result = findElementWithIdUpwards(child, "parent"); expect(result).to.equal(document.getElementById("parent")); }); it("should find the element with the target ID in the shadow DOM", () => { const innerElement = document.querySelector("div[shadowroot] > div"); const result = findElementWithIdUpwards(innerElement, "inner"); expect(result).to.equal(innerElement); }); it("should return null if the element with the target ID is not found", () => { const child = document.getElementById("child"); const result = findElementWithIdUpwards(child, "nonexistent"); expect(result).to.be.null; }); }); // test/cases/dom/ready.mjs var windowReady2; var domReady2; describe("Ready", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_ready(), ready_exports)).then((m) => { domReady2 = m["domReady"]; windowReady2 = m["windowReady"]; done(); }); }); }); describe("domReady", function() { it("resolve promise", function(done) { domReady2.then(done).catch((e) => done(e)); }); }); describe("windowReady", function() { it("resolve promise", function(done) { windowReady2.then(done).catch((e) => done(e)); }); }); }); // test/cases/dom/util.mjs init_util(); init_util(); describe("DOM", function() { before(async function() { initJSDOM(); }); describe("getDocument()", function() { it("should return document object", function() { let d = getDocument(); expect(typeof d).is.equal("object"); }); }); describe("getWindow()", function() { it("should return document object", function() { let d = getWindow2(); expect(typeof d).is.equal("object"); }); }); describe("getDocumentFragmentFromString()", function() { [ ["<div></div>"], ["<div><div>2</div></div>"], ["<div><div>2</div>", "<div><div>2</div></div>"] // test invalid html ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (!b) b = a2; it("should return documentFragment object " + a2, function() { let fragment = getDocumentFragmentFromString(a2); expect(fragment).to.be.instanceOf(DocumentFragment); var div = document.createElement("div"); div.appendChild(fragment.cloneNode(true)); expect(div.innerHTML).to.be.equal(b); }); }); }); describe("getContainingDocument", () => { let jsDomDocument; beforeEach(() => { jsDomDocument = getDocument(); }); it("should throw an error when called with an invalid argument", () => { expect(() => getContainingDocument(null)).to.throw("Invalid argument. Expected an HTMLElement."); }); it("should return the correct containing document for an element in the main document", () => { const element = jsDomDocument.createElement("div"); const containingDocument = getContainingDocument(element); expect(containingDocument).to.null; }); it("should return the correct containing document for an element inside a shadow root", () => { const host = jsDomDocument.createElement("div"); const shadowRoot = host.attachShadow({ mode: "open" }); const element = jsDomDocument.createElement("span"); shadowRoot.appendChild(element); const containingDocument = getContainingDocument(element); expect(containingDocument).to.not.null; }); it("should return the correct containing document for an element inside a nested shadow root", () => { const outerHost = jsDomDocument.createElement("div"); const outerShadowRoot = outerHost.attachShadow({ mode: "open" }); const innerHost = jsDomDocument.createElement("div"); outerShadowRoot.appendChild(innerHost); const innerShadowRoot = innerHost.attachShadow({ mode: "open" }); const element = jsDomDocument.createElement("span"); innerShadowRoot.appendChild(element); const containingDocument = getContainingDocument(element); expect(containingDocument).to.not.null; }); it("should return null when the element is not attached to any document", () => { const detachedElement = jsDomDocument.createElement("div"); detachedElement.remove(); const containingDocument = getContainingDocument(detachedElement); expect(containingDocument).to.be.null; }); }); }); // test/cases/dom/customelement-initfromscripthost.mjs init_util(); var expect24 = expect; use(chaiDom); describe("DOM", function() { let CustomElement2, registerCustomElement2, TestComponent, document2, TestComponent2, assignUpdaterToElement; describe("initFromScriptHost()", function() { const randomTagNumber = "monster-test" + Math.floor(Math.random() * 1e6); before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_customelement(), customelement_exports)).then((m) => { try { CustomElement2 = m["CustomElement"]; registerCustomElement2 = m["registerCustomElement"]; TestComponent2 = class extends CustomElement2 { static getTag() { return randomTagNumber; } /** * * @return {Object} */ get defaults() { return Object.assign({}, super.defaults, { test: 0, templates: { main: '<h1></h1><article><p>test</p><div id="container"></div></article>' } }); } }; registerCustomElement2(TestComponent2); document2 = getDocument(); done(); } catch (e) { done(e); } }).catch((e) => { done(e); }); }); }); afterEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = ""; }); describe("call callback", function() { it("should not found callback and add error attribute", function() { let mocks = document2.getElementById("mocks"); mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`; let control = document2.createElement(randomTagNumber); control.setAttribute("data-monster-script-host", "call-back-host"); document2.getElementById("container").appendChild(control); expect24(control.getOption("test")).is.eql(0); expect24(control.hasAttribute("data-monster-error")).is.true; }); it("should found callback initCustomControlCallback", function() { let mocks = document2.getElementById("mocks"); mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`; const container = document2.getElementById("call-back-host"); container.initCustomControlCallback = function(control2) { control2.setOption("test", 1); }; let control = document2.createElement(randomTagNumber); control.setAttribute("data-monster-script-host", "call-back-host"); document2.getElementById("container").appendChild(control); expect24(control.getOption("test")).is.eql(1); expect24(control.hasAttribute("data-monster-error")).is.false; }); it("should found callback initCustomControlCallback from self", function() { let mocks = document2.getElementById("mocks"); mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`; let control = document2.createElement(randomTagNumber); expect24(control.getOption("test")).is.eql(0); control.initCustomControlCallback = function(control2) { control2.setOption("test", 2); }; control.setAttribute("data-monster-script-host", "call-back-host"); document2.getElementById("container").appendChild(control); expect24(control.getOption("test")).is.eql(2); expect24(control.hasAttribute("data-monster-error")).is.false; }); }); }); }); // test/cases/dom/slotted-nodes.mjs init_slotted(); describe("getSlottedNodes", () => { it("should return an empty Set if there is no ShadowRoot", () => { expect(getSlottedNodes).is.a("function"); }); }); // test/cases/dom/attributes.mjs init_attributes(); var html114; var html29; var html32; describe("Attributes", function() { before(function(done) { html114 = `<div id="test1"></div>`; html29 = `<div id="test1"> <div id="sub1"> <div id="sub2"> <div id="sub3"> <div id="sub4"> <div id="sub5"></div> </div> </div> </div> </div> </div> `; html32 = `<div data-monster-role="test1"> <div data-monster-role="sub1" id="a1" class="sub1"> <div data-monster-role="sub2" id="a2" class="sub2"> <div data-monster-role="sub3" id="a3" class="sub3"> <div data-monster-role="sub4" id="a4" class="sub4"> <div data-monster-role="sub5" id="a5" class="sub5"></div> </div> </div> </div> </div> </div> `; initJSDOM().then(() => { done(); }).catch((e) => done(e)); }); describe("ObjectLink", function() { const symbol2 = Symbol("mytest"); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html114; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should handle object-links", function() { let obj = { a: 1 }; let element = document.getElementById("test1"); expect(hasObjectLink(element, symbol2)).to.be.false; addToObjectLink(element, symbol2, obj); expect(hasObjectLink(element, symbol2)).to.be.true; let o = getLinkedObjects(element, symbol2).next(); expect(o.value).to.equal(obj); removeObjectLink(element, symbol2); expect(hasObjectLink(element, symbol2)).to.be.false; expect(() => getLinkedObjects(element, symbol2)).to.throw(Error); }); }); describe("findClosestObjectLink()", function() { const symbol2 = Symbol("mytest"); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html29; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); it("should return objectlink", function() { let sub4 = document.getElementById("sub4"); let sub2 = document.getElementById("sub2"); let obj = {}; expect(hasObjectLink(sub2, symbol2)).to.be.false; addToObjectLink(sub2, symbol2, obj); expect(hasObjectLink(sub2, symbol2)).to.be.true; let element = findClosestObjectLink(sub4); expect(element).is.instanceOf(HTMLDivElement); expect(element.getAttribute("id")).to.be.equal("sub2"); }); }); describe("Attributes", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html32; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("find closest Attributes", function() { [ ["a5", "data-monster-role", void 0, "sub5"], ["a5", "data-monster-role", "sub3", "sub3"], ["a5", "data-monster-role", "sub1", "sub1"], ["a4", "data-monster-role", "sub1", "sub1"], ["a3", "data-monster-role", "sub1", "sub1"], ["a2", "data-monster-role", void 0, "sub2"], ["a5", "data-monster-role", "sub5", "sub5"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); it("findClosestByAttribute(" + a2 + ", " + b + "," + c + ") should return " + d, function() { expect(findClosestByAttribute(document.getElementById(a2), b, c).getAttribute("data-monster-role")).to.be.equal(d); }); }); }); describe("find closest Element with class", function() { [ ["a5", "sub3", "sub3"], ["a5", "sub1", "sub1"], ["a4", "sub1", "sub1"], ["a3", "sub1", "sub1"], ["a5", "sub5", "sub5"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("findClosestByClass(" + a2 + ", " + b + ") should return " + c, function() { expect(findClosestByClass(document.getElementById(a2), b).getAttribute("class")).to.be.equal(c); }); }); }); }); describe("Attributes", function() { beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html114; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); const atributeKey = "data-test"; it("toggleAttributeToken(element, key, value)", function() { let element = document.getElementById("test1"); expect(element.hasAttribute(atributeKey)).to.be.false; element.setAttribute(atributeKey, "apple bananna"); toggleAttributeToken(element, atributeKey, "pinapple"); expect(element.getAttribute(atributeKey)).to.be.equal("apple bananna pinapple"); toggleAttributeToken(element, atributeKey, "pinapple"); expect(element.getAttribute(atributeKey)).to.be.equal("apple bananna"); }); it("addAttributeToken(element, key, value)", function() { let element = document.getElementById("test1"); expect(element.hasAttribute(atributeKey)).to.be.false; addAttributeToken(element, atributeKey, "pinapple"); expect(element.getAttribute(atributeKey)).to.be.equal("pinapple"); addAttributeToken(element, atributeKey, "bananna"); expect(element.getAttribute(atributeKey)).to.be.equal("pinapple bananna"); }); it("removeAttributeToken(element, key, value)", function() { let element = document.getElementById("test1"); element.setAttribute(atributeKey, "apple bananna lemmon"); removeAttributeToken(element, atributeKey, "pinapple"); expect(element.getAttribute(atributeKey)).to.be.equal("apple bananna lemmon"); removeAttributeToken(element, atributeKey, "bananna"); expect(element.getAttribute(atributeKey)).to.be.equal("apple lemmon"); }); it("containsAttributeToken(element, key, value)", function() { let element = document.getElementById("test1"); expect(containsAttributeToken(element, atributeKey, "pinapple")).to.be.false; element.setAttribute(atributeKey, "apple bananna"); expect(containsAttributeToken(element, atributeKey, "pinapple")).to.be.false; expect(containsAttributeToken(element, atributeKey, "bananna")).to.be.true; expect(containsAttributeToken(element, atributeKey, "apple")).to.be.true; }); it(" replaceAttributeToken(element, key, value)", function() { let element = document.getElementById("test1"); element.setAttribute(atributeKey, "apple bananna tomato"); replaceAttributeToken(element, atributeKey, "tomato", "lemmon"); expect(element.getAttribute(atributeKey)).to.be.equal("apple bananna lemmon"); replaceAttributeToken(element, atributeKey, "bananna", "pear"); expect(element.getAttribute(atributeKey)).to.be.equal("apple pear lemmon"); }); it("clearAttributeTokens(element, key)", function() { let element = document.getElementById("test1"); element.setAttribute(atributeKey, "apple bananna"); clearAttributeTokens(element, atributeKey); expect(element.getAttribute(atributeKey)).to.be.equal(""); }); }); }); // test/cases/dom/resource.mjs var Resource2; var DerivedResource; describe("Resource", function() { before(function(done) { initJSDOM().then(() => { Promise.resolve().then(() => (init_resource(), resource_exports)).then((m) => { Resource2 = m["Resource"]; DerivedResource = class extends Resource2 { constructor() { super({ "data-url": "http://example.com" }); } static getURLAttribute() { return "data-url"; } }; done(); }); }); }); describe("DerivedResource", function() { it("should instanceof Resource", function() { expect(new DerivedResource()).to.be.an.instanceof(Resource2); }); }); }); // test/cases/dom/resourcemanager.mjs init_resourcemanager(); describe("ResourceManager", function() { let fetchReference4, returnStatus; before(function(done) { initJSDOM().then(() => { done(); }).catch((e) => done(e)); }); afterEach(() => { globalThis["fetch"] = fetchReference4; cleanupDOMFromTesting(); }); beforeEach(() => { initMutationObserverForTesting(); returnStatus = 200; fetchReference4 = globalThis["fetch"]; globalThis["fetch"] = function(url, options2) { if (!url) throw new Error("missing url"); return new Promise((resolve, reject) => { resolve({ text: function() { return JSON.stringify({ a: "test" }); }, status: returnStatus }); }); }; }); describe("new", function() { it("new ResourceManager() should return ResourceManager object", function() { let d = new ResourceManager(); expect(d).to.be.instanceOf(ResourceManager); }); }); describe("load resources", function() { let manager; beforeEach(() => { manager = new ResourceManager(); }); it("add script should instance of ResourceManager", function() { expect(manager.addScript("/example.js")).to.be.instanceOf(ResourceManager); }); it("add style should instance of ResourceManager", function() { expect(manager.addStylesheet("/style.js")).to.be.instanceOf(ResourceManager); }); it("add data should instance of ResourceManager", function() { expect(manager.addData("/data.json")).to.be.instanceOf(ResourceManager); }); describe("connect resources", function() { it("add script and connect should instance of ResourceManager", function() { expect(manager.addScript("/example.js").connect()).to.be.instanceOf(ResourceManager); }); it("add style and connect should instance of ResourceManager", function() { expect(manager.addStylesheet("/style.js").connect()).to.be.instanceOf(ResourceManager); }); it("add data and connect should instance of ResourceManager", function() { expect(manager.addData("/data.json").connect()).to.be.instanceOf(ResourceManager); }); }); describe("check availability resources", function() { it("add script and check availability should return Promise", function() { expect(manager.addScript("/example.js").available()).to.be.instanceOf(Promise); }); it("add style and check availability should should return Promise", function() { expect(manager.addStylesheet("/style.js").available()).to.be.instanceOf(Promise); }); it("add data and check availability should should return Promise", function() { expect(manager.addData("/data.json").available()).to.be.instanceOf(Promise); }); }); describe("check availability example.json", function() { it("add data and check content", function(done) { manager.addData("https://example.com/example.json").connect().available().then((r) => { expect(document.querySelector("html").outerHTML).contains('>{"a":"test"}<\/script></head>'); done(); }).catch((e) => done(e)); }); }); }); }); // source/dom/assembler.mjs init_base(); init_global(); init_proxyobserver(); init_validate(); var ATTRIBUTEPREFIX = "data-monster-"; var Assembler = class extends Base { /** * @param {DocumentFragment} fragment * @throws {TypeError} value is not an instance of * @throws {TypeError} value is not a function * @throws {Error} the function is not defined */ constructor(fragment) { super(); this.attributePrefix = ATTRIBUTEPREFIX; validateInstance(fragment, getGlobalFunction("DocumentFragment")); this.fragment = fragment; } /** * * @param {string} prefix * @return {Assembler} * @throws {TypeError} value is not a string */ setAttributePrefix(prefix) { validateString(prefix); this.attributePrefix = prefix; return this; } /** * * @return {string} */ getAttributePrefix() { return this.attributePrefix; } /** * * @param {ProxyObserver|undefined} data * @return {DocumentFragment} * @throws {TypeError} value is not an instance of */ createDocumentFragment(data) { if (data === void 0) { data = new ProxyObserver({}); } validateInstance(data, ProxyObserver); const fragment = this.fragment.cloneNode(true); return fragment; } }; // test/cases/dom/assembler.mjs describe("Assembler", function() { before(async function() { initJSDOM(); }); describe("createDocumentFragment()", function() { it("should return <div>One</div><div>Two</div>", function() { let fragment = document.createRange().createContextualFragment("<div>One</div><div>Two</div>"); let f = new Assembler(fragment); let container = document.createElement("div"); container.appendChild(f.createDocumentFragment().cloneNode(true)); expect(container.innerHTML).to.be.equal("<div>One</div><div>Two</div>"); }); }); describe("createDocumentFragment()", function() { it("should return DocumentFragment object", function() { let d = new Assembler(document.createDocumentFragment()); expect(d.createDocumentFragment()).to.be.instanceOf(DocumentFragment); }); }); describe("new", function() { it("new Renderer() should return Assembler object", function() { let d = new Assembler(document.createDocumentFragment()); expect(d).to.be.instanceOf(Assembler); }); }); describe("getAttributePrefix()", function() { it("should return " + ATTRIBUTEPREFIX, function() { let d = new Assembler(document.createDocumentFragment()); expect(d.getAttributePrefix()).to.be.equal(ATTRIBUTEPREFIX); }); }); describe("setAttributePrefix().getAttributePrefix()", function() { it("should return same value", function() { let d = new Assembler(document.createDocumentFragment()); expect(d.setAttributePrefix("test01").getAttributePrefix()).to.be.equal("test01"); }); }); }); // test/cases/dom/customcontrol.mjs init_util(); var expect25 = expect; use(chaiDom); var html115 = ` <div id="test1"> </div> `; describe("DOM", function() { let CustomControl2, registerCustomElement2, TestComponent, document2, jsdomFlag; before(function(done) { initJSDOM({}).then(() => { Promise.resolve().then(() => (init_dist(), dist_exports)).then((m) => { m.polyfill(); }); jsdomFlag = navigator.userAgent.includes("jsdom"); Promise.resolve().then(() => (init_customelement(), customelement_exports)).then((m) => { registerCustomElement2 = m["registerCustomElement"]; Promise.resolve().then(() => (init_customcontrol(), customcontrol_exports)).then((m2) => { document2 = getDocument(); try { CustomControl2 = m2["CustomControl"]; TestComponent = class extends CustomControl2 { static getTag() { return "monster-customcontrol"; } }; registerCustomElement2(TestComponent); done(); } catch (e) { done(e); } }); }).catch((e) => { done(e); }); }); }); describe("formDisabledCallback()", function() { let element; beforeEach(() => { try { const TestComponent2 = class extends CustomControl2 { /** * A description of the entire function. * * @return {string} description of return value */ static getTag() { return "monster-customcontrol2"; } }; registerCustomElement2(TestComponent2); } catch (e) { expect25(e).to.be.not.null; } element = document2.createElement("monster-customcontrol2"); }); afterEach(() => { }); it("should return undefined", function() { expect25(element.formDisabledCallback()).to.be.undefined; expect25(element.hasAttribute("disabled")).to.be.false; expect25(element.formDisabledCallback(true)).to.be.undefined; expect25(element.hasAttribute("disabled")).to.be.true; const d = element.getAttribute("disabled"); expect25(d).to.not.be.null; }); }); describe("CustomControl()", function() { beforeEach(() => { initMutationObserverForTesting(); let mocks = document2.getElementById("mocks"); mocks.innerHTML = html115; }); afterEach(() => { let mocks = document2.getElementById("mocks"); mocks.innerHTML = ""; cleanupDOMFromTesting(); }); describe("create", function() { it("should return custom-element object", function() { let d; try { d = new TestComponent(); } catch (e) { expect25(e).to.be.null; } expect25(typeof d).is.equal("object"); }); }); describe("connect empty element", function() { it("document should contain monster-customcontrol", function() { let d = document2.createElement("monster-customcontrol"); document2.getElementById("test1").appendChild(d); expect25(document2.getElementsByTagName("monster-customcontrol").length).is.equal(1); expect25(document2.getElementById("test1")).contain.html('<monster-customcontrol data-monster-error="Error: html is not set."></monster-customcontrol>'); }); }); describe("Test ElementInternals", function() { let form; beforeEach(() => { form = document2.createElement("form"); }); it("formAssociated", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(d.constructor.formAssociated).to.be.true; }); it("form", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(d.form).to.be.instanceof(HTMLFormElement); }); it("value getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(() => d.value).to.throw(Error); }); it("value setter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(() => d.value = 4).to.throw(Error); }); it("setFormValue", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("name getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(d.name).to.be.null; }); it("type getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(d.type).to.be.equal("monster-customcontrol"); }); it("validity getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("validationMessage getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("willValidate getter", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("checkValidity()", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("reportValidity()", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); }); it("setValidity()", function() { let d = document2.createElement("monster-customcontrol"); form.appendChild(d); expect25(d.setValidity({ "valueMissing": true }, "my message")).to.be.undefined; }); }); }); }); // test/cases/dom/template.mjs init_constants2(); init_template(); describe("Template", function() { before(async function() { initJSDOM(); }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <template id="mytemplate"></template>`; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); describe("create HTMLFragment", function() { [ ["<div>first</div><div>second</div>"], ["<div>first</div>"], ["<div>first</div><p>second</p>"] ].forEach(function(data) { let a2 = data.shift(); it("new Template().getNewDocumentFragmentAsString() should return string", function() { let template = document.createElement("template"); template.innerHTML = a2; let t = new Template(template); var container = document.createElement("div"); container.appendChild(t.createDocumentFragment()); expect(container.innerHTML).to.be.equal(a2); }); }); }); describe("create instance", function() { it("new Template() should return document object", function() { let d = new Template(document.createElement("template")); expect(d).to.be.instanceOf(Template); }); }); describe(".getTemplateElement()", function() { it("new Template().getTemplateElement() should return HTMLTemplateElement object", function() { let d = new Template(document.createElement("template")); expect(d.getTemplateElement()).to.be.instanceOf(HTMLTemplateElement); }); }); describe(".findDocumentTemplate()", function() { it("should throw Template not found", function() { const div = document.createElement("div"); expect(() => { findDocumentTemplate("noway", div); }).to.throws(Error); }); }); describe(".findDocumentTemplate()", function() { describe("Template", function() { it("should find template over ownerDocument", function() { const div = document.createElement("div"); div.remove(); const a2 = document.documentElement.outerHTML; let t = findDocumentTemplate("mytemplate", div); expect(t).is.instanceof(Template); }); }); describe("Thmened Template", function() { let memAttributeValue; beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ` <template id="mytemplate"><p>1</p></template> <template id="mytemplate-monster"><p>2</p></template> <template id="mytemplate-testtheme"><p>4</p></template> <template id="myprefix-mytemplate-monster"><p>3</p></template> `; let html = document.querySelector("html"); if (html.hasAttribute(ATTRIBUTE_THEME_NAME)) { memAttributeValue = html.getAttribute(ATTRIBUTE_THEME_NAME); } }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; let html = document.querySelector("html"); if (html.hasAttribute(ATTRIBUTE_THEME_NAME)) { html.removeAttribute(ATTRIBUTE_THEME_NAME); } if (memAttributeValue) { html.setAttribute(ATTRIBUTE_THEME_NAME, memAttributeValue); } }); it("should find template over ownerDocument", function() { let html = document.querySelector("html"); const div = document.createElement("div"); div.setAttribute("data-monster-template-prefix", "myprefix"); div.remove(); let t1 = findDocumentTemplate("mytemplate", div); expect(t1).is.instanceof(Template); expect(t1.createDocumentFragment().textContent).is.equal("3"); div.removeAttribute("data-monster-template-prefix"); let t2 = findDocumentTemplate("mytemplate", div); expect(t2).is.instanceof(Template); expect(t2.createDocumentFragment().textContent).is.equal("2"); html.setAttribute(ATTRIBUTE_THEME_NAME, "testtheme"); let a2 = html.outerHTML; let t3 = findDocumentTemplate("mytemplate", div); expect(t3).is.instanceof(Template); expect(t3.createDocumentFragment().textContent).is.equal("4"); }); }); }); }); // test/cases/dom/events.mjs init_events(); describe("Events", function() { before(async function() { await initJSDOM(); }); describe("findTargetElementFromEvent()", function() { it("find object", function(done) { let container = document.createElement("div"); container.setAttribute("data-monster", "hello"); let div = document.createElement("div"); container.appendChild(div); div.addEventListener("click", (event) => { let e = findTargetElementFromEvent(event, "data-monster"); expect(e.getAttribute("data-monster")).to.be.equal("hello"); done(); }); setTimeout(() => { fireEvent(div, "click"); }, 0); }); }); describe("fireEvent()", function() { it("should fire a click event", function(done) { let div = document.createElement("div"); div.addEventListener("click", () => { done(); }); fireEvent(div, "click"); }); it("should fire a touch event", function(done) { let div = document.createElement("div"); div.addEventListener("touch", () => { done(); }); fireEvent(div, "touch"); }); it("should fire a touch event on collection", function(done) { let div = document.createElement("div"); div.addEventListener("touch", () => { done(); }); div.appendChild(document.createElement("div")); let collection = div.querySelectorAll("div"); fireEvent(collection, "touch"); }); it("should fire a touch event", function(done) { let div = document.createElement("div"); div.addEventListener("touch", () => { done(); }); div.appendChild(document.createElement("div")); let collection = div.querySelectorAll("div"); fireEvent(collection, "touch"); }); it("should throw error", function() { expect(() => fireEvent({}, "touch")).to.throw(Error); }); }); describe("fireCustomEvent()", function() { it("should fire a click event", function(done) { let div = document.createElement("div"); div.addEventListener("click", () => { done(); }); fireCustomEvent(div, "click"); }); it("should fire a touch event", function(done) { let div = document.createElement("div"); div.addEventListener("touch", () => { done(); }); fireCustomEvent(div, "touch"); }); it("should fire a touch event on collection1", function(done) { let div = document.createElement("div"); div.addEventListener("touch", (e) => { if (e.detail.detail !== "hello world") { done("error"); } done(); }); div.appendChild(document.createElement("div")); let collection = div.querySelectorAll("div"); fireCustomEvent(collection, "touch", "hello world"); }); it("should fire a touch event on collection2", function(done) { let div = document.createElement("div"); div.addEventListener("touch", (e) => { if (e.detail.a !== "hello world") { done("error"); } done(); }); div.appendChild(document.createElement("div")); let collection = div.querySelectorAll("div"); fireCustomEvent(collection, "touch", { a: "hello world" }); }); it("should fire a touch event", function(done) { let div = document.createElement("div"); div.addEventListener("touch", () => { done(); }); div.appendChild(document.createElement("div")); let collection = div.querySelectorAll("div"); fireCustomEvent(collection, "touch"); }); it("should throw error", function() { expect(() => fireCustomEvent({}, "touch")).to.throw(Error); }); }); }); // source/data/datasource/dom.mjs init_constants(); init_util(); init_is(); var DomStorage = class extends Datasource { /** * @param {Object} [options] options contains definitions for the datasource. */ constructor(options2) { super(); if (isObject(options2)) { this.setOptions(options2); } } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/storage/dom-storage"); } /** * @property {Object} defaults * @property {Object} defaults.read * @property {string} defaults.read.selector * @property {Object} defaults.write * @property {string} defaults.write.selector */ get defaults() { return Object.assign({}, super.defaults, { read: { selector: void 0 }, write: { selector: void 0 } }); } /** * @return {Promise} * @throws {Error} The read selector is not defined * @throws {Error} There are no storage element */ read() { const selector = this.getOption("read.selector", void 0); if (!selector) { throw new Error("The read selector is not defined"); } const storage = findElementWithSelectorUpwards(this, selector); if (!storage) { throw new Error("There is no storage element"); } return new Promise((resolve, reject) => { try { const data = JSON.parse(storage.innerHTML); this.set(data); resolve(data); } catch (e) { reject(e); } }); } /** * @return {Promise} * @throws {Error} The write selector is not defined * @throws {Error} There are no storage element */ write() { const selector = this.getOption("write.selector"); if (!selector) { throw new Error("The option write.selector is not defined"); } const storage = findElementWithSelectorUpwards(this, selector); if (!storage) { throw new Error("There is no storage element"); } return new Promise((resolve, reject) => { try { storage.innerHTML = JSON.stringify(this.get()); resolve(storage); } catch (e) { reject(e); } }); } }; // test/cases/data/datasource/dom.mjs describe("ServeDomr", function() { it("should init", function() { const dom = new DomStorage({}); expect(dom).to.be.not.null; }); }); // source/data/datasource/storage/localstorage.mjs init_constants(); init_global(); var LocalStorage = class _LocalStorage extends Storage { /** * @throws {Error} this method must be implemented by derived classes. * @return {external:localStorage} * @private */ [storageObjectSymbol]() { return getGlobalObject("localStorage"); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/storage/localstorage"); } /** * Create clone * @return {LocalStorage} */ getClone() { return new _LocalStorage( this[internalSymbol].getRealSubject()["options"].key ); } }; // test/util/localstorage.mjs function createStorage() { let UNSET = Symbol(); let s = {}, noopCallback = () => { }, _itemInsertionCallback = noopCallback; Object.defineProperty(s, "setItem", { get: () => { return (k, v = UNSET) => { if (v === UNSET) { throw new TypeError(`Failed to execute 'setItem' on 'Storage': 2 arguments required, but only 1 present.`); } k = k + ""; if (!s.hasOwnProperty(k)) { _itemInsertionCallback(s.length); } s[k] = v + ""; }; } }); Object.defineProperty(s, "getItem", { get: () => { return (k) => { k = k + ""; if (s.hasOwnProperty(k)) { return s[k]; } else { return null; } }; } }); Object.defineProperty(s, "removeItem", { get: () => { return (k) => { k = k + ""; if (s.hasOwnProperty(k)) { delete s[k]; } }; } }); Object.defineProperty(s, "clear", { get: () => { return () => { for (let k in s) { if (s.hasOwnProperty(k)) { delete s[k]; } } }; } }); Object.defineProperty(s, "length", { get: () => { return Object.keys(s).length; } }); Object.defineProperty(s, "key", { value: (k) => { let key = Object.keys(s)[k]; return !key ? null : key; } }); Object.defineProperty(s, "itemInsertionCallback", { get: () => { return _itemInsertionCallback; }, set: (v) => { if (!v || typeof v != "function") { v = noopCallback; } _itemInsertionCallback = v; } }); return s; } // test/cases/data/datasource/storage/localstorage.mjs var localStorageReference; describe("LocalStorage", function() { afterEach(() => { globalThis["localStorage"] = localStorageReference; }); beforeEach(function() { localStorageReference = globalThis["localStorage"]; globalThis["localStorage"] = createStorage(); }); it("should instance of LocalStorage ", function() { expect(new LocalStorage("mykey")).to.be.instanceof(LocalStorage); }); describe("rw", function() { it("read should return object", function(done) { const ds = new LocalStorage("mykey"); ds.read().then((data) => { done(); }).catch((e) => done(e)); }); it("write should ", function(done) { const ds = new LocalStorage("mykey"); ds.write().then((data) => { done(); }).catch((e) => done(e)); }); }); }); // source/data/datasource/storage/sessionstorage.mjs init_constants(); init_global(); var SessionStorage = class _SessionStorage extends Storage { /** * @throws {Error} this method must be implemented by derived classes. * @return {external:sessionStorage} * @private */ [storageObjectSymbol]() { return getGlobalObject("sessionStorage"); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/data/datasource/storage/session-storage" ); } /** * Create Clone * * @return {SessionStorage} */ getClone() { return new _SessionStorage( this[internalSymbol].getRealSubject()["options"].key ); } }; // test/cases/data/datasource/storage/sessionstorage.mjs var storageReference; describe("SessionStorage", function() { afterEach(() => { globalThis["sessionStorage"] = storageReference; }); beforeEach(function() { storageReference = globalThis["sessionStorage"]; globalThis["sessionStorage"] = createStorage(); }); it("should instance of SessionStorage ", function() { expect(new SessionStorage("mykey")).to.be.instanceof(SessionStorage); }); describe("rw", function() { it("read should return object", function(done) { const ds = new SessionStorage("mykey"); ds.read().then((data) => { done(); }).catch((e) => done(e)); }); it("write should ", function(done) { const ds = new SessionStorage("mykey"); ds.write().then((data) => { done(); }).catch((e) => done(e)); }); }); }); // source/data/datasource/server.mjs init_constants(); init_is(); init_diff(); init_pathfinder(); init_pipe(); var serverVersionSymbol = Symbol("serverVersion"); var Server = class extends Datasource { /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/server"); } /** * This prepares the data that comes from the server. * Should not be called directly. * * @private * @param {Object} payload * @return {Object} */ transformServerPayload(payload) { payload = doTransform.call(this, "read", payload); this[serverVersionSymbol] = payload; const dataPath = this.getOption("read.path"); if (dataPath) { payload = new Pathfinder(payload).getVia(dataPath); } return payload; } /** * This prepares the data for writing and should not be called directly. * * @private * @param {Object} payload * @return {Object} */ prepareServerPayload(payload) { payload = doTransform.call(this, "write", payload); payload = doDiff2.call(this, payload); const sheathingObject = this.getOption("write.sheathing.object"); const sheathingPath = this.getOption("write.sheathing.path"); if (sheathingObject && sheathingPath) { const sub = payload; payload = sheathingObject; new Pathfinder(payload).setVia(sheathingPath, sub); } return payload; } }; function doDiff2(obj) { if (this[serverVersionSymbol] === null || this[serverVersionSymbol] === void 0) { return obj; } const callback = this.getOption("write.partial.callback"); if (!isFunction(callback)) { return obj; } const results = diff(this[serverVersionSymbol], obj); if (!results) { return obj; } obj = callback(obj, results); this[serverVersionSymbol] = obj; return obj; } function doTransform(type3, obj) { const transformation = this.getOption(`${type3}.mapping.transformer`); if (transformation !== void 0 && transformation !== null) { const pipe = new Pipe(transformation); const callbacks = this.getOption(`${type3}.mapping.callbacks`); if (isArray(callbacks)) { for (const callback of callbacks) { if (typeof callback === "function") { pipe.setCallback(callback); } } } if (isObject(callbacks)) { for (const key in callbacks) { if (callbacks.hasOwnProperty(key) && typeof callbacks[key] === "function") { pipe.setCallback(key, callbacks[key]); } } } obj = pipe.run(obj); } return obj; } // test/cases/data/datasource/server.mjs describe("Server", function() { it("should transform data", function() { let writeCallbackCalled = false; let readCallbackCalled = false; const server = new Server({ write: { mapping: { transformer: "call:onWrite", callbacks: { onWrite: (data) => { writeCallbackCalled = true; return data; } } }, sheathing: { object: { demo: 1, data: { xyz: void 0 } }, path: "data.xyz" } }, read: { mapping: { transformer: "call:onRead", callbacks: { onRead: (data) => { readCallbackCalled = true; return data; } } }, path: "data.xyz" } }); expect(server.transformServerPayload({ demo: 1, data: { xyz: 2 } })).to.deep.equal({ demo: 1, data: { xyz: 2 } }); expect(server.prepareServerPayload({ demo: 1, data: { xyz: 2 } })).to.deep.equal({ demo: 1, data: { xyz: 2 } }); }); }); // source/data/datasource/server/webconnect.mjs init_constants(); init_is(); var webConnectSymbol = Symbol("connection"); var WebConnect2 = class _WebConnect extends Server { /** * * @param {Object} [options] options contains definitions for the datasource. */ constructor(options2) { super(); if (isString(options2)) { options2 = { url: options2 }; } if (!isObject(options2)) options2 = {}; this.setOptions(options2); this[webConnectSymbol] = new WebConnect({ url: this.getOption("url"), connection: { timeout: this.getOption("connection.timeout"), reconnect: { timeout: this.getOption("connection.reconnect.timeout"), attempts: this.getOption("connection.reconnect.attempts"), enabled: this.getOption("connection.reconnect.enabled") } } }); } /** * * @return {Promise} */ connect() { return this[webConnectSymbol].connect(); } /** * @return {boolean} */ isConnected() { return this[webConnectSymbol].isConnected(); } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/server/webconnect"); } /** * @property {string} url=undefined Defines the resource that you wish to fetch. * @property {Object} connection * @property {Object} connection.timeout=5000 Defines the timeout for the connection. * @property {Number} connection.reconnect.timeout The timeout in milliseconds for the reconnect. * @property {Number} connection.reconnect.attempts The maximum number of reconnects. * @property {Bool} connection.reconnect.enabled If the reconnect is enabled. * @property {Object} write={} Options * @property {Object} write.mapping the mapping is applied before writing. * @property {String} write.mapping.transformer Transformer to select the appropriate entries * @property {Monster.Data.Datasource~exampleCallback[]} write.mapping.callback with the help of the callback, the structures can be adjusted before writing. * @property {Object} write.sheathing * @property {Object} write.sheathing.object Object to be wrapped * @property {string} write.sheathing.path Path to the data * @property {Object} read={} Options * @property {String} read.path Path to data * @property {Object} read.mapping the mapping is applied after reading. * @property {String} read.mapping.transformer Transformer to select the appropriate entries * @property {Monster.Data.Datasource~exampleCallback[]} read.mapping.callback with the help of the callback, the structures can be adjusted after reading. */ get defaults() { return Object.assign({}, super.defaults, { url: void 0, write: { mapping: { transformer: void 0, callbacks: {} }, sheathing: { object: void 0, path: void 0 } }, read: { mapping: { transformer: void 0, callbacks: {} }, path: void 0 }, connection: { timeout: 5e3, reconnect: { timeout: 1e3, attempts: 1, enabled: false } } }); } /** * This method closes the connection. * * @return {Promise} */ close() { return this[webConnectSymbol].close(); } /** * @return {Promise} */ read() { return new Promise((resolve, reject) => { while (this[webConnectSymbol].dataReceived() === true) { let obj = this[webConnectSymbol].poll(); if (!isObject(obj)) { reject(new Error("The received data is not an object.")); return; } if (!(obj instanceof Message3)) { reject(new Error("The received data is not a Message.")); return; } obj = obj.getData(); obj = this.transformServerPayload.call(this, obj); this.set(obj); } resolve(this.get()); }); } /** * @return {Promise} */ write() { const obj = this.prepareServerPayload(this.get()); return this[webConnectSymbol].send(obj); } /** * @return {RestAPI} */ getClone() { return new _WebConnect(this[internalSymbol].getRealSubject()["options"]); } }; // test/cases/data/datasource/server/websocket.mjs var testUrl2 = "wss://ws.postman-echo.com/raw"; describe("Websocket", function() { let ds = void 0; before(function(done) { initWebSocket().then(() => { done(); }).catch((e) => { done(e); }); }); afterEach(function(done) { if (ds) { ds.close(); } for (const sym of Object.getOwnPropertySymbols(ds)) { if (sym.toString() === "Symbol(connection)") { const connection = ds[sym]; for (const sym2 of Object.getOwnPropertySymbols(connection)) { if (sym2.toString() === "Symbol(connection)") { const socket = connection[sym2]?.socket; if (socket) { if (typeof socket?.terminate === "function") { socket?.["terminate"](); } } } } } } done(); }); it("should get clone", function() { ds = new WebConnect2(testUrl2); const clone2 = ds.getClone(); expect(clone2).to.be.an.instanceof(WebConnect2); }); it("should transform data", function(done) { let writeCallbackCalled = false; let readCallbackCalled = false; ds = new WebConnect2({ url: testUrl2, write: { mapping: { transformer: "call:onWrite", callbacks: { onWrite: (data) => { writeCallbackCalled = true; return data; } } }, sheathing: { object: { demo: 1, data: { xyz: void 0 } }, path: "data.xyz" } }, read: { mapping: { transformer: "call:onRead", callbacks: { onRead: (data) => { readCallbackCalled = true; return data; } } }, path: "data.xyz" } }); ds.connect().then(() => { ds.set({ envelop: { message: "Hello World" } }); ds.write().then(() => { ds.set({}); expect(ds.get()).to.be.deep.equal({}); setTimeout(() => { ds.read().then(() => { expect(ds.get()).to.be.deep.equal({ envelop: { message: "Hello World" } }); expect(writeCallbackCalled).to.be.true; expect(readCallbackCalled).to.be.true; done(); }).catch((e) => { done(e); }); }, 200); }).catch((err) => { done(new Error(err)); }); }).catch((e) => { done(e); }); }); it("should connect", function(done) { ds = new WebConnect2({ url: testUrl2, reconnect: { enabled: false } }); ds.connect().then(() => { done(); }).catch((e) => { done(e); }); }); it("should send a message", function(done) { this.timeout(1e4); ds = new WebConnect2({ url: testUrl2, reconnect: { enabled: false } }); ds.connect().then(() => { ds.set({ envelop: { message: "Hello World" } }); ds.write().then(() => { ds.set({}); expect(ds.get()).to.be.deep.equal({}); setTimeout(() => { ds.read().then(() => { expect(ds.get()).to.be.deep.equal({ envelop: { message: "Hello World" } }); done(); }).catch((e) => { done(e); }); }, 500); }).catch((err) => { done(new Error(err)); }); }).catch((e) => { done(e); }); }); }); // source/data/datasource/server/restapi.mjs init_constants(); init_is(); init_diff(); // source/data/datasource/server/restapi/writeerror.mjs init_constants(); var WriteError = class extends Error { /** * * @param {string} message * @param {Response} response * @param {Object} validation */ constructor(message, response, validation) { super(message); this[internalSymbol] = { response, validation }; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/data/datasource/server/restapi/write-error" ); } /** * @return {Response} */ getResponse() { return this[internalSymbol]["response"]; } /** * @return {Object} */ getValidation() { return this[internalSymbol]["validation"]; } }; // source/data/datasource/server/restapi/data-fetch-error.mjs init_constants(); var DataFetchError = class extends Error { /** * * @param {string} message * @param {Response} response */ constructor(message, response) { super(message); this[internalSymbol] = { response }; } /** * This method is called by the `instanceof` operator. * @return {symbol} */ static get [instanceSymbol]() { return Symbol.for( "@schukai/monster/data/datasource/server/restapi/datafetcherror@@instance" ); } /** * @return {Response} */ getResponse() { return this[internalSymbol]["response"]; } }; // source/data/datasource/server/restapi.mjs init_clone(); var rawDataSymbol = Symbol.for( "@schukai/monster/data/datasource/server/restapi/rawdata" ); var RestAPI = class _RestAPI extends Server { /** * * @param {Object} [options] options contains definitions for the datasource. */ constructor(options2) { super(); if (isObject(options2)) { this.setOptions(options2); } } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/data/datasource/server/restapi"); } /** * @property {Object} write={} Options * @property {Object} write.init={} An option object, containing any custom settings that you want to apply to the request. The parameters are identical to those of the {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request|Request constructor} * @property {string} write.init.method=POST * @property {Object} write.init.headers Object containing any custom headers that you want to apply to the request. * @property {string} write.responseCallback Callback function to be executed after the request has been completed. * @property {string} write.acceptedStatus=[200,201] * @property {string} write.url URL * @property {Object} write.mapping the mapping is applied before writing. * @property {String} write.mapping.transformer Transformer to select the appropriate entries * @property {exampleCallback[]} write.mapping.callback with the help of the callback, the structures can be adjusted before writing. * @property {Object} write.report * @property {String} write.report.path Path to validations * @property {Object} write.partial * @property {Function} write.partial.callback Callback function to be executed after the request has been completed. (obj, diffResult) => obj * @property {Object} write.sheathing * @property {Object} write.sheathing.object Object to be wrapped * @property {string} write.sheathing.path Path to the data * @property {Object} read={} Options * @property {Object} read.init={} An option object containing any custom settings that you want to apply to the request. The parameters are identical to those of the {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request|Request constructor} * @property {string} read.init.method=GET * @property {array} read.acceptedStatus=[200] * @property {string} read.url URL * @property {Object} read.mapping the mapping is applied after reading. * @property {String} read.mapping.transformer Transformer to select the appropriate entries * @property {exampleCallback[]} read.mapping.callback with the help of the callback, the structures can be adjusted after reading. */ get defaults() { return Object.assign({}, super.defaults, { write: { init: { method: "POST" }, responseCallback: null, acceptedStatus: [200, 201], url: null, mapping: { transformer: null, callbacks: [] }, sheathing: { object: null, path: null }, report: { path: null }, partial: { callback: null } }, read: { init: { method: "GET" }, path: null, responseCallback: null, acceptedStatus: [200], url: null, mapping: { transformer: null, callbacks: [] } } }); } /** * @return {Promise} * @throws {Error} the options does not contain a valid json definition * @throws {TypeError} value is not a object * @throws {Error} the data cannot be read */ read() { let init3 = this.getOption("read.init"); if (!isObject(init3)) init3 = {}; if (!init3["method"]) init3["method"] = "GET"; let callback = this.getOption("read.responseCallback"); if (!callback) { callback = (obj) => { this.set(this.transformServerPayload.call(this, obj)); }; } return fetchData2.call(this, init3, "read", callback); } /** * @return {Promise} * @throws {WriteError} the data cannot be written */ write() { let init3 = this.getOption("write.init"); if (!isObject(init3)) init3 = {}; if (typeof init3["headers"] !== "object") { init3["headers"] = { "Content-Type": "application/json" }; } if (!init3["method"]) init3["method"] = "POST"; const obj = this.prepareServerPayload(this.get()); init3["body"] = JSON.stringify(obj); const callback = this.getOption("write.responseCallback"); return fetchData2.call(this, init3, "write", callback); } /** * @return {RestAPI} */ getClone() { const api = new _RestAPI(); const read2 = clone(this[internalSymbol].getRealSubject()["options"].read); const write2 = clone(this[internalSymbol].getRealSubject()["options"].write); api.setOption("read", read2); api.setOption("write", write2); return api; } }; function fetchData2(init3, key, callback) { let response; return fetch(this.getOption(`${key}.url`), init3).then((resp) => { response = resp; const acceptedStatus = this.getOption(`${key}.acceptedStatus`, [200]).map( Number ); if (acceptedStatus.indexOf(resp.status) === -1) { throw new DataFetchError( `the response does not contain an accepted status (actual: ${resp.status}).`, response ); } return resp.text(); }).then((body) => { let obj; try { obj = JSON.parse(body); response[rawDataSymbol] = obj; } catch (e) { if (body.length > 100) { body = `${body.substring(0, 97)}...`; } throw new DataFetchError( `the response does not contain a valid json (actual: ${body}).`, response ); } if (callback && isFunction(callback)) { callback(obj); } return response; }).catch((e) => { throw e; }); } // test/cases/data/datasource/server/restapi.mjs init_validate(); describe("RestAPI", function() { let fetchReference4; let returnStatus; afterEach(() => { globalThis["fetch"] = fetchReference4; }); beforeEach(() => { returnStatus = 200; fetchReference4 = globalThis["fetch"]; globalThis["fetch"] = function(options2) { return new Promise((resolve, reject) => { resolve({ text: function() { return new Promise((resolve2, reject2) => { resolve2(JSON.stringify({ a: "test" })); }); }, status: returnStatus }); }); }; }); it("should instance of RestAPI ", function() { expect(new RestAPI("https://monsterjs.org/assets/world.json")).to.be.instanceof(RestAPI); }); describe("rw", function() { it("read should return object", function(done) { const ds = new RestAPI({ url: "https://monsterjs.org/assets/world.json" }); ds.read().then((data) => { validateObject(data); done(); }).catch((e) => done(e)); }); it("write should ", function(done) { const ds = new RestAPI( { read: { url: "https://monsterjs.org/assets/world.json" }, write: { url: "https://monsterjs.org/assets/world.json", acceptedStatus: [99] } } ); ds.write().then((data) => { done("should not be here"); }).catch((e) => done()); }); }); describe("rw with errors", function() { it("read should throw exception", function(done) { returnStatus = 400; const ds = new RestAPI({ url: "https://monsterjs.org/assets/world.json" }); ds.read().then((data) => { done("should not run."); }).catch((e) => done()); }); it("write should ", function(done) { returnStatus = 400; const ds = new RestAPI({ url: "https://monsterjs.org/assets/world.json" }, { url: "https://monsterjs.org/assets/world.json" }); ds.write().then((data) => { validateObject(data); done("error"); }).catch((e) => done()); }); }); }); // test/cases/data/datasource.mjs describe("Datasource", function() { it("should instance of Datasource ", function() { expect(new Datasource()).to.be.instanceof(Datasource); }); describe("Options", function() { it("setOption should change value", function() { const datasource = new Datasource(); expect(datasource.getOption("default")).to.be.undefined; datasource.setOption("default", true); expect(datasource.getOption("default")).to.be.true; }); it("setOptions should set all values", function() { const datasource = new Datasource(); expect(datasource.getOption("default")).to.be.undefined; datasource.setOptions({ default: true }); expect(datasource.getOption("default")).to.be.true; }); }); describe("rw", function() { const datasource = new Datasource(); it("read should throw exeption", function() { expect(() => datasource.read()).to.throw(Error); }); it("write should throw exeption", function() { expect(() => datasource.read()).to.throw(Error); }); }); describe("get/set", function() { const datasource = new Datasource(); it("get should return undefined", function() { expect(datasource.get()).to.be.eql({}); }); it("write should throw exeption", function() { expect(datasource.get()).to.be.eql({}); expect(datasource.set({ a: "myvalue" })).to.be.instanceof(Datasource); expect(datasource.get()).to.be.eql({ a: "myvalue" }); }); }); }); // test/cases/data/buildmap.mjs init_buildmap(); describe("buildMap", function() { let convertMapResult = function(r) { if (r instanceof Map) { r = Object.fromEntries(r); if (r instanceof Array) { r = r.map((e) => { return convertMapResult(e); }); } else if (typeof r === "object") { for (const [k, o] of Object.entries(r)) { r[k] = convertMapResult(o); } } } return r; }; describe("build Map with callback", function() { it("definition should return map with sub and parent keys", function() { let obj = { "data": [ { "id": 10, "name": "Cassandra", "enrichment": { variants: [ { sku: 1, label: "XXS", price: [ { vk: "12.12 \u20AC" }, { vk: "12.12 \u20AC" } ] }, { sku: 2, label: "XS", price: [ { vk: "22.12 \u20AC" }, { vk: "22.12 \u20AC" } ] }, { sku: 3, label: "S", price: [ { vk: "32.12 \u20AC" }, { vk: "32.12 \u20AC" } ] }, { sku: 4, label: "L", price: [ { vk: "42.12 \u20AC" }, { vk: "42.12 \u20AC" } ] } ] } }, { "id": 20, "name": "Yessey!", "enrichment": { variants: [ { sku: 1, label: "XXS", price: [ { vk: "12.12 \u20AC" }, { vk: "12.12 \u20AC" } ] }, { sku: 2, label: "XS", price: [ { vk: "22.12 \u20AC" }, { vk: "22.12 \u20AC" } ] }, { sku: 3, label: "S", price: [ { vk: "32.12 \u20AC" }, { vk: "32.12 \u20AC" } ] }, { sku: 4, label: "L", price: [ { vk: "42.12 \u20AC" }, { vk: "42.12 \u20AC" } ] } ] } } ] }; let callback = function(subject) { let m = /* @__PURE__ */ new Map(); for (const [i2, b] of Object.entries(subject.data)) { let key1 = i2; for (const [j, c] of Object.entries(b.enrichment.variants)) { let key2 = j; for (const [k, d] of Object.entries(c.price)) { let key3 = k; d.name = b.name; d.label = c.label; d.id = [key1, key2, key3].join("."); m.set(d.id, d); } } } return m; }; let map = buildMap(obj, callback, "${name} ${label}", "${id}"); let i = convertMapResult(map); expect(JSON.stringify(i)).to.be.equal('{"0.0.0":"Cassandra XXS","0.0.1":"Cassandra XXS","0.1.0":"Cassandra XS","0.1.1":"Cassandra XS","0.2.0":"Cassandra S","0.2.1":"Cassandra S","0.3.0":"Cassandra L","0.3.1":"Cassandra L","1.0.0":"Yessey! XXS","1.0.1":"Yessey! XXS","1.1.0":"Yessey! XS","1.1.1":"Yessey! XS","1.2.0":"Yessey! S","1.2.1":"Yessey! S","1.3.0":"Yessey! L","1.3.1":"Yessey! L"}'); }); }); describe("build submap with *", function() { it('definition should return {"10":"Cassandra 10","20":"Yessey! 20"}', function() { let obj = { "data": [ { "id": 10, "name": "Cassandra" }, { "id": 20, "name": "Yessey!" } ] }; let map = buildMap(obj, "data.*", "${name} ${id}", "${id}"); let i = convertMapResult(map); expect(JSON.stringify(i)).to.be.equal('{"10":"Cassandra 10","20":"Yessey! 20"}'); }); }); describe("build submap with **", function() { it("definition should return Map", function() { let obj = { "data": [ { "id": 10, "name": "Cassandra", "enrichment": { variants: [ { sku: 1, label: "XXS", price: [ { vk: "12.12 \u20AC", id: 1 }, { vk: "12.12 \u20AC", id: 2 } ] }, { sku: 2, label: "XS", price: [ { vk: "22.12 \u20AC", id: 3 }, { vk: "22.12 \u20AC", id: 4 } ] }, { sku: 3, label: "S", price: [ { vk: "32.12 \u20AC", id: 5 }, { vk: "32.12 \u20AC", id: 6 } ] }, { sku: 4, label: "L", price: [ { vk: "42.12 \u20AC", id: 7 }, { vk: "42.12 \u20AC", id: 8 } ] } ] } }, { "id": 20, "name": "Yessey!", "enrichment": { variants: [ { sku: 1, label: "XXS", price: [ { vk: "12.12 \u20AC", id: 9 }, { vk: "12.12 \u20AC", id: 10 } ] }, { sku: 2, label: "XS", price: [ { vk: "22.12 \u20AC", id: 11 }, { vk: "22.12 \u20AC", id: 12 } ] }, { sku: 3, label: "S", price: [ { vk: "32.12 \u20AC", id: 13 }, { vk: "32.12 \u20AC", id: 14 } ] }, { sku: 4, label: "L", price: [ { vk: "42.12 \u20AC", id: 15 }, { vk: "42.12 \u20AC", id: 16 }, { vk: "44.12 \u20AC", id: 17 } ] } ] } } ] }; let map = buildMap(obj, "data.*.enrichment.variants.*.price.*", "${vk} ${^.label} ${^.^.name}", "${^.^.sku}"); let i = convertMapResult(map); expect(JSON.stringify(i)).to.be.equal('{"data.0.enrichment.variants.0.price.0":"12.12 \u20AC XXS Cassandra","data.0.enrichment.variants.0.price.1":"12.12 \u20AC XXS Cassandra","data.0.enrichment.variants.1.price.0":"22.12 \u20AC XS Cassandra","data.0.enrichment.variants.1.price.1":"22.12 \u20AC XS Cassandra","data.0.enrichment.variants.2.price.0":"32.12 \u20AC S Cassandra","data.0.enrichment.variants.2.price.1":"32.12 \u20AC S Cassandra","data.0.enrichment.variants.3.price.0":"42.12 \u20AC L Cassandra","data.0.enrichment.variants.3.price.1":"42.12 \u20AC L Cassandra","data.1.enrichment.variants.0.price.0":"12.12 \u20AC XXS Yessey!","data.1.enrichment.variants.0.price.1":"12.12 \u20AC XXS Yessey!","data.1.enrichment.variants.1.price.0":"22.12 \u20AC XS Yessey!","data.1.enrichment.variants.1.price.1":"22.12 \u20AC XS Yessey!","data.1.enrichment.variants.2.price.0":"32.12 \u20AC S Yessey!","data.1.enrichment.variants.2.price.1":"32.12 \u20AC S Yessey!","data.1.enrichment.variants.3.price.0":"42.12 \u20AC L Yessey!","data.1.enrichment.variants.3.price.1":"42.12 \u20AC L Yessey!","data.1.enrichment.variants.3.price.2":"44.12 \u20AC L Yessey!"}'); }); }); describe("examplecode", function() { it("should execute example code", function() { let obj = { "data": [ { "id": 10, "name": "Cassandra", "address": { "street": "493-4105 Vulputate Street", "city": "Saumur", "zip": "52628" } }, { "id": 20, "name": "Holly", "address": { "street": "1762 Eget Rd.", "city": "Schwalbach", "zip": "952340" } }, { "id": 30, "name": "Guy", "address": { "street": "957-388 Sollicitudin Avenue", "city": "Panchi\xE0", "zip": "420729" } } ] }; let map; map = buildMap(obj, "data.*", "${name} (${address.zip} ${address.city})", "id"); expect(map).to.be.instanceOf(Map); map = buildMap(obj, "data.*", "${name} (${address.zip} ${address.city})"); expect(map).to.be.instanceOf(Map); map = buildMap(obj, "data.*", "${name} (${address.zip} ${address.city})", "id", function(value, key) { return value["id"] >= 20 ? true : false; }); expect(map).to.be.instanceOf(Map); }); }); describe("buildmap()", function() { let obj1 = { dataset: { "10082": { name: "Test 1", address: "Here 1" }, "10084": { name: "Test 2", address: "Here 2" } } }; it("should return Map Instance.", function() { expect(buildMap({}, "")).to.be.instanceOf(Map); }); [ [obj1, "dataset.*", "address", '{"dataset.10082":"Here 1","dataset.10084":"Here 2"}'], [obj1, "x", void 0, "{}"], [obj1, "dataset.*", "name", '{"dataset.10082":"Test 1","dataset.10084":"Test 2"}'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); it("buildMap(" + JSON.stringify(a2) + "," + JSON.stringify(b) + "," + JSON.stringify(c) + ") should return " + JSON.stringify(d) + " ", function() { let t = buildMap(a2, b, c); let m = JSON.stringify(convertMapResult(t)); expect(m).to.be.equal(d); }); }); }); }); // test/cases/data/transformer.mjs init_transformer(); init_locale2(); init_embed(); describe("Transformer", function() { before(function(done) { let promises = []; promises.push(initJSDOM()); if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } Promise.all(promises).then(() => { done(); }); }); describe("Transformer.run() localize commands", function() { const isNode3 = typeof global === "object" && "[object global]" === global.toString.call(global); [ ["datetimeformat", "2023-02-04 08:02:01", "Feb 4, 2023, 08:02:01", "4 Feb 2023, 08:02:01"], ["datetimeformat:long:short", "2023-02-04 08:02:01", "February 4, 2023 at 08:02", "4 February 2023 at 08:02"], ["datetimeformat:short:short", "2023-02-04 08:02:01", "2/4/23, 08:02", "04/02/2023, 08:02"], ["currency", "EUR0", "\u20AC0.00", "\u20AC0.00"], // ['currency:1:2', "EUR14.25", "€14.3", "€14.2"], ["currency", "EUR14.25", "\u20AC14.25", "\u20AC14.25"], ["datetime", "2023-02-14 14:12:10", "2/14/2023, 14:12:10", "14/02/2023, 14:12:10"], ["datetime", "2023-02-14 08:02:01", "2/14/2023, 08:02:01", "14/02/2023, 08:02:01"], ["date", "2023-02-14", "02/14/2023", "14/02/2023"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); const expected = isNode3 ? c : d; it("Transformer.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(expected), function() { let t = new Transformer(a2); const r = t.run(b); expect(expected).to.be.eql(r, "Transformer.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(c)); }); }); }); describe("Transformer.run()", function() { [ ["equals:a", "a", true], ["equals:a", "b", false], ["equals:3", 3, true], ["equals:3", 6, false], ["equals:on", true, true], ["equals:true", true, true], ["equals:on", false, false], ["equals:true", false, false], ["equals:off", false, true], ["equals:false", false, true], ["equals:off", false, true], ["equals:false", true, false], ["equals:3", 3, true], ["equals:3", 6, false], ["equals:undefined", void 0, true], ["equals:undefined", 3, false], ["equals:null", null, true], ["equals:null", 3, false], ["equals:3", 6, false], ["has-entries", {}, false], ["has-entries", { a: 4 }, true], ["has-entries", [], false], ["has-entries", "", false], ["has-entries", [1, 2, 3], true], ["has-entries", [1], true], ["has-entries", ["1"], true], ["has-entries", [true], true], ["contains:x", "asd wxd sdf", true], ["contains:x", "asd wd sdf", false], ["contains:b", ["a", "b", "c"], true], ["contains:x", ["a", "b", "c"], false], ["isundefined", "a", false], ["isundefined", null, false], ["isundefined", void 0, true], ["isnull", "a", false], ["isnull", null, true], ["isset", null, false], ["isset", void 0, false], ["isset", "", true], ["isnumber", "a", false], ["isnumber", 4, true], ["isnumber", 4.5, true], ["isinteger", 4.5, false], ["isinteger", 4, true], ["isfloat", 5.6, true], ["isfloat", 5, false], ["isobject", 4, false], ["isobject", {}, true], ["isarray", [{}], true], ["isarray", "a", false], ["not", true, false], ["not", false, true], ["map:a=4:b=5:c=6", "a", "4"], ["year", "2023-02-14", 2023], ["month", "2023-02-14", 2], ["day", "2023-02-14", 14], ["weekday", "2023-02-14", 2], ["minutes", "2023-02-14 06:12:21", 12], ["seconds", "2023-02-14 06:12:21", 21], ["hours", "2023-02-14 06:12:21", 6], ["time", "2023-02-14 06:12:21", "06:12:21"], ["timestamp", "2023-02-14", 16763328e5], ["concat:a.b.c:test:a.b.d", { a: { b: { c: 4, d: 6 } } }, "4test6"], ["concat:a.b.c:\\ \\ :a.b.d", { a: { b: { c: 4, d: 6 } } }, "4 6"], ["concat:a.b.c:,:a.b.d", { a: { b: { c: 4, d: 6 } } }, "4,6"], ["concat:a.b.c:,:\\ :a.b.d", { a: { b: { c: 4, d: 6 } } }, "4, 6"], ["??:a", null, "a"], ["??:a", void 0, "a"], ["??:a", "true", "true"], ["??:a", false, false], [" if:a: ", false, void 0], // without \\ [" if:a:\\ ", false, " "], [" if:a:\\ ", true, "a"], ["default:undefined:bool", void 0, false], ["default:yes", null, "yes"], ["default:yes", void 0, "yes"], ["default:1:bool", void 0, true], ["default:on:bool", void 0, true], ["default:true:bool", void 0, true], ["default:yes:bool", void 0, true], ["default:false:bool", void 0, false], ["default:1:int", void 0, 1], ["default:1:string", void 0, "1"], ["first-key", { a: 1, c: 3, b: 2 }, 1], ["last-key", { a: 1, c: 3, b: 2 }, 3], ["nth-last-key:0", { a: 1, c: 3, b: 2 }, 3], ["nth-last-key:1", { a: 1, c: 3, b: 2 }, 2], ["nth-last-key:2", { a: 1, c: 3, b: 2 }, 1], ["nth-key:2", { a: 1, b: 2, c: 3 }, 3], ["nth-key:0", { c: 3, a: 1, b: 2 }, 1], ["nth-key:2", { a: 1, c: 3, b: 2 }, 3], ["prefix:Hello\\ ", "test", "Hello test"], ["tojson", { a: 4 }, '{"a":4}'], ["prefix:a\\\\: ", "test", "a\\test"], ["prefix:a\\ ", "test", "a test"], ["static:abc:a:b:x", "test", "abc:a:b:x"], ["tolowercase", "A:b:Cse4", "a:b:cse4"], ["toupper", "A:b:Cse4", "A:B:CSE4"], ["tostring", 5, "5"], ["tostring", [1, 2, 3, {}], "1,2,3,[object Object]"], ["tointeger", "5", 5], ["trim", " 5 ", "5"], ["trim", " a", "a"], ["trim", " ", ""], ["rawurlencode", "\xFC\xF6\xE4", "%C3%BC%C3%B6%C3%A4"], ["call:testcallback:4:5:6", "test", "test456"], ["plain", "t<br>est", "test"], ["if:a:b", true, "a"], ["if:a:b", "on", "a"], ["if:a:b", "true", "a"], ["if:a:b", "false", "b"], ["if:a:b", 9, "a"], ["if:a:b", "", "b"], ["if:a:b", void 0, "b"], ["if:a:b", false, "b"], ["ucfirst", "car", "Car"], ["ucfirst", "cAr", "CAr"], ["default:test", "a", "a"], ["default:test", void 0, "test"], ["fromjson", "{}", {}], ["fromjson", '{"a":1}', { a: 1 }], ["ucwords", "cAr runs", "CAr Runs"], ["tointeger", "6", 6], ["length", "test", 4], ["to-base64", "Hello World!", "SGVsbG8gV29ybGQh"], ["from-base64", "SGVsbG8gV29ybGQh", "Hello World!"], ["to-base64", "test", "dGVzdA=="], ["from-base64", "dGVzdA==", "test"], ["prefix:a", "test", "atest"], ["suffix:a", "test", "testa"], ["index:a", { a: 4 }, 4], ["index:2", [2, 4, 7], 7], ["index:x:test", [2, 4, 7], "test"], ["path:a.b.c", { a: { b: { c: 4 } } }, 4], ["path:a.b.d", { a: { b: { c: 4 } } }, void 0], ["index:a", (/* @__PURE__ */ new Map()).set("a", 5), 5], ["substring:2:4", "abcdefghijklmnop", "cdef"], ["nop", "abcdefghijklmnop", "abcdefghijklmnop"], ["set-toggle:c", "a b c", "a b"], ["set-toggle:c", "a b", "a b c"], ["set-set:c", "a b", "a b c"], ["set-set:c", "a b c", "a b c"], ["set-remove:c", "a b c", "a b"], ["set-toggle:c:,", "a,b,c", "a,b"], ["set-toggle:c:,", "a,b", "a,b,c"], ["set-set:c:,", "a,b", "a,b,c"], ["set-set:c:,", "a,b,c", "a,b,c"], ["set-remove:c:,", "a,b,c", "a,b"], ["set-toggle:c,d:,", "a,b,c", "a,b,d"], ["set-toggle:c,d:,", "a,b,c,d", "a,b"], ["set-toggle:c,d:,", "a,b", "a,b,c,d"], ["set-set:c,d:,", "a,b", "a,b,c,d"], ["set-set:c,d:,", "a,b,c", "a,b,c,d"], ["set-remove:c:,", "a,b,c", "a,b"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("Transformer.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(c), function() { let t = new Transformer(a2); t.setCallback("testcallback", function(a3, b2, c2, d) { return a3 + b2 + c2 + d; }); const r = t.run(b); expect(c).to.be.eql(r, "Transformer.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(c)); }); }); }); describe("Transformer.run() throws Error", function() { [ ["tolowercase", []], ["tolowercase", {}], ["tolowercase", 4.5], ["toupper", true], ["toupper", 5], ["tointeger", "a"], ["trim", 5], ["trim", true], ["trim", {}], ["trim", []], ["rawurlencode", []], ["if:a:b", {}], ["ucwords", {}], ["ucwords", false], ["ucwords", 4], ["path:a.b.c", "", 4], ["tointeger", {}], ["base64", {}], ["fromjson", ""], ["prefix", {}], ["suffix", {}], ["index", "test"], ["xxxxxx", "test"] // unsupported command ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("Transformer.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should throw Error ", function() { let t = new Transformer(a2); expect(() => t.run(b)).to.throw(Error); }); }); }); describe('new Transformer().run("uniqid")', function() { it("should return String", function() { let t = new Transformer("uniqid"); expect(t.run("")).to.be.a("string"); }); }); describe('new Transformer().run("default:eyJiIjoxfQ==:object")', function() { it("should return Object", function() { let t = new Transformer("default:eyJiIjoxfQ==:object"); expect(t.run(void 0)).to.eql({ b: 1 }); }); }); describe("new Transformer()", function() { it("should return instanceof Transformer", function() { expect(new Transformer("")).to.instanceOf(Transformer); }); it("should return instanceof Transformer", function() { expect(new Transformer("suffix:abc")).to.instanceOf(Transformer); }); it("false as argument should throw TypeError", function() { expect(() => { new Transformer(false); }).to.throw(TypeError); }); it("object as argument should throw TypeError", function() { expect(() => { new Transformer({}); }).to.throw(TypeError); }); }); describe("i18n", function() { let html117 = ` <div id="mock-translations"></div> <script type="application/json" data-monster-role="translations"> { "test1": "xyz", "test3": { "other": "xyz" } } <\/script> `; beforeEach((done) => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; let elem = document.getElementById("mock-translations"); Embed.assignTranslationsToElement(elem).then((o) => { done(); }); }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); before(function(done) { initJSDOM().then(() => { done(); }); }); [ ["i18n:test1", "", "xyz"], ["i18n:", "test1", "xyz"], // key by value ["i18n::", "test1", "xyz"], // key by value no default ["i18n::eee", "test2", "eee"], // key by value with default ["i18n::ddd", "test2", "ddd"] // key by value and default ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("should transform(" + a2 + ").run(" + b + ") return " + JSON.stringify(c), function() { const t = new Transformer(a2); expect(t.run(b)).to.be.eql(c); }); }); }); }); // test/cases/data/diff.mjs init_diff(); init_queue(); describe("Diff", function() { describe("test to datasets", function() { var obj1, obj2; beforeEach(() => { obj1 = [ { "id": 1, "name": "test" }, { "id": 2, "name": "test2" } ]; obj2 = [ { "id": 1, "name": "test" }, { "id": "3", "name": "test2" } ]; }); it("should return the difference between two datasets", function() { let d = diff(obj1, obj2); expect(JSON.stringify(d)).is.equal('[{"operator":"update","path":["1","id"],"first":{"value":2,"type":"number"},"second":{"value":"3","type":"string"}}]'); }); }); describe("Diff special cases", function() { var obj1, obj2; beforeEach(() => { obj1 = { "count": 1, "reason": null, "info": "test", "exchange": [] }; obj2 = { "count": 2, "reason": null, "info": void 0, "exchange": [] }; }); it("Diff value with null ", function() { let d = diff(obj1, obj2); expect(JSON.stringify(d)).is.equal('[{"operator":"update","path":["count"],"first":{"value":1,"type":"number"},"second":{"value":2,"type":"number"}},{"operator":"delete","path":["info"],"first":{"value":"test","type":"string"}}]'); }); it("Diff identical value with null ", function() { let d = diff(obj1, obj1); expect(JSON.stringify(d)).is.equal("[]"); }); }); const date1 = /* @__PURE__ */ new Date(); const date2 = Date.parse("01 Jan 1970 00:00:00 GMT"); const date3 = Date.parse("04 Dec 1995 00:12:00 GMT"); const date4 = Date.parse("04 Dec 1995 00:12:01 GMT"); const date5 = new Date(Date.parse("04 Dec 1995 00:12:01 GMT")); const date6 = new Date(Date.parse("04 Dec 1995 00:12:02 GMT")); [ [ {}, { a: new Queue() }, '[{"operator":"add","path":["a"],"second":{"value":{"data":[]},"type":"object","instance":"Queue"}}]' ], [ { a: { b: 1 }, c: { d: 2 } }, { a: { e: 3 }, f: { d: 2 } }, '[{"operator":"delete","path":["a","b"],"first":{"value":1,"type":"number"}},{"operator":"add","path":["a","e"],"second":{"value":3,"type":"number"}},{"operator":"delete","path":["c"],"first":{"value":{"d":2},"type":"object","instance":"Object"}},{"operator":"add","path":["f"],"second":{"value":{"d":2},"type":"object","instance":"Object"}}]' ], [ { a: date1, c: date4 }, { a: date2, b: date3 }, '[{"operator":"update","path":["a"],"first":{"value":"' + date1.toISOString() + '","type":"object","instance":"Date"},"second":{"value":0,"type":"number"}},{"operator":"delete","path":["c"],"first":{"value":818035921000,"type":"number"}},{"operator":"add","path":["b"],"second":{"value":818035920000,"type":"number"}}]' ], [ { a: date5 }, { b: date6 }, '[{"operator":"delete","path":["a"],"first":{"value":"1995-12-04T00:12:01.000Z","type":"object","instance":"Date"}},{"operator":"add","path":["b"],"second":{"value":"1995-12-04T00:12:02.000Z","type":"object","instance":"Date"}}]' ], [ { a: date1 }, { a: date1 }, "[]" ], [ {}, { a: date3 }, '[{"operator":"add","path":["a"],"second":{"value":818035920000,"type":"number"}}]' ], [ { a: date2 }, { a: date3 }, '[{"operator":"update","path":["a"],"first":{"value":0,"type":"number"},"second":{"value":818035920000,"type":"number"}}]' ], [ { a: 1 }, { a: 2 }, '[{"operator":"update","path":["a"],"first":{"value":1,"type":"number"},"second":{"value":2,"type":"number"}}]' ], [ { a: 1 }, { x: 1 }, '[{"operator":"delete","path":["a"],"first":{"value":1,"type":"number"}},{"operator":"add","path":["x"],"second":{"value":1,"type":"number"}}]' ], [ { a: 1 }, { a: 2, x: 1 }, '[{"operator":"update","path":["a"],"first":{"value":1,"type":"number"},"second":{"value":2,"type":"number"}},{"operator":"add","path":["x"],"second":{"value":1,"type":"number"}}]' ], [ { a: null }, {}, '[{"operator":"delete","path":["a"],"first":{"value":null,"type":"object"}}]' ], [ { a: null }, { a: null }, "[]" ], [ {}, { a: null }, '[{"operator":"add","path":["a"],"second":{"value":null,"type":"object"}}]' ], [ {}, { a: void 0 }, '[{"operator":"add","path":["a"],"second":{"type":"undefined"}}]' ] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("Diff should result " + c, function() { let d = diff(a2, b); expect(JSON.stringify(d)).is.equal(c); }); }); }); // test/cases/data/buildtree.mjs init_buildtree(); init_nodelist(); describe("buildTree", function() { describe("legacy navigation example (issue #230)", function() { it("should run example", function() { const objects = JSON.parse(`{ "dataset": [ { "id": 100001, "parent_id": 200001, "title": "eBay", "url": "/", "weight": 1, "css_styles": "", "css_classes": "" }, { "id": 200001, "parent_id": 200001, "title": "alvineconsole", "url": "", "weight": 1, "css_styles": "", "css_classes": "" } ], "sys": { "code": 200, "result": {}, "api_version": "1" } }`); try { buildTree(objects, "dataset.*", "id", "parent_id"); } catch (error) { expect(error).to.be.instanceOf(Error); } }); }); describe("example", function() { it("should run example", function() { const objects = { dataset: { "1": { id: "1", name: "vehicle", parent: null }, "2": { id: "2", name: "car", parent: "1" }, "3": { id: "3", name: "truck", parent: "1" }, "4": { id: "4", name: "motorcycle", parent: "1" }, "5": { id: "5", name: "SUV", parent: "2" }, "6": { id: "6", name: "sports car", parent: "2" } } }; const nodes = buildTree(objects, "dataset.*", "id", "parent"); expect(nodes).to.be.instanceOf(NodeList2); expect(nodes.length).to.equal(1); expect(nodes.toString()).to.be.equal('{"id":"1","name":"vehicle","parent":null}\n \u251C{"id":"2","name":"car","parent":"1"}\n | \u251C{"id":"5","name":"SUV","parent":"2"}\n | \u2514{"id":"6","name":"sports car","parent":"2"}\n \u251C{"id":"3","name":"truck","parent":"1"}\n \u2514{"id":"4","name":"motorcycle","parent":"1"}'); }); }); describe("buildTree()", function() { let obj1 = { dataset: { "1": { id: "1", name: "Test 1", address: "Here 1", parent: null }, "2": { id: "2", name: "Test 2", address: "Here 2", parent: "1" }, "3": { id: "3", name: "Test 3", address: "Here 3", parent: "2" }, "4": { id: "4", name: "Test 4", address: "Here 4", parent: "2" }, "5": { id: "5", name: "Test 5", address: "Here 5", parent: "1" }, "6": { id: "6", name: "Test 6", address: "Here 6", parent: "4" } } }; it("should return Node Instance.", function() { expect(buildTree({}, "")).to.be.instanceOf(NodeList2); }); [ [obj1, "dataset.*", '{"id":"1","name":"Test 1","address":"Here 1","parent":null}\n \u251C{"id":"2","name":"Test 2","address":"Here 2","parent":"1"}\n | \u251C{"id":"3","name":"Test 3","address":"Here 3","parent":"2"}\n | \u2514{"id":"4","name":"Test 4","address":"Here 4","parent":"2"}\n | | \u2514{"id":"6","name":"Test 6","address":"Here 6","parent":"4"}\n \u2514{"id":"5","name":"Test 5","address":"Here 5","parent":"1"}'], [obj1, "x", ""], [obj1, "dataset.*", '{"id":"1","name":"Test 1","address":"Here 1","parent":null}\n \u251C{"id":"2","name":"Test 2","address":"Here 2","parent":"1"}\n | \u251C{"id":"3","name":"Test 3","address":"Here 3","parent":"2"}\n | \u2514{"id":"4","name":"Test 4","address":"Here 4","parent":"2"}\n | | \u2514{"id":"6","name":"Test 6","address":"Here 6","parent":"4"}\n \u2514{"id":"5","name":"Test 5","address":"Here 5","parent":"1"}'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("buildTree(" + JSON.stringify(a2) + "," + JSON.stringify(b) + ") should return " + JSON.stringify(c) + " ", function() { let nodelist = buildTree(a2, b, "id", "parent"); expect(nodelist.toString()).to.be.eql(c); }); }); }); describe("buildTree() test 2", function() { let obj1 = { dataset: { "1": { id: "1", name: "Test 1", address: "Here 1", parent: "2" }, "2": { id: "2", name: "Test 2", address: "Here 2", parent: "0" }, "3": { id: "3", name: "Test 3", address: "Here 3", parent: "2" }, "4": { id: "4", name: "Test 4", address: "Here 4", parent: "0" }, "5": { id: "5", name: "Test 5", address: "Here 5", parent: "0" }, "6": { id: "6", name: "Test 6", address: "Here 6", parent: "4" }, "7": { id: "7", name: "Test 7", address: "Here 7", parent: "1" } } }; it("should return Node Instance.", function() { expect(buildTree({}, "")).to.be.instanceOf(NodeList2); }); [ [obj1, "dataset.*", '{"id":"2","name":"Test 2","address":"Here 2","parent":"0"}\n \u251C{"id":"1","name":"Test 1","address":"Here 1","parent":"2"}\n | \u2514{"id":"7","name":"Test 7","address":"Here 7","parent":"1"}\n \u2514{"id":"3","name":"Test 3","address":"Here 3","parent":"2"}\n{"id":"4","name":"Test 4","address":"Here 4","parent":"0"}\n \u2514{"id":"6","name":"Test 6","address":"Here 6","parent":"4"}\n{"id":"5","name":"Test 5","address":"Here 5","parent":"0"}'], [obj1, "x", ""] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("buildTree(" + JSON.stringify(a2) + "," + JSON.stringify(b) + ") should return " + JSON.stringify(c) + " ", function() { let nodelist = buildTree(a2, b, "id", "parent", { rootReferences: ["0"] }); expect(nodelist.toString()).to.be.equal(c); }); }); }); }); // test/cases/data/pathfinder.mjs init_pathfinder(); describe("Pathfinder", function() { let convertMapResult = function(r) { if (r instanceof Map) { r = Object.fromEntries(r); if (r instanceof Array) { r = r.map((e) => { return convertMapResult(e); }); } else if (typeof r === "object") { for (const [k, o] of Object.entries(r)) { r[k] = convertMapResult(o); } } } return r; }; describe("value is not an integer issue #274", function() { it("should not be fail with", function() { const pf = new Pathfinder({ data: {} }); try { pf.setVia("data.age", 10); } catch (e) { expect(e).to.be.null; } expect(pf.getVia("data.age")).to.be.equal(10); }); }); describe("with Wildcard and Iterations", function() { let pf, obj; beforeEach(function() { obj = { a: [ { b: [ { c: "1-1" }, { c: "1-2" } ], d: "!" }, { b: [ { c: "2-1" }, { c: "2-2" } ], d: "?" } ] }; pf = new Pathfinder(obj); }); [ ["a.*.b.*", '{"0":{"0":{"c":"1-1"},"1":{"c":"1-2"}},"1":{"0":{"c":"2-1"},"1":{"c":"2-2"}}}'], ["a.*.b", '{"0":[{"c":"1-1"},{"c":"1-2"}],"1":[{"c":"2-1"},{"c":"2-2"}]}'], ["a.1.b", '[{"c":"2-1"},{"c":"2-2"}]'], ["a.0.b", '[{"c":"1-1"},{"c":"1-2"}]'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".setVia(" + a2 + ") should result in " + b, function() { let r = pf.getVia(a2); let i = convertMapResult(r); expect(JSON.stringify(i)).is.equal(b); }); }); }); describe("api tests", function() { let pathfinder, object; class A { get a() { return 1; } } beforeEach(() => { object = { a: { b: { c: [ 4, "test1", false, void 0, parseInt("a") ], d: void 0, e: false, f: [ { g: false, h: 3, i: ["test2"] } ], j: {}, k: (/* @__PURE__ */ new Map()).set("m", { n: 3 }), l: (/* @__PURE__ */ new Set()).add({ n: 4 }) } }, b: new A() }; pathfinder = new Pathfinder(object); }); describe("create new object", function() { [ [12], [void 0], [null], ["test"] ].forEach(function(data) { let a2 = data.shift(); let label = typeof a2; if (a2 === null) label = "null"; it(label + " should throw error", function() { expect(() => { new Pathfinder(a2); }).to.throw(Error); }); }); }); describe(".setVia(x)", function() { let pf, obj; beforeEach(function() { obj = {}; pf = new Pathfinder(obj); }); [ ["a.b.0.0.c", true, '{"a":{"b":[[{"c":true}]]}}'], ["a.b.0.c", true, '{"a":{"b":[{"c":true}]}}'], ["a.b.3.c", true, '{"a":{"b":[null,null,null,{"c":true}]}}'], ["a.b.c", true, '{"a":{"b":{"c":true}}}'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it(".setVia(" + a2 + ", " + b + ") should result in " + c, function() { pf.setVia(a2, b); expect(JSON.stringify(obj)).is.equal(c); }); }); }); describe(".setVia()", function() { let a2; let b; let c; beforeEach(function() { a2 = "a.x"; b = "true"; c = "a.y.d"; }); it(".setVia(" + a2 + ", " + b + ") should return Pathfinder", function() { expect(pathfinder.setVia(a2, b)).is.instanceOf(Pathfinder); }); it(".setVia(" + a2 + ", " + b + ") should change object", function() { pathfinder.setVia(a2, b); expect(JSON.stringify(object)).is.equal('{"a":{"b":{"c":[4,"test1",false,null,null],"e":false,"f":[{"g":false,"h":3,"i":["test2"]}],"j":{},"k":{},"l":{}},"x":"true"},"b":{}}'); }); it(".setVia(" + c + ", " + b + ") should change object", function() { pathfinder.setVia(c, b); expect(JSON.stringify(object)).is.equal('{"a":{"b":{"c":[4,"test1",false,null,null],"e":false,"f":[{"g":false,"h":3,"i":["test2"]}],"j":{},"k":{},"l":{}},"y":{"d":"true"}},"b":{}}'); }); }); describe(".exists()", function() { [ ["a.b.c.1", true], ["b.a", true], ["a.b.x", false], ["a.x", false], ["a.b.q", false], ["a.b.c.0", true], ["a.b.d", true], ["a.b.f.0.g", true], ["a.b.f.0.i.0", true], ["a.b.f.0.i.2", false], ["a.b.e", true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".exists(" + a2 + ") should return " + b + " ", function() { expect(pathfinder.exists(a2)).is.equal(b); }); }); }); describe(".deleteVia()", function() { [ ["a.b.e", '{"a":{"b":{"c":[4,"test1",false,null,null],"f":[{"g":false,"h":3,"i":["test2"]}],"j":{},"k":{},"l":{}}},"b":{}}'], ["a.b.f", '{"a":{"b":{"c":[4,"test1",false,null,null],"e":false,"j":{},"k":{},"l":{}}},"b":{}}'], ["a.b.j", '{"a":{"b":{"c":[4,"test1",false,null,null],"e":false,"f":[{"g":false,"h":3,"i":["test2"]}],"k":{},"l":{}}},"b":{}}'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".deleteVia(" + a2 + ") should return " + b + " ", function() { pathfinder.deleteVia(a2); expect(JSON.stringify(object)).is.equal(b); }); }); }); describe(".getVia()", function() { describe(".getVia()", function() { beforeEach(function() { object = { a: { b: { c: [ 4, "test1", false, void 0, parseInt("a") ], d: void 0, e: false, f: [ { g: false, h: 3, i: ["test2"] } ], j: {}, k: (/* @__PURE__ */ new Map()).set("m", { n: 3 }), l: (/* @__PURE__ */ new Set()).add({ n: 4 }), o: [ { p: { q: 1, r: true } }, { p: { q: 2, r: true } }, { p: { q: 3, r: true } }, { p: { q: 4, r: true } }, { p: { q: 5, r: true } } ], s: { t: { a: 1 }, u: { a: 2 }, v: { a: 3 }, x: { a: 4 } } } } }; pathfinder = new Pathfinder(object); }); [ ["a.*", '[["b",{"c":[4,"test1",false,null,null],"e":false,"f":[{"g":false,"h":3,"i":["test2"]}],"j":{},"k":{},"l":{},"o":[{"p":{"q":1,"r":true}},{"p":{"q":2,"r":true}},{"p":{"q":3,"r":true}},{"p":{"q":4,"r":true}},{"p":{"q":5,"r":true}}],"s":{"t":{"a":1},"u":{"a":2},"v":{"a":3},"x":{"a":4}}}]]'], ["a.b.s.*.a", '[["t",1],["u",2],["v",3],["x",4]]'], ["a.b.s.*", '[["t",{"a":1}],["u",{"a":2}],["v",{"a":3}],["x",{"a":4}]]'], ["a.b.o.*.p.q", '[["0",1],["1",2],["2",3],["3",4],["4",5]]'], ["a.b.o.*.p.r", '[["0",true],["1",true],["2",true],["3",true],["4",true]]'], ["a.b.o.*.p", '[["0",{"q":1,"r":true}],["1",{"q":2,"r":true}],["2",{"q":3,"r":true}],["3",{"q":4,"r":true}],["4",{"q":5,"r":true}]]'] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".getVia(" + a2 + ") should result " + b, function() { let r = pathfinder.getVia(a2); expect(JSON.stringify(Array.from(r))).is.equal(b); }); }); }); it(".getVia() should result ", function() { let p = new Pathfinder({ a: { x: [ { c: 1 }, { c: 2 } ], y: true }, b: { x: [ { c: 1, d: false }, { c: 2 } ], y: true } }); let r = p.getVia("*.x.*.c"); function mapToObj(map) { var obj = {}; map.forEach(function(v, k) { if (v instanceof Map) { obj[k] = mapToObj(v); } else { obj[k] = v; } }); return obj; } expect(JSON.stringify(mapToObj(r))).is.equal('{"a":{"0":1,"1":2},"b":{"0":1,"1":2}}'); }); it(".getVia(a.b.l.0.n) with map should return 4 ", function() { expect(pathfinder.getVia("a.b.l.0.n")).is.equal(4); }); [ ["a.b.k.m.n", 3], ["a.b.l.0.n", 4], ["a.x", void 0], ["a.b.q", void 0], ["a.b.c.1", "test1"], ["a.b.c.0", 4], ["a.b.d", void 0], ["a.b.f.0.g", false], ["a.b.f.0.i.0", "test2"], ["a.b.e", false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".getVia(" + a2 + ") should return " + b + " ", function() { expect(pathfinder.getVia(a2)).is.equal(b); }); }); [ ["a.b.d.e"], ["a.b.d.x"], ["a.b.l.e.n"] ].forEach(function(data) { let a2 = data.shift(); it(".getVia(" + a2 + ") should throw Error ", function() { expect(() => pathfinder.getVia(a2)).to.throw(Error); }); }); }); }); }); // test/cases/data/pipe.mjs init_pipe(); init_embed(); describe("Pipe", function() { before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } Promise.all(promises).then(() => { done(); }); }); describe("run different pipes", function() { [ ["path:b | if:x:\\ ", { a: true }, " "], // '\\ '.length ↦ 2 ["path:a | if:x:\\ ", { a: true }, "x"], ["nop", "abcdefghijklmnop", "abcdefghijklmnop"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("Pipe.run(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(c), function() { let t = new Pipe(a2); const r = t.run(b); expect(r).to.be.eql(c); }); }); }); describe("new Pipe should create new Instance", function() { it("should return Instance", function() { expect(new Pipe("")).to.be.instanceOf(Pipe); }); it("should return Instance", function() { expect(new Pipe("index:a|toupper |prefix:a").run({ a: "test" })).to.be.equal("aTEST"); }); [ ["index:a|toupper |prefix:a", { a: "test" }, "aTEST"], ["path:a.b.c.d | toupper | prefix:Hello\\ ", { a: { b: { c: { d: "world" } } } }, "Hello WORLD"], ["path:a.b.c|index:d|toupper |suffix:x", { a: { b: { c: { d: "test" } } } }, "TESTx"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("new Pipe(" + JSON.stringify(a2) + ").run(" + JSON.stringify(b) + ") should return " + JSON.stringify(c) + " ", function() { let t = new Pipe(a2); expect(t.run(b)).to.be.equal(c); }); }); }); describe("new Pipe and locale", function() { let html117 = ` <div id="mock-translations"></div> <script type="application/json" data-monster-role="translations"> { "51": "xyz", "52": "abc", "53": "def" } <\/script> `; beforeEach((done) => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; let elem = document.getElementById("mock-translations"); Embed.assignTranslationsToElement(elem).then((o) => { done(); }).catch((e) => { done(e); }); }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); before(function(done) { initJSDOM().then(() => { done(); }); }); [ ["path:status | tostring | i18n", { status: 51 }, "xyz"] ].forEach(function(data) { let pipe = data.shift(); let obj = data.shift(); let expected = data.shift(); it("should transform(" + pipe + ").run(" + JSON.stringify(obj) + ") return " + JSON.stringify(expected), function() { let t = new Pipe(pipe); expect(t.run(obj)).to.be.equal(expected); }); }); }); }); // test/cases/data/extend.mjs init_extend(); var MockForExtends = class { constructor() { } }; describe("extend", function() { [ [ '{"thekey":{}}', {}, { thekey: new MockForExtends() } ], [ '{"a":{"b":[]}}', { a: { b: [ "1", "2", "3" ] } }, { a: { b: [] } } ], [ '{"a":{"b":1,"d":1}}', { a: { b: 1 } }, { a: { d: 1 } } ], [ '{"a":{"b":1,"d":{"x":["car"],"f":true,"g":[]}}}', {}, { a: { b: 1, d: { x: ["car"] } } }, { a: { d: { f: true, g: [] } } } ] ].forEach(function(data) { let d = data.shift(); let a2 = data; it(".extend(" + JSON.stringify(a2) + ") should result in " + d, function() { let x = extend.apply(this, a2); expect(JSON.stringify(x)).is.equal(d); }); }); [ [ {}, { a: { b: 1, d: ["car"] } }, { a: { d: { f: true, g: [] } } } ], [ { a: {} }, { a: [] } ] ].forEach(function(data) { let a2 = data; it(".extend(" + JSON.stringify(a2) + ") should throw Error ", function() { expect(() => extend.apply(this, a2)).to.throw(Error); }); }); }); describe("extend function", () => { it("should extend an object with properties from another object", () => { const target = { a: 1 }; const source = { b: 2 }; const result = extend(target, source); expect(result).to.deep.equal({ a: 1, b: 2 }); }); it("should throw an error for non-object target", () => { const target = null; const source = { b: 2 }; expect(() => extend(target, source)).to.throw(); }); it("should throw an error for non-object source", () => { const target = { a: 1 }; const source = "not an object"; expect(() => extend(target, source)).to.throw(); }); it("should handle deep object extension", () => { const target = { a: { b: 1 } }; const source = { a: { c: 2 }, d: 3 }; const result = extend(target, source); expect(result).to.deep.equal({ a: { b: 1, c: 2 }, d: 3 }); }); it("should handle array extension", () => { const target = { a: [1, 2] }; const source = { a: [3, 4] }; const result = extend(target, source); expect(result).to.deep.equal({ a: [3, 4] }); }); }); // source/constraints/abstract.mjs init_base(); init_constants(); var AbstractConstraint = class extends Base { /** * this method must return a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { return Promise.reject(value); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/abstract-constraint"); } }; // source/constraints/invalid.mjs init_constants(); var Invalid = class extends AbstractConstraint { /** * this method returns a rejected promise * * @param {*} value * @return {Promise} */ isValid(value) { return Promise.reject(value); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/invalid"); } }; // test/cases/constraint/invalid.mjs describe("Invalid", function() { describe(".isValid()", function() { let isvalid = new Invalid(); it("should resolve promise", function(done) { isvalid.isValid().catch((e) => { expect(e).to.be.undefined; done(); }); }); }); }); // test/cases/constraint/abstractoperator.mjs init_base(); // source/constraints/abstractoperator.mjs init_constants(); var AbstractOperator = class extends AbstractConstraint { /** * * @param {AbstractConstraint} operantA * @param {AbstractConstraint} operantB * @throws {TypeError} "parameters must be from type AbstractConstraint" */ constructor(operantA, operantB) { super(); if (!(operantA instanceof AbstractConstraint && operantB instanceof AbstractConstraint)) { throw new TypeError("parameters must be from type AbstractConstraint"); } this.operantA = operantA; this.operantB = operantB; } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/abstract-operator"); } }; // test/cases/constraint/abstractoperator.mjs var AbstractConstraintMock = class extends Base { constructor() { super(); } isValid(value) { return Promise.reject(value); } }; describe("AbstractOperator", function() { it("should throw an error when the constraint is not call with parameter", function(done) { try { new AbstractOperator(); } catch (e) { done(); } }); it("should throw not an error when the constraint is not call with parameter", function(done) { try { const c = new AbstractOperator(new AbstractConstraintMock(), new AbstractConstraintMock()); } catch (e) { done(); } }); }); // source/constraints/valid.mjs init_constants(); var Valid = class extends AbstractConstraint { /** * this method return a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { return Promise.resolve(value); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/valid"); } }; // source/constraints/oroperator.mjs init_constants(); var OrOperator = class extends AbstractOperator { /** * this method returns a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { var self2 = this; return new Promise(function(resolve, reject) { let a2; let b; self2.operantA.isValid(value).then(function() { resolve(); }).catch(function() { a2 = false; if (b === false) { reject(); } }); self2.operantB.isValid(value).then(function() { resolve(); }).catch(function() { b = false; if (a2 === false) { reject(); } }); }); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/or-operator"); } }; // test/cases/constraint/oroperator.mjs describe("OrOperator", function() { describe(".isValid()", function() { [ [new Valid(), new Valid(), true], [new Valid(), new Invalid(), true], [new Invalid(), new Valid(), true], [new Invalid(), new Invalid(), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("constraint.isValid() should return " + c, function(done) { let constraint = new OrOperator(a2, b); constraint.isValid().then(() => { c === true ? done() : done(new Error()); }).catch(() => { c === true ? done(new Error()) : done(); }); }); }); }); }); // source/constraints/isobject.mjs init_is(); init_constants(); var IsObject = class extends AbstractConstraint { /** * this method returns a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { if (isObject(value)) { return Promise.resolve(value); } return Promise.reject(value); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraint/is-object"); } }; // test/cases/constraint/isobject.mjs describe("IsObject", function() { describe(".isValid()", function() { let constraint = new IsObject(); it("should resolve promise", function(done) { constraint.isValid({}).then((r) => { expect(r).is.a("object"); done(); }).catch((e) => { done(new Error("should not reached: " + e)); }); }); }); }); // source/constraints/andoperator.mjs init_constants(); var AndOperator = class extends AbstractOperator { /** * This method returns a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { return Promise.all([ this.operantA.isValid(value), this.operantB.isValid(value) ]); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraints/and-operator"); } }; // test/cases/constraint/andoperator.mjs describe("AndOperator", function() { describe(".isValid()", function() { [ [new Valid(), new Valid(), true], [new Valid(), new Invalid(), false], [new Invalid(), new Valid(), false], [new Invalid(), new Invalid(), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("constraint.isValid() should return " + c, function(done) { let constraint = new AndOperator(a2, b); constraint.isValid().then(() => { c === true ? done() : done(new Error()); }).catch(() => { c === true ? done(new Error()) : done(); }); }); }); }); }); // source/constraints/isarray.mjs init_is(); init_constants(); var IsArray = class extends AbstractConstraint { /** * this method returns a promise containing the result of the check. * * @param {*} value * @return {Promise} */ isValid(value) { if (isArray(value)) { return Promise.resolve(value); } return Promise.reject(value); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 2.1.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/constraint/is-array"); } }; // test/cases/constraint/isarray.mjs describe("IsArray", function() { describe(".isValid()", function() { let constraint = new IsArray(); it("should resolve promise", function(done) { constraint.isValid([1, 2, 3]).then((r) => { expect(r).is.a("array"); done(); }).catch((e) => { done(new Error("should not reached: " + e)); }); }); }); }); // test/cases/constraint/valid.mjs describe("Valid", function() { describe(".isValid()", function() { let constraint = new Valid(); it("should resolve promise", function(done) { constraint.isValid({}).then((r) => { done(); }).catch((e) => { done(new Error("should not reached: " + e)); }); }); }); }); // test/cases/types/nodelist.mjs init_node(); init_nodelist(); describe("NodeList", function() { describe("#constructor", function() { it("should create an empty NodeList", function() { let nodeList = new NodeList2(); expect(nodeList.size).to.equal(0); }); it("should create a NodeList from an array", function() { let nodeList = new NodeList2([ new Node2("div"), new Node2("div"), new Node2("div") ]); expect(nodeList.size).to.equal(3); }); it("should create a NodeList from a NodeList", function() { let nodeList = new NodeList2([ new Node2("div"), new Node2("div"), new Node2("div") ]); let nodeList2 = new NodeList2(nodeList); expect(nodeList2.size).to.equal(3); }); }); it("create NodeList", function() { expect(new NodeList2()).is.instanceof(NodeList2); }); it("add Node", function() { expect(new NodeList2().add(new Node2())).to.be.instanceof(NodeList2); }); it("remove Node", function() { expect(new NodeList2().remove(new Node2())).to.be.instanceof(NodeList2); }); it("has unknown Node", function() { expect(new NodeList2().has(new Node2())).to.be.false; }); it("has added Node", function() { const n = new Node2(); expect(new NodeList2().add(n).has(n)).to.be.true; }); it("toString", function() { const n = new Node2(); expect(new NodeList2().add(new Node2("a").appendChild(new Node2("b"))).toString()).to.be.equal("a\n \u2514b"); }); it("throw exception", function() { expect(() => new NodeList2().add(1)).to.throw(Error); }); }); // test/cases/types/base.mjs init_base(); init_constants(); var BaseDifferentRealm = class extends Object { static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/base"); } }; var Subclass = class extends BaseDifferentRealm { constructor() { super(); } static get [instanceSymbol]() { return Symbol.for("@schukai/monster/types/subclass"); } }; describe("Base", function() { describe("new Base", function() { it("is instance of Base", function() { expect(new Base()).to.be.instanceOf(Base); }); it("is instance of Object", function() { expect(new Base()).to.be.instanceOf(Object); }); }); describe("instancof", function() { it("is instance of Base", function() { expect(new Base()).to.be.instanceOf(Base); }); it("subclass instanceof", function() { if (new Subclass() instanceof Base) { expect(true).to.be.true; } else { expect(false).to.be.true; } }); }); }); // test/cases/types/mediatype.mjs init_mediatype(); describe("Dataurl", function() { [ ["*/*", "*", "*"], ["text/*", "text", "*"], ["*/test", "*", "test"], ["image/png", "image", "png"], ["audio/mp3", "audio", "mp3"], ["video/mpeg", "video", "mpeg"], ["text/plain", "text", "plain"], ["text/html", "text", "html"], ["text/html;charset=US-ASCII", "text", "html"], ['text/html;charset="US-ASCII"', "text", "html"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("parseMediaType(" + a2 + ")", function() { const d = parseMediaType(a2); expect(d).is.instanceof(MediaType); expect(d.toString()).to.be.equal(a2); expect(d.type).to.be.equal(b); expect(d.subtype).to.be.equal(c); expect(d.parameter).is.instanceof(Map); }); }); [ ["video/"], ["text"], ["/mp3"], ["text/html;charsetUS-ASCII"], ['text/html;charset"US-ASCII"'] ].forEach(function(data) { let a2 = data.shift(); it("" + a2 + " should throw exception", function() { expect(() => { parseMediaType(a2); }).throw(TypeError); }); }); }); // test/cases/types/tokenlist.mjs init_tokenlist(); describe("TokenList", function() { describe(".toString()", function() { let tokenList = new TokenList(); let result = tokenList.toString(); it("should return a string", function() { expect(result).to.be.a("string"); }); it("set and remove return a string", function() { expect(result).to.be.a("string"); }); }); describe("init with string iterable", function() { it("new TokenList(" + typeof a + ") throw TypeError ", function() { let tokens = ["abc", "def", "ghi"]; let list = new TokenList(tokens); expect(list.toString()).is.equal("abc def ghi"); }); }); describe("init with iterable without string values", function() { it("new TokenList(" + typeof a + ") throw TypeError ", function() { let tokens = ["abc", 4, "ghi"]; expect(() => new TokenList(tokens)).to.throw(TypeError); }); }); describe("init values", function() { [ // current, expected, typerror ["test1", "test1", false], ["test1 test2", "test1 test2", false], [void 0, "", false], [null, void 0, true], [parseInt("a"), void 0, true], // NaN [() => { }, void 0, true], [2, void 0, true], [false, void 0, true], [true, void 0, true], [4.5, void 0, true], [{}, void 0, true], [["1", "2", "3"], "1 2 3", false], // iterable strings [[1, 2, 3], void 0, true], [Symbol("foo"), false, true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); if (c === true) { it("new TokenList(" + typeof a2 + ") throw TypeError ", function() { expect(() => new TokenList(a2)).to.throw(TypeError); }); } else { it("new TokenList(" + typeof a2 + ") should return " + b, function() { expect(new TokenList(a2).toString()).is.equal(b); }); } }); }); describe("iterator protocol", function() { let list; it(".add(second) should return TokenList", function() { list = new TokenList("start"); expect(list.getIterator()).to.be.an("object"); }); it(".add(second) should return TokenList", function() { list = new TokenList("start end"); expect([...list]).to.be.an("array"); expect([...list]).to.be.an("array").to.include("start").to.include("end"); }); }); describe(".entries()", function() { let list; it(".entries() should return Array", function() { list = new TokenList("start"); expect(list.entries()).to.be.an("array"); }); it(".entries() should return Array", function() { list = new TokenList("start end").entries(); expect(list).to.be.an("array").to.include("start").to.include("end"); }); }); describe(".forEach()", function() { let list; it(".forEach() should iterate over tokenlist", function() { list = new TokenList("aaa bbb ccc ddd eee fff"); let result = ""; list.forEach((a2) => { result += "!" + a2 + "!"; expect(a2).to.be.an("string"); }); expect(result).is.equal("!aaa!!bbb!!ccc!!ddd!!eee!!fff!"); }); it(".entries() should return Array", function() { list = new TokenList("start end").entries(); expect(list).to.be.an("array").to.include("start").to.include("end"); }); }); describe("contains values", function() { let list; it("new TokenList(start, middle end) should contain middle", function() { list = new TokenList("start middle end"); expect(list.contains("start")).to.be.true; expect(list.contains("middle")).to.be.true; expect(list.contains("end")).to.be.true; expect(list.contains(["end", "start", "middle"])).to.be.true; }); it("new TokenList(start, middle end) should not contain xyz", function() { list = new TokenList("start middle end"); expect(list.contains("xyz")).to.be.false; expect(list.contains(["end", "start", "middle", "xyz"])).to.be.false; }); it("new TokenList(start, middle end) should not contain undefined null NaN", function() { list = new TokenList("start middle end"); expect(list.contains(void 0)).to.be.false; expect(list.contains(parseInt("a"))).to.be.false; expect(list.contains(null)).to.be.false; }); }); describe("toggle values", function() { let list; it("new TokenList(start middle end).toggle(new-value) should contain new-value", function() { list = new TokenList("start middle end"); expect(list.toggle("new-value").toString()).is.equal("start middle end new-value"); }); it("new TokenList(start middle end).toggle(middle) should not contain middle", function() { list = new TokenList("start middle end"); expect(list.toggle("middle").toString()).is.equal("start end"); }); it("new TokenList().toggle() should ...", function() { expect(new TokenList("abc def ghi").toggle("def xyz").toString()).to.equal("abc ghi xyz"); }); it("new TokenList().toggle() should ...", function() { expect(new TokenList("abc def ghi").toggle(["abc", "xyz"]).toString()).to.equal("def ghi xyz"); }); it("new TokenList().toggle() should ...", function() { expect(new TokenList("abc def ghi").toggle(void 0).toString()).to.equal("abc def ghi"); }); }); describe("manipulate values", function() { let list; it('result TokenList("start") should be "start"', function() { list = new TokenList("start"); expect(list.toString()).is.equal("start"); }); it(".add(second) should return TokenList", function() { list = new TokenList("start"); expect(list.add("second")).to.be.an.instanceof(TokenList); }); it('.add(second).toString() should return "start second" ', function() { list = new TokenList("start"); expect(list.add("second").toString()).is.equal("start second"); }); it('.add(second third).toString() should return "start second third" ', function() { list = new TokenList("start"); expect(list.add("second third").toString()).is.equal("start second third"); }); it('.add([second,third]).toString() should return "start second third" ', function() { list = new TokenList("start"); expect(list.add(["second", "third"]).toString()).is.equal("start second third"); }); it('.clear().toString() should "" ', function() { list = new TokenList("start"); expect(list.add(["second", "third"]).clear().toString()).is.equal(""); }); it('new TokenList("start second third end").remove(second) should return TokenList', function() { list = new TokenList("start second third end"); expect(list.remove("second")).to.be.an.instanceof(TokenList); }); it('new TokenList("start second third end").remove(second).toString() should return "start third end" ', function() { list = new TokenList("start second third end"); expect(list.remove("second").toString()).is.equal("start third end"); }); it('new TokenList("start second third end").remove(second third).toString() should return "start end" ', function() { list = new TokenList("start second third end"); expect(list.remove("second third").toString()).is.equal("start end"); }); it('new TokenList("start second third end").remove([second,third]).toString() should return "start end" ', function() { list = new TokenList("start second third end"); expect(list.remove(["second", "third"]).toString()).is.equal("start end"); }); it('new TokenList("start second third end").replace(second, xyz).toString() should return "start xyz third end" ', function() { list = new TokenList("start second third end"); expect(list.replace("second", "xyz")).to.be.instanceOf(TokenList); expect(list.toString()).is.equal("start xyz third end"); }); it('new TokenList("start second third end").replace(end, xyz).toString() should return "start second third xyz" ', function() { list = new TokenList("start second third end"); expect(list.replace("end", "xyz")).to.be.instanceOf(TokenList); expect(list.toString()).is.equal("start second third xyz"); }); }); }); // test/cases/types/proxyobserver.mjs init_extend(); init_is(); init_observer(); init_proxyobserver(); describe("ProxyObserver", function() { describe("create", function() { it("should return instanceof ProxyObserver", function() { let o = new ProxyObserver({}); extend(o.getSubject(), { a: 4 }); expect(o.getRealSubject()).is.eql({ a: 4 }); }); }); describe("setSubject", function() { it("should run observer", function(done) { let o = new ProxyObserver({ a: 1 }); expect(o.getRealSubject()).is.eql({ a: 1 }); let counter = 0; o.attachObserver(new Observer(function() { if (isObject(this) && this instanceof ProxyObserver) { counter++; if (counter === 1) { done(); return; } done("called for error"); return; } done(new Error("this is not ProxyObserver")); })); o.getSubject().c = 4; expect(o.getRealSubject()).is.eql({ a: 1, c: 4 }); o.setSubject({ b: 2 }); expect(o.getRealSubject()).is.eql({ b: 2 }); o.getSubject().d = 5; expect(o.getRealSubject()).is.eql({ b: 2, d: 5 }); }); }); describe("create", function() { it("should return instanceof ProxyObserver", function() { let o = new ProxyObserver({}); expect(o).is.instanceOf(ProxyObserver); }); }); describe("proxy objects", function() { it("Proxy objects should not be recommitted", function() { let o = new ProxyObserver({ a: { b: true } }); o.getSubject().a.b = o.getSubject(); o.getSubject().a.b.a.b = false; }); }); describe("notify observer", function() { it("should inform observer", function(done) { let counter = 0; let o = new Observer(function(a2) { if (isObject(this) && this instanceof ProxyObserver) { counter++; if (counter === 1) { done(); } return; } done(new Error("this is not ProxyObserver")); }, true); let realSubject = { a: { b: { c: true }, d: 5 } }; let p = new ProxyObserver(realSubject); expect(p).is.instanceOf(ProxyObserver); expect(p.attachObserver(o)).is.instanceOf(ProxyObserver); let s = p.getSubject(); let r = p.getRealSubject(); s.a.d = false; s.a.b.d = 2; }); }); describe("Reflect", function() { it("check Reflect.set() with Subject", function() { let r; const obj = new ProxyObserver({}).getSubject(); [ "yes!", void 0, "no" ].forEach(function(value) { expect(() => { obj["data"] = value; }).to.not.throw(); }); }); [ ["that", { that: "checked1" }], ["that", new Proxy({ that: "checked2" }, {})], ["that", new ProxyObserver({ that: "checked3" }).getRealSubject()], ["that", new ProxyObserver({ that: "checked4" }).getSubject()] ].forEach(function(data) { let key = data.shift(); let target = data.shift(); it("check Reflect.set(" + key + "," + JSON.stringify(target) + ") should writable", function() { let value; [ "1", void 0, true, void 0, false, void 0, void 0 ].forEach(function(values) { expect(Reflect.getOwnPropertyDescriptor( target, key )["writable"], "writable for " + value + " should return true").to.be.true; expect(Reflect.set(target, key, value), "set for " + value + " should return true").to.be.true; expect(Reflect.getOwnPropertyDescriptor( target, key )["writable"], "writable for " + value + " should return true").to.be.true; }); }); }); }); describe("notify observer with changes", function() { let original, observer, proxy; before(function() { original = {}; proxy = new ProxyObserver(original); }); [ ["a", 4, JSON.stringify({ a: 4 })], ["b", 9, JSON.stringify({ a: 4, b: 9 })] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("set key " + a2 + " value " + b + " expect " + c, function(done) { let counter = 0; observer = new Observer(function() { counter++; expect(JSON.stringify(this.getRealSubject())).is.equal(c); if (counter === 1) { this.detachObserver(observer); done(); } }); proxy.attachObserver(observer); let subject = proxy.getSubject(); subject[a2] = b; }); }); }); describe("notify observer ", function() { it("should return promise", function() { let proxy = new ProxyObserver({}); let observer = new Observer(function() { }); proxy.attachObserver(observer); expect(proxy.notifyObservers()).is.instanceOf(Promise); }); }); }); // test/cases/types/version.mjs describe("Version", function() { describe(".compareTo()", function() { [ ["1.2.3", "1.2.3", 0], ["1.2.2", "1.2.3", -1], ["2", "2.0.0", 0], ["1.2.4", "1.2.3", 1] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("should return " + c + " when the value " + a2 + " is " + b, function() { expect(new Version(a2).compareTo(b)).to.be.equal(c); }); }); }); describe(".toString()", function() { [ ["1.1.1", "2.3", 3, "1.2.3"], ["1.2.4", "1.2.3", 5, "1.1.5"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); it("should return " + d, function() { expect(new Version(a2, b, c).toString()).to.be.equal(d); }); }); }); }); // test/cases/types/global.mjs init_global(); describe("Global", function() { describe("getGlobal", function() { it("should return global object", function() { let t = typeof getGlobal(); expect(t).to.be.equal("object"); }); }); describe("getGlobalFunction", function() { it("should return global function", function() { let t = typeof getGlobalFunction("parseInt"); expect(t).to.be.equal("function"); }); }); describe("getGlobalObject", function() { it("should return global object", function() { let t = typeof getGlobalObject("JSON"); expect(t).to.be.equal("object"); }); }); }); // test/cases/types/observerlist.mjs init_observerlist(); init_observer(); describe("ObserverList", function() { describe(".attach()", function() { it("should return instanceof ObserverList", function() { let observerList = new ObserverList(); let result = observerList.attach(new Observer(() => { })); expect(result).to.be.instanceOf(ObserverList); }); }); describe(".detach()", function() { it("should return instanceof ObserverList", function() { let observerList = new ObserverList(); let result = observerList.detach(new Observer(() => { })); expect(result).to.be.instanceOf(ObserverList); }); }); describe(".notify()", function() { const resultValue = "Yes!"; let o; let observerList; beforeEach(() => { o = new Observer(() => { return resultValue; }); observerList = new ObserverList(); observerList.attach(o); }); it("should instanceof Promise", function() { expect(observerList.notify({})).to.be.instanceOf(Promise); }); it("should return " + resultValue, function(done) { let obj = {}; observerList.notify(obj).then((r) => { expect(r).to.be.an("array").that.includes(resultValue); done(); }).catch((e) => { done(new Error(e)); }); }); }); describe(".contains()", function() { let o1 = new Observer(() => { }); let o2 = new Observer(() => { }); it("should not contain o1 and o2", function() { let observerList = new ObserverList(); expect(observerList.contains(o1)).to.be.false; expect(observerList.contains(o2)).to.be.false; }); it("should contain o2 and not o1", function() { let observerList = new ObserverList(); observerList.attach(o2); expect(observerList.contains(o1)).to.be.false; expect(observerList.contains(o2)).to.be.true; }); it("should contain o1 and not o2", function() { let observerList = new ObserverList(); observerList.attach(o1); expect(observerList.contains(o1)).to.be.true; expect(observerList.contains(o2)).to.be.false; }); it("should contain o2 and o1", function() { let observerList = new ObserverList(); observerList.attach(o2).attach(o1); expect(observerList.contains(o1)).to.be.true; expect(observerList.contains(o2)).to.be.true; }); }); }); // test/cases/types/internal.mjs init_internal(); init_observer(); var SomeRandomClass1 = class extends Object { doit() { return "done"; } }; var SomeRandomClass2 = class extends Object { constructor() { super(); equipWithInternal.call(this); } get defaultInternal() { return { test: "test" }; } }; describe("Base inject with options", function() { describe("new SomeRandomClass", function() { it("is instance of SomeRandomClass1", function() { expect(new SomeRandomClass2()).not.to.be.instanceOf(SomeRandomClass1); expect(new SomeRandomClass2()).to.be.instanceOf(SomeRandomClass2); }); it("is instance of SomeRandomClass2", function() { expect(new SomeRandomClass1()).to.be.instanceOf(SomeRandomClass1); expect(new SomeRandomClass1()).not.to.be.instanceOf(SomeRandomClass2); }); }); describe("Extends SomeRandomClass with internals", function() { it("attach and notify internal observer", function(done) { const c = new SomeRandomClass2(); c.attachInternalObserver(new Observer(() => { done(); })); c.setInternal("test", "test"); }); it("attach and remove internal observer", function() { const c = new SomeRandomClass2(); const observer = new Observer(() => { }); expect(c.containsInternalObserver(observer)).to.be.false; c.attachInternalObserver(observer); expect(c.containsInternalObserver(observer)).to.be.true; c.detachInternalObserver(observer); expect(c.containsInternalObserver(observer)).to.be.false; }); it("getInternal and setInternal", function() { const c = new SomeRandomClass2(); expect(c.setInternal("test", "yeah")).to.be.instanceOf(SomeRandomClass2); expect(c.getInternal("test")).to.be.equal("yeah"); }); it("deal with default values", function() { const testClass = class extends Object { constructor() { super(); equipWithInternal.call(this); } get internalDefaults() { return { test: "xyz" }; } }; const c = new testClass(); expect(c.getInternal("test")).to.be.equal("xyz"); expect(c.getInternal("test2", "abc")).to.be.equal("abc"); }); it("deal with defaults from defaults", function() { const testClass = class extends Object { constructor() { super(); equipWithInternal.call(this); } get internalDefaults() { return { test: "xyz" }; } }; const testClass2 = class extends testClass { constructor() { super(); equipWithInternal.call(this); } get internalDefaults() { return Object.assign({}, super.internalDefaults, { test2: "abc" }); } }; const c = new testClass2(); expect(c.getInternal("test")).to.be.equal("xyz"); expect(c.getInternal("test2")).to.be.equal("abc"); }); it("set multiple values", function() { const c = new SomeRandomClass2(); expect(c.setInternals({ test: "yeah", test2: "yeah2" })).to.be.instanceOf(SomeRandomClass2); expect(c.getInternal("test")).to.be.equal("yeah"); expect(c.getInternal("test2")).to.be.equal("yeah2"); c.setInternals({ test2: "yeah2-new", test3: "yeah3" }); expect(c.getInternal("test")).to.be.equal("yeah"); expect(c.getInternal("test2")).to.be.equal("yeah2-new"); expect(c.getInternal("test3")).to.be.equal("yeah3"); }); }); }); // test/cases/types/observablequeue.mjs init_observer(); describe("ObservableQueue", function() { describe("Observer", function() { it("should notify", function(done) { let queue = new ObservableQueue(); let o = new Observer((q) => { done(); }); queue.attachObserver(o); expect(queue.add("a")).to.be.instanceOf(ObservableQueue); }); }); }); // test/cases/types/dataurl.mjs init_dataurl(); describe("Dataurl", function() { [ [" data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E"], ["data:text/html;charset=US-ASCII,%3Ch1%3EHello!%3C%2Fh1%3E"], ["data:,A%20brief%20note", "data:text/plain;charset=US-ASCII,A%20brief%20note"], ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"], [" data:,Hello%2C%20World!", "data:text/plain;charset=US-ASCII,Hello%2C%20World!"], [" data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC "], [" data:,Hello World!", "data:text/plain;charset=US-ASCII,Hello%20World!"], ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC"], [" data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === void 0) b = a2.trim(); it("parseDataURL(" + a2 + ")", function() { expect(parseDataURL(a2).toString()).to.be.equal(b); }); }); [ ["dataxbase64"], ["data:HelloWorld"], ["data:text/html;charset=,%3Ch1%3EHello!%3C%2Fh1%3E"], ["data:text/html;charset,%3Ch1%3EHello!%3C%2Fh1%3E", "data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"], [""], ["http://wikipedia.org"], ["base64"], ["iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"] ].forEach(function(data) { let a2 = data.shift(); it("should throw exception parseDataURL(" + a2 + ")", function() { expect(() => parseDataURL(a2)).throw(TypeError); }); }); }); // source/types/binary.mjs init_validate(); function toBinary(string) { const codeUnits = new Uint16Array(validateString(string).length); for (let i = 0; i < codeUnits.length; i++) { codeUnits[i] = string.charCodeAt(i); } const charCodes = new Uint8Array(codeUnits.buffer); let result = ""; for (let i = 0; i < charCodes.byteLength; i++) { result += String.fromCharCode(charCodes[i]); } return result; } function fromBinary(binary) { const bytes = new Uint8Array(validateString(binary).length); for (let i = 0; i < bytes.length; i++) { bytes[i] = binary.charCodeAt(i); } const charCodes = new Uint16Array(bytes.buffer); let result = ""; for (let i = 0; i < charCodes.length; i++) { result += String.fromCharCode(charCodes[i]); } return result; } // test/cases/types/binary.mjs describe("Binary", function() { [ ["a", "a\0"], ["\u2639", "9&"], ["I\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n", "I\0\xF1\0t\0\xEB\0r\0n\0\xE2\0t\0i\0\xF4\0n\0\xE0\0l\0i\0z\0\xE6\0t\0i\0\xF8\0n\0"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("fromBinary(toBinary(" + a2 + ")) should work", function() { let r = toBinary(a2); expect(r).to.be.equal(b); expect(fromBinary(r)).to.be.equal(a2); }); }); }); // test/cases/types/observer.mjs init_observer(); describe("Observer", function() { let callback = function() { }; let observer = new Observer(callback); describe(".addTag()", function() { [ ["test1"], ["test2"] ].forEach(function(data) { let a2 = data.shift(); it("addTag(" + a2 + ") should return instanceof Observer", function() { expect(observer.addTag(a2)).is.instanceOf(Observer); }); }); }); describe(".removeTag()", function() { [ ["test1"], ["test2"] ].forEach(function(data) { let a2 = data.shift(); it("removeTag(" + a2 + ") should return instanceof Observer", function() { expect(observer.removeTag(a2)).is.instanceOf(Observer); }); }); }); describe(".hasTag()", function() { [ ["test1", true], ["test2", true], ["test3", false], ["test4", false] ].forEach(function(data) { let tempObserver = new Observer(callback); let a2 = data.shift(); let b = data.shift(); it("observer.hastTag(" + a2 + ") should return " + b, function() { if (b === true) { tempObserver.addTag(a2); expect(tempObserver.hasTag(a2)).is.be.true; } else { expect(tempObserver.hasTag(a2)).is.be.false; } }); }); }); describe(".update()", function() { let obj = {}; it("observer.update(" + obj + ") is 136", function(done) { let tempObserver = new Observer(function(a2, b, c) { return a2 + b + c; }, 1, 3, 6); tempObserver.update(obj).then((a2) => { expect(a2).is.equal(1 + 3 + 6); done(); }); }); }); describe("run function .update() several times", function() { let obj = {}; it("observer.update(" + obj + ") is 136", function(done) { let counter = 0; let tempObserver = new Observer(function(a2, b, c) { counter++; }); tempObserver.update(obj); tempObserver.update(obj); tempObserver.update(obj); tempObserver.update(obj); tempObserver.update(obj).then((_) => { done(); }); }); }); describe(".getTags()", function() { [ [["test1", "test2", "test3", "test4"], 4], [["test1", "test1", "test3", "test4"], 3], // double test1 (set is uniqueue) [["test1", "test1", "test1", "test4"], 2] // multiple test1 (set is uniqueue) ].forEach(function(data) { let tempObserver = new Observer(callback); let a2 = data.shift(); let b = data.shift(); for (let i = 0, max3 = a2.length; i < max3; i++) { tempObserver.addTag(a2[i]); } it("observer.getTags(" + a2 + ") is array", function() { expect(tempObserver.getTags()).to.be.an("array"); }); it("observer.getTags(" + a2 + ") should return " + b + " tags", function() { expect(tempObserver.getTags().length).is.equal(b); }); }); }); }); // source/types/regex.mjs init_validate(); function escapeString(value) { return validateString(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); } // test/cases/types/regex.mjs describe("escapeString", function() { before(function(done) { let promises = []; promises.push(initJSDOM()); if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } Promise.all(promises).then(() => { done(); }); }); [ ["test1", "test1"], ["${", "\\$\\{"], ["i18n{", "i18n\\{"], ["//", "//"], ["\\", "\\\\"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("escapeString(" + a2 + ") should return " + b, function() { expect(escapeString(a2)).is.equal(b); }); }); }); // test/cases/types/randomid.mjs describe("RandomID", function() { class RandomID2 { } before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } promises.push(Promise.resolve().then(() => (init_randomid(), randomid_exports)).then((m) => { RandomID2 = m.RandomID; return true; })); Promise.all(promises).then(() => { done(); }); }); describe(".toString()", function() { let id = new RandomID2(); let result = id.toString(); it("should return a string", function() { expect(result).is.a("string"); }); }); }); // test/cases/types/id.mjs init_id(); describe("ID", function() { before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } Promise.all(promises).then(() => { done(); }); }); describe(".toString()", function() { let id = new ID(); let result = id.toString(); it("should return a string", function() { expect(result).is.a("string"); }); it("should return a string", function() { expect(new ID("text1425id").toString()).is.equal("text1425id1"); expect(new ID("text1425id").toString()).is.equal("text1425id2"); expect(new ID("text1425id").toString()).is.equal("text1425id3"); }); }); }); // test/cases/types/uuid.mjs describe("UUID", function() { class UUID2 { } before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } promises.push(Promise.resolve().then(() => (init_uuid(), uuid_exports)).then((m) => { UUID2 = m.UUID; return true; })); Promise.all(promises).then(() => { done(); }); }); describe(".toString()", function() { it("should return a string", function() { let uuid = new UUID2(); let result = uuid.toString(); expect(result).is.a("string"); expect(result.length).is.equal(36); }); it("test format", function(done) { let uuid = new UUID2(); let result = uuid.toString(); const regexExp = /^[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}$/i; for (let i = 0; i < 2e3; i++) { const u = new UUID2().toString(); const r = regexExp.test(u); if (r !== true) { done("no uuid " + u + " => " + r); return; } } done(); }); }); }); // test/cases/types/is.mjs init_is(); init_id(); describe("Is", function() { before(function(done) { let promises = []; if (!globalThis["crypto"]) { promises.push(Promise.resolve().then(() => (init_webcrypto_es(), webcrypto_es_exports)).then((m) => { globalThis["crypto"] = new m.Crypto(); return true; })); } Promise.all(promises).then(() => { done(); }); }); describe(".isPrimitive()", function() { [ ["test1", true], [void 0, true], [null, true], [() => { }, false], [2, true], [parseInt("a"), true], [false, true], [true, true], [4.5, true], [{}, false], [[1, 2, 3], false], [Symbol("foo"), true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isPrimitive(" + typeof a2 + ") should return " + b, function() { expect(isPrimitive(a2)).is.equal(b); }); }); }); describe(".isSymbol()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [parseInt("a"), false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isSymbol(" + typeof a2 + ") should return " + b, function() { expect(isSymbol(a2)).is.equal(b); }); }); }); describe(".isInteger()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, true], [parseInt("a"), false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isInteger(" + typeof a2 + ") should return " + b, function() { expect(isInteger(a2)).is.equal(b); }); }); }); describe(".isIterable()", function() { [ ["test1", true], [void 0, false], [null, false], [() => { }, false], [parseInt("a"), false], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], true], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isIterable(" + typeof a2 + ") should return " + b, function() { expect(isIterable(a2)).is.equal(b); }); }); }); describe(".isBoolean()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, true], [parseInt("a"), false], [true, true], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isBoolean(" + typeof a2 + ") should return " + b, function() { expect(isBoolean(a2)).is.equal(b); }); }); }); describe(".isString()", function() { [ ["test1", true], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [parseInt("a"), false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isString(" + typeof a2 + ") should return " + b, function() { expect(isString(a2)).is.equal(b); }); }); }); describe(".isInstance()", function() { [ [new ID(), ID, true], [new ID(), () => { }, false], ["test1", void 0, false], [void 0, void 0, false], [null, void 0, false], [() => { }, void 0, false], [2, void 0, false], [false, void 0, false], [parseInt("a"), void 0, false], [true, void 0, false], [4.5, void 0, false], [{}, void 0, false], [[1, 2, 3], void 0, false], [Symbol("foo"), void 0, false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); it("is.isInstance(" + JSON.stringify(a2) + ") should return " + typeof b, function() { expect(isInstance(a2, b)).is.equal(c); }); }); }); describe(".isInstanceExtended()", function() { class Base2 { } class Derived extends Base2 { } function AnotherClass() { } let baseInstance = new Base2(); let derivedInstance = new Derived(); const cases = [ [() => { }, void 0, false, "function vs undefined"], [new ID(), () => { }, false, "ID instance vs function"], [new ID(), ID, true, "ID instance vs ID"], ["test1", void 0, false, "string vs undefined"], [void 0, void 0, false, "undefined vs undefined"], [null, void 0, false, "null vs undefined"], [2, void 0, false, "number vs undefined"], [false, void 0, false, "false vs undefined"], [parseInt("a"), void 0, false, "NaN vs undefined"], [true, void 0, false, "true vs undefined"], [4.5, void 0, false, "float vs undefined"], [{}, void 0, false, "object vs undefined"], [[1, 2, 3], void 0, false, "array vs undefined"], [Symbol("foo"), void 0, false, "symbol vs undefined"], [baseInstance, Base2, true, "Base instance vs Base"], [derivedInstance, Base2, true, "Derived instance vs Base"], [derivedInstance, Derived, true, "Derived instance vs Derived"], [baseInstance, Derived, false, "Base instance vs Derived"], [baseInstance, AnotherClass, false, "Base instance vs AnotherClass"], [derivedInstance, () => { }, false, "Derived instance vs function"], [new AnotherClass(), AnotherClass, true, "AnotherClass instance vs AnotherClass"] ]; let protoModifiedInstance = new Base2(); Object.setPrototypeOf(protoModifiedInstance, Derived.prototype); cases.push( [protoModifiedInstance, Base2, true, "Proto modified Base instance vs Base"], [protoModifiedInstance, Derived, true, "Proto modified Base instance vs Derived"] ); cases.forEach(function(data) { const a2 = data.shift(); const b = data.shift(); const c = data.shift(); const d = data.shift(); it("isInstance(" + JSON.stringify(a2) + ", [Function]) should return " + c, function() { if (isInstance(a2, b) !== c) { console.log(d); } expect(isInstance(a2, b)).to.equal(c); }); }); }); describe(".isObject()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [parseInt("a"), false], [true, false], [4.5, false], [{}, true], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isObject(" + JSON.stringify(a2) + ") should return " + b, function() { expect(isObject(a2)).is.equal(b); }); }); }); describe(".isArray()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [parseInt("a"), false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], true], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isArray(" + typeof a2 + ") should return " + b, function() { expect(isArray(a2)).is.equal(b); }); }); }); describe(".isFunction()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, true], [2, false], [false, false], [parseInt("a"), false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("is.isFunction(" + typeof a2 + ") should return " + b, function() { expect(isFunction(a2)).is.equal(b); }); }); }); }); // test/cases/types/validate.mjs init_validate(); init_base(); init_id(); describe("validate", function() { describe(".validatePrimitive()", function() { [ ["test1", true], [void 0, true], [null, true], [() => { }, false], [2, true], [false, true], [true, true], [4.5, true], [{}, false], [[1, 2, 3], false], [Symbol("foo"), true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validatePrimitive(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => validatePrimitive(a2)).to.throw(TypeError); }); } else { it(".validatePrimitive(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validatePrimitive(a2)).to.be.equal(a2); }); } }); }); describe(".validateInteger()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, true], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateInteger(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => validateInteger(a2)).to.throw(TypeError); }); } else { it(".validateInteger(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateInteger(a2)).to.be.equal(a2); }); } }); }); describe(".validateSymbol()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateSymbol(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => validateSymbol(a2)).to.throw(TypeError); }); } else { it(".validateSymbol(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateSymbol(a2)).to.be.equal(a2); }); } }); }); describe(".validateIterable()", function() { [ ["test1", true], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], true], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateIterable(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateIterable(a2); }).to.throw(TypeError); ; }); } else { it(".validateIterable(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateIterable(a2)).to.be.equal(a2); }); } }); }); describe(".validateBoolean()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, true], [true, true], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateBoolean(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateBoolean(a2); }).to.throw(TypeError); }); } else { it(".validateBoolean(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateBoolean(a2)).to.be.equal(a2); }); } }); }); describe(".validateString()", function() { [ ["test1", true], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateString(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateString(a2); }).to.throw(TypeError); ; }); } else { it(".validateString(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateString(a2)).to.be.equal(a2); }); } }); }); describe(".validateObject()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [true, false], [4.5, false], [{}, true], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateObject(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateObject(a2); }).to.throw(TypeError); ; }); } else { it(".validateObject(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateObject(a2)).to.be.equal(a2); }); } }); }); describe(".validateInstance()", function() { [ ["test1", Object], [void 0, Object], [null, Object], [() => { }, Object], [2, Object], [false, Object], [true, Object], [4.5, Object], [{}, Base], [[1, 2, 3], Object], [Symbol("foo"), Object] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".validateInstance(" + typeof a2 + ") should throw TypeException ", function() { expect(() => { validateInstance(a2, b); }).to.throw(TypeError); ; }); }); }); describe(".validateInstance()", function() { [ [{}, Object, true], [new Base(), Base, true] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it(".validateInstance(" + typeof a2 + ") should not throw TypeException ", function() { expect(validateInstance(a2, b)).to.be.equal(a2); }); }); }); describe(".validateArray()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, false], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], true], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateArray(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateArray(a2); }).to.throw(TypeError); ; }); } else { it(".validateArray(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateArray(a2)).to.be.equal(a2); }); } }); }); describe(".validateFunction()", function() { [ ["test1", false], [void 0, false], [null, false], [() => { }, true], [2, false], [false, false], [true, false], [4.5, false], [{}, false], [[1, 2, 3], false], [Symbol("foo"), false] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); if (b === false) { it(".validateFunction(" + typeof a2 + ") should throw TypeException " + b, function() { expect(() => { validateFunction(a2); }).to.throw(TypeError); ; }); } else { it(".validateFunction(" + typeof a2 + ") should not throw TypeException " + b, function() { expect(validateFunction(a2)).to.be.equal(a2); }); } }); }); }); // test/cases/types/typeof.mjs init_stack(); init_typeof(); describe("typeOf", function() { describe(".typeOf()", function() { [ [true, "boolean"], [null, "null"], [void 0, "undefined"], [Promise.resolve(), "promise"], [/* @__PURE__ */ new WeakMap(), "weakmap"], [/* @__PURE__ */ new Map(), "map"], [NaN, "number"], [function* () { }, "generatorfunction"], [5, "number"], [function() { }, "function"], [/a/, "regexp"], [/* @__PURE__ */ new Date(), "date"], [{}, "object"], [[], "array"], ["", "string"], [new Error(), "error"], [new Stack(), "stack"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("should return " + b + " when the value " + typeOf(a2), function() { expect(typeOf(a2)).to.be.equal(b); }); }); }); }); // test/cases/types/uniquequeue.mjs init_uniquequeue(); describe("UniqueQueue", function() { let queue; beforeEach(() => { queue = new UniqueQueue(); }); describe("isEmpty()", function() { it("first it should empty", function() { expect(queue.isEmpty()).to.be.true; }); }); describe("add sequence peek and poll", function() { it("result a,a,a,b", function() { expect(queue.add({ a: 1 })).to.be.instanceOf(UniqueQueue); expect(queue.isEmpty()).to.be.false; expect(queue.add({ a: 2 })).to.be.instanceOf(UniqueQueue); expect(queue.add({ a: 3 })).to.be.instanceOf(UniqueQueue); expect(queue.peek()).to.deep.equal({ a: 1 }); expect(queue.peek()).to.deep.equal({ a: 1 }); expect(queue.poll()).to.deep.equal({ a: 1 }); expect(queue.poll()).to.deep.equal({ a: 2 }); expect(queue.isEmpty()).to.be.false; expect(queue.peek()).to.deep.equal({ a: 3 }); expect(queue.poll()).to.deep.equal({ a: 3 }); expect(queue.isEmpty()).to.be.true; }); }); describe("add and clear", function() { it("should empty", function() { expect(queue.isEmpty()).to.be.true; expect(queue.add({ a: 1 })).to.be.instanceOf(UniqueQueue); expect(queue.isEmpty()).to.be.false; expect(queue.clear()).to.be.instanceOf(UniqueQueue); expect(queue.isEmpty()).to.be.true; }); }); describe("add no object", function() { it("should throw error", function() { expect(() => { queue.add([]); }).to.throw(TypeError); expect(() => { queue.add(1); }).to.throw(TypeError); expect(() => { queue.add(true); }).to.throw(TypeError); expect(() => { queue.add(); }).to.throw(TypeError); expect(() => { queue.add(Symbol("1")); }).to.throw(TypeError); expect(() => { queue.add(function() { }); }).to.throw(TypeError); }); }); }); // test/cases/types/stack.mjs init_stack(); describe("Stack", function() { let stack; beforeEach(() => { stack = new Stack(); }); describe("isEmpty()", function() { it("first it should empty", function() { expect(stack.isEmpty()).to.be.true; }); }); describe("add sequence peek and pull", function() { it("result a,a,a,b", function() { expect(stack.push("a")).to.be.instanceOf(Stack); expect(stack.isEmpty()).to.be.false; expect(stack.push("b")).to.be.instanceOf(Stack); expect(stack.push("c")).to.be.instanceOf(Stack); expect(stack.peek()).to.be.equal("c"); expect(stack.peek()).to.be.equal("c"); expect(stack.pop()).to.be.equal("c"); expect(stack.peek()).to.be.equal("b"); expect(stack.isEmpty()).to.be.false; }); }); describe("add and clear", function() { it("should empty", function() { expect(stack.isEmpty()).to.be.true; expect(stack.push("a")).to.be.instanceOf(Stack); expect(stack.isEmpty()).to.be.false; expect(stack.clear()).to.be.instanceOf(Stack); expect(stack.isEmpty()).to.be.true; }); }); }); // test/cases/types/basewithoptions.mjs init_basewithoptions(); describe("BaseWithOptions", function() { describe("new BaseWithOptions", function() { it("is instance of BaseWithOptions", function() { expect(new BaseWithOptions()).to.be.instanceOf(BaseWithOptions); }); it("is instance of Object", function() { expect(new BaseWithOptions()).to.be.instanceOf(Object); }); it("get option is true", function() { expect(new BaseWithOptions({ a: true }).getOption("a")).to.be.true; }); }); }); // test/cases/types/node.mjs init_node(); init_nodelist(); init_noderecursiveiterator(); describe("NodeList", function() { describe("#constructor", function() { it("should create an empty NodeList", function() { let nodeList = new NodeList2(); expect(nodeList.size).to.equal(0); }); it("should create a NodeList from an array", function() { let nodeList = new NodeList2([ new Node2("div"), new Node2("div"), new Node2("div") ]); expect(nodeList.size).to.equal(3); }); it("should create a NodeList from a NodeList", function() { let nodeList = new NodeList2([ new Node2("div"), new Node2("div"), new Node2("div") ]); let nodeList2 = new NodeList2(nodeList); expect(nodeList2.size).to.equal(3); }); }); it("create NodeList", function() { expect(new NodeList2()).is.instanceof(NodeList2); }); it("add Node", function() { expect(new NodeList2().add(new Node2())).to.be.instanceof(NodeList2); }); it("remove Node", function() { expect(new NodeList2().remove(new Node2())).to.be.instanceof(NodeList2); }); it("has unknown Node", function() { expect(new NodeList2().has(new Node2())).to.be.false; }); it("has added Node", function() { const n = new Node2(); expect(new NodeList2().add(n).has(n)).to.be.true; }); it("throw exception", function() { expect(() => new NodeList2().add(1)).to.throw(Error); }); it("check level", function() { const root = new Node2("root"); const n1 = new Node2("n1"); const n2 = new Node2("n2"); const n3 = new Node2("n3"); const n4 = new Node2("n4"); const n11 = new Node2("n11"); const n12 = new Node2("n12"); const n13 = new Node2("n13"); const n21 = new Node2("n21"); const n22 = new Node2("n22"); const n23 = new Node2("n23"); const n41 = new Node2("n41"); const n42 = new Node2("n42"); const n411 = new Node2("n411"); const n412 = new Node2("n412"); const n413 = new Node2("n413"); const n4121 = new Node2("n4121"); root.appendChild(n1).appendChild(n2).appendChild(n3).appendChild(n4); n1.appendChild(n11).appendChild(n12).appendChild(n13); n2.appendChild(n21).appendChild(n22).appendChild(n23); n4.appendChild(n41).appendChild(n42); n41.appendChild(n411).appendChild(n412).appendChild(n413); n412.appendChild(n4121); let iterator = new NodeRecursiveIterator(root); let result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value + ":" + n.level); } expect(result).to.deep.equal([ "root:0", "n1:1", "n11:2", "n12:2", "n13:2", "n2:1", "n21:2", "n22:2", "n23:2", "n3:1", "n4:1", "n41:2", "n411:3", "n412:3", "n4121:4", "n413:3", "n42:2" ]); n4121.appendChild(new Node2("n41211")); iterator = new NodeRecursiveIterator(root); result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value + ":" + n.level); } expect(result).to.deep.equal([ "root:0", "n1:1", "n11:2", "n12:2", "n13:2", "n2:1", "n21:2", "n22:2", "n23:2", "n3:1", "n4:1", "n41:2", "n411:3", "n412:3", "n4121:4", "n41211:5", "n413:3", "n42:2" ]); const bb = new Node2("bb"); bb.appendChild(root); iterator = new NodeRecursiveIterator(bb); result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value + ":" + n.level); } expect(result).to.deep.equal([ "bb:0", "root:1", "n1:2", "n11:3", "n12:3", "n13:3", "n2:2", "n21:3", "n22:3", "n23:3", "n3:2", "n4:2", "n41:3", "n411:4", "n412:4", "n4121:5", "n41211:6", "n413:4", "n42:3" ]); }); describe("Levels", function() { it("n2 should level 2", function() { const n0 = new Node2("abc"); const n1 = new Node2("def"); n0.appendChild(n1); const n2 = new Node2("ghi"); n1.appendChild(n2); const n3 = new Node2("jkl"); n2.appendChild(n3); expect(n0.level).to.be.equal(0); expect(n1.level).to.be.equal(1); expect(n2.level).to.be.equal(2); expect(n3.level).to.be.equal(3); }); }); describe("toString()", function() { it("should output empty string", function() { const node = new Node2(); expect(node.toString()).is.equal(""); }); it("should output string", function() { const n0 = new Node2("abc"); const n1 = new Node2("def"); n0.appendChild(n1); const n11 = new Node2("ghi"); n0.appendChild(n11); const n2 = new Node2("jkl"); n1.appendChild(n2); const n3 = new Node2("mno"); n1.appendChild(n3); const n4 = new Node2("pqr"); n2.appendChild(n4); expect(n2.level).to.be.equal(2); }); }); }); // test/cases/types/queue.mjs init_queue(); describe("Queue", function() { let queue; beforeEach(() => { queue = new Queue(); }); describe("isEmpty()", function() { it("first it should empty", function() { expect(queue.isEmpty()).to.be.true; }); }); describe("add sequence peek and poll", function() { it("result a,a,a,b", function() { expect(queue.add("a")).to.be.instanceOf(Queue); expect(queue.isEmpty()).to.be.false; expect(queue.add("b")).to.be.instanceOf(Queue); expect(queue.add("c")).to.be.instanceOf(Queue); expect(queue.peek()).to.be.equal("a"); expect(queue.peek()).to.be.equal("a"); expect(queue.poll()).to.be.equal("a"); expect(queue.peek()).to.be.equal("b"); expect(queue.isEmpty()).to.be.false; }); }); describe("add and clear", function() { it("should empty", function() { expect(queue.isEmpty()).to.be.true; expect(queue.add("a")).to.be.instanceOf(Queue); expect(queue.isEmpty()).to.be.false; expect(queue.clear()).to.be.instanceOf(Queue); expect(queue.isEmpty()).to.be.true; }); }); }); // test/cases/types/noderecursiveiterator.mjs init_node(); init_nodelist(); init_noderecursiveiterator(); describe("NodeRecursiveIterator", function() { it("should throw exeption", function() { expect(() => new NodeRecursiveIterator()).to.throw(Error); }); it("should be a function", function() { expect(NodeRecursiveIterator).to.be.a("function"); }); it("should be a constructor", function() { expect(new NodeRecursiveIterator(new Node2())).to.be.an.instanceof(NodeRecursiveIterator); }); it("undefined should not result in undefined node", function() { const iterator = new NodeRecursiveIterator(new Node2()); const result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value); } expect(result).to.deep.equal([void 0]); }); it("should iterate", function() { const node = new Node2("1"); node.appendChild( new Node2("2").appendChild(new Node2("2.1")).appendChild(new Node2("2.2")).appendChild(new Node2("2.3")) ).appendChild(new Node2("3")).appendChild(new Node2("4").appendChild(new Node2("4.1")).appendChild(new Node2("4.2"))); const iterator = new NodeRecursiveIterator(node); const result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value); } expect(result).to.deep.equal(["1", "2", "2.1", "2.2", "2.3", "3", "4", "4.1", "4.2"]); }); it("should iterate nodelist", function() { const nodeList = new NodeList2(); nodeList.add( new Node2("2").appendChild(new Node2("2.1")).appendChild(new Node2("2.2")).appendChild(new Node2("2.3")).appendChild(new Node2("3")).appendChild(new Node2("4").appendChild(new Node2("4.1")).appendChild(new Node2("4.2"))) ); nodeList.add(new Node2("x")); const iterator = new NodeRecursiveIterator(nodeList); const result = []; for (const n of iterator) { expect(n).to.be.an.instanceof(Node2); result.push(n.value); } expect(result).to.deep.equal(["2", "2.1", "2.2", "2.3", "3", "4", "4.1", "4.2", "x"]); }); }); // test/cases/i18n/time-ago.mjs init_time_ago(); describe("formatTimeAgo", () => { it('returns "just now" for times less than a second ago', () => { const now = /* @__PURE__ */ new Date(); expect(formatTimeAgo(now, "en")).to.equal("just now"); }); it('returns "in 1 second" for one second in the future', () => { const oneSecondFuture = new Date(Date.now() + 1e3); expect(formatTimeAgo(oneSecondFuture, "en")).to.equal("in 1 second"); }); it('returns "1 second ago" for one second in the past', () => { const oneSecondPast = new Date(Date.now() - 1e3); expect(formatTimeAgo(oneSecondPast, "en")).to.equal("1 second ago"); }); it('returns "in 1 minute, 30 seconds" for 90 seconds in the future', () => { const ninetySecondsFuture = new Date(Date.now() + 9e4); expect(formatTimeAgo(ninetySecondsFuture, "en")).to.equal("in 1 minute and 30 seconds"); }); it('returns "1 minute, 30 seconds ago" for 90 seconds in the past', () => { const ninetySecondsPast = new Date(Date.now() - 9e4); expect(formatTimeAgo(ninetySecondsPast, "en")).to.equal("1 minute and 30 seconds ago"); }); }); // source/i18n/formatter.mjs init_constants(); init_extend(); init_formatter(); init_validate(); init_translations(); var internalTranslationSymbol = Symbol("internalTranslation"); var Formatter2 = class extends Formatter { /** * Default values for the markers are `${` and `}` * * @param {object} object * @throws {TypeError} value is not a object */ constructor(object, translation, options2) { super(object, options2); this[internalTranslationSymbol] = validateInstance( translation, Translations ); } /** * This method is called by the `instanceof` operator. * @return {symbol} * @since 3.27.0 */ static get [instanceSymbol]() { return Symbol.for("@schukai/monster/i18n/formatter@@instance"); } /** * @property {object} marker * @property {array} marker.open=["i18n{","${"] * @property {array} marker.close=["${"] * @property {object} parameter * @property {string} parameter.delimiter="::" * @property {string} parameter.assignment="=" * @property {object} callbacks * @property {function} callbacks.i18n=()=>{} */ get defaults() { return extend({}, super.defaults, { callbacks: { i18n: (value) => { return this[internalTranslationSymbol].getText(validateString(value)); } }, marker: { open: ["i18n{", "${"], close: ["}"] } }); } /** * * @param {string} text * @return {string} * @throws {TypeError} value is not a string * @throws {Error} too deep nesting * @throws {Error} key not found * @throws {Error} the closing marker is missing */ format(text) { validateString(text); const openMarker = this[internalSymbol]["marker"]["open"]?.[0]; const closeMarker = this[internalSymbol]["marker"]["close"]?.[0]; if (text.indexOf(openMarker) === 0) { text = text.substring(openMarker.length); if (text.indexOf(closeMarker) === text.length - closeMarker.length) { text = text.substring(0, text.length - closeMarker.length); } else { throw new Error("the closing marker is missing"); } } const parts = validateString(text).split("::"); const translationKey = parts.shift().trim(); const parameter = parts.join("::").trim(); let assembledText = `${openMarker}static:${translationKey} | call:i18n`; if (parameter.length > 0) { assembledText += `::${parameter}`; } assembledText += closeMarker; return super.format(assembledText); } }; // test/cases/i18n/formatter.mjs init_translations(); describe("Formatter", function() { describe("example", function() { it("should run with marker", function() { const translations2 = new Translations("en").assignTranslations({ thekey: "${animal} has eaten the ${food}!" }); const f = new Formatter2({}, translations2); expect(f.format("i18n{thekey::animal=dog::food=cake}")).to.be.equal("dog has eaten the cake!"); }); it("should run without marker", function() { const translations2 = new Translations("en").assignTranslations({ thekey: "${animal} has eaten the ${food}!" }); expect(new Formatter2({}, translations2).format("thekey::animal=dog::food=cake")).to.be.equal("dog has eaten the cake!"); }); }); describe("format", function() { [ ["i18n{translationkey::a=3::b=5}", "test is 3 and 5"] ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); it("format " + a2 + " should " + b, function() { const translations2 = new Translations("de").assignTranslations({ translationkey: "test is ${a} and ${b}" }); expect( new Formatter2({}, translations2).format(a2) ).to.equal(b); }); }); }); }); // test/cases/i18n/locale.mjs init_locale(); describe("Locale", function() { describe("new instance", function() { [ // language, region, script, variants, extlang, privateUse // https://www.rfc-editor.org/rfc/rfc5646.html ["zh", void 0, "Hant", void 0, void 0, void 0, "zh-Hant"], // zh-Hant (Chinese written using the Traditional Chinese script) ["de", "CH", void 0, "1901", void 0, void 0, "de-CH-1901"], // de-CH-1901 (German as used in Switzerland using the 1901 variant [orthography]) ["sl", "IT", void 0, "nedis", void 0, void 0, "sl-IT-nedis"], // sl-IT-nedis (Slovenian as used in Italy, Nadiza dialect) ["hy", "IT", "Latn", "arevela", void 0, void 0, "hy-Latn-IT-arevela"], // hy-Latn-IT-arevela (Eastern Armenian written in Latin script, as used in Italy) ["zh", "CN", "Hans", void 0, void 0, void 0, "zh-Hans-CN"], // zh-Hans-CN (Chinese written using the Simplified script as used in mainland China) ["sr", "RS", "Latn", void 0, void 0, void 0, "sr-Latn-RS"] // sr-Latn-RS (Serbian written using the Latin script as used in Serbia) ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); let e = data.shift(); let f = data.shift(); let g = data.shift(); it("new Locale(" + a2 + "," + b + "," + c + "," + d + "," + e + "," + f + ") should return " + g, function() { expect(new Locale(a2, b, c, d, e, f).toString()).is.equal(g); }); }); }); describe("parseLocale()", function() { [ // language, region, script, variants, extlang, privateUse // https://www.rfc-editor.org/rfc/rfc5646.html ["zh", void 0, "Hant", void 0, void 0, void 0, "zh-Hant"], // zh-Hant (Chinese written using the Traditional Chinese script) ["de", "CH", void 0, "1901", void 0, void 0, "de-CH-1901"], // de-CH-1901 (German as used in Switzerland using the 1901 variant [orthography]) ["sl", "IT", void 0, "nedis", void 0, void 0, "sl-IT-nedis"], // sl-IT-nedis (Slovenian as used in Italy, Nadiza dialect) ["hy", "IT", "Latn", "arevela", void 0, void 0, "hy-Latn-IT-arevela"], // hy-Latn-IT-arevela (Eastern Armenian written in Latin script, as used in Italy) ["zh", "CN", "Hans", void 0, void 0, void 0, "zh-Hans-CN"], // zh-Hans-CN (Chinese written using the Simplified script as used in mainland China) ["sr", "RS", "Latn", void 0, void 0, void 0, "sr-Latn-RS"] // sr-Latn-RS (Serbian written using the Latin script as used in Serbia) ].forEach(function(data) { let a2 = data.shift(); let b = data.shift(); let c = data.shift(); let d = data.shift(); let e = data.shift(); let f = data.shift(); let g = data.shift(); it("new Locale(" + a2 + "," + b + "," + c + "," + d + "," + e + "," + f + ") should return " + g, function() { const locale = parseLocale(g); expect(locale.localeString).to.be.equal(g); expect(locale.language).to.be.equal(a2); expect(locale.region).to.be.equal(b); expect(locale.script).to.be.equal(c); expect(locale.variants).to.be.equal(d); expect(locale.extlang).to.be.equal(e); expect(locale.privateUse).to.be.equal(f); expect(new Locale(a2, b, c, d, e, f).toString()).is.equal(g); }); }); }); }); // test/cases/i18n/provider.mjs init_constants2(); init_attributes(); init_provider(); init_translations(); describe("Provider", function() { let html117 = ` <div id="test1"> </div> `; beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); before(function(done) { initJSDOM().then(() => { done(); }); }); describe("Provider and Dom", function() { const translationsLinkSymbol2 = Symbol.for("@schukai/monster/i18n/translations@@link"); it("assignToElement", function(done) { const element = document.getElementById("test1"); const p = new Provider(); const r = p.assignToElement(void 0, element); r.then((e) => { const s = element.getAttribute(ATTRIBUTE_OBJECTLINK); if (s === null) { done(new Error("Attribute not set")); return; } const i = getLinkedObjects(element, translationsLinkSymbol2); if (i === null) { done(new Error("No linked object found")); return; } let counter = 0; for (let v of i) { counter++; } if (counter !== 1) { done(new Error("No linked object found")); return; } const docTrans = getDocumentTranslations(element); expect(docTrans).is.instanceof(Translations); done(); }).catch((e) => done(e)); }); }); }); // source/i18n/providers/fetch.mjs init_constants(); init_extend(); init_formatter(); init_global(); init_is(); init_validate(); init_locale(); init_provider(); init_translations(); var Fetch = class extends Provider { /** * As options the key `fetch` can be passed. This config object is passed to the fetch method as init. * * The url may contain placeholders (language, script, region, variants, extlang, privateUse), so you can specify one url for all translations. * * ``` * new Fetch('https://www.example.com/assets/${language}.json') * ``` * * @param {string|URL} url * @param {Object} options see {@link Monster.I18n.Providers.Fetch#defaults} * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/fetch} */ constructor(url, options2) { super(options2); if (isInstance(url, URL)) { url = url.toString(); } if (options2 === void 0) { options2 = {}; } validateString(url); this.url = url; this[internalSymbol] = extend( {}, super.defaults, this.defaults, validateObject(options2) ); } /** * Defaults * * @property {Object} fetch * @property {String} fetch.method=GET * @property {String} fetch.mode=cors * @property {String} fetch.cache=no-cache * @property {String} fetch.credentials=omit * @property {String} fetch.redirect=follow * @property {String} fetch.referrerPolicy=no-referrer * * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API} */ get defaults() { return extend( { fetch: { method: "GET", // *GET, POST, PUT, DELETE, etc. mode: "cors", // no-cors, *cors, same-origin cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached credentials: "omit", // include, *same-origin, omit redirect: "follow", // manual, *follow, error referrerPolicy: "no-referrer" // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url } }, super.defaults ); } /** * * @param {Locale|string} locale * @return {Promise} */ getTranslations(locale) { if (isString(locale)) { locale = parseLocale(locale); } const formatter = new Formatter(locale.getMap()); return getGlobalFunction("fetch")( formatter.format(this.url), this.getOption("fetch", {}) ).then((response) => response.json()).then((data) => { return new Translations(locale).assignTranslations(data); }); } }; // test/cases/i18n/providers/fetch.mjs init_translations(); init_global(); var global18 = getGlobal(); var fetchReference3; describe("Translation Provider Fetch", function() { afterEach(() => { global18["fetch"] = fetchReference3; }); beforeEach(() => { fetchReference3 = global18["fetch"]; global18["fetch"] = function(url, options2) { return new Promise((resolve, reject) => { resolve({ json: function() { return { a: "test" }; } }); }); }; }); describe("fetch mock data and create translation", function() { it("fetch", function(done) { let p = new Fetch(new URL("http://example.com")).getTranslations("en"); expect(p).is.instanceof(Promise); p.then((r) => { try { expect(r).is.instanceof(Translations); done(); } catch (e) { done(e); } }).catch((e) => { done(e); }); }); }); }); // test/cases/i18n/providers/embed.mjs init_embed(); init_translations(); init_global(); var global19 = getGlobal(); var html116 = ` <script id="templocale" type="application/json"> { "key": "translation" } <\/script> `; describe("Translation Provider Embed", function() { before(function(done) { initJSDOM().then(() => { done(); }); }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html116; }); describe("get mock data and create translation", function() { it("embed", function(done) { const e = new Embed("templocale"); let p = e.getTranslations("en"); expect(p).is.instanceof(Promise); p.then((r) => { try { expect(r).is.instanceof(Translations); let t = r.getText("key"); expect(t).is.equal("translation"); done(); } catch (e2) { done(e2); } }).catch((e2) => { done(e2); }); }); }); }); // test/cases/i18n/util.mjs init_global(); var expect26 = expect; use(chaiDom); describe("LocalPicker", function() { let LocalPicker, documentLanguage, linkTags, originalLanguages, getPreferredLanguage; before(function(done) { initJSDOM().then(() => { documentLanguage = document.documentElement.lang; linkTags = Array.from(document.querySelectorAll('link[rel="alternate"]')); linkTags.forEach((item) => item.remove()); Promise.resolve().then(() => (init_dist(), dist_exports)).catch((e) => done(e)); Promise.resolve().then(() => (init_util3(), util_exports)).then((m) => { LocalPicker = m["LocalPicker"]; getPreferredLanguage = m["detectUserLanguagePreference"]; originalLanguages = navigator.languages; done(); }).catch((e) => done(e)); }); }); after(function() { document.documentElement.lang = documentLanguage; linkTags.forEach((item) => { const link = document.createElement("link"); link.setAttribute("rel", "alternate"); link.setAttribute("hreflang", item.hreflang); link.setAttribute("href", item.href); if (!document.querySelector(`link[hreflang="${item.hreflang}"]`)) { document.querySelector("head").appendChild(link); } }); Object.defineProperty(navigator, "languages", { value: originalLanguages, writable: true }); }); function setupDOM({ htmlLang = "", linkHreflangs = [], navLang = "" }) { linkTags = Array.from(document.querySelectorAll('link[rel="alternate"]')); linkTags.forEach((item) => item.remove()); const head = window.document.querySelector("head"); linkHreflangs.forEach((item) => { const link = window.document.createElement("link"); link.setAttribute("rel", "alternate"); link.setAttribute("hreflang", item.hreflang); link.setAttribute("href", item.href); head.appendChild(link); }); window.document.documentElement.lang = htmlLang; Object.defineProperty(navigator, "language", { value: navLang[0] || "", writable: true }); Object.defineProperty(navigator, "languages", { value: navLang, writable: true }); } describe("getPreferredLanguage()", () => { it('should return "No language information available." when no current and no user preferences', () => { setupDOM({ htmlLang: "", linkHreflangs: [], navLang: [] }); const result = getPreferredLanguage(); expect26(result).to.have.property("message").that.not.empty; }); it('should return "No <link> tags with hreflang available." when there are no link tags', () => { setupDOM({ htmlLang: "en", linkHreflangs: [] }); window.navigator.languages = []; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "en"); expect26(result).to.have.property("message").that.equals("No <link> tags with hreflang available."); }); it('should return "None of the preferred languages are available." when there are link tags but no matching user preferences', () => { setupDOM({ htmlLang: "en", linkHreflangs: [ { hreflang: "de", href: "http://example.com/de" }, { hreflang: "fr", href: "http://example.com/fr" } ], navLang: [] }); const result = getPreferredLanguage(); expect26(result).to.have.property("current", "en"); expect26(result).to.have.property("message").that.equals("No available languages match the user's preferences."); expect26(result.available).to.be.an("array").that.has.lengthOf(2); }); it('should return best match = "en" when user prefers en', () => { setupDOM({ htmlLang: "en", linkHreflangs: [ { hreflang: "en", href: "http://example.com/en" }, { hreflang: "de", href: "http://example.com/de" } ] }); window.navigator.languages = ["en"]; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "en"); console.log(JSON.stringify(result.preferred)); expect26(result.preferred).to.have.property("full", "en"); expect26(result.preferred).to.have.property("base", "en"); expect26(result.preferred).to.have.property("label", "English"); expect26(result.preferred).to.have.property("href", "http://example.com/en"); }); it('should return best match = "de-DE" when user prefers de-DE', () => { setupDOM({ htmlLang: "de-DE", linkHreflangs: [ { hreflang: "de-DE", href: "http://example.com/de-DE" }, { hreflang: "en-US", href: "http://example.com/en-US" } ] }); window.navigator.languages = ["de-DE"]; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "de-DE"); expect26(result.preferred).to.have.property("full", "de-DE"); expect26(result.preferred).to.have.property("base", "de"); expect26(result.preferred).to.have.property("label", "Deutsch (Deutschland)"); expect26(result.preferred).to.have.property("href", "http://example.com/de-DE"); }); it('should return best match = "de-DE" when user prefers de-DE', () => { setupDOM({ htmlLang: "en", linkHreflangs: [ { hreflang: "de", href: "http://example.com/de-DE" }, { hreflang: "en", href: "http://example.com/en-US" } ] }); window.navigator.languages = ["de-DE"]; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "en"); expect26(result.preferred).to.have.property("full", "de"); expect26(result.preferred).to.have.property("base", "de"); expect26(result.preferred).to.have.property("label", "Deutsch"); expect26(result.preferred).to.have.property("href", "http://example.com/de-DE"); }); it('should return best match = "en-US" for user preferences [en-US, en]', () => { setupDOM({ htmlLang: "de-DE", linkHreflangs: [ { hreflang: "en-US", href: "http://example.com/en-US" }, { hreflang: "en-GB", href: "http://example.com/en-GB" } ] }); window.navigator.languages = ["en-US", "en"]; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "de-DE"); expect26(result.preferred).to.have.property("full", "en-US"); expect26(result.preferred).to.have.property("base", "en"); expect26(result.preferred).to.have.property("label", "English (United States)"); expect26(result.preferred).to.have.property("href", "http://example.com/en-US"); }); it('should return best match = "de-DE" when user preferences include its base language "de"', () => { setupDOM({ htmlLang: "de-DE", linkHreflangs: [ { hreflang: "de-DE", href: "http://example.com/de-DE" }, { hreflang: "en-US", href: "http://example.com/en-US" } ] }); window.navigator.languages = ["de", "en"]; const result = getPreferredLanguage(); expect26(result).to.have.property("current", "de-DE"); expect26(result.preferred).to.have.property("full", "de-DE"); expect26(result.preferred).to.have.property("base", "de"); expect26(result.preferred).to.have.property("label", "Deutsch (Deutschland)"); expect26(result.preferred).to.have.property("href", "http://example.com/de-DE"); }); it("should return the first item when multiple link tags have the same weight", () => { setupDOM({ htmlLang: "en", linkHreflangs: [ { hreflang: "fr", href: "http://example.com/fr" }, { hreflang: "es", href: "http://example.com/es" } ] }); window.navigator.languages = ["de"]; const result = getPreferredLanguage(); expect26(result.available[0].fullLang).to.equal("fr"); expect26(result.available[1].fullLang).to.equal("es"); expect26(result.offerable).to.be.undefined; expect26(result).to.have.property("message", "No available languages match the user's preferences."); }); it("should include bestURL when a best match is found", () => { setupDOM({ htmlLang: "fr", linkHreflangs: [ { hreflang: "fr-FR", href: "http://example.com/fr-FR" }, { hreflang: "de-DE", href: "http://example.com/de-DE" } ] }); window.navigator.languages = ["fr-FR", "de-DE"]; const result = getPreferredLanguage(); expect26(result.preferred).to.have.property("full", "fr-FR"); expect26(result.preferred).to.have.property("base", "fr"); expect26(result.preferred).to.have.property("label", "Fran\xE7ais (France)"); expect26(result.preferred).to.have.property("href", "http://example.com/fr-FR"); }); it("should return availableLanguages with weight for each link", () => { setupDOM({ htmlLang: "en-GB", linkHreflangs: [ { hreflang: "en-GB", href: "http://example.com/en-GB" }, { hreflang: "en-US", href: "http://example.com/en-US" } ] }); window.navigator.languages = ["en-GB", "en", "en-US"]; const result = getPreferredLanguage(); expect26(result.available).to.be.an("array").with.lengthOf(2); result.available.forEach((item) => { expect26(item).to.have.property("weight"); expect26(item).to.have.property("fullLang"); expect26(item).to.have.property("baseLang"); expect26(item).to.have.property("href"); }); }); }); }); // test/cases/i18n/translations.mjs init_locale(); init_embed(); init_translations(); describe("Translations", function() { describe("Instance and Init", function() { let translation; beforeEach(() => { translation = new Translations(parseLocale("en-GB")); translation.assignTranslations({ test1: "abc", test2: { "other": "xyz" } }); }); it("create instance", function() { expect(new Translations(parseLocale("en-GB"))).is.instanceof(Translations); }); it("init translations", function() { expect(translation.assignTranslations({ test1: "abc", test2: { "other": "xyz" } })).is.instanceof(Translations); }); }); describe("getText", function() { let translation; beforeEach(() => { translation = new Translations(parseLocale("en-GB")); translation.assignTranslations({ test1: "abc", test2: { "other": "xyz" } }); }); it("create, set and get en-GB", function() { expect(translation.getText("test1")).is.equal("abc"); }); it("create, set and get en-GB with pluralrules", function() { expect(translation.getText("test2")).is.equal("xyz"); }); }); describe("test initDocumentTranslation ", function() { let html117 = `<div id="mock-translations"></div> <script type="application/json" data-monster-role="translations"> { "test1": "abc", "test2": { "other": "xyz" } } <\/script> <script type="application/json" data-monster-role="translations"> { "test1": "xyz", "test3": { "other": "xyz" } } <\/script> `; beforeEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = html117; }); afterEach(() => { let mocks = document.getElementById("mocks"); mocks.innerHTML = ""; }); before(function(done) { initJSDOM().then(() => { done(); }); }); it("Init translations", function(done) { let elem = document.getElementById("mock-translations"); Embed.assignTranslationsToElement(elem).then((o) => { let mocks = document.getElementById("mocks"); expect(getDocumentTranslations(elem).getText("no-key", "with-default")).is.equal("with-default"); expect(getDocumentTranslations(elem).getText("test1")).is.equal("xyz"); done(); }).catch((e) => { done(e); }); }); }); }); })(); /** * @private * @type {symbol} * @license AGPLv3 * @since 1.24.0 */ /** * @private * @type {symbol} * @license AGPLv3 * @since 1.25.0 */ /** * With this function you can check if a value is iterable. * * This method is used in the library to have consistent names. * * You can call the method via the monster namespace `Monster.Types.isPrimitive()`. * * @externalExample ../../example/types/is-1.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.2.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a primitive (string, number, boolean, NaN, undefined, null or symbol) * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-2.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a symbol * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-3.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a boolean. * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-4.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a string * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-5.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a object * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-6.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a object and instance of instance. * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-7.mjs * @param {*} value * @param {*} instance * @return {boolean} * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is a array * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-8.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @see https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray */ /** * Checks whether the value passed is a function * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-9.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * Checks whether the value passed is an integer. * * This method is used in the library to have consistent names. * * @externalExample ../../example/types/is-10.mjs * @param {*} value * @return {boolean} * @license AGPLv3 * @since 1.4.0 * @copyright schukai GmbH */ /** * This method checks if the type matches the primitive type. this function is identical to isPrimitive() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateIterable} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateIterable('2')) // ↦ TypeError * console.log(validateIterable([])) // ↦ value * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.2.0 * @copyright schukai GmbH * @throws {TypeError} value is not a primitive * @see {@link isPrimitive} * @see {@link Monster.Types.isPrimitive} * @see {@link Monster.Types#isPrimitive} */ /** * This method checks if the type matches the primitive type. this function is identical to isPrimitive() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validatePrimitive} from '@schukai/monster/source/types/validate.mjs'; * console.log(validatePrimitive('2')) // ↦ value * console.log(validatePrimitive([])) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not a primitive * @see {@link isPrimitive} * @see {@link Monster.Types.isPrimitive} * @see {@link Monster.Types#isPrimitive} */ /** * This method checks if the type matches the boolean type. this function is identical to isBoolean() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateBoolean} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateBoolean(false)) // ↦ value * console.log(validateBoolean('2')) // ↦ TypeError * console.log(validateBoolean([])) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not primitive */ /** * This method checks if the type matches the string type. this function is identical to isString() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateString} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateString('2')) // ↦ value * console.log(validateString([])) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not a string */ /** * This method checks if the type matches the object type. this function is identical to isObject() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateObject} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateObject({})) // ↦ value * console.log(validateObject('2')) // ↦ TypeError * console.log(validateObject([])) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not a object */ /** * This method checks if the type matches the object instance. * * ``` * <script type="module"> * import {validateInstance} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateInstance({}, Object)) // ↦ value * console.log(validateInstance('2', Object)) // ↦ TypeError * console.log(validateInstance([], Object)) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @param {object} instance * @return {*} * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH * @throws {TypeError} value is not an instance of */ /** * This method checks if the type matches the array type. this function is identical to isArray() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateArray} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateArray('2')) // ↦ TypeError * console.log(validateArray([])) // ↦ value * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not an array */ /** * This method checks if the type matches the symbol type. this function is identical to isSymbol() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateSymbol} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateSymbol('2')) // ↦ TypeError * console.log(validateSymbol()) // ↦ value * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @throws {TypeError} value is not an symbol */ /** * This method checks if the type matches the function type. this function is identical to isFunction() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateFunction} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateFunction(()=>{})) // ↦ value * console.log(validateFunction('2')) // ↦ TypeError * console.log(validateFunction([])) // ↦ TypeError * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {TypeError} value is not a function */ /** * This method checks if the type is an integer. this function is identical to isInteger() except that a TypeError is thrown. * * ``` * <script type="module"> * import {validateFunction} from '@schukai/monster/source/types/validate.mjs'; * console.log(validateInteger(true)) // ↦ TypeError * console.log(validateInteger('2')) // ↦ TypeError * console.log(validateInteger(2)) // ↦ value * <\/script> * ``` * * @param {*} value * @return {*} * @license AGPLv3 * @since 1.4.0 * @copyright schukai GmbH * @throws {TypeError} value is not an integer */ /** * Return globalThis * * If globalThis is not available, it will be polyfilled * * @license AGPLv3 * @since 1.6.0 * @return {object} globalThis */ /** * Return global object or throw Error * * You can call the method via the monster namespace `Monster.Types.getGlobalObject()`. * * ``` * <script type="module"> * import {Monster} from '@schukai/monster/source/monster.mjs'; * Monster.Types.getGlobalObject('document') * // ↦ { } * <\/script> * ``` * * Alternatively, you can also integrate this function individually. * * ``` * <script type="module"> * import {getGlobalObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/modules/types/global.mjs'; * getGlobalObject('document') * // ↦ { } * <\/script> * ``` * * @license AGPLv3 * @since 1.6.0 * @param {string} name * @return {object} * @throws {Error} the object is not defined * @throws {TypeError} value is not a object * @throws {TypeError} value is not a string */ /** * Return global function or throw Error * * You can call the method via the monster namespace `Monster.Types.getGlobalFunction()`. * * ``` * <script type="module"> * import {Monster} from '@schukai/monster/source/monster.mjs'; * console.log(Monster.Types.getGlobalFunction('parseInt')) // ↦ f parseInt() { } * <\/script> * ``` * * Alternatively, you can also integrate this function individually. * * ``` * <script type="module"> * import {getGlobalFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/modules/types/global.mjs'; * console.log(getGlobalFunction('parseInt')) // ↦ f parseInt() { } * <\/script> * ``` * * @license AGPLv3 * @since 1.6.0 * @param {string} name * @return {object} * @throws {TypeError} value is not a function * @throws {Error} the function is not defined * @throws {TypeError} value is not a string */ /** * The built-in typeof method is known to have some historical weaknesses. This function tries to provide a better and more accurate result. * * @param {*} value * @return {string} * @license AGPLv3 * @since 1.7.0 * @copyright schukai GmbH * @throws {TypeError} value is not a primitive */ /** * Extend copies all enumerable own properties from one or * more source objects to a target object. It returns the modified target object. * * @return {object} * @license AGPLv3 * @since 1.10.0 * @copyright schukai GmbH * @throws {Error} unsupported argument * @throws {Error} type mismatch * @throws {Error} unsupported argument * @param args */ /** * You can call the method via the monster namespace `new Queue()`. * * @license AGPLv3 * @since 1.4.0 * @copyright schukai GmbH */ /** * Pathfinder is a class to find a path to an object. * * With the help of the pathfinder, values can be read and written from an object construct. * * ``` * new Pathfinder({ * a: { * b: { * f: [ * { * g: false, * } * ], * } * } * }).getVia("a.b.f.0.g"); // ↦ false * ``` * * if a value is not present or has the wrong type, a corresponding exception is thrown. * * ``` * new Pathfinder({}).getVia("a.b.f.0.g"); // ↦ Error * ``` * * The `Pathfinder.exists()` method can be used to check whether access to the path is possible. * * ``` * new Pathfinder({}).exists("a.b.f.0.g"); // ↦ false * ``` * * pathfinder can also be used to build object structures. to do this, the `Pathfinder.setVia()` method must be used. * * ``` * obj = {}; * new Pathfinder(obj).setVia('a.b.0.c', true); // ↦ {a:{b:[{c:true}]}} * ``` * * @example /examples/libraries/pathfinder/example-1/ Example 1 * @example /examples/libraries/pathfinder/example-2/ Example 2 * * @license AGPLv3 * @since 1.4.0 * @copyright schukai GmbH * @summary Pathfinder is a class to find a path to an object. */ /** * * @param {object} subject * @param {string} path * @return {void} * @throws {TypeError} unsupported type * @throws {TypeError} unsupported type * @throws {Error} the journey is not at its end * @throws {Error} unsupported action for this data type * @license AGPLv3 * @since 1.6.0 * @private */ /** * A `TokenList` allows you to manage tokens (individual character strings such as css classes in an attribute string). * * The `TokenList` offers various functions to manipulate values. For example, you can add, remove or replace a class in a CSS list. * * This class implements the [iteration protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols). * * @license AGPLv3 * @since 1.2.0 * @copyright schukai GmbH */ /** * @license AGPLv3 * @since 1.8.0 * @type {string} */ /** * This is the name of the attribute to pass options to a control * * @license AGPLv3 * @since 1.8.0 * @type {string} */ /** * This is name of the attribute to pass the script host to a control * * @license AGPLv3 * @since 3.48.0 * @type {string} */ /** * This is the name of the attribute to pass options to a control * * @license AGPLv3 * @since 1.30.0 * @type {string} */ /** * This is the name of the attribute to pass the callback to a control * * @license AGPLv3 * @since 3.48.0 * @type {string} */ /** * This is the name of the callback to pass the callback to a control * * @license AGPLv3 * @since 3.48.0 * @type {string} */ /** * @type {string} * @license AGPLv3 * @since 1.8.0 */ /** * @type {string} * @license AGPLv3 * @since 1.27.1 */ /** * @type {string} * @license AGPLv3 * @since 1.9.0 */ /** * @type {string} * @license AGPLv3 * @deprecated since 2024-12-29 * @since 3.73.0 */ /** * @type {string} * @license AGPLv3 * @since 3.73.0 * @deprecated since 2024-12-29 */ /** * @type {string} * @license AGPLv3 * @since 1.27.0 */ /** * @type {string} * @license AGPLv3 * @since 1.14.0 */ /** * @type {string} * @license AGPLv3 * @since 1.24.0 */ /** * @type {symbol} * @license AGPLv3 * @since 1.24.0 */ /** * @type {string} * @license AGPLv3 * @since 1.25.0 */ /** * Get the closest object link of a node * * if a node is specified without a object link, a recursive search upwards is performed until the corresponding * object link is found, or undefined is returned. * * @param {HTMLElement} element * @return {HTMLElement|undefined} * @license AGPLv3 * @since 1.10.0 * @copyright schukai GmbH * @throws {TypeError} value is not an instance of HTMLElement */ /** * Adds a class attribute to an element. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param element * @param symbol * @param object * @return {*} */ /** * Removes an object from an element * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {Symbol} symbol * @return {*} */ /** * Checks if an element has an object link * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {Symbol} symbol * @return {boolean} */ /** * The ObjectLink can be used to attach objects to HTMLElements. The elements are kept in a set under a unique * symbol and can be read via an iterator {@see {@link getLinkedObjects}}. * * In addition, elements with an objectLink receive the attribute `data-monster-objectlink`. * * With the method {@see {@link addToObjectLink}} the objects can be added. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {Symbol} symbol * @return {Iterator} * @throws {Error} there is no object link for symbol */ /** * With this method tokens in an attribute can be switched on or off. For example, classes can be switched on and off in the elements class attribute. * * Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string} token * @return {HTMLElement} */ /** * This method can be used to add a token to an attribute. Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string} token * @return {HTMLElement} */ /** * This function can be used to remove tokens from an attribute. * * Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string} token * @return {HTMLElement} */ /** * This method can be used to determine whether an attribute has a token. * * Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string} token * @return {boolean} */ /** * Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string} from * @param {string} to * @return {HTMLElement} */ /** * Tokens are always separated by a space. * * @license AGPLv3 * @since 1.9.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @return {HTMLElement} */ /** * This function searches, starting from an `HTMLElemement`, for the next element that has a certain attribute. * * ```html * <div data-my-attribute="2" id="2"> * <div id="1"></div> * </div> * ``` * * ```javascript * // if no value is specified (undefined), then only the attribute is checked. * findClosestByAttribute(document.getElementById('1'),'data-my-attribute'); // ↦ node with id 2 * findClosestByAttribute(document.getElementById('2'),'data-my-attribute'); // ↦ node with id 2 * * // if a value is specified, for example an empty string, then the name and the value are checked. * findClosestByAttribute(document.getElementById('1'),'data-my-attribute', ''); // ↦ undefined * findClosestByAttribute(document.getElementById('1'),'data-my-attribute', '2'); // ↦ node with id 2 * ``` * * @license AGPLv3 * @since 1.14.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} key * @param {string|undefined} value * @return {HTMLElement|undefined} * @summary find closest node */ /** * This function searches, starting from an `HTMLElement`, for the next element that has a certain attribute. * * ```html * <div class="myclass" id="2"> * <div id="1"></div> * </div> * ``` * * ```javascript * // if no value is specified (undefined), then only the attribute is checked. * findClosestByClass(document.getElementById('1'),'myclass'); // ↦ node with id 2 * findClosestByClass(document.getElementById('2'),'myclass'); // ↦ node with id 2 * ``` * * ``` * <script type="module"> * import {findClosestByClass} from '@schukai/monster/source/dom/attributes.mjs'; * findClosestByClass(); * <\/script> * ``` * * @license AGPLv3 * @since 1.27.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} className * @return {HTMLElement|undefined} * @summary find closest node */ /** * This method fetches the document object * * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). * * ``` * import {JSDOM} from "jsdom" * if (typeof window !== "object") { * const {window} = new JSDOM('', { * url: 'http://example.com/', * pretendToBeVisual: true * }); * * [ * 'self', * 'document', * 'Document', * 'Node', * 'Element', * 'HTMLElement', * 'DocumentFragment', * 'DOMParser', * 'XMLSerializer', * 'NodeFilter', * 'InputEvent', * 'CustomEvent' * ].forEach(key => (getGlobal()[key] = window[key])); * } * ``` * * @return {object} * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @throws {Error} not supported environment */ /** * This method fetches the window object * * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). * * ``` * import {JSDOM} from "jsdom" * if (typeof window !== "object") { * const {window} = new JSDOM('', { * url: 'http://example.com/', * pretendToBeVisual: true * }); * * getGlobal()['window']=window; * * [ * 'self', * 'document', * 'Document', * 'Node', * 'Element', * 'HTMLElement', * 'DocumentFragment', * 'DOMParser', * 'XMLSerializer', * 'NodeFilter', * 'InputEvent', * 'CustomEvent' * ].forEach(key => (getGlobal()[key] = window[key])); * } * ``` * * @return {object} * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @throws {Error} not supported environment */ /** * This method fetches the document object * * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). * * ``` * import {JSDOM} from "jsdom" * if (typeof window !== "object") { * const {window} = new JSDOM('', { * url: 'http://example.com/', * pretendToBeVisual: true * }); * * [ * 'self', * 'document', * 'Document', * 'Node', * 'Element', * 'HTMLElement', * 'DocumentFragment', * 'DOMParser', * 'XMLSerializer', * 'NodeFilter', * 'InputEvent', * 'CustomEvent' * ].forEach(key => (getGlobal()[key] = window[key])); * } * ``` * * @return {DocumentFragment} * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @throws {Error} not supported environment * @throws {TypeError} value is not a string */ /** * Recursively searches upwards from a given element to find an ancestor element * with a specified ID, considering both normal DOM and shadow DOM. * * @param {HTMLElement|ShadowRoot} element - The starting element or shadow root to search from. * @param {string} targetId - The ID of the target element to find. * @return {HTMLElement|null} - The ancestor element with the specified ID, or null if not found. * @since 3.29.0 * @license AGPLv3 * @copyright schukai GmbH */ /** * With this function, objects can be cloned. * The entire object tree is run through. * * Proxy, Element, HTMLDocument and DocumentFragment instances are not cloned. * Global objects such as windows are also not cloned, * * If an object has a method `getClone()`, this method is used to create the clone. * * @param {*} obj object to be cloned * @return {*} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @throws {Error} unable to clone obj! its type isn't supported. */ /** * The Locale class is a base class for the language classes. * * RFC * * ``` * A Language-Tag consists of: * langtag ; generated tag * -or- private-use ; a private use tag * * langtag = (language * ["-" script] * ["-" region] * *("-" variant) * *("-" extension) * ["-" privateuse]) * * language = "en", "ale", or a registered value * * script = "Latn", "Cyrl", "Hant" ISO 15924 codes * * region = "US", "CS", "FR" ISO 3166 codes * "419", "019", or UN M.49 codes * * variant = "rozaj", "nedis", "1996", multiple subtags can be used in a tag * * extension = single letter followed by additional subtags; more than one extension * may be used in a language tag * * private-use = "x-" followed by additional subtags, as many as are required * Note that these can start a tag or appear at the end (but not * in the middle) * ``` * * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @see https://datatracker.ietf.org/doc/html/rfc3066 */ /** * Parse local according to rfc4646 standard * * Limitations: The regex cannot handle multiple variants or private. * * You can call the method via this function individually: * * ```javascript * import {createLocale} from '@schukai/monster/source/i18n/locale.mjs'; * createLocale() * ``` * * RFC * * ``` * The syntax of the language tag in ABNF [RFC4234] is: * * Language-Tag = langtag * / privateuse ; private use tag * / grandfathered ; grandfathered registrations * * langtag = (language * ["-" script] * ["-" region] * *("-" variant) * *("-" extension) * ["-" privateuse]) * * language = (2*3ALPHA [ extlang ]) ; shortest ISO 639 code * / 4ALPHA ; reserved for future use * / 5*8ALPHA ; registered language subtag * * extlang = *3("-" 3ALPHA) ; reserved for future use * * script = 4ALPHA ; ISO 15924 code * * region = 2ALPHA ; ISO 3166 code * / 3DIGIT ; UN M.49 code * * variant = 5*8alphanum ; registered variants * / (DIGIT 3alphanum) * * extension = singleton 1*("-" (2*8alphanum)) * * singleton = %x41-57 / %x59-5A / %x61-77 / %x79-7A / DIGIT * ; "a"-"w" / "y"-"z" / "A"-"W" / "Y"-"Z" / "0"-"9" * ; Single letters: x/X is reserved for private use * * privateuse = ("x"/"X") 1*("-" (1*8alphanum)) * * grandfathered = 1*3ALPHA 1*2("-" (2*8alphanum)) * ; grandfathered registration * ; Note: i is the only singleton * ; that starts a grandfathered tag * * alphanum = (ALPHA / DIGIT) ; letters and numbers * * Figure 1: Language Tag ABNF * ``` * * @param {string} locale * @return {Locale} * @license AGPLv3 * @since 1.14.0 * @copyright schukai GmbH * @throws {TypeError} value is not a string * @throws {Error} unsupported locale */ /** * With this function you can read the language version set by the document. * For this the attribute `lang` in the html tag is read. If no attribute is set, `en` is used as default. * Alternatively, the language version of the browser is used. * * ```html * <html lang="en"> * ``` * * You can call the function via `getLocaleOfDocument()`. * * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @throws {TypeError} value is not a string * @throws {Error} unsupported locale * @summary Tries to determine the locale used */ /** * With the id class, sequences of ids can be created. for this purpose, an internal counter is incremented for each prefix. * thus, the first id with the prefix `myid` will be `myid1` and the second id `myid2`. * The ids are the same for every call, for example on a web page. * * So the ids can also be used for navigation. you have to take care that the order stays the same. * * As of version 1.6.0 there is the new RandomID. this ID class is continuous from now on. * * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @summary Automatic generation of ids */ /** * This is the base class with options from which some monster classes are derived. * * This class is actually only used as a base class. * * Classes that require the possibility of options can be derived directly from this class. * Derived classes almost always override the `default` getter with their own values. * * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @deprecated since 3.15.0 */ /** * @type {symbol} * @license AGPLv3 * @since 3.9.0 * @private */ /** * A provider makes a translation object available. * * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @see {@link https://datatracker.ietf.org/doc/html/rfc3066} */ /** * With this class you can manage translations and access the keys. * * @externalExample ../../example/i18n/translations.mjs * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @see https://datatracker.ietf.org/doc/html/rfc3066 */ /** * The pipe class makes it possible to combine several processing steps. * * A pipe consists of commands whose input and output are connected with the pipe symbol `|`. * * With the Pipe, processing steps can be combined. Here, the value of an object is accessed via the pathfinder (path command). * the word is then converted to uppercase letters and a prefix Hello is added. the two backslash safe the space char. * * @example /examples/libraries/pipe/example-1/ * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH * @summary The pipe class makes it possible to combine several processing steps. */ /** * Messages can be formatted with the formatter. To do this, an object with the values must be passed to the formatter. The message can then contain placeholders. * * Look at the example below. The placeholders use the logic of Pipe. * * ## Marker in marker * * Markers can be nested. Here, the inner marker is resolved first `${subkey} ↦ 1 = ${mykey2}` and then the outer marker `${mykey2}`. * * ``` * const text = '${mykey${subkey}}'; * let obj = { * mykey2: "1", * subkey: "2" * }; * * new Formatter(obj).format(text); * // ↦ 1 * ``` * * ## Callbacks * * The values in a formatter can be adjusted via the commands of the `Transformer` or the`Pipe`. * There is also the possibility to use callbacks. * * const formatter = new Formatter({x: '1'}, { * callbacks: { * quote: (value) => { * return '"' + value + '"' * } * } * }); * * formatter.format('${x | call:quote}')) * // ↦ "1" * * ## Marker with parameter * * A string can also bring its own values. These must then be separated from the key by a separator `::`. * The values themselves must be specified in key/value pairs. The key must be separated from the value by a separator `=`. * * When using a pipe, you must pay attention to the separators. * * @example * * import {Formatter} from '@schukai/monster/source/text/formatter.mjs'; * * new Formatter({ * a: { * b: { * c: "Hello" * }, * d: "world", * } * }).format("${a.b.c} ${a.d | ucfirst}!"); // with pipe * * // ↦ Hello World! * * @license AGPLv3 * @since 1.12.0 * @copyright schukai GmbH */ /** * @private * @license AGPLv3 * @since 1.12.0 * * @param {string} text * @param {string} openMarker * @param {string} closeMarker * @return {string} */ /** * You can create an object via the monster namespace `new Monster.Types.MediaType()`. * * @license AGPLv3 * @since 1.8.0 * @copyright schukai GmbH */ /** * @private * @license AGPLv3 * @since 1.18.0 * @param {String} parameter * @return {Monster.Types.Parameter[]|undefined} */ /** * You can create an object via the monster namespace `new DataUrl()`. * * @license AGPLv3 * @since 1.8.0 * @copyright schukai GmbH * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs * @see https://datatracker.ietf.org/doc/html/rfc2397 */ /** * A queue is a list of items that are processed one after another (first in, first out). * * With a queue you can add items to the end of the list `Queue.add()` and remove items from the beginning of the list `Queue.pop()`. * * With `Queue.peek()` you can get the first item without removing it from the list. * * You can create the instance via `new Queue()`. * * @license AGPLv3 * @since 1.4.0 * @summary A Queue (Fifo) */ /** * An UniqueQueue is a queue that contains items only once. * * @license AGPLv3 * @since 1.4.0 * @copyright schukai GmbH * @summary A queue for unique values */ /** * An observer manages a callback function * * The update method is called with the subject object as this pointer. For this reason * the callback should not be an arrow function, because it gets this pointer of its own context. * * Include this class in your project with the following code: * * ```js * import { Observer } from "@schukai/monster/source/types/observer.mjs"; * ``` * * The callback function is passed as the first argument to the constructor. * * ```js * new Observer(()=>{ * // this is not subject * }) * * new Observer(function() { * // this is subject * }) * ``` * * Additional arguments can be passed to the callback. To do this, simply specify them. * * ```js * Observer(function(a, b, c) { * console.log(a, b, c); // ↦ "a", 2, true * }, "a", 2, true) * ``` * * The callback function must have as many parameters as arguments are given. * * @license AGPLv3 * @since 1.0.0 */ /** * With the help of the ObserverList class, observer can be managed. * * @license AGPLv3 * @since 1.0.0 */ /** * An observer manages a callback function * * With the ProxyObserver you can attach observer for observation. * With each change at the object to be observed, an update takes place. * * This also applies to nested objects. * * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * The Theme class provides the functionality for the theme. * * @externalExample ../../example/dom/theme.mjs * @license AGPLv3 * @since 1.7.0 * @copyright schukai GmbH * @summary A theme class */ /** * The theming used in the document can be defined via the html-tag. * The theming is specified via the attribute `data-monster-theme-name`. * * As name for a theme all characters are valid, which are also allowed for a HTMLElement-ID. * * ``` * <html data-monster-theme-name="my-theme"> * ``` * * the default theme name is `monster`. * * @return {Theme} * @license AGPLv3 * @since 1.7.0 */ /** * The template class provides methods for creating templates. * * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @summary A template class */ /** * This method loads a template with the given ID and returns it. * * To do this, it first reads the theme of the document and looks for the `data-monster-theme-name` attribute in the HTML tag. * * ``` * <html data-monster-theme-name="my-theme"> * ``` * * If no theme was specified, the default theme is `monster`. * * Now it is looked if there is a template with the given ID and theme `id-theme` and if yes it is returned. * If there is no template a search for a template with the given ID `id` is done. If this is also not found, an error is thrown. * * You can call the method via the monster namespace `Monster.DOM.findDocumentTemplate()`. * * ``` * <script type="module"> * import {findTemplate} from '@schukai/monster/source/dom/template.mjs'; * findDocumentTemplate() * <\/script> * ``` * * @example * * import { findDocumentTemplate } from "https://cdn.jsdelivr.net/npm/@schukai/monster@latest/source/dom/template.mjs"; * * const template = document.createElement("template"); * template.id = "myTemplate"; * template.innerHTML = "<p>my default template</p>"; * document.body.appendChild(template); * * const themedTemplate = document.createElement("template"); * themedTemplate.id = "myTemplate-myTheme"; * themedTemplate.innerHTML = "<p>my themed template</p>"; * document.body.appendChild(themedTemplate); * * // loads the temple and since no theme is set the default template * const template1 = findDocumentTemplate("myTemplate"); * console.log(template1.createDocumentFragment()); * // ↦ '<p>my default template</p>' * * // now we set our own theme * document * .querySelector("html") * .setAttribute("data-monster-theme-name", "myTheme"); * * // now we don't get the default template, * // but the template with the theme in the id * const template2 = findDocumentTemplate("myTemplate"); * console.log(template2.createDocumentFragment()); * // ↦ '<p>my themed template</p>' * * @param {string} id * @param {Node} currentNode * @return {Monster.DOM.Template} * @license AGPLv3 * @since 1.7.0 * @copyright schukai GmbH * @throws {Error} template id not found. * @throws {TypeError} value is not a string */ /** * With the diff function you can perform the change of one object to another. The result shows the changes of the second object to the first object. * * The operator `add` means that something has been added to the second object. `delete` means that something has been deleted from the second object compared to the first object. * * @externalExample ../../example/data/diff.mjs * @param {*} first * @param {*} second * @return {array} * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH */ /** * This special trim function allows to trim spaces that have been protected by a special escape character. * * ``` * <script type="module"> * import {trimSpaces} from '@schukai/monster/source/util/trimspaces.mjs'; * trimSpaces(' hello \\ ') * <\/script> * ``` * * Hint: One stroke is escaped by the javascript interpreter, the second stroke escapes the stroke. * * ```text * a\ b ↦ a b * a\\ b ↦ a\ b * ``` * * @license AGPLv3 * @since 1.24.0 * @copyright schukai GmbH * @param {string} value * @return {string} * @throws {TypeError} value is not a string */ /** * The function sends an event * * @param {Element | Node | HTMLCollection | NodeList} element * @param {string} type * @return {void} * @license AGPLv3 * @since 1.10.0 * @copyright schukai GmbH * @throws {TypeError} value is not an instance of HTMLElement or HTMLCollection * @summary Construct and send and event */ /** * You can call the function via the monster namespace `new Monster.DOM.fireCustomEvent()`. * * @param {Element | Node | HTMLCollection | NodeList} element * @param {string} type * @param {object} detail * @return {void} * @license AGPLv3 * @since 1.29.0 * @copyright schukai GmbH * @throws {TypeError} value is not an instance of HTMLElement or HTMLCollection * @summary Construct and send and event */ /** * This function gets the path `Event.composedPath()` from an event and tries to find the next element * up the tree `element.closest()` with the attribute and value. If no value, or a value that is undefined or null, * is specified, only the attribute is searched. * * @license AGPLv3 * @since 1.14.0 * @param {Event} event * @param {string} attributeName * @param {string|null|undefined} attributeValue * @throws {Error} unsupported event * @throws {TypeError} value is not a string * @throws {TypeError} value is not an instance of HTMLElement * @summary Help function to find the appropriate control */ /** * The updater class connects an object with the DOM. In this way, structures and contents in the DOM can be * programmatically adapted via attributes. * * For example, to include a string from an object, the attribute `data-monster-replace` can be used. * a further explanation can be found under [monsterjs.org](https://monsterjs.org/) * * Changes to attributes are made only when the direct values are changed. If you want to assign changes * to other values as well, you have to insert the attribute `data-monster-select-this`. This should be * done with care, as it can reduce performance. * * @example /examples/libraries/dom/updater/simple/ Simple example * * @license AGPLv3 * @since 1.8.0 * @copyright schukai GmbH * @throws {Error} the value is not iterable * @throws {Error} pipes are not allowed when cloning a node. * @throws {Error} no template was found with the specified key. * @throws {Error} the maximum depth for the recursion is reached. * @throws {TypeError} value is not a object * @throws {TypeError} value is not an instance of HTMLElement * @summary The updater class connects an object with the dom */ /** * @private * @license AGPLv3 * @since 1.9.0 * @return {function * @this Updater */ /** * @license AGPLv3 * @since 1.27.0 * @return void * @private */ /** * @private * @license AGPLv3 * @since 1.8.0 * @param {object} change * @return {void} */ /** * @private * @license AGPLv3 * @since 1.8.0 * @param {object} change * @return {void} * @throws {Error} the value is not iterable * @throws {Error} pipes are not allowed when cloning a node. * @throws {Error} no template was found with the specified key. * @throws {Error} the maximum depth for the recursion is reached. * @this Updater */ /** * * @private * @license AGPLv3 * @since 1.8.0 * @param {HTMLElement} container * @param {string} key * @param {string} ref * @param {string} path * @throws {Error} no template was found with the specified key. */ /** * @private * @license AGPLv3 * @since 1.10.0 * @param {HTMLElement} node * @param {string} key * @param {string} path * @return {void} */ /** * @private * @license AGPLv3 * @since 1.8.0 * @param {object} change * @return {void} * @this Updater */ /** * @private * @license AGPLv3 * @since 1.8.0 * @param {HTMLElement} container * @param {array} parts * @param {object} subject * @return {void} */ /** * @param {NodeList|HTMLElement|Set<HTMLElement>} elements * @param {Symbol} symbol * @param {object} object * @param {object} config * * Config: enableEventProcessing {boolean} - default: false - enables the event processing * * @return {Promise[]} * @license AGPLv3 * @since 1.23.0 * @throws {TypeError} elements is not an instance of NodeList, HTMLElement or Set * @throws {TypeError} the context of the function is not an instance of HTMLElement * @throws {TypeError} symbol must be an instance of Symbol */ /** * @private * @param {String|undefined} query * @param {String|undefined|null} name name of the slot (if the parameter is undefined, all slots are searched, if the parameter has the value null, all slots without a name are searched. if a string is specified, the slots with this name are searched.) * @return {*} * @this CustomElement * @license AGPLv3 * @since 3.33.0 * @throws {Error} query must be a string */ /** * @private * @param {String|undefined} query * @param {String|undefined|null} name name of the slot (if the parameter is undefined, all slots are searched, if the parameter has the value null, all slots without a name are searched. if a string is specified, the slots with this name are searched.) * @return {*} * @this CustomElement * @license AGPLv3 * @since 1.23.0 * @throws {Error} query must be a string */ /** * This method can be used to add an error message to an element. * * @license AGPLv3 * @since 3.99.0 * @copyright schukai GmbH * @param {HTMLElement} element * @param {string} message * @return {HTMLElement} */ /** * This method can be used to remove an error message from an element. * @license AGPLv3 * @since 3.99.0 * @param element * @param message * @param {HTMLElement} element * @param {string} message * @return {HTMLElement} */ /** * The `CustomElement` class provides a way to define a new HTML element using the power of Custom Elements. * * **IMPORTANT:** After defining a `CustomElement`, the `registerCustomElement` method must be called with the new class name * to make the tag defined via the `getTag` method known to the DOM. * * You can create an instance of the object via the `document.createElement()` function. * * ## Styling * * To display custom elements optimally, the `:defined` pseudo-class can be used. To prevent custom elements from being displayed and flickering until the control is registered, * it is recommended to create a CSS directive. * * In the simplest case, you can simply hide the control: * * ```html * <style> * my-custom-element:not(:defined) { * display: none; * } * * my-custom-element:defined { * display: flex; * } * </style> * ``` * * Alternatively, you can display a loader: * * ```css * my-custom-element:not(:defined) { * display: flex; * box-shadow: 0 4px 10px 0 rgba(33, 33, 33, 0.15); * border-radius: 4px; * height: 200px; * position: relative; * overflow: hidden; * } * * my-custom-element:not(:defined)::before { * content: ''; * display: block; * position: absolute; * left: -150px; * top: 0; * height: 100%; * width: 150px; * background: linear-gradient(to right, transparent 0%, #E8E8E8 50%, transparent 100%); * animation: load 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite; * } * * @keyframes load { * from { * left: -150px; * } * to { * left: 100%; * } * } * * my-custom-element:defined { * display: flex; * } * ``` * * More information about Custom Elements can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements). * And in the [HTML Standard](https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements) or in the [WHATWG Wiki](https://wiki.whatwg.org/wiki/Custom_Elements). * * @license AGPLv3 * @since 1.7.0 * @copyright schukai GmbH * @summary A base class for HTML5 custom controls. */ /** * @license AGPLv3 * @since 1.15.0 * @private * @this CustomElement */ /** * @private * @return {CustomElement} * @this CustomElement * @license AGPLv3 * @since 1.16.0 * @throws {TypeError} value is not an instance of */ /** * @private * @return {CustomElement} * @throws {Error} html is not set. * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow * @license AGPLv3 * @since 1.8.0 */ /** * This method registers a new element. The string returned by `CustomElement.getTag()` is used as the tag. * * @param {CustomElement} element * @return {void} * @license AGPLv3 * @since 1.7.0 * @copyright schukai GmbH * @throws {DOMException} Failed to execute 'define' on 'CustomElementRegistry': is not a valid custom element name */ /** * this function uses crypt and returns a random number. * * @param {number} min starting value of the definition set (default is 0) * @param {number} max end value of the definition set (default is 1000000000) * @return {number} * @throws {Error} missing crypt * @throws {Error} we cannot generate numbers larger than 53 bits. * @throws {Error} the distance is too small to create a random number. * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH */ /** * The dead man's switch allows setting a timer which can be reset again * and again within a defined period of time. * * @example /example/util/deadmansswitch/simple/ Simple example * @copyright schukai GmbH * @license AGPLv3 * @since 1.29.0 * @summary Class to be able to execute function chains */ /** * This class allows executing several functions in order. * * Functions and timeouts can be passed. If a timeout is passed, it applies to all further functions. * In the example * * `timeout1, function1, function2, function3, timeout2, function4` * * the timeout1 is valid for the functions 1, 2 and 3 and the timeout2 for the function4. * * So the execution time is timeout1+timeout1+timeout1+timeout2 * * The result of `run()` is a promise. * * @example /examples/libraries/util/processing/simple/ A simple example * * @copyright schukai GmbH * @license AGPLv3 * @since 1.21.0 * @summary Class to be able to execute function chains */ /** * This is a base class for creating custom controls using the power of CustomElement. * * After defining a `CustomElement`, the `registerCustomElement` method must be called with the new class name. Only then * will the tag defined via the `getTag` method be made known to the DOM. * * This control uses `attachInternals()` to integrate the control into a form. If the target environment does not support * this method, the [polyfill](https://www.npmjs.com/package/element-internals-polyfill) can be used. * * You can create the object using the function `document.createElement()`. * * This control uses `attachInternals()` to integrate the control into a form. If the target environment does not support * this method, the Polyfill for attachInternals() can be used: {@link https://www.npmjs.com/package/element-internals-polyfill|element-internals-polyfill}. * * Learn more about WICG Web Components: {@link https://github.com/WICG/webcomponents|WICG Web Components}. * * Read the HTML specification for Custom Elements: {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements|Custom Elements}. * * Read the HTML specification for Custom Element Reactions: {@link https://html.spec.whatwg.org/dev/custom-elements.html#custom-element-reactions|Custom Element Reactions}. * * @summary A base class for custom controls based on CustomElement. * @license AGPLv3 * @since 1.14.0 */ /** * Alternatively to a string selector a callback can be specified. this must return a map. * * @example * import {buildMap} from '@schukai/monster/source/data/buildmap.mjs'; * * let obj = { * "data": [ * { * "id": 10, * "name": "Cassandra", * "enrichment": { * variants: [ * { * sku: 1, label: "XXS", price: [ * {vk: '12.12 €'}, * {vk: '12.12 €'} * ] * }, * { * sku: 2, label: "XS", price: [ * {vk: '22.12 €'}, * {vk: '22.12 €'} * ] * }, * { * sku: 3, label: "S", price: [ * {vk: '32.12 €'}, * {vk: '32.12 €'} * ] * }, * { * sku: 4, label: "L", price: [ * {vk: '42.12 €'}, * {vk: '42.12 €'} * ] * } * ] * * } * }, * { * "id": 20, * "name": "Yessey!", * "enrichment": { * variants: [ * { * sku: 1, label: "XXS", price: [ * {vk: '12.12 €'}, * {vk: '12.12 €'} * ] * }, * { * sku: 2, label: "XS", price: [ * {vk: '22.12 €'}, * {vk: '22.12 €'} * ] * }, * { * sku: 3, label: "S", price: [ * {vk: '32.12 €'}, * {vk: '32.12 €'} * ] * }, * { * sku: 4, label: "L", price: [ * {vk: '42.12 €'}, * {vk: '42.12 €'} * ] * } * ] * * } * } * ] * }; * * let callback = function (subject) { * let m = new Map; * * for (const [i, b] of Object.entries(subject.data)) { * * let key1 = i; * * for (const [j, c] of Object.entries(b.enrichment.variants)) { * let key2 = j; * * for (const [k, d] of Object.entries(c.price)) { * * let key3 = k; * * d.name = b.name; * d.label = c.label; * d.id = [key1, key2, key3].join('.'); * * m.set(d.id, d); * } * * } * } * return m; * } * * let map = buildMap(obj, callback, '${name} ${vk}', '${id}') * * // ↦ Map(3) { * // "0.0.0":"Cassandra 12.12 €", * // "0.0.1":"Cassandra 12.12 €", * // "0.1.0":"Cassandra 22.12 €", * // "0.1.1":"Cassandra 22.12 €", * // "0.2.0":"Cassandra 32.12 €", * // "0.2.1":"Cassandra 32.12 €", * // "0.3.0":"Cassandra 42.12 €", * // "0.3.1":"Cassandra 42.12 €", * // "1.0.0":"Yessey! 12.12 €", * // "1.0.1":"Yessey! 12.12 €", * // "1.1.0":"Yessey! 22.12 €", * // "1.1.1":"Yessey! 22.12 €", * // "1.2.0":"Yessey! 32.12 €", * // "1.2.1":"Yessey! 32.12 €", * // "1.3.0":"Yessey! 42.12 €", * // "1.3.1":"Yessey! 42.12 €" * // } * * @callback Monster.Data~exampleSelectorCallback * @param {*} subject subject * @return Map * @license AGPLv3 * @since 1.17.0 * @see {@link Monster.Data.buildMap} */ /** * You can create the instance via the monster namespace `new Monster.Types.NodeList()`. * * @license AGPLv3 * @since 1.26.0 * @copyright schukai GmbH * @summary A NodeList class */ /** * You can create the instance via the monster namespace `new Monster.Types.Node()`. * * @license AGPLv3 * @since 1.26.0 * @copyright schukai GmbH * @summary A Node Class * @see https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Iteration_protocols */ /** * Creates a tree structure from a given subject using a selector and specified ID and parent ID keys. * * The buildTree function is a powerful tool for creating tree-like data structures from plain JavaScript * objects. It takes in four required parameters: the subject object that you want to turn into a tree, a * selector that identifies which parts of the subject to use when building the tree, and two keys * (idKey and parentIDKey) that specify which properties in the subject represent the unique identifiers * and parent-child relationships between nodes in the tree. * * Optionally, you can also pass in an options object to further configure the behavior of the function, * such as specifying which values should be treated as roots of the tree, or providing a custom filter * function to only include certain nodes in the final output. * * The buildTree function works by first using the assembleParts helper function to extract the relevant * parts of the subject based on the selector, and then iterates over the resulting map to create Node * objects and organize them into parent-child relationships based on the values of the idKey and parentIDKey properties. * * The resulting NodeList represents the tree structure, with each Node object containing the original * object data as well as additional metadata about its position in the tree. You can then use the childNodes * property of each Node to access its children, or the parent property to access its parent. * * Overall, the buildTree function is a flexible and powerful way to transform flat data into hierarchical * structures, and can be especially useful in scenarios such as displaying folder structures or * visualizing complex data relationships. * * Let's say you have an array of data objects representing a file system directory structure, and you want * to turn it into a tree-like structure where each node represents a folder or file, and child nodes * represent the contents of the folder: * * ```javascript * const fileSystem = [ * { id: 'folder1', name: 'Folder 1', type: 'folder', parent: null }, * { id: 'file1', name: 'File 1', type: 'file', parent: 'folder1' }, * { id: 'file2', name: 'File 2', type: 'file', parent: 'folder1' }, * { id: 'subfolder1', name: 'Subfolder 1', type: 'folder', parent: 'folder1' }, * { id: 'file3', name: 'File 3', type: 'file', parent: 'subfolder1' }, * { id: 'file4', name: 'File 4', type: 'file', parent: 'subfolder1' }, * { id: 'subfolder2', name: 'Subfolder 2', type: 'folder', parent: 'folder1' }, * { id: 'file5', name: 'File 5', type: 'file', parent: 'subfolder2' }, * { id: 'file6', name: 'File 6', type: 'file', parent: 'subfolder2' }, * { id: 'folder2', name: 'Folder 2', type: 'folder', parent: null }, * { id: 'file7', name: 'File 7', type: 'file', parent: 'folder2' }, * { id: 'file8', name: 'File 8', type: 'file', parent: 'folder2' }, * { id: 'subfolder3', name: 'Subfolder 3', type: 'folder', parent: 'folder2' }, * { id: 'file9', name: 'File 9', type: 'file', parent: 'subfolder3' }, * { id: 'file10', name: 'File 10', type: 'file', parent: 'subfolder3' }, * ]; * * const tree = buildTree(fileSystem, 'id', 'id', 'parent', { rootReferences: [null] }); * * console.log(tree.toString()); * ``` * * The buildTree function takes in the array of data objects, as well as some configuration options specifying * the keys to use for identifying nodes and their parent-child relationships. In this example, we use the id * key to identify nodes, and the parent key to specify the parent of each node. * * The resulting tree object is a nested tree structure, where each node is an object representing a file or * folder, and has child nodes representing its contents. The toString method of the tree object * can be used to print out the tree in a readable format: * * ```markdown * - Folder 1 * - File 1 * - File 2 * - Subfolder 1 * - File 3 * - File 4 * - Subfolder 2 * - File 5 * - File 6 * - Folder 2 * - File 7 * - File 8 * - Subfolder 3 * - File 9 * - File 10 * ``` * * @memberof Monster.Data * * @param {*} subject - The object or array to build the tree from. * @param {string|Monster.Data~exampleSelectorCallback} selector - Either a string to specify a property of each object to use as a selector, or a selector function to generate a map of objects. * @param {string} idKey - The property key to use as the unique ID of each node. * @param {string} parentIDKey - The property key to use as the parent ID of each node. * @param {object} [options] - Additional options to modify the function behavior. * @param {Array} [options.rootReferences=[null, undefined]] - An array of values to treat as root references when creating the tree. * @param {function} [options.filter] - A filter function to apply to each node. * * @return {*} The resulting tree structure as a NodeList. * * @throws {TypeError} selector is neither a string nor a function. * @throws {TypeError} the selector callback must return a map. * @throws {Error} the object has no value for the specified id. * * @license AGPLv3 * * @since 1.26.0 */ /** * The Embed provider retrieves a JSON file from the given Script Tag. * * @externalExample ../../../example/i18n/providers/embed.mjs * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @see {@link https://datatracker.ietf.org/doc/html/rfc3066} */ /** * This variable is a promise fulfilled as soon as the dom is available. * * The DOMContentLoaded event is fired when the original HTML document is fully loaded and parsed * without waiting for stylesheets, images, and subframes to finish loading. * * document.readyState changes to interactive * window's DOMContentLoaded event gets fired * document.readyState changes to complete * window's load event gets fired load * * @license AGPLv3 * @since 1.31.0 * @summary variable to check if dom is ready * @type {Promise} * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState */ /** * This variable is a promise is fulfilled as soon as the windows is available. * * The load event fires when the entire page is loaded, including all dependent resources such as stylesheets, * assets, and images. Unlike DOMContentLoaded, which fires as soon as the DOM of the page is loaded, * without waiting for the resources to finish loading. * * @license AGPLv3 * @since 1.31.0 * @summary variable to check if window is ready * @type {Promise} * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState */ /** * With the focus manager the focus can be stored in a document, recalled and moved. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @throws {Error} unsupported locale * @summary Handle the focus */ /** * This function extends the given object with the following methods: * * - attachInternalObserver * - detachInternalObserver * - containsInternalObserver * - setInternal * - setInternals * - getInternal * * @license AGPLv3 * @since 3.15.0 * @copyright schukai GmbH */ /** * This class is the base class for all resources to be loaded. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A Resource class */ /** * This class is used by the resource manager to embed data. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A Data Resource class */ /** * This class is used by the resource manager to embed external resources. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A Resource class * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link */ /** * This class is used by the resource manager to embed scripts. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A Resource class */ /** * The ResourceManager is a singleton that manages all resources. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A Resource class */ /** * The `RandomID` class provides a unique ID for an item. * * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @summary class to generate random numbers */ /** * The UUID class makes it possible to get a unique UUID for an object. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @throws {Error} unsupported */ /** * The datasource class is the basis for dealing with different data sources. * It provides a unified interface for accessing data * @externalExample ../../example/data/datasource.mjs * @license AGPLv3 * @since 1.22.0 * @copyright schukai GmbH * @summary The datasource class encapsulates the access to data objects. */ /** * The class represents a record. * * @license AGPLv3 * @since 1.22.0 * @copyright schukai GmbH * @summary The Storage class encapsulates the access to data objects over WebStorageAPI. */ /** * The comparator allows a comparison function to be abstracted. * * The following are some examples of the application of the class. * * ``` * new Comparator().lessThanOrEqual(2, 5) // ↦ true * new Comparator().greaterThan(4, 2) // ↦ true * new Comparator().equal(4, 4) // ↦ true * new Comparator().equal(4, 5) // ↦ false * ``` * * You can also pass your own comparison function, and thus define the comparison function. * * ``` * new Comparator(function (a, b) { * if (a.v === b.v) return 0; * return a.v < b.v ? -1 : 1; * }).equal({v: 2}, {v: 2}); // ↦ true * ``` * * @example /example/comparator/simple/ Simple example * @license AGPLv3 * @since 1.3.0 */ /** * Deep freeze a object * * @param {object} object object to be freeze * @license AGPLv3 * @since 1.0.0 * @return {object} * @copyright schukai GmbH * @throws {TypeError} value is not a object */ /** * A log entry for the logger * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH */ /** * The logger is a class that takes care of logging. * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH */ /** * The log handler is the interface between the log entries and the log listeners. * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH */ /** * You can create an object of the class simply by using the namespace `new Monster.Logging.Handler.ConsoleHandler()`. * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH */ /** * This class represents a WebSocket message. * * @license AGPLv3 * @since 3.4.0 * @copyright schukai GmbH * @summary The Message class encapsulates a WebSocket message. */ /** * The RestAPI is a class that enables a REST API server. * * @externalExample ../../example/net/webconnect.mjs * @license AGPLv3 * @since 3.1.0 * @copyright schukai GmbH * @summary The LocalStorage class encapsulates the access to data objects. */ /** * The version object contains a semantic version number * * @externalExample ../../example/types/version-1.mjs * @license AGPLv3 * @since 1.0.0 * @author schukai GmbH * @copyright schukai GmbH * @summary The version object contains a semantic version number */ /** * Version of monster * * @return {Version} * @license AGPLv3 * @since 1.0.0 * @copyright schukai GmbH * @author schukai GmbH */ /** * Converts a CSS value to pixels. * * As Example: * * ```js * convertToPixels('1em') // returns the current font size in pixels * convertToPixels('1rem') // returns the current root font size in pixels * convertToPixels('1px') // returns 1 * convertToPixels('100%') // returns the current width of the parent element in pixels * ``` * * Following units are supported: * - px * - em * - rem * - % * * @param {string} value * @param {HTMLElement} [parentElement=document.documentElement] * @param {HTMLElement} [fontSizeElement=document.documentElement] * @return {number} * @license AGPLv3 * @since 3.34.0 * @copyright schukai GmbH * @throws {Error} Unsupported unit * @throws {Error} Invalid value format */ /** * A factory for creating worker instances. * * @license AGPLv3 * @since 1.25.0 * @copyright schukai GmbH * @summary A small factory to create worker */ /** * Assembler class * * @license AGPLv3 * @since 1.6.0 * @copyright schukai GmbH * @summary Allows you to build an html fragment */ /** * The DomStorage is a class that stores data in memory. * * @license AGPLv3 * @copyright schukai GmbH */ /** * The LocalStorage Datasource provides a data store in the browser localStorage. * * @license AGPLv3 * @since 1.22.0 * @copyright schukai GmbH * @summary The LocalStorage class encapsulates the access to data objects. */ /** * The SessionStorage class provides a data source that uses the SessionStorage API on the client. * * @license AGPLv3 * @since 1.22.0 * @copyright schukai GmbH * @summary The LocalStorage class encapsulates the access to data objects. */ /** * Base class for all server data sources * * @license AGPLv3 * @since 3.4.0 * @copyright schukai GmbH * @summary The Server class encapsulates the access to a server datasource */ /** * The RestAPI is a class that enables a REST API server. * * @externalExample ../../../../example/data/datasource/server/webconnect.mjs * @license AGPLv3 * @since 3.1.0 * @copyright schukai GmbH * @summary The LocalStorage class encapsulates the access to data objects. */ /** * Error message for API requests with extension of request and validation. * * @license AGPLv3 * @since 1.24.0 * @copyright schukai GmbH * @summary the error is thrown by the rest api in case of error */ /** * Error message for API requests * * @license AGPLv3 * @since 3.43.0 * @copyright schukai GmbH * @summary the error is thrown by the rest api in case of error */ /** * @type {symbol} * @license AGPLv3 * @since 3.12.0 */ /** * The RestAPI is a class that enables a REST API server. * * @externalExample ../../../../example/data/datasource/server/restapi.mjs * @license AGPLv3 * @since 1.22.0 * @copyright schukai GmbH * @summary The RestAPI is a class that binds a REST API server. */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * The abstract constraint defines the api for all constraints. mainly the method isValid() is defined. * * Derived classes must implement the method isValid(). * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary The abstract constraint */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * The invalid constraint allows an always invalid query to be performed. this constraint is mainly intended for testing. * * @example /examples/libraries/constraints/invalid/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A constraint that always invalid */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * Operators allow you to link constraints together. for example, you can check whether a value is * an object or an array. each operator has two operands that are linked together. * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary The abstract operator constraint */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * The valid constraint allows an always valid query to be performed. this constraint is mainly intended for testing. * * @example /examples/libraries/constraints/valid/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A constraint that always valid */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * The OrOperator is used to link several constraints. The constraint is fulfilled if one of the constraints is fulfilled. * * @example /examples/libraries/constraints/oroperator/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A or operator */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * @example /examples/libraries/constraints/isobject/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A constraint to check if a value is an object */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * The AndOperator is used to link several constraints. The constraint is fulfilled if all constraints of the operators are fulfilled. * * @example /examples/libraries/constraints/andoperator/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A and operator constraint */ /** * Constraints are used to define conditions that must be met by the value of a variable. * * The uniform API of the constraints allows chains to be formed. * * @example /examples/libraries/constraints/isarray/ A simple example * * @license AGPLv3 * @since 1.3.0 * @copyright schukai GmbH * @summary A constraint to check if a value is an array */ /** * You can call the function via the monster namespace `Monster.Types.toBinary()`. * * @param {String} binary * @return {String} * @throws {TypeError} value is not a string * @license AGPLv3 * @since 1.18.0 */ /** * You can call the function via the monster namespace `Monster.Types.fromBinary()`. * * @param {String} binary * @return {String} * @throws {TypeError} value is not a string * @license AGPLv3 * @since 1.18.0 */ /** * This function prefixes all special characters that may appear in a regex with a slash. * * @param {string} value * @return {string} * @license AGPLv3 * @since 1.26.0 * @copyright schukai GmbH * @throws {TypeError} value is not a string */ /** * The Formatter extends the Text.Formatter with the possibility to replace the key by a translation. * * @license AGPLv3 * @since 1.26.0 * @copyright schukai GmbH */ /** * The fetch provider retrieves a JSON file from the given URL and returns a translation object. * * @externalExample ../../../example/i18n/providers/fetch.mjs * @license AGPLv3 * @since 1.13.0 * @copyright schukai GmbH * @see {@link https://datatracker.ietf.org/doc/html/rfc3066} * @tutorial i18n-locale-and-formatter */ /*! Bundled license information: pvtsutils/build/index.js: (*! * MIT License * * Copyright (c) 2017-2024 Peculiar Ventures, LLC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * *) pvutils/build/utils.es.js: (*! Copyright (c) Peculiar Ventures, LLC *) asn1js/build/index.es.js: (*! * Copyright (c) 2014, GMO GlobalSign * Copyright (c) 2015-2022, Peculiar Ventures * All rights reserved. * * Author 2014-2019, Yury Strozhevsky * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *) webcrypto-core/build/webcrypto-core.es.js: (*! Copyright (c) Peculiar Ventures, LLC *) ieee754/index.js: (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *) buffer/index.js: (*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh <https://feross.org> * @license MIT *) @peculiar/webcrypto/build/webcrypto.es.js: (*! Copyright (c) Peculiar Ventures, LLC *) chai/chai.js: (*! * Chai - flag utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - test utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - expectTypes utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - getActual utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - message composition utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - transferFlags utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * chai * http://chaijs.com * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - isProxyEnabled helper * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - addProperty utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - addLengthGuard utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - getProperties utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - proxify utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - addMethod utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - overwriteProperty utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - overwriteMethod utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - addChainingMethod utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - overwriteChainableMethod utility * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - compareByInspect utility * Copyright(c) 2011-2016 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - getOwnEnumerablePropertySymbols utility * Copyright(c) 2011-2016 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - getOwnEnumerableProperties utility * Copyright(c) 2011-2016 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Chai - isNaN utility * Copyright(c) 2012-2015 Sakthipriyan Vairamani <thechargingvolcano@gmail.com> * MIT Licensed *) (*! * chai * Copyright(c) 2011 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * chai * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! Bundled license information: deep-eql/index.js: (*! * deep-eql * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com> * MIT Licensed *) (*! * Check to see if the MemoizeMap has recorded a result of the two operands * * @param {Mixed} leftHandOperand * @param {Mixed} rightHandOperand * @param {MemoizeMap} memoizeMap * @returns {Boolean|null} result *) (*! * Set the result of the equality into the MemoizeMap * * @param {Mixed} leftHandOperand * @param {Mixed} rightHandOperand * @param {MemoizeMap} memoizeMap * @param {Boolean} result *) (*! * Primary Export *) (*! * The main logic of the `deepEqual` function. * * @param {Mixed} leftHandOperand * @param {Mixed} rightHandOperand * @param {Object} [options] (optional) Additional options * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular references to blow the stack. * @return {Boolean} equal match *) (*! * Compare two Regular Expressions for equality. * * @param {RegExp} leftHandOperand * @param {RegExp} rightHandOperand * @return {Boolean} result *) (*! * Compare two Sets/Maps for equality. Faster than other equality functions. * * @param {Set} leftHandOperand * @param {Set} rightHandOperand * @param {Object} [options] (Optional) * @return {Boolean} result *) (*! * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. * * @param {Iterable} leftHandOperand * @param {Iterable} rightHandOperand * @param {Object} [options] (Optional) * @return {Boolean} result *) (*! * Simple equality for generator objects such as those returned by generator functions. * * @param {Iterable} leftHandOperand * @param {Iterable} rightHandOperand * @param {Object} [options] (Optional) * @return {Boolean} result *) (*! * Determine if the given object has an @@iterator function. * * @param {Object} target * @return {Boolean} `true` if the object has an @@iterator function. *) (*! * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. * This will consume the iterator - which could have side effects depending on the @@iterator implementation. * * @param {Object} target * @returns {Array} an array of entries from the @@iterator function *) (*! * Gets all entries from a Generator. This will consume the generator - which could have side effects. * * @param {Generator} target * @returns {Array} an array of entries from the Generator. *) (*! * Gets all own and inherited enumerable keys from a target. * * @param {Object} target * @returns {Array} an array of own and inherited enumerable keys from the target. *) (*! * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of * each key. If any value of the given key is not equal, the function will return false (early). * * @param {Mixed} leftHandOperand * @param {Mixed} rightHandOperand * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against * @param {Object} [options] (Optional) * @return {Boolean} result *) (*! * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` * for each enumerable key in the object. * * @param {Mixed} leftHandOperand * @param {Mixed} rightHandOperand * @param {Object} [options] (Optional) * @return {Boolean} result *) (*! * Returns true if the argument is a primitive. * * This intentionally returns true for all objects that can be compared by reference, * including functions and symbols. * * @param {Mixed} value * @return {Boolean} result *) *) */ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc291cmNlL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL2lzLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy90eXBlb2YubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RvbS1zdG9yYWdlQDIuMS4wL25vZGVfbW9kdWxlcy9kb20tc3RvcmFnZS9saWIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2VsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsQDEuMy4xMi9ub2RlX21vZHVsZXMvZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGwvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHZ0c3V0aWxzQDEuMy42L25vZGVfbW9kdWxlcy9wdnRzdXRpbHMvYnVpbGQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3B2dXRpbHNAMS4xLjMvbm9kZV9tb2R1bGVzL3B2dXRpbHMvYnVpbGQvdXRpbHMuZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2FzbjFqc0AzLjAuNS9ub2RlX21vZHVsZXMvYXNuMWpzL2J1aWxkL2luZGV4LmVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2VudW1zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3R5cGVzL2JpdF9zdHJpbmcuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMTUvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvdHlwZXMvb2N0ZXRfc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3R5cGVzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2NvbnZlcnRlcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMTUvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvaGVscGVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3NjaGVtYS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4xNS9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9zdG9yYWdlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2RlY29yYXRvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMTUvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvZXJyb3JzL3NjaGVtYV92YWxpZGF0aW9uLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2Vycm9ycy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4xNS9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9wYXJzZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMTUvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvc2VyaWFsaXplci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4xNS9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9vYmplY3RzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjE1L25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2NvbnZlcnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMTUvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuOC4xL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIranNvbi1zY2hlbWFAMS4xLjEyL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvanNvbi1zY2hlbWEvYnVpbGQvaW5kZXguZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmNyeXB0by1jb3JlQDEuOC4xL25vZGVfbW9kdWxlcy93ZWJjcnlwdG8tY29yZS9idWlsZC93ZWJjcnlwdG8tY29yZS5lcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYmFzZTY0LWpzQDEuNS4xL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2llZWU3NTRAMS4yLjEvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2J1ZmZlckA1LjcuMS9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrd2ViY3J5cHRvQDEuNS4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvd2ViY3J5cHRvL2J1aWxkL3dlYmNyeXB0by5lcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2luc3RhbmNlT2YuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWF0aC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0Bwb3BwZXJqcytjb3JlQDIuMTEuOC9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBvcHBlcmpzK2NvcmVAMi4xMS44L25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcG9wcGVyanMrY29yZUAyLjExLjgvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9pbmRleC5qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvYmFzZS5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL3N0YWNrLm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS9wYXRoZmluZGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvdG9rZW5saXN0Lm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3V0aWwubWpzIiwgIi4uLy4uL3NvdXJjZS91dGlsL2Nsb25lLm1qcyIsICIuLi8uLi9zb3VyY2UvaTE4bi9sb2NhbGUubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vbG9jYWxlLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzIiwgIi4uLy4uL3NvdXJjZS9pMThuL3Byb3ZpZGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzIiwgIi4uLy4uL3NvdXJjZS9pMThuL3RpbWUtYWdvLm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS90cmFuc2Zvcm1lci5tanMiLCAiLi4vLi4vc291cmNlL2RhdGEvcGlwZS5tanMiLCAiLi4vLi4vc291cmNlL3RleHQvZm9ybWF0dGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvbWVkaWF0eXBlLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL3F1ZXVlLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvdW5pcXVlcXVldWUubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL29ic2VydmVybGlzdC5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vdGhlbWUubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vdGVtcGxhdGUubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2RpZmYubWpzIiwgIi4uLy4uL3NvdXJjZS91dGlsL3RyaW1zcGFjZXMubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vZXZlbnRzLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3VwZGF0ZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vc2xvdHRlZC5tanMiLCAiLi4vLi4vc291cmNlL2RvbS91dGlsL2V4dHJhY3Qta2V5cy5tanMiLCAiLi4vLi4vc291cmNlL2RvbS91dGlsL2luaXQtb3B0aW9ucy1mcm9tLWF0dHJpYnV0ZXMubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vdXRpbC9zZXQtb3B0aW9uLWZyb20tYXR0cmlidXRlLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL2Vycm9yLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL2N1c3RvbWVsZW1lbnQubWpzIiwgIi4uLy4uL3NvdXJjZS9tYXRoL3JhbmRvbS5tanMiLCAiLi4vLi4vc291cmNlL3V0aWwvZGVhZG1hbnNzd2l0Y2gubWpzIiwgIi4uLy4uL3NvdXJjZS91dGlsL3Byb2Nlc3NpbmcvY2FsbGJhY2subWpzIiwgIi4uLy4uL3NvdXJjZS91dGlsL3Byb2Nlc3NpbmcubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvc3R5bGVzaGVldC90YWJzLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3V0aWwvZmV0Y2gubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL3N0eWxlc2hlZXQvdGhlbWUubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vdXRpbC9wb3BwZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2xheW91dC90YWJzLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ub3RpZnkvc3R5bGVzaGVldC9tZXNzYWdlLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ub3RpZnkvbWVzc2FnZS5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbm90aWZ5L3N0eWxlc2hlZXQvbm90aWZ5Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ub3RpZnkvbm90aWZ5Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvc3R5bGVzaGVldC9zcGxpdC1wYW5lbC5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3NwbGl0LXBhbmVsLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvc3R5bGVzaGVldC9wYW5lbC5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3BhbmVsLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3JlbG9hZC5tanMiLCAiLi4vLi4vc291cmNlL2RvbS9jdXN0b21jb250cm9sLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3N0eWxlc2hlZXQvYnV0dG9uLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9zdHlsZXNoZWV0L3JpcHBsZS5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vc3R5bGVzaGVldC9zdGF0ZS1idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vdHlwZXMvc3RhdGUubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vc3RhdGUtYnV0dG9uLm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS9idWlsZG1hcC5tanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmbG9hdGluZy11aSt1dGlsc0AwLjIuOS9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3V0aWxzL2Rpc3QvZmxvYXRpbmctdWkudXRpbHMubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmxvYXRpbmctdWkrY29yZUAxLjYuOS9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL2NvcmUvZGlzdC9mbG9hdGluZy11aS5jb3JlLm1qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZsb2F0aW5nLXVpK3V0aWxzQDAuMi45L25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvdXRpbHMvZGlzdC9mbG9hdGluZy11aS51dGlscy5kb20ubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmxvYXRpbmctdWkrZG9tQDEuNi4xMy9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL2RvbS9kaXN0L2Zsb2F0aW5nLXVpLmRvbS5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS91dGlsL2Zsb2F0aW5nLXVpLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3N0eWxlc2hlZXQvc2VsZWN0Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3NlbGVjdC5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3N0eWxlc2hlZXQvcG9wcGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvcG9wcGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3BvcHBlci5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9zdHlsZXNoZWV0L3BvcHBlci1idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vcG9wcGVyLWJ1dHRvbi5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9zdHlsZXNoZWV0L2NvbmZpcm0tYnV0dG9uLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3N0eWxlc2hlZXQvbWVzc2FnZS1zdGF0ZS1idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vbWVzc2FnZS1zdGF0ZS1idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vY29uZmlybS1idXR0b24ubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9ub2RlbGlzdC5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL25vZGUubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2J1aWxkdHJlZS5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9zdHlsZXNoZWV0L3RyZWUtc2VsZWN0Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3RyZWUtc2VsZWN0Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3N0eWxlc2hlZXQvdG9nZ2xlLXN3aXRjaC5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS90b2dnbGUtc3dpdGNoLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3RlbXBsYXRlLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L3N0eWxlc2hlZXQvaG9zdC5tanMiLCAiLi4vLi4vc291cmNlL2kxOG4vcHJvdmlkZXJzL2VtYmVkLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3JlYWR5Lm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL2ZvY3VzbWFuYWdlci5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL2ludGVybmFsLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3Jlc291cmNlLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vLi4vc291cmNlL2RvbS9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vcmVzb3VyY2Uvc2NyaXB0Lm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL3Jlc291cmNlbWFuYWdlci5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvaG9zdC9zdHlsZXNoZWV0L2NvbmZpZy1tYW5hZ2VyLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L2NvbmZpZy1tYW5hZ2VyLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L2hvc3QubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2hvc3Qvc3R5bGVzaGVldC9vdmVybGF5Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L292ZXJsYXkubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2hvc3QvdXRpbC5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3N0eWxlc2hlZXQvZGV0YWlscy5tanMiLCAiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvaG9zdC9jb25zdGFudHMubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2xheW91dC9zdHlsZXNoZWV0L2NvbGxhcHNlLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvY29sbGFwc2UubWpzIiwgIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2xheW91dC9kZXRhaWxzLm1qcyIsICIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L2RldGFpbHMubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9yYW5kb21pZC5tanMiLCAiLi4vLi4vc291cmNlL3R5cGVzL3V1aWQubWpzIiwgIi4uLy4uL3NvdXJjZS9pMThuL21hcC9sYW5ndWFnZXMubWpzIiwgIi4uLy4uL3NvdXJjZS9pMThuL3V0aWwubWpzIiwgInByZXBhcmUuanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9sYXlvdXQvdGFicy5tanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANS4xLjIvbm9kZV9tb2R1bGVzL2NoYWkvY2hhaS5qcyIsICIuLi91dGlsL2NoYWktZG9tLm1qcyIsICIuLi91dGlsL2pzZG9tLm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL2xheW91dC9zbGl0LXBhbmVsLm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL2xheW91dC9wYW5lbC5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9mb3JtL3JlbG9hZC5tanMiLCAiLi4vdXRpbC9pbnRlcnNlY3Rpb24tbW9jay5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9mb3JtL3N0YXRlLWJ1dHRvbi5tanMiLCAiLi4vdXRpbC9yZXNpemUtb2JzZXJ2ZXIubWpzIiwgIi4uL2Nhc2VzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QubWpzIiwgIi4uL2Nhc2VzL2NvbXBvbmVudHMvZm9ybS9jb25maXJtLWJ1dHRvbi5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9mb3JtL2Zvcm0ubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9mb3JtL3RyZWUtc2VsZWN0Lm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL2Zvcm0vYnV0dG9uLm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL2Zvcm0vdG9nZ2xlLXN3aXRjaC5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9mb3JtL3RlbXBsYXRlLm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL25vdGlmeS9tZXNzYWdlLm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL25vdGlmeS9ub3RpZnkubWpzIiwgIi4uL2Nhc2VzL2NvbXBvbmVudHMvaG9zdC9ob3N0Lm1qcyIsICIuLi9jYXNlcy9jb21wb25lbnRzL2hvc3Qvb3ZlcmxheS5tanMiLCAiLi4vY2FzZXMvY29tcG9uZW50cy9ob3N0L3V0aWwubWpzIiwgIi4uL2Nhc2VzL2NvbXBvbmVudHMvaG9zdC9kZXRhaWxzLm1qcyIsICIuLi9jYXNlcy90ZXh0L2Zvcm1hdHRlci5tanMiLCAiLi4vLi4vc291cmNlL3RleHQvZ2VuZXJhdGUtcmFuZ2UtY29tcGFyaXNvbi1leHByZXNzaW9uLm1qcyIsICIuLi9jYXNlcy90ZXh0L3V0aWwubWpzIiwgIi4uLy4uL3NvdXJjZS90ZXh0L2JyYWNrZXRlZC1rZXktdmFsdWUtaGFzaC5tanMiLCAiLi4vY2FzZXMvdGV4dC9icmFja2V0ZWQta2V5LXZhbHVlLWhhc2gubWpzIiwgIi4uL2Nhc2VzL21hdGgvcmFuZG9tLm1qcyIsICIuLi9jYXNlcy91dGlsL3RyaW1zcGFjZXMubWpzIiwgIi4uL2Nhc2VzL3V0aWwvcHJvY2Vzc2luZy5tanMiLCAiLi4vY2FzZXMvdXRpbC9kZWFkbWFuc3N3aXRjaC5tanMiLCAiLi4vLi4vc291cmNlL3V0aWwvY29tcGFyYXRvci5tanMiLCAiLi4vY2FzZXMvdXRpbC9jb21wYXJhdG9yLm1qcyIsICIuLi8uLi9zb3VyY2UvdXRpbC9mcmVlemUubWpzIiwgIi4uL2Nhc2VzL3V0aWwvZnJlZXplLm1qcyIsICIuLi9jYXNlcy91dGlsL2Nsb25lLm1qcyIsICIuLi8uLi9zb3VyY2UvbG9nZ2luZy9oYW5kbGVyL2NvbnNvbGUubWpzIiwgIi4uLy4uL3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9sb2dnaW5nL2xvZ2VudHJ5Lm1qcyIsICIuLi8uLi9zb3VyY2UvbG9nZ2luZy9sb2dnZXIubWpzIiwgIi4uL2Nhc2VzL2xvZ2dpbmcvaGFuZGxlci9jb25zb2xlLm1qcyIsICIuLi9jYXNlcy9sb2dnaW5nL2xvZ2dlci5tanMiLCAiLi4vY2FzZXMvbG9nZ2luZy9oYW5kbGVyLm1qcyIsICIuLi9jYXNlcy9sb2dnaW5nL2xvZ2VudHJ5Lm1qcyIsICIuLi8uLi9zb3VyY2UvbmV0L3dlYmNvbm5lY3QubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZhYmxlcXVldWUubWpzIiwgIi4uLy4uL3NvdXJjZS9uZXQvd2ViY29ubmVjdC9tZXNzYWdlLm1qcyIsICIuLi9jYXNlcy9uZXQvd2ViY29ubmVjdC5tanMiLCAiLi4vdXRpbC93ZWJzb2NrZXQubWpzIiwgIi4uL2Nhc2VzL25ldC93ZWJjb25uZWN0L21lc3NhZ2UubWpzIiwgIi4uLy4uL3NvdXJjZS90eXBlcy92ZXJzaW9uLm1qcyIsICIuLi9jYXNlcy9tb25zdGVyLm1qcyIsICIuLi8uLi9zb3VyY2UvZG9tL2RpbWVuc2lvbi5tanMiLCAiLi4vY2FzZXMvZG9tL2RpbWVuc2lvbi5tanMiLCAiLi4vLi4vc291cmNlL3V0aWwvcnVudGltZS5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanMiLCAiLi4vdXRpbC9jbGVhbnVwZG9tLm1qcyIsICIuLi9jYXNlcy9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlL3NjcmlwdC5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlL2RhdGEubWpzIiwgIi4uL2Nhc2VzL2RvbS91dGlsL2luaXQtb3B0aW9ucy1mcm9tLWF0dHJpYnV0ZXMubWpzIiwgIi4uL2Nhc2VzL2RvbS91dGlsL2V4dHJhY3Qta2V5cy5tanMiLCAiLi4vLi4vc291cmNlL2RvbS93b3JrZXIvZmFjdG9yeS5tanMiLCAiLi4vY2FzZXMvZG9tL3dvcmtlci9mYWN0b3J5Lm1qcyIsICIuLi9jYXNlcy9kb20vdXBkYXRlci5tanMiLCAiLi4vY2FzZXMvZG9tL2xvY2FsZS5tanMiLCAiLi4vY2FzZXMvZG9tL3RoZW1lLm1qcyIsICIuLi9jYXNlcy9kb20vY3VzdG9tZWxlbWVudC5tanMiLCAiLi4vY2FzZXMvZG9tL2ZvY3VzbWFuYWdlci5tanMiLCAiLi4vY2FzZXMvZG9tL2ZpbmQubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZWFkeS5tanMiLCAiLi4vY2FzZXMvZG9tL3V0aWwubWpzIiwgIi4uL2Nhc2VzL2RvbS9jdXN0b21lbGVtZW50LWluaXRmcm9tc2NyaXB0aG9zdC5tanMiLCAiLi4vY2FzZXMvZG9tL3Nsb3R0ZWQtbm9kZXMubWpzIiwgIi4uL2Nhc2VzL2RvbS9hdHRyaWJ1dGVzLm1qcyIsICIuLi9jYXNlcy9kb20vcmVzb3VyY2UubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZXNvdXJjZW1hbmFnZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi9jYXNlcy9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi9jYXNlcy9kb20vY3VzdG9tY29udHJvbC5tanMiLCAiLi4vY2FzZXMvZG9tL3RlbXBsYXRlLm1qcyIsICIuLi9jYXNlcy9kb20vZXZlbnRzLm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL2RvbS5tanMiLCAiLi4vY2FzZXMvZGF0YS9kYXRhc291cmNlL2RvbS5tanMiLCAiLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL2xvY2Fsc3RvcmFnZS5tanMiLCAiLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL2xvY2Fsc3RvcmFnZS5tanMiLCAiLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL3Nlc3Npb25zdG9yYWdlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS9zZXNzaW9uc3RvcmFnZS5tanMiLCAiLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3dlYmNvbm5lY3QubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIvd2Vic29ja2V0Lm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3NlcnZlci9yZXN0YXBpLm1qcyIsICIuLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3NlcnZlci9yZXN0YXBpL3dyaXRlZXJyb3IubWpzIiwgIi4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3Jlc3RhcGkvZGF0YS1mZXRjaC1lcnJvci5tanMiLCAiLi4vY2FzZXMvZGF0YS9kYXRhc291cmNlL3NlcnZlci9yZXN0YXBpLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RhdGFzb3VyY2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvYnVpbGRtYXAubWpzIiwgIi4uL2Nhc2VzL2RhdGEvdHJhbnNmb3JtZXIubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGlmZi5tanMiLCAiLi4vY2FzZXMvZGF0YS9idWlsZHRyZWUubWpzIiwgIi4uL2Nhc2VzL2RhdGEvcGF0aGZpbmRlci5tanMiLCAiLi4vY2FzZXMvZGF0YS9waXBlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2V4dGVuZC5tanMiLCAiLi4vLi4vc291cmNlL2NvbnN0cmFpbnRzL2Fic3RyYWN0Lm1qcyIsICIuLi8uLi9zb3VyY2UvY29uc3RyYWludHMvaW52YWxpZC5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pbnZhbGlkLm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L2Fic3RyYWN0b3BlcmF0b3IubWpzIiwgIi4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy9hYnN0cmFjdG9wZXJhdG9yLm1qcyIsICIuLi8uLi9zb3VyY2UvY29uc3RyYWludHMvdmFsaWQubWpzIiwgIi4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy9vcm9wZXJhdG9yLm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L29yb3BlcmF0b3IubWpzIiwgIi4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy9pc29iamVjdC5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc29iamVjdC5tanMiLCAiLi4vLi4vc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L2FuZG9wZXJhdG9yLm1qcyIsICIuLi8uLi9zb3VyY2UvY29uc3RyYWludHMvaXNhcnJheS5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc2FycmF5Lm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L3ZhbGlkLm1qcyIsICIuLi9jYXNlcy90eXBlcy9ub2RlbGlzdC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvYmFzZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbWVkaWF0eXBlLm1qcyIsICIuLi9jYXNlcy90eXBlcy90b2tlbmxpc3QubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3ZlcnNpb24ubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2dsb2JhbC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvb2JzZXJ2ZXJsaXN0Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9pbnRlcm5hbC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvb2JzZXJ2YWJsZXF1ZXVlLm1qcyIsICIuLi9jYXNlcy90eXBlcy9kYXRhdXJsLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvYmluYXJ5Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9iaW5hcnkubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL29ic2VydmVyLm1qcyIsICIuLi8uLi9zb3VyY2UvdHlwZXMvcmVnZXgubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3JlZ2V4Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9yYW5kb21pZC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvaWQubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3V1aWQubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2lzLm1qcyIsICIuLi9jYXNlcy90eXBlcy92YWxpZGF0ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdHlwZW9mLm1qcyIsICIuLi9jYXNlcy90eXBlcy91bmlxdWVxdWV1ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvc3RhY2subWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbm9kZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvcXVldWUubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanMiLCAiLi4vY2FzZXMvaTE4bi90aW1lLWFnby5tanMiLCAiLi4vLi4vc291cmNlL2kxOG4vZm9ybWF0dGVyLm1qcyIsICIuLi9jYXNlcy9pMThuL2Zvcm1hdHRlci5tanMiLCAiLi4vY2FzZXMvaTE4bi9sb2NhbGUubWpzIiwgIi4uL2Nhc2VzL2kxOG4vcHJvdmlkZXIubWpzIiwgIi4uLy4uL3NvdXJjZS9pMThuL3Byb3ZpZGVycy9mZXRjaC5tanMiLCAiLi4vY2FzZXMvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzIiwgIi4uL2Nhc2VzL2kxOG4vcHJvdmlkZXJzL2VtYmVkLm1qcyIsICIuLi9jYXNlcy9pMThuL3V0aWwubWpzIiwgIi4uL2Nhc2VzL2kxOG4vdHJhbnNsYXRpb25zLm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuZXhwb3J0IHtcblx0aW50ZXJuYWxTeW1ib2wsXG5cdGludGVybmFsU3RhdGVTeW1ib2wsXG5cdGluc3RhbmNlU3ltYm9sLFxuXHRwcm94eUluc3RhbmNlTWFya2VyLFxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBpbnRlcm5hbFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2ludGVybmFsXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IGludGVybmFsU3RhdGVTeW1ib2wgPSBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9zdGF0ZVwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW5zdGFuY2VTeW1ib2wgPSBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9pbnN0YW5jZVwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcHJveHlJbnN0YW5jZU1hcmtlciA9IFN5bWJvbC5mb3IoXG5cdFwiQHNjaHVrYWkvbW9uc3Rlci9wcm94eS1pbnN0YW5jZS1tYXJrZXJcIixcbik7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgcHJveHlJbnN0YW5jZU1hcmtlciB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7XG5cdGlzSXRlcmFibGUsXG5cdGlzUHJpbWl0aXZlLFxuXHRpc1N5bWJvbCxcblx0aXNCb29sZWFuLFxuXHRpc1N0cmluZyxcblx0aXNPYmplY3QsXG5cdGlzSW5zdGFuY2UsXG5cdGlzQXJyYXksXG5cdGlzRnVuY3Rpb24sXG5cdGlzSW50ZWdlcixcblx0aXNQcm94eSxcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIFByb3h5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1Byb3h5KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZT8uW3Byb3h5SW5zdGFuY2VNYXJrZXJdID09PSBwcm94eUluc3RhbmNlTWFya2VyO1xufVxuXG4vKipcbiAqIFdpdGggdGhpcyBmdW5jdGlvbiB5b3UgY2FuIGNoZWNrIGlmIGEgdmFsdWUgaXMgaXRlcmFibGUuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5pc1ByaW1pdGl2ZSgpYC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtMS5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuZnVuY3Rpb24gaXNJdGVyYWJsZSh2YWx1ZSkge1xuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZT8uW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGEgcHJpbWl0aXZlIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgTmFOLCB1bmRlZmluZWQsIG51bGwgb3Igc3ltYm9sKVxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy0yLm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHR2YXIgdHlwZTtcblxuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRpZiAoXG5cdFx0dHlwZSA9PT0gXCJzdHJpbmdcIiB8fFxuXHRcdHR5cGUgPT09IFwibnVtYmVyXCIgfHxcblx0XHR0eXBlID09PSBcImJvb2xlYW5cIiB8fFxuXHRcdHR5cGUgPT09IFwic3ltYm9sXCJcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIHN5bWJvbFxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy0zLm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRyZXR1cm4gXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBib29sZWFuLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy00Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcblx0aWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBzdHJpbmdcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtNS5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcblx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBvYmplY3RcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtNi5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcblx0aWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIG9iamVjdCBhbmQgaW5zdGFuY2Ugb2YgaW5zdGFuY2UuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3R5cGVzL2lzLTcubWpzXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0geyp9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmZ1bmN0aW9uIGlzSW5zdGFuY2UodmFsdWUsIGluc3RhbmNlKSB7XG5cdGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghaXNGdW5jdGlvbihpbnN0YW5jZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCFpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eShcInByb3RvdHlwZVwiKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWUgaW5zdGFuY2VvZiBpbnN0YW5jZSkgcmV0dXJuIHRydWU7XG5cblx0bGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0d2hpbGUgKHByb3RvICE9IG51bGwpIHtcblx0XHRpZiAocHJvdG8gPT09IGluc3RhbmNlLnByb3RvdHlwZSkgcmV0dXJuIHRydWU7XG5cdFx0cHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBhcnJheVxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy04Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5XG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBmdW5jdGlvblxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy05Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG5cdGlmIChpc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoaXNQcmltaXRpdmUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy0xMC5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG5cdHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRpc0FycmF5LFxuXHRpc0Jvb2xlYW4sXG5cdGlzRnVuY3Rpb24sXG5cdGlzSW5zdGFuY2UsXG5cdGlzSW50ZWdlcixcblx0aXNJdGVyYWJsZSxcblx0aXNPYmplY3QsXG5cdGlzUHJpbWl0aXZlLFxuXHRpc1N0cmluZyxcblx0aXNTeW1ib2wsXG59IGZyb20gXCIuL2lzLm1qc1wiO1xuXG5leHBvcnQge1xuXHR2YWxpZGF0ZUl0ZXJhYmxlLFxuXHR2YWxpZGF0ZVByaW1pdGl2ZSxcblx0dmFsaWRhdGVCb29sZWFuLFxuXHR2YWxpZGF0ZVN0cmluZyxcblx0dmFsaWRhdGVPYmplY3QsXG5cdHZhbGlkYXRlSW5zdGFuY2UsXG5cdHZhbGlkYXRlQXJyYXksXG5cdHZhbGlkYXRlU3ltYm9sLFxuXHR2YWxpZGF0ZUZ1bmN0aW9uLFxuXHR2YWxpZGF0ZUludGVnZXIsXG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBwcmltaXRpdmUgdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNQcmltaXRpdmUoKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVJdGVyYWJsZX0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSXRlcmFibGUoJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSXRlcmFibGUoW10pKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlXG4gKiBAc2VlIHtAbGluayBpc1ByaW1pdGl2ZX1cbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuVHlwZXMuaXNQcmltaXRpdmV9XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLlR5cGVzI2lzUHJpbWl0aXZlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUl0ZXJhYmxlKHZhbHVlKSB7XG5cdGlmICghaXNJdGVyYWJsZSh2YWx1ZSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWUgaXMgbm90IGl0ZXJhYmxlXCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgcHJpbWl0aXZlIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzUHJpbWl0aXZlKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlUHJpbWl0aXZlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoJzInKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHByaW1pdGl2ZVxuICogQHNlZSB7QGxpbmsgaXNQcmltaXRpdmV9XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLlR5cGVzLmlzUHJpbWl0aXZlfVxuICogQHNlZSB7QGxpbmsgTW9uc3Rlci5UeXBlcyNpc1ByaW1pdGl2ZX1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcmltaXRpdmUodmFsdWUpIHtcblx0aWYgKCFpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlXCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgYm9vbGVhbiB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc0Jvb2xlYW4oKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVCb29sZWFufSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVCb29sZWFuKGZhbHNlKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVCb29sZWFuKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUJvb2xlYW4oW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gIHZhbHVlIGlzIG5vdCBwcmltaXRpdmVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlKSB7XG5cdGlmICghaXNCb29sZWFuKHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZSBpcyBub3QgYSBib29sZWFuXCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgc3RyaW5nIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzU3RyaW5nKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVTdHJpbmcoJzInKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVTdHJpbmcoW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSkge1xuXHRpZiAoIWlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZSBpcyBub3QgYSBzdHJpbmdcIik7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBvYmplY3QgdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNPYmplY3QoKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVPYmplY3R9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZU9iamVjdCh7fSkpICAvLyBcdTIxQTYgdmFsdWVcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlT2JqZWN0KCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZU9iamVjdChbXSkpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KHZhbHVlKSB7XG5cdGlmICghaXNPYmplY3QodmFsdWUpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlIGlzIG5vdCBhIG9iamVjdFwiKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIG9iamVjdCBpbnN0YW5jZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVJbnN0YW5jZSh7fSwgT2JqZWN0KSkgLy8gXHUyMUE2IHZhbHVlXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUluc3RhbmNlKCcyJywgT2JqZWN0KSkgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVJbnN0YW5jZShbXSwgT2JqZWN0KSkgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSW5zdGFuY2UodmFsdWUsIGluc3RhbmNlKSB7XG5cdGlmICghaXNJbnN0YW5jZSh2YWx1ZSwgaW5zdGFuY2UpKSB7XG5cdFx0bGV0IG4gPSBcIlwiO1xuXHRcdGlmIChpc09iamVjdChpbnN0YW5jZSkgfHwgaXNGdW5jdGlvbihpbnN0YW5jZSkpIHtcblx0XHRcdG4gPSBpbnN0YW5jZT8uW1wibmFtZVwiXTtcblx0XHR9XG5cblx0XHRpZiAobikge1xuXHRcdFx0biA9IGAgJHtufWA7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mJHtufWApO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgYXJyYXkgdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNBcnJheSgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUFycmF5fSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVBcnJheSgnMicpKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVBcnJheShbXSkpICAvLyBcdTIxQTYgdmFsdWVcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnJheSh2YWx1ZSkge1xuXHRpZiAoIWlzQXJyYXkodmFsdWUpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlIGlzIG5vdCBhbiBhcnJheVwiKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIHN5bWJvbCB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc1N5bWJvbCgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZVN5bWJvbH0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlU3ltYm9sKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZVN5bWJvbCgpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIHN5bWJvbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuXHRpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZSBpcyBub3QgYW4gc3ltYm9sXCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb24gdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNGdW5jdGlvbigpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9ufSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVGdW5jdGlvbigoKT0+e30pKSAvLyBcdTIxQTYgdmFsdWVcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlRnVuY3Rpb24oJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlRnVuY3Rpb24oW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24odmFsdWUpIHtcblx0aWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFuIGludGVnZXIuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzSW50ZWdlcigpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9ufSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVJbnRlZ2VyKHRydWUpKSAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUludGVnZXIoJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSW50ZWdlcigyKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSW50ZWdlcih2YWx1ZSkge1xuXHRpZiAoIWlzSW50ZWdlcih2YWx1ZSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWUgaXMgbm90IGFuIGludGVnZXJcIik7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7XG5cdHZhbGlkYXRlRnVuY3Rpb24sXG5cdHZhbGlkYXRlT2JqZWN0LFxuXHR2YWxpZGF0ZVN0cmluZyxcbn0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IGdldEdsb2JhbCwgZ2V0R2xvYmFsT2JqZWN0LCBnZXRHbG9iYWxGdW5jdGlvbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5sZXQgZ2xvYmFsUmVmZXJlbmNlO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQuXG4gKi9cbihmdW5jdGlvbiAoKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuXHRcdGdsb2JhbFJlZmVyZW5jZSA9IGdsb2JhbFRoaXM7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0Z2xvYmFsUmVmZXJlbmNlID0gc2VsZjtcblx0XHRyZXR1cm47XG5cdH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGdsb2JhbFJlZmVyZW5jZSA9IHdpbmRvdztcblx0XHRyZXR1cm47XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJfX21vbnN0ZXJfX1wiLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0fSk7XG5cblx0aWYgKHR5cGVvZiBfX21vbnN0ZXJfXyA9PT0gXCJvYmplY3RcIikge1xuXHRcdF9fbW9uc3Rlcl9fLmdsb2JhbFRoaXMgPSBfX21vbnN0ZXJfXztcblx0XHRkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX21vbnN0ZXJfXztcblxuXHRcdGdsb2JhbFJlZmVyZW5jZSA9IGdsb2JhbFRoaXM7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRnbG9iYWxSZWZlcmVuY2UgPSBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG5cblx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQuXCIpO1xufSkoKTtcblxuLyoqXG4gKiBSZXR1cm4gZ2xvYmFsVGhpc1xuICpcbiAqIElmIGdsb2JhbFRoaXMgaXMgbm90IGF2YWlsYWJsZSwgaXQgd2lsbCBiZSBwb2x5ZmlsbGVkXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEByZXR1cm4ge29iamVjdH0gZ2xvYmFsVGhpc1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG5cdHJldHVybiBnbG9iYWxSZWZlcmVuY2U7XG59XG5cbi8qKlxuICogUmV0dXJuIGdsb2JhbCBvYmplY3Qgb3IgdGhyb3cgRXJyb3JcbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLmdldEdsb2JhbE9iamVjdCgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtNb25zdGVyfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS9tb25zdGVyLm1qcyc7XG4gKiBNb25zdGVyLlR5cGVzLmdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKVxuICogLy8gXHUyMUE2IHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQDEuMzAuMC9kaXN0L21vZHVsZXMvdHlwZXMvZ2xvYmFsLm1qcyc7XG4gKiBnZXRHbG9iYWxPYmplY3QoJ2RvY3VtZW50JylcbiAqIC8vIFx1MjFBNiB7IH1cbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9iamVjdCBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbE9iamVjdChuYW1lKSB7XG5cdHZhbGlkYXRlU3RyaW5nKG5hbWUpO1xuXHRjb25zdCBvID0gZ2xvYmFsUmVmZXJlbmNlPy5bbmFtZV07XG5cdGlmICh0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIilcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHRoZSBvYmplY3QgJHtuYW1lfSBpcyBub3QgZGVmaW5lZGApO1xuXHR2YWxpZGF0ZU9iamVjdChvKTtcblx0cmV0dXJuIG87XG59XG5cbi8qKlxuICogUmV0dXJuIGdsb2JhbCBmdW5jdGlvbiBvciB0aHJvdyBFcnJvclxuICpcbiAqIFlvdSBjYW4gY2FsbCB0aGUgbWV0aG9kIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuVHlwZXMuZ2V0R2xvYmFsRnVuY3Rpb24oKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7TW9uc3Rlcn0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvbW9uc3Rlci5tanMnO1xuICogY29uc29sZS5sb2coTW9uc3Rlci5UeXBlcy5nZXRHbG9iYWxGdW5jdGlvbigncGFyc2VJbnQnKSkgLy8gXHUyMUE2IGYgcGFyc2VJbnQoKSB7IH1cbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIGludGVncmF0ZSB0aGlzIGZ1bmN0aW9uIGluZGl2aWR1YWxseS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQDEuMzAuMC9kaXN0L21vZHVsZXMvdHlwZXMvZ2xvYmFsLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhnZXRHbG9iYWxGdW5jdGlvbigncGFyc2VJbnQnKSkgLy8gXHUyMUE2IGYgcGFyc2VJbnQoKSB7IH1cbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxGdW5jdGlvbihuYW1lKSB7XG5cdHZhbGlkYXRlU3RyaW5nKG5hbWUpO1xuXHRjb25zdCBmID0gZ2xvYmFsUmVmZXJlbmNlPy5bbmFtZV07XG5cdGlmICh0eXBlb2YgZiA9PT0gXCJ1bmRlZmluZWRcIilcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHRoZSBmdW5jdGlvbiAke25hbWV9IGlzIG5vdCBkZWZpbmVkYCk7XG5cdHZhbGlkYXRlRnVuY3Rpb24oZik7XG5cdHJldHVybiBmO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmV4cG9ydCB7IHR5cGVPZiB9O1xuXG4vKipcbiAqIFRoZSBidWlsdC1pbiB0eXBlb2YgbWV0aG9kIGlzIGtub3duIHRvIGhhdmUgc29tZSBoaXN0b3JpY2FsIHdlYWtuZXNzZXMuIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gcHJvdmlkZSBhIGJldHRlciBhbmQgbW9yZSBhY2N1cmF0ZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHByaW1pdGl2ZVxuICovXG5mdW5jdGlvbiB0eXBlT2YodmFsdWUpIHtcblx0bGV0IHR5cGUgPSB7fS50b1N0cmluZy5jYWxsKHZhbHVlKS5tYXRjaCgvXFxzKFthLXpBLVpdKykvKVsxXTtcblx0aWYgKFwiT2JqZWN0XCIgPT09IHR5cGUpIHtcblx0XHRjb25zdCBuYW1lID0gdmFsdWUuY29uc3RydWN0b3IubmFtZTtcblx0XHRpZiAobmFtZSkge1xuXHRcdFx0cmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRzID0gL14oY2xhc3N8ZnVuY3Rpb24pXFxzKyhcXHcrKS8uZXhlYyhcblx0XHRcdHZhbHVlLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCksXG5cdFx0KTtcblx0XHR0eXBlID0gcmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDIgPyByZXN1bHRzWzJdIDogXCJcIjtcblx0fVxuXG5cdHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaXNBcnJheSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB0eXBlT2YgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZW9mLm1qc1wiO1xuXG5leHBvcnQgeyBleHRlbmQgfTtcblxuLyoqXG4gKiBFeHRlbmQgY29waWVzIGFsbCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yXG4gKiBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdC4gSXQgcmV0dXJucyB0aGUgbW9kaWZpZWQgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYXJndW1lbnRcbiAqIEB0aHJvd3Mge0Vycm9yfSB0eXBlIG1pc21hdGNoXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYXJndW1lbnRcbiAqIEBwYXJhbSBhcmdzXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZCguLi5hcmdzKSB7XG5cdGxldCBvO1xuXHRsZXQgaTtcblxuXHRpZiAodHlwZW9mIGFyZ3MgIT09IFwib2JqZWN0XCIgfHwgYXJnc1swXSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYXJndW1lbnQgJHtKU09OLnN0cmluZ2lmeShhcmdzWzBdKX1gKTtcblx0fVxuXG5cdGZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgYSA9IGFyZ3NbaV07XG5cblx0XHRpZiAoIShpc09iamVjdChhKSB8fCBpc0FycmF5KGEpKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhcmd1bWVudCAke0pTT04uc3RyaW5naWZ5KGEpfWApO1xuXHRcdH1cblxuXHRcdGlmIChvID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG8gPSBhO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBrIGluIGEpIHtcblx0XHRcdGNvbnN0IHYgPSBhPy5ba107XG5cblx0XHRcdGlmIChrIGluIG8gJiYgdiA9PT0gbz8uW2tdKSB7XG5cdFx0XHRcdC8vIGsgaW4gbyBpcyBmb3IgdGhlIGNhc2Ugb2YgdW5kZWZpbmVkXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoKGlzT2JqZWN0KHYpICYmIHR5cGVPZih2KSA9PT0gXCJvYmplY3RcIikgfHwgaXNBcnJheSh2KSkge1xuXHRcdFx0XHRpZiAob1trXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlzQXJyYXkodikpIHtcblx0XHRcdFx0XHRcdG9ba10gPSBbXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b1trXSA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAodHlwZU9mKG9ba10pICE9PSB0eXBlT2YodikpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRcdFx0YHR5cGUgbWlzbWF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkob1trXSl9KCR7dHlwZU9mKFxuXHRcdFx0XHRcdFx0XHRcdG9ba10sXG5cdFx0XHRcdFx0XHRcdCl9KSAhPSAke0pTT04uc3RyaW5naWZ5KHYpfSgke3R5cGVPZih2KX0pYCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzQXJyYXkob1trXSkpIHtcblx0XHRcdFx0XHRvW2tdID0gW107XG5cdFx0XHRcdFx0b1trXS5wdXNoKC4uLnYpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b1trXSA9IGV4dGVuZChvW2tdLCB2KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChpc0FycmF5KG8pKSB7XG5cdFx0XHRcdFx0by5wdXNoKHYpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9ba10gPSB2O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvO1xufVxuIiwgIi8vIGh0dHA6Ly93d3cucmFqZGVlcGQuY29tL2FydGljbGVzL2Nocm9tZS9sb2NhbHN0cmcvTG9jYWxTdG9yYWdlU2FtcGxlLmh0bVxuXG4vLyBOT1RFOlxuLy8gdGhpcyB2YXJpZXMgZnJvbSBhY3R1YWwgbG9jYWxTdG9yYWdlIGluIHNvbWUgc3VidGxlIHdheXNcblxuLy8gYWxzbywgdGhlcmUgaXMgbm8gcGVyc2lzdGVuY2Vcbi8vIFRPRE8gcGVyc2lzdFxuKGZ1bmN0aW9uICgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuICBmdW5jdGlvbiBTdG9yYWdlKHBhdGgsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgZGI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19fX3ByaXZfYmtfX18nLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBwYXRoOiBwYXRoXG4gICAgICB9XG4gICAgLCB3cml0YWJsZTogZmFsc2VcbiAgICAsIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19fX3ByaXZfc3RyaWN0X19fJywge1xuICAgICAgdmFsdWU6ICEhb3B0cy5zdHJpY3RcbiAgICAsIHdyaXRhYmxlOiBmYWxzZVxuICAgICwgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX19fcHJpdl93c19fXycsIHtcbiAgICAgIHZhbHVlOiBvcHRzLndzIHx8ICcgICdcbiAgICAsIHdyaXRhYmxlOiBmYWxzZVxuICAgICwgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBkYiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGRiID0ge307XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoZGIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdGhpc1trZXldID0gZGJba2V5XTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuXG4gIFN0b3JhZ2UucHJvdG90eXBlLmdldEl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgaWYgKHRoaXMuX19fcHJpdl9zdHJpY3RfX18pIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgU3RvcmFnZS5wcm90b3R5cGUuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbCkge1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpc1trZXldID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19fcHJpdl9zdHJpY3RfX18pIHtcbiAgICAgIHRoaXNba2V5XSA9IFN0cmluZyh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIHRoaXMuX19fc2F2ZV9fXygpO1xuICB9O1xuXG4gIFN0b3JhZ2UucHJvdG90eXBlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICB0aGlzLl9fX3NhdmVfX18oKTtcbiAgfTtcblxuICBTdG9yYWdlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gZmlsdGVycyBvdXQgcHJvdG90eXBlIGtleXNcbiAgICBPYmplY3Qua2V5cyhzZWxmKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHNlbGZba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG4gICAgfSk7XG4gIH07XG5cbiAgU3RvcmFnZS5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24gKGkpIHtcbiAgICBpID0gaSB8fCAwO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKVtpXTtcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RvcmFnZS5wcm90b3R5cGUsICdsZW5ndGgnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7XG4gICAgfVxuICB9KTtcblxuICBTdG9yYWdlLnByb3RvdHlwZS5fX19zYXZlX19fID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghdGhpcy5fX19wcml2X2JrX19fLnBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX19wcml2X2JrX19fLmxvY2spIHtcbiAgICAgIHRoaXMuX19fcHJpdl9ia19fXy53YWl0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9fX3ByaXZfYmtfX18ubG9jayA9IHRydWU7XG4gICAgZnMud3JpdGVGaWxlKFxuICAgICAgdGhpcy5fX19wcml2X2JrX19fLnBhdGhcbiAgICAsIEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsIHRoaXMuX19fcHJpdl93c19fXylcbiAgICAsICd1dGY4J1xuICAgICwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHNlbGYuX19fcHJpdl9ia19fXy5sb2NrID0gZmFsc2U7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3Qgd3JpdGUgdG8gZGF0YWJhc2UnLCBzZWxmLl9fX3ByaXZfYmtfX18ucGF0aCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLl9fX3ByaXZfYmtfX18ud2FpdCkge1xuICAgICAgICBzZWxmLl9fX3ByaXZfYmtfX18ud2FpdCA9IGZhbHNlO1xuICAgICAgICBzZWxmLl9fX3NhdmVfX18oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RvcmFnZSwgJ2NyZWF0ZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHBhdGgsIG9wdHMpIHtcbiAgICAgIHJldHVybiBuZXcgU3RvcmFnZShwYXRoLCBvcHRzKTtcbiAgICB9XG4gICwgd3JpdGFibGU6IGZhbHNlXG4gICwgZW51bWVyYWJsZTogZmFsc2VcbiAgfSk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlO1xufSgpKTtcbiIsICIoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBjb25zdCByZWZNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IHZhbGlkaXR5TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBoaWRkZW5JbnB1dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3QgaW50ZXJuYWxzTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3QgZm9ybXNNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IHNoYWRvd0hvc3RzTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBmb3JtRWxlbWVudHNNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IHJlZlZhbHVlTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCB1cGdyYWRlTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBzaGFkb3dSb290TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCB2YWxpZGF0aW9uQW5jaG9yTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBkb2N1bWVudEZyYWdtZW50TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBjb25uZWN0ZWRDYWxsYmFja01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3QgdmFsaWRpdHlVcGdyYWRlTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIGNvbnN0IGFvbSA9IHtcbiAgICAgICAgYXJpYUF0b21pYzogJ2FyaWEtYXRvbWljJyxcbiAgICAgICAgYXJpYUF1dG9Db21wbGV0ZTogJ2FyaWEtYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgYXJpYUJ1c3k6ICdhcmlhLWJ1c3knLFxuICAgICAgICBhcmlhQ2hlY2tlZDogJ2FyaWEtY2hlY2tlZCcsXG4gICAgICAgIGFyaWFDb2xDb3VudDogJ2FyaWEtY29sY291bnQnLFxuICAgICAgICBhcmlhQ29sSW5kZXg6ICdhcmlhLWNvbGluZGV4JyxcbiAgICAgICAgYXJpYUNvbEluZGV4VGV4dDogJ2FyaWEtY29saW5kZXh0ZXh0JyxcbiAgICAgICAgYXJpYUNvbFNwYW46ICdhcmlhLWNvbHNwYW4nLFxuICAgICAgICBhcmlhQ3VycmVudDogJ2FyaWEtY3VycmVudCcsXG4gICAgICAgIGFyaWFEZXNjcmlwdGlvbjogJ2FyaWEtZGVzY3JpcHRpb24nLFxuICAgICAgICBhcmlhRGlzYWJsZWQ6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgICAgYXJpYUV4cGFuZGVkOiAnYXJpYS1leHBhbmRlZCcsXG4gICAgICAgIGFyaWFIYXNQb3B1cDogJ2FyaWEtaGFzcG9wdXAnLFxuICAgICAgICBhcmlhSGlkZGVuOiAnYXJpYS1oaWRkZW4nLFxuICAgICAgICBhcmlhSW52YWxpZDogJ2FyaWEtaW52YWxpZCcsXG4gICAgICAgIGFyaWFLZXlTaG9ydGN1dHM6ICdhcmlhLWtleXNob3J0Y3V0cycsXG4gICAgICAgIGFyaWFMYWJlbDogJ2FyaWEtbGFiZWwnLFxuICAgICAgICBhcmlhTGV2ZWw6ICdhcmlhLWxldmVsJyxcbiAgICAgICAgYXJpYUxpdmU6ICdhcmlhLWxpdmUnLFxuICAgICAgICBhcmlhTW9kYWw6ICdhcmlhLW1vZGFsJyxcbiAgICAgICAgYXJpYU11bHRpTGluZTogJ2FyaWEtbXVsdGlsaW5lJyxcbiAgICAgICAgYXJpYU11bHRpU2VsZWN0YWJsZTogJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJyxcbiAgICAgICAgYXJpYU9yaWVudGF0aW9uOiAnYXJpYS1vcmllbnRhdGlvbicsXG4gICAgICAgIGFyaWFQbGFjZWhvbGRlcjogJ2FyaWEtcGxhY2Vob2xkZXInLFxuICAgICAgICBhcmlhUG9zSW5TZXQ6ICdhcmlhLXBvc2luc2V0JyxcbiAgICAgICAgYXJpYVByZXNzZWQ6ICdhcmlhLXByZXNzZWQnLFxuICAgICAgICBhcmlhUmVhZE9ubHk6ICdhcmlhLXJlYWRvbmx5JyxcbiAgICAgICAgYXJpYVJlbGV2YW50OiAnYXJpYS1yZWxldmFudCcsXG4gICAgICAgIGFyaWFSZXF1aXJlZDogJ2FyaWEtcmVxdWlyZWQnLFxuICAgICAgICBhcmlhUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1yb2xlZGVzY3JpcHRpb24nLFxuICAgICAgICBhcmlhUm93Q291bnQ6ICdhcmlhLXJvd2NvdW50JyxcbiAgICAgICAgYXJpYVJvd0luZGV4OiAnYXJpYS1yb3dpbmRleCcsXG4gICAgICAgIGFyaWFSb3dJbmRleFRleHQ6ICdhcmlhLXJvd2luZGV4dGV4dCcsXG4gICAgICAgIGFyaWFSb3dTcGFuOiAnYXJpYS1yb3dzcGFuJyxcbiAgICAgICAgYXJpYVNlbGVjdGVkOiAnYXJpYS1zZWxlY3RlZCcsXG4gICAgICAgIGFyaWFTZXRTaXplOiAnYXJpYS1zZXRzaXplJyxcbiAgICAgICAgYXJpYVNvcnQ6ICdhcmlhLXNvcnQnLFxuICAgICAgICBhcmlhVmFsdWVNYXg6ICdhcmlhLXZhbHVlbWF4JyxcbiAgICAgICAgYXJpYVZhbHVlTWluOiAnYXJpYS12YWx1ZW1pbicsXG4gICAgICAgIGFyaWFWYWx1ZU5vdzogJ2FyaWEtdmFsdWVub3cnLFxuICAgICAgICBhcmlhVmFsdWVUZXh0OiAnYXJpYS12YWx1ZXRleHQnLFxuICAgICAgICByb2xlOiAncm9sZSdcbiAgICB9O1xuICAgIGNvbnN0IGluaXRBb20gPSAocmVmLCBpbnRlcm5hbHMpID0+IHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGFvbSkge1xuICAgICAgICAgICAgaW50ZXJuYWxzW2tleV0gPSBudWxsO1xuICAgICAgICAgICAgbGV0IGNsb3N1cmVWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYW9tW2tleV07XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW50ZXJuYWxzLCBrZXksIHtcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9zdXJlVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBncmFkZU1hcC5zZXQocmVmLCBpbnRlcm5hbHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaW5pdE5vZGUobm9kZSkge1xuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBpbnRlcm5hbHNNYXAuZ2V0KG5vZGUpO1xuICAgICAgICBjb25zdCB7IGZvcm0gfSA9IGludGVybmFscztcbiAgICAgICAgaW5pdEZvcm0obm9kZSwgZm9ybSwgaW50ZXJuYWxzKTtcbiAgICAgICAgaW5pdExhYmVscyhub2RlLCBpbnRlcm5hbHMubGFiZWxzKTtcbiAgICB9XG4gICAgY29uc3Qgd2Fsa0ZpZWxkc2V0ID0gKG5vZGUsIGZpcnN0UmVuZGVyID0gZmFsc2UpID0+IHtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsc01hcC5oYXMobm9kZSkgP1xuICAgICAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgY29uc3QgaXNDYWxsTmVjZXNzYXJ5ID0gKCFmaXJzdFJlbmRlciB8fCBub2RlLmRpc2FibGVkKTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmZvcm1EaXNhYmxlZENhbGxiYWNrICYmIGlzQ2FsbE5lY2Vzc2FyeSkge1xuICAgICAgICAgICAgICAgIHNldERpc2FibGVkKGN1cnJlbnQsIG5vZGUuZGlzYWJsZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBkaXNhYmxlZE9yTmFtZU9ic2VydmVyQ29uZmlnID0geyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlzYWJsZWQnLCAnbmFtZSddIH07XG4gICAgY29uc3QgZGlzYWJsZWRPck5hbWVPYnNlcnZlciA9IG11dGF0aW9uT2JzZXJ2ZXJFeGlzdHMoKSA/IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnNMaXN0KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbXV0YXRpb24udGFyZ2V0O1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNvbnN0cnVjdG9yWydmb3JtQXNzb2NpYXRlZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldERpc2FibGVkKHRhcmdldCwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldC5sb2NhbE5hbWUgPT09ICdmaWVsZHNldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0ZpZWxkc2V0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY29uc3RydWN0b3JbJ2Zvcm1Bc3NvY2lhdGVkJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gaW50ZXJuYWxzTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZlZhbHVlTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSA6IHt9O1xuICAgIGZ1bmN0aW9uIG9ic2VydmVyQ2FsbGJhY2sobXV0YXRpb25MaXN0KSB7XG4gICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKG11dGF0aW9uUmVjb3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzIH0gPSBtdXRhdGlvblJlY29yZDtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gQXJyYXkuZnJvbShhZGRlZE5vZGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBBcnJheS5mcm9tKHJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICBhZGRlZC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxzTWFwLmhhcyhub2RlKSAmJiBub2RlLmNvbnN0cnVjdG9yWydmb3JtQXNzb2NpYXRlZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXROb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodXBncmFkZU1hcC5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gdXBncmFkZU1hcC5nZXQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFvbUtleXMgPSBPYmplY3Qua2V5cyhhb20pO1xuICAgICAgICAgICAgICAgICAgICBhb21LZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGtleSA9PiBpbnRlcm5hbHNba2V5XSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhb21ba2V5XSwgaW50ZXJuYWxzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdXBncmFkZU1hcC5kZWxldGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWxpZGl0eVVwZ3JhZGVNYXAuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFscyA9IHZhbGlkaXR5VXBncmFkZU1hcC5nZXQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdpbnRlcm5hbHMtdmFsaWQnLCBpbnRlcm5hbHMudmFsaWRpdHkudmFsaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdpbnRlcm5hbHMtaW52YWxpZCcsICghaW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICghaW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHlVcGdyYWRlTWFwLmRlbGV0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnZm9ybScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUVsZW1lbnRzID0gZm9ybUVsZW1lbnRzTWFwLmdldChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnRlcm5hbHNNYXAuaGFzKG5vZGUpICYmIG5vZGUuY29uc3RydWN0b3JbJ2Zvcm1Bc3NvY2lhdGVkJ10gJiYgIShmb3JtRWxlbWVudHMgJiYgZm9ybUVsZW1lbnRzLmhhcyhub2RlKSkpID8gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIDogTm9kZUZpbHRlci5GSUxURVJfU0tJUDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0Tm9kZShjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdmaWVsZHNldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gZGlzYWJsZWRPck5hbWVPYnNlcnZlci5vYnNlcnZlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChkaXNhYmxlZE9yTmFtZU9ic2VydmVyLCBub2RlLCBkaXNhYmxlZE9yTmFtZU9ic2VydmVyQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0ZpZWxkc2V0KG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFscyA9IGludGVybmFsc01hcC5nZXQobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFscyAmJiBoaWRkZW5JbnB1dE1hcC5nZXQoaW50ZXJuYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVIaWRkZW5JbnB1dHMoaW50ZXJuYWxzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNoYWRvd0hvc3RzTWFwLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IHNoYWRvd0hvc3RzTWFwLmdldChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZnJhZ21lbnRPYnNlcnZlckNhbGxiYWNrKG11dGF0aW9uTGlzdCkge1xuICAgICAgICBtdXRhdGlvbkxpc3QuZm9yRWFjaChtdXRhdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJlbW92ZWROb2RlcyB9ID0gbXV0YXRpb247XG4gICAgICAgICAgICByZW1vdmVkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IGRvY3VtZW50RnJhZ21lbnRNYXAuZ2V0KG11dGF0aW9uLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsc01hcC5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBncmFkZUludGVybmFscyhub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZWZlclVwZ3JhZGUgPSAoZnJhZ21lbnQpID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmcmFnbWVudE9ic2VydmVyQ2FsbGJhY2spO1xuICAgICAgICBpZiAoKChfYSA9IHdpbmRvdyA9PT0gbnVsbCB8fCB3aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdy5TaGFkeURPTSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluVXNlKSAmJlxuICAgICAgICAgICAgZnJhZ21lbnQubW9kZSAmJlxuICAgICAgICAgICAgZnJhZ21lbnQuaG9zdCkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IG9ic2VydmVyLm9ic2VydmUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKG9ic2VydmVyLCBmcmFnbWVudCwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgICAgIGRvY3VtZW50RnJhZ21lbnRNYXAuc2V0KGZyYWdtZW50LCBvYnNlcnZlcik7XG4gICAgfTtcbiAgICBtdXRhdGlvbk9ic2VydmVyRXhpc3RzKCkgPyBuZXcgTXV0YXRpb25PYnNlcnZlcihvYnNlcnZlckNhbGxiYWNrKSA6IHt9O1xuICAgIGNvbnN0IG9ic2VydmVyQ29uZmlnID0ge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0RGlzYWJsZWQgPSAocmVmLCBkaXNhYmxlZCkgPT4ge1xuICAgICAgICByZWYudG9nZ2xlQXR0cmlidXRlKCdpbnRlcm5hbHMtZGlzYWJsZWQnLCBkaXNhYmxlZCk7XG4gICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgcmVmLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWYucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZi5mb3JtRGlzYWJsZWRDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVmLmZvcm1EaXNhYmxlZENhbGxiYWNrLmFwcGx5KHJlZiwgW2Rpc2FibGVkXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZUhpZGRlbklucHV0cyA9IChpbnRlcm5hbHMpID0+IHtcbiAgICAgICAgY29uc3QgaGlkZGVuSW5wdXRzID0gaGlkZGVuSW5wdXRNYXAuZ2V0KGludGVybmFscyk7XG4gICAgICAgIGhpZGRlbklucHV0cy5mb3JFYWNoKGhpZGRlbklucHV0ID0+IHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGlkZGVuSW5wdXRNYXAuc2V0KGludGVybmFscywgW10pO1xuICAgIH07XG4gICAgY29uc3QgY3JlYXRlSGlkZGVuSW5wdXQgPSAocmVmLCBpbnRlcm5hbHMpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBpbnB1dC50eXBlID0gJ2hpZGRlbic7XG4gICAgICAgIGlucHV0Lm5hbWUgPSByZWYuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgIHJlZi5hZnRlcihpbnB1dCk7XG4gICAgICAgIGhpZGRlbklucHV0TWFwLmdldChpbnRlcm5hbHMpLnB1c2goaW5wdXQpO1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfTtcbiAgICBjb25zdCBpbml0UmVmID0gKHJlZiwgaW50ZXJuYWxzKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaGlkZGVuSW5wdXRNYXAuc2V0KGludGVybmFscywgW10pO1xuICAgICAgICAoX2EgPSBkaXNhYmxlZE9yTmFtZU9ic2VydmVyLm9ic2VydmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGRpc2FibGVkT3JOYW1lT2JzZXJ2ZXIsIHJlZiwgZGlzYWJsZWRPck5hbWVPYnNlcnZlckNvbmZpZyk7XG4gICAgfTtcbiAgICBjb25zdCBpbml0TGFiZWxzID0gKHJlZiwgbGFiZWxzKSA9PiB7XG4gICAgICAgIGlmIChsYWJlbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGxhYmVscykuZm9yRWFjaChsYWJlbCA9PiBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlZi5jbGljay5iaW5kKHJlZikpKTtcbiAgICAgICAgICAgIGxldCBmaXJzdExhYmVsSWQgPSBsYWJlbHNbMF0uaWQ7XG4gICAgICAgICAgICBpZiAoIWxhYmVsc1swXS5pZCkge1xuICAgICAgICAgICAgICAgIGZpcnN0TGFiZWxJZCA9IGAke2xhYmVsc1swXS5odG1sRm9yfV9MYWJlbGA7XG4gICAgICAgICAgICAgICAgbGFiZWxzWzBdLmlkID0gZmlyc3RMYWJlbElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVmLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgZmlyc3RMYWJlbElkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2V0Rm9ybVZhbGlkaXR5ID0gKGZvcm0pID0+IHtcbiAgICAgICAgY29uc3QgbmF0aXZlQ29udHJvbFZhbGlkaXR5ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKVxuICAgICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWVsZW1lbnQudGFnTmFtZS5pbmNsdWRlcygnLScpICYmIGVsZW1lbnQudmFsaWRpdHkpXG4gICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LnZhbGlkaXR5LnZhbGlkKTtcbiAgICAgICAgY29uc3QgcG9seWZpbGxlZEVsZW1lbnRzID0gZm9ybUVsZW1lbnRzTWFwLmdldChmb3JtKSB8fCBbXTtcbiAgICAgICAgY29uc3QgcG9seWZpbGxlZFZhbGlkaXR5ID0gQXJyYXkuZnJvbShwb2x5ZmlsbGVkRWxlbWVudHMpXG4gICAgICAgICAgICAuZmlsdGVyKGNvbnRyb2wgPT4gY29udHJvbC5pc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIC5tYXAoKGNvbnRyb2wpID0+IGludGVybmFsc01hcC5nZXQoY29udHJvbCkudmFsaWRpdHkudmFsaWQpO1xuICAgICAgICBjb25zdCBoYXNJbnZhbGlkID0gWy4uLm5hdGl2ZUNvbnRyb2xWYWxpZGl0eSwgLi4ucG9seWZpbGxlZFZhbGlkaXR5XS5pbmNsdWRlcyhmYWxzZSk7XG4gICAgICAgIGZvcm0udG9nZ2xlQXR0cmlidXRlKCdpbnRlcm5hbHMtaW52YWxpZCcsIGhhc0ludmFsaWQpO1xuICAgICAgICBmb3JtLnRvZ2dsZUF0dHJpYnV0ZSgnaW50ZXJuYWxzLXZhbGlkJywgIWhhc0ludmFsaWQpO1xuICAgIH07XG4gICAgY29uc3QgZm9ybUlucHV0Q2FsbGJhY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgc2V0Rm9ybVZhbGlkaXR5KGZpbmRQYXJlbnRGb3JtKGV2ZW50LnRhcmdldCkpO1xuICAgIH07XG4gICAgY29uc3QgZm9ybUNoYW5nZUNhbGxiYWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHNldEZvcm1WYWxpZGl0eShmaW5kUGFyZW50Rm9ybShldmVudC50YXJnZXQpKTtcbiAgICB9O1xuICAgIGNvbnN0IHdpcmVTdWJtaXRMb2dpYyA9IChmb3JtKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvblNlbGVjdG9yID0gWydidXR0b25bdHlwZT1zdWJtaXRdJywgJ2lucHV0W3R5cGU9c3VibWl0XScsICdidXR0b246bm90KFt0eXBlXSknXVxuICAgICAgICAgICAgLm1hcChzZWwgPT4gYCR7c2VsfTpub3QoW2Rpc2FibGVkXSlgKVxuICAgICAgICAgICAgLm1hcChzZWwgPT4gYCR7c2VsfTpub3QoW2Zvcm1dKSR7Zm9ybS5pZCA/IGAsJHtzZWx9W2Zvcm09JyR7Zm9ybS5pZH0nXWAgOiAnJ31gKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdChzdWJtaXRCdXR0b25TZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGZvcm1FbGVtZW50c01hcC5nZXQoZm9ybSk7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm0ubm9WYWxpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkaXR5TGlzdCA9IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gaW50ZXJuYWxzTWFwLmdldChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGl0eUxpc3QuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1SZXNldENhbGxiYWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZm9ybUVsZW1lbnRzTWFwLmdldChldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoZWxlbWVudHMgJiYgZWxlbWVudHMuc2l6ZSkge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvci5mb3JtQXNzb2NpYXRlZCAmJiBlbGVtZW50LmZvcm1SZXNldENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9ybVJlc2V0Q2FsbGJhY2suYXBwbHkoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluaXRGb3JtID0gKHJlZiwgZm9ybSwgaW50ZXJuYWxzKSA9PiB7XG4gICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRWxlbWVudHMgPSBmb3JtRWxlbWVudHNNYXAuZ2V0KGZvcm0pO1xuICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGZvcm1FbGVtZW50cy5hZGQocmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgaW5pdFNldC5hZGQocmVmKTtcbiAgICAgICAgICAgICAgICBmb3JtRWxlbWVudHNNYXAuc2V0KGZvcm0sIGluaXRTZXQpO1xuICAgICAgICAgICAgICAgIHdpcmVTdWJtaXRMb2dpYyhmb3JtKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2V0JywgZm9ybVJlc2V0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmb3JtSW5wdXRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmb3JtQ2hhbmdlQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybXNNYXAuc2V0KGZvcm0sIHsgcmVmLCBpbnRlcm5hbHMgfSk7XG4gICAgICAgICAgICBpZiAocmVmLmNvbnN0cnVjdG9yWydmb3JtQXNzb2NpYXRlZCddICYmIHJlZi5mb3JtQXNzb2NpYXRlZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5mb3JtQXNzb2NpYXRlZENhbGxiYWNrLmFwcGx5KHJlZiwgW2Zvcm1dKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldEZvcm1WYWxpZGl0eShmb3JtKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZmluZFBhcmVudEZvcm0gPSAoZWxlbSkgPT4ge1xuICAgICAgICBsZXQgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50YWdOYW1lICE9PSAnRk9STScpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGZpbmRQYXJlbnRGb3JtKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9O1xuICAgIGNvbnN0IHRocm93SWZOb3RGb3JtQXNzb2NpYXRlZCA9IChyZWYsIG1lc3NhZ2UsIEVycm9yVHlwZSA9IERPTUV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBpZiAoIXJlZi5jb25zdHJ1Y3RvclsnZm9ybUFzc29jaWF0ZWQnXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yVHlwZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgb3ZlcnJpZGVGb3JtTWV0aG9kID0gKGZvcm0sIHJldHVyblZhbHVlLCBtZXRob2QpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBmb3JtRWxlbWVudHNNYXAuZ2V0KGZvcm0pO1xuICAgICAgICBpZiAoZWxlbWVudHMgJiYgZWxlbWVudHMuc2l6ZSkge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSBpbnRlcm5hbHNNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gaW50ZXJuYWxzW21ldGhvZF0oKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH07XG4gICAgY29uc3QgdXBncmFkZUludGVybmFscyA9IChyZWYpID0+IHtcbiAgICAgICAgaWYgKHJlZi5jb25zdHJ1Y3RvclsnZm9ybUFzc29jaWF0ZWQnXSkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gaW50ZXJuYWxzTWFwLmdldChyZWYpO1xuICAgICAgICAgICAgY29uc3QgeyBsYWJlbHMsIGZvcm0gfSA9IGludGVybmFscztcbiAgICAgICAgICAgIGluaXRMYWJlbHMocmVmLCBsYWJlbHMpO1xuICAgICAgICAgICAgaW5pdEZvcm0ocmVmLCBmb3JtLCBpbnRlcm5hbHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBtdXRhdGlvbk9ic2VydmVyRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cblxuICAgIGNsYXNzIFZhbGlkaXR5U3RhdGUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRoaXMuYmFkSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucGF0dGVybk1pc21hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJhbmdlT3ZlcmZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VVbmRlcmZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RlcE1pc21hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRvb0xvbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9vU2hvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudHlwZU1pc21hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVNaXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBPYmplY3Quc2VhbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZXRWYWxpZCA9ICh2YWxpZGl0eU9iamVjdCkgPT4ge1xuICAgICAgICB2YWxpZGl0eU9iamVjdC5iYWRJbnB1dCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC5jdXN0b21FcnJvciA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC5wYXR0ZXJuTWlzbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlPYmplY3QucmFuZ2VPdmVyZmxvdyA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC5yYW5nZVVuZGVyZmxvdyA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC5zdGVwTWlzbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlPYmplY3QudG9vTG9uZyA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC50b29TaG9ydCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC50eXBlTWlzbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlPYmplY3QudmFsaWQgPSB0cnVlO1xuICAgICAgICB2YWxpZGl0eU9iamVjdC52YWx1ZU1pc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHZhbGlkaXR5T2JqZWN0O1xuICAgIH07XG4gICAgY29uc3QgcmVjb25jaWxlVmFsaWRpdHkgPSAodmFsaWRpdHlPYmplY3QsIG5ld1N0YXRlLCBmb3JtKSA9PiB7XG4gICAgICAgIHZhbGlkaXR5T2JqZWN0LnZhbGlkID0gaXNWYWxpZChuZXdTdGF0ZSk7XG4gICAgICAgIE9iamVjdC5rZXlzKG5ld1N0YXRlKS5mb3JFYWNoKGtleSA9PiB2YWxpZGl0eU9iamVjdFtrZXldID0gbmV3U3RhdGVba2V5XSk7XG4gICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBzZXRGb3JtVmFsaWRpdHkoZm9ybSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkaXR5T2JqZWN0O1xuICAgIH07XG4gICAgY29uc3QgaXNWYWxpZCA9ICh2YWxpZGl0eVN0YXRlKSA9PiB7XG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB2YWxpZGl0eVN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndmFsaWQnICYmIHZhbGlkaXR5U3RhdGVba2V5XSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9O1xuXG4gICAgY29uc3QgY3VzdG9tU3RhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIGZ1bmN0aW9uIGFkZFN0YXRlKHJlZiwgc3RhdGVOYW1lKSB7XG4gICAgICAgIHJlZi50b2dnbGVBdHRyaWJ1dGUoc3RhdGVOYW1lLCB0cnVlKTtcbiAgICAgICAgaWYgKHJlZi5wYXJ0KSB7XG4gICAgICAgICAgICByZWYucGFydC5hZGQoc3RhdGVOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGFzcyBDdXN0b21TdGF0ZVNldCBleHRlbmRzIFNldCB7XG4gICAgICAgIHN0YXRpYyBnZXQgaXNQb2x5ZmlsbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IocmVmKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgaWYgKCFyZWYgfHwgIXJlZi50YWdOYW1lIHx8IHJlZi50YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXN0b21TdGF0ZU1hcC5zZXQodGhpcywgcmVmKTtcbiAgICAgICAgfVxuICAgICAgICBhZGQoc3RhdGUpIHtcbiAgICAgICAgICAgIGlmICghL14tLS8udGVzdChzdGF0ZSkgfHwgdHlwZW9mIHN0YXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oYEZhaWxlZCB0byBleGVjdXRlICdhZGQnIG9uICdDdXN0b21TdGF0ZVNldCc6IFRoZSBzcGVjaWZpZWQgdmFsdWUgJHtzdGF0ZX0gbXVzdCBzdGFydCB3aXRoICctLScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzdXBlci5hZGQoc3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgcmVmID0gY3VzdG9tU3RhdGVNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVOYW1lID0gYHN0YXRlJHtzdGF0ZX1gO1xuICAgICAgICAgICAgaWYgKHJlZi5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIGFkZFN0YXRlKHJlZiwgc3RhdGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShyZWYsIHN0YXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgW2VudHJ5XSBvZiB0aGlzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWxldGUoc3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgcmVmID0gY3VzdG9tU3RhdGVNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgaWYgKHJlZi5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHJlZi50b2dnbGVBdHRyaWJ1dGUoYHN0YXRlJHtzdGF0ZX1gLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZi5wYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5wYXJ0LnJlbW92ZShgc3RhdGUke3N0YXRlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWYudG9nZ2xlQXR0cmlidXRlKGBzdGF0ZSR7c3RhdGV9YCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmLnBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5wYXJ0LnJlbW92ZShgc3RhdGUke3N0YXRlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICAgICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gICAgICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgICAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgX0hUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9uX2VsZW1lbnRzO1xuICAgIGNsYXNzIEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9uIHtcbiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIF9IVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbl9lbGVtZW50cy5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0hUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9uX2VsZW1lbnRzLCBlbGVtZW50cywgXCJmXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgdGhpc1tpXSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCduYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpXSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0hUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9uX2VsZW1lbnRzLCBcImZcIikubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIFsoX0hUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9uX2VsZW1lbnRzID0gbmV3IFdlYWtNYXAoKSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb25fZWxlbWVudHMsIFwiZlwiKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbShpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tpXSA9PSBudWxsID8gbnVsbCA6IHRoaXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgbmFtZWRJdGVtKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW25hbWVdID09IG51bGwgPyBudWxsIDogdGhpc1tuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhdGNoRm9ybVByb3RvdHlwZSgpIHtcbiAgICAgICAgY29uc3QgY2hlY2tWYWxpZGl0eSA9IEhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUuY2hlY2tWYWxpZGl0eTtcbiAgICAgICAgSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5jaGVja1ZhbGlkaXR5ID0gY2hlY2tWYWxpZGl0eU92ZXJyaWRlO1xuICAgICAgICBjb25zdCByZXBvcnRWYWxpZGl0eSA9IEhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUucmVwb3J0VmFsaWRpdHk7XG4gICAgICAgIEhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUucmVwb3J0VmFsaWRpdHkgPSByZXBvcnRWYWxpZGl0eU92ZXJyaWRlO1xuICAgICAgICBmdW5jdGlvbiBjaGVja1ZhbGlkaXR5T3ZlcnJpZGUoLi4uYXJncykge1xuICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gY2hlY2tWYWxpZGl0eS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1NZXRob2QodGhpcywgcmV0dXJuVmFsdWUsICdjaGVja1ZhbGlkaXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwb3J0VmFsaWRpdHlPdmVycmlkZSguLi5hcmdzKSB7XG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSByZXBvcnRWYWxpZGl0eS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1NZXRob2QodGhpcywgcmV0dXJuVmFsdWUsICdyZXBvcnRWYWxpZGl0eScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZ2V0IH0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxGb3JtRWxlbWVudC5wcm90b3R5cGUsICdlbGVtZW50cycpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZSwgJ2VsZW1lbnRzJywge1xuICAgICAgICAgICAgZ2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbHlmaWxsZWRFbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsZW1lbnRzTWFwLmdldCh0aGlzKSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHlmaWxsZWRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBvcmRlcmVkRWxlbWVudHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzKS5jb25jYXQocG9seWZpbGxlZEVsZW1lbnRzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDIgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbihvcmRlcmVkRWxlbWVudHMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xhc3MgRWxlbWVudEludGVybmFscyB7XG4gICAgICAgIHN0YXRpYyBnZXQgaXNQb2x5ZmlsbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IocmVmKSB7XG4gICAgICAgICAgICBpZiAoIXJlZiB8fCAhcmVmLnRhZ05hbWUgfHwgcmVmLnRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gcmVmLmdldFJvb3ROb2RlKCk7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGl0eSA9IG5ldyBWYWxpZGl0eVN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlcyA9IG5ldyBDdXN0b21TdGF0ZVNldChyZWYpO1xuICAgICAgICAgICAgcmVmTWFwLnNldCh0aGlzLCByZWYpO1xuICAgICAgICAgICAgdmFsaWRpdHlNYXAuc2V0KHRoaXMsIHZhbGlkaXR5KTtcbiAgICAgICAgICAgIGludGVybmFsc01hcC5zZXQocmVmLCB0aGlzKTtcbiAgICAgICAgICAgIGluaXRBb20ocmVmLCB0aGlzKTtcbiAgICAgICAgICAgIGluaXRSZWYocmVmLCB0aGlzKTtcbiAgICAgICAgICAgIE9iamVjdC5zZWFsKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIGRlZmVyVXBncmFkZShyb290Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHJlZk1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICB0aHJvd0lmTm90Rm9ybUFzc29jaWF0ZWQocmVmLCBgRmFpbGVkIHRvIGV4ZWN1dGUgJ2NoZWNrVmFsaWRpdHknIG9uICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWxsVmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbGlkaXR5ID0gdmFsaWRpdHlNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkaXR5RXZlbnQgPSBuZXcgRXZlbnQoJ2ludmFsaWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wb3NlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWYuZGlzcGF0Y2hFdmVudCh2YWxpZGl0eUV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eS52YWxpZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZm9ybSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHJlZk1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICB0aHJvd0lmTm90Rm9ybUFzc29jaWF0ZWQocmVmLCBgRmFpbGVkIHRvIHJlYWQgdGhlICdmb3JtJyBwcm9wZXJ0eSBmcm9tICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIGxldCBmb3JtO1xuICAgICAgICAgICAgaWYgKHJlZi5jb25zdHJ1Y3RvclsnZm9ybUFzc29jaWF0ZWQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvcm0gPSBmaW5kUGFyZW50Rm9ybShyZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGxhYmVscygpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHJlZk1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICB0aHJvd0lmTm90Rm9ybUFzc29jaWF0ZWQocmVmLCBgRmFpbGVkIHRvIHJlYWQgdGhlICdsYWJlbHMnIHByb3BlcnR5IGZyb20gJ0VsZW1lbnRJbnRlcm5hbHMnOiBUaGUgdGFyZ2V0IGVsZW1lbnQgaXMgbm90IGEgZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50LmApO1xuICAgICAgICAgICAgY29uc3QgaWQgPSByZWYuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICAgICAgY29uc3QgaG9zdFJvb3QgPSByZWYuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgICAgIGlmIChob3N0Um9vdCAmJiBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3N0Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbZm9yPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHJlZk1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICB0aHJvd0lmTm90Rm9ybUFzc29jaWF0ZWQocmVmLCBgRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlcG9ydFZhbGlkaXR5JyBvbiAnRWxlbWVudEludGVybmFscyc6IFRoZSB0YXJnZXQgZWxlbWVudCBpcyBub3QgYSBmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnQuYCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lsbFZhbGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWxpZCA9IHRoaXMuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gdmFsaWRhdGlvbkFuY2hvck1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICBpZiAoYW5jaG9yICYmICFyZWYuY29uc3RydWN0b3JbJ2Zvcm1Bc3NvY2lhdGVkJ10pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKGBGYWlsZWQgdG8gZXhlY3V0ZSAncmVwb3J0VmFsaWRpdHknIG9uICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdmFsaWQgJiYgYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgcmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgYW5jaG9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Rm9ybVZhbHVlKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSByZWZNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdEZvcm1Bc3NvY2lhdGVkKHJlZiwgYEZhaWxlZCB0byBleGVjdXRlICdzZXRGb3JtVmFsdWUnIG9uICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIHJlbW92ZUhpZGRlbklucHV0cyh0aGlzKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICEodmFsdWUgaW5zdGFuY2VvZiBGb3JtRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVmLmdldEF0dHJpYnV0ZSgnbmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbklucHV0ID0gY3JlYXRlSGlkZGVuSW5wdXQocmVmLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHZhbHVlKS5yZXZlcnNlKCkuZm9yRWFjaCgoW2Zvcm1EYXRhS2V5LCBmb3JtRGF0YVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1EYXRhVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW5JbnB1dCA9IGNyZWF0ZUhpZGRlbklucHV0KHJlZiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5JbnB1dC5uYW1lID0gZm9ybURhdGFLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9IGZvcm1EYXRhVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZlZhbHVlTWFwLnNldChyZWYsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRWYWxpZGl0eSh2YWxpZGl0eUNoYW5nZXMsIHZhbGlkYXRpb25NZXNzYWdlLCBhbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHJlZk1hcC5nZXQodGhpcyk7XG4gICAgICAgICAgICB0aHJvd0lmTm90Rm9ybUFzc29jaWF0ZWQocmVmLCBgRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldFZhbGlkaXR5JyBvbiAnRWxlbWVudEludGVybmFscyc6IFRoZSB0YXJnZXQgZWxlbWVudCBpcyBub3QgYSBmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnQuYCk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkaXR5Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFxcJ3NldFZhbGlkaXR5XFwnIG9uIFxcJ0VsZW1lbnRJbnRlcm5hbHNcXCc6IDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkYXRpb25BbmNob3JNYXAuc2V0KHRoaXMsIGFuY2hvcik7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGl0eSA9IHZhbGlkaXR5TWFwLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkaXR5Q2hhbmdlc09iaiA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsaWRpdHlDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRpdHlDaGFuZ2VzT2JqW2tleV0gPSB2YWxpZGl0eUNoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWxpZGl0eUNoYW5nZXNPYmopLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNldFZhbGlkKHZhbGlkaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB2YWxpZGl0eSksIHZhbGlkaXR5Q2hhbmdlc09iaik7XG4gICAgICAgICAgICBkZWxldGUgY2hlY2sudmFsaWQ7XG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkIH0gPSByZWNvbmNpbGVWYWxpZGl0eSh2YWxpZGl0eSwgY2hlY2ssIHRoaXMuZm9ybSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkICYmICF2YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oYEZhaWxlZCB0byBleGVjdXRlICdzZXRWYWxpZGl0eScgb24gJ0VsZW1lbnRJbnRlcm5hbHMnOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNob3VsZCBub3QgYmUgZW1wdHkgaWYgb25lIG9yIG1vcmUgZmxhZ3MgaW4gdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSB0cnVlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VNYXAuc2V0KHRoaXMsIHZhbGlkID8gJycgOiB2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVmLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVmLnRvZ2dsZUF0dHJpYnV0ZSgnaW50ZXJuYWxzLWludmFsaWQnLCAhdmFsaWQpO1xuICAgICAgICAgICAgICAgIHJlZi50b2dnbGVBdHRyaWJ1dGUoJ2ludGVybmFscy12YWxpZCcsIHZhbGlkKTtcbiAgICAgICAgICAgICAgICByZWYuc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCBgJHshdmFsaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWxpZGl0eVVwZ3JhZGVNYXAuc2V0KHJlZiwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSByZWZNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IHNoYWRvd1Jvb3RNYXAuZ2V0KHJlZik7XG4gICAgICAgICAgICBpZiAoc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaGFkb3dSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCkge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gcmVmTWFwLmdldCh0aGlzKTtcbiAgICAgICAgICAgIHRocm93SWZOb3RGb3JtQXNzb2NpYXRlZChyZWYsIGBGYWlsZWQgdG8gcmVhZCB0aGUgJ3ZhbGlkYXRpb25NZXNzYWdlJyBwcm9wZXJ0eSBmcm9tICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uTWVzc2FnZU1hcC5nZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHZhbGlkaXR5KCkge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gcmVmTWFwLmdldCh0aGlzKTtcbiAgICAgICAgICAgIHRocm93SWZOb3RGb3JtQXNzb2NpYXRlZChyZWYsIGBGYWlsZWQgdG8gcmVhZCB0aGUgJ3ZhbGlkaXR5JyBwcm9wZXJ0eSBmcm9tICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkaXR5ID0gdmFsaWRpdHlNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkaXR5O1xuICAgICAgICB9XG4gICAgICAgIGdldCB3aWxsVmFsaWRhdGUoKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSByZWZNYXAuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdEZvcm1Bc3NvY2lhdGVkKHJlZiwgYEZhaWxlZCB0byByZWFkIHRoZSAnd2lsbFZhbGlkYXRlJyBwcm9wZXJ0eSBmcm9tICdFbGVtZW50SW50ZXJuYWxzJzogVGhlIHRhcmdldCBlbGVtZW50IGlzIG5vdCBhIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgICAgICAgIGlmICgocmVmLmRpc2FibGVkIHx8IHJlZi5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHx8XG4gICAgICAgICAgICAgICAgcmVmLmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzRWxlbWVudEludGVybmFsc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cuRWxlbWVudEludGVybmFscyB8fCAhSFRNTEVsZW1lbnQucHJvdG90eXBlLmF0dGFjaEludGVybmFscykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzIEVsZW1lbnRJbnRlcm5hbHNGZWF0dXJlRGV0ZWN0aW9uIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZG9tTmFtZSA9IGBlbGVtZW50LWludGVybmFscy1mZWF0dXJlLWRldGVjdGlvbi0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1teYS16XSsvZywgJycpfWA7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShyYW5kb21OYW1lLCBFbGVtZW50SW50ZXJuYWxzRmVhdHVyZURldGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVEZXRlY3Rpb25FbGVtZW50ID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNGZWF0dXJlRGV0ZWN0aW9uKCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnc2hhZG93Um9vdCcsXG4gICAgICAgICAgICAnZm9ybScsXG4gICAgICAgICAgICAnd2lsbFZhbGlkYXRlJyxcbiAgICAgICAgICAgICd2YWxpZGl0eScsXG4gICAgICAgICAgICAndmFsaWRhdGlvbk1lc3NhZ2UnLFxuICAgICAgICAgICAgJ2xhYmVscycsXG4gICAgICAgICAgICAnc2V0Rm9ybVZhbHVlJyxcbiAgICAgICAgICAgICdzZXRWYWxpZGl0eScsXG4gICAgICAgICAgICAnY2hlY2tWYWxpZGl0eScsXG4gICAgICAgICAgICAncmVwb3J0VmFsaWRpdHknXG4gICAgICAgIF0uZXZlcnkocHJvcCA9PiBwcm9wIGluIGZlYXR1cmVEZXRlY3Rpb25FbGVtZW50LmludGVybmFscyk7XG4gICAgfVxuICAgIGxldCBoYXNFbGVtZW50SW50ZXJuYWxzUG9seWZpbGxCZWVuQXBwbGllZCA9IGZhbHNlO1xuICAgIGxldCBoYXNDdXN0b21TdGF0ZVNldFBvbHlmaWxsQmVlbkFwcGxpZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBmb3JjZUN1c3RvbVN0YXRlU2V0UG9seWZpbGwoYXR0YWNoSW50ZXJuYWxzKSB7XG4gICAgICAgIGlmIChoYXNDdXN0b21TdGF0ZVNldFBvbHlmaWxsQmVlbkFwcGxpZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDdXN0b21TdGF0ZVNldFBvbHlmaWxsQmVlbkFwcGxpZWQgPSB0cnVlO1xuICAgICAgICB3aW5kb3cuQ3VzdG9tU3RhdGVTZXQgPSBDdXN0b21TdGF0ZVNldDtcbiAgICAgICAgaWYgKGF0dGFjaEludGVybmFscykge1xuICAgICAgICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLmF0dGFjaEludGVybmFscyA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gYXR0YWNoSW50ZXJuYWxzLmNhbGwodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxzLnN0YXRlcyA9IG5ldyBDdXN0b21TdGF0ZVNldCh0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JjZUVsZW1lbnRJbnRlcm5hbHNQb2x5ZmlsbChmb3JjZUN1c3RvbVN0YXRlU2V0ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoaGFzRWxlbWVudEludGVybmFsc1BvbHlmaWxsQmVlbkFwcGxpZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoYXNFbGVtZW50SW50ZXJuYWxzUG9seWZpbGxCZWVuQXBwbGllZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgd2luZG93LkVsZW1lbnRJbnRlcm5hbHMgPSBFbGVtZW50SW50ZXJuYWxzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lID0gQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5LnByb3RvdHlwZS5kZWZpbmU7XG4gICAgICAgICAgICBDdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLmRlZmluZSA9IGZ1bmN0aW9uIChuYW1lLCBjb25zdHJ1Y3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5mb3JtQXNzb2NpYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0ZWRDYWxsYmFjayA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0ZWRDYWxsYmFja01hcC5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRDYWxsYmFja01hcC5zZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc2FibGVkKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0ZWRDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2suYXBwbHkodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGdyYWRlSW50ZXJuYWxzKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZpbmUuY2FsbCh0aGlzLCBuYW1lLCBjb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoSW50ZXJuYWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSAnYXR0YWNoSW50ZXJuYWxzJyBvbiAnSFRNTEVsZW1lbnQnOiBVbmFibGUgdG8gYXR0YWNoIEVsZW1lbnRJbnRlcm5hbHMgdG8gbm9uLWN1c3RvbSBlbGVtZW50cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsc01hcC5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgRE9NRXhjZXB0aW9uOiBGYWlsZWQgdG8gZXhlY3V0ZSAnYXR0YWNoSW50ZXJuYWxzJyBvbiAnSFRNTEVsZW1lbnQnOiBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudEludGVybmFscyh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZnVuY3Rpb24gYXR0YWNoU2hhZG93T2JzZXJ2ZXIoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBhdHRhY2hTaGFkb3cuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgc2hhZG93Um9vdE1hcC5zZXQodGhpcywgc2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJFeGlzdHMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9ic2VydmVyQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIG9ic2VydmVyQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoc2hhZG93Um9vdCwgb2JzZXJ2ZXJDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0hvc3RzTWFwLnNldCh0aGlzLCBvYnNlcnZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzaGFkb3dSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXR0YWNoU2hhZG93ID0gRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93O1xuICAgICAgICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93ID0gYXR0YWNoU2hhZG93T2JzZXJ2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJFeGlzdHMoKSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob2JzZXJ2ZXJDYWxsYmFjayk7XG4gICAgICAgICAgICBkb2N1bWVudE9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBvYnNlcnZlckNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBIVE1MRm9ybUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXRjaEZvcm1Qcm90b3R5cGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2VDdXN0b21TdGF0ZVNldCB8fFxuICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgIXdpbmRvdy5DdXN0b21TdGF0ZVNldCkpIHtcbiAgICAgICAgICAgIGZvcmNlQ3VzdG9tU3RhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNDZVBvbHlmaWxsID0gISFjdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrO1xuICAgIGlmICghaXNDZVBvbHlmaWxsKSB7XG4gICAgICAgIGlmICghaXNFbGVtZW50SW50ZXJuYWxzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIGZvcmNlRWxlbWVudEludGVybmFsc1BvbHlmaWxsKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmICF3aW5kb3cuQ3VzdG9tU3RhdGVTZXQpIHtcbiAgICAgICAgICAgIGZvcmNlQ3VzdG9tU3RhdGVTZXRQb2x5ZmlsbChIVE1MRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoSW50ZXJuYWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4cG9ydHMuZm9yY2VDdXN0b21TdGF0ZVNldFBvbHlmaWxsID0gZm9yY2VDdXN0b21TdGF0ZVNldFBvbHlmaWxsO1xuICAgIGV4cG9ydHMuZm9yY2VFbGVtZW50SW50ZXJuYWxzUG9seWZpbGwgPSBmb3JjZUVsZW1lbnRJbnRlcm5hbHNQb2x5ZmlsbDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICByZXR1cm4gZXhwb3J0cztcblxufSkoe30pO1xuIiwgIi8qIVxuICogTUlUIExpY2Vuc2VcbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMjQgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuICogXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKiBcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqIFxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IEFSUkFZX0JVRkZFUl9OQU1FID0gXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiO1xuY2xhc3MgQnVmZmVyU291cmNlQ29udmVydGVyIHtcbiAgICBzdGF0aWMgaXNBcnJheUJ1ZmZlcihkYXRhKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSkgPT09IEFSUkFZX0JVRkZFUl9OQU1FO1xuICAgIH1cbiAgICBzdGF0aWMgdG9BcnJheUJ1ZmZlcihkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmJ5dGVMZW5ndGggPT09IGRhdGEuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5ieXRlT2Zmc2V0ID09PSAwICYmIGRhdGEuYnl0ZUxlbmd0aCA9PT0gZGF0YS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRvVWludDhBcnJheShkYXRhLmJ1ZmZlcilcbiAgICAgICAgICAgIC5zbGljZShkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZU9mZnNldCArIGRhdGEuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgIC5idWZmZXI7XG4gICAgfVxuICAgIHN0YXRpYyB0b1VpbnQ4QXJyYXkoZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1ZpZXcoZGF0YSwgVWludDhBcnJheSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b1ZpZXcoZGF0YSwgdHlwZSkge1xuICAgICAgICBpZiAoZGF0YS5jb25zdHJ1Y3RvciA9PT0gdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0eXBlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHR5cGUoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XG4gICAgfVxuICAgIHN0YXRpYyBpc0J1ZmZlclNvdXJjZShkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpXG4gICAgICAgICAgICB8fCB0aGlzLmlzQXJyYXlCdWZmZXIoZGF0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0FycmF5QnVmZmVyVmlldyhkYXRhKSB7XG4gICAgICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSlcbiAgICAgICAgICAgIHx8IChkYXRhICYmIHRoaXMuaXNBcnJheUJ1ZmZlcihkYXRhLmJ1ZmZlcikpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNFcXVhbChhLCBiKSB7XG4gICAgICAgIGNvbnN0IGFWaWV3ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShhKTtcbiAgICAgICAgY29uc3QgYlZpZXcgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGIpO1xuICAgICAgICBpZiAoYVZpZXcubGVuZ3RoICE9PSBiVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFWaWV3W2ldICE9PSBiVmlld1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3RhdGljIGNvbmNhdCguLi5hcmdzKSB7XG4gICAgICAgIGxldCBidWZmZXJzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSAmJiAhKGFyZ3NbMV0gaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgICAgICAgIGJ1ZmZlcnMgPSBhcmdzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBidWZmZXJzID0gYXJnc1swXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBhcmdzLnNsaWNlKDAsIGFyZ3MubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzID0gYXJncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHNpemUgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIHJlcy5zZXQodmlldywgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSB2aWV3Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnc1thcmdzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVmlldyhyZXMsIGFyZ3NbYXJncy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5idWZmZXI7XG4gICAgfVxufVxuXG5jb25zdCBTVFJJTkdfVFlQRSA9IFwic3RyaW5nXCI7XG5jb25zdCBIRVhfUkVHRVggPSAvXlswLTlhLWZcXHNdKyQvaTtcbmNvbnN0IEJBU0U2NF9SRUdFWCA9IC9eKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kLztcbmNvbnN0IEJBU0U2NFVSTF9SRUdFWCA9IC9eW2EtekEtWjAtOS1fXSskLztcbmNsYXNzIFV0ZjhDb252ZXJ0ZXIge1xuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgY29uc3QgcyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XG4gICAgICAgIGNvbnN0IHVpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB1aW50QXJyYXlbaV0gPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpbnRBcnJheS5idWZmZXI7XG4gICAgfVxuICAgIHN0YXRpYyB0b1N0cmluZyhidWZmZXIpIHtcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBsZXQgZW5jb2RlZFN0cmluZyA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlbmNvZGVkU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNvZGVkU3RyaW5nID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlbmNvZGVkU3RyaW5nKSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVkU3RyaW5nO1xuICAgIH1cbn1cbmNsYXNzIFV0ZjE2Q29udmVydGVyIHtcbiAgICBzdGF0aWMgdG9TdHJpbmcoYnVmZmVyLCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgbGV0IHJlcyA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZGF0YVZpZXcuZ2V0VWludDE2KGksIGxpdHRsZUVuZGlhbik7XG4gICAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0LCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgQXJyYXlCdWZmZXIodGV4dC5sZW5ndGggKiAyKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcocmVzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYoaSAqIDIsIHRleHQuY2hhckNvZGVBdChpKSwgbGl0dGxlRW5kaWFuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cbmNsYXNzIENvbnZlcnQge1xuICAgIHN0YXRpYyBpc0hleChkYXRhKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gU1RSSU5HX1RZUEVcbiAgICAgICAgICAgICYmIEhFWF9SRUdFWC50ZXN0KGRhdGEpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNCYXNlNjQoZGF0YSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFNUUklOR19UWVBFXG4gICAgICAgICAgICAmJiBCQVNFNjRfUkVHRVgudGVzdChkYXRhKTtcbiAgICB9XG4gICAgc3RhdGljIGlzQmFzZTY0VXJsKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBTVFJJTkdfVFlQRVxuICAgICAgICAgICAgJiYgQkFTRTY0VVJMX1JFR0VYLnRlc3QoZGF0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBUb1N0cmluZyhidWZmZXIsIGVuYyA9IFwidXRmOFwiKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgc3dpdGNoIChlbmMudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub1V0ZjhTdHJpbmcoYnVmKTtcbiAgICAgICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0JpbmFyeShidWYpO1xuICAgICAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRvSGV4KGJ1Zik7XG4gICAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CYXNlNjQoYnVmKTtcbiAgICAgICAgICAgIGNhc2UgXCJiYXNlNjR1cmxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0Jhc2U2NFVybChidWYpO1xuICAgICAgICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmLCB0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2YgZW5jb2RpbmcgJyR7ZW5jfSdgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgRnJvbVN0cmluZyhzdHIsIGVuYyA9IFwidXRmOFwiKSB7XG4gICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZW5jLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbVV0ZjhTdHJpbmcoc3RyKTtcbiAgICAgICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tQmluYXJ5KHN0cik7XG4gICAgICAgICAgICBjYXNlIFwiaGV4XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUhleChzdHIpO1xuICAgICAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZyb21CYXNlNjQoc3RyKTtcbiAgICAgICAgICAgIGNhc2UgXCJiYXNlNjR1cmxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tQmFzZTY0VXJsKHN0cik7XG4gICAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci5mcm9tU3RyaW5nKHN0ciwgdHJ1ZSk7XG4gICAgICAgICAgICBjYXNlIFwidXRmMTZcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmJlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLmZyb21TdHJpbmcoc3RyKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2YgZW5jb2RpbmcgJyR7ZW5jfSdgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgVG9CYXNlNjQoYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgaWYgKHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLlRvU3RyaW5nKGJ1ZiwgXCJiaW5hcnlcIik7XG4gICAgICAgICAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZikudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEZyb21CYXNlNjQoYmFzZTY0KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U3RyaW5nKGJhc2U2NCk7XG4gICAgICAgIGlmICghZm9ybWF0dGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQ29udmVydC5pc0Jhc2U2NChmb3JtYXR0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgJ2Jhc2U2NFRleHQnIGlzIG5vdCBCYXNlNjQgZW5jb2RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF0b2IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkZyb21CaW5hcnkoYXRvYihmb3JtYXR0ZWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShmb3JtYXR0ZWQsIFwiYmFzZTY0XCIpKS5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEZyb21CYXNlNjRVcmwoYmFzZTY0dXJsKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U3RyaW5nKGJhc2U2NHVybCk7XG4gICAgICAgIGlmICghZm9ybWF0dGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQ29udmVydC5pc0Jhc2U2NFVybChmb3JtYXR0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgJ2Jhc2U2NHVybCcgaXMgbm90IEJhc2U2NFVybCBlbmNvZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkZyb21CYXNlNjQodGhpcy5CYXNlNjRQYWRkaW5nKGZvcm1hdHRlZC5yZXBsYWNlKC9cXC0vZywgXCIrXCIpLnJlcGxhY2UoL1xcXy9nLCBcIi9cIikpKTtcbiAgICB9XG4gICAgc3RhdGljIFRvQmFzZTY0VXJsKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuVG9CYXNlNjQoZGF0YSkucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoL1xcPS9nLCBcIlwiKTtcbiAgICB9XG4gICAgc3RhdGljIEZyb21VdGY4U3RyaW5nKHRleHQsIGVuY29kaW5nID0gQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcpIHtcbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgY2FzZSBcImFzY2lpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJpbmFyeSh0ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjhDb252ZXJ0ZXIuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XG4gICAgICAgICAgICBjYXNlIFwidXNjMlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci5mcm9tU3RyaW5nKHRleHQsIHRydWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBlbmNvZGluZyAnJHtlbmNvZGluZ30nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFRvVXRmOFN0cmluZyhidWZmZXIsIGVuY29kaW5nID0gQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcpIHtcbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgY2FzZSBcImFzY2lpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CaW5hcnkoYnVmZmVyKTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjhDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyKTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyKTtcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XG4gICAgICAgICAgICBjYXNlIFwidXNjMlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci50b1N0cmluZyhidWZmZXIsIHRydWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBlbmNvZGluZyAnJHtlbmNvZGluZ30nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEZyb21CaW5hcnkodGV4dCkge1xuICAgICAgICBjb25zdCBzdHJpbmdMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzdWx0VmlldyA9IG5ldyBVaW50OEFycmF5KHN0cmluZ0xlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFZpZXdbaV0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFZpZXcuYnVmZmVyO1xuICAgIH1cbiAgICBzdGF0aWMgVG9CaW5hcnkoYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgbGV0IHJlcyA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHN0YXRpYyBUb0hleChidWZmZXIpIHtcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgY29uc3QgbGVuID0gYnVmLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYnl0ZSA9IGJ1ZltpXTtcbiAgICAgICAgICAgIGlmIChieXRlIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gYnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3RhdGljIEZyb21IZXgoaGV4U3RyaW5nKSB7XG4gICAgICAgIGxldCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFN0cmluZyhoZXhTdHJpbmcpO1xuICAgICAgICBpZiAoIWZvcm1hdHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUNvbnZlcnQuaXNIZXgoZm9ybWF0dGVkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdoZXhTdHJpbmcnIGlzIG5vdCBIRVggZW5jb2RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0dGVkLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZCA9IGAwJHtmb3JtYXR0ZWR9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShmb3JtYXR0ZWQubGVuZ3RoIC8gMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZm9ybWF0dGVkLnNsaWNlKGksIGkgKyAyKTtcbiAgICAgICAgICAgIHJlc1tpIC8gMl0gPSBwYXJzZUludChjLCAxNik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5idWZmZXI7XG4gICAgfVxuICAgIHN0YXRpYyBUb1V0ZjE2U3RyaW5nKGJ1ZmZlciwgbGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLnRvU3RyaW5nKGJ1ZmZlciwgbGl0dGxlRW5kaWFuKTtcbiAgICB9XG4gICAgc3RhdGljIEZyb21VdGYxNlN0cmluZyh0ZXh0LCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyh0ZXh0LCBsaXR0bGVFbmRpYW4pO1xuICAgIH1cbiAgICBzdGF0aWMgQmFzZTY0UGFkZGluZyhiYXNlNjQpIHtcbiAgICAgICAgY29uc3QgcGFkQ291bnQgPSA0IC0gKGJhc2U2NC5sZW5ndGggJSA0KTtcbiAgICAgICAgaWYgKHBhZENvdW50IDwgNCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWRDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IFwiPVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlNjQ7XG4gICAgfVxuICAgIHN0YXRpYyBmb3JtYXRTdHJpbmcoZGF0YSkge1xuICAgICAgICByZXR1cm4gKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5yZXBsYWNlKC9bXFxuXFxyXFx0IF0vZywgXCJcIikpIHx8IFwiXCI7XG4gICAgfVxufVxuQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcgPSBcInV0ZjhcIjtcblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIGNvbnN0IHJlcyA9IGFyZ3VtZW50c1swXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvYmogPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY29tYmluZSguLi5idWYpIHtcbiAgICBjb25zdCB0b3RhbEJ5dGVMZW5ndGggPSBidWYubWFwKChpdGVtKSA9PiBpdGVtLmJ5dGVMZW5ndGgpLnJlZHVjZSgocHJldiwgY3VyKSA9PiBwcmV2ICsgY3VyKTtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICAgIGxldCBjdXJyZW50UG9zID0gMDtcbiAgICBidWYubWFwKChpdGVtKSA9PiBuZXcgVWludDhBcnJheShpdGVtKSkuZm9yRWFjaCgoYXJyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbTIgb2YgYXJyKSB7XG4gICAgICAgICAgICByZXNbY3VycmVudFBvcysrXSA9IGl0ZW0yO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5idWZmZXI7XG59XG5mdW5jdGlvbiBpc0VxdWFsKGJ5dGVzMSwgYnl0ZXMyKSB7XG4gICAgaWYgKCEoYnl0ZXMxICYmIGJ5dGVzMikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYnl0ZXMxLmJ5dGVMZW5ndGggIT09IGJ5dGVzMi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYjEgPSBuZXcgVWludDhBcnJheShieXRlczEpO1xuICAgIGNvbnN0IGIyID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzMS5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGIxW2ldICE9PSBiMltpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnRzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlcjtcbmV4cG9ydHMuQ29udmVydCA9IENvbnZlcnQ7XG5leHBvcnRzLmFzc2lnbiA9IGFzc2lnbjtcbmV4cG9ydHMuY29tYmluZSA9IGNvbWJpbmU7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xuIiwgIi8qIVxuIENvcHlyaWdodCAoYykgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuKi9cblxuZnVuY3Rpb24gZ2V0VVRDRGF0ZShkYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApKTtcclxufVxyXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzVmFsdWUocGFyYW1ldGVycywgbmFtZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBpZiAoKHBhcmFtZXRlcnMgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKF9hID0gcGFyYW1ldGVyc1tuYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGVmYXVsdFZhbHVlO1xyXG59XHJcbmZ1bmN0aW9uIGJ1ZmZlclRvSGV4Q29kZXMoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0ID0gMCwgaW5wdXRMZW5ndGggPSAoaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCAtIGlucHV0T2Zmc2V0KSwgaW5zZXJ0U3BhY2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgKG5ldyBVaW50OEFycmF5KGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IGl0ZW0udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQgKz0gc3RyO1xyXG4gICAgICAgIGlmIChpbnNlcnRTcGFjZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gXCIgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICBpZiAoIShpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dEJ1ZmZlciBtdXN0IGJlIFxcXCJBcnJheUJ1ZmZlclxcXCJcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRCdWZmZXIgaGFzIHplcm8gbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0T2Zmc2V0IDwgMCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dE9mZnNldCBsZXNzIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dExlbmd0aCA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRMZW5ndGggbGVzcyB0aGFuIHplcm9cIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoKGlucHV0QnVmZmVyLmJ5dGVMZW5ndGggLSBpbnB1dE9mZnNldCAtIGlucHV0TGVuZ3RoKSA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkIChpbmNvbnNpc3RlbnQgb2Zmc2V0IGFuZCBsZW5ndGggdmFsdWVzKVwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxGcm9tQmFzZShpbnB1dEJ1ZmZlciwgaW5wdXRCYXNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGlmIChpbnB1dEJ1ZmZlci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRCdWZmZXJbMF07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gKGlucHV0QnVmZmVyLmxlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHJlc3VsdCArPSBpbnB1dEJ1ZmZlclsoaW5wdXRCdWZmZXIubGVuZ3RoIC0gMSkgLSBpXSAqIE1hdGgucG93KDIsIGlucHV0QmFzZSAqIGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5mdW5jdGlvbiB1dGlsVG9CYXNlKHZhbHVlLCBiYXNlLCByZXNlcnZlZCA9ICgtMSkpIHtcclxuICAgIGNvbnN0IGludGVybmFsUmVzZXJ2ZWQgPSByZXNlcnZlZDtcclxuICAgIGxldCBpbnRlcm5hbFZhbHVlID0gdmFsdWU7XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGxldCBiaWdnZXN0ID0gTWF0aC5wb3coMiwgYmFzZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDg7IGkrKykge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IGJpZ2dlc3QpIHtcclxuICAgICAgICAgICAgbGV0IHJldEJ1ZjtcclxuICAgICAgICAgICAgaWYgKGludGVybmFsUmVzZXJ2ZWQgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoaSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsUmVzZXJ2ZWQgPCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXJyYXlCdWZmZXIoMCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKGludGVybmFsUmVzZXJ2ZWQpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW50ZXJuYWxSZXNlcnZlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IChpIC0gMSk7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNpcyA9IE1hdGgucG93KDIsIGogKiBiYXNlKTtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbcmVzdWx0IC0gaiAtIDFdID0gTWF0aC5mbG9vcihpbnRlcm5hbFZhbHVlIC8gYmFzaXMpO1xyXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxWYWx1ZSAtPSAocmV0Vmlld1tyZXN1bHQgLSBqIC0gMV0pICogYmFzaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmlnZ2VzdCAqPSBNYXRoLnBvdygyLCBiYXNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbn1cclxuZnVuY3Rpb24gdXRpbENvbmNhdEJ1ZiguLi5idWZmZXJzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcclxuICAgICAgICBvdXRwdXRMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIob3V0cHV0TGVuZ3RoKTtcclxuICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgIHJldFZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIHByZXZMZW5ndGgpO1xyXG4gICAgICAgIHByZXZMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0QnVmO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxDb25jYXRWaWV3KC4uLnZpZXdzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAoY29uc3QgdmlldyBvZiB2aWV3cykge1xyXG4gICAgICAgIG91dHB1dExlbmd0aCArPSB2aWV3Lmxlbmd0aDtcclxuICAgIH1cclxuICAgIGNvbnN0IHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihvdXRwdXRMZW5ndGgpO1xyXG4gICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgICByZXRWaWV3LnNldCh2aWV3LCBwcmV2TGVuZ3RoKTtcclxuICAgICAgICBwcmV2TGVuZ3RoICs9IHZpZXcubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZpZXc7XHJcbn1cclxuZnVuY3Rpb24gdXRpbERlY29kZVRDKCkge1xyXG4gICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleCk7XHJcbiAgICBpZiAodGhpcy52YWx1ZUhleC5ieXRlTGVuZ3RoID49IDIpIHtcclxuICAgICAgICBjb25zdCBjb25kaXRpb24xID0gKGJ1ZlswXSA9PT0gMHhGRikgJiYgKGJ1ZlsxXSAmIDB4ODApO1xyXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbjIgPSAoYnVmWzBdID09PSAweDAwKSAmJiAoKGJ1ZlsxXSAmIDB4ODApID09PSAweDAwKTtcclxuICAgICAgICBpZiAoY29uZGl0aW9uMSB8fCBjb25kaXRpb24yKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBmb3JtYXRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgYmlnSW50QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXguYnl0ZUxlbmd0aCk7XHJcbiAgICBjb25zdCBiaWdJbnRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYmlnSW50QnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZUhleC5ieXRlTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBiaWdJbnRWaWV3W2ldID0gMDtcclxuICAgIH1cclxuICAgIGJpZ0ludFZpZXdbMF0gPSAoYnVmWzBdICYgMHg4MCk7XHJcbiAgICBjb25zdCBiaWdJbnQgPSB1dGlsRnJvbUJhc2UoYmlnSW50VmlldywgOCk7XHJcbiAgICBjb25zdCBzbWFsbEludEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGgpO1xyXG4gICAgY29uc3Qgc21hbGxJbnRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc21hbGxJbnRCdWZmZXIpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGg7IGorKykge1xyXG4gICAgICAgIHNtYWxsSW50Vmlld1tqXSA9IGJ1ZltqXTtcclxuICAgIH1cclxuICAgIHNtYWxsSW50Vmlld1swXSAmPSAweDdGO1xyXG4gICAgY29uc3Qgc21hbGxJbnQgPSB1dGlsRnJvbUJhc2Uoc21hbGxJbnRWaWV3LCA4KTtcclxuICAgIHJldHVybiAoc21hbGxJbnQgLSBiaWdJbnQpO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxFbmNvZGVUQyh2YWx1ZSkge1xyXG4gICAgY29uc3QgbW9kVmFsdWUgPSAodmFsdWUgPCAwKSA/ICh2YWx1ZSAqICgtMSkpIDogdmFsdWU7XHJcbiAgICBsZXQgYmlnSW50ID0gMTI4O1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCA4OyBpKyspIHtcclxuICAgICAgICBpZiAobW9kVmFsdWUgPD0gYmlnSW50KSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNtYWxsSW50ID0gYmlnSW50IC0gbW9kVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXRCdWYgPSB1dGlsVG9CYXNlKHNtYWxsSW50LCA4LCBpKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1swXSB8PSAweDgwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmV0QnVmID0gdXRpbFRvQmFzZShtb2RWYWx1ZSwgOCwgaSk7XHJcbiAgICAgICAgICAgIGxldCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgaWYgKHJldFZpZXdbMF0gJiAweDgwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wQnVmID0gcmV0QnVmLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFZpZXcgPSBuZXcgVWludDhBcnJheSh0ZW1wQnVmKTtcclxuICAgICAgICAgICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihyZXRCdWYuYnl0ZUxlbmd0aCArIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRlbXBCdWYuYnl0ZUxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0Vmlld1trICsgMV0gPSB0ZW1wVmlld1trXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSAweDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpZ0ludCAqPSBNYXRoLnBvdygyLCA4KTtcclxuICAgIH1cclxuICAgIHJldHVybiAobmV3IEFycmF5QnVmZmVyKDApKTtcclxufVxyXG5mdW5jdGlvbiBpc0VxdWFsQnVmZmVyKGlucHV0QnVmZmVyMSwgaW5wdXRCdWZmZXIyKSB7XHJcbiAgICBpZiAoaW5wdXRCdWZmZXIxLmJ5dGVMZW5ndGggIT09IGlucHV0QnVmZmVyMi5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmlldzEgPSBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcjEpO1xyXG4gICAgY29uc3QgdmlldzIgPSBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcjIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3MS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh2aWV3MVtpXSAhPT0gdmlldzJbaV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIHBhZE51bWJlcihpbnB1dE51bWJlciwgZnVsbExlbmd0aCkge1xyXG4gICAgY29uc3Qgc3RyID0gaW5wdXROdW1iZXIudG9TdHJpbmcoMTApO1xyXG4gICAgaWYgKGZ1bGxMZW5ndGggPCBzdHIubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkaWYgPSBmdWxsTGVuZ3RoIC0gc3RyLmxlbmd0aDtcclxuICAgIGNvbnN0IHBhZGRpbmcgPSBuZXcgQXJyYXkoZGlmKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmOyBpKyspIHtcclxuICAgICAgICBwYWRkaW5nW2ldID0gXCIwXCI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWRkaW5nU3RyaW5nID0gcGFkZGluZy5qb2luKFwiXCIpO1xyXG4gICAgcmV0dXJuIHBhZGRpbmdTdHJpbmcuY29uY2F0KHN0cik7XHJcbn1cclxuY29uc3QgYmFzZTY0VGVtcGxhdGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XHJcbmNvbnN0IGJhc2U2NFVybFRlbXBsYXRlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fPVwiO1xyXG5mdW5jdGlvbiB0b0Jhc2U2NChpbnB1dCwgdXNlVXJsVGVtcGxhdGUgPSBmYWxzZSwgc2tpcFBhZGRpbmcgPSBmYWxzZSwgc2tpcExlYWRpbmdaZXJvcyA9IGZhbHNlKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgZmxhZzEgPSAwO1xyXG4gICAgbGV0IGZsYWcyID0gMDtcclxuICAgIGxldCBvdXRwdXQgPSBcIlwiO1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPSAodXNlVXJsVGVtcGxhdGUpID8gYmFzZTY0VXJsVGVtcGxhdGUgOiBiYXNlNjRUZW1wbGF0ZTtcclxuICAgIGlmIChza2lwTGVhZGluZ1plcm9zKSB7XHJcbiAgICAgICAgbGV0IG5vblplcm9Qb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbm9uWmVyb1Bvc2l0aW9uID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2Uobm9uWmVyb1Bvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICBpZiAoaSA+PSBpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZmxhZzEgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjaHIyID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgIGlmIChpID49IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmbGFnMiA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNocjMgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XHJcbiAgICAgICAgY29uc3QgZW5jMSA9IGNocjEgPj4gMjtcclxuICAgICAgICBjb25zdCBlbmMyID0gKChjaHIxICYgMHgwMykgPDwgNCkgfCAoY2hyMiA+PiA0KTtcclxuICAgICAgICBsZXQgZW5jMyA9ICgoY2hyMiAmIDB4MEYpIDw8IDIpIHwgKGNocjMgPj4gNik7XHJcbiAgICAgICAgbGV0IGVuYzQgPSBjaHIzICYgMHgzRjtcclxuICAgICAgICBpZiAoZmxhZzEgPT09IDEpIHtcclxuICAgICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChmbGFnMiA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgZW5jNCA9IDY0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChza2lwUGFkZGluZykge1xyXG4gICAgICAgICAgICBpZiAoZW5jMyA9PT0gNjQpIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmM0ID09PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMyl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMyl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jNCl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9IGAke3RlbXBsYXRlLmNoYXJBdChlbmMxKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMyKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMzKX0ke3RlbXBsYXRlLmNoYXJBdChlbmM0KX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn1cclxuZnVuY3Rpb24gZnJvbUJhc2U2NChpbnB1dCwgdXNlVXJsVGVtcGxhdGUgPSBmYWxzZSwgY3V0VGFpbFplcm9zID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlID0gKHVzZVVybFRlbXBsYXRlKSA/IGJhc2U2NFVybFRlbXBsYXRlIDogYmFzZTY0VGVtcGxhdGU7XHJcbiAgICBmdW5jdGlvbiBpbmRleE9mKHRvU2VhcmNoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQXQoaSkgPT09IHRvU2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiA2NDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRlc3QoaW5jb21pbmcpIHtcclxuICAgICAgICByZXR1cm4gKChpbmNvbWluZyA9PT0gNjQpID8gMHgwMCA6IGluY29taW5nKTtcclxuICAgIH1cclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBvdXRwdXQgPSBcIlwiO1xyXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBlbmMxID0gaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jMiA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jMyA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jNCA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgY2hyMSA9ICh0ZXN0KGVuYzEpIDw8IDIpIHwgKHRlc3QoZW5jMikgPj4gNCk7XHJcbiAgICAgICAgY29uc3QgY2hyMiA9ICgodGVzdChlbmMyKSAmIDB4MEYpIDw8IDQpIHwgKHRlc3QoZW5jMykgPj4gMik7XHJcbiAgICAgICAgY29uc3QgY2hyMyA9ICgodGVzdChlbmMzKSAmIDB4MDMpIDw8IDYpIHwgdGVzdChlbmM0KTtcclxuICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIxKTtcclxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY3V0VGFpbFplcm9zKSB7XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcclxuICAgICAgICBsZXQgbm9uWmVyb1N0YXJ0ID0gKC0xKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gKG91dHB1dExlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBpZiAob3V0cHV0LmNoYXJDb2RlQXQoaSkgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIG5vblplcm9TdGFydCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9uWmVyb1N0YXJ0ICE9PSAoLTEpKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgwLCBub25aZXJvU3RhcnQgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxufVxyXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nKGJ1ZmZlcikge1xyXG4gICAgbGV0IHJlc3VsdFN0cmluZyA9IFwiXCI7XHJcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB2aWV3KSB7XHJcbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0U3RyaW5nO1xyXG59XHJcbmZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyKSB7XHJcbiAgICBjb25zdCBzdHJpbmdMZW5ndGggPSBzdHIubGVuZ3RoO1xyXG4gICAgY29uc3QgcmVzdWx0QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHN0cmluZ0xlbmd0aCk7XHJcbiAgICBjb25zdCByZXN1bHRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0QnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByZXN1bHRWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0QnVmZmVyO1xyXG59XHJcbmNvbnN0IGxvZzIgPSBNYXRoLmxvZygyKTtcclxuZnVuY3Rpb24gbmVhcmVzdFBvd2VyT2YyKGxlbmd0aCkge1xyXG4gICAgY29uc3QgYmFzZSA9IChNYXRoLmxvZyhsZW5ndGgpIC8gbG9nMik7XHJcbiAgICBjb25zdCBmbG9vciA9IE1hdGguZmxvb3IoYmFzZSk7XHJcbiAgICBjb25zdCByb3VuZCA9IE1hdGgucm91bmQoYmFzZSk7XHJcbiAgICByZXR1cm4gKChmbG9vciA9PT0gcm91bmQpID8gZmxvb3IgOiByb3VuZCk7XHJcbn1cclxuZnVuY3Rpb24gY2xlYXJQcm9wcyhvYmplY3QsIHByb3BzQXJyYXkpIHtcclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wc0FycmF5KSB7XHJcbiAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wXTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBhcnJheUJ1ZmZlclRvU3RyaW5nLCBidWZmZXJUb0hleENvZGVzLCBjaGVja0J1ZmZlclBhcmFtcywgY2xlYXJQcm9wcywgZnJvbUJhc2U2NCwgZ2V0UGFyYW1ldGVyc1ZhbHVlLCBnZXRVVENEYXRlLCBpc0VxdWFsQnVmZmVyLCBuZWFyZXN0UG93ZXJPZjIsIHBhZE51bWJlciwgc3RyaW5nVG9BcnJheUJ1ZmZlciwgdG9CYXNlNjQsIHV0aWxDb25jYXRCdWYsIHV0aWxDb25jYXRWaWV3LCB1dGlsRGVjb2RlVEMsIHV0aWxFbmNvZGVUQywgdXRpbEZyb21CYXNlLCB1dGlsVG9CYXNlIH07XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdNTyBHbG9iYWxTaWduXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMiwgUGVjdWxpYXIgVmVudHVyZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBcbiAqIEF1dGhvciAyMDE0LTIwMTksIFl1cnkgU3Ryb3poZXZza3lcbiAqIFxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqIFxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiBcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vclxuICogICBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqIFxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICogXG4gKi9cblxuaW1wb3J0ICogYXMgcHZ0c3V0aWxzIGZyb20gJ3B2dHN1dGlscyc7XG5pbXBvcnQgKiBhcyBwdnV0aWxzIGZyb20gJ3B2dXRpbHMnO1xuXG5mdW5jdGlvbiBhc3NlcnRCaWdJbnQoKSB7XHJcbiAgICBpZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCBpcyBub3QgZGVmaW5lZC4gWW91ciBlbnZpcm9ubWVudCBkb2Vzbid0IGltcGxlbWVudCBCaWdJbnQuXCIpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNvbmNhdChidWZmZXJzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XHJcbiAgICAgICAgb3V0cHV0TGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBidWZmZXJzW2ldO1xyXG4gICAgICAgIHJldFZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIHByZXZMZW5ndGgpO1xyXG4gICAgICAgIHByZXZMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICBpZiAoIShpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0QnVmZmVyIG11c3QgYmUgJ1VpbnQ4QXJyYXknXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0QnVmZmVyIGhhcyB6ZXJvIGxlbmd0aFwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dE9mZnNldCA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRPZmZzZXQgbGVzcyB0aGFuIHplcm9cIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRMZW5ndGggPCAwKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0TGVuZ3RoIGxlc3MgdGhhbiB6ZXJvXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKChpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoIC0gaW5wdXRPZmZzZXQgLSBpbnB1dExlbmd0aCkgPCAwKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZCAoaW5jb25zaXN0ZW50IG9mZnNldCBhbmQgbGVuZ3RoIHZhbHVlcylcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxuXG5jbGFzcyBWaWV3V3JpdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcclxuICAgIH1cclxuICAgIHdyaXRlKGJ1Zikge1xyXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaChidWYpO1xyXG4gICAgfVxyXG4gICAgZmluYWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmNhdCh0aGlzLml0ZW1zKTtcclxuICAgIH1cclxufVxuXG5jb25zdCBwb3dlcnMyID0gW25ldyBVaW50OEFycmF5KFsxXSldO1xyXG5jb25zdCBkaWdpdHNTdHJpbmcgPSBcIjAxMjM0NTY3ODlcIjtcclxuY29uc3QgTkFNRSA9IFwibmFtZVwiO1xyXG5jb25zdCBWQUxVRV9IRVhfVklFVyA9IFwidmFsdWVIZXhWaWV3XCI7XHJcbmNvbnN0IElTX0hFWF9PTkxZID0gXCJpc0hleE9ubHlcIjtcclxuY29uc3QgSURfQkxPQ0sgPSBcImlkQmxvY2tcIjtcclxuY29uc3QgVEFHX0NMQVNTID0gXCJ0YWdDbGFzc1wiO1xyXG5jb25zdCBUQUdfTlVNQkVSID0gXCJ0YWdOdW1iZXJcIjtcclxuY29uc3QgSVNfQ09OU1RSVUNURUQgPSBcImlzQ29uc3RydWN0ZWRcIjtcclxuY29uc3QgRlJPTV9CRVIgPSBcImZyb21CRVJcIjtcclxuY29uc3QgVE9fQkVSID0gXCJ0b0JFUlwiO1xyXG5jb25zdCBMT0NBTCA9IFwibG9jYWxcIjtcclxuY29uc3QgRU1QVFlfU1RSSU5HID0gXCJcIjtcclxuY29uc3QgRU1QVFlfQlVGRkVSID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG5jb25zdCBFTVBUWV9WSUVXID0gbmV3IFVpbnQ4QXJyYXkoMCk7XHJcbmNvbnN0IEVORF9PRl9DT05URU5UX05BTUUgPSBcIkVuZE9mQ29udGVudFwiO1xyXG5jb25zdCBPQ1RFVF9TVFJJTkdfTkFNRSA9IFwiT0NURVQgU1RSSU5HXCI7XHJcbmNvbnN0IEJJVF9TVFJJTkdfTkFNRSA9IFwiQklUIFNUUklOR1wiO1xuXG5mdW5jdGlvbiBIZXhCbG9jayhCYXNlQ2xhc3MpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiBfYSA9IGNsYXNzIFNvbWUgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3NbMF0gfHwge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IChfYSA9IHBhcmFtcy5pc0hleE9ubHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBwYXJhbXMudmFsdWVIZXggPyBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwYXJhbXMudmFsdWVIZXgpIDogRU1QVFlfVklFVztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnZXQgdmFsdWVIZXgoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0IHZhbHVlSGV4KHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpIDogaW5wdXRCdWZmZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIHZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB2aWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBlbmRMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJaZXJvIGJ1ZmZlciBsZW5ndGhcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IGlucHV0TGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZExlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0b0JFUihzaXplT25seSA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRmxhZyAnaXNIZXhPbmx5JyBpcyBub3Qgc2V0LCBhYm9ydFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoID09PSB0aGlzLnZhbHVlSGV4Vmlldy5idWZmZXIuYnl0ZUxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMudmFsdWVIZXhWaWV3LmJ1ZmZlclxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdG9KU09OKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgICAgICAgICBpc0hleE9ubHk6IHRoaXMuaXNIZXhPbmx5LFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlSGV4OiBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlSGV4VmlldyksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfYS5OQU1FID0gXCJoZXhCbG9ja1wiLFxyXG4gICAgICAgIF9hO1xyXG59XG5cbmNsYXNzIExvY2FsQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgYmxvY2tMZW5ndGggPSAwLCBlcnJvciA9IEVNUFRZX1NUUklORywgd2FybmluZ3MgPSBbXSwgdmFsdWVCZWZvcmVEZWNvZGUgPSBFTVBUWV9WSUVXLCB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHRoaXMud2FybmluZ3MgPSB3YXJuaW5ncztcclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHZhbHVlQmVmb3JlRGVjb2RlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBibG9ja05hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTkFNRTtcclxuICAgIH1cclxuICAgIGdldCB2YWx1ZUJlZm9yZURlY29kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUJlZm9yZURlY29kZVZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWVCZWZvcmVEZWNvZGUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBibG9ja05hbWU6IHRoaXMuY29uc3RydWN0b3IuTkFNRSxcclxuICAgICAgICAgICAgYmxvY2tMZW5ndGg6IHRoaXMuYmxvY2tMZW5ndGgsXHJcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yLFxyXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5ncyxcclxuICAgICAgICAgICAgdmFsdWVCZWZvcmVEZWNvZGU6IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQmFzZUJsb2NrLk5BTUUgPSBcImJhc2VCbG9ja1wiO1xuXG5jbGFzcyBWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiVXNlciBuZWVkIHRvIG1ha2UgYSBzcGVjaWZpYyBmdW5jdGlvbiBpbiBhIGNsYXNzIHdoaWNoIGV4dGVuZHMgJ1ZhbHVlQmxvY2snXCIpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcIlVzZXIgbmVlZCB0byBtYWtlIGEgc3BlY2lmaWMgZnVuY3Rpb24gaW4gYSBjbGFzcyB3aGljaCBleHRlbmRzICdWYWx1ZUJsb2NrJ1wiKTtcclxuICAgIH1cclxufVxyXG5WYWx1ZUJsb2NrLk5BTUUgPSBcInZhbHVlQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxJZGVudGlmaWNhdGlvbkJsb2NrIGV4dGVuZHMgSGV4QmxvY2soTG9jYWxCYXNlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaWRCbG9jayA9IHt9LCB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZiAoaWRCbG9jaykge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IChfYSA9IGlkQmxvY2suaXNIZXhPbmx5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBpZEJsb2NrLnZhbHVlSGV4ID8gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaWRCbG9jay52YWx1ZUhleCkgOiBFTVBUWV9WSUVXO1xyXG4gICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKF9iID0gaWRCbG9jay50YWdDbGFzcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogLTE7XHJcbiAgICAgICAgICAgIHRoaXMudGFnTnVtYmVyID0gKF9jID0gaWRCbG9jay50YWdOdW1iZXIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IC0xO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSAoX2QgPSBpZEJsb2NrLmlzQ29uc3RydWN0ZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50YWdDbGFzcyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhZ051bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGZpcnN0T2N0ZXQgPSAwO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50YWdDbGFzcykge1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4MDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgZmlyc3RPY3RldCB8PSAweDQwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gMHg4MDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4QzA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIlVua25vd24gdGFnIGNsYXNzXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGVkKVxyXG4gICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4MjA7XHJcbiAgICAgICAgaWYgKHRoaXMudGFnTnVtYmVyIDwgMzEgJiYgIXRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSgxKTtcclxuICAgICAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG51bWJlciA9IHRoaXMudGFnTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyICY9IDB4MUY7XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSBmaXJzdE9jdGV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSGV4T25seSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMudGFnTnVtYmVyLCA3KTtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVuY29kZWRCdWYuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHNpemUgKyAxKTtcclxuICAgICAgICAgICAgcmV0Vmlld1swXSA9IChmaXJzdE9jdGV0IHwgMHgxRik7XHJcbiAgICAgICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gZW5jb2RlZFZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tzaXplXSA9IGVuY29kZWRWaWV3W3NpemUgLSAxXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgcmV0Vmlld1swXSA9IChmaXJzdE9jdGV0IHwgMHgxRik7XHJcbiAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGN1clZpZXcubGVuZ3RoIC0gMSk7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gY3VyVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aF0gPSBjdXJWaWV3W2N1clZpZXcubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIGlucHV0VmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiWmVybyBidWZmZXIgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFnQ2xhc3NNYXNrID0gaW50QnVmZmVyWzBdICYgMHhDMDtcclxuICAgICAgICBzd2l0Y2ggKHRhZ0NsYXNzTWFzaykge1xyXG4gICAgICAgICAgICBjYXNlIDB4MDA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMHg0MDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFnQ2xhc3MgPSAoMik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAweDgwOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWdDbGFzcyA9ICgzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDB4QzA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKDQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJVbmtub3duIHRhZyBjbGFzc1wiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSAoaW50QnVmZmVyWzBdICYgMHgyMCkgPT09IDB4MjA7XHJcbiAgICAgICAgdGhpcy5pc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCB0YWdOdW1iZXJNYXNrID0gaW50QnVmZmVyWzBdICYgMHgxRjtcclxuICAgICAgICBpZiAodGFnTnVtYmVyTWFzayAhPT0gMHgxRikge1xyXG4gICAgICAgICAgICB0aGlzLnRhZ051bWJlciA9ICh0YWdOdW1iZXJNYXNrKTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSAxO1xyXG4gICAgICAgICAgICBsZXQgaW50VGFnTnVtYmVyQnVmZmVyID0gdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSgyNTUpO1xyXG4gICAgICAgICAgICBsZXQgdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoID0gMjU1O1xyXG4gICAgICAgICAgICB3aGlsZSAoaW50QnVmZmVyW2NvdW50XSAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlcltjb3VudCAtIDFdID0gaW50QnVmZmVyW2NvdW50XSAmIDB4N0Y7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IGludEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoICs9IDI1NTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wQnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KHRhZ051bWJlckJ1ZmZlck1heExlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRUYWdOdW1iZXJCdWZmZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJWaWV3W2ldID0gaW50VGFnTnVtYmVyQnVmZmVyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlciA9IHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gKGNvdW50ICsgMSk7XHJcbiAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlcltjb3VudCAtIDFdID0gaW50QnVmZmVyW2NvdW50XSAmIDB4N0Y7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBCdWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspXHJcbiAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyVmlld1tpXSA9IGludFRhZ051bWJlckJ1ZmZlcltpXTtcclxuICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyID0gdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShjb3VudCk7XHJcbiAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlci5zZXQodGVtcEJ1ZmZlclZpZXcpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja0xlbmd0aCA8PSA5KVxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWdOdW1iZXIgPSBwdnV0aWxzLnV0aWxGcm9tQmFzZShpbnRUYWdOdW1iZXJCdWZmZXIsIDcpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIlRhZyB0b28gbG9uZywgcmVwcmVzZW50ZWQgYXMgaGV4LWNvZGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoKHRoaXMudGFnQ2xhc3MgPT09IDEpKSAmJlxyXG4gICAgICAgICAgICAodGhpcy5pc0NvbnN0cnVjdGVkKSkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudGFnTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcclxuICAgICAgICAgICAgICAgIGNhc2UgMjM6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI0OlxyXG4gICAgICAgICAgICAgICAgY2FzZSAzMTpcclxuICAgICAgICAgICAgICAgIGNhc2UgMzI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMzOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJDb25zdHJ1Y3RlZCBlbmNvZGluZyB1c2VkIGZvciBwcmltaXRpdmUgdHlwZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHRhZ0NsYXNzOiB0aGlzLnRhZ0NsYXNzLFxyXG4gICAgICAgICAgICB0YWdOdW1iZXI6IHRoaXMudGFnTnVtYmVyLFxyXG4gICAgICAgICAgICBpc0NvbnN0cnVjdGVkOiB0aGlzLmlzQ29uc3RydWN0ZWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5Mb2NhbElkZW50aWZpY2F0aW9uQmxvY2suTkFNRSA9IFwiaWRlbnRpZmljYXRpb25CbG9ja1wiO1xuXG5jbGFzcyBMb2NhbExlbmd0aEJsb2NrIGV4dGVuZHMgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBsZW5CbG9jayA9IHt9LCB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaXNJbmRlZmluaXRlRm9ybSA9IChfYSA9IGxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9uZ0Zvcm1Vc2VkID0gKF9iID0gbGVuQmxvY2subG9uZ0Zvcm1Vc2VkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IChfYyA9IGxlbkJsb2NrLmxlbmd0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCB2aWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gdmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiWmVybyBidWZmZXIgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlclswXSA9PT0gMHhGRikge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJMZW5ndGggYmxvY2sgMHhGRiBpcyByZXNlcnZlZCBieSBzdGFuZGFyZFwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbmRlZmluaXRlRm9ybSA9IGludEJ1ZmZlclswXSA9PT0gMHg4MDtcclxuICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAxO1xyXG4gICAgICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9uZ0Zvcm1Vc2VkID0gISEoaW50QnVmZmVyWzBdICYgMHg4MCk7XHJcbiAgICAgICAgaWYgKHRoaXMubG9uZ0Zvcm1Vc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IChpbnRCdWZmZXJbMF0pO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gMTtcclxuICAgICAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb3VudCA9IGludEJ1ZmZlclswXSAmIDB4N0Y7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gOCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJUb28gYmlnIGludGVnZXJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGNvdW50ICsgMSkgPiBpbnRCdWZmZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuT2Zmc2V0ID0gaW5wdXRPZmZzZXQgKyAxO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aEJ1ZmZlclZpZXcgPSB2aWV3LnN1YmFycmF5KGxlbk9mZnNldCwgbGVuT2Zmc2V0ICsgY291bnQpO1xyXG4gICAgICAgIGlmIChsZW5ndGhCdWZmZXJWaWV3W2NvdW50IC0gMV0gPT09IDB4MDApXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBlbmNvZGVkIGxlbmd0aFwiKTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IHB2dXRpbHMudXRpbEZyb21CYXNlKGxlbmd0aEJ1ZmZlclZpZXcsIDgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxvbmdGb3JtVXNlZCAmJiAodGhpcy5sZW5ndGggPD0gMTI3KSlcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiVW5uZWNlc3NhcnkgdXNhZ2Ugb2YgbG9uZyBsZW5ndGggZm9ybVwiKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gY291bnQgKyAxO1xyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyB0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgcmV0QnVmO1xyXG4gICAgICAgIGxldCByZXRWaWV3O1xyXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEyNylcclxuICAgICAgICAgICAgdGhpcy5sb25nRm9ybVVzZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKDEpO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZU9ubHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSAweDgwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxvbmdGb3JtVXNlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMubGVuZ3RoLCA4KTtcclxuICAgICAgICAgICAgaWYgKGVuY29kZWRCdWYuYnl0ZUxlbmd0aCA+IDEyNykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVG9vIGJpZyBsZW5ndGhcIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoRU1QVFlfQlVGRkVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zik7XHJcbiAgICAgICAgICAgIHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoIHwgMHg4MDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkQnVmLmJ5dGVMZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gZW5jb2RlZFZpZXdbaV07XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcigxKTtcclxuICAgICAgICBpZiAoc2l6ZU9ubHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gdGhpcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06IHRoaXMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgbG9uZ0Zvcm1Vc2VkOiB0aGlzLmxvbmdGb3JtVXNlZCxcclxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsTGVuZ3RoQmxvY2suTkFNRSA9IFwibGVuZ3RoQmxvY2tcIjtcblxuY29uc3QgdHlwZVN0b3JlID0ge307XG5cbmNsYXNzIEJhc2VCbG9jayBleHRlbmRzIExvY2FsQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgbmFtZSA9IEVNUFRZX1NUUklORywgb3B0aW9uYWwgPSBmYWxzZSwgcHJpbWl0aXZlU2NoZW1hLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSwgdmFsdWVCbG9ja1R5cGUpIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcclxuICAgICAgICBpZiAocHJpbWl0aXZlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlU2NoZW1hID0gcHJpbWl0aXZlU2NoZW1hO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlkQmxvY2sgPSBuZXcgTG9jYWxJZGVudGlmaWNhdGlvbkJsb2NrKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMubGVuQmxvY2sgPSBuZXcgTG9jYWxMZW5ndGhCbG9jayhwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sgPSB2YWx1ZUJsb2NrVHlwZSA/IG5ldyB2YWx1ZUJsb2NrVHlwZShwYXJhbWV0ZXJzKSA6IG5ldyBWYWx1ZUJsb2NrKHBhcmFtZXRlcnMpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2Zmc2V0ID0gdGhpcy52YWx1ZUJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCAodGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtKSA/IGlucHV0TGVuZ3RoIDogdGhpcy5sZW5CbG9jay5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLnZhbHVlQmxvY2suZXJyb3I7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmlkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxlbkJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLnZhbHVlQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCBfd3JpdGVyID0gd3JpdGVyIHx8IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgaWYgKCF3cml0ZXIpIHtcclxuICAgICAgICAgICAgcHJlcGFyZUluZGVmaW5pdGVGb3JtKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZEJsb2NrQnVmID0gdGhpcy5pZEJsb2NrLnRvQkVSKHNpemVPbmx5KTtcclxuICAgICAgICBfd3JpdGVyLndyaXRlKGlkQmxvY2tCdWYpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZShuZXcgVWludDhBcnJheShbMHg4MF0pLmJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay50b0JFUihzaXplT25seSwgX3dyaXRlcik7XHJcbiAgICAgICAgICAgIF93cml0ZXIud3JpdGUobmV3IEFycmF5QnVmZmVyKDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQmxvY2tCdWYgPSB0aGlzLnZhbHVlQmxvY2sudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgICAgICB0aGlzLmxlbkJsb2NrLmxlbmd0aCA9IHZhbHVlQmxvY2tCdWYuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgbGVuQmxvY2tCdWYgPSB0aGlzLmxlbkJsb2NrLnRvQkVSKHNpemVPbmx5KTtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZShsZW5CbG9ja0J1Zik7XHJcbiAgICAgICAgICAgIF93cml0ZXIud3JpdGUodmFsdWVCbG9ja0J1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghd3JpdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfd3JpdGVyLmZpbmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaWRCbG9jazogdGhpcy5pZEJsb2NrLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBsZW5CbG9jazogdGhpcy5sZW5CbG9jay50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWVCbG9jazogdGhpcy52YWx1ZUJsb2NrLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlU2NoZW1hKVxyXG4gICAgICAgICAgICBvYmplY3QucHJpbWl0aXZlU2NoZW1hID0gdGhpcy5wcmltaXRpdmVTY2hlbWEudG9KU09OKCk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKGVuY29kaW5nID0gXCJhc2NpaVwiKSB7XHJcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBcImFzY2lpXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub25Bc2NpaUVuY29kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnRvQkVSKCkpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHtwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlQmxvY2sudmFsdWVCZWZvcmVEZWNvZGVWaWV3KX1gO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIGlmICh0aGlzID09PSBvdGhlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRoaXNSYXcgPSB0aGlzLnRvQkVSKCk7XHJcbiAgICAgICAgY29uc3Qgb3RoZXJSYXcgPSBvdGhlci50b0JFUigpO1xyXG4gICAgICAgIHJldHVybiBwdnV0aWxzLmlzRXF1YWxCdWZmZXIodGhpc1Jhdywgb3RoZXJSYXcpO1xyXG4gICAgfVxyXG59XHJcbkJhc2VCbG9jay5OQU1FID0gXCJCYXNlQmxvY2tcIjtcclxuZnVuY3Rpb24gcHJlcGFyZUluZGVmaW5pdGVGb3JtKGJhc2VCbG9jaykge1xyXG4gICAgaWYgKGJhc2VCbG9jayBpbnN0YW5jZW9mIHR5cGVTdG9yZS5Db25zdHJ1Y3RlZCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYmFzZUJsb2NrLnZhbHVlQmxvY2sudmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHByZXBhcmVJbmRlZmluaXRlRm9ybSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGJhc2VCbG9jay5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAhIWJhc2VCbG9jay5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG59XG5cbmNsYXNzIEJhc2VTdHJpbmdCbG9jayBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gRU1QVFlfU1RSSU5HLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSwgc3RyaW5nVmFsdWVCbG9ja1R5cGUpIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBzdHJpbmdWYWx1ZUJsb2NrVHlwZSk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay52YWx1ZTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSB0aGlzLnZhbHVlQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pID8gaW5wdXRMZW5ndGggOiB0aGlzLmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcm9tQnVmZmVyKHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmlkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxlbkJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLnZhbHVlQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICcke3RoaXMudmFsdWVCbG9jay52YWx1ZX0nYDtcclxuICAgIH1cclxufVxyXG5CYXNlU3RyaW5nQmxvY2suTkFNRSA9IFwiQmFzZVN0cmluZ0Jsb2NrXCI7XG5cbmNsYXNzIExvY2FsUHJpbWl0aXZlVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaXNIZXhPbmx5ID0gdHJ1ZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IGlzSGV4T25seTtcclxuICAgIH1cclxufVxyXG5Mb2NhbFByaW1pdGl2ZVZhbHVlQmxvY2suTkFNRSA9IFwiUHJpbWl0aXZlVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkdztcclxuY2xhc3MgUHJpbWl0aXZlIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsUHJpbWl0aXZlVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLmlzQ29uc3RydWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5fYSR3ID0gUHJpbWl0aXZlO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlByaW1pdGl2ZSA9IF9hJHc7XHJcbn0pKCk7XHJcblByaW1pdGl2ZS5OQU1FID0gXCJQUklNSVRJVkVcIjtcblxuZnVuY3Rpb24gbG9jYWxDaGFuZ2VUeXBlKGlucHV0T2JqZWN0LCBuZXdUeXBlKSB7XHJcbiAgICBpZiAoaW5wdXRPYmplY3QgaW5zdGFuY2VvZiBuZXdUeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0T2JqZWN0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IG5ld1R5cGUoKTtcclxuICAgIG5ld09iamVjdC5pZEJsb2NrID0gaW5wdXRPYmplY3QuaWRCbG9jaztcclxuICAgIG5ld09iamVjdC5sZW5CbG9jayA9IGlucHV0T2JqZWN0LmxlbkJsb2NrO1xyXG4gICAgbmV3T2JqZWN0Lndhcm5pbmdzID0gaW5wdXRPYmplY3Qud2FybmluZ3M7XHJcbiAgICBuZXdPYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gaW5wdXRPYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3O1xyXG4gICAgcmV0dXJuIG5ld09iamVjdDtcclxufVxyXG5mdW5jdGlvbiBsb2NhbEZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0ID0gMCwgaW5wdXRMZW5ndGggPSBpbnB1dEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGluY29taW5nT2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICBsZXQgcmV0dXJuT2JqZWN0ID0gbmV3IEJhc2VCbG9jayh7fSwgVmFsdWVCbG9jayk7XHJcbiAgICBjb25zdCBiYXNlQmxvY2sgPSBuZXcgTG9jYWxCYXNlQmxvY2soKTtcclxuICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC5lcnJvciA9IGJhc2VCbG9jay5lcnJvcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRCdWZmZXIgPSBpbnB1dEJ1ZmZlci5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICBpZiAoIWludEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIlplcm8gYnVmZmVyIGxlbmd0aFwiO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGxldCByZXN1bHRPZmZzZXQgPSByZXR1cm5PYmplY3QuaWRCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgaWYgKHJldHVybk9iamVjdC5pZEJsb2NrLndhcm5pbmdzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LmlkQmxvY2sud2FybmluZ3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSByZXR1cm5PYmplY3QuaWRCbG9jay5lcnJvcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpbnB1dE9mZnNldCA9IHJlc3VsdE9mZnNldDtcclxuICAgIGlucHV0TGVuZ3RoIC09IHJldHVybk9iamVjdC5pZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgcmVzdWx0T2Zmc2V0ID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICBpZiAocmV0dXJuT2JqZWN0LmxlbkJsb2NrLndhcm5pbmdzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LmxlbkJsb2NrLndhcm5pbmdzKTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmVycm9yO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlucHV0T2Zmc2V0ID0gcmVzdWx0T2Zmc2V0O1xyXG4gICAgaW5wdXRMZW5ndGggLT0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgaWYgKCFyZXR1cm5PYmplY3QuaWRCbG9jay5pc0NvbnN0cnVjdGVkICYmXHJcbiAgICAgICAgcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIkluZGVmaW5pdGUgbGVuZ3RoIGZvcm0gdXNlZCBmb3IgcHJpbWl0aXZlIGVuY29kaW5nIGZvcm1cIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3QVNOMVR5cGUgPSBCYXNlQmxvY2s7XHJcbiAgICBzd2l0Y2ggKHJldHVybk9iamVjdC5pZEJsb2NrLnRhZ0NsYXNzKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBpZiAoKHJldHVybk9iamVjdC5pZEJsb2NrLnRhZ051bWJlciA+PSAzNykgJiZcclxuICAgICAgICAgICAgICAgIChyZXR1cm5PYmplY3QuaWRCbG9jay5pc0hleE9ubHkgPT09IGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJVTklWRVJTQUwgMzcgYW5kIHVwcGVyIHRhZ3MgYXJlIHJlc2VydmVkIGJ5IEFTTi4xIHN0YW5kYXJkXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3dpdGNoIChyZXR1cm5PYmplY3QuaWRCbG9jay50YWdOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWQpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm5PYmplY3QubGVuQmxvY2subGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJUeXBlIFtVTklWRVJTQUwgMF0gaXMgcmVzZXJ2ZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5FbmRPZkNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuQm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5JbnRlZ2VyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkJpdFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5PY3RldFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5OdWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLk9iamVjdElkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkVudW1lcmF0ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlV0ZjhTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlJlbGF0aXZlT2JqZWN0SWRlbnRpZmllcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVElNRTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTU6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJbVU5JVkVSU0FMIDE1XSBpcyByZXNlcnZlZCBieSBBU04uMSBzdGFuZGFyZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTY6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuU2VxdWVuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlNldDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTg6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuTnVtZXJpY1N0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTk6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuUHJpbnRhYmxlU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5UZWxldGV4U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5WaWRlb3RleFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjI6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuSUE1U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5VVENUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5HZW5lcmFsaXplZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkdyYXBoaWNTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlZpc2libGVTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkdlbmVyYWxTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlVuaXZlcnNhbFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjk6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuQ2hhcmFjdGVyU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5CbXBTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMxOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkRBVEU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMyOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlRpbWVPZkRheTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzM6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuRGF0ZVRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgdHlwZVN0b3JlLkNvbnN0cnVjdGVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgdHlwZVN0b3JlLlByaW1pdGl2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC5pZEJsb2NrID0gcmV0dXJuT2JqZWN0LmlkQmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0LmxlbkJsb2NrID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC53YXJuaW5ncyA9IHJldHVybk9iamVjdC53YXJuaW5ncztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXdPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICBuZXdBU04xVHlwZSA9IHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWRcclxuICAgICAgICAgICAgICAgID8gdHlwZVN0b3JlLkNvbnN0cnVjdGVkXHJcbiAgICAgICAgICAgICAgICA6IHR5cGVTdG9yZS5QcmltaXRpdmU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuT2JqZWN0ID0gbG9jYWxDaGFuZ2VUeXBlKHJldHVybk9iamVjdCwgbmV3QVNOMVR5cGUpO1xyXG4gICAgcmVzdWx0T2Zmc2V0ID0gcmV0dXJuT2JqZWN0LmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCByZXR1cm5PYmplY3QubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSA/IGlucHV0TGVuZ3RoIDogcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICByZXR1cm5PYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gaW5wdXRCdWZmZXIuc3ViYXJyYXkoaW5jb21pbmdPZmZzZXQsIGluY29taW5nT2Zmc2V0ICsgcmV0dXJuT2JqZWN0LmJsb2NrTGVuZ3RoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgb2Zmc2V0OiByZXN1bHRPZmZzZXQsXHJcbiAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gZnJvbUJFUihpbnB1dEJ1ZmZlcikge1xyXG4gICAgaWYgKCFpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEJhc2VCbG9jayh7fSwgVmFsdWVCbG9jayk7XHJcbiAgICAgICAgcmVzdWx0LmVycm9yID0gXCJJbnB1dCBidWZmZXIgaGFzIHplcm8gbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBsb2NhbEZyb21CRVIocHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpLnNsaWNlKCksIDAsIGlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG59XG5cbmZ1bmN0aW9uIGNoZWNrTGVuKGluZGVmaW5pdGVMZW5ndGgsIGxlbmd0aCkge1xyXG4gICAgaWYgKGluZGVmaW5pdGVMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBsZW5ndGg7XHJcbn1cclxuY2xhc3MgTG9jYWxDb25zdHJ1Y3RlZFZhbHVlQmxvY2sgZXh0ZW5kcyBWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUgPSBbXSwgaXNJbmRlZmluaXRlRm9ybSA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmlzSW5kZWZpbml0ZUZvcm0gPSBpc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIHZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IHZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiWmVybyBidWZmZXIgbGVuZ3RoXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjdXJyZW50T2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgd2hpbGUgKGNoZWNrTGVuKHRoaXMuaXNJbmRlZmluaXRlRm9ybSwgaW5wdXRMZW5ndGgpID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5PYmplY3QgPSBsb2NhbEZyb21CRVIodmlldywgY3VycmVudE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmV0dXJuT2JqZWN0Lm9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSByZXR1cm5PYmplY3QucmVzdWx0LmVycm9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LnJlc3VsdC53YXJuaW5ncyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudE9mZnNldCA9IHJldHVybk9iamVjdC5vZmZzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gcmV0dXJuT2JqZWN0LnJlc3VsdC5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgaW5wdXRMZW5ndGggLT0gcmV0dXJuT2JqZWN0LnJlc3VsdC5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHJldHVybk9iamVjdC5yZXN1bHQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtICYmIHJldHVybk9iamVjdC5yZXN1bHQuY29uc3RydWN0b3IuTkFNRSA9PT0gRU5EX09GX0NPTlRFTlRfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdLmNvbnN0cnVjdG9yLk5BTUUgPT09IEVORF9PRl9DT05URU5UX05BTUUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJObyBFbmRPZkNvbnRlbnQgYmxvY2sgZW5jb2RlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3VycmVudE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCBfd3JpdGVyID0gd3JpdGVyIHx8IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaV0udG9CRVIoc2l6ZU9ubHksIF93cml0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXdyaXRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gX3dyaXRlci5maW5hbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06IHRoaXMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgdmFsdWU6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC52YWx1ZS5wdXNoKHZhbHVlLnRvSlNPTigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxufVxyXG5Mb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5OQU1FID0gXCJDb25zdHJ1Y3RlZFZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHY7XHJcbmNsYXNzIENvbnN0cnVjdGVkIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNJbmRlZmluaXRlRm9ybSA9IHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybTtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSB0aGlzLnZhbHVlQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pID8gaW5wdXRMZW5ndGggOiB0aGlzLmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMudmFsdWVCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy52YWx1ZUJsb2NrLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlLnRvU3RyaW5nKFwiYXNjaWlcIikuc3BsaXQoXCJcXG5cIikubWFwKG8gPT4gYCAgJHtvfWApLmpvaW4oXCJcXG5cIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBibG9ja05hbWUgPSB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPT09IDNcclxuICAgICAgICAgICAgPyBgWyR7dGhpcy5pZEJsb2NrLnRhZ051bWJlcn1dYFxyXG4gICAgICAgICAgICA6IHRoaXMuY29uc3RydWN0b3IuTkFNRTtcclxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aFxyXG4gICAgICAgICAgICA/IGAke2Jsb2NrTmFtZX0gOlxcbiR7dmFsdWVzLmpvaW4oXCJcXG5cIil9YFxyXG4gICAgICAgICAgICA6IGAke2Jsb2NrTmFtZX0gOmA7XHJcbiAgICB9XHJcbn1cclxuX2EkdiA9IENvbnN0cnVjdGVkO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkNvbnN0cnVjdGVkID0gX2EkdjtcclxufSkoKTtcclxuQ29uc3RydWN0ZWQuTkFNRSA9IFwiQ09OU1RSVUNURURcIjtcblxuY2xhc3MgTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrIGV4dGVuZHMgVmFsdWVCbG9jayB7XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrLm92ZXJyaWRlID0gXCJFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSR1O1xyXG5jbGFzcyBFbmRPZkNvbnRlbnQgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAwO1xyXG4gICAgfVxyXG59XHJcbl9hJHUgPSBFbmRPZkNvbnRlbnQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRW5kT2ZDb250ZW50ID0gX2EkdTtcclxufSkoKTtcclxuRW5kT2ZDb250ZW50Lk5BTUUgPSBFTkRfT0ZfQ09OVEVOVF9OQU1FO1xuXG52YXIgX2EkdDtcclxuY2xhc3MgTnVsbCBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSA1O1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuQmxvY2subGVuZ3RoID4gMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTm9uLXplcm8gbGVuZ3RoIG9mIHZhbHVlIGJsb2NrIGZvciBOdWxsIHR5cGVcIik7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSBpbnB1dExlbmd0aDtcclxuICAgICAgICBpZiAoKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpID4gaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZCAoaW5jb25zaXN0ZW50IG9mZnNldCBhbmQgbGVuZ3RoIHZhbHVlcylcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGNvbnN0IHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcigyKTtcclxuICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gMHgwNTtcclxuICAgICAgICAgICAgcmV0Vmlld1sxXSA9IDB4MDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3cml0ZXIpIHtcclxuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHJldEJ1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX1gO1xyXG4gICAgfVxyXG59XHJcbl9hJHQgPSBOdWxsO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk51bGwgPSBfYSR0O1xyXG59KSgpO1xyXG5OdWxsLk5BTUUgPSBcIk5VTExcIjtcblxuY2xhc3MgTG9jYWxCb29sZWFuVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMudmFsdWVIZXgpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwYXJhbWV0ZXJzLnZhbHVlSGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb2N0ZXQgb2YgdGhpcy52YWx1ZUhleFZpZXcpIHtcclxuICAgICAgICAgICAgaWYgKG9jdGV0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXdbMF0gPSB2YWx1ZSA/IDB4RkYgOiAweDAwO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBpbnB1dFZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmIChpbnB1dExlbmd0aCA+IDEpXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIkJvb2xlYW4gdmFsdWUgZW5jb2RlZCBpbiBtb3JlIHRoZW4gMSBvY3RldFwiKTtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IHRydWU7XHJcbiAgICAgICAgcHZ1dGlscy51dGlsRGVjb2RlVEMuY2FsbCh0aGlzKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW5wdXRMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQm9vbGVhblZhbHVlQmxvY2suTkFNRSA9IFwiQm9vbGVhblZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHM7XHJcbmNsYXNzIEJvb2xlYW4gZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxCb29sZWFuVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlQmxvY2sudmFsdWU7XHJcbiAgICB9XHJcbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHt0aGlzLmdldFZhbHVlfWA7XHJcbiAgICB9XHJcbn1cclxuX2EkcyA9IEJvb2xlYW47XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQm9vbGVhbiA9IF9hJHM7XHJcbn0pKCk7XHJcbkJvb2xlYW4uTkFNRSA9IFwiQk9PTEVBTlwiO1xuXG5jbGFzcyBMb2NhbE9jdGV0U3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGlzQ29uc3RydWN0ZWQgPSBmYWxzZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSBpc0NvbnN0cnVjdGVkO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUuZnJvbUJFUi5jYWxsKHRoaXMsIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEJsb2NrTmFtZSA9IHRoaXMudmFsdWVbaV0uY29uc3RydWN0b3IuTkFNRTtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tOYW1lID09PSBFTkRfT0ZfQ09OVEVOVF9OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZE9mQ29udGVudCBpcyB1bmV4cGVjdGVkLCBPQ1RFVCBTVFJJTkcgbWF5IGNvbnNpc3RzIG9mIE9DVEVUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja05hbWUgIT09IE9DVEVUX1NUUklOR19OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiT0NURVQgU1RSSU5HIG1heSBjb25zaXN0cyBvZiBPQ1RFVCBTVFJJTkdzIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ID0gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IGlucHV0TGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29uc3RydWN0ZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUudG9CRVIuY2FsbCh0aGlzLCBzaXplT25seSwgd3JpdGVyKTtcclxuICAgICAgICByZXR1cm4gc2l6ZU9ubHlcclxuICAgICAgICAgICAgPyBuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aClcclxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaXNDb25zdHJ1Y3RlZDogdGhpcy5pc0NvbnN0cnVjdGVkLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxPY3RldFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiT2N0ZXRTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRyO1xyXG5jbGFzcyBPY3RldFN0cmluZyBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGlkQmxvY2sgPSB7fSwgbGVuQmxvY2sgPSB7fSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2IsIF9jO1xyXG4gICAgICAgIChfYiA9IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCA9ICEhKChfYyA9IHBhcmFtZXRlcnMudmFsdWUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sZW5ndGgpKTtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkQmxvY2s6IHtcclxuICAgICAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICAgICAgICAgIC4uLmlkQmxvY2ssXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxlbkJsb2NrOiB7XHJcbiAgICAgICAgICAgICAgICAuLi5sZW5CbG9jayxcclxuICAgICAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06ICEhcGFyYW1ldGVycy5pc0luZGVmaW5pdGVGb3JtLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxyXG4gICAgICAgIH0sIExvY2FsT2N0ZXRTdHJpbmdWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSA0O1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQgPSB0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZDtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNJbmRlZmluaXRlRm9ybSA9IHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybTtcclxuICAgICAgICBpZiAoaW5wdXRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaWRCbG9jay5lcnJvci5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdmlldyA9IGlucHV0QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcikgOiBpbnB1dEJ1ZmZlcjtcclxuICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnVmLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc24gPSBsb2NhbEZyb21CRVIoYnVmLCAwLCBidWYuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFzbi5vZmZzZXQgIT09IC0xICYmIGFzbi5vZmZzZXQgPT09IGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IFthc24ucmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQgfHwgKHRoaXMudmFsdWVCbG9jay52YWx1ZSAmJiB0aGlzLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gQ29uc3RydWN0ZWQucHJvdG90eXBlLm9uQXNjaWlFbmNvZGluZy5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICR7cHZ0c3V0aWxzLkNvbnZlcnQuVG9IZXgodGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlldyl9YDtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFycmF5ID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIHRoaXMudmFsdWVCbG9jay52YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIE9jdGV0U3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGNvbnRlbnQudmFsdWVCbG9jay52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLmNvbmNhdChhcnJheSk7XHJcbiAgICB9XHJcbn1cclxuX2EkciA9IE9jdGV0U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk9jdGV0U3RyaW5nID0gX2EkcjtcclxufSkoKTtcclxuT2N0ZXRTdHJpbmcuTkFNRSA9IE9DVEVUX1NUUklOR19OQU1FO1xuXG5jbGFzcyBMb2NhbEJpdFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyB1bnVzZWRCaXRzID0gMCwgaXNDb25zdHJ1Y3RlZCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudW51c2VkQml0cyA9IHVudXNlZEJpdHM7XHJcbiAgICAgICAgdGhpcy5pc0NvbnN0cnVjdGVkID0gaXNDb25zdHJ1Y3RlZDtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmICghaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gLTE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUuZnJvbUJFUi5jYWxsKHRoaXMsIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEJsb2NrTmFtZSA9IHZhbHVlLmNvbnN0cnVjdG9yLk5BTUU7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrTmFtZSA9PT0gRU5EX09GX0NPTlRFTlRfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmRPZkNvbnRlbnQgaXMgdW5leHBlY3RlZCwgQklUIFNUUklORyBtYXkgY29uc2lzdHMgb2YgQklUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja05hbWUgIT09IEJJVF9TVFJJTkdfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkJJVCBTVFJJTkcgbWF5IGNvbnNpc3RzIG9mIEJJVCBTVFJJTkdzIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUJsb2NrID0gdmFsdWUudmFsdWVCbG9jaztcclxuICAgICAgICAgICAgICAgIGlmICgodGhpcy51bnVzZWRCaXRzID4gMCkgJiYgKHZhbHVlQmxvY2sudW51c2VkQml0cyA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVXNpbmcgb2YgXFxcInVudXNlZCBiaXRzXFxcIiBpbnNpZGUgY29uc3RydWN0aXZlIEJJVCBTVFJJTkcgYWxsb3dlZCBmb3IgbGVhc3Qgb25lIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSB2YWx1ZUJsb2NrLnVudXNlZEJpdHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gaW5wdXRWaWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSBpbnRCdWZmZXJbMF07XHJcbiAgICAgICAgaWYgKHRoaXMudW51c2VkQml0cyA+IDcpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVW51c2VkIGJpdHMgZm9yIEJpdFN0cmluZyBtdXN0IGJlIGluIHJhbmdlIDAtN1wiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy51bnVzZWRCaXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGludEJ1ZmZlci5zdWJhcnJheSgxKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbiA9IGxvY2FsRnJvbUJFUihidWYsIDAsIGJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXNuLm9mZnNldCAhPT0gLTEgJiYgYXNuLm9mZnNldCA9PT0gKGlucHV0TGVuZ3RoIC0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFthc24ucmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IGludEJ1ZmZlci5zdWJhcnJheSgxKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW50QnVmZmVyLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLnByb3RvdHlwZS50b0JFUi5jYWxsKHRoaXMsIHNpemVPbmx5LCB3cml0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgcmV0Vmlld1swXSA9IHRoaXMudW51c2VkQml0cztcclxuICAgICAgICByZXRWaWV3LnNldCh0aGlzLnZhbHVlSGV4VmlldywgMSk7XHJcbiAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB1bnVzZWRCaXRzOiB0aGlzLnVudXNlZEJpdHMsXHJcbiAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHRoaXMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQml0U3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJCaXRTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRxO1xyXG5jbGFzcyBCaXRTdHJpbmcgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBpZEJsb2NrID0ge30sIGxlbkJsb2NrID0ge30sIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgdmFyIF9iLCBfYztcclxuICAgICAgICAoX2IgPSBwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQgPSAhISgoX2MgPSBwYXJhbWV0ZXJzLnZhbHVlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSk7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZEJsb2NrOiB7XHJcbiAgICAgICAgICAgICAgICBpc0NvbnN0cnVjdGVkOiBwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQsXHJcbiAgICAgICAgICAgICAgICAuLi5pZEJsb2NrLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsZW5CbG9jazoge1xyXG4gICAgICAgICAgICAgICAgLi4ubGVuQmxvY2ssXHJcbiAgICAgICAgICAgICAgICBpc0luZGVmaW5pdGVGb3JtOiAhIXBhcmFtZXRlcnMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4ucGFyYW1ldGVycyxcclxuICAgICAgICB9LCBMb2NhbEJpdFN0cmluZ1ZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDM7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCA9IHRoaXMuaWRCbG9jay5pc0NvbnN0cnVjdGVkO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgICAgIHJldHVybiBzdXBlci5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCB8fCAodGhpcy52YWx1ZUJsb2NrLnZhbHVlICYmIHRoaXMudmFsdWVCbG9jay52YWx1ZS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBDb25zdHJ1Y3RlZC5wcm90b3R5cGUub25Bc2NpaUVuY29kaW5nLmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBiaXRzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGV4ID0gdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIHZhbHVlSGV4KSB7XHJcbiAgICAgICAgICAgICAgICBiaXRzLnB1c2goYnl0ZS50b1N0cmluZygyKS5wYWRTdGFydCg4LCBcIjBcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJpdHNTdHIgPSBiaXRzLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHtiaXRzU3RyLnN1YnN0cmluZygwLCBiaXRzU3RyLmxlbmd0aCAtIHRoaXMudmFsdWVCbG9jay51bnVzZWRCaXRzKX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5fYSRxID0gQml0U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkJpdFN0cmluZyA9IF9hJHE7XHJcbn0pKCk7XHJcbkJpdFN0cmluZy5OQU1FID0gQklUX1NUUklOR19OQU1FO1xuXG52YXIgX2EkcDtcclxuZnVuY3Rpb24gdmlld0FkZChmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICBjb25zdCBjID0gbmV3IFVpbnQ4QXJyYXkoWzBdKTtcclxuICAgIGNvbnN0IGZpcnN0VmlldyA9IG5ldyBVaW50OEFycmF5KGZpcnN0KTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXcgPSBuZXcgVWludDhBcnJheShzZWNvbmQpO1xyXG4gICAgbGV0IGZpcnN0Vmlld0NvcHkgPSBmaXJzdFZpZXcuc2xpY2UoMCk7XHJcbiAgICBjb25zdCBmaXJzdFZpZXdDb3B5TGVuZ3RoID0gZmlyc3RWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHkgPSBzZWNvbmRWaWV3LnNsaWNlKDApO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHlMZW5ndGggPSBzZWNvbmRWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHZhbHVlID0gMDtcclxuICAgIGNvbnN0IG1heCA9IChzZWNvbmRWaWV3Q29weUxlbmd0aCA8IGZpcnN0Vmlld0NvcHlMZW5ndGgpID8gZmlyc3RWaWV3Q29weUxlbmd0aCA6IHNlY29uZFZpZXdDb3B5TGVuZ3RoO1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IG1heDsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIChjb3VudGVyIDwgc2Vjb25kVmlld0NvcHkubGVuZ3RoKTpcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gKyBzZWNvbmRWaWV3Q29weVtzZWNvbmRWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdICsgY1swXTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSArIGNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNbMF0gPSB2YWx1ZSAvIDEwO1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIChjb3VudGVyID49IGZpcnN0Vmlld0NvcHkubGVuZ3RoKTpcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHkgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KG5ldyBVaW50OEFycmF5KFt2YWx1ZSAlIDEwXSksIGZpcnN0Vmlld0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSA9IHZhbHVlICUgMTA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNbMF0gPiAwKVxyXG4gICAgICAgIGZpcnN0Vmlld0NvcHkgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KGMsIGZpcnN0Vmlld0NvcHkpO1xyXG4gICAgcmV0dXJuIGZpcnN0Vmlld0NvcHk7XHJcbn1cclxuZnVuY3Rpb24gcG93ZXIyKG4pIHtcclxuICAgIGlmIChuID49IHBvd2VyczIubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgcCA9IHBvd2VyczIubGVuZ3RoOyBwIDw9IG47IHArKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gbmV3IFVpbnQ4QXJyYXkoWzBdKTtcclxuICAgICAgICAgICAgbGV0IGRpZ2l0cyA9IChwb3dlcnMyW3AgLSAxXSkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAoZGlnaXRzLmxlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXcgVWludDhBcnJheShbKGRpZ2l0c1tpXSA8PCAxKSArIGNbMF1dKTtcclxuICAgICAgICAgICAgICAgIGNbMF0gPSBuZXdWYWx1ZVswXSAvIDEwO1xyXG4gICAgICAgICAgICAgICAgZGlnaXRzW2ldID0gbmV3VmFsdWVbMF0gJSAxMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY1swXSA+IDApXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KGMsIGRpZ2l0cyk7XHJcbiAgICAgICAgICAgIHBvd2VyczIucHVzaChkaWdpdHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwb3dlcnMyW25dO1xyXG59XHJcbmZ1bmN0aW9uIHZpZXdTdWIoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgbGV0IGIgPSAwO1xyXG4gICAgY29uc3QgZmlyc3RWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3QpO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlldyA9IG5ldyBVaW50OEFycmF5KHNlY29uZCk7XHJcbiAgICBjb25zdCBmaXJzdFZpZXdDb3B5ID0gZmlyc3RWaWV3LnNsaWNlKDApO1xyXG4gICAgY29uc3QgZmlyc3RWaWV3Q29weUxlbmd0aCA9IGZpcnN0Vmlld0NvcHkubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXdDb3B5ID0gc2Vjb25kVmlldy5zbGljZSgwKTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXdDb3B5TGVuZ3RoID0gc2Vjb25kVmlld0NvcHkubGVuZ3RoIC0gMTtcclxuICAgIGxldCB2YWx1ZTtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGZvciAobGV0IGkgPSBzZWNvbmRWaWV3Q29weUxlbmd0aDsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgIHZhbHVlID0gZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gLSBzZWNvbmRWaWV3Q29weVtzZWNvbmRWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdIC0gYjtcclxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgY2FzZSAodmFsdWUgPCAwKTpcclxuICAgICAgICAgICAgICAgIGIgPSAxO1xyXG4gICAgICAgICAgICAgICAgZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gPSB2YWx1ZSArIDEwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBiID0gMDtcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGIgPiAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IChmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gc2Vjb25kVmlld0NvcHlMZW5ndGggKyAxKTsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdIC0gYjtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgYiA9IDE7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSA9IHZhbHVlICsgMTA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiID0gMDtcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaXJzdFZpZXdDb3B5LnNsaWNlKCk7XHJcbn1cclxuY2xhc3MgTG9jYWxJbnRlZ2VyVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5fdmFsdWVEZWMgPSAwO1xyXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnZhbHVlSGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVIZXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZURlYyA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldFZhbHVlSGV4KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJUb28gYmlnIEludGVnZXIgZm9yIGRlY29kaW5nLCBoZXggb25seVwiKTtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZURlYyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVEZWMgPSBwdnV0aWxzLnV0aWxEZWNvZGVUQy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlRGVjKHYpIHtcclxuICAgICAgICB0aGlzLl92YWx1ZURlYyA9IHY7XHJcbiAgICAgICAgdGhpcy5pc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHB2dXRpbHMudXRpbEVuY29kZVRDKHYpKTtcclxuICAgIH1cclxuICAgIGdldCB2YWx1ZURlYygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVEZWM7XHJcbiAgICB9XHJcbiAgICBmcm9tREVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgsIGV4cGVjdGVkTGVuZ3RoID0gMCkge1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAob2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcclxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgaWYgKCh2aWV3WzBdID09PSAweDAwKSAmJiAoKHZpZXdbMV0gJiAweDgwKSAhPT0gMCkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB2aWV3LnN1YmFycmF5KDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGV4cGVjdGVkTGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmlldy5sZW5ndGggPCBleHBlY3RlZExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWRMZW5ndGggLSB2aWV3Lmxlbmd0aCkgPiAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IHZpZXcubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHZpZXcuc3ViYXJyYXkoZXhwZWN0ZWRMZW5ndGggLSB2aWV3Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcclxuICAgIH1cclxuICAgIHRvREVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKCh2aWV3WzBdICYgMHg4MCkgIT09IDApOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZpZXdbMF0gPSAweDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWaWV3LnNldCh2aWV3LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHVwZGF0ZWRWaWV3O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKCh2aWV3WzBdID09PSAweDAwKSAmJiAoKHZpZXdbMV0gJiAweDgwKSA9PT0gMCkpOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXcuc3ViYXJyYXkoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2Zmc2V0ID0gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFZhbHVlSGV4KCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHNpemVPbmx5XHJcbiAgICAgICAgICAgID8gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aClcclxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWVEZWM6IHRoaXMudmFsdWVEZWMsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0Qml0ID0gKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCAqIDgpIC0gMTtcclxuICAgICAgICBsZXQgZGlnaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCAqIDgpIC8gMyk7XHJcbiAgICAgICAgbGV0IGJpdE51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRCeXRlO1xyXG4gICAgICAgIGNvbnN0IGFzbjFWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBieXRlTnVtYmVyID0gKGFzbjFWaWV3LmJ5dGVMZW5ndGggLSAxKTsgYnl0ZU51bWJlciA+PSAwOyBieXRlTnVtYmVyLS0pIHtcclxuICAgICAgICAgICAgY3VycmVudEJ5dGUgPSBhc24xVmlld1tieXRlTnVtYmVyXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICgoY3VycmVudEJ5dGUgJiAxKSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYml0TnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3RCaXQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSB2aWV3U3ViKHBvd2VyMihiaXROdW1iZXIpLCBkaWdpdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCItXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHZpZXdBZGQoZGlnaXRzLCBwb3dlcjIoYml0TnVtYmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYml0TnVtYmVyKys7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Qnl0ZSA+Pj0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZGlnaXRzW2ldKVxyXG4gICAgICAgICAgICAgICAgZmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChmbGFnKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRpZ2l0c1N0cmluZy5jaGFyQXQoZGlnaXRzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZsYWcgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICByZXN1bHQgKz0gZGlnaXRzU3RyaW5nLmNoYXJBdCgwKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbl9hJHAgPSBMb2NhbEludGVnZXJWYWx1ZUJsb2NrO1xyXG5Mb2NhbEludGVnZXJWYWx1ZUJsb2NrLk5BTUUgPSBcIkludGVnZXJWYWx1ZUJsb2NrXCI7XHJcbigoKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2EkcC5wcm90b3R5cGUsIFwidmFsdWVIZXhcIiwge1xyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSh2KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUhleCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn0pKCk7XG5cbnZhciBfYSRvO1xyXG5jbGFzcyBJbnRlZ2VyIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsSW50ZWdlclZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI7XHJcbiAgICB9XHJcbiAgICB0b0JpZ0ludCgpIHtcclxuICAgICAgICBhc3NlcnRCaWdJbnQoKTtcclxuICAgICAgICByZXR1cm4gQmlnSW50KHRoaXMudmFsdWVCbG9jay50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tQmlnSW50KHZhbHVlKSB7XHJcbiAgICAgICAgYXNzZXJ0QmlnSW50KCk7XHJcbiAgICAgICAgY29uc3QgYmlnSW50VmFsdWUgPSBCaWdJbnQodmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgY29uc3QgaGV4ID0gYmlnSW50VmFsdWUudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14tLywgXCJcIik7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21IZXgoaGV4KSk7XHJcbiAgICAgICAgaWYgKGJpZ0ludFZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IG5ldyBVaW50OEFycmF5KHZpZXcubGVuZ3RoICsgKHZpZXdbMF0gJiAweDgwID8gMSA6IDApKTtcclxuICAgICAgICAgICAgZmlyc3RbMF0gfD0gMHg4MDtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RJbnQgPSBCaWdJbnQoYDB4JHtwdnRzdXRpbHMuQ29udmVydC5Ub0hleChmaXJzdCl9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZEludCA9IGZpcnN0SW50ICsgYmlnSW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21IZXgoc2Vjb25kSW50LnRvU3RyaW5nKDE2KSkpO1xyXG4gICAgICAgICAgICBzZWNvbmRbMF0gfD0gMHg4MDtcclxuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlY29uZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmlld1swXSAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgVWludDhBcnJheShbMF0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUodmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBJbnRlZ2VyKHtcclxuICAgICAgICAgICAgdmFsdWVIZXg6IHdyaXRlci5maW5hbCgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0VG9ERVIoKSB7XHJcbiAgICAgICAgY29uc3QgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKHsgdmFsdWVIZXg6IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgfSk7XHJcbiAgICAgICAgaW50ZWdlci52YWx1ZUJsb2NrLnRvREVSKCk7XHJcbiAgICAgICAgcmV0dXJuIGludGVnZXI7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0RnJvbURFUigpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZUhleDogdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlld1swXSA9PT0gMFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LnN1YmFycmF5KDEpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudmFsdWVCbG9jay50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuX2EkbyA9IEludGVnZXI7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuSW50ZWdlciA9IF9hJG87XHJcbn0pKCk7XHJcbkludGVnZXIuTkFNRSA9IFwiSU5URUdFUlwiO1xuXG52YXIgX2EkbjtcclxuY2xhc3MgRW51bWVyYXRlZCBleHRlbmRzIEludGVnZXIge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTA7XHJcbiAgICB9XHJcbn1cclxuX2EkbiA9IEVudW1lcmF0ZWQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRW51bWVyYXRlZCA9IF9hJG47XHJcbn0pKCk7XHJcbkVudW1lcmF0ZWQuTkFNRSA9IFwiRU5VTUVSQVRFRFwiO1xuXG5jbGFzcyBMb2NhbFNpZFZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlRGVjID0gLTEsIGlzRmlyc3RTaWQgPSBmYWxzZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlRGVjID0gdmFsdWVEZWM7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0U2lkID0gaXNGaXJzdFNpZDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmICghaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnB1dFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCBpbnB1dFZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRCdWZmZXIgPSBpbnB1dFZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4Vmlld1tpXSA9IGludEJ1ZmZlcltpXSAmIDB4N0Y7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGgrKztcclxuICAgICAgICAgICAgaWYgKChpbnRCdWZmZXJbaV0gJiAweDgwKSA9PT0gMHgwMClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZW1wVmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ibG9ja0xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRlbXBWaWV3W2ldID0gdGhpcy52YWx1ZUhleFZpZXdbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdGVtcFZpZXc7XHJcbiAgICAgICAgaWYgKChpbnRCdWZmZXJbdGhpcy5ibG9ja0xlbmd0aCAtIDFdICYgMHg4MCkgIT09IDB4MDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRW5kIG9mIGlucHV0IHJlYWNoZWQgYmVmb3JlIG1lc3NhZ2Ugd2FzIGZ1bGx5IGRlY29kZWRcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy52YWx1ZUhleFZpZXdbMF0gPT09IDB4MDApXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBmb3JtYXQgb2YgU0lEIGVuY29kaW5nXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmJsb2NrTGVuZ3RoIDw9IDgpXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVEZWMgPSBwdnV0aWxzLnV0aWxGcm9tQmFzZSh0aGlzLnZhbHVlSGV4VmlldywgNyk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiVG9vIGJpZyBTSUQgZm9yIGRlY29kaW5nLCBoZXggb25seVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlQmlnSW50KHZhbHVlKSB7XHJcbiAgICAgICAgYXNzZXJ0QmlnSW50KCk7XHJcbiAgICAgICAgbGV0IGJpdHMgPSBCaWdJbnQodmFsdWUpLnRvU3RyaW5nKDIpO1xyXG4gICAgICAgIHdoaWxlIChiaXRzLmxlbmd0aCAlIDcpIHtcclxuICAgICAgICAgICAgYml0cyA9IFwiMFwiICsgYml0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaXRzLmxlbmd0aCAvIDcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYnl0ZXNbaV0gPSBwYXJzZUludChiaXRzLnNsaWNlKGkgKiA3LCBpICogNyArIDcpLCAyKSArIChpICsgMSA8IGJ5dGVzLmxlbmd0aCA/IDB4ODAgOiAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcm9tQkVSKGJ5dGVzLmJ1ZmZlciwgMCwgYnl0ZXMubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGgpKTtcclxuICAgICAgICAgICAgY29uc3QgY3VyVmlldyA9IHRoaXMudmFsdWVIZXhWaWV3O1xyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHRoaXMuYmxvY2tMZW5ndGggLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpXSA9IGN1clZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICByZXRWaWV3W3RoaXMuYmxvY2tMZW5ndGggLSAxXSA9IGN1clZpZXdbdGhpcy5ibG9ja0xlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVuY29kZWRCdWYgPSBwdnV0aWxzLnV0aWxUb0Jhc2UodGhpcy52YWx1ZURlYywgNyk7XHJcbiAgICAgICAgaWYgKGVuY29kZWRCdWYuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFcnJvciBkdXJpbmcgZW5jb2RpbmcgU0lEIHZhbHVlXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaV0gPSBlbmNvZGVkVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbbGVuXSA9IGVuY29kZWRWaWV3W2xlbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRWaWV3O1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIZXhPbmx5KVxyXG4gICAgICAgICAgICByZXN1bHQgPSBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlSGV4Vmlldyk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRmlyc3RTaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzaWRWYWx1ZSA9IHRoaXMudmFsdWVEZWM7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZURlYyA8PSAzOSlcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIjAuXCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZURlYyA8PSA3OSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIjEuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZFZhbHVlIC09IDQwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCIyLlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRWYWx1ZSAtPSA4MDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2lkVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnZhbHVlRGVjLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlRGVjOiB0aGlzLnZhbHVlRGVjLFxyXG4gICAgICAgICAgICBpc0ZpcnN0U2lkOiB0aGlzLmlzRmlyc3RTaWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5Mb2NhbFNpZFZhbHVlQmxvY2suTkFNRSA9IFwic2lkQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jayBleHRlbmRzIFZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSA9IEVNUFRZX1NUUklORywgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIHdoaWxlIChpbnB1dExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2lkQmxvY2sgPSBuZXcgTG9jYWxTaWRWYWx1ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IHNpZEJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIHJlc3VsdE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gc2lkQmxvY2suZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHNpZEJsb2NrLmlzRmlyc3RTaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpbnB1dExlbmd0aCAtPSBzaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgY29uc3QgcmV0QnVmZmVycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUJ1ZiA9IHRoaXMudmFsdWVbaV0udG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWVCdWYuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVbaV0uZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldEJ1ZmZlcnMucHVzaCh2YWx1ZUJ1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25jYXQocmV0QnVmZmVycyk7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKHN0cmluZykge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICBsZXQgcG9zMSA9IDA7XHJcbiAgICAgICAgbGV0IHBvczIgPSAwO1xyXG4gICAgICAgIGxldCBzaWQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBwb3MyID0gc3RyaW5nLmluZGV4T2YoXCIuXCIsIHBvczEpO1xyXG4gICAgICAgICAgICBpZiAocG9zMiA9PT0gLTEpXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xyXG4gICAgICAgICAgICBwb3MxID0gcG9zMiArIDE7XHJcbiAgICAgICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IHRoaXMudmFsdWVbMF07XHJcbiAgICAgICAgICAgICAgICBsZXQgcGx1cyA9IDA7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpZEJsb2NrLnZhbHVlRGVjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdXMgPSA0MDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVzID0gODA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkU0lEID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocGFyc2VkU0lEKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBzaWRCbG9jay52YWx1ZURlYyA9IHBhcnNlZFNJRCArIHBsdXM7XHJcbiAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IG5ldyBMb2NhbFNpZFZhbHVlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGlmIChzaWQgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydEJpZ0ludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZFZhbHVlID0gQmlnSW50KHNpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2lkQmxvY2sudmFsdWVCaWdJbnQgPSBzaWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpZEJsb2NrLnZhbHVlRGVjID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKHNpZEJsb2NrLnZhbHVlRGVjKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpZEJsb2NrLmlzRmlyc3RTaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gd2hpbGUgKHBvczIgIT09IC0xKTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBpc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaXNIZXhPbmx5ID0gdGhpcy52YWx1ZVtpXS5pc0hleE9ubHk7XHJcbiAgICAgICAgICAgIGxldCBzaWRTdHIgPSB0aGlzLnZhbHVlW2ldLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChpICE9PSAwKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYCR7cmVzdWx0fS5gO1xyXG4gICAgICAgICAgICBpZiAoaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBzaWRTdHIgPSBgeyR7c2lkU3RyfX1gO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVbaV0uaXNGaXJzdFNpZClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBgMi57JHtzaWRTdHJ9IC0gODB9YDtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2lkU3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRTdHI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgc2lkQXJyYXk6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5zaWRBcnJheS5wdXNoKHRoaXMudmFsdWVbaV0udG9KU09OKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2suTkFNRSA9IFwiT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2tcIjtcblxudmFyIF9hJG07XHJcbmNsYXNzIE9iamVjdElkZW50aWZpZXIgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gNjtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlQmxvY2sudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLmZyb21TdHJpbmcodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHt0aGlzLnZhbHVlQmxvY2sudG9TdHJpbmcoKSB8fCBcImVtcHR5XCJ9YDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VmFsdWUoKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbl9hJG0gPSBPYmplY3RJZGVudGlmaWVyO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk9iamVjdElkZW50aWZpZXIgPSBfYSRtO1xyXG59KSgpO1xyXG5PYmplY3RJZGVudGlmaWVyLk5BTUUgPSBcIk9CSkVDVCBJREVOVElGSUVSXCI7XG5cbmNsYXNzIExvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soTG9jYWxCYXNlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWVEZWMgPSAwLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWVEZWMgPSB2YWx1ZURlYztcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmIChpbnB1dExlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIGlucHV0VmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSlcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3W2ldID0gaW50QnVmZmVyW2ldICYgMHg3RjtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCsrO1xyXG4gICAgICAgICAgICBpZiAoKGludEJ1ZmZlcltpXSAmIDB4ODApID09PSAweDAwKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlbXBWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2NrTGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHRlbXBWaWV3W2ldID0gdGhpcy52YWx1ZUhleFZpZXdbaV07XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB0ZW1wVmlldztcclxuICAgICAgICBpZiAoKGludEJ1ZmZlclt0aGlzLmJsb2NrTGVuZ3RoIC0gMV0gJiAweDgwKSAhPT0gMHgwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZFwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlld1swXSA9PT0gMHgwMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTmVlZGxlc3NseSBsb25nIGZvcm1hdCBvZiBTSUQgZW5jb2RpbmdcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tMZW5ndGggPD0gOClcclxuICAgICAgICAgICAgdGhpcy52YWx1ZURlYyA9IHB2dXRpbHMudXRpbEZyb21CYXNlKHRoaXMudmFsdWVIZXhWaWV3LCA3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJUb28gYmlnIFNJRCBmb3IgZGVjb2RpbmcsIGhleCBvbmx5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSGV4T25seSkge1xyXG4gICAgICAgICAgICBpZiAoc2l6ZU9ubHkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1clZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzLmJsb2NrTGVuZ3RoIC0gMSk7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaV0gPSBjdXJWaWV3W2ldIHwgMHg4MDtcclxuICAgICAgICAgICAgcmV0Vmlld1t0aGlzLmJsb2NrTGVuZ3RoIC0gMV0gPSBjdXJWaWV3W3RoaXMuYmxvY2tMZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMudmFsdWVEZWMsIDcpO1xyXG4gICAgICAgIGlmIChlbmNvZGVkQnVmLmJ5dGVMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRXJyb3IgZHVyaW5nIGVuY29kaW5nIFNJRCB2YWx1ZVwiO1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zik7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGVuY29kZWRCdWYuYnl0ZUxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgICAgICByZXRWaWV3W2ldID0gZW5jb2RlZFZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICByZXRWaWV3W2xlbl0gPSBlbmNvZGVkVmlld1tsZW5dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy5pc0hleE9ubHkpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVIZXhWaWV3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy52YWx1ZURlYy50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZURlYzogdGhpcy52YWx1ZURlYyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrLk5BTUUgPSBcInJlbGF0aXZlU2lkQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxSZWxhdGl2ZU9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrIGV4dGVuZHMgVmFsdWVCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gRU1QVFlfU1RSSU5HLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IG5ldyBMb2NhbFJlbGF0aXZlU2lkVmFsdWVCbG9jaygpO1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBzaWRCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCByZXN1bHRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IHNpZEJsb2NrLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpbnB1dExlbmd0aCAtPSBzaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCByZXRCdWZmZXJzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQnVmID0gdGhpcy52YWx1ZVtpXS50b0JFUihzaXplT25seSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUJ1Zi5ieXRlTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gdGhpcy52YWx1ZVtpXS5lcnJvcjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0QnVmZmVycy5wdXNoKHZhbHVlQnVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmNhdChyZXRCdWZmZXJzKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgIGxldCBwb3MxID0gMDtcclxuICAgICAgICBsZXQgcG9zMiA9IDA7XHJcbiAgICAgICAgbGV0IHNpZCA9IFwiXCI7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBwb3MyID0gc3RyaW5nLmluZGV4T2YoXCIuXCIsIHBvczEpO1xyXG4gICAgICAgICAgICBpZiAocG9zMiA9PT0gLTEpXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xyXG4gICAgICAgICAgICBwb3MxID0gcG9zMiArIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZEJsb2NrID0gbmV3IExvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgIHNpZEJsb2NrLnZhbHVlRGVjID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihzaWRCbG9jay52YWx1ZURlYykpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9IHdoaWxlIChwb3MyICE9PSAtMSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBsZXQgaXNIZXhPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlzSGV4T25seSA9IHRoaXMudmFsdWVbaV0uaXNIZXhPbmx5O1xyXG4gICAgICAgICAgICBsZXQgc2lkU3RyID0gdGhpcy52YWx1ZVtpXS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gMClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGAke3Jlc3VsdH0uYDtcclxuICAgICAgICAgICAgaWYgKGlzSGV4T25seSkge1xyXG4gICAgICAgICAgICAgICAgc2lkU3RyID0gYHske3NpZFN0cn19YDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRTdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNpZFN0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBzaWRBcnJheTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIG9iamVjdC5zaWRBcnJheS5wdXNoKHRoaXMudmFsdWVbaV0udG9KU09OKCkpO1xyXG4gICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxSZWxhdGl2ZU9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrLk5BTUUgPSBcIlJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2tcIjtcblxudmFyIF9hJGw7XHJcbmNsYXNzIFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllciBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDEzO1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudmFsdWVCbG9jay50b1N0cmluZygpIHx8IFwiZW1wdHlcIn1gO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuX2EkbCA9IFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllcjtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5SZWxhdGl2ZU9iamVjdElkZW50aWZpZXIgPSBfYSRsO1xyXG59KSgpO1xyXG5SZWxhdGl2ZU9iamVjdElkZW50aWZpZXIuTkFNRSA9IFwiUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyXCI7XG5cbnZhciBfYSRrO1xyXG5jbGFzcyBTZXF1ZW5jZSBleHRlbmRzIENvbnN0cnVjdGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE2O1xyXG4gICAgfVxyXG59XHJcbl9hJGsgPSBTZXF1ZW5jZTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5TZXF1ZW5jZSA9IF9hJGs7XHJcbn0pKCk7XHJcblNlcXVlbmNlLk5BTUUgPSBcIlNFUVVFTkNFXCI7XG5cbnZhciBfYSRqO1xyXG5jbGFzcyBTZXQgZXh0ZW5kcyBDb25zdHJ1Y3RlZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxNztcclxuICAgIH1cclxufVxyXG5fYSRqID0gU2V0O1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlNldCA9IF9hJGo7XHJcbn0pKCk7XHJcblNldC5OQU1FID0gXCJTRVRcIjtcblxuY2xhc3MgTG9jYWxTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gRU1QVFlfU1RSSU5HO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsU3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbmNsYXNzIExvY2FsU2ltcGxlU3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIExvY2FsU3RyaW5nVmFsdWVCbG9jayB7XHJcbn1cclxuTG9jYWxTaW1wbGVTdHJpbmdWYWx1ZUJsb2NrLk5BTUUgPSBcIlNpbXBsZVN0cmluZ1ZhbHVlQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayBleHRlbmRzIEJhc2VTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxTaW1wbGVTdHJpbmdWYWx1ZUJsb2NrKTtcclxuICAgIH1cclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyTGVuID0gaW5wdXRTdHJpbmcubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc3RyTGVuKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ckxlbjsgaSsrKVxyXG4gICAgICAgICAgICB2aWV3W2ldID0gaW5wdXRTdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBpbnB1dFN0cmluZztcclxuICAgIH1cclxufVxyXG5Mb2NhbFNpbXBsZVN0cmluZ0Jsb2NrLk5BTUUgPSBcIlNJTVBMRSBTVFJJTkdcIjtcblxuY2xhc3MgTG9jYWxVdGY4U3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgZnJvbUJ1ZmZlcihpbnB1dEJ1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gcHZ0c3V0aWxzLkNvbnZlcnQuVG9VdGY4U3RyaW5nKGlucHV0QnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChgRXJyb3IgZHVyaW5nIFwiZGVjb2RlVVJJQ29tcG9uZW50XCI6ICR7ZXh9LCB1c2luZyByYXcgc3RyaW5nYCk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IHB2dHN1dGlscy5Db252ZXJ0LlRvQmluYXJ5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21VdGY4U3RyaW5nKGlucHV0U3RyaW5nKSk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gaW5wdXRTdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxVdGY4U3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJVdGY4U3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkaTtcclxuY2xhc3MgVXRmOFN0cmluZyBleHRlbmRzIExvY2FsVXRmOFN0cmluZ1ZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTI7XHJcbiAgICB9XHJcbn1cclxuX2EkaSA9IFV0ZjhTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuVXRmOFN0cmluZyA9IF9hJGk7XHJcbn0pKCk7XHJcblV0ZjhTdHJpbmcuTkFNRSA9IFwiVVRGOFN0cmluZ1wiO1xuXG5jbGFzcyBMb2NhbEJtcFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBwdnRzdXRpbHMuQ29udmVydC5Ub1V0ZjE2U3RyaW5nKGlucHV0QnVmZmVyKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IGlucHV0U3RyaW5nO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShwdnRzdXRpbHMuQ29udmVydC5Gcm9tVXRmMTZTdHJpbmcoaW5wdXRTdHJpbmcpKTtcclxuICAgIH1cclxufVxyXG5Mb2NhbEJtcFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiQm1wU3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkaDtcclxuY2xhc3MgQm1wU3RyaW5nIGV4dGVuZHMgTG9jYWxCbXBTdHJpbmdWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzMDtcclxuICAgIH1cclxufVxyXG5fYSRoID0gQm1wU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkJtcFN0cmluZyA9IF9hJGg7XHJcbn0pKCk7XHJcbkJtcFN0cmluZy5OQU1FID0gXCJCTVBTdHJpbmdcIjtcblxuY2xhc3MgTG9jYWxVbml2ZXJzYWxTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBmcm9tQnVmZmVyKGlucHV0QnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgY29weUJ1ZmZlciA9IEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dEJ1ZmZlcikgPyBpbnB1dEJ1ZmZlci5zbGljZSgpLmJ1ZmZlciA6IGlucHV0QnVmZmVyLnNsaWNlKDApO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlVmlldyA9IG5ldyBVaW50OEFycmF5KGNvcHlCdWZmZXIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVWaWV3Lmxlbmd0aDsgaSArPSA0KSB7XHJcbiAgICAgICAgICAgIHZhbHVlVmlld1tpXSA9IHZhbHVlVmlld1tpICsgM107XHJcbiAgICAgICAgICAgIHZhbHVlVmlld1tpICsgMV0gPSB2YWx1ZVZpZXdbaSArIDJdO1xyXG4gICAgICAgICAgICB2YWx1ZVZpZXdbaSArIDJdID0gMHgwMDtcclxuICAgICAgICAgICAgdmFsdWVWaWV3W2kgKyAzXSA9IDB4MDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQzMkFycmF5KGNvcHlCdWZmZXIpKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBzdHJMZW5ndGggPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgdmFsdWVIZXhWaWV3ID0gdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHN0ckxlbmd0aCAqIDQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29kZUJ1ZiA9IHB2dXRpbHMudXRpbFRvQmFzZShpbnB1dFN0cmluZy5jaGFyQ29kZUF0KGkpLCA4KTtcclxuICAgICAgICAgICAgY29uc3QgY29kZVZpZXcgPSBuZXcgVWludDhBcnJheShjb2RlQnVmKTtcclxuICAgICAgICAgICAgaWYgKGNvZGVWaWV3Lmxlbmd0aCA+IDQpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZGlmID0gNCAtIGNvZGVWaWV3Lmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IChjb2RlVmlldy5sZW5ndGggLSAxKTsgaiA+PSAwOyBqLS0pXHJcbiAgICAgICAgICAgICAgICB2YWx1ZUhleFZpZXdbaSAqIDQgKyBqICsgZGlmXSA9IGNvZGVWaWV3W2pdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBpbnB1dFN0cmluZztcclxuICAgIH1cclxufVxyXG5Mb2NhbFVuaXZlcnNhbFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiVW5pdmVyc2FsU3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkZztcclxuY2xhc3MgVW5pdmVyc2FsU3RyaW5nIGV4dGVuZHMgTG9jYWxVbml2ZXJzYWxTdHJpbmdWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyODtcclxuICAgIH1cclxufVxyXG5fYSRnID0gVW5pdmVyc2FsU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlVuaXZlcnNhbFN0cmluZyA9IF9hJGc7XHJcbn0pKCk7XHJcblVuaXZlcnNhbFN0cmluZy5OQU1FID0gXCJVbml2ZXJzYWxTdHJpbmdcIjtcblxudmFyIF9hJGY7XHJcbmNsYXNzIE51bWVyaWNTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE4O1xyXG4gICAgfVxyXG59XHJcbl9hJGYgPSBOdW1lcmljU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk51bWVyaWNTdHJpbmcgPSBfYSRmO1xyXG59KSgpO1xyXG5OdW1lcmljU3RyaW5nLk5BTUUgPSBcIk51bWVyaWNTdHJpbmdcIjtcblxudmFyIF9hJGU7XHJcbmNsYXNzIFByaW50YWJsZVN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTk7XHJcbiAgICB9XHJcbn1cclxuX2EkZSA9IFByaW50YWJsZVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5QcmludGFibGVTdHJpbmcgPSBfYSRlO1xyXG59KSgpO1xyXG5QcmludGFibGVTdHJpbmcuTkFNRSA9IFwiUHJpbnRhYmxlU3RyaW5nXCI7XG5cbnZhciBfYSRkO1xyXG5jbGFzcyBUZWxldGV4U3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMDtcclxuICAgIH1cclxufVxyXG5fYSRkID0gVGVsZXRleFN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5UZWxldGV4U3RyaW5nID0gX2EkZDtcclxufSkoKTtcclxuVGVsZXRleFN0cmluZy5OQU1FID0gXCJUZWxldGV4U3RyaW5nXCI7XG5cbnZhciBfYSRjO1xyXG5jbGFzcyBWaWRlb3RleFN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjE7XHJcbiAgICB9XHJcbn1cclxuX2EkYyA9IFZpZGVvdGV4U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlZpZGVvdGV4U3RyaW5nID0gX2EkYztcclxufSkoKTtcclxuVmlkZW90ZXhTdHJpbmcuTkFNRSA9IFwiVmlkZW90ZXhTdHJpbmdcIjtcblxudmFyIF9hJGI7XHJcbmNsYXNzIElBNVN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjI7XHJcbiAgICB9XHJcbn1cclxuX2EkYiA9IElBNVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5JQTVTdHJpbmcgPSBfYSRiO1xyXG59KSgpO1xyXG5JQTVTdHJpbmcuTkFNRSA9IFwiSUE1U3RyaW5nXCI7XG5cbnZhciBfYSRhO1xyXG5jbGFzcyBHcmFwaGljU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNTtcclxuICAgIH1cclxufVxyXG5fYSRhID0gR3JhcGhpY1N0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5HcmFwaGljU3RyaW5nID0gX2EkYTtcclxufSkoKTtcclxuR3JhcGhpY1N0cmluZy5OQU1FID0gXCJHcmFwaGljU3RyaW5nXCI7XG5cbnZhciBfYSQ5O1xyXG5jbGFzcyBWaXNpYmxlU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNjtcclxuICAgIH1cclxufVxyXG5fYSQ5ID0gVmlzaWJsZVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5WaXNpYmxlU3RyaW5nID0gX2EkOTtcclxufSkoKTtcclxuVmlzaWJsZVN0cmluZy5OQU1FID0gXCJWaXNpYmxlU3RyaW5nXCI7XG5cbnZhciBfYSQ4O1xyXG5jbGFzcyBHZW5lcmFsU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNztcclxuICAgIH1cclxufVxyXG5fYSQ4ID0gR2VuZXJhbFN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5HZW5lcmFsU3RyaW5nID0gX2EkODtcclxufSkoKTtcclxuR2VuZXJhbFN0cmluZy5OQU1FID0gXCJHZW5lcmFsU3RyaW5nXCI7XG5cbnZhciBfYSQ3O1xyXG5jbGFzcyBDaGFyYWN0ZXJTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI5O1xyXG4gICAgfVxyXG59XHJcbl9hJDcgPSBDaGFyYWN0ZXJTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQ2hhcmFjdGVyU3RyaW5nID0gX2EkNztcclxufSkoKTtcclxuQ2hhcmFjdGVyU3RyaW5nLk5BTUUgPSBcIkNoYXJhY3RlclN0cmluZ1wiO1xuXG52YXIgX2EkNjtcclxuY2xhc3MgVVRDVGltZSBleHRlbmRzIFZpc2libGVTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSwgdmFsdWVEYXRlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMueWVhciA9IDA7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IDA7XHJcbiAgICAgICAgdGhpcy5kYXkgPSAwO1xyXG4gICAgICAgIHRoaXMuaG91ciA9IDA7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSAwO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gMDtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3W2ldID0gdmFsdWUuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZyb21EYXRlKHZhbHVlRGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnRvQnVmZmVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMztcclxuICAgIH1cclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLmZyb21TdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcikpKTtcclxuICAgIH1cclxuICAgIHRvQnVmZmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZnJvbURhdGUoaW5wdXREYXRlKSB7XHJcbiAgICAgICAgdGhpcy55ZWFyID0gaW5wdXREYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IGlucHV0RGF0ZS5nZXRVVENNb250aCgpICsgMTtcclxuICAgICAgICB0aGlzLmRheSA9IGlucHV0RGF0ZS5nZXRVVENEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5ob3VyID0gaW5wdXREYXRlLmdldFVUQ0hvdXJzKCk7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSBpbnB1dERhdGUuZ2V0VVRDTWludXRlcygpO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gaW5wdXREYXRlLmdldFVUQ1NlY29uZHMoKTtcclxuICAgIH1cclxuICAgIHRvRGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gKG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCkpKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBwYXJzZXIgPSAvKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pWi9pZztcclxuICAgICAgICBjb25zdCBwYXJzZXJBcnJheSA9IHBhcnNlci5leGVjKGlucHV0U3RyaW5nKTtcclxuICAgICAgICBpZiAocGFyc2VyQXJyYXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCI7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KHBhcnNlckFycmF5WzFdLCAxMCk7XHJcbiAgICAgICAgaWYgKHllYXIgPj0gNTApXHJcbiAgICAgICAgICAgIHRoaXMueWVhciA9IDE5MDAgKyB5ZWFyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy55ZWFyID0gMjAwMCArIHllYXI7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IHBhcnNlSW50KHBhcnNlckFycmF5WzJdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5kYXkgPSBwYXJzZUludChwYXJzZXJBcnJheVszXSwgMTApO1xyXG4gICAgICAgIHRoaXMuaG91ciA9IHBhcnNlSW50KHBhcnNlckFycmF5WzRdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSBwYXJzZUludChwYXJzZXJBcnJheVs1XSwgMTApO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbNl0sIDEwKTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKGVuY29kaW5nID0gXCJpc29cIikge1xyXG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJpc29cIikge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IG5ldyBBcnJheSg3KTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbMF0gPSBwdnV0aWxzLnBhZE51bWJlcigoKHRoaXMueWVhciA8IDIwMDApID8gKHRoaXMueWVhciAtIDE5MDApIDogKHRoaXMueWVhciAtIDIwMDApKSwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzFdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5tb250aCwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzJdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5kYXksIDIpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVszXSA9IHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuaG91ciwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzRdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5taW51dGUsIDIpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVs1XSA9IHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuc2Vjb25kLCAyKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbNl0gPSBcIlpcIjtcclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dEFycmF5LmpvaW4oXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZyhlbmNvZGluZyk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB5ZWFyOiB0aGlzLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLm1vbnRoLFxyXG4gICAgICAgICAgICBkYXk6IHRoaXMuZGF5LFxyXG4gICAgICAgICAgICBob3VyOiB0aGlzLmhvdXIsXHJcbiAgICAgICAgICAgIG1pbnV0ZTogdGhpcy5taW51dGUsXHJcbiAgICAgICAgICAgIHNlY29uZDogdGhpcy5zZWNvbmQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5fYSQ2ID0gVVRDVGltZTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5VVENUaW1lID0gX2EkNjtcclxufSkoKTtcclxuVVRDVGltZS5OQU1FID0gXCJVVENUaW1lXCI7XG5cbnZhciBfYSQ1O1xyXG5jbGFzcyBHZW5lcmFsaXplZFRpbWUgZXh0ZW5kcyBVVENUaW1lIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHZhciBfYjtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICAoX2IgPSB0aGlzLm1pbGxpc2Vjb25kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAodGhpcy5taWxsaXNlY29uZCA9IDApO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI0O1xyXG4gICAgfVxyXG4gICAgZnJvbURhdGUoaW5wdXREYXRlKSB7XHJcbiAgICAgICAgc3VwZXIuZnJvbURhdGUoaW5wdXREYXRlKTtcclxuICAgICAgICB0aGlzLm1pbGxpc2Vjb25kID0gaW5wdXREYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xyXG4gICAgfVxyXG4gICAgdG9EYXRlKCkge1xyXG4gICAgICAgIHJldHVybiAobmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1pbGxpc2Vjb25kKSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIGxldCBpc1VUQyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB0aW1lU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZGF0ZVRpbWVTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBmcmFjdGlvblBhcnQgPSAwO1xyXG4gICAgICAgIGxldCBwYXJzZXI7XHJcbiAgICAgICAgbGV0IGhvdXJEaWZmZXJlbmNlID0gMDtcclxuICAgICAgICBsZXQgbWludXRlRGlmZmVyZW5jZSA9IDA7XHJcbiAgICAgICAgaWYgKGlucHV0U3RyaW5nW2lucHV0U3RyaW5nLmxlbmd0aCAtIDFdID09PSBcIlpcIikge1xyXG4gICAgICAgICAgICB0aW1lU3RyaW5nID0gaW5wdXRTdHJpbmcuc3Vic3RyaW5nKDAsIGlucHV0U3RyaW5nLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICBpc1VUQyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSBuZXcgTnVtYmVyKGlucHV0U3RyaW5nW2lucHV0U3RyaW5nLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlci52YWx1ZU9mKCkpKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICB0aW1lU3RyaW5nID0gaW5wdXRTdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1VUQykge1xyXG4gICAgICAgICAgICBpZiAodGltZVN0cmluZy5pbmRleE9mKFwiK1wiKSAhPT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIGlmICh0aW1lU3RyaW5nLmluZGV4T2YoXCItXCIpICE9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtdWx0aXBsaWVyID0gMTtcclxuICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2VQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIitcIik7XHJcbiAgICAgICAgICAgIGxldCBkaWZmZXJlbmNlU3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2VQb3NpdGlvbiA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIi1cIik7XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2VQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZyhkaWZmZXJlbmNlUG9zaXRpb24gKyAxKTtcclxuICAgICAgICAgICAgICAgIHRpbWVTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZygwLCBkaWZmZXJlbmNlUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKChkaWZmZXJlbmNlU3RyaW5nLmxlbmd0aCAhPT0gMikgJiYgKGRpZmZlcmVuY2VTdHJpbmcubGVuZ3RoICE9PSA0KSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gcGFyc2VJbnQoZGlmZmVyZW5jZVN0cmluZy5zdWJzdHJpbmcoMCwgMiksIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihudW1iZXIudmFsdWVPZigpKSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBob3VyRGlmZmVyZW5jZSA9IG11bHRpcGxpZXIgKiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW5jZVN0cmluZy5sZW5ndGggPT09IDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChkaWZmZXJlbmNlU3RyaW5nLnN1YnN0cmluZygyLCA0KSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihudW1iZXIudmFsdWVPZigpKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZURpZmZlcmVuY2UgPSBtdWx0aXBsaWVyICogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmcmFjdGlvblBvaW50UG9zaXRpb24gPSB0aW1lU3RyaW5nLmluZGV4T2YoXCIuXCIpO1xyXG4gICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gPT09IC0xKVxyXG4gICAgICAgICAgICBmcmFjdGlvblBvaW50UG9zaXRpb24gPSB0aW1lU3RyaW5nLmluZGV4T2YoXCIsXCIpO1xyXG4gICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uUGFydENoZWNrID0gbmV3IE51bWJlcihgMCR7dGltZVN0cmluZy5zdWJzdHJpbmcoZnJhY3Rpb25Qb2ludFBvc2l0aW9uKX1gKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKGZyYWN0aW9uUGFydENoZWNrLnZhbHVlT2YoKSkpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIGZyYWN0aW9uUGFydCA9IGZyYWN0aW9uUGFydENoZWNrLnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgZGF0ZVRpbWVTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZygwLCBmcmFjdGlvblBvaW50UG9zaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGRhdGVUaW1lU3RyaW5nID0gdGltZVN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSA4KTpcclxuICAgICAgICAgICAgICAgIHBhcnNlciA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkvaWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJhY3Rpb25Qb2ludFBvc2l0aW9uICE9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSAxMCk6XHJcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSAvKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkvaWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJhY3Rpb25Qb2ludFBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmcmFjdGlvblJlc3VsdCA9IDYwICogZnJhY3Rpb25QYXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWludXRlID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25SZXN1bHQgPSA2MCAqIChmcmFjdGlvblJlc3VsdCAtIHRoaXMubWludXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUmVzdWx0ID0gMTAwMCAqIChmcmFjdGlvblJlc3VsdCAtIHRoaXMuc2Vjb25kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSAxMik6XHJcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSAvKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uUmVzdWx0ID0gNjAgKiBmcmFjdGlvblBhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFjdGlvblJlc3VsdCA9IDEwMDAgKiAoZnJhY3Rpb25SZXN1bHQgLSB0aGlzLnNlY29uZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKGRhdGVUaW1lU3RyaW5nLmxlbmd0aCA9PT0gMTQpOlxyXG4gICAgICAgICAgICAgICAgcGFyc2VyID0gLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25SZXN1bHQgPSAxMDAwICogZnJhY3Rpb25QYXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZXJBcnJheSA9IHBhcnNlci5leGVjKGRhdGVUaW1lU3RyaW5nKTtcclxuICAgICAgICBpZiAocGFyc2VyQXJyYXkgPT09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHBhcnNlckFycmF5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoaikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhciA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXkgPSBwYXJzZUludChwYXJzZXJBcnJheVtqXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG91ciA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCkgKyBob3VyRGlmZmVyZW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZSA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCkgKyBtaW51dGVEaWZmZXJlbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1VUQyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcERhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5taWxsaXNlY29uZCk7XHJcbiAgICAgICAgICAgIHRoaXMueWVhciA9IHRlbXBEYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0ZW1wRGF0ZS5nZXRVVENNb250aCgpO1xyXG4gICAgICAgICAgICB0aGlzLmRheSA9IHRlbXBEYXRlLmdldFVUQ0RheSgpO1xyXG4gICAgICAgICAgICB0aGlzLmhvdXIgPSB0ZW1wRGF0ZS5nZXRVVENIb3VycygpO1xyXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZSA9IHRlbXBEYXRlLmdldFVUQ01pbnV0ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSB0ZW1wRGF0ZS5nZXRVVENTZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSB0ZW1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZyhlbmNvZGluZyA9IFwiaXNvXCIpIHtcclxuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IFwiaXNvXCIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLnllYXIsIDQpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1vbnRoLCAyKSk7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2gocHZ1dGlscy5wYWROdW1iZXIodGhpcy5kYXksIDIpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLmhvdXIsIDIpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1pbnV0ZSwgMikpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuc2Vjb25kLCAyKSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1pbGxpc2Vjb25kICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2gocHZ1dGlscy5wYWROdW1iZXIodGhpcy5taWxsaXNlY29uZCwgMykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2goXCJaXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0QXJyYXkuam9pbihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKGVuY29kaW5nKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgbWlsbGlzZWNvbmQ6IHRoaXMubWlsbGlzZWNvbmQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5fYSQ1ID0gR2VuZXJhbGl6ZWRUaW1lO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkdlbmVyYWxpemVkVGltZSA9IF9hJDU7XHJcbn0pKCk7XHJcbkdlbmVyYWxpemVkVGltZS5OQU1FID0gXCJHZW5lcmFsaXplZFRpbWVcIjtcblxudmFyIF9hJDQ7XHJcbmNsYXNzIERBVEUgZXh0ZW5kcyBVdGY4U3RyaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDMxO1xyXG4gICAgfVxyXG59XHJcbl9hJDQgPSBEQVRFO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkRBVEUgPSBfYSQ0O1xyXG59KSgpO1xyXG5EQVRFLk5BTUUgPSBcIkRBVEVcIjtcblxudmFyIF9hJDM7XHJcbmNsYXNzIFRpbWVPZkRheSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMzI7XHJcbiAgICB9XHJcbn1cclxuX2EkMyA9IFRpbWVPZkRheTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5UaW1lT2ZEYXkgPSBfYSQzO1xyXG59KSgpO1xyXG5UaW1lT2ZEYXkuTkFNRSA9IFwiVGltZU9mRGF5XCI7XG5cbnZhciBfYSQyO1xyXG5jbGFzcyBEYXRlVGltZSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMzM7XHJcbiAgICB9XHJcbn1cclxuX2EkMiA9IERhdGVUaW1lO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkRhdGVUaW1lID0gX2EkMjtcclxufSkoKTtcclxuRGF0ZVRpbWUuTkFNRSA9IFwiRGF0ZVRpbWVcIjtcblxudmFyIF9hJDE7XHJcbmNsYXNzIER1cmF0aW9uIGV4dGVuZHMgVXRmOFN0cmluZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzNDtcclxuICAgIH1cclxufVxyXG5fYSQxID0gRHVyYXRpb247XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRHVyYXRpb24gPSBfYSQxO1xyXG59KSgpO1xyXG5EdXJhdGlvbi5OQU1FID0gXCJEdXJhdGlvblwiO1xuXG52YXIgX2E7XHJcbmNsYXNzIFRJTUUgZXh0ZW5kcyBVdGY4U3RyaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE0O1xyXG4gICAgfVxyXG59XHJcbl9hID0gVElNRTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5USU1FID0gX2E7XHJcbn0pKCk7XHJcblRJTUUuTkFNRSA9IFwiVElNRVwiO1xuXG5jbGFzcyBBbnkge1xyXG4gICAgY29uc3RydWN0b3IoeyBuYW1lID0gRU1QVFlfU1RSSU5HLCBvcHRpb25hbCA9IGZhbHNlLCB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcclxuICAgIH1cclxufVxuXG5jbGFzcyBDaG9pY2UgZXh0ZW5kcyBBbnkge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSA9IFtdLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSZXBlYXRlZCBleHRlbmRzIEFueSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gbmV3IEFueSgpLCBsb2NhbCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUmF3RGF0YSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGRhdGEgPSBFTVBUWV9WSUVXIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShkYXRhKTtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc2V0IGRhdGEodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZW5kTGVuZ3RoID0gaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aDtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpLnN1YmFycmF5KGlucHV0T2Zmc2V0LCBlbmRMZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBlbmRMZW5ndGg7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLCBpbnB1dFNjaGVtYSkge1xyXG4gICAgaWYgKGlucHV0U2NoZW1hIGluc3RhbmNlb2YgQ2hvaWNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnB1dFNjaGVtYS52YWx1ZS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJlU2NoZW1hKHJvb3QsIGlucHV0RGF0YSwgaW5wdXRTY2hlbWEudmFsdWVbal0pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZlcmlmaWVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJXcm9uZyB2YWx1ZXMgZm9yIENob2ljZSB0eXBlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5oYXNPd25Qcm9wZXJ0eShOQU1FKSlcclxuICAgICAgICAgICAgICAgIF9yZXN1bHQubmFtZSA9IGlucHV0U2NoZW1hLm5hbWU7XHJcbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYSBpbnN0YW5jZW9mIEFueSkge1xyXG4gICAgICAgIGlmIChpbnB1dFNjaGVtYS5oYXNPd25Qcm9wZXJ0eShOQU1FKSlcclxuICAgICAgICAgICAgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXSA9IGlucHV0RGF0YTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgocm9vdCBpbnN0YW5jZW9mIE9iamVjdCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3Jvbmcgcm9vdCBvYmplY3RcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoaW5wdXREYXRhIGluc3RhbmNlb2YgT2JqZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBkYXRhXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoKGlucHV0U2NoZW1hIGluc3RhbmNlb2YgT2JqZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoSURfQkxPQ0sgaW4gaW5wdXRTY2hlbWEpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChGUk9NX0JFUiBpbiBpbnB1dFNjaGVtYS5pZEJsb2NrKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoVE9fQkVSIGluIGlucHV0U2NoZW1hLmlkQmxvY2spID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZW5jb2RlZElkID0gaW5wdXRTY2hlbWEuaWRCbG9jay50b0JFUihmYWxzZSk7XHJcbiAgICBpZiAoZW5jb2RlZElkLmJ5dGVMZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJFcnJvciBlbmNvZGluZyBpZEJsb2NrIGZvciBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlY29kZWRPZmZzZXQgPSBpbnB1dFNjaGVtYS5pZEJsb2NrLmZyb21CRVIoZW5jb2RlZElkLCAwLCBlbmNvZGVkSWQuYnl0ZUxlbmd0aCk7XHJcbiAgICBpZiAoZGVjb2RlZE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJFcnJvciBkZWNvZGluZyBpZEJsb2NrIGZvciBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmhhc093blByb3BlcnR5KFRBR19DTEFTUykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay50YWdDbGFzcyAhPT0gaW5wdXREYXRhLmlkQmxvY2sudGFnQ2xhc3MpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5oYXNPd25Qcm9wZXJ0eShUQUdfTlVNQkVSKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLnRhZ051bWJlciAhPT0gaW5wdXREYXRhLmlkQmxvY2sudGFnTnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaGFzT3duUHJvcGVydHkoSVNfQ09OU1RSVUNURUQpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCAhPT0gaW5wdXREYXRhLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICghKElTX0hFWF9PTkxZIGluIGlucHV0U2NoZW1hLmlkQmxvY2spKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5pc0hleE9ubHkgIT09IGlucHV0RGF0YS5pZEJsb2NrLmlzSGV4T25seSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmlzSGV4T25seSkge1xyXG4gICAgICAgIGlmICgoVkFMVUVfSEVYX1ZJRVcgaW4gaW5wdXRTY2hlbWEuaWRCbG9jaykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzY2hlbWFWaWV3ID0gaW5wdXRTY2hlbWEuaWRCbG9jay52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgY29uc3QgYXNuMVZpZXcgPSBpbnB1dERhdGEuaWRCbG9jay52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgaWYgKHNjaGVtYVZpZXcubGVuZ3RoICE9PSBhc24xVmlldy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYVZpZXcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYVZpZXdbaV0gIT09IGFzbjFWaWV3WzFdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpXHJcbiAgICAgICAgICAgIHJvb3RbaW5wdXRTY2hlbWEubmFtZV0gPSBpbnB1dERhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiB0eXBlU3RvcmUuQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICBsZXQgYWRtaXNzaW9uID0gMDtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiVW5rbm93biBlcnJvclwiLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0gaW5zdGFuY2VvZiBSZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoID09PSAwKSAmJlxyXG4gICAgICAgICAgICAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGggIT09IDApKSB7XHJcbiAgICAgICAgICAgIGxldCBfb3B0aW9uYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICBfb3B0aW9uYWwgPSBfb3B0aW9uYWwgJiYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0ub3B0aW9uYWwgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoX29wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRTY2hlbWEubmFtZSA9IGlucHV0U2NoZW1hLm5hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb290W2lucHV0U2NoZW1hLm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJvb3QuZXJyb3IgPSBcIkluY29uc2lzdGVudCBvYmplY3QgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoKGkgLSBhZG1pc3Npb24pID49IGlucHV0RGF0YS52YWx1ZUJsb2NrLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0ub3B0aW9uYWwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZXJyb3IgPSBcIkluY29uc2lzdGVudCBsZW5ndGggYmV0d2VlbiBBU04uMSBkYXRhIGFuZCBzY2hlbWFcIjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvb3RbaW5wdXRTY2hlbWEubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0Lm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0gaW5zdGFuY2VvZiBSZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaV0sIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmVyaWZpZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaXNzaW9uKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChOQU1FIGluIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0pICYmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWUubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5Um9vdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKExPQ0FMIGluIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0pICYmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLmxvY2FsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdCA9IGlucHV0RGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSb290ID0gcm9vdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcnJheVJvb3RbaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXS5uYW1lXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdFtpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdFtpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWVdLnB1c2goaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaSAtIGFkbWlzc2lvbl0sIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmVyaWZpZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlW2ldLm9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaXNzaW9uKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC52ZXJpZmllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRTY2hlbWEubmFtZSA9IGlucHV0U2NoZW1hLm5hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvb3RbaW5wdXRTY2hlbWEubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5uYW1lID0gaW5wdXRTY2hlbWEubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEucHJpbWl0aXZlU2NoZW1hICYmXHJcbiAgICAgICAgKFZBTFVFX0hFWF9WSUVXIGluIGlucHV0RGF0YS52YWx1ZUJsb2NrKSkge1xyXG4gICAgICAgIGNvbnN0IGFzbjEgPSBsb2NhbEZyb21CRVIoaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3KTtcclxuICAgICAgICBpZiAoYXNuMS5vZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGFzbjEucmVzdWx0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0Lm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcGFyZVNjaGVtYShyb290LCBhc24xLnJlc3VsdCwgaW5wdXRTY2hlbWEucHJpbWl0aXZlU2NoZW1hKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIHZlcmlmeVNjaGVtYShpbnB1dEJ1ZmZlciwgaW5wdXRTY2hlbWEpIHtcclxuICAgIGlmICgoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYSB0eXBlXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBhc24xID0gbG9jYWxGcm9tQkVSKHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKSk7XHJcbiAgICBpZiAoYXNuMS5vZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGFzbjEucmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb21wYXJlU2NoZW1hKGFzbjEucmVzdWx0LCBhc24xLnJlc3VsdCwgaW5wdXRTY2hlbWEpO1xyXG59XG5cbmV4cG9ydCB7IEFueSwgQmFzZUJsb2NrLCBCYXNlU3RyaW5nQmxvY2ssIEJpdFN0cmluZywgQm1wU3RyaW5nLCBCb29sZWFuLCBDaGFyYWN0ZXJTdHJpbmcsIENob2ljZSwgQ29uc3RydWN0ZWQsIERBVEUsIERhdGVUaW1lLCBEdXJhdGlvbiwgRW5kT2ZDb250ZW50LCBFbnVtZXJhdGVkLCBHZW5lcmFsU3RyaW5nLCBHZW5lcmFsaXplZFRpbWUsIEdyYXBoaWNTdHJpbmcsIEhleEJsb2NrLCBJQTVTdHJpbmcsIEludGVnZXIsIE51bGwsIE51bWVyaWNTdHJpbmcsIE9iamVjdElkZW50aWZpZXIsIE9jdGV0U3RyaW5nLCBQcmltaXRpdmUsIFByaW50YWJsZVN0cmluZywgUmF3RGF0YSwgUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyLCBSZXBlYXRlZCwgU2VxdWVuY2UsIFNldCwgVElNRSwgVGVsZXRleFN0cmluZywgVGltZU9mRGF5LCBVVENUaW1lLCBVbml2ZXJzYWxTdHJpbmcsIFV0ZjhTdHJpbmcsIFZhbHVlQmxvY2ssIFZpZGVvdGV4U3RyaW5nLCBWaWV3V3JpdGVyLCBWaXNpYmxlU3RyaW5nLCBjb21wYXJlU2NoZW1hLCBmcm9tQkVSLCB2ZXJpZnlTY2hlbWEgfTtcbiIsICJleHBvcnQgdmFyIEFzblR5cGVUeXBlcztcbihmdW5jdGlvbiAoQXNuVHlwZVR5cGVzKSB7XG4gICAgQXNuVHlwZVR5cGVzW0FzblR5cGVUeXBlc1tcIlNlcXVlbmNlXCJdID0gMF0gPSBcIlNlcXVlbmNlXCI7XG4gICAgQXNuVHlwZVR5cGVzW0FzblR5cGVUeXBlc1tcIlNldFwiXSA9IDFdID0gXCJTZXRcIjtcbiAgICBBc25UeXBlVHlwZXNbQXNuVHlwZVR5cGVzW1wiQ2hvaWNlXCJdID0gMl0gPSBcIkNob2ljZVwiO1xufSkoQXNuVHlwZVR5cGVzIHx8IChBc25UeXBlVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciBBc25Qcm9wVHlwZXM7XG4oZnVuY3Rpb24gKEFzblByb3BUeXBlcykge1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJBbnlcIl0gPSAxXSA9IFwiQW55XCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkJvb2xlYW5cIl0gPSAyXSA9IFwiQm9vbGVhblwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJPY3RldFN0cmluZ1wiXSA9IDNdID0gXCJPY3RldFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJCaXRTdHJpbmdcIl0gPSA0XSA9IFwiQml0U3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkludGVnZXJcIl0gPSA1XSA9IFwiSW50ZWdlclwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJFbnVtZXJhdGVkXCJdID0gNl0gPSBcIkVudW1lcmF0ZWRcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiT2JqZWN0SWRlbnRpZmllclwiXSA9IDddID0gXCJPYmplY3RJZGVudGlmaWVyXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlV0ZjhTdHJpbmdcIl0gPSA4XSA9IFwiVXRmOFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJCbXBTdHJpbmdcIl0gPSA5XSA9IFwiQm1wU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlVuaXZlcnNhbFN0cmluZ1wiXSA9IDEwXSA9IFwiVW5pdmVyc2FsU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIk51bWVyaWNTdHJpbmdcIl0gPSAxMV0gPSBcIk51bWVyaWNTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiUHJpbnRhYmxlU3RyaW5nXCJdID0gMTJdID0gXCJQcmludGFibGVTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVGVsZXRleFN0cmluZ1wiXSA9IDEzXSA9IFwiVGVsZXRleFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJWaWRlb3RleFN0cmluZ1wiXSA9IDE0XSA9IFwiVmlkZW90ZXhTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiSUE1U3RyaW5nXCJdID0gMTVdID0gXCJJQTVTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiR3JhcGhpY1N0cmluZ1wiXSA9IDE2XSA9IFwiR3JhcGhpY1N0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJWaXNpYmxlU3RyaW5nXCJdID0gMTddID0gXCJWaXNpYmxlU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkdlbmVyYWxTdHJpbmdcIl0gPSAxOF0gPSBcIkdlbmVyYWxTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiQ2hhcmFjdGVyU3RyaW5nXCJdID0gMTldID0gXCJDaGFyYWN0ZXJTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVVRDVGltZVwiXSA9IDIwXSA9IFwiVVRDVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJHZW5lcmFsaXplZFRpbWVcIl0gPSAyMV0gPSBcIkdlbmVyYWxpemVkVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJEQVRFXCJdID0gMjJdID0gXCJEQVRFXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlRpbWVPZkRheVwiXSA9IDIzXSA9IFwiVGltZU9mRGF5XCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkRhdGVUaW1lXCJdID0gMjRdID0gXCJEYXRlVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJEdXJhdGlvblwiXSA9IDI1XSA9IFwiRHVyYXRpb25cIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVElNRVwiXSA9IDI2XSA9IFwiVElNRVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJOdWxsXCJdID0gMjddID0gXCJOdWxsXCI7XG59KShBc25Qcm9wVHlwZXMgfHwgKEFzblByb3BUeXBlcyA9IHt9KSk7XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gXCJwdnRzdXRpbHNcIjtcbmV4cG9ydCBjbGFzcyBCaXRTdHJpbmcge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcywgdW51c2VkQml0cyA9IDApIHtcbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gMDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21OdW1iZXIocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gdW51c2VkQml0cztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIlVuc3VwcG9ydGVkIHR5cGUgb2YgJ3BhcmFtcycgYXJndW1lbnQgZm9yIEJpdFN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tQVNOKGFzbikge1xuICAgICAgICBpZiAoIShhc24gaW5zdGFuY2VvZiBhc24xanMuQml0U3RyaW5nKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdhc24nIGlzIG5vdCBpbnN0YW5jZSBvZiBBU04uMSBCaXRTdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gYXNuLnZhbHVlQmxvY2sudW51c2VkQml0cztcbiAgICAgICAgdGhpcy52YWx1ZSA9IGFzbi52YWx1ZUJsb2NrLnZhbHVlSGV4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9BU04oKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLkJpdFN0cmluZyh7IHVudXNlZEJpdHM6IHRoaXMudW51c2VkQml0cywgdmFsdWVIZXg6IHRoaXMudmFsdWUgfSk7XG4gICAgfVxuICAgIHRvU2NoZW1hKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuQml0U3RyaW5nKHsgbmFtZSB9KTtcbiAgICB9XG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIGxldCByZXMgPSBcIlwiO1xuICAgICAgICBjb25zdCB1aW50QXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBvY3RldCBvZiB1aW50QXJyYXkpIHtcbiAgICAgICAgICAgIHJlcyArPSBvY3RldC50b1N0cmluZygyKS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gcmVzLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgICAgICBpZiAodGhpcy51bnVzZWRCaXRzKSB7XG4gICAgICAgICAgICByZXMgPSByZXMuc2xpY2UodGhpcy51bnVzZWRCaXRzKS5wYWRTdGFydCh0aGlzLnVudXNlZEJpdHMsIFwiMFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VJbnQocmVzLCAyKTtcbiAgICB9XG4gICAgZnJvbU51bWJlcih2YWx1ZSkge1xuICAgICAgICBsZXQgYml0cyA9IHZhbHVlLnRvU3RyaW5nKDIpO1xuICAgICAgICBjb25zdCBvY3RldFNpemUgPSAoYml0cy5sZW5ndGggKyA3KSA+PiAzO1xuICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSAob2N0ZXRTaXplIDw8IDMpIC0gYml0cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG9jdGV0cyA9IG5ldyBVaW50OEFycmF5KG9jdGV0U2l6ZSk7XG4gICAgICAgIGJpdHMgPSBiaXRzXG4gICAgICAgICAgICAucGFkU3RhcnQob2N0ZXRTaXplIDw8IDMsIFwiMFwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgb2N0ZXRTaXplKSB7XG4gICAgICAgICAgICBvY3RldHNbaW5kZXhdID0gcGFyc2VJbnQoYml0cy5zbGljZShpbmRleCA8PCAzLCAoaW5kZXggPDwgMykgKyA4KSwgMik7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBvY3RldHMuYnVmZmVyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQnVmZmVyU291cmNlQ29udmVydGVyIH0gZnJvbSBcInB2dHN1dGlsc1wiO1xuZXhwb3J0IGNsYXNzIE9jdGV0U3RyaW5nIHtcbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIGdldCBieXRlT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IocGFyYW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIocGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheShwYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tQVNOKGFzbikge1xuICAgICAgICBpZiAoIShhc24gaW5zdGFuY2VvZiBhc24xanMuT2N0ZXRTdHJpbmcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgJ2FzbicgaXMgbm90IGluc3RhbmNlIG9mIEFTTi4xIE9jdGV0U3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYXNuLnZhbHVlQmxvY2sudmFsdWVIZXg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b0FTTigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuT2N0ZXRTdHJpbmcoeyB2YWx1ZUhleDogdGhpcy5idWZmZXIgfSk7XG4gICAgfVxuICAgIHRvU2NoZW1hKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuT2N0ZXRTdHJpbmcoeyBuYW1lIH0pO1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9iaXRfc3RyaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vY3RldF9zdHJpbmdcIjtcbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzIH0gZnJvbSBcIi4vZW51bXNcIjtcbmltcG9ydCB7IE9jdGV0U3RyaW5nIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXhcIjtcbmV4cG9ydCBjb25zdCBBc25BbnlDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGFzbjFqcy5OdWxsID8gbnVsbCA6IHZhbHVlLnZhbHVlQmVmb3JlRGVjb2RlVmlldyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuTnVsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGFzbjFqcy5mcm9tQkVSKHZhbHVlKTtcbiAgICAgICAgaWYgKHNjaGVtYS5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzY2hlbWEucmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hLnJlc3VsdDtcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBBc25JbnRlZ2VyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCA+PSA0XG4gICAgICAgID8gdmFsdWUudmFsdWVCbG9jay50b1N0cmluZygpXG4gICAgICAgIDogdmFsdWUudmFsdWVCbG9jay52YWx1ZURlYyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkludGVnZXIoeyB2YWx1ZTogK3ZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25FbnVtZXJhdGVkQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZURlYyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkVudW1lcmF0ZWQoeyB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5JbnRlZ2VyKHsgdmFsdWVIZXg6IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25JbnRlZ2VyQmlnSW50Q29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudG9CaWdJbnQoKSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBhc24xanMuSW50ZWdlci5mcm9tQmlnSW50KHZhbHVlKSxcbn07XG5leHBvcnQgY29uc3QgQXNuQml0U3RyaW5nQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5CaXRTdHJpbmcoeyB2YWx1ZUhleDogdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbk9iamVjdElkZW50aWZpZXJDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnRvU3RyaW5nKCksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5PYmplY3RJZGVudGlmaWVyKHsgdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkJvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlLFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuQm9vbGVhbih7IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25PY3RldFN0cmluZ0NvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuT2N0ZXRTdHJpbmcoeyB2YWx1ZUhleDogdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkNvbnN0cnVjdGVkT2N0ZXRTdHJpbmdDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiBuZXcgT2N0ZXRTdHJpbmcodmFsdWUuZ2V0VmFsdWUoKSksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gdmFsdWUudG9BU04oKSxcbn07XG5mdW5jdGlvbiBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoQXNuMVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWUsXG4gICAgICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBBc24xVHlwZSh7IHZhbHVlIH0pLFxuICAgIH07XG59XG5leHBvcnQgY29uc3QgQXNuVXRmOFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuVXRmOFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuQm1wU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5CbXBTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblVuaXZlcnNhbFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuVW5pdmVyc2FsU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25OdW1lcmljU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5OdW1lcmljU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25QcmludGFibGVTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlByaW50YWJsZVN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuVGVsZXRleFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuVGVsZXRleFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuVmlkZW90ZXhTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlZpZGVvdGV4U3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25JQTVTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLklBNVN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuR3JhcGhpY1N0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuR3JhcGhpY1N0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuVmlzaWJsZVN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuVmlzaWJsZVN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuR2VuZXJhbFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuR2VuZXJhbFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuQ2hhcmFjdGVyU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5DaGFyYWN0ZXJTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblVUQ1RpbWVDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS50b0RhdGUoKSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLlVUQ1RpbWUoeyB2YWx1ZURhdGU6IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25HZW5lcmFsaXplZFRpbWVDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS50b0RhdGUoKSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkdlbmVyYWxpemVkVGltZSh7IHZhbHVlRGF0ZTogdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbk51bGxDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKCkgPT4gbnVsbCxcbiAgICB0b0FTTjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5OdWxsKCk7XG4gICAgfSxcbn07XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENvbnZlcnRlcih0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkFueTpcbiAgICAgICAgICAgIHJldHVybiBBc25BbnlDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkJpdFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25CaXRTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkJtcFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25CbXBTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkJvb2xlYW46XG4gICAgICAgICAgICByZXR1cm4gQXNuQm9vbGVhbkNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuQ2hhcmFjdGVyU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkNoYXJhY3RlclN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuRW51bWVyYXRlZDpcbiAgICAgICAgICAgIHJldHVybiBBc25FbnVtZXJhdGVkQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5HZW5lcmFsU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkdlbmVyYWxTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkdlbmVyYWxpemVkVGltZTpcbiAgICAgICAgICAgIHJldHVybiBBc25HZW5lcmFsaXplZFRpbWVDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkdyYXBoaWNTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuR3JhcGhpY1N0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuSUE1U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbklBNVN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuSW50ZWdlcjpcbiAgICAgICAgICAgIHJldHVybiBBc25JbnRlZ2VyQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5OdWxsOlxuICAgICAgICAgICAgcmV0dXJuIEFzbk51bGxDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLk51bWVyaWNTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuTnVtZXJpY1N0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuT2JqZWN0SWRlbnRpZmllcjpcbiAgICAgICAgICAgIHJldHVybiBBc25PYmplY3RJZGVudGlmaWVyQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5PY3RldFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25PY3RldFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuUHJpbnRhYmxlU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblByaW50YWJsZVN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVGVsZXRleFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25UZWxldGV4U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5VVENUaW1lOlxuICAgICAgICAgICAgcmV0dXJuIEFzblVUQ1RpbWVDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlVuaXZlcnNhbFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25Vbml2ZXJzYWxTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlV0ZjhTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuVXRmOFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVmlkZW90ZXhTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuVmlkZW90ZXhTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlZpc2libGVTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuVmlzaWJsZVN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNDb252ZXJ0aWJsZSh0YXJnZXQpIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJmdW5jdGlvblwiICYmIHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHRhcmdldC5wcm90b3R5cGUudG9BU04gJiYgdGFyZ2V0LnByb3RvdHlwZS5mcm9tQVNOKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0NvbnZlcnRpYmxlKHRhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gISEodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgXCJ0b0FTTlwiIGluIHRhcmdldCAmJiBcImZyb21BU05cIiBpbiB0YXJnZXQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVPZkFycmF5KHRhcmdldCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCk7XG4gICAgICAgIGlmICgoKF9hID0gcHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb3RvLnByb3RvdHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnN0cnVjdG9yKSA9PT0gQXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1R5cGVPZkFycmF5KHByb3RvKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlFcXVhbChieXRlczEsIGJ5dGVzMikge1xuICAgIGlmICghKGJ5dGVzMSAmJiBieXRlczIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGJ5dGVzMS5ieXRlTGVuZ3RoICE9PSBieXRlczIuYnl0ZUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGIxID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMxKTtcbiAgICBjb25zdCBiMiA9IG5ldyBVaW50OEFycmF5KGJ5dGVzMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlczEuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChiMVtpXSAhPT0gYjJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzLCBBc25UeXBlVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgaXNDb252ZXJ0aWJsZSB9IGZyb20gXCIuL2hlbHBlclwiO1xuZXhwb3J0IGNsYXNzIEFzblNjaGVtYVN0b3JhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgaGFzKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5oYXModGFyZ2V0KTtcbiAgICB9XG4gICAgZ2V0KHRhcmdldCwgY2hlY2tTY2hlbWEgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLml0ZW1zLmdldCh0YXJnZXQpO1xuICAgICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IHNjaGVtYSBmb3IgJyR7dGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lfScgdGFyZ2V0YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrU2NoZW1hICYmICFzY2hlbWEuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSAnJHt0YXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWV9JyBkb2Vzbid0IGNvbnRhaW4gQVNOLjEgc2NoZW1hLiBDYWxsICdBc25TY2hlbWFTdG9yYWdlLmNhY2hlJy5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH1cbiAgICBjYWNoZSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXQodGFyZ2V0KTtcbiAgICAgICAgaWYgKCFzY2hlbWEuc2NoZW1hKSB7XG4gICAgICAgICAgICBzY2hlbWEuc2NoZW1hID0gdGhpcy5jcmVhdGUodGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVEZWZhdWx0KHRhcmdldCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgICAgICB0eXBlOiBBc25UeXBlVHlwZXMuU2VxdWVuY2UsXG4gICAgICAgICAgICBpdGVtczoge30sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhcmVudFNjaGVtYSA9IHRoaXMuZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpO1xuICAgICAgICBpZiAocGFyZW50U2NoZW1hKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgcGFyZW50U2NoZW1hKTtcbiAgICAgICAgICAgIHNjaGVtYS5pdGVtcyA9IE9iamVjdC5hc3NpZ24oe30sIHNjaGVtYS5pdGVtcywgcGFyZW50U2NoZW1hLml0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH1cbiAgICBjcmVhdGUodGFyZ2V0LCB1c2VOYW1lcykge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLml0ZW1zLmdldCh0YXJnZXQpIHx8IHRoaXMuY3JlYXRlRGVmYXVsdCh0YXJnZXQpO1xuICAgICAgICBjb25zdCBhc24xVmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gc2NoZW1hLml0ZW1zW2tleV07XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdXNlTmFtZXMgPyBrZXkgOiBcIlwiO1xuICAgICAgICAgICAgbGV0IGFzbjFJdGVtO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBBc24xVHlwZU5hbWUgPSBBc25Qcm9wVHlwZXNbaXRlbS50eXBlXTtcbiAgICAgICAgICAgICAgICBjb25zdCBBc24xVHlwZSA9IGFzbjFqc1tBc24xVHlwZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghQXNuMVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IEFTTjEgY2xhc3MgYnkgbmFtZSAnJHtBc24xVHlwZU5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBBc24xVHlwZSh7IG5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NvbnZlcnRpYmxlKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBpdGVtLnR5cGUoKTtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IGluc3RhbmNlLnRvU2NoZW1hKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TY2hlbWEgPSB0aGlzLmdldChpdGVtLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hLnR5cGUgPT09IEFzblR5cGVUeXBlcy5DaG9pY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgYXNuMWpzLkFueSh7IG5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhc24xSXRlbSA9IHRoaXMuY3JlYXRlKGl0ZW0udHlwZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBhc24xSXRlbS5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBhc24xanMuQW55KHsgbmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsID0gISFpdGVtLm9wdGlvbmFsIHx8IGl0ZW0uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtLm5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lciA9IGl0ZW0ucmVwZWF0ZWQgPT09IFwic2V0XCIgPyBhc24xanMuU2V0IDogYXNuMWpzLlNlcXVlbmNlO1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgYXNuMWpzLlJlcGVhdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhc24xSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0uY29udGV4dCAhPT0gbnVsbCAmJiBpdGVtLmNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS50eXBlID09PSBcIm51bWJlclwiIHx8IGlzQ29udmVydGlibGUoaXRlbS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gaXRlbS5yZXBlYXRlZCA/IGFzbjFqcy5Db25zdHJ1Y3RlZCA6IGFzbjFqcy5QcmltaXRpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc24xVmFsdWUucHVzaChuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ051bWJlcjogaXRlbS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKGl0ZW0udHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlcGVhdGVkID0gISFpdGVtLnJlcGVhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gIWlzUmVwZWF0ZWQgPyB0aGlzLmdldChpdGVtLnR5cGUsIHRydWUpLnNjaGVtYSA6IGFzbjFJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVCbG9ja1wiIGluIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsdWUudmFsdWVCbG9jay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogIWlzUmVwZWF0ZWQgPyBuYW1lIDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkQmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW2FzbjFJdGVtXSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2goYXNuMUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoc2NoZW1hLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNlcXVlbmNlOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMWpzLlNlcXVlbmNlKHsgdmFsdWU6IGFzbjFWYWx1ZSwgbmFtZTogXCJcIiB9KTtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNldDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5TZXQoeyB2YWx1ZTogYXNuMVZhbHVlLCBuYW1lOiBcIlwiIH0pO1xuICAgICAgICAgICAgY2FzZSBBc25UeXBlVHlwZXMuQ2hvaWNlOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMWpzLkNob2ljZSh7IHZhbHVlOiBhc24xVmFsdWUsIG5hbWU6IFwiXCIgfSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQVNOMSB0eXBlIGluIHVzZWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCh0YXJnZXQsIHNjaGVtYSkge1xuICAgICAgICB0aGlzLml0ZW1zLnNldCh0YXJnZXQsIHNjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmaW5kUGFyZW50U2NoZW1hKHRhcmdldCkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KTtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQocGFyZW50KTtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEgfHwgdGhpcy5maW5kUGFyZW50U2NoZW1hKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFzblNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zY2hlbWFcIjtcbmV4cG9ydCBjb25zdCBzY2hlbWFTdG9yYWdlID0gbmV3IEFzblNjaGVtYVN0b3JhZ2UoKTtcbiIsICJpbXBvcnQgKiBhcyBjb252ZXJ0ZXJzIGZyb20gXCIuL2NvbnZlcnRlcnNcIjtcbmltcG9ydCB7IEFzblR5cGVUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBzY2hlbWFTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuZXhwb3J0IGNvbnN0IEFzblR5cGUgPSAob3B0aW9ucykgPT4gKHRhcmdldCkgPT4ge1xuICAgIGxldCBzY2hlbWE7XG4gICAgaWYgKCFzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXQpKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuY3JlYXRlRGVmYXVsdCh0YXJnZXQpO1xuICAgICAgICBzY2hlbWFTdG9yYWdlLnNldCh0YXJnZXQsIHNjaGVtYSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXQpO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgb3B0aW9ucyk7XG59O1xuZXhwb3J0IGNvbnN0IEFzbkNob2ljZVR5cGUgPSAoKSA9PiBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLkNob2ljZSB9KTtcbmV4cG9ydCBjb25zdCBBc25TZXRUeXBlID0gKG9wdGlvbnMpID0+IEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuU2V0LCAuLi5vcHRpb25zIH0pO1xuZXhwb3J0IGNvbnN0IEFzblNlcXVlbmNlVHlwZSA9IChvcHRpb25zKSA9PiBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLlNlcXVlbmNlLCAuLi5vcHRpb25zIH0pO1xuZXhwb3J0IGNvbnN0IEFzblByb3AgPSAob3B0aW9ucykgPT4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICBsZXQgc2NoZW1hO1xuICAgIGlmICghc2NoZW1hU3RvcmFnZS5oYXModGFyZ2V0LmNvbnN0cnVjdG9yKSkge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmNyZWF0ZURlZmF1bHQodGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgc2NoZW1hU3RvcmFnZS5zZXQodGFyZ2V0LmNvbnN0cnVjdG9yLCBzY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIGNvcHlPcHRpb25zLnR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWNvcHlPcHRpb25zLmNvbnZlcnRlcikge1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29udmVydGVyID0gY29udmVydGVycy5kZWZhdWx0Q29udmVydGVyKG9wdGlvbnMudHlwZSk7XG4gICAgICAgIGlmICghZGVmYXVsdENvbnZlcnRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGRlZmF1bHQgY29udmVydGVyIGZvciBwcm9wZXJ0eSAnJHtwcm9wZXJ0eUtleX0nIG9mICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29weU9wdGlvbnMuY29udmVydGVyID0gZGVmYXVsdENvbnZlcnRlcjtcbiAgICB9XG4gICAgc2NoZW1hLml0ZW1zW3Byb3BlcnR5S2V5XSA9IGNvcHlPcHRpb25zO1xufTtcbiIsICJleHBvcnQgY2xhc3MgQXNuU2NoZW1hVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnNjaGVtYXMgPSBbXTtcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hX3ZhbGlkYXRpb25cIjtcbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzLCBBc25UeXBlVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0ICogYXMgY29udmVydGVycyBmcm9tIFwiLi9jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgeyBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzQ29udmVydGlibGUsIGlzVHlwZU9mQXJyYXkgfSBmcm9tIFwiLi9oZWxwZXJcIjtcbmltcG9ydCB7IHNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQgY2xhc3MgQXNuUGFyc2VyIHtcbiAgICBzdGF0aWMgcGFyc2UoZGF0YSwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGFzbjFQYXJzZWQgPSBhc24xanMuZnJvbUJFUihkYXRhKTtcbiAgICAgICAgaWYgKGFzbjFQYXJzZWQucmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXNuMVBhcnNlZC5yZXN1bHQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZnJvbUFTTihhc24xUGFyc2VkLnJlc3VsdCwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGZyb21BU04oYXNuMVNjaGVtYSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0NvbnZlcnRpYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyB0YXJnZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZnJvbUFTTihhc24xU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICBzY2hlbWFTdG9yYWdlLmNhY2hlKHRhcmdldCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0U2NoZW1hID0gc2NoZW1hLnNjaGVtYTtcbiAgICAgICAgICAgIGlmIChhc24xU2NoZW1hLmNvbnN0cnVjdG9yID09PSBhc24xanMuQ29uc3RydWN0ZWQgJiYgc2NoZW1hLnR5cGUgIT09IEFzblR5cGVUeXBlcy5DaG9pY2UpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRTY2hlbWEgPSBuZXcgYXNuMWpzLkNvbnN0cnVjdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGFzbjFTY2hlbWEuaWRCbG9jay50YWdOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEuc2NoZW1hLnZhbHVlQmxvY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhc24xU2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXNuMUNvbXBhcmVkU2NoZW1hID0gYXNuMWpzLmNvbXBhcmVTY2hlbWEoe30sIGFzbjFTY2hlbWEsIHRhcmdldFNjaGVtYSk7XG4gICAgICAgICAgICBpZiAoIWFzbjFDb21wYXJlZFNjaGVtYS52ZXJpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IoYERhdGEgZG9lcyBub3QgbWF0Y2ggdG8gJHt0YXJnZXQubmFtZX0gQVNOMSBzY2hlbWEuICR7YXNuMUNvbXBhcmVkU2NoZW1hLnJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyB0YXJnZXQoKTtcbiAgICAgICAgICAgIGlmIChpc1R5cGVPZkFycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShcInZhbHVlXCIgaW4gYXNuMVNjaGVtYS52YWx1ZUJsb2NrICYmIEFycmF5LmlzQXJyYXkoYXNuMVNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGl0ZW1zIGZyb20gdGhlIEFTTi4xIHBhcnNlZCB2YWx1ZS4gQVNOLjEgb2JqZWN0IGlzIG5vdCBjb25zdHJ1Y3RlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSBzY2hlbWEuaXRlbVR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBjb252ZXJ0ZXJzLmRlZmF1bHRDb252ZXJ0ZXIoaXRlbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGRlZmF1bHQgY29udmVydGVyIGZvciBhcnJheSBpdGVtIG9mICR7dGFyZ2V0Lm5hbWV9IEFTTjEgc2NoZW1hYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5mcm9tKGFzbjFTY2hlbWEudmFsdWVCbG9jay52YWx1ZSwgKGVsZW1lbnQpID0+IGNvbnZlcnRlci5mcm9tQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZnJvbShhc24xU2NoZW1hLnZhbHVlQmxvY2sudmFsdWUsIChlbGVtZW50KSA9PiB0aGlzLmZyb21BU04oZWxlbWVudCwgaXRlbVR5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc24xU2NoZW1hVmFsdWUgPSBhc24xQ29tcGFyZWRTY2hlbWEucmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFhc24xU2NoZW1hVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWEuaXRlbXNba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFJdGVtVHlwZSA9IHNjaGVtYUl0ZW0udHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW1UeXBlID09PSBcIm51bWJlclwiIHx8IGlzQ29udmVydGlibGUoc2NoZW1hSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IChfYSA9IHNjaGVtYUl0ZW0uY29udmVydGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoaXNDb252ZXJ0aWJsZShzY2hlbWFJdGVtVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHNjaGVtYUl0ZW1UeXBlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb252ZXJ0ZXIgaXMgZW1wdHlcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gc2NoZW1hSXRlbS5yZXBlYXRlZCA9PT0gXCJzZXF1ZW5jZVwiID8gYXNuMWpzLlNlcXVlbmNlIDogYXNuMWpzLlNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3IENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0udmFsdWVCbG9jayA9IGFzbjFTY2hlbWFWYWx1ZS52YWx1ZUJsb2NrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW1Bc24gPSBhc24xanMuZnJvbUJFUihuZXdJdGVtLnRvQkVSKGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1Bc24ub2Zmc2V0ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgY2hpbGQgaXRlbS4gJHtuZXdJdGVtQXNuLnJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoXCJ2YWx1ZVwiIGluIG5ld0l0ZW1Bc24ucmVzdWx0LnZhbHVlQmxvY2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShuZXdJdGVtQXNuLnJlc3VsdC52YWx1ZUJsb2NrLnZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCBpdGVtcyBmcm9tIHRoZSBBU04uMSBwYXJzZWQgdmFsdWUuIEFTTi4xIG9iamVjdCBpcyBub3QgY29uc3RydWN0ZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld0l0ZW1Bc24ucmVzdWx0LnZhbHVlQmxvY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBBcnJheS5mcm9tKHZhbHVlLCAoZWxlbWVudCkgPT4gY29udmVydGVyLmZyb21BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBBcnJheS5mcm9tKGFzbjFTY2hlbWFWYWx1ZSwgKGVsZW1lbnQpID0+IGNvbnZlcnRlci5mcm9tQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFzbjFTY2hlbWFWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0l0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29udmVydGlibGUoc2NoZW1hSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXcgc2NoZW1hSXRlbVR5cGUoKS50b1NjaGVtYShcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFzbjFUeXBlTmFtZSA9IEFzblByb3BUeXBlc1tzY2hlbWFJdGVtVHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFzbjFUeXBlID0gYXNuMWpzW0FzbjFUeXBlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXNuMVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCAnJHtBc24xVHlwZU5hbWV9JyBjbGFzcyBmcm9tIGFzbjFqcyBtb2R1bGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3IEFzbjFUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0udmFsdWVCbG9jayA9IHZhbHVlLnZhbHVlQmxvY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhc24xanMuZnJvbUJFUihuZXdJdGVtLnRvQkVSKGZhbHNlKSkucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBjb252ZXJ0ZXIuZnJvbUFTTih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXNuMVNjaGVtYVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBnZXQgbGlzdCBvZiBpdGVtcyBmcm9tIHRoZSBBU04uMSBwYXJzZWQgdmFsdWUuIEFTTi4xIHZhbHVlIHNob3VsZCBiZSBpdGVyYWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IEFycmF5LmZyb20oYXNuMVNjaGVtYVZhbHVlLCAoZWxlbWVudCkgPT4gdGhpcy5mcm9tQVNOKGVsZW1lbnQsIHNjaGVtYUl0ZW1UeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IHRoaXMuZnJvbUFTTihhc24xU2NoZW1hVmFsdWUsIHNjaGVtYUl0ZW1UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5zY2hlbWFzLnB1c2godGFyZ2V0Lm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCAqIGFzIGNvbnZlcnRlcnMgZnJvbSBcIi4vY29udmVydGVyc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzLCBBc25UeXBlVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgaXNDb252ZXJ0aWJsZSwgaXNBcnJheUVxdWFsIH0gZnJvbSBcIi4vaGVscGVyXCI7XG5pbXBvcnQgeyBzY2hlbWFTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuZXhwb3J0IGNsYXNzIEFzblNlcmlhbGl6ZXIge1xuICAgIHN0YXRpYyBzZXJpYWxpemUob2JqKSB7XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBhc24xanMuQmFzZUJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvQkVSKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50b0FTTihvYmopLnRvQkVSKGZhbHNlKTtcbiAgICB9XG4gICAgc3RhdGljIHRvQVNOKG9iaikge1xuICAgICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgaXNDb252ZXJ0aWJsZShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvQVNOKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyIDEgc2hvdWxkIGJlIHR5cGUgb2YgT2JqZWN0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSBvYmouY29uc3RydWN0b3I7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldCk7XG4gICAgICAgIHNjaGVtYVN0b3JhZ2UuY2FjaGUodGFyZ2V0KTtcbiAgICAgICAgbGV0IGFzbjFWYWx1ZSA9IFtdO1xuICAgICAgICBpZiAoc2NoZW1hLml0ZW1UeXBlKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgMSBzaG91bGQgYmUgdHlwZSBvZiBBcnJheS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5pdGVtVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IGNvbnZlcnRlcnMuZGVmYXVsdENvbnZlcnRlcihzY2hlbWEuaXRlbVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCBkZWZhdWx0IGNvbnZlcnRlciBmb3IgYXJyYXkgaXRlbSBvZiAke3RhcmdldC5uYW1lfSBBU04xIHNjaGVtYWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc24xVmFsdWUgPSBvYmoubWFwKChvKSA9PiBjb252ZXJ0ZXIudG9BU04obykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNuMVZhbHVlID0gb2JqLm1hcCgobykgPT4gdGhpcy50b0Fzbkl0ZW0oeyB0eXBlOiBzY2hlbWEuaXRlbVR5cGUgfSwgXCJbXVwiLCB0YXJnZXQsIG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWEuaXRlbXNba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpQcm9wID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKG9ialByb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFJdGVtLmRlZmF1bHRWYWx1ZSA9PT0gb2JqUHJvcCB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHNjaGVtYUl0ZW0uZGVmYXVsdFZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb2JqUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheUVxdWFsKHRoaXMuc2VyaWFsaXplKHNjaGVtYUl0ZW0uZGVmYXVsdFZhbHVlKSwgdGhpcy5zZXJpYWxpemUob2JqUHJvcCkpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYXNuMUl0ZW0gPSBBc25TZXJpYWxpemVyLnRvQXNuSXRlbShzY2hlbWFJdGVtLCBrZXksIHRhcmdldCwgb2JqUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtLmNvbnRleHQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0uaW1wbGljaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hSXRlbS5yZXBlYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2Ygc2NoZW1hSXRlbS50eXBlID09PSBcIm51bWJlclwiIHx8IGlzQ29udmVydGlibGUoc2NoZW1hSXRlbS50eXBlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlSGV4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNuMUl0ZW0gaW5zdGFuY2VvZiBhc24xanMuTnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhc24xSXRlbS52YWx1ZUJlZm9yZURlY29kZVZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXNuMUl0ZW0udmFsdWVCbG9jay50b0JFUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuUHJpbWl0aXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHNjaGVtYUl0ZW0ub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBzY2hlbWFJdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuQ29uc3RydWN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogc2NoZW1hSXRlbS5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IHNjaGVtYUl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFzbjFJdGVtLnZhbHVlQmxvY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHNjaGVtYUl0ZW0ub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBzY2hlbWFJdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW2FzbjFJdGVtXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZSA9IGFzbjFWYWx1ZS5jb25jYXQoYXNuMUl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2goYXNuMUl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYXNuU2NoZW1hO1xuICAgICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5TZXF1ZW5jZTpcbiAgICAgICAgICAgICAgICBhc25TY2hlbWEgPSBuZXcgYXNuMWpzLlNlcXVlbmNlKHsgdmFsdWU6IGFzbjFWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNldDpcbiAgICAgICAgICAgICAgICBhc25TY2hlbWEgPSBuZXcgYXNuMWpzLlNldCh7IHZhbHVlOiBhc24xVmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5DaG9pY2U6XG4gICAgICAgICAgICAgICAgaWYgKCFhc24xVmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlbWEgJyR7dGFyZ2V0Lm5hbWV9JyBoYXMgd3JvbmcgZGF0YS4gQ2hvaWNlIGNhbm5vdCBiZSBlbXB0eS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNuU2NoZW1hID0gYXNuMVZhbHVlWzBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc25TY2hlbWE7XG4gICAgfVxuICAgIHN0YXRpYyB0b0Fzbkl0ZW0oc2NoZW1hSXRlbSwga2V5LCB0YXJnZXQsIG9ialByb3ApIHtcbiAgICAgICAgbGV0IGFzbjFJdGVtO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0udHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gc2NoZW1hSXRlbS5jb252ZXJ0ZXI7XG4gICAgICAgICAgICBpZiAoIWNvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJyR7a2V5fScgZG9lc24ndCBoYXZlIGNvbnZlcnRlciBmb3IgdHlwZSAke0FzblByb3BUeXBlc1tzY2hlbWFJdGVtLnR5cGVdfSBpbiBzY2hlbWEgJyR7dGFyZ2V0Lm5hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqUHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAnb2JqUHJvcCcgc2hvdWxkIGJlIHR5cGUgb2YgQXJyYXkuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20ob2JqUHJvcCwgKGVsZW1lbnQpID0+IGNvbnZlcnRlci50b0FTTihlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gc2NoZW1hSXRlbS5yZXBlYXRlZCA9PT0gXCJzZXF1ZW5jZVwiID8gYXNuMWpzLlNlcXVlbmNlIDogYXNuMWpzLlNldDtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IGNvbnZlcnRlci50b0FTTihvYmpQcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9ialByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ29ialByb3AnIHNob3VsZCBiZSB0eXBlIG9mIEFycmF5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKG9ialByb3AsIChlbGVtZW50KSA9PiB0aGlzLnRvQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXIgPSBzY2hlbWFJdGVtLnJlcGVhdGVkID09PSBcInNlcXVlbmNlXCIgPyBhc24xanMuU2VxdWVuY2UgOiBhc24xanMuU2V0O1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gdGhpcy50b0FTTihvYmpQcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNuMUl0ZW07XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBBc25BcnJheSBleHRlbmRzIEFycmF5IHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcyA9IFtdKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHN1cGVyKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gXCJwdnRzdXRpbHNcIjtcbmltcG9ydCB7IEFzblBhcnNlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHsgQXNuU2VyaWFsaXplciB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmV4cG9ydCBjbGFzcyBBc25Db252ZXJ0IHtcbiAgICBzdGF0aWMgc2VyaWFsaXplKG9iaikge1xuICAgICAgICByZXR1cm4gQXNuU2VyaWFsaXplci5zZXJpYWxpemUob2JqKTtcbiAgICB9XG4gICAgc3RhdGljIHBhcnNlKGRhdGEsIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gQXNuUGFyc2VyLnBhcnNlKGRhdGEsIHRhcmdldCk7XG4gICAgfVxuICAgIHN0YXRpYyB0b1N0cmluZyhkYXRhKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShkYXRhKVxuICAgICAgICAgICAgPyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKVxuICAgICAgICAgICAgOiBBc25Db252ZXJ0LnNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgY29uc3QgYXNuID0gYXNuMWpzLmZyb21CRVIoYnVmKTtcbiAgICAgICAgaWYgKGFzbi5vZmZzZXQgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZWNvZGUgQVNOLjEgZGF0YS4gJHthc24ucmVzdWx0LmVycm9yfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc24ucmVzdWx0LnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwgImV4cG9ydCAqIGZyb20gXCIuL2NvbnZlcnRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL2luZGV4XCI7XG5leHBvcnQgeyBBc25Qcm9wLCBBc25UeXBlLCBBc25DaG9pY2VUeXBlLCBBc25TZXF1ZW5jZVR5cGUsIEFzblNldFR5cGUgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgeyBBc25UeXBlVHlwZXMsIEFzblByb3BUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5leHBvcnQgeyBBc25QYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmV4cG9ydCB7IEFzblNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnZlcnRcIjtcbiIsICIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBhciA9IFtdO1xuICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgcmV0dXJuIGFyO1xuICB9O1xuICByZXR1cm4gb3duS2V5cyhvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgdmFyIHIsIHMgPSAwO1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcbiAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcbiAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgcyB8PSAxO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xuICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fZXNEZWNvcmF0ZSxcbiAgX19ydW5Jbml0aWFsaXplcnMsXG4gIF9fcHJvcEtleSxcbiAgX19zZXRGdW5jdGlvbk5hbWUsXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxuICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFBlY3VsaWFyIFZlbnR1cmVzLCBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICovXG5cbmNsYXNzIEpzb25FcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGlubmVyRXJyb3IpIHtcclxuICAgICAgICBzdXBlcihpbm5lckVycm9yXHJcbiAgICAgICAgICAgID8gYCR7bWVzc2FnZX0uIFNlZSB0aGUgaW5uZXIgZXhjZXB0aW9uIGZvciBtb3JlIGRldGFpbHMuYFxyXG4gICAgICAgICAgICA6IG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgdGhpcy5pbm5lckVycm9yID0gaW5uZXJFcnJvcjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBUcmFuc2Zvcm1FcnJvciBleHRlbmRzIEpzb25FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIG1lc3NhZ2UsIGlubmVyRXJyb3IpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlLCBpbm5lckVycm9yKTtcclxuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBQYXJzZXJFcnJvciBleHRlbmRzIFRyYW5zZm9ybUVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgbWVzc2FnZSwgaW5uZXJFcnJvcikge1xyXG4gICAgICAgIHN1cGVyKHNjaGVtYSwgYEpTT04gZG9lc24ndCBtYXRjaCB0byAnJHtzY2hlbWEudGFyZ2V0Lm5hbWV9JyBzY2hlbWEuICR7bWVzc2FnZX1gLCBpbm5lckVycm9yKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xyXG59XG5cbmNsYXNzIFNlcmlhbGl6ZXJFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWFOYW1lLCBtZXNzYWdlLCBpbm5lckVycm9yKSB7XHJcbiAgICAgICAgc3VwZXIoYENhbm5vdCBzZXJpYWxpemUgYnkgJyR7c2NoZW1hTmFtZX0nIHNjaGVtYS4gJHttZXNzYWdlfWAsIGlubmVyRXJyb3IpO1xyXG4gICAgICAgIHRoaXMuc2NoZW1hTmFtZSA9IHNjaGVtYU5hbWU7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgS2V5RXJyb3IgZXh0ZW5kcyBQYXJzZXJFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIGtleXMsIGVycm9ycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoc2NoZW1hLCBcIlNvbWUga2V5cyBkb2Vzbid0IG1hdGNoIHRvIHNjaGVtYVwiKTtcclxuICAgICAgICB0aGlzLmtleXMgPSBrZXlzO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xyXG4gICAgfVxyXG59XG5cbnZhciBKc29uUHJvcFR5cGVzO1xyXG4oZnVuY3Rpb24gKEpzb25Qcm9wVHlwZXMpIHtcclxuICAgIEpzb25Qcm9wVHlwZXNbSnNvblByb3BUeXBlc1tcIkFueVwiXSA9IDBdID0gXCJBbnlcIjtcclxuICAgIEpzb25Qcm9wVHlwZXNbSnNvblByb3BUeXBlc1tcIkJvb2xlYW5cIl0gPSAxXSA9IFwiQm9vbGVhblwiO1xyXG4gICAgSnNvblByb3BUeXBlc1tKc29uUHJvcFR5cGVzW1wiTnVtYmVyXCJdID0gMl0gPSBcIk51bWJlclwiO1xyXG4gICAgSnNvblByb3BUeXBlc1tKc29uUHJvcFR5cGVzW1wiU3RyaW5nXCJdID0gM10gPSBcIlN0cmluZ1wiO1xyXG59KShKc29uUHJvcFR5cGVzIHx8IChKc29uUHJvcFR5cGVzID0ge30pKTtcblxuZnVuY3Rpb24gY2hlY2tUeXBlKHZhbHVlLCB0eXBlKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlIEpzb25Qcm9wVHlwZXMuQm9vbGVhbjpcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCI7XHJcbiAgICAgICAgY2FzZSBKc29uUHJvcFR5cGVzLk51bWJlcjpcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcclxuICAgICAgICBjYXNlIEpzb25Qcm9wVHlwZXMuU3RyaW5nOlxyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gdGhyb3dJZlR5cGVJc1dyb25nKHZhbHVlLCB0eXBlKSB7XHJcbiAgICBpZiAoIWNoZWNrVHlwZSh2YWx1ZSwgdHlwZSkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBWYWx1ZSBtdXN0IGJlICR7SnNvblByb3BUeXBlc1t0eXBlXX1gKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpc0NvbnZlcnRpYmxlKHRhcmdldCkge1xyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQucHJvdG90eXBlKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldC5wcm90b3R5cGUudG9KU09OICYmIHRhcmdldC5wcm90b3R5cGUuZnJvbUpTT04pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNDb252ZXJ0aWJsZSh0YXJnZXQucHJvdG90eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gISEodGFyZ2V0ICYmIHRhcmdldC50b0pTT04gJiYgdGFyZ2V0LmZyb21KU09OKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBKc29uU2NoZW1hU3RvcmFnZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgaGFzKHRhcmdldCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmhhcyh0YXJnZXQpIHx8ICEhdGhpcy5maW5kUGFyZW50U2NoZW1hKHRhcmdldCk7XHJcbiAgICB9XHJcbiAgICBnZXQodGFyZ2V0KSB7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQodGFyZ2V0KSB8fCB0aGlzLmZpbmRQYXJlbnRTY2hlbWEodGFyZ2V0KTtcclxuICAgICAgICBpZiAoIXNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ2V0IHNjaGVtYSBmb3IgY3VycmVudCB0YXJnZXRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2hlbWE7XHJcbiAgICB9XHJcbiAgICBjcmVhdGUodGFyZ2V0KSB7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0geyBuYW1lczoge30gfTtcclxuICAgICAgICBjb25zdCBwYXJlbnRTY2hlbWEgPSB0aGlzLmZpbmRQYXJlbnRTY2hlbWEodGFyZ2V0KTtcclxuICAgICAgICBpZiAocGFyZW50U2NoZW1hKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2NoZW1hLCBwYXJlbnRTY2hlbWEpO1xyXG4gICAgICAgICAgICBzY2hlbWEubmFtZXMgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHBhcmVudFNjaGVtYS5uYW1lcykge1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLm5hbWVzW25hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50U2NoZW1hLm5hbWVzW25hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzY2hlbWEudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHJldHVybiBzY2hlbWE7XHJcbiAgICB9XHJcbiAgICBzZXQodGFyZ2V0LCBzY2hlbWEpIHtcclxuICAgICAgICB0aGlzLml0ZW1zLnNldCh0YXJnZXQsIHNjaGVtYSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBmaW5kUGFyZW50U2NoZW1hKHRhcmdldCkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRhcmdldC5fX3Byb3RvX187XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLml0ZW1zLmdldChwYXJlbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hIHx8IHRoaXMuZmluZFBhcmVudFNjaGVtYShwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxuXG5jb25zdCBERUZBVUxUX1NDSEVNQSA9IFwiZGVmYXVsdFwiO1xyXG5jb25zdCBzY2hlbWFTdG9yYWdlID0gbmV3IEpzb25TY2hlbWFTdG9yYWdlKCk7XG5cbmNsYXNzIFBhdHRlcm5WYWxpZGF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcclxuICAgICAgICB0aGlzLnBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xyXG4gICAgfVxyXG4gICAgdmFsaWRhdGUodmFsdWUpIHtcclxuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCh0aGlzLnBhdHRlcm4uc291cmNlLCB0aGlzLnBhdHRlcm4uZmxhZ3MpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkluY29taW5nIHZhbHVlIG11c3QgYmUgc3RyaW5nXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXBhdHRlcm4uZXhlYyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgZG9lc24ndCBtYXRjaCB0byBwYXR0ZXJuICcke3BhdHRlcm4udG9TdHJpbmcoKX0nYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEluY2x1c2l2ZVZhbGlkYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IobWluID0gTnVtYmVyLk1JTl9WQUxVRSwgbWF4ID0gTnVtYmVyLk1BWF9WQUxVRSkge1xyXG4gICAgICAgIHRoaXMubWluID0gbWluO1xyXG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xyXG4gICAgfVxyXG4gICAgdmFsaWRhdGUodmFsdWUpIHtcclxuICAgICAgICB0aHJvd0lmVHlwZUlzV3JvbmcodmFsdWUsIEpzb25Qcm9wVHlwZXMuTnVtYmVyKTtcclxuICAgICAgICBpZiAoISh0aGlzLm1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB0aGlzLm1heCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4gPT09IE51bWJlci5NSU5fVkFMVUUgPyBcIk1JTlwiIDogdGhpcy5taW47XHJcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4ID09PSBOdW1iZXIuTUFYX1ZBTFVFID8gXCJNQVhcIiA6IHRoaXMubWF4O1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBkb2Vzbid0IG1hdGNoIHRvIGRpYXBhc29uIFske21pbn0sJHttYXh9XWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBFeGNsdXNpdmVWYWxpZGF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKG1pbiA9IE51bWJlci5NSU5fVkFMVUUsIG1heCA9IE51bWJlci5NQVhfVkFMVUUpIHtcclxuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcclxuICAgICAgICB0aGlzLm1heCA9IG1heDtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhyb3dJZlR5cGVJc1dyb25nKHZhbHVlLCBKc29uUHJvcFR5cGVzLk51bWJlcik7XHJcbiAgICAgICAgaWYgKCEodGhpcy5taW4gPCB2YWx1ZSAmJiB2YWx1ZSA8IHRoaXMubWF4KSkge1xyXG4gICAgICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbiA9PT0gTnVtYmVyLk1JTl9WQUxVRSA/IFwiTUlOXCIgOiB0aGlzLm1pbjtcclxuICAgICAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXggPT09IE51bWJlci5NQVhfVkFMVUUgPyBcIk1BWFwiIDogdGhpcy5tYXg7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGRvZXNuJ3QgbWF0Y2ggdG8gZGlhcGFzb24gKCR7bWlufSwke21heH0pYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIExlbmd0aFZhbGlkYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBtaW5MZW5ndGgsIG1heExlbmd0aCkge1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xyXG4gICAgICAgIHRoaXMubWluTGVuZ3RoID0gbWluTGVuZ3RoO1xyXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgdmFsaWRhdGUodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgbGVuZ3RoIG11c3QgYmUgZXhhY3RseSAke3RoaXMubGVuZ3RofS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgbGVuZ3RoIG11c3QgYmUgbW9yZSB0aGFuICR7dGhpcy5taW5MZW5ndGh9LmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgbGVuZ3RoIG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5tYXhMZW5ndGh9LmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVudW1lcmF0aW9uVmFsaWRhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihlbnVtZXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMuZW51bWVyYXRpb24gPSBlbnVtZXJhdGlvbjtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhyb3dJZlR5cGVJc1dyb25nKHZhbHVlLCBKc29uUHJvcFR5cGVzLlN0cmluZyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVudW1lcmF0aW9uLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBtdXN0IGJlIG9uZSBvZiAke3RoaXMuZW51bWVyYXRpb24ubWFwKCh2KSA9PiBgJyR7dn0nYCkuam9pbihcIiwgXCIpfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBKc29uVHJhbnNmb3JtIHtcclxuICAgIHN0YXRpYyBjaGVja1ZhbHVlcyhkYXRhLCBzY2hlbWFJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uIG9mIHNjaGVtYUl0ZW0udmFsaWRhdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uIGluc3RhbmNlb2YgTGVuZ3RoVmFsaWRhdGlvbiAmJiBzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGNoZWNrVHlwZXModmFsdWUsIHNjaGVtYUl0ZW0pIHtcclxuICAgICAgICBpZiAoc2NoZW1hSXRlbS5yZXBlYXRlZCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlZhbHVlIG11c3QgYmUgQXJyYXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbS50eXBlID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvd0lmVHlwZUlzV3Jvbmcodiwgc2NoZW1hSXRlbS50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRTY2hlbWFCeU5hbWUoc2NoZW1hLCBuYW1lID0gREVGQVVMVF9TQ0hFTUEpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5zY2hlbWEubmFtZXNbREVGQVVMVF9TQ0hFTUFdLCAuLi5zY2hlbWEubmFtZXNbbmFtZV0gfTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBKc29uU2VyaWFsaXplciBleHRlbmRzIEpzb25UcmFuc2Zvcm0ge1xyXG4gICAgc3RhdGljIHNlcmlhbGl6ZShvYmosIG9wdGlvbnMsIHJlcGxhY2VyLCBzcGFjZSkge1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTihvYmosIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uLCByZXBsYWNlciwgc3BhY2UpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvSlNPTihvYmosIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCByZXM7XHJcbiAgICAgICAgbGV0IHRhcmdldFNjaGVtYSA9IG9wdGlvbnMudGFyZ2V0U2NoZW1hO1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBvcHRpb25zLnNjaGVtYU5hbWUgfHwgREVGQVVMVF9TQ0hFTUE7XHJcbiAgICAgICAgaWYgKGlzQ29udmVydGlibGUob2JqKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvSlNPTigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLnRvSlNPTihpdGVtLCBvcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0U2NoZW1hICYmICFzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXRTY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkVycm9yKFwiQ2Fubm90IGdldCBzY2hlbWEgZm9yIGB0YXJnZXRTY2hlbWFgIHBhcmFtXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRhcmdldFNjaGVtYSA9ICh0YXJnZXRTY2hlbWEgfHwgb2JqLmNvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYVN0b3JhZ2UuaGFzKHRhcmdldFNjaGVtYSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldFNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICByZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVkU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFCeU5hbWUoc2NoZW1hLCBzY2hlbWFOYW1lKTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5hbWVkU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5hbWVkU2NoZW1hW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakl0ZW0gPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGl0ZW0ub3B0aW9uYWwgJiYgb2JqSXRlbSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGl0ZW0uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgb2JqSXRlbSA9PT0gaXRlbS5kZWZhdWx0VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9uYWwgJiYgb2JqSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXplckVycm9yKHRhcmdldFNjaGVtYS5uYW1lLCBgUHJvcGVydHkgJyR7a2V5fScgaXMgcmVxdWlyZWQuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnR5cGUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbnZlcnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gb2JqSXRlbS5tYXAoKGVsKSA9PiBpdGVtLmNvbnZlcnRlci50b0pTT04oZWwsIG9iaikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtLmNvbnZlcnRlci50b0pTT04ob2JqSXRlbSwgb2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iakl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gb2JqSXRlbS5tYXAoKGVsKSA9PiB0aGlzLnRvSlNPTihlbCwgeyBzY2hlbWFOYW1lIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy50b0pTT04ob2JqSXRlbSwgeyBzY2hlbWFOYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUeXBlcyh2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWx1ZXModmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbaXRlbS5uYW1lIHx8IGtleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJpYWxpemVyRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXplckVycm9yKHNjaGVtYS50YXJnZXQubmFtZSwgYFByb3BlcnR5ICcke2tleX0nIGlzIHdyb25nLiAke2UubWVzc2FnZX1gLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSB0aGlzLnRvSlNPTihvYmpba2V5XSwgeyBzY2hlbWFOYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXMgPSBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSnNvblBhcnNlciBleHRlbmRzIEpzb25UcmFuc2Zvcm0ge1xyXG4gICAgc3RhdGljIHBhcnNlKGRhdGEsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyb21KU09OKG9iaiwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbUpTT04odGFyZ2V0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0U2NoZW1hID0gb3B0aW9ucy50YXJnZXRTY2hlbWE7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IG9wdGlvbnMuc2NoZW1hTmFtZSB8fCBERUZBVUxUX1NDSEVNQTtcclxuICAgICAgICBjb25zdCBvYmogPSBuZXcgdGFyZ2V0U2NoZW1hKCk7XHJcbiAgICAgICAgaWYgKGlzQ29udmVydGlibGUob2JqKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqLmZyb21KU09OKHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldFNjaGVtYSk7XHJcbiAgICAgICAgY29uc3QgbmFtZWRTY2hlbWEgPSB0aGlzLmdldFNjaGVtYUJ5TmFtZShzY2hlbWEsIHNjaGVtYU5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGtleUVycm9ycyA9IHt9O1xyXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmljdFByb3BlcnR5ICYmICFBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcclxuICAgICAgICAgICAgSnNvblBhcnNlci5jaGVja1N0cmljdFByb3BlcnR5KHRhcmdldCwgbmFtZWRTY2hlbWEsIHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5hbWVkU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbmFtZWRTY2hlbWFba2V5XTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpdGVtLm5hbWUgfHwga2V5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRbbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAoaXRlbS5vcHRpb25hbCB8fCBpdGVtLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbmFsICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VyRXJyb3Ioc2NoZW1hLCBgUHJvcGVydHkgJyR7bmFtZX0nIGlzIHJlcXVpcmVkLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1R5cGVzKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWx1ZXModmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaXRlbS50eXBlKSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbnZlcnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZS5tYXAoKGVsKSA9PiBpdGVtLmNvbnZlcnRlci5mcm9tSlNPTihlbCwgb2JqKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IGl0ZW0uY29udmVydGVyLmZyb21KU09OKHZhbHVlLCBvYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNjaGVtYTogaXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucmVwZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZS5tYXAoKGVsKSA9PiB0aGlzLmZyb21KU09OKGVsLCBuZXdPcHRpb25zKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHRoaXMuZnJvbUpTT04odmFsdWUsIG5ld09wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFBhcnNlckVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgUGFyc2VyRXJyb3Ioc2NoZW1hLCBgUHJvcGVydHkgJyR7a2V5fScgaXMgd3JvbmcuICR7ZS5tZXNzYWdlfWAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0QWxsS2V5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleUVycm9yc1trZXldID0gZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGtleUVycm9ycyk7XHJcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBLZXlFcnJvcihzY2hlbWEsIGtleXMsIGtleUVycm9ycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY2hlY2tTdHJpY3RQcm9wZXJ0eSh0YXJnZXQsIG5hbWVkU2NoZW1hLCBzY2hlbWEpIHtcclxuICAgICAgICBjb25zdCBqc29uUHJvcHMgPSBPYmplY3Qua2V5cyh0YXJnZXQpO1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVByb3BzID0gT2JqZWN0LmtleXMobmFtZWRTY2hlbWEpO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBqc29uUHJvcHMpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYVByb3BzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgS2V5RXJyb3Ioc2NoZW1hLCBrZXlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbnMoaXRlbSkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvbnMgPSBbXTtcclxuICAgIGlmIChpdGVtLnBhdHRlcm4pIHtcclxuICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKG5ldyBQYXR0ZXJuVmFsaWRhdGlvbihpdGVtLnBhdHRlcm4pKTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtLnR5cGUgPT09IEpzb25Qcm9wVHlwZXMuTnVtYmVyIHx8IGl0ZW0udHlwZSA9PT0gSnNvblByb3BUeXBlcy5BbnkpIHtcclxuICAgICAgICBpZiAoaXRlbS5taW5JbmNsdXNpdmUgIT09IHVuZGVmaW5lZCB8fCBpdGVtLm1heEluY2x1c2l2ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2gobmV3IEluY2x1c2l2ZVZhbGlkYXRpb24oaXRlbS5taW5JbmNsdXNpdmUsIGl0ZW0ubWF4SW5jbHVzaXZlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLm1pbkV4Y2x1c2l2ZSAhPT0gdW5kZWZpbmVkIHx8IGl0ZW0ubWF4RXhjbHVzaXZlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbnMucHVzaChuZXcgRXhjbHVzaXZlVmFsaWRhdGlvbihpdGVtLm1pbkV4Y2x1c2l2ZSwgaXRlbS5tYXhFeGNsdXNpdmUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0uZW51bWVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKG5ldyBFbnVtZXJhdGlvblZhbGlkYXRpb24oaXRlbS5lbnVtZXJhdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpdGVtLnR5cGUgPT09IEpzb25Qcm9wVHlwZXMuU3RyaW5nIHx8IGl0ZW0ucmVwZWF0ZWQgfHwgaXRlbS50eXBlID09PSBKc29uUHJvcFR5cGVzLkFueSkge1xyXG4gICAgICAgIGlmIChpdGVtLmxlbmd0aCAhPT0gdW5kZWZpbmVkIHx8IGl0ZW0ubWluTGVuZ3RoICE9PSB1bmRlZmluZWQgfHwgaXRlbS5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKG5ldyBMZW5ndGhWYWxpZGF0aW9uKGl0ZW0ubGVuZ3RoLCBpdGVtLm1pbkxlbmd0aCwgaXRlbS5tYXhMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWRhdGlvbnM7XHJcbn1cclxuY29uc3QgSnNvblByb3AgPSAob3B0aW9ucyA9IHt9KSA9PiAodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYENhbm5vdCBzZXQgdHlwZSBmb3IgJHtwcm9wZXJ0eUtleX0gcHJvcGVydHkgb2YgJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0gc2NoZW1hYDtcclxuICAgIGxldCBzY2hlbWE7XHJcbiAgICBpZiAoIXNjaGVtYVN0b3JhZ2UuaGFzKHRhcmdldC5jb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmNyZWF0ZSh0YXJnZXQuY29uc3RydWN0b3IpO1xyXG4gICAgICAgIHNjaGVtYVN0b3JhZ2Uuc2V0KHRhcmdldC5jb25zdHJ1Y3Rvciwgc2NoZW1hKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldC5jb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgaWYgKHNjaGVtYS50YXJnZXQgIT09IHRhcmdldC5jb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmNyZWF0ZSh0YXJnZXQuY29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBzY2hlbWFTdG9yYWdlLnNldCh0YXJnZXQuY29uc3RydWN0b3IsIHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgZGVmYXVsdFNjaGVtYSA9IHtcclxuICAgICAgICB0eXBlOiBKc29uUHJvcFR5cGVzLkFueSxcclxuICAgICAgICB2YWxpZGF0aW9uczogW10sXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRTY2hlbWEsIG9wdGlvbnMpO1xyXG4gICAgY29weU9wdGlvbnMudmFsaWRhdGlvbnMgPSBnZXRWYWxpZGF0aW9ucyhjb3B5T3B0aW9ucyk7XHJcbiAgICBpZiAodHlwZW9mIGNvcHlPcHRpb25zLnR5cGUgIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICBpZiAoIXNjaGVtYVN0b3JhZ2UuaGFzKGNvcHlPcHRpb25zLnR5cGUpICYmICFpc0NvbnZlcnRpYmxlKGNvcHlPcHRpb25zLnR5cGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9LiBBc3NpZ25pbmcgdHlwZSBkb2Vzbid0IGhhdmUgc2NoZW1hLmApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzY2hlbWFOYW1lcztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuc2NoZW1hKSkge1xyXG4gICAgICAgIHNjaGVtYU5hbWVzID0gb3B0aW9ucy5zY2hlbWE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBzY2hlbWFOYW1lcyA9IFtvcHRpb25zLnNjaGVtYSB8fCBERUZBVUxUX1NDSEVNQV07XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHNjaGVtYU5hbWUgb2Ygc2NoZW1hTmFtZXMpIHtcclxuICAgICAgICBpZiAoIXNjaGVtYS5uYW1lc1tzY2hlbWFOYW1lXSkge1xyXG4gICAgICAgICAgICBzY2hlbWEubmFtZXNbc2NoZW1hTmFtZV0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmFtZWRTY2hlbWEgPSBzY2hlbWEubmFtZXNbc2NoZW1hTmFtZV07XHJcbiAgICAgICAgbmFtZWRTY2hlbWFbcHJvcGVydHlLZXldID0gY29weU9wdGlvbnM7XHJcbiAgICB9XHJcbn07XG5cbmV4cG9ydCB7IEpzb25FcnJvciwgSnNvblBhcnNlciwgSnNvblByb3AsIEpzb25Qcm9wVHlwZXMsIEpzb25TZXJpYWxpemVyLCBLZXlFcnJvciwgUGFyc2VyRXJyb3IsIFNlcmlhbGl6ZXJFcnJvciwgVHJhbnNmb3JtRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9O1xuIiwgIi8qIVxuIENvcHlyaWdodCAoYykgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuKi9cblxuaW1wb3J0IHsgQ29udmVydCwgQnVmZmVyU291cmNlQ29udmVydGVyLCBjb21iaW5lIH0gZnJvbSAncHZ0c3V0aWxzJztcbmV4cG9ydCB7IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gJ3B2dHN1dGlscyc7XG5pbXBvcnQgeyBBc25Qcm9wLCBBc25Qcm9wVHlwZXMsIEFzblR5cGUsIEFzblR5cGVUeXBlcywgQXNuSW50ZWdlckNvbnZlcnRlciwgQXNuU2VyaWFsaXplciwgQXNuQ29udmVydCB9IGZyb20gJ0BwZWN1bGlhci9hc24xLXNjaGVtYSc7XG5pbXBvcnQgeyBfX2RlY29yYXRlIH0gZnJvbSAndHNsaWInO1xuaW1wb3J0IHsgSnNvblByb3AsIEpzb25Qcm9wVHlwZXMgfSBmcm9tICdAcGVjdWxpYXIvanNvbi1zY2hlbWEnO1xuaW1wb3J0ICogYXMgYXNuMSBmcm9tICdhc24xanMnO1xuXG5jbGFzcyBDcnlwdG9FcnJvciBleHRlbmRzIEVycm9yIHtcbn1cblxuY2xhc3MgQWxnb3JpdGhtRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG59XG5cbmNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAke21ldGhvZE5hbWUgPyBgJHttZXRob2ROYW1lfWAgOiBcIlwifWApO1xuICAgIH1cbn1cblxuY2xhc3MgT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XG59XG5cbmNsYXNzIFJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIENyeXB0b0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wTmFtZSkge1xuICAgICAgICBzdXBlcihgJHtwcm9wTmFtZX06IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlgKTtcbiAgICB9XG59XG5cbmNsYXNzIFBlbUNvbnZlcnRlciB7XG4gICAgc3RhdGljIHRvQXJyYXlCdWZmZXIocGVtKSB7XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IHBlbVxuICAgICAgICAgICAgLnJlcGxhY2UoLy17NX0oQkVHSU58RU5EKSAuKi17NX0vZywgXCJcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKFwiXFxyXCIsIFwiXCIpXG4gICAgICAgICAgICAucmVwbGFjZShcIlxcblwiLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIENvbnZlcnQuRnJvbUJhc2U2NChiYXNlNjQpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9VaW50OEFycmF5KHBlbSkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMudG9BcnJheUJ1ZmZlcihwZW0pO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclNvdXJjZShidWZmZXIsIHRhZykge1xuICAgICAgICBjb25zdCBiYXNlNjQgPSBDb252ZXJ0LlRvQmFzZTY0KGJ1ZmZlcik7XG4gICAgICAgIGxldCBzbGljZWQ7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCByb3dzID0gW107XG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBiYXNlNjQubGVuZ3RoKSB7XG4gICAgICAgICAgICBzbGljZWQgPSBiYXNlNjQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyA2NCk7XG4gICAgICAgICAgICBpZiAoc2xpY2VkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJvd3MucHVzaChzbGljZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gNjQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBwZXJDYXNlVGFnID0gdGFnLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBgLS0tLS1CRUdJTiAke3VwcGVyQ2FzZVRhZ30tLS0tLVxcbiR7cm93cy5qb2luKFwiXFxuXCIpfVxcbi0tLS0tRU5EICR7dXBwZXJDYXNlVGFnfS0tLS0tYDtcbiAgICB9XG4gICAgc3RhdGljIGlzUEVNKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIC8tLS0tLUJFR0lOIC4rLS0tLS1bQS1aYS16MC05Ky8rPVxcc1xcbl0rLS0tLS1FTkQgListLS0tLS9pLnRlc3QoZGF0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUYWdOYW1lKHBlbSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNQRU0ocGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHBhcmFtZXRlci4gSW5jb21pbmcgZGF0YSBpcyBub3QgcmlnaHQgUEVNXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcyA9IC8tLS0tLUJFR0lOICguKyktLS0tLS8uZXhlYyhwZW0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCB0YWcgZnJvbSBQRU1cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1sxXTtcbiAgICB9XG4gICAgc3RhdGljIGhhc1RhZ05hbWUocGVtLCB0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IHRoaXMuZ2V0VGFnTmFtZShwZW0pO1xuICAgICAgICByZXR1cm4gdGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWcudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgc3RhdGljIGlzQ2VydGlmaWNhdGUocGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcImNlcnRpZmljYXRlXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNDZXJ0aWZpY2F0ZVJlcXVlc3QocGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcImNlcnRpZmljYXRlIHJlcXVlc3RcIik7XG4gICAgfVxuICAgIHN0YXRpYyBpc0NSTChwZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVGFnTmFtZShwZW0sIFwieDUwOSBjcmxcIik7XG4gICAgfVxuICAgIHN0YXRpYyBpc1B1YmxpY0tleShwZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVGFnTmFtZShwZW0sIFwicHVibGljIGtleVwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzSldLKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJrdHlcIiBpbiBkYXRhO1xufVxuXG5jbGFzcyBQcm92aWRlckNyeXB0byB7XG4gICAgYXN5bmMgZGlnZXN0KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0RpZ2VzdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub25EaWdlc3QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGNoZWNrRGlnZXN0KGFsZ29yaXRobSwgX2RhdGEpIHtcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcbiAgICB9XG4gICAgYXN5bmMgb25EaWdlc3QoX2FsZ29yaXRobSwgX2RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJkaWdlc3RcIik7XG4gICAgfVxuICAgIGFzeW5jIGdlbmVyYXRlS2V5KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5vbkdlbmVyYXRlS2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBjaGVja0dlbmVyYXRlS2V5KGFsZ29yaXRobSwgX2V4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLl9hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pO1xuICAgICAgICBpZiAoIShrZXlVc2FnZXMgJiYga2V5VXNhZ2VzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVzYWdlcyBjYW5ub3QgYmUgZW1wdHkgd2hlbiBjcmVhdGluZyBhIGtleS5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWxsb3dlZFVzYWdlcztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy51c2FnZXMpKSB7XG4gICAgICAgICAgICBhbGxvd2VkVXNhZ2VzID0gdGhpcy51c2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhbGxvd2VkVXNhZ2VzID0gdGhpcy51c2FnZXMucHJpdmF0ZUtleS5jb25jYXQodGhpcy51c2FnZXMucHVibGljS2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrS2V5VXNhZ2VzKGtleVVzYWdlcywgYWxsb3dlZFVzYWdlcyk7XG4gICAgfVxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoX2FsZ29yaXRobSkge1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KF9hbGdvcml0aG0sIF9leHRyYWN0YWJsZSwgX2tleVVzYWdlcywgLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJnZW5lcmF0ZUtleVwiKTtcbiAgICB9XG4gICAgYXN5bmMgc2lnbiguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tTaWduLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5vblNpZ24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGNoZWNrU2lnbihhbGdvcml0aG0sIGtleSwgX2RhdGEsIC4uLl9hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXksIFwic2lnblwiKTtcbiAgICB9XG4gICAgYXN5bmMgb25TaWduKF9hbGdvcml0aG0sIF9rZXksIF9kYXRhLCAuLi5fYXJncykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcInNpZ25cIik7XG4gICAgfVxuICAgIGFzeW5jIHZlcmlmeSguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWZXJpZnkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uVmVyaWZ5LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBjaGVja1ZlcmlmeShhbGdvcml0aG0sIGtleSwgX3NpZ25hdHVyZSwgX2RhdGEsIC4uLl9hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXksIFwidmVyaWZ5XCIpO1xuICAgIH1cbiAgICBhc3luYyBvblZlcmlmeShfYWxnb3JpdGhtLCBfa2V5LCBfc2lnbmF0dXJlLCBfZGF0YSwgLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJ2ZXJpZnlcIik7XG4gICAgfVxuICAgIGFzeW5jIGVuY3J5cHQoLi4uYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrRW5jcnlwdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub25FbmNyeXB0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBjaGVja0VuY3J5cHQoYWxnb3JpdGhtLCBrZXksIF9kYXRhLCBvcHRpb25zID0ge30sIC4uLl9hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXksIG9wdGlvbnMua2V5VXNhZ2UgPyBcImVuY3J5cHRcIiA6IHZvaWQgMCk7XG4gICAgfVxuICAgIGFzeW5jIG9uRW5jcnlwdChfYWxnb3JpdGhtLCBfa2V5LCBfZGF0YSwgLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJlbmNyeXB0XCIpO1xuICAgIH1cbiAgICBhc3luYyBkZWNyeXB0KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0RlY3J5cHQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uRGVjcnlwdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgY2hlY2tEZWNyeXB0KGFsZ29yaXRobSwga2V5LCBfZGF0YSwgb3B0aW9ucyA9IHt9LCAuLi5fYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5LCBvcHRpb25zLmtleVVzYWdlID8gXCJkZWNyeXB0XCIgOiB2b2lkIDApO1xuICAgIH1cbiAgICBhc3luYyBvbkRlY3J5cHQoX2FsZ29yaXRobSwgX2tleSwgX2RhdGEsIC4uLl9hcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFwiZGVjcnlwdFwiKTtcbiAgICB9XG4gICAgYXN5bmMgZGVyaXZlQml0cyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tEZXJpdmVCaXRzLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5vbkRlcml2ZUJpdHMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGNoZWNrRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCwgb3B0aW9ucyA9IHt9LCAuLi5fYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSk7XG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoYmFzZUtleSwgb3B0aW9ucy5rZXlVc2FnZSA/IFwiZGVyaXZlQml0c1wiIDogdm9pZCAwKTtcbiAgICAgICAgaWYgKGxlbmd0aCAlIDggIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogSXMgbm90IG11bHRpcGxlIG9mIDhcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKF9hbGdvcml0aG0sIF9iYXNlS2V5LCBfbGVuZ3RoLCAuLi5fYXJncykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImRlcml2ZUJpdHNcIik7XG4gICAgfVxuICAgIGFzeW5jIGV4cG9ydEtleSguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tFeHBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uRXhwb3J0S2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBjaGVja0V4cG9ydEtleShmb3JtYXQsIGtleSwgLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0tleUZvcm1hdChmb3JtYXQpO1xuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSk7XG4gICAgICAgIGlmICgha2V5LmV4dHJhY3RhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3J5cHRvRXJyb3IoXCJrZXk6IElzIG5vdCBleHRyYWN0YWJsZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShfZm9ybWF0LCBfa2V5LCAuLi5fYXJncykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImV4cG9ydEtleVwiKTtcbiAgICB9XG4gICAgYXN5bmMgaW1wb3J0S2V5KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0ltcG9ydEtleS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub25JbXBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGNoZWNrSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBfZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja0tleUZvcm1hdChmb3JtYXQpO1xuICAgICAgICB0aGlzLmNoZWNrS2V5RGF0YShmb3JtYXQsIGtleURhdGEpO1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xuICAgICAgICB0aGlzLmNoZWNrSW1wb3J0UGFyYW1zKGFsZ29yaXRobSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudXNhZ2VzKSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0tleVVzYWdlcyhrZXlVc2FnZXMsIHRoaXMudXNhZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShfZm9ybWF0LCBfa2V5RGF0YSwgX2FsZ29yaXRobSwgX2V4dHJhY3RhYmxlLCBfa2V5VXNhZ2VzLCAuLi5fYXJncykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImltcG9ydEtleVwiKTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSkge1xuICAgICAgICBpZiAoYWxnb3JpdGhtLm5hbWUudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBbGdvcml0aG1FcnJvcihcIlVucmVjb2duaXplZCBuYW1lXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKF9hbGdvcml0aG0pIHtcbiAgICB9XG4gICAgY2hlY2tEZXJpdmVkS2V5UGFyYW1zKF9hbGdvcml0aG0pIHtcbiAgICB9XG4gICAgY2hlY2tLZXlVc2FnZXModXNhZ2VzLCBhbGxvd2VkKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZC5pbmRleE9mKHVzYWdlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNyZWF0ZSBhIGtleSB1c2luZyB0aGUgc3BlY2lmaWVkIGtleSB1c2FnZXNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShrZXkuYWxnb3JpdGhtKTtcbiAgICAgICAgaWYgKGtleVVzYWdlICYmIGtleS51c2FnZXMuaW5kZXhPZihrZXlVc2FnZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3J5cHRvRXJyb3IoYGtleSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIG9wZXJhdGlvbmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrUmVxdWlyZWRQcm9wZXJ0eShkYXRhLCBwcm9wTmFtZSkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkUHJvcGVydHlFcnJvcihwcm9wTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobSwgaGFzaEFsZ29yaXRobXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGhhc2hBbGdvcml0aG1zKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSBhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgaGFzaDogTXVzdCBiZSBvbmUgb2YgJHtoYXNoQWxnb3JpdGhtcy5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuICAgIGNoZWNrSW1wb3J0UGFyYW1zKF9hbGdvcml0aG0pIHtcbiAgICB9XG4gICAgY2hlY2tLZXlGb3JtYXQoZm9ybWF0KSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJmb3JtYXQ6IElzIGludmFsaWQgdmFsdWUuIE11c3QgYmUgJ2p3aycsICdyYXcnLCAnc3BraScsIG9yICdwa2NzOCdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tLZXlEYXRhKGZvcm1hdCwga2V5RGF0YSkge1xuICAgICAgICBpZiAoIWtleURhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBDYW5ub3QgYmUgZW1wdHkgb24gZW1wdHkgb24ga2V5IGltcG9ydGluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImp3a1wiKSB7XG4gICAgICAgICAgICBpZiAoIWlzSldLKGtleURhdGEpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IElzIG5vdCBKc29uV2ViVG9rZW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIUJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShrZXlEYXRhKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IElzIG5vdCBBcnJheUJ1ZmZlclZpZXcgb3IgQXJyYXlCdWZmZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZURhdGEoZGF0YSkge1xuICAgICAgICByZXR1cm4gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XG4gICAgfVxufVxuXG5jbGFzcyBBZXNQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibGVuZ3RoXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBvZiB0eXBlIE51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTI4OlxuICAgICAgICAgICAgY2FzZSAxOTI6XG4gICAgICAgICAgICBjYXNlIDI1NjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogTXVzdCBiZSAxMjgsIDE5Miwgb3IgMjU2XCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrRGVyaXZlZEtleVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSk7XG4gICAgfVxufVxuXG5jbGFzcyBBZXNDYmNQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtQ0JDXCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xuICAgIH1cbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIml2XCIpO1xuICAgICAgICBpZiAoIShhbGdvcml0aG0uaXYgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLml2KSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpdjogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxnb3JpdGhtLml2LmJ5dGVMZW5ndGggIT09IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IE11c3QgaGF2ZSBsZW5ndGggMTYgYnl0ZXNcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEFlc0NtYWNQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtQ01BQ1wiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcInNpZ25cIiwgXCJ2ZXJpZnlcIl07XG4gICAgfVxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibGVuZ3RoXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogTXVzdCBiZSBtb3JlIHRoYW4gMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQWVzQ3RyUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUNUUlwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJjb3VudGVyXCIpO1xuICAgICAgICBpZiAoIShhbGdvcml0aG0uY291bnRlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0uY291bnRlcikpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY291bnRlcjogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxnb3JpdGhtLmNvdW50ZXIuYnl0ZUxlbmd0aCAhPT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpdjogTXVzdCBoYXZlIGxlbmd0aCAxNiBieXRlc1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibGVuZ3RoXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogTXVzdCBiZSBtb3JlIHRoYW4gMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQWVzRWNiUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUVDQlwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcbiAgICB9XG59XG5cbmNsYXNzIEFlc0djbVByb3ZpZGVyIGV4dGVuZHMgQWVzUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkFFUy1HQ01cIjtcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiLCBcIndyYXBLZXlcIiwgXCJ1bndyYXBLZXlcIl07XG4gICAgfVxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJpdlwiKTtcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLml2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5pdikpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsZ29yaXRobS5pdi5ieXRlTGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiaXY6IE11c3QgaGF2ZSBsZW5ndGggbW9yZSB0aGFuIDAgYW5kIGxlc3MgdGhhbiAyXjY0IC0gMVwiKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSBhbGdvcml0aG0udGFnTGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoYWxnb3JpdGhtLnRhZ0xlbmd0aCA9IDEyOCk7XG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLnRhZ0xlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgICBjYXNlIDk2OlxuICAgICAgICAgICAgY2FzZSAxMDQ6XG4gICAgICAgICAgICBjYXNlIDExMjpcbiAgICAgICAgICAgIGNhc2UgMTIwOlxuICAgICAgICAgICAgY2FzZSAxMjg6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcInRhZ0xlbmd0aDogTXVzdCBiZSBvbmUgb2YgMzIsIDY0LCA5NiwgMTA0LCAxMTIsIDEyMCBvciAxMjhcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEFlc0t3UHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUtXXCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcbiAgICB9XG59XG5cbmNsYXNzIERlc1Byb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIGlmICh0aGlzLml2U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIml2XCIpO1xuICAgICAgICAgICAgaWYgKCEoYWxnb3JpdGhtLml2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5pdikpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml2OiBJcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsZ29yaXRobS5pdi5ieXRlTGVuZ3RoICE9PSB0aGlzLml2U2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGl2OiBNdXN0IGhhdmUgbGVuZ3RoICR7dGhpcy5pdlNpemV9IGJ5dGVzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImxlbmd0aFwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3Qgb2YgdHlwZSBOdW1iZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsZ29yaXRobS5sZW5ndGggIT09IHRoaXMua2V5U2l6ZUJpdHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgYWxnb3JpdGhtLmxlbmd0aDogTXVzdCBiZSAke3RoaXMua2V5U2l6ZUJpdHN9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tEZXJpdmVkS2V5UGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKTtcbiAgICB9XG59XG5cbmNsYXNzIFJzYVByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XG4gICAgfVxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJwdWJsaWNFeHBvbmVudFwiKTtcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50ICYmIGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwicHVibGljRXhwb25lbnQ6IE1pc3Npbmcgb3Igbm90IGEgVWludDhBcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWJsaWNFeHBvbmVudCA9IENvbnZlcnQuVG9CYXNlNjQoYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50KTtcbiAgICAgICAgaWYgKCEocHVibGljRXhwb25lbnQgPT09IFwiQXc9PVwiIHx8IHB1YmxpY0V4cG9uZW50ID09PSBcIkFRQUJcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwdWJsaWNFeHBvbmVudDogTXVzdCBiZSBbM10gb3IgWzEsMCwxXVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibW9kdWx1c0xlbmd0aFwiKTtcbiAgICAgICAgaWYgKGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoICUgOFxuICAgICAgICAgICAgfHwgYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPCAyNTZcbiAgICAgICAgICAgIHx8IGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoID4gMTYzODQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgbW9kdWx1cyBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYml0cyBhbmQgPj0gMjU2IGFuZCA8PSAxNjM4NFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja0ltcG9ydFBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcbiAgICB9XG59XG5cbmNsYXNzIFJzYVNzYVByb3ZpZGVyIGV4dGVuZHMgUnNhUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlJTQVNTQS1QS0NTMS12MV81XCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1widmVyaWZ5XCJdLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuY2xhc3MgUnNhUHNzUHJvdmlkZXIgZXh0ZW5kcyBSc2FQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUlNBLVBTU1wiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcInNpZ25cIl0sXG4gICAgICAgICAgICBwdWJsaWNLZXk6IFtcInZlcmlmeVwiXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJzYWx0TGVuZ3RoXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5zYWx0TGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2FsdExlbmd0aDogSXMgbm90IGEgTnVtYmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGdvcml0aG0uc2FsdExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwic2FsdExlbmd0aDogTXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFJzYU9hZXBQcm92aWRlciBleHRlbmRzIFJzYVByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSU0EtT0FFUFwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcImRlY3J5cHRcIiwgXCJ1bndyYXBLZXlcIl0sXG4gICAgICAgICAgICBwdWJsaWNLZXk6IFtcImVuY3J5cHRcIiwgXCJ3cmFwS2V5XCJdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sYWJlbFxuICAgICAgICAgICAgJiYgIShhbGdvcml0aG0ubGFiZWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLmxhYmVsKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsYWJlbDogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRWxsaXB0aWNQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibmFtZWRDdXJ2ZVwiKTtcbiAgICAgICAgdGhpcy5jaGVja05hbWVkQ3VydmUoYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xuICAgIH1cbiAgICBjaGVja05hbWVkQ3VydmUobmFtZWRDdXJ2ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5uYW1lZEN1cnZlcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gbmFtZWRDdXJ2ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgbmFtZWRDdXJ2ZTogTXVzdCBiZSBvbmUgb2YgJHt0aGlzLm5hbWVkQ3VydmVzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG59XG5cbmNsYXNzIEVjZHNhUHJvdmlkZXIgZXh0ZW5kcyBFbGxpcHRpY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFQ0RTQVwiO1xuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XG4gICAgICAgIHRoaXMudXNhZ2VzID0ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1widmVyaWZ5XCJdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiUC0yNTZcIiwgXCJQLTM4NFwiLCBcIlAtNTIxXCIsIFwiSy0yNTZcIl07XG4gICAgfVxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaGFzaFwiKTtcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xuICAgIH1cbn1cblxuY29uc3QgS0VZX1RZUEVTID0gW1wic2VjcmV0XCIsIFwicHJpdmF0ZVwiLCBcInB1YmxpY1wiXTtcbmNsYXNzIENyeXB0b0tleSB7XG4gICAgc3RhdGljIGNyZWF0ZShhbGdvcml0aG0sIHR5cGUsIGV4dHJhY3RhYmxlLCB1c2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IHRoaXMoKTtcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICAgICAga2V5LnR5cGUgPSB0eXBlO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IHVzYWdlcztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgc3RhdGljIGlzS2V5VHlwZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBLRVlfVFlQRVMuaW5kZXhPZihkYXRhKSAhPT0gLTE7XG4gICAgfVxuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ3J5cHRvS2V5XCI7XG4gICAgfVxufVxuXG5jbGFzcyBFY2RoUHJvdmlkZXIgZXh0ZW5kcyBFbGxpcHRpY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFQ0RIXCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wiZGVyaXZlQml0c1wiLCBcImRlcml2ZUtleVwiXSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubmFtZWRDdXJ2ZXMgPSBbXCJQLTI1NlwiLCBcIlAtMzg0XCIsIFwiUC01MjFcIiwgXCJLLTI1NlwiXTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJwdWJsaWNcIik7XG4gICAgICAgIGlmICghKGFsZ29yaXRobS5wdWJsaWMgaW5zdGFuY2VvZiBDcnlwdG9LZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwicHVibGljOiBJcyBub3QgYSBDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsZ29yaXRobS5wdWJsaWMudHlwZSAhPT0gXCJwdWJsaWNcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwicHVibGljOiBJcyBub3QgYSBwdWJsaWMga2V5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGdvcml0aG0ucHVibGljLmFsZ29yaXRobS5uYW1lICE9PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgcHVibGljOiBJcyBub3QgJHt0aGlzLm5hbWV9IGtleWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBFY2RoRXNQcm92aWRlciBleHRlbmRzIEVjZGhQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiRUNESC1FU1wiO1xuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiWDI1NTE5XCIsIFwiWDQ0OFwiXTtcbiAgICB9XG59XG5cbmNsYXNzIEVkRHNhUHJvdmlkZXIgZXh0ZW5kcyBFbGxpcHRpY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFZERTQVwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcInNpZ25cIl0sXG4gICAgICAgICAgICBwdWJsaWNLZXk6IFtcInZlcmlmeVwiXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IFtcIkVkMjU1MTlcIiwgXCJFZDQ0OFwiXTtcbiAgICB9XG59XG5cbmxldCBPYmplY3RJZGVudGlmaWVyID0gY2xhc3MgT2JqZWN0SWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PYmplY3RJZGVudGlmaWVyIH0pXG5dLCBPYmplY3RJZGVudGlmaWVyLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xuT2JqZWN0SWRlbnRpZmllciA9IF9fZGVjb3JhdGUoW1xuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXG5dLCBPYmplY3RJZGVudGlmaWVyKTtcblxuY2xhc3MgQWxnb3JpdGhtSWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcGFyYW1zKTtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHtcbiAgICAgICAgdHlwZTogQXNuUHJvcFR5cGVzLk9iamVjdElkZW50aWZpZXIsXG4gICAgfSlcbl0sIEFsZ29yaXRobUlkZW50aWZpZXIucHJvdG90eXBlLCBcImFsZ29yaXRobVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7XG4gICAgICAgIHR5cGU6IEFzblByb3BUeXBlcy5BbnksXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0pXG5dLCBBbGdvcml0aG1JZGVudGlmaWVyLnByb3RvdHlwZSwgXCJwYXJhbWV0ZXJzXCIsIHZvaWQgMCk7XG5cbmNsYXNzIFByaXZhdGVLZXlJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gMDtcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5QWxnb3JpdGhtID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoKTtcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIH1cbn1cbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciB9KVxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcInZlcnNpb25cIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBbGdvcml0aG1JZGVudGlmaWVyIH0pXG5dLCBQcml2YXRlS2V5SW5mby5wcm90b3R5cGUsIFwicHJpdmF0ZUtleUFsZ29yaXRobVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PY3RldFN0cmluZyB9KVxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcInByaXZhdGVLZXlcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuQW55LCBvcHRpb25hbDogdHJ1ZSB9KVxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcImF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcblxuY2xhc3MgUHVibGljS2V5SW5mbyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoKTtcbiAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgfVxufVxuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFsZ29yaXRobUlkZW50aWZpZXIgfSlcbl0sIFB1YmxpY0tleUluZm8ucHJvdG90eXBlLCBcInB1YmxpY0tleUFsZ29yaXRobVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5CaXRTdHJpbmcgfSlcbl0sIFB1YmxpY0tleUluZm8ucHJvdG90eXBlLCBcInB1YmxpY0tleVwiLCB2b2lkIDApO1xuXG5jb25zdCBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUpTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Gcm9tQmFzZTY0VXJsKHZhbHVlKSxcbiAgICB0b0pTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Ub0Jhc2U2NFVybChuZXcgVWludDhBcnJheSh2YWx1ZSkpLFxufTtcblxuY29uc3QgQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUhleCA9IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXg7XG4gICAgICAgIHJldHVybiAhKG5ldyBVaW50OEFycmF5KHZhbHVlSGV4KVswXSlcbiAgICAgICAgICAgID8gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleC5zbGljZSgxKVxuICAgICAgICAgICAgOiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlSGV4O1xuICAgIH0sXG4gICAgdG9BU046ICh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUhleCA9IG5ldyBVaW50OEFycmF5KHZhbHVlKVswXSA+IDEyN1xuICAgICAgICAgICAgPyBjb21iaW5lKG5ldyBVaW50OEFycmF5KFswXSkuYnVmZmVyLCB2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMS5JbnRlZ2VyKHsgdmFsdWVIZXggfSk7XG4gICAgfSxcbn07XG5cbnZhciBpbmRleCQzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyLFxuICBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlclxufSk7XG5cbmNsYXNzIFJzYVByaXZhdGVLZXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSAwO1xuICAgICAgICB0aGlzLm1vZHVsdXMgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHRoaXMucHVibGljRXhwb25lbnQgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHRoaXMucHJpdmF0ZUV4cG9uZW50ID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB0aGlzLnByaW1lMSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgdGhpcy5wcmltZTIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHRoaXMuZXhwb25lbnQxID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB0aGlzLmV4cG9uZW50MiA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgdGhpcy5jb2VmZmljaWVudCA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckNvbnZlcnRlciB9KVxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwidmVyc2lvblwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiblwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwibW9kdWx1c1wiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiZVwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicHVibGljRXhwb25lbnRcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImRcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcInByaXZhdGVFeHBvbmVudFwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwicFwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicHJpbWUxXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJxXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwcmltZTJcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImRwXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJleHBvbmVudDFcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImRxXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJleHBvbmVudDJcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXG4gICAgSnNvblByb3AoeyBuYW1lOiBcInFpXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJjb2VmZmljaWVudFwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5BbnksIG9wdGlvbmFsOiB0cnVlIH0pXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJvdGhlclByaW1lSW5mb3NcIiwgdm9pZCAwKTtcblxuY2xhc3MgUnNhUHVibGljS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tb2R1bHVzID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICB0aGlzLnB1YmxpY0V4cG9uZW50ID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIH1cbn1cbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXG4gICAgSnNvblByb3AoeyBuYW1lOiBcIm5cIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcbl0sIFJzYVB1YmxpY0tleS5wcm90b3R5cGUsIFwibW9kdWx1c1wiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiZVwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxuXSwgUnNhUHVibGljS2V5LnByb3RvdHlwZSwgXCJwdWJsaWNFeHBvbmVudFwiLCB2b2lkIDApO1xuXG5sZXQgRWNQdWJsaWNLZXkgPSBjbGFzcyBFY1B1YmxpY0tleSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYgKGJ5dGVzWzBdICE9PSAweDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3J5cHRvRXJyb3IoXCJXcm9uZyBFQ1BvaW50LiBDdXJyZW50IHZlcnNpb24gc3VwcG9ydHMgb25seSBVbmNvbXByZXNzZWQgKDB4MDQpIHBvaW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZS5zbGljZSgxKSk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBieXRlcy5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAgeDogQ29udmVydC5Ub0Jhc2U2NFVybChieXRlcy5idWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKSksXG4gICAgICAgICAgICB5OiBDb252ZXJ0LlRvQmFzZTY0VXJsKGJ5dGVzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBzaXplLCBvZmZzZXQgKyBzaXplICsgc2l6ZSkpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIShcInhcIiBpbiBqc29uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieDogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShcInlcIiBpbiBqc29uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieTogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4ID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24ueCk7XG4gICAgICAgIGNvbnN0IHkgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi55KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb21iaW5lKG5ldyBVaW50OEFycmF5KFsweDA0XSkuYnVmZmVyLCB4LCB5KTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBVaW50OEFycmF5KHZhbHVlKS5idWZmZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pXG5dLCBFY1B1YmxpY0tleS5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcbkVjUHVibGljS2V5ID0gX19kZWNvcmF0ZShbXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcbl0sIEVjUHVibGljS2V5KTtcblxuY2xhc3MgRWNQcml2YXRlS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghKFwiZFwiIGluIGpzb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkOiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJpdmF0ZUtleSA9IENvbnZlcnQuRnJvbUJhc2U2NFVybChqc29uLmQpO1xuICAgICAgICBpZiAoXCJ4XCIgaW4ganNvbikge1xuICAgICAgICAgICAgY29uc3QgcHVibGljS2V5ID0gbmV3IEVjUHVibGljS2V5KCk7XG4gICAgICAgICAgICBwdWJsaWNLZXkuZnJvbUpTT04oanNvbik7XG4gICAgICAgICAgICBjb25zdCBhc24gPSBBc25TZXJpYWxpemVyLnRvQVNOKHB1YmxpY0tleSk7XG4gICAgICAgICAgICBpZiAoXCJ2YWx1ZUhleFwiIGluIGFzbi52YWx1ZUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBhc24udmFsdWVCbG9jay52YWx1ZUhleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBqd2sgPSB7fTtcbiAgICAgICAgandrLmQgPSBDb252ZXJ0LlRvQmFzZTY0VXJsKHRoaXMucHJpdmF0ZUtleSk7XG4gICAgICAgIGlmICh0aGlzLnB1YmxpY0tleSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihqd2ssIG5ldyBFY1B1YmxpY0tleSh0aGlzLnB1YmxpY0tleSkudG9KU09OKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqd2s7XG4gICAgfVxufVxuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJDb252ZXJ0ZXIgfSlcbl0sIEVjUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwidmVyc2lvblwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PY3RldFN0cmluZyB9KVxuXSwgRWNQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwcml2YXRlS2V5XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgY29udGV4dDogMCwgdHlwZTogQXNuUHJvcFR5cGVzLkFueSwgb3B0aW9uYWw6IHRydWUgfSlcbl0sIEVjUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicGFyYW1ldGVyc1wiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IGNvbnRleHQ6IDEsIHR5cGU6IEFzblByb3BUeXBlcy5CaXRTdHJpbmcsIG9wdGlvbmFsOiB0cnVlIH0pXG5dLCBFY1ByaXZhdGVLZXkucHJvdG90eXBlLCBcInB1YmxpY0tleVwiLCB2b2lkIDApO1xuXG5jb25zdCBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUudmFsdWVCbG9jay52YWx1ZUhleCk7XG4gICAgICAgIHJldHVybiAoYnl0ZXNbMF0gPT09IDApXG4gICAgICAgICAgICA/IGJ5dGVzLmJ1ZmZlci5zbGljZSgxKVxuICAgICAgICAgICAgOiBieXRlcy5idWZmZXI7XG4gICAgfSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoYnl0ZXNbMF0gPiAxMjcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBuZXdWYWx1ZS5zZXQoYnl0ZXMsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBhc24xLkludGVnZXIoeyB2YWx1ZUhleDogbmV3VmFsdWUuYnVmZmVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgYXNuMS5JbnRlZ2VyKHsgdmFsdWVIZXg6IHZhbHVlIH0pO1xuICAgIH0sXG59O1xuXG52YXIgaW5kZXgkMiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXI6IEFzbkludGVnZXJXaXRob3V0UGFkZGluZ0NvbnZlcnRlclxufSk7XG5cbmNsYXNzIEVjVXRpbHMge1xuICAgIHN0YXRpYyBkZWNvZGVQb2ludChkYXRhLCBwb2ludFNpemUpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGlmICgodmlldy5sZW5ndGggPT09IDApIHx8ICh2aWV3WzBdICE9PSA0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSB1bmNvbXByZXNzZWQgcG9pbnQgZm9ybWF0IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gKHZpZXcubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBpZiAobiAhPT0gKE1hdGguY2VpbChwb2ludFNpemUgLyA4KSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvaW50IGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemVcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeGIgPSB2aWV3LnNsaWNlKDEsIG4gKyAxKTtcbiAgICAgICAgY29uc3QgeWIgPSB2aWV3LnNsaWNlKG4gKyAxLCBuICsgMSArIG4pO1xuICAgICAgICByZXR1cm4geyB4OiB4YiwgeTogeWIgfTtcbiAgICB9XG4gICAgc3RhdGljIGVuY29kZVBvaW50KHBvaW50LCBwb2ludFNpemUpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGguY2VpbChwb2ludFNpemUgLyA4KTtcbiAgICAgICAgaWYgKHBvaW50LnguYnl0ZUxlbmd0aCAhPT0gc2l6ZSB8fCBwb2ludC55LmJ5dGVMZW5ndGggIT09IHNpemUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlgsWSBjb29yZGluYXRlcyBkb24ndCBtYXRjaCBwb2ludCBzaXplIGNyaXRlcmlhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHggPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHBvaW50LngpO1xuICAgICAgICBjb25zdCB5ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwb2ludC55KTtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIDIgKyAxKTtcbiAgICAgICAgcmVzWzBdID0gNDtcbiAgICAgICAgcmVzLnNldCh4LCAxKTtcbiAgICAgICAgcmVzLnNldCh5LCBzaXplICsgMSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplKHBvaW50U2l6ZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHBvaW50U2l6ZSAvIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5jb2RlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9pbnRTaXplKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldFNpemUocG9pbnRTaXplKTtcbiAgICAgICAgY29uc3QgciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoc2lnbmF0dXJlLnIpO1xuICAgICAgICBjb25zdCBzID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShzaWduYXR1cmUucyk7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KHNpemUgKiAyKTtcbiAgICAgICAgcmVzLnNldCh0aGlzLnBhZFN0YXJ0KHIsIHNpemUpKTtcbiAgICAgICAgcmVzLnNldCh0aGlzLnBhZFN0YXJ0KHMsIHNpemUpLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGRlY29kZVNpZ25hdHVyZShkYXRhLCBwb2ludFNpemUpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShwb2ludFNpemUpO1xuICAgICAgICBjb25zdCB2aWV3ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgaWYgKHZpZXcubGVuZ3RoICE9PSAoc2l6ZSAqIDIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3Qgc2l6ZSBvZiB0aGUgc2lnbmF0dXJlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHIgPSB2aWV3LnNsaWNlKDAsIHNpemUpO1xuICAgICAgICBjb25zdCBzID0gdmlldy5zbGljZShzaXplKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHRoaXMudHJpbVN0YXJ0KHIpLFxuICAgICAgICAgICAgczogdGhpcy50cmltU3RhcnQocyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXRpYyB0cmltU3RhcnQoZGF0YSkge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlICgoaSA8IGRhdGEubGVuZ3RoIC0gMSkgJiYgKGRhdGFbaV0gPT09IDApKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhLnNsaWNlKGksIGRhdGEubGVuZ3RoKTtcbiAgICB9XG4gICAgc3RhdGljIHBhZFN0YXJ0KGRhdGEsIHNpemUpIHtcbiAgICAgICAgaWYgKHNpemUgPT09IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgcmVzLnNldChkYXRhLCBzaXplIC0gZGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuY2xhc3MgRWNEc2FTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHRoaXMucyA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21XZWJDcnlwdG9TaWduYXR1cmUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgcG9pbnRTaXplID0gdmFsdWUuYnl0ZUxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gRWNVdGlscy5kZWNvZGVTaWduYXR1cmUodmFsdWUsIHBvaW50U2l6ZSAqIDgpO1xuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZSA9IG5ldyBFY0RzYVNpZ25hdHVyZSgpO1xuICAgICAgICBlY1NpZ25hdHVyZS5yID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIocG9pbnQucik7XG4gICAgICAgIGVjU2lnbmF0dXJlLnMgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihwb2ludC5zKTtcbiAgICAgICAgcmV0dXJuIGVjU2lnbmF0dXJlO1xuICAgIH1cbiAgICB0b1dlYkNyeXB0b1NpZ25hdHVyZShwb2ludFNpemUpIHtcbiAgICAgICAgaWYgKCFwb2ludFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFBvaW50TGVuZ3RoID0gTWF0aC5tYXgodGhpcy5yLmJ5dGVMZW5ndGgsIHRoaXMucy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChtYXhQb2ludExlbmd0aCA8PSAzMikge1xuICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDI1NjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1heFBvaW50TGVuZ3RoIDw9IDQ4KSB7XG4gICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMzg0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9pbnRTaXplID0gNTIxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEVjVXRpbHMuZW5jb2RlU2lnbmF0dXJlKHRoaXMsIHBvaW50U2l6ZSk7XG4gICAgICAgIHJldHVybiBzaWduYXR1cmUuYnVmZmVyO1xuICAgIH1cbn1cbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXIgfSlcbl0sIEVjRHNhU2lnbmF0dXJlLnByb3RvdHlwZSwgXCJyXCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlcldpdGhvdXRQYWRkaW5nQ29udmVydGVyIH0pXG5dLCBFY0RzYVNpZ25hdHVyZS5wcm90b3R5cGUsIFwic1wiLCB2b2lkIDApO1xuXG5jbGFzcyBPbmVBc3ltbWV0cmljS2V5IGV4dGVuZHMgUHJpdmF0ZUtleUluZm8ge1xufVxuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IGNvbnRleHQ6IDEsIGltcGxpY2l0OiB0cnVlLCB0eXBlOiBBc25Qcm9wVHlwZXMuQml0U3RyaW5nLCBvcHRpb25hbDogdHJ1ZSB9KVxuXSwgT25lQXN5bW1ldHJpY0tleS5wcm90b3R5cGUsIFwicHVibGljS2V5XCIsIHZvaWQgMCk7XG5cbmxldCBFZFByaXZhdGVLZXkgPSBjbGFzcyBFZFByaXZhdGVLZXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbi5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkOiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgandrID0ge1xuICAgICAgICAgICAgZDogQ29udmVydC5Ub0Jhc2U2NFVybCh0aGlzLnZhbHVlKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGp3aztcbiAgICB9XG59O1xuX19kZWNvcmF0ZShbXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PY3RldFN0cmluZyB9KVxuXSwgRWRQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xuRWRQcml2YXRlS2V5ID0gX19kZWNvcmF0ZShbXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcbl0sIEVkUHJpdmF0ZUtleSk7XG5cbmxldCBFZFB1YmxpY0tleSA9IGNsYXNzIEVkUHVibGljS2V5IHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7XG4gICAgICAgICAgICB4OiBDb252ZXJ0LlRvQmFzZTY0VXJsKHRoaXMudmFsdWUpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIShcInhcIiBpbiBqc29uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieDogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24ueCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5fX2RlY29yYXRlKFtcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkJpdFN0cmluZyB9KVxuXSwgRWRQdWJsaWNLZXkucHJvdG90eXBlLCBcInZhbHVlXCIsIHZvaWQgMCk7XG5FZFB1YmxpY0tleSA9IF9fZGVjb3JhdGUoW1xuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXG5dLCBFZFB1YmxpY0tleSk7XG5cbmxldCBDdXJ2ZVByaXZhdGVLZXkgPSBjbGFzcyBDdXJ2ZVByaXZhdGVLZXkge1xufTtcbl9fZGVjb3JhdGUoW1xuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuT2N0ZXRTdHJpbmcgfSksXG4gICAgSnNvblByb3AoeyB0eXBlOiBKc29uUHJvcFR5cGVzLlN0cmluZywgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcbl0sIEN1cnZlUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwiZFwiLCB2b2lkIDApO1xuQ3VydmVQcml2YXRlS2V5ID0gX19kZWNvcmF0ZShbXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcbl0sIEN1cnZlUHJpdmF0ZUtleSk7XG5cbmNvbnN0IGlkU2VjcDI1NnIxID0gXCIxLjIuODQwLjEwMDQ1LjMuMS43XCI7XG5jb25zdCBpZEVsbGlwdGljQ3VydmUgPSBcIjEuMy4xMzIuMFwiO1xuY29uc3QgaWRTZWNwMzg0cjEgPSBgJHtpZEVsbGlwdGljQ3VydmV9LjM0YDtcbmNvbnN0IGlkU2VjcDUyMXIxID0gYCR7aWRFbGxpcHRpY0N1cnZlfS4zNWA7XG5jb25zdCBpZFNlY3AyNTZrMSA9IGAke2lkRWxsaXB0aWNDdXJ2ZX0uMTBgO1xuY29uc3QgaWRWZXJzaW9uT25lID0gXCIxLjMuMzYuMy4zLjIuOC4xLjFcIjtcbmNvbnN0IGlkQnJhaW5wb29sUDE2MHIxID0gYCR7aWRWZXJzaW9uT25lfS4xYDtcbmNvbnN0IGlkQnJhaW5wb29sUDE2MHQxID0gYCR7aWRWZXJzaW9uT25lfS4yYDtcbmNvbnN0IGlkQnJhaW5wb29sUDE5MnIxID0gYCR7aWRWZXJzaW9uT25lfS4zYDtcbmNvbnN0IGlkQnJhaW5wb29sUDE5MnQxID0gYCR7aWRWZXJzaW9uT25lfS40YDtcbmNvbnN0IGlkQnJhaW5wb29sUDIyNHIxID0gYCR7aWRWZXJzaW9uT25lfS41YDtcbmNvbnN0IGlkQnJhaW5wb29sUDIyNHQxID0gYCR7aWRWZXJzaW9uT25lfS42YDtcbmNvbnN0IGlkQnJhaW5wb29sUDI1NnIxID0gYCR7aWRWZXJzaW9uT25lfS43YDtcbmNvbnN0IGlkQnJhaW5wb29sUDI1NnQxID0gYCR7aWRWZXJzaW9uT25lfS44YDtcbmNvbnN0IGlkQnJhaW5wb29sUDMyMHIxID0gYCR7aWRWZXJzaW9uT25lfS45YDtcbmNvbnN0IGlkQnJhaW5wb29sUDMyMHQxID0gYCR7aWRWZXJzaW9uT25lfS4xMGA7XG5jb25zdCBpZEJyYWlucG9vbFAzODRyMSA9IGAke2lkVmVyc2lvbk9uZX0uMTFgO1xuY29uc3QgaWRCcmFpbnBvb2xQMzg0dDEgPSBgJHtpZFZlcnNpb25PbmV9LjEyYDtcbmNvbnN0IGlkQnJhaW5wb29sUDUxMnIxID0gYCR7aWRWZXJzaW9uT25lfS4xM2A7XG5jb25zdCBpZEJyYWlucG9vbFA1MTJ0MSA9IGAke2lkVmVyc2lvbk9uZX0uMTRgO1xuY29uc3QgaWRYMjU1MTkgPSBcIjEuMy4xMDEuMTEwXCI7XG5jb25zdCBpZFg0NDggPSBcIjEuMy4xMDEuMTExXCI7XG5jb25zdCBpZEVkMjU1MTkgPSBcIjEuMy4xMDEuMTEyXCI7XG5jb25zdCBpZEVkNDQ4ID0gXCIxLjMuMTAxLjExM1wiO1xuXG52YXIgaW5kZXgkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBBbGdvcml0aG1JZGVudGlmaWVyOiBBbGdvcml0aG1JZGVudGlmaWVyLFxuICBnZXQgQ3VydmVQcml2YXRlS2V5ICgpIHsgcmV0dXJuIEN1cnZlUHJpdmF0ZUtleTsgfSxcbiAgRWNEc2FTaWduYXR1cmU6IEVjRHNhU2lnbmF0dXJlLFxuICBFY1ByaXZhdGVLZXk6IEVjUHJpdmF0ZUtleSxcbiAgZ2V0IEVjUHVibGljS2V5ICgpIHsgcmV0dXJuIEVjUHVibGljS2V5OyB9LFxuICBnZXQgRWRQcml2YXRlS2V5ICgpIHsgcmV0dXJuIEVkUHJpdmF0ZUtleTsgfSxcbiAgZ2V0IEVkUHVibGljS2V5ICgpIHsgcmV0dXJuIEVkUHVibGljS2V5OyB9LFxuICBnZXQgT2JqZWN0SWRlbnRpZmllciAoKSB7IHJldHVybiBPYmplY3RJZGVudGlmaWVyOyB9LFxuICBPbmVBc3ltbWV0cmljS2V5OiBPbmVBc3ltbWV0cmljS2V5LFxuICBQcml2YXRlS2V5SW5mbzogUHJpdmF0ZUtleUluZm8sXG4gIFB1YmxpY0tleUluZm86IFB1YmxpY0tleUluZm8sXG4gIFJzYVByaXZhdGVLZXk6IFJzYVByaXZhdGVLZXksXG4gIFJzYVB1YmxpY0tleTogUnNhUHVibGljS2V5LFxuICBjb252ZXJ0ZXJzOiBpbmRleCQyLFxuICBpZEJyYWlucG9vbFAxNjByMTogaWRCcmFpbnBvb2xQMTYwcjEsXG4gIGlkQnJhaW5wb29sUDE2MHQxOiBpZEJyYWlucG9vbFAxNjB0MSxcbiAgaWRCcmFpbnBvb2xQMTkycjE6IGlkQnJhaW5wb29sUDE5MnIxLFxuICBpZEJyYWlucG9vbFAxOTJ0MTogaWRCcmFpbnBvb2xQMTkydDEsXG4gIGlkQnJhaW5wb29sUDIyNHIxOiBpZEJyYWlucG9vbFAyMjRyMSxcbiAgaWRCcmFpbnBvb2xQMjI0dDE6IGlkQnJhaW5wb29sUDIyNHQxLFxuICBpZEJyYWlucG9vbFAyNTZyMTogaWRCcmFpbnBvb2xQMjU2cjEsXG4gIGlkQnJhaW5wb29sUDI1NnQxOiBpZEJyYWlucG9vbFAyNTZ0MSxcbiAgaWRCcmFpbnBvb2xQMzIwcjE6IGlkQnJhaW5wb29sUDMyMHIxLFxuICBpZEJyYWlucG9vbFAzMjB0MTogaWRCcmFpbnBvb2xQMzIwdDEsXG4gIGlkQnJhaW5wb29sUDM4NHIxOiBpZEJyYWlucG9vbFAzODRyMSxcbiAgaWRCcmFpbnBvb2xQMzg0dDE6IGlkQnJhaW5wb29sUDM4NHQxLFxuICBpZEJyYWlucG9vbFA1MTJyMTogaWRCcmFpbnBvb2xQNTEycjEsXG4gIGlkQnJhaW5wb29sUDUxMnQxOiBpZEJyYWlucG9vbFA1MTJ0MSxcbiAgaWRFZDI1NTE5OiBpZEVkMjU1MTksXG4gIGlkRWQ0NDg6IGlkRWQ0NDgsXG4gIGlkRWxsaXB0aWNDdXJ2ZTogaWRFbGxpcHRpY0N1cnZlLFxuICBpZFNlY3AyNTZrMTogaWRTZWNwMjU2azEsXG4gIGlkU2VjcDI1NnIxOiBpZFNlY3AyNTZyMSxcbiAgaWRTZWNwMzg0cjE6IGlkU2VjcDM4NHIxLFxuICBpZFNlY3A1MjFyMTogaWRTZWNwNTIxcjEsXG4gIGlkVmVyc2lvbk9uZTogaWRWZXJzaW9uT25lLFxuICBpZFgyNTUxOTogaWRYMjU1MTksXG4gIGlkWDQ0ODogaWRYNDQ4XG59KTtcblxuY2xhc3MgRWNDdXJ2ZXMge1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3RhdGljIHJlZ2lzdGVyKGl0ZW0pIHtcbiAgICAgICAgY29uc3Qgb2lkID0gbmV3IE9iamVjdElkZW50aWZpZXIoKTtcbiAgICAgICAgb2lkLnZhbHVlID0gaXRlbS5pZDtcbiAgICAgICAgY29uc3QgcmF3ID0gQXNuQ29udmVydC5zZXJpYWxpemUob2lkKTtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICByYXcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5hbWVzLnB1c2goaXRlbS5uYW1lKTtcbiAgICB9XG4gICAgc3RhdGljIGZpbmQobmFtZU9ySWQpIHtcbiAgICAgICAgbmFtZU9ySWQgPSBuYW1lT3JJZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lT3JJZCB8fCBpdGVtLmlkLnRvVXBwZXJDYXNlKCkgPT09IG5hbWVPcklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQobmFtZU9ySWQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5maW5kKG5hbWVPcklkKTtcbiAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgRUMgbmFtZWQgY3VydmUgJyR7bmFtZU9ySWR9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufVxuRWNDdXJ2ZXMuaXRlbXMgPSBbXTtcbkVjQ3VydmVzLm5hbWVzID0gW107XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiUC0yNTZcIiwgaWQ6IGlkU2VjcDI1NnIxLCBzaXplOiAyNTYgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiUC0zODRcIiwgaWQ6IGlkU2VjcDM4NHIxLCBzaXplOiAzODQgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiUC01MjFcIiwgaWQ6IGlkU2VjcDUyMXIxLCBzaXplOiA1MjEgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiSy0yNTZcIiwgaWQ6IGlkU2VjcDI1NmsxLCBzaXplOiAyNTYgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiYnJhaW5wb29sUDE2MHIxXCIsIGlkOiBpZEJyYWlucG9vbFAxNjByMSwgc2l6ZTogMTYwIH0pO1xuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAxNjB0MVwiLCBpZDogaWRCcmFpbnBvb2xQMTYwdDEsIHNpemU6IDE2MCB9KTtcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMTkycjFcIiwgaWQ6IGlkQnJhaW5wb29sUDE5MnIxLCBzaXplOiAxOTIgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiYnJhaW5wb29sUDE5MnQxXCIsIGlkOiBpZEJyYWlucG9vbFAxOTJ0MSwgc2l6ZTogMTkyIH0pO1xuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyMjRyMVwiLCBpZDogaWRCcmFpbnBvb2xQMjI0cjEsIHNpemU6IDIyNCB9KTtcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMjI0dDFcIiwgaWQ6IGlkQnJhaW5wb29sUDIyNHQxLCBzaXplOiAyMjQgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiYnJhaW5wb29sUDI1NnIxXCIsIGlkOiBpZEJyYWlucG9vbFAyNTZyMSwgc2l6ZTogMjU2IH0pO1xuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyNTZ0MVwiLCBpZDogaWRCcmFpbnBvb2xQMjU2dDEsIHNpemU6IDI1NiB9KTtcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzIwcjFcIiwgaWQ6IGlkQnJhaW5wb29sUDMyMHIxLCBzaXplOiAzMjAgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiYnJhaW5wb29sUDMyMHQxXCIsIGlkOiBpZEJyYWlucG9vbFAzMjB0MSwgc2l6ZTogMzIwIH0pO1xuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAzODRyMVwiLCBpZDogaWRCcmFpbnBvb2xQMzg0cjEsIHNpemU6IDM4NCB9KTtcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzg0dDFcIiwgaWQ6IGlkQnJhaW5wb29sUDM4NHQxLCBzaXplOiAzODQgfSk7XG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiYnJhaW5wb29sUDUxMnIxXCIsIGlkOiBpZEJyYWlucG9vbFA1MTJyMSwgc2l6ZTogNTEyIH0pO1xuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFA1MTJ0MVwiLCBpZDogaWRCcmFpbnBvb2xQNTEydDEsIHNpemU6IDUxMiB9KTtcblxuY2xhc3MgWDI1NTE5UHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWDI1NTE5XCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wiZGVyaXZlS2V5XCIsIFwiZGVyaXZlQml0c1wiXSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogW10sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwicHVibGljXCIpO1xuICAgIH1cbn1cblxuY2xhc3MgRWQyNTUxOVByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkVkMjU1MTlcIjtcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBbXCJzaWduXCJdLFxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJ2ZXJpZnlcIl0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5jbGFzcyBIbWFjUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSE1BQ1wiO1xuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wic2lnblwiLCBcInZlcmlmeVwiXTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdExlbmd0aChhbGdOYW1lKSB7XG4gICAgICAgIHN3aXRjaCAoYWxnTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiU0hBLTFcIjpcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XG4gICAgICAgICAgICBjYXNlIFwiU0hBLTM4NFwiOlxuICAgICAgICAgICAgY2FzZSBcIlNIQS01MTJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gNTEyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWxnb3JpdGhtIG5hbWUgJyR7YWxnTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcbiAgICAgICAgaWYgKFwibGVuZ3RoXCIgaW4gYWxnb3JpdGhtKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImxlbmd0aDogTnVtYmVyIGlzIG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja0ltcG9ydFBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcbiAgICB9XG59XG5cbmNsYXNzIFBia2RmMlByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlBCS0RGMlwiO1xuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZGVyaXZlQml0c1wiLCBcImRlcml2ZUtleVwiXTtcbiAgICB9XG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJzYWx0XCIpO1xuICAgICAgICBpZiAoIShhbGdvcml0aG0uc2FsdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0uc2FsdCkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2FsdDogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaXRlcmF0aW9uc1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0uaXRlcmF0aW9ucyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml0ZXJhdGlvbnM6IElzIG5vdCBhIE51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxnb3JpdGhtLml0ZXJhdGlvbnMgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXRlcmF0aW9uczogSXMgbGVzcyB0aGFuIDFcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoZXh0cmFjdGFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcImV4dHJhY3RhYmxlOiBNdXN0IGJlICdmYWxzZSdcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEhrZGZQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJIS0RGXCI7XG4gICAgICAgIHRoaXMuaGFzaEFsZ29yaXRobXMgPSBbXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiXTtcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJkZXJpdmVLZXlcIiwgXCJkZXJpdmVCaXRzXCJdO1xuICAgIH1cbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcInNhbHRcIik7XG4gICAgICAgIGlmICghQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGFsZ29yaXRobS5zYWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNhbHQ6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImluZm9cIik7XG4gICAgICAgIGlmICghQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGFsZ29yaXRobS5pbmZvKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNhbHQ6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoZXh0cmFjdGFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcImV4dHJhY3RhYmxlOiBNdXN0IGJlICdmYWxzZSdcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFNoYWtlUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XG4gICAgICAgIHRoaXMuZGVmYXVsdExlbmd0aCA9IDA7XG4gICAgfVxuICAgIGRpZ2VzdCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3NbMF0gPSB7IGxlbmd0aDogdGhpcy5kZWZhdWx0TGVuZ3RoLCAuLi5hcmdzWzBdIH07XG4gICAgICAgIHJldHVybiBzdXBlci5kaWdlc3QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGNoZWNrRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xuICAgICAgICBzdXBlci5jaGVja0RpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBhbGdvcml0aG0ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5lZ2F0aXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBTaGFrZTEyOFByb3ZpZGVyIGV4dGVuZHMgU2hha2VQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwic2hha2UxMjhcIjtcbiAgICAgICAgdGhpcy5kZWZhdWx0TGVuZ3RoID0gMTY7XG4gICAgfVxufVxuXG5jbGFzcyBTaGFrZTI1NlByb3ZpZGVyIGV4dGVuZHMgU2hha2VQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwic2hha2UyNTZcIjtcbiAgICAgICAgdGhpcy5kZWZhdWx0TGVuZ3RoID0gMzI7XG4gICAgfVxufVxuXG5jbGFzcyBDcnlwdG8ge1xuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ3J5cHRvXCI7XG4gICAgfVxuICAgIHJhbmRvbVVVSUQoKSB7XG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICBiWzZdID0gKGJbNl0gJiAweDBmKSB8IDB4NDA7XG4gICAgICAgIGJbOF0gPSAoYls4XSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgY29uc3QgdXVpZCA9IENvbnZlcnQuVG9IZXgoYikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGAke3V1aWQuc3Vic3RyaW5nKDAsIDgpfS0ke3V1aWQuc3Vic3RyaW5nKDgsIDEyKX0tJHt1dWlkLnN1YnN0cmluZygxMiwgMTYpfS0ke3V1aWQuc3Vic3RyaW5nKDE2LCAyMCl9LSR7dXVpZC5zdWJzdHJpbmcoMjApfWA7XG4gICAgfVxufVxuXG5jbGFzcyBQcm92aWRlclN0b3JhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLml0ZW1zID0ge307XG4gICAgfVxuICAgIGdldChhbGdvcml0aG1OYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2FsZ29yaXRobU5hbWUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcbiAgICB9XG4gICAgc2V0KHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuaXRlbXNbcHJvdmlkZXIubmFtZS50b0xvd2VyQ2FzZSgpXSA9IHByb3ZpZGVyO1xuICAgIH1cbiAgICByZW1vdmVBdChhbGdvcml0aG1OYW1lKSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXQoYWxnb3JpdGhtTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5pdGVtc1thbGdvcml0aG1OYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgfVxuICAgIGhhcyhuYW1lKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0KG5hbWUpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5pdGVtcykubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgYWxnb3JpdGhtcygpIHtcbiAgICAgICAgY29uc3QgYWxnb3JpdGhtcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuaXRlbXNba2V5XTtcbiAgICAgICAgICAgIGFsZ29yaXRobXMucHVzaChwcm92aWRlci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxnb3JpdGhtcy5zb3J0KCk7XG4gICAgfVxufVxuXG5jb25zdCBrZXlGb3JtYXRNYXAgPSB7XG4gICAgXCJqd2tcIjogW1wicHJpdmF0ZVwiLCBcInB1YmxpY1wiLCBcInNlY3JldFwiXSxcbiAgICBcInBrY3M4XCI6IFtcInByaXZhdGVcIl0sXG4gICAgXCJzcGtpXCI6IFtcInB1YmxpY1wiXSxcbiAgICBcInJhd1wiOiBbXCJzZWNyZXRcIiwgXCJwdWJsaWNcIl1cbn07XG5jb25zdCBzb3VyY2VCdWZmZXJLZXlGb3JtYXRzID0gW1wicGtjczhcIiwgXCJzcGtpXCIsIFwicmF3XCJdO1xuY2xhc3MgU3VidGxlQ3J5cHRvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBuZXcgUHJvdmlkZXJTdG9yYWdlKCk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0hhc2hlZEFsZ29yaXRobShkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgICAmJiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgJiYgXCJuYW1lXCIgaW4gZGF0YVxuICAgICAgICAgICAgJiYgXCJoYXNoXCIgaW4gZGF0YVxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgICAgIHJldHVybiBcIlN1YnRsZUNyeXB0b1wiO1xuICAgIH1cbiAgICBhc3luYyBkaWdlc3QoLi4uYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMiwgXCJkaWdlc3RcIik7XG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5kaWdlc3QocHJlcGFyZWRBbGdvcml0aG0sIHByZXBhcmVkRGF0YSwgLi4ucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgZ2VuZXJhdGVLZXkoLi4uYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJnZW5lcmF0ZUtleVwiKTtcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zXSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuZ2VuZXJhdGVLZXkoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBzaWduKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwic2lnblwiKTtcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5wYXJhbXNdID0gYXJncztcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5zaWduKHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZERhdGEsIC4uLnBhcmFtcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIHZlcmlmeSguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCA0LCBcInZlcmlmeVwiKTtcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSk7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xuICAgICAgICBjb25zdCBwcmVwYXJlZFNpZ25hdHVyZSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZFNpZ25hdHVyZSwgcHJlcGFyZWREYXRhLCAuLi5wYXJhbXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBlbmNyeXB0KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwiZW5jcnlwdFwiKTtcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5wYXJhbXNdID0gYXJncztcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5lbmNyeXB0KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZERhdGEsIHsga2V5VXNhZ2U6IHRydWUgfSwgLi4ucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgZGVjcnlwdCguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCAzLCBcImRlY3J5cHRcIik7XG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGtleSwgZGF0YSwgLi4ucGFyYW1zXSA9IGFyZ3M7XG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKTtcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuZGVjcnlwdCh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIGtleSwgcHJlcGFyZWREYXRhLCB7IGtleVVzYWdlOiB0cnVlIH0sIC4uLnBhcmFtcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGRlcml2ZUJpdHMoLi4uYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJkZXJpdmVCaXRzXCIpO1xuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgsIC4uLnBhcmFtc10gPSBhcmdzO1xuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGJhc2VLZXkpO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmRlcml2ZUJpdHMoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBiYXNlS2V5LCBsZW5ndGgsIHsga2V5VXNhZ2U6IHRydWUgfSwgLi4ucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgZGVyaXZlS2V5KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDUsIFwiZGVyaXZlS2V5XCIpO1xuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBiYXNlS2V5LCBkZXJpdmVkS2V5VHlwZSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zXSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGVyaXZlZEtleVR5cGUgPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oZGVyaXZlZEtleVR5cGUpO1xuICAgICAgICBjb25zdCBpbXBvcnRQcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWREZXJpdmVkS2V5VHlwZS5uYW1lKTtcbiAgICAgICAgaW1wb3J0UHJvdmlkZXIuY2hlY2tEZXJpdmVkS2V5UGFyYW1zKHByZXBhcmVkRGVyaXZlZEtleVR5cGUpO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIHByb3ZpZGVyLmNoZWNrQ3J5cHRvS2V5KGJhc2VLZXksIFwiZGVyaXZlS2V5XCIpO1xuICAgICAgICBjb25zdCBkZXJpdmVkQml0cyA9IGF3YWl0IHByb3ZpZGVyLmRlcml2ZUJpdHMoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBiYXNlS2V5LCBkZXJpdmVkS2V5VHlwZS5sZW5ndGggfHwgNTEyLCB7IGtleVVzYWdlOiBmYWxzZSB9LCAuLi5wYXJhbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRLZXkoXCJyYXdcIiwgZGVyaXZlZEJpdHMsIGRlcml2ZWRLZXlUeXBlLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xuICAgIH1cbiAgICBhc3luYyBleHBvcnRLZXkoLi4uYXJncykge1xuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMiwgXCJleHBvcnRLZXlcIik7XG4gICAgICAgIGNvbnN0IFtmb3JtYXQsIGtleSwgLi4ucGFyYW1zXSA9IGFyZ3M7XG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgaWYgKCFrZXlGb3JtYXRNYXBbZm9ybWF0XSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQga2V5Rm9ybWF0IGFyZ3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2V5Rm9ybWF0TWFwW2Zvcm1hdF0uaW5jbHVkZXMoa2V5LnR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFwiVGhlIGtleSBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGtleS5hbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmV4cG9ydEtleShmb3JtYXQsIGtleSwgLi4ucGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgaW1wb3J0S2V5KC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDUsIFwiaW1wb3J0S2V5XCIpO1xuICAgICAgICBjb25zdCBbZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLnBhcmFtc10gPSBhcmdzO1xuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiandrXCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5RGF0YSAhPT0gXCJvYmplY3RcIiB8fCAha2V5RGF0YS5rdHkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiS2V5IGRhdGEgbXVzdCBiZSBhbiBvYmplY3QgZm9yIEpXSyBpbXBvcnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc291cmNlQnVmZmVyS2V5Rm9ybWF0cy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICAgICAgICBpZiAoIUJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShrZXlEYXRhKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJLZXkgZGF0YSBtdXN0IGJlIGEgQnVmZmVyU291cmNlIGZvciBub24tSldLIGZvcm1hdHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3IG9yIEpzb25XZWJLZXkpJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xuICAgIH1cbiAgICBhc3luYyB3cmFwS2V5KGZvcm1hdCwga2V5LCB3cmFwcGluZ0tleSwgd3JhcEFsZ29yaXRobSwgLi4uYXJncykge1xuICAgICAgICBsZXQga2V5RGF0YSA9IGF3YWl0IHRoaXMuZXhwb3J0S2V5KGZvcm1hdCwga2V5LCAuLi5hcmdzKTtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJqd2tcIikge1xuICAgICAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGtleURhdGEpO1xuICAgICAgICAgICAga2V5RGF0YSA9IENvbnZlcnQuRnJvbVV0ZjhTdHJpbmcoanNvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0od3JhcEFsZ29yaXRobSk7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGtleURhdGEpO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIHJldHVybiBwcm92aWRlci5lbmNyeXB0KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgd3JhcHBpbmdLZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogZmFsc2UgfSwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIHVud3JhcEtleShmb3JtYXQsIHdyYXBwZWRLZXksIHVud3JhcHBpbmdLZXksIHVud3JhcEFsZ29yaXRobSwgdW53cmFwcGVkS2V5QWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKHVud3JhcEFsZ29yaXRobSk7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHdyYXBwZWRLZXkpO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XG4gICAgICAgIGxldCBrZXlEYXRhID0gYXdhaXQgcHJvdmlkZXIuZGVjcnlwdCh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIHVud3JhcHBpbmdLZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogZmFsc2UgfSwgLi4uYXJncyk7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiandrXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAga2V5RGF0YSA9IEpTT04ucGFyc2UoQ29udmVydC5Ub1V0ZjhTdHJpbmcoa2V5RGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXCJ3cmFwcGVkS2V5OiBJcyBub3QgYSBKU09OXCIpO1xuICAgICAgICAgICAgICAgIGVycm9yLmludGVybmFsID0gZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB1bndyYXBwZWRLZXlBbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBjaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIHNpemUsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJyR7bWV0aG9kTmFtZX0nIG9uICdTdWJ0bGVDcnlwdG8nOiAke3NpemV9IGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgJHthcmdzLmxlbmd0aH0gcHJlc2VudGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWxnb3JpdGhtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGFsZ29yaXRobSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFN1YnRsZUNyeXB0by5pc0hhc2hlZEFsZ29yaXRobShhbGdvcml0aG0pKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHsgLi4uYWxnb3JpdGhtIH07XG4gICAgICAgICAgICBwcmVwYXJlZEFsZ29yaXRobS5oYXNoID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoKTtcbiAgICAgICAgICAgIHJldHVybiBwcmVwYXJlZEFsZ29yaXRobTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5hbGdvcml0aG0gfTtcbiAgICB9XG4gICAgZ2V0UHJvdmlkZXIobmFtZSkge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvdmlkZXJzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFsZ29yaXRobUVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgS2V5IGlzIG5vdCBvZiB0eXBlICdDcnlwdG9LZXknYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBpbmRleCA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBjb252ZXJ0ZXJzOiBpbmRleCQzXG59KTtcblxuY29uc3QgUkVRVUlSRURfRklFTERTID0gW1wiY3J2XCIsIFwiZVwiLCBcImtcIiwgXCJrdHlcIiwgXCJuXCIsIFwieFwiLCBcInlcIl07XG5jbGFzcyBKd2tVdGlscyB7XG4gICAgc3RhdGljIGFzeW5jIHRodW1icHJpbnQoaGFzaCwgandrLCBjcnlwdG8pIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0KGp3aywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBjcnlwdG8uc3VidGxlLmRpZ2VzdChoYXNoLCBDb252ZXJ0LkZyb21CaW5hcnkoSlNPTi5zdHJpbmdpZnkoZGF0YSkpKTtcbiAgICB9XG4gICAgc3RhdGljIGZvcm1hdChqd2ssIHJlbW92ZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXMgPSBPYmplY3QuZW50cmllcyhqd2spO1xuICAgICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gUkVRVUlSRURfRklFTERTLmluY2x1ZGVzKG9bMF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSByZXMuc29ydCgoW2tleUFdLCBba2V5Ql0pID0+IGtleUEgPiBrZXlCID8gMSA6IGtleUEgPCBrZXlCID8gLTEgOiAwKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQWVzQ2JjUHJvdmlkZXIsIEFlc0NtYWNQcm92aWRlciwgQWVzQ3RyUHJvdmlkZXIsIEFlc0VjYlByb3ZpZGVyLCBBZXNHY21Qcm92aWRlciwgQWVzS3dQcm92aWRlciwgQWVzUHJvdmlkZXIsIEFsZ29yaXRobUVycm9yLCBDcnlwdG8sIENyeXB0b0Vycm9yLCBDcnlwdG9LZXksIERlc1Byb3ZpZGVyLCBFY0N1cnZlcywgRWNVdGlscywgRWNkaEVzUHJvdmlkZXIsIEVjZGhQcm92aWRlciwgRWNkc2FQcm92aWRlciwgRWQyNTUxOVByb3ZpZGVyLCBFZERzYVByb3ZpZGVyLCBFbGxpcHRpY1Byb3ZpZGVyLCBIa2RmUHJvdmlkZXIsIEhtYWNQcm92aWRlciwgSndrVXRpbHMsIE9wZXJhdGlvbkVycm9yLCBQYmtkZjJQcm92aWRlciwgUGVtQ29udmVydGVyLCBQcm92aWRlckNyeXB0bywgUHJvdmlkZXJTdG9yYWdlLCBSZXF1aXJlZFByb3BlcnR5RXJyb3IsIFJzYU9hZXBQcm92aWRlciwgUnNhUHJvdmlkZXIsIFJzYVBzc1Byb3ZpZGVyLCBSc2FTc2FQcm92aWRlciwgU2hha2UxMjhQcm92aWRlciwgU2hha2UyNTZQcm92aWRlciwgU2hha2VQcm92aWRlciwgU3VidGxlQ3J5cHRvLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yLCBYMjU1MTlQcm92aWRlciwgaW5kZXgkMSBhcyBhc24xLCBpc0pXSywgaW5kZXggYXMganNvbiB9O1xuIiwgIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwgIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCAiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGN1c3RvbUluc3BlY3RTeW1ib2wgPVxuICAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA/IFN5bWJvbFsnZm9yJ10oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA6IG51bGxcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG52YXIgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgdmFyIHByb3RvID0geyBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSlcbk9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIsIFVpbnQ4QXJyYXkpXG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheVZpZXcgKGFycmF5Vmlldykge1xuICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdmFyIGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBCdWZmZXIuZnJvbShidWYpLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgYnVmLFxuICAgICAgICAgIHBvc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIH1cbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBtdXN0TWF0Y2ggPSAoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlKVxuICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICB9XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcmNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cbmlmIChjdXN0b21JbnNwZWN0U3ltYm9sKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBCdWZmZXIucHJvdG90eXBlLmluc3BlY3Rcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpXG4gIH1cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB0YXJnZXQpXG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbdmFsXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKVxuICAgICAgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKVxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJylcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxudmFyIGhleFNsaWNlTG9va3VwVGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZidcbiAgdmFyIHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdmFyIGkxNiA9IGkgKiAxNlxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgdGFibGVbaTE2ICsgal0gPSBhbHBoYWJldFtpXSArIGFscGhhYmV0W2pdXG4gICAgfVxuICB9XG4gIHJldHVybiB0YWJsZVxufSkoKVxuIiwgIi8qIVxuIENvcHlyaWdodCAoYykgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuKi9cblxuaW1wb3J0ICogYXMgY29yZSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5pbXBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgYXMgQnVmZmVyU291cmNlQ29udmVydGVyJDEgfSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5leHBvcnQgeyBDcnlwdG9LZXkgfSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5pbXBvcnQgeyBCdWZmZXIgYXMgQnVmZmVyJDEgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB7IF9fZGVjb3JhdGUgfSBmcm9tICd0c2xpYic7XG5pbXBvcnQgeyBKc29uUHJvcCwgSnNvblByb3BUeXBlcywgSnNvblNlcmlhbGl6ZXIsIEpzb25QYXJzZXIgfSBmcm9tICdAcGVjdWxpYXIvanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgQ29udmVydCwgQnVmZmVyU291cmNlQ29udmVydGVyIH0gZnJvbSAncHZ0c3V0aWxzJztcbmltcG9ydCB7IEFzblBhcnNlciwgQXNuU2VyaWFsaXplciwgQXNuQ29udmVydCB9IGZyb20gJ0BwZWN1bGlhci9hc24xLXNjaGVtYSc7XG5cbmNvbnN0IEpzb25CYXNlNjRVcmxDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUpTT046ICh2YWx1ZSkgPT4gQnVmZmVyJDEuZnJvbShDb252ZXJ0LkZyb21CYXNlNjRVcmwodmFsdWUpKSxcbiAgICB0b0pTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Ub0Jhc2U2NFVybCh2YWx1ZSksXG59O1xuXG5jbGFzcyBDcnlwdG9LZXkgZXh0ZW5kcyBjb3JlLkNyeXB0b0tleSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlciQxLmFsbG9jKDApO1xuICAgICAgICB0aGlzLmFsZ29yaXRobSA9IHsgbmFtZTogXCJcIiB9O1xuICAgICAgICB0aGlzLmV4dHJhY3RhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IFwic2VjcmV0XCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XG4gICAgICAgIHRoaXMua3R5ID0gXCJvY3RcIjtcbiAgICAgICAgdGhpcy5hbGcgPSBcIlwiO1xuICAgIH1cbn1cbl9fZGVjb3JhdGUoW1xuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJleHRcIiwgdHlwZTogSnNvblByb3BUeXBlcy5Cb29sZWFuLCBvcHRpb25hbDogdHJ1ZSB9KVxuXSwgQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJleHRyYWN0YWJsZVwiLCB2b2lkIDApO1xuX19kZWNvcmF0ZShbXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImtleV9vcHNcIiwgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcsIHJlcGVhdGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KVxuXSwgQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJ1c2FnZXNcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIEpzb25Qcm9wKHsgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcgfSlcbl0sIENyeXB0b0tleS5wcm90b3R5cGUsIFwia3R5XCIsIHZvaWQgMCk7XG5fX2RlY29yYXRlKFtcbiAgICBKc29uUHJvcCh7IHR5cGU6IEpzb25Qcm9wVHlwZXMuU3RyaW5nLCBvcHRpb25hbDogdHJ1ZSB9KVxuXSwgQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJhbGdcIiwgdm9pZCAwKTtcblxuY2xhc3MgU3ltbWV0cmljS2V5IGV4dGVuZHMgQ3J5cHRvS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5rdHkgPSBcIm9jdFwiO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInNlY3JldFwiO1xuICAgIH1cbn1cblxuY2xhc3MgQXN5bW1ldHJpY0tleSBleHRlbmRzIENyeXB0b0tleSB7XG59XG5cbmNsYXNzIEFlc0NyeXB0b0tleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XG4gICAgZ2V0IGFsZygpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ0JDXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9Q0JDYDtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ1RSXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9Q1RSYDtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtR0NNXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9R0NNYDtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtS1dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1LV2A7XG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNNQUNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1DTUFDYDtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9RUNCYDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQWxnb3JpdGhtRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGdvcml0aG0gbmFtZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXQgYWxnKHZhbHVlKSB7XG4gICAgfVxufVxuX19kZWNvcmF0ZShbXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImtcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQ29udmVydGVyIH0pXG5dLCBBZXNDcnlwdG9LZXkucHJvdG90eXBlLCBcImRhdGFcIiwgdm9pZCAwKTtcblxuY2xhc3MgQWVzQ3J5cHRvIHtcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBBZXNDcnlwdG9LZXkoKTtcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XG4gICAgICAgIGtleS5kYXRhID0gY3J5cHRvLnJhbmRvbUJ5dGVzKGFsZ29yaXRobS5sZW5ndGggPj4gMyk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBleHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5OiBJcyBub3QgQWVzQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxuICAgICAgICAgICAgICAgIGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IEFlc0NyeXB0b0tleSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcbiAgICAgICAgICAgICAgICBrZXkgPSBuZXcgQWVzQ3J5cHRvS2V5KCk7XG4gICAgICAgICAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIkMS5mcm9tKGtleURhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJyBvciAncmF3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xuICAgICAgICBrZXkuYWxnb3JpdGhtLmxlbmd0aCA9IGtleS5kYXRhLmxlbmd0aCA8PCAzO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAgc3dpdGNoIChrZXkuYWxnb3JpdGhtLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAxMjg6XG4gICAgICAgICAgICBjYXNlIDE5MjpcbiAgICAgICAgICAgIGNhc2UgMjU2OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImtleURhdGE6IElzIHdyb25nIGtleSBsZW5ndGhcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNCQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICAgICAgY2FzZSBcIkFFUy1DVFJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0QWVzQ1RSKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtR0NNXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0dDTShhbGdvcml0aG0sIGtleSwgQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgICAgICBjYXNlIFwiQUVTLUtXXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0VDQihhbGdvcml0aG0sIGtleSwgQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXk6IElzIG5vdCBBZXNDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNCQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICAgICAgY2FzZSBcIkFFUy1DVFJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QWVzQ1RSKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtR0NNXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdEFlc0dDTShhbGdvcml0aG0sIGtleSwgQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgICAgICBjYXNlIFwiQUVTLUtXXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdEFlc0VDQihhbGdvcml0aG0sIGtleSwgQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdEFlc0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBlbmMgPSBCdWZmZXIkMS5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZGF0YSk7XG4gICAgICAgIGRlYyA9IEJ1ZmZlciQxLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWMpLmJ1ZmZlcjtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tY3RyYCwga2V5LmRhdGEsIEJ1ZmZlciQxLmZyb20oYWxnb3JpdGhtLmNvdW50ZXIpKTtcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XG4gICAgICAgIGVuYyA9IEJ1ZmZlciQxLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWN0cmAsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uY291bnRlcikpO1xuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBkZWMgPSBCdWZmZXIkMS5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0QWVzR0NNKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWdjbWAsIGtleS5kYXRhLCBCdWZmZXIkMS5mcm9tKGFsZ29yaXRobS5pdiksIHtcbiAgICAgICAgICAgIGF1dGhUYWdMZW5ndGg6IChhbGdvcml0aG0udGFnTGVuZ3RoIHx8IDEyOCkgPj4gMyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbGdvcml0aG0uYWRkaXRpb25hbERhdGEpIHtcbiAgICAgICAgICAgIGNpcGhlci5zZXRBQUQoQnVmZmVyJDEuZnJvbShhbGdvcml0aG0uYWRkaXRpb25hbERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgZW5jID0gQnVmZmVyJDEuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpLCBjaXBoZXIuZ2V0QXV0aFRhZygpXSk7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdEFlc0dDTShhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCB0YWdMZW5ndGggPSAoYWxnb3JpdGhtLnRhZ0xlbmd0aCB8fCAxMjgpID4+IDM7XG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1nY21gLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSwge1xuICAgICAgICAgICAgYXV0aFRhZ0xlbmd0aDogdGFnTGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW5jID0gZGF0YS5zbGljZSgwLCBkYXRhLmxlbmd0aCAtIHRhZ0xlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRhZyA9IGRhdGEuc2xpY2UoZGF0YS5sZW5ndGggLSB0YWdMZW5ndGgpO1xuICAgICAgICBpZiAoYWxnb3JpdGhtLmFkZGl0aW9uYWxEYXRhKSB7XG4gICAgICAgICAgICBkZWNpcGhlci5zZXRBQUQoQnVmZmVyJDEuZnJvbShhbGdvcml0aG0uYWRkaXRpb25hbERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZW5jKTtcbiAgICAgICAgZGVjID0gQnVmZmVyJDEuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihgaWQtYWVzJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0td3JhcGAsIGtleS5kYXRhLCB0aGlzLkFFU19LV19JVik7XG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBlbmMgPSBCdWZmZXIkMS5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGlkLWFlcyR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LXdyYXBgLCBrZXkuZGF0YSwgdGhpcy5BRVNfS1dfSVYpO1xuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBkZWMgPSBCdWZmZXIkMS5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWVjYmAsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheSgwKSk7XG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBlbmMgPSBCdWZmZXIkMS5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1lY2JgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xuICAgICAgICBkZWMgPSBCdWZmZXIkMS5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XG4gICAgfVxufVxuQWVzQ3J5cHRvLkFFU19LV19JViA9IEJ1ZmZlciQxLmZyb20oXCJBNkE2QTZBNkE2QTZBNkE2XCIsIFwiaGV4XCIpO1xuXG5jb25zdCBrZXlTdG9yYWdlID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGdldENyeXB0b0tleShrZXkpIHtcbiAgICBjb25zdCByZXMgPSBrZXlTdG9yYWdlLmdldChrZXkpO1xuICAgIGlmICghcmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiQ2Fubm90IGdldCBDcnlwdG9LZXkgZnJvbSBzZWN1cmUgc3RvcmFnZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHNldENyeXB0b0tleSh2YWx1ZSkge1xuICAgIGNvbnN0IGtleSA9IGNvcmUuQ3J5cHRvS2V5LmNyZWF0ZSh2YWx1ZS5hbGdvcml0aG0sIHZhbHVlLnR5cGUsIHZhbHVlLmV4dHJhY3RhYmxlLCB2YWx1ZS51c2FnZXMpO1xuICAgIE9iamVjdC5mcmVlemUoa2V5KTtcbiAgICBrZXlTdG9yYWdlLnNldChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4ga2V5O1xufVxuXG5jbGFzcyBBZXNDYmNQcm92aWRlciBleHRlbmRzIGNvcmUuQWVzQ2JjUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XG4gICAgfVxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCB6ZXJvID0gQnVmZmVyJDEuZnJvbShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pO1xuY29uc3QgcmIgPSBCdWZmZXIkMS5mcm9tKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxMzVdKTtcbmNvbnN0IGJsb2NrU2l6ZSA9IDE2O1xuZnVuY3Rpb24gYml0U2hpZnRMZWZ0KGJ1ZmZlcikge1xuICAgIGNvbnN0IHNoaWZ0ZWQgPSBCdWZmZXIkMS5hbGxvYyhidWZmZXIubGVuZ3RoKTtcbiAgICBjb25zdCBsYXN0ID0gYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxhc3Q7IGluZGV4KyspIHtcbiAgICAgICAgc2hpZnRlZFtpbmRleF0gPSBidWZmZXJbaW5kZXhdIDw8IDE7XG4gICAgICAgIGlmIChidWZmZXJbaW5kZXggKyAxXSAmIDB4ODApIHtcbiAgICAgICAgICAgIHNoaWZ0ZWRbaW5kZXhdICs9IDB4MDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hpZnRlZFtsYXN0XSA9IGJ1ZmZlcltsYXN0XSA8PCAxO1xuICAgIHJldHVybiBzaGlmdGVkO1xufVxuZnVuY3Rpb24geG9yKGEsIGIpIHtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICAgIGNvbnN0IG91dHB1dCA9IEJ1ZmZlciQxLmFsbG9jKGxlbmd0aCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBvdXRwdXRbaW5kZXhdID0gYVtpbmRleF0gXiBiW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbmZ1bmN0aW9uIGFlcyhrZXksIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoYGFlcyR7a2V5Lmxlbmd0aCA8PCAzfWAsIGtleSwgemVybyk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2lwaGVyLnVwZGF0ZShtZXNzYWdlKTtcbiAgICBjaXBoZXIuZmluYWwoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGJsb2NrSW5kZXgpIHtcbiAgICBjb25zdCBibG9jayA9IEJ1ZmZlciQxLmFsbG9jKGJsb2NrU2l6ZSk7XG4gICAgY29uc3Qgc3RhcnQgPSBibG9ja0luZGV4ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgYmxvY2tTaXplO1xuICAgIG1lc3NhZ2UuY29weShibG9jaywgMCwgc3RhcnQsIGVuZCk7XG4gICAgcmV0dXJuIGJsb2NrO1xufVxuZnVuY3Rpb24gZ2V0UGFkZGVkTWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGJsb2NrSW5kZXgpIHtcbiAgICBjb25zdCBibG9jayA9IEJ1ZmZlciQxLmFsbG9jKGJsb2NrU2l6ZSk7XG4gICAgY29uc3Qgc3RhcnQgPSBibG9ja0luZGV4ICogYmxvY2tTaXplO1xuICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2UubGVuZ3RoO1xuICAgIGJsb2NrLmZpbGwoMCk7XG4gICAgbWVzc2FnZS5jb3B5KGJsb2NrLCAwLCBzdGFydCwgZW5kKTtcbiAgICBibG9ja1tlbmQgLSBzdGFydF0gPSAweDgwO1xuICAgIHJldHVybiBibG9jaztcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlU3Via2V5cyhrZXkpIHtcbiAgICBjb25zdCBsID0gYWVzKGtleSwgemVybyk7XG4gICAgbGV0IHN1YmtleTEgPSBiaXRTaGlmdExlZnQobCk7XG4gICAgaWYgKGxbMF0gJiAweDgwKSB7XG4gICAgICAgIHN1YmtleTEgPSB4b3Ioc3Via2V5MSwgcmIpO1xuICAgIH1cbiAgICBsZXQgc3Via2V5MiA9IGJpdFNoaWZ0TGVmdChzdWJrZXkxKTtcbiAgICBpZiAoc3Via2V5MVswXSAmIDB4ODApIHtcbiAgICAgICAgc3Via2V5MiA9IHhvcihzdWJrZXkyLCByYik7XG4gICAgfVxuICAgIHJldHVybiB7IHN1YmtleTEsIHN1YmtleTIgfTtcbn1cbmZ1bmN0aW9uIGFlc0NtYWMoa2V5LCBtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Via2V5cyA9IGdlbmVyYXRlU3Via2V5cyhrZXkpO1xuICAgIGxldCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKG1lc3NhZ2UubGVuZ3RoIC8gYmxvY2tTaXplKTtcbiAgICBsZXQgbGFzdEJsb2NrQ29tcGxldGVGbGFnO1xuICAgIGxldCBsYXN0QmxvY2s7XG4gICAgaWYgKGJsb2NrQ291bnQgPT09IDApIHtcbiAgICAgICAgYmxvY2tDb3VudCA9IDE7XG4gICAgICAgIGxhc3RCbG9ja0NvbXBsZXRlRmxhZyA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGFzdEJsb2NrQ29tcGxldGVGbGFnID0gKG1lc3NhZ2UubGVuZ3RoICUgYmxvY2tTaXplID09PSAwKTtcbiAgICB9XG4gICAgY29uc3QgbGFzdEJsb2NrSW5kZXggPSBibG9ja0NvdW50IC0gMTtcbiAgICBpZiAobGFzdEJsb2NrQ29tcGxldGVGbGFnKSB7XG4gICAgICAgIGxhc3RCbG9jayA9IHhvcihnZXRNZXNzYWdlQmxvY2sobWVzc2FnZSwgbGFzdEJsb2NrSW5kZXgpLCBzdWJrZXlzLnN1YmtleTEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGFzdEJsb2NrID0geG9yKGdldFBhZGRlZE1lc3NhZ2VCbG9jayhtZXNzYWdlLCBsYXN0QmxvY2tJbmRleCksIHN1YmtleXMuc3Via2V5Mik7XG4gICAgfVxuICAgIGxldCB4ID0gemVybztcbiAgICBsZXQgeTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGFzdEJsb2NrSW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgeSA9IHhvcih4LCBnZXRNZXNzYWdlQmxvY2sobWVzc2FnZSwgaW5kZXgpKTtcbiAgICAgICAgeCA9IGFlcyhrZXksIHkpO1xuICAgIH1cbiAgICB5ID0geG9yKGxhc3RCbG9jaywgeCk7XG4gICAgcmV0dXJuIGFlcyhrZXksIHkpO1xufVxuY2xhc3MgQWVzQ21hY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5BZXNDbWFjUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhZXNDbWFjKGdldENyeXB0b0tleShrZXkpLmRhdGEsIEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5idWZmZXI7XG4gICAgfVxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlMiA9IGF3YWl0IHRoaXMuc2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSk7XG4gICAgICAgIHJldHVybiBCdWZmZXIkMS5mcm9tKHNpZ25hdHVyZSkuY29tcGFyZShCdWZmZXIkMS5mcm9tKHNpZ25hdHVyZTIpKSA9PT0gMDtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XG4gICAgfVxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBBZXNDdHJQcm92aWRlciBleHRlbmRzIGNvcmUuQWVzQ3RyUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XG4gICAgfVxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBBZXNHY21Qcm92aWRlciBleHRlbmRzIGNvcmUuQWVzR2NtUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XG4gICAgfVxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBBZXNLd1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5BZXNLd1Byb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbGVuZ3RoOiBhbGdvcml0aG0ubGVuZ3RoLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShyZXMpO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQWVzQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgbmFtZTogYWxnb3JpdGhtLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcbiAgICB9XG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZW5jcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmRlY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQWVzRWNiUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0VjYlByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbGVuZ3RoOiBhbGdvcml0aG0ubGVuZ3RoLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShyZXMpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRGVzQ3J5cHRvS2V5IGV4dGVuZHMgU3ltbWV0cmljS2V5IHtcbiAgICBnZXQgYWxnKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIkRFUy1DQkNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYERFUy1DQkNgO1xuICAgICAgICAgICAgY2FzZSBcIkRFUy1FREUzLUNCQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgM0RFUy1DQkNgO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5BbGdvcml0aG1FcnJvcihcIlVuc3VwcG9ydGVkIGFsZ29yaXRobSBuYW1lXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCBhbGcodmFsdWUpIHtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwia1wiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxDb252ZXJ0ZXIgfSlcbl0sIERlc0NyeXB0b0tleS5wcm90b3R5cGUsIFwiZGF0YVwiLCB2b2lkIDApO1xuXG5jbGFzcyBEZXNDcnlwdG8ge1xuICAgIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IERlc0NyeXB0b0tleSgpO1xuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAga2V5LmRhdGEgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoYWxnb3JpdGhtLmxlbmd0aCA+PiAzKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpO1xuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShrZXkuZGF0YSkuYnVmZmVyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJyBvciAncmF3J1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcbiAgICAgICAgICAgICAgICBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBEZXNDcnlwdG9LZXkgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XG4gICAgICAgICAgICAgICAga2V5ID0gbmV3IERlc0NyeXB0b0tleSgpO1xuICAgICAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyJDEuZnJvbShrZXlEYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XG4gICAgICAgIH1cbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIkRFUy1DQkNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0RGVzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJERVMtRURFMy1DQkNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0RGVzRURFM0NCQyhhbGdvcml0aG0sIGtleSwgQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBEZXNDcnlwdG9LZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXk6IElzIG5vdCBEZXNDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiREVTLUNCQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHREZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICAgICAgY2FzZSBcIkRFUy1FREUzLUNCQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHREZXNFREUzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIkMS5mcm9tKGRhdGEpKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0RGVzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihgZGVzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XG4gICAgICAgIGVuYyA9IEJ1ZmZlciQxLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHREZXNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihgZGVzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgZGVjID0gQnVmZmVyJDEuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdERlc0VERTNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KGBkZXMtZWRlMy1jYmNgLCBrZXkuZGF0YSwgQnVmZmVyJDEuZnJvbShhbGdvcml0aG0uaXYpKTtcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XG4gICAgICAgIGVuYyA9IEJ1ZmZlciQxLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHREZXNFREUzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGRlcy1lZGUzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcbiAgICAgICAgZGVjID0gQnVmZmVyJDEuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xuICAgIH1cbn1cblxuY2xhc3MgRGVzQ2JjUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkRlc1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5rZXlTaXplQml0cyA9IDY0O1xuICAgICAgICB0aGlzLml2U2l6ZSA9IDg7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiREVTLUNCQ1wiO1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBEZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmtleVNpemVCaXRzLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBEZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiB0aGlzLm5hbWUsIGxlbmd0aDogdGhpcy5rZXlTaXplQml0cyB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgaWYgKGtleS5kYXRhLmxlbmd0aCAhPT0gKHRoaXMua2V5U2l6ZUJpdHMgPj4gMykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwia2V5RGF0YTogV3Jvbmcga2V5IHNpemVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIERlc0NyeXB0b0tleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIERlc0NyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRGVzRWRlM0NiY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5EZXNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMua2V5U2l6ZUJpdHMgPSAxOTI7XG4gICAgICAgIHRoaXMuaXZTaXplID0gODtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJERVMtRURFMy1DQkNcIjtcbiAgICB9XG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRGVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5rZXlTaXplQml0cyxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZW5jcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmRlY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRGVzQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgbmFtZTogdGhpcy5uYW1lLCBsZW5ndGg6IHRoaXMua2V5U2l6ZUJpdHMgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIGlmIChrZXkuZGF0YS5sZW5ndGggIT09ICh0aGlzLmtleVNpemVCaXRzID4+IDMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImtleURhdGE6IFdyb25nIGtleSBzaXplXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBEZXNDcnlwdG9LZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgYSBEZXNDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEp3a0FsZ29yaXRobShhbGdvcml0aG0pIHtcbiAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSBcIlJTQS1PQUVQXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IG1kU2l6ZSA9IC8oXFxkKykkLy5leGVjKGFsZ29yaXRobS5oYXNoLm5hbWUpWzFdO1xuICAgICAgICAgICAgcmV0dXJuIGBSU0EtT0FFUCR7bWRTaXplICE9PSBcIjFcIiA/IGAtJHttZFNpemV9YCA6IFwiXCJ9YDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiUlNBU1NBLVBLQ1MxLVYxXzVcIjpcbiAgICAgICAgICAgIHJldHVybiBgUlMkey8oXFxkKykkLy5leGVjKGFsZ29yaXRobS5oYXNoLm5hbWUpWzFdfWA7XG4gICAgICAgIGNhc2UgXCJSU0EtUFNTXCI6XG4gICAgICAgICAgICByZXR1cm4gYFBTJHsvKFxcZCspJC8uZXhlYyhhbGdvcml0aG0uaGFzaC5uYW1lKVsxXX1gO1xuICAgICAgICBjYXNlIFwiUlNBLVBLQ1MxXCI6XG4gICAgICAgICAgICByZXR1cm4gYFJTMWA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XG4gICAgfVxufVxuXG5jbGFzcyBSc2FQcml2YXRlS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9IFwicHJpdmF0ZVwiO1xuICAgIH1cbiAgICBnZXRLZXkoKSB7XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8pO1xuICAgICAgICByZXR1cm4gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLlJzYVByaXZhdGVLZXkpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7XG4gICAgICAgICAgICBrdHk6IFwiUlNBXCIsXG4gICAgICAgICAgICBhbGc6IGdldEp3a0FsZ29yaXRobSh0aGlzLmFsZ29yaXRobSksXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oanNvbiwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbygpO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IG51bGw7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleSk7XG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlciQxLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xuICAgIH1cbn1cblxuY2xhc3MgUnNhUHVibGljS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9IFwicHVibGljXCI7XG4gICAgfVxuICAgIGdldEtleSgpIHtcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnB1YmxpY0tleSwgY29yZS5hc24xLlJzYVB1YmxpY0tleSk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoKTtcbiAgICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgICAgIGt0eTogXCJSU0FcIixcbiAgICAgICAgICAgIGFsZzogZ2V0SndrQWxnb3JpdGhtKHRoaXMuYWxnb3JpdGhtKSxcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KSk7XG4gICAgfVxuICAgIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihqc29uLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLlJzYVB1YmxpY0tleSB9KTtcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI7XG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBudWxsO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleSk7XG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlciQxLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xuICAgIH1cbn1cblxuY2xhc3MgUnNhQ3J5cHRvIHtcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBuZXcgUnNhUHJpdmF0ZUtleSgpO1xuICAgICAgICBwcml2YXRlS2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICAgICAgcHJpdmF0ZUtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xuICAgICAgICBwcml2YXRlS2V5LnVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnByaXZhdGVLZXlVc2FnZXMuaW5kZXhPZih1c2FnZSkgIT09IC0xKTtcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gbmV3IFJzYVB1YmxpY0tleSgpO1xuICAgICAgICBwdWJsaWNLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xuICAgICAgICBwdWJsaWNLZXkuZXh0cmFjdGFibGUgPSB0cnVlO1xuICAgICAgICBwdWJsaWNLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IHB1YmxpY0V4cG9uZW50ID0gQnVmZmVyJDEuY29uY2F0KFtcbiAgICAgICAgICAgIEJ1ZmZlciQxLmFsbG9jKDQgLSBhbGdvcml0aG0ucHVibGljRXhwb25lbnQuYnl0ZUxlbmd0aCwgMCksXG4gICAgICAgICAgICBCdWZmZXIkMS5mcm9tKGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCksXG4gICAgICAgIF0pLnJlYWRJbnQzMkJFKDApO1xuICAgICAgICBjb25zdCBrZXlzID0gY3J5cHRvLmdlbmVyYXRlS2V5UGFpclN5bmMoXCJyc2FcIiwge1xuICAgICAgICAgICAgbW9kdWx1c0xlbmd0aDogYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGgsXG4gICAgICAgICAgICBwdWJsaWNFeHBvbmVudCxcbiAgICAgICAgICAgIHB1YmxpY0tleUVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BraVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByaXZhdGVLZXlFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBrY3M4XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcHJpdmF0ZUtleS5kYXRhID0ga2V5cy5wcml2YXRlS2V5O1xuICAgICAgICBwdWJsaWNLZXkuZGF0YSA9IGtleXMucHVibGljS2V5O1xuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICBwcml2YXRlS2V5LFxuICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncGtjczgnIG9yICdzcGtpJ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGp3ayA9IGtleURhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGp3ay5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQcml2YXRlS2V5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wdWJsaWNLZXksIGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLlJzYVByaXZhdGVLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3BrY3M4JyBvciAnc3BraSdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiUlNBLVBTU1wiOlxuICAgICAgICAgICAgY2FzZSBcIlJTQVNTQS1QS0NTMS1WMV81XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnblJzYShhbGdvcml0aG0sIGtleSwgZGF0YSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgdmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiUlNBLVBTU1wiOlxuICAgICAgICAgICAgY2FzZSBcIlJTQVNTQS1QS0NTMS1WMV81XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5U1NBKGFsZ29yaXRobSwga2V5LCBkYXRhLCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiUlNBLU9BRVBcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0T0FFUChhbGdvcml0aG0sIGtleSwgZGF0YSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJSU0EtT0FFUFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRPQUVQKGFsZ29yaXRobSwga2V5LCBkYXRhKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBpbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gbnVsbDtcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoYXNuS2V5KTtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IFJzYVByaXZhdGVLZXkoKTtcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIkMS5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XG4gICAgICAgIGtleS5hbGdvcml0aG0ucHVibGljRXhwb25lbnQgPSBuZXcgVWludDhBcnJheShhc25LZXkucHVibGljRXhwb25lbnQpO1xuICAgICAgICBrZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPSBhc25LZXkubW9kdWx1cy5ieXRlTGVuZ3RoIDw8IDM7XG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICBzdGF0aWMgaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlB1YmxpY0tleUluZm8oKTtcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gbnVsbDtcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShhc25LZXkpO1xuICAgICAgICBjb25zdCBrZXkgPSBuZXcgUnNhUHVibGljS2V5KCk7XG4gICAgICAgIGtleS5kYXRhID0gQnVmZmVyJDEuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xuICAgICAgICBrZXkuYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXNuS2V5LnB1YmxpY0V4cG9uZW50KTtcbiAgICAgICAga2V5LmFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoID0gYXNuS2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCA8PCAzO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgc3RhdGljIGdldENyeXB0b0FsZ29yaXRobShhbGcpIHtcbiAgICAgICAgc3dpdGNoIChhbGcuaGFzaC5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEExXCI7XG4gICAgICAgICAgICBjYXNlIFwiU0hBLTI1NlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEEyNTZcIjtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTM4NFwiO1xuICAgICAgICAgICAgY2FzZSBcIlNIQS01MTJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBNTEyXCI7XG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0yNTZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBMy0yNTZcIjtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEEzLTM4NFwiO1xuICAgICAgICAgICAgY2FzZSBcIlNIQTMtNTEyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTMtNTEyXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtLmhhc2g6IElzIG5vdCByZWNvZ25pemVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBzaWduUnNhKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IHRoaXMuZ2V0Q3J5cHRvQWxnb3JpdGhtKGtleS5hbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbihjcnlwdG9BbGcpO1xuICAgICAgICBzaWduZXIudXBkYXRlKEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICBpZiAoIWtleS5wZW0pIHtcbiAgICAgICAgICAgIGtleS5wZW0gPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJSU0EtUFNTXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HO1xuICAgICAgICAgICAgb3B0aW9ucy5zYWx0TGVuZ3RoID0gYWxnb3JpdGhtLnNhbHRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmVyLnNpZ24ob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLmJ1ZmZlcjtcbiAgICB9XG4gICAgc3RhdGljIHZlcmlmeVNTQShhbGdvcml0aG0sIGtleSwgZGF0YSwgc2lnbmF0dXJlKSB7XG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IHRoaXMuZ2V0Q3J5cHRvQWxnb3JpdGhtKGtleS5hbGdvcml0aG0pO1xuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KGNyeXB0b0FsZyk7XG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgIGlmICgha2V5LnBlbSkge1xuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJSU0EtUFNTXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HO1xuICAgICAgICAgICAgb3B0aW9ucy5zYWx0TGVuZ3RoID0gYWxnb3JpdGhtLnNhbHRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2sgPSBzaWduZXIudmVyaWZ5KG9wdGlvbnMsIHNpZ25hdHVyZSk7XG4gICAgICAgIHJldHVybiBvaztcbiAgICB9XG4gICAgc3RhdGljIGVuY3J5cHRPQUVQKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXk6IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYCxcbiAgICAgICAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX09BRVBfUEFERElORyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sYWJlbCkgO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvLnB1YmxpY0VuY3J5cHQob3B0aW9ucywgZGF0YSkpLmJ1ZmZlcjtcbiAgICB9XG4gICAgc3RhdGljIGRlY3J5cHRPQUVQKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXk6IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gLFxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfT0FFUF9QQURESU5HLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWxnb3JpdGhtLmxhYmVsKSA7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjcnlwdG8ucHJpdmF0ZURlY3J5cHQob3B0aW9ucywgZGF0YSkpLmJ1ZmZlcjtcbiAgICB9XG59XG5Sc2FDcnlwdG8ucHVibGljS2V5VXNhZ2VzID0gW1widmVyaWZ5XCIsIFwiZW5jcnlwdFwiLCBcIndyYXBLZXlcIl07XG5Sc2FDcnlwdG8ucHJpdmF0ZUtleVVzYWdlcyA9IFtcInNpZ25cIiwgXCJkZWNyeXB0XCIsIFwidW53cmFwS2V5XCJdO1xuXG5jbGFzcyBSc2FTc2FQcm92aWRlciBleHRlbmRzIGNvcmUuUnNhU3NhUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1xuICAgICAgICAgICAgXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiLFxuICAgICAgICAgICAgXCJzaGFrZTEyOFwiLCBcInNoYWtlMjU2XCIsXG4gICAgICAgICAgICBcIlNIQTMtMjU2XCIsIFwiU0hBMy0zODRcIiwgXCJTSEEzLTUxMlwiXG4gICAgICAgIF07XG4gICAgfVxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBSc2FDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by5zaWduKGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLnZlcmlmeShhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBSc2FDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVByaXZhdGVLZXkgfHwgaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQdWJsaWNLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUnNhUHNzUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlJzYVBzc1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcbiAgICAgICAgICAgIFwiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIixcbiAgICAgICAgICAgIFwic2hha2UxMjhcIiwgXCJzaGFrZTI1NlwiLFxuICAgICAgICAgICAgXCJTSEEzLTI1NlwiLCBcIlNIQTMtMzg0XCIsIFwiU0hBMy01MTJcIlxuICAgICAgICBdO1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uc2lnbihhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IFJTQSBDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFNoYUNyeXB0byB7XG4gICAgc3RhdGljIHNpemUoYWxnb3JpdGhtKSB7XG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE2MDtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0yNTZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjU2O1xuICAgICAgICAgICAgY2FzZSBcIlNIQS0zODRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAzODQ7XG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxuICAgICAgICAgICAgY2FzZSBcIlNIQTMtNTEyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDUxMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldEFsZ29yaXRobU5hbWUoYWxnb3JpdGhtKSB7XG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMVwiO1xuICAgICAgICAgICAgY2FzZSBcIlNIQS0yNTZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEyNTZcIjtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMzg0XCI7XG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTUxMlwiO1xuICAgICAgICAgICAgY2FzZSBcIlNIQTMtMjU2XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMy0yNTZcIjtcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTMtMzg0XCI7XG4gICAgICAgICAgICBjYXNlIFwiU0hBMy01MTJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEzLTUxMlwiO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbmFtZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xuICAgICAgICBjb25zdCBoYXNoQWxnID0gdGhpcy5nZXRBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChoYXNoQWxnKVxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIkMS5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhhc2gpLmJ1ZmZlcjtcbiAgICB9XG59XG5cbmNsYXNzIFJzYU9hZXBQcm92aWRlciBleHRlbmRzIGNvcmUuUnNhT2FlcFByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGtleVNpemUgPSBNYXRoLmNlaWwoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPj4gMyk7XG4gICAgICAgIGNvbnN0IGhhc2hTaXplID0gU2hhQ3J5cHRvLnNpemUoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gpID4+IDM7XG4gICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhVmlldy5ieXRlTGVuZ3RoO1xuICAgICAgICBjb25zdCBwc0xlbmd0aCA9IGtleVNpemUgLSBkYXRhTGVuZ3RoIC0gMiAqIGhhc2hTaXplIC0gMjtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggPiBrZXlTaXplIC0gMiAqIGhhc2hTaXplIC0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YSB0b28gbGFyZ2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KGtleVNpemUpO1xuICAgICAgICBjb25zdCBzZWVkID0gbWVzc2FnZS5zdWJhcnJheSgxLCBoYXNoU2l6ZSArIDEpO1xuICAgICAgICBjb25zdCBkYXRhQmxvY2sgPSBtZXNzYWdlLnN1YmFycmF5KGhhc2hTaXplICsgMSk7XG4gICAgICAgIGRhdGFCbG9jay5zZXQoZGF0YVZpZXcsIGhhc2hTaXplICsgcHNMZW5ndGggKyAxKTtcbiAgICAgICAgY29uc3QgbGFiZWxIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKSlcbiAgICAgICAgICAgIC51cGRhdGUoY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGFsZ29yaXRobS5sYWJlbCB8fCBuZXcgVWludDhBcnJheSgwKSkpXG4gICAgICAgICAgICAuZGlnZXN0KCk7XG4gICAgICAgIGRhdGFCbG9jay5zZXQobGFiZWxIYXNoLCAwKTtcbiAgICAgICAgZGF0YUJsb2NrW2hhc2hTaXplICsgcHNMZW5ndGhdID0gMTtcbiAgICAgICAgY3J5cHRvLnJhbmRvbUZpbGxTeW5jKHNlZWQpO1xuICAgICAgICBjb25zdCBkYXRhQmxvY2tNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBzZWVkLCBkYXRhQmxvY2subGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQmxvY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFCbG9ja1tpXSBePSBkYXRhQmxvY2tNYXNrW2ldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlZWRNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBkYXRhQmxvY2ssIHNlZWQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWVkW2ldIF49IHNlZWRNYXNrW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJuYWxLZXkucGVtKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEtleS5wZW0gPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4ke2ludGVybmFsS2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwa2NzMCA9IGNyeXB0by5wdWJsaWNFbmNyeXB0KHtcbiAgICAgICAgICAgIGtleTogaW50ZXJuYWxLZXkucGVtLFxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfTk9fUEFERElORyxcbiAgICAgICAgfSwgQnVmZmVyJDEuZnJvbShtZXNzYWdlKSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShwa2NzMCkuYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgY29uc3Qga2V5U2l6ZSA9IE1hdGguY2VpbChpbnRlcm5hbEtleS5hbGdvcml0aG0ubW9kdWx1c0xlbmd0aCA+PiAzKTtcbiAgICAgICAgY29uc3QgaGFzaFNpemUgPSBTaGFDcnlwdG8uc2l6ZShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCkgPj4gMztcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggIT09IGtleVNpemUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJuYWxLZXkucGVtKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEtleS5wZW0gPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtpbnRlcm5hbEtleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwa2NzMCA9IGNyeXB0by5wcml2YXRlRGVjcnlwdCh7XG4gICAgICAgICAgICBrZXk6IGludGVybmFsS2V5LnBlbSxcbiAgICAgICAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX05PX1BBRERJTkcsXG4gICAgICAgIH0sIEJ1ZmZlciQxLmZyb20oZGF0YSkpO1xuICAgICAgICBjb25zdCB6ID0gcGtjczBbMF07XG4gICAgICAgIGNvbnN0IHNlZWQgPSBwa2NzMC5zdWJhcnJheSgxLCBoYXNoU2l6ZSArIDEpO1xuICAgICAgICBjb25zdCBkYXRhQmxvY2sgPSBwa2NzMC5zdWJhcnJheShoYXNoU2l6ZSArIDEpO1xuICAgICAgICBpZiAoeiAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcnlwdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VlZE1hc2sgPSB0aGlzLm1nZjEoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gsIGRhdGFCbG9jaywgc2VlZC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlZWRbaV0gXj0gc2VlZE1hc2tbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YUJsb2NrTWFzayA9IHRoaXMubWdmMShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCwgc2VlZCwgZGF0YUJsb2NrLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUJsb2NrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkYXRhQmxvY2tbaV0gXj0gZGF0YUJsb2NrTWFza1tpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYWJlbEhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaC5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpKVxuICAgICAgICAgICAgLnVwZGF0ZShjb3JlLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYWxnb3JpdGhtLmxhYmVsIHx8IG5ldyBVaW50OEFycmF5KDApKSlcbiAgICAgICAgICAgIC5kaWdlc3QoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYXNoU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGFiZWxIYXNoW2ldICE9PSBkYXRhQmxvY2tbaV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyeXB0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcHNFbmQgPSBoYXNoU2l6ZTtcbiAgICAgICAgZm9yICg7IHBzRW5kIDwgZGF0YUJsb2NrLmxlbmd0aDsgcHNFbmQrKykge1xuICAgICAgICAgICAgY29uc3QgcHN6ID0gZGF0YUJsb2NrW3BzRW5kXTtcbiAgICAgICAgICAgIGlmIChwc3ogPT09IDEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwc3ogIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyeXB0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHNFbmQgPT09IGRhdGFCbG9jay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlY3J5cHRpb24gZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHBrY3MwID0gZGF0YUJsb2NrLnN1YmFycmF5KHBzRW5kICsgMSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShwa2NzMCkuYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IFJTQSBDcnlwdG9LZXlcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWdmMShhbGdvcml0aG0sIHNlZWQsIGxlbmd0aCA9IDApIHtcbiAgICAgICAgY29uc3QgaGFzaFNpemUgPSBTaGFDcnlwdG8uc2l6ZShhbGdvcml0aG0pID4+IDM7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIGNvbnN0IGNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBoYXNoU2l6ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzOyBpKyspIHtcbiAgICAgICAgICAgIGNvdW50ZXJbMF0gPSBpID4+PiAyNDtcbiAgICAgICAgICAgIGNvdW50ZXJbMV0gPSAoaSA+Pj4gMTYpICYgMjU1O1xuICAgICAgICAgICAgY291bnRlclsyXSA9IChpID4+PiA4KSAmIDI1NTtcbiAgICAgICAgICAgIGNvdW50ZXJbM10gPSBpICYgMjU1O1xuICAgICAgICAgICAgY29uc3Qgc3VibWFzayA9IG1hc2suc3ViYXJyYXkoaSAqIGhhc2hTaXplKTtcbiAgICAgICAgICAgIGxldCBjaHVuayA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobS5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpKVxuICAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcbiAgICAgICAgICAgICAgICAudXBkYXRlKGNvdW50ZXIpXG4gICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xuICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IHN1Ym1hc2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5zdWJhcnJheSgwLCBzdWJtYXNrLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJtYXNrLnNldChjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hc2s7XG4gICAgfVxufVxuXG5jbGFzcyBSc2FFc1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUlNBRVMtUEtDUzEtdjFfNVwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1wiZW5jcnlwdFwiLCBcIndyYXBLZXlcIl0sXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBbXCJkZWNyeXB0XCIsIFwidW53cmFwS2V5XCJdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcInB1YmxpY0V4cG9uZW50XCIpO1xuICAgICAgICBpZiAoIShhbGdvcml0aG0ucHVibGljRXhwb25lbnQgJiYgYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwdWJsaWNFeHBvbmVudDogTWlzc2luZyBvciBub3QgYSBVaW50OEFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1YmxpY0V4cG9uZW50ID0gQ29udmVydC5Ub0Jhc2U2NChhbGdvcml0aG0ucHVibGljRXhwb25lbnQpO1xuICAgICAgICBpZiAoIShwdWJsaWNFeHBvbmVudCA9PT0gXCJBdz09XCIgfHwgcHVibGljRXhwb25lbnQgPT09IFwiQVFBQlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInB1YmxpY0V4cG9uZW50OiBNdXN0IGJlIFszXSBvciBbMSwwLDFdXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJtb2R1bHVzTGVuZ3RoXCIpO1xuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDEwMjQ6XG4gICAgICAgICAgICBjYXNlIDIwNDg6XG4gICAgICAgICAgICBjYXNlIDQwOTY6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtb2R1bHVzTGVuZ3RoOiBNdXN0IGJlIDEwMjQsIDIwNDgsIG9yIDQwOTZcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnRvQ3J5cHRvT3B0aW9ucyhrZXkpO1xuICAgICAgICBjb25zdCBlbmMgPSBjcnlwdG8ucHVibGljRW5jcnlwdChvcHRpb25zLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcbiAgICB9XG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnRvQ3J5cHRvT3B0aW9ucyhrZXkpO1xuICAgICAgICBjb25zdCBkZWMgPSBjcnlwdG8ucHJpdmF0ZURlY3J5cHQob3B0aW9ucywgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XG4gICAgfVxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBSc2FDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVByaXZhdGVLZXkgfHwgaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQdWJsaWNLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0NyeXB0b09wdGlvbnMoa2V5KSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBrZXkudHlwZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBgLS0tLS1CRUdJTiAke3R5cGV9IEtFWS0tLS0tXFxuJHtnZXRDcnlwdG9LZXkoa2V5KS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EICR7dHlwZX0gS0VZLS0tLS1gLFxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUEFERElORyxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IG5hbWVkT0lEcyA9IHtcbiAgICBcIjEuMi44NDAuMTAwNDUuMy4xLjdcIjogXCJQLTI1NlwiLFxuICAgIFwiUC0yNTZcIjogXCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsXG4gICAgXCIxLjMuMTMyLjAuMzRcIjogXCJQLTM4NFwiLFxuICAgIFwiUC0zODRcIjogXCIxLjMuMTMyLjAuMzRcIixcbiAgICBcIjEuMy4xMzIuMC4zNVwiOiBcIlAtNTIxXCIsXG4gICAgXCJQLTUyMVwiOiBcIjEuMy4xMzIuMC4zNVwiLFxuICAgIFwiMS4zLjEzMi4wLjEwXCI6IFwiSy0yNTZcIixcbiAgICBcIkstMjU2XCI6IFwiMS4zLjEzMi4wLjEwXCIsXG4gICAgXCJicmFpbnBvb2xQMTYwcjFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMVwiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjFcIjogXCJicmFpbnBvb2xQMTYwcjFcIixcbiAgICBcImJyYWlucG9vbFAxNjB0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4yXCIsXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMlwiOiBcImJyYWlucG9vbFAxNjB0MVwiLFxuICAgIFwiYnJhaW5wb29sUDE5MnIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjNcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4zXCI6IFwiYnJhaW5wb29sUDE5MnIxXCIsXG4gICAgXCJicmFpbnBvb2xQMTkydDFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuNFwiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjRcIjogXCJicmFpbnBvb2xQMTkydDFcIixcbiAgICBcImJyYWlucG9vbFAyMjRyMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS41XCIsXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuNVwiOiBcImJyYWlucG9vbFAyMjRyMVwiLFxuICAgIFwiYnJhaW5wb29sUDIyNHQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjZcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS42XCI6IFwiYnJhaW5wb29sUDIyNHQxXCIsXG4gICAgXCJicmFpbnBvb2xQMjU2cjFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuN1wiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjdcIjogXCJicmFpbnBvb2xQMjU2cjFcIixcbiAgICBcImJyYWlucG9vbFAyNTZ0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS44XCIsXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuOFwiOiBcImJyYWlucG9vbFAyNTZ0MVwiLFxuICAgIFwiYnJhaW5wb29sUDMyMHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjlcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS45XCI6IFwiYnJhaW5wb29sUDMyMHIxXCIsXG4gICAgXCJicmFpbnBvb2xQMzIwdDFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTBcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMFwiOiBcImJyYWlucG9vbFAzMjB0MVwiLFxuICAgIFwiYnJhaW5wb29sUDM4NHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjExXCIsXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTFcIjogXCJicmFpbnBvb2xQMzg0cjFcIixcbiAgICBcImJyYWlucG9vbFAzODR0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMlwiLFxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjEyXCI6IFwiYnJhaW5wb29sUDM4NHQxXCIsXG4gICAgXCJicmFpbnBvb2xQNTEycjFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTNcIixcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xM1wiOiBcImJyYWlucG9vbFA1MTJyMVwiLFxuICAgIFwiYnJhaW5wb29sUDUxMnQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjE0XCIsXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTRcIjogXCJicmFpbnBvb2xQNTEydDFcIixcbn07XG5mdW5jdGlvbiBnZXRPaWRCeU5hbWVkQ3VydmUkMShuYW1lZEN1cnZlKSB7XG4gICAgY29uc3Qgb2lkID0gbmFtZWRPSURzW25hbWVkQ3VydmVdO1xuICAgIGlmICghb2lkKSB7XG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgY29udmVydCBXZWJDcnlwdG8gbmFtZWQgY3VydmUgJyR7bmFtZWRDdXJ2ZX0nIHRvIE9JRGApO1xuICAgIH1cbiAgICByZXR1cm4gb2lkO1xufVxuXG5jbGFzcyBFY1ByaXZhdGVLZXkgZXh0ZW5kcyBBc3ltbWV0cmljS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gXCJwcml2YXRlXCI7XG4gICAgfVxuICAgIGdldEtleSgpIHtcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XG4gICAgICAgIHJldHVybiBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuRWNQcml2YXRlS2V5KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAga3R5OiBcIkVDXCIsXG4gICAgICAgICAgICBjcnY6IHRoaXMuYWxnb3JpdGhtLm5hbWVkQ3VydmUsXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IG5hbWVkIGN1cnZlIGZyb20gSldLLiBQcm9wZXJ0eSAnY3J2JyBpcyByZXF1aXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUobmV3IGNvcmUuYXNuMS5PYmplY3RJZGVudGlmaWVyKGdldE9pZEJ5TmFtZWRDdXJ2ZSQxKGpzb24uY3J2KSkpO1xuICAgICAgICBjb25zdCBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGpzb24sIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuRWNQcml2YXRlS2V5IH0pO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXkpO1xuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIkMS5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5jbGFzcyBFY1B1YmxpY0tleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInB1YmxpY1wiO1xuICAgIH1cbiAgICBnZXRLZXkoKSB7XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XG4gICAgICAgIHJldHVybiBuZXcgY29yZS5hc24xLkVjUHVibGljS2V5KGtleUluZm8ucHVibGljS2V5KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAga3R5OiBcIkVDXCIsXG4gICAgICAgICAgICBjcnY6IHRoaXMuYWxnb3JpdGhtLm5hbWVkQ3VydmUsXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IG5hbWVkIGN1cnZlIGZyb20gSldLLiBQcm9wZXJ0eSAnY3J2JyBpcyByZXF1aXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oanNvbiwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5FY1B1YmxpY0tleSB9KTtcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIoZ2V0T2lkQnlOYW1lZEN1cnZlJDEoanNvbi5jcnYpKSk7XG4gICAgICAgIGtleUluZm8ucHVibGljS2V5ID0gQXNuU2VyaWFsaXplci50b0FTTihrZXkpLnZhbHVlSGV4O1xuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIkMS5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5jbGFzcyBTaGExUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEtMVwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIFNoYTI1NlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTI1NlwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIFNoYTM4NFByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTM4NFwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIFNoYTUxMlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTUxMlwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIFNoYTMyNTZQcm92aWRlciBleHRlbmRzIGNvcmUuUHJvdmlkZXJDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlNIQTMtMjU2XCI7XG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XG4gICAgfVxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xuICAgIH1cbn1cblxuY2xhc3MgU2hhMzM4NFByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBMy0zODRcIjtcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcbiAgICB9XG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XG4gICAgfVxufVxuXG5jbGFzcyBTaGEzNTEyUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEzLTUxMlwiO1xuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcbiAgICB9XG59XG5cbmNsYXNzIEVjQ3J5cHRvIHtcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBuZXcgRWNQcml2YXRlS2V5KCk7XG4gICAgICAgIHByaXZhdGVLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xuICAgICAgICBwcml2YXRlS2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIHByaXZhdGVLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHJpdmF0ZUtleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgRWNQdWJsaWNLZXkoKTtcbiAgICAgICAgcHVibGljS2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcbiAgICAgICAgcHVibGljS2V5LmV4dHJhY3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgcHVibGljS2V5LnVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnB1YmxpY0tleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBrZXlzID0gY3J5cHRvLmdlbmVyYXRlS2V5UGFpclN5bmMoXCJlY1wiLCB7XG4gICAgICAgICAgICBuYW1lZEN1cnZlOiB0aGlzLmdldE9wZW5TU0xOYW1lZEN1cnZlKGFsZ29yaXRobS5uYW1lZEN1cnZlKSxcbiAgICAgICAgICAgIHB1YmxpY0tleUVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BraVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByaXZhdGVLZXlFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBrY3M4XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcHJpdmF0ZUtleS5kYXRhID0ga2V5cy5wcml2YXRlS2V5O1xuICAgICAgICBwdWJsaWNLZXkuZGF0YSA9IGtleXMucHVibGljS2V5O1xuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICBwcml2YXRlS2V5LFxuICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgc2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSBTaGFDcnlwdG8uZ2V0QWxnb3JpdGhtTmFtZShhbGdvcml0aG0uaGFzaCk7XG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGNyeXB0by5jcmVhdGVTaWduKGNyeXB0b0FsZyk7XG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgIGlmICgha2V5LnBlbSkge1xuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXk6IGtleS5wZW0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZSA9IEFzblBhcnNlci5wYXJzZShzaWduYXR1cmUsIGNvcmUuYXNuMS5FY0RzYVNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVJhdyA9IGNvcmUuRWNVdGlscy5lbmNvZGVTaWduYXR1cmUoZWNTaWduYXR1cmUsIGNvcmUuRWNDdXJ2ZXMuZ2V0KGtleS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSkuc2l6ZSk7XG4gICAgICAgIHJldHVybiBzaWduYXR1cmVSYXcuYnVmZmVyO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgdmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gU2hhQ3J5cHRvLmdldEFsZ29yaXRobU5hbWUoYWxnb3JpdGhtLmhhc2gpO1xuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KGNyeXB0b0FsZyk7XG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyJDEuZnJvbShkYXRhKSk7XG4gICAgICAgIGlmICgha2V5LnBlbSkge1xuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZSA9IG5ldyBjb3JlLmFzbjEuRWNEc2FTaWduYXR1cmUoKTtcbiAgICAgICAgY29uc3QgbmFtZWRDdXJ2ZSA9IGNvcmUuRWNDdXJ2ZXMuZ2V0KGtleS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVBvaW50ID0gY29yZS5FY1V0aWxzLmRlY29kZVNpZ25hdHVyZShzaWduYXR1cmUsIG5hbWVkQ3VydmUuc2l6ZSk7XG4gICAgICAgIGVjU2lnbmF0dXJlLnIgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihzaWduYXR1cmVQb2ludC5yKTtcbiAgICAgICAgZWNTaWduYXR1cmUucyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZVBvaW50LnMpO1xuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZVJhdyA9IEJ1ZmZlciQxLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoZWNTaWduYXR1cmUpKTtcbiAgICAgICAgY29uc3Qgb2sgPSBzaWduZXIudmVyaWZ5KG9wdGlvbnMsIGVjU2lnbmF0dXJlUmF3KTtcbiAgICAgICAgcmV0dXJuIG9rO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSB0aGlzLmdldE9wZW5TU0xOYW1lZEN1cnZlKGJhc2VLZXkuYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xuICAgICAgICBjb25zdCBlY2RoID0gY3J5cHRvLmNyZWF0ZUVDREgoY3J5cHRvQWxnKTtcbiAgICAgICAgY29uc3QgYXNuUHJpdmF0ZUtleSA9IEFzblBhcnNlci5wYXJzZShiYXNlS2V5LmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XG4gICAgICAgIGNvbnN0IGFzbkVjUHJpdmF0ZUtleSA9IEFzblBhcnNlci5wYXJzZShhc25Qcml2YXRlS2V5LnByaXZhdGVLZXksIGNvcmUuYXNuMS5FY1ByaXZhdGVLZXkpO1xuICAgICAgICBlY2RoLnNldFByaXZhdGVLZXkoQnVmZmVyJDEuZnJvbShhc25FY1ByaXZhdGVLZXkucHJpdmF0ZUtleSkpO1xuICAgICAgICBjb25zdCBhc25QdWJsaWNLZXkgPSBBc25QYXJzZXIucGFyc2UoYWxnb3JpdGhtLnB1YmxpYy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBlY2RoLmNvbXB1dGVTZWNyZXQoQnVmZmVyJDEuZnJvbShhc25QdWJsaWNLZXkucHVibGljS2V5KSk7XG4gICAgICAgIGlmIChsZW5ndGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiaXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShiaXRzKS5idWZmZXIuc2xpY2UoMCwgbGVuZ3RoID4+IDMpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwdWJsaWNLZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKGtleS5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHB1YmxpY0tleUluZm8ucHVibGljS2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3JhdycsIHBrY3M4JyBvciAnc3BraSdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiandrXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBqd2sgPSBrZXlEYXRhO1xuICAgICAgICAgICAgICAgIGlmIChqd2suZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuRWNQcml2YXRlS2V5IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5FY1B1YmxpY0tleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBuZXcgY29yZS5hc24xLkVjUHVibGljS2V5KGtleURhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IG5ldyBjb3JlLmFzbjEuRWNQdWJsaWNLZXkoa2V5SW5mby5wdWJsaWNLZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0S2V5UGFyYW1ldGVycyhrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5wYXJhbWV0ZXJzLCBhbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuRWNQcml2YXRlS2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEtleVBhcmFtZXRlcnMoa2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMsIGFsZ29yaXRobS5uYW1lZEN1cnZlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCAncGtjczgnIG9yICdzcGtpJ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXNzZXJ0S2V5UGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBuYW1lZEN1cnZlKSB7XG4gICAgICAgIGlmICghcGFyYW1ldGVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQ3J5cHRvRXJyb3IoXCJLZXkgaW5mbyBkb2Vzbid0IGhhdmUgcmVxdWlyZWQgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmFtZWRDdXJ2ZUlkZW50aWZpZXIgPSBcIlwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmFtZWRDdXJ2ZUlkZW50aWZpZXIgPSBBc25QYXJzZXIucGFyc2UocGFyYW1ldGVycywgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIpLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5DcnlwdG9FcnJvcihcIkNhbm5vdCByZWFkIGtleSBpbmZvIHBhcmFtZXRlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldE9pZEJ5TmFtZWRDdXJ2ZSQxKG5hbWVkQ3VydmUpICE9PSBuYW1lZEN1cnZlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQ3J5cHRvRXJyb3IoXCJLZXkgaW5mbyBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byBuYW1lZCBjdXJ2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbygpO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjEwMDQ1LjIuMVwiO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKG5ldyBjb3JlLmFzbjEuT2JqZWN0SWRlbnRpZmllcihnZXRPaWRCeU5hbWVkQ3VydmUkMShhbGdvcml0aG0ubmFtZWRDdXJ2ZSkpKTtcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoYXNuS2V5KTtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEVjUHJpdmF0ZUtleSgpO1xuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlciQxLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRQdWJsaWNLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XG4gICAgICAgIGNvbnN0IG5hbWVkQ3VydmUgPSBnZXRPaWRCeU5hbWVkQ3VydmUkMShhbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIobmFtZWRDdXJ2ZSkpO1xuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleSA9IGFzbktleS52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEVjUHVibGljS2V5KCk7XG4gICAgICAgIGtleS5kYXRhID0gQnVmZmVyJDEuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgc3RhdGljIGdldE9wZW5TU0xOYW1lZEN1cnZlKGN1cnZlKSB7XG4gICAgICAgIHN3aXRjaCAoY3VydmUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIlAtMjU2XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicHJpbWUyNTZ2MVwiO1xuICAgICAgICAgICAgY2FzZSBcIkstMjU2XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2VjcDI1NmsxXCI7XG4gICAgICAgICAgICBjYXNlIFwiUC0zODRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZWNwMzg0cjFcIjtcbiAgICAgICAgICAgIGNhc2UgXCJQLTUyMVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcInNlY3A1MjFyMVwiO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VydmU7XG4gICAgICAgIH1cbiAgICB9XG59XG5FY0NyeXB0by5wdWJsaWNLZXlVc2FnZXMgPSBbXCJ2ZXJpZnlcIl07XG5FY0NyeXB0by5wcml2YXRlS2V5VXNhZ2VzID0gW1wic2lnblwiLCBcImRlcml2ZUtleVwiLCBcImRlcml2ZUJpdHNcIl07XG5cbmNsYXNzIEVjZHNhUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVjZHNhUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gY29yZS5FY0N1cnZlcy5uYW1lcztcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcbiAgICAgICAgICAgIFwiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIixcbiAgICAgICAgICAgIFwic2hha2UxMjhcIiwgXCJzaGFrZTI1NlwiLFxuICAgICAgICAgICAgXCJTSEEzLTI1NlwiLCBcIlNIQTMtMzg0XCIsIFwiU0hBMy01MTJcIlxuICAgICAgICBdO1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIEVjQ3J5cHRvLnNpZ24oYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBFY0NyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gRWNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFY0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgICAgIGlmICghKGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQdWJsaWNLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgRUMgQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBFY2RoUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVjZGhQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZWRDdXJ2ZXMgPSBjb3JlLkVjQ3VydmVzLm5hbWVzO1xuICAgIH1cbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gRWNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFY0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgICAgIGlmICghKGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQdWJsaWNLZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgRUMgQ3J5cHRvS2V5XCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xuICAgICAgICBjb25zdCBiaXRzID0gYXdhaXQgRWNDcnlwdG8uZGVyaXZlQml0cyh7IC4uLmFsZ29yaXRobSwgcHVibGljOiBnZXRDcnlwdG9LZXkoYWxnb3JpdGhtLnB1YmxpYykgfSwgZ2V0Q3J5cHRvS2V5KGJhc2VLZXkpLCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gYml0cztcbiAgICB9XG59XG5cbmNvbnN0IGVkT0lEcyA9IHtcbiAgICBbY29yZS5hc24xLmlkRWQ0NDhdOiBcIkVkNDQ4XCIsXG4gICAgXCJlZDQ0OFwiOiBjb3JlLmFzbjEuaWRFZDQ0OCxcbiAgICBbY29yZS5hc24xLmlkWDQ0OF06IFwiWDQ0OFwiLFxuICAgIFwieDQ0OFwiOiBjb3JlLmFzbjEuaWRYNDQ4LFxuICAgIFtjb3JlLmFzbjEuaWRFZDI1NTE5XTogXCJFZDI1NTE5XCIsXG4gICAgXCJlZDI1NTE5XCI6IGNvcmUuYXNuMS5pZEVkMjU1MTksXG4gICAgW2NvcmUuYXNuMS5pZFgyNTUxOV06IFwiWDI1NTE5XCIsXG4gICAgXCJ4MjU1MTlcIjogY29yZS5hc24xLmlkWDI1NTE5LFxufTtcbmZ1bmN0aW9uIGdldE9pZEJ5TmFtZWRDdXJ2ZShuYW1lZEN1cnZlKSB7XG4gICAgY29uc3Qgb2lkID0gZWRPSURzW25hbWVkQ3VydmUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFvaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBjb252ZXJ0IFdlYkNyeXB0byBuYW1lZCBjdXJ2ZSAnJHtuYW1lZEN1cnZlfScgdG8gT0lEYCk7XG4gICAgfVxuICAgIHJldHVybiBvaWQ7XG59XG5cbmNsYXNzIEVkUHJpdmF0ZUtleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInByaXZhdGVcIjtcbiAgICB9XG4gICAgZ2V0S2V5KCkge1xuICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKHRoaXMuZGF0YSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5DdXJ2ZVByaXZhdGVLZXkpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7XG4gICAgICAgICAgICBrdHk6IFwiT0tQXCIsXG4gICAgICAgICAgICBjcnY6IHRoaXMuYWxnb3JpdGhtLm5hbWVkQ3VydmUsXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xuICAgIH1cbiAgICBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IG5hbWVkIGN1cnZlIGZyb20gSldLLiBQcm9wZXJ0eSAnY3J2JyBpcyByZXF1aXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBnZXRPaWRCeU5hbWVkQ3VydmUoanNvbi5jcnYpO1xuICAgICAgICBjb25zdCBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGpzb24sIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuQ3VydmVQcml2YXRlS2V5IH0pO1xuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXkpO1xuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIkMS5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5jbGFzcyBFZFB1YmxpY0tleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInB1YmxpY1wiO1xuICAgIH1cbiAgICBnZXRLZXkoKSB7XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XG4gICAgICAgIHJldHVybiBrZXlJbmZvLnB1YmxpY0tleTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAga3R5OiBcIk9LUFwiLFxuICAgICAgICAgICAgY3J2OiB0aGlzLmFsZ29yaXRobS5uYW1lZEN1cnZlLFxuICAgICAgICAgICAga2V5X29wczogdGhpcy51c2FnZXMsXG4gICAgICAgICAgICBleHQ6IHRoaXMuZXh0cmFjdGFibGUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGpzb24sIHtcbiAgICAgICAgICAgIHg6IENvbnZlcnQuVG9CYXNlNjRVcmwoa2V5KVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIWpzb24uY3J2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihgQ2Fubm90IGdldCBuYW1lZCBjdXJ2ZSBmcm9tIEpXSy4gUHJvcGVydHkgJ2NydicgaXMgcmVxdWlyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWpzb24ueCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgcHJvcGVydHkgZnJvbSBKV0suIFByb3BlcnR5ICd4JyBpcyByZXF1aXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlB1YmxpY0tleUluZm8oKTtcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gZ2V0T2lkQnlOYW1lZEN1cnZlKGpzb24uY3J2KTtcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXkgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi54KTtcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyJDEuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuY2xhc3MgRWRDcnlwdG8ge1xuICAgIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IG5ldyBFZFByaXZhdGVLZXkoKTtcbiAgICAgICAgcHJpdmF0ZUtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XG4gICAgICAgIHByaXZhdGVLZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAgcHJpdmF0ZUtleS51c2FnZXMgPSBrZXlVc2FnZXMuZmlsdGVyKCh1c2FnZSkgPT4gdGhpcy5wcml2YXRlS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBFZFB1YmxpY0tleSgpO1xuICAgICAgICBwdWJsaWNLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xuICAgICAgICBwdWJsaWNLZXkuZXh0cmFjdGFibGUgPSB0cnVlO1xuICAgICAgICBwdWJsaWNLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBhbGdvcml0aG0ubmFtZWRDdXJ2ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBrZXlzID0gY3J5cHRvLmdlbmVyYXRlS2V5UGFpclN5bmModHlwZSwge1xuICAgICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJpdmF0ZUtleUVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBwcml2YXRlS2V5LmRhdGEgPSBrZXlzLnByaXZhdGVLZXk7XG4gICAgICAgIHB1YmxpY0tleS5kYXRhID0ga2V5cy5wdWJsaWNLZXk7XG4gICAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgICAgIHByaXZhdGVLZXksXG4gICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBzaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIGlmICgha2V5LnBlbSkge1xuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXk6IGtleS5wZW0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0by5zaWduKG51bGwsIEJ1ZmZlciQxLmZyb20oZGF0YSksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihzaWduYXR1cmUpO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgdmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcbiAgICAgICAgaWYgKCFrZXkucGVtKSB7XG4gICAgICAgICAgICBrZXkucGVtID0gYC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXk6IGtleS5wZW0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9rID0gY3J5cHRvLnZlcmlmeShudWxsLCBCdWZmZXIkMS5mcm9tKGRhdGEpLCBvcHRpb25zLCBCdWZmZXIkMS5mcm9tKHNpZ25hdHVyZSkpO1xuICAgICAgICByZXR1cm4gb2s7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBkZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGNyeXB0by5jcmVhdGVQdWJsaWNLZXkoe1xuICAgICAgICAgICAga2V5OiBhbGdvcml0aG0ucHVibGljLmRhdGEsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGVyXCIsXG4gICAgICAgICAgICB0eXBlOiBcInNwa2lcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBjcnlwdG8uY3JlYXRlUHJpdmF0ZUtleSh7XG4gICAgICAgICAgICBrZXk6IGJhc2VLZXkuZGF0YSxcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcbiAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBjcnlwdG8uZGlmZmllSGVsbG1hbih7XG4gICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgICBwcml2YXRlS2V5LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJpdHMpLmJ1ZmZlci5zbGljZSgwLCBsZW5ndGggPj4gMyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBleHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KTtcbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOlxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoa2V5LmRhdGEpLmJ1ZmZlcjtcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleUluZm8gPSBBc25QYXJzZXIucGFyc2Uoa2V5LmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHVibGljS2V5SW5mby5wdWJsaWNLZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncmF3JywgcGtjczgnIG9yICdzcGtpJ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGp3ayA9IGtleURhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGp3ay5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5DdXJ2ZVByaXZhdGVLZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqd2sueCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IENhbm5vdCBnZXQgcmVxdWlyZWQgJ3gnIGZpbGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShDb252ZXJ0LkZyb21CYXNlNjRVcmwoandrLngpLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQdWJsaWNLZXkoa2V5SW5mby5wdWJsaWNLZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLkN1cnZlUHJpdmF0ZUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncmF3JywgJ3BrY3M4JyBvciAnc3BraSdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEVkUHJpdmF0ZUtleSgpO1xuICAgICAgICBrZXkuZnJvbUpTT04oe1xuICAgICAgICAgICAgY3J2OiBhbGdvcml0aG0ubmFtZWRDdXJ2ZSxcbiAgICAgICAgICAgIGQ6IENvbnZlcnQuVG9CYXNlNjRVcmwoYXNuS2V5LmQpLFxuICAgICAgICB9KTtcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBFZFB1YmxpY0tleSgpO1xuICAgICAgICBrZXkuZnJvbUpTT04oe1xuICAgICAgICAgICAgY3J2OiBhbGdvcml0aG0ubmFtZWRDdXJ2ZSxcbiAgICAgICAgICAgIHg6IENvbnZlcnQuVG9CYXNlNjRVcmwoYXNuS2V5KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG59XG5FZENyeXB0by5wdWJsaWNLZXlVc2FnZXMgPSBbXCJ2ZXJpZnlcIl07XG5FZENyeXB0by5wcml2YXRlS2V5VXNhZ2VzID0gW1wic2lnblwiLCBcImRlcml2ZUtleVwiLCBcImRlcml2ZUJpdHNcIl07XG5cbmNsYXNzIEVkRHNhUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVkRHNhUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBFZENyeXB0by5nZW5lcmF0ZUtleSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBuYW1lZEN1cnZlOiBhbGdvcml0aG0ubmFtZWRDdXJ2ZS5yZXBsYWNlKC9eZWQvaSwgXCJFZFwiKSxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBFZENyeXB0by5zaWduKGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gRWRDcnlwdG8udmVyaWZ5KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIEVkQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRWRDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgIH1cbn1cblxuY2xhc3MgRWNkaEVzUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVjZGhFc1Byb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWRDcnlwdG8uZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbmFtZWRDdXJ2ZTogYWxnb3JpdGhtLm5hbWVkQ3VydmUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGJpdHMgPSBhd2FpdCBFZENyeXB0by5kZXJpdmVCaXRzKHsgLi4uYWxnb3JpdGhtLCBwdWJsaWM6IGdldENyeXB0b0tleShhbGdvcml0aG0ucHVibGljKSB9LCBnZXRDcnlwdG9LZXkoYmFzZUtleSksIGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBiaXRzO1xuICAgIH1cbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICByZXR1cm4gRWRDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFZENyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxufVxuXG5jbGFzcyBFZDI1NTE5Q3J5cHRvS2V5IGV4dGVuZHMgQ3J5cHRvS2V5IHtcbiAgICBjb25zdHJ1Y3RvcihhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCB1c2FnZXMsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07XG4gICAgICAgIHRoaXMuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAgdGhpcy51c2FnZXMgPSB1c2FnZXM7XG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgIH1cbiAgICB0b0pXSygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGt0eTogXCJPS1BcIixcbiAgICAgICAgICAgIGNydjogdGhpcy5hbGdvcml0aG0ubmFtZSxcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuY2xhc3MgRWQyNTUxOVByaXZhdGVLZXkgZXh0ZW5kcyBFZDI1NTE5Q3J5cHRvS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gXCJwcml2YXRlXCI7XG4gICAgfVxuICAgIHRvSldLKCkge1xuICAgICAgICBjb25zdCBwdWJKd2sgPSBjcnlwdG8uY3JlYXRlUHVibGljS2V5KHtcbiAgICAgICAgICAgIGtleTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgZm9ybWF0OiBcInBlbVwiLFxuICAgICAgICB9KS5leHBvcnQoeyBmb3JtYXQ6IFwiandrXCIgfSk7XG4gICAgICAgIGNvbnN0IHJhdyA9IGNvcmUuUGVtQ29udmVydGVyLnRvVWludDhBcnJheSh0aGlzLmRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHBrY3M4ID0gQXNuQ29udmVydC5wYXJzZShyYXcsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XG4gICAgICAgIGNvbnN0IGQgPSBBc25Db252ZXJ0LnBhcnNlKHBrY3M4LnByaXZhdGVLZXksIGNvcmUuYXNuMS5FZFByaXZhdGVLZXkpLnZhbHVlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudG9KV0soKSxcbiAgICAgICAgICAgIC4uLnB1Ykp3ayxcbiAgICAgICAgICAgIGQ6IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KGQpKS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNsYXNzIEVkMjU1MTlQdWJsaWNLZXkgZXh0ZW5kcyBFZDI1NTE5Q3J5cHRvS2V5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gXCJwdWJsaWNcIjtcbiAgICB9XG4gICAgdG9KV0soKSB7XG4gICAgICAgIGNvbnN0IGp3ayA9IGNyeXB0by5jcmVhdGVQdWJsaWNLZXkoe1xuICAgICAgICAgICAga2V5OiB0aGlzLmRhdGEsXG4gICAgICAgICAgICBmb3JtYXQ6IFwicGVtXCIsXG4gICAgICAgIH0pLmV4cG9ydCh7IGZvcm1hdDogXCJqd2tcIiB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSldLKCksXG4gICAgICAgICAgICAuLi5qd2ssXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5jbGFzcyBFZDI1NTE5Q3J5cHRvIHtcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBrZXlzID0gY3J5cHRvLmdlbmVyYXRlS2V5UGFpclN5bmModHlwZSwge1xuICAgICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwicGVtXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJpdmF0ZUtleUVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcInBlbVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBrZXlBbGcgPSB7XG4gICAgICAgICAgICBuYW1lOiB0eXBlID09PSBcImVkMjU1MTlcIiA/IFwiRWQyNTUxOVwiIDogXCJYMjU1MTlcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleVVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnByaXZhdGVLZXlVc2FnZXMuaW5jbHVkZXModXNhZ2UpKTtcbiAgICAgICAgY29uc3QgcHVibGljS2V5VXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluY2x1ZGVzKHVzYWdlKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBuZXcgRWQyNTUxOVByaXZhdGVLZXkoa2V5QWxnLCBleHRyYWN0YWJsZSwgcHJpdmF0ZUtleVVzYWdlcywga2V5cy5wcml2YXRlS2V5KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogbmV3IEVkMjU1MTlQdWJsaWNLZXkoa2V5QWxnLCB0cnVlLCBwdWJsaWNLZXlVc2FnZXMsIGtleXMucHVibGljS2V5KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvLnNpZ24obnVsbCwgQnVmZmVyLmZyb20oZGF0YSksIGtleS5kYXRhKTtcbiAgICAgICAgcmV0dXJuIGNvcmUuQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoc2lnbmF0dXJlKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8udmVyaWZ5KG51bGwsIEJ1ZmZlci5mcm9tKGRhdGEpLCBrZXkuZGF0YSwgc2lnbmF0dXJlKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xuICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkudG9KV0soKTtcbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcmUuUGVtQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoa2V5LmRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcmUuUGVtQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoa2V5LmRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBqd2sgPSBrZXkudG9KV0soKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGp3ay54KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncmF3JywgcGtjczgnIG9yICdzcGtpJ1wiKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgY2FzZSBcImp3a1wiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgandrID0ga2V5RGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoandrLmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpdmF0ZURhdGEgPSBuZXcgY29yZS5hc24xLkVkUHJpdmF0ZUtleSgpO1xuICAgICAgICAgICAgICAgICAgICBwcml2YXRlRGF0YS52YWx1ZSA9IGNvcmUuQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoQnVmZmVyLmZyb20oandrLmQsIFwiYmFzZTY0dXJsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtjczggPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgIHBrY3M4LnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gYWxnb3JpdGhtLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJlZDI1NTE5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29yZS5hc24xLmlkRWQyNTUxOVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb3JlLmFzbjEuaWRYMjU1MTk7XG4gICAgICAgICAgICAgICAgICAgIHBrY3M4LnByaXZhdGVLZXkgPSBBc25Db252ZXJ0LnNlcmlhbGl6ZShwcml2YXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IEFzbkNvbnZlcnQuc2VyaWFsaXplKHBrY3M4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVtID0gY29yZS5QZW1Db252ZXJ0ZXIuZnJvbUJ1ZmZlclNvdXJjZShyYXcsIFwiUFJJVkFURSBLRVlcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWQyNTUxOVByaXZhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCBwZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChqd2sueCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJLZXkgPSBjcnlwdG8uY3JlYXRlUHVibGljS2V5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJqd2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogandrLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVtID0gcHViS2V5LmV4cG9ydCh7IGZvcm1hdDogXCJwZW1cIiwgdHlwZTogXCJzcGtpXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWQyNTUxOVB1YmxpY0tleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIHBlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImtleURhdGE6IENhbm5vdCBpbXBvcnQgSldLLiAnZCcgb3IgJ3gnIG11c3QgYmUgcHJlc2VudGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVtID0gY29yZS5QZW1Db252ZXJ0ZXIuZnJvbUJ1ZmZlclNvdXJjZShrZXlEYXRhLCBcIlBSSVZBVEUgS0VZXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWQyNTUxOVByaXZhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCBwZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlbSA9IGNvcmUuUGVtQ29udmVydGVyLmZyb21CdWZmZXJTb3VyY2Uoa2V5RGF0YSwgXCJQVUJMSUMgS0VZXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWQyNTUxOVB1YmxpY0tleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIHBlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXcgPSBrZXlEYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGNyeXB0by5jcmVhdGVQdWJsaWNLZXkoe1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiandrXCIsXG4gICAgICAgICAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICAgICAgICAgICAga3R5OiBcIk9LUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3J2OiBhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImVkMjU1MTlcIiA/IFwiRWQyNTUxOVwiIDogXCJYMjU1MTlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IENvbnZlcnQuVG9CYXNlNjRVcmwocmF3KSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZW0gPSBrZXkuZXhwb3J0KHsgZm9ybWF0OiBcInBlbVwiLCB0eXBlOiBcInNwa2lcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVkMjU1MTlQdWJsaWNLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCBwZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCBwa2NzOCcgb3IgJ3Nwa2knXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkVkMjU1MTlDcnlwdG8ucHJpdmF0ZUtleVVzYWdlcyA9IFtcInNpZ25cIiwgXCJkZXJpdmVCaXRzXCIsIFwiZGVyaXZlS2V5XCJdO1xuRWQyNTUxOUNyeXB0by5wdWJsaWNLZXlVc2FnZXMgPSBbXCJ2ZXJpZnlcIl07XG5cbmNsYXNzIEVkMjU1MTlQcm92aWRlciBleHRlbmRzIGNvcmUuRWQyNTUxOVByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWQyNTUxOUNyeXB0by5nZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBFZDI1NTE5Q3J5cHRvLnNpZ24oYWxnb3JpdGhtLCBpbnRlcm5hbEtleSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgICAgICByZXR1cm4gc2lnbmF0dXJlO1xuICAgIH1cbiAgICBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgICAgIHJldHVybiBFZDI1NTE5Q3J5cHRvLnZlcmlmeShhbGdvcml0aG0sIGludGVybmFsS2V5LCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgICAgIHJldHVybiBFZDI1NTE5Q3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGludGVybmFsS2V5KTtcbiAgICB9XG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBhd2FpdCBFZDI1NTE5Q3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoaW50ZXJuYWxLZXkpO1xuICAgIH1cbn1cblxuY2xhc3MgWDI1NTE5UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlgyNTUxOVByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWQyNTUxOUNyeXB0by5nZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xuICAgICAgICBjb25zdCBpbnRlcm5hbEJhc2VLZXkgPSBnZXRDcnlwdG9LZXkoYmFzZUtleSk7XG4gICAgICAgIGNvbnN0IGludGVybmFsUHVibGljS2V5ID0gZ2V0Q3J5cHRvS2V5KGFsZ29yaXRobS5wdWJsaWMpO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBjcnlwdG8uY3JlYXRlUHVibGljS2V5KHtcbiAgICAgICAgICAgIGtleTogaW50ZXJuYWxQdWJsaWNLZXkuZGF0YS50b1N0cmluZygpLFxuICAgICAgICAgICAgZm9ybWF0OiBcInBlbVwiLFxuICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gY3J5cHRvLmNyZWF0ZVByaXZhdGVLZXkoe1xuICAgICAgICAgICAga2V5OiBpbnRlcm5hbEJhc2VLZXkuZGF0YS50b1N0cmluZygpLFxuICAgICAgICAgICAgZm9ybWF0OiBcInBlbVwiLFxuICAgICAgICAgICAgdHlwZTogXCJwa2NzOFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYml0cyA9IGNyeXB0by5kaWZmaWVIZWxsbWFuKHtcbiAgICAgICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgICAgIHByaXZhdGVLZXksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYml0cykuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCA+PiAzKTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcbiAgICAgICAgcmV0dXJuIEVkMjU1MTlDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgaW50ZXJuYWxLZXkpO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFZDI1NTE5Q3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBFZDI1NTE5Q3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgRWQyNTUxOUNyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGJrZGZDcnlwdG9LZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xufVxuXG5jbGFzcyBQYmtkZjJQcm92aWRlciBleHRlbmRzIGNvcmUuUGJrZGYyUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2FsdCA9IGNvcmUuQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoYWxnb3JpdGhtLnNhbHQpO1xuICAgICAgICAgICAgY29uc3QgaGFzaCA9IGFsZ29yaXRobS5oYXNoLm5hbWUucmVwbGFjZShcIi1cIiwgXCJcIik7XG4gICAgICAgICAgICBjcnlwdG8ucGJrZGYyKGdldENyeXB0b0tleShiYXNlS2V5KS5kYXRhLCBCdWZmZXIkMS5mcm9tKHNhbHQpLCBhbGdvcml0aG0uaXRlcmF0aW9ucywgbGVuZ3RoID4+IDMsIGhhc2gsIChlcnIsIGRlcml2ZWRCaXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZGVyaXZlZEJpdHMpLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSBcInJhd1wiKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBuZXcgUGJrZGZDcnlwdG9LZXkoKTtcbiAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyJDEuZnJvbShrZXlEYXRhKTtcbiAgICAgICAgICAgIGtleS5hbGdvcml0aG0gPSB7IG5hbWU6IHRoaXMubmFtZSB9O1xuICAgICAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xuICAgICAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdyYXcnXCIpO1xuICAgIH1cbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIFBia2RmQ3J5cHRvS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IFBCS0RGIENyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgSG1hY0NyeXB0b0tleSBleHRlbmRzIENyeXB0b0tleSB7XG4gICAgZ2V0IGFsZygpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuYWxnb3JpdGhtLmhhc2gubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gYEhTJHtoYXNoLnJlcGxhY2UoXCJTSEEtXCIsIFwiXCIpfWA7XG4gICAgfVxuICAgIHNldCBhbGcodmFsdWUpIHtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwia1wiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxDb252ZXJ0ZXIgfSlcbl0sIEhtYWNDcnlwdG9LZXkucHJvdG90eXBlLCBcImRhdGFcIiwgdm9pZCAwKTtcblxuY2xhc3MgSG1hY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5IbWFjUHJvdmlkZXIge1xuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IChhbGdvcml0aG0ubGVuZ3RoIHx8IHRoaXMuZ2V0RGVmYXVsdExlbmd0aChhbGdvcml0aG0uaGFzaC5uYW1lKSkgPj4gMyA8PCAzO1xuICAgICAgICBjb25zdCBrZXkgPSBuZXcgSG1hY0NyeXB0b0tleSgpO1xuICAgICAgICBrZXkuYWxnb3JpdGhtID0ge1xuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9O1xuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcbiAgICAgICAga2V5LmRhdGEgPSBjcnlwdG8ucmFuZG9tQnl0ZXMobGVuZ3RoID4+IDMpO1xuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XG4gICAgfVxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSBTaGFDcnlwdG8uZ2V0QWxnb3JpdGhtTmFtZShrZXkuYWxnb3JpdGhtLmhhc2gpO1xuICAgICAgICBjb25zdCBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoY3J5cHRvQWxnLCBnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKVxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIkMS5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhtYWMpLmJ1ZmZlcjtcbiAgICB9XG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSBTaGFDcnlwdG8uZ2V0QWxnb3JpdGhtTmFtZShrZXkuYWxnb3JpdGhtLmhhc2gpO1xuICAgICAgICBjb25zdCBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoY3J5cHRvQWxnLCBnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKVxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIkMS5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcbiAgICAgICAgcmV0dXJuIGhtYWMuY29tcGFyZShCdWZmZXIkMS5mcm9tKHNpZ25hdHVyZSkpID09PSAwO1xuICAgIH1cbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XG4gICAgICAgICAgICAgICAga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihrZXlEYXRhLCB7IHRhcmdldFNjaGVtYTogSG1hY0NyeXB0b0tleSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcbiAgICAgICAgICAgICAgICBrZXkgPSBuZXcgSG1hY0NyeXB0b0tleSgpO1xuICAgICAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyJDEuZnJvbShrZXlEYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XG4gICAgICAgIH1cbiAgICAgICAga2V5LmFsZ29yaXRobSA9IHtcbiAgICAgICAgICAgIGhhc2g6IHsgbmFtZTogYWxnb3JpdGhtLmhhc2gubmFtZSB9LFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbGVuZ3RoOiBrZXkuZGF0YS5sZW5ndGggPDwgMyxcbiAgICAgICAgfTtcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci50b0pTT04oZ2V0Q3J5cHRvS2V5KGtleSkpO1xuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKS5idWZmZXI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgSG1hY0NyeXB0b0tleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBITUFDIENyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgSGtkZkNyeXB0b0tleSBleHRlbmRzIENyeXB0b0tleSB7XG59XG5cbmNsYXNzIEhrZGZQcm92aWRlciBleHRlbmRzIGNvcmUuSGtkZlByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xuICAgICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgIT09IFwicmF3XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEhrZGZDcnlwdG9LZXkoKTtcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIkMS5mcm9tKGtleURhdGEpO1xuICAgICAgICBrZXkuYWxnb3JpdGhtID0geyBuYW1lOiB0aGlzLm5hbWUgfTtcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKHBhcmFtcywgYmFzZUtleSwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBwYXJhbXMuaGFzaC5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xuICAgICAgICBjb25zdCBoYXNoTGVuZ3RoID0gY3J5cHRvLmNyZWF0ZUhhc2goaGFzaCkuZGlnZXN0KCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gbGVuZ3RoIC8gODtcbiAgICAgICAgY29uc3QgaW5mbyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxLnRvVWludDhBcnJheShwYXJhbXMuaW5mbyk7XG4gICAgICAgIGNvbnN0IFBSSyA9IGNyeXB0by5jcmVhdGVIbWFjKGhhc2gsIEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxLnRvVWludDhBcnJheShwYXJhbXMuc2FsdCkpXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxLnRvVWludDhBcnJheShnZXRDcnlwdG9LZXkoYmFzZUtleSkuZGF0YSkpXG4gICAgICAgICAgICAuZGlnZXN0KCk7XG4gICAgICAgIGNvbnN0IGJsb2NrcyA9IFtCdWZmZXIkMS5hbGxvYygwKV07XG4gICAgICAgIGNvbnN0IGJsb2NrQ291bnQgPSBNYXRoLmNlaWwoYnl0ZUxlbmd0aCAvIGhhc2hMZW5ndGgpICsgMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBibG9ja0NvdW50OyArK2kpIHtcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGNyeXB0by5jcmVhdGVIbWFjKGhhc2gsIFBSSylcbiAgICAgICAgICAgICAgICAudXBkYXRlKEJ1ZmZlciQxLmNvbmNhdChbYmxvY2tzW2kgLSAxXSwgaW5mbywgQnVmZmVyJDEuZnJvbShbaV0pXSkpXG4gICAgICAgICAgICAgICAgLmRpZ2VzdCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyJDEuY29uY2F0KGJsb2Nrcykuc2xpY2UoMCwgYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgSGtkZkNyeXB0b0tleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBIS0RGIENyeXB0b0tleVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgU2hha2VDcnlwdG8ge1xuICAgIHN0YXRpYyBkaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpLCB7IG91dHB1dExlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCB9KVxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIkMS5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhhc2gpLmJ1ZmZlcjtcbiAgICB9XG59XG5cbmNsYXNzIFNoYWtlMTI4UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlNoYWtlMTI4UHJvdmlkZXIge1xuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gU2hha2VDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XG4gICAgfVxufVxuXG5jbGFzcyBTaGFrZTI1NlByb3ZpZGVyIGV4dGVuZHMgY29yZS5TaGFrZTI1NlByb3ZpZGVyIHtcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFNoYWtlQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xuICAgIH1cbn1cblxuY2xhc3MgU3VidGxlQ3J5cHRvIGV4dGVuZHMgY29yZS5TdWJ0bGVDcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ2JjUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ3RyUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzR2NtUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ21hY1Byb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0t3UHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzRWNiUHJvdmlkZXIoKSk7XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBjcnlwdG8uZ2V0Q2lwaGVycygpO1xuICAgICAgICBpZiAoY2lwaGVycy5pbmNsdWRlcyhcImRlcy1jYmNcIikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRGVzQ2JjUHJvdmlkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBEZXNFZGUzQ2JjUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhU3NhUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhUHNzUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhT2FlcFByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFJzYUVzUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRWNkc2FQcm92aWRlcigpKTtcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFY2RoUHJvdmlkZXIoKSk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMVByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTI1NlByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTM4NFByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTUxMlByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFBia2RmMlByb3ZpZGVyKCkpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEhtYWNQcm92aWRlcigpKTtcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBIa2RmUHJvdmlkZXIoKSk7XG4gICAgICAgIGNvbnN0IG5vZGVNYWpvclZlcnNpb24gPSAoX2EgPSAvXnYoXFxkKykvLmV4ZWMocHJvY2Vzcy52ZXJzaW9uKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzFdO1xuICAgICAgICBpZiAobm9kZU1ham9yVmVyc2lvbiAmJiBwYXJzZUludChub2RlTWFqb3JWZXJzaW9uLCAxMCkgPj0gMTIpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hha2UxMjhQcm92aWRlcigpKTtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hha2UyNTZQcm92aWRlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYXNoZXMgPSBjcnlwdG8uZ2V0SGFzaGVzKCk7XG4gICAgICAgIGlmIChoYXNoZXMuaW5jbHVkZXMoXCJzaGEzLTI1NlwiKSkge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGEzMjU2UHJvdmlkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc2hlcy5pbmNsdWRlcyhcInNoYTMtMzg0XCIpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTMzODRQcm92aWRlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzaGVzLmluY2x1ZGVzKFwic2hhMy01MTJcIikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMzUxMlByb3ZpZGVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTWFqb3JWZXJzaW9uICYmIHBhcnNlSW50KG5vZGVNYWpvclZlcnNpb24sIDEwKSA+PSAxNCkge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFZERzYVByb3ZpZGVyKCkpO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFY2RoRXNQcm92aWRlcigpKTtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRWQyNTUxOVByb3ZpZGVyKCkpO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBYMjU1MTlQcm92aWRlcigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ3J5cHRvIGV4dGVuZHMgY29yZS5DcnlwdG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnN1YnRsZSA9IG5ldyBTdWJ0bGVDcnlwdG8oKTtcbiAgICB9XG4gICAgZ2V0UmFuZG9tVmFsdWVzKGFycmF5KSB7XG4gICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBleGVjdXRlICdnZXRSYW5kb21WYWx1ZXMnIG9uICdDcnlwdG8nOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnQXJyYXlCdWZmZXJWaWV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIkMS5mcm9tKGFycmF5LmJ1ZmZlciwgYXJyYXkuYnl0ZU9mZnNldCwgYXJyYXkuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNyeXB0by5yYW5kb21GaWxsU3luYyhidWZmZXIpO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBDcnlwdG8gfTtcbiIsICJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsICJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCAiaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTGF5b3V0Vmlld3BvcnQoKSB7XG4gIHJldHVybiAhL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChnZXRVQVN0cmluZygpKTtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICB2YXIgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpOyAvLyBGaXJzdCwgYXR0ZW1wdCB3aXRoIGZhc3RlciBuYXRpdmUgbWV0aG9kXG5cbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgICB2YXIgbmV4dCA9IGNoaWxkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuZXh0ICYmIHBhcmVudC5pc1NhbWVOb2RlKG5leHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgICB9IHdoaWxlIChuZXh0KTtcbiAgICB9IC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcblxuXG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSB7XG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgcmV0dXJuICgoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gIGVsZW1lbnQuZG9jdW1lbnQpIHx8IHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50O1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn0iLCAiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwgImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCAidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gRmlyZWZveCB3YW50cyB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WTtcblxuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKTtcbn0iLCAiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCAiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCAiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCAiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkc3RyYXRlZ3kgPSBfb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHN0cmF0ZWd5ID0gX29wdGlvbnMkc3RyYXRlZ3kgPT09IHZvaWQgMCA/IHN0YXRlLnN0cmF0ZWd5IDogX29wdGlvbnMkc3RyYXRlZ3ksXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIFx1MjAxMyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsICJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsICJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59IiwgImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCAiZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVN0eWxlcyB9IGZyb20gXCIuL2FwcGx5U3R5bGVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFycm93IH0gZnJvbSBcIi4vYXJyb3cuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcHV0ZVN0eWxlcyB9IGZyb20gXCIuL2NvbXB1dGVTdHlsZXMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXZlbnRMaXN0ZW5lcnMgfSBmcm9tIFwiLi9ldmVudExpc3RlbmVycy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSBcIi4vZmxpcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoaWRlIH0gZnJvbSBcIi4vaGlkZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvZmZzZXQgfSBmcm9tIFwiLi9vZmZzZXQuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcG9wcGVyT2Zmc2V0cyB9IGZyb20gXCIuL3BvcHBlck9mZnNldHMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJldmVudE92ZXJmbG93IH0gZnJvbSBcIi4vcHJldmVudE92ZXJmbG93LmpzXCI7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufSIsICJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldENvbXBvc2l0ZVJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBvcmRlck1vZGlmaWVycyBmcm9tIFwiLi91dGlscy9vcmRlck1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL3V0aWxzL2RlYm91bmNlLmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICFhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIShlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKHNldE9wdGlvbnNBY3Rpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNldE9wdGlvbnNBY3Rpb24oc3RhdGUub3B0aW9ucykgOiBzZXRPcHRpb25zQWN0aW9uO1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgc3RhdGUub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKSA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZSkgOiByZWZlcmVuY2UuY29udGV4dEVsZW1lbnQgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIDogW10sXG4gICAgICAgICAgcG9wcGVyOiBsaXN0U2Nyb2xsUGFyZW50cyhwb3BwZXIpXG4gICAgICAgIH07IC8vIE9yZGVycyB0aGUgbW9kaWZpZXJzIGJhc2VkIG9uIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgYHBoYXNlYFxuICAgICAgICAvLyBwcm9wZXJ0aWVzXG5cbiAgICAgICAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlck1vZGlmaWVycyhtZXJnZUJ5TmFtZShbXS5jb25jYXQoZGVmYXVsdE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpKSk7IC8vIFN0cmlwIG91dCBkaXNhYmxlZCBtb2RpZmllcnNcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5lbmFibGVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICAvLyBTeW5jIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4gVGhpc1xuICAgICAgLy8gaXMgdXNlZnVsIGZvciBsb3cgZnJlcXVlbmN5IHVwZGF0ZXMgd2hlcmUgc3luYyBiZWhhdmlvciBzaW1wbGlmaWVzIHRoZVxuICAgICAgLy8gbG9naWMuXG4gICAgICAvLyBGb3IgaGlnaCBmcmVxdWVuY3kgdXBkYXRlcyAoZS5nLiBgcmVzaXplYCBhbmQgYHNjcm9sbGAgZXZlbnRzKSwgYWx3YXlzXG4gICAgICAvLyBwcmVmZXIgdGhlIGFzeW5jIFBvcHBlciN1cGRhdGUgbWV0aG9kXG4gICAgICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfc3RhdGUkZWxlbWVudHMgPSBzdGF0ZS5lbGVtZW50cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IF9zdGF0ZSRlbGVtZW50cy5yZWZlcmVuY2UsXG4gICAgICAgICAgICBwb3BwZXIgPSBfc3RhdGUkZWxlbWVudHMucG9wcGVyOyAvLyBEb24ndCBwcm9jZWVkIGlmIGByZWZlcmVuY2VgIG9yIGBwb3BwZXJgIGFyZSBub3QgdmFsaWQgZWxlbWVudHNcbiAgICAgICAgLy8gYW55bW9yZVxuXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAgLy8gdXBkYXRlIGN5Y2xlIHJ1bnMuIFRoZXkgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdXBkYXRlXG4gICAgLy8gY3ljbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBtb2RpZmllciBhZGRzIHNvbWUgcGVyc2lzdGVudCBkYXRhIHRoYXRcbiAgICAvLyBvdGhlciBtb2RpZmllcnMgbmVlZCB0byB1c2UsIGJ1dCB0aGUgbW9kaWZpZXIgaXMgcnVuIGFmdGVyIHRoZSBkZXBlbmRlbnRcbiAgICAvLyBvbmUuXG5cbiAgICBmdW5jdGlvbiBydW5Nb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZiRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkb3B0aW9ucyxcbiAgICAgICAgICAgIGVmZmVjdCA9IF9yZWYuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cbmV4cG9ydCB2YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGRldGVjdE92ZXJmbG93IH07IiwgImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwgImV4cG9ydCAqIGZyb20gXCIuL2VudW1zLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93LCBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyQmFzZSB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciB9IGZyb20gXCIuL3BvcHBlci5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBCYXNlIH07XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmcm9tIHdoaWNoIHRoZSBtb3N0IGNsYXNzZXMgYXJlIGRlcml2ZWQuXG4gKlxuICogVGhpcyBjbGFzcyBoYXMgYmVzaWRlcyBhIGB0b1N0cmluZ2Agd2hpY2ggcmV0dXJucyB0aGUganNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gKiBhbHNvIGEgZnVuY3Rpb25hbGl0eSB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy5cbiAqXG4gKiBUaGVyZWZvcmUsIHRoZSBjbGFzcyBoYXMgYSBzdGF0aWMgbWV0aG9kIGAgW1N5bWJvbC5oYXNJbnN0YW5jZV0odGhhdClgIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0XG4gKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuXG4gKlxuICogQHNlZSBbaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sL2hhc0luc3RhbmNlXShkZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sL2hhc0luc3RhbmNlKVxuICpcbiAqIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGEgc3RhdGljIGdldHRlciBgaW5zdGFuY2VTeW1ib2xgIHdoaWNoIHJldHVybnMgYSB1bmlxdWUgc3ltYm9sLlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcbiAqICAgIHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci90eXBlcy9iYXNlXCIpO1xuICogfVxuICogYGBgXG4gKlxuICogVGhlIGNsYXNzIHdhcyBmb3JtZXJseSBjYWxsZWQgT2JqZWN0LlxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBiYXNlIGNsYXNzIGZvciB0aGUgbW9zdCBjbGFzc2VzIGluIHRoZSBtb25zdGVyIGxpYnJhcnlcbiAqL1xuY2xhc3MgQmFzZSBleHRlbmRzIE9iamVjdCB7XG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL3R5cGVzL2Jhc2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEBwYXJhbSB0aGF0XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKHRoYXQpIHtcblx0XHRpZiAoXG5cdFx0XHR0aGF0ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdHRoYXQgPT09IG51bGwgfHxcblx0XHRcdCh0eXBlb2YgdGhhdCAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdGhhdCAhPT0gXCJmdW5jdGlvblwiKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRoYXRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGF0KTtcblx0XHRpZiAoXG5cdFx0XHR0aGF0Q2xhc3MgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0dGhhdENsYXNzID09PSBudWxsIHx8XG5cdFx0XHQodHlwZW9mIHRoYXRDbGFzcyAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdGhhdENsYXNzICE9PSBcImZ1bmN0aW9uXCIpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGNoZWNrSW5zdGFuY2VTeW1ib2wuYXBwbHkodGhpcywgW3RoYXRDbGFzc10pID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGlzIGNhbGwgdGhlIHN0YXRpYyBtZXRob2Qgb2YgdGhlIHN1cGVyIGNsYXNzLCBpZiB0aGVyZSBpcyBvbmVcblx0XHRyZXR1cm4gc3VwZXJbU3ltYm9sLmhhc0luc3RhbmNlXSh0aGF0KTtcblx0fVxufVxuXG4vKipcbiAqIHRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjbGFzcyBoYXMgYSBzdGF0aWMgZ2V0dGVyIGBpbnN0YW5jZVN5bWJvbGAgYW5kIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGdldHRlciBpcyBlcXVhbCB0byB0aGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIG9ialxuICogQHJldHVybiB7Ym9vbGVhbnxhbnl8Ym9vbGVhbn1cbiAqIEBzaW5jZSAyLjEuMFxuICovXG5mdW5jdGlvbiBjaGVja0luc3RhbmNlU3ltYm9sKG9iaikge1xuXHRpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShpbnN0YW5jZVN5bWJvbCkgPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG8gPSBvYmo/LmNvbnN0cnVjdG9yO1xuXHRpZiAoXG5cdFx0cHJvdG8gPT09IHVuZGVmaW5lZCB8fFxuXHRcdHByb3RvID09PSBudWxsIHx8XG5cdFx0KHR5cGVvZiBwcm90byAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvdG8gIT09IFwiZnVuY3Rpb25cIilcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKHByb3RvLmhhc093blByb3BlcnR5KGluc3RhbmNlU3ltYm9sKSAhPT0gdHJ1ZSkge1xuXHRcdHJldHVybiBjaGVja0luc3RhbmNlU3ltYm9sLmFwcGx5KHRoaXMsIFtvYmouX19wcm90b19fXSk7XG5cdH1cblxuXHRjb25zdCBzeW1ib2wgPSBwcm90b1tpbnN0YW5jZVN5bWJvbF07XG5cdGlmIChzeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuXHRcdGlmIChvYmouX19wcm90b19fKSB7XG5cdFx0XHRyZXR1cm4gY2hlY2tJbnN0YW5jZVN5bWJvbChvYmouX19wcm90b19fKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChzeW1ib2wgPT09IHRoaXNbaW5zdGFuY2VTeW1ib2xdKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gY2hlY2tJbnN0YW5jZVN5bWJvbC5hcHBseSh0aGlzLCBbb2JqLl9fcHJvdG9fX10pO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgU3RhY2sgfTtcblxuLyoqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgUXVldWUoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmNsYXNzIFN0YWNrIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmRhdGEgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvdHlwZXMvc3RhY2tcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGlzRW1wdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPT09IDA7XG5cdH1cblxuXHQvKipcblx0ICogbG9va3MgYXQgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBzdGFjay5cblx0ICpcblx0ICogQHJldHVybiB7Kn1cblx0ICovXG5cdHBlZWsoKSB7XG5cdFx0aWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRhdGE/Llt0aGlzLmRhdGEubGVuZ3RoIC0gMV07XG5cdH1cblxuXHQvKipcblx0ICogcHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7UXVldWV9XG5cdCAqL1xuXHRwdXNoKHZhbHVlKSB7XG5cdFx0dGhpcy5kYXRhLnB1c2godmFsdWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJlbW92ZSBhbGwgZW50cmllc1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtRdWV1ZX1cblx0ICovXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuZGF0YSA9IFtdO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgYW5kIHJldHVybnNcblx0ICogdGhhdCBvYmplY3QgYXMgdGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24uIGlzIHRoZSBzdGFjayBlbXB0eVxuXHQgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC5cblx0ICpcblx0ICogQHJldHVybiB7Kn1cblx0ICovXG5cdHBvcCgpIHtcblx0XHRpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmRhdGEucG9wKCk7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge1xuXHRpc0FycmF5LFxuXHRpc0ludGVnZXIsXG5cdGlzT2JqZWN0LFxuXHRpc1ByaW1pdGl2ZSxcblx0aXNTdHJpbmcsXG59IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSBcIi4uL3R5cGVzL3N0YWNrLm1qc1wiO1xuaW1wb3J0IHtcblx0dmFsaWRhdGVJbnRlZ2VyLFxuXHR2YWxpZGF0ZUJvb2xlYW4sXG5cdHZhbGlkYXRlU3RyaW5nLFxufSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IFBhdGhmaW5kZXIsIERFTElNSVRFUiwgV0lMRENBUkQgfTtcblxuLyoqXG4gKiBwYXRoIHNlcGFyYXRvclxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBERUxJTUlURVIgPSBcIi5cIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgV0lMRENBUkQgPSBcIipcIjtcblxuLyoqXG4gKiBQYXRoZmluZGVyIGlzIGEgY2xhc3MgdG8gZmluZCBhIHBhdGggdG8gYW4gb2JqZWN0LlxuICpcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIHBhdGhmaW5kZXIsIHZhbHVlcyBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBmcm9tIGFuIG9iamVjdCBjb25zdHJ1Y3QuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7XG4gKiBhOiB7XG4gKiAgICAgYjoge1xuICogICAgICAgICBmOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgZzogZmFsc2UsXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF0sXG4gKiAgICAgfVxuICogfVxuICogfSkuZ2V0VmlhKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIGlmIGEgdmFsdWUgaXMgbm90IHByZXNlbnQgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLCBhIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIG5ldyBQYXRoZmluZGVyKHt9KS5nZXRWaWEoXCJhLmIuZi4wLmdcIik7IC8vIFx1MjFBNiBFcnJvclxuICogYGBgXG4gKlxuICogVGhlIGBQYXRoZmluZGVyLmV4aXN0cygpYCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhY2Nlc3MgdG8gdGhlIHBhdGggaXMgcG9zc2libGUuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7fSkuZXhpc3RzKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIHBhdGhmaW5kZXIgY2FuIGFsc28gYmUgdXNlZCB0byBidWlsZCBvYmplY3Qgc3RydWN0dXJlcy4gdG8gZG8gdGhpcywgdGhlIGBQYXRoZmluZGVyLnNldFZpYSgpYCBtZXRob2QgbXVzdCBiZSB1c2VkLlxuICpcbiAqIGBgYFxuICogb2JqID0ge307XG4gKiBuZXcgUGF0aGZpbmRlcihvYmopLnNldFZpYSgnYS5iLjAuYycsIHRydWUpOyAvLyBcdTIxQTYge2E6e2I6W3tjOnRydWV9XX19XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvbGlicmFyaWVzL3BhdGhmaW5kZXIvZXhhbXBsZS0xLyBFeGFtcGxlIDFcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9saWJyYXJpZXMvcGF0aGZpbmRlci9leGFtcGxlLTIvIEV4YW1wbGUgMlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgUGF0aGZpbmRlciBpcyBhIGNsYXNzIHRvIGZpbmQgYSBwYXRoIHRvIGFuIG9iamVjdC5cbiAqL1xuY2xhc3MgUGF0aGZpbmRlciBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29uc3RydWN0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuXHQgKlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgcGFyYW1ldGVyIGlzIGEgc2ltcGxlIHR5cGUuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvYmplY3QpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGlzUHJpbWl0aXZlKG9iamVjdCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgYSBzaW1wbGUgdHlwZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0XHR0aGlzLndpbGRDYXJkID0gV0lMRENBUkQ7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHdpbGRjYXJkXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB3aWxkY2FyZFxuXHQgKiBAcmV0dXJuIHtQYXRoZmluZGVyfVxuXHQgKiBAc2luY2UgMS43LjBcblx0ICovXG5cdHNldFdpbGRDYXJkKHdpbGRjYXJkKSB7XG5cdFx0dmFsaWRhdGVTdHJpbmcod2lsZGNhcmQpO1xuXHRcdHRoaXMud2lsZENhcmQgPSB3aWxkY2FyZDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aFxuXHQgKiBAc2luY2UgMS40LjBcblx0ICogQHJldHVybiB7Kn1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgam91cm5leSBpcyBub3QgYXQgaXRzIGVuZFxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG5cdCAqL1xuXHRnZXRWaWEocGF0aCkge1xuXHRcdHJldHVybiBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCB0aGlzLm9iamVjdCwgcGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IHBhdGhcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtQYXRoZmluZGVyfVxuXHQgKiBAc2luY2UgMS40LjBcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcblx0ICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcblx0ICovXG5cdHNldFZpYShwYXRoLCB2YWx1ZSkge1xuXHRcdHNldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHRoaXMub2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIFZpYSBQYXRoXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoXG5cdCAqIEByZXR1cm4ge1BhdGhmaW5kZXJ9XG5cdCAqIEBzaW5jZSAxLjYuMFxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuXHQgKi9cblx0ZGVsZXRlVmlhKHBhdGgpIHtcblx0XHRkZWxldGVWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCB0aGlzLm9iamVjdCwgcGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IHBhdGhcblx0ICogQHJldHVybiB7Ym9vbH1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcblx0ICogQHNpbmNlIDEuNC4wXG5cdCAqL1xuXHRleGlzdHMocGF0aCkge1xuXHRcdHRyeSB7XG5cdFx0XHRnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCB0aGlzLm9iamVjdCwgcGF0aCwgdHJ1ZSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIChlKSB7fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdFxuICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IHBhdGhcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tcbiAqIEByZXR1cm4ge01hcH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZShzdWJqZWN0LCBwYXRoLCBjaGVjaykge1xuXHRpZiAoY2hlY2sgPT09IHVuZGVmaW5lZCkge1xuXHRcdGNoZWNrID0gZmFsc2U7XG5cdH1cblx0dmFsaWRhdGVCb29sZWFuKGNoZWNrKTtcblxuXHRjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG5cblx0aWYgKGlzQXJyYXkocGF0aCkpIHtcblx0XHRwYXRoID0gcGF0aC5qb2luKERFTElNSVRFUik7XG5cdH1cblxuXHRpZiAoaXNPYmplY3Qoc3ViamVjdCkgfHwgaXNBcnJheShzdWJqZWN0KSkge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmplY3QpKSB7XG5cdFx0XHRyZXN1bHQuc2V0KGtleSwgZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdmFsdWUsIHBhdGgsIGNoZWNrKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGtleSA9IHBhdGguc3BsaXQoREVMSU1JVEVSKS5zaGlmdCgpO1xuXHRcdHJlc3VsdC5zZXQoa2V5LCBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCBzdWJqZWN0LCBwYXRoLCBjaGVjaykpO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHN1YmplY3RcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gY2hlY2tcbiAqIEByZXR1cm4ge1Z8KnxNYXB9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgam91cm5leSBpcyBub3QgYXQgaXRzIGVuZFxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVWaWFQYXRoKHN1YmplY3QsIHBhdGgsIGNoZWNrKSB7XG5cdGlmIChjaGVjayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y2hlY2sgPSBmYWxzZTtcblx0fVxuXHR2YWxpZGF0ZUJvb2xlYW4oY2hlY2spO1xuXG5cdGlmICghKGlzQXJyYXkocGF0aCkgfHwgaXNTdHJpbmcocGF0aCkpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XCJ0eXBlIGVycm9yOiBhIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBpbiBnZXRWYWx1ZVZpYVBhdGhcIixcblx0XHQpO1xuXHR9XG5cblx0bGV0IHBhcnRzO1xuXHRpZiAoaXNTdHJpbmcocGF0aCkpIHtcblx0XHRpZiAocGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIHN1YmplY3Q7XG5cdFx0fVxuXG5cdFx0cGFydHMgPSBwYXRoLnNwbGl0KERFTElNSVRFUik7XG5cdH1cblxuXHRsZXQgY3VycmVudCA9IHBhcnRzLnNoaWZ0KCk7XG5cblx0aWYgKGN1cnJlbnQgPT09IHRoaXMud2lsZENhcmQpIHtcblx0XHRyZXR1cm4gaXRlcmF0ZS5jYWxsKHRoaXMsIHN1YmplY3QsIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY2hlY2spO1xuXHR9XG5cblx0aWYgKGlzT2JqZWN0KHN1YmplY3QpIHx8IGlzQXJyYXkoc3ViamVjdCkpIHtcblx0XHRsZXQgYW5jaG9yO1xuXHRcdGlmIChzdWJqZWN0IGluc3RhbmNlb2YgTWFwIHx8IHN1YmplY3QgaW5zdGFuY2VvZiBXZWFrTWFwKSB7XG5cdFx0XHRhbmNob3IgPSBzdWJqZWN0LmdldChjdXJyZW50KTtcblx0XHR9IGVsc2UgaWYgKHN1YmplY3QgaW5zdGFuY2VvZiBTZXQgfHwgc3ViamVjdCBpbnN0YW5jZW9mIFdlYWtTZXQpIHtcblx0XHRcdGN1cnJlbnQgPSBwYXJzZUludChjdXJyZW50KTtcblx0XHRcdHZhbGlkYXRlSW50ZWdlcihjdXJyZW50KTtcblx0XHRcdGFuY2hvciA9IFsuLi5zdWJqZWN0XT8uW2N1cnJlbnRdO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIFdlYWtSZWYgPT09IFwiZnVuY3Rpb25cIiAmJiBzdWJqZWN0IGluc3RhbmNlb2YgV2Vha1JlZikge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJ1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlIChXZWFrUmVmKVwiKTtcblx0XHR9IGVsc2UgaWYgKGlzQXJyYXkoc3ViamVjdCkpIHtcblx0XHRcdGN1cnJlbnQgPSBwYXJzZUludChjdXJyZW50KTtcblx0XHRcdHZhbGlkYXRlSW50ZWdlcihjdXJyZW50KTtcblx0XHRcdGFuY2hvciA9IHN1YmplY3Q/LltjdXJyZW50XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YW5jaG9yID0gc3ViamVjdD8uW2N1cnJlbnRdO1xuXHRcdH1cblxuXHRcdGlmIChpc09iamVjdChhbmNob3IpIHx8IGlzQXJyYXkoYW5jaG9yKSkge1xuXHRcdFx0cmV0dXJuIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIGFuY2hvciwgcGFydHMuam9pbihERUxJTUlURVIpLCBjaGVjayk7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IEVycm9yKGB0aGUgam91cm5leSBpcyBub3QgYXQgaXRzIGVuZCAoJHtwYXJ0cy5qb2luKERFTElNSVRFUil9KWApO1xuXHRcdH1cblxuXHRcdGlmIChjaGVjayA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdE9iamVjdC5nZXRQcm90b3R5cGVPZihzdWJqZWN0KSxcblx0XHRcdFx0Y3VycmVudCxcblx0XHRcdCk7XG5cblx0XHRcdGlmICghc3ViamVjdC5oYXNPd25Qcm9wZXJ0eShjdXJyZW50KSAmJiBkZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoXCJ1bmtub3duIHZhbHVlIFwiICsgY3VycmVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuY2hvcjtcblx0fVxuXG5cdHRocm93IFR5cGVFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZSAke3R5cGVvZiBzdWJqZWN0fSBmb3IgcGF0aCAke3BhdGh9YCk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aFxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGpvdXJuZXkgaXMgbm90IGF0IGl0cyBlbmRcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRWYWx1ZVZpYVBhdGgoc3ViamVjdCwgcGF0aCwgdmFsdWUpIHtcblx0aWYgKCEoaXNBcnJheShwYXRoKSB8fCBpc1N0cmluZyhwYXRoKSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIGVycm9yOiBhIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBhcnJheVwiKTtcblx0fVxuXG5cdGxldCBwYXJ0cztcblx0aWYgKGlzQXJyYXkocGF0aCkpIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRwYXJ0cyA9IHBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cGFydHMgPSBwYXRoLnNwbGl0KERFTElNSVRFUik7XG5cdH1cblxuXHRsZXQgbGFzdCA9IHBhcnRzLnBvcCgpO1xuXHRjb25zdCBzdWJwYXRoID0gcGFydHMuam9pbihERUxJTUlURVIpO1xuXG5cdGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cdGxldCBjdXJyZW50ID0gc3VicGF0aDtcblx0d2hpbGUgKHRydWUpIHtcblx0XHR0cnkge1xuXHRcdFx0Z2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgc3ViamVjdCwgY3VycmVudCwgdHJ1ZSk7XG5cdFx0XHRicmVhaztcblx0XHR9IGNhdGNoIChlKSB7fVxuXG5cdFx0c3RhY2sucHVzaChjdXJyZW50KTtcblx0XHRwYXJ0cy5wb3AoKTtcblx0XHRjdXJyZW50ID0gcGFydHMuam9pbihERUxJTUlURVIpO1xuXG5cdFx0aWYgKGN1cnJlbnQgPT09IFwiXCIpIGJyZWFrO1xuXHR9XG5cblx0d2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHtcblx0XHRjdXJyZW50ID0gc3RhY2sucG9wKCk7XG5cdFx0bGV0IG9iaiA9IHt9O1xuXG5cdFx0aWYgKCFzdGFjay5pc0VtcHR5KCkpIHtcblx0XHRcdGNvbnN0IG4gPSBzdGFjay5wZWVrKCkuc3BsaXQoREVMSU1JVEVSKS5wb3AoKTtcblx0XHRcdGlmIChpc0ludGVnZXIocGFyc2VJbnQobikpKSB7XG5cdFx0XHRcdG9iaiA9IFtdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHNldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHN1YmplY3QsIGN1cnJlbnQsIG9iaik7XG5cdH1cblxuXHRjb25zdCBhbmNob3IgPSBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCBzdWJqZWN0LCBzdWJwYXRoKTtcblxuXHRpZiAoIShpc09iamVjdChzdWJqZWN0KSB8fCBpc0FycmF5KHN1YmplY3QpKSkge1xuXHRcdHRocm93IFR5cGVFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlb2Ygc3ViamVjdH0gaW4gc2V0VmFsdWVWaWFQYXRoYCk7XG5cdH1cblxuXHRpZiAoYW5jaG9yIGluc3RhbmNlb2YgTWFwIHx8IGFuY2hvciBpbnN0YW5jZW9mIFdlYWtNYXApIHtcblx0XHRhbmNob3Iuc2V0KGxhc3QsIHZhbHVlKTtcblx0fSBlbHNlIGlmIChhbmNob3IgaW5zdGFuY2VvZiBTZXQgfHwgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1NldCkge1xuXHRcdGFuY2hvci5hcHBlbmQodmFsdWUpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBXZWFrUmVmID09PSBcImZ1bmN0aW9uXCIgJiYgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1JlZikge1xuXHRcdHRocm93IEVycm9yKFwidW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZSBpbiBzZXRWYWx1ZVZpYVBhdGhcIik7XG5cdH0gZWxzZSBpZiAoaXNBcnJheShhbmNob3IpKSB7XG5cdFx0bGFzdCA9IHBhcnNlSW50KGxhc3QpO1xuXHRcdHZhbGlkYXRlSW50ZWdlcihsYXN0KTtcblx0XHRhc3NpZ25Qcm9wZXJ0eShhbmNob3IsIFwiXCIgKyBsYXN0LCB2YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0YXNzaWduUHJvcGVydHkoYW5jaG9yLCBsYXN0LCB2YWx1ZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBhc3NpZ25Qcm9wZXJ0eShvYmplY3QsIGtleSwgdmFsdWUpIHtcblx0aWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdG9iamVjdFtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRkZWxldGUgb2JqZWN0W2tleV07XG5cdH1cblxuXHRvYmplY3Rba2V5XSA9IHZhbHVlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3ViamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVZhbHVlVmlhUGF0aChzdWJqZWN0LCBwYXRoKSB7XG5cdGlmICghKGlzQXJyYXkocGF0aCkgfHwgaXNTdHJpbmcocGF0aCkpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XCJ0eXBlIGVycm9yOiBhIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBpbiBkZWxldGVWYWx1ZVZpYVBhdGhcIixcblx0XHQpO1xuXHR9XG5cblx0bGV0IHBhcnRzO1xuXHRpZiAoaXNBcnJheShwYXRoKSkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHBhcnRzID0gcGF0aDtcblx0fSBlbHNlIHtcblx0XHRwYXJ0cyA9IHBhdGguc3BsaXQoREVMSU1JVEVSKTtcblx0fVxuXG5cdGxldCBsYXN0ID0gcGFydHMucG9wKCk7XG5cdGNvbnN0IHN1YlBhdGggPSBwYXJ0cy5qb2luKERFTElNSVRFUik7XG5cblx0Y29uc3QgYW5jaG9yID0gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgc3ViamVjdCwgc3ViUGF0aCk7XG5cblx0aWYgKGFuY2hvciBpbnN0YW5jZW9mIE1hcCkge1xuXHRcdGFuY2hvci5kZWxldGUobGFzdCk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0YW5jaG9yIGluc3RhbmNlb2YgU2V0IHx8XG5cdFx0YW5jaG9yIGluc3RhbmNlb2YgV2Vha01hcCB8fFxuXHRcdGFuY2hvciBpbnN0YW5jZW9mIFdlYWtTZXQgfHxcblx0XHQodHlwZW9mIFdlYWtSZWYgPT09IFwiZnVuY3Rpb25cIiAmJiBhbmNob3IgaW5zdGFuY2VvZiBXZWFrUmVmKVxuXHQpIHtcblx0XHR0aHJvdyBFcnJvcihcInVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGUgaW4gZGVsZXRlVmFsdWVWaWFQYXRoXCIpO1xuXHR9IGVsc2UgaWYgKGlzQXJyYXkoYW5jaG9yKSkge1xuXHRcdGxhc3QgPSBwYXJzZUludChsYXN0KTtcblx0XHR2YWxpZGF0ZUludGVnZXIobGFzdCk7XG5cdFx0ZGVsZXRlIGFuY2hvcltsYXN0XTtcblx0fSBlbHNlIHtcblx0XHRkZWxldGUgYW5jaG9yW2xhc3RdO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaXNJdGVyYWJsZSwgaXNTdHJpbmcgfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcblxuZXhwb3J0IHsgVG9rZW5MaXN0IH07XG5cbi8qKlxuICogQSBgVG9rZW5MaXN0YCBhbGxvd3MgeW91IHRvIG1hbmFnZSB0b2tlbnMgKGluZGl2aWR1YWwgY2hhcmFjdGVyIHN0cmluZ3Mgc3VjaCBhcyBjc3MgY2xhc3NlcyBpbiBhbiBhdHRyaWJ1dGUgc3RyaW5nKS5cbiAqXG4gKiBUaGUgYFRva2VuTGlzdGAgb2ZmZXJzIHZhcmlvdXMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQsIHJlbW92ZSBvciByZXBsYWNlIGEgY2xhc3MgaW4gYSBDU1MgbGlzdC5cbiAqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFtpdGVyYXRpb24gcHJvdG9jb2xdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0l0ZXJhdGlvbl9wcm90b2NvbHMpLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5jbGFzcyBUb2tlbkxpc3QgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IGluaXRcblx0ICovXG5cdGNvbnN0cnVjdG9yKGluaXQpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudG9rZW5zID0gbmV3IFNldCgpO1xuXG5cdFx0aWYgKHR5cGVvZiBpbml0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR0aGlzLmFkZChpbml0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSXRlcmF0b3IgcHJvdG9jb2xcblx0ICpcblx0ICogQHJldHVybiB7U3ltYm9sLml0ZXJhdG9yfVxuXHQgKi9cblx0Z2V0SXRlcmF0b3IoKSB7XG5cdFx0cmV0dXJuIHRoaXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEl0ZXJhdG9yXG5cdCAqXG5cdCAqIEByZXR1cm4ge3tuZXh0OiAoKGZ1bmN0aW9uKCk6ICh7dmFsdWU6ICosIGRvbmU6IGJvb2xlYW59KSl8Kil9fVxuXHQgKi9cblx0W1N5bWJvbC5pdGVyYXRvcl0oKSB7XG5cdFx0Ly8gVXNlIGEgbmV3IGluZGV4IGZvciBlYWNoIGl0ZXJhdG9yLiBUaGlzIG1ha2VzIG11bHRpcGxlXG5cdFx0Ly8gaXRlcmF0aW9ucyBvdmVyIHRoZSBpdGVyYWJsZSBzYWZlIGZvciBub24tdHJpdmlhbCBjYXNlcyxcblx0XHQvLyBzdWNoIGFzIHVzZSBvZiBicmVhayBvciBuZXN0ZWQgbG9vcGluZyBvdmVyIHRoZSBzYW1lIGl0ZXJhYmxlLlxuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG5leHQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4geyB2YWx1ZTogZW50cmllcz8uW2luZGV4KytdLCBkb25lOiBmYWxzZSB9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7IGRvbmU6IHRydWUgfTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBpdCBjb250YWlucyB0b2tlbiwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqXG5cdCAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy90b2tlbmxpc3QtMi5tanNcblx0ICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGNvbnRhaW5zKHZhbHVlKSB7XG5cdFx0aWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50cmltKCk7XG5cdFx0XHRsZXQgY291bnRlciA9IDA7XG5cdFx0XHR2YWx1ZS5zcGxpdChcIiBcIikuZm9yRWFjaCgodG9rZW4pID0+IHtcblx0XHRcdFx0aWYgKHRoaXMudG9rZW5zLmhhcyh0b2tlbi50cmltKCkpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRjb3VudGVyKys7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBjb3VudGVyID4gMCA/IHRydWUgOiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcblx0XHRcdGxldCBjb3VudGVyID0gMDtcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgdmFsdWUpIHtcblx0XHRcdFx0dmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuXHRcdFx0XHRpZiAodGhpcy50b2tlbnMuaGFzKHRva2VuLnRyaW0oKSkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGNvdW50ZXIrKztcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb3VudGVyID4gMCA/IHRydWUgOiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRva2Vuc1xuXHQgKlxuXHQgKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdG9rZW5saXN0LTMubWpzXG5cdCAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IHZhbHVlXG5cdCAqIEByZXR1cm4ge1Rva2VuTGlzdH1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB2YWx1ZVxuXHQgKi9cblx0YWRkKHZhbHVlKSB7XG5cdFx0aWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdFx0dmFsdWUuc3BsaXQoXCIgXCIpLmZvckVhY2goKHRva2VuKSA9PiB7XG5cdFx0XHRcdHRoaXMudG9rZW5zLmFkZCh0b2tlbi50cmltKCkpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiB2YWx1ZSkge1xuXHRcdFx0XHR2YWxpZGF0ZVN0cmluZyh0b2tlbik7XG5cdFx0XHRcdHRoaXMudG9rZW5zLmFkZCh0b2tlbi50cmltKCkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgdmFsdWVcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogcmVtb3ZlIGFsbCB0b2tlbnNcblx0ICpcblx0ICogQHJldHVybiB7VG9rZW5MaXN0fVxuXHQgKi9cblx0Y2xlYXIoKSB7XG5cdFx0dGhpcy50b2tlbnMuY2xlYXIoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRva2VuXG5cdCAqXG5cdCAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy90b2tlbmxpc3QtNC5tanNcblx0ICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcblx0ICogQHJldHVybiB7VG9rZW5MaXN0fVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHZhbHVlXG5cdCAqL1xuXHRyZW1vdmUodmFsdWUpIHtcblx0XHRpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG5cdFx0XHR2YWx1ZS5zcGxpdChcIiBcIikuZm9yRWFjaCgodG9rZW4pID0+IHtcblx0XHRcdFx0dGhpcy50b2tlbnMuZGVsZXRlKHRva2VuLnRyaW0oKSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHRva2VuIG9mIHZhbHVlKSB7XG5cdFx0XHRcdHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcblx0XHRcdFx0dGhpcy50b2tlbnMuZGVsZXRlKHRva2VuLnRyaW0oKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZVwiLCBcInR5cGVzL3Rva2VubGlzdC5tanNcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogdGhpcyBtZXRob2QgcmVwbGFjZXMgYSB0b2tlbiB3aXRoIGEgbmV3IHRva2VuLlxuXHQgKlxuXHQgKiBpZiB0aGUgcGFzc2VkIHRva2VuIGV4aXN0cywgaXQgaXMgcmVwbGFjZWQgd2l0aCBuZXdUb2tlbiBhbmQgVG9rZW5MaXN0IGlzIHJldHVybmVkLlxuXHQgKiBpZiB0aGUgdG9rZW4gZG9lcyBub3QgZXhpc3QsIG5ld1Rva2VuIGlzIG5vdCBzZXQgYW5kIFRva2VuTGlzdCBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuZXdUb2tlblxuXHQgKiBAcmV0dXJuIHtUb2tlbkxpc3R9XG5cdCAqL1xuXHRyZXBsYWNlKHRva2VuLCBuZXdUb2tlbikge1xuXHRcdHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcblx0XHR2YWxpZGF0ZVN0cmluZyhuZXdUb2tlbik7XG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5zKHRva2VuKSkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYSA9IEFycmF5LmZyb20odGhpcy50b2tlbnMpO1xuXHRcdGNvbnN0IGkgPSBhLmluZGV4T2YodG9rZW4pO1xuXHRcdGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cblx0XHRhLnNwbGljZShpLCAxLCBuZXdUb2tlbik7XG5cdFx0dGhpcy50b2tlbnMgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5hZGQoYSk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRva2VuIGZyb20gc3RyaW5nLiBJZiB0b2tlbiBkb2Vzbid0IGV4aXN0IGl0J3MgYWRkZWQuXG5cdCAqXG5cdCAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy90b2tlbmxpc3QtNS5tanNcblx0ICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB2YWx1ZVxuXHQgKi9cblx0dG9nZ2xlKHZhbHVlKSB7XG5cdFx0aWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdFx0dmFsdWUuc3BsaXQoXCIgXCIpLmZvckVhY2goKHRva2VuKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZVZhbHVlLmNhbGwodGhpcywgdG9rZW4pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiB2YWx1ZSkge1xuXHRcdFx0XHR0b2dnbGVWYWx1ZS5jYWxsKHRoaXMsIHRva2VuKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHZhbHVlXCIsIFwidHlwZXMvdG9rZW5saXN0Lm1qc1wiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIHRva2Vuc1xuXHQgKlxuXHQgKiBAcmV0dXJuIHthcnJheX1cblx0ICovXG5cdGVudHJpZXMoKSB7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy50b2tlbnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggdmFsdWUgb2YgdGhlIHNldFxuXHQgKlxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuXHQgKiBAcmV0dXJuIHtUb2tlbkxpc3R9XG5cdCAqL1xuXHRmb3JFYWNoKGNhbGxiYWNrKSB7XG5cdFx0dmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayk7XG5cdFx0dGhpcy50b2tlbnMuZm9yRWFjaChjYWxsYmFjayk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgaW5kaXZpZHVhbCB0b2tlbnMgc2VwYXJhdGVkIGJ5IGEgYmxhbmsgY2hhcmFjdGVyXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXMoKS5qb2luKFwiIFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gdG9rZW5cbiAqIEByZXR1cm4ge3RvZ2dsZVZhbHVlfVxuICogQHRocm93cyB7RXJyb3J9IG11c3QgYmUgY2FsbGVkIHdpdGggVG9rZW5MaXN0LmNhbGxcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlVmFsdWUodG9rZW4pIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFRva2VuTGlzdCkpXG5cdFx0dGhyb3cgRXJyb3IoXCJtdXN0IGJlIGNhbGxlZCB3aXRoIFRva2VuTGlzdC5jYWxsXCIpO1xuXHR2YWxpZGF0ZVN0cmluZyh0b2tlbik7XG5cdHRva2VuID0gdG9rZW4udHJpbSgpO1xuXHRpZiAodGhpcy5jb250YWlucyh0b2tlbikpIHtcblx0XHR0aGlzLnJlbW92ZSh0b2tlbik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0dGhpcy5hZGQodG9rZW4pO1xuXHRyZXR1cm4gdGhpcztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5leHBvcnQge1xuXHRERUZBVUxUX1RIRU1FLFxuXHRBVFRSSUJVVEVfUFJFRklYLFxuXHRBVFRSSUJVVEVfT1BUSU9OUyxcblx0QVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IsXG5cdEFUVFJJQlVURV9USEVNRV9QUkVGSVgsXG5cdEFUVFJJQlVURV9USEVNRV9OQU1FLFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTLFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJUyxcblx0QVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSxcblx0QVRUUklCVVRFX1VQREFURVJfSU5TRVJULFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlRfUkVGRVJFTkNFLFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9SRU1PVkUsXG5cdEFUVFJJQlVURV9VUERBVEVSX0JJTkQsXG5cdEFUVFJJQlVURV9VUERBVEVSX0JJTkRfVFlQRSxcblx0QVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWCxcblx0QVRUUklCVVRFX1JPTEUsXG5cdEFUVFJJQlVURV9ESVNBQkxFRCxcblx0QVRUUklCVVRFX1ZBTFVFLFxuXHRBVFRSSUJVVEVfT0JKRUNUTElOSyxcblx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0VEFHX1NDUklQVCxcblx0VEFHX1NUWUxFLFxuXHRUQUdfTElOSyxcblx0QVRUUklCVVRFX0lELFxuXHRBVFRSSUJVVEVfQ0xBU1MsXG5cdEFUVFJJQlVURV9USVRMRSxcblx0QVRUUklCVVRFX1NSQyxcblx0QVRUUklCVVRFX0hSRUYsXG5cdEFUVFJJQlVURV9UWVBFLFxuXHRBVFRSSUJVVEVfTk9OQ0UsXG5cdEFUVFJJQlVURV9UUkFOU0xBVEUsXG5cdEFUVFJJQlVURV9UQUJJTkRFWCxcblx0QVRUUklCVVRFX1NQRUxMQ0hFQ0ssXG5cdEFUVFJJQlVURV9TTE9ULFxuXHRBVFRSSUJVVEVfUEFSVCxcblx0QVRUUklCVVRFX0xBTkcsXG5cdEFUVFJJQlVURV9JVEVNVFlQRSxcblx0QVRUUklCVVRFX0lURU1TQ09QRSxcblx0QVRUUklCVVRFX0lURU1SRUYsXG5cdEFUVFJJQlVURV9JVEVNSUQsXG5cdEFUVFJJQlVURV9JVEVNUFJPUCxcblx0QVRUUklCVVRFX0lTLFxuXHRBVFRSSUJVVEVfSU5QVVRNT0RFLFxuXHRBVFRSSUJVVEVfQUNDRVNTS0VZLFxuXHRBVFRSSUJVVEVfQVVUT0NBUElUQUxJWkUsXG5cdEFUVFJJQlVURV9BVVRPRk9DVVMsXG5cdEFUVFJJQlVURV9DT05URU5URURJVEFCTEUsXG5cdEFUVFJJQlVURV9ESVIsXG5cdEFUVFJJQlVURV9EUkFHR0FCTEUsXG5cdEFUVFJJQlVURV9FTlRFUktFWUhJTlQsXG5cdEFUVFJJQlVURV9FWFBPUlRQQVJUUyxcblx0QVRUUklCVVRFX0hJRERFTixcblx0QVRUUklCVVRFX0ZPUk1fQklORCxcblx0QVRUUklCVVRFX0ZPUk1fQklORF9UWVBFLFxuXHRvYmplY3RVcGRhdGVyTGlua1N5bWJvbCxcblx0Y3VzdG9tRWxlbWVudFVwZGF0ZXJMaW5rU3ltYm9sLFxuXHRpbml0Q29udHJvbENhbGxiYWNrTmFtZSxcblx0QVRUUklCVVRFX1NDUklQVF9IT1NULFxuXHRBVFRSSUJVVEVfSU5JVF9DQUxMQkFDSyxcbn07XG5cbi8qKlxuICogZGVmYXVsdCB0aGVtZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVGQVVMVF9USEVNRSA9IFwibW9uc3RlclwiO1xuXG4vKipcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfUFJFRklYID0gXCJkYXRhLW1vbnN0ZXItXCI7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3Mgb3B0aW9ucyB0byBhIGNvbnRyb2xcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX09QVElPTlMgPSBgJHtBVFRSSUJVVEVfUFJFRklYfW9wdGlvbnNgO1xuXG4vKipcbiAqIFRoaXMgaXMgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3MgdGhlIHNjcmlwdCBob3N0IHRvIGEgY29udHJvbFxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDMuNDguMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX1NDUklQVF9IT1NUID0gYCR7QVRUUklCVVRFX1BSRUZJWH1zY3JpcHQtaG9zdGA7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3Mgb3B0aW9ucyB0byBhIGNvbnRyb2xcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMwLjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SID0gYCR7QVRUUklCVVRFX1BSRUZJWH1vcHRpb25zLXNlbGVjdG9yYDtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcGFzcyB0aGUgY2FsbGJhY2sgdG8gYSBjb250cm9sXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy40OC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfSU5JVF9DQUxMQkFDSyA9IGAke0FUVFJJQlVURV9QUkVGSVh9aW5pdC1jYWxsYmFja2A7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgdG8gcGFzcyB0aGUgY2FsbGJhY2sgdG8gYSBjb250cm9sXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy40OC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBpbml0Q29udHJvbENhbGxiYWNrTmFtZSA9IGBpbml0Q3VzdG9tQ29udHJvbENhbGxiYWNrYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RIRU1FX1BSRUZJWCA9IGAke0FUVFJJQlVURV9QUkVGSVh9dGhlbWUtYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfVEhFTUVfTkFNRSA9IGAke0FUVFJJQlVURV9USEVNRV9QUkVGSVh9bmFtZWA7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMgPSBgJHtBVFRSSUJVVEVfUFJFRklYfWF0dHJpYnV0ZXNgO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI3LjFcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfU0VMRUNUX1RISVMgPSBgJHtBVFRSSUJVVEVfUFJFRklYfXNlbGVjdC10aGlzYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9cmVwbGFjZWA7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVCA9IGAke0FUVFJJQlVURV9QUkVGSVh9aW5zZXJ0YDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9aW5zZXJ0LXJlZmVyZW5jZWA7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX1JFTU9WRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9cmVtb3ZlYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfQklORCA9IGAke0FUVFJJQlVURV9QUkVGSVh9YmluZGA7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX0JJTkRfVFlQRSA9IGAke0FUVFJJQlVURV9VUERBVEVSX0JJTkR9LXR5cGVgO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBkZXByZWNhdGVkIHNpbmNlIDIwMjQtMTItMjlcbiAqIEBzaW5jZSAzLjczLjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0ZPUk1fQklORCA9IGAke0FUVFJJQlVURV9QUkVGSVh9Zm9ybS1iaW5kYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy43My4wXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSAyMDI0LTEyLTI5XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9GT1JNX0JJTkRfVFlQRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9Zm9ybS1iaW5kLXR5cGVgO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI3LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWCA9IGAke0FUVFJJQlVURV9QUkVGSVh9dGVtcGxhdGUtcHJlZml4YDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9ST0xFID0gYCR7QVRUUklCVVRFX1BSRUZJWH1yb2xlYDtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9ESVNBQkxFRCA9IFwiZGlzYWJsZWRcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9WQUxVRSA9IFwidmFsdWVcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX09CSkVDVExJTksgPSBgJHtBVFRSSUJVVEVfUFJFRklYfW9iamVjdGxpbmtgO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0VSUk9STUVTU0FHRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9ZXJyb3JgO1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3Qgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2wgPSBTeW1ib2wuZm9yKFxuXHRcIkBzY2h1a2FpL21vbnN0ZXIvZG9tL0BAb2JqZWN0LXVwZGF0ZXItbGlua1wiLFxuKTtcblxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNC4wXG4gKi9cbmNvbnN0IGN1c3RvbUVsZW1lbnRVcGRhdGVyTGlua1N5bWJvbCA9IFN5bWJvbC5mb3IoXG5cdFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vY3VzdG9tLWVsZW1lbnRAQG9wdGlvbnMtdXBkYXRlci1saW5rXCIsXG4pO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgVEFHX1NDUklQVCA9IFwic2NyaXB0XCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfU1RZTEUgPSBcInN0eWxlXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfTElOSyA9IFwibGlua1wiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuXG5jb25zdCBBVFRSSUJVVEVfSUQgPSBcImlkXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5cbmNvbnN0IEFUVFJJQlVURV9DTEFTUyA9IFwiY2xhc3NcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9USVRMRSA9IFwidGl0bGVcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9TUkMgPSBcInNyY1wiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9IUkVGID0gXCJocmVmXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVFlQRSA9IFwidHlwZVwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX05PTkNFID0gXCJub25jZVwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RSQU5TTEFURSA9IFwidHJhbnNsYXRlXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVEFCSU5ERVggPSBcInRhYmluZGV4XCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfU1BFTExDSEVDSyA9IFwic3BlbGxjaGVja1wiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1NMT1QgPSBcInNsb3RcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gXCJwYXJ0XCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfTEFORyA9IFwibGFuZ1wiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1UWVBFID0gXCJpdGVtdHlwZVwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1TQ09QRSA9IFwiaXRlbXNjb3BlXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVRFTVJFRiA9IFwiaXRlbXJlZlwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1JRCA9IFwiaXRlbWlkXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVRFTVBST1AgPSBcIml0ZW1wcm9wXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVMgPSBcImlzXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSU5QVVRNT0RFID0gXCJpbnB1dG1vZGVcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9BQ0NFU1NLRVkgPSBcImFjY2Vzc2tleVwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0FVVE9DQVBJVEFMSVpFID0gXCJhdXRvY2FwaXRhbGl6ZVwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0FVVE9GT0NVUyA9IFwiYXV0b2ZvY3VzXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfQ09OVEVOVEVESVRBQkxFID0gXCJjb250ZW50ZWRpdGFibGVcIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9ESVIgPSBcImRpclwiO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0RSQUdHQUJMRSA9IFwiZHJhZ2dhYmxlXCI7XG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRU5URVJLRVlISU5UID0gXCJlbnRlcmtleWhpbnRcIjtcbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRVhQT1JUUEFSVFMgPSBcImV4cG9ydHBhcnRzXCI7XG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0hJRERFTiA9IFwiaGlkZGVuXCI7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgZ2V0R2xvYmFsRnVuY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHsgVG9rZW5MaXN0IH0gZnJvbSBcIi4uL3R5cGVzL3Rva2VubGlzdC5tanNcIjtcbmltcG9ydCB7XG5cdHZhbGlkYXRlSW5zdGFuY2UsXG5cdHZhbGlkYXRlU3RyaW5nLFxuXHR2YWxpZGF0ZVN5bWJvbCxcbn0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX09CSkVDVExJTksgfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7XG5cdGZpbmRDbG9zZXN0T2JqZWN0TGluayxcblx0YWRkVG9PYmplY3RMaW5rLFxuXHRyZW1vdmVPYmplY3RMaW5rLFxuXHRoYXNPYmplY3RMaW5rLFxuXHRnZXRMaW5rZWRPYmplY3RzLFxuXHR0b2dnbGVBdHRyaWJ1dGVUb2tlbixcblx0YWRkQXR0cmlidXRlVG9rZW4sXG5cdHJlbW92ZUF0dHJpYnV0ZVRva2VuLFxuXHRjb250YWluc0F0dHJpYnV0ZVRva2VuLFxuXHRyZXBsYWNlQXR0cmlidXRlVG9rZW4sXG5cdGNsZWFyQXR0cmlidXRlVG9rZW5zLFxuXHRmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlLFxuXHRmaW5kQ2xvc2VzdEJ5Q2xhc3MsXG59O1xuXG4vKipcbiAqIEdldCB0aGUgY2xvc2VzdCBvYmplY3QgbGluayBvZiBhIG5vZGVcbiAqXG4gKiBpZiBhIG5vZGUgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYSBvYmplY3QgbGluaywgYSByZWN1cnNpdmUgc2VhcmNoIHVwd2FyZHMgaXMgcGVyZm9ybWVkIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvYmplY3QgbGluayBpcyBmb3VuZCwgb3IgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fHVuZGVmaW5lZH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0T2JqZWN0TGluayhlbGVtZW50KSB7XG5cdHJldHVybiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGVsZW1lbnQsIEFUVFJJQlVURV9PQkpFQ1RMSU5LKTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgY2xhc3MgYXR0cmlidXRlIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0gZWxlbWVudFxuICogQHBhcmFtIHN5bWJvbFxuICogQHBhcmFtIG9iamVjdFxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gYWRkVG9PYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCwgb2JqZWN0KSB7XG5cdHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuXHR2YWxpZGF0ZVN5bWJvbChzeW1ib2wpO1xuXG5cdGlmIChlbGVtZW50Py5bc3ltYm9sXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0ZWxlbWVudFtzeW1ib2xdID0gbmV3IFNldCgpO1xuXHR9XG5cblx0YWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgQVRUUklCVVRFX09CSkVDVExJTkssIHN5bWJvbC50b1N0cmluZygpKTtcblx0ZWxlbWVudFtzeW1ib2xdLmFkZChvYmplY3QpO1xuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFuIG9iamVjdCBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU9iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSB7XG5cdHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuXHR2YWxpZGF0ZVN5bWJvbChzeW1ib2wpO1xuXG5cdGlmIChlbGVtZW50Py5bc3ltYm9sXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdH1cblxuXHRyZW1vdmVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBBVFRSSUJVVEVfT0JKRUNUTElOSywgc3ltYm9sLnRvU3RyaW5nKCkpO1xuXHRkZWxldGUgZWxlbWVudFtzeW1ib2xdO1xuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZWxlbWVudCBoYXMgYW4gb2JqZWN0IGxpbmtcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSB7XG5cdHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuXHR2YWxpZGF0ZVN5bWJvbChzeW1ib2wpO1xuXG5cdGlmIChlbGVtZW50Py5bc3ltYm9sXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oXG5cdFx0ZWxlbWVudCxcblx0XHRBVFRSSUJVVEVfT0JKRUNUTElOSyxcblx0XHRzeW1ib2wudG9TdHJpbmcoKSxcblx0KTtcbn1cblxuLyoqXG4gKiBUaGUgT2JqZWN0TGluayBjYW4gYmUgdXNlZCB0byBhdHRhY2ggb2JqZWN0cyB0byBIVE1MRWxlbWVudHMuIFRoZSBlbGVtZW50cyBhcmUga2VwdCBpbiBhIHNldCB1bmRlciBhIHVuaXF1ZVxuICogc3ltYm9sIGFuZCBjYW4gYmUgcmVhZCB2aWEgYW4gaXRlcmF0b3Ige0BzZWUge0BsaW5rIGdldExpbmtlZE9iamVjdHN9fS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgZWxlbWVudHMgd2l0aCBhbiBvYmplY3RMaW5rIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9iamVjdGxpbmtgLlxuICpcbiAqIFdpdGggdGhlIG1ldGhvZCAge0BzZWUge0BsaW5rIGFkZFRvT2JqZWN0TGlua319IHRoZSBvYmplY3RzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICogQHRocm93cyB7RXJyb3J9IHRoZXJlIGlzIG5vIG9iamVjdCBsaW5rIGZvciBzeW1ib2xcbiAqL1xuZnVuY3Rpb24gZ2V0TGlua2VkT2JqZWN0cyhlbGVtZW50LCBzeW1ib2wpIHtcblx0dmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG5cdHZhbGlkYXRlU3ltYm9sKHN5bWJvbCk7XG5cblx0aWYgKGVsZW1lbnQ/LltzeW1ib2xdID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHRoZXJlIGlzIG5vIG9iamVjdCBsaW5rIGZvciAke3N5bWJvbC50b1N0cmluZygpfWApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnQ/LltzeW1ib2xdW1N5bWJvbC5pdGVyYXRvcl0oKTtcbn1cblxuLyoqXG4gKiBXaXRoIHRoaXMgbWV0aG9kIHRva2VucyBpbiBhbiBhdHRyaWJ1dGUgY2FuIGJlIHN3aXRjaGVkIG9uIG9yIG9mZi4gRm9yIGV4YW1wbGUsIGNsYXNzZXMgY2FuIGJlIHN3aXRjaGVkIG9uIGFuZCBvZmYgaW4gdGhlIGVsZW1lbnRzIGNsYXNzIGF0dHJpYnV0ZS5cbiAqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdG9rZW4pIHtcblx0dmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG5cdHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcblx0dmFsaWRhdGVTdHJpbmcoa2V5KTtcblxuXHRpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcblx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHRva2VuKTtcblx0XHRyZXR1cm4gZWxlbWVudDtcblx0fVxuXG5cdGVsZW1lbnQuc2V0QXR0cmlidXRlKFxuXHRcdGtleSxcblx0XHRuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnRvZ2dsZSh0b2tlbikudG9TdHJpbmcoKSxcblx0KTtcblxuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhZGQgYSB0b2tlbiB0byBhbiBhdHRyaWJ1dGUuIFRva2VucyBhcmUgYWx3YXlzIHNlcGFyYXRlZCBieSBhIHNwYWNlLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gYWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB0b2tlbikge1xuXHR2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcblx0dmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuXHR2YWxpZGF0ZVN0cmluZyhrZXkpO1xuXG5cdGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdG9rZW4pO1xuXHRcdHJldHVybiBlbGVtZW50O1xuXHR9XG5cblx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoXG5cdFx0a2V5LFxuXHRcdG5ldyBUb2tlbkxpc3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KSkuYWRkKHRva2VuKS50b1N0cmluZygpLFxuXHQpO1xuXG5cdHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRva2VucyBmcm9tIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdG9rZW4pIHtcblx0dmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG5cdHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcblx0dmFsaWRhdGVTdHJpbmcoa2V5KTtcblxuXHRpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcblx0XHRyZXR1cm4gZWxlbWVudDtcblx0fVxuXG5cdGVsZW1lbnQuc2V0QXR0cmlidXRlKFxuXHRcdGtleSxcblx0XHRuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnJlbW92ZSh0b2tlbikudG9TdHJpbmcoKSxcblx0KTtcblxuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhdHRyaWJ1dGUgaGFzIGEgdG9rZW4uXG4gKlxuICogVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB0b2tlbikge1xuXHR2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcblx0dmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuXHR2YWxpZGF0ZVN0cmluZyhrZXkpO1xuXG5cdGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLmNvbnRhaW5zKHRva2VuKTtcbn1cblxuLyoqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiByZXBsYWNlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCBmcm9tLCB0bykge1xuXHR2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcblx0dmFsaWRhdGVTdHJpbmcoZnJvbSk7XG5cdHZhbGlkYXRlU3RyaW5nKHRvKTtcblx0dmFsaWRhdGVTdHJpbmcoa2V5KTtcblxuXHRpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcblx0XHRyZXR1cm4gZWxlbWVudDtcblx0fVxuXG5cdGVsZW1lbnQuc2V0QXR0cmlidXRlKFxuXHRcdGtleSxcblx0XHRuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnJlcGxhY2UoZnJvbSwgdG8pLnRvU3RyaW5nKCksXG5cdCk7XG5cblx0cmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVUb2tlbnMoZWxlbWVudCwga2V5KSB7XG5cdHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuXHR2YWxpZGF0ZVN0cmluZyhrZXkpO1xuXG5cdGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuXHRcdHJldHVybiBlbGVtZW50O1xuXHR9XG5cblx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBcIlwiKTtcblxuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzLCBzdGFydGluZyBmcm9tIGFuIGBIVE1MRWxlbWVtZW50YCwgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCBoYXMgYSBjZXJ0YWluIGF0dHJpYnV0ZS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGRhdGEtbXktYXR0cmlidXRlPVwiMlwiIGlkPVwiMlwiPlxuICogICAgIDxkaXYgaWQ9XCIxXCI+PC9kaXY+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCAodW5kZWZpbmVkKSwgdGhlbiBvbmx5IHRoZSBhdHRyaWJ1dGUgaXMgY2hlY2tlZC5cbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnZGF0YS1teS1hdHRyaWJ1dGUnKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcyJyksJ2RhdGEtbXktYXR0cmlidXRlJyk7IC8vIFx1MjFBNiBub2RlIHdpdGggaWQgMlxuICpcbiAqIC8vIGlmIGEgdmFsdWUgaXMgc3BlY2lmaWVkLCBmb3IgZXhhbXBsZSBhbiBlbXB0eSBzdHJpbmcsIHRoZW4gdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBhcmUgY2hlY2tlZC5cbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnZGF0YS1teS1hdHRyaWJ1dGUnLCAnJyk7ICAvLyBcdTIxQTYgdW5kZWZpbmVkXG4gKiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcxJyksJ2RhdGEtbXktYXR0cmlidXRlJywgJzInKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKiBgYGBcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHx1bmRlZmluZWR9XG4gKiBAc3VtbWFyeSBmaW5kIGNsb3Nlc3Qgbm9kZVxuICovXG5mdW5jdGlvbiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcblx0dmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBnZXRHbG9iYWxGdW5jdGlvbihcIkhUTUxFbGVtZW50XCIpKTtcblxuXHRpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZWxlbWVudDtcblx0XHR9XG5cblx0XHRpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KSA9PT0gdmFsdWUpIHtcblx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdH1cblx0fVxuXG5cdGxldCBzZWxlY3RvciA9IHZhbGlkYXRlU3RyaW5nKGtleSk7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZWxlY3RvciArPSBgPSR7dmFsaWRhdGVTdHJpbmcodmFsdWUpfWA7XG5cdGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQuY2xvc2VzdChgWyR7c2VsZWN0b3J9XWApO1xuXHRpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcywgc3RhcnRpbmcgZnJvbSBhbiBgSFRNTEVsZW1lbnRgLCBmb3IgdGhlIG5leHQgZWxlbWVudCB0aGF0IGhhcyBhIGNlcnRhaW4gYXR0cmlidXRlLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgY2xhc3M9XCJteWNsYXNzXCIgaWQ9XCIyXCI+XG4gKiAgICAgPGRpdiBpZD1cIjFcIj48L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkICh1bmRlZmluZWQpLCB0aGVuIG9ubHkgdGhlIGF0dHJpYnV0ZSBpcyBjaGVja2VkLlxuICogZmluZENsb3Nlc3RCeUNsYXNzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcxJyksJ215Y2xhc3MnKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKiBmaW5kQ2xvc2VzdEJ5Q2xhc3MoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzInKSwnbXljbGFzcycpOyAvLyBcdTIxQTYgbm9kZSB3aXRoIGlkIDJcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2ZpbmRDbG9zZXN0QnlDbGFzc30gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvZG9tL2F0dHJpYnV0ZXMubWpzJztcbiAqIGZpbmRDbG9zZXN0QnlDbGFzcygpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI3LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHx1bmRlZmluZWR9XG4gKiBAc3VtbWFyeSBmaW5kIGNsb3Nlc3Qgbm9kZVxuICovXG5mdW5jdGlvbiBmaW5kQ2xvc2VzdEJ5Q2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG5cdHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgZ2V0R2xvYmFsRnVuY3Rpb24oXCJIVE1MRWxlbWVudFwiKSk7XG5cblx0aWYgKGVsZW1lbnQ/LmNsYXNzTGlzdD8uY29udGFpbnModmFsaWRhdGVTdHJpbmcoY2xhc3NOYW1lKSkpIHtcblx0XHRyZXR1cm4gZWxlbWVudDtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQuY2xvc2VzdChgLiR7Y2xhc3NOYW1lfWApO1xuXHRpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7XG5cdGdldERvY3VtZW50LFxuXHRnZXRXaW5kb3csXG5cdGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nLFxuXHRmaW5kRWxlbWVudFdpdGhJZFVwd2FyZHMsXG5cdGdldENvbnRhaW5pbmdEb2N1bWVudCxcblx0Z2V0UmVnaXN0ZXJlZEN1c3RvbUVsZW1lbnRzLFxuXHRmaW5kRWxlbWVudFdpdGhTZWxlY3RvclVwd2FyZHMsXG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGRvY3VtZW50IG9iamVjdFxuICpcbiAqIEluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybiB7b2JqZWN0fVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcblx0Y29uc3QgZG9jdW1lbnQgPSBnZXRHbG9iYWwoKT8uW1wiZG9jdW1lbnRcIl07XG5cdGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwib2JqZWN0XCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3VwcG9ydGVkIGVudmlyb25tZW50XCIpO1xuXHR9XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIHdpbmRvdyBvYmplY3RcbiAqXG4gKiBJbiBub2RlanMgdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBwZXJmb3JtZWQgd2l0aCBbanNkb21dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2pzZG9tKS5cbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7SlNET019IGZyb20gXCJqc2RvbVwiXG4gKiBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJvYmplY3RcIikge1xuICogICAgY29uc3Qge3dpbmRvd30gPSBuZXcgSlNET00oJycsIHtcbiAqICAgICAgICB1cmw6ICdodHRwOi8vZXhhbXBsZS5jb20vJyxcbiAqICAgICAgICBwcmV0ZW5kVG9CZVZpc3VhbDogdHJ1ZVxuICogICAgfSk7XG4gKlxuICogICAgZ2V0R2xvYmFsKClbJ3dpbmRvdyddPXdpbmRvdztcbiAqXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybiB7b2JqZWN0fVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coKSB7XG5cdGNvbnN0IHdpbmRvdyA9IGdldEdsb2JhbCgpPy5bXCJ3aW5kb3dcIl07XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFwiKTtcblx0fVxuXG5cdHJldHVybiB3aW5kb3c7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgZG9jdW1lbnQgb2JqZWN0XG4gKlxuICogSW4gbm9kZWpzIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcGVyZm9ybWVkIHdpdGggW2pzZG9tXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9qc2RvbSkuXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0pTRE9NfSBmcm9tIFwianNkb21cIlxuICogaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwib2JqZWN0XCIpIHtcbiAqICAgIGNvbnN0IHt3aW5kb3d9ID0gbmV3IEpTRE9NKCcnLCB7XG4gKiAgICAgICAgdXJsOiAnaHR0cDovL2V4YW1wbGUuY29tLycsXG4gKiAgICAgICAgcHJldGVuZFRvQmVWaXN1YWw6IHRydWVcbiAqICAgIH0pO1xuICpcbiAqICAgIFtcbiAqICAgICAgICAnc2VsZicsXG4gKiAgICAgICAgJ2RvY3VtZW50JyxcbiAqICAgICAgICAnRG9jdW1lbnQnLFxuICogICAgICAgICdOb2RlJyxcbiAqICAgICAgICAnRWxlbWVudCcsXG4gKiAgICAgICAgJ0hUTUxFbGVtZW50JyxcbiAqICAgICAgICAnRG9jdW1lbnRGcmFnbWVudCcsXG4gKiAgICAgICAgJ0RPTVBhcnNlcicsXG4gKiAgICAgICAgJ1hNTFNlcmlhbGl6ZXInLFxuICogICAgICAgICdOb2RlRmlsdGVyJyxcbiAqICAgICAgICAnSW5wdXRFdmVudCcsXG4gKiAgICAgICAgJ0N1c3RvbUV2ZW50J1xuICogICAgXS5mb3JFYWNoKGtleSA9PiAoZ2V0R2xvYmFsKClba2V5XSA9IHdpbmRvd1trZXldKSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtEb2N1bWVudEZyYWdtZW50fVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmcoaHRtbCkge1xuXHR2YWxpZGF0ZVN0cmluZyhodG1sKTtcblxuXHRjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cdGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXHR0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG5cdHJldHVybiB0ZW1wbGF0ZS5jb250ZW50O1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIHVwd2FyZHMgZnJvbSBhIGdpdmVuIGVsZW1lbnQgdG8gZmluZCBhbiBhbmNlc3RvciBlbGVtZW50XG4gKiB3aXRoIGEgc3BlY2lmaWVkIElELCBjb25zaWRlcmluZyBib3RoIG5vcm1hbCBET00gYW5kIHNoYWRvdyBET00uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxTaGFkb3dSb290fSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnQgb3Igc2hhZG93IHJvb3QgdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0SWQgLSBUaGUgSUQgb2YgdGhlIHRhcmdldCBlbGVtZW50IHRvIGZpbmQuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfSAtIFRoZSBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gKiBAc2luY2UgMy4yOS4wXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmZ1bmN0aW9uIGZpbmRFbGVtZW50V2l0aElkVXB3YXJkcyhlbGVtZW50LCB0YXJnZXRJZCkge1xuXHRpZiAoIWVsZW1lbnQpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaGFzIHRoZSB0YXJnZXQgSURcblx0aWYgKGVsZW1lbnQuaWQgPT09IHRhcmdldElkKSB7XG5cdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdH1cblxuXHQvLyBTZWFyY2ggd2l0aGluIHRoZSBjdXJyZW50IGVsZW1lbnQncyBzaGFkb3cgcm9vdCwgaWYgaXQgZXhpc3RzXG5cdGlmIChlbGVtZW50LnNoYWRvd1Jvb3QpIHtcblx0XHRjb25zdCB0YXJnZXQgPSBlbGVtZW50LnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpO1xuXHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyB0aGUgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBzZWFyY2ggd2l0aGluIHRoZSBtYWluIGRvY3VtZW50XG5cdGlmIChlbGVtZW50ID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZWxlbWVudCA9PT0gZG9jdW1lbnQpIHtcblx0XHRjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCk7XG5cdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0cmV0dXJuIHRhcmdldDtcblx0XHR9XG5cdH1cblxuXHQvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGluc2lkZSBhIHNoYWRvdyByb290LCBzZWFyY2ggaXRzIGhvc3QncyBhbmNlc3RvcnNcblx0Y29uc3Qgcm9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG5cdGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcblx0XHRyZXR1cm4gZmluZEVsZW1lbnRXaXRoSWRVcHdhcmRzKHJvb3ROb2RlLmhvc3QsIHRhcmdldElkKTtcblx0fVxuXG5cdC8vIE90aGVyd2lzZSwgc2VhcmNoIHRoZSBjdXJyZW50IGVsZW1lbnQncyBwYXJlbnRcblx0cmV0dXJuIGZpbmRFbGVtZW50V2l0aElkVXB3YXJkcyhlbGVtZW50LnBhcmVudEVsZW1lbnQsIHRhcmdldElkKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBzZWFyY2hlcyB1cHdhcmRzIGZyb20gYSBnaXZlbiBlbGVtZW50IHRvIGZpbmQgYW4gYW5jZXN0b3IgZWxlbWVudFxuICogd2l0aCBhIHNwZWNpZmllZCBzZWxlY3RvciwgY29uc2lkZXJpbmcgYm90aCBub3JtYWwgRE9NIGFuZCBzaGFkb3cgRE9NLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBmaW5kaW5nIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8U2hhZG93Um9vdH0gZWxlbWVudCAtIFRoZSBzdGFydGluZyBlbGVtZW50IG9yIHNoYWRvdyByb290IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIG9mIHRoZSB0YXJnZXQgZWxlbWVudCB0byBmaW5kLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH0gLSBUaGUgYW5jZXN0b3IgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICogQHNpbmNlIDMuNTUuMFxuICovXG5mdW5jdGlvbiBmaW5kRWxlbWVudFdpdGhTZWxlY3RvclVwd2FyZHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcblx0aWYgKCFlbGVtZW50IHx8ICFzZWxlY3Rvcikge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU2VhcmNoIHdpdGhpbiB0aGUgY3VycmVudCBlbGVtZW50J3Mgc2hhZG93IHJvb3QsIGlmIGl0IGV4aXN0c1xuXHRpZiAoZWxlbWVudC5zaGFkb3dSb290KSB7XG5cdFx0Y29uc3QgdGFyZ2V0ID0gZWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGVsZW1lbnQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuXHRcdGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBpbnNpZGUgYSBzaGFkb3cgcm9vdCwgc2VhcmNoIGl0cyBob3N0J3MgYW5jZXN0b3JzXG5cdGNvbnN0IHJvb3ROb2RlID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuXHRpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG5cdFx0cmV0dXJuIGZpbmRFbGVtZW50V2l0aFNlbGVjdG9yVXB3YXJkcyhyb290Tm9kZS5ob3N0LCBzZWxlY3Rvcik7XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIHNlYXJjaCB0aGUgY3VycmVudCBlbGVtZW50J3MgcGFyZW50XG5cdHJldHVybiBmaW5kRWxlbWVudFdpdGhTZWxlY3RvclVwd2FyZHMoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBzZWxlY3Rvcik7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlU2hhZG93Um9vdHMoZWxlbWVudCkge1xuXHRsZXQgY3VycmVudFJvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3Q7XG5cdGxldCBjdXJyZW50UGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXG5cdHdoaWxlIChcblx0XHRjdXJyZW50UGFyZW50ICYmXG5cdFx0Y3VycmVudFBhcmVudC5ub2RlVHlwZSAhPT0gTm9kZS5ET0NVTUVOVF9OT0RFICYmXG5cdFx0Y3VycmVudFBhcmVudC5ub2RlVHlwZSAhPT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFXG5cdCkge1xuXHRcdGlmIChjdXJyZW50Um9vdCAmJiBjdXJyZW50Um9vdC5wYXJlbnROb2RlKSB7XG5cdFx0XHRjdXJyZW50UGFyZW50ID0gY3VycmVudFJvb3QucGFyZW50Tm9kZTtcblx0XHRcdGN1cnJlbnRSb290ID0gY3VycmVudFBhcmVudC5zaGFkb3dSb290O1xuXHRcdH0gZWxzZSBpZiAoY3VycmVudFBhcmVudC5wYXJlbnROb2RlKSB7XG5cdFx0XHRjdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0Y3VycmVudFJvb3QgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRjdXJyZW50Um9vdCAmJlxuXHRcdFx0Y3VycmVudFJvb3QuaG9zdCAmJlxuXHRcdFx0Y3VycmVudFJvb3QuaG9zdC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdFx0KSB7XG5cdFx0XHRjdXJyZW50UGFyZW50ID0gY3VycmVudFJvb3QuaG9zdDtcblx0XHRcdGN1cnJlbnRSb290ID0gbnVsbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VycmVudFBhcmVudCA9IG51bGw7XG5cdFx0XHRjdXJyZW50Um9vdCA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRQYXJlbnQ7XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgc2VhcmNoZXMgdXB3YXJkcyBmcm9tIGEgZ2l2ZW4gZWxlbWVudCB0byBmaW5kIGFuIGFuY2VzdG9yIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHsqfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgYXJndW1lbnQuIEV4cGVjdGVkIGFuIEhUTUxFbGVtZW50LlxuICogQHNpbmNlIDMuMzYuMFxuICovXG5mdW5jdGlvbiBnZXRDb250YWluaW5nRG9jdW1lbnQoZWxlbWVudCkge1xuXHRpZiAoXG5cdFx0IWVsZW1lbnQgfHxcblx0XHQhKFxuXHRcdFx0ZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG5cdFx0XHRlbGVtZW50IGluc3RhbmNlb2YgZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LkhUTUxFbGVtZW50XG5cdFx0KVxuXHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50LiBFeHBlY3RlZCBhbiBIVE1MRWxlbWVudC5cIik7XG5cdH1cblxuXHRyZXR1cm4gdHJhdmVyc2VTaGFkb3dSb290cyhlbGVtZW50KSB8fCBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGN1c3RvbSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBkb2N1bWVudC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqIEBzaW5jZSA0LjAuMFxuICogQHJldHVybiB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRDdXN0b21FbGVtZW50cygpIHtcblx0Y29uc3QgY3VzdG9tRWxlbWVudFRhZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpKVxuXHRcdC5tYXAoKHRhZykgPT4gdGFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcblx0XHQuZmlsdGVyKCh0YWdOYW1lKSA9PiB0YWdOYW1lLmluY2x1ZGVzKFwiLVwiKSAmJiBjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpO1xuXG5cdHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoY3VzdG9tRWxlbWVudFRhZ3MpKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtcblx0aXNBcnJheSxcblx0aXNGdW5jdGlvbixcblx0aXNPYmplY3QsXG5cdGlzUHJpbWl0aXZlLFxuXHRpc1Byb3h5LFxufSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB0eXBlT2YgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZW9mLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IGNsb25lIH07XG5cbi8qKlxuICogV2l0aCB0aGlzIGZ1bmN0aW9uLCBvYmplY3RzIGNhbiBiZSBjbG9uZWQuXG4gKiBUaGUgZW50aXJlIG9iamVjdCB0cmVlIGlzIHJ1biB0aHJvdWdoLlxuICpcbiAqIFByb3h5LCBFbGVtZW50LCBIVE1MRG9jdW1lbnQgYW5kIERvY3VtZW50RnJhZ21lbnQgaW5zdGFuY2VzIGFyZSBub3QgY2xvbmVkLlxuICogR2xvYmFsIG9iamVjdHMgc3VjaCBhcyB3aW5kb3dzIGFyZSBhbHNvIG5vdCBjbG9uZWQsXG4gKlxuICogSWYgYW4gb2JqZWN0IGhhcyBhIG1ldGhvZCBgZ2V0Q2xvbmUoKWAsIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbG9uZS5cbiAqXG4gKiBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5hYmxlIHRvIGNsb25lIG9iaiEgaXRzIHR5cGUgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBjbG9uZShvYmopIHtcblx0Ly8gdHlwZW9mIG51bGwgcmVzdWx0cyBpbiAnb2JqZWN0Jy4gIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDEzLzEwL3R5cGVvZi1udWxsLmh0bWxcblx0aWYgKG51bGwgPT09IG9iaikge1xuXHRcdHJldHVybiBvYmo7XG5cdH1cblxuXHQvLyBIYW5kbGUgdGhlIHR3byBzaW1wbGUgdHlwZXMsIG51bGwgYW5kIHVuZGVmaW5lZFxuXHRpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuXHRcdHJldHVybiBvYmo7XG5cdH1cblxuXHQvLyBIYW5kbGUgdGhlIHR3byBzaW1wbGUgdHlwZXMsIG51bGwgYW5kIHVuZGVmaW5lZFxuXHRpZiAoaXNGdW5jdGlvbihvYmopKSB7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXG5cdC8vIEhhbmRsZSBBcnJheVxuXHRpZiAoaXNBcnJheShvYmopKSB7XG5cdFx0Y29uc3QgY29weSA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBvYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvcHlbaV0gPSBjbG9uZShvYmpbaV0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb3B5O1xuXHR9XG5cblx0aWYgKGlzT2JqZWN0KG9iaikpIHtcblx0XHQvLyBIYW5kbGUgRGF0ZVxuXHRcdGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRjb25zdCBjb3B5ID0gbmV3IERhdGUoKTtcblx0XHRcdGNvcHkuc2V0VGltZShvYmouZ2V0VGltZSgpKTtcblx0XHRcdHJldHVybiBjb3B5O1xuXHRcdH1cblxuXHRcdC8qKiBEbyBub3QgY2xvbmUgRE9NIG5vZGVzICovXG5cdFx0aWYgKHR5cGVvZiBFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBvYmo7XG5cdFx0aWYgKHR5cGVvZiBEb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvYmogaW5zdGFuY2VvZiBEb2N1bWVudCkgcmV0dXJuIG9iajtcblx0XHRpZiAoXG5cdFx0XHR0eXBlb2YgRG9jdW1lbnRGcmFnbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0b2JqIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudFxuXHRcdClcblx0XHRcdHJldHVybiBvYmo7XG5cblx0XHQvKiogRG8gbm90IGNsb25lIGdsb2JhbCBvYmplY3RzICovXG5cdFx0aWYgKG9iaiA9PT0gZ2V0R2xvYmFsKCkpIHJldHVybiBvYmo7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgb2JqID09PSB3aW5kb3cpIHJldHVybiBvYmo7XG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvYmogPT09IGRvY3VtZW50KSByZXR1cm4gb2JqO1xuXHRcdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG9iaiA9PT0gbmF2aWdhdG9yKSByZXR1cm4gb2JqO1xuXHRcdGlmICh0eXBlb2YgSlNPTiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvYmogPT09IEpTT04pIHJldHVybiBvYmo7XG5cdFx0aWYgKGlzUHJveHkob2JqKSkgcmV0dXJuIG9iajsgLy8gSGFuZGxlIFByb3h5LU9iamVjdFxuXHRcdHJldHVybiBjbG9uZU9iamVjdChvYmopO1xuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGNsb25lIG9iaiEgaXRzIHR5cGUgaXNuJ3Qgc3VwcG9ydGVkLlwiKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xvbmVPYmplY3Qob2JqKSB7XG5cdHZhbGlkYXRlT2JqZWN0KG9iaik7XG5cblx0Y29uc3QgZmt0ID0gb2JqPy5bXCJjb25zdHJ1Y3RvclwiXTtcblxuXHQvKiogT2JqZWN0IGhhcyBjbG9uZSBtZXRob2QgKi9cblx0aWYgKHR5cGVPZihma3QpID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRjb25zdCBwcm90b3R5cGUgPSBma3Q/LnByb3RvdHlwZTtcblx0XHRpZiAodHlwZW9mIHByb3RvdHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJnZXRDbG9uZVwiKSAmJlxuXHRcdFx0XHR0eXBlT2Yob2JqLmdldENsb25lKSA9PT0gXCJmdW5jdGlvblwiXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIG9iai5nZXRDbG9uZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGxldCBjb3B5ID0ge307XG5cdGlmIChcblx0XHR0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmNhbGwgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0XHRjb3B5ID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpO1xuXHR9XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKGlzUHJpbWl0aXZlKG9ialtrZXldKSkge1xuXHRcdFx0Y29weVtrZXldID0gb2JqW2tleV07XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb3B5W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG5cdH1cblxuXHRyZXR1cm4gY29weTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IGNsb25lIH0gZnJvbSBcIi4uL3V0aWwvY2xvbmUubWpzXCI7XG5cbmV4cG9ydCB7IExvY2FsZSwgcGFyc2VMb2NhbGUgfTtcblxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBwcm9wZXJ0aWVzU3ltYm9sID0gU3ltYm9sKFwicHJvcGVydGllc1wiKTtcblxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBsb2NhbGVTdHJpbmdTeW1ib2wgPSBTeW1ib2woXCJsb2NhbGVTdHJpbmdcIik7XG5cbi8qKlxuICogVGhlIExvY2FsZSBjbGFzcyBpcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBsYW5ndWFnZSBjbGFzc2VzLlxuICpcbiAqIFJGQ1xuICpcbiAqIGBgYFxuICogQSBMYW5ndWFnZS1UYWcgY29uc2lzdHMgb2Y6XG4gKiBsYW5ndGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBnZW5lcmF0ZWQgdGFnXG4gKiAgICAgICAgICAgLW9yLSBwcml2YXRlLXVzZSAgICAgICAgOyBhIHByaXZhdGUgdXNlIHRhZ1xuICpcbiAqIGxhbmd0YWcgICAgICAgPSAobGFuZ3VhZ2VcbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgc2NyaXB0XVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiByZWdpb25dXG4gKiAgICAgICAgICAgICAgICAgICAgKihcIi1cIiB2YXJpYW50KVxuICogICAgICAgICAgICAgICAgICAgICooXCItXCIgZXh0ZW5zaW9uKVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiBwcml2YXRldXNlXSlcbiAqXG4gKiBsYW5ndWFnZSAgICAgID0gXCJlblwiLCBcImFsZVwiLCBvciBhIHJlZ2lzdGVyZWQgdmFsdWVcbiAqXG4gKiBzY3JpcHQgICAgICAgID0gXCJMYXRuXCIsIFwiQ3lybFwiLCBcIkhhbnRcIiBJU08gMTU5MjQgY29kZXNcbiAqXG4gKiByZWdpb24gICAgICAgID0gXCJVU1wiLCBcIkNTXCIsIFwiRlJcIiBJU08gMzE2NiBjb2Rlc1xuICogICAgICAgICAgICAgICAgIFwiNDE5XCIsIFwiMDE5XCIsICBvciBVTiBNLjQ5IGNvZGVzXG4gKlxuICogdmFyaWFudCAgICAgICA9IFwicm96YWpcIiwgXCJuZWRpc1wiLCBcIjE5OTZcIiwgbXVsdGlwbGUgc3VidGFncyBjYW4gYmUgdXNlZCBpbiBhIHRhZ1xuICpcbiAqIGV4dGVuc2lvbiAgICAgPSBzaW5nbGUgbGV0dGVyIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgc3VidGFnczsgbW9yZSB0aGFuIG9uZSBleHRlbnNpb25cbiAqICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBpbiBhIGxhbmd1YWdlIHRhZ1xuICpcbiAqIHByaXZhdGUtdXNlICAgPSBcIngtXCIgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBzdWJ0YWdzLCBhcyBtYW55IGFzIGFyZSByZXF1aXJlZFxuICogICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGVzZSBjYW4gc3RhcnQgYSB0YWcgb3IgYXBwZWFyIGF0IHRoZSBlbmQgKGJ1dCBub3RcbiAqICAgICAgICAgICAgICAgICBpbiB0aGUgbWlkZGxlKVxuICogYGBgXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZcbiAqL1xuY2xhc3MgTG9jYWxlIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtyZWdpb25dXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0XVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3ZhcmlhbnRzXVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGxhbmddXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbcHJpdmF0ZVVzZV1cblx0ICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuXHQgKi9cblx0Y29uc3RydWN0b3IobGFuZ3VhZ2UsIHJlZ2lvbiwgc2NyaXB0LCB2YXJpYW50cywgZXh0bGFuZywgcHJpdmF0ZVVzZSkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzW3Byb3BlcnRpZXNTeW1ib2xdID0ge1xuXHRcdFx0bGFuZ3VhZ2U6IGxhbmd1YWdlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyhsYW5ndWFnZSksXG5cdFx0XHRzY3JpcHQ6IHNjcmlwdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdmFsaWRhdGVTdHJpbmcoc2NyaXB0KSxcblx0XHRcdHJlZ2lvbjogcmVnaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyhyZWdpb24pLFxuXHRcdFx0dmFyaWFudHM6IHZhcmlhbnRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyh2YXJpYW50cyksXG5cdFx0XHRleHRsYW5nOiBleHRsYW5nID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyhleHRsYW5nKSxcblx0XHRcdHByaXZhdGVVc2U6XG5cdFx0XHRcdHByaXZhdGVVc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHByaXZhdGVVc2UpLFxuXHRcdH07XG5cblx0XHRjb25zdCBzID0gW107XG5cdFx0aWYgKGxhbmd1YWdlICE9PSB1bmRlZmluZWQpIHMucHVzaChsYW5ndWFnZSk7XG5cdFx0aWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkKSBzLnB1c2goc2NyaXB0KTtcblx0XHRpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHMucHVzaChyZWdpb24pO1xuXHRcdGlmICh2YXJpYW50cyAhPT0gdW5kZWZpbmVkKSBzLnB1c2godmFyaWFudHMpO1xuXHRcdGlmIChleHRsYW5nICE9PSB1bmRlZmluZWQpIHMucHVzaChleHRsYW5nKTtcblx0XHRpZiAocHJpdmF0ZVVzZSAhPT0gdW5kZWZpbmVkKSBzLnB1c2gocHJpdmF0ZVVzZSk7XG5cblx0XHRpZiAocy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGxvY2FsZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzW2xvY2FsZVN0cmluZ1N5bWJvbF0gPSBzLmpvaW4oXCItXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAzLjI3LjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvaTE4bi9sb2NhbGVAQGluc3RhbmNlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdGdldCBsb2NhbGVTdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXNbbG9jYWxlU3RyaW5nU3ltYm9sXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuXHQgKi9cblx0Z2V0IGxhbmd1YWdlKCkge1xuXHRcdHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLmxhbmd1YWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9XG5cdCAqL1xuXHRnZXQgcmVnaW9uKCkge1xuXHRcdHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLnJlZ2lvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuXHQgKi9cblx0Z2V0IHNjcmlwdCgpIHtcblx0XHRyZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS5zY3JpcHQ7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cblx0ICovXG5cdGdldCB2YXJpYW50cygpIHtcblx0XHRyZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS52YXJpYW50cztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuXHQgKi9cblx0Z2V0IGV4dGxhbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0uZXh0bGFuZztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuXHQgKi9cblx0Z2V0IHByaXZhdGVVc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0ucHJpdmF0ZVZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiBgJHt0aGlzLmxvY2FsZVN0cmluZ31gO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmc6IGxhbmd1YWdlLCBzY3JpcHQsIHJlZ2lvbiwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2Vcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5JMThuLkxvY2FsZU1hcH1cblx0ICovXG5cdGdldE1hcCgpIHtcblx0XHRyZXR1cm4gY2xvbmUodGhpc1twcm9wZXJ0aWVzU3ltYm9sXSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhbGVNYXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYW5ndWFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlZ2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhcmlhbnRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0bGFuZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByaXZhdGVVc2VcbiAqL1xuXG4vKipcbiAqIFBhcnNlIGxvY2FsIGFjY29yZGluZyB0byByZmM0NjQ2IHN0YW5kYXJkXG4gKlxuICogTGltaXRhdGlvbnM6IFRoZSByZWdleCBjYW5ub3QgaGFuZGxlIG11bHRpcGxlIHZhcmlhbnRzIG9yIHByaXZhdGUuXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5OlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGltcG9ydCB7Y3JlYXRlTG9jYWxlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS9pMThuL2xvY2FsZS5tanMnO1xuICogY3JlYXRlTG9jYWxlKClcbiAqIGBgYFxuICpcbiAqIFJGQ1xuICpcbiAqIGBgYFxuICogICBUaGUgc3ludGF4IG9mIHRoZSBsYW5ndWFnZSB0YWcgaW4gQUJORiBbUkZDNDIzNF0gaXM6XG4gKlxuICogICBMYW5ndWFnZS1UYWcgID0gbGFuZ3RhZ1xuICogICAgICAgICAgICAgICAgIC8gcHJpdmF0ZXVzZSAgICAgICAgICAgICA7IHByaXZhdGUgdXNlIHRhZ1xuICogICAgICAgICAgICAgICAgIC8gZ3JhbmRmYXRoZXJlZCAgICAgICAgICA7IGdyYW5kZmF0aGVyZWQgcmVnaXN0cmF0aW9uc1xuICpcbiAqICAgbGFuZ3RhZyAgICAgICA9IChsYW5ndWFnZVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiBzY3JpcHRdXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHJlZ2lvbl1cbiAqICAgICAgICAgICAgICAgICAgICAqKFwiLVwiIHZhcmlhbnQpXG4gKiAgICAgICAgICAgICAgICAgICAgKihcIi1cIiBleHRlbnNpb24pXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHByaXZhdGV1c2VdKVxuICpcbiAqICAgbGFuZ3VhZ2UgICAgICA9ICgyKjNBTFBIQSBbIGV4dGxhbmcgXSkgOyBzaG9ydGVzdCBJU08gNjM5IGNvZGVcbiAqICAgICAgICAgICAgICAgICAvIDRBTFBIQSAgICAgICAgICAgICAgICAgOyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZVxuICogICAgICAgICAgICAgICAgIC8gNSo4QUxQSEEgICAgICAgICAgICAgICA7IHJlZ2lzdGVyZWQgbGFuZ3VhZ2Ugc3VidGFnXG4gKlxuICogICBleHRsYW5nICAgICAgID0gKjMoXCItXCIgM0FMUEhBKSAgICAgICAgIDsgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2VcbiAqXG4gKiAgIHNjcmlwdCAgICAgICAgPSA0QUxQSEEgICAgICAgICAgICAgICAgIDsgSVNPIDE1OTI0IGNvZGVcbiAqXG4gKiAgIHJlZ2lvbiAgICAgICAgPSAyQUxQSEEgICAgICAgICAgICAgICAgIDsgSVNPIDMxNjYgY29kZVxuICogICAgICAgICAgICAgICAgIC8gM0RJR0lUICAgICAgICAgICAgICAgICA7IFVOIE0uNDkgY29kZVxuICpcbiAqICAgdmFyaWFudCAgICAgICA9IDUqOGFscGhhbnVtICAgICAgICAgICAgOyByZWdpc3RlcmVkIHZhcmlhbnRzXG4gKiAgICAgICAgICAgICAgICAgLyAoRElHSVQgM2FscGhhbnVtKVxuICpcbiAqICAgZXh0ZW5zaW9uICAgICA9IHNpbmdsZXRvbiAxKihcIi1cIiAoMio4YWxwaGFudW0pKVxuICpcbiAqICAgc2luZ2xldG9uICAgICA9ICV4NDEtNTcgLyAleDU5LTVBIC8gJXg2MS03NyAvICV4NzktN0EgLyBESUdJVFxuICogICAgICAgICAgICAgICAgIDsgXCJhXCItXCJ3XCIgLyBcInlcIi1cInpcIiAvIFwiQVwiLVwiV1wiIC8gXCJZXCItXCJaXCIgLyBcIjBcIi1cIjlcIlxuICogICAgICAgICAgICAgICAgIDsgU2luZ2xlIGxldHRlcnM6IHgvWCBpcyByZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2VcbiAqXG4gKiAgIHByaXZhdGV1c2UgICAgPSAoXCJ4XCIvXCJYXCIpIDEqKFwiLVwiICgxKjhhbHBoYW51bSkpXG4gKlxuICogICBncmFuZGZhdGhlcmVkID0gMSozQUxQSEEgMSoyKFwiLVwiICgyKjhhbHBoYW51bSkpXG4gKiAgICAgICAgICAgICAgICAgICA7IGdyYW5kZmF0aGVyZWQgcmVnaXN0cmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICA7IE5vdGU6IGkgaXMgdGhlIG9ubHkgc2luZ2xldG9uXG4gKiAgICAgICAgICAgICAgICAgICA7IHRoYXQgc3RhcnRzIGEgZ3JhbmRmYXRoZXJlZCB0YWdcbiAqXG4gKiAgIGFscGhhbnVtICAgICAgPSAoQUxQSEEgLyBESUdJVCkgICAgICAgOyBsZXR0ZXJzIGFuZCBudW1iZXJzXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICBGaWd1cmUgMTogTGFuZ3VhZ2UgVGFnIEFCTkZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGVcbiAqIEByZXR1cm4ge0xvY2FsZX1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgbG9jYWxlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9jYWxlKGxvY2FsZSkge1xuXHRsb2NhbGUgPSB2YWxpZGF0ZVN0cmluZyhsb2NhbGUpLnJlcGxhY2UoL18vZywgXCItXCIpO1xuXG5cdGxldCBsYW5ndWFnZTtcblx0bGV0IHJlZ2lvbjtcblx0bGV0IHZhcmlhbnRzO1xuXHRsZXQgcGFydHM7XG5cdGxldCBzY3JpcHQ7XG5cdGxldCBleHRsYW5nO1xuXHRjb25zdCByZWdleFJlZ3VsYXIgPVxuXHRcdFwiKGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZylcIjtcblx0Y29uc3QgcmVnZXhJcnJlZ3VsYXIgPVxuXHRcdFwiKGVuLUdCLW9lZHxpLWFtaXxpLWJubnxpLWRlZmF1bHR8aS1lbm9jaGlhbnxpLWhha3xpLWtsaW5nb258aS1sdXh8aS1taW5nb3xpLW5hdmFqb3xpLXB3bnxpLXRhb3xpLXRheXxpLXRzdXxzZ24tQkUtRlJ8c2duLUJFLU5MfHNnbi1DSC1ERSlcIjtcblx0Y29uc3QgcmVnZXhHcmFuZGZhdGhlcmVkID0gYCgke3JlZ2V4SXJyZWd1bGFyfXwke3JlZ2V4UmVndWxhcn0pYDtcblx0Y29uc3QgcmVnZXhQcml2YXRlVXNlID0gXCIoeCgtW0EtWmEtejAtOV17MSw4fSkrKVwiO1xuXHRjb25zdCByZWdleFNpbmdsZXRvbiA9IFwiWzAtOUEtV1ktWmEtd3ktel1cIjtcblx0Y29uc3QgcmVnZXhFeHRlbnNpb24gPSBgKCR7cmVnZXhTaW5nbGV0b259KC1bQS1aYS16MC05XXsyLDh9KSspYDtcblx0Y29uc3QgcmVnZXhWYXJpYW50ID0gXCIoW0EtWmEtejAtOV17NSw4fXxbMC05XVtBLVphLXowLTldezN9KVwiO1xuXHRjb25zdCByZWdleFJlZ2lvbiA9IFwiKFtBLVphLXpdezJ9fFswLTldezN9KVwiO1xuXHRjb25zdCByZWdleFNjcmlwdCA9IFwiKFtBLVphLXpdezR9KVwiO1xuXHRjb25zdCByZWdleEV4dGxhbmcgPSBcIihbQS1aYS16XXszfSgtW0EtWmEtel17M30pezAsMn0pXCI7XG5cdGNvbnN0IHJlZ2V4TGFuZ3VhZ2UgPSBgKChbQS1aYS16XXsyLDN9KC0ke3JlZ2V4RXh0bGFuZ30pPyl8W0EtWmEtel17NH18W0EtWmEtel17NSw4fSlgO1xuXHRjb25zdCByZWdleExhbmd0YWcgPSBgKCR7cmVnZXhMYW5ndWFnZX0oLSR7cmVnZXhTY3JpcHR9KT8oLSR7cmVnZXhSZWdpb259KT8oLSR7cmVnZXhWYXJpYW50fSkqKC0ke3JlZ2V4RXh0ZW5zaW9ufSkqKC0ke3JlZ2V4UHJpdmF0ZVVzZX0pPylgO1xuXHRjb25zdCByZWdleExhbmd1YWdlVGFnID0gYF4oJHtyZWdleEdyYW5kZmF0aGVyZWR9fCR7cmVnZXhMYW5ndGFnfXwke3JlZ2V4UHJpdmF0ZVVzZX0pJGA7XG5cdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleExhbmd1YWdlVGFnKTtcblx0bGV0IG1hdGNoO1xuXG5cdGlmICgobWF0Y2ggPSByZWdleC5leGVjKGxvY2FsZSkpICE9PSBudWxsKSB7XG5cdFx0aWYgKG1hdGNoLmluZGV4ID09PSByZWdleC5sYXN0SW5kZXgpIHtcblx0XHRcdHJlZ2V4Lmxhc3RJbmRleCsrO1xuXHRcdH1cblx0fVxuXG5cdGlmIChtYXRjaCA9PT0gdW5kZWZpbmVkIHx8IG1hdGNoID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgbG9jYWxlXCIpO1xuXHR9XG5cblx0aWYgKG1hdGNoWzZdICE9PSB1bmRlZmluZWQpIHtcblx0XHRsYW5ndWFnZSA9IG1hdGNoWzZdO1xuXG5cdFx0cGFydHMgPSBsYW5ndWFnZS5zcGxpdChcIi1cIik7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGxhbmd1YWdlID0gcGFydHNbMF07XG5cdFx0XHRleHRsYW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHR9XG5cblx0aWYgKG1hdGNoWzE0XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmVnaW9uID0gbWF0Y2hbMTRdO1xuXHR9XG5cblx0aWYgKG1hdGNoWzEyXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0c2NyaXB0ID0gbWF0Y2hbMTJdO1xuXHR9XG5cblx0aWYgKG1hdGNoWzE2XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFyaWFudHMgPSBtYXRjaFsxNl07XG5cdH1cblxuXHRyZXR1cm4gbmV3IExvY2FsZShsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBwYXJzZUxvY2FsZSB9IGZyb20gXCIuLi9pMThuL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50IH0gZnJvbSBcIi4vdXRpbC5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmV4cG9ydCB7IGdldExvY2FsZU9mRG9jdW1lbnQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9IFwiZW5cIjtcblxuLyoqXG4gKiBXaXRoIHRoaXMgZnVuY3Rpb24geW91IGNhbiByZWFkIHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHNldCBieSB0aGUgZG9jdW1lbnQuXG4gKiBGb3IgdGhpcyB0aGUgYXR0cmlidXRlIGBsYW5nYCBpbiB0aGUgaHRtbCB0YWcgaXMgcmVhZC4gSWYgbm8gYXR0cmlidXRlIGlzIHNldCwgYGVuYCBpcyB1c2VkIGFzIGRlZmF1bHQuXG4gKiBBbHRlcm5hdGl2ZWx5LCB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiBvZiB0aGUgYnJvd3NlciBpcyB1c2VkLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxodG1sIGxhbmc9XCJlblwiPlxuICogYGBgXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgYGdldExvY2FsZU9mRG9jdW1lbnQoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBsb2NhbGVcbiAqIEBzdW1tYXJ5IFRyaWVzIHRvIGRldGVybWluZSB0aGUgbG9jYWxlIHVzZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TG9jYWxlT2ZEb2N1bWVudCgpIHtcblx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG5cdGNvbnN0IGh0bWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKTtcblx0aWYgKGh0bWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBodG1sLmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcblx0XHRjb25zdCBsb2NhbGUgPSBodG1sLmdldEF0dHJpYnV0ZShcImxhbmdcIik7XG5cdFx0aWYgKGxvY2FsZSkge1xuXHRcdFx0cmV0dXJuIG5ldyBwYXJzZUxvY2FsZShsb2NhbGUpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG5hdmlnYXRvckxhbmd1YWdlID0gZ2V0TmF2aWdhdG9yTGFuZ3VhZ2UoKTtcblx0aWYgKG5hdmlnYXRvckxhbmd1YWdlKSB7XG5cdFx0cmV0dXJuIHBhcnNlTG9jYWxlKG5hdmlnYXRvckxhbmd1YWdlKTtcblx0fVxuXG5cdHJldHVybiBwYXJzZUxvY2FsZShERUZBVUxUX0xBTkdVQUdFKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZHwqfVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmF2aWdhdG9yL2xhbmd1YWdlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OYXZpZ2F0b3IvbGFuZ3VhZ2VzXG4gKi9cbmNvbnN0IGdldE5hdmlnYXRvckxhbmd1YWdlID0gKCkgPT4ge1xuXHRjb25zdCBuYXZpZ2F0b3IgPSBnZXRHbG9iYWxPYmplY3QoXCJuYXZpZ2F0b3JcIik7XG5cdGlmIChuYXZpZ2F0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAobmF2aWdhdG9yLmhhc093blByb3BlcnR5KFwibGFuZ3VhZ2VcIikpIHtcblx0XHRjb25zdCBsYW5ndWFnZSA9IG5hdmlnYXRvci5sYW5ndWFnZTtcblx0XHRpZiAodHlwZW9mIGxhbmd1YWdlID09PSBcInN0cmluZ1wiICYmIGxhbmd1YWdlLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBsYW5ndWFnZTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBsYW5ndWFnZXMgPSBuYXZpZ2F0b3I/Lmxhbmd1YWdlcztcblx0aWYgKEFycmF5LmlzQXJyYXkobGFuZ3VhZ2VzKSAmJiBsYW5ndWFnZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBsYW5ndWFnZXNbMF07XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IElEIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbnRlZ2VyPn1cbiAqL1xuY29uc3QgaW50ZXJuYWxDb3VudGVyID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFdpdGggdGhlIGlkIGNsYXNzLCBzZXF1ZW5jZXMgb2YgaWRzIGNhbiBiZSBjcmVhdGVkLiBmb3IgdGhpcyBwdXJwb3NlLCBhbiBpbnRlcm5hbCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHByZWZpeC5cbiAqIHRodXMsIHRoZSBmaXJzdCBpZCB3aXRoIHRoZSBwcmVmaXggYG15aWRgIHdpbGwgYmUgYG15aWQxYCBhbmQgdGhlIHNlY29uZCBpZCBgbXlpZDJgLlxuICogVGhlIGlkcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNhbGwsIGZvciBleGFtcGxlIG9uIGEgd2ViIHBhZ2UuXG4gKlxuICogU28gdGhlIGlkcyBjYW4gYWxzbyBiZSB1c2VkIGZvciBuYXZpZ2F0aW9uLiB5b3UgaGF2ZSB0byB0YWtlIGNhcmUgdGhhdCB0aGUgb3JkZXIgc3RheXMgdGhlIHNhbWUuXG4gKlxuICogQXMgb2YgdmVyc2lvbiAxLjYuMCB0aGVyZSBpcyB0aGUgbmV3IFJhbmRvbUlELiB0aGlzIElEIGNsYXNzIGlzIGNvbnRpbnVvdXMgZnJvbSBub3cgb24uXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBpZHNcbiAqL1xuY2xhc3MgSUQgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqIGNyZWF0ZSBuZXcgaWQgd2l0aCBwcmVmaXhcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuXHQgKi9cblx0Y29uc3RydWN0b3IocHJlZml4KSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cHJlZml4ID0gXCJpZFwiO1xuXHRcdH1cblxuXHRcdHZhbGlkYXRlU3RyaW5nKHByZWZpeCk7XG5cblx0XHRpZiAoIWludGVybmFsQ291bnRlci5oYXMocHJlZml4KSkge1xuXHRcdFx0aW50ZXJuYWxDb3VudGVyLnNldChwcmVmaXgsIDEpO1xuXHRcdH1cblxuXHRcdGxldCBjb3VudCA9IGludGVybmFsQ291bnRlci5nZXQocHJlZml4KTtcblx0XHR0aGlzLmlkID0gcHJlZml4ICsgY291bnQ7XG5cblx0XHRpbnRlcm5hbENvdW50ZXIuc2V0KHByZWZpeCwgKytjb3VudCk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaWQ7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBQYXRoZmluZGVyIH0gZnJvbSBcIi4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVPYmplY3QgfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHsgQmFzZVdpdGhPcHRpb25zIH07XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyB3aXRoIG9wdGlvbnMgZnJvbSB3aGljaCBzb21lIG1vbnN0ZXIgY2xhc3NlcyBhcmUgZGVyaXZlZC5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGFjdHVhbGx5IG9ubHkgdXNlZCBhcyBhIGJhc2UgY2xhc3MuXG4gKlxuICogQ2xhc3NlcyB0aGF0IHJlcXVpcmUgdGhlIHBvc3NpYmlsaXR5IG9mIG9wdGlvbnMgY2FuIGJlIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSB0aGlzIGNsYXNzLlxuICogRGVyaXZlZCBjbGFzc2VzIGFsbW9zdCBhbHdheXMgb3ZlcnJpZGUgdGhlIGBkZWZhdWx0YCBnZXR0ZXIgd2l0aCB0aGVpciBvd24gdmFsdWVzLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBkZXByZWNhdGVkIHNpbmNlIDMuMTUuMFxuICovXG5jbGFzcyBCYXNlV2l0aE9wdGlvbnMgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMgPSB7fTtcblx0XHR9XG5cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IGV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0cywgdmFsaWRhdGVPYmplY3Qob3B0aW9ucykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZ2V0dGVyIHByb3ZpZGVzIHRoZSBvcHRpb25zLiBEZXJpdmVkIGNsYXNzZXMgb3ZlcndyaXRlXG5cdCAqIHRoaXMgZ2V0dGVyIHdpdGggdGhlaXIgb3duIHZhbHVlcy4gSXQgaXMgYSBnb29kIGthcm1hIHRvIGFsd2F5cyBpbmNsdWRlXG5cdCAqIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcGFyZW50IGNsYXNzLlxuXHQgKlxuXHQgKiBgYGBqYXZhc2NyaXB0XG5cdCAqIGdldCBkZWZhdWx0cygpIHtcblx0ICogICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHQgKiAgICAgICAgIG15a2V5OiB0cnVlXG5cdCAqICAgICB9KTtcblx0ICogfVxuXHQgKlxuXHQgKiBgYGBcblx0ICpcblx0ICogQHJldHVybiB7b2JqZWN0fVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBuZXN0ZWQgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhdGggYGEuYi5jYFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuXHQgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZVxuXHQgKiBAcmV0dXJuIHsqfVxuXHQgKiBAc2luY2UgMS4xMC4wXG5cdCAqL1xuXHRnZXRPcHRpb24ocGF0aCwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0bGV0IHZhbHVlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhbHVlID0gbmV3IFBhdGhmaW5kZXIodGhpc1tpbnRlcm5hbFN5bWJvbF0pLmdldFZpYShwYXRoKTtcblx0XHR9IGNhdGNoIChlKSB7fVxuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtcblx0aGFzT2JqZWN0TGluayxcblx0Z2V0TGlua2VkT2JqZWN0cyxcblx0YWRkVG9PYmplY3RMaW5rLFxufSBmcm9tIFwiLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBnZXRMb2NhbGVPZkRvY3VtZW50IH0gZnJvbSBcIi4uL2RvbS9sb2NhbGUubWpzXCI7XG5pbXBvcnQgeyBCYXNlV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSBcIi4vbG9jYWxlLm1qc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25zIH0gZnJvbSBcIi4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5leHBvcnQgeyBQcm92aWRlciwgdHJhbnNsYXRpb25zTGlua1N5bWJvbCB9O1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjkuMFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgdHJhbnNsYXRpb25zTGlua1N5bWJvbCA9IFN5bWJvbC5mb3IoXG5cdFwiQHNjaHVrYWkvbW9uc3Rlci9pMThuL3RyYW5zbGF0aW9uc0BAbGlua1wiLFxuKTtcblxuLyoqXG4gKiBBIHByb3ZpZGVyIG1ha2VzIGEgdHJhbnNsYXRpb24gb2JqZWN0IGF2YWlsYWJsZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZ9XG4gKi9cbmNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAzLjI3LjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvaTE4bi9wcm92aWRlckBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtMb2NhbGV8c3RyaW5nfSBsb2NhbGVcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdGdldFRyYW5zbGF0aW9ucyhsb2NhbGUpIHtcblx0XHRpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzb2x2ZShuZXcgVHJhbnNsYXRpb25zKGxvY2FsZSkpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtMb2NhbGV8c3RyaW5nfSBsb2NhbGVcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuXHQgKiBAcmV0dXJuIHtQcm92aWRlcn1cblx0ICovXG5cdGFzc2lnblRvRWxlbWVudChsb2NhbGUsIGVsZW1lbnQpIHtcblx0XHRpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKTtcblx0XHR9XG5cblx0XHRpZiAoIShsb2NhbGUgaW5zdGFuY2VvZiBMb2NhbGUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbGUgaXMgbm90IGFuIGluc3RhbmNlIG9mIExvY2FsZVwiKTtcblx0XHR9XG5cblx0XHRpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0XHRlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImJvZHlcIik7XG5cdFx0fVxuXG5cdFx0aWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnRcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25zKGxvY2FsZSkudGhlbigob2JqKSA9PiB7XG5cdFx0XHRsZXQgdHJhbnNsYXRpb25zID0gbnVsbDtcblx0XHRcdGlmIChoYXNPYmplY3RMaW5rKGVsZW1lbnQsIHRyYW5zbGF0aW9uc0xpbmtTeW1ib2wpKSB7XG5cdFx0XHRcdGNvbnN0IG9iamVjdHMgPSBnZXRMaW5rZWRPYmplY3RzKGVsZW1lbnQsIHRyYW5zbGF0aW9uc0xpbmtTeW1ib2wpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IG8gb2Ygb2JqZWN0cykge1xuXHRcdFx0XHRcdGlmIChvIGluc3RhbmNlb2YgVHJhbnNsYXRpb25zKSB7XG5cdFx0XHRcdFx0XHR0cmFuc2xhdGlvbnMgPSBvO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCEodHJhbnNsYXRpb25zIGluc3RhbmNlb2YgVHJhbnNsYXRpb25zKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVHJhbnNsYXRpb25zXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJhbnNsYXRpb25zLmFzc2lnblRyYW5zbGF0aW9ucyhvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWRkVG9PYmplY3RMaW5rKGVsZW1lbnQsIHRyYW5zbGF0aW9uc0xpbmtTeW1ib2wsIG9iaik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fSk7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBnZXRMaW5rZWRPYmplY3RzLCBoYXNPYmplY3RMaW5rIH0gZnJvbSBcIi4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX09CSkVDVExJTksgfSBmcm9tIFwiLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50IH0gZnJvbSBcIi4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtcblx0dmFsaWRhdGVJbnRlZ2VyLFxuXHR2YWxpZGF0ZU9iamVjdCxcblx0dmFsaWRhdGVTdHJpbmcsXG59IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IExvY2FsZSwgcGFyc2VMb2NhbGUgfSBmcm9tIFwiLi9sb2NhbGUubWpzXCI7XG5pbXBvcnQgeyB0cmFuc2xhdGlvbnNMaW5rU3ltYm9sIH0gZnJvbSBcIi4vcHJvdmlkZXIubWpzXCI7XG5cbmV4cG9ydCB7IFRyYW5zbGF0aW9ucywgZ2V0RG9jdW1lbnRUcmFuc2xhdGlvbnMgfTtcblxuLyoqXG4gKiBXaXRoIHRoaXMgY2xhc3MgeW91IGNhbiBtYW5hZ2UgdHJhbnNsYXRpb25zIGFuZCBhY2Nlc3MgdGhlIGtleXMuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2kxOG4vdHJhbnNsYXRpb25zLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZcbiAqL1xuY2xhc3MgVHJhbnNsYXRpb25zIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0xvY2FsZX0gbG9jYWxlXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihsb2NhbGUpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGxvY2FsZSBpbnN0YW5jZW9mIExvY2FsZSkge1xuXHRcdFx0dGhpcy5sb2NhbGUgPSBsb2NhbGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubG9jYWxlID0gcGFyc2VMb2NhbGUodmFsaWRhdGVTdHJpbmcobG9jYWxlKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9yYWdlID0gbmV3IE1hcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAzLjI3LjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvaTE4bi90cmFuc2xhdGlvbnNAQGluc3RhbmNlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZldGNoZXMgYSB0ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQga2V5LlxuXHQgKiBJZiBubyBzdWl0YWJsZSBrZXkgaXMgZm91bmQsIGBkZWZhdWx0VGV4dGAgaXMgdGFrZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBkZWZhdWx0VGV4dFxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBrZXkgbm90IGZvdW5kXG5cdCAqL1xuXHRnZXRUZXh0KGtleSwgZGVmYXVsdFRleHQpIHtcblx0XHRpZiAoIXRoaXMuc3RvcmFnZS5oYXMoa2V5KSkge1xuXHRcdFx0aWYgKGRlZmF1bHRUZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBrZXkgJHtrZXl9IG5vdCBmb3VuZGApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHIgPSB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG5cdFx0aWYgKGlzT2JqZWN0KHIpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRQbHVyYWxSdWxlVGV4dChrZXksIFwib3RoZXJcIiwgZGVmYXVsdFRleHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBudW1iZXIgYGNvdW50YCBjYW4gYmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLiBJbiBhZGRpdGlvbiB0byBhIG51bWJlciwgb25lIG9mIHRoZSBrZXl3b3JkcyBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkuXG5cdCAqIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcImZld1wiLCBcIm1hbnlcIiBhbmQgXCJvdGhlclwiLiBSZW1lbWJlcjogbm90IGV2ZXJ5IGxhbmd1YWdlIGhhcyBhbGwgcnVsZXMuXG5cdCAqXG5cdCAqIFRoZSBhcHByb3ByaWF0ZSB0ZXh0IGZvciB0aGlzIG51bWJlciBpcyB0aGVuIHNlbGVjdGVkLiBJZiBubyBzdWl0YWJsZSBrZXkgaXMgZm91bmQsIGBkZWZhdWx0VGV4dGAgaXMgdGFrZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHtpbnRlZ2VyfHN0cmluZ30gY291bnRcblx0ICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBkZWZhdWx0VGV4dFxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXRQbHVyYWxSdWxlVGV4dChrZXksIGNvdW50LCBkZWZhdWx0VGV4dCkge1xuXHRcdGlmICghdGhpcy5zdG9yYWdlLmhhcyhrZXkpKSB7XG5cdFx0XHRyZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHIgPSB2YWxpZGF0ZU9iamVjdCh0aGlzLnN0b3JhZ2UuZ2V0KGtleSkpO1xuXG5cdFx0bGV0IGtleXdvcmQ7XG5cdFx0aWYgKGlzU3RyaW5nKGNvdW50KSkge1xuXHRcdFx0a2V5d29yZCA9IGNvdW50LnRvTG9jYWxlU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvdW50ID0gdmFsaWRhdGVJbnRlZ2VyKGNvdW50KTtcblx0XHRcdGlmIChjb3VudCA9PT0gMCkge1xuXHRcdFx0XHQvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciB6ZXJvIGNvdW50XG5cdFx0XHRcdGlmIChyLmhhc093blByb3BlcnR5KFwiemVyb1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWxpZGF0ZVN0cmluZyhyPy56ZXJvKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRrZXl3b3JkID0gbmV3IEludGwuUGx1cmFsUnVsZXModGhpcy5sb2NhbGUudG9TdHJpbmcoKSkuc2VsZWN0KFxuXHRcdFx0XHR2YWxpZGF0ZUludGVnZXIoY291bnQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoci5oYXNPd25Qcm9wZXJ0eShrZXl3b3JkKSkge1xuXHRcdFx0cmV0dXJuIHZhbGlkYXRlU3RyaW5nKHJba2V5d29yZF0pO1xuXHRcdH1cblxuXHRcdC8vIEBkZXByZWNhdGVkIHNpbmNlIDIwMjMtMDMtMTRcblx0XHQvLyBERUZBVUxUX0tFWSBpcyB1bmRlZmluZWRcblx0XHQvLyBpZiAoci5oYXNPd25Qcm9wZXJ0eShERUZBVUxUX0tFWSkpIHtcblx0XHQvLyAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHJbREVGQVVMVF9LRVldKTtcblx0XHQvLyB9XG5cblx0XHRyZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhIHRleHQgZm9yIGEga2V5XG5cdCAqXG5cdCAqIGBgYFxuXHQgKiB0cmFuc2xhdGlvbnMuc2V0VGV4dChcInRleHQxXCIsIFwiTWFrZSBteSBkYXkhXCIpO1xuXHQgKiAvLyBwbHVyYWwgcnVsZXNcblx0ICogdHJhbnNsYXRpb25zLnNldFRleHQoXCJ0ZXh0NlwiLCB7XG5cdCAqICAgICBcInplcm9cIjogXCJUaGVyZSBhcmUgbm8gZmlsZXMgb24gRGlzay5cIixcblx0ICogICAgIFwib25lXCI6IFwiVGhlcmUgaXMgb25lIGZpbGUgb24gRGlzay5cIixcblx0ICogICAgIFwib3RoZXJcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuXHQgKiAgICAgXCJkZWZhdWx0XCI6IFwiVGhlcmUgYXJlIGZpbGVzIG9uIERpc2suXCJcblx0ICogfSk7XG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG5cdCAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gdGV4dFxuXHQgKiBAcmV0dXJuIHtUcmFuc2xhdGlvbnN9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG9iamVjdFxuXHQgKi9cblx0c2V0VGV4dChrZXksIHRleHQpIHtcblx0XHRpZiAoaXNTdHJpbmcodGV4dCkgfHwgaXNPYmplY3QodGV4dCkpIHtcblx0XHRcdHRoaXMuc3RvcmFnZS5zZXQodmFsaWRhdGVTdHJpbmcoa2V5KSwgdGV4dCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG9iamVjdFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciBvdmVybGF5cyBmcm9tIGFuIG9iamVjdC4gVGhlIGtleXMgYXJlIHRyYW5zZmVycmVkLCBhbmQgdGhlIHZhbHVlcyBhcmUgZW50ZXJlZFxuXHQgKiBhcyB0ZXh0LlxuXHQgKlxuXHQgKiBUaGUgdmFsdWVzIGNhbiBlaXRoZXIgYmUgY2hhcmFjdGVyIHN0cmluZ3Mgb3IsIGluIHRoZSBjYXNlIG9mIHRleHRzIHdpdGggcGx1cmFsIGZvcm1zLCBvYmplY3RzLiBUaGUgcGx1cmFsIGZvcm1zXG5cdCAqIG11c3QgYmUgc3RvcmVkIGFzIHRleHQgdmlhIGEgc3RhbmRhcmQga2V5IFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcImZld1wiLCBcIm1hbnlcIiBhbmQgXCJvdGhlclwiLlxuXHQgKlxuXHQgKiBBZGRpdGlvbmFsbHksIHRoZSBrZXkgZGVmYXVsdCBjYW4gYmUgc3BlY2lmaWVkLCB3aGljaCB3aWxsIGJlIHVzZWQgaWYgbm8gb3RoZXIga2V5IGZpdHMuXG5cdCAqXG5cdCAqIEluIHNvbWUgbGFuZ3VhZ2VzLCBsaWtlIGZvciBleGFtcGxlIGluIEdlcm1hbiwgdGhlcmUgaXMgbm8gb3duIG1vcmUgbnVtYmVyIGF0IHRoZSB2YWx1ZSAwLiBJbiB0aGVzZSBsYW5ndWFnZXMsXG5cdCAqIHRoZSBmdW5jdGlvbiBhcHBsaWVzIGFkZGl0aW9uYWxseSB6ZXJvLlxuXHQgKlxuXHQgKiBgYGBcblx0ICogdHJhbnNsYXRpb25zLmFzc2lnblRyYW5zbGF0aW9ucyh7XG5cdCAqICAgXCJ0ZXh0MVwiOiBcIk1ha2UgbXkgZGF5IVwiLFxuXHQgKiAgIFwidGV4dDJcIjogXCJJJ2xsIGJlIGJhY2shXCIsXG5cdCAqICAgXCJ0ZXh0NlwiOiB7XG5cdCAqICAgICBcInplcm9cIjogXCJUaGVyZSBhcmUgbm8gZmlsZXMgb24gRGlzay5cIixcblx0ICogICAgIFwib25lXCI6IFwiVGhlcmUgaXMgb25lIGZpbGUgb24gRGlzay5cIixcblx0ICogICAgIFwib3RoZXJcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuXHQgKiAgICAgXCJkZWZhdWx0XCI6IFwiVGhlcmUgYXJlIGZpbGVzIG9uIERpc2suXCJcblx0ICogfSk7XG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gdHJhbnNsYXRpb25zXG5cdCAqIEByZXR1cm4ge1RyYW5zbGF0aW9uc31cblx0ICovXG5cdGFzc2lnblRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnMpIHtcblx0XHR2YWxpZGF0ZU9iamVjdCh0cmFuc2xhdGlvbnMpO1xuXG5cdFx0aWYgKHRyYW5zbGF0aW9ucyBpbnN0YW5jZW9mIFRyYW5zbGF0aW9ucykge1xuXHRcdFx0dHJhbnNsYXRpb25zLnN0b3JhZ2UuZm9yRWFjaCgodiwgaykgPT4ge1xuXHRcdFx0XHR0aGlzLnNldFRleHQoaywgdik7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykpIHtcblx0XHRcdHRoaXMuc2V0VGV4dChrLCB2KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudHx1bmRlZmluZWR9IFtlbGVtZW50XSAtIEVsZW1lbnQgdG8gc2VhcmNoIGZvciB0cmFuc2xhdGlvbnMuIERlZmF1bHQ6IGVsZW1lbnQgd2l0aCBvYmplY3RsaW5rIEBzY2h1a2FpL21vbnN0ZXIvaTE4bi90cmFuc2xhdGlvbnNAQGxpbmsuXG4gKiBAcmV0dXJuIHtUcmFuc2xhdGlvbnN9XG4gKiBAdGhyb3dzIHtFcnJvcn0gRWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gQ2Fubm90IGZpbmQgdGhlIGVsZW1lbnQgd2l0aCB0cmFuc2xhdGlvbnMuIEFkZCB0aGUgdHJhbnNsYXRpb24gb2JqZWN0IHRvIHRoZSBkb2N1bWVudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBUaGlzIGVsZW1lbnQgaGFzIG5vIHRyYW5zbGF0aW9ucy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBNaXNzaW5nIHRyYW5zbGF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRUcmFuc2xhdGlvbnMoZWxlbWVudCkge1xuXHRjb25zdCBkID0gZ2V0RG9jdW1lbnQoKTtcblxuXHRpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0ZWxlbWVudCA9IGQucXVlcnlTZWxlY3Rvcihcblx0XHRcdGBbJHtBVFRSSUJVVEVfT0JKRUNUTElOS31+PVwiJHt0cmFuc2xhdGlvbnNMaW5rU3ltYm9sLnRvU3RyaW5nKCl9XCJdYCxcblx0XHQpO1xuXHRcdGlmIChlbGVtZW50ID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFwiQ2Fubm90IGZpbmQgdGhlIGVsZW1lbnQgd2l0aCB0cmFuc2xhdGlvbnMuIEFkZCB0aGUgdHJhbnNsYXRpb24gb2JqZWN0IHRvIHRoZSBkb2N1bWVudC5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgaXMgbm90IGFuIEhUTUxFbGVtZW50LlwiKTtcblx0fVxuXG5cdGlmICghaGFzT2JqZWN0TGluayhlbGVtZW50LCB0cmFuc2xhdGlvbnNMaW5rU3ltYm9sKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgZWxlbWVudCBoYXMgbm8gdHJhbnNsYXRpb25zLlwiKTtcblx0fVxuXG5cdGNvbnN0IG9iaiA9IGdldExpbmtlZE9iamVjdHMoZWxlbWVudCwgdHJhbnNsYXRpb25zTGlua1N5bWJvbCk7XG5cblx0Zm9yIChjb25zdCB0IG9mIG9iaikge1xuXHRcdGlmICh0IGluc3RhbmNlb2YgVHJhbnNsYXRpb25zKSB7XG5cdFx0XHRyZXR1cm4gdDtcblx0XHR9XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHRyYW5zbGF0aW9ucy5cIik7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuZXhwb3J0IHsgZm9ybWF0VGltZUFnbyB9O1xuXG4vKipcbiAqIEZvcm1hdCBhIGRhdGUgYXMgYSByZWxhdGl2ZSB0aW1lIHN0cmluZyB3aXRoIG11bHRpcGxlIHVuaXRzLlxuICpcbiAqIEBwYXJhbSBkYXRlXG4gKiBAcGFyYW0gbG9jYWxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvKGRhdGUsIGxvY2FsZSkge1xuXHRjb25zdCBub3cgPSBuZXcgRGF0ZShNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgKiAxMDAwKTtcblx0Y29uc3Qgcm91bmRlZERhdGUgPSBuZXcgRGF0ZShNYXRoLmZsb29yKGRhdGUuZ2V0VGltZSgpIC8gMTAwMCkgKiAxMDAwKTtcblx0Y29uc3QgZGlmZkluU2Vjb25kcyA9IE1hdGguZmxvb3IoKHJvdW5kZWREYXRlIC0gbm93KSAvIDEwMDApO1xuXHRjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoZGlmZkluU2Vjb25kcyk7XG5cblx0Y29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbbm9ybWFsaXplTG9jYWxlKGxvY2FsZSldO1xuXG5cdGlmIChhYnNEaWZmID09PSAwKSB7XG5cdFx0cmV0dXJuIHRyYW5zbGF0aW9uLnRlbXBsYXRlLmp1c3ROb3coKTtcblx0fVxuXG5cdGlmIChhYnNEaWZmID4gMzE1MzYwMDApIHtcblx0XHRyZXR1cm4gdHJhbnNsYXRpb24udGVtcGxhdGUub24oXG5cdFx0XHRuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHtcblx0XHRcdFx0ZGF0ZVN0eWxlOiBcImZ1bGxcIixcblx0XHRcdFx0dGltZVN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHR9KS5mb3JtYXQoZGF0ZSksXG5cdFx0KTtcblx0fVxuXG5cdGNvbnN0IHVuaXRzID0gW1xuXHRcdHsgbmFtZTogXCJ5ZWFyXCIsIGxlbmd0aDogMzE1MzYwMDAgfSwgLy8gSGluenVnZWZcdTAwRkNndCBmXHUwMEZDciBLb25zaXN0ZW56LCBhdWNoIHdlbm4gbmljaHQgZ2VudXR6dCBpbiBkaWVzZXIgc3BlemlmaXNjaGVuIExvZ2lrXG5cdFx0eyBuYW1lOiBcImRheVwiLCBsZW5ndGg6IDg2NDAwIH0sXG5cdFx0eyBuYW1lOiBcImhvdXJcIiwgbGVuZ3RoOiAzNjAwIH0sXG5cdFx0eyBuYW1lOiBcIm1pbnV0ZVwiLCBsZW5ndGg6IDYwIH0sXG5cdFx0eyBuYW1lOiBcInNlY29uZFwiLCBsZW5ndGg6IDEgfSxcblx0XTtcblxuXHRsZXQgcmVtYWluZGVyID0gYWJzRGlmZjtcblx0Y29uc3QgcGFydHMgPSBbXTtcblxuXHRmb3IgKGNvbnN0IHVuaXQgb2YgdW5pdHMpIHtcblx0XHRpZiAocmVtYWluZGVyID49IHVuaXQubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBjb3VudCA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gdW5pdC5sZW5ndGgpO1xuXHRcdFx0cmVtYWluZGVyICU9IHVuaXQubGVuZ3RoO1xuXHRcdFx0Y29uc3QgZm9ybWF0dGVkID0gZm9ybWF0VW5pdENvdW50KGNvdW50LCB1bml0Lm5hbWUsIGxvY2FsZSk7XG5cdFx0XHRwYXJ0cy5wdXNoKGZvcm1hdHRlZCk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB0cmFuc2xhdGlvbi50ZW1wbGF0ZS5qdXN0Tm93KCk7XG5cdH1cblxuXHRjb25zdCBqb2luZWQgPSBuZXcgSW50bC5MaXN0Rm9ybWF0KGxvY2FsZSwge1xuXHRcdHN0eWxlOiBcImxvbmdcIixcblx0XHR0eXBlOiBcImNvbmp1bmN0aW9uXCIsXG5cdH0pLmZvcm1hdChwYXJ0cyk7XG5cdGlmIChkaWZmSW5TZWNvbmRzID4gMCkge1xuXHRcdHJldHVybiB0cmFuc2xhdGlvbi50ZW1wbGF0ZS5mdXR1cmUoam9pbmVkKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdHJhbnNsYXRpb24udGVtcGxhdGUucGFzdChqb2luZWQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVuaXRDb3VudChjb3VudCwgdW5pdCwgbG9jYWxlKSB7XG5cdGNvbnN0IGxhbmcgPSBub3JtYWxpemVMb2NhbGUobG9jYWxlKTtcblx0Y29uc3QgZmFsbGJhY2sgPSB0cmFuc2xhdGlvbnNbbGFuZ10gfHwgdHJhbnNsYXRpb25zW1wiZW5cIl07XG5cdGNvbnN0IGRpY3RGb3JVbml0ID0gZmFsbGJhY2sudW5pdHNbdW5pdF07XG5cdGNvbnN0IHByID0gbmV3IEludGwuUGx1cmFsUnVsZXMobGFuZyk7XG5cdGNvbnN0IGNhdGVnb3J5ID0gcHIuc2VsZWN0KGNvdW50KTtcblx0Y29uc3QgcGhyYXNlID0gZGljdEZvclVuaXRbY2F0ZWdvcnldIHx8IGRpY3RGb3JVbml0Lm90aGVyO1xuXHRyZXR1cm4gYCR7Y291bnR9ICR7cGhyYXNlfWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpIHtcblx0cmV0dXJuIGxvY2FsZS5zcGxpdChcIi1cIilbMF0udG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB0cmFuc2xhdGlvbnMgPSB7XG5cdGVuOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBvbiAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSBhZ29gLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGBpbiAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBganVzdCBub3dgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImRheXNcIixcblx0XHRcdFx0b25lOiBcImRheVwiLFxuXHRcdFx0XHR0d286IFwiZGF5c1wiLFxuXHRcdFx0XHRmZXc6IFwiZGF5c1wiLFxuXHRcdFx0XHRtYW55OiBcImRheXNcIixcblx0XHRcdFx0b3RoZXI6IFwiZGF5c1wiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJob3Vyc1wiLFxuXHRcdFx0XHRvbmU6IFwiaG91clwiLFxuXHRcdFx0XHR0d286IFwiaG91cnNcIixcblx0XHRcdFx0ZmV3OiBcImhvdXJzXCIsXG5cdFx0XHRcdG1hbnk6IFwiaG91cnNcIixcblx0XHRcdFx0b3RoZXI6IFwiaG91cnNcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dGVzXCIsXG5cdFx0XHRcdG9uZTogXCJtaW51dGVcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0ZXNcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZXNcIixcblx0XHRcdFx0bWFueTogXCJtaW51dGVzXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0ZXNcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWNvbmRzXCIsXG5cdFx0XHRcdG9uZTogXCJzZWNvbmRcIixcblx0XHRcdFx0dHdvOiBcInNlY29uZHNcIixcblx0XHRcdFx0ZmV3OiBcInNlY29uZHNcIixcblx0XHRcdFx0bWFueTogXCJzZWNvbmRzXCIsXG5cdFx0XHRcdG90aGVyOiBcInNlY29uZHNcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHR6aDoge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgXHU1NzI4JHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX1cdTUyNERgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGAke3ZhbHVlfVx1NTQwRWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgXHU1MjFBXHU1MjFBYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJcdTU5MjlcIixcblx0XHRcdFx0b25lOiBcIlx1NTkyOVwiLFxuXHRcdFx0XHR0d286IFwiXHU1OTI5XCIsXG5cdFx0XHRcdGZldzogXCJcdTU5MjlcIixcblx0XHRcdFx0bWFueTogXCJcdTU5MjlcIixcblx0XHRcdFx0b3RoZXI6IFwiXHU1OTI5XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1NUMwRlx1NjVGNlwiLFxuXHRcdFx0XHRvbmU6IFwiXHU1QzBGXHU2NUY2XCIsXG5cdFx0XHRcdHR3bzogXCJcdTVDMEZcdTY1RjZcIixcblx0XHRcdFx0ZmV3OiBcIlx1NUMwRlx1NjVGNlwiLFxuXHRcdFx0XHRtYW55OiBcIlx1NUMwRlx1NjVGNlwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTVDMEZcdTY1RjZcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJcdTUyMDZcdTk0OUZcIixcblx0XHRcdFx0b25lOiBcIlx1NTIwNlx1OTQ5RlwiLFxuXHRcdFx0XHR0d286IFwiXHU1MjA2XHU5NDlGXCIsXG5cdFx0XHRcdGZldzogXCJcdTUyMDZcdTk0OUZcIixcblx0XHRcdFx0bWFueTogXCJcdTUyMDZcdTk0OUZcIixcblx0XHRcdFx0b3RoZXI6IFwiXHU1MjA2XHU5NDlGXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG9uZTogXCJcdTc5RDJcIixcblx0XHRcdFx0dHdvOiBcIlx1NzlEMlwiLFxuXHRcdFx0XHRmZXc6IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1NzlEMlwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGVzOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBlbCAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGBoYWNlICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgZW4gJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYGp1c3RvIGFob3JhYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJkXHUwMEVEYXNcIixcblx0XHRcdFx0b25lOiBcImRcdTAwRURhXCIsXG5cdFx0XHRcdHR3bzogXCJkXHUwMEVEYXNcIixcblx0XHRcdFx0ZmV3OiBcImRcdTAwRURhc1wiLFxuXHRcdFx0XHRtYW55OiBcImRcdTAwRURhc1wiLFxuXHRcdFx0XHRvdGhlcjogXCJkXHUwMEVEYXNcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwiaG9yYXNcIixcblx0XHRcdFx0b25lOiBcImhvcmFcIixcblx0XHRcdFx0dHdvOiBcImhvcmFzXCIsXG5cdFx0XHRcdGZldzogXCJob3Jhc1wiLFxuXHRcdFx0XHRtYW55OiBcImhvcmFzXCIsXG5cdFx0XHRcdG90aGVyOiBcImhvcmFzXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwibWludXRvc1wiLFxuXHRcdFx0XHRvbmU6IFwibWludXRvXCIsXG5cdFx0XHRcdHR3bzogXCJtaW51dG9zXCIsXG5cdFx0XHRcdGZldzogXCJtaW51dG9zXCIsXG5cdFx0XHRcdG1hbnk6IFwibWludXRvc1wiLFxuXHRcdFx0XHRvdGhlcjogXCJtaW51dG9zXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2VndW5kb3NcIixcblx0XHRcdFx0b25lOiBcInNlZ3VuZG9cIixcblx0XHRcdFx0dHdvOiBcInNlZ3VuZG9zXCIsXG5cdFx0XHRcdGZldzogXCJzZWd1bmRvc1wiLFxuXHRcdFx0XHRtYW55OiBcInNlZ3VuZG9zXCIsXG5cdFx0XHRcdG90aGVyOiBcInNlZ3VuZG9zXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0ZGU6IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYGFtICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYHZvciAke3ZhbHVlfWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYGluICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBnZXJhZGUgZWJlbmAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiVGFnZW5cIixcblx0XHRcdFx0b25lOiBcIlRhZ1wiLFxuXHRcdFx0XHR0d286IFwiVGFnZW5cIixcblx0XHRcdFx0ZmV3OiBcIlRhZ2VuXCIsXG5cdFx0XHRcdG1hbnk6IFwiVGFnZW5cIixcblx0XHRcdFx0b3RoZXI6IFwiVGFnZW5cIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwiU3R1bmRlblwiLFxuXHRcdFx0XHRvbmU6IFwiU3R1bmRlXCIsXG5cdFx0XHRcdHR3bzogXCJTdHVuZGVuXCIsXG5cdFx0XHRcdGZldzogXCJTdHVuZGVuXCIsXG5cdFx0XHRcdG1hbnk6IFwiU3R1bmRlblwiLFxuXHRcdFx0XHRvdGhlcjogXCJTdHVuZGVuXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwiTWludXRlblwiLFxuXHRcdFx0XHRvbmU6IFwiTWludXRlXCIsXG5cdFx0XHRcdHR3bzogXCJNaW51dGVuXCIsXG5cdFx0XHRcdGZldzogXCJNaW51dGVuXCIsXG5cdFx0XHRcdG1hbnk6IFwiTWludXRlblwiLFxuXHRcdFx0XHRvdGhlcjogXCJNaW51dGVuXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiU2VrdW5kZW5cIixcblx0XHRcdFx0b25lOiBcIlNla3VuZGVcIixcblx0XHRcdFx0dHdvOiBcIlNla3VuZGVuXCIsXG5cdFx0XHRcdGZldzogXCJTZWt1bmRlblwiLFxuXHRcdFx0XHRtYW55OiBcIlNla3VuZGVuXCIsXG5cdFx0XHRcdG90aGVyOiBcIlNla3VuZGVuXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0ZnI6IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYGxlICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYGlsIHkgYSAke3ZhbHVlfWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYGRhbnMgJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYFx1MDBFMCBsJ2luc3RhbnRgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImpvdXJzXCIsXG5cdFx0XHRcdG9uZTogXCJqb3VyXCIsXG5cdFx0XHRcdHR3bzogXCJqb3Vyc1wiLFxuXHRcdFx0XHRmZXc6IFwiam91cnNcIixcblx0XHRcdFx0bWFueTogXCJqb3Vyc1wiLFxuXHRcdFx0XHRvdGhlcjogXCJqb3Vyc1wiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJoZXVyZXNcIixcblx0XHRcdFx0b25lOiBcImhldXJlXCIsXG5cdFx0XHRcdHR3bzogXCJoZXVyZXNcIixcblx0XHRcdFx0ZmV3OiBcImhldXJlc1wiLFxuXHRcdFx0XHRtYW55OiBcImhldXJlc1wiLFxuXHRcdFx0XHRvdGhlcjogXCJoZXVyZXNcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dGVzXCIsXG5cdFx0XHRcdG9uZTogXCJtaW51dGVcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0ZXNcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZXNcIixcblx0XHRcdFx0bWFueTogXCJtaW51dGVzXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0ZXNcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWNvbmRlc1wiLFxuXHRcdFx0XHRvbmU6IFwic2Vjb25kZVwiLFxuXHRcdFx0XHR0d286IFwic2Vjb25kZXNcIixcblx0XHRcdFx0ZmV3OiBcInNlY29uZGVzXCIsXG5cdFx0XHRcdG1hbnk6IFwic2Vjb25kZXNcIixcblx0XHRcdFx0b3RoZXI6IFwic2Vjb25kZXNcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRydToge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgXHUwNDNEXHUwNDMwICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYCR7dmFsdWV9IFx1MDQzRFx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzNGAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNyAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0N1x1MDQ0Mlx1MDQzRWAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiXHUwNDM0XHUwNDNEXHUwNDM1XHUwNDM5XCIsXG5cdFx0XHRcdG9uZTogXCJcdTA0MzRcdTA0MzVcdTA0M0RcdTA0NENcIixcblx0XHRcdFx0dHdvOiBcIlx1MDQzNFx1MDQzRFx1MDQ0RlwiLFxuXHRcdFx0XHRmZXc6IFwiXHUwNDM0XHUwNDNEXHUwNDRGXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwNDM0XHUwNDNEXHUwNDM1XHUwNDM5XCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDQzNFx1MDQzRFx1MDQzNVx1MDQzOVwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJcdTA0NDdcdTA0MzBcdTA0NDFcdTA0M0VcdTA0MzJcIixcblx0XHRcdFx0b25lOiBcIlx1MDQ0N1x1MDQzMFx1MDQ0MVwiLFxuXHRcdFx0XHR0d286IFwiXHUwNDQ3XHUwNDMwXHUwNDQxXHUwNDMwXCIsXG5cdFx0XHRcdGZldzogXCJcdTA0NDdcdTA0MzBcdTA0NDFcdTA0MzBcIixcblx0XHRcdFx0bWFueTogXCJcdTA0NDdcdTA0MzBcdTA0NDFcdTA0M0VcdTA0MzJcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwNDQ3XHUwNDMwXHUwNDQxXHUwNDNFXHUwNDMyXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDQzXHUwNDQyXCIsXG5cdFx0XHRcdG9uZTogXCJcdTA0M0NcdTA0MzhcdTA0M0RcdTA0NDNcdTA0NDJcdTA0MzBcIixcblx0XHRcdFx0dHdvOiBcIlx1MDQzQ1x1MDQzOFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0QlwiLFxuXHRcdFx0XHRmZXc6IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDQzXHUwNDQyXHUwNDRCXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDQzXHUwNDQyXCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDQzQ1x1MDQzOFx1MDQzRFx1MDQ0M1x1MDQ0MlwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHUwNDMwXCIsXG5cdFx0XHRcdHR3bzogXCJcdTA0NDFcdTA0MzVcdTA0M0FcdTA0NDNcdTA0M0RcdTA0MzRcdTA0NEJcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQ0QlwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTA0NDFcdTA0MzVcdTA0M0FcdTA0NDNcdTA0M0RcdTA0MzRcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRhcjoge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgXHUwNjQxXHUwNjRBICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYFx1MDY0NVx1MDY0Nlx1MDYzMCAke3ZhbHVlfWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYFx1MDYyOFx1MDYzOVx1MDYyRiAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgXHUwNjI3XHUwNjQ0XHUwNjIyXHUwNjQ2YCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJcdTA2MjNcdTA2NEFcdTA2MjdcdTA2NDVcIixcblx0XHRcdFx0b25lOiBcIlx1MDY0QVx1MDY0OFx1MDY0NVwiLFxuXHRcdFx0XHR0d286IFwiXHUwNjRBXHUwNjQ4XHUwNjQ1XHUwNjRBXHUwNjQ2XCIsXG5cdFx0XHRcdGZldzogXCJcdTA2MjNcdTA2NEFcdTA2MjdcdTA2NDVcIixcblx0XHRcdFx0bWFueTogXCJcdTA2MjNcdTA2NEFcdTA2MjdcdTA2NDVcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwNjIzXHUwNjRBXHUwNjI3XHUwNjQ1XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDYzM1x1MDYyN1x1MDYzOVx1MDYyN1x1MDYyQVwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwNjMzXHUwNjI3XHUwNjM5XHUwNjI5XCIsXG5cdFx0XHRcdHR3bzogXCJcdTA2MzNcdTA2MjdcdTA2MzlcdTA2MkFcdTA2NEFcdTA2NDZcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDYzM1x1MDYyN1x1MDYzOVx1MDYyN1x1MDYyQVwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDYzM1x1MDYyN1x1MDYzOVx1MDYyN1x1MDYyQVwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTA2MzNcdTA2MjdcdTA2MzlcdTA2MjdcdTA2MkFcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJcdTA2MkZcdTA2NDJcdTA2MjdcdTA2MjZcdTA2NDJcIixcblx0XHRcdFx0b25lOiBcIlx1MDYyRlx1MDY0Mlx1MDY0QVx1MDY0Mlx1MDYyOVwiLFxuXHRcdFx0XHR0d286IFwiXHUwNjJGXHUwNjQyXHUwNjRBXHUwNjQyXHUwNjJBXHUwNjRBXHUwNjQ2XCIsXG5cdFx0XHRcdGZldzogXCJcdTA2MkZcdTA2NDJcdTA2MjdcdTA2MjZcdTA2NDJcIixcblx0XHRcdFx0bWFueTogXCJcdTA2MkZcdTA2NDJcdTA2MjdcdTA2MjZcdTA2NDJcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwNjJGXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQyXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiXHUwNjJCXHUwNjQ4XHUwNjI3XHUwNjQ2XHUwNjRBXCIsXG5cdFx0XHRcdG9uZTogXCJcdTA2MkJcdTA2MjdcdTA2NDZcdTA2NEFcdTA2MjlcIixcblx0XHRcdFx0dHdvOiBcIlx1MDYyQlx1MDYyN1x1MDY0Nlx1MDY0QVx1MDYyQVx1MDY0QVx1MDY0NlwiLFxuXHRcdFx0XHRmZXc6IFwiXHUwNjJCXHUwNjQ4XHUwNjI3XHUwNjQ2XHUwNjRBXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwNjJCXHUwNjQ4XHUwNjI3XHUwNjQ2XHUwNjRBXCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDYyQlx1MDY0OFx1MDYyN1x1MDY0Nlx1MDY0QVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGhpOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGAke3ZhbHVlfSBcdTA5MTVcdTA5NEJgLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gXHUwOTJBXHUwOTM5XHUwOTMyXHUwOTQ3YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gXHUwOTJFXHUwOTQ3XHUwOTAyYCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBcdTA5MDVcdTA5MkRcdTA5NDBgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDkyNlx1MDkzRlx1MDkyOFwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwOTI2XHUwOTNGXHUwOTI4XCIsXG5cdFx0XHRcdHR3bzogXCJcdTA5MjZcdTA5M0ZcdTA5MjhcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDkyNlx1MDkzRlx1MDkyOFwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDkyNlx1MDkzRlx1MDkyOFwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTA5MjZcdTA5M0ZcdTA5MjhcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwiXHUwOTE4XHUwOTAyXHUwOTFGXHUwOTQ3XCIsXG5cdFx0XHRcdG9uZTogXCJcdTA5MThcdTA5MDJcdTA5MUZcdTA5M0VcIixcblx0XHRcdFx0dHdvOiBcIlx1MDkxOFx1MDkwMlx1MDkxRlx1MDk0N1wiLFxuXHRcdFx0XHRmZXc6IFwiXHUwOTE4XHUwOTAyXHUwOTFGXHUwOTQ3XCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwOTE4XHUwOTAyXHUwOTFGXHUwOTQ3XCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDkxOFx1MDkwMlx1MDkxRlx1MDk0N1wiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDkyRVx1MDkzRlx1MDkyOFx1MDkxRlwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwOTJFXHUwOTNGXHUwOTI4XHUwOTFGXCIsXG5cdFx0XHRcdHR3bzogXCJcdTA5MkVcdTA5M0ZcdTA5MjhcdTA5MUZcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDkyRVx1MDkzRlx1MDkyOFx1MDkxRlwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDkyRVx1MDkzRlx1MDkyOFx1MDkxRlwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTA5MkVcdTA5M0ZcdTA5MjhcdTA5MUZcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJcdTA5MzhcdTA5NDdcdTA5MTVcdTA5MDJcdTA5MjFcIixcblx0XHRcdFx0b25lOiBcIlx1MDkzOFx1MDk0N1x1MDkxNVx1MDkwMlx1MDkyMVwiLFxuXHRcdFx0XHR0d286IFwiXHUwOTM4XHUwOTQ3XHUwOTE1XHUwOTAyXHUwOTIxXCIsXG5cdFx0XHRcdGZldzogXCJcdTA5MzhcdTA5NDdcdTA5MTVcdTA5MDJcdTA5MjFcIixcblx0XHRcdFx0bWFueTogXCJcdTA5MzhcdTA5NDdcdTA5MTVcdTA5MDJcdTA5MjFcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwOTM4XHUwOTQ3XHUwOTE1XHUwOTAyXHUwOTIxXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0cHQ6IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYGVtICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYGhcdTAwRTEgJHt2YWx1ZX1gLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGBlbSAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgYWdvcmEgbWVzbW9gLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImRpYXNcIixcblx0XHRcdFx0b25lOiBcImRpYVwiLFxuXHRcdFx0XHR0d286IFwiZGlhc1wiLFxuXHRcdFx0XHRmZXc6IFwiZGlhc1wiLFxuXHRcdFx0XHRtYW55OiBcImRpYXNcIixcblx0XHRcdFx0b3RoZXI6IFwiZGlhc1wiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJob3Jhc1wiLFxuXHRcdFx0XHRvbmU6IFwiaG9yYVwiLFxuXHRcdFx0XHR0d286IFwiaG9yYXNcIixcblx0XHRcdFx0ZmV3OiBcImhvcmFzXCIsXG5cdFx0XHRcdG1hbnk6IFwiaG9yYXNcIixcblx0XHRcdFx0b3RoZXI6IFwiaG9yYXNcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dG9zXCIsXG5cdFx0XHRcdG9uZTogXCJtaW51dG9cIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0b3NcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0b3NcIixcblx0XHRcdFx0bWFueTogXCJtaW51dG9zXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0b3NcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWd1bmRvc1wiLFxuXHRcdFx0XHRvbmU6IFwic2VndW5kb1wiLFxuXHRcdFx0XHR0d286IFwic2VndW5kb3NcIixcblx0XHRcdFx0ZmV3OiBcInNlZ3VuZG9zXCIsXG5cdFx0XHRcdG1hbnk6IFwic2VndW5kb3NcIixcblx0XHRcdFx0b3RoZXI6IFwic2VndW5kb3NcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRqYToge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgJHt2YWx1ZX1cdTMwNkJgLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX1cdTUyNERgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGAke3ZhbHVlfVx1NUY4Q2AsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgXHUzMDVGXHUzMDYzXHUzMDVGXHU0RUNBYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJcdTY1RTVcIixcblx0XHRcdFx0b25lOiBcIlx1NjVFNVwiLFxuXHRcdFx0XHR0d286IFwiXHU2NUU1XCIsXG5cdFx0XHRcdGZldzogXCJcdTY1RTVcIixcblx0XHRcdFx0bWFueTogXCJcdTY1RTVcIixcblx0XHRcdFx0b3RoZXI6IFwiXHU2NUU1XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1NjY0Mlx1OTU5M1wiLFxuXHRcdFx0XHRvbmU6IFwiXHU2NjQyXHU5NTkzXCIsXG5cdFx0XHRcdHR3bzogXCJcdTY2NDJcdTk1OTNcIixcblx0XHRcdFx0ZmV3OiBcIlx1NjY0Mlx1OTU5M1wiLFxuXHRcdFx0XHRtYW55OiBcIlx1NjY0Mlx1OTU5M1wiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTY2NDJcdTk1OTNcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJcdTUyMDZcIixcblx0XHRcdFx0b25lOiBcIlx1NTIwNlwiLFxuXHRcdFx0XHR0d286IFwiXHU1MjA2XCIsXG5cdFx0XHRcdGZldzogXCJcdTUyMDZcIixcblx0XHRcdFx0bWFueTogXCJcdTUyMDZcIixcblx0XHRcdFx0b3RoZXI6IFwiXHU1MjA2XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG9uZTogXCJcdTc5RDJcIixcblx0XHRcdFx0dHdvOiBcIlx1NzlEMlwiLFxuXHRcdFx0XHRmZXc6IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHU3OUQyXCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1NzlEMlwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGl0OiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBpbCAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSBmYWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYGluICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBwcm9wcmlvIG9yYWAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZ2lvcm5pXCIsXG5cdFx0XHRcdG9uZTogXCJnaW9ybm9cIixcblx0XHRcdFx0dHdvOiBcImdpb3JuaVwiLFxuXHRcdFx0XHRmZXc6IFwiZ2lvcm5pXCIsXG5cdFx0XHRcdG1hbnk6IFwiZ2lvcm5pXCIsXG5cdFx0XHRcdG90aGVyOiBcImdpb3JuaVwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJvcmVcIixcblx0XHRcdFx0b25lOiBcIm9yYVwiLFxuXHRcdFx0XHR0d286IFwib3JlXCIsXG5cdFx0XHRcdGZldzogXCJvcmVcIixcblx0XHRcdFx0bWFueTogXCJvcmVcIixcblx0XHRcdFx0b3RoZXI6IFwib3JlXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwibWludXRpXCIsXG5cdFx0XHRcdG9uZTogXCJtaW51dG9cIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0aVwiLFxuXHRcdFx0XHRmZXc6IFwibWludXRpXCIsXG5cdFx0XHRcdG1hbnk6IFwibWludXRpXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0aVwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcInNlY29uZGlcIixcblx0XHRcdFx0b25lOiBcInNlY29uZG9cIixcblx0XHRcdFx0dHdvOiBcInNlY29uZGlcIixcblx0XHRcdFx0ZmV3OiBcInNlY29uZGlcIixcblx0XHRcdFx0bWFueTogXCJzZWNvbmRpXCIsXG5cdFx0XHRcdG90aGVyOiBcInNlY29uZGlcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRrbzoge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgJHt2YWx1ZX1cdUM1RDBgLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gXHVDODA0YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gXHVENkM0YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBcdUJDMjlcdUFFMDhgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcIlx1Qzc3Q1wiLFxuXHRcdFx0XHRvbmU6IFwiXHVDNzdDXCIsXG5cdFx0XHRcdHR3bzogXCJcdUM3N0NcIixcblx0XHRcdFx0ZmV3OiBcIlx1Qzc3Q1wiLFxuXHRcdFx0XHRtYW55OiBcIlx1Qzc3Q1wiLFxuXHRcdFx0XHRvdGhlcjogXCJcdUM3N0NcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwiXHVDMkRDXHVBQzA0XCIsXG5cdFx0XHRcdG9uZTogXCJcdUMyRENcdUFDMDRcIixcblx0XHRcdFx0dHdvOiBcIlx1QzJEQ1x1QUMwNFwiLFxuXHRcdFx0XHRmZXc6IFwiXHVDMkRDXHVBQzA0XCIsXG5cdFx0XHRcdG1hbnk6IFwiXHVDMkRDXHVBQzA0XCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1QzJEQ1x1QUMwNFwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIlx1QkQ4NFwiLFxuXHRcdFx0XHRvbmU6IFwiXHVCRDg0XCIsXG5cdFx0XHRcdHR3bzogXCJcdUJEODRcIixcblx0XHRcdFx0ZmV3OiBcIlx1QkQ4NFwiLFxuXHRcdFx0XHRtYW55OiBcIlx1QkQ4NFwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdUJEODRcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJcdUNEMDhcIixcblx0XHRcdFx0b25lOiBcIlx1Q0QwOFwiLFxuXHRcdFx0XHR0d286IFwiXHVDRDA4XCIsXG5cdFx0XHRcdGZldzogXCJcdUNEMDhcIixcblx0XHRcdFx0bWFueTogXCJcdUNEMDhcIixcblx0XHRcdFx0b3RoZXI6IFwiXHVDRDA4XCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0c3c6IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYGt3YSAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSBpbGl5b3BpdGFgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGBrYXRpa2EgJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYGhpdmkgcHVuZGVgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcInNpa3VcIixcblx0XHRcdFx0b25lOiBcInNpa3VcIixcblx0XHRcdFx0dHdvOiBcInNpa3VcIixcblx0XHRcdFx0ZmV3OiBcInNpa3VcIixcblx0XHRcdFx0bWFueTogXCJzaWt1XCIsXG5cdFx0XHRcdG90aGVyOiBcInNpa3VcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwibWFzYWFcIixcblx0XHRcdFx0b25lOiBcInNhYVwiLFxuXHRcdFx0XHR0d286IFwibWFzYWFcIixcblx0XHRcdFx0ZmV3OiBcIm1hc2FhXCIsXG5cdFx0XHRcdG1hbnk6IFwibWFzYWFcIixcblx0XHRcdFx0b3RoZXI6IFwibWFzYWFcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJkYWtpa2FcIixcblx0XHRcdFx0b25lOiBcImRha2lrYVwiLFxuXHRcdFx0XHR0d286IFwiZGFraWthXCIsXG5cdFx0XHRcdGZldzogXCJkYWtpa2FcIixcblx0XHRcdFx0bWFueTogXCJkYWtpa2FcIixcblx0XHRcdFx0b3RoZXI6IFwiZGFraWthXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2VrdW5kZVwiLFxuXHRcdFx0XHRvbmU6IFwic2VrdW5kZVwiLFxuXHRcdFx0XHR0d286IFwic2VrdW5kZVwiLFxuXHRcdFx0XHRmZXc6IFwic2VrdW5kZVwiLFxuXHRcdFx0XHRtYW55OiBcInNla3VuZGVcIixcblx0XHRcdFx0b3RoZXI6IFwic2VrdW5kZVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdG5sOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBvcCAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSBnZWxlZGVuYCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgb3ZlciAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgbmV0YCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJkYWdlblwiLFxuXHRcdFx0XHRvbmU6IFwiZGFnXCIsXG5cdFx0XHRcdHR3bzogXCJkYWdlblwiLFxuXHRcdFx0XHRmZXc6IFwiZGFnZW5cIixcblx0XHRcdFx0bWFueTogXCJkYWdlblwiLFxuXHRcdFx0XHRvdGhlcjogXCJkYWdlblwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJ1cmVuXCIsXG5cdFx0XHRcdG9uZTogXCJ1dXJcIixcblx0XHRcdFx0dHdvOiBcInVyZW5cIixcblx0XHRcdFx0ZmV3OiBcInVyZW5cIixcblx0XHRcdFx0bWFueTogXCJ1cmVuXCIsXG5cdFx0XHRcdG90aGVyOiBcInVyZW5cIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dGVuXCIsXG5cdFx0XHRcdG9uZTogXCJtaW51dXRcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0ZW5cIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZW5cIixcblx0XHRcdFx0bWFueTogXCJtaW51dGVuXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0ZW5cIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWNvbmRlblwiLFxuXHRcdFx0XHRvbmU6IFwic2Vjb25kZVwiLFxuXHRcdFx0XHR0d286IFwic2Vjb25kZW5cIixcblx0XHRcdFx0ZmV3OiBcInNlY29uZGVuXCIsXG5cdFx0XHRcdG1hbnk6IFwic2Vjb25kZW5cIixcblx0XHRcdFx0b3RoZXI6IFwic2Vjb25kZW5cIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRtczoge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgcGFkYSAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSB5YW5nIGxhbHVgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGAke3ZhbHVlfSBsYWdpYCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGB0YWRpYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJoYXJpXCIsXG5cdFx0XHRcdG9uZTogXCJoYXJpXCIsXG5cdFx0XHRcdHR3bzogXCJoYXJpXCIsXG5cdFx0XHRcdGZldzogXCJoYXJpXCIsXG5cdFx0XHRcdG1hbnk6IFwiaGFyaVwiLFxuXHRcdFx0XHRvdGhlcjogXCJoYXJpXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcImphbVwiLFxuXHRcdFx0XHRvbmU6IFwiamFtXCIsXG5cdFx0XHRcdHR3bzogXCJqYW1cIixcblx0XHRcdFx0ZmV3OiBcImphbVwiLFxuXHRcdFx0XHRtYW55OiBcImphbVwiLFxuXHRcdFx0XHRvdGhlcjogXCJqYW1cIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW5pdFwiLFxuXHRcdFx0XHRvbmU6IFwibWluaXRcIixcblx0XHRcdFx0dHdvOiBcIm1pbml0XCIsXG5cdFx0XHRcdGZldzogXCJtaW5pdFwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbml0XCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbml0XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2FhdFwiLFxuXHRcdFx0XHRvbmU6IFwic2FhdFwiLFxuXHRcdFx0XHR0d286IFwic2FhdFwiLFxuXHRcdFx0XHRmZXc6IFwic2FhdFwiLFxuXHRcdFx0XHRtYW55OiBcInNhYXRcIixcblx0XHRcdFx0b3RoZXI6IFwic2FhdFwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGlkOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBwYWRhICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYCR7dmFsdWV9IHlhbmcgbGFsdWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYGRhbGFtICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGB0YWRpYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJoYXJpXCIsXG5cdFx0XHRcdG9uZTogXCJoYXJpXCIsXG5cdFx0XHRcdHR3bzogXCJoYXJpXCIsXG5cdFx0XHRcdGZldzogXCJoYXJpXCIsXG5cdFx0XHRcdG1hbnk6IFwiaGFyaVwiLFxuXHRcdFx0XHRvdGhlcjogXCJoYXJpXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcImphbVwiLFxuXHRcdFx0XHRvbmU6IFwiamFtXCIsXG5cdFx0XHRcdHR3bzogXCJqYW1cIixcblx0XHRcdFx0ZmV3OiBcImphbVwiLFxuXHRcdFx0XHRtYW55OiBcImphbVwiLFxuXHRcdFx0XHRvdGhlcjogXCJqYW1cIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtZW5pdFwiLFxuXHRcdFx0XHRvbmU6IFwibWVuaXRcIixcblx0XHRcdFx0dHdvOiBcIm1lbml0XCIsXG5cdFx0XHRcdGZldzogXCJtZW5pdFwiLFxuXHRcdFx0XHRtYW55OiBcIm1lbml0XCIsXG5cdFx0XHRcdG90aGVyOiBcIm1lbml0XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiZGV0aWtcIixcblx0XHRcdFx0b25lOiBcImRldGlrXCIsXG5cdFx0XHRcdHR3bzogXCJkZXRpa1wiLFxuXHRcdFx0XHRmZXc6IFwiZGV0aWtcIixcblx0XHRcdFx0bWFueTogXCJkZXRpa1wiLFxuXHRcdFx0XHRvdGhlcjogXCJkZXRpa1wiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdHRyOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGAke3ZhbHVlfSB0YXJpaGluZGVgLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gXHUwMEY2bmNlYCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gc29ucmFgLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYGF6IFx1MDBGNm5jZWAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZ1x1MDBGQ25sZXJcIixcblx0XHRcdFx0b25lOiBcImdcdTAwRkNuXCIsXG5cdFx0XHRcdHR3bzogXCJnXHUwMEZDblwiLFxuXHRcdFx0XHRmZXc6IFwiZ1x1MDBGQ25cIixcblx0XHRcdFx0bWFueTogXCJnXHUwMEZDblwiLFxuXHRcdFx0XHRvdGhlcjogXCJnXHUwMEZDblwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJzYWF0bGVyXCIsXG5cdFx0XHRcdG9uZTogXCJzYWF0XCIsXG5cdFx0XHRcdHR3bzogXCJzYWF0XCIsXG5cdFx0XHRcdGZldzogXCJzYWF0XCIsXG5cdFx0XHRcdG1hbnk6IFwic2FhdFwiLFxuXHRcdFx0XHRvdGhlcjogXCJzYWF0XCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwiZGFraWthbGFyXCIsXG5cdFx0XHRcdG9uZTogXCJkYWtpa2FcIixcblx0XHRcdFx0dHdvOiBcImRha2lrYVwiLFxuXHRcdFx0XHRmZXc6IFwiZGFraWthXCIsXG5cdFx0XHRcdG1hbnk6IFwiZGFraWthXCIsXG5cdFx0XHRcdG90aGVyOiBcImRha2lrYVwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcInNhbml5ZWxlclwiLFxuXHRcdFx0XHRvbmU6IFwic2FuaXllXCIsXG5cdFx0XHRcdHR3bzogXCJzYW5peWVcIixcblx0XHRcdFx0ZmV3OiBcInNhbml5ZVwiLFxuXHRcdFx0XHRtYW55OiBcInNhbml5ZVwiLFxuXHRcdFx0XHRvdGhlcjogXCJzYW5peWVcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRwbDoge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgdyBkbml1ICR7dmFsdWV9YCxcblx0XHRcdHBhc3Q6ICh2YWx1ZSkgPT4gYCR7dmFsdWV9IHRlbXVgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGB6YSAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgcHJ6ZWQgY2h3aWxcdTAxMDVgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImRuaVwiLFxuXHRcdFx0XHRvbmU6IFwiZHppZVx1MDE0NFwiLFxuXHRcdFx0XHR0d286IFwiZG5pXCIsXG5cdFx0XHRcdGZldzogXCJkbmlcIixcblx0XHRcdFx0bWFueTogXCJkbmlcIixcblx0XHRcdFx0b3RoZXI6IFwiZG5pXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcImdvZHppblwiLFxuXHRcdFx0XHRvbmU6IFwiZ29kemluYVwiLFxuXHRcdFx0XHR0d286IFwiZ29kemlueVwiLFxuXHRcdFx0XHRmZXc6IFwiZ29kemlueVwiLFxuXHRcdFx0XHRtYW55OiBcImdvZHppblwiLFxuXHRcdFx0XHRvdGhlcjogXCJnb2R6aW5cIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dFwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRhXCIsXG5cdFx0XHRcdHR3bzogXCJtaW51dHlcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0eVwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbnV0XCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2VrdW5kXCIsXG5cdFx0XHRcdG9uZTogXCJzZWt1bmRhXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmR5XCIsXG5cdFx0XHRcdGZldzogXCJzZWt1bmR5XCIsXG5cdFx0XHRcdG1hbnk6IFwic2VrdW5kXCIsXG5cdFx0XHRcdG90aGVyOiBcInNla3VuZFwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdHN2OiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBkZW4gJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgZlx1MDBGNnIgJHt2YWx1ZX0gc2VkYW5gLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGBvbSAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgbnlzc2AsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZGFnYXJcIixcblx0XHRcdFx0b25lOiBcImRhZ1wiLFxuXHRcdFx0XHR0d286IFwiZGFnYXJcIixcblx0XHRcdFx0ZmV3OiBcImRhZ2FyXCIsXG5cdFx0XHRcdG1hbnk6IFwiZGFnYXJcIixcblx0XHRcdFx0b3RoZXI6IFwiZGFnYXJcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwidGltbWFyXCIsXG5cdFx0XHRcdG9uZTogXCJ0aW1tZVwiLFxuXHRcdFx0XHR0d286IFwidGltbWFyXCIsXG5cdFx0XHRcdGZldzogXCJ0aW1tYXJcIixcblx0XHRcdFx0bWFueTogXCJ0aW1tYXJcIixcblx0XHRcdFx0b3RoZXI6IFwidGltbWFyXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwibWludXRlclwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0ZXJcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZXJcIixcblx0XHRcdFx0bWFueTogXCJtaW51dGVyXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0ZXJcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRvbmU6IFwic2VrdW5kXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRmZXc6IFwic2VrdW5kZXJcIixcblx0XHRcdFx0bWFueTogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRvdGhlcjogXCJzZWt1bmRlclwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdHJvOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBwZSAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGBhY3VtICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgcGVzdGUgJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYGNoaWFyIGFjdW1gLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcInppbGVcIixcblx0XHRcdFx0b25lOiBcInppXCIsXG5cdFx0XHRcdHR3bzogXCJ6aWxlXCIsXG5cdFx0XHRcdGZldzogXCJ6aWxlXCIsXG5cdFx0XHRcdG1hbnk6IFwiemlsZVwiLFxuXHRcdFx0XHRvdGhlcjogXCJ6aWxlXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIm9yZVwiLFxuXHRcdFx0XHRvbmU6IFwib3JcdTAxMDNcIixcblx0XHRcdFx0dHdvOiBcIm9yZVwiLFxuXHRcdFx0XHRmZXc6IFwib3JlXCIsXG5cdFx0XHRcdG1hbnk6IFwib3JlXCIsXG5cdFx0XHRcdG90aGVyOiBcIm9yZVwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRmZXc6IFwibWludXRlXCIsXG5cdFx0XHRcdG1hbnk6IFwibWludXRlXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0ZVwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcInNlY3VuZGVcIixcblx0XHRcdFx0b25lOiBcInNlY3VuZFx1MDEwM1wiLFxuXHRcdFx0XHR0d286IFwic2VjdW5kZVwiLFxuXHRcdFx0XHRmZXc6IFwic2VjdW5kZVwiLFxuXHRcdFx0XHRtYW55OiBcInNlY3VuZGVcIixcblx0XHRcdFx0b3RoZXI6IFwic2VjdW5kZVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGJnOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBcdTA0M0RcdTA0MzAgJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM4ICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0ICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBcdTA0NDJcdTA0M0VcdTA0M0FcdTA0NDMtXHUwNDQ5XHUwNDNFYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJcdTA0MzRcdTA0M0RcdTA0MzhcIixcblx0XHRcdFx0b25lOiBcIlx1MDQzNFx1MDQzNVx1MDQzRFwiLFxuXHRcdFx0XHR0d286IFwiXHUwNDM0XHUwNDNEXHUwNDM4XCIsXG5cdFx0XHRcdGZldzogXCJcdTA0MzRcdTA0M0RcdTA0MzhcIixcblx0XHRcdFx0bWFueTogXCJcdTA0MzRcdTA0M0RcdTA0MzhcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwNDM0XHUwNDNEXHUwNDM4XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQzMFwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwNDQ3XHUwNDMwXHUwNDQxXCIsXG5cdFx0XHRcdHR3bzogXCJcdTA0NDdcdTA0MzBcdTA0NDFcdTA0MzBcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQzMFwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQzMFwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTA0NDdcdTA0MzBcdTA0NDFcdTA0MzBcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJcdTA0M0NcdTA0MzhcdTA0M0RcdTA0NDNcdTA0NDJcdTA0MzhcIixcblx0XHRcdFx0b25lOiBcIlx1MDQzQ1x1MDQzOFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQzMFwiLFxuXHRcdFx0XHR0d286IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDQzXHUwNDQyXHUwNDM4XCIsXG5cdFx0XHRcdGZldzogXCJcdTA0M0NcdTA0MzhcdTA0M0RcdTA0NDNcdTA0NDJcdTA0MzhcIixcblx0XHRcdFx0bWFueTogXCJcdTA0M0NcdTA0MzhcdTA0M0RcdTA0NDNcdTA0NDJcdTA0MzhcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDQzXHUwNDQyXHUwNDM4XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHUwNDM4XCIsXG5cdFx0XHRcdG9uZTogXCJcdTA0NDFcdTA0MzVcdTA0M0FcdTA0NDNcdTA0M0RcdTA0MzRcdTA0MzBcIixcblx0XHRcdFx0dHdvOiBcIlx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQzOFwiLFxuXHRcdFx0XHRmZXc6IFwiXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHUwNDM4XCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHUwNDM4XCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQzOFwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGRhOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBkZW4gJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgZm9yICR7dmFsdWV9IHNpZGVuYCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgb20gJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYGxpZ2UgbnVgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImRhZ2VcIixcblx0XHRcdFx0b25lOiBcImRhZ1wiLFxuXHRcdFx0XHR0d286IFwiZGFnZVwiLFxuXHRcdFx0XHRmZXc6IFwiZGFnZVwiLFxuXHRcdFx0XHRtYW55OiBcImRhZ2VcIixcblx0XHRcdFx0b3RoZXI6IFwiZGFnZVwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJ0aW1lclwiLFxuXHRcdFx0XHRvbmU6IFwidGltZVwiLFxuXHRcdFx0XHR0d286IFwidGltZXJcIixcblx0XHRcdFx0ZmV3OiBcInRpbWVyXCIsXG5cdFx0XHRcdG1hbnk6IFwidGltZXJcIixcblx0XHRcdFx0b3RoZXI6IFwidGltZXJcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dHRlclwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV0dGVyXCIsXG5cdFx0XHRcdGZldzogXCJtaW51dHRlclwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbnV0dGVyXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0dGVyXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2VrdW5kZXJcIixcblx0XHRcdFx0b25lOiBcInNla3VuZFwiLFxuXHRcdFx0XHR0d286IFwic2VrdW5kZXJcIixcblx0XHRcdFx0ZmV3OiBcInNla3VuZGVyXCIsXG5cdFx0XHRcdG1hbnk6IFwic2VrdW5kZXJcIixcblx0XHRcdFx0b3RoZXI6IFwic2VrdW5kZXJcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblxuXHRmaToge1xuXHRcdHRlbXBsYXRlOiB7XG5cdFx0XHRvbjogKHZhbHVlKSA9PiBgcFx1MDBFNGl2XHUwMEU0blx1MDBFNCAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSBzaXR0ZW5gLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGAke3ZhbHVlfSBrdWx1dHR1YWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBganV1cmkgbnl0YCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJwXHUwMEU0aXZcdTAwRTRcdTAwRTRcIixcblx0XHRcdFx0b25lOiBcInBcdTAwRTRpdlx1MDBFNFwiLFxuXHRcdFx0XHR0d286IFwicFx1MDBFNGl2XHUwMEU0XHUwMEU0XCIsXG5cdFx0XHRcdGZldzogXCJwXHUwMEU0aXZcdTAwRTRcdTAwRTRcIixcblx0XHRcdFx0bWFueTogXCJwXHUwMEU0aXZcdTAwRTRcdTAwRTRcIixcblx0XHRcdFx0b3RoZXI6IFwicFx1MDBFNGl2XHUwMEU0XHUwMEU0XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcInR1bnRpYVwiLFxuXHRcdFx0XHRvbmU6IFwidHVudGlcIixcblx0XHRcdFx0dHdvOiBcInR1bnRpYVwiLFxuXHRcdFx0XHRmZXc6IFwidHVudGlhXCIsXG5cdFx0XHRcdG1hbnk6IFwidHVudGlhXCIsXG5cdFx0XHRcdG90aGVyOiBcInR1bnRpYVwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIm1pbnV1dHRpYVwiLFxuXHRcdFx0XHRvbmU6IFwibWludXV0dGlcIixcblx0XHRcdFx0dHdvOiBcIm1pbnV1dHRpYVwiLFxuXHRcdFx0XHRmZXc6IFwibWludXV0dGlhXCIsXG5cdFx0XHRcdG1hbnk6IFwibWludXV0dGlhXCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV1dHRpYVwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcInNla3VudGlhXCIsXG5cdFx0XHRcdG9uZTogXCJzZWt1bnRpXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bnRpYVwiLFxuXHRcdFx0XHRmZXc6IFwic2VrdW50aWFcIixcblx0XHRcdFx0bWFueTogXCJzZWt1bnRpYVwiLFxuXHRcdFx0XHRvdGhlcjogXCJzZWt1bnRpYVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGNzOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBkbmUgJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgcFx1MDE1OWVkICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgemEgJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYHByXHUwMEUxdlx1MDExQiB0ZVx1MDEwRmAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZG55XCIsXG5cdFx0XHRcdG9uZTogXCJkZW5cIixcblx0XHRcdFx0dHdvOiBcImRueVwiLFxuXHRcdFx0XHRmZXc6IFwiZG55XCIsXG5cdFx0XHRcdG1hbnk6IFwiZG5cdTAxNkZcIixcblx0XHRcdFx0b3RoZXI6IFwiZG55XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcImhvZGluXCIsXG5cdFx0XHRcdG9uZTogXCJob2RpbmFcIixcblx0XHRcdFx0dHdvOiBcImhvZGlueVwiLFxuXHRcdFx0XHRmZXc6IFwiaG9kaW55XCIsXG5cdFx0XHRcdG1hbnk6IFwiaG9kaW5cIixcblx0XHRcdFx0b3RoZXI6IFwiaG9kaW5cIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJtaW51dFwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRhXCIsXG5cdFx0XHRcdHR3bzogXCJtaW51dHlcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0eVwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbnV0XCIsXG5cdFx0XHRcdG90aGVyOiBcIm1pbnV0XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwic2VrdW5kXCIsXG5cdFx0XHRcdG9uZTogXCJzZWt1bmRhXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmR5XCIsXG5cdFx0XHRcdGZldzogXCJzZWt1bmR5XCIsXG5cdFx0XHRcdG1hbnk6IFwic2VrdW5kXCIsXG5cdFx0XHRcdG90aGVyOiBcInNla3VuZFwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGVsOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBcdTAzQzNcdTAzQzRcdTAzQjlcdTAzQzIgJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgXHUwM0MwXHUwM0MxXHUwM0I5XHUwM0JEICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgXHUwM0MzXHUwM0I1ICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBcdTAzQkNcdTAzQ0NcdTAzQkJcdTAzQjlcdTAzQzIgXHUwM0M0XHUwM0NFXHUwM0MxXHUwM0IxYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJcdTAzQjdcdTAzQkNcdTAzQURcdTAzQzFcdTAzQjVcdTAzQzJcIixcblx0XHRcdFx0b25lOiBcIlx1MDNCN1x1MDNCQ1x1MDNBRFx1MDNDMVx1MDNCMVwiLFxuXHRcdFx0XHR0d286IFwiXHUwM0I3XHUwM0JDXHUwM0FEXHUwM0MxXHUwM0I1XHUwM0MyXCIsXG5cdFx0XHRcdGZldzogXCJcdTAzQjdcdTAzQkNcdTAzQURcdTAzQzFcdTAzQjVcdTAzQzJcIixcblx0XHRcdFx0bWFueTogXCJcdTAzQjdcdTAzQkNcdTAzQURcdTAzQzFcdTAzQjVcdTAzQzJcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwM0I3XHUwM0JDXHUwM0FEXHUwM0MxXHUwM0I1XHUwM0MyXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcIlx1MDNDRVx1MDNDMVx1MDNCNVx1MDNDMlwiLFxuXHRcdFx0XHRvbmU6IFwiXHUwM0NFXHUwM0MxXHUwM0IxXCIsXG5cdFx0XHRcdHR3bzogXCJcdTAzQ0VcdTAzQzFcdTAzQjVcdTAzQzJcIixcblx0XHRcdFx0ZmV3OiBcIlx1MDNDRVx1MDNDMVx1MDNCNVx1MDNDMlwiLFxuXHRcdFx0XHRtYW55OiBcIlx1MDNDRVx1MDNDMVx1MDNCNVx1MDNDMlwiLFxuXHRcdFx0XHRvdGhlcjogXCJcdTAzQ0VcdTAzQzFcdTAzQjVcdTAzQzJcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJcdTAzQkJcdTAzQjVcdTAzQzBcdTAzQzRcdTAzQUNcIixcblx0XHRcdFx0b25lOiBcIlx1MDNCQlx1MDNCNVx1MDNDMFx1MDNDNFx1MDNDQ1wiLFxuXHRcdFx0XHR0d286IFwiXHUwM0JCXHUwM0I1XHUwM0MwXHUwM0M0XHUwM0FDXCIsXG5cdFx0XHRcdGZldzogXCJcdTAzQkJcdTAzQjVcdTAzQzBcdTAzQzRcdTAzQUNcIixcblx0XHRcdFx0bWFueTogXCJcdTAzQkJcdTAzQjVcdTAzQzBcdTAzQzRcdTAzQUNcIixcblx0XHRcdFx0b3RoZXI6IFwiXHUwM0JCXHUwM0I1XHUwM0MwXHUwM0M0XHUwM0FDXCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiXHUwM0I0XHUwM0I1XHUwM0M1XHUwM0M0XHUwM0I1XHUwM0MxXHUwM0NDXHUwM0JCXHUwM0I1XHUwM0MwXHUwM0M0XHUwM0IxXCIsXG5cdFx0XHRcdG9uZTogXCJcdTAzQjRcdTAzQjVcdTAzQzVcdTAzQzRcdTAzQjVcdTAzQzFcdTAzQ0NcdTAzQkJcdTAzQjVcdTAzQzBcdTAzQzRcdTAzQkZcIixcblx0XHRcdFx0dHdvOiBcIlx1MDNCNFx1MDNCNVx1MDNDNVx1MDNDNFx1MDNCNVx1MDNDMVx1MDNDQ1x1MDNCQlx1MDNCNVx1MDNDMFx1MDNDNFx1MDNCMVwiLFxuXHRcdFx0XHRmZXc6IFwiXHUwM0I0XHUwM0I1XHUwM0M1XHUwM0M0XHUwM0I1XHUwM0MxXHUwM0NDXHUwM0JCXHUwM0I1XHUwM0MwXHUwM0M0XHUwM0IxXCIsXG5cdFx0XHRcdG1hbnk6IFwiXHUwM0I0XHUwM0I1XHUwM0M1XHUwM0M0XHUwM0I1XHUwM0MxXHUwM0NDXHUwM0JCXHUwM0I1XHUwM0MwXHUwM0M0XHUwM0IxXCIsXG5cdFx0XHRcdG90aGVyOiBcIlx1MDNCNFx1MDNCNVx1MDNDNVx1MDNDNFx1MDNCNVx1MDNDMVx1MDNDQ1x1MDNCQlx1MDNCNVx1MDNDMFx1MDNDNFx1MDNCMVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdGhyOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBuYSAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGBwcmlqZSAke3ZhbHVlfWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYHphICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBwcmlqZSB0cmVudXRrYWAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZGFuYVwiLFxuXHRcdFx0XHRvbmU6IFwiZGFuXCIsXG5cdFx0XHRcdHR3bzogXCJkYW5hXCIsXG5cdFx0XHRcdGZldzogXCJkYW5hXCIsXG5cdFx0XHRcdG1hbnk6IFwiZGFuYVwiLFxuXHRcdFx0XHRvdGhlcjogXCJkYW5hXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcInNhdGlcIixcblx0XHRcdFx0b25lOiBcInNhdFwiLFxuXHRcdFx0XHR0d286IFwic2F0YVwiLFxuXHRcdFx0XHRmZXc6IFwic2F0YVwiLFxuXHRcdFx0XHRtYW55OiBcInNhdGlcIixcblx0XHRcdFx0b3RoZXI6IFwic2F0aVwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIm1pbnV0YVwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRhXCIsXG5cdFx0XHRcdHR3bzogXCJtaW51dGVcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbnV0YVwiLFxuXHRcdFx0XHRvdGhlcjogXCJtaW51dGFcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWt1bmRpXCIsXG5cdFx0XHRcdG9uZTogXCJzZWt1bmRhXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmRlXCIsXG5cdFx0XHRcdGZldzogXCJzZWt1bmRlXCIsXG5cdFx0XHRcdG1hbnk6IFwic2VrdW5kaVwiLFxuXHRcdFx0XHRvdGhlcjogXCJzZWt1bmRpXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0c2s6IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYHYgZGVcdTAxNDggJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgcHJlZCAke3ZhbHVlfWAsXG5cdFx0XHRmdXR1cmU6ICh2YWx1ZSkgPT4gYHphICR7dmFsdWV9YCxcblx0XHRcdGp1c3ROb3c6ICgpID0+IGBwclx1MDBFMXZlIHRlcmF6YCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJkbmlcIixcblx0XHRcdFx0b25lOiBcImRlXHUwMTQ4XCIsXG5cdFx0XHRcdHR3bzogXCJkbmlcIixcblx0XHRcdFx0ZmV3OiBcImRuaVwiLFxuXHRcdFx0XHRtYW55OiBcImRuXHUwMEVEXCIsXG5cdFx0XHRcdG90aGVyOiBcImRuaVwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdXI6IHtcblx0XHRcdFx0emVybzogXCJob2RpbnlcIixcblx0XHRcdFx0b25lOiBcImhvZGluYVwiLFxuXHRcdFx0XHR0d286IFwiaG9kaW55XCIsXG5cdFx0XHRcdGZldzogXCJob2RpbnlcIixcblx0XHRcdFx0bWFueTogXCJob2RcdTAwRURuXCIsXG5cdFx0XHRcdG90aGVyOiBcImhvZGlueVwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIm1pblx1MDBGQXR5XCIsXG5cdFx0XHRcdG9uZTogXCJtaW5cdTAwRkF0YVwiLFxuXHRcdFx0XHR0d286IFwibWluXHUwMEZBdHlcIixcblx0XHRcdFx0ZmV3OiBcIm1pblx1MDBGQXR5XCIsXG5cdFx0XHRcdG1hbnk6IFwibWluXHUwMEZBdFwiLFxuXHRcdFx0XHRvdGhlcjogXCJtaW5cdTAwRkF0eVwiLFxuXHRcdFx0fSxcblx0XHRcdHNlY29uZDoge1xuXHRcdFx0XHR6ZXJvOiBcInNla3VuZHlcIixcblx0XHRcdFx0b25lOiBcInNla3VuZGFcIixcblx0XHRcdFx0dHdvOiBcInNla3VuZHlcIixcblx0XHRcdFx0ZmV3OiBcInNla3VuZHlcIixcblx0XHRcdFx0bWFueTogXCJzZWtcdTAwRkFuZFwiLFxuXHRcdFx0XHRvdGhlcjogXCJzZWt1bmR5XCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cblx0bm86IHtcblx0XHR0ZW1wbGF0ZToge1xuXHRcdFx0b246ICh2YWx1ZSkgPT4gYHBcdTAwRTUgJHt2YWx1ZX1gLFxuXHRcdFx0cGFzdDogKHZhbHVlKSA9PiBgJHt2YWx1ZX0gc2lkZW5gLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGBvbSAke3ZhbHVlfWAsXG5cdFx0XHRqdXN0Tm93OiAoKSA9PiBgbmV0dG9wcGAsXG5cdFx0fSxcblx0XHR1bml0czoge1xuXHRcdFx0ZGF5OiB7XG5cdFx0XHRcdHplcm86IFwiZGFnZXJcIixcblx0XHRcdFx0b25lOiBcImRhZ1wiLFxuXHRcdFx0XHR0d286IFwiZGFnZXJcIixcblx0XHRcdFx0ZmV3OiBcImRhZ2VyXCIsXG5cdFx0XHRcdG1hbnk6IFwiZGFnZXJcIixcblx0XHRcdFx0b3RoZXI6IFwiZGFnZXJcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwidGltZXJcIixcblx0XHRcdFx0b25lOiBcInRpbWVcIixcblx0XHRcdFx0dHdvOiBcInRpbWVyXCIsXG5cdFx0XHRcdGZldzogXCJ0aW1lclwiLFxuXHRcdFx0XHRtYW55OiBcInRpbWVyXCIsXG5cdFx0XHRcdG90aGVyOiBcInRpbWVyXCIsXG5cdFx0XHR9LFxuXHRcdFx0bWludXRlOiB7XG5cdFx0XHRcdHplcm86IFwibWludXR0ZXJcIixcblx0XHRcdFx0b25lOiBcIm1pbnV0dFwiLFxuXHRcdFx0XHR0d286IFwibWludXR0ZXJcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0dGVyXCIsXG5cdFx0XHRcdG1hbnk6IFwibWludXR0ZXJcIixcblx0XHRcdFx0b3RoZXI6IFwibWludXR0ZXJcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRvbmU6IFwic2VrdW5kXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRmZXc6IFwic2VrdW5kZXJcIixcblx0XHRcdFx0bWFueTogXCJzZWt1bmRlclwiLFxuXHRcdFx0XHRvdGhlcjogXCJzZWt1bmRlclwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdHNsOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGBuYSAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGBwcmVkICR7dmFsdWV9YCxcblx0XHRcdGZ1dHVyZTogKHZhbHVlKSA9PiBgXHUwMTBEZXogJHt2YWx1ZX1gLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYHJhdm5vIHpkYWpgLFxuXHRcdH0sXG5cdFx0dW5pdHM6IHtcblx0XHRcdGRheToge1xuXHRcdFx0XHR6ZXJvOiBcImRuaVwiLFxuXHRcdFx0XHRvbmU6IFwiZGFuXCIsXG5cdFx0XHRcdHR3bzogXCJkbmlcIixcblx0XHRcdFx0ZmV3OiBcImRuaVwiLFxuXHRcdFx0XHRtYW55OiBcImRuaVwiLFxuXHRcdFx0XHRvdGhlcjogXCJkbmlcIixcblx0XHRcdH0sXG5cdFx0XHRob3VyOiB7XG5cdFx0XHRcdHplcm86IFwidXJlXCIsXG5cdFx0XHRcdG9uZTogXCJ1cmFcIixcblx0XHRcdFx0dHdvOiBcInVyZVwiLFxuXHRcdFx0XHRmZXc6IFwidXJlXCIsXG5cdFx0XHRcdG1hbnk6IFwidXJlXCIsXG5cdFx0XHRcdG90aGVyOiBcInVyZVwiLFxuXHRcdFx0fSxcblx0XHRcdG1pbnV0ZToge1xuXHRcdFx0XHR6ZXJvOiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRvbmU6IFwibWludXRhXCIsXG5cdFx0XHRcdHR3bzogXCJtaW51dGVcIixcblx0XHRcdFx0ZmV3OiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRtYW55OiBcIm1pbnV0ZVwiLFxuXHRcdFx0XHRvdGhlcjogXCJtaW51dGVcIixcblx0XHRcdH0sXG5cdFx0XHRzZWNvbmQ6IHtcblx0XHRcdFx0emVybzogXCJzZWt1bmRlXCIsXG5cdFx0XHRcdG9uZTogXCJzZWt1bmRhXCIsXG5cdFx0XHRcdHR3bzogXCJzZWt1bmRlXCIsXG5cdFx0XHRcdGZldzogXCJzZWt1bmRlXCIsXG5cdFx0XHRcdG1hbnk6IFwic2VrdW5kXCIsXG5cdFx0XHRcdG90aGVyOiBcInNla3VuZFwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXG5cdHZpOiB7XG5cdFx0dGVtcGxhdGU6IHtcblx0XHRcdG9uOiAodmFsdWUpID0+IGB2XHUwMEUwbyAke3ZhbHVlfWAsXG5cdFx0XHRwYXN0OiAodmFsdWUpID0+IGAke3ZhbHVlfSB0clx1MDFCMFx1MUVEQmNgLFxuXHRcdFx0ZnV0dXJlOiAodmFsdWUpID0+IGAke3ZhbHVlfSBzYXVgLFxuXHRcdFx0anVzdE5vdzogKCkgPT4gYHZcdTFFRUJhIG1cdTFFREJpYCxcblx0XHR9LFxuXHRcdHVuaXRzOiB7XG5cdFx0XHRkYXk6IHtcblx0XHRcdFx0emVybzogXCJuZ1x1MDBFMHlcIixcblx0XHRcdFx0b25lOiBcIm5nXHUwMEUweVwiLFxuXHRcdFx0XHR0d286IFwibmdcdTAwRTB5XCIsXG5cdFx0XHRcdGZldzogXCJuZ1x1MDBFMHlcIixcblx0XHRcdFx0bWFueTogXCJuZ1x1MDBFMHlcIixcblx0XHRcdFx0b3RoZXI6IFwibmdcdTAwRTB5XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG91cjoge1xuXHRcdFx0XHR6ZXJvOiBcImdpXHUxRUREXCIsXG5cdFx0XHRcdG9uZTogXCJnaVx1MUVERFwiLFxuXHRcdFx0XHR0d286IFwiZ2lcdTFFRERcIixcblx0XHRcdFx0ZmV3OiBcImdpXHUxRUREXCIsXG5cdFx0XHRcdG1hbnk6IFwiZ2lcdTFFRERcIixcblx0XHRcdFx0b3RoZXI6IFwiZ2lcdTFFRERcIixcblx0XHRcdH0sXG5cdFx0XHRtaW51dGU6IHtcblx0XHRcdFx0emVybzogXCJwaFx1MDBGQXRcIixcblx0XHRcdFx0b25lOiBcInBoXHUwMEZBdFwiLFxuXHRcdFx0XHR0d286IFwicGhcdTAwRkF0XCIsXG5cdFx0XHRcdGZldzogXCJwaFx1MDBGQXRcIixcblx0XHRcdFx0bWFueTogXCJwaFx1MDBGQXRcIixcblx0XHRcdFx0b3RoZXI6IFwicGhcdTAwRkF0XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2Vjb25kOiB7XG5cdFx0XHRcdHplcm86IFwiZ2lcdTAwRTJ5XCIsXG5cdFx0XHRcdG9uZTogXCJnaVx1MDBFMnlcIixcblx0XHRcdFx0dHdvOiBcImdpXHUwMEUyeVwiLFxuXHRcdFx0XHRmZXc6IFwiZ2lcdTAwRTJ5XCIsXG5cdFx0XHRcdG1hbnk6IFwiZ2lcdTAwRTJ5XCIsXG5cdFx0XHRcdG90aGVyOiBcImdpXHUwMEUyeVwiLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxufTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2NhbGVPZkRvY3VtZW50IH0gZnJvbSBcIi4uL2RvbS9sb2NhbGUubWpzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBJRCB9IGZyb20gXCIuLi90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0LCBpc1N0cmluZywgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge1xuXHRnZXREb2N1bWVudFRyYW5zbGF0aW9ucyxcblx0VHJhbnNsYXRpb25zLFxufSBmcm9tIFwiLi4vaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5pbXBvcnQge1xuXHR2YWxpZGF0ZUZ1bmN0aW9uLFxuXHR2YWxpZGF0ZUludGVnZXIsXG5cdHZhbGlkYXRlT2JqZWN0LFxuXHR2YWxpZGF0ZVByaW1pdGl2ZSxcblx0dmFsaWRhdGVTdHJpbmcsXG5cdHZhbGlkYXRlQm9vbGVhbixcbn0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7IFBhdGhmaW5kZXIgfSBmcm9tIFwiLi9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZUFnbyB9IGZyb20gXCIuLi9pMThuL3RpbWUtYWdvLm1qc1wiO1xuXG5leHBvcnQgeyBUcmFuc2Zvcm1lciB9O1xuXG4vKipcbiAqIFRoZSB0cmFuc2Zvcm1lciBjbGFzcyBpcyBhIHN3aXNzIGFybXkga25pZmUgZm9yIG1hbmlwdWxhdGluZyB2YWx1ZXMuXG4gKlxuICogQSBzaW1wbGUgZXhhbXBsZSBpcyB0aGUgY29udmVyc2lvbiBvZiBhbGwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UuIGZvciB0aGlzIHB1cnBvc2UgdGhlIGNvbW1hbmQgYHRvbG93ZXJgIG11c3QgYmUgdXNlZC5cbiAqXG4gKiBgYGBqc1xuICogbGV0IHQgPSBuZXcgVHJhbnNmb3JtZXIoJ3RvbG93ZXInKS5ydW4oJ0FCQycpOyAvLyBcdTIxQTYgYWJjXG4gKiBgYGBcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvbGlicmFyaWVzL3RyYW5zZm9ybWVyXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2xpYnJhcmllcy90cmFuc2Zvcm1lci9zaW1wbGVcbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgdHJhbnNmb3JtZXIgY2xhc3MgaXMgYSBzd2lzcyBhcm15IGtuaWZlIGZvciBtYW5pcHVsYXRpbmcgdmFsdWVzLiBlc3BlY2lhbGx5IGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHBpcGUsIHByb2Nlc3NpbmcgY2hhaW5zIGNhbiBiZSBidWlsdCB1cC5cbiAqL1xuY2xhc3MgVHJhbnNmb3JtZXIgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkZWZpbml0aW9uXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihkZWZpbml0aW9uKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmFyZ3MgPSBkaXNhc3NlbWJsZShkZWZpbml0aW9uKTtcblx0XHR0aGlzLmNvbW1hbmQgPSB0aGlzLmFyZ3Muc2hpZnQoKTtcblx0XHR0aGlzLmNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuXHQgKiBAcmV0dXJuIHtUcmFuc2Zvcm1lcn1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuXHQgKi9cblx0c2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcblx0XHR2YWxpZGF0ZVN0cmluZyhuYW1lKTtcblx0XHR2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKTtcblxuXHRcdGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbGlkYXRlT2JqZWN0KGNvbnRleHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuY2FsbGJhY2tzLnNldChuYW1lLCB7XG5cdFx0XHRjYWxsYmFjazogY2FsbGJhY2ssXG5cdFx0XHRjb250ZXh0OiBjb250ZXh0LFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHsqfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5rbm93biBjb21tYW5kXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdHlwZSBub3Qgc3VwcG9ydGVkXG5cdCAqL1xuXHRydW4odmFsdWUpIHtcblx0XHRyZXR1cm4gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIFt2YWx1ZV0pO1xuXHR9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRpc2Fzc2VtYmxlKGNvbW1hbmQpIHtcblx0dmFsaWRhdGVTdHJpbmcoY29tbWFuZCk7XG5cblx0Y29uc3QgcGxhY2Vob2xkZXIgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvZ2ltO1xuXG5cdC8vIFRoZSBzZXBhcmF0b3IgZm9yIGFyZ3MgbXVzdCBiZSBlc2NhcGVkXG5cdC8vIHVuZGVmaW5lZCBzdHJpbmcgd2hpY2ggc2hvdWxkIG5vdCBvY2N1ciBub3JtYWxseSBhbmQgaXMgYWxzbyBub3QgYSByZWdleFxuXHRjb25zdCByZXN1bHQgPSBjb21tYW5kLm1hdGNoQWxsKHJlZ2V4KTtcblxuXHRmb3IgKGNvbnN0IG0gb2YgcmVzdWx0KSB7XG5cdFx0Y29uc3QgZyA9IG0/LltcImdyb3Vwc1wiXTtcblx0XHRpZiAoIWlzT2JqZWN0KGcpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBwID0gZz8uW1wicGF0dGVyblwiXTtcblx0XHRjb25zdCBjID0gZz8uW1wiY2hhclwiXTtcblxuXHRcdGlmIChwICYmIGMpIHtcblx0XHRcdGNvbnN0IHIgPSBgX18ke25ldyBJRCgpLnRvU3RyaW5nKCl9X19gO1xuXHRcdFx0cGxhY2Vob2xkZXIuc2V0KHIsIGMpO1xuXHRcdFx0Y29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShwLCByKTtcblx0XHR9XG5cdH1cblx0bGV0IHBhcnRzID0gY29tbWFuZC5zcGxpdChcIjpcIik7XG5cblx0cGFydHMgPSBwYXJ0cy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0bGV0IHYgPSB2YWx1ZS50cmltKCk7XG5cdFx0Zm9yIChjb25zdCBrIG9mIHBsYWNlaG9sZGVyKSB7XG5cdFx0XHR2ID0gdi5yZXBsYWNlKGtbMF0sIGtbMV0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdjtcblx0fSk7XG5cblx0cmV0dXJuIHBhcnRzO1xufVxuXG4vKipcbiAqIHRyaWVzIHRvIG1ha2UgYSBzdHJpbmcgb3V0IG9mIHZhbHVlIGFuZCBpZiB0aGlzIHN1Y2NlZWRzIHRvIHJldHVybiBpdCBiYWNrXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29udmVydFRvU3RyaW5nKHZhbHVlKSB7XG5cdGlmIChpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoXCJ0b1N0cmluZ1wiKSkge1xuXHRcdHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblx0fVxuXG5cdHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmtub3duIGNvbW1hbmRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHR5cGUgbm90IHN1cHBvcnRlZFxuICogQHRocm93cyB7RXJyb3J9IG1pc3Npbmcga2V5IHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsdWUpIHtcblx0Y29uc3QgY29uc29sZSA9IGdldEdsb2JhbE9iamVjdChcImNvbnNvbGVcIik7XG5cblx0Y29uc3QgYXJncyA9IGNsb25lKHRoaXMuYXJncyk7XG5cdGxldCBrZXk7XG5cdGxldCBkZWZhdWx0VmFsdWU7XG5cblx0bGV0IHRyYW5zbGF0aW9ucztcblx0bGV0IGRhdGU7XG5cdGxldCBsb2NhbGU7XG5cdGxldCB0aW1lc3RhbXA7XG5cdGxldCBtYXA7XG5cdGxldCBrZXlWYWx1ZTtcblxuXHRzd2l0Y2ggKHRoaXMuY29tbWFuZCkge1xuXHRcdGNhc2UgXCJzdGF0aWNcIjpcblx0XHRcdHJldHVybiB0aGlzLmFyZ3Muam9pbihcIjpcIik7XG5cblx0XHRjYXNlIFwidG9sb3dlclwiOlxuXHRcdGNhc2UgXCJzdHJ0b2xvd2VyXCI6XG5cdFx0Y2FzZSBcInRvbG93ZXJjYXNlXCI6XG5cdFx0XHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGNhc2UgXCJjb250YWluc1wiOlxuXHRcdFx0aWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUuaW5jbHVkZXMoYXJnc1swXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUuaW5jbHVkZXMoYXJnc1swXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc09iamVjdCh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlLmhhc093blByb3BlcnR5KGFyZ3NbMF0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRjYXNlIFwiaGFzLWVudHJpZXNcIjpcblx0XHRjYXNlIFwiaGFzZW50cmllc1wiOlxuXHRcdFx0aWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDA7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Y2FzZSBcImlzdW5kZWZpbmVkXCI6XG5cdFx0Y2FzZSBcImlzLXVuZGVmaW5lZFwiOlxuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG5cblx0XHRjYXNlIFwiaXNudWxsXCI6XG5cdFx0Y2FzZSBcImlzLW51bGxcIjpcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcblxuXHRcdGNhc2UgXCJpc3NldFwiOlxuXHRcdGNhc2UgXCJpcy1zZXRcIjpcblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xuXG5cdFx0Y2FzZSBcImlzbnVtYmVyXCI6XG5cdFx0Y2FzZSBcImlzLW51bWJlclwiOlxuXHRcdFx0cmV0dXJuIGlzUHJpbWl0aXZlKHZhbHVlKSAmJiAhaXNOYU4odmFsdWUpO1xuXG5cdFx0Y2FzZSBcImlzaW50ZWdlclwiOlxuXHRcdGNhc2UgXCJpcy1pbnRlZ2VyXCI6XG5cdFx0XHRyZXR1cm4gaXNQcmltaXRpdmUodmFsdWUpICYmICFpc05hTih2YWx1ZSkgJiYgdmFsdWUgJSAxID09PSAwO1xuXG5cdFx0Y2FzZSBcImlzZmxvYXRcIjpcblx0XHRjYXNlIFwiaXMtZmxvYXRcIjpcblx0XHRcdHJldHVybiBpc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSAlIDEgIT09IDA7XG5cblx0XHRjYXNlIFwiaXNvYmplY3RcIjpcblx0XHRjYXNlIFwiaXMtb2JqZWN0XCI6XG5cdFx0XHRyZXR1cm4gaXNPYmplY3QodmFsdWUpO1xuXG5cdFx0Y2FzZSBcImlzYXJyYXlcIjpcblx0XHRjYXNlIFwiaXMtYXJyYXlcIjpcblx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcblxuXHRcdGNhc2UgXCJub3RcIjpcblx0XHRcdHZhbGlkYXRlQm9vbGVhbih2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gIXZhbHVlO1xuXG5cdFx0Y2FzZSBcInRvdXBwZXJcIjpcblx0XHRjYXNlIFwic3RydG91cHBlclwiOlxuXHRcdGNhc2UgXCJ0b3VwcGVyY2FzZVwiOlxuXHRcdFx0dmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXHRcdFx0cmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHRjYXNlIFwidG8tc3RyaW5nXCI6XG5cdFx0Y2FzZSBcInRvc3RyaW5nXCI6XG5cdFx0XHRyZXR1cm4gYCR7dmFsdWV9YDtcblxuXHRcdGNhc2UgXCJ0by1pbnRlZ2VyXCI6XG5cdFx0Y2FzZSBcInRvaW50ZWdlclwiOlxuXHRcdFx0Y29uc3QgbiA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdHZhbGlkYXRlSW50ZWdlcihuKTtcblx0XHRcdHJldHVybiBuO1xuXG5cdFx0Y2FzZSBcInRvLWpzb25cIjpcblx0XHRjYXNlIFwidG9qc29uXCI6XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG5cdFx0Y2FzZSBcImZyb20tanNvblwiOlxuXHRcdGNhc2UgXCJmcm9tanNvblwiOlxuXHRcdFx0cmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuXG5cdFx0Y2FzZSBcInRyaW1cIjpcblx0XHRcdHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcblx0XHRcdHJldHVybiB2YWx1ZS50cmltKCk7XG5cblx0XHRjYXNlIFwicmF3dXJsZW5jb2RlXCI6XG5cdFx0XHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKVxuXHRcdFx0XHQucmVwbGFjZSgvIS9nLCBcIiUyMVwiKVxuXHRcdFx0XHQucmVwbGFjZSgvJy9nLCBcIiUyN1wiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFwoL2csIFwiJTI4XCIpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXCkvZywgXCIlMjlcIilcblx0XHRcdFx0LnJlcGxhY2UoL1xcKi9nLCBcIiUyQVwiKTtcblxuXHRcdGNhc2UgXCJjYWxsXCI6XG5cdFx0XHQvKipcblx0XHRcdCAqIGNhbGxiYWNrLWRlZmluaXRpb25cblx0XHRcdCAqIGZ1bmN0aW9uIGNhbGxiYWNrKHZhbHVlLCAuLi5hcmdzKSB7XG5cdFx0XHQgKiAgIHJldHVybiB2YWx1ZTtcblx0XHRcdCAqIH1cblx0XHRcdCAqL1xuXG5cdFx0XHRsZXQgY2FsbGJhY2s7XG5cdFx0XHRjb25zdCBjYWxsYmFja05hbWUgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHRsZXQgY29udGV4dCA9IGdldEdsb2JhbCgpO1xuXG5cdFx0XHRpZiAoaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLmhhc093blByb3BlcnR5KGNhbGxiYWNrTmFtZSkpIHtcblx0XHRcdFx0Y2FsbGJhY2sgPSB2YWx1ZVtjYWxsYmFja05hbWVdO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmNhbGxiYWNrcy5oYXMoY2FsbGJhY2tOYW1lKSkge1xuXHRcdFx0XHRjb25zdCBzID0gdGhpcy5jYWxsYmFja3MuZ2V0KGNhbGxiYWNrTmFtZSk7XG5cdFx0XHRcdGNhbGxiYWNrID0gcz8uW1wiY2FsbGJhY2tcIl07XG5cdFx0XHRcdGNvbnRleHQgPSBzPy5bXCJjb250ZXh0XCJdO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0dHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdFx0XHR3aW5kb3cuaGFzT3duUHJvcGVydHkoY2FsbGJhY2tOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNhbGxiYWNrID0gd2luZG93W2NhbGxiYWNrTmFtZV07XG5cdFx0XHR9XG5cdFx0XHR2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKTtcblxuXHRcdFx0YXJncy51bnNoaWZ0KHZhbHVlKTtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKGNvbnRleHQsIC4uLmFyZ3MpO1xuXG5cdFx0Y2FzZSBcInBsYWluXCI6XG5cdFx0Y2FzZSBcInBsYWludGV4dFwiOlxuXHRcdFx0dmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXHRcdFx0Y29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh2YWx1ZSwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRyZXR1cm4gZG9jLmJvZHkudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuXHRcdGNhc2UgXCJpZlwiOlxuXHRcdGNhc2UgXCI/XCI6XG5cdFx0XHR2YWxpZGF0ZVByaW1pdGl2ZSh2YWx1ZSk7XG5cblx0XHRcdGxldCB0cnVlU3RhdGVtZW50ID0gYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBmYWxzZVN0YXRlbWVudCA9IGFyZ3Muc2hpZnQoKSB8fCB1bmRlZmluZWQ7XG5cblx0XHRcdHRydWVTdGF0ZW1lbnQgPSBjb252ZXJ0U3BlY2lhbFN0cmluZ3ModHJ1ZVN0YXRlbWVudCwgdmFsdWUpO1xuXHRcdFx0ZmFsc2VTdGF0ZW1lbnQgPSBjb252ZXJ0U3BlY2lhbFN0cmluZ3MoZmFsc2VTdGF0ZW1lbnQsIHZhbHVlKTtcblxuXHRcdFx0Y29uc3QgY29uZGl0aW9uID0gZXZhbHVhdGVDb25kaXRpb24odmFsdWUpO1xuXHRcdFx0cmV0dXJuIGNvbmRpdGlvbiA/IHRydWVTdGF0ZW1lbnQgOiBmYWxzZVN0YXRlbWVudDtcblxuXHRcdGNhc2UgXCJ1Y2ZpcnN0XCI6XG5cdFx0XHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cblx0XHRcdGNvbnN0IGZpcnN0Y2hhciA9IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZpcnN0Y2hhciArIHZhbHVlLnN1YnN0cigxKTtcblx0XHRjYXNlIFwidWN3b3Jkc1wiOlxuXHRcdFx0dmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXG5cdFx0XHRyZXR1cm4gdmFsdWUucmVwbGFjZShcblx0XHRcdFx0L14oW2EtelxcdTAwRTAtXFx1MDBGQ10pfFxccysoW2EtelxcdTAwRTAtXFx1MDBGQ10pL2csXG5cdFx0XHRcdGZ1bmN0aW9uICh2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHYudG9VcHBlckNhc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiY291bnRcIjpcblx0XHRjYXNlIFwibGVuZ3RoXCI6XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChpc1N0cmluZyh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSAmJlxuXHRcdFx0XHR2YWx1ZS5oYXNPd25Qcm9wZXJ0eShcImxlbmd0aFwiKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZS5sZW5ndGg7XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgJHt0eXBlb2YgdmFsdWV9YCk7XG5cblx0XHRjYXNlIFwidG8tYmFzZTY0XCI6XG5cdFx0Y2FzZSBcImJ0b2FcIjpcblx0XHRjYXNlIFwiYmFzZTY0XCI6XG5cdFx0XHRyZXR1cm4gYnRvYShjb252ZXJ0VG9TdHJpbmcodmFsdWUpKTtcblxuXHRcdGNhc2UgXCJhdG9iXCI6XG5cdFx0Y2FzZSBcImZyb20tYmFzZTY0XCI6XG5cdFx0XHRyZXR1cm4gYXRvYihjb252ZXJ0VG9TdHJpbmcodmFsdWUpKTtcblxuXHRcdGNhc2UgXCJlbXB0eVwiOlxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cblx0XHRjYXNlIFwidW5kZWZpbmVkXCI6XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0Y2FzZSBcImRlYnVnXCI6XG5cdFx0XHRpZiAoaXNPYmplY3QoY29uc29sZSkpIHtcblx0XHRcdFx0Y29uc29sZS5sb2codmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRjYXNlIFwicHJlZml4XCI6XG5cdFx0XHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cdFx0XHRjb25zdCBwcmVmaXggPSBhcmdzPy5bMF07XG5cdFx0XHRyZXR1cm4gcHJlZml4ICsgdmFsdWU7XG5cblx0XHRjYXNlIFwic3VmZml4XCI6XG5cdFx0XHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cdFx0XHRjb25zdCBzdWZmaXggPSBhcmdzPy5bMF07XG5cdFx0XHRyZXR1cm4gdmFsdWUgKyBzdWZmaXg7XG5cblx0XHRjYXNlIFwidW5pcWlkXCI6XG5cdFx0XHRyZXR1cm4gbmV3IElEKCkudG9TdHJpbmcoKTtcblxuXHRcdGNhc2UgXCJmaXJzdC1rZXlcIjpcblx0XHRjYXNlIFwibGFzdC1rZXlcIjpcblx0XHRjYXNlIFwibnRoLWxhc3Qta2V5XCI6XG5cdFx0Y2FzZSBcIm50aC1rZXlcIjpcblx0XHRcdGlmICghaXNPYmplY3QodmFsdWUpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInR5cGUgbm90IHN1cHBvcnRlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCk7XG5cblx0XHRcdGlmICh0aGlzLmNvbW1hbmQgPT09IFwiZmlyc3Qta2V5XCIpIHtcblx0XHRcdFx0a2V5ID0gMDtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5jb21tYW5kID09PSBcImxhc3Qta2V5XCIpIHtcblx0XHRcdFx0a2V5ID0ga2V5cy5sZW5ndGggLSAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gdmFsaWRhdGVJbnRlZ2VyKHBhcnNlSW50KGFyZ3Muc2hpZnQoKSkpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmNvbW1hbmQgPT09IFwibnRoLWxhc3Qta2V5XCIpIHtcblx0XHRcdFx0XHRrZXkgPSBrZXlzLmxlbmd0aCAtIGtleSAtIDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0ZGVmYXVsdFZhbHVlID0gYXJncy5zaGlmdCgpIHx8IFwiXCI7XG5cblx0XHRcdGNvbnN0IHVzZUtleSA9IGtleXM/LltrZXldO1xuXG5cdFx0XHRpZiAodmFsdWU/Llt1c2VLZXldKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZT8uW3VzZUtleV07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkZWZhdWx0VmFsdWU7XG5cblx0XHRjYXNlIFwia2V5XCI6XG5cdFx0Y2FzZSBcInByb3BlcnR5XCI6XG5cdFx0Y2FzZSBcImluZGV4XCI6XG5cdFx0XHRrZXkgPSBhcmdzLnNoaWZ0KCkgfHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBrZXkgcGFyYW1ldGVyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0VmFsdWUgPSBhcmdzLnNoaWZ0KCkgfHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcblx0XHRcdFx0aWYgKCF2YWx1ZS5oYXMoa2V5KSkge1xuXHRcdFx0XHRcdHJldHVybiBkZWZhdWx0VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlLmdldChrZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPYmplY3QodmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdGlmICh2YWx1ZT8uW2tleV0pIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU/LltrZXldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGRlZmF1bHRWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidHlwZSBub3Qgc3VwcG9ydGVkXCIpO1xuXG5cdFx0Y2FzZSBcInBhdGgtZXhpc3RzXCI6XG5cdFx0XHRrZXkgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBrZXkgcGFyYW1ldGVyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IFBhdGhmaW5kZXIodmFsdWUpLmV4aXN0cyhrZXkpO1xuXG5cdFx0Y2FzZSBcImNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgcGYyID0gbmV3IFBhdGhmaW5kZXIodmFsdWUpO1xuXHRcdFx0bGV0IGNvbmNhdCA9IFwiXCI7XG5cdFx0XHR3aGlsZSAoYXJncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGtleSA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBrZXkgcGFyYW1ldGVyXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gYWRkIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0aWYgKGlzU3RyaW5nKGtleSkgJiYga2V5LnRyaW0oKSA9PT0gXCJcIikge1xuXHRcdFx0XHRcdGNvbmNhdCArPSBrZXk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXBmMi5leGlzdHMoa2V5KSkge1xuXHRcdFx0XHRcdGNvbmNhdCArPSBrZXk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdiA9IHBmMi5nZXRWaWEoa2V5KTtcblx0XHRcdFx0aWYgKCFpc1ByaW1pdGl2ZSh2KSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInZhbHVlIGlzIG5vdCBwcmltaXRpdmVcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25jYXQgKz0gdjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNvbmNhdDtcblx0XHRjYXNlIFwicGF0aFwiOlxuXHRcdFx0a2V5ID0gYXJncy5zaGlmdCgpO1xuXHRcdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmcga2V5IHBhcmFtZXRlclwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcGYgPSBuZXcgUGF0aGZpbmRlcih2YWx1ZSk7XG5cblx0XHRcdGlmICghcGYuZXhpc3RzKGtleSkpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHBmLmdldFZpYShrZXkpO1xuXG5cdFx0Y2FzZSBcInN1YnN0cmluZ1wiOlxuXHRcdFx0dmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXG5cdFx0XHRjb25zdCBzdGFydCA9IHBhcnNlSW50KGFyZ3NbMF0pIHx8IDA7XG5cdFx0XHRjb25zdCBlbmQgPSAocGFyc2VJbnQoYXJnc1sxXSkgfHwgMCkgKyBzdGFydDtcblxuXHRcdFx0cmV0dXJuIHZhbHVlLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcblxuXHRcdGNhc2UgXCJub3BcIjpcblx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdGNhc2UgXCI/P1wiOlxuXHRcdGNhc2UgXCJkZWZhdWx0XCI6XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmF1bHRWYWx1ZSA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdGxldCBkZWZhdWx0VHlwZSA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdGlmIChkZWZhdWx0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRlZmF1bHRUeXBlID0gXCJzdHJpbmdcIjtcblx0XHRcdH1cblxuXHRcdFx0c3dpdGNoIChkZWZhdWx0VHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiaW50XCI6XG5cdFx0XHRcdGNhc2UgXCJpbnRlZ2VyXCI6XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KGRlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdGNhc2UgXCJmbG9hdFwiOlxuXHRcdFx0XHRcdHJldHVybiBwYXJzZUZsb2F0KGRlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdGNhc2UgXCJ1bmRlZmluZWRcIjpcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRjYXNlIFwiYm9vbFwiOlxuXHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHQoZGVmYXVsdFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZSAhPT0gXCJcIiAmJlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWUgIT09IFwib2ZmXCIgJiZcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlICE9PSBcImZhbHNlXCIgJiZcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlICE9PSBcImZhbHNlXCIpIHx8XG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWUgPT09IFwib25cIiB8fFxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlID09PSBcInRydWVcIiB8fFxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlID09PSBcInRydWVcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0XHRyZXR1cm4gYCR7ZGVmYXVsdFZhbHVlfWA7XG5cdFx0XHRcdGNhc2UgXCJvYmplY3RcIjpcblx0XHRcdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShhdG9iKGRlZmF1bHRWYWx1ZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG5vdCBzdXBwb3J0ZWRcIik7XG5cblx0XHRjYXNlIFwibWFwXCI6XG5cdFx0XHRtYXAgPSBuZXcgTWFwKCk7XG5cdFx0XHR3aGlsZSAoYXJncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGtleVZhbHVlID0gYXJncy5zaGlmdCgpO1xuXHRcdFx0XHRpZiAoa2V5VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmcga2V5IHBhcmFtZXRlclwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleVZhbHVlID0ga2V5VmFsdWUuc3BsaXQoXCI9XCIpO1xuXHRcdFx0XHRtYXAuc2V0KGtleVZhbHVlWzBdLCBrZXlWYWx1ZVsxXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXAuZ2V0KHZhbHVlKTtcblxuXHRcdGNhc2UgXCJlcXVhbHNcIjpcblx0XHRcdGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHZhbHVlIHBhcmFtZXRlclwiKTtcblx0XHRcdH1cblxuXHRcdFx0dmFsaWRhdGVQcmltaXRpdmUodmFsdWUpO1xuXG5cdFx0XHRjb25zdCBlcXVhbHNWYWx1ZSA9IGFyZ3Muc2hpZnQoKTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgaGlzdG9yeSBvZiBcdTIwMUN0eXBlb2YgbnVsbFx1MjAxRFxuXHRcdFx0ICogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTMvMTAvdHlwZW9mLW51bGwuaHRtbFxuXHRcdFx0ICogSW4gSmF2YVNjcmlwdCwgdHlwZW9mIG51bGwgaXMgJ29iamVjdCcsIHdoaWNoIGluY29ycmVjdGx5IHN1Z2dlc3RzXG5cdFx0XHQgKiB0aGF0IG51bGwgaXMgYW4gb2JqZWN0LlxuXHRcdFx0ICovXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGVxdWFsc1ZhbHVlID09PSBcIm51bGxcIjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdHlwZU9mVmFsdWUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdHN3aXRjaCAodHlwZU9mVmFsdWUpIHtcblx0XHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gZXF1YWxzVmFsdWU7XG5cdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHBhcnNlRmxvYXQoZXF1YWxzVmFsdWUpO1xuXHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gKGVxdWFsc1ZhbHVlID09PSBcInRydWVcIiB8fCBlcXVhbHNWYWx1ZSA9PT0gXCJvblwiKTtcblx0XHRcdFx0Y2FzZSBcInVuZGVmaW5lZFwiOlxuXHRcdFx0XHRcdHJldHVybiBlcXVhbHNWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIjtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG5vdCBzdXBwb3J0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwibW9uZXlcIjpcblx0XHRjYXNlIFwiY3VycmVuY3lcIjpcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2NhbGUgb3IgbWlzc2luZyBmb3JtYXQgKCR7ZS5tZXNzYWdlfSlgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVmVyd2VuZGVuIHZvbiBSZWdFeHAsIHVtIFdcdTAwRTRocnVuZyB1bmQgQmV0cmFnIHp1IGV4dHJhaGllcmVuXG5cdFx0XHRjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtBLVpdezN9KVtcXHMtXSooXFxkKyhcXC5cXGQrKT8pJC8pO1xuXHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGN1cnJlbmN5IGZvcm1hdFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY3VycmVuY3kgPSBtYXRjaFsxXTtcblx0XHRcdGNvbnN0IGFtb3VudCA9IG1hdGNoWzJdO1xuXG5cdFx0XHRjb25zdCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSBhcmdzPy5bMF0gfHwgMjtcblx0XHRcdGNvbnN0IHJvdW5kaW5nSW5jcmVtZW50ID0gYXJncz8uWzFdIHx8IDU7XG5cblx0XHRcdGNvbnN0IG5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZS50b1N0cmluZygpLCB7XG5cdFx0XHRcdHN0eWxlOiBcImN1cnJlbmN5XCIsXG5cdFx0XHRcdGN1cnJlbmN5OiBjdXJyZW5jeSxcblx0XHRcdFx0bWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtRnJhY3Rpb25EaWdpdHMsXG5cdFx0XHRcdHJvdW5kaW5nSW5jcmVtZW50OiByb3VuZGluZ0luY3JlbWVudCxcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gbmYuZm9ybWF0KGFtb3VudCk7XG5cblx0XHRjYXNlIFwidGltZXN0YW1wXCI6XG5cdFx0XHRkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXHRcdFx0dGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG5cdFx0XHRpZiAoaXNOYU4odGltZXN0YW1wKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGRhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGltZXN0YW1wO1xuXG5cdFx0Y2FzZSBcInRpbWVcIjpcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0ZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bG9jYWxlID0gZ2V0TG9jYWxlT2ZEb2N1bWVudCgpO1xuXHRcdFx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcobG9jYWxlLnRvU3RyaW5nKCksIHtcblx0XHRcdFx0XHRob3VyMTI6IGZhbHNlLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2NhbGUgb3IgbWlzc2luZyBmb3JtYXQgKCR7ZS5tZXNzYWdlfSlgKTtcblx0XHRcdH1cblxuXHRcdGNhc2UgXCJkYXRldGltZWZvcm1hdFwiOlxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvcHRpb25zID0ge1xuXHRcdFx0XHRkYXRlU3R5bGU6IFwibWVkaXVtXCIsXG5cdFx0XHRcdHRpbWVTdHlsZTogXCJtZWRpdW1cIixcblx0XHRcdFx0aG91cjEyOiBmYWxzZSxcblx0XHRcdH07XG5cblx0XHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b3B0aW9ucy5kYXRlU3R5bGUgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b3B0aW9ucy50aW1lU3R5bGUgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKS50b1N0cmluZygpO1xuXHRcdFx0XHRyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQoZGF0ZSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9jYWxlIG9yIG1pc3NpbmcgZm9ybWF0ICgke2UubWVzc2FnZX0pYCk7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiZGF0ZXRpbWVcIjpcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0ZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bG9jYWxlID0gZ2V0TG9jYWxlT2ZEb2N1bWVudCgpO1xuXHRcdFx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUudG9TdHJpbmcoKSwge1xuXHRcdFx0XHRcdGhvdXIxMjogZmFsc2UsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGxvY2FsZSBvciBtaXNzaW5nIGZvcm1hdCAoJHtlLm1lc3NhZ2V9KWApO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcImRhdGVcIjpcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0ZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bG9jYWxlID0gZ2V0TG9jYWxlT2ZEb2N1bWVudCgpO1xuXHRcdFx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlLnRvU3RyaW5nKCksIHtcblx0XHRcdFx0XHR5ZWFyOiBcIm51bWVyaWNcIixcblx0XHRcdFx0XHRtb250aDogXCIyLWRpZ2l0XCIsXG5cdFx0XHRcdFx0ZGF5OiBcIjItZGlnaXRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9jYWxlIG9yIG1pc3NpbmcgZm9ybWF0ICgke2UubWVzc2FnZX0pYCk7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwidGltZS1hZ29cIjpcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0ZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bG9jYWxlID0gZ2V0TG9jYWxlT2ZEb2N1bWVudCgpO1xuXHRcdFx0XHRyZXR1cm4gZm9ybWF0VGltZUFnbyhkYXRlLCBsb2NhbGUudG9TdHJpbmcoKSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9jYWxlIG9yIG1pc3NpbmcgZm9ybWF0ICgke2UubWVzc2FnZX0pYCk7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwieWVhclwiOlxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG5cdFx0Y2FzZSBcIm1vbnRoXCI6XG5cdFx0XHRkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGRhdGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxO1xuXG5cdFx0Y2FzZSBcImRheVwiOlxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0ZS5nZXREYXRlKCk7XG5cblx0XHRjYXNlIFwid2Vla2RheVwiOlxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0ZS5nZXREYXkoKTtcblxuXHRcdGNhc2UgXCJob3VyXCI6XG5cdFx0Y2FzZSBcImhvdXJzXCI6XG5cdFx0XHRkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGRhdGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRlLmdldEhvdXJzKCk7XG5cblx0XHRjYXNlIFwibWludXRlXCI6XG5cdFx0Y2FzZSBcIm1pbnV0ZXNcIjpcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZGF0ZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGUuZ2V0TWludXRlcygpO1xuXG5cdFx0Y2FzZSBcInNlY29uZFwiOlxuXHRcdGNhc2UgXCJzZWNvbmRzXCI6XG5cdFx0XHRkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGRhdGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRlLmdldFNlY29uZHMoKTtcblxuXHRcdGNhc2UgXCJpMThuXCI6XG5cdFx0Y2FzZSBcInRyYW5zbGF0aW9uXCI6XG5cdFx0XHR0cmFuc2xhdGlvbnMgPSBnZXREb2N1bWVudFRyYW5zbGF0aW9ucygpO1xuXHRcdFx0aWYgKCEodHJhbnNsYXRpb25zIGluc3RhbmNlb2YgVHJhbnNsYXRpb25zKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHRyYW5zbGF0aW9uc1wiKTtcblx0XHRcdH1cblxuXHRcdFx0a2V5ID0gYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRrZXkgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmYXVsdFZhbHVlID0gYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZDtcblxuXHRcdFx0ZGVmYXVsdFZhbHVlID0gY29udmVydFNwZWNpYWxTdHJpbmdzKGRlZmF1bHRWYWx1ZSwgdmFsdWUpO1xuXG5cdFx0XHRyZXR1cm4gdHJhbnNsYXRpb25zLmdldFRleHQoa2V5LCBkZWZhdWx0VmFsdWUpO1xuXG5cdFx0Y2FzZSBcInNldC10b2dnbGVcIjpcblx0XHRjYXNlIFwic2V0LXNldFwiOlxuXHRcdGNhc2UgXCJzZXQtcmVtb3ZlXCI6XG5cdFx0XHRjb25zdCBtb2RpZmllciA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdGxldCBkZWxpbWl0ZXIgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoZGVsaW1pdGVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZGVsaW1pdGVyID0gXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNldCA9IG5ldyBTZXQodmFsdWUuc3BsaXQoZGVsaW1pdGVyKSk7XG5cdFx0XHRjb25zdCB0b2dnbGUgPSBuZXcgU2V0KG1vZGlmaWVyLnNwbGl0KGRlbGltaXRlcikpO1xuXHRcdFx0aWYgKHRoaXMuY29tbWFuZCA9PT0gXCJzZXQtdG9nZ2xlXCIpIHtcblx0XHRcdFx0Zm9yIChjb25zdCB0IG9mIHRvZ2dsZSkge1xuXHRcdFx0XHRcdGlmIChzZXQuaGFzKHQpKSB7XG5cdFx0XHRcdFx0XHRzZXQuZGVsZXRlKHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXQuYWRkKHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmNvbW1hbmQgPT09IFwic2V0LXNldFwiKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgdCBvZiB0b2dnbGUpIHtcblx0XHRcdFx0XHRzZXQuYWRkKHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuY29tbWFuZCA9PT0gXCJzZXQtcmVtb3ZlXCIpIHtcblx0XHRcdFx0Zm9yIChjb25zdCB0IG9mIHRvZ2dsZSkge1xuXHRcdFx0XHRcdHNldC5kZWxldGUodCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBBcnJheS5mcm9tKHNldCkuam9pbihkZWxpbWl0ZXIpO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7dGhpcy5jb21tYW5kfWApO1xuXHR9XG59XG5cbi8qKlxuICogY29udmVydHMgc3BlY2lhbCBzdHJpbmdzIHRvIHRoZWlyIHZhbHVlc1xuICogQHByaXZhdGVcbiAqIEBwYXJhbSBpbnB1dFxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR8KnxudWxsfHN0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29udmVydFNwZWNpYWxTdHJpbmdzKGlucHV0LCB2YWx1ZSkge1xuXHRzd2l0Y2ggKGlucHV0KSB7XG5cdFx0Y2FzZSBcInZhbHVlXCI6XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0Y2FzZSBcIlxcXFx2YWx1ZVwiOlxuXHRcdFx0cmV0dXJuIFwidmFsdWVcIjtcblx0XHRjYXNlIFwiXFxcXHVuZGVmaW5lZFwiOlxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRjYXNlIFwiXFxcXG51bGxcIjpcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cbn1cblxuLyoqXG4gKiBjaGVja3MgaWYgYSB2YWx1ZSBpcyB0cnVlIG9yIG5vdFxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBldmFsdWF0ZUNvbmRpdGlvbih2YWx1ZSkge1xuXHRjb25zdCBsb3dlclZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuXG5cdHJldHVybiAoXG5cdFx0KHZhbHVlICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XHR2YWx1ZSAhPT0gXCJcIiAmJlxuXHRcdFx0bG93ZXJWYWx1ZSAhPT0gXCJvZmZcIiAmJlxuXHRcdFx0bG93ZXJWYWx1ZSAhPT0gXCJmYWxzZVwiICYmXG5cdFx0XHR2YWx1ZSAhPT0gZmFsc2UpIHx8XG5cdFx0bG93ZXJWYWx1ZSA9PT0gXCJvblwiIHx8XG5cdFx0bG93ZXJWYWx1ZSA9PT0gXCJ0cnVlXCIgfHxcblx0XHR2YWx1ZSA9PT0gdHJ1ZVxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi90cmFuc2Zvcm1lci5tanNcIjtcblxuZXhwb3J0IHsgUGlwZSB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBERUxJTUlURVIgPSBcInxcIjtcblxuLyoqXG4gKiBUaGUgcGlwZSBjbGFzcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb21iaW5lIHNldmVyYWwgcHJvY2Vzc2luZyBzdGVwcy5cbiAqXG4gKiBBIHBpcGUgY29uc2lzdHMgb2YgY29tbWFuZHMgd2hvc2UgaW5wdXQgYW5kIG91dHB1dCBhcmUgY29ubmVjdGVkIHdpdGggdGhlIHBpcGUgc3ltYm9sIGB8YC5cbiAqXG4gKiBXaXRoIHRoZSBQaXBlLCBwcm9jZXNzaW5nIHN0ZXBzIGNhbiBiZSBjb21iaW5lZC4gSGVyZSwgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhY2Nlc3NlZCB2aWEgdGhlIHBhdGhmaW5kZXIgKHBhdGggY29tbWFuZCkuXG4gKiB0aGUgd29yZCBpcyB0aGVuIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgbGV0dGVycyBhbmQgYSBwcmVmaXggSGVsbG8gaXMgYWRkZWQuIHRoZSB0d28gYmFja3NsYXNoIHNhZmUgdGhlIHNwYWNlIGNoYXIuXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2xpYnJhcmllcy9waXBlL2V4YW1wbGUtMS9cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBwaXBlIGNsYXNzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbWJpbmUgc2V2ZXJhbCBwcm9jZXNzaW5nIHN0ZXBzLlxuICovXG5jbGFzcyBQaXBlIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGlwZSBhIHBpcGUgY29uc2lzdHMgb2YgY29tbWFuZHMgd2hvc2UgaW5wdXQgYW5kIG91dHB1dCBhcmUgY29ubmVjdGVkIHdpdGggdGhlIHBpcGUgc3ltYm9sIGB8YC5cblx0ICogQHRocm93cyB7VHlwZUVycm9yfVxuXHQgKi9cblx0Y29uc3RydWN0b3IocGlwZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dmFsaWRhdGVTdHJpbmcocGlwZSk7XG5cblx0XHR0aGlzLnBpcGUgPSBwaXBlLnNwbGl0KERFTElNSVRFUikubWFwKCh2KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFRyYW5zZm9ybWVyKHYpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG5cdCAqIEByZXR1cm4ge1RyYW5zZm9ybWVyfVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG5cdCAqL1xuXHRzZXRDYWxsYmFjayhuYW1lLCBjYWxsYmFjaywgY29udGV4dCkge1xuXHRcdGZvciAoY29uc3QgWywgdF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5waXBlKSkge1xuXHRcdFx0dC5zZXRDYWxsYmFjayhuYW1lLCBjYWxsYmFjaywgY29udGV4dCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogcnVuIGEgcGlwZVxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqL1xuXHRydW4odmFsdWUpIHtcblx0XHRyZXR1cm4gdGhpcy5waXBlLnJlZHVjZSgoYWNjdW11bGF0b3IsIHRyYW5zZm9ybWVyLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7XG5cdFx0XHRyZXR1cm4gdHJhbnNmb3JtZXIucnVuKGFjY3VtdWxhdG9yKTtcblx0XHR9LCB2YWx1ZSk7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBQaXBlIH0gZnJvbSBcIi4uL2RhdGEvcGlwZS5tanNcIjtcblxuaW1wb3J0IHsgQmFzZVdpdGhPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanNcIjtcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlQXJyYXksIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBGb3JtYXR0ZXIgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW50ZXJuYWxPYmplY3RTeW1ib2wgPSBTeW1ib2woXCJpbnRlcm5hbE9iamVjdFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgd2F0Y2hkb2dTeW1ib2wgPSBTeW1ib2woXCJ3YXRjaGRvZ1wiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgbWFya2VyT3BlbkluZGV4U3ltYm9sID0gU3ltYm9sKFwibWFya2VyT3BlbkluZGV4XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBtYXJrZXJDbG9zZUluZGV4U3ltYm9sID0gU3ltYm9sKFwibWFya2VyY2xvc2VJbmRleFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgd29ya2luZ0RhdGFTeW1ib2wgPSBTeW1ib2woXCJ3b3JraW5nRGF0YVwiKTtcblxuLyoqXG4gKiBNZXNzYWdlcyBjYW4gYmUgZm9ybWF0dGVkIHdpdGggdGhlIGZvcm1hdHRlci4gVG8gZG8gdGhpcywgYW4gb2JqZWN0IHdpdGggdGhlIHZhbHVlcyBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZm9ybWF0dGVyLiBUaGUgbWVzc2FnZSBjYW4gdGhlbiBjb250YWluIHBsYWNlaG9sZGVycy5cbiAqXG4gKiBMb29rIGF0IHRoZSBleGFtcGxlIGJlbG93LiBUaGUgcGxhY2Vob2xkZXJzIHVzZSB0aGUgbG9naWMgb2YgUGlwZS5cbiAqXG4gKiAjIyBNYXJrZXIgaW4gbWFya2VyXG4gKlxuICogTWFya2VycyBjYW4gYmUgbmVzdGVkLiBIZXJlLCB0aGUgaW5uZXIgbWFya2VyIGlzIHJlc29sdmVkIGZpcnN0IGAke3N1YmtleX0gXHUyMUE2IDEgPSAke215a2V5Mn1gIGFuZCB0aGVuIHRoZSBvdXRlciBtYXJrZXIgYCR7bXlrZXkyfWAuXG4gKlxuICogYGBgXG4gKiBjb25zdCB0ZXh0ID0gJyR7bXlrZXkke3N1YmtleX19JztcbiAqIGxldCBvYmogPSB7XG4gKiAgbXlrZXkyOiBcIjFcIixcbiAqICBzdWJrZXk6IFwiMlwiXG4gKiB9O1xuICpcbiAqIG5ldyBGb3JtYXR0ZXIob2JqKS5mb3JtYXQodGV4dCk7XG4gKiAvLyBcdTIxQTYgMVxuICogYGBgXG4gKlxuICogIyMgQ2FsbGJhY2tzXG4gKlxuICogVGhlIHZhbHVlcyBpbiBhIGZvcm1hdHRlciBjYW4gYmUgYWRqdXN0ZWQgdmlhIHRoZSBjb21tYW5kcyBvZiB0aGUgYFRyYW5zZm9ybWVyYCBvciB0aGVgUGlwZWAuXG4gKiBUaGVyZSBpcyBhbHNvIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UgY2FsbGJhY2tzLlxuICpcbiAqIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoe3g6ICcxJ30sIHtcbiAqICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge1xuICogICAgICAgICAgICAgICAgICAgIHF1b3RlOiAodmFsdWUpID0+IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIidcbiAqICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgIH0pO1xuICpcbiAqIGZvcm1hdHRlci5mb3JtYXQoJyR7eCB8IGNhbGw6cXVvdGV9JykpXG4gKiAvLyBcdTIxQTYgXCIxXCJcbiAqXG4gKiAjIyBNYXJrZXIgd2l0aCBwYXJhbWV0ZXJcbiAqXG4gKiBBIHN0cmluZyBjYW4gYWxzbyBicmluZyBpdHMgb3duIHZhbHVlcy4gVGhlc2UgbXVzdCB0aGVuIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBrZXkgYnkgYSBzZXBhcmF0b3IgYDo6YC5cbiAqIFRoZSB2YWx1ZXMgdGhlbXNlbHZlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBrZXkvdmFsdWUgcGFpcnMuIFRoZSBrZXkgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgdmFsdWUgYnkgYSBzZXBhcmF0b3IgYD1gLlxuICpcbiAqIFdoZW4gdXNpbmcgYSBwaXBlLCB5b3UgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBzZXBhcmF0b3JzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3RleHQvZm9ybWF0dGVyLm1qcyc7XG4gKlxuICogbmV3IEZvcm1hdHRlcih7XG4gKiAgICAgICBhOiB7XG4gKiAgICAgICAgICAgYjoge1xuICogICAgICAgICAgICAgICBjOiBcIkhlbGxvXCJcbiAqICAgICAgICAgICB9LFxuICogICAgICAgICAgIGQ6IFwid29ybGRcIixcbiAqICAgICAgIH1cbiAqICAgfSkuZm9ybWF0KFwiJHthLmIuY30gJHthLmQgfCB1Y2ZpcnN0fSFcIik7IC8vIHdpdGggcGlwZVxuICpcbiAqIC8vIFx1MjFBNiBIZWxsbyBXb3JsZCFcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEyLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmNsYXNzIEZvcm1hdHRlciBleHRlbmRzIEJhc2VXaXRoT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1hcmtlcnMgYXJlIGAke2AgYW5kIGB9YFxuXHQgKlxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBwYXJhbSBvcHRpb25zXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvYmplY3QsIG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblx0XHR0aGlzW2ludGVybmFsT2JqZWN0U3ltYm9sXSA9IG9iamVjdCB8fCB7fTtcblx0XHR0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0gPSAwO1xuXHRcdHRoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0gPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtYXJrZXJcblx0ICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLm9wZW49W1wiJHtcIl1cblx0ICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLmNsb3NlPVtcIiR7XCJdXG5cdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXJhbWV0ZXJcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5kZWxpbWl0ZXI9XCI6OlwiXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJhbWV0ZXIuYXNzaWdubWVudD1cIj1cIlxuXHQgKiBAcHJvcGVydHkge29iamVjdH0gY2FsbGJhY2tzPXt9XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdG1hcmtlcjoge1xuXHRcdFx0XHRvcGVuOiBbXCIke1wiXSxcblx0XHRcdFx0Y2xvc2U6IFtcIn1cIl0sXG5cdFx0XHR9LFxuXHRcdFx0cGFyYW1ldGVyOiB7XG5cdFx0XHRcdGRlbGltaXRlcjogXCI6OlwiLFxuXHRcdFx0XHRhc3NpZ25tZW50OiBcIj1cIixcblx0XHRcdH0sXG5cdFx0XHRjYWxsYmFja3M6IHt9LFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBuZXcgUGFyYW1ldGVyIENoYXJhY3RlclxuXHQgKlxuXHQgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNoYXJzIGFyZSBgOjpgIGFuZCBgPWBcblx0ICpcblx0ICogYGBgXG5cdCAqIGZvcm1hdHRlci5zZXRQYXJhbWV0ZXJDaGFycygnIycpO1xuXHQgKiBmb3JtYXR0ZXIuc2V0UGFyYW1ldGVyQ2hhcnMoJ1snLCddJyk7XG5cdCAqIGZvcm1hdHRlci5zZXRQYXJhbWV0ZXJDaGFycygnaTE4bnsnLCd9Jyk7XG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGVsaW1pdGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhc3NpZ25tZW50XG5cdCAqIEByZXR1cm4ge0Zvcm1hdHRlcn1cblx0ICogQHNpbmNlIDEuMjQuMFxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuXHQgKi9cblx0c2V0UGFyYW1ldGVyQ2hhcnMoZGVsaW1pdGVyLCBhc3NpZ25tZW50KSB7XG5cdFx0aWYgKGRlbGltaXRlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzW2ludGVybmFsU3ltYm9sXVtcInBhcmFtZXRlclwiXVtcImRlbGltaXRlclwiXSA9XG5cdFx0XHRcdHZhbGlkYXRlU3RyaW5nKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0aWYgKGFzc2lnbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJwYXJhbWV0ZXJcIl1bXCJhc3NpZ25tZW50XCJdID1cblx0XHRcdFx0dmFsaWRhdGVTdHJpbmcoYXNzaWdubWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IG5ldyBNYXJrZXJcblx0ICpcblx0ICogRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBtYXJrZXJzIGFyZSBgJHtgIGFuZCBgfWBcblx0ICpcblx0ICogYGBgXG5cdCAqIGZvcm1hdHRlci5zZXRNYXJrZXIoJyMnKTsgLy8gb3BlbiBhbmQgY2xvc2UgYXJlIGJvdGggI1xuXHQgKiBmb3JtYXR0ZXIuc2V0TWFya2VyKCdbJywnXScpO1xuXHQgKiBmb3JtYXR0ZXIuc2V0TWFya2VyKCdpMThueycsJ30nKTtcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfSBvcGVuXG5cdCAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfHVuZGVmaW5lZH0gY2xvc2Vcblx0ICogQHJldHVybiB7Rm9ybWF0dGVyfVxuXHQgKiBAc2luY2UgMS4xMi4wXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqL1xuXHRzZXRNYXJrZXIob3BlbiwgY2xvc2UpIHtcblx0XHRpZiAoY2xvc2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2xvc2UgPSBvcGVuO1xuXHRcdH1cblxuXHRcdGlmIChpc1N0cmluZyhvcGVuKSkgb3BlbiA9IFtvcGVuXTtcblx0XHRpZiAoaXNTdHJpbmcoY2xvc2UpKSBjbG9zZSA9IFtjbG9zZV07XG5cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXVtcIm1hcmtlclwiXVtcIm9wZW5cIl0gPSB2YWxpZGF0ZUFycmF5KG9wZW4pO1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wibWFya2VyXCJdW1wiY2xvc2VcIl0gPSB2YWxpZGF0ZUFycmF5KGNsb3NlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0b28gZGVlcCBuZXN0aW5nXG5cdCAqL1xuXHRmb3JtYXQodGV4dCkge1xuXHRcdHRoaXNbd2F0Y2hkb2dTeW1ib2xdID0gMDtcblx0XHR0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0gPSAwO1xuXHRcdHRoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0gPSAwO1xuXHRcdHRoaXNbd29ya2luZ0RhdGFTeW1ib2xdID0ge307XG5cdFx0cmV0dXJuIGZvcm1hdC5jYWxsKHRoaXMsIHRleHQpO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZm9ybWF0KHRleHQpIHtcblx0dGhpc1t3YXRjaGRvZ1N5bWJvbF0rKztcblx0aWYgKHRoaXNbd2F0Y2hkb2dTeW1ib2xdID4gMjApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0b28gZGVlcCBuZXN0aW5nXCIpO1xuXHR9XG5cblx0Y29uc3Qgb3Blbk1hcmtlciA9XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJtYXJrZXJcIl1bXCJvcGVuXCJdPy5bdGhpc1ttYXJrZXJPcGVuSW5kZXhTeW1ib2xdXTtcblx0Y29uc3QgY2xvc2VNYXJrZXIgPVxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wibWFya2VyXCJdW1wiY2xvc2VcIl0/Llt0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdXTtcblxuXHQvLyBjb250YWlucyBubyBwbGFjZWhvbGRlcnNcblx0aWYgKHRleHQuaW5kZXhPZihvcGVuTWFya2VyKSA9PT0gLTEgfHwgdGV4dC5pbmRleE9mKGNsb3NlTWFya2VyKSA9PT0gLTEpIHtcblx0XHRyZXR1cm4gdGV4dDtcblx0fVxuXG5cdGxldCByZXN1bHQgPSB0b2tlbml6ZS5jYWxsKFxuXHRcdHRoaXMsXG5cdFx0dmFsaWRhdGVTdHJpbmcodGV4dCksXG5cdFx0b3Blbk1hcmtlcixcblx0XHRjbG9zZU1hcmtlcixcblx0KTtcblxuXHRpZiAoXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJtYXJrZXJcIl1bXCJvcGVuXCJdPy5bdGhpc1ttYXJrZXJPcGVuSW5kZXhTeW1ib2xdICsgMV1cblx0KSB7XG5cdFx0dGhpc1ttYXJrZXJPcGVuSW5kZXhTeW1ib2xdKys7XG5cdH1cblxuXHRpZiAoXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJtYXJrZXJcIl1bXCJjbG9zZVwiXT8uW3RoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0gKyAxXVxuXHQpIHtcblx0XHR0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdKys7XG5cdH1cblxuXHRyZXN1bHQgPSBmb3JtYXQuY2FsbCh0aGlzLCByZXN1bHQpO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTIuMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gb3Blbk1hcmtlclxuICogQHBhcmFtIHtzdHJpbmd9IGNsb3NlTWFya2VyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplKHRleHQsIG9wZW5NYXJrZXIsIGNsb3NlTWFya2VyKSB7XG5cdGNvbnN0IGZvcm1hdHRlZCA9IFtdO1xuXG5cdGNvbnN0IHBhcmFtZXRlckFzc2lnbm1lbnQgPSB0aGlzW2ludGVybmFsU3ltYm9sXVtcInBhcmFtZXRlclwiXVtcImFzc2lnbm1lbnRcIl07XG5cdGNvbnN0IHBhcmFtZXRlckRlbGltaXRlciA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wicGFyYW1ldGVyXCJdW1wiZGVsaW1pdGVyXCJdO1xuXHRjb25zdCBjYWxsYmFja3MgPSB0aGlzW2ludGVybmFsU3ltYm9sXVtcImNhbGxiYWNrc1wiXTtcblxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0ZXh0LmluZGV4T2Yob3Blbk1hcmtlcik7XG5cdFx0Ly8gbm8gbWFya2VyXG5cdFx0aWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG5cdFx0XHRmb3JtYXR0ZWQucHVzaCh0ZXh0KTtcblx0XHRcdGJyZWFrO1xuXHRcdH0gZWxzZSBpZiAoc3RhcnRJbmRleCA+IDApIHtcblx0XHRcdGZvcm1hdHRlZC5wdXNoKHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXgpKTtcblx0XHRcdHRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdGFydEluZGV4KTtcblx0XHR9XG5cblx0XHRsZXQgZW5kSW5kZXggPSB0ZXh0LnN1YnN0cmluZyhvcGVuTWFya2VyLmxlbmd0aCkuaW5kZXhPZihjbG9zZU1hcmtlcik7XG5cdFx0aWYgKGVuZEluZGV4ICE9PSAtMSkgZW5kSW5kZXggKz0gb3Blbk1hcmtlci5sZW5ndGg7XG5cdFx0bGV0IGluc2lkZVN0YXJ0SW5kZXggPSB0ZXh0XG5cdFx0XHQuc3Vic3RyaW5nKG9wZW5NYXJrZXIubGVuZ3RoKVxuXHRcdFx0LmluZGV4T2Yob3Blbk1hcmtlcik7XG5cdFx0aWYgKGluc2lkZVN0YXJ0SW5kZXggIT09IC0xKSB7XG5cdFx0XHRpbnNpZGVTdGFydEluZGV4ICs9IG9wZW5NYXJrZXIubGVuZ3RoO1xuXHRcdFx0aWYgKGluc2lkZVN0YXJ0SW5kZXggPCBlbmRJbmRleCkge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0b2tlbml6ZS5jYWxsKFxuXHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0dGV4dC5zdWJzdHJpbmcoaW5zaWRlU3RhcnRJbmRleCksXG5cdFx0XHRcdFx0b3Blbk1hcmtlcixcblx0XHRcdFx0XHRjbG9zZU1hcmtlcixcblx0XHRcdFx0KTtcblx0XHRcdFx0dGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluc2lkZVN0YXJ0SW5kZXgpICsgcmVzdWx0O1xuXHRcdFx0XHRlbmRJbmRleCA9IHRleHQuc3Vic3RyaW5nKG9wZW5NYXJrZXIubGVuZ3RoKS5pbmRleE9mKGNsb3NlTWFya2VyKTtcblx0XHRcdFx0aWYgKGVuZEluZGV4ICE9PSAtMSkgZW5kSW5kZXggKz0gb3Blbk1hcmtlci5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGVuZEluZGV4ID09PSAtMSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3ludGF4IGVycm9yIGluIGZvcm1hdHRlciB0ZW1wbGF0ZVwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBrZXkgPSB0ZXh0LnN1YnN0cmluZyhvcGVuTWFya2VyLmxlbmd0aCwgZW5kSW5kZXgpO1xuXHRcdGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KHBhcmFtZXRlckRlbGltaXRlcik7XG5cdFx0Y29uc3QgY3VycmVudFBpcGUgPSBwYXJ0cy5zaGlmdCgpO1xuXG5cdFx0dGhpc1t3b3JraW5nRGF0YVN5bWJvbF0gPSBleHRlbmQoXG5cdFx0XHR7fSxcblx0XHRcdHRoaXNbaW50ZXJuYWxPYmplY3RTeW1ib2xdLFxuXHRcdFx0dGhpc1t3b3JraW5nRGF0YVN5bWJvbF0sXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3Qga3Ygb2YgcGFydHMpIHtcblx0XHRcdGNvbnN0IFtrLCB2XSA9IGt2LnNwbGl0KHBhcmFtZXRlckFzc2lnbm1lbnQpO1xuXHRcdFx0dGhpc1t3b3JraW5nRGF0YVN5bWJvbF1ba10gPSB2O1xuXHRcdH1cblxuXHRcdGNvbnN0IHQxID0ga2V5LnNwbGl0KFwifFwiKS5zaGlmdCgpLnRyaW0oKTsgLy8gcGlwZSBzeW1ib2xcblx0XHRjb25zdCB0MiA9IHQxLnNwbGl0KFwiOjpcIikuc2hpZnQoKS50cmltKCk7IC8vIGtleSB2YWx1ZSBkZWxpbWl0ZXJcblx0XHRjb25zdCB0MyA9IHQyLnNwbGl0KFwiLlwiKS5zaGlmdCgpLnRyaW0oKTsgLy8gcGF0aCBkZWxpbWl0ZXJcblx0XHRjb25zdCBwcmVmaXggPSB0MyBpbiB0aGlzW3dvcmtpbmdEYXRhU3ltYm9sXSA/IFwicGF0aDpcIiA6IFwic3RhdGljOlwiO1xuXG5cdFx0bGV0IGNvbW1hbmQgPSBcIlwiO1xuXHRcdGlmIChcblx0XHRcdHByZWZpeCAmJlxuXHRcdFx0a2V5LmluZGV4T2YocHJlZml4KSAhPT0gMCAmJlxuXHRcdFx0a2V5LmluZGV4T2YoXCJwYXRoOlwiKSAhPT0gMCAmJlxuXHRcdFx0a2V5LmluZGV4T2YoXCJzdGF0aWM6XCIpICE9PSAwXG5cdFx0KSB7XG5cdFx0XHRjb21tYW5kID0gcHJlZml4O1xuXHRcdH1cblxuXHRcdGNvbW1hbmQgKz0gY3VycmVudFBpcGU7XG5cblx0XHRjb25zdCBwaXBlID0gbmV3IFBpcGUoY29tbWFuZCk7XG5cblx0XHRpZiAoaXNPYmplY3QoY2FsbGJhY2tzKSkge1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGNhbGxiYWNrcykpIHtcblx0XHRcdFx0cGlwZS5zZXRDYWxsYmFjayhuYW1lLCBjYWxsYmFjayk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9ybWF0dGVkLnB1c2godmFsaWRhdGVTdHJpbmcocGlwZS5ydW4odGhpc1t3b3JraW5nRGF0YVN5bWJvbF0pKSk7XG5cdFx0dGV4dCA9IHRleHQuc3Vic3RyaW5nKGVuZEluZGV4ICsgY2xvc2VNYXJrZXIubGVuZ3RoKTtcblx0fVxuXG5cdHJldHVybiBmb3JtYXR0ZWQuam9pbihcIlwiKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUFycmF5LCB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgTWVkaWFUeXBlLCBwYXJzZU1lZGlhVHlwZSB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbChcImludGVybmFsXCIpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSBhbiBvYmplY3QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuVHlwZXMuTWVkaWFUeXBlKClgLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5jbGFzcyBNZWRpYVR5cGUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdWJ0eXBlXG5cdCAqIEBwYXJhbSB7TW9uc3Rlci5UeXBlcy5QYXJhbWV0ZXJbXX0gcGFyYW1ldGVyXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0eXBlLCBzdWJ0eXBlLCBwYXJhbWV0ZXIpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpc1tpbnRlcm5hbF0gPSB7XG5cdFx0XHR0eXBlOiB2YWxpZGF0ZVN0cmluZyh0eXBlKS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0c3VidHlwZTogdmFsaWRhdGVTdHJpbmcoc3VidHlwZSkudG9Mb3dlckNhc2UoKSxcblx0XHRcdHBhcmFtZXRlcjogW10sXG5cdFx0fTtcblxuXHRcdGlmIChwYXJhbWV0ZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpc1tpbnRlcm5hbF1bXCJwYXJhbWV0ZXJcIl0gPSB2YWxpZGF0ZUFycmF5KHBhcmFtZXRlcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci90eXBlcy9tZWRpYS10eXBlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldCB0eXBlKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsXS50eXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICovXG5cdGdldCBzdWJ0eXBlKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsXS5zdWJ0eXBlO1xuXHR9XG5cblx0Ly8gLyoqXG5cdC8vICAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuUGFyYW1ldGVyW119XG5cdC8vICAqL1xuXHQvLyBnZXQgcGFyYW1ldGVyKCkge1xuXHQvLyBcdHJldHVybiB0aGlzW2ludGVybmFsXS5wYXJhbWV0ZXI7XG5cdC8vIH1cblxuXHQvKipcblx0ICpcblx0ICpcblx0ICogQHJldHVybiB7TWFwfVxuXHQgKi9cblx0Z2V0IHBhcmFtZXRlcigpIHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG5cblx0XHR0aGlzW2ludGVybmFsXVtcInBhcmFtZXRlclwiXS5mb3JFYWNoKChwKSA9PiB7XG5cdFx0XHRsZXQgdmFsdWUgPSBwLnZhbHVlO1xuXG5cdFx0XHQvLyBpbnRlcm5hbGx5IHNwZWNpYWwgdmFsdWVzIGFyZSBwYXJ0bHkgc3RvcmVkIHdpdGggcXVvdGVzLCB0aGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlbS5cblx0XHRcdGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQuc2V0KHAua2V5LCB2YWx1ZSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHRvU3RyaW5nKCkge1xuXHRcdGNvbnN0IHBhcmFtZXRlciA9IFtdO1xuXHRcdGZvciAoY29uc3QgYSBvZiB0aGlzW2ludGVybmFsXS5wYXJhbWV0ZXIpIHtcblx0XHRcdHBhcmFtZXRlci5wdXNoKGAke2Eua2V5fT0ke2EudmFsdWV9YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGAke3RoaXNbaW50ZXJuYWxdLnR5cGV9LyR7dGhpc1tpbnRlcm5hbF0uc3VidHlwZX0ke1xuXHRcdFx0cGFyYW1ldGVyLmxlbmd0aCA+IDAgPyBgOyR7cGFyYW1ldGVyLmpvaW4oXCI7XCIpfWAgOiBcIlwiXG5cdFx0fWA7XG5cdH1cbn1cblxuLyoqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuVHlwZXMucGFyc2VNZWRpYVR5cGUoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7TW9uc3Rlcn0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvbW9uc3Rlci5tanMnO1xuICogY29uc29sZS5sb2coTW9uc3Rlci5UeXBlcy5wYXJzZU1lZGlhVHlwZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3BhcnNlTWVkaWFUeXBlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhwYXJzZU1lZGlhVHlwZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBTcGVjaWZpY2F0aW9uOlxuICpcbiAqIGBgYFxuICogZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICogbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gKiBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gKiBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhdHlwZVxuICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5NZWRpYVR5cGV9XG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjA0NSNzZWN0aW9uLTUuMVxuICogQHRocm93cyB7VHlwZUVycm9yfSB0aGUgbWltZXR5cGUgY2FuIG5vdCBiZSBwYXJzZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gYmxhbmsgdmFsdWUgaXMgbm90IGFsbG93ZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gbWFsZm9ybWVkIGRhdGEgdXJsXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVkaWFUeXBlKG1lZGlhdHlwZSkge1xuXHRjb25zdCByZWdleCA9XG5cdFx0Lyg/PHR5cGU+W0EtWmEtel0rfFxcKilcXC8oPzxzdWJ0eXBlPihbYS16QS1aMC05LlxcK19cXC1dKyl8XFwqfCkoPzxwYXJhbWV0ZXI+XFxzKjtcXHMqKFthLXpBLVowLTldKylcXHMqKD1cXHMqKFwiP1tBLVphLXowLTlfXFwtXStcIj8pKT8pKi9nO1xuXHRjb25zdCByZXN1bHQgPSByZWdleC5leGVjKHZhbGlkYXRlU3RyaW5nKG1lZGlhdHlwZSkpO1xuXG5cdGNvbnN0IGdyb3VwcyA9IHJlc3VsdD8uW1wiZ3JvdXBzXCJdO1xuXHRpZiAoZ3JvdXBzID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidGhlIG1pbWV0eXBlIGNhbiBub3QgYmUgcGFyc2VkXCIpO1xuXHR9XG5cblx0Y29uc3QgdHlwZSA9IGdyb3Vwcz8uW1widHlwZVwiXTtcblx0Y29uc3Qgc3VidHlwZSA9IGdyb3Vwcz8uW1wic3VidHlwZVwiXTtcblx0Y29uc3QgcGFyYW1ldGVyID0gZ3JvdXBzPy5bXCJwYXJhbWV0ZXJcIl07XG5cblx0aWYgKHN1YnR5cGUgPT09IFwiXCIgfHwgdHlwZSA9PT0gXCJcIikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJibGFuayB2YWx1ZSBpcyBub3QgYWxsb3dlZFwiKTtcblx0fVxuXG5cdHJldHVybiBuZXcgTWVkaWFUeXBlKHR5cGUsIHN1YnR5cGUsIHBhcnNlUGFyYW1ldGVyKHBhcmFtZXRlcikpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE4LjBcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbWV0ZXJcbiAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuUGFyYW1ldGVyW118dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBwYXJzZVBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcblx0aWYgKCFpc1N0cmluZyhwYXJhbWV0ZXIpKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXG5cdHBhcmFtZXRlci5zcGxpdChcIjtcIikuZm9yRWFjaCgoZW50cnkpID0+IHtcblx0XHRlbnRyeSA9IGVudHJ5LnRyaW0oKTtcblx0XHRpZiAoZW50cnkgPT09IFwiXCIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBrdiA9IGVudHJ5LnNwbGl0KFwiPVwiKTtcblxuXHRcdGNvbnN0IGtleSA9IHZhbGlkYXRlU3RyaW5nKGt2Py5bMF0pLnRyaW0oKTtcblx0XHRjb25zdCB2YWx1ZSA9IHZhbGlkYXRlU3RyaW5nKGt2Py5bMV0pLnRyaW0oKTtcblxuXHRcdC8vIGlmIHZhbHVlcyBhcmUgcXVvdGVkLCB0aGV5IHJlbWFpbiBzbyBpbnRlcm5hbGx5XG5cdFx0cmVzdWx0LnB1c2goe1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHsgTWVkaWFUeXBlLCBwYXJzZU1lZGlhVHlwZSB9IGZyb20gXCIuL21lZGlhdHlwZS5tanNcIjtcbmltcG9ydCB7XG5cdHZhbGlkYXRlQm9vbGVhbixcblx0dmFsaWRhdGVJbnN0YW5jZSxcblx0dmFsaWRhdGVTdHJpbmcsXG59IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgRGF0YVVybCwgcGFyc2VEYXRhVVJMIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVybmFsID0gU3ltYm9sKFwiaW50ZXJuYWxcIik7XG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgYW4gb2JqZWN0IHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBEYXRhVXJsKClgLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL0RhdGFfVVJJc1xuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzIzOTdcbiAqL1xuY2xhc3MgRGF0YVVybCBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRcblx0ICogQHBhcmFtIHtTdHJpbmd8TWVkaWFUeXBlfSBtZWRpYXR5cGVcblx0ICogQHBhcmFtIHtib29sZWFufSBiYXNlNjQ9dHJ1ZVxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29udGVudCwgbWVkaWF0eXBlLCBiYXNlNjQpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGlzU3RyaW5nKG1lZGlhdHlwZSkpIHtcblx0XHRcdG1lZGlhdHlwZSA9IHBhcnNlTWVkaWFUeXBlKG1lZGlhdHlwZSk7XG5cdFx0fVxuXG5cdFx0dGhpc1tpbnRlcm5hbF0gPSB7XG5cdFx0XHRjb250ZW50OiB2YWxpZGF0ZVN0cmluZyhjb250ZW50KSxcblx0XHRcdG1lZGlhdHlwZTogdmFsaWRhdGVJbnN0YW5jZShtZWRpYXR5cGUsIE1lZGlhVHlwZSksXG5cdFx0XHRiYXNlNjQ6IHZhbGlkYXRlQm9vbGVhbihiYXNlNjQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBiYXNlNjQpLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL3R5cGVzL2RhdGEtdXJsXCIpO1xuXHR9XG5cblx0Z2V0IGNvbnRlbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxdLmJhc2U2NFxuXHRcdFx0PyBhdG9iKHRoaXNbaW50ZXJuYWxdLmNvbnRlbnQpXG5cdFx0XHQ6IHRoaXNbaW50ZXJuYWxdLmNvbnRlbnQ7XG5cdH1cblxuXHRnZXQgbWVkaWF0eXBlKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsXS5tZWRpYXR5cGU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjM5N1xuXHQgKi9cblx0dG9TdHJpbmcoKSB7XG5cdFx0bGV0IGNvbnRlbnQgPSB0aGlzW2ludGVybmFsXS5jb250ZW50O1xuXG5cdFx0aWYgKHRoaXNbaW50ZXJuYWxdLmJhc2U2NCA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29udGVudCA9IGA7YmFzZTY0LCR7Y29udGVudH1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZW50ID0gYCwke2VuY29kZVVSSUNvbXBvbmVudChjb250ZW50KX1gO1xuXHRcdH1cblxuXHRcdHJldHVybiBgZGF0YToke3RoaXNbaW50ZXJuYWxdLm1lZGlhdHlwZS50b1N0cmluZygpfSR7Y29udGVudH1gO1xuXHR9XG59XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBwYXJzZURhdGFVUkwoKWAuXG4gKlxuICogU3BlY2lmaWNhdGlvbjpcbiAqXG4gKiBgYGBcbiAqIGRhdGF1cmwgICAgOj0gXCJkYXRhOlwiIFsgbWVkaWF0eXBlIF0gWyBcIjtiYXNlNjRcIiBdIFwiLFwiIGRhdGFcbiAqIG1lZGlhdHlwZSAgOj0gWyB0eXBlIFwiL1wiIHN1YnR5cGUgXSAqKCBcIjtcIiBwYXJhbWV0ZXIgKVxuICogZGF0YSAgICAgICA6PSAqdXJsY2hhclxuICogcGFyYW1ldGVyICA6PSBhdHRyaWJ1dGUgXCI9XCIgdmFsdWVcbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9CYXNpY3Nfb2ZfSFRUUC9EYXRhX1VSSXNcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGluY29ycmVjdCBvciBtaXNzaW5nIGRhdGEgcHJvdG9jb2xcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gbWFsZm9ybWVkIGRhdGEgdXJsXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YXVybFxuICogQHJldHVybiB7RGF0YVVybH1cbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRhVVJMKGRhdGF1cmwpIHtcblx0dmFsaWRhdGVTdHJpbmcoZGF0YXVybCk7XG5cblx0ZGF0YXVybCA9IGRhdGF1cmwudHJpbSgpO1xuXG5cdGlmIChkYXRhdXJsLnN1YnN0cmluZygwLCA1KSAhPT0gXCJkYXRhOlwiKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcImluY29ycmVjdCBvciBtaXNzaW5nIGRhdGEgcHJvdG9jb2xcIik7XG5cdH1cblxuXHRkYXRhdXJsID0gZGF0YXVybC5zdWJzdHJpbmcoNSk7XG5cblx0Y29uc3QgcCA9IGRhdGF1cmwuaW5kZXhPZihcIixcIik7XG5cdGlmIChwID09PSAtMSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYWxmb3JtZWQgZGF0YSB1cmxcIik7XG5cdH1cblxuXHRsZXQgY29udGVudCA9IGRhdGF1cmwuc3Vic3RyaW5nKHAgKyAxKTtcblx0Y29uc3QgbWVkaWF0eXBlQW5kQmFzZTY0ID0gZGF0YXVybC5zdWJzdHJpbmcoMCwgcCkudHJpbSgpO1xuXHRsZXQgbWVkaWF0eXBlID0gXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUlcIjtcblx0bGV0IGJhc2U2NEZsYWcgPSBmYWxzZTtcblxuXHRpZiAobWVkaWF0eXBlQW5kQmFzZTY0ICE9PSBcIlwiKSB7XG5cdFx0bWVkaWF0eXBlID0gbWVkaWF0eXBlQW5kQmFzZTY0O1xuXHRcdGlmIChtZWRpYXR5cGVBbmRCYXNlNjQuZW5kc1dpdGgoXCJiYXNlNjRcIikpIHtcblx0XHRcdGNvbnN0IGkgPSBtZWRpYXR5cGVBbmRCYXNlNjQubGFzdEluZGV4T2YoXCI7XCIpO1xuXHRcdFx0bWVkaWF0eXBlID0gbWVkaWF0eXBlQW5kQmFzZTY0LnN1YnN0cmluZygwLCBpKTtcblx0XHRcdGJhc2U2NEZsYWcgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZW50ID0gZGVjb2RlVVJJQ29tcG9uZW50KGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdG1lZGlhdHlwZSA9IHBhcnNlTWVkaWFUeXBlKG1lZGlhdHlwZSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29udGVudCA9IGRlY29kZVVSSUNvbXBvbmVudChjb250ZW50KTtcblx0fVxuXG5cdHJldHVybiBuZXcgRGF0YVVybChjb250ZW50LCBtZWRpYXR5cGUsIGJhc2U2NEZsYWcpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBRdWV1ZSB9O1xuXG4vKipcbiAqIEEgcXVldWUgaXMgYSBsaXN0IG9mIGl0ZW1zIHRoYXQgYXJlIHByb2Nlc3NlZCBvbmUgYWZ0ZXIgYW5vdGhlciAoZmlyc3QgaW4sIGZpcnN0IG91dCkuXG4gKlxuICogV2l0aCBhIHF1ZXVlIHlvdSBjYW4gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYFF1ZXVlLmFkZCgpYCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBgUXVldWUucG9wKClgLlxuICpcbiAqIFdpdGggYFF1ZXVlLnBlZWsoKWAgeW91IGNhbiBnZXQgdGhlIGZpcnN0IGl0ZW0gd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBsaXN0LlxuICpcbiAqIFlvdSBjYW4gY3JlYXRlIHRoZSBpbnN0YW5jZSB2aWEgYG5ldyBRdWV1ZSgpYC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjQuMFxuICogQHN1bW1hcnkgQSBRdWV1ZSAoRmlmbylcbiAqL1xuY2xhc3MgUXVldWUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuZGF0YSA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci90eXBlcy9xdWV1ZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0aXNFbXB0eSgpIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWFkIHRoZSBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgd2l0aG91dCByZW1vdmluZyBpdC5cblx0ICpcblx0ICogQHJldHVybiB7Kn1cblx0ICovXG5cdHBlZWsoKSB7XG5cdFx0aWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRhdGFbMF07XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7UXVldWV9XG5cdCAqL1xuXHRhZGQodmFsdWUpIHtcblx0XHR0aGlzLmRhdGEucHVzaCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogcmVtb3ZlIGFsbCBlbnRyaWVzXG5cdCAqXG5cdCAqIEByZXR1cm4ge1F1ZXVlfVxuXHQgKi9cblx0Y2xlYXIoKSB7XG5cdFx0dGhpcy5kYXRhID0gW107XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIHRoZSBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWVcblx0ICogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm4gdW5kZWZpbmVkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHsqfVxuXHQgKi9cblx0cG9sbCgpIHtcblx0XHRpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmRhdGEuc2hpZnQoKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUubWpzXCI7XG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU9iamVjdCB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBVbmlxdWVRdWV1ZSB9O1xuXG4vKipcbiAqIEFuIFVuaXF1ZVF1ZXVlIGlzIGEgcXVldWUgdGhhdCBjb250YWlucyBpdGVtcyBvbmx5IG9uY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIHF1ZXVlIGZvciB1bmlxdWUgdmFsdWVzXG4gKi9cbmNsYXNzIFVuaXF1ZVF1ZXVlIGV4dGVuZHMgUXVldWUge1xuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG5cdFx0XHR1bmlxdWU6IG5ldyBXZWFrU2V0KCksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG5cdCAqIEByZXR1cm4ge1F1ZXVlfVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuXHQgKi9cblx0YWRkKHZhbHVlKSB7XG5cdFx0dmFsaWRhdGVPYmplY3QodmFsdWUpO1xuXG5cdFx0aWYgKCF0aGlzW2ludGVybmFsU3ltYm9sXS51bmlxdWUuaGFzKHZhbHVlKSkge1xuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0udW5pcXVlLmFkZCh2YWx1ZSk7XG5cdFx0XHRzdXBlci5hZGQodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJlbW92ZSBhbGwgZW50cmllc1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtRdWV1ZX1cblx0ICovXG5cdGNsZWFyKCkge1xuXHRcdHN1cGVyLmNsZWFyKCk7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0udW5pcXVlID0gbmV3IFdlYWtTZXQoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuXHQgKiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJldHVybiB1bmRlZmluZWQuXG5cdCAqXG5cdCAqIEByZXR1cm4ge29iamVjdH1cblx0ICovXG5cdHBvbGwoKSB7XG5cdFx0aWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS5zaGlmdCgpO1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLnVuaXF1ZS5kZWxldGUodmFsdWUpO1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7IFRva2VuTGlzdCB9IGZyb20gXCIuL3Rva2VubGlzdC5tanNcIjtcbmltcG9ydCB7IFVuaXF1ZVF1ZXVlIH0gZnJvbSBcIi4vdW5pcXVlcXVldWUubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBPYnNlcnZlciB9O1xuXG4vKipcbiAqIEFuIG9ic2VydmVyIG1hbmFnZXMgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIFRoZSB1cGRhdGUgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBzdWJqZWN0IG9iamVjdCBhcyB0aGlzIHBvaW50ZXIuIEZvciB0aGlzIHJlYXNvblxuICogdGhlIGNhbGxiYWNrIHNob3VsZCBub3QgYmUgYW4gYXJyb3cgZnVuY3Rpb24sIGJlY2F1c2UgaXQgZ2V0cyB0aGlzIHBvaW50ZXIgb2YgaXRzIG93biBjb250ZXh0LlxuICpcbiAqIEluY2x1ZGUgdGhpcyBjbGFzcyBpbiB5b3VyIHByb2plY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGU6XG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIkBzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuICogYGBgXG4gKlxuICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqIGBgYGpzXG4gKiBuZXcgT2JzZXJ2ZXIoKCk9PntcbiAqICAgICAvLyB0aGlzIGlzIG5vdCBzdWJqZWN0XG4gKiB9KVxuICpcbiAqIG5ldyBPYnNlcnZlcihmdW5jdGlvbigpIHtcbiAqICAgICAvLyB0aGlzIGlzIHN1YmplY3RcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gVG8gZG8gdGhpcywgc2ltcGx5IHNwZWNpZnkgdGhlbS5cbiAqXG4gKiBgYGBqc1xuICogT2JzZXJ2ZXIoZnVuY3Rpb24oYSwgYiwgYykge1xuICogICAgIGNvbnNvbGUubG9nKGEsIGIsIGMpOyAvLyBcdTIxQTYgXCJhXCIsIDIsIHRydWVcbiAqIH0sIFwiYVwiLCAyLCB0cnVlKVxuICogYGBgXG4gKlxuICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG11c3QgaGF2ZSBhcyBtYW55IHBhcmFtZXRlcnMgYXMgYXJndW1lbnRzIGFyZSBnaXZlbi5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5jbGFzcyBPYnNlcnZlciBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcblx0ICogQHBhcmFtIHsqfSBhcmdzXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihjYWxsYmFjaywgLi4uYXJncykge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm9ic2VydmVyIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblx0XHR9XG5cblx0XHR0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cdFx0dGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuXHRcdHRoaXMudGFncyA9IG5ldyBUb2tlbkxpc3QoKTtcblx0XHR0aGlzLnF1ZXVlID0gbmV3IFVuaXF1ZVF1ZXVlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL3R5cGVzL29ic2VydmVyXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcblx0ICogQHJldHVybiB7T2JzZXJ2ZXJ9XG5cdCAqL1xuXHRhZGRUYWcodGFnKSB7XG5cdFx0dGhpcy50YWdzLmFkZCh0YWcpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcblx0ICogQHJldHVybiB7T2JzZXJ2ZXJ9XG5cdCAqL1xuXHRyZW1vdmVUYWcodGFnKSB7XG5cdFx0dGhpcy50YWdzLnJlbW92ZSh0YWcpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge0FycmF5fVxuXHQgKi9cblx0Z2V0VGFncygpIHtcblx0XHRyZXR1cm4gdGhpcy50YWdzLmVudHJpZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRoYXNUYWcodGFnKSB7XG5cdFx0cmV0dXJuIHRoaXMudGFncy5jb250YWlucyh0YWcpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzdWJqZWN0XG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHR1cGRhdGUoc3ViamVjdCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCFpc09iamVjdChzdWJqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwic3ViamVjdCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0c2VsZi5xdWV1ZS5hZGQoc3ViamVjdCk7XG5cblx0XHRcdHF1ZXVlTWljcm90YXNrKCgpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyB0aGUgcXVldWUgYW5kIHRoZSBgcXVldWVNaWNyb3Rhc2tgIGVuc3VyZSB0aGF0IGFuIG9iamVjdCBpcyBub3Rcblx0XHRcdFx0XHQvLyBpbmZvcm1lZCBvZiB0aGUgc2FtZSBjaGFuZ2UgbW9yZSB0aGFuIG9uY2UuXG5cdFx0XHRcdFx0aWYgKHNlbGYucXVldWUuaXNFbXB0eSgpKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcyA9IHNlbGYucXVldWUucG9sbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHNlbGYuY2FsbGJhY2suYXBwbHkocywgc2VsZi5hcmd1bWVudHMpO1xuXG5cdFx0XHRcdFx0aWYgKGlzT2JqZWN0KHJlc3VsdCkgJiYgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0LnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnN0YW5jZSB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBPYnNlcnZlckxpc3QgfTtcblxuLyoqXG4gKiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBPYnNlcnZlckxpc3QgY2xhc3MsIG9ic2VydmVyIGNhbiBiZSBtYW5hZ2VkLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKi9cbmNsYXNzIE9ic2VydmVyTGlzdCBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5vYnNlcnZlcnMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtPYnNlcnZlckxpc3R9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIE9ic2VydmVyXG5cdCAqL1xuXHRhdHRhY2gob2JzZXJ2ZXIpIHtcblx0XHR2YWxpZGF0ZUluc3RhbmNlKG9ic2VydmVyLCBPYnNlcnZlcik7XG5cblx0XHR0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtPYnNlcnZlckxpc3R9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIE9ic2VydmVyXG5cdCAqL1xuXHRkZXRhY2gob2JzZXJ2ZXIpIHtcblx0XHR2YWxpZGF0ZUluc3RhbmNlKG9ic2VydmVyLCBPYnNlcnZlcik7XG5cblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIGwgPSB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG5cdFx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRcdGlmICh0aGlzLm9ic2VydmVyc1tpXSA9PT0gb2JzZXJ2ZXIpIHtcblx0XHRcdFx0dGhpcy5vYnNlcnZlcnMuc3BsaWNlKGksIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIE9ic2VydmVyXG5cdCAqL1xuXHRjb250YWlucyhvYnNlcnZlcikge1xuXHRcdHZhbGlkYXRlSW5zdGFuY2Uob2JzZXJ2ZXIsIE9ic2VydmVyKTtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIGwgPSB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG5cdFx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRcdGlmICh0aGlzLm9ic2VydmVyc1tpXSA9PT0gb2JzZXJ2ZXIpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gc3ViamVjdFxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0bm90aWZ5KHN1YmplY3QpIHtcblx0XHRjb25zdCBwb21pc2VzID0gW107XG5cblx0XHRsZXQgaSA9IDA7XG5cdFx0Y29uc3QgbCA9IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcblx0XHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdFx0cG9taXNlcy5wdXNoKHRoaXMub2JzZXJ2ZXJzW2ldLnVwZGF0ZShzdWJqZWN0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKHBvbWlzZXMpO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4vb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyBPYnNlcnZlckxpc3QgfSBmcm9tIFwiLi9vYnNlcnZlcmxpc3QubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU9iamVjdCB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wsIHByb3h5SW5zdGFuY2VNYXJrZXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmV4cG9ydCB7IFByb3h5T2JzZXJ2ZXIgfTtcblxuLyoqXG4gKiBBbiBvYnNlcnZlciBtYW5hZ2VzIGEgY2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBXaXRoIHRoZSBQcm94eU9ic2VydmVyIHlvdSBjYW4gYXR0YWNoIG9ic2VydmVyIGZvciBvYnNlcnZhdGlvbi5cbiAqIFdpdGggZWFjaCBjaGFuZ2UgYXQgdGhlIG9iamVjdCB0byBiZSBvYnNlcnZlZCwgYW4gdXBkYXRlIHRha2VzIHBsYWNlLlxuICpcbiAqIFRoaXMgYWxzbyBhcHBsaWVzIHRvIG5lc3RlZCBvYmplY3RzLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5jbGFzcyBQcm94eU9ic2VydmVyIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvYmplY3QpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5yZWFsU3ViamVjdCA9IHZhbGlkYXRlT2JqZWN0KG9iamVjdCk7XG5cdFx0dGhpcy5zdWJqZWN0ID0gbmV3IFByb3h5KG9iamVjdCwgZ2V0SGFuZGxlci5jYWxsKHRoaXMpKTtcblxuXHRcdHRoaXMub2JqZWN0TWFwID0gbmV3IFdlYWtNYXAoKTtcblx0XHR0aGlzLm9iamVjdE1hcC5zZXQodGhpcy5yZWFsU3ViamVjdCwgdGhpcy5zdWJqZWN0KTtcblxuXHRcdHRoaXMucHJveHlNYXAgPSBuZXcgV2Vha01hcCgpO1xuXHRcdHRoaXMucHJveHlNYXAuc2V0KHRoaXMuc3ViamVjdCwgdGhpcy5yZWFsU3ViamVjdCk7XG5cblx0XHR0aGlzLm9ic2VydmVycyA9IG5ldyBPYnNlcnZlckxpc3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvdHlwZXMvcHJveHktb2JzZXJ2ZXJcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7b2JqZWN0fVxuXHQgKi9cblx0Z2V0U3ViamVjdCgpIHtcblx0XHRyZXR1cm4gdGhpcy5zdWJqZWN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBzaW5jZSAxLjI0LjBcblx0ICogQHBhcmFtIHtPYmplY3R9IG9ialxuXHQgKiBAcmV0dXJuIHtQcm94eU9ic2VydmVyfVxuXHQgKi9cblx0c2V0U3ViamVjdChvYmopIHtcblx0XHRsZXQgaTtcblx0XHRjb25zdCBjbG9uZWRPYmplY3QgPSBjbG9uZShvYmopO1xuXHRcdGNvbnN0IGsgPSBPYmplY3Qua2V5cyh0aGlzLnN1YmplY3QpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5zdWJqZWN0W2tbaV1dO1xuXHRcdH1cblxuXHRcdHRoaXMuc3ViamVjdCA9IGV4dGVuZCh0aGlzLnN1YmplY3QsIGNsb25lZE9iamVjdCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByZWFsIG9iamVjdFxuXHQgKlxuXHQgKiBDaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IGFyZSBub3Qgbm90aWNlZCBieSB0aGUgb2JzZXJ2ZXJzLCBzbyB5b3UgY2FuIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgY2hhbmdlcyBhbmQgaW5mb3JtIHRoZSBvYnNlcnZlcnMgbGF0ZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge29iamVjdH1cblx0ICovXG5cdGdldFJlYWxTdWJqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnJlYWxTdWJqZWN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIGF0dGFjaCBhIG5ldyBvYnNlcnZlclxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtQcm94eU9ic2VydmVyfVxuXHQgKi9cblx0YXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcblx0XHR0aGlzLm9ic2VydmVycy5hdHRhY2gob2JzZXJ2ZXIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGRldGFjaCBhIG9ic2VydmVyXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge1Byb3h5T2JzZXJ2ZXJ9XG5cdCAqL1xuXHRkZXRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuXHRcdHRoaXMub2JzZXJ2ZXJzLmRldGFjaChvYnNlcnZlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogbm90aWZ5IGFsbCBvYnNlcnZlclxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0bm90aWZ5T2JzZXJ2ZXJzKCkge1xuXHRcdHJldHVybiB0aGlzLm9ic2VydmVycy5ub3RpZnkodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGNvbnRhaW5zT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5vYnNlcnZlcnMuY29udGFpbnMob2JzZXJ2ZXIpO1xuXHR9XG59XG5cbi8qKlxuICpcbiAqIEByZXR1cm4ge3tkZWZpbmVQcm9wZXJ0eTogKGZ1bmN0aW9uKCo9LCAqPSwgKj0pOiAqKSwgc2V0UHJvdG90eXBlT2Y6IChmdW5jdGlvbigqLCAqPSk6IGJvb2xlYW4pLCBzZXQ6IChmdW5jdGlvbigqLCAqLCAqLCAqKTogYm9vbGVhbiksIGdldDogKChmdW5jdGlvbigqPSwgKj0sICo9KTogKHVuZGVmaW5lZCkpfCopLCBkZWxldGVQcm9wZXJ0eTogKChmdW5jdGlvbigqLCAqKTogKGJvb2xlYW4pKXwqKX19XG4gKiBAcHJpdmF0ZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vLS9zbmlwcGV0cy80OX1cbiAqL1xuZnVuY3Rpb24gZ2V0SGFuZGxlcigpIHtcblx0Y29uc3QgcHJveHkgPSB0aGlzO1xuXG5cdC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG5cdGNvbnN0IGhhbmRsZXIgPSB7XG5cdFx0Ly8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHMtZ2V0LXAtcmVjZWl2ZXJcblx0XHRnZXQ6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcblx0XHRcdC8vIHRoaXMgaXMgYW4gaW50ZXJuYWwgaGFjayB0byBpZGVudGlmeSBwcm94eVxuXHRcdFx0aWYgKGtleSA9PT0gcHJveHlJbnN0YW5jZU1hcmtlcikge1xuXHRcdFx0XHRyZXR1cm4gcHJveHlJbnN0YW5jZU1hcmtlcjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuXG5cdFx0XHRpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgdmFsdWUgYXMgcHJveHkgaWYgb2JqZWN0IG9yIGFycmF5XG5cdFx0XHRpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpKSB7XG5cdFx0XHRcdGlmIChwcm94eS5vYmplY3RNYXAuaGFzKHZhbHVlKSkge1xuXHRcdFx0XHRcdHJldHVybiBwcm94eS5vYmplY3RNYXAuZ2V0KHZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChwcm94eS5wcm94eU1hcC5oYXModmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHAgPSBuZXcgUHJveHkodmFsdWUsIGhhbmRsZXIpO1xuXHRcdFx0XHRcdHByb3h5Lm9iamVjdE1hcC5zZXQodmFsdWUsIHApO1xuXHRcdFx0XHRcdHByb3h5LnByb3h5TWFwLnNldChwLCB2YWx1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuIHA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cblx0XHQvLyBodHRwczovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzkuMC8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90cy1zZXQtcC12LXJlY2VpdmVyXG5cdFx0c2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuXHRcdFx0aWYgKHByb3h5LnByb3h5TWFwLmhhcyh2YWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSBwcm94eS5wcm94eU1hcC5nZXQodmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJveHkucHJveHlNYXAuaGFzKHRhcmdldCkpIHtcblx0XHRcdFx0dGFyZ2V0ID0gcHJveHkucHJveHlNYXAuZ2V0KHRhcmdldCk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjdXJyZW50ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKTtcblx0XHRcdGlmIChwcm94eS5wcm94eU1hcC5oYXMoY3VycmVudCkpIHtcblx0XHRcdFx0Y3VycmVudCA9IHByb3h5LnByb3h5TWFwLmdldChjdXJyZW50KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnQgPT09IHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVzdWx0O1xuXHRcdFx0bGV0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG5cblx0XHRcdGlmIChkZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZGVzY3JpcHRvciA9IHtcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0ZGVzY3JpcHRvcltcInZhbHVlXCJdID0gdmFsdWU7XG5cdFx0XHRyZXN1bHQgPSBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBrZXkgIT09IFwic3ltYm9sXCIpIHtcblx0XHRcdFx0cHJveHkub2JzZXJ2ZXJzLm5vdGlmeShwcm94eSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblxuXHRcdC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLWRlbGV0ZS1wXG5cdFx0ZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuXHRcdFx0aWYgKGtleSBpbiB0YXJnZXQpIHtcblx0XHRcdFx0ZGVsZXRlIHRhcmdldFtrZXldO1xuXG5cdFx0XHRcdGlmICh0eXBlb2Yga2V5ICE9PSBcInN5bWJvbFwiKSB7XG5cdFx0XHRcdFx0cHJveHkub2JzZXJ2ZXJzLm5vdGlmeShwcm94eSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXG5cdFx0Ly8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHMtZGVmaW5lb3ducHJvcGVydHktcC1kZXNjXG5cdFx0ZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG5cdFx0XHRpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuXHRcdFx0XHRwcm94eS5vYnNlcnZlcnMubm90aWZ5KHByb3h5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblxuXHRcdC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLXNldHByb3RvdHlwZW9mLXZcblx0XHRzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldFByb3RvdHlwZU9mKG9iamVjdDEsIGtleSk7XG5cblx0XHRcdGlmICh0eXBlb2Yga2V5ICE9PSBcInN5bWJvbFwiKSB7XG5cdFx0XHRcdHByb3h5Lm9ic2VydmVycy5ub3RpZnkocHJveHkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sXG5cdH07XG5cblx0cmV0dXJuIGhhbmRsZXI7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX1RIRU1FX05BTUUsIERFRkFVTFRfVEhFTUUgfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBUaGVtZSwgZ2V0RG9jdW1lbnRUaGVtZSB9O1xuXG4vKipcbiAqIFRoZSBUaGVtZSBjbGFzcyBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHRoZW1lLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kb20vdGhlbWUubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjcuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgdGhlbWUgY2xhc3NcbiAqL1xuY2xhc3MgVGhlbWUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihuYW1lKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR2YWxpZGF0ZVN0cmluZyhuYW1lKTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vdGhlbWVcIik7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0TmFtZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5uYW1lO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIHRoZW1pbmcgdXNlZCBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIGRlZmluZWQgdmlhIHRoZSBodG1sLXRhZy5cbiAqIFRoZSB0aGVtaW5nIGlzIHNwZWNpZmllZCB2aWEgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWVgLlxuICpcbiAqIEFzIG5hbWUgZm9yIGEgdGhlbWUgYWxsIGNoYXJhY3RlcnMgYXJlIHZhbGlkLCB3aGljaCBhcmUgYWxzbyBhbGxvd2VkIGZvciBhIEhUTUxFbGVtZW50LUlELlxuICpcbiAqIGBgYFxuICogPGh0bWwgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWU9XCJteS10aGVtZVwiPlxuICogYGBgXG4gKlxuICogdGhlIGRlZmF1bHQgdGhlbWUgbmFtZSBpcyBgbW9uc3RlcmAuXG4gKlxuICogQHJldHVybiB7VGhlbWV9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjcuMFxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudFRoZW1lKCkge1xuXHRjb25zdCBkb2N1bWVudCA9IGdldEdsb2JhbE9iamVjdChcImRvY3VtZW50XCIpO1xuXHRsZXQgbmFtZSA9IERFRkFVTFRfVEhFTUU7XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpO1xuXHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0Y29uc3QgdGhlbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSk7XG5cdFx0aWYgKHRoZW1lKSB7XG5cdFx0XHRuYW1lID0gdGhlbWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ldyBUaGVtZShuYW1lKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxGdW5jdGlvbiwgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWCB9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50VGhlbWUgfSBmcm9tIFwiLi90aGVtZS5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGZpbmRFbGVtZW50V2l0aElkVXB3YXJkcyB9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7IFRlbXBsYXRlIH07XG5cbi8qKlxuICogVGhlIHRlbXBsYXRlIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGNyZWF0aW5nIHRlbXBsYXRlcy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgdGVtcGxhdGUgY2xhc3NcbiAqL1xuY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGVcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Zcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0Y29uc3QgSFRNTFRlbXBsYXRlRWxlbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKFwiSFRNTFRlbXBsYXRlRWxlbWVudFwiKTtcblx0XHR2YWxpZGF0ZUluc3RhbmNlKHRlbXBsYXRlLCBIVE1MVGVtcGxhdGVFbGVtZW50KTtcblx0XHR0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RvbS9yZXNvdXJjZS90ZW1wbGF0ZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtIVE1MVGVtcGxhdGVFbGVtZW50fVxuXHQgKi9cblx0Z2V0VGVtcGxhdGVFbGVtZW50KCkge1xuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge0RvY3VtZW50RnJhZ21lbnR9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG5cdCAqL1xuXHRjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkge1xuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgbG9hZHMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgcmV0dXJucyBpdC5cbiAqXG4gKiBUbyBkbyB0aGlzLCBpdCBmaXJzdCByZWFkcyB0aGUgdGhlbWUgb2YgdGhlIGRvY3VtZW50IGFuZCBsb29rcyBmb3IgdGhlIGBkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZWAgYXR0cmlidXRlIGluIHRoZSBIVE1MIHRhZy5cbiAqXG4gKiBgYGBcbiAqIDxodG1sIGRhdGEtbW9uc3Rlci10aGVtZS1uYW1lPVwibXktdGhlbWVcIj5cbiAqIGBgYFxuICpcbiAqIElmIG5vIHRoZW1lIHdhcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHRoZW1lIGlzIGBtb25zdGVyYC5cbiAqXG4gKiBOb3cgaXQgaXMgbG9va2VkIGlmIHRoZXJlIGlzIGEgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIHRoZW1lIGBpZC10aGVtZWAgYW5kIGlmIHllcyBpdCBpcyByZXR1cm5lZC5cbiAqIElmIHRoZXJlIGlzIG5vIHRlbXBsYXRlIGEgc2VhcmNoIGZvciBhIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIElEIGBpZGAgaXMgZG9uZS4gSWYgdGhpcyBpcyBhbHNvIG5vdCBmb3VuZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFlvdSBjYW4gY2FsbCB0aGUgbWV0aG9kIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuRE9NLmZpbmREb2N1bWVudFRlbXBsYXRlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2ZpbmRUZW1wbGF0ZX0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qcyc7XG4gKiBmaW5kRG9jdW1lbnRUZW1wbGF0ZSgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHsgZmluZERvY3VtZW50VGVtcGxhdGUgfSBmcm9tIFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qc1wiO1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICogdGVtcGxhdGUuaWQgPSBcIm15VGVtcGxhdGVcIjtcbiAqIHRlbXBsYXRlLmlubmVySFRNTCA9IFwiPHA+bXkgZGVmYXVsdCB0ZW1wbGF0ZTwvcD5cIjtcbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICpcbiAqIGNvbnN0IHRoZW1lZFRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICogdGhlbWVkVGVtcGxhdGUuaWQgPSBcIm15VGVtcGxhdGUtbXlUaGVtZVwiO1xuICogdGhlbWVkVGVtcGxhdGUuaW5uZXJIVE1MID0gXCI8cD5teSB0aGVtZWQgdGVtcGxhdGU8L3A+XCI7XG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoZW1lZFRlbXBsYXRlKTtcbiAqXG4gKiAvLyBsb2FkcyB0aGUgdGVtcGxlIGFuZCBzaW5jZSBubyB0aGVtZSBpcyBzZXQgdGhlIGRlZmF1bHQgdGVtcGxhdGVcbiAqIGNvbnN0IHRlbXBsYXRlMSA9IGZpbmREb2N1bWVudFRlbXBsYXRlKFwibXlUZW1wbGF0ZVwiKTtcbiAqIGNvbnNvbGUubG9nKHRlbXBsYXRlMS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICogLy8gXHUyMUE2ICc8cD5teSBkZWZhdWx0IHRlbXBsYXRlPC9wPidcbiAqXG4gKiAvLyBub3cgd2Ugc2V0IG91ciBvd24gdGhlbWVcbiAqIGRvY3VtZW50XG4gKiAucXVlcnlTZWxlY3RvcihcImh0bWxcIilcbiAqIC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZVwiLCBcIm15VGhlbWVcIik7XG4gKlxuICogLy8gbm93IHdlIGRvbid0IGdldCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSxcbiAqIC8vIGJ1dCB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgdGhlbWUgaW4gdGhlIGlkXG4gKiBjb25zdCB0ZW1wbGF0ZTIgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15VGVtcGxhdGVcIik7XG4gKiBjb25zb2xlLmxvZyh0ZW1wbGF0ZTIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAqIC8vIFx1MjFBNiAnPHA+bXkgdGhlbWVkIHRlbXBsYXRlPC9wPidcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGVcbiAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlRlbXBsYXRlfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGVtcGxhdGUgaWQgbm90IGZvdW5kLlxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREb2N1bWVudFRlbXBsYXRlKGlkLCBjdXJyZW50Tm9kZSkge1xuXHR2YWxpZGF0ZVN0cmluZyhpZCk7XG5cblx0Y29uc3QgZG9jdW1lbnQgPSBnZXRHbG9iYWxPYmplY3QoXCJkb2N1bWVudFwiKTtcblx0Y29uc3QgSFRNTFRlbXBsYXRlRWxlbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKFwiSFRNTFRlbXBsYXRlRWxlbWVudFwiKTtcblx0Y29uc3QgRG9jdW1lbnRGcmFnbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKFwiRG9jdW1lbnRGcmFnbWVudFwiKTtcblx0Y29uc3QgRG9jdW1lbnQgPSBnZXRHbG9iYWxGdW5jdGlvbihcIkRvY3VtZW50XCIpO1xuXG5cdGxldCBwcmVmaXhJRDtcblxuXHRpZiAoXG5cdFx0IShcblx0XHRcdGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50XG5cdFx0KVxuXHQpIHtcblx0XHRpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7XG5cdFx0XHRpZiAoY3VycmVudE5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVgpKSB7XG5cdFx0XHRcdHByZWZpeElEID0gY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVgpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFJvb3ROb2RlKCk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IShcblx0XHRcdFx0XHRjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8XG5cdFx0XHRcdFx0Y3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50XG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0IShcblx0XHRcdFx0Y3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fFxuXHRcdFx0XHRjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnRcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdGN1cnJlbnROb2RlID0gZG9jdW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0bGV0IHRlbXBsYXRlO1xuXHRjb25zdCB0aGVtZSA9IGdldERvY3VtZW50VGhlbWUoKTtcblxuXHRpZiAocHJlZml4SUQpIHtcblx0XHRjb25zdCB0aGVtZWRQcmVmaXhJRCA9IGAke3ByZWZpeElEfS0ke2lkfS0ke3RoZW1lLmdldE5hbWUoKX1gO1xuXG5cdFx0dGVtcGxhdGUgPSBmaW5kRWxlbWVudFdpdGhJZFVwd2FyZHMoY3VycmVudE5vZGUsIHRoZW1lZFByZWZpeElEKTtcblx0XHRpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCB0aGVtZWRJRCA9IGAke2lkfS0ke3RoZW1lLmdldE5hbWUoKX1gO1xuXG5cdHRlbXBsYXRlID0gZmluZEVsZW1lbnRXaXRoSWRVcHdhcmRzKGN1cnJlbnROb2RlLCB0aGVtZWRJRCk7XG5cdGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcblx0XHRyZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcblx0fVxuXG5cdHRlbXBsYXRlID0gZmluZEVsZW1lbnRXaXRoSWRVcHdhcmRzKGN1cnJlbnROb2RlLCBpZCk7XG5cdGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcblx0XHRyZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcihgdGVtcGxhdGUgJHtpZH0gbm90IGZvdW5kLmApO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdHlwZU9mIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVvZi5tanNcIjtcblxuZXhwb3J0IHsgZGlmZiB9O1xuXG4vKipcbiAqIFdpdGggdGhlIGRpZmYgZnVuY3Rpb24geW91IGNhbiBwZXJmb3JtIHRoZSBjaGFuZ2Ugb2Ygb25lIG9iamVjdCB0byBhbm90aGVyLiBUaGUgcmVzdWx0IHNob3dzIHRoZSBjaGFuZ2VzIG9mIHRoZSBzZWNvbmQgb2JqZWN0IHRvIHRoZSBmaXJzdCBvYmplY3QuXG4gKlxuICogVGhlIG9wZXJhdG9yIGBhZGRgIG1lYW5zIHRoYXQgc29tZXRoaW5nIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzZWNvbmQgb2JqZWN0LiBgZGVsZXRlYCBtZWFucyB0aGF0IHNvbWV0aGluZyBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIHNlY29uZCBvYmplY3QgY29tcGFyZWQgdG8gdGhlIGZpcnN0IG9iamVjdC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvZGF0YS9kaWZmLm1qc1xuICogQHBhcmFtIHsqfSBmaXJzdFxuICogQHBhcmFtIHsqfSBzZWNvbmRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmZ1bmN0aW9uIGRpZmYoZmlyc3QsIHNlY29uZCkge1xuXHRyZXR1cm4gZG9EaWZmKGZpcnN0LCBzZWNvbmQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqIEBwYXJhbSB0eXBlXG4gKiBAcmV0dXJuIHtTZXQ8c3RyaW5nPnxTZXQ8bnVtYmVyPn1cbiAqL1xuZnVuY3Rpb24gZ2V0S2V5cyhhLCBiLCB0eXBlKSB7XG5cdGlmIChpc0FycmF5KHR5cGUpKSB7XG5cdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRhLmxlbmd0aCA+IGIubGVuZ3RoID8gbmV3IEFycmF5KGEubGVuZ3RoKSA6IG5ldyBBcnJheShiLmxlbmd0aCk7XG5cdFx0a2V5cy5maWxsKDApO1xuXHRcdHJldHVybiBuZXcgU2V0KGtleXMubWFwKChfLCBpKSA9PiBpKSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IFNldChPYmplY3Qua2V5cyhhKS5jb25jYXQoT2JqZWN0LmtleXMoYikpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGRpZmZcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5mdW5jdGlvbiBkb0RpZmYoYSwgYiwgcGF0aCwgZGlmZikge1xuXHRjb25zdCB0eXBlQSA9IHR5cGVPZihhKTtcblx0Y29uc3QgdHlwZUIgPSB0eXBlT2YoYik7XG5cblx0Y29uc3QgY3VyclBhdGggPSBwYXRoIHx8IFtdO1xuXHRjb25zdCBjdXJyRGlmZiA9IGRpZmYgfHwgW107XG5cblx0aWYgKHR5cGVBID09PSB0eXBlQiAmJiAodHlwZUEgPT09IFwib2JqZWN0XCIgfHwgdHlwZUEgPT09IFwiYXJyYXlcIikpIHtcblx0XHRnZXRLZXlzKGEsIGIsIHR5cGVBKS5mb3JFYWNoKCh2KSA9PiB7XG5cdFx0XHRpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCB2KSkge1xuXHRcdFx0XHRjdXJyRGlmZi5wdXNoKGJ1aWxkUmVzdWx0KGFbdl0sIGJbdl0sIFwiYWRkXCIsIGN1cnJQYXRoLmNvbmNhdCh2KSkpO1xuXHRcdFx0fSBlbHNlIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHYpKSB7XG5cdFx0XHRcdGN1cnJEaWZmLnB1c2goYnVpbGRSZXN1bHQoYVt2XSwgYlt2XSwgXCJkZWxldGVcIiwgY3VyclBhdGguY29uY2F0KHYpKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb0RpZmYoYVt2XSwgYlt2XSwgY3VyclBhdGguY29uY2F0KHYpLCBjdXJyRGlmZik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgbyA9IGdldE9wZXJhdG9yKGEsIGIsIHR5cGVBLCB0eXBlQik7XG5cdFx0aWYgKG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y3VyckRpZmYucHVzaChidWlsZFJlc3VsdChhLCBiLCBvLCBwYXRoKSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJEaWZmO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yXG4gKiBAcGFyYW0ge2FycmF5fSBwYXRoXG4gKiBAcmV0dXJuIHt7cGF0aDogYXJyYXksIG9wZXJhdG9yOiBzdHJpbmd9fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYnVpbGRSZXN1bHQoYSwgYiwgb3BlcmF0b3IsIHBhdGgpIHtcblx0Y29uc3QgcmVzdWx0ID0ge1xuXHRcdG9wZXJhdG9yLFxuXHRcdHBhdGgsXG5cdH07XG5cblx0aWYgKG9wZXJhdG9yICE9PSBcImFkZFwiKSB7XG5cdFx0cmVzdWx0LmZpcnN0ID0ge1xuXHRcdFx0dmFsdWU6IGEsXG5cdFx0XHR0eXBlOiB0eXBlb2YgYSxcblx0XHR9O1xuXG5cdFx0aWYgKGlzT2JqZWN0KGEpKSB7XG5cdFx0XHRjb25zdCBuYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpPy5jb25zdHJ1Y3Rvcj8ubmFtZTtcblx0XHRcdGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0LmZpcnN0Lmluc3RhbmNlID0gbmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAob3BlcmF0b3IgPT09IFwiYWRkXCIgfHwgb3BlcmF0b3IgPT09IFwidXBkYXRlXCIpIHtcblx0XHRyZXN1bHQuc2Vjb25kID0ge1xuXHRcdFx0dmFsdWU6IGIsXG5cdFx0XHR0eXBlOiB0eXBlb2YgYixcblx0XHR9O1xuXG5cdFx0aWYgKGlzT2JqZWN0KGIpKSB7XG5cdFx0XHRjb25zdCBuYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpPy5jb25zdHJ1Y3Rvcj8ubmFtZTtcblx0XHRcdGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0LnNlY29uZC5pbnN0YW5jZSA9IG5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTm90RXF1YWwoYSwgYikge1xuXHRpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRyZXR1cm4gYS5nZXRUaW1lKCkgIT09IGIuZ2V0VGltZSgpO1xuXHR9XG5cblx0cmV0dXJuIGEgIT09IGI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRvcihhLCBiKSB7XG5cdC8qKlxuXHQgKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH1cblx0ICovXG5cdGxldCBvcGVyYXRvcjtcblxuXHQvKipcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICovXG5cdGNvbnN0IHR5cGVBID0gdHlwZW9mIGE7XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqL1xuXHRjb25zdCB0eXBlQiA9IHR5cGVvZiBiO1xuXG5cdGlmICh0eXBlQSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlQiAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdG9wZXJhdG9yID0gXCJhZGRcIjtcblx0fSBlbHNlIGlmICh0eXBlQSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlQiA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdG9wZXJhdG9yID0gXCJkZWxldGVcIjtcblx0fSBlbHNlIGlmIChpc05vdEVxdWFsKGEsIGIpKSB7XG5cdFx0b3BlcmF0b3IgPSBcInVwZGF0ZVwiO1xuXHR9XG5cblx0cmV0dXJuIG9wZXJhdG9yO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IElEIH0gZnJvbSBcIi4uL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHsgdHJpbVNwYWNlcyB9O1xuXG4vKipcbiAqIFRoaXMgc3BlY2lhbCB0cmltIGZ1bmN0aW9uIGFsbG93cyB0byB0cmltIHNwYWNlcyB0aGF0IGhhdmUgYmVlbiBwcm90ZWN0ZWQgYnkgYSBzcGVjaWFsIGVzY2FwZSBjaGFyYWN0ZXIuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dHJpbVNwYWNlc30gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdXRpbC90cmltc3BhY2VzLm1qcyc7XG4gKiB0cmltU3BhY2VzKCcgaGVsbG8gXFxcXCAnKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBIaW50OiBPbmUgc3Ryb2tlIGlzIGVzY2FwZWQgYnkgdGhlIGphdmFzY3JpcHQgaW50ZXJwcmV0ZXIsIHRoZSBzZWNvbmQgc3Ryb2tlIGVzY2FwZXMgdGhlIHN0cm9rZS5cbiAqXG4gKiBgYGB0ZXh0XG4gKiBhXFwgYiAgXHUyMUE2IGEgYlxuICogYVxcXFwgYiBcdTIxQTYgYVxcIGJcbiAqIGBgYFxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gdHJpbVNwYWNlcyh2YWx1ZSkge1xuXHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cblx0Y29uc3QgcGxhY2Vob2xkZXIgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvZ2ltO1xuXG5cdC8vIFRoZSBzZXBhcmF0b3IgZm9yIGFyZ3MgbXVzdCBiZSBlc2NhcGVkXG5cdC8vIHVuZGVmaW5lZCBzdHJpbmcgd2hpY2ggc2hvdWxkIG5vdCBvY2N1ciBub3JtYWxseSBhbmQgaXMgYWxzbyBub3QgYSByZWdleFxuXHRjb25zdCByZXN1bHQgPSB2YWx1ZS5tYXRjaEFsbChyZWdleCk7XG5cblx0Zm9yIChjb25zdCBtIG9mIHJlc3VsdCkge1xuXHRcdGNvbnN0IGcgPSBtPy5bXCJncm91cHNcIl07XG5cdFx0aWYgKCFpc09iamVjdChnKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcCA9IGc/LltcInBhdHRlcm5cIl07XG5cdFx0Y29uc3QgYyA9IGc/LltcImNoYXJcIl07XG5cblx0XHRpZiAocCAmJiBjKSB7XG5cdFx0XHRjb25zdCByID0gYF9fJHtuZXcgSUQoKS50b1N0cmluZygpfV9fYDtcblx0XHRcdHBsYWNlaG9sZGVyLnNldChyLCBjKTtcblx0XHRcdHZhbHVlID0gdmFsdWUucmVwbGFjZShwLCByKTtcblx0XHR9XG5cdH1cblxuXHR2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcblx0cGxhY2Vob2xkZXIuZm9yRWFjaCgodiwgaykgPT4ge1xuXHRcdHZhbHVlID0gdmFsdWUucmVwbGFjZShrLCBgXFxcXCR7dn1gKTtcblx0fSk7XG5cblx0cmV0dXJuIHZhbHVlO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBnZXREb2N1bWVudCB9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7IGZpcmVFdmVudCwgZmlyZUN1c3RvbUV2ZW50LCBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCB9O1xuXG4vKipcbiAqIFRoZSBmdW5jdGlvbiBzZW5kcyBhbiBldmVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudCB8IE5vZGUgfCBIVE1MQ29sbGVjdGlvbiB8IE5vZGVMaXN0fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3QgYW5kIHNlbmQgYW5kIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudChlbGVtZW50LCB0eXBlKSB7XG5cdGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuXHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0aWYgKHR5cGUgPT09IFwiY2xpY2tcIikge1xuXHRcdFx0ZWxlbWVudC5jbGljaygpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudC9FdmVudFxuXHRcdGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KHZhbGlkYXRlU3RyaW5nKHR5cGUpLCB7XG5cdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0XHRcdGNvbXBvc2VkOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0ZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG5cdFx0Zm9yIChjb25zdCBlIG9mIGVsZW1lbnQpIHtcblx0XHRcdGZpcmVFdmVudChlLCB0eXBlKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdFwidmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEhUTUxDb2xsZWN0aW9uXCIsXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuRE9NLmZpcmVDdXN0b21FdmVudCgpYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBOb2RlIHwgSFRNTENvbGxlY3Rpb24gfCBOb2RlTGlzdH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI5LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBIVE1MQ29sbGVjdGlvblxuICogQHN1bW1hcnkgQ29uc3RydWN0IGFuZCBzZW5kIGFuZCBldmVudFxuICovXG5mdW5jdGlvbiBmaXJlQ3VzdG9tRXZlbnQoZWxlbWVudCwgdHlwZSwgZGV0YWlsKSB7XG5cdGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAoIWlzT2JqZWN0KGRldGFpbCkpIHtcblx0XHRcdGRldGFpbCA9IHsgZGV0YWlsIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQodmFsaWRhdGVTdHJpbmcodHlwZSksIHtcblx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUsXG5cdFx0XHRkZXRhaWwsXG5cdFx0fSk7XG5cblx0XHRlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcblx0XHRmb3IgKGNvbnN0IGUgb2YgZWxlbWVudCkge1xuXHRcdFx0ZmlyZUN1c3RvbUV2ZW50KGUsIHR5cGUsIGRldGFpbCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRcImVsZW1lbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEhUTUxDb2xsZWN0aW9uXCIsXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgcGF0aCBgRXZlbnQuY29tcG9zZWRQYXRoKClgIGZyb20gYW4gZXZlbnQgYW5kIHRyaWVzIHRvIGZpbmQgdGhlIG5leHQgZWxlbWVudFxuICogdXAgdGhlIHRyZWUgYGVsZW1lbnQuY2xvc2VzdCgpYCB3aXRoIHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlLiBJZiBubyB2YWx1ZSwgb3IgYSB2YWx1ZSB0aGF0IGlzIHVuZGVmaW5lZCBvciBudWxsLFxuICogaXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBhdHRyaWJ1dGUgaXMgc2VhcmNoZWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNC4wXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bGx8dW5kZWZpbmVkfSBhdHRyaWJ1dGVWYWx1ZVxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGV2ZW50XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcbiAqIEBzdW1tYXJ5IEhlbHAgZnVuY3Rpb24gdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChldmVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpIHtcblx0dmFsaWRhdGVJbnN0YW5jZShldmVudCwgRXZlbnQpO1xuXG5cdGlmICh0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBldmVudFwiKTtcblx0fVxuXG5cdGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuXHQvLyBjbG9zZXN0IGNhbm5vdCBiZSB1c2VkIGhlcmUsIGJlY2F1c2UgY2xvc2VzdCBpcyBub3QgY29ycmVjdCBmb3Igc2xvdHRlZCBlbGVtZW50c1xuXHRpZiAoaXNBcnJheShwYXRoKSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgbyA9IHBhdGhbaV07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0byBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmXG5cdFx0XHRcdG8uaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmXG5cdFx0XHRcdChhdHRyaWJ1dGVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0by5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPT09IGF0dHJpYnV0ZVZhbHVlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBvO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCIuLi9kYXRhL2RpZmYubWpzXCI7XG5pbXBvcnQgeyBQYXRoZmluZGVyIH0gZnJvbSBcIi4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcbmltcG9ydCB7IFBpcGUgfSBmcm9tIFwiLi4vZGF0YS9waXBlLm1qc1wiO1xuaW1wb3J0IHtcblx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0QVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUyxcblx0QVRUUklCVVRFX1VQREFURVJfQklORCxcblx0QVRUUklCVVRFX1VQREFURVJfQklORF9UWVBFLFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlQsXG5cdEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UsXG5cdEFUVFJJQlVURV9VUERBVEVSX1JFTU9WRSxcblx0QVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSxcblx0QVRUUklCVVRFX1VQREFURVJfU0VMRUNUX1RISVMsXG59IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcsIGlzSW5zdGFuY2UsIGlzSXRlcmFibGUgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7IFByb3h5T2JzZXJ2ZXIgfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlQXJyYXksIHZhbGlkYXRlSW5zdGFuY2UgfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gXCIuLi91dGlsL2Nsb25lLm1qc1wiO1xuaW1wb3J0IHsgdHJpbVNwYWNlcyB9IGZyb20gXCIuLi91dGlsL3RyaW1zcGFjZXMubWpzXCI7XG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiwgYWRkVG9PYmplY3RMaW5rIH0gZnJvbSBcIi4vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IHVwZGF0ZXJUcmFuc2Zvcm1lck1ldGhvZHNTeW1ib2wgfSBmcm9tIFwiLi9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHsgZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQgfSBmcm9tIFwiLi9ldmVudHMubWpzXCI7XG5pbXBvcnQgeyBmaW5kRG9jdW1lbnRUZW1wbGF0ZSB9IGZyb20gXCIuL3RlbXBsYXRlLm1qc1wiO1xuaW1wb3J0IHsgZ2V0V2luZG93IH0gZnJvbSBcIi4vdXRpbC5tanNcIjtcblxuZXhwb3J0IHsgVXBkYXRlciwgYWRkT2JqZWN0V2l0aFVwZGF0ZXJUb0VsZW1lbnQgfTtcblxuLyoqXG4gKiBUaGUgdXBkYXRlciBjbGFzcyBjb25uZWN0cyBhbiBvYmplY3Qgd2l0aCB0aGUgRE9NLiBJbiB0aGlzIHdheSwgc3RydWN0dXJlcyBhbmQgY29udGVudHMgaW4gdGhlIERPTSBjYW4gYmVcbiAqIHByb2dyYW1tYXRpY2FsbHkgYWRhcHRlZCB2aWEgYXR0cmlidXRlcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdG8gaW5jbHVkZSBhIHN0cmluZyBmcm9tIGFuIG9iamVjdCwgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLXJlcGxhY2VgIGNhbiBiZSB1c2VkLlxuICogYSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGNhbiBiZSBmb3VuZCB1bmRlciBbbW9uc3RlcmpzLm9yZ10oaHR0cHM6Ly9tb25zdGVyanMub3JnLylcbiAqXG4gKiBDaGFuZ2VzIHRvIGF0dHJpYnV0ZXMgYXJlIG1hZGUgb25seSB3aGVuIHRoZSBkaXJlY3QgdmFsdWVzIGFyZSBjaGFuZ2VkLiBJZiB5b3Ugd2FudCB0byBhc3NpZ24gY2hhbmdlc1xuICogdG8gb3RoZXIgdmFsdWVzIGFzIHdlbGwsIHlvdSBoYXZlIHRvIGluc2VydCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItc2VsZWN0LXRoaXNgLiBUaGlzIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIGNhcmUsIGFzIGl0IGNhbiByZWR1Y2UgcGVyZm9ybWFuY2UuXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2xpYnJhcmllcy9kb20vdXBkYXRlci9zaW1wbGUvIFNpbXBsZSBleGFtcGxlXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZVxuICogQHRocm93cyB7RXJyb3J9IHBpcGVzIGFyZSBub3QgYWxsb3dlZCB3aGVuIGNsb25pbmcgYSBub2RlLlxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgcmVjdXJzaW9uIGlzIHJlYWNoZWQuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcbiAqIEBzdW1tYXJ5IFRoZSB1cGRhdGVyIGNsYXNzIGNvbm5lY3RzIGFuIG9iamVjdCB3aXRoIHRoZSBkb21cbiAqL1xuY2xhc3MgVXBkYXRlciBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICogQHNpbmNlIDEuOC4wXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcblx0ICogQHBhcmFtIHtvYmplY3R8UHJveHlPYnNlcnZlcnx1bmRlZmluZWR9IHN1YmplY3Rcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3Rcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcblx0ICogQHNlZSB7QGxpbmsgZmluZERvY3VtZW50VGVtcGxhdGV9XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihlbGVtZW50LCBzdWJqZWN0KSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdC8qKlxuXHRcdCAqIEB0eXBlIHtIVE1MRWxlbWVudH1cblx0XHQgKi9cblx0XHRpZiAoc3ViamVjdCA9PT0gdW5kZWZpbmVkKSBzdWJqZWN0ID0ge307XG5cdFx0aWYgKCFpc0luc3RhbmNlKHN1YmplY3QsIFByb3h5T2JzZXJ2ZXIpKSB7XG5cdFx0XHRzdWJqZWN0ID0gbmV3IFByb3h5T2JzZXJ2ZXIoc3ViamVjdCk7XG5cdFx0fVxuXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG5cdFx0XHRlbGVtZW50OiB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KSxcblx0XHRcdGxhc3Q6IHt9LFxuXHRcdFx0Y2FsbGJhY2tzOiBuZXcgTWFwKCksXG5cdFx0XHRldmVudFR5cGVzOiBbXCJrZXl1cFwiLCBcImNsaWNrXCIsIFwiY2hhbmdlXCIsIFwiZHJvcFwiLCBcInRvdWNoZW5kXCIsIFwiaW5wdXRcIl0sXG5cdFx0XHRzdWJqZWN0OiBzdWJqZWN0LFxuXHRcdH07XG5cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5jYWxsYmFja3Muc2V0KFxuXHRcdFx0XCJjaGVja3N0YXRlXCIsXG5cdFx0XHRnZXRDaGVja1N0YXRlQ2FsbGJhY2suY2FsbCh0aGlzKSxcblx0XHQpO1xuXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5hdHRhY2hPYnNlcnZlcihcblx0XHRcdG5ldyBPYnNlcnZlcigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHMgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCk7XG5cblx0XHRcdFx0Y29uc3QgZGlmZlJlc3VsdCA9IGRpZmYodGhpc1tpbnRlcm5hbFN5bWJvbF0ubGFzdCwgcyk7XG5cdFx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmxhc3QgPSBjbG9uZShzKTtcblxuXHRcdFx0XHRjb25zdCBwcm9taXNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgWywgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhkaWZmUmVzdWx0KSkge1xuXHRcdFx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGdldFdpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlbW92ZUVsZW1lbnQuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0RWxlbWVudC5jYWxsKHRoaXMsIGNoYW5nZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVDb250ZW50LmNhbGwodGhpcywgY2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZUF0dHJpYnV0ZXMuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZhdWx0czogJ2tleXVwJywgJ2NsaWNrJywgJ2NoYW5nZScsICdkcm9wJywgJ3RvdWNoZW5kJ1xuXHQgKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9FdmVudHN9XG5cdCAqIEBzaW5jZSAxLjkuMFxuXHQgKiBAcGFyYW0ge0FycmF5fSB0eXBlc1xuXHQgKiBAcmV0dXJuIHtVcGRhdGVyfVxuXHQgKi9cblx0c2V0RXZlbnRUeXBlcyh0eXBlcykge1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmV2ZW50VHlwZXMgPSB2YWxpZGF0ZUFycmF5KHR5cGVzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgbWV0aG9kLCB0aGUgZXZlbnRsaXN0ZW5lcnMgYXJlIGhvb2tlZCBpbiBhbmQgdGhlIG1hZ2ljIGJlZ2lucy5cblx0ICpcblx0ICogYGBganNcblx0ICogdXBkYXRlci5ydW4oKS50aGVuKCgpID0+IHtcblx0ICogICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXHQgKiB9KTtcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjkuMFxuXHQgKiBAcmV0dXJuIHtVcGRhdGVyfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoXG5cdCAqL1xuXHRlbmFibGVFdmVudFByb2Nlc3NpbmcoKSB7XG5cdFx0dGhpcy5kaXNhYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cblx0XHRmb3IgKGNvbnN0IHR5cGUgb2YgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZXZlbnRUeXBlcykge1xuXHRcdFx0Ly8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lclxuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRnZXRDb250cm9sRXZlbnRIYW5kbGVyLmNhbGwodGhpcyksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdFx0XHRcdHBhc3NpdmU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHR1cm5zIG9mZiB0aGUgbWFnaWMgb3Igd2hvIGxvdmVzIGl0IG1vcmUgcHJvZmFuZSBpdCByZW1vdmVzIHRoZSBldmVudExpc3RlbmVyLlxuXHQgKlxuXHQgKiBAc2luY2UgMS45LjBcblx0ICogQHJldHVybiB7VXBkYXRlcn1cblx0ICovXG5cdGRpc2FibGVFdmVudFByb2Nlc3NpbmcoKSB7XG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmV2ZW50VHlwZXMpIHtcblx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcblx0XHRcdFx0dHlwZSxcblx0XHRcdFx0Z2V0Q29udHJvbEV2ZW50SGFuZGxlci5jYWxsKHRoaXMpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgcnVuIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmb3IgdGhlIHVwZGF0ZSB0byBzdGFydCB3b3JraW5nLlxuXHQgKiBUaGUgbWV0aG9kIGVuc3VyZXMgdGhhdCBjaGFuZ2VzIGFyZSBkZXRlY3RlZC5cblx0ICpcblx0ICogYGBganNcblx0ICogdXBkYXRlci5ydW4oKS50aGVuKCgpID0+IHtcblx0ICogICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXHQgKiB9KTtcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBzdW1tYXJ5IExldCB0aGUgbWFnaWMgYmVnaW5cblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdHJ1bigpIHtcblx0XHQvLyB0aGUga2V5IF9faW5pdF9faGFzIG5vIGZ1cnRoZXIgbWVhbmluZyBhbmQgaXMgb25seVxuXHRcdC8vIHVzZWQgdG8gY3JlYXRlIHRoZSBkaWZmIGZvciBlbXB0eSBvYmplY3RzLlxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmxhc3QgPSB7IF9faW5pdF9fOiB0cnVlIH07XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3Qubm90aWZ5T2JzZXJ2ZXJzKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgdmFsdWVzIG9mIGJvdW5kIGVsZW1lbnRzIGFuZCBjaGFuZ2VzIHRoZW0gaW4gc3ViamVjdFxuXHQgKlxuXHQgKiBAc2luY2UgMS4yNy4wXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlVwZGF0ZXJ9XG5cdCAqL1xuXHRyZXRyaWV2ZSgpIHtcblx0XHRyZXRyaWV2ZUZyb21CaW5kaW5ncy5jYWxsKHRoaXMpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIHlvdSBoYXZlIHBhc3NlZCBhIFByb3h5T2JzZXJ2ZXIgaW4gdGhlIGNvbnN0cnVjdG9yLCB5b3Ugd2lsbCBnZXQgdGhlIG9iamVjdCB0aGF0IHRoZSBQcm94eU9ic2VydmVyIG1hbmFnZXMgaGVyZS5cblx0ICogSG93ZXZlciwgaWYgeW91IHBhc3NlZCBhIHNpbXBsZSBvYmplY3QsIGhlcmUgeW91IHdpbGwgZ2V0IGEgcHJveHkgZm9yIHRoYXQgb2JqZWN0LlxuXHQgKlxuXHQgKiBGb3IgY2hhbmdlcywgdGhlIFByb3h5T2JzZXJ2ZXIgbXVzdCBiZSB1c2VkLlxuXHQgKlxuXHQgKiBAc2luY2UgMS44LjBcblx0ICogQHJldHVybiB7UHJveHl9XG5cdCAqL1xuXHRnZXRTdWJqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFN1YmplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBjb21tYW5kcyB0aGF0IGNhbiBiZSBjYWxsZWQgdmlhIGNhbGw6IGluc3RydWN0aW9uLlxuXHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSBwaXBlIHdpdGggaXRzIG93biBmdW5jdGlvbmFsaXR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuXHQgKiBAcmV0dXJuIHtUcmFuc2Zvcm1lcn1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuXHQgKi9cblx0c2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2spIHtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5jYWxsYmFja3Muc2V0KG5hbWUsIGNhbGxiYWNrKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQHJldHVybiB7ZnVuY3Rpb25cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0Q2hlY2tTdGF0ZUNhbGxiYWNrKCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGN1cnJlbnQpIHtcblx0XHQvLyB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG9iamVjdCAodGhlcmVmb3JlIG5vIGFycmF5IGZ1bmN0aW9uIGhlcmUpXG5cdFx0aWYgKHRoaXMgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0XHRpZiAoW1wicmFkaW9cIiwgXCJjaGVja2JveFwiXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiBgJHt0aGlzLnZhbHVlfWAgPT09IGAke2N1cnJlbnR9YCA/IFwidHJ1ZVwiIDogdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIEhUTUxPcHRpb25FbGVtZW50KSB7XG5cdFx0XHRpZiAoaXNBcnJheShjdXJyZW50KSAmJiBjdXJyZW50LmluZGV4T2YodGhpcy52YWx1ZSkgIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiBcInRydWVcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgc3ltYm9sID0gU3ltYm9sKFwiQHNjaHVrYWkvbW9uc3Rlci91cGRhdGVyQEBFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHRoaXMgVXBkYXRlclxuICogQHRocm93cyB7RXJyb3J9IHRoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aFxuICovXG5mdW5jdGlvbiBnZXRDb250cm9sRXZlbnRIYW5kbGVyKCkge1xuXHRpZiAodGhpc1tzeW1ib2xdKSB7XG5cdFx0cmV0dXJuIHRoaXNbc3ltYm9sXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoLlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHR0aGlzW3N5bWJvbF0gPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBlbGVtZW50ID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoZXZlbnQsIEFUVFJJQlVURV9VUERBVEVSX0JJTkQpO1xuXG5cdFx0aWYgKGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHF1ZXVlTWljcm90YXNrKCgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHJpZXZlQW5kU2V0VmFsdWUuY2FsbCh0aGlzLCBlbGVtZW50KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlIHx8IGAke2V9YCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cblx0cmV0dXJuIHRoaXNbc3ltYm9sXTtcbn1cblxuLyoqXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJldHJpZXZlQW5kU2V0VmFsdWUoZWxlbWVudCkge1xuXHRjb25zdCBwYXRoZmluZGVyID0gbmV3IFBhdGhmaW5kZXIodGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRTdWJqZWN0KCkpO1xuXG5cdGxldCBwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQklORCk7XG5cdGlmIChwYXRoID09PSBudWxsKVxuXHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aFwiKTtcblxuXHRpZiAocGF0aC5pbmRleE9mKFwicGF0aDpcIikgIT09IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgYmluZCBhcmd1bWVudCBtdXN0IHN0YXJ0IGFzIGEgdmFsdWUgd2l0aCBhIHBhdGhcIik7XG5cdH1cblxuXHRwYXRoID0gcGF0aC5zdWJzdHJpbmcoNSk7IC8vIHJlbW92ZSBwYXRoOiBmcm9tIHRoZSBzdHJpbmdcblxuXHRsZXQgdmFsdWU7XG5cblx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0c3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblx0XHRcdGNhc2UgXCJjaGVja2JveFwiOlxuXHRcdFx0XHR2YWx1ZSA9IGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcblx0XHR2YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG5cdH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG5cdFx0c3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblx0XHRcdGNhc2UgXCJzZWxlY3Qtb25lXCI6XG5cdFx0XHRcdHZhbHVlID0gZWxlbWVudC52YWx1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2VsZWN0LW11bHRpcGxlXCI6XG5cdFx0XHRcdHZhbHVlID0gZWxlbWVudC52YWx1ZTtcblxuXHRcdFx0XHRsZXQgb3B0aW9ucyA9IGVsZW1lbnQ/LnNlbGVjdGVkT3B0aW9ucztcblx0XHRcdFx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlIG9wdGlvbjpjaGVja2VkXCIpO1xuXHRcdFx0XHR2YWx1ZSA9IEFycmF5LmZyb20ob3B0aW9ucykubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyB2YWx1ZXMgZnJvbSBjdXN0b20gZWxlbWVudHNcblx0fSBlbHNlIGlmIChcblx0XHQoZWxlbWVudD8uY29uc3RydWN0b3I/LnByb3RvdHlwZSAmJlxuXHRcdFx0ISFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRlbGVtZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZSxcblx0XHRcdFx0XCJ2YWx1ZVwiLFxuXHRcdFx0KT8uW1wiZ2V0XCJdKSB8fFxuXHRcdGVsZW1lbnQuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKVxuXHQpIHtcblx0XHR2YWx1ZSA9IGVsZW1lbnQ/LltcInZhbHVlXCJdO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIG9iamVjdFwiKTtcblx0fVxuXG5cdGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcblx0XHRjb25zdCB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQklORF9UWVBFKTtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdGNhc2UgXCJpbnRcIjpcblx0XHRcdGNhc2UgXCJmbG9hdFwiOlxuXHRcdFx0Y2FzZSBcImludGVnZXJcIjpcblx0XHRcdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdGNhc2UgXCJib29sXCI6XG5cdFx0XHRjYXNlIFwiY2hlY2tib3hcIjpcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlID09PSBcIm9uXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcImFycmF5XCI6XG5cdFx0XHRjYXNlIFwibGlzdFwiOlxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwib2JqZWN0XCI6XG5cdFx0XHRjYXNlIFwianNvblwiOlxuXHRcdFx0XHR2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGNvcHkgPSBjbG9uZSh0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCkpO1xuXG5cdGNvbnN0IHBmID0gbmV3IFBhdGhmaW5kZXIoY29weSk7XG5cdHBmLnNldFZpYShwYXRoLCB2YWx1ZSk7XG5cblx0Y29uc3QgZGlmZlJlc3VsdCA9IGRpZmYoY29weSwgdGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpKTtcblxuXHRpZiAoZGlmZlJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0cGF0aGZpbmRlci5zZXRWaWEocGF0aCwgdmFsdWUpO1xuXHR9XG59XG5cbi8qKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNy4wXG4gKiBAcmV0dXJuIHZvaWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJldHJpZXZlRnJvbUJpbmRpbmdzKCkge1xuXHRpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5tYXRjaGVzKGBbJHtBVFRSSUJVVEVfVVBEQVRFUl9CSU5EfV1gKSkge1xuXHRcdHJldHJpZXZlQW5kU2V0VmFsdWUuY2FsbCh0aGlzLCB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50KTtcblx0fVxuXG5cdGZvciAoY29uc3QgWywgZWxlbWVudF0gb2YgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudFxuXHRcdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtBVFRSSUJVVEVfVVBEQVRFUl9CSU5EfV1gKVxuXHRcdC5lbnRyaWVzKCkpIHtcblx0XHRyZXRyaWV2ZUFuZFNldFZhbHVlLmNhbGwodGhpcywgZWxlbWVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoY2hhbmdlKSB7XG5cdGZvciAoY29uc3QgWywgZWxlbWVudF0gb2YgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudFxuXHRcdC5xdWVyeVNlbGVjdG9yQWxsKGA6c2NvcGUgWyR7QVRUUklCVVRFX1VQREFURVJfUkVNT1ZFfV1gKVxuXHRcdC5lbnRyaWVzKCkpIHtcblx0XHRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZVxuICogQHRocm93cyB7RXJyb3J9IHBpcGVzIGFyZSBub3QgYWxsb3dlZCB3aGVuIGNsb25pbmcgYSBub2RlLlxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgcmVjdXJzaW9uIGlzIHJlYWNoZWQuXG4gKiBAdGhpcyBVcGRhdGVyXG4gKi9cbmZ1bmN0aW9uIGluc2VydEVsZW1lbnQoY2hhbmdlKSB7XG5cdGNvbnN0IHN1YmplY3QgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCk7XG5cblx0Y29uc3QgbWVtID0gbmV3IFdlYWtTZXQoKTtcblx0bGV0IHdkID0gMDtcblxuXHRjb25zdCBjb250YWluZXIgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50O1xuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0bGV0IGZvdW5kID0gZmFsc2U7XG5cdFx0d2QrKztcblxuXHRcdGNvbnN0IHAgPSBjbG9uZShjaGFuZ2U/LltcInBhdGhcIl0pO1xuXHRcdGlmICghaXNBcnJheShwKSkgcmV0dXJuO1xuXG5cdFx0d2hpbGUgKHAubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgY3VycmVudCA9IHAuam9pbihcIi5cIik7XG5cblx0XHRcdGxldCBpdGVyYXRvciA9IG5ldyBTZXQoKTtcblx0XHRcdGNvbnN0IHF1ZXJ5ID0gYFske0FUVFJJQlVURV9VUERBVEVSX0lOU0VSVH0qPVwicGF0aDoke2N1cnJlbnR9XCJdYDtcblxuXHRcdFx0Y29uc3QgZSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcblxuXHRcdFx0aWYgKGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpdGVyYXRvciA9IG5ldyBTZXQoWy4uLmVdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbnRhaW5lci5tYXRjaGVzKHF1ZXJ5KSkge1xuXHRcdFx0XHRpdGVyYXRvci5hZGQoY29udGFpbmVyKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBbLCBjb250YWluZXJFbGVtZW50XSBvZiBpdGVyYXRvci5lbnRyaWVzKCkpIHtcblx0XHRcdFx0aWYgKG1lbS5oYXMoY29udGFpbmVyRWxlbWVudCkpIGNvbnRpbnVlO1xuXHRcdFx0XHRtZW0uYWRkKGNvbnRhaW5lckVsZW1lbnQpO1xuXG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gY29udGFpbmVyRWxlbWVudC5nZXRBdHRyaWJ1dGUoXG5cdFx0XHRcdFx0QVRUUklCVVRFX1VQREFURVJfSU5TRVJULFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlcyA9PT0gbnVsbCkgY29udGludWU7XG5cblx0XHRcdFx0Y29uc3QgZGVmID0gdHJpbVNwYWNlcyhhdHRyaWJ1dGVzKTtcblx0XHRcdFx0Y29uc3QgaSA9IGRlZi5pbmRleE9mKFwiIFwiKTtcblx0XHRcdFx0Y29uc3Qga2V5ID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKDAsIGkpKTtcblx0XHRcdFx0Y29uc3QgcmVmUHJlZml4ID0gYCR7a2V5fS1gO1xuXHRcdFx0XHRjb25zdCBjbWQgPSB0cmltU3BhY2VzKGRlZi5zdWJzdHIoaSkpO1xuXG5cdFx0XHRcdC8vIHRoaXMgY2FzZSBpcyBhY3R1YWxseSBleGNsdWRlZCBieSB0aGUgcXVlcnkgYnV0IGlzIG5ldmVydGhlbGVzcyBjaGVja2VkIGFnYWluIGhlcmVcblx0XHRcdFx0aWYgKGNtZC5pbmRleE9mKFwifFwiKSA+IDApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwaXBlcyBhcmUgbm90IGFsbG93ZWQgd2hlbiBjbG9uaW5nIGEgbm9kZS5cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwaXBlID0gbmV3IFBpcGUoY21kKTtcblx0XHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcblx0XHRcdFx0XHRwaXBlLnNldENhbGxiYWNrKG4sIGYpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29udGFpbmVyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSk7XG5cdFx0XHRcdFx0dmFsdWUgPSBwaXBlLnJ1bihzdWJqZWN0KTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGNvbnRhaW5lckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBkYXRhUGF0aCA9IGNtZC5zcGxpdChcIjpcIikucG9wKCk7XG5cblx0XHRcdFx0bGV0IGluc2VydFBvaW50O1xuXHRcdFx0XHRpZiAoY29udGFpbmVyRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRpbnNlcnRQb2ludCA9IGNvbnRhaW5lckVsZW1lbnQubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSB2YWx1ZSBpcyBub3QgaXRlcmFibGVcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBbaV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVmID0gcmVmUHJlZml4ICsgaTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50UGF0aCA9IGAke2RhdGFQYXRofS4ke2l9YDtcblxuXHRcdFx0XHRcdGF2YWlsYWJsZS5hZGQocmVmKTtcblx0XHRcdFx0XHRjb25zdCByZWZFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0YFske0FUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0V9PVwiJHtyZWZ9XCJdYCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0aW5zZXJ0UG9pbnQgPSByZWZFbGVtZW50O1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXBwZW5kTmV3RG9jdW1lbnRGcmFnbWVudChjb250YWluZXJFbGVtZW50LCBrZXksIHJlZiwgY3VycmVudFBhdGgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgbm9kZXMgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG5cdFx0XHRcdFx0YFske0FUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0V9Kj1cIiR7cmVmUHJlZml4fVwiXWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBbLCBub2RlXSBvZiBPYmplY3QuZW50cmllcyhub2RlcykpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHQhYXZhaWxhYmxlLmhhcyhcblx0XHRcdFx0XHRcdFx0bm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSksXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb250YWluZXJFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRjb250YWluZXJFbGVtZW50LnNldEF0dHJpYnV0ZShcblx0XHRcdFx0XHRcdFx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdFx0XHRcdFx0XHRcdGAke2NvbnRhaW5lckVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpfSwgJHtcblx0XHRcdFx0XHRcdFx0XHRcdGUubWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdH1gLnRyaW0oKSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cC5wb3AoKTtcblx0XHR9XG5cblx0XHRpZiAoZm91bmQgPT09IGZhbHNlKSBicmVhaztcblx0XHRpZiAod2QrKyA+IDIwMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSByZWN1cnNpb24gaXMgcmVhY2hlZC5cIik7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICovXG5mdW5jdGlvbiBhcHBlbmROZXdEb2N1bWVudEZyYWdtZW50KGNvbnRhaW5lciwga2V5LCByZWYsIHBhdGgpIHtcblx0Y29uc3QgdGVtcGxhdGUgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShrZXksIGNvbnRhaW5lcik7XG5cblx0Y29uc3Qgbm9kZXMgPSB0ZW1wbGF0ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdGZvciAoY29uc3QgWywgbm9kZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZXMuY2hpbGROb2RlcykpIHtcblx0XHRpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRhcHBseVJlY3Vyc2l2ZShub2RlLCBrZXksIHBhdGgpO1xuXHRcdFx0bm9kZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSwgcmVmKTtcblx0XHR9XG5cblx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMC4wXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZWN1cnNpdmUobm9kZSwga2V5LCBwYXRoKSB7XG5cdGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAobm9kZS5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSkpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSk7XG5cdFx0XHRub2RlLnNldEF0dHJpYnV0ZShcblx0XHRcdFx0QVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSxcblx0XHRcdFx0dmFsdWUucmVwbGFjZUFsbChgcGF0aDoke2tleX1gLCBgcGF0aDoke3BhdGh9YCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChub2RlLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTKSkge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTKTtcblx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKFxuXHRcdFx0XHRBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTLFxuXHRcdFx0XHR2YWx1ZS5yZXBsYWNlQWxsKGBwYXRoOiR7a2V5fWAsIGBwYXRoOiR7cGF0aH1gKSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBbLCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZS5jaGlsZE5vZGVzKSkge1xuXHRcdFx0YXBwbHlSZWN1cnNpdmUoY2hpbGQsIGtleSwgcGF0aCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAcGFyYW0ge29iamVjdH0gY2hhbmdlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQHRoaXMgVXBkYXRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50KGNoYW5nZSkge1xuXHRjb25zdCBzdWJqZWN0ID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpO1xuXG5cdGNvbnN0IHAgPSBjbG9uZShjaGFuZ2U/LltcInBhdGhcIl0pO1xuXHRydW5VcGRhdGVDb250ZW50LmNhbGwodGhpcywgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudCwgcCwgc3ViamVjdCk7XG5cblx0Y29uc3Qgc2xvdHMgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRpZiAoc2xvdHMubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgWywgc2xvdF0gb2YgT2JqZWN0LmVudHJpZXMoc2xvdHMpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFssIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNsb3QuYXNzaWduZWROb2RlcygpKSkge1xuXHRcdFx0XHRydW5VcGRhdGVDb250ZW50LmNhbGwodGhpcywgZWxlbWVudCwgcCwgc3ViamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAqIEBwYXJhbSB7YXJyYXl9IHBhcnRzXG4gKiBAcGFyYW0ge29iamVjdH0gc3ViamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcnVuVXBkYXRlQ29udGVudChjb250YWluZXIsIHBhcnRzLCBzdWJqZWN0KSB7XG5cdGlmICghaXNBcnJheShwYXJ0cykpIHJldHVybjtcblx0aWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSByZXR1cm47XG5cdHBhcnRzID0gY2xvbmUocGFydHMpO1xuXG5cdGNvbnN0IG1lbSA9IG5ldyBXZWFrU2V0KCk7XG5cblx0d2hpbGUgKHBhcnRzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjdXJyZW50ID0gcGFydHMuam9pbihcIi5cIik7XG5cdFx0cGFydHMucG9wKCk7XG5cblx0XHQvLyBVbmZvcnR1bmF0ZWx5LCBzdGF0aWMgZGF0YSBpcyBhbHdheXMgY2hhbmdlZCBhcyB3ZWxsLCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVhY3QgdG8gY2hhbmdlcyBoZXJlLlxuXHRcdGNvbnN0IHF1ZXJ5ID0gYFske0FUVFJJQlVURV9VUERBVEVSX1JFUExBQ0V9Xj1cInBhdGg6JHtjdXJyZW50fVwiXSwgWyR7QVRUUklCVVRFX1VQREFURVJfUkVQTEFDRX1ePVwic3RhdGljOlwiXSwgWyR7QVRUUklCVVRFX1VQREFURVJfUkVQTEFDRX1ePVwiaTE4bjpcIl1gO1xuXHRcdGNvbnN0IGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChgJHtxdWVyeX1gKTtcblxuXHRcdGNvbnN0IGl0ZXJhdG9yID0gbmV3IFNldChbLi4uZV0pO1xuXG5cdFx0aWYgKGNvbnRhaW5lci5tYXRjaGVzKHF1ZXJ5KSkge1xuXHRcdFx0aXRlcmF0b3IuYWRkKGNvbnRhaW5lcik7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHR5cGUge0hUTUxFbGVtZW50fVxuXHRcdCAqL1xuXHRcdGZvciAoY29uc3QgW2VsZW1lbnRdIG9mIGl0ZXJhdG9yLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKG1lbS5oYXMoZWxlbWVudCkpIHJldHVybjtcblx0XHRcdG1lbS5hZGQoZWxlbWVudCk7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9SRVBMQUNFKTtcblx0XHRcdGNvbnN0IGNtZCA9IHRyaW1TcGFjZXMoYXR0cmlidXRlcyk7XG5cblx0XHRcdGNvbnN0IHBpcGUgPSBuZXcgUGlwZShjbWQpO1xuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcblx0XHRcdFx0cGlwZS5zZXRDYWxsYmFjayhuLCBmKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKTtcblx0XHRcdFx0dmFsdWUgPSBwaXBlLnJ1bihzdWJqZWN0KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdFx0d2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuXHRcdFx0XHRcdGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5hcHBlbmRDaGlsZCh2YWx1ZSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcblx0XHRcdFx0XHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0XHRcdFx0XHRgJHtlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKX0sICR7XG5cdFx0XHRcdFx0XHRcdGUubWVzc2FnZVxuXHRcdFx0XHRcdFx0fWAudHJpbSgpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZVxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhjaGFuZ2UpIHtcblx0Y29uc3Qgc3ViamVjdCA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKTtcblx0Y29uc3QgcCA9IGNsb25lKGNoYW5nZT8uW1wicGF0aFwiXSk7XG5cdHJ1blVwZGF0ZUF0dHJpYnV0ZXMuY2FsbCh0aGlzLCB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LCBwLCBzdWJqZWN0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gKiBAcGFyYW0ge2FycmF5fSBwYXJ0c1xuICogQHBhcmFtIHtvYmplY3R9IHN1YmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhpcyBVcGRhdGVyXG4gKi9cbmZ1bmN0aW9uIHJ1blVwZGF0ZUF0dHJpYnV0ZXMoY29udGFpbmVyLCBwYXJ0cywgc3ViamVjdCkge1xuXHRpZiAoIWlzQXJyYXkocGFydHMpKSByZXR1cm47XG5cdHBhcnRzID0gY2xvbmUocGFydHMpO1xuXG5cdGNvbnN0IG1lbSA9IG5ldyBXZWFrU2V0KCk7XG5cblx0d2hpbGUgKHBhcnRzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjdXJyZW50ID0gcGFydHMuam9pbihcIi5cIik7XG5cdFx0cGFydHMucG9wKCk7XG5cblx0XHRsZXQgaXRlcmF0b3IgPSBuZXcgU2V0KCk7XG5cblx0XHRjb25zdCBxdWVyeSA9IGBbJHtBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJU31dWyR7QVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFU31dLCBbJHtBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTfSo9XCJwYXRoOiR7Y3VycmVudH1cIl0sIFske0FUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVN9Xj1cInN0YXRpYzpcIl0sIFske0FUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVN9Xj1cImkxOG46XCJdYDtcblxuXHRcdGNvbnN0IGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG5cblx0XHRpZiAoZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRpdGVyYXRvciA9IG5ldyBTZXQoWy4uLmVdKTtcblx0XHR9XG5cblx0XHRpZiAoY29udGFpbmVyLm1hdGNoZXMocXVlcnkpKSB7XG5cdFx0XHRpdGVyYXRvci5hZGQoY29udGFpbmVyKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtlbGVtZW50XSBvZiBpdGVyYXRvci5lbnRyaWVzKCkpIHtcblx0XHRcdGlmIChtZW0uaGFzKGVsZW1lbnQpKSByZXR1cm47XG5cdFx0XHRtZW0uYWRkKGVsZW1lbnQpO1xuXG5cdFx0XHQvLyB0aGlzIGNhc2Ugb2NjdXJzIHdoZW4gdGhlIEFUVFJJQlVURV9VUERBVEVSX1NFTEVDVF9USElTIGF0dHJpYnV0ZSBpcyBzZXRcblx0XHRcdGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUykpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTKTtcblxuXHRcdFx0Zm9yIChsZXQgWywgZGVmXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzLnNwbGl0KFwiLFwiKSkpIHtcblx0XHRcdFx0ZGVmID0gdHJpbVNwYWNlcyhkZWYpO1xuXHRcdFx0XHRjb25zdCBpID0gZGVmLmluZGV4T2YoXCIgXCIpO1xuXHRcdFx0XHRjb25zdCBuYW1lID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKDAsIGkpKTtcblx0XHRcdFx0Y29uc3QgY21kID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKGkpKTtcblxuXHRcdFx0XHRjb25zdCBwaXBlID0gbmV3IFBpcGUoY21kKTtcblxuXHRcdFx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5jYWxsYmFja3MuZm9yRWFjaCgoZiwgbikgPT4ge1xuXHRcdFx0XHRcdHBpcGUuc2V0Q2FsbGJhY2sobiwgZiwgZWxlbWVudCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKTtcblx0XHRcdFx0XHR2YWx1ZSA9IHBpcGUucnVuKHN1YmplY3QpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkgIT09IHZhbHVlKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aGFuZGxlSW5wdXRDb250cm9sQXR0cmlidXRlVXBkYXRlLmNhbGwodGhpcywgZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fCp9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuXG5mdW5jdGlvbiBoYW5kbGVJbnB1dENvbnRyb2xBdHRyaWJ1dGVVcGRhdGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcblx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuXHRcdHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG5cdFx0XHRjYXNlIFwic2VsZWN0LW11bHRpcGxlXCI6XG5cdFx0XHRcdGZvciAoY29uc3QgW2luZGV4LCBvcHRdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQub3B0aW9ucykpIHtcblx0XHRcdFx0XHRvcHQuc2VsZWN0ZWQgPSB2YWx1ZS5pbmRleE9mKG9wdC52YWx1ZSkgIT09IC0xO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2VsZWN0LW9uZVwiOlxuXHRcdFx0XHQvLyBPbmx5IG9uZSB2YWx1ZSBtYXkgYmUgc2VsZWN0ZWRcblxuXHRcdFx0XHRmb3IgKGNvbnN0IFtpbmRleCwgb3B0XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50Lm9wdGlvbnMpKSB7XG5cdFx0XHRcdFx0aWYgKG9wdC52YWx1ZSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0XHRcdGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0c3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblx0XHRcdGNhc2UgXCJyYWRpb1wiOlxuXHRcdFx0XHRpZiAobmFtZSA9PT0gXCJjaGVja2VkXCIpIHtcblx0XHRcdFx0XHRlbGVtZW50LmNoZWNrZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJjaGVja2JveFwiOlxuXHRcdFx0XHRpZiAobmFtZSA9PT0gXCJjaGVja2VkXCIpIHtcblx0XHRcdFx0XHRlbGVtZW50LmNoZWNrZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYgKG5hbWUgPT09IFwidmFsdWVcIikge1xuXHRcdFx0XHRcdGVsZW1lbnQudmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG5cdFx0aWYgKG5hbWUgPT09IFwidmFsdWVcIikge1xuXHRcdFx0ZWxlbWVudC52YWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogdmFsdWU7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MRWxlbWVudHxTZXQ8SFRNTEVsZW1lbnQ+fSBlbGVtZW50c1xuICogQHBhcmFtIHtTeW1ib2x9IHN5bWJvbFxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICpcbiAqIENvbmZpZzogZW5hYmxlRXZlbnRQcm9jZXNzaW5nIHtib29sZWFufSAtIGRlZmF1bHQ6IGZhbHNlIC0gZW5hYmxlcyB0aGUgZXZlbnQgcHJvY2Vzc2luZ1xuICpcbiAqIEByZXR1cm4ge1Byb21pc2VbXX1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjMuMFxuICogQHRocm93cyB7VHlwZUVycm9yfSBlbGVtZW50cyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgTm9kZUxpc3QsIEhUTUxFbGVtZW50IG9yIFNldFxuICogQHRocm93cyB7VHlwZUVycm9yfSB0aGUgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHN5bWJvbCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFN5bWJvbFxuICovXG5mdW5jdGlvbiBhZGRPYmplY3RXaXRoVXBkYXRlclRvRWxlbWVudChlbGVtZW50cywgc3ltYm9sLCBvYmplY3QsIGNvbmZpZyA9IHt9KSB7XG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0XCJ0aGUgY29udGV4dCBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcIixcblx0XHQpO1xuXHR9XG5cblx0aWYgKCEodHlwZW9mIHN5bWJvbCA9PT0gXCJzeW1ib2xcIikpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwic3ltYm9sIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgU3ltYm9sXCIpO1xuXHR9XG5cblx0Y29uc3QgdXBkYXRlcnMgPSBuZXcgU2V0KCk7XG5cblx0aWYgKGVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcblx0XHRlbGVtZW50cyA9IG5ldyBTZXQoWy4uLmVsZW1lbnRzXSk7XG5cdH0gZWxzZSBpZiAoZWxlbWVudHMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdGVsZW1lbnRzID0gbmV3IFNldChbZWxlbWVudHNdKTtcblx0fSBlbHNlIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIFNldCkge1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRgZWxlbWVudHMgaXMgbm90IGEgdmFsaWQgdHlwZS4gKGFjdHVhbDogJHt0eXBlb2YgZWxlbWVudHN9KWAsXG5cdFx0KTtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXG5cdGNvbnN0IHVwZGF0ZXJDYWxsYmFja3MgPSBbXTtcblx0Y29uc3QgY2IgPSB0aGlzPy5bdXBkYXRlclRyYW5zZm9ybWVyTWV0aG9kc1N5bWJvbF07XG5cdGlmICh0aGlzIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRjb25zdCBjYWxsYmFja3MgPSBjYi5jYWxsKHRoaXMpO1xuXHRcdGlmICh0eXBlb2YgY2FsbGJhY2tzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjYWxsYmFja10gb2YgT2JqZWN0LmVudHJpZXMoY2FsbGJhY2tzKSkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR1cGRhdGVyQ2FsbGJhY2tzLnB1c2goW25hbWUsIGNhbGxiYWNrXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRcdFx0XHRcdGBvblVwZGF0ZXJQaXBlQ2FsbGJhY2tzOiAke25hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdFx0XHRgb25VcGRhdGVyUGlwZUNhbGxiYWNrcyBkbyBub3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGZ1bmN0aW9uc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcblx0XHRpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSByZXR1cm47XG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSByZXR1cm47XG5cblx0XHRjb25zdCB1ID0gbmV3IFVwZGF0ZXIoZWxlbWVudCwgb2JqZWN0KTtcblx0XHR1cGRhdGVycy5hZGQodSk7XG5cblx0XHRpZiAodXBkYXRlckNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjYWxsYmFja10gb2YgdXBkYXRlckNhbGxiYWNrcykge1xuXHRcdFx0XHR1LnNldENhbGxiYWNrKG5hbWUsIGNhbGxiYWNrKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXN1bHQucHVzaChcblx0XHRcdHUucnVuKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChjb25maWcuZXZlbnRQcm9jZXNzaW5nID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0dS5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB1O1xuXHRcdFx0fSksXG5cdFx0KTtcblx0fSk7XG5cblx0aWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG5cdFx0YWRkVG9PYmplY3RMaW5rKHRoaXMsIHN5bWJvbCwgdXBkYXRlcnMpO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBnZXRTbG90dGVkRWxlbWVudHMsIGdldFNsb3R0ZWROb2RlcyB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3x1bmRlZmluZWR9IHF1ZXJ5XG4gKiBAcGFyYW0ge1N0cmluZ3x1bmRlZmluZWR8bnVsbH0gbmFtZSBuYW1lIG9mIHRoZSBzbG90IChpZiB0aGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYWxsIHNsb3RzIGFyZSBzZWFyY2hlZCwgaWYgdGhlIHBhcmFtZXRlciBoYXMgdGhlIHZhbHVlIG51bGwsIGFsbCBzbG90cyB3aXRob3V0IGEgbmFtZSBhcmUgc2VhcmNoZWQuIGlmIGEgc3RyaW5nIGlzIHNwZWNpZmllZCwgdGhlIHNsb3RzIHdpdGggdGhpcyBuYW1lIGFyZSBzZWFyY2hlZC4pXG4gKiBAcmV0dXJuIHsqfVxuICogQHRoaXMgQ3VzdG9tRWxlbWVudFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy4zMy4wXG4gKiBAdGhyb3dzIHtFcnJvcn0gcXVlcnkgbXVzdCBiZSBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTbG90dGVkTm9kZXMocXVlcnksIG5hbWUpIHtcblx0Y29uc3QgcmVzdWx0ID0gbmV3IFNldCgpO1xuXG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGxldCBzZWxlY3RvciA9IFwic2xvdFwiO1xuXHRpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKG5hbWUgPT09IG51bGwpIHtcblx0XHRcdHNlbGVjdG9yICs9IFwiOm5vdChbbmFtZV0pXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdG9yICs9IGBbbmFtZT0ke3ZhbGlkYXRlU3RyaW5nKG5hbWUpfV1gO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNsb3RzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuXG5cdGZvciAoY29uc3QgWywgc2xvdF0gb2YgT2JqZWN0LmVudHJpZXMoc2xvdHMpKSB7XG5cdFx0c2xvdC5hc3NpZ25lZE5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzU3RyaW5nKHF1ZXJ5KSkge1xuXHRcdFx0XHRub2RlLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcblx0XHRcdFx0XHRyZXN1bHQuYWRkKG4pO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAobm9kZS5tYXRjaGVzKHF1ZXJ5KSkge1xuXHRcdFx0XHRcdHJlc3VsdC5hZGQobm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJxdWVyeSBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0LmFkZChub2RlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZH0gcXVlcnlcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZHxudWxsfSBuYW1lIG5hbWUgb2YgdGhlIHNsb3QgKGlmIHRoZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCBhbGwgc2xvdHMgYXJlIHNlYXJjaGVkLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyB0aGUgdmFsdWUgbnVsbCwgYWxsIHNsb3RzIHdpdGhvdXQgYSBuYW1lIGFyZSBzZWFyY2hlZC4gaWYgYSBzdHJpbmcgaXMgc3BlY2lmaWVkLCB0aGUgc2xvdHMgd2l0aCB0aGlzIG5hbWUgYXJlIHNlYXJjaGVkLilcbiAqIEByZXR1cm4geyp9XG4gKiBAdGhpcyBDdXN0b21FbGVtZW50XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIzLjBcbiAqIEB0aHJvd3Mge0Vycm9yfSBxdWVyeSBtdXN0IGJlIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldFNsb3R0ZWRFbGVtZW50cyhxdWVyeSwgbmFtZSkge1xuXHRjb25zdCByZXN1bHQgPSBuZXcgU2V0KCk7XG5cblx0aWYgKCEodGhpcy5zaGFkb3dSb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkpIHtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bGV0IHNlbGVjdG9yID0gXCJzbG90XCI7XG5cdGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAobmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0c2VsZWN0b3IgKz0gXCI6bm90KFtuYW1lXSlcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZWN0b3IgKz0gYFtuYW1lPSR7dmFsaWRhdGVTdHJpbmcobmFtZSl9XWA7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc2xvdHMgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cblx0Zm9yIChjb25zdCBbLCBzbG90XSBvZiBPYmplY3QuZW50cmllcyhzbG90cykpIHtcblx0XHRzbG90LmFzc2lnbmVkRWxlbWVudHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJlxuXHRcdFx0XHQhKG5vZGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuXHRcdFx0XHQhKG5vZGUgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KVxuXHRcdFx0KVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGlmIChpc1N0cmluZyhxdWVyeSkpIHtcblx0XHRcdFx0aWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRub2RlLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcblx0XHRcdFx0XHRcdHJlc3VsdC5hZGQobik7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAobm9kZS5tYXRjaGVzKHF1ZXJ5KSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0LmFkZChub2RlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzdWx0LmFkZChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInF1ZXJ5IG11c3QgYmUgYSBzdHJpbmcgYW5kIG5vdCBlbXB0eVwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5hZGQobm9kZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmV4cG9ydCB7IGV4dHJhY3RLZXlzIH07XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGtleXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgbWFwIHdpdGggdGhlIGtleXMgYW5kIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHBhcmFtIHtzdHJpbmd9IGtleVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVNlcGFyYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlU2VwYXJhdG9yXG4gKiBAcmV0dXJuIHtNYXA8YW55LCBhbnk+fVxuICovXG5mdW5jdGlvbiBleHRyYWN0S2V5cyhcblx0b2JqLFxuXHRrZXlQcmVmaXggPSBcIlwiLFxuXHRrZXlTZXBhcmF0b3IgPSBcIi1cIixcblx0dmFsdWVTZXBhcmF0b3IgPSBcIi5cIixcbikge1xuXHRjb25zdCByZXN1bHRNYXAgPSBuZXcgTWFwKCk7XG5cblx0ZnVuY3Rpb24gaGVscGVyKGN1cnJlbnRPYmosIGN1cnJlbnRLZXlQcmVmaXgsIGN1cnJlbnRWYWx1ZVByZWZpeCkge1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnRPYmopIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y3VycmVudE9ialtrZXldICE9PSBudWxsICYmXG5cdFx0XHRcdHR5cGVvZiBjdXJyZW50T2JqW2tleV0gPT09IFwib2JqZWN0XCIgJiZcblx0XHRcdFx0IUFycmF5LmlzQXJyYXkoY3VycmVudE9ialtrZXldKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG5ld0tleVByZWZpeCA9IGN1cnJlbnRLZXlQcmVmaXhcblx0XHRcdFx0XHQ/IGN1cnJlbnRLZXlQcmVmaXggKyBrZXlTZXBhcmF0b3IgKyBrZXkudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdDoga2V5LnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGNvbnN0IG5ld1ZhbHVlUHJlZml4ID0gY3VycmVudFZhbHVlUHJlZml4XG5cdFx0XHRcdFx0PyBjdXJyZW50VmFsdWVQcmVmaXggKyB2YWx1ZVNlcGFyYXRvciArIGtleVxuXHRcdFx0XHRcdDoga2V5O1xuXHRcdFx0XHRoZWxwZXIoY3VycmVudE9ialtrZXldLCBuZXdLZXlQcmVmaXgsIG5ld1ZhbHVlUHJlZml4KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZpbmFsS2V5ID0gY3VycmVudEtleVByZWZpeFxuXHRcdFx0XHRcdD8gY3VycmVudEtleVByZWZpeCArIGtleVNlcGFyYXRvciArIGtleS50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdFx0OiBrZXkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0Y29uc3QgZmluYWxWYWx1ZSA9IGN1cnJlbnRWYWx1ZVByZWZpeFxuXHRcdFx0XHRcdD8gY3VycmVudFZhbHVlUHJlZml4ICsgdmFsdWVTZXBhcmF0b3IgKyBrZXlcblx0XHRcdFx0XHQ6IGtleTtcblx0XHRcdFx0cmVzdWx0TWFwLnNldChmaW5hbEtleSwgZmluYWxWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aGVscGVyKG9iaiwga2V5UHJlZml4LCBrZXlQcmVmaXgpO1xuXHRyZXR1cm4gcmVzdWx0TWFwO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IFBhdGhmaW5kZXIgfSBmcm9tIFwiLi4vLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtcblx0aXNCb29sZWFuLFxuXHRpc1N0cmluZyxcblx0aXNPYmplY3QsXG5cdGlzQXJyYXksXG5cdGlzRnVuY3Rpb24sXG5cdGlzSW50ZWdlcixcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEtleXMgfSBmcm9tIFwiLi9leHRyYWN0LWtleXMubWpzXCI7XG5cbmV4cG9ydCB7IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMgfTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gb3B0aW9ucyBvYmplY3QgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQuXG4gKiBUaGUgZnVuY3Rpb24gbG9va3MgZm9yIGF0dHJpYnV0ZXMgd2l0aCB0aGUgcHJlZml4ICdkYXRhLW1vbnN0ZXItb3B0aW9uLScsIGFuZCBtYXBzIHRoZW0gdG9cbiAqIHByb3BlcnRpZXMgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LiBJdCByZXBsYWNlcyB0aGUgZGFzaGVzIHdpdGggZG90cyB0byBmb3JtIHRoZSBwcm9wZXJ0eSBwYXRoLlxuICogRm9yIGV4YW1wbGUsIHRoZSBhdHRyaWJ1dGUgJ2RhdGEtbW9uc3Rlci1vcHRpb24tdXJsJyBtYXBzIHRvIHRoZSAndXJsJyBwcm9wZXJ0eSBpbiB0aGUgb3B0aW9ucyBvYmplY3QuXG4gKlxuICogV2l0aCB0aGUgbWFwcGluZyBwYXJhbWV0ZXIsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgY2FuIGJlIG1hcHBlZCB0byBhIGRpZmZlcmVudCB2YWx1ZS5cbiAqIEZvciBleGFtcGxlLCB0aGUgYXR0cmlidXRlICdkYXRhLW1vbnN0ZXItb3B0aW9uLWZvbycgbWFwcyB0byB0aGUgJ2JhcicgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIFRoZSBtYXBwaW5nIG9iamVjdCB3b3VsZCBsb29rIGxpa2UgdGhpczpcbiAqXG4gKiB7XG4gKiAgICAnZm9vJzogKHZhbHVlKSA9PiB2YWx1ZSArICdiYXInXG4gKiAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAnZGF0YS1tb25zdGVyLW9wdGlvbi1mb28nIGlzIGFwcGVuZGVkIHdpdGggJ2JhcidcbiAqICAgIC8vIGFuZCBhc3NpZ25lZCB0byB0aGUgJ2JhcicgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICogICAgLy8gZS5nLiA8ZGl2IGRhdGEtbW9uc3Rlci1vcHRpb24tZm9vPVwiZm9vXCI+PC9kaXY+XG4gKiAgICAnYmFyLmJheic6ICh2YWx1ZSkgPT4gdmFsdWUgKyAnYmFyJ1xuICogICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJ2RhdGEtbW9uc3Rlci1vcHRpb24tYmFyLWJheicgaXMgYXBwZW5kZWQgd2l0aCAnYmFyJ1xuICogICAgLy8gYW5kIGFzc2lnbmVkIHRvIHRoZSAnYmFyLmJheicgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICogICAgLy8gZS5nLiA8ZGl2IGRhdGEtbW9uc3Rlci1vcHRpb24tYmFyLWJhej1cImZvb1wiPjwvZGl2PlxuICogfVxuICpcbiAqIEFycmF5IHZhbHVlcyBoYXZlIHRvIGJlIHNlcGFyYXRlZCBieSAnOjonLlxuICpcbiAqIEBzaW5jZSAzLjM4LjBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRoZSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwcGluZyAtIEEgbWFwcGluZyBiZXR3ZWVuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgYW5kIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggLSBUaGUgcHJlZml4IG9mIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gVGhlIGluaXRpYWxpemVkIG9wdGlvbnMgb2JqZWN0LlxuICogQHRoaXMgSFRNTEVsZW1lbnQgLSBUaGUgY29udGV4dCBvZiB0aGUgRE9NIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoXG5cdGVsZW1lbnQsXG5cdG9wdGlvbnMsXG5cdG1hcHBpbmcgPSB7fSxcblx0cHJlZml4ID0gXCJkYXRhLW1vbnN0ZXItb3B0aW9uLVwiLFxuKSB7XG5cdGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBvcHRpb25zO1xuXHRpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlcygpKSByZXR1cm4gb3B0aW9ucztcblxuXHRjb25zdCBrZXlNYXAgPSBleHRyYWN0S2V5cyhvcHRpb25zKTtcblx0Y29uc3QgZmluZGVyID0gbmV3IFBhdGhmaW5kZXIob3B0aW9ucyk7XG5cblx0ZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRpZiAoIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm47XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSB2YWxpZCBvcHRpb24uXG5cdFx0Ly8gdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgYXR0cmlidXRlIGlzIHNpbXBsZS4gVGhlIGRhc2ggaXMgcmVwbGFjZWQgYnkgYSBkb3QuXG5cdFx0Ly8gZS5nLiBkYXRhLW1vbnN0ZXItdXJsID0+IHVybFxuXHRcdGNvbnN0IG9wdGlvbk5hbWUgPSBrZXlNYXAuZ2V0KG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkpO1xuXHRcdGlmICghZmluZGVyLmV4aXN0cyhvcHRpb25OYW1lKSkgcmV0dXJuO1xuXG5cdFx0aWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG5cdFx0XHRsZXQgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTtcblx0XHRcdGlmIChcblx0XHRcdFx0bWFwcGluZy5oYXNPd25Qcm9wZXJ0eShvcHRpb25OYW1lKSAmJlxuXHRcdFx0XHRpc0Z1bmN0aW9uKG1hcHBpbmdbb3B0aW9uTmFtZV0pXG5cdFx0XHQpIHtcblx0XHRcdFx0dmFsdWUgPSBtYXBwaW5nW29wdGlvbk5hbWVdKHZhbHVlKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9wdGlvblZhbHVlID0gZmluZGVyLmdldFZpYShvcHRpb25OYW1lKTtcblx0XHRcdGlmIChvcHRpb25WYWx1ZSA9PT0gbnVsbCB8fCBvcHRpb25WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG9wdGlvblZhbHVlID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vY29uc3QgdHlwZU9mT3B0aW9uVmFsdWUgPSB0eXBlb2Ygb3B0aW9uVmFsdWU7XG5cdFx0XHRpZiAob3B0aW9uVmFsdWUgPT09IG51bGwgfHwgb3B0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR2YWx1ZSA9IG51bGw7XG5cdFx0XHR9IGVsc2UgaWYgKGlzQm9vbGVhbihvcHRpb25WYWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGlzSW50ZWdlcihvcHRpb25WYWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmIChpc1N0cmluZyhvcHRpb25WYWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmIChpc09iamVjdChvcHRpb25WYWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcblx0XHRcdH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25WYWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zcGxpdChcIjo6XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWUgPSBvcHRpb25WYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0ZmluZGVyLnNldFZpYShvcHRpb25OYW1lLCB2YWx1ZSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gb3B0aW9ucztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBQYXRoZmluZGVyIH0gZnJvbSBcIi4uLy4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCB9IGZyb20gXCIuLi9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEtleXMgfSBmcm9tIFwiLi9leHRyYWN0LWtleXMubWpzXCI7XG5cbmV4cG9ydCB7IHNldE9wdGlvbkZyb21BdHRyaWJ1dGUgfTtcblxuLyoqXG4gKiBTZXQgdGhlIGdpdmVuIG9wdGlvbnMgb2JqZWN0IGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjdXJyZW50IERPTSBlbGVtZW50LlxuICogVGhlIGZ1bmN0aW9uIGxvb2tzIGZvciBhdHRyaWJ1dGVzIHdpdGggdGhlIHByZWZpeCAnZGF0YS1tb25zdGVyLW9wdGlvbi0nLCBhbmQgbWFwcyB0aGVtIHRvXG4gKiBwcm9wZXJ0aWVzIGluIHRoZSBvcHRpb25zIG9iamVjdC4gSXQgcmVwbGFjZXMgdGhlIGRhc2hlcyB3aXRoIGRvdHMgdG8gZm9ybSB0aGUgcHJvcGVydHkgcGF0aC5cbiAqIEZvciBleGFtcGxlLCB0aGUgYXR0cmlidXRlICdkYXRhLW1vbnN0ZXItb3B0aW9uLXVybCcgbWFwcyB0byB0aGUgJ3VybCcgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIFdpdGggdGhlIG1hcHBpbmcgcGFyYW1ldGVyLCB0aGUgYXR0cmlidXRlIHZhbHVlIGNhbiBiZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgdmFsdWUuXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGF0dHJpYnV0ZSAnZGF0YS1tb25zdGVyLW9wdGlvbi1mb28nIG1hcHMgdG8gdGhlICdiYXInIHByb3BlcnR5IGluIHRoZSBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBUaGUgbWFwcGluZyBvYmplY3Qgd291bGQgbG9vayBsaWtlIHRoaXM6XG4gKiB7XG4gKiAgICAnZm9vJzogKHZhbHVlKSA9PiB2YWx1ZSArICdiYXInXG4gKiAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAnZGF0YS1tb25zdGVyLW9wdGlvbi1mb28nIGlzIGFwcGVuZGVkIHdpdGggJ2JhcidcbiAqICAgIC8vIGFuZCBhc3NpZ25lZCB0byB0aGUgJ2JhcicgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICogICAgLy8gZS5nLiA8ZGl2IGRhdGEtbW9uc3Rlci1vcHRpb24tZm9vPVwiZm9vXCI+PC9kaXY+XG4gKiAgICAnYmFyLmJheic6ICh2YWx1ZSkgPT4gdmFsdWUgKyAnYmFyJ1xuICogICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJ2RhdGEtbW9uc3Rlci1vcHRpb24tYmFyLWJheicgaXMgYXBwZW5kZWQgd2l0aCAnYmFyJ1xuICogICAgLy8gYW5kIGFzc2lnbmVkIHRvIHRoZSAnYmFyLmJheicgcHJvcGVydHkgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxuICogICAgLy8gZS5nLiA8ZGl2IGRhdGEtbW9uc3Rlci1vcHRpb24tYmFyLWJhej1cImZvb1wiPjwvZGl2PlxuICogfVxuICpcbiAqIEBzaW5jZSAzLjQ1LjBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRoZSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtPYmplY3R9IG5hbWUgLSBUaGUgYXR0cmlidXRlIG9iamVjdCB0byBiZSB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCB0byBiZSBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBwaW5nIC0gQSBtYXBwaW5nIGJldHdlZW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgdGhlIHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCAtIFRoZSBwcmVmaXggb2YgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBUaGUgaW5pdGlhbGl6ZWQgb3B0aW9ucyBvYmplY3QuXG4gKiBAdGhpcyBIVE1MRWxlbWVudCAtIFRoZSBjb250ZXh0IG9mIHRoZSBET00gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gc2V0T3B0aW9uRnJvbUF0dHJpYnV0ZShcblx0ZWxlbWVudCxcblx0bmFtZSxcblx0b3B0aW9ucyxcblx0bWFwcGluZyA9IHt9LFxuXHRwcmVmaXggPSBcImRhdGEtbW9uc3Rlci1vcHRpb24tXCIsXG4pIHtcblx0aWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIG9wdGlvbnM7XG5cdGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHJldHVybiBvcHRpb25zO1xuXG5cdGNvbnN0IGtleU1hcCA9IGV4dHJhY3RLZXlzKG9wdGlvbnMpO1xuXHRjb25zdCBmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihvcHRpb25zKTtcblxuXHQvLyBjaGVjayBpZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSB2YWxpZCBvcHRpb24uXG5cdC8vIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIGF0dHJpYnV0ZSBpcyBzaW1wbGUuIFRoZSBkYXNoIGlzIHJlcGxhY2VkIGJ5IGEgZG90LlxuXHQvLyBlLmcuIGRhdGEtbW9uc3Rlci11cmwgPT4gdXJsXG5cdGNvbnN0IG9wdGlvbk5hbWUgPSBrZXlNYXAuZ2V0KG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkpO1xuXHRpZiAoIWZpbmRlci5leGlzdHMob3B0aW9uTmFtZSkpIHJldHVybjtcblxuXHRpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnM7XG5cdH1cblxuXHRsZXQgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTtcblx0aWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkob3B0aW9uTmFtZSkgJiYgaXNGdW5jdGlvbihtYXBwaW5nW29wdGlvbk5hbWVdKSkge1xuXHRcdHZhbHVlID0gbWFwcGluZ1tvcHRpb25OYW1lXSh2YWx1ZSk7XG5cdH1cblxuXHRjb25zdCB0eXBlT2ZPcHRpb25WYWx1ZSA9IHR5cGVvZiBmaW5kZXIuZ2V0VmlhKG9wdGlvbk5hbWUpO1xuXHRpZiAodHlwZU9mT3B0aW9uVmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0dmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdH0gZWxzZSBpZiAodHlwZU9mT3B0aW9uVmFsdWUgPT09IFwibnVtYmVyXCIpIHtcblx0XHR2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG5cdH0gZWxzZSBpZiAodHlwZU9mT3B0aW9uVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG5cdH0gZWxzZSBpZiAodHlwZU9mT3B0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHR2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuXHR9XG5cblx0ZmluZGVyLnNldFZpYShvcHRpb25OYW1lLCB2YWx1ZSk7XG5cblx0cmV0dXJuIG9wdGlvbnM7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfRVJST1JNRVNTQUdFfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5cblxuZXhwb3J0IHthZGRFcnJvckF0dHJpYnV0ZSwgcmVtb3ZlRXJyb3JBdHRyaWJ1dGV9O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGFkZCBhbiBlcnJvciBtZXNzYWdlIHRvIGFuIGVsZW1lbnQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy45OS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBhZGRFcnJvckF0dHJpYnV0ZShlbGVtZW50LCBtZXNzYWdlKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG5cbiAgICBpZihtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZih0eXBlb2YgbWVzc2FnZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZih0eXBlb2YgbWVzc2FnZSA9PT0gXCJvYmplY3RcIiAmJiBtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZih0eXBlb2YgbWVzc2FnZS50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IFN0cmluZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlU3RyaW5nKG1lc3NhZ2UpO1xuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpO1xuICAgIGNvbnN0IGxpc3QgPSBjdXJyZW50LnNwbGl0KFwiOjpcIik7XG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZihsaXN0W2ldID09PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpc3QucHVzaChtZXNzYWdlKTtcblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFxuICAgICAgICBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuICAgICAgICBsaXN0LmpvaW4oXCI6OlwiKVxuICAgICk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZW1vdmUgYW4gZXJyb3IgbWVzc2FnZSBmcm9tIGFuIGVsZW1lbnQuXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjk5LjBcbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiByZW1vdmVFcnJvckF0dHJpYnV0ZShlbGVtZW50LCBtZXNzYWdlKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcobWVzc2FnZSk7XG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKTtcbiAgICBjb25zdCBsaXN0ID0gY3VycmVudC5zcGxpdChcIjo6XCIpO1xuICAgIGNvbnN0IG5ld0xpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuICE9PSBtZXNzYWdlO1xuICAgIH0pO1xuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG4gICAgICAgIG5ld0xpc3Quam9pbihcIjo6XCIpXG4gICAgKTtcblxuICAgIHJldHVybiBlbGVtZW50O1xufSIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge2ZpbmRFbGVtZW50V2l0aElkVXB3YXJkcywgZ2V0RG9jdW1lbnQsIGdldFdpbmRvd30gZnJvbSBcIi4vdXRpbC5tanNcIjtcbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcblxuaW1wb3J0IHtwYXJzZURhdGFVUkx9IGZyb20gXCIuLi90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge1xuICAgIGlzQXJyYXksXG4gICAgaXNGdW5jdGlvbixcbiAgICBpc0l0ZXJhYmxlLFxuICAgIGlzT2JqZWN0LFxuICAgIGlzU3RyaW5nLFxufSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge09ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uLFxuICAgIHZhbGlkYXRlSW5zdGFuY2UsXG4gICAgdmFsaWRhdGVPYmplY3QsXG59IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7Y2xvbmV9IGZyb20gXCIuLi91dGlsL2Nsb25lLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBnZXRMaW5rZWRPYmplY3RzLFxuICAgIGhhc09iamVjdExpbmssXG59IGZyb20gXCIuL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge1xuICAgIEFUVFJJQlVURV9ESVNBQkxFRCxcbiAgICBBVFRSSUJVVEVfT1BUSU9OUyxcbiAgICBBVFRSSUJVVEVfSU5JVF9DQUxMQkFDSyxcbiAgICBBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUixcbiAgICBBVFRSSUJVVEVfU0NSSVBUX0hPU1QsXG4gICAgY3VzdG9tRWxlbWVudFVwZGF0ZXJMaW5rU3ltYm9sLFxuICAgIGluaXRDb250cm9sQ2FsbGJhY2tOYW1lLFxufSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2ZpbmREb2N1bWVudFRlbXBsYXRlLCBUZW1wbGF0ZX0gZnJvbSBcIi4vdGVtcGxhdGUubWpzXCI7XG5pbXBvcnQge2FkZE9iamVjdFdpdGhVcGRhdGVyVG9FbGVtZW50fSBmcm9tIFwiLi91cGRhdGVyLm1qc1wiO1xuaW1wb3J0IHtpbnN0YW5jZVN5bWJvbH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7Z2V0RG9jdW1lbnRUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi9pMThuL3RyYW5zbGF0aW9ucy5tanNcIjtcbmltcG9ydCB7Z2V0U2xvdHRlZEVsZW1lbnRzfSBmcm9tIFwiLi9zbG90dGVkLm1qc1wiO1xuaW1wb3J0IHtpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzfSBmcm9tIFwiLi91dGlsL2luaXQtb3B0aW9ucy1mcm9tLWF0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge3NldE9wdGlvbkZyb21BdHRyaWJ1dGV9IGZyb20gXCIuL3V0aWwvc2V0LW9wdGlvbi1mcm9tLWF0dHJpYnV0ZS5tanNcIjtcbmltcG9ydCB7YWRkRXJyb3JBdHRyaWJ1dGV9IGZyb20gXCIuL2Vycm9yLm1qc1wiO1xuXG5leHBvcnQge1xuICAgIEN1c3RvbUVsZW1lbnQsXG4gICAgaW5pdE1ldGhvZFN5bWJvbCxcbiAgICBhc3NlbWJsZU1ldGhvZFN5bWJvbCxcbiAgICBhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCxcbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQsXG4gICAgZ2V0U2xvdHRlZEVsZW1lbnRzLFxuICAgIHVwZGF0ZXJUcmFuc2Zvcm1lck1ldGhvZHNTeW1ib2wsXG59O1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGluaXRNZXRob2RTeW1ib2wgPSBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vQEBpbml0TWV0aG9kU3ltYm9sXCIpO1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGFzc2VtYmxlTWV0aG9kU3ltYm9sID0gU3ltYm9sLmZvcihcbiAgICBcIkBzY2h1a2FpL21vbnN0ZXIvZG9tL0BAYXNzZW1ibGVNZXRob2RTeW1ib2xcIixcbik7XG5cbi8qKlxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdXBkYXRlclRyYW5zZm9ybWVyTWV0aG9kc1N5bWJvbCA9IFN5bWJvbC5mb3IoXG4gICAgXCJAc2NodWthaS9tb25zdGVyL2RvbS9AQHVwZGF0ZXJUcmFuc2Zvcm1lck1ldGhvZHNTeW1ib2xcIixcbik7XG5cbi8qKlxuICogdGhpcyBzeW1ib2wgaG9sZHMgdGhlIGF0dHJpYnV0ZSBvYnNlcnZlciBjYWxsYmFja3MuIFRoZSBrZXkgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2wgPSBTeW1ib2wuZm9yKFxuICAgIFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vQEBhdHRyaWJ1dGVPYnNlcnZlclwiLFxuKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYXR0cmlidXRlTXV0YXRpb25PYnNlcnZlclN5bWJvbCA9IFN5bWJvbChcbiAgICBcIkBzY2h1a2FpL21vbnN0ZXIvZG9tL0BAbXV0YXRpb25PYnNlcnZlclwiLFxuKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdXBkYXRlQ2xvbmVEYXRhU3ltYm9sID0gU3ltYm9sKFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vQEB1cGRhdGVDbG9uZURhdGFcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHNjcmlwdEhvc3RFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwic2NyaXB0SG9zdEVsZW1lbnRcIik7XG5cbi8qKlxuICogVGhlIGBDdXN0b21FbGVtZW50YCBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBkZWZpbmUgYSBuZXcgSFRNTCBlbGVtZW50IHVzaW5nIHRoZSBwb3dlciBvZiBDdXN0b20gRWxlbWVudHMuXG4gKlxuICogKipJTVBPUlRBTlQ6KiogQWZ0ZXIgZGVmaW5pbmcgYSBgQ3VzdG9tRWxlbWVudGAsIHRoZSBgcmVnaXN0ZXJDdXN0b21FbGVtZW50YCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IGNsYXNzIG5hbWVcbiAqIHRvIG1ha2UgdGhlIHRhZyBkZWZpbmVkIHZpYSB0aGUgYGdldFRhZ2AgbWV0aG9kIGtub3duIHRvIHRoZSBET00uXG4gKlxuICogWW91IGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG9iamVjdCB2aWEgdGhlIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KClgIGZ1bmN0aW9uLlxuICpcbiAqICMjIFN0eWxpbmdcbiAqXG4gKiBUbyBkaXNwbGF5IGN1c3RvbSBlbGVtZW50cyBvcHRpbWFsbHksIHRoZSBgOmRlZmluZWRgIHBzZXVkby1jbGFzcyBjYW4gYmUgdXNlZC4gVG8gcHJldmVudCBjdXN0b20gZWxlbWVudHMgZnJvbSBiZWluZyBkaXNwbGF5ZWQgYW5kIGZsaWNrZXJpbmcgdW50aWwgdGhlIGNvbnRyb2wgaXMgcmVnaXN0ZXJlZCxcbiAqIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSBhIENTUyBkaXJlY3RpdmUuXG4gKlxuICogSW4gdGhlIHNpbXBsZXN0IGNhc2UsIHlvdSBjYW4gc2ltcGx5IGhpZGUgdGhlIGNvbnRyb2w6XG4gKlxuICogYGBgaHRtbFxuICogPHN0eWxlPlxuICogbXktY3VzdG9tLWVsZW1lbnQ6bm90KDpkZWZpbmVkKSB7XG4gKiAgICAgZGlzcGxheTogbm9uZTtcbiAqIH1cbiAqXG4gKiBteS1jdXN0b20tZWxlbWVudDpkZWZpbmVkIHtcbiAqICAgICBkaXNwbGF5OiBmbGV4O1xuICogfVxuICogPC9zdHlsZT5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlzcGxheSBhIGxvYWRlcjpcbiAqXG4gKiBgYGBjc3NcbiAqIG15LWN1c3RvbS1lbGVtZW50Om5vdCg6ZGVmaW5lZCkge1xuICogICAgIGRpc3BsYXk6IGZsZXg7XG4gKiAgICAgYm94LXNoYWRvdzogMCA0cHggMTBweCAwIHJnYmEoMzMsIDMzLCAzMywgMC4xNSk7XG4gKiAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICogICAgIGhlaWdodDogMjAwcHg7XG4gKiAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICogICAgIG92ZXJmbG93OiBoaWRkZW47XG4gKiB9XG4gKlxuICogbXktY3VzdG9tLWVsZW1lbnQ6bm90KDpkZWZpbmVkKTo6YmVmb3JlIHtcbiAqICAgICBjb250ZW50OiAnJztcbiAqICAgICBkaXNwbGF5OiBibG9jaztcbiAqICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gKiAgICAgbGVmdDogLTE1MHB4O1xuICogICAgIHRvcDogMDtcbiAqICAgICBoZWlnaHQ6IDEwMCU7XG4gKiAgICAgd2lkdGg6IDE1MHB4O1xuICogICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCUsICNFOEU4RTggNTAlLCB0cmFuc3BhcmVudCAxMDAlKTtcbiAqICAgICBhbmltYXRpb246IGxvYWQgMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpIGluZmluaXRlO1xuICogfVxuICpcbiAqIEBrZXlmcmFtZXMgbG9hZCB7XG4gKiAgICAgZnJvbSB7XG4gKiAgICAgICAgIGxlZnQ6IC0xNTBweDtcbiAqICAgICB9XG4gKiAgICAgdG8ge1xuICogICAgICAgICBsZWZ0OiAxMDAlO1xuICogICAgIH1cbiAqIH1cbiAqXG4gKiBteS1jdXN0b20tZWxlbWVudDpkZWZpbmVkIHtcbiAqICAgICBkaXNwbGF5OiBmbGV4O1xuICogfVxuICogYGBgXG4gKlxuICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDdXN0b20gRWxlbWVudHMgY2FuIGJlIGZvdW5kIGluIHRoZSBbTUROIFdlYiBEb2NzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9XZWJfQ29tcG9uZW50cy9Vc2luZ19jdXN0b21fZWxlbWVudHMpLlxuICogQW5kIGluIHRoZSBbSFRNTCBTdGFuZGFyZF0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzKSBvciBpbiB0aGUgW1dIQVRXRyBXaWtpXShodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL0N1c3RvbV9FbGVtZW50cykuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGJhc2UgY2xhc3MgZm9yIEhUTUw1IGN1c3RvbSBjb250cm9scy5cbiAqL1xuY2xhc3MgQ3VzdG9tRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAvKipcbiAgICAgKiBBIG5ldyBvYmplY3QgaXMgY3JlYXRlZC4gRmlyc3QsIHRoZSBgaW5pdE9wdGlvbnNgIG1ldGhvZCBpcyBjYWxsZWQuIEhlcmUgdGhlXG4gICAgICogb3B0aW9ucyBjYW4gYmUgZGVmaW5lZCBpbiBkZXJpdmVkIGNsYXNzZXMuIFN1YnNlcXVlbnRseSwgdGhlIHNoYWRvd1Jvb3QgaXMgaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBJTVBPUlRBTlQ6IEN1c3RvbUNvbnRyb2xzIGluc3RhbmNlcyBhcmUgbm90IGNyZWF0ZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGVpdGhlciB2aWEgYSB0YWcgaW4gdGhlIEhUTUwgb3IgdmlhIDxjb2RlPmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKTwvY29kZT4uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbiBhdHRyaWJ1dGUgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIEpTT04gZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXSA9IHt9O1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IG5ldyBQcm94eU9ic2VydmVyKHtcbiAgICAgICAgICAgIG9wdGlvbnM6IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXModGhpcywgZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzKSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzW2luaXRNZXRob2RTeW1ib2xdKCk7XG4gICAgICAgIGluaXRPcHRpb25PYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzW3NjcmlwdEhvc3RFbGVtZW50U3ltYm9sXSA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3ltYm9sfVxuICAgICAqIEBzaW5jZSAyLjEuMFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcbiAgICAgICAgcmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RvbS9jdXN0b20tZWxlbWVudEBAaW5zdGFuY2VcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZVxuICAgICAqIG1vbml0b3JlZCBieSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKClgLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1ldGhvZCBpcyBzdGF0aWMuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgYG9ic2VydmVkQXR0cmlidXRlc2AgcHJvcGVydHkgY2Fubm90IGJlIGNoYW5nZWQgZHVyaW5nIHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAgICAgKiBAc2luY2UgMS4xNS4wXG4gICAgICovXG4gICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqL1xuICAgIGFkZEF0dHJpYnV0ZU9ic2VydmVyKGF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayk7XG4gICAgICAgIHRoaXNbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW2F0dHJpYnV0ZV0gPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKi9cbiAgICByZW1vdmVBdHRyaWJ1dGVPYnNlcnZlcihhdHRyaWJ1dGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW2F0dHJpYnV0ZV07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgZGVmYXVsdHNgIHByb3BlcnR5IGRlZmluZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBhIGNvbnRyb2wuIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZXNlLFxuICAgICAqIHlvdSBjYW4gdXNlIHZhcmlvdXMgbWV0aG9kcywgd2hpY2ggYXJlIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXRcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnZW5kb2Njb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH0uXG4gICAgICpcbiAgICAgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93OlxuICAgICAqXG4gICAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2hhZG93Um9vdCBjYW4gYmUgZm91bmQgaW4gdGhlIFtNRE4gV2ViIERvY3NdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2F0dGFjaFNoYWRvdyksXG4gICAgICogaW4gdGhlIFtIVE1MIFN0YW5kYXJkXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCNjdXN0b20tZWxlbWVudHMpIG9yIGluIHRoZSBbV0hBVFdHIFdpa2ldKGh0dHBzOi8vd2lraS53aGF0d2cub3JnL3dpa2kvQ3VzdG9tX0VsZW1lbnRzKS5cbiAgICAgKlxuICAgICAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgY2FuIGJlIGZvdW5kIGluIHRoZSBbTUROIFdlYiBEb2NzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGUpLlxuICAgICAqXG4gICAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xvdCBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgW01ETiBXZWIgRG9jc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3Nsb3QpLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlZD1mYWxzZSBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZC4gV2hlbiBwcmVzZW50LCBpdCBtYWtlcyB0aGUgZWxlbWVudCBub24tbXV0YWJsZSwgbm9uLWZvY3VzYWJsZSwgYW5kIG5vbi1zdWJtaXR0YWJsZSB3aXRoIHRoZSBmb3JtLlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzaGFkb3dNb2RlPW9wZW4gU3BlY2lmaWVzIHRoZSBtb2RlIG9mIHRoZSBzaGFkb3cgcm9vdC4gV2hlbiBzZXQgdG8gYG9wZW5gLCBlbGVtZW50cyBpbiB0aGUgc2hhZG93IHJvb3QgYXJlIGFjY2Vzc2libGUgZnJvbSBKYXZhU2NyaXB0IG91dHNpZGUgdGhlIHJvb3QsIHdoaWxlIHNldHRpbmcgaXQgdG8gYGNsb3NlZGAgZGVuaWVzIGFjY2VzcyB0byB0aGUgcm9vdCdzIG5vZGVzIGZyb20gSmF2YVNjcmlwdCBvdXRzaWRlIGl0LlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVsZWdhdGVzRm9jdXM9dHJ1ZSBTcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBjb250cm9sIHdpdGggcmVzcGVjdCB0byBmb2N1c2FiaWxpdHkuIFdoZW4gc2V0IHRvIGB0cnVlYCwgaXQgbWl0aWdhdGVzIGN1c3RvbSBlbGVtZW50IGlzc3VlcyBhcm91bmQgZm9jdXNhYmlsaXR5LiBXaGVuIGEgbm9uLWZvY3VzYWJsZSBwYXJ0IG9mIHRoZSBzaGFkb3cgRE9NIGlzIGNsaWNrZWQsIHRoZSBmaXJzdCBmb2N1c2FibGUgcGFydCBpcyBnaXZlbiBmb2N1cywgYW5kIHRoZSBzaGFkb3cgaG9zdCBpcyBnaXZlbiBhbnkgYXZhaWxhYmxlIDpmb2N1cyBzdHlsaW5nLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgU3BlY2lmaWVzIHRoZSB0ZW1wbGF0ZXMgdXNlZCBieSB0aGUgY29udHJvbC5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW49dW5kZWZpbmVkIFNwZWNpZmllcyB0aGUgbWFpbiB0ZW1wbGF0ZSB1c2VkIGJ5IHRoZSBjb250cm9sLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZU1hcHBpbmcgU3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHRlbXBsYXRlcy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVGb3JtYXR0ZXIgU3BlY2lmaWVzIHRoZSBmb3JtYXR0ZXIgZm9yIHRoZSB0ZW1wbGF0ZXMuXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlRm9ybWF0dGVyLm1hcmtlciBTcGVjaWZpZXMgdGhlIG1hcmtlciBmb3IgdGhlIHRlbXBsYXRlcy5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB0ZW1wbGF0ZUZvcm1hdHRlci5tYXJrZXIub3Blbj1udWxsIFNwZWNpZmllcyB0aGUgb3BlbmluZyBtYXJrZXIgZm9yIHRoZSB0ZW1wbGF0ZXMuXG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdGVtcGxhdGVGb3JtYXR0ZXIubWFya2VyLmNsb3NlPW51bGwgU3BlY2lmaWVzIHRoZSBjbG9zaW5nIG1hcmtlciBmb3IgdGhlIHRlbXBsYXRlcy5cbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGV2ZW50UHJvY2Vzc2luZz1mYWxzZSBTcGVjaWZpZXMgd2hldGhlciB0aGUgY29udHJvbCBwcm9jZXNzZXMgZXZlbnRzLlxuICAgICAqIEBzaW5jZSAxLjguMFxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHNoYWRvd01vZGU6IFwib3BlblwiLFxuICAgICAgICAgICAgZGVsZWdhdGVzRm9jdXM6IHRydWUsXG4gICAgICAgICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgICBtYWluOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGVNYXBwaW5nOiB7fSxcbiAgICAgICAgICAgIHRlbXBsYXRlRm9ybWF0dGVyOiB7XG4gICAgICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiBudWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudFByb2Nlc3Npbmc6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGxhYmVscyBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBUaGUgbGFiZWxzIGFyZSBkZWZpbmVkIGluIHRoZSBvcHRpb24gb2JqZWN0LlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGxhYmVsIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHRyYW5zbGF0aW9uIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIElmIHRoZSB0cmFuc2xhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGFiZWwsIHRoZSBsYWJlbCBpcyB1cGRhdGVkLlxuICAgICAqXG4gICAgICogQmVmb3JlIHlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kLCB5b3UgbXVzdCBoYXZlIGxvYWRlZCB0aGUgdHJhbnNsYXRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gIENhbm5vdCBmaW5kIGFuIGVsZW1lbnQgd2l0aCB0cmFuc2xhdGlvbnMuIEFkZCBhIHRyYW5zbGF0aW9uIG9iamVjdCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgdXBkYXRlSTE4bigpIHtcbiAgICAgICAgbGV0IHRyYW5zbGF0aW9ucztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNsYXRpb25zID0gZ2V0RG9jdW1lbnRUcmFuc2xhdGlvbnMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWRkRXJyb3JBdHRyaWJ1dGUodGhpcywgZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdHJhbnNsYXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzXCIpO1xuICAgICAgICBpZiAoIShpc09iamVjdChsYWJlbHMpIHx8IGlzSXRlcmFibGUobGFiZWxzKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGFiZWxzKSB7XG4gICAgICAgICAgICBjb25zdCBkZWYgPSBsYWJlbHNba2V5XTtcblxuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGRlZikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdHJhbnNsYXRpb25zLmdldFRleHQoa2V5LCBkZWYpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9PSBkZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb24oYGxhYmVscy4ke2tleX1gLCB0ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRlZikpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gZGVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBkZWZba107XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRyYW5zbGF0aW9ucy5nZXRQbHVyYWxSdWxlVGV4dChrZXksIGssIGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxhYmVscyBkZWZpbml0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9PSBkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE9wdGlvbihgbGFiZWxzLiR7a2V5fS4ke2t9YCwgdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGFiZWxzIGRlZmluaXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBnZXRUYWcoKWAgbWV0aG9kIHJldHVybnMgdGhlIHRhZyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VzdG9tIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVyd3JpdHRlblxuICAgICAqIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGNoZWNrIG9uIHRoZSBuYW1lIG9mIHRoZSB0YWcgaW4gdGhpcyBjbGFzcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mXG4gICAgICogdGhlIGRldmVsb3BlciB0byBhc3NpZ24gYW4gYXBwcm9wcmlhdGUgdGFnIG5hbWUuIElmIHRoZSBuYW1lIGlzIG5vdCB2YWxpZCwgdGhlXG4gICAgICogYHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCgpYCBtZXRob2Qgd2lsbCBpc3N1ZSBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjdmFsaWQtY3VzdG9tLWVsZW1lbnQtbmFtZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFnIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXN0b20gZWxlbWVudC5cbiAgICAgKiBAc2luY2UgMS43LjBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZSBtZXRob2QgYGdldFRhZygpYCBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MuXCIsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBnZXRDU1NTdHlsZVNoZWV0KClgIG1ldGhvZCByZXR1cm5zIGEgYENTU1N0eWxlU2hlZXRgIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHN0eWxlcyBmb3IgdGhlIGN1c3RvbSBlbGVtZW50LlxuICAgICAqIElmIHRoZSBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgQ1NTU3R5bGVTaGVldGAgY29uc3RydWN0b3IsIHRoZW4gYW4gb2JqZWN0IGNhbiBiZSBidWlsdCB1c2luZyB0aGUgcHJvdmlkZWQgZGV0b3VyLlxuICAgICAqXG4gICAgICogSWYgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIHNoYWRvdyByb290IGRvZXMgbm90IHJlY2VpdmUgYSBzdHlsZXNoZWV0LlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICogICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcbiAgICAgKiAgICAgICBjb25zdCBzaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG4gICAgICogICAgICAgc2hlZXQucmVwbGFjZVN5bmMoXCJwIHsgY29sb3I6IHJlZDsgfVwiKTtcbiAgICAgKiAgICAgICByZXR1cm4gc2hlZXQ7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIGBDU1NTdHlsZVNoZWV0YCBjb25zdHJ1Y3RvcixcbiAgICAgKiB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHdvcmthcm91bmQgdG8gY3JlYXRlIHRoZSBzdHlsZXNoZWV0OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RpdGxlJyk7XG4gICAgICogbGV0IHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgKiBzdHlsZS5pbm5lckhUTUwgPSBcInAgeyBjb2xvcjogcmVkOyB9XCI7XG4gICAgICogc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAqIGRvYy5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgKiByZXR1cm4gZG9jLnN0eWxlU2hlZXRzWzBdO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybiB7Q1NTU3R5bGVTaGVldHxDU1NTdHlsZVNoZWV0W118c3RyaW5nfHVuZGVmaW5lZH0gQSBgQ1NTU3R5bGVTaGVldGAgb2JqZWN0IG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cyB0aGF0IGRlZmluZSB0aGUgc3R5bGVzIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQsIG9yIGB1bmRlZmluZWRgIGlmIG5vIHN0eWxlc2hlZXQgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAgICovXG4gICAgc3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYXR0YWNoIGEgbmV3IG9ic2VydmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gICAgICovXG4gICAgYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXRhY2ggYSBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqL1xuICAgIGRldGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmRldGFjaE9ic2VydmVyKG9ic2VydmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJuIHtQcm94eU9ic2VydmVyfVxuICAgICAqL1xuICAgIGNvbnRhaW5zT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmNvbnRhaW5zT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5lc3RlZCBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgcGF0aCBgYS5iLmNgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKiBAc2luY2UgMS4xMC4wXG4gICAgICovXG4gICAgZ2V0T3B0aW9uKHBhdGgsIGRlZmF1bHRWYWx1ZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgdmFsdWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IFBhdGhmaW5kZXIoXG4gICAgICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVtcIm9wdGlvbnNcIl0sXG4gICAgICAgICAgICApLmdldFZpYShwYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb3B0aW9uIGFuZCBpbmZvcm0gZWxlbWVudHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqL1xuICAgIHNldE9wdGlvbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbXCJvcHRpb25zXCJdKS5zZXRWaWEoXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqL1xuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAoaXNTdHJpbmcob3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnNKU09OLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMjAyNC0wMS0yMTogcmVtb3ZlIHRoaXMuZGVmYXVsdHMsIG90aGVyd2lzZSBpdCB3aWxsIG92ZXJ3cml0ZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzZXR0aW5ncyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIG1hZGUuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0bGFiLnNjaHVrYWkuY29tL29zcy9saWJyYXJpZXMvamF2YXNjcmlwdC9tb25zdGVyLy0vaXNzdWVzLzEzNlxuICAgICAgICBleHRlbmQodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpW1wib3B0aW9uc1wiXSwgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIG9uY2UgdmlhIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBbaW5pdE1ldGhvZFN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlIG9iamVjdCBpcyBlcXVpcHBlZCB3aXRoIHVwZGF0ZSBmb3IgdGhlIGR5bmFtaWMgY2hhbmdlIG9mIHRoZSBkb20uXG4gICAgICogVGhlIGZ1bmN0aW9ucyByZXR1cm5lZCBoZXJlIGNhbiBiZSB1c2VkIGFzIHBpcGUgZnVuY3Rpb25zIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKlxuICAgICAqIEluIHRoZSBleGFtcGxlLCB0aGUgZnVuY3Rpb24gYG15LXRyYW5zZm9ybWVyYCBpcyBkZWZpbmVkLiBJbiB0aGUgdGVtcGxhdGUsIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3M6XG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPG15LWVsZW1lbnRcbiAgICAgKiAgIGRhdGEtbW9uc3Rlci1vcHRpb24tdHJhbnNmb3JtZXI9XCJwYXRoOm15LXZhbHVlIHwgY2FsbDpteS10cmFuc2Zvcm1lclwiPlxuICAgICAqIDwvbXktZWxlbWVudD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBmdW5jdGlvbiBgbXktdHJhbnNmb3JtZXJgIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZSBvZiBgbXktdmFsdWVgIGFzIGEgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcbiAgICAgKiBbdXBkYXRlclRyYW5zZm9ybWVyTWV0aG9kc1N5bWJvbF0oKSB7XG4gICAgICogICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBcIm15LXRyYW5zZm9ybWVyXCI6ICh2YWx1ZSkgPT4ge1xuICAgICAqICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBXZXJ0KSB7XG4gICAgICogICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgKiAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSArIFwiIVwiO1xuICAgICAqICAgICAgICAgICBjYXNlIFwiWmFobFwiOlxuICAgICAqICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgMTtcbiAgICAgKiAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgKiAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgKiAgICAgICAgICAgfVxuICAgICAqICAgIH1cbiAgICAgKiAgICB9O1xuICAgICAqICB9O1xuICAgICAqICB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQHNpbmNlIDIuNDMuMFxuICAgICAqL1xuICAgIFt1cGRhdGVyVHJhbnNmb3JtZXJNZXRob2RzU3ltYm9sXSgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlIG9iamVjdCBpcyBpbmNsdWRlZCBpbiB0aGUgRE9NIGZvciB0aGUgZmlyc3QgdGltZS4gSXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOlxuICAgICAqXG4gICAgICogPG9sPlxuICAgICAqIDxsaT5FeHRyYWN0cyB0aGUgb3B0aW9ucyBmcm9tIHRoZSBhdHRyaWJ1dGVzIGFuZCB0aGUgc2NyaXB0IHRhZyBvZiB0aGUgZWxlbWVudCBhbmQgc2V0cyB0aGVtLjwvbGk+XG4gICAgICogPGxpPkluaXRpYWxpemVzIHRoZSBzaGFkb3cgcm9vdCBhbmQgaXRzIENTUyBzdHlsZXNoZWV0IChpZiBzcGVjaWZpZWQpLjwvbGk+XG4gICAgICogPGxpPkluaXRpYWxpemVzIHRoZSBIVE1MIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQuPC9saT5cbiAgICAgKiA8bGk+SW5pdGlhbGl6ZXMgdGhlIGN1c3RvbSBlbGVtZW50cyBpbnNpZGUgdGhlIHNoYWRvdyByb290IGFuZCB0aGUgc2xvdHRlZCBlbGVtZW50cy48L2xpPlxuICAgICAqIDxsaT5BdHRhY2hlcyBhIG11dGF0aW9uIG9ic2VydmVyIHRvIG9ic2VydmUgY2hhbmdlcyB0byB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC48L2xpPlxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH0gLSBUaGUgdXBkYXRlZCBjdXN0b20gZWxlbWVudC5cbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuICAgICAgICBsZXQgZWxlbWVudHM7XG4gICAgICAgIGxldCBub2RlTGlzdDtcblxuICAgICAgICAvLyBFeHRyYWN0IG9wdGlvbnMgZnJvbSBhdHRyaWJ1dGVzIGFuZCBzZXQgdGhlbVxuICAgICAgICBjb25zdCBBdHRyaWJ1dGVPcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzLmNhbGwodGhpcyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzT2JqZWN0KEF0dHJpYnV0ZU9wdGlvbnMpICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhBdHRyaWJ1dGVPcHRpb25zKS5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25zKEF0dHJpYnV0ZU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCBvcHRpb25zIGZyb20gc2NyaXB0IHRhZyBhbmQgc2V0IHRoZW1cbiAgICAgICAgY29uc3QgU2NyaXB0T3B0aW9ucyA9IGdldE9wdGlvbnNGcm9tU2NyaXB0VGFnLmNhbGwodGhpcyk7XG4gICAgICAgIGlmIChpc09iamVjdChTY3JpcHRPcHRpb25zKSAmJiBPYmplY3Qua2V5cyhTY3JpcHRPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldE9wdGlvbnMoU2NyaXB0T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzaGFkb3cgcm9vdCBhbmQgaXRzIENTUyBzdHlsZXNoZWV0XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihcInNoYWRvd01vZGVcIiwgZmFsc2UpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpbml0U2hhZG93Um9vdC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcy5zaGFkb3dSb290LmNoaWxkTm9kZXM7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYWRkRXJyb3JBdHRyaWJ1dGUodGhpcywgZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaW5pdENTU1N0eWxlc2hlZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhZGRFcnJvckF0dHJpYnV0ZSh0aGlzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBlbGVtZW50cyBhcmUgbm90IGZvdW5kIGluc2lkZSB0aGUgc2hhZG93IHJvb3QsIGluaXRpYWxpemUgdGhlIEhUTUwgY29udGVudCBvZiB0aGUgZWxlbWVudFxuICAgICAgICBpZiAoIShlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSkge1xuICAgICAgICAgICAgaW5pdEh0bWxDb250ZW50LmNhbGwodGhpcyk7XG4gICAgICAgICAgICBlbGVtZW50cyA9IHRoaXMuY2hpbGROb2RlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGN1c3RvbSBlbGVtZW50cyBpbnNpZGUgdGhlIHNoYWRvdyByb290IGFuZCB0aGUgc2xvdHRlZCBlbGVtZW50c1xuICAgICAgICBpbml0RnJvbUNhbGxiYWNrSG9zdC5jYWxsKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZUxpc3QgPSBuZXcgU2V0KFsuLi5lbGVtZW50cywgLi4uZ2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwodGhpcyldKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbm9kZUxpc3QgPSBlbGVtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzW3VwZGF0ZUNsb25lRGF0YVN5bWJvbF0gPSBjbG9uZShcbiAgICAgICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpW1wib3B0aW9uc1wiXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFkZEVycm9yQXR0cmlidXRlKHRoaXMsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2ZnID0ge307XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihcImV2ZW50UHJvY2Vzc2luZ1wiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2ZnLmV2ZW50UHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRPYmplY3RXaXRoVXBkYXRlclRvRWxlbWVudC5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5vZGVMaXN0LFxuICAgICAgICAgICAgY3VzdG9tRWxlbWVudFVwZGF0ZXJMaW5rU3ltYm9sLFxuICAgICAgICAgICAgdGhpc1t1cGRhdGVDbG9uZURhdGFTeW1ib2xdLFxuICAgICAgICAgICAgY2ZnLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEF0dGFjaCBhIG11dGF0aW9uIG9ic2VydmVyIHRvIG9ic2VydmUgY2hhbmdlcyB0byB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudFxuICAgICAgICBhdHRhY2hBdHRyaWJ1dGVDaGFuZ2VNdXRhdGlvbk9ic2VydmVyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nPyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIGFkdmFuY2VkIHVzZXJzLlxuICAgICAqIFRoZSByZXN1bHQgaXMgYSBjbG9uZSBvZiB0aGUgaW50ZXJuYWwgZGF0YS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgZ2V0SW50ZXJuYWxVcGRhdGVDbG9uZURhdGEoKSB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzW3VwZGF0ZUNsb25lRGF0YVN5bWJvbF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIERPTS4gSXQgY2hlY2tzIGlmIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGlmIG5vdCwgY2FsbHMgdGhlIGFzc2VtYmxlTWV0aG9kIHRvIGluaXRpYWxpemUgaXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvY29ubmVjdGVkQ2FsbGJhY2tcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkXG4gICAgICAgIGlmICghaGFzT2JqZWN0TGluayh0aGlzLCBjdXN0b21FbGVtZW50VXBkYXRlckxpbmtTeW1ib2wpKSB7XG4gICAgICAgICAgICAvLyBJZiBub3QsIGNhbGwgdGhlIGFzc2VtYmxlTWV0aG9kIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdFxuICAgICAgICAgICAgdGhpc1thc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLiBVc2VmdWwgZm9yIHJ1bm5pbmcgY2xlYW4gdXAgY29kZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHNpbmNlIDEuNy4wXG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSBlbGVtZW50IGhhcyBiZWVuIG1vdmVkIGludG8gYSBuZXcgZG9jdW1lbnQgKGUuZy4gc29tZW9uZSBjYWxsZWQgZG9jdW1lbnQuYWRvcHROb2RlKGVsKSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIGFkb3B0ZWRDYWxsYmFjaygpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQsIHJlbW92ZWQsIHVwZGF0ZWQsIG9yIHJlcGxhY2VkLiBBbHNvIGNhbGxlZCBmb3IgaW5pdGlhbFxuICAgICAqIHZhbHVlcyB3aGVuIGFuIGVsZW1lbnQgaXMgY3JlYXRlZCBieSB0aGUgcGFyc2VyLCBvciB1cGdyYWRlZC4gTm90ZTogb25seSBhdHRyaWJ1dGVzIGxpc3RlZCBpbiB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICogcHJvcGVydHkgd2lsbCByZWNlaXZlIHRoaXMgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkVmFsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld1ZhbFxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQHNpbmNlIDEuMTUuMFxuICAgICAqL1xuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyTmFtZSwgb2xkVmFsLCBuZXdWYWwpIHtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLW1vbnN0ZXItb3B0aW9uLVwiKSkge1xuICAgICAgICAgICAgc2V0T3B0aW9uRnJvbUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGF0dHJOYW1lLFxuICAgICAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKVtcIm9wdGlvbnNcIl0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXT8uW2F0dHJOYW1lXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbmV3VmFsLCBvbGRWYWwpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFkZEVycm9yQXR0cmlidXRlKHRoaXMsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gICAgICogQHNpbmNlIDEuMTkuMFxuICAgICAqL1xuICAgIGhhc05vZGUobm9kZSkge1xuICAgICAgICBpZiAoY29udGFpbkNoaWxkTm9kZS5jYWxsKHRoaXMsIHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHRoaXMuc2hhZG93Um9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbkNoaWxkTm9kZS5jYWxsKHRoaXMuc2hhZG93Um9vdCwgbm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Kn0gYXJnc1xuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgY2FsbENhbGxiYWNrKG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxDb250cm9sQ2FsbGJhY2suY2FsbCh0aGlzLCBuYW1lLCAuLi5hcmdzKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbGxCYWNrRnVuY3Rpb25OYW1lXG4gKiBAcGFyYW0geyp9ICBhcmdzXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGNhbGxDb250cm9sQ2FsbGJhY2soY2FsbEJhY2tGdW5jdGlvbk5hbWUsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNhbGxCYWNrRnVuY3Rpb25OYW1lKSB8fCBjYWxsQmFja0Z1bmN0aW9uTmFtZSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNhbGxCYWNrRnVuY3Rpb25OYW1lIGluIHRoaXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbEJhY2tGdW5jdGlvbk5hbWVdKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1NDUklQVF9IT1NUKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbc2NyaXB0SG9zdEVsZW1lbnRTeW1ib2xdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9TQ1JJUFRfSE9TVCk7XG4gICAgICAgIGlmICghdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0YXJnZXRJZC5zcGxpdChcIixcIik7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgbGlzdCkge1xuICAgICAgICAgICAgY29uc3QgaG9zdCA9IGZpbmRFbGVtZW50V2l0aElkVXB3YXJkcyh0aGlzLCB0YXJnZXRJZCk7XG4gICAgICAgICAgICBpZiAoIShob3N0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXNbc2NyaXB0SG9zdEVsZW1lbnRTeW1ib2xdLnB1c2goaG9zdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGhvc3Qgb2YgdGhpc1tzY3JpcHRIb3N0RWxlbWVudFN5bWJvbF0pIHtcbiAgICAgICAgaWYgKGNhbGxCYWNrRnVuY3Rpb25OYW1lIGluIGhvc3QpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RbY2FsbEJhY2tGdW5jdGlvbk5hbWVdKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFkZEVycm9yQXR0cmlidXRlKHRoaXMsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRXJyb3JBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBjYWxsYmFjayAke2NhbGxCYWNrRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgLFxuICAgICk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGN1c3RvbSBlbGVtZW50IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBET00uIEl0IGNoZWNrcyBpZiB0aGVcbiAqIGBkYXRhLW1vbnN0ZXItb3B0aW9uLWNhbGxiYWNrYCBhdHRyaWJ1dGUgaXMgc2V0LCBhbmQgaWYgbm90LCB0aGUgZGVmYXVsdCBjYWxsYmFja1xuICogYGluaXRDdXN0b21Db250cm9sQ2FsbGJhY2tgIGlzIGNhbGxlZC4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHNlYXJjaGVkIGZvciBpbiB0aGlzXG4gKiBlbGVtZW50IGFuZCBpbiB0aGUgaG9zdCBlbGVtZW50LiBJZiB0aGUgY2FsbGJhY2sgaXMgZm91bmQsIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiBhcyBhIHBhcmFtZXRlci5cbiAqXG4gKiBAdGhpcyBDdXN0b21FbGVtZW50XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FbGVtZW50UmVnaXN0cnkvZGVmaW5lI3Byb3ZpZGluZ19hX2NvbnN0cnVjdGlvbl9jYWxsYmFja1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmZ1bmN0aW9uIGluaXRGcm9tQ2FsbGJhY2tIb3N0KCkge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbiBuYW1lXG4gICAgbGV0IGNhbGxCYWNrRnVuY3Rpb25OYW1lID0gaW5pdENvbnRyb2xDYWxsYmFja05hbWU7XG5cbiAgICAvLyBJZiB0aGUgYGRhdGEtbW9uc3Rlci1vcHRpb24tY2FsbGJhY2tgIGF0dHJpYnV0ZSBpcyBzZXQsIHVzZSBpdHMgdmFsdWUgYXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWVcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0lOSVRfQ0FMTEJBQ0spKSB7XG4gICAgICAgIGNhbGxCYWNrRnVuY3Rpb25OYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lOSVRfQ0FMTEJBQ0spO1xuICAgIH1cblxuICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggdGhlIGVsZW1lbnQgYXMgYSBwYXJhbWV0ZXIgaWYgaXQgZXhpc3RzXG4gICAgY2FsbENvbnRyb2xDYWxsYmFjay5jYWxsKHRoaXMsIGNhbGxCYWNrRnVuY3Rpb25OYW1lKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCBjcmVhdGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdGhpcyBDdXN0b21FbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEF0dHJpYnV0ZUNoYW5nZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIHNlbGZbYXR0cmlidXRlTXV0YXRpb25PYnNlcnZlclN5bWJvbF0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGZbYXR0cmlidXRlTXV0YXRpb25PYnNlcnZlclN5bWJvbF0gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgICAgZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiYXR0cmlidXRlc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24uYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLm9sZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24udGFyZ2V0LmdldEF0dHJpYnV0ZShtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHNlbGZbYXR0cmlidXRlTXV0YXRpb25PYnNlcnZlclN5bWJvbF0ub2JzZXJ2ZShzZWxmLCB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYWRkRXJyb3JBdHRyaWJ1dGUoc2VsZiwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5DaGlsZE5vZGUobm9kZSkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgWywgZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jaGlsZE5vZGVzKSkge1xuICAgICAgICBpZiAoZS5jb250YWlucyhub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluQ2hpbGROb2RlLmNhbGwoZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTUuMFxuICogQHByaXZhdGVcbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gaW5pdE9wdGlvbk9ic2VydmVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgbGV0IGxhc3REaXNhYmxlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHNlbGYuYXR0YWNoT2JzZXJ2ZXIoXG4gICAgICAgIG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnID0gc2VsZi5nZXRPcHRpb24oXCJkaXNhYmxlZFwiKTtcblxuICAgICAgICAgICAgaWYgKGZsYWcgPT09IGxhc3REaXNhYmxlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXN0RGlzYWJsZWRWYWx1ZSA9IGZsYWc7XG5cbiAgICAgICAgICAgIGlmICghKHNlbGYuc2hhZG93Um9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9XG4gICAgICAgICAgICAgICAgXCJidXR0b24sIGNvbW1hbmQsIGZpZWxkc2V0LCBrZXlnZW4sIG9wdGdyb3VwLCBvcHRpb24sIHNlbGVjdCwgdGV4dGFyZWEsIGlucHV0LCBbZGF0YS1tb25zdGVyLW9iamVjdGxpbmtdXCI7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNlbGYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcblxuICAgICAgICAgICAgbGV0IG5vZGVMaXN0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBub2RlTGlzdCA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwoc2VsZiwgcXVlcnkpLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIG5vZGVMaXN0ID0gZWxlbWVudHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbLi4ubm9kZUxpc3RdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0RJU0FCTEVELCBcIlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfRElTQUJMRUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHNlbGYuYXR0YWNoT2JzZXJ2ZXIoXG4gICAgICAgIG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBub3QgaW5pdGlhbGlzZWRcbiAgICAgICAgICAgIGlmICghaGFzT2JqZWN0TGluayhzZWxmLCBjdXN0b21FbGVtZW50VXBkYXRlckxpbmtTeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaW5mb3JtIGV2ZXJ5IGVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXJzID0gZ2V0TGlua2VkT2JqZWN0cyhzZWxmLCBjdXN0b21FbGVtZW50VXBkYXRlckxpbmtTeW1ib2wpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3Qgb2YgdXBkYXRlcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVwZGF0ZXIgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gY2xvbmUoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVtcIm9wdGlvbnNcIl0pO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXIuZ2V0U3ViamVjdCgpLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBkaXNhYmxlZFxuICAgIHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW0FUVFJJQlVURV9ESVNBQkxFRF0gPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZWxmLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfRElTQUJMRUQpKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbihBVFRSSUJVVEVfRElTQUJMRUQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5zZXRPcHRpb24oQVRUUklCVVRFX0RJU0FCTEVELCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGRhdGEtbW9uc3Rlci1vcHRpb25zXG4gICAgc2VsZlthdHRyaWJ1dGVPYnNlcnZlclN5bWJvbF1bQVRUUklCVVRFX09QVElPTlNdID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzLmNhbGwoc2VsZik7XG4gICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZGF0YS1tb25zdGVyLW9wdGlvbnMtc2VsZWN0b3JcbiAgICBzZWxmW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXVtBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUl0gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zRnJvbVNjcmlwdFRhZy5jYWxsKHNlbGYpO1xuICAgICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW9uc0Zyb21TY3JpcHRUYWcoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUikpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUiksXG4gICAgKTtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTFNjcmlwdEVsZW1lbnQpKSB7XG4gICAgICAgIGFkZEVycm9yQXR0cmlidXRlKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGB0aGUgc2VsZWN0b3IgJHtBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUn0gZm9yIG9wdGlvbnMgd2FzIHNwZWNpZmllZCAoJHt0aGlzLmdldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICBBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUixcbiAgICAgICAgICAgICl9KSBidXQgbm90IGZvdW5kLmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBsZXQgb2JqID0ge307XG5cbiAgICB0cnkge1xuICAgICAgICBvYmogPSBwYXJzZU9wdGlvbnNKU09OLmNhbGwodGhpcywgbm9kZS50ZXh0Q29udGVudC50cmltKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYWRkRXJyb3JBdHRyaWJ1dGUoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYHdoZW4gYW5hbHl6aW5nIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHNjcmlwdCB0YWcgdGhlcmUgd2FzIGFuIGVycm9yLiAke2V9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE9wdGlvbnNGcm9tQXR0cmlidXRlcygpIHtcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlMpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VPcHRpb25zSlNPTi5jYWxsKHRoaXMsIHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFkZEVycm9yQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgYHRoZSBvcHRpb25zIGF0dHJpYnV0ZSAke0FUVFJJQlVURV9PUFRJT05TfSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uIChhY3R1YWw6ICR7dGhpcy5nZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIEFUVFJJQlVURV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICl9KS4ke2V9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBnaXZlbiBKU09OIGRhdGEgYW5kIHJldHVybnMgdGhlIHBhcnNlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFRoZSBKU09OIGRhdGEgdG8gYmUgcGFyc2VkLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcGFyc2VkIG9iamVjdC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEpTT04gZGF0YSBpcyBub3QgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uc0pTT04oZGF0YSkge1xuICAgIGxldCBvYmogPSB7fTtcblxuICAgIGlmICghaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29uZmlndXJhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgZGF0YSB1cmwuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YVVybCA9IHBhcnNlRGF0YVVSTChkYXRhKTtcbiAgICAgICAgZGF0YSA9IGRhdGFVcmwuY29udGVudDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgb2JqID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KG9iaik7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2luaXRIdG1sQ29udGVudH1cbiAqL1xuZnVuY3Rpb24gaW5pdEh0bWxDb250ZW50KCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZmluZERvY3VtZW50VGVtcGxhdGUodGhpcy5jb25zdHJ1Y3Rvci5nZXRUYWcoKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxldCBodG1sID0gdGhpcy5nZXRPcHRpb24oXCJ0ZW1wbGF0ZXMubWFpblwiLCBcIlwiKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGh0bWwpICYmIGh0bWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IHRoaXMuZ2V0T3B0aW9uKFwidGVtcGxhdGVNYXBwaW5nXCIsIHt9KTtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChtYXBwaW5nKSkge1xuICAgICAgICAgICAgICAgIGh0bWwgPSBuZXcgRm9ybWF0dGVyKG1hcHBpbmcsIHt9KS5mb3JtYXQoaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTYuMFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAqL1xuZnVuY3Rpb24gaW5pdENTU1N0eWxlc2hlZXQoKSB7XG4gICAgaWYgKCEodGhpcy5zaGFkb3dSb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTaGVldCA9IHRoaXMuY29uc3RydWN0b3IuZ2V0Q1NTU3R5bGVTaGVldCgpO1xuXG4gICAgaWYgKHN0eWxlU2hlZXQgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0KSB7XG4gICAgICAgIGlmIChzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbc3R5bGVTaGVldF07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoc3R5bGVTaGVldCkpIHtcbiAgICAgICAgY29uc3QgYXNzaWduID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcocykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmltZWRTdHlsZVNoZWV0ID0gcy50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyaW1lZFN0eWxlU2hlZXQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHRyaW1lZFN0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5wcmVwZW5kKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlSW5zdGFuY2UocywgQ1NTU3R5bGVTaGVldCk7XG5cbiAgICAgICAgICAgIGlmIChzLmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhc3NpZ24ucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3NpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IGFzc2lnbjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoc3R5bGVTaGVldCkpIHtcbiAgICAgICAgY29uc3QgdHJpbWVkU3R5bGVTaGVldCA9IHN0eWxlU2hlZXQudHJpbSgpO1xuICAgICAgICBpZiAodHJpbWVkU3R5bGVTaGVldCAhPT0gXCJcIikge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSBzdHlsZVNoZWV0O1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnByZXBlbmQoc3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gKiBAdGhyb3dzIHtFcnJvcn0gaHRtbCBpcyBub3Qgc2V0LlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9hdHRhY2hTaGFkb3dcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmZ1bmN0aW9uIGluaXRTaGFkb3dSb290KCkge1xuICAgIGxldCB0ZW1wbGF0ZTtcbiAgICBsZXQgaHRtbDtcblxuICAgIHRyeSB7XG4gICAgICAgIHRlbXBsYXRlID0gZmluZERvY3VtZW50VGVtcGxhdGUodGhpcy5jb25zdHJ1Y3Rvci5nZXRUYWcoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBodG1sID0gdGhpcy5nZXRPcHRpb24oXCJ0ZW1wbGF0ZXMubWFpblwiLCBcIlwiKTtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhodG1sKSB8fCBodG1sID09PSB1bmRlZmluZWQgfHwgaHRtbCA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaHRtbCBpcyBub3Qgc2V0LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXR0YWNoU2hhZG93KHtcbiAgICAgICAgbW9kZTogdGhpcy5nZXRPcHRpb24oXCJzaGFkb3dNb2RlXCIsIFwib3BlblwiKSxcbiAgICAgICAgZGVsZWdhdGVzRm9jdXM6IHRoaXMuZ2V0T3B0aW9uKFwiZGVsZWdhdGVzRm9jdXNcIiwgdHJ1ZSksXG4gICAgfSk7XG5cbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IHRoaXMuZ2V0T3B0aW9uKFwidGVtcGxhdGVNYXBwaW5nXCIsIHt9KTtcbiAgICBpZiAoaXNPYmplY3QobWFwcGluZykpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtYXBwaW5nKTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKFwidGVtcGxhdGVGb3JtYXR0ZXIubWFya2VyLm9wZW5cIikgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlci5zZXRNYXJrZXIoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oXCJ0ZW1wbGF0ZUZvcm1hdHRlci5tYXJrZXIub3BlblwiKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbihcInRlbXBsYXRlRm9ybWF0dGVyLm1hcmtlci5jbG9zZVwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCA9IGZvcm1hdHRlci5mb3JtYXQoaHRtbCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFkb3dSb290LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgbmV3IGVsZW1lbnQuIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgYEN1c3RvbUVsZW1lbnQuZ2V0VGFnKClgIGlzIHVzZWQgYXMgdGhlIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0N1c3RvbUVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjcuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlZmluZScgb24gJ0N1c3RvbUVsZW1lbnRSZWdpc3RyeSc6IGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWVcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJDdXN0b21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGVsZW1lbnQpO1xuICAgIGNvbnN0IGN1c3RvbUVsZW1lbnRzID0gZ2V0R2xvYmFsT2JqZWN0KFwiY3VzdG9tRWxlbWVudHNcIik7XG4gICAgaWYgKGN1c3RvbUVsZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY3VzdG9tRWxlbWVudHMgaXMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgdGFnID0gZWxlbWVudD8uZ2V0VGFnKCk7XG4gICAgaWYgKCFpc1N0cmluZyh0YWcpIHx8IHRhZyA9PT0gXCJcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0YWcgaXMgbm90IHNldC5cIik7XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUVsZW1lbnRzLmdldCh0YWcpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0YWcsIGVsZW1lbnQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbCB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmV4cG9ydCB7IHJhbmRvbSB9O1xuXG4vKipcbiAqIHRoaXMgZnVuY3Rpb24gdXNlcyBjcnlwdCBhbmQgcmV0dXJucyBhIHJhbmRvbSBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZGVmaW5pdGlvbiBzZXQgKGRlZmF1bHQgaXMgMClcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggZW5kIHZhbHVlIG9mIHRoZSBkZWZpbml0aW9uIHNldCAoZGVmYXVsdCBpcyAxMDAwMDAwMDAwKVxuICogQHJldHVybiB7bnVtYmVyfVxuICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgY3J5cHRcbiAqIEB0aHJvd3Mge0Vycm9yfSB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBkaXN0YW5jZSBpcyB0b28gc21hbGwgdG8gY3JlYXRlIGEgcmFuZG9tIG51bWJlci5cblxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCkge1xuXHRpZiAobWluID09PSB1bmRlZmluZWQpIHtcblx0XHRtaW4gPSAwO1xuXHR9XG5cdGlmIChtYXggPT09IHVuZGVmaW5lZCkge1xuXHRcdG1heCA9IE1BWDtcblx0fVxuXG5cdGlmIChtYXggPCBtaW4pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtYXggbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluXCIpO1xuXHR9XG5cblx0cmV0dXJuIE1hdGgucm91bmQoY3JlYXRlKG1pbiwgbWF4KSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWCA9IDEwMDAwMDAwMDA7XG5cbk1hdGgubG9nMiA9XG5cdE1hdGgubG9nMiB8fFxuXHRmdW5jdGlvbiAobikge1xuXHRcdHJldHVybiBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xuXHR9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgY3J5cHRcbiAqIEB0aHJvd3Mge0Vycm9yfSB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBkaXN0YW5jZSBpcyB0b28gc21hbGwgdG8gY3JlYXRlIGEgcmFuZG9tIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlKG1pbiwgbWF4KSB7XG5cdGNvbnN0IGdsb2JhbFJlZmVyZW5jZSA9IGdldEdsb2JhbCgpO1xuXG5cdGNvbnN0IGNyeXB0ID1cblx0XHRnbG9iYWxSZWZlcmVuY2U/LltcImNyeXB0b1wiXSB8fFxuXHRcdGdsb2JhbFJlZmVyZW5jZT8uW1wibXNDcnlwdG9cIl0gfHxcblx0XHRnbG9iYWxSZWZlcmVuY2U/LltcImNyeXB0b1wiXSB8fFxuXHRcdHVuZGVmaW5lZDtcblxuXHRpZiAodHlwZW9mIGNyeXB0ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBjcnlwdFwiKTtcblx0fVxuXG5cdGxldCBydmFsID0gMDtcblx0Y29uc3QgcmFuZ2UgPSBtYXggLSBtaW47XG5cdGlmIChyYW5nZSA8IDIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgZGlzdGFuY2UgaXMgdG9vIHNtYWxsIHRvIGNyZWF0ZSBhIHJhbmRvbSBudW1iZXIuXCIpO1xuXHR9XG5cblx0Y29uc3QgYml0c05lZWRlZCA9IE1hdGguY2VpbChNYXRoLmxvZzIocmFuZ2UpKTtcblx0aWYgKGJpdHNOZWVkZWQgPiA1Mykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIndlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuXCIpO1xuXHR9XG5cdGNvbnN0IGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKGJpdHNOZWVkZWQgLyA4KTtcblx0Y29uc3QgbWFzayA9IE1hdGgucG93KDIsIGJpdHNOZWVkZWQpIC0gMTtcblxuXHRjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlc05lZWRlZCk7XG5cdGNyeXB0LmdldFJhbmRvbVZhbHVlcyhieXRlQXJyYXkpO1xuXG5cdGxldCBwID0gKGJ5dGVzTmVlZGVkIC0gMSkgKiA4O1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcblx0XHRydmFsICs9IGJ5dGVBcnJheVtpXSAqIE1hdGgucG93KDIsIHApO1xuXHRcdHAgLT0gODtcblx0fVxuXG5cdHJ2YWwgPSBydmFsICYgbWFzaztcblxuXHRpZiAocnZhbCA+PSByYW5nZSkge1xuXHRcdHJldHVybiBjcmVhdGUobWluLCBtYXgpO1xuXHR9XG5cblx0aWYgKHJ2YWwgPCBtaW4pIHtcblx0XHRydmFsICs9IG1pbjtcblx0fVxuXG5cdHJldHVybiBydmFsO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaXNJbnRlZ2VyIH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVJbnRlZ2VyIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBEZWFkTWFuc1N3aXRjaCB9O1xuXG4vKipcbiAqIFRoZSBkZWFkIG1hbidzIHN3aXRjaCBhbGxvd3Mgc2V0dGluZyBhIHRpbWVyIHdoaWNoIGNhbiBiZSByZXNldCBhZ2FpblxuICogYW5kIGFnYWluIHdpdGhpbiBhIGRlZmluZWQgcGVyaW9kIG9mIHRpbWUuXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGUvdXRpbC9kZWFkbWFuc3N3aXRjaC9zaW1wbGUvIFNpbXBsZSBleGFtcGxlXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yOS4wXG4gKiBAc3VtbWFyeSBDbGFzcyB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgZnVuY3Rpb24gY2hhaW5zXG4gKi9cbmNsYXNzIERlYWRNYW5zU3dpdGNoIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKiBDcmVhdGUgbmV3IGRlYWQgbWFuJ3Mgc3dpdGNoXG5cdCAqXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gZGVsYXlcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcblx0ICogQHRocm93IHtUeXBlRXJyb3J9IHRoZSBhcmd1bWVudHMgbXVzdCBiZSBlaXRoZXIgaW50ZWdlciBvciBmdW5jdGlvbnNcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuXHQgKi9cblx0Y29uc3RydWN0b3IoZGVsYXksIGNhbGxiYWNrKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGluaXQuY2FsbCh0aGlzLCB2YWxpZGF0ZUludGVnZXIoZGVsYXkpLCB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIGRlbGF5XG5cdCAqIEByZXR1cm5zIHtEZWFkTWFuc1N3aXRjaH1cblx0ICogQHRocm93cyB7RXJyb3J9IGhhcyBhbHJlYWR5IHJ1blxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYXJndW1lbnRcblx0ICovXG5cdHRvdWNoKGRlbGF5KSB7XG5cdFx0aWYgKHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wiaXNBbHJlYWR5UnVuXCJdID09PSB0cnVlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJoYXMgYWxyZWFkeSBydW5cIik7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSW50ZWdlcihkZWxheSkpIHtcblx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wiZGVsYXlcIl0gPSBkZWxheTtcblx0XHR9IGVsc2UgaWYgKGRlbGF5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGFyZ3VtZW50XCIpO1xuXHRcdH1cblxuXHRcdGNsZWFyVGltZW91dCh0aGlzW2ludGVybmFsU3ltYm9sXVtcInRpbWVyXCJdKTtcblx0XHRpbml0Q2FsbGJhY2suY2FsbCh0aGlzKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBoYXMgYWxyZWFkeSBydW5cblx0ICogQHJldHVybnMge0RlYWRNYW5zU3dpdGNofVxuXHQgKi9cblx0ZGVmdXNlKCkge1xuXHRcdGlmICh0aGlzW2ludGVybmFsU3ltYm9sXVtcImlzQWxyZWFkeVJ1blwiXSA9PT0gdHJ1ZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaGFzIGFscmVhZHkgcnVuXCIpO1xuXHRcdH1cblxuXHRcdGNsZWFyVGltZW91dCh0aGlzW2ludGVybmFsU3ltYm9sXVtcInRpbWVyXCJdKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRDYWxsYmFjaygpIHtcblx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJ0aW1lclwiXSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wiaXNBbHJlYWR5UnVuXCJdID0gdHJ1ZTtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXVtcImNhbGxiYWNrXCJdKCk7XG5cdH0sIHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wiZGVsYXlcIl0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGRlbGF5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBpbml0KGRlbGF5LCBjYWxsYmFjaykge1xuXHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcblx0XHRjYWxsYmFjayxcblx0XHRkZWxheSxcblx0XHRpc0FscmVhZHlSdW46IGZhbHNlLFxuXHRcdHRpbWVyOiB1bmRlZmluZWQsXG5cdH07XG5cblx0aW5pdENhbGxiYWNrLmNhbGwodGhpcyk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVJbnRlZ2VyIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBDYWxsYmFjayB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENhbGxiYWNrIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG5cdCAqIEBwYXJhbSB7aW50fHVuZGVmaW5lZH0gdGltZVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGNvbnN0cnVjdG9yKGNhbGxiYWNrLCB0aW1lKSB7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG5cdFx0XHRjYWxsYmFjazogdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayksXG5cdFx0XHR0aW1lOiB2YWxpZGF0ZUludGVnZXIodGltZSA/PyAwKSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSAgeyp9IGRhdGFcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdHJ1bihkYXRhKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGdldEdsb2JhbEZ1bmN0aW9uKFwic2V0VGltZW91dFwiKSgoKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0aGlzW2ludGVybmFsU3ltYm9sXS5jYWxsYmFjayhkYXRhKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnRpbWUpO1xuXHRcdH0pO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNJbnRlZ2VyIH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tIFwiLi4vdHlwZXMvcXVldWUubWpzXCI7XG5pbXBvcnQgeyBDYWxsYmFjayB9IGZyb20gXCIuL3Byb2Nlc3NpbmcvY2FsbGJhY2subWpzXCI7XG5cbmV4cG9ydCB7IFByb2Nlc3NpbmcgfTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGFsbG93cyBleGVjdXRpbmcgc2V2ZXJhbCBmdW5jdGlvbnMgaW4gb3JkZXIuXG4gKlxuICogRnVuY3Rpb25zIGFuZCB0aW1lb3V0cyBjYW4gYmUgcGFzc2VkLiBJZiBhIHRpbWVvdXQgaXMgcGFzc2VkLCBpdCBhcHBsaWVzIHRvIGFsbCBmdXJ0aGVyIGZ1bmN0aW9ucy5cbiAqIEluIHRoZSBleGFtcGxlXG4gKlxuICogYHRpbWVvdXQxLCBmdW5jdGlvbjEsIGZ1bmN0aW9uMiwgZnVuY3Rpb24zLCB0aW1lb3V0MiwgZnVuY3Rpb240YFxuICpcbiAqIHRoZSB0aW1lb3V0MSBpcyB2YWxpZCBmb3IgdGhlIGZ1bmN0aW9ucyAxLCAyIGFuZCAzIGFuZCB0aGUgdGltZW91dDIgZm9yIHRoZSBmdW5jdGlvbjQuXG4gKlxuICogU28gdGhlIGV4ZWN1dGlvbiB0aW1lIGlzIHRpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQyXG4gKlxuICogVGhlIHJlc3VsdCBvZiBgcnVuKClgIGlzIGEgcHJvbWlzZS5cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvbGlicmFyaWVzL3V0aWwvcHJvY2Vzc2luZy9zaW1wbGUvIEEgc2ltcGxlIGV4YW1wbGVcbiAqXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yMS4wXG4gKiBAc3VtbWFyeSBDbGFzcyB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgZnVuY3Rpb24gY2hhaW5zXG4gKi9cbmNsYXNzIFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqIENyZWF0ZSBuZXcgUHJvY2Vzc2luZ1xuXHQgKlxuXHQgKiBGdW5jdGlvbnMgYW5kIHRpbWVvdXRzIGNhbiBiZSBwYXNzZWQuIElmIGEgdGltZW91dCBpcyBwYXNzZWQsIGl0IGFwcGxpZXMgdG8gYWxsIGZ1cnRoZXIgZnVuY3Rpb25zLlxuXHQgKiBJbiB0aGUgZXhhbXBsZVxuXHQgKlxuXHQgKiBgdGltZW91dDEsIGZ1bmN0aW9uMSwgZnVuY3Rpb24yLCBmdW5jdGlvbjMsIHRpbWVvdXQyLCBmdW5jdGlvbjRgXG5cdCAqXG5cdCAqIHRoZSB0aW1lb3V0MSBpcyB2YWxpZCBmb3IgdGhlIGZ1bmN0aW9ucyAxLCAyIGFuZCAzIGFuZCB0aGUgdGltZW91dDIgZm9yIHRoZSBmdW5jdGlvbjQuXG5cdCAqXG5cdCAqIFNvIHRoZSBleGVjdXRpb24gdGltZSBpcyB0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MlxuXHQgKlxuXHQgKiBAdGhyb3cge1R5cGVFcnJvcn0gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGVpdGhlciBpbnRlZ2VyIG9yIGZ1bmN0aW9uc1xuXHQgKiBAcGFyYW0gey4uLihpbnR8ZnVuY3Rpb24pfSBhcmdzXG5cdCAqL1xuXHRjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuXHRcdFx0cXVldWU6IG5ldyBRdWV1ZSgpLFxuXHRcdH07XG5cblx0XHRsZXQgdGltZSA9IDA7XG5cblx0XHRpZiAodHlwZW9mIGFyZ3MgIT09IFwib2JqZWN0XCIgfHwgYXJnc1swXSA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInRoZSBhcmd1bWVudHMgbXVzdCBiZSBlaXRoZXIgaW50ZWdlciBvciBmdW5jdGlvbnNcIik7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBbLCBhcmddIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3MpKSB7XG5cdFx0XHRpZiAoaXNJbnRlZ2VyKGFyZykgJiYgYXJnID49IDApIHtcblx0XHRcdFx0dGltZSA9IGFyZztcblx0XHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbihhcmcpKSB7XG5cdFx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLnF1ZXVlLmFkZChuZXcgQ2FsbGJhY2soYXJnLCB0aW1lKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0XHRcdFwidGhlIGFyZ3VtZW50cyBtdXN0IGJlIGVpdGhlciBpbnRlZ2VyIG9yIGZ1bmN0aW9uc1wiLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgZnVuY3Rpb24gd2l0aCB0aGUgZGVzaXJlZCB0aW1lb3V0XG5cdCAqIElmIG5vIHRpbWVvdXQgaXMgc3BlY2lmaWVkLCB0aGUgdGltZW91dCBvZiB0aGUgcHJldmlvdXMgZnVuY3Rpb24gaXMgdXNlZC5cblx0ICpcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcblx0ICogQHBhcmFtIHtpbnR8dW5kZWZpbmVkfSB0aW1lXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuXHQgKi9cblx0YWRkKGNhbGxiYWNrLCB0aW1lKSB7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0ucXVldWUuYWRkKG5ldyBDYWxsYmFjayhjYWxsYmFjaywgdGltZSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBkZWZpbmVkIGZ1bmN0aW9ucyBpbiBvcmRlci5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBkYXRhXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHRydW4oZGF0YSkge1xuXHRcdGlmICh0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2FsbGJhY2sgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5wb2xsKCk7XG5cblx0XHRpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2FsbGJhY2sucnVuKGRhdGEpLnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMucnVuKHJlc3VsdCk7XG5cdFx0fSk7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBBVFRSSUJVVEVfUFJFRklYIH0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbi8qKlxuICogQHNpbmNlIDEuMC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBTVFlMRV9ESVNQTEFZX01PREVfQkxPQ0sgPSBcImJsb2NrXCI7XG5cbi8qKlxuICogVGhpcyBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci11cmxgIGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBVUkwgdG8gdGhlIGNvbnRyb2wuXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfRk9STV9VUkwgPSBgJHtBVFRSSUJVVEVfUFJFRklYfXVybGA7XG5cbi8qKlxuICogVGhpcyBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1yZWxvYWRgIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHJlbG9hZC5cbiAqXG4gKiB2YWxpZCB2YWx1ZXM6IG9uc2hvd1xuICpcbiAqIEBzaW5jZSAxLjExLjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9GT1JNX1JFTE9BRCA9IGAke0FUVFJJQlVURV9QUkVGSVh9cmVsb2FkYDtcblxuLyoqXG4gKiBgZGF0YS1tb25zdGVyLWludGVuZGBcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9WSVNJQklMSVRZID0gYCR7QVRUUklCVVRFX1BSRUZJWH12aXNpYmlsaXR5YDtcbi8qKlxuICogYGRhdGEtbW9uc3Rlci1pbnRlbmRgXG4gKlxuICogQHNpbmNlIDEuOS4wXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSAzLjMyLjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9CVVRUT05fQ0xBU1MgPSBgJHtBVFRSSUJVVEVfUFJFRklYfWJ1dHRvbi1jbGFzc2A7XG5cbi8qKlxuICogYGRhdGEtbW9uc3Rlci1pbnRlbmRgXG4gKlxuICogQHNpbmNlIDEuOC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfSU5URU5EID0gYCR7QVRUUklCVVRFX1BSRUZJWH1pbnRlbmRgO1xuXG4vKipcbiAqIGBkYXRhLW1vbnN0ZXItaGFzLWNoaWxkcmVuYFxuICpcbiAqIEBzaW5jZSAxLjguMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX0hBU19DSElMRFJFTiA9IGAke0FUVFJJQlVURV9QUkVGSVh9aGFzLWNoaWxkcmVuYDtcblxuLyoqXG4gKiBUaGlzIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLWRhdGFzb3VyY2VgIGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBkYXRhc291cmNlLlxuICpcbiAqIEBzaW5jZSAxLjYuMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX0ZPUk1fREFUQVNPVVJDRSA9IGAke0FUVFJJQlVURV9QUkVGSVh9ZGF0YXNvdXJjZWA7XG5cbi8qKlxuICogVGhpcyBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1kYXRhc291cmNlLWFyZ3VtZW50c2AgY2FuIGJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMuXG4gKlxuICogQHNpbmNlIDEuNi4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfRk9STV9EQVRBU09VUkNFX0FSR1VNRU5UUyA9IGAke0FUVFJJQlVURV9QUkVGSVh9ZGF0YXNvdXJjZS1hcmd1bWVudHNgO1xuXG4vKipcbiAqIFRoaXMgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItYnV0dG9uLWxhYmVsYCBjYW4gYmUgdXNlZCB0byBwYXNzIGxhYmVscy5cbiAqXG4gKiBAc2luY2UgMS42LjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9CVVRUT05fTEFCRUwgPSBgJHtBVFRSSUJVVEVfUFJFRklYfWJ1dHRvbi1sYWJlbGA7XG5cbmV4cG9ydCB7XG5cdEFUVFJJQlVURV9CVVRUT05fTEFCRUwsXG5cdFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSyxcblx0QVRUUklCVVRFX0ZPUk1fVVJMLFxuXHRBVFRSSUJVVEVfRk9STV9EQVRBU09VUkNFLFxuXHRBVFRSSUJVVEVfRk9STV9EQVRBU09VUkNFX0FSR1VNRU5UUyxcblx0QVRUUklCVVRFX0lOVEVORCxcblx0QVRUUklCVVRFX1ZJU0lCSUxJVFksXG5cdEFUVFJJQlVURV9GT1JNX1JFTE9BRCxcblx0QVRUUklCVVRFX0hBU19DSElMRFJFTixcblx0QVRUUklCVVRFX0JVVFRPTl9DTEFTUyxcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgVGFic1N0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFRhYnNTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0VGFic1N0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgdGFicyB7IFxuOmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJRdWlja3NhbmRcXFwiLFxcXCJTZWdvZSBVSVxcXCIsXFxcIlJvYm90b1xcXCIsXFxcIk94eWdlblxcXCIsXFxcIlVidW50dVxcXCIsXFxcIkNhbnRhcmVsbFxcXCIsXFxcIkZpcmEgU2Fuc1xcXCIsXFxcIkRyb2lkIFNhbnNcXFwiLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZixcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCI7LS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTpcXFwiQ29uc29sYXNcXFwiLFxcXCJDb3VyaWVyIE5ld1xcXCIsXFxcIlJvYm90byBNb25vXFxcIixcXFwiU291cmNlIENvZGUgUHJvXFxcIixcXFwiRmlyYSBNb25vXFxcIixtb25vc3BhY2U7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTQpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi02KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTIpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMyl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTYpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTIpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xOiM4MzNhYjQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTI6I2ZkMWQxZDstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMzojZmNiMDQ1Oy0tbW9uc3Rlci1ib3gtc2hhZG93LTE6bm9uZTstLW1vbnN0ZXItYm94LXNoYWRvdy0yOi0xcHggMXB4IDEwcHggMXB4IGhzbGEoMCwwJSw3NiUsLjYxKTstLW1vbnN0ZXItdGV4dC1zaGFkb3c6bm9uZTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTEpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTIpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aDoycHg7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXM6MDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci10aGVtZS1vbi1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLW9uLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci1ib3JkZXItd2lkdGg6M3B4Oy0tbW9uc3Rlci1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLW91dGxpbmUtd2lkdGg6MXB4Oy0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZTotNHB4Oy0tbW9uc3Rlci16LWluZGV4LWRlZmF1bHQ6MDstLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lOjEwOy0tbW9uc3Rlci16LWluZGV4LWRyb3Bkb3duOjIwMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bi1vdmVybGF5OjIxMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3k6MzAwOy0tbW9uc3Rlci16LWluZGV4LXN0aWNreS1vdmVybGF5OjMxMDstLW1vbnN0ZXItei1pbmRleC1maXhlZDo0MDA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQtb3ZlcmxheTo0MTA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtYmFja2Ryb3A6NTAwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wLW92ZXJsYXk6NTEwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhczo2MDA7LS1tb25zdGVyLXotaW5kZXgtb2ZmY2FudmFzLW92ZXJsYXk6NjEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsOjcwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5OjcxMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyOjgwMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyLW92ZXJsYXk6ODEwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXA6ODAwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXAtb3ZlcmxheTo5MTA7LS1tb25zdGVyLXNwYWNlLTA6MDstLW1vbnN0ZXItc3BhY2UtMToycHg7LS1tb25zdGVyLXNwYWNlLTI6NHB4Oy0tbW9uc3Rlci1zcGFjZS0zOjZweDstLW1vbnN0ZXItc3BhY2UtNDoxMHB4Oy0tbW9uc3Rlci1zcGFjZS01OjE2cHg7LS1tb25zdGVyLXNwYWNlLTY6MjZweDstLW1vbnN0ZXItc3BhY2UtNzo0MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTA6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNDo0ODBweDstLW1vbnN0ZXItYnJlYWtwb2ludC03Ojc2OHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTk6OTkycHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtMTI6MTIwMHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLXdpZHRoOjJweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGg6NHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLWhhbmRsZS1oZWlnaHQ6NTBweH0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmdyaWR7ZGlzcGxheTpncmlkfS5pbmxpbmUtZ3JpZHtkaXNwbGF5OmlubGluZS1ncmlkfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0uaGlkZGVuLC5oaWRlLC5ub25le2Rpc3BsYXk6bm9uZX0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMywubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLTB7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDowfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0yLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMywubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0yLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0zLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKX0ubW9uc3Rlci10aGVtZS1lcnJvci0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTEpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtMXtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xKX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0xKX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS1kaXNhYmxlZC0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yKX0ubW9uc3Rlci10aGVtZS1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLXRoZW1lLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItdGhlbWUtZGVzdHJ1Y3RpdmUtMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yKX0ubW9uc3Rlci10aGVtZS1zdWNjZXNzLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTIpfS5tb25zdGVyLXRoZW1lLXdhcm5pbmctMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMil9Lm1vbnN0ZXItdGhlbWUtZXJyb3ItMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0yKX0ubW9uc3Rlci10aGVtZS1zZWxlY3Rpb24tMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTIpfS5tb25zdGVyLWJvcmRlci1jb2xvci0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWJvcmRlci0yKX0ubW9uc3Rlci1jb2xvci1uZXV0cmFsLTJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMil9Lm1vbnN0ZXItY29sb3Itc3VjY2Vzcy0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0yKX0ubW9uc3Rlci1jb2xvci13YXJuaW5nLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTIpfS5tb25zdGVyLWNvbG9yLWVycm9yLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMil9Lm1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktZGlzYWJsZWQtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMyl9Lm1vbnN0ZXItdGhlbWUtc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci10aGVtZS10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLXRoZW1lLWRlc3RydWN0aXZlLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMyl9Lm1vbnN0ZXItdGhlbWUtc3VjY2Vzcy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zKX0ubW9uc3Rlci10aGVtZS13YXJuaW5nLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTMpfS5tb25zdGVyLXRoZW1lLWVycm9yLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMyl9Lm1vbnN0ZXItdGhlbWUtc2VsZWN0aW9uLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKX0ubW9uc3Rlci1ib3JkZXItY29sb3ItM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ib3JkZXItMyl9Lm1vbnN0ZXItY29sb3ItbmV1dHJhbC0ze2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItY29sb3ItdGVydGlhcnktM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTMpfS5tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMyl9Lm1vbnN0ZXItY29sb3Itd2FybmluZy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0zKX0ubW9uc3Rlci1jb2xvci1lcnJvci0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTMpfS5tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNCl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KX0ubW9uc3Rlci10aGVtZS1lcnJvci00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTQpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTQpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtNHtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00KX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTQpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNCl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci00KX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1yb3ctMXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1lbGVtZW50LC5tb25zdGVyLXRoZW1lLWNvbnRyb2wtcm93LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcil9Lm1vbnN0ZXItdGhlbWUtY29udHJvbC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yKX0ubW9uc3Rlci10aGVtZS1iYWNrZ3JvdW5kLWluaGVyaXR7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0IWltcG9ydGFudH0ubW9uc3Rlci10aGVtZS1vbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tY29sb3IpfS5tb25zdGVyLXRoZW1lLW9mZntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yKTtjb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLW9mZi1jb2xvcil9ZGl2W2RhdGEtbW9uc3Rlci1yb2xlPXBvcHBlcl17YmFja2dyb3VuZDp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7ZGlzcGxheTpub25lO3BhZGRpbmc6MS4xZW07ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtbW9kYWwpfVtkYXRhLXBvcHBlci1hcnJvd10sW2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7YmFja2dyb3VuZDppbmhlcml0O2hlaWdodDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEqdmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkpKjIpO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmNhbGMobWF4KHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpLCAtMSp2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMil9W2RhdGEtcG9wcGVyLWFycm93XXt2aXNpYmlsaXR5OmhpZGRlbn1bZGF0YS1wb3BwZXItYXJyb3ddOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29udGVudDpcXFwiXFxcIjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt2aXNpYmlsaXR5OnZpc2libGV9ZGl2W2RhdGEtcG9wcGVyLXBsYWNlbWVudF49dG9wXT5bZGF0YS1wb3BwZXItYXJyb3dde2JvdHRvbTpjYWxjKHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpIC0gdmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpLzIpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePXRvcF0+W2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7Ym9yZGVyLWJvdHRvbTp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItbGVmdDp0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpIHZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKSB2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXRvcDp0cmFuc3BhcmVudH1kaXZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1ib3R0b21dPltkYXRhLXBvcHBlci1hcnJvd117dG9wOmNhbGModmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkgLSB2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePWJvdHRvbV0+W2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7Ym9yZGVyLWJvdHRvbTp0cmFuc3BhcmVudDtib3JkZXItbGVmdDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmlnaHQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX1kaXZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1sZWZ0XT5bZGF0YS1wb3BwZXItYXJyb3dde3JpZ2h0OmNhbGModmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkgLSB2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePWxlZnRdPltkYXRhLXBvcHBlci1hcnJvd106YmVmb3Jle2JvcmRlci1ib3R0b206dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci10b3A6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpIHZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKSB2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9ZGl2W2RhdGEtcG9wcGVyLXBsYWNlbWVudF49cmlnaHRdPltkYXRhLXBvcHBlci1hcnJvd117bGVmdDpjYWxjKHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpIC0gdmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpLzIpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePXJpZ2h0XT5bZGF0YS1wb3BwZXItYXJyb3ddOmJlZm9yZXtib3JkZXItYm90dG9tOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1sZWZ0OnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yaWdodDp0cmFuc3BhcmVudDtib3JkZXItdG9wOnRyYW5zcGFyZW50fVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3V0bGluZTpub25lO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdLmZsZXh7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2t9Lm1vbnN0ZXItYmFkZ2UtcHJpbWFyeXtwYWRkaW5nOi4yNWVtIC40ZW19Lm1vbnN0ZXItYmFkZ2UtcHJpbWFyeSwubW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXJhZGl1czouMjVyZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnl7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLXNlY29uZGFyeSwubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnktcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTMpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTMpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLXNlY29uZGFyeS1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLXRlcnRpYXJ5e3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeSwubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeS1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLXRlcnRpYXJ5LXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2UtZGVzdHJ1Y3RpdmV7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZlLC5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZlLXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTEpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1vbnN0ZXItYmFkZ2UtZGVzdHJ1Y3RpdmUtcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS1zdWNjZXNze3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1zdWNjZXNzLC5tb25zdGVyLWJhZGdlLXN1Y2Nlc3MtcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1vbnN0ZXItYmFkZ2Utc3VjY2Vzcy1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLXdhcm5pbmd7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLXdhcm5pbmcsLm1vbnN0ZXItYmFkZ2Utd2FybmluZy1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS13YXJuaW5nLXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2UtZXJyb3J7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLWVycm9yLC5tb25zdGVyLWJhZGdlLWVycm9yLXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTEpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1vbnN0ZXItYmFkZ2UtZXJyb3ItcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX1bZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBidXR0b24uaGlkZGVue2Rpc3BsYXk6bm9uZX1uYXZbZGF0YS1tb25zdGVyLXJvbGU9bmF2XXthbGlnbi1pdGVtczpmbGV4LWVuZDtib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItYm90dG9tLXdpZHRoOnRoaW47Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOm5vd3JhcDttYXJnaW4tYm90dG9tOi43NXJlbTtvdmVyZmxvdzpoaWRkZW59W2RhdGEtbW9uc3Rlci1yb2xlPW5hdl0gYnV0dG9uIC5yZW1vdmUtdGFiey13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lO2FwcGVhcmFuY2U6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOnVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdjdXJyZW50Q29sb3InIHZpZXdCb3g9JzAgMCAxNiAxNiclM0UlM0NwYXRoIGQ9J000LjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDcuMjkzbDIuNjQ2LTIuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhMOC43MDcgOGwyLjY0NyAyLjY0NmEuNS41IDAgMCAxLS43MDguNzA4TDggOC43MDdsLTIuNjQ2IDIuNjQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4TDcuMjkzIDggNC42NDYgNS4zNTRhLjUuNSAwIDAgMSAwLS43MDgnLyUzRSUzQy9zdmclM0VcXFwiKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjEwMCUgMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjE2cHg7ZmxleC13cmFwOm5vd3JhcDtoZWlnaHQ6MTZweDttaW4taGVpZ2h0OjE2cHg7b3JkZXI6Mjt3aWR0aDoxNnB4fVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIGJ1dHRvbiBzcGFue2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS40O3doaXRlLXNwYWNlOnByZX1bZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBidXR0b257YWxpZ24tY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLXNlbGY6c3RyZXRjaDtib3JkZXI6bm9uZTtib3JkZXItYm90dG9tOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O21hcmdpbi1yaWdodDouNzVyZW07b3V0bGluZTpub25lO3BhZGRpbmc6LjM3NXJlbSAwO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3RyYW5zaXRpb246Y29sb3IgLjhzOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9W2RhdGEtbW9uc3Rlci1yb2xlPW5hdl0gYnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3Zlcntib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTMpfVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIGJ1dHRvbltkYXRhLW1vbnN0ZXItc3RhdGU9YWN0aXZlXSxbZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBidXR0b25bZGF0YS1tb25zdGVyLXN0YXRlPWFjdGl2ZV06bm90KFtkaXNhYmxlZF0pOmhvdmVye2JhY2tncm91bmQtY29sb3I6aW5oZXJpdDtib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpIWltcG9ydGFudH1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspe1tkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIGJ1dHRvbltkYXRhLW1vbnN0ZXItc3RhdGU9YWN0aXZlXSxbZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBidXR0b25bZGF0YS1tb25zdGVyLXN0YXRlPWFjdGl2ZV06bm90KFtkaXNhYmxlZF0pOmhvdmVye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKSFpbXBvcnRhbnR9fVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIGJ1dHRvbltkaXNhYmxlZF17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpO2N1cnNvcjpub3QtYWxsb3dlZH1bZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBidXR0b25bZGF0YS1tb25zdGVyLXJvbGU9c3dpdGNoXXthbGlnbi1zZWxmOmNlbnRlcjtib3JkZXI6MDtvcmRlcjoyO3RvdWNoLWFjdGlvbjpub25lfVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIGJ1dHRvbltkYXRhLW1vbnN0ZXItcm9sZT1zd2l0Y2hdOm5vdChbZGlzYWJsZWRdKTpob3Zlcntib3JkZXItYm90dG9tLXdpZHRoOjB9W2RhdGEtbW9uc3Rlci1yb2xlPW5hdl0gYnV0dG9uIGltZ3toZWlnaHQ6MS4zcmVtO21hcmdpbi1sZWZ0Oi40cmVtO3dpZHRoOjEuM3JlbX06OnNsb3R0ZWQoOm5vdChbc2xvdF0pOm5vdCguYWN0aXZlKSl7ZGlzcGxheTpub25lfTo6c2xvdHRlZCgqKXthbGlnbi1zZWxmOmNlbnRlcn06OnNsb3R0ZWQoW3Nsb3RdKXtib3JkZXItYm90dG9tLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKX06OnNsb3R0ZWQoW3Nsb3Q9c3RhcnRdKXttYXJnaW4tcmlnaHQ6Ljc1cmVtO29yZGVyOjB9OjpzbG90dGVkKFtzbG90PWVuZF0pe21hcmdpbi1sZWZ0Oi43NXJlbTtvcmRlcjozfVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIFtkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXItbmF2XSBidXR0b246bm90KFtkaXNhYmxlZF0pe2JvcmRlcjowO2p1c3RpZnktY29udGVudDpsZWZ0O3BhZGRpbmctbGVmdDoxNXB4O3BhZGRpbmctcmlnaHQ6MTVweDt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIFtkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXItbmF2XSBidXR0b246aG92ZXIsW2RhdGEtbW9uc3Rlci1yb2xlPW5hdl0gW2RhdGEtbW9uc3Rlci1yb2xlPXBvcHBlci1uYXZdIGJ1dHRvbltkYXRhLW1vbnN0ZXItc3RhdGU9YWN0aXZlXSxbZGF0YS1tb25zdGVyLXJvbGU9bmF2XSBbZGF0YS1tb25zdGVyLXJvbGU9cG9wcGVyLW5hdl0gYnV0dG9uW2RhdGEtbW9uc3Rlci1zdGF0ZT1hY3RpdmVdOm5vdChbZGlzYWJsZWRdKTpob3Zlcntib3JkZXI6MH1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspe1tkYXRhLW1vbnN0ZXItcm9sZT1uYXZdIFtkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXItbmF2XSBidXR0b25bZGF0YS1tb25zdGVyLXN0YXRlPWFjdGl2ZV0sW2RhdGEtbW9uc3Rlci1yb2xlPW5hdl0gW2RhdGEtbW9uc3Rlci1yb2xlPXBvcHBlci1uYXZdIGJ1dHRvbltkYXRhLW1vbnN0ZXItc3RhdGU9YWN0aXZlXTpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCkhaW1wb3J0YW50fX0gXG59YCxcblx0XHQwLFxuXHQpO1xufSBjYXRjaCAoZSkge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRkb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLFxuXHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0ZSArIFwiXCIsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBmaXJlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2V2ZW50cy5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5mdW5jdGlvbiBmaW5kU2hhZG93Um9vdChlbGVtZW50KSB7XG5cdGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsZW1lbnQ7XG5cdGlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBmZXRjaCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gZmlsdGVyIGZldGNoIG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn1cbiAqIEB0aHJvd3Mge0Vycm9yfSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFcbiAqIEB0aHJvd3Mge0Vycm9yfSBjbGllbnQgZXJyb3JcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmRlZmluZWQgc3RhdHVzIG9yIHR5cGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBsb2FkQW5kQXNzaWduQ29udGVudChlbGVtZW50LCB1cmwsIG9wdGlvbnMsIGZpbHRlcikge1xuXHRyZXR1cm4gbG9hZENvbnRlbnQodXJsLCBvcHRpb25zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuXHRcdGxldCBjb250ZW50ID0gcmVzcG9uc2UuY29udGVudDtcblxuXHRcdGlmIChpc1N0cmluZyhmaWx0ZXIpICYmIGZpbHRlciAhPT0gXCJcIikge1xuXHRcdFx0Y29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdGMuaW5uZXJIVE1MID0gY29udGVudDtcblx0XHRcdGZvciAoY29uc3QgWywgbm9kZV0gb2YgYy5xdWVyeVNlbGVjdG9yQWxsKGZpbHRlcikuZW50cmllcygpKSB7XG5cdFx0XHRcdHQuYXBwZW5kQ2hpbGQobm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRlbnQgPSB0LmlubmVySFRNTDtcblx0XHR9XG5cblx0XHRjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0LmlubmVySFRNTCA9IGNvbnRlbnQ7XG5cblx0XHRjb25zdCBzY3JpcHRzID0gdC5xdWVyeVNlbGVjdG9yQWxsKFwic2NyaXB0XCIpO1xuXHRcdGZvciAoY29uc3QgWywgc2NyaXB0XSBvZiBzY3JpcHRzLmVudHJpZXMoKSkge1xuXHRcdFx0Y29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRzLmlubmVySFRNTCA9IHNjcmlwdC5pbm5lckhUTUw7XG5cdFx0XHRpZiAoc2NyaXB0LnNyYykgcy5zcmMgPSBzY3JpcHQuc3JjO1xuXHRcdFx0aWYgKHNjcmlwdC50eXBlKSBzLnR5cGUgPSBzY3JpcHQudHlwZTtcblx0XHRcdGlmIChzY3JpcHQuYXN5bmMpIHMuYXN5bmMgPSBzY3JpcHQuYXN5bmM7XG5cdFx0XHRpZiAoc2NyaXB0LmRlZmVyKSBzLmRlZmVyID0gc2NyaXB0LmRlZmVyO1xuXHRcdFx0aWYgKHNjcmlwdC5jcm9zc09yaWdpbikgcy5jcm9zc09yaWdpbiA9IHNjcmlwdC5jcm9zc09yaWdpbjtcblx0XHRcdGlmIChzY3JpcHQuaW50ZWdyaXR5KSBzLmludGVncml0eSA9IHNjcmlwdC5pbnRlZ3JpdHk7XG5cdFx0XHRpZiAoc2NyaXB0LnJlZmVycmVyUG9saWN5KSBzLnJlZmVycmVyUG9saWN5ID0gc2NyaXB0LnJlZmVycmVyUG9saWN5O1xuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcblx0XHRcdHQucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcblx0XHR9XG5cblx0XHR2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KS5pbm5lckhUTUwgPSB0LmlubmVySFRNTDtcblxuXHRcdGNvbnN0IHJvb3QgPSBmaW5kU2hhZG93Um9vdChlbGVtZW50KTtcblx0XHRpZiAocm9vdCAhPT0gbnVsbCkge1xuXHRcdFx0ZWxlbWVudCA9IHJvb3QuaG9zdDtcblx0XHR9XG5cblx0XHRmaXJlQ3VzdG9tRXZlbnQoZWxlbWVudCwgXCJtb25zdGVyLWZldGNoZWRcIiwge1xuXHRcdFx0dXJsLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGZldGNoIG9wdGlvbnNcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn1cbiAqIEB0aHJvd3Mge0Vycm9yfSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFcbiAqIEB0aHJvd3Mge0Vycm9yfSBjbGllbnQgZXJyb3JcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmRlZmluZWQgc3RhdHVzIG9yIHR5cGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGxvYWRDb250ZW50KHVybCwgb3B0aW9ucykge1xuXHRpZiAodXJsIGluc3RhbmNlb2YgVVJMKSB7XG5cdFx0dXJsID0gdXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRyZXR1cm4gZmV0Y2godmFsaWRhdGVTdHJpbmcodXJsKSwgb3B0aW9ucykudGhlbigocmVzcG9uc2UpID0+IHtcblx0XHQvLyBUaGUgb2sgcmVhZC1vbmx5IHByb3BlcnR5IG9mIHRoZSBSZXNwb25zZSBpbnRlcmZhY2UgY29udGFpbnMgYVxuXHRcdC8vIEJvb2xlYW4gc3RhdGluZyB3aGV0aGVyIHRoZSByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bCAoc3RhdHVzIGluIHRoZSByYW5nZSAyMDAtMjk5KSBvciBub3QuXG5cdFx0aWYgKHJlc3BvbnNlPy5vayAhPT0gdHJ1ZSkge1xuXHRcdFx0Ly8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzcG9uc2UvdHlwZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXCJlcnJvclwiLCBcIm9wYXF1ZVwiLCBcIm9wYXF1ZXJlZGlyZWN0XCJdLmluZGV4T2YocmVzcG9uc2U/LnR5cGUpICE9PSAtMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgd2Ugd29uJ3QgYmUgYWJsZSB0byByZWFkIHRoZSBkYXRhICgke3Jlc3BvbnNlPy50eXBlfSlgLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzdGF0dXNDbGFzcyA9IGAke3Jlc3BvbnNlPy5zdGF0dXN9YC5zdWJzdHJpbmcoMCwgMSk7XG5cdFx0XHRzd2l0Y2ggKHN0YXR1c0NsYXNzKSB7XG5cdFx0XHRcdGNhc2UgXCI0XCI6XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBjbGllbnQgZXJyb3IgJHtyZXNwb25zZT8uc3RhdHVzVGV4dH1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0XHRgdW5kZWZpbmVkIHN0YXR1cyAoJHtyZXNwb25zZT8uc3RhdHVzfSAvICR7cmVzcG9uc2U/LnN0YXR1c1RleHR9KSBvciB0eXBlICgke3Jlc3BvbnNlPy50eXBlfSlgLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdHJlc3BvbnNlXG5cdFx0XHRcdC50ZXh0KClcblx0XHRcdFx0LnRoZW4oKGNvbnRlbnQpID0+IHtcblx0XHRcdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0XHRcdGNvbnRlbnQsXG5cdFx0XHRcdFx0XHR0eXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5leHBvcnQgeyBsb2FkQW5kQXNzaWduQ29udGVudCwgbG9hZENvbnRlbnQgfTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBUaGVtZVN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFRoZW1lU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdFRoZW1lU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciB0aGVtZSB7IFxuLm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKX0ubW9uc3Rlci10aGVtZS1lcnJvci0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTEpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtMXtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xKX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0xKX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS1kaXNhYmxlZC0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yKX0ubW9uc3Rlci10aGVtZS1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLXRoZW1lLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItdGhlbWUtZGVzdHJ1Y3RpdmUtMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yKX0ubW9uc3Rlci10aGVtZS1zdWNjZXNzLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTIpfS5tb25zdGVyLXRoZW1lLXdhcm5pbmctMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMil9Lm1vbnN0ZXItdGhlbWUtZXJyb3ItMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0yKX0ubW9uc3Rlci10aGVtZS1zZWxlY3Rpb24tMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTIpfS5tb25zdGVyLWJvcmRlci1jb2xvci0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWJvcmRlci0yKX0ubW9uc3Rlci1jb2xvci1uZXV0cmFsLTJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMil9Lm1vbnN0ZXItY29sb3Itc3VjY2Vzcy0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0yKX0ubW9uc3Rlci1jb2xvci13YXJuaW5nLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTIpfS5tb25zdGVyLWNvbG9yLWVycm9yLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMil9Lm1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktZGlzYWJsZWQtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMyl9Lm1vbnN0ZXItdGhlbWUtc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci10aGVtZS10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLXRoZW1lLWRlc3RydWN0aXZlLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMyl9Lm1vbnN0ZXItdGhlbWUtc3VjY2Vzcy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zKX0ubW9uc3Rlci10aGVtZS13YXJuaW5nLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTMpfS5tb25zdGVyLXRoZW1lLWVycm9yLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMyl9Lm1vbnN0ZXItdGhlbWUtc2VsZWN0aW9uLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKX0ubW9uc3Rlci1ib3JkZXItY29sb3ItM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ib3JkZXItMyl9Lm1vbnN0ZXItY29sb3ItbmV1dHJhbC0ze2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItY29sb3ItdGVydGlhcnktM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTMpfS5tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMyl9Lm1vbnN0ZXItY29sb3Itd2FybmluZy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0zKX0ubW9uc3Rlci1jb2xvci1lcnJvci0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTMpfS5tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNCl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KX0ubW9uc3Rlci10aGVtZS1lcnJvci00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTQpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTQpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtNHtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00KX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTQpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNCl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci00KX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1yb3ctMXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1lbGVtZW50LC5tb25zdGVyLXRoZW1lLWNvbnRyb2wtcm93LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcil9Lm1vbnN0ZXItdGhlbWUtY29udHJvbC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yKX0ubW9uc3Rlci10aGVtZS1iYWNrZ3JvdW5kLWluaGVyaXR7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0IWltcG9ydGFudH0ubW9uc3Rlci10aGVtZS1vbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tY29sb3IpfS5tb25zdGVyLXRoZW1lLW9mZntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yKTtjb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLW9mZi1jb2xvcil9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi8uLi8uLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUJvb2xlYW4gfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IHNldEV2ZW50TGlzdGVuZXJzTW9kaWZpZXJzLCBwb3BwZXJJbnN0YW5jZVN5bWJvbCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBwb3BwZXJJbnN0YW5jZVN5bWJvbCA9IFN5bWJvbChcInBvcHBlckluc3RhbmNlXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhpcyB7Q3VzdG9tRWxlbWVudH1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbW9kZVxuICovXG5mdW5jdGlvbiBzZXRFdmVudExpc3RlbmVyc01vZGlmaWVycyhtb2RlKSB7XG5cdGNvbnN0IG9wdGlvbnMgPSBleHRlbmQoe30sIHRoaXMuZ2V0T3B0aW9uKFwicG9wcGVyXCIpKTtcblx0Y29uc3QgbW9kaWZpZXJzID0gb3B0aW9ucz8uW1wibW9kaWZpZXJzXCJdO1xuXG5cdGlmICghaXNBcnJheShtb2RpZmllcnMpKSB7XG5cdFx0b3B0aW9uc1tcIm1vZGlmaWVyc1wiXSA9IFtdO1xuXHR9XG5cblx0aWYgKFxuXHRcdG9wdGlvbnNbXCJtb2RpZmllcnNcIl0uZmlsdGVyKChlbnRyeSkgPT4ge1xuXHRcdFx0aWYgKGVudHJ5Py5bXCJuYW1lXCJdID09PSBcImV2ZW50TGlzdGVuZXJzXCIpIHtcblx0XHRcdFx0Ly8gcGVyZm9ybWFuY2UgaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvdHV0b3JpYWwvI3BlcmZvcm1hbmNlXG5cdFx0XHRcdGVudHJ5W1wiZW5hYmxlZFwiXSA9IHZhbGlkYXRlQm9vbGVhbihtb2RlKTtcblx0XHRcdH1cblx0XHR9KS5sZW5ndGggPT09IDBcblx0KSB7XG5cdFx0b3B0aW9uc1tcIm1vZGlmaWVyc1wiXS5wdXNoKHtcblx0XHRcdG5hbWU6IFwiZXZlbnRMaXN0ZW5lcnNcIixcblx0XHRcdGVuYWJsZWQ6IHZhbGlkYXRlQm9vbGVhbihtb2RlKSxcblx0XHR9KTtcblx0fVxuXG5cdHRoaXNbcG9wcGVySW5zdGFuY2VTeW1ib2xdLnNldE9wdGlvbnMob3B0aW9ucyk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSBcIkBwb3BwZXJqcy9jb3JlXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBQYXRoZmluZGVyIH0gZnJvbSBcIi4uLy4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcbmltcG9ydCB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuLFxuXHRhZGRUb09iamVjdExpbmssXG5cdGhhc09iamVjdExpbmssXG59IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdEFUVFJJQlVURV9QUkVGSVgsXG5cdEFUVFJJQlVURV9ST0xFLFxufSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRDdXN0b21FbGVtZW50LFxuXHRnZXRTbG90dGVkRWxlbWVudHMsXG5cdHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHtcblx0ZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQsXG5cdGZpcmVDdXN0b21FdmVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9ldmVudHMubWpzXCI7XG5pbXBvcnQgeyBnZXREb2N1bWVudCwgZ2V0V2luZG93IH0gZnJvbSBcIi4uLy4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgcmFuZG9tIH0gZnJvbSBcIi4uLy4uL21hdGgvcmFuZG9tLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IElEIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBUb2tlbkxpc3QgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdG9rZW5saXN0Lm1qc1wiO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7IERlYWRNYW5zU3dpdGNoIH0gZnJvbSBcIi4uLy4uL3V0aWwvZGVhZG1hbnNzd2l0Y2gubWpzXCI7XG5pbXBvcnQgeyBQcm9jZXNzaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWwvcHJvY2Vzc2luZy5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9CVVRUT05fTEFCRUwsXG5cdEFUVFJJQlVURV9GT1JNX1JFTE9BRCxcblx0QVRUUklCVVRFX0ZPUk1fVVJMLFxuXHRTVFlMRV9ESVNQTEFZX01PREVfQkxPQ0ssXG59IGZyb20gXCIuLi9mb3JtL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHsgVGFic1N0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L3RhYnMubWpzXCI7XG5pbXBvcnQgeyBsb2FkQW5kQXNzaWduQ29udGVudCB9IGZyb20gXCIuLi9mb3JtL3V0aWwvZmV0Y2gubWpzXCI7XG5pbXBvcnQgeyBUaGVtZVN0eWxlU2hlZXQgfSBmcm9tIFwiLi4vc3R5bGVzaGVldC90aGVtZS5tanNcIjtcbmltcG9ydCB7XG5cdHBvcHBlckluc3RhbmNlU3ltYm9sLFxuXHRzZXRFdmVudExpc3RlbmVyc01vZGlmaWVycyxcbn0gZnJvbSBcIi4uL2Zvcm0vdXRpbC9wb3BwZXIubWpzXCI7XG5pbXBvcnQgeyBnZXRMb2NhbGVPZkRvY3VtZW50IH0gZnJvbSBcIi4uLy4uL2RvbS9sb2NhbGUubWpzXCI7XG5cbmV4cG9ydCB7IFRhYnMgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcG9wcGVyRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcInBvcHBlckVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBvcHBlck5hdkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJwb3BwZXJOYXZFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBjb250cm9sRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImNvbnRyb2xFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBuYXZFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwibmF2RWxlbWVudFwiKTtcbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHN3aXRjaEVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJzd2l0Y2hFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBjaGFuZ2VUYWJFdmVudEhhbmRsZXIgPSBTeW1ib2woXCJjaGFuZ2VUYWJFdmVudEhhbmRsZXJcIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCByZW1vdmVUYWJFdmVudEhhbmRsZXIgPSBTeW1ib2woXCJyZW1vdmVUYWJFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBvcHBlclN3aXRjaEV2ZW50SGFuZGxlciA9IFN5bWJvbChcInBvcHBlclN3aXRjaEV2ZW50SGFuZGxlclwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBjbG9zZUV2ZW50SGFuZGxlciA9IFN5bWJvbChcImNsb3NlRXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBtdXRhdGlvbk9ic2VydmVyU3ltYm9sID0gU3ltYm9sKFwibXV0YXRpb25PYnNlcnZlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgZGltZW5zaW9uc1N5bWJvbCA9IFN5bWJvbChcImRpbWVuc2lvbnNcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHRpbWVyQ2FsbGJhY2tTeW1ib2wgPSBTeW1ib2woXCJ0aW1lckNhbGxiYWNrXCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHJlc2l6ZU9ic2VydmVyU3ltYm9sID0gU3ltYm9sKFwicmVzaXplT2JzZXJ2ZXJcIik7XG5cbi8qKlxuICogQSBUYWJzIENvbnRyb2xcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9sYXlvdXQvdGFicy9cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9sYXlvdXQvdGFicy1zaW1wbGUgU2ltcGxlIFRhYnNcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2xheW91dC90YWJzLWFjdGl2ZSBBY3RpdmUgVGFic1xuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvbGF5b3V0L3RhYnMtcmVtb3ZhYmxlIFJlbW92YWJsZSBUYWJzXG4gKlxuICogQGlzc3VlIGh0dHBzOi8vbG9jYWxob3N0LmFsdmluZS5kZXY6ODQ0My9kZXZlbG9wbWVudC9pc3N1ZXMvY2xvc2VkLzI2OC5odG1sXG4gKiBAaXNzdWUgaHR0cHM6Ly9sb2NhbGhvc3QuYWx2aW5lLmRldjo4NDQzL2RldmVsb3BtZW50L2lzc3Vlcy9jbG9zZWQvMjcxLmh0bWxcbiAqIEBpc3N1ZSBodHRwczovL2xvY2FsaG9zdC5hbHZpbmUuZGV2Ojg0NDMvZGV2ZWxvcG1lbnQvaXNzdWVzL2Nsb3NlZC8yNzMuaHRtbFxuICpcbiAqIEBzaW5jZSAzLjc0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGlzIEN1c3RvbUNvbnRyb2wgY3JlYXRlcyBhIHRhYiBlbGVtZW50IHdpdGggYSB2YXJpZXR5IG9mIG9wdGlvbnMuXG4gKi9cbmNsYXNzIFRhYnMgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbXBvbmVudHMvbGF5b3V0L3RhYnNcIik7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCB0YWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsYWJlbHNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5uZXctdGFiLWxhYmVsPVwiTmV3IFRhYlwiXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZWF0dXJlc1xuXHQgKiBAcHJvcGVydHkge251bWJlcn0gZmVhdHVyZXMub3BlbkRlbGF5PTUwMCBPcGVuIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gZmVhdHVyZXMucmVtb3ZlQmVoYXZpb3I9XCJhdXRvXCIgUmVtb3ZlIGJlaGF2aW9yLCBhdXRvIChkZWZhdWx0KSwgbmV4dCwgcHJldmlvdXMgYW5kIG5vbmVcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy5vcGVuRmlyc3Q9dHJ1ZSBPcGVuIHRoZSBmaXJzdCB0YWJcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoIEZldGNoIFtzZWUgVXNpbmcgRmV0Y2ggbW96aWxsYS5vcmddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkvVXNpbmdfRmV0Y2gpXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5yZWRpcmVjdD1lcnJvclxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubWV0aG9kPUdFVFxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubW9kZT1zYW1lLW9yaWdpblxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2guY3JlZGVudGlhbHM9c2FtZS1vcmlnaW5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoLmhlYWRlcnM9e1wiYWNjZXB0XCI6XCJ0ZXh0L2h0bWxcIn19XG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwb3BwZXIgW1BvcHBlckpTIE9wdGlvbnNdKGh0dHBzOi8vcG9wcGVyLmpzLm9yZy9kb2NzL3YyLylcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHBvcHBlci5wbGFjZW1lbnQ9Ym90dG9tIFBvcHBlckpTIHBsYWNlbWVudFxuXHQgKiBAcHJvcGVydHkge09iamVjdFtdfSBtb2RpZmllcnM9e25hbWU6b2Zmc2V0fSBQb3BwZXJKUyBwbGFjZW1lbnRcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0fSxcblx0XHRcdGxhYmVsczogZ2V0VHJhbnNsYXRpb25zKCksXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdHN0YW5kYXJkOiBbXSxcblx0XHRcdFx0cG9wcGVyOiBbXSxcblx0XHRcdH0sXG5cdFx0XHRmZXRjaDoge1xuXHRcdFx0XHRyZWRpcmVjdDogXCJlcnJvclwiLFxuXHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdG1vZGU6IFwic2FtZS1vcmlnaW5cIixcblx0XHRcdFx0Y3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIixcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdGFjY2VwdDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cblx0XHRcdGZlYXR1cmVzOiB7XG5cdFx0XHRcdG9wZW5EZWxheTogbnVsbCxcblx0XHRcdFx0cmVtb3ZlQmVoYXZpb3I6IFwiYXV0b1wiLFxuXHRcdFx0XHRvcGVuRmlyc3Q6IHRydWUsXG5cdFx0XHR9LFxuXG5cdFx0XHRjbGFzc2VzOiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJtb25zdGVyLXRoZW1lLXByaW1hcnktMVwiLFxuXHRcdFx0XHRwb3BwZXI6IFwibW9uc3Rlci10aGVtZS1wcmltYXJ5LTFcIixcblx0XHRcdFx0bmF2aWdhdGlvbjogXCJtb25zdGVyLXRoZW1lLXByaW1hcnktMVwiLFxuXHRcdFx0fSxcblxuXHRcdFx0cG9wcGVyOiB7XG5cdFx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdFx0bW9kaWZpZXJzOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCJvZmZzZXRcIixcblx0XHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0b2Zmc2V0OiBbMCwgMl0sXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcImV2ZW50TGlzdGVuZXJzXCIsXG5cdFx0XHRcdFx0XHRlbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXG5cdFx0dGhpc1tkaW1lbnNpb25zU3ltYm9sXSA9IG5ldyBQYXRoZmluZGVyKHsgZGF0YToge30gfSk7XG5cblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cblx0XHQvLyBzZXR1cCBzdHJ1Y3R1cmVcblx0XHRpbml0VGFiQnV0dG9ucy5jYWxsKHRoaXMpLnRoZW4oKCkgPT4ge1xuXHRcdFx0aW5pdFBvcHBlclN3aXRjaC5jYWxsKHRoaXMpO1xuXHRcdFx0aW5pdFBvcHBlci5jYWxsKHRoaXMpO1xuXHRcdFx0YXR0YWNoUmVzaXplT2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0XHRcdGF0dGFjaFRhYkNoYW5nZU9ic2VydmVyLmNhbGwodGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICpcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtUYWJzU3R5bGVTaGVldF07XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFRhZygpIHtcblx0XHRyZXR1cm4gXCJtb25zdGVyLXRhYnNcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGZ1bmN0aW9uIHRoYXQgYWN0aXZhdGVzIGEgdGFiIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBuYW1lLlxuXHQgKlxuXHQgKiBUaGUgdGFicyBoYXZlIHRvIGJlIG5hbWVkIHdpdGggdGhlIGBkYXRhLW1vbnN0ZXItbmFtZWAgYXR0cmlidXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3R5cGV9IGlkT3JOYW1lIC0gdGhlIG5hbWUgb3IgaWQgb2YgdGhlIHRhYiB0byBhY3RpdmF0ZVxuXHQgKiBAcmV0dXJuIHtUYWJzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlXG5cdCAqL1xuXHRhY3RpdmVUYWIoaWRPck5hbWUpIHtcblx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblxuXHRcdGdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHRoaXMpLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRcdGlmIChmb3VuZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChub2RlLmdldEF0dHJpYnV0ZShcImRhdGEtbW9uc3Rlci1uYW1lXCIpID09PSBpZE9yTmFtZSkge1xuXHRcdFx0XHR0aGlzLnNoYWRvd1Jvb3Rcblx0XHRcdFx0XHQucXVlcnlTZWxlY3Rvcihcblx0XHRcdFx0XHRcdGBbZGF0YS1tb25zdGVyLXRhYi1yZWZlcmVuY2U9XCIke25vZGUuZ2V0QXR0cmlidXRlKFwiaWRcIil9XCJdYCxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LmNsaWNrKCk7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5vZGUuZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGlkT3JOYW1lKSB7XG5cdFx0XHRcdHRoaXMuc2hhZG93Um9vdFxuXHRcdFx0XHRcdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XHRcdFx0YFtkYXRhLW1vbnN0ZXItdGFiLXJlZmVyZW5jZT1cIiR7bm9kZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKX1cIl1gLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQuY2xpY2soKTtcblx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWUgb3IgaWQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLlxuXHQgKlxuXHQgKiBUaGUgdGFicyBoYXZlIHRvIGJlIG5hbWVkIHdpdGggdGhlIGBkYXRhLW1vbnN0ZXItbmFtZWAgYXR0cmlidXRlLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cblx0ICovXG5cdGdldEFjdGl2ZVRhYigpIHtcblx0XHRjb25zdCBub2RlcyA9IGdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHRoaXMpO1xuXHRcdGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuXHRcdFx0aWYgKG5vZGUubWF0Y2hlcyhcIi5hY3RpdmVcIikgPT09IHRydWUpIHtcblx0XHRcdFx0aWYgKG5vZGUuaGFzQXR0cmlidXRlKFwiZGF0YS1tb25zdGVyLW5hbWVcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1vbnN0ZXItbmFtZVwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRvbSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG5cdFx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG5cdFx0Zm9yIChjb25zdCBbLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyhbXCJjbGlja1wiLCBcInRvdWNoXCJdKSkge1xuXHRcdFx0Ly8gY2xvc2Ugb24gb3V0c2lkZSB1aS1ldmVudHNcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc1tjbG9zZUV2ZW50SGFuZGxlcl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRvbSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG5cdFx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG5cdFx0Ly8gY2xvc2Ugb24gb3V0c2lkZSB1aS1ldmVudHNcblx0XHRmb3IgKGNvbnN0IFssIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKFtcImNsaWNrXCIsIFwidG91Y2hcIl0pKSB7XG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbY2xvc2VFdmVudEhhbmRsZXJdKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkge1xuXHRjb25zdCBsb2NhbGUgPSBnZXRMb2NhbGVPZkRvY3VtZW50KCk7XG5cdHN3aXRjaCAobG9jYWxlLmxhbmd1YWdlKSB7XG5cdFx0Y2FzZSBcImRlXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcIm5ldy10YWItbGFiZWxcIjogXCJOZXVlciBUYWJcIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcImZyXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcIm5ldy10YWItbGFiZWxcIjogXCJOb3V2ZWwgT25nbGV0XCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJzcFwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJuZXctdGFiLWxhYmVsXCI6IFwiTnVldmEgUGVzdGFcdTAwRjFhXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJpdFwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJuZXctdGFiLWxhYmVsXCI6IFwiTnVvdmEgU2NoZWRhXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJwbFwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJuZXctdGFiLWxhYmVsXCI6IFwiTm93YSBLYXJ0YVwiLFxuXHRcdFx0fTtcblx0XHRjYXNlIFwibm9cIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwibmV3LXRhYi1sYWJlbFwiOiBcIk55IEZhbmVcIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcImRrXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcIm5ldy10YWItbGFiZWxcIjogXCJOeSBGYW5lXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJzd1wiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJuZXctdGFiLWxhYmVsXCI6IFwiTnkgRmxpa1wiLFxuXHRcdFx0fTtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgXCJlblwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJuZXctdGFiLWxhYmVsXCI6IFwiTmV3IFRhYlwiLFxuXHRcdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRQb3BwZXJTd2l0Y2goKSB7XG5cdGNvbnN0IG5vZGVzID0gZ2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwodGhpcywgYFske0FUVFJJQlVURV9ST0xFfT1cInN3aXRjaFwiXWApOyAvLyBudWxsIFx1MjFBNiBvbmx5IHVubmFtZWQgc2xvdHNcblx0bGV0IHN3aXRjaEJ1dHRvbjtcblx0aWYgKG5vZGVzLnNpemUgPT09IDApIHtcblx0XHRzd2l0Y2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuXHRcdHN3aXRjaEJ1dHRvbi5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUsIFwic3dpdGNoXCIpO1xuXHRcdHN3aXRjaEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJwYXJ0XCIsIFwic3dpdGNoXCIpO1xuXHRcdHN3aXRjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXHRcdGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5idXR0b25cIik7XG5cdFx0aWYgKGNsYXNzTGlzdCkge1xuXHRcdFx0c3dpdGNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoY2xhc3NMaXN0KTtcblx0XHR9XG5cdFx0c3dpdGNoQnV0dG9uLmlubmVySFRNTCA9XG5cdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj48cGF0aCBkPVwiTTkuNSAxM2ExLjUgMS41IDAgMSAxLTMgMCAxLjUgMS41IDAgMCAxIDMgMHptMC01YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwem0wLTVhMS41IDEuNSAwIDEgMS0zIDAgMS41IDEuNSAwIDAgMSAzIDB6XCIvPjwvc3ZnPic7XG5cdFx0dGhpc1tuYXZFbGVtZW50U3ltYm9sXS5wcmVwZW5kKHN3aXRjaEJ1dHRvbik7XG5cdH0gZWxzZSB7XG5cdFx0c3dpdGNoQnV0dG9uID0gbm9kZXMubmV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHR0aGlzW3BvcHBlclN3aXRjaEV2ZW50SGFuZGxlcl0gPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBlbGVtZW50ID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoZXZlbnQsIEFUVFJJQlVURV9ST0xFLCBcInN3aXRjaFwiKTtcblxuXHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcblx0XHRcdHRvZ2dsZVBvcHBlci5jYWxsKHRoaXMpO1xuXHRcdH1cblx0fTtcblxuXHRmb3IgKGNvbnN0IHR5cGUgb2YgW1wiY2xpY2tcIiwgXCJ0b3VjaFwiXSkge1xuXHRcdHN3aXRjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbcG9wcGVyU3dpdGNoRXZlbnRIYW5kbGVyXSk7XG5cdH1cblxuXHR0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdID0gc3dpdGNoQnV0dG9uO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGhpZGVQb3BwZXIoKSB7XG5cdGlmICghdGhpc1twb3BwZXJJbnN0YW5jZVN5bWJvbF0pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0Ly8gcGVyZm9ybWFuY2UgaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvdHV0b3JpYWwvI3BlcmZvcm1hbmNlXG5cdHNldEV2ZW50TGlzdGVuZXJzTW9kaWZpZXJzLmNhbGwodGhpcywgZmFsc2UpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3dQb3BwZXIoKSB7XG5cdGlmICh0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgPT09IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSA9IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSztcblx0Ly8gcGVyZm9ybWFuY2UgaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvdHV0b3JpYWwvI3BlcmZvcm1hbmNlXG5cdHNldEV2ZW50TGlzdGVuZXJzTW9kaWZpZXJzLmNhbGwodGhpcywgdHJ1ZSk7XG5cblx0dGhpc1twb3BwZXJJbnN0YW5jZVN5bWJvbF0udXBkYXRlKCk7XG5cblx0bmV3IFByb2Nlc3NpbmcoKCkgPT4ge1xuXHRcdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ2aXNpYmlsaXR5XCIpO1xuXHR9KVxuXHRcdC5ydW4odW5kZWZpbmVkKVxuXHRcdC50aGVuKCgpID0+IHt9KVxuXHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlKTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0b2dnbGVQb3BwZXIoKSB7XG5cdGlmICh0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgPT09IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSykge1xuXHRcdGhpZGVQb3BwZXIuY2FsbCh0aGlzKTtcblx0fSBlbHNlIHtcblx0XHRzaG93UG9wcGVyLmNhbGwodGhpcyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhdHRhY2hSZXNpemVPYnNlcnZlcigpIHtcblx0Ly8gYWdhaW5zdCBmbGlja2VyaW5nXG5cdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG5cdFx0aWYgKHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0gaW5zdGFuY2VvZiBEZWFkTWFuc1N3aXRjaCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXS50b3VjaCgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0gPSBuZXcgRGVhZE1hbnNTd2l0Y2goMjAwLCAoKSA9PiB7XG5cdFx0XHR0aGlzW2RpbWVuc2lvbnNTeW1ib2xdLnNldFZpYShcImRhdGEuY2FsY3VsYXRlZFwiLCBmYWxzZSk7XG5cdFx0XHRjaGVja0FuZFJlYXJyYW5nZUJ1dHRvbnMuY2FsbCh0aGlzKTtcblx0XHR9KTtcblx0fSk7XG5cblx0dGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0ub2JzZXJ2ZSh0aGlzW25hdkVsZW1lbnRTeW1ib2xdKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhdHRhY2hUYWJDaGFuZ2VPYnNlcnZlcigpIHtcblx0Ly8gYWdhaW5zdCBmbGlja2VyaW5nXG5cdG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcblx0XHRsZXQgcnVuVXBkYXRlID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuXHRcdFx0aWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCB8fFxuXHRcdFx0XHRcdG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJ1blVwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocnVuVXBkYXRlID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzW2RpbWVuc2lvbnNTeW1ib2xdLnNldFZpYShcImRhdGEuY2FsY3VsYXRlZFwiLCBmYWxzZSk7XG5cdFx0XHRpbml0VGFiQnV0dG9ucy5jYWxsKHRoaXMpO1xuXHRcdH1cblx0fSkub2JzZXJ2ZSh0aGlzLCB7XG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICogQGV4dGVybmFsIFwiZXh0ZXJuYWw6Y3JlYXRlUG9wcGVyXCJcbiAqL1xuZnVuY3Rpb24gaW5pdFBvcHBlcigpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0Y29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7fSwgc2VsZi5nZXRPcHRpb24oXCJwb3BwZXJcIikpO1xuXG5cdHNlbGZbcG9wcGVySW5zdGFuY2VTeW1ib2xdID0gY3JlYXRlUG9wcGVyKFxuXHRcdHNlbGZbc3dpdGNoRWxlbWVudFN5bWJvbF0sXG5cdFx0c2VsZltwb3BwZXJFbGVtZW50U3ltYm9sXSxcblx0XHRvcHRpb25zLFxuXHQpO1xuXG5cdGNvbnN0IG9ic2VydmVyMSA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcblx0XHRsZXQgcnVuVXBkYXRlID0gZmFsc2U7XG5cdFx0Zm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcblx0XHRcdGlmIChtdXRhdGlvbi50eXBlID09PSBcImNoaWxkTGlzdFwiKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCA+IDAgfHxcblx0XHRcdFx0XHRtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRydW5VcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJ1blVwZGF0ZSA9PT0gdHJ1ZSkge1xuXHRcdFx0c2VsZltwb3BwZXJJbnN0YW5jZVN5bWJvbF0udXBkYXRlKCk7XG5cdFx0fVxuXHR9KTtcblxuXHRvYnNlcnZlcjEub2JzZXJ2ZShzZWxmW3BvcHBlck5hdkVsZW1lbnRTeW1ib2xdLCB7XG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHRcdHN1YnRyZWU6IHRydWUsXG5cdH0pO1xuXG5cdHJldHVybiBzZWxmO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNob3coZWxlbWVudCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHRjb25zdCByZWZlcmVuY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShgJHtBVFRSSUJVVEVfUFJFRklYfXRhYi1yZWZlcmVuY2VgKTtcblxuXHRjb25zdCBub2RlcyA9IGdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHRoaXMpO1xuXHRmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcblx0XHRjb25zdCBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cblx0XHRpZiAoaWQgPT09IHJlZmVyZW5jZSkge1xuXHRcdFx0bm9kZS5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXG5cdFx0XHRjb25zdCBvcGVuRGVsYXkgPSBwYXJzZUludCh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLm9wZW5EZWxheVwiKSwgMTApO1xuXG5cdFx0XHRpZiAoIWlzTmFOKG9wZW5EZWxheSkgJiYgb3BlbkRlbGF5ID4gMCkge1xuXHRcdFx0XHRub2RlLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdG5vZGUuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuXHRcdFx0XHR9LCBvcGVuRGVsYXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBnZXQgYWxsIGRhdGEtIGZyb20gYnV0dG9uIGFuZCBmaWx0ZXIgb3V0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzIGFuZCBkYXRhLW1vbnN0ZXItaW5zZXJ0XG5cdFx0XHRjb25zdCBkYXRhID0ge307XG5cdFx0XHRjb25zdCBtYXNrID0gW1xuXHRcdFx0XHRcImRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzXCIsXG5cdFx0XHRcdFwiZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2VcIixcblx0XHRcdFx0XCJkYXRhLW1vbnN0ZXItc3RhdGVcIixcblx0XHRcdFx0XCJkYXRhLW1vbnN0ZXItYnV0dG9uLWxhYmVsXCIsXG5cdFx0XHRcdFwiZGF0YS1tb25zdGVyLW9iamVjdGxpbmtcIixcblx0XHRcdFx0XCJkYXRhLW1vbnN0ZXItcm9sZVwiLFxuXHRcdFx0XTtcblxuXHRcdFx0Zm9yIChjb25zdCBbLCBhdHRyXSBvZiBPYmplY3QuZW50cmllcyhub2RlLmF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdGlmIChhdHRyLm5hbWUuc3RhcnRzV2l0aChcImRhdGEtXCIpICYmIG1hc2suaW5kZXhPZihhdHRyLm5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRcdGRhdGFbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9GT1JNX1VSTCkpIHtcblx0XHRcdFx0Y29uc3QgdXJsID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fVVJMKTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IW5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9GT1JNX1JFTE9BRCkgfHxcblx0XHRcdFx0XHRub2RlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRk9STV9SRUxPQUQpLnRvTG93ZXJDYXNlKCkgPT09IFwib25zaG93XCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0bm9kZS5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fVVJMKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcImZldGNoXCIsIHt9KTtcblx0XHRcdFx0Y29uc3QgZmlsdGVyID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRsb2FkQW5kQXNzaWduQ29udGVudChub2RlLCB1cmwsIG9wdGlvbnMsIGZpbHRlcilcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLXRhYi1jaGFuZ2VkXCIsIHtcblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLXRhYi1jaGFuZ2VkXCIsIHtcblx0XHRcdFx0XHRyZWZlcmVuY2UsXG5cdFx0XHRcdFx0ZGF0YSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vZGUuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBzdGFuZGFyZEJ1dHRvbnMgPSB0aGlzLmdldE9wdGlvbihcImJ1dHRvbnMuc3RhbmRhcmRcIik7XG5cdGZvciAoY29uc3QgaW5kZXggaW4gc3RhbmRhcmRCdXR0b25zKSB7XG5cdFx0Y29uc3QgYnV0dG9uID0gc3RhbmRhcmRCdXR0b25zW2luZGV4XTtcblx0XHRjb25zdCBzdGF0ZSA9IGJ1dHRvbltcInJlZmVyZW5jZVwiXSA9PT0gcmVmZXJlbmNlID8gXCJhY3RpdmVcIiA6IFwiaW5hY3RpdmVcIjtcblx0XHR0aGlzLnNldE9wdGlvbihgYnV0dG9ucy5zdGFuZGFyZC4ke2luZGV4fS5zdGF0ZWAsIHN0YXRlKTtcblx0fVxuXG5cdGNvbnN0IHBvcHBlckJ1dHRvbiA9IHRoaXMuZ2V0T3B0aW9uKFwiYnV0dG9ucy5wb3BwZXJcIik7XG5cdGZvciAoY29uc3QgaW5kZXggaW4gcG9wcGVyQnV0dG9uKSB7XG5cdFx0Y29uc3QgYnV0dG9uID0gcG9wcGVyQnV0dG9uW2luZGV4XTtcblx0XHRjb25zdCBzdGF0ZSA9IGJ1dHRvbltcInJlZmVyZW5jZVwiXSA9PT0gcmVmZXJlbmNlID8gXCJhY3RpdmVcIiA6IFwiaW5hY3RpdmVcIjtcblx0XHR0aGlzLnNldE9wdGlvbihgYnV0dG9ucy5wb3BwZXIuJHtpbmRleH0uc3RhdGVgLCBzdGF0ZSk7XG5cdH1cblxuXHRoaWRlUG9wcGVyLmNhbGwodGhpcyk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50SGFuZGxlcigpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEBmaXJlcyBtb25zdGVyLXRhYi1yZW1vdmVcblx0ICovXG5cdHRoaXNbcmVtb3ZlVGFiRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChcblx0XHRcdGV2ZW50LFxuXHRcdFx0QVRUUklCVVRFX1JPTEUsXG5cdFx0XHRcInJlbW92ZS10YWJcIixcblx0XHQpO1xuXG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgYnV0dG9uID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoXG5cdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRBVFRSSUJVVEVfUk9MRSxcblx0XHRcdFx0XCJidXR0b25cIixcblx0XHRcdCk7XG5cblx0XHRcdGlmIChidXR0b24gaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCAmJiBidXR0b24uZGlzYWJsZWQgIT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgcmVmZXJlbmNlID0gYnV0dG9uLmdldEF0dHJpYnV0ZShcblx0XHRcdFx0XHRgJHtBVFRSSUJVVEVfUFJFRklYfXRhYi1yZWZlcmVuY2VgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGxldCBkb0NoYW5nZSA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgbmV4dE5hbWUgPSBudWxsO1xuXHRcdFx0XHRsZXQgcHJldmlvdXNOYW1lID0gbnVsbDtcblxuXHRcdFx0XHRjb25zdCBidG4gPSB0aGlzLmdldE9wdGlvbihcImJ1dHRvbnNcIik7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYnRuLnN0YW5kYXJkLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKGJ0bi5zdGFuZGFyZFtpXS5yZWZlcmVuY2UgPT09IHJlZmVyZW5jZSkge1xuXHRcdFx0XHRcdFx0aWYgKGJ0bi5zdGFuZGFyZFtpXS5zdGF0ZSA9PT0gXCJhY3RpdmVcIikge1xuXHRcdFx0XHRcdFx0XHRkb0NoYW5nZSA9IGk7XG5cdFx0XHRcdFx0XHRcdGlmIChpIDwgYnRuLnN0YW5kYXJkLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHRuZXh0TmFtZSA9IGJ0bi5zdGFuZGFyZFtpICsgMV0/LnJlZmVyZW5jZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRwcmV2aW91c05hbWUgPSBidG4uc3RhbmRhcmRbaSAtIDFdPy5yZWZlcmVuY2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZD0ke3JlZmVyZW5jZX1dYCk7XG5cdFx0XHRcdFx0aWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRpZiAoZG9DaGFuZ2UpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLnJlbW92ZUJlaGF2aW9yXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImF1dG9cIjpcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXh0TmFtZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZWxmLmFjdGl2ZVRhYihuZXh0TmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJldmlvdXNOYW1lICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2VsZi5hY3RpdmVUYWIocHJldmlvdXNOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5leHRcIjpcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXh0TmFtZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZWxmLmFjdGl2ZVRhYihuZXh0TmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicHJldmlvdXNcIjpcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcmV2aW91c05hbWUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2VsZi5hY3RpdmVUYWIocHJldmlvdXNOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDogLy8gYW5kIFwibm9uZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb250YWluZXIucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRpbml0VGFiQnV0dG9ucy5jYWxsKHRoaXMpO1xuXHRcdFx0XHRcdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci10YWItcmVtb3ZlXCIsIHtcblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKi9cblx0dGhpc1tjaGFuZ2VUYWJFdmVudEhhbmRsZXJdID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KGV2ZW50LCBBVFRSSUJVVEVfUk9MRSwgXCJidXR0b25cIik7XG5cblx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50ICYmIGVsZW1lbnQuZGlzYWJsZWQgIT09IHRydWUpIHtcblx0XHRcdHNob3cuY2FsbCh0aGlzLCBlbGVtZW50KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHR0aGlzW2Nsb3NlRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuXHRcdGZvciAoY29uc3QgWywgZWxlbWVudF0gb2YgT2JqZWN0LmVudHJpZXMocGF0aCkpIHtcblx0XHRcdGlmIChlbGVtZW50ID09PSB0aGlzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoaWRlUG9wcGVyLmNhbGwodGhpcyk7XG5cdH07XG5cblx0Ly8gdGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgcmVtb3ZlIG11c3QgYmUgYmVmb3JlIHRoZSBjaGFuZ2Vcblx0dGhpc1tuYXZFbGVtZW50U3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hcIiwgdGhpc1tyZW1vdmVUYWJFdmVudEhhbmRsZXJdKTtcblx0dGhpc1tuYXZFbGVtZW50U3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpc1tyZW1vdmVUYWJFdmVudEhhbmRsZXJdKTtcblxuXHR0aGlzW25hdkVsZW1lbnRTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaFwiLCB0aGlzW2NoYW5nZVRhYkV2ZW50SGFuZGxlcl0pO1xuXHR0aGlzW25hdkVsZW1lbnRTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzW2NoYW5nZVRhYkV2ZW50SGFuZGxlcl0pO1xuXG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gb2JzZXJ2ZWROb2RlXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaFRhYk11dGF0aW9uT2JzZXJ2ZXIob2JzZXJ2ZWROb2RlKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdGlmIChoYXNPYmplY3RMaW5rKG9ic2VydmVkTm9kZSwgbXV0YXRpb25PYnNlcnZlclN5bWJvbCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogdGhpcyBjb25zdHJ1Y3QgbW9uaXRvcnMgYSBub2RlIHdoZXRoZXIgaXQgaXMgZGlzYWJsZWQgb3IgbW9kaWZpZWRcblx0ICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9XG5cdCAqL1xuXHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcblx0XHRpZiAoaXNBcnJheShtdXRhdGlvbnMpKSB7XG5cdFx0XHRjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9ucy5wb3AoKTtcblx0XHRcdGlmIChtdXRhdGlvbiBpbnN0YW5jZW9mIE11dGF0aW9uUmVjb3JkKSB7XG5cdFx0XHRcdGluaXRUYWJCdXR0b25zLmNhbGwoc2VsZik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRvYnNlcnZlci5vYnNlcnZlKG9ic2VydmVkTm9kZSwge1xuXHRcdGNoaWxkTGlzdDogZmFsc2UsXG5cdFx0YXR0cmlidXRlczogdHJ1ZSxcblx0XHRzdWJ0cmVlOiBmYWxzZSxcblx0XHRhdHRyaWJ1dGVGaWx0ZXI6IFtcblx0XHRcdFwiZGlzYWJsZWRcIixcblx0XHRcdEFUVFJJQlVURV9CVVRUT05fTEFCRUwsXG5cdFx0XHRgJHtBVFRSSUJVVEVfUFJFRklYfWJ1dHRvbi1pY29uYCxcblx0XHRdLFxuXHR9KTtcblxuXHRhZGRUb09iamVjdExpbmsob2JzZXJ2ZWROb2RlLCBtdXRhdGlvbk9ic2VydmVyU3ltYm9sLCBvYnNlcnZlcik7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGluaXRDb250cm9sUmVmZXJlbmNlcygpIHtcblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0dGhpc1tjb250cm9sRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PWNvbnRyb2xdYCxcblx0KTtcblx0dGhpc1tuYXZFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBuYXZbJHtBVFRSSUJVVEVfUk9MRX09bmF2XWAsXG5cdCk7XG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PXBvcHBlcl1gLFxuXHQpO1xuXHR0aGlzW3BvcHBlck5hdkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1wb3BwZXItbmF2XWAsXG5cdCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1Byb21pc2U8dW5rbm93bj59XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICpcbiAqL1xuZnVuY3Rpb24gaW5pdFRhYkJ1dHRvbnMoKSB7XG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdGxldCBhY3RpdmVSZWZlcmVuY2U7XG5cblx0Y29uc3QgZGltZW5zaW9uc0NhbGN1bGF0ZWQgPSB0aGlzW2RpbWVuc2lvbnNTeW1ib2xdLmdldFZpYShcblx0XHRcImRhdGEuY2FsY3VsYXRlZFwiLFxuXHRcdGZhbHNlLFxuXHQpO1xuXG5cdGNvbnN0IGJ1dHRvbnMgPSBbXTtcblx0Y29uc3Qgbm9kZXMgPSBnZXRTbG90dGVkRWxlbWVudHMuY2FsbCh0aGlzLCB1bmRlZmluZWQsIG51bGwpOyAvLyBudWxsIFx1MjFBNiBvbmx5IHVubmFtZWQgc2xvdHNcblxuXHRmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcblx0XHRpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSBjb250aW51ZTtcblx0XHRsZXQgbGFiZWwgPSBnZXRCdXR0b25MYWJlbC5jYWxsKHRoaXMsIG5vZGUpO1xuXG5cdFx0bGV0IHJlZmVyZW5jZTtcblx0XHRpZiAobm9kZS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuXHRcdFx0cmVmZXJlbmNlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHR9XG5cblx0XHRsZXQgZGlzYWJsZWQ7XG5cdFx0aWYgKG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgbm9kZS5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuXHRcdFx0ZGlzYWJsZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghcmVmZXJlbmNlKSB7XG5cdFx0XHRyZWZlcmVuY2UgPSBuZXcgSUQoXCJ0YWJcIikudG9TdHJpbmcoKTtcblx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgcmVmZXJlbmNlKTtcblx0XHR9XG5cblx0XHRpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYCR7QVRUUklCVVRFX1BSRUZJWH1idXR0b24taWNvbmApKSB7XG5cdFx0XHRsYWJlbCA9IGA8c3BhbiBwYXJ0PVwibGFiZWxcIj4ke2xhYmVsfTwvc3Bhbj48aW1nIHBhcnQ9XCJpY29uXCIgYWx0PVwidGhpcyBpcyBhbiBpY29uXCIgc3JjPVwiJHtub2RlLmdldEF0dHJpYnV0ZShcblx0XHRcdFx0YCR7QVRUUklCVVRFX1BSRUZJWH1idXR0b24taWNvbmAsXG5cdFx0XHQpfVwiPmA7XG5cdFx0fVxuXG5cdFx0bGV0IHJlbW92ZSA9IGZhbHNlO1xuXHRcdGlmIChub2RlLmhhc0F0dHJpYnV0ZShgJHtBVFRSSUJVVEVfUFJFRklYfXJlbW92YWJsZWApKSB7XG5cdFx0XHRyZW1vdmUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChub2RlLm1hdGNoZXMoXCIuYWN0aXZlXCIpID09PSB0cnVlICYmIGRpc2FibGVkICE9PSB0cnVlKSB7XG5cdFx0XHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG5cdFx0XHRhY3RpdmVSZWZlcmVuY2UgPSByZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc3RhdGUgPSBcIlwiO1xuXHRcdGNvbnN0IGNsYXNzZXMgPSBkaW1lbnNpb25zQ2FsY3VsYXRlZCA/IFwiXCIgOiBcImludmlzaWJsZVwiO1xuXG5cdFx0YnV0dG9ucy5wdXNoKHtcblx0XHRcdHJlZmVyZW5jZSxcblx0XHRcdGxhYmVsLFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRjbGFzczogY2xhc3Nlcyxcblx0XHRcdGRpc2FibGVkLFxuXHRcdFx0cmVtb3ZlLFxuXHRcdH0pO1xuXG5cdFx0YXR0YWNoVGFiTXV0YXRpb25PYnNlcnZlci5jYWxsKHRoaXMsIG5vZGUpO1xuXHR9XG5cblx0dGhpcy5zZXRPcHRpb24oXCJidXR0b25zLnN0YW5kYXJkXCIsIGNsb25lKGJ1dHRvbnMpKTtcblx0dGhpcy5zZXRPcHRpb24oXCJidXR0b25zLnBvcHBlclwiLCBbXSk7XG5cdHRoaXMuc2V0T3B0aW9uKFwibWFya2VyXCIsIHJhbmRvbSgpKTtcblxuXHRyZXR1cm4gYWRqdXN0QnV0dG9uVmlzaWJpbGl0eS5jYWxsKHRoaXMpLnRoZW4oKCkgPT4ge1xuXHRcdGlmICghYWN0aXZlUmVmZXJlbmNlICYmIHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMub3BlbkZpcnN0XCIpID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBmaXJzdEJ1dHRvbiA9IHRoaXMuZ2V0T3B0aW9uKFwiYnV0dG9ucy5zdGFuZGFyZFwiKS5maW5kKFxuXHRcdFx0XHQoYnV0dG9uKSA9PiBidXR0b24uZGlzYWJsZWQgIT09IHRydWUsXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGZpcnN0QnV0dG9uKSB7XG5cdFx0XHRcdGFjdGl2ZVJlZmVyZW5jZSA9IGZpcnN0QnV0dG9uLnJlZmVyZW5jZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYWN0aXZlUmVmZXJlbmNlKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb2Nlc3NpbmcoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBidXR0b24gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRcdFx0XHRgWyR7QVRUUklCVVRFX1BSRUZJWH10YWItcmVmZXJlbmNlPVwiJHthY3RpdmVSZWZlcmVuY2V9XCJdYCxcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGJ1dHRvbiBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50ICYmIGJ1dHRvbi5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHNob3cuY2FsbCh0aGlzLCBidXR0b24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0XHQucnVuKHVuZGVmaW5lZClcblx0XHRcdFx0LnRoZW4oKCkgPT4ge30pXG5cdFx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kUmVhcnJhbmdlQnV0dG9ucygpIHtcblx0aWYgKHRoaXNbZGltZW5zaW9uc1N5bWJvbF0uZ2V0VmlhKFwiZGF0YS5jYWxjdWxhdGVkXCIsIGZhbHNlKSAhPT0gdHJ1ZSkge1xuXHRcdGNhbGN1bGF0ZU5hdmlnYXRpb25CdXR0b25zRGltZW5zaW9ucy5jYWxsKHRoaXMpO1xuXHR9XG5cblx0cmVhcnJhbmdlQnV0dG9ucy5jYWxsKHRoaXMpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVua25vd24+fVxuICovXG5mdW5jdGlvbiBhZGp1c3RCdXR0b25WaXNpYmlsaXR5KCkge1xuXHRjb25zdCBzZWxmID0gdGhpcztcblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcblx0XHRcdGNvbnN0IGRlZkNvdW50ID0gc2VsZi5nZXRPcHRpb24oXCJidXR0b25zLnN0YW5kYXJkXCIpLmxlbmd0aDtcblx0XHRcdGNvbnN0IGRvbUNvdW50ID0gc2VsZltuYXZFbGVtZW50U3ltYm9sXS5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdFx0XHQnYnV0dG9uW2RhdGEtbW9uc3Rlci1yb2xlPVwiYnV0dG9uXCJdJyxcblx0XHRcdCkubGVuZ3RoO1xuXG5cdFx0XHQvLyBpbiBkcmF3aW5nXG5cdFx0XHRpZiAoZGVmQ291bnQgIT09IGRvbUNvdW50KSByZXR1cm47XG5cblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0Y2hlY2tBbmRSZWFycmFuZ2VCdXR0b25zLmNhbGwoc2VsZik7XG5cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblxuXHRcdG9ic2VydmVyLm9ic2VydmUoc2VsZltuYXZFbGVtZW50U3ltYm9sXSwge1xuXHRcdFx0YXR0cmlidXRlczogdHJ1ZSxcblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXREaW1WYWx1ZSh2YWx1ZSkge1xuXHRpZiAoW3VuZGVmaW5lZCwgbnVsbF0uaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCB2YWx1ZUFzSW50ID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcblxuXHRpZiAoaXNOYU4odmFsdWVBc0ludCkpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHJldHVybiB2YWx1ZUFzSW50O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNhbGNCb3hXaWR0aChub2RlKSB7XG5cdGNvbnN0IGRpbSA9IGdldEdsb2JhbChcIndpbmRvd1wiKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuXHRjb25zdCBib3VuZGluZyA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0cmV0dXJuIChcblx0XHRnZXREaW1WYWx1ZShkaW1bXCJib3JkZXItbGVmdC13aWR0aFwiXSkgK1xuXHRcdGdldERpbVZhbHVlKGRpbVtcInBhZGRpbmctbGVmdFwiXSkgK1xuXHRcdGdldERpbVZhbHVlKGRpbVtcIm1hcmdpbi1sZWZ0XCJdKSArXG5cdFx0Z2V0RGltVmFsdWUoYm91bmRpbmdbXCJ3aWR0aFwiXSkgK1xuXHRcdGdldERpbVZhbHVlKGRpbVtcImJvcmRlci1yaWdodC13aWR0aFwiXSkgK1xuXHRcdGdldERpbVZhbHVlKGRpbVtcIm1hcmdpbi1yaWdodFwiXSkgK1xuXHRcdGdldERpbVZhbHVlKGRpbVtcInBhZGRpbmctbGVmdFwiXSlcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiByZWFycmFuZ2VCdXR0b25zKCkge1xuXHRnZXRXaW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdGNvbnN0IHN0YW5kYXJkQnV0dG9ucyA9IFtdO1xuXHRcdGNvbnN0IHBvcHBlckJ1dHRvbnMgPSBbXTtcblx0XHRsZXQgc3VtID0gMDtcblx0XHRjb25zdCBzcGFjZSA9IHRoaXNbZGltZW5zaW9uc1N5bWJvbF0uZ2V0VmlhKFwiZGF0YS5zcGFjZVwiKTtcblxuXHRcdGlmIChzcGFjZSA8PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYnV0dG9ucyA9IHRoaXMuZ2V0T3B0aW9uKFwiYnV0dG9ucy5zdGFuZGFyZFwiKTtcblx0XHRmb3IgKGNvbnN0IFssIGJ1dHRvbl0gb2YgYnV0dG9ucy5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IHJlZiA9IGJ1dHRvbj8ucmVmZXJlbmNlO1xuXG5cdFx0XHRzdW0gKz0gdGhpc1tkaW1lbnNpb25zU3ltYm9sXS5nZXRWaWEoYGRhdGEuYnV0dG9uLiR7cmVmfWApO1xuXG5cdFx0XHRpZiAoc3VtID4gc3BhY2UpIHtcblx0XHRcdFx0cG9wcGVyQnV0dG9ucy5wdXNoKGNsb25lKGJ1dHRvbikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhbmRhcmRCdXR0b25zLnB1c2goY2xvbmUoYnV0dG9uKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRPcHRpb24oXCJidXR0b25zLnN0YW5kYXJkXCIsIHN0YW5kYXJkQnV0dG9ucyk7XG5cdFx0dGhpcy5zZXRPcHRpb24oXCJidXR0b25zLnBvcHBlclwiLCBwb3BwZXJCdXR0b25zKTtcblxuXHRcdGlmICh0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdKSB7XG5cdFx0XHRpZiAocG9wcGVyQnV0dG9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU5hdmlnYXRpb25CdXR0b25zRGltZW5zaW9ucygpIHtcblx0Y29uc3Qgd2lkdGggPSB0aGlzW25hdkVsZW1lbnRTeW1ib2xdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG5cdGxldCBzdGFydEVuZFdpZHRoID0gMDtcblxuXHRnZXRTbG90dGVkRWxlbWVudHMuY2FsbCh0aGlzLCB1bmRlZmluZWQsIFwic3RhcnRcIikuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdHN0YXJ0RW5kV2lkdGggKz0gY2FsY0JveFdpZHRoLmNhbGwodGhpcywgbm9kZSk7XG5cdH0pO1xuXG5cdGdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHRoaXMsIHVuZGVmaW5lZCwgXCJlbmRcIikuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdHN0YXJ0RW5kV2lkdGggKz0gY2FsY0JveFdpZHRoLmNhbGwodGhpcywgbm9kZSk7XG5cdH0pO1xuXG5cdHRoaXNbZGltZW5zaW9uc1N5bWJvbF0uc2V0VmlhKFwiZGF0YS5zcGFjZVwiLCB3aWR0aCAtIHN0YXJ0RW5kV2lkdGggLSAyKTtcblx0dGhpc1tkaW1lbnNpb25zU3ltYm9sXS5zZXRWaWEoXCJkYXRhLnZpc2libGVcIiwgISh3aWR0aCA9PT0gMCkpO1xuXG5cdGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmdldE9wdGlvbihcImJ1dHRvbnMuc3RhbmRhcmRcIikuY29uY2F0KFxuXHRcdHRoaXMuZ2V0T3B0aW9uKFwiYnV0dG9ucy5wb3BwZXJcIiksXG5cdCk7XG5cblx0Zm9yIChjb25zdCBbaSwgYnV0dG9uXSBvZiBidXR0b25zLmVudHJpZXMoKSkge1xuXHRcdGNvbnN0IHJlZiA9IGJ1dHRvbj8ucmVmZXJlbmNlO1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzW25hdkVsZW1lbnRTeW1ib2xdLnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XHRgOnNjb3BlID4gWyR7QVRUUklCVVRFX1BSRUZJWH10YWItcmVmZXJlbmNlPVwiJHtyZWZ9XCJdYCxcblx0XHQpO1xuXHRcdGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkpIGNvbnRpbnVlO1xuXG5cdFx0dGhpc1tkaW1lbnNpb25zU3ltYm9sXS5zZXRWaWEoXG5cdFx0XHRgZGF0YS5idXR0b24uJHtyZWZ9YCxcblx0XHRcdGNhbGNCb3hXaWR0aC5jYWxsKHRoaXMsIGVsZW1lbnQpLFxuXHRcdCk7XG5cdFx0YnV0dG9uW1wiY2xhc3NcIl0gPSBuZXcgVG9rZW5MaXN0KGJ1dHRvbltcImNsYXNzXCJdKVxuXHRcdFx0LnJlbW92ZShcImludmlzaWJsZVwiKVxuXHRcdFx0LnRvU3RyaW5nKCk7XG5cdH1cblxuXHRjb25zdCBzbG90cyA9IHRoaXNbY29udHJvbEVsZW1lbnRTeW1ib2xdLnF1ZXJ5U2VsZWN0b3JBbGwoXG5cdFx0YG5hdlske0FUVFJJQlVURV9QUkVGSVh9cm9sZT1uYXZdID4gc2xvdC5pbnZpc2libGUsIHNsb3RbJHtBVFRSSUJVVEVfUFJFRklYfXJvbGU9c2xvdF0uaW52aXNpYmxlYCxcblx0KTtcblx0Zm9yIChjb25zdCBbLCBzbG90XSBvZiBzbG90cy5lbnRyaWVzKCkpIHtcblx0XHRzbG90LmNsYXNzTGlzdC5yZW1vdmUoXCJpbnZpc2libGVcIik7XG5cdH1cblxuXHR0aGlzLnNldE9wdGlvbihcImJ1dHRvbnMuc3RhbmRhcmRcIiwgY2xvbmUoYnV0dG9ucykpO1xuXG5cdGdldFdpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0dGhpc1tkaW1lbnNpb25zU3ltYm9sXS5zZXRWaWEoXCJkYXRhLmNhbGN1bGF0ZWRcIiwgdHJ1ZSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEJ1dHRvbkxhYmVsKG5vZGUpIHtcblx0bGV0IGxhYmVsO1xuXHRsZXQgc2V0TGFiZWwgPSBmYWxzZTtcblx0aWYgKG5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9CVVRUT05fTEFCRUwpKSB7XG5cdFx0bGFiZWwgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQlVUVE9OX0xBQkVMKTtcblx0fSBlbHNlIHtcblx0XHRsYWJlbCA9IG5vZGUuaW5uZXJUZXh0O1xuXHRcdHNldExhYmVsID0gdHJ1ZTtcblx0fVxuXG5cdGlmICghaXNTdHJpbmcobGFiZWwpKSB7XG5cdFx0bGFiZWwgPSBcIlwiO1xuXHR9XG5cblx0bGFiZWwgPSBsYWJlbC50cmltKCk7XG5cblx0aWYgKGxhYmVsID09PSBcIlwiKSB7XG5cdFx0bGFiZWwgPSB0aGlzLmdldE9wdGlvbihcImxhYmVscy5uZXctdGFiLWxhYmVsXCIsIFwiTmV3IFRhYlwiKTtcblx0fVxuXG5cdGlmIChsYWJlbC5sZW5ndGggPiAxMDApIHtcblx0XHRsYWJlbCA9IGAke2xhYmVsLnN1YnN0cmluZygwLCA5OSl9XHUyMDI2YDtcblx0fVxuXG5cdGlmIChzZXRMYWJlbCA9PT0gdHJ1ZSkge1xuXHRcdG5vZGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9CVVRUT05fTEFCRUwsIGxhYmVsKTtcblx0fVxuXG5cdHJldHVybiBsYWJlbDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8dGVtcGxhdGUgaWQ9XCJidXR0b25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHBhcnQ9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzIHBhdGg6Y2xhc3Nlcy5idXR0b24sXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1zdGF0ZSBwYXRoOmJ1dHRvbnMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIHBhdGg6YnV0dG9ucy5kaXNhYmxlZCB8IGlmOnRydWUsICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXRhYi1yZWZlcmVuY2UgcGF0aDpidXR0b25zLnJlZmVyZW5jZVwiPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpidXR0b25zLmxhYmVsXCI+PC9zcGFuPjxzcGFuIHBhcnQ9XCJyZW1vdmUtdGFiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2xhc3MgcGF0aDpidXR0b25zLnJlbW92ZSB8ID86cmVtb3ZlLXRhYjpoaWRkZW4gXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yb2xlPVwicmVtb3ZlLXRhYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+PC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8bmF2IGRhdGEtbW9uc3Rlci1yb2xlPVwibmF2XCIgcGFydD1cIm5hdlwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiZGF0YS1tb25zdGVyLW1hcmtlciBwYXRoOm1hcmtlciwgY2xhc3MgcGF0aDpjbGFzc2VzLm5hdmlnYXRpb25cIlxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwiYnV0dG9ucyBwYXRoOmJ1dHRvbnMuc3RhbmRhcmRcIj5cbiAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwic3RhcnRcIiBjbGFzcz1cImludmlzaWJsZVwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwicG9wcGVyXCIgcGFydD1cInBvcHBlclwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmNsYXNzZXMucG9wcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1wb3BwZXItYXJyb3c+PC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJwb3BwZXItbmF2XCIgZGF0YS1tb25zdGVyLXJvbGU9XCJwb3BwZXItbmF2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwiYnV0dG9ucyBwYXRoOmJ1dHRvbnMucG9wcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInBvcHBlclwiIGNsYXNzPVwiaW52aXNpYmxlXCI+PC9zbG90PlxuICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJlbmRcIiBjbGFzcz1cImludmlzaWJsZVwiPjwvc2xvdD5cbiAgICAgICAgICAgIDwvbmF2PlxuICAgICAgICAgICAgPHNsb3QgZGF0YS1tb25zdGVyLXJvbGU9XCJzbG90XCIgY2xhc3M9XCJpbnZpc2libGVcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PmA7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUYWJzKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBNZXNzYWdlU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgTWVzc2FnZVN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRNZXNzYWdlU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBtZXNzYWdlIHsgXG46d2hlcmUoaHRtbCl7bGluZS1oZWlnaHQ6MS4xNTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbW96LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTt0ZXh0LXNpemUtYWRqdXN0OjEwMCV9OndoZXJlKGgxKXtmb250LXNpemU6MmVtO21hcmdpbi1ibG9jay1lbmQ6LjY3ZW07bWFyZ2luLWJsb2NrLXN0YXJ0Oi42N2VtfTp3aGVyZShkbCxvbCx1bCkgOndoZXJlKGRsLG9sLHVsKXttYXJnaW4tYmxvY2stZW5kOjA7bWFyZ2luLWJsb2NrLXN0YXJ0OjB9OndoZXJlKGhyKXtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2NvbG9yOmluaGVyaXQ7aGVpZ2h0OjB9OndoZXJlKGFiYnJbdGl0bGVdKXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9OndoZXJlKGIsc3Ryb25nKXtmb250LXdlaWdodDpib2xkZXJ9OndoZXJlKGNvZGUsa2JkLHByZSxzYW1wKXtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19OndoZXJlKHNtYWxsKXtmb250LXNpemU6ODAlfTp3aGVyZSh0YWJsZSl7Ym9yZGVyLWNvbG9yOmN1cnJlbnRDb2xvcjt0ZXh0LWluZGVudDowfTp3aGVyZShidXR0b24saW5wdXQsc2VsZWN0KXttYXJnaW46MH06d2hlcmUoYnV0dG9uKXt0ZXh0LXRyYW5zZm9ybTpub25lfTp3aGVyZShidXR0b24saW5wdXQ6aXMoW3R5cGU9YnV0dG9uIGldLFt0eXBlPXJlc2V0IGldLFt0eXBlPXN1Ym1pdCBpXSkpey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b259OndoZXJlKHByb2dyZXNzKXt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06d2hlcmUoc2VsZWN0KXt0ZXh0LXRyYW5zZm9ybTpub25lfTp3aGVyZSh0ZXh0YXJlYSl7bWFyZ2luOjB9OndoZXJlKGlucHV0W3R5cGU9c2VhcmNoIGldKXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO291dGxpbmUtb2Zmc2V0Oi0ycHh9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b306Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6aW5oZXJpdDtvcGFjaXR5Oi41NH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH06d2hlcmUoYnV0dG9uLGlucHV0OmlzKFt0eXBlPWJ1dHRvbiBpXSxbdHlwZT1jb2xvciBpXSxbdHlwZT1yZXNldCBpXSxbdHlwZT1zdWJtaXQgaV0pKTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXItc3R5bGU6bm9uZTtwYWRkaW5nOjB9OndoZXJlKGJ1dHRvbixpbnB1dDppcyhbdHlwZT1idXR0b24gaV0sW3R5cGU9Y29sb3IgaV0sW3R5cGU9cmVzZXQgaV0sW3R5cGU9c3VibWl0IGldKSk6Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6MXB4IGRvdHRlZCBCdXR0b25UZXh0fTp3aGVyZSg6LW1vei11aS1pbnZhbGlkKXtib3gtc2hhZG93Om5vbmV9OndoZXJlKGRpYWxvZyl7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjpzb2xpZDtjb2xvcjojMDAwO2hlaWdodDotbW96LWZpdC1jb250ZW50O2hlaWdodDpmaXQtY29udGVudDtsZWZ0OjA7bWFyZ2luOmF1dG87cGFkZGluZzoxZW07cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt3aWR0aDotbW96LWZpdC1jb250ZW50O3dpZHRoOmZpdC1jb250ZW50fTp3aGVyZShkaWFsb2c6bm90KFtvcGVuXSkpe2Rpc3BsYXk6bm9uZX06d2hlcmUoc3VtbWFyeSl7ZGlzcGxheTpsaXN0LWl0ZW19aHRtbHtoZWlnaHQ6MTAwJX1ib2R5LGh0bWx7bWluLWhlaWdodDpjYWxjKDEwMHZoIC0gNDBweCl9Ym9keXtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7cGFkZGluZzowO3dvcmQtYnJlYWs6YnJlYWstd29yZH1ib2R5OmZvY3VzLXZpc2libGV7b3V0bGluZTpub25lfTpmb2N1cy12aXNpYmxle291dGxpbmU6bm9uZX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmdyaWR7ZGlzcGxheTpncmlkfS5pbmxpbmUtZ3JpZHtkaXNwbGF5OmlubGluZS1ncmlkfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0uaGlkZGVuLC5oaWRlLC5ub25le2Rpc3BsYXk6bm9uZX0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMywubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLTB7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDowfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0yLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMywubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0yLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0zLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWdyYXktMTojZjZmNmY2Oy0tbW9uc3Rlci1jb2xvci1ncmF5LTI6I2UyZTJlMjstLW1vbnN0ZXItY29sb3ItZ3JheS0zOiM4YjhiOGI7LS1tb25zdGVyLWNvbG9yLWdyYXktNDojNmY2ZjZmOy0tbW9uc3Rlci1jb2xvci1ncmF5LTU6IzNlM2UzZTstLW1vbnN0ZXItY29sb3ItZ3JheS02OiMyMjI7LS1tb25zdGVyLWNvbG9yLXJvc2UtMTojZmZmN2Y5Oy0tbW9uc3Rlci1jb2xvci1yb3NlLTI6I2ZmZGNlNTstLW1vbnN0ZXItY29sb3Itcm9zZS0zOiNmZjNiOGQ7LS1tb25zdGVyLWNvbG9yLXJvc2UtNDojZGIwMDcyOy0tbW9uc3Rlci1jb2xvci1yb3NlLTU6IzgwMDA0MDstLW1vbnN0ZXItY29sb3Itcm9zZS02OiM0YzAwMjM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0xOiNmZmY4Zjg7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0yOiNmZmRkZGY7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0zOiNmZjQyNmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS00OiNkZTAwNTE7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS01OiM4MjAwMmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS02OiM1MTAwMTg7LS1tb25zdGVyLWNvbG9yLXJlZC0xOiNmZmY4ZjY7LS1tb25zdGVyLWNvbG9yLXJlZC0yOiNmZmRkZDg7LS1tb25zdGVyLWNvbG9yLXJlZC0zOiNmZjQ2NDc7LS1tb25zdGVyLWNvbG9yLXJlZC00OiNlMDAwMmI7LS1tb25zdGVyLWNvbG9yLXJlZC01OiM4MzAwMTQ7LS1tb25zdGVyLWNvbG9yLXJlZC02OiM1MzAwMDM7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xOiNmZmY4ZjU7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0yOiNmZmRlZDE7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zOiNmZDRkMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS00OiNjZDNjMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS01OiM3NTIxMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS02OiM0MDE2MDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTE6I2ZmZjhmMzstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tMjojZmZkZmM2Oy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0zOiNkNTczMDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTQ6I2FjNWMwMDstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tNTojNjMzMzAwOy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi02OiMzNzFkMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTE6I2ZmZjhlZjstLW1vbnN0ZXItY29sb3ItYW1iZXItMjojZmZlMGIyOy0tbW9uc3Rlci1jb2xvci1hbWJlci0zOiNiOTgzMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTQ6IzkyNjcwMDstLW1vbnN0ZXItY29sb3ItYW1iZXItNTojNTIzODAwOy0tbW9uc3Rlci1jb2xvci1hbWJlci02OiMzMDIxMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0xOiNmZmY5ZTU7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0yOiNmZmU1M2U7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0zOiM5YzhiMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy00OiM3ZDZmMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy01OiM0NjNkMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy02OiMyOTIzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtMTojZjdmZmFjOy0tbW9uc3Rlci1jb2xvci1saW1lLTI6I2Q1ZjIwMDstLW1vbnN0ZXItY29sb3ItbGltZS0zOiM4MTkzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtNDojNjc3NjAwOy0tbW9uc3Rlci1jb2xvci1saW1lLTU6IzM5NDEwMDstLW1vbnN0ZXItY29sb3ItbGltZS02OiMyMjI2MDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtMTojZTVmZmMzOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTI6Izk4ZmIwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS0zOiM1YzliMDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtNDojNDk3YzAwOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTU6IzI2NDUwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS02OiMxODI2MDA7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTE6I2UwZmZkOTstLW1vbnN0ZXItY29sb3ItZ3JlZW4tMjojNzJmZjZjOy0tbW9uc3Rlci1jb2xvci1ncmVlbi0zOiMwMGEyMWY7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTQ6IzAwODIxNzstLW1vbnN0ZXItY29sb3ItZ3JlZW4tNTojMDA0OTA4Oy0tbW9uc3Rlci1jb2xvci1ncmVlbi02OiMwNjI4MDA7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtMTojZGNmZmU2Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTI6IzVkZmZhMjstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC0zOiMwMGEwNWE7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtNDojMDA4MTQ3Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTU6IzAwNDgyNTstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC02OiMwMDI4MTI7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtMTojZGFmZmVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTI6IzQyZmZjNjstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS0zOiMwMDlmNzg7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtNDojMDA3ZjVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTU6IzAwNDczNDstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS02OiMwMDI4MWI7LS1tb25zdGVyLWNvbG9yLXRlYWwtMTojZDdmZmY3Oy0tbW9uc3Rlci1jb2xvci10ZWFsLTI6IzAwZmZlNDstLW1vbnN0ZXItY29sb3ItdGVhbC0zOiMwMDllOGM7LS1tb25zdGVyLWNvbG9yLXRlYWwtNDojMDA3YzZlOy0tbW9uc3Rlci1jb2xvci10ZWFsLTU6IzAwNDQzYzstLW1vbnN0ZXItY29sb3ItdGVhbC02OiMwMDI3MjI7LS1tb25zdGVyLWNvbG9yLWN5YW4tMTojYzRmZmZlOy0tbW9uc3Rlci1jb2xvci1jeWFuLTI6IzAwZmFmYjstLW1vbnN0ZXItY29sb3ItY3lhbi0zOiMwMDk5OWE7LS1tb25zdGVyLWNvbG9yLWN5YW4tNDojMDA3YTdiOy0tbW9uc3Rlci1jb2xvci1jeWFuLTU6IzAwNDM0NDstLW1vbnN0ZXItY29sb3ItY3lhbi02OiMwMDI1MjU7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0xOiNkYWZhZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0yOiM4ZGYwZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0zOiMwMDk4YTk7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci00OiMwMDc5ODc7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci01OiMwMDQwNDg7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci02OiMwMDIyMjc7LS1tb25zdGVyLWNvbG9yLXNreS0xOiNlM2Y3ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0yOiNhZWU5ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0zOiMwMDk0YjQ7LS1tb25zdGVyLWNvbG9yLXNreS00OiMwMDc1OTA7LS1tb25zdGVyLWNvbG9yLXNreS01OiMwMDQwNGY7LS1tb25zdGVyLWNvbG9yLXNreS02OiMwMDFmMjg7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTE6I2U4ZjZmZjstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tMjojYjllM2ZmOy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi0zOiMwMDkyYzU7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTQ6IzAwNzQ5ZDstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tNTojMDAzYzU0Oy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi02OiMwMDFkMmE7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTE6I2U4ZjJmZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtMjojYzZlMGZmOy0tbW9uc3Rlci1jb2xvci1henVyZS0zOiMwMDhmZGI7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTQ6IzAwNzFhZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtNTojMDAzYjVlOy0tbW9uc3Rlci1jb2xvci1henVyZS02OiMwMDFjMzA7LS1tb25zdGVyLWNvbG9yLWJsdWUtMTojZjBmNGZmOy0tbW9uc3Rlci1jb2xvci1ibHVlLTI6I2Q0ZTBmZjstLW1vbnN0ZXItY29sb3ItYmx1ZS0zOiMwMDg5ZmM7LS1tb25zdGVyLWNvbG9yLWJsdWUtNDojMDA2ZGNhOy0tbW9uc3Rlci1jb2xvci1ibHVlLTU6IzAwMzg2ZDstLW1vbnN0ZXItY29sb3ItYmx1ZS02OiMwMDFhMzk7LS1tb25zdGVyLWNvbG9yLWluZGlnby0xOiNmM2YzZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0yOiNkZWRkZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0zOiM2NTdlZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby00OiMwMDYxZmM7LS1tb25zdGVyLWNvbG9yLWluZGlnby01OiMwMDMyOGE7LS1tb25zdGVyLWNvbG9yLWluZGlnby02OiMwMDE2NDk7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0xOiNmN2YxZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0yOiNlOGRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0zOiM5YjcwZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC00OiM3OTRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC01OiMyZDBmYmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC02OiMwYjAwNzQ7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0xOiNmZGY0ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0yOiNmN2Q5ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0zOiNkMTUwZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS00OiNiMDFmZTM7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS01OiM2NjAwODc7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS02OiMzYTAwNGY7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMTojZmZmM2ZjOy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTI6I2ZmZDdmNjstLW1vbnN0ZXItY29sb3ItbWFnZW50YS0zOiNmOTExZTA7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNDojY2EwMGI2Oy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTU6Izc0MDA2ODstLW1vbnN0ZXItY29sb3ItbWFnZW50YS02OiM0NDAwM2M7LS1tb25zdGVyLWNvbG9yLXBpbmstMTojZmZmN2ZiOy0tbW9uc3Rlci1jb2xvci1waW5rLTI6I2ZmZGNlYzstLW1vbnN0ZXItY29sb3ItcGluay0zOiNmZjJmYjI7LS1tb25zdGVyLWNvbG9yLXBpbmstNDojZDIwMDhmOy0tbW9uc3Rlci1jb2xvci1waW5rLTU6Izc5MDA1MTstLW1vbnN0ZXItY29sb3ItcGluay02OiM0YjAwMzA7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0xOiNlNWI4NzU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0yOiNkOWEzNjI7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0zOiNjMDhhNGU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS00OiNhNzcxM2I7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS01OiM4ZjVhMjg7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS02OiMzNjA1MDU7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTE6I2Y3ZjVlZjstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtMjojZTVlMmQ5Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC0zOiNjYmM2YjM7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTQ6I2ExOWQ4YTstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNTojN2E3NTY2Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02OiM1MTRkM2Z9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKX0ubW9uc3Rlci10aGVtZS1lcnJvci0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTEpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtMXtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xKX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0xKX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS1kaXNhYmxlZC0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yKX0ubW9uc3Rlci10aGVtZS1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLXRoZW1lLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItdGhlbWUtZGVzdHJ1Y3RpdmUtMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yKX0ubW9uc3Rlci10aGVtZS1zdWNjZXNzLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTIpfS5tb25zdGVyLXRoZW1lLXdhcm5pbmctMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMil9Lm1vbnN0ZXItdGhlbWUtZXJyb3ItMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0yKX0ubW9uc3Rlci10aGVtZS1zZWxlY3Rpb24tMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTIpfS5tb25zdGVyLWJvcmRlci1jb2xvci0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWJvcmRlci0yKX0ubW9uc3Rlci1jb2xvci1uZXV0cmFsLTJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMil9Lm1vbnN0ZXItY29sb3Itc3VjY2Vzcy0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0yKX0ubW9uc3Rlci1jb2xvci13YXJuaW5nLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTIpfS5tb25zdGVyLWNvbG9yLWVycm9yLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMil9Lm1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktZGlzYWJsZWQtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMyl9Lm1vbnN0ZXItdGhlbWUtc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci10aGVtZS10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLXRoZW1lLWRlc3RydWN0aXZlLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMyl9Lm1vbnN0ZXItdGhlbWUtc3VjY2Vzcy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zKX0ubW9uc3Rlci10aGVtZS13YXJuaW5nLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTMpfS5tb25zdGVyLXRoZW1lLWVycm9yLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMyl9Lm1vbnN0ZXItdGhlbWUtc2VsZWN0aW9uLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKX0ubW9uc3Rlci1ib3JkZXItY29sb3ItM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ib3JkZXItMyl9Lm1vbnN0ZXItY29sb3ItbmV1dHJhbC0ze2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItY29sb3ItdGVydGlhcnktM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTMpfS5tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMyl9Lm1vbnN0ZXItY29sb3Itd2FybmluZy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0zKX0ubW9uc3Rlci1jb2xvci1lcnJvci0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTMpfS5tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNCl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KX0ubW9uc3Rlci10aGVtZS1lcnJvci00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTQpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTQpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtNHtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00KX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTQpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNCl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci00KX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1yb3ctMXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1lbGVtZW50LC5tb25zdGVyLXRoZW1lLWNvbnRyb2wtcm93LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcil9Lm1vbnN0ZXItdGhlbWUtY29udHJvbC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yKX0ubW9uc3Rlci10aGVtZS1iYWNrZ3JvdW5kLWluaGVyaXR7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0IWltcG9ydGFudH0ubW9uc3Rlci10aGVtZS1vbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tY29sb3IpfS5tb25zdGVyLXRoZW1lLW9mZntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yKTtjb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLW9mZi1jb2xvcil9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOm5vbmV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdLmZsZXh7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2t9W2RhdGEtbW9uc3Rlci1yb2xlPW1lc3NhZ2Vde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6OHB4O3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRlbnRde2ZsZXgtZ3JvdzoyO0BtaXhpbnMgcGFyYWdyYXBofVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSBbZGF0YS1tb25zdGVyLXJvbGU9Y2xvc2Vde2N1cnNvcjpwb2ludGVyO2hlaWdodDoxNnB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMHB4O3RvcDotNXB4O3dpZHRoOjE2cHg7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtbW9kYWwtb3ZlcmxheSl9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIFtkYXRhLW1vbnN0ZXItcm9sZT1jbG9zZV06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbnRlbnQ6XFxcIlxcXCI7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNiclM0UlM0NwYXRoIGQ9J000LjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMEw4IDcuMjkzbDIuNjQ2LTIuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhMOC43MDcgOGwyLjY0NyAyLjY0NmEuNS41IDAgMCAxLS43MDguNzA4TDggOC43MDdsLTIuNjQ2IDIuNjQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4TDcuMjkzIDggNC42NDYgNS4zNTRhLjUuNSAwIDAgMSAwLS43MDgnLyUzRSUzQy9zdmclM0VcXFwiKTttYXNrLWltYWdlOnVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNNC42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCA3LjI5M2wyLjY0Ni0yLjY0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsMi42NDcgMi42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC0yLjY0NiAyLjY0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDQuNjQ2IDUuMzU0YS41LjUgMCAwIDEgMC0uNzA4Jy8lM0UlM0Mvc3ZnJTNFXFxcIik7LXdlYmtpdC1tYXNrLXBvc2l0aW9uOmNlbnRlcjttYXNrLXBvc2l0aW9uOmNlbnRlcjstd2Via2l0LW1hc2stcmVwZWF0Om5vLXJlcGVhdDttYXNrLXJlcGVhdDpuby1yZXBlYXQ7LXdlYmtpdC1tYXNrLXNpemU6Y29udGFpbjttYXNrLXNpemU6Y29udGFpbjt3aWR0aDoxMDAlfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRBVFRSSUJVVEVfUFJFRklYLFxuXHRBVFRSSUJVVEVfUk9MRSxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0aW5pdE1ldGhvZFN5bWJvbCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvbWVzc2FnZS5tanNcIjtcblxuZXhwb3J0IHsgTWVzc2FnZSB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBjb250cm9sRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImNvbnRyb2xFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCByZW1vdmVFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwicmVtb3ZlRWxlbWVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdGltZXJTeW1ib2wgPSBTeW1ib2woXCJ0aW1lclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgbW91c2VlbnRlckV2ZW50SGFuZGxlclN5bWJvbCA9IFN5bWJvbChcIm1vdXNlZW50ZXJFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG1vdXNlbGVhdmVFdmVudEhhbmRsZXJTeW1ib2wgPSBTeW1ib2woXCJtb3VzZWxlYXZlRXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCByZW1vdmVFdmVudEhhbmRsZXJTeW1ib2wgPSBTeW1ib2woXCJyZW1vdmVFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQSBNZXNzYWdlIGlzIGEgbm90aWZpY2F0aW9uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IG1lc3NhZ2VzIHRvIHRoZSB1c2VyLlxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL25vdGlmeS9tZXNzYWdlXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvbm90aWZ5L21lc3NhZ2Utc2ltcGxlIE1lc3NhZ2VcbiAqXG4gKiBAaXNzdWUgaHR0cHM6Ly9sb2NhbGhvc3QuYWx2aW5lLmRldjo4NDQzL2RldmVsb3BtZW50L2lzc3Vlcy9jbG9zZWQvMjY5Lmh0bWxcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgbWVzc2FnZSBpcyBhIG5vdGlmaWNhdGlvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBtZXNzYWdlcyB0byB0aGUgdXNlci4gVHlwaWNhbGx5LCBpdCBpcyBvbmx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbm90aWZ5IGNvbnRhaW5lci5cbiAqL1xuY2xhc3MgTWVzc2FnZSBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuXHQvKipcblx0ICogVGhlIGRlZmF1bHRzIGNhbiBiZSBzZXQgZWl0aGVyIGRpcmVjdGx5IGluIHRoZSBvYmplY3Qgb3IgdmlhIGFuIGF0dHJpYnV0ZSBpbiB0aGUgSFRNTCB0YWcuXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgaW4gdGhlIEhUTUwgdGFnIG11c3QgYmUgYSBKU09OIHN0cmluZy5cblx0ICpcblx0ICogYGBgXG5cdCAqIDxtb25zdGVyLW1lc3NhZ2UgZGF0YS1tb25zdGVyLW9wdGlvbnM9XCJ7fVwiPjwvbW9uc3Rlci1tZXNzYWdlPlxuXHQgKiBgYGBcblx0ICpcblx0ICogU2luY2UgMS4xOC4wIHRoZSBKU09OIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBEYXRhVVJJLlxuXHQgKlxuXHQgKiBgYGBcblx0ICogbmV3IE1vbnN0ZXIuVHlwZXMuRGF0YVVybChidG9hKEpTT04uc3RyaW5naWZ5KHtcblx0ICogICAgICAgIHRpbWVvdXQ6IDMwMDAsXG5cdCAqICAgICAgICBmZWF0dXJlczoge1xuXHQgKiAgICAgICAgICBjbG9zZTogdHJ1ZSxcblx0ICogICAgICAgICAgZGlzYXBwZWFyOiB0cnVlXG5cdCAqICAgICAgICB9XG5cdCAqICAgIH0pKSwnYXBwbGljYXRpb24vanNvbicsdHJ1ZSkudG9TdHJpbmcoKVxuXHQgKiBgYGBcblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUZW1wbGF0ZSBkZWZpbml0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gTWFpbiB0ZW1wbGF0ZVxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIG1lc3NhZ2UgZGlzYXBwZWFyc1xuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZmVhdHVyZXMgVGhlIGZlYXR1cmVzIG9mIHRoZSBtZXNzYWdlXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZmVhdHVyZXMuY2xvc2UgV2hldGhlciB0aGUgbWVzc2FnZSBjYW4gYmUgY2xvc2VkXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZmVhdHVyZXMuZGlzYXBwZWFyIFdoZXRoZXIgdGhlIG1lc3NhZ2UgZGlzYXBwZWFycyBhZnRlciBhIGNlcnRhaW4gdGltZVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0dGltZW91dDogNjAwMCxcblx0XHRcdGZlYXR1cmVzOiB7XG5cdFx0XHRcdGNsb3NlOiB0cnVlLFxuXHRcdFx0XHRkaXNhcHBlYXI6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogXCI8c2xvdD48L3Nsb3Q+XCIsXG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLk5vdGlmeS5NZXNzYWdlfVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblx0XHRpbml0Q29udHJvbFJlZmVyZW5jZXMuY2FsbCh0aGlzKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFRhZygpIHtcblx0XHRyZXR1cm4gXCJtb25zdGVyLW5vdGlmeS1tZXNzYWdlXCI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtNZXNzYWdlU3R5bGVTaGVldF07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdFtpbml0TWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlcltpbml0TWV0aG9kU3ltYm9sXSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMuZGlzYXBwZWFyXCIpID09PSB0cnVlKSB7XG5cdFx0XHRzdGFydEZhZGVvdXQuY2FsbCh0aGlzKTtcblx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgdGhpc1ttb3VzZWVudGVyRXZlbnRIYW5kbGVyU3ltYm9sXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdHN0b3BGYWRlb3V0LmNhbGwodGhpcyk7XG5cblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5kaXNhcHBlYXJcIikgPT09IHRydWUpIHtcblx0XHRcdHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcblx0XHRcdFx0XCJtb3VzZWVudGVyXCIsXG5cdFx0XHRcdHRoaXNbbW91c2VlbnRlckV2ZW50SGFuZGxlclN5bWJvbF0sXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKFxuXHRcdFx0XHRcIm1vdXNlZW50ZXJcIixcblx0XHRcdFx0dGhpc1ttb3VzZWxlYXZlRXZlbnRIYW5kbGVyU3ltYm9sXSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc3RhcnRGYWRlb3V0KCkge1xuXHRpZiAoIXRoaXM/Llt0aW1lclN5bWJvbF0pIHtcblx0XHR0aGlzW3RpbWVyU3ltYm9sXSA9IHNldFRpbWVvdXQoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdHJlbW92ZVNlbGYuY2FsbCh0aGlzKTtcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldE9wdGlvbihcInRpbWVvdXRcIiwgMTAwMCksXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmKCkge1xuXHRzdG9wRmFkZW91dCgpO1xuXHR0aGlzLmNsYXNzTGlzdC5hZGQoXCJmYWRlb3V0XCIpO1xuXG5cdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdHRoaXMucmVtb3ZlKCk7XG5cdH0sIDIwMCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc3RvcEZhZGVvdXQoKSB7XG5cdGlmICh0aGlzPy5bdGltZXJTeW1ib2xdKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXNbdGltZXJTeW1ib2xdKTtcblx0XHR0aGlzW3RpbWVyU3ltYm9sXSA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNZXNzYWdlfVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHR0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW1wiICsgQVRUUklCVVRFX1JPTEUgKyBcIj1jb250cm9sXVwiLFxuXHQpO1xuXHR0aGlzW3JlbW92ZUVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XCJbXCIgKyBBVFRSSUJVVEVfUk9MRSArIFwiPWNsb3NlXVwiLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRFdmVudEhhbmRsZXIoKSB7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKi9cblx0dGhpc1ttb3VzZWVudGVyRXZlbnRIYW5kbGVyU3ltYm9sXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChcblx0XHRcdGV2ZW50LFxuXHRcdFx0QVRUUklCVVRFX1JPTEUsXG5cdFx0XHRcImNvbnRyb2xcIixcblx0XHQpO1xuXG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKFxuXHRcdFx0XHRcIm1vdXNlZW50ZXJcIixcblx0XHRcdFx0dGhpc1ttb3VzZWVudGVyRXZlbnRIYW5kbGVyU3ltYm9sXSxcblx0XHRcdCk7XG5cdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXNbbW91c2VsZWF2ZUV2ZW50SGFuZGxlclN5bWJvbF0pO1xuXHRcdFx0c3RvcEZhZGVvdXQuY2FsbCh0aGlzKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHR0aGlzW21vdXNlbGVhdmVFdmVudEhhbmRsZXJTeW1ib2xdID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHRBVFRSSUJVVEVfUk9MRSxcblx0XHRcdFwiY29udHJvbFwiLFxuXHRcdCk7XG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKFxuXHRcdFx0XHRcIm1vdXNlbGVhdmVcIixcblx0XHRcdFx0dGhpc1ttb3VzZWxlYXZlRXZlbnRIYW5kbGVyU3ltYm9sXSxcblx0XHRcdCk7XG5cdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXNbbW91c2VlbnRlckV2ZW50SGFuZGxlclN5bWJvbF0pO1xuXHRcdFx0c3RhcnRGYWRlb3V0LmNhbGwodGhpcyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKi9cblx0dGhpc1tyZW1vdmVFdmVudEhhbmRsZXJTeW1ib2xdID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KGV2ZW50LCBBVFRSSUJVVEVfUk9MRSwgXCJjbG9zZVwiKTtcblxuXHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdHJlbW92ZVNlbGYuY2FsbCh0aGlzKTtcblx0XHR9XG5cdH07XG5cblx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMuY2xvc2VcIikgPT09IHRydWUpIHtcblx0XHR0aGlzW3JlbW92ZUVsZW1lbnRTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcImNsaWNrXCIsXG5cdFx0XHR0aGlzW3JlbW92ZUV2ZW50SGFuZGxlclN5bWJvbF0sXG5cdFx0KTtcblx0XHR0aGlzW3JlbW92ZUVsZW1lbnRTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcInRvdWNoXCIsXG5cdFx0XHR0aGlzW3JlbW92ZUV2ZW50SGFuZGxlclN5bWJvbF0sXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHQvLyBsYW5ndWFnZT1IVE1MXG5cdHJldHVybiBgXG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJjb250cm9sXCIgcGFydD1cImNvbnRyb2xcIiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cIm1lc3NhZ2VcIiBwYXJ0PVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiZGF0YS1tb25zdGVyLW9yaWVudGF0aW9uIHBhdGg6b3JpZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpjb250ZW50XCIgcGFydD1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJjb250ZW50XCI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJyZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmZlYXR1cmVzLmNsb3NlIHwgPzo6aGlkZGVuIFwiXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImNsb3NlXCIgdGFiaW5kZXg9XCItMVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGA7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChNZXNzYWdlKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBOb3RpZnlTdHlsZVNoZWV0IH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtDU1NTdHlsZVNoZWV0fVxuICovXG5jb25zdCBOb3RpZnlTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0Tm90aWZ5U3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBub3RpZnkgeyBcbi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9ja30uZ3JpZHtkaXNwbGF5OmdyaWR9LmlubGluZS1ncmlke2Rpc3BsYXk6aW5saW5lLWdyaWR9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS5oaWRkZW4sLmhpZGUsLm5vbmV7ZGlzcGxheTpub25lfS52aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZX0uaW52aXNpYmxle3Zpc2liaWxpdHk6aGlkZGVufS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMiwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0zLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItMHtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOjB9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMSwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0zLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Ym94LXNpemluZzpib3JkZXItYm94O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2JvcmRlcjowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbjowO21heC1oZWlnaHQ6MTAwdkg7cG9pbnRlci1ldmVudHM6bm9uZTtyaWdodDowO3RvcDowOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt3aWR0aDoyNXJlbTt6LWluZGV4OnZhcigtLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5KX1kaXZbZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF06bm90KC5pbmxpbmUpe3Bvc2l0aW9uOmFic29sdXRlfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5pbmxpbmV7LS1tb25zdGVyLW1lc3NhZ2UtYm9yZGVyLXNoYWRvdzpub25lfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXVtkYXRhLW1vbnN0ZXItb3JpZW50YXRpb24qPWxlZnRde2xlZnQ6MDtyaWdodDphdXRvfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXVtkYXRhLW1vbnN0ZXItb3JpZW50YXRpb24qPXJpZ2h0XXtsZWZ0OmF1dG87cmlnaHQ6MH1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF1bZGF0YS1tb25zdGVyLW9yaWVudGF0aW9uKj1jZW50ZXJde2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSl9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdW2RhdGEtbW9uc3Rlci1vcmllbnRhdGlvbio9Ym90dG9tXXthbGlnbi1pdGVtczpmbGV4LWVuZDtib3R0b206MH1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF1bZGF0YS1tb25zdGVyLW9yaWVudGF0aW9uKj10b3Bde2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7dG9wOjB9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRhaW5lcl17d2lkdGg6MTAwJX1bZGF0YS1tb25zdGVyLXJvbGU9bWVzc2FnZV17YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLW1lc3NhZ2UtYm9yZGVyLWNvbG9yLHJnYmEoMCwwLDAsLjEpKTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItbWVzc2FnZS1ib3JkZXItcmFkaXVzLC4yNXJlbSk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItbWVzc2FnZS1ib3JkZXItc3R5bGUsc29saWQpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLW1lc3NhZ2UtYm9yZGVyLXdpZHRoLDFweCk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLW1lc3NhZ2UtYm9yZGVyLXNoYWRvdywwIC41cmVtIDFyZW0gcmdiYSgwLDAsMCwuMTUpKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZTouODc1cmVtO21hcmdpbjp2YXIoLS1tb25zdGVyLW1lc3NhZ2UtbWFyZ2luLXRvcCwxNXB4KSB2YXIoLS1tb25zdGVyLW1lc3NhZ2UtbWFyZ2luLXJpZ2h0LDVweCkgdmFyKC0tbW9uc3Rlci1tZXNzYWdlLW1hcmdpbi1ib3R0b20sMCkgdmFyKC0tbW9uc3Rlci1tZXNzYWdlLW1hcmdpbi1sZWZ0LDApO21heC1oZWlnaHQ6MjAwcHg7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6dmFyKC0tbW9uc3Rlci1tZXNzYWdlLXBhZGRpbmctdG9wLDVweCkgdmFyKC0tbW9uc3Rlci1tZXNzYWdlLXBhZGRpbmctcmlnaHQsNXB4KSB2YXIoLS1tb25zdGVyLW1lc3NhZ2UtcGFkZGluZy1ib3R0b20sNXB4KSB2YXIoLS1tb25zdGVyLW1lc3NhZ2UtcGFkZGluZy1sZWZ0LDVweCk7cG9pbnRlci1ldmVudHM6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOy13ZWJraXQtdXNlci1zZWxlY3Q6dGV4dDstbW96LXVzZXItc2VsZWN0OnRleHQ7dXNlci1zZWxlY3Q6dGV4dDt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1tZXNzYWdlXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9W2RhdGEtbW9uc3Rlci1yb2xlPW1lc3NhZ2VdLmZhZGVvdXR7Ym9yZGVyOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXgtaGVpZ2h0OjA7cGFkZGluZy1ib3R0b206MDtwYWRkaW5nLXRvcDowO3RyYW5zaXRpb246YWxsIC4ycyBjdWJpYy1iZXppZXIoMSwtLjA0LDAsMS4wMyl9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEFUVFJJQlVURV9ST0xFIH0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi8uLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlLm1qc1wiO1xuaW1wb3J0IHsgTm90aWZ5U3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvbm90aWZ5Lm1qc1wiO1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvcXVldWUubWpzXCI7XG5pbXBvcnQgeyBmaXJlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vLi4vZG9tL2V2ZW50cy5tanNcIjtcblxuZXhwb3J0IHsgTm90aWZ5IH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbnRyb2xFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29udHJvbEVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbnRhaW5lckVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJjb250YWluZXJFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBxdWV1ZVN5bWJvbCA9IFN5bWJvbChcInF1ZXVlXCIpO1xuXG4vKipcbiAqIFRoZSBOb3RpZnkgY29udHJvbFxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL25vdGlmeS9ub3RpZnlcbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9ub3RpZnkvbm90aWZ5LXNpbXBsZSBOb3RpZnlcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL25vdGlmeS9ub3RpZnktaW5saW5lIElubGluZSBOb3RpZnlcbiAqXG4gKiBAaXNzdWUgaHR0cHM6Ly9sb2NhbGhvc3QuYWx2aW5lLmRldjo4NDQzL2RldmVsb3BtZW50L2lzc3Vlcy9jbG9zZWQvMjY5Lmh0bWxcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgTm90aWZ5IGNvbnRyb2wgaXMgYSBub3RpZmljYXRpb24gY29udGFpbmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBtZXNzYWdlcyB0byB0aGUgdXNlci5cbiAqL1xuY2xhc3MgTm90aWZ5IGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1txdWV1ZVN5bWJvbF0gPSBuZXcgUXVldWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gb3JpZW50YXRpb24gVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBub3RpZnkgZWxlbWVudC4gQWxsb3dlZCB2YWx1ZXMgZm9yIGhvcml6b250YWwgb3JpZW50YXRpb24gYXJlIFwibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCIuIEFsbG93ZWQgdmFsdWVzIGZvciB2ZXJ0aWNhbCBvcmllbnRhdGlvbiBhcmUgXCJ0b3BcIiBhbmQgXCJib3R0b21cIi5cblx0ICogQHByb3BlcnR5IHtvYmplY3R9IHRlbXBsYXRlcyBUaGUgdGVtcGxhdGVzIG9mIHRoZSBub3RpZnkgZWxlbWVudC5cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIFRoZSBtYWluIHRlbXBsYXRlIG9mIHRoZSBub3RpZnkgZWxlbWVudC5cblx0ICogQHByb3BlcnR5IHtvYmplY3R9IGNsYXNzZXMgVGhlIGNsYXNzZXMgb2YgdGhlIG5vdGlmeSBlbGVtZW50LlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3Nlcy5jb250YWluZXIgVGhlIGNvbnRhaW5lciBjbGFzcyBvZiB0aGUgbm90aWZ5IGVsZW1lbnQuXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc2VzLmNvbnRyb2wgVGhlIGNvbnRyb2wgY2xhc3Mgb2YgdGhlIG5vdGlmeSBlbGVtZW50LlxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0b3JpZW50YXRpb246IFwibGVmdCB0b3BcIixcblx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0fSxcblx0XHRcdGNsYXNzZXM6IHtcblx0XHRcdFx0Y29udGFpbmVyOiBcIlwiLFxuXHRcdFx0XHRjb250cm9sOiBcImNlbnRlclwiLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtOb3RpZnl9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXG5cdFx0aWYgKHRoaXNbY29udGFpbmVyRWxlbWVudFN5bWJvbF0pIHtcblx0XHRcdHdoaWxlICh0aGlzW3F1ZXVlU3ltYm9sXS5pc0VtcHR5KCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMucHVzaCh0aGlzW3F1ZXVlU3ltYm9sXS5wb2xsKCkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1ub3RpZnlcIjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0W119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRyZXR1cm4gW05vdGlmeVN0eWxlU2hlZXRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7TWFzc2FnZXxTdHJpbmd9IG1lc3NhZ2Vcblx0ICogQHJldHVybiB7Tm90aWZ5fVxuXHQgKi9cblx0cHVzaChtZXNzYWdlKSB7XG5cdFx0bGV0IG1lc3NhZ2VFbGVtZW50ID0gbWVzc2FnZTtcblx0XHRpZiAoIShtZXNzYWdlIGluc3RhbmNlb2YgTWVzc2FnZSkpIHtcblx0XHRcdGNvbnN0IHRleHQgPSB2YWxpZGF0ZVN0cmluZyhtZXNzYWdlKTtcblx0XHRcdG1lc3NhZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm1vbnN0ZXItbm90aWZ5LW1lc3NhZ2VcIik7XG5cdFx0XHRtZXNzYWdlRWxlbWVudC5zZXRPcHRpb24oXCJjb250ZW50XCIsIHRleHQpO1xuXHRcdH1cblxuXHRcdHZhbGlkYXRlSW5zdGFuY2UobWVzc2FnZUVsZW1lbnQsIE1lc3NhZ2UpO1xuXHRcdG1lc3NhZ2VFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSwgXCJtZXNzYWdlXCIpO1xuXG5cdFx0Ly8gaWYgbm90IGNvbm5lY3RlZCwgYWRkIHRvIHF1ZXVlXG5cdFx0aWYgKCF0aGlzW2NvbnRhaW5lckVsZW1lbnRTeW1ib2xdKSB7XG5cdFx0XHR0aGlzW3F1ZXVlU3ltYm9sXS5hZGQobWVzc2FnZUVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1ub3RpZnktbWVzc2FnZVwiLCB7XG5cdFx0XHRtZXNzYWdlRWxlbWVudCxcblx0XHR9KTtcblxuXHRcdHRoaXNbY29udGFpbmVyRWxlbWVudFN5bWJvbF0uYXBwZW5kQ2hpbGQobWVzc2FnZUVsZW1lbnQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGluaXRDb250cm9sUmVmZXJlbmNlcygpIHtcblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0dGhpc1tjb250cm9sRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRcIltcIiArIEFUVFJJQlVURV9ST0xFICsgXCI9Y29udHJvbF1cIixcblx0KTtcblx0dGhpc1tjb250YWluZXJFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW1wiICsgQVRUUklCVVRFX1JPTEUgKyBcIj1jb250YWluZXJdXCIsXG5cdCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG5cdC8vIGxhbmd1YWdlPUhUTUxcblx0cmV0dXJuIGBcbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiXG4gICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJkYXRhLW1vbnN0ZXItb3JpZW50YXRpb24gcGF0aDpvcmllbnRhdGlvbiwgY2xhc3MgcGF0aDpjbGFzc2VzLmNvbnRyb2xcIj5cblx0XHRcdDxkaXYgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmNsYXNzZXMuY29udGFpbmVyXCIgcGFydD1cImNvbnRhaW5lclwiXG5cdFx0XHRcdCBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoTm90aWZ5KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBTcGxpdFBhbmVsU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgU3BsaXRQYW5lbFN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRTcGxpdFBhbmVsU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBzcGxpdHBhbmVsIHsgXG5bZGF0YS1tb25zdGVyLXJvbGU9c3BsaXQtcGFuZWxde2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2hlaWdodDphdXRvO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1zcGxpdC1wYW5lbF0gLnBhbmVse2ZsZXgtZ3JvdzoxO292ZXJmbG93OmF1dG99W2RhdGEtbW9uc3Rlci1yb2xlPXNwbGl0LXBhbmVsXSBbZGF0YS1tb25zdGVyLXJvbGU9ZHJhZ2dlcl17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpO2hlaWdodDphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOnZhcigtLW1vbnN0ZXItZHJhZ2dlci13aWR0aCl9OmlzKFtkYXRhLW1vbnN0ZXItcm9sZT1zcGxpdC1wYW5lbF0gW2RhdGEtbW9uc3Rlci1yb2xlPWRyYWdnZXJdKSBbZGF0YS1tb25zdGVyLXJvbGU9aGFuZGxlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMyk7Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OnZhcigtLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtaGVpZ2h0KTtsZWZ0OjUwJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDp2YXIoLS1tb25zdGVyLWRyYWdnZXItaGFuZGxlLXdpZHRoKTt6LWluZGV4OnZhcigtLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lKX0uaG9yaXpvbnRhbFtkYXRhLW1vbnN0ZXItcm9sZT1zcGxpdC1wYW5lbF17ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5ob3Jpem9udGFsW2RhdGEtbW9uc3Rlci1yb2xlPXNwbGl0LXBhbmVsXSBbZGF0YS1tb25zdGVyLXJvbGU9ZHJhZ2dlcl17aGVpZ2h0OnZhcigtLW1vbnN0ZXItZHJhZ2dlci13aWR0aCk7d2lkdGg6MTAwJX06aXMoLmhvcml6b250YWxbZGF0YS1tb25zdGVyLXJvbGU9c3BsaXQtcGFuZWxdIFtkYXRhLW1vbnN0ZXItcm9sZT1kcmFnZ2VyXSkgW2RhdGEtbW9uc3Rlci1yb2xlPWhhbmRsZV17aGVpZ2h0OnZhcigtLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGgpO3dpZHRoOnZhcigtLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtaGVpZ2h0KX0gXG59YCxcblx0XHQwLFxuXHQpO1xufSBjYXRjaCAoZSkge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRkb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLFxuXHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0ZSArIFwiXCIsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHtcblx0YXNzZW1ibGVNZXRob2RTeW1ib2wsXG5cdEN1c3RvbUVsZW1lbnQsXG5cdHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IFwiLi4vbm90aWZ5L25vdGlmeS5tanNcIjtcbmltcG9ydCB7IGZpcmVDdXN0b21FdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vLi4vdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyBTcGxpdFBhbmVsU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvc3BsaXQtcGFuZWwubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IFNwbGl0UGFuZWwsIFRZUEVfVkVSVElDQUwsIFRZUEVfSE9SSVpPTlRBTCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBzcGxpdFNjcmVlbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJzcGxpdFNjcmVlbkVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGRyYWdnZXJFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiZHJhZ2dlckVsZW1lbnRcIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBzdGFydFBhbmVsRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcInN0YXJ0UGFuZWxFbGVtZW50XCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgZW5kUGFuZWxFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiZW5kUGFuZWxFbGVtZW50XCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaGFuZGxlRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImhhbmRsZUVsZW1lbnRcIik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFRZUEVfVkVSVElDQUwgPSBcInZlcnRpY2FsXCI7XG4vKipcbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBUWVBFX0hPUklaT05UQUwgPSBcImhvcml6b250YWxcIjtcblxuLyoqXG4gKiBBIFNwbGl0UGFuZWwgQ29udHJvbFxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL2xheW91dC9zcGxpdC1wYW5lbC9cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9sYXlvdXQvc3BsaXQtcGFuZWwtc2ltcGxlXG4gKlxuICogQHNpbmNlIDMuNTQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBTcGxpdFBhbmVsIGNvbnRyb2wgaXMgYSBzaW1wbGUgbGF5b3V0IGNvbnRyb2wgdGhhdCBhbGxvd3MgeW91IHRvIHNwbGl0IHRoZSBzY3JlZW5cbiAqIGludG8gdHdvIHBhcnRzLiBUaGUgc3BsaXQgY2FuIGJlIGVpdGhlciB2ZXJ0aWNhbCBvciBob3Jpem9udGFsLiBUaGUgY29udHJvbCBwcm92aWRlcyBhXG4gKiBkcmFnZ2FibGUgaGFuZGxlIHRoYXQgYWxsb3dzIHlvdSB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIHR3byBwYW5lbHMuXG4gKi9cbmNsYXNzIFNwbGl0UGFuZWwgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbXBvbmVudHMvbGF5b3V0L3NwbGl0LXBhbmVsXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jLyNjb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH1cblx0ICpcblx0ICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUZW1wbGF0ZSBkZWZpbml0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gTWFpbiB0ZW1wbGF0ZVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gc3BsaXRUeXBlIFNwbGl0IHR5cGUgKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaW1lbnNpb24gRGltZW5zaW9uXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkaW1lbnNpb24uaW5pdGlhbCBJbml0aWFsIGRpbWVuc2lvbiBvZiB0aGUgc3RhcnQgcGFuZWxcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGRpbWVuc2lvbi5tYXggTWF4aW11bSBkaW1lbnNpb24gb2YgdGhlIHN0YXJ0IHBhbmVsIChpbiBwZXJjZW50YWdlKVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gZGltZW5zaW9uLm1pbiBNaW5pbXVtIGRpbWVuc2lvbiBvZiB0aGUgc3RhcnQgcGFuZWwgKGluIHBlcmNlbnRhZ2UpXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0XHRzcGxpdFR5cGU6IFRZUEVfVkVSVElDQUwsXG5cdFx0XHRkaW1lbnNpb246IHtcblx0XHRcdFx0aW5pdGlhbDogXCI2MCVcIixcblx0XHRcdFx0bWF4OiBcIjgwJVwiLFxuXHRcdFx0XHRtaW46IFwiMjAlXCIsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0ZnVsbFN0YXJ0U2NyZWVuKCkge1xuXHRcdHRoaXMuc2V0RGltZW5zaW9uKFwiMTAwJVwiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGZ1bGxFbmRTY3JlZW4oKSB7XG5cdFx0dGhpcy5zZXREaW1lbnNpb24oXCIwJVwiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGlzRnVsbFN0YXJ0U2NyZWVuKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KCkuY3VycmVudERpbWVuc2lvbiA9PT0gXCIxMDAlXCI7XG5cdH1cblxuXHRpc0Z1bGxFbmRTY3JlZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5jdXJyZW50RGltZW5zaW9uID09PSBcIjAlXCI7XG5cdH1cblxuXHRpc0luaXRpYWxTY3JlZW4oKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5jdXJyZW50RGltZW5zaW9uID09PVxuXHRcdFx0dGhpcy5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikuaW5pdGlhbFxuXHRcdCk7XG5cdH1cblxuXHRyZXNldFNjcmVlbigpIHtcblx0XHR0aGlzLnNldERpbWVuc2lvbih0aGlzLmdldE9wdGlvbihcImRpbWVuc2lvblwiKS5pbml0aWFsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHNldENvbnRlbnQoaHRtbCkge1xuXHRcdHRoaXMuc2V0T3B0aW9uKFwiY29udGVudFwiLCBodG1sKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuSG9zdC5WaWV3ZXJ9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXG5cdFx0aW5pdENvbnRyb2xSZWZlcmVuY2VzLmNhbGwodGhpcyk7XG5cdFx0aW5pdEV2ZW50SGFuZGxlci5jYWxsKHRoaXMpO1xuXHRcdC8vYXBwbHlQYW5lbERpbWVuc2lvbnMuY2FsbCh0aGlzKTtcblx0XHR0aGlzLnNldERpbWVuc2lvbih0aGlzLmdldE9wdGlvbihcImRpbWVuc2lvblwiKS5pbml0aWFsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgZGltZW5zaW9uIGlzIGEgcGVyY2VudGFnZSBhbmQgd2l0aGluIGEgdmFsaWQgcmFuZ2UsIHRoZW4gc2V0IHRoZSBkaW1lbnNpb24gb3B0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGltZW5zaW9uIC0gVGhlIGRpbWVuc2lvbiB0byBiZSBzZXQsIGNhbiBiZSBpbiBwZXJjZW50YWdlIG9yIGFic29sdXRlIHZhbHVlLlxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IC0gUmV0dXJucyB0aGUgY3VycmVudCBvYmplY3QgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuXHQgKi9cblx0c2V0RGltZW5zaW9uKGRpbWVuc2lvbikge1xuXHRcdC8vIGNoZWNrIGlmIHBlcmNlbnQgYW5kIGdyZWF0ZXIgdGhhbjEwMFxuXHRcdGlmIChkaW1lbnNpb24uaW5jbHVkZXMoXCIlXCIpKSB7XG5cdFx0XHRpZiAocGFyc2VJbnQoZGltZW5zaW9uKSA+IDEwMCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJkaW1lbnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gMTAwJVwiKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyc2VJbnQoZGltZW5zaW9uKSA8IDApIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiZGltZW5zaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5jdXJyZW50RGltZW5zaW9uID0gZGltZW5zaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1zcGxpdC1wYW5lbFwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge0NTU1N0eWxlU2hlZXRbXX1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdHJldHVybiBbU3BsaXRQYW5lbFN0eWxlU2hlZXRdO1xuXHR9XG59XG5cbi8qKlxuICogU2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwYW5lbCBiYXNlZCBvbiB0aGUgc3BsaXQgdHlwZS5cbiAqIEBmaXJlcyBtb25zdGVyLWRpbWVuc2lvbi1jaGFuZ2VkXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGFuZWxEaW1lbnNpb25zKCkge1xuXHRjb25zdCBzcGxpdFR5cGUgPSB0aGlzLmdldE9wdGlvbihcInNwbGl0VHlwZVwiKTtcblx0Y29uc3QgZGltZW5zaW9uID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpLmN1cnJlbnREaW1lbnNpb247XG5cblx0aWYgKHNwbGl0VHlwZSA9PT0gVFlQRV9WRVJUSUNBTCkge1xuXHRcdHRoaXNbc3RhcnRQYW5lbEVsZW1lbnRTeW1ib2xdLnN0eWxlLndpZHRoID0gZGltZW5zaW9uO1xuXHRcdHRoaXNbZW5kUGFuZWxFbGVtZW50U3ltYm9sXS5zdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke2RpbWVuc2lvbn0gLSA1cHgpYDtcblx0XHR0aGlzW2RyYWdnZXJFbGVtZW50U3ltYm9sXS5zdHlsZS5jdXJzb3IgPSBcImV3LXJlc2l6ZVwiO1xuXHRcdHRoaXNbc3BsaXRTY3JlZW5FbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwidmVydGljYWxcIik7XG5cdFx0dGhpc1tzcGxpdFNjcmVlbkVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJob3Jpem9udGFsXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXNbc3RhcnRQYW5lbEVsZW1lbnRTeW1ib2xdLnN0eWxlLmhlaWdodCA9IGRpbWVuc2lvbjtcblx0XHR0aGlzW2VuZFBhbmVsRWxlbWVudFN5bWJvbF0uc3R5bGUuaGVpZ2h0ID1cblx0XHRcdGBjYWxjKDEwMCUgLSAke2RpbWVuc2lvbn0gLSA1cHgpYDtcblx0XHR0aGlzW2RyYWdnZXJFbGVtZW50U3ltYm9sXS5zdHlsZS5jdXJzb3IgPSBcIm5zLXJlc2l6ZVwiO1xuXHRcdHRoaXNbc3BsaXRTY3JlZW5FbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwiaG9yaXpvbnRhbFwiKTtcblx0XHR0aGlzW3NwbGl0U2NyZWVuRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LnJlbW92ZShcInZlcnRpY2FsXCIpO1xuXHR9XG5cblx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1kaW1lbnNpb24tY2hhbmdlZFwiLCB7XG5cdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRkaW1lbnNpb246IGRpbWVuc2lvbixcblx0fSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGluaXRDb250cm9sUmVmZXJlbmNlcygpIHtcblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0dGhpc1tzcGxpdFNjcmVlbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XCJbZGF0YS1tb25zdGVyLXJvbGU9c3BsaXQtcGFuZWxdXCIsXG5cdCk7XG5cdHRoaXNbZHJhZ2dlckVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XCJbZGF0YS1tb25zdGVyLXJvbGU9ZHJhZ2dlcl1cIixcblx0KTtcblx0dGhpc1toYW5kbGVFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPWhhbmRsZV1cIixcblx0KTtcblxuXHR0aGlzW3N0YXJ0UGFuZWxFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPXN0YXJ0UGFuZWxdXCIsXG5cdCk7XG5cdHRoaXNbZW5kUGFuZWxFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPWVuZFBhbmVsXVwiLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRFdmVudEhhbmRsZXIoKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdGxldCBsYXN0RGltZW5zaW9uID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpLmN1cnJlbnREaW1lbnNpb247XG5cdGxldCBsYXN0VHlwZSA9IHRoaXMuZ2V0T3B0aW9uKFwic3BsaXRUeXBlXCIpO1xuXG5cdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5pc0RyYWdnaW5nID0gZmFsc2U7XG5cblx0Ly8gQHRvZG86IGFkZCBiZXR0ZXIgdG91Y2ggc3VwcG9ydFxuXHRjb25zdCBldmVudFR5cGVzID0gW1wiZGJsY2xpY2tcIiwgXCJ0b3VjaHN0YXJ0XCJdO1xuXHRmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBldmVudFR5cGVzKSB7XG5cdFx0dGhpc1tkcmFnZ2VyRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsICgpID0+IHtcblx0XHRcdHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5pc0RyYWdnaW5nID0gZmFsc2U7XG5cdFx0XHRsYXN0RGltZW5zaW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRsZXQgY3VycmVudERpbWVuc2lvbjtcblx0XHRcdGlmIChzZWxmLmdldE9wdGlvbihcInNwbGl0VHlwZVwiKSA9PT0gVFlQRV9WRVJUSUNBTCkge1xuXHRcdFx0XHRjb25zdCB0b3BQYW5lbCA9IHNlbGZbc3RhcnRQYW5lbEVsZW1lbnRTeW1ib2xdO1xuXHRcdFx0XHRjdXJyZW50RGltZW5zaW9uID0gdG9wUGFuZWwuc3R5bGUud2lkdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0b3BQYW5lbCA9IHNlbGZbc3RhcnRQYW5lbEVsZW1lbnRTeW1ib2xdO1xuXHRcdFx0XHRjdXJyZW50RGltZW5zaW9uID0gdG9wUGFuZWwuc3R5bGUuaGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3VycmVudERpbWVuc2lvbiA9PT0gc2VsZi5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikuaW5pdGlhbCkge1xuXHRcdFx0XHRzZWxmLnNldERpbWVuc2lvbihzZWxmLmdldE9wdGlvbihcImRpbWVuc2lvblwiKS5tYXgpO1xuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50RGltZW5zaW9uID09PSBzZWxmLmdldE9wdGlvbihcImRpbWVuc2lvblwiKS5tYXgpIHtcblx0XHRcdFx0c2VsZi5zZXREaW1lbnNpb24oc2VsZi5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikubWluKTtcblx0XHRcdH0gZWxzZSBpZiAoY3VycmVudERpbWVuc2lvbiA9PT0gc2VsZi5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikubWluKSB7XG5cdFx0XHRcdHNlbGYuc2V0RGltZW5zaW9uKHNlbGYuZ2V0T3B0aW9uKFwiZGltZW5zaW9uXCIpLmluaXRpYWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5zZXREaW1lbnNpb24oc2VsZi5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikuaW5pdGlhbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHR0aGlzW2RyYWdnZXJFbGVtZW50U3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsICgpID0+IHtcblx0XHRzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KCkuaXNEcmFnZ2luZyA9IHRydWU7XG5cblx0XHRjb25zdCBldmVudExpc3RlbmVyID0gKGUpID0+IHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0Ly8gdGhlIDVweCBhcmUgd3JvbmcgYW5kIG11c3QgYmUgY2FsYyBmcm9tIGNzcyBwcm9wZXJ0eSAtLW1vbnN0ZXItZHJhZ2dlci13aWR0aFxuXG5cdFx0XHRsZXQgZHJhZ2dlcldpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShcblx0XHRcdFx0c2VsZltkcmFnZ2VyRWxlbWVudFN5bWJvbF0sXG5cdFx0XHQpLmdldFByb3BlcnR5VmFsdWUoXCItLW1vbnN0ZXItZHJhZ2dlci13aWR0aFwiKTtcblx0XHRcdGlmIChcblx0XHRcdFx0ZHJhZ2dlcldpZHRoID09PSBcIlwiIHx8XG5cdFx0XHRcdGRyYWdnZXJXaWR0aCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdGRyYWdnZXJXaWR0aCA9PT0gbnVsbFxuXHRcdFx0KSB7XG5cdFx0XHRcdGRyYWdnZXJXaWR0aCA9IFwiMFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKS5pc0RyYWdnaW5nKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNlbGYuZ2V0T3B0aW9uKFwic3BsaXRUeXBlXCIpID09PSBUWVBFX0hPUklaT05UQUwpIHtcblx0XHRcdFx0Y29uc3QgY29udGFpbmVyT2Zmc2V0VG9wID0gc2VsZltzcGxpdFNjcmVlbkVsZW1lbnRTeW1ib2xdLm9mZnNldFRvcDtcblx0XHRcdFx0Y29uc3QgdG9wUGFuZWwgPSBzZWxmW3N0YXJ0UGFuZWxFbGVtZW50U3ltYm9sXTtcblx0XHRcdFx0Y29uc3QgYm90dG9tUGFuZWwgPSBzZWxmW2VuZFBhbmVsRWxlbWVudFN5bWJvbF07XG5cdFx0XHRcdGxldCBuZXdUb3BIZWlnaHQgPSBlLmNsaWVudFkgLSBjb250YWluZXJPZmZzZXRUb3A7XG5cblx0XHRcdFx0Y29uc3QgbWluID0gdGhpcy5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikubWluO1xuXHRcdFx0XHRjb25zdCBtYXggPSB0aGlzLmdldE9wdGlvbihcImRpbWVuc2lvblwiKS5tYXg7XG5cblx0XHRcdFx0Y29uc3QgdG9wQXNQZXJjZW50ID1cblx0XHRcdFx0XHQobmV3VG9wSGVpZ2h0IC8gdGhpc1tzcGxpdFNjcmVlbkVsZW1lbnRTeW1ib2xdLm9mZnNldEhlaWdodCkgKiAxMDA7XG5cdFx0XHRcdGlmIChwYXJzZUludChtaW4pID4gdG9wQXNQZXJjZW50KSB7XG5cdFx0XHRcdFx0bmV3VG9wSGVpZ2h0ID0gbWluO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcnNlSW50KG1heCkgPCB0b3BBc1BlcmNlbnQpIHtcblx0XHRcdFx0XHRuZXdUb3BIZWlnaHQgPSBtYXg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3VG9wSGVpZ2h0ID0gdG9wQXNQZXJjZW50ICsgXCIlXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjYWxjIG5ldyB0b3AgaGVpZ2h0IHRvIHBpeGVsXG5cdFx0XHRcdGNvbnN0IG5ld1RvcEhlaWdodFB4ID1cblx0XHRcdFx0XHQocGFyc2VJbnQobmV3VG9wSGVpZ2h0KSAvIDEwMCkgKlxuXHRcdFx0XHRcdHRoaXNbc3BsaXRTY3JlZW5FbGVtZW50U3ltYm9sXS5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdFx0dG9wUGFuZWwuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3VG9wSGVpZ2h0UHh9cHhgO1xuXHRcdFx0XHRib3R0b21QYW5lbC5zdHlsZS5oZWlnaHQgPSBgY2FsYygxMDAlIC0gJHtuZXdUb3BIZWlnaHRQeH1weCAtICR7ZHJhZ2dlcldpZHRofSlgOyAvLyA1cHggaXMgZHJhZ2dlciBoZWlnaHRcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lck9mZnNldExlZnQgPSBzZWxmW3NwbGl0U2NyZWVuRWxlbWVudFN5bWJvbF0ub2Zmc2V0TGVmdDtcblx0XHRcdFx0Y29uc3QgbGVmdFBhbmVsID0gc2VsZltzdGFydFBhbmVsRWxlbWVudFN5bWJvbF07XG5cdFx0XHRcdGNvbnN0IHJpZ2h0UGFuZWwgPSBzZWxmW2VuZFBhbmVsRWxlbWVudFN5bWJvbF07XG5cdFx0XHRcdGxldCBuZXdMZWZ0V2lkdGggPSBlLmNsaWVudFggLSBjb250YWluZXJPZmZzZXRMZWZ0O1xuXG5cdFx0XHRcdGNvbnN0IG1pbiA9IHRoaXMuZ2V0T3B0aW9uKFwiZGltZW5zaW9uXCIpLm1pbjtcblx0XHRcdFx0Y29uc3QgbWF4ID0gdGhpcy5nZXRPcHRpb24oXCJkaW1lbnNpb25cIikubWF4O1xuXG5cdFx0XHRcdGNvbnN0IGxlZnRBc1BlcmNlbnQgPVxuXHRcdFx0XHRcdChuZXdMZWZ0V2lkdGggLyB0aGlzW3NwbGl0U2NyZWVuRWxlbWVudFN5bWJvbF0ub2Zmc2V0V2lkdGgpICogMTAwO1xuXG5cdFx0XHRcdGlmIChwYXJzZUludChtaW4pID4gbGVmdEFzUGVyY2VudCkge1xuXHRcdFx0XHRcdG5ld0xlZnRXaWR0aCA9IG1pbjtcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJzZUludChtYXgpIDwgbGVmdEFzUGVyY2VudCkge1xuXHRcdFx0XHRcdG5ld0xlZnRXaWR0aCA9IG1heDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdMZWZ0V2lkdGggPSBsZWZ0QXNQZXJjZW50ICsgXCIlXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZWZ0UGFuZWwuc3R5bGUud2lkdGggPSBgJHtuZXdMZWZ0V2lkdGh9YDtcblx0XHRcdFx0cmlnaHRQYW5lbC5zdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke25ld0xlZnRXaWR0aH0gLSAke2RyYWdnZXJXaWR0aH0pYDsgLy8gNXB4IGlzIGRyYWdnZXIgd2lkdGhcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgZHJhZ0V2ZW50SGFuZGxlciA9IChlKSA9PiB7XG5cdFx0XHRzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KCkuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBldmVudExpc3RlbmVyKTtcblx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGV2ZW50TGlzdGVuZXIpO1xuXHRcdH07XG5cblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGV2ZW50TGlzdGVuZXIpO1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGRyYWdFdmVudEhhbmRsZXIpO1xuXHR9KTtcblxuXHR0aGlzW2ludGVybmFsU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihcblx0XHRuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuXHRcdFx0bGV0IGFwcGx5ID0gZmFsc2U7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0bGFzdERpbWVuc2lvbiAhPT0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpLmN1cnJlbnREaW1lbnNpb25cblx0XHRcdCkge1xuXHRcdFx0XHRsYXN0RGltZW5zaW9uID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpLmN1cnJlbnREaW1lbnNpb247XG5cdFx0XHRcdGFwcGx5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxhc3RUeXBlICE9PSB0aGlzLmdldE9wdGlvbihcInNwbGl0VHlwZVwiKSkge1xuXHRcdFx0XHRsYXN0VHlwZSA9IHRoaXMuZ2V0T3B0aW9uKFwic3BsaXRUeXBlXCIpO1xuXHRcdFx0XHRhcHBseSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBseSkge1xuXHRcdFx0XHRhcHBseVBhbmVsRGltZW5zaW9ucy5jYWxsKHRoaXMpO1xuXHRcdFx0fVxuXHRcdH0pLFxuXHQpO1xuXG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHQvLyBsYW5ndWFnZT1IVE1MXG5cdHJldHVybiBgXG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzcGxpdC1wYW5lbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3RhcnRQYW5lbFwiIGNsYXNzPVwicGFuZWxcIiBwYXJ0PVwic3RhcnRQYW5lbFwiPlxuICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzdGFydFwiPjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImRyYWdnZXJcIiBwYXJ0PVwiZHJhZ2dlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJoYW5kbGVcIiBwYXJ0PVwiaGFuZGxlXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJlbmRQYW5lbFwiIGNsYXNzPVwicGFuZWxcIiBwYXJ0PVwiZW5kUGFuZWxcIj5cbiAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZW5kXCI+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChTcGxpdFBhbmVsKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBQYW5lbFN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFBhbmVsU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdFBhbmVsU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBwYW5lbCB7IFxuOmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJRdWlja3NhbmRcXFwiLFxcXCJTZWdvZSBVSVxcXCIsXFxcIlJvYm90b1xcXCIsXFxcIk94eWdlblxcXCIsXFxcIlVidW50dVxcXCIsXFxcIkNhbnRhcmVsbFxcXCIsXFxcIkZpcmEgU2Fuc1xcXCIsXFxcIkRyb2lkIFNhbnNcXFwiLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZixcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCI7LS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTpcXFwiQ29uc29sYXNcXFwiLFxcXCJDb3VyaWVyIE5ld1xcXCIsXFxcIlJvYm90byBNb25vXFxcIixcXFwiU291cmNlIENvZGUgUHJvXFxcIixcXFwiRmlyYSBNb25vXFxcIixtb25vc3BhY2U7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTQpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi02KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTIpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMyl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTYpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTIpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xOiM4MzNhYjQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTI6I2ZkMWQxZDstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMzojZmNiMDQ1Oy0tbW9uc3Rlci1ib3gtc2hhZG93LTE6bm9uZTstLW1vbnN0ZXItYm94LXNoYWRvdy0yOi0xcHggMXB4IDEwcHggMXB4IGhzbGEoMCwwJSw3NiUsLjYxKTstLW1vbnN0ZXItdGV4dC1zaGFkb3c6bm9uZTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTEpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTIpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aDoycHg7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXM6MDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci10aGVtZS1vbi1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLW9uLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci1ib3JkZXItd2lkdGg6M3B4Oy0tbW9uc3Rlci1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLW91dGxpbmUtd2lkdGg6MXB4Oy0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZTotNHB4Oy0tbW9uc3Rlci16LWluZGV4LWRlZmF1bHQ6MDstLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lOjEwOy0tbW9uc3Rlci16LWluZGV4LWRyb3Bkb3duOjIwMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bi1vdmVybGF5OjIxMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3k6MzAwOy0tbW9uc3Rlci16LWluZGV4LXN0aWNreS1vdmVybGF5OjMxMDstLW1vbnN0ZXItei1pbmRleC1maXhlZDo0MDA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQtb3ZlcmxheTo0MTA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtYmFja2Ryb3A6NTAwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wLW92ZXJsYXk6NTEwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhczo2MDA7LS1tb25zdGVyLXotaW5kZXgtb2ZmY2FudmFzLW92ZXJsYXk6NjEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsOjcwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5OjcxMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyOjgwMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyLW92ZXJsYXk6ODEwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXA6ODAwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXAtb3ZlcmxheTo5MTA7LS1tb25zdGVyLXNwYWNlLTA6MDstLW1vbnN0ZXItc3BhY2UtMToycHg7LS1tb25zdGVyLXNwYWNlLTI6NHB4Oy0tbW9uc3Rlci1zcGFjZS0zOjZweDstLW1vbnN0ZXItc3BhY2UtNDoxMHB4Oy0tbW9uc3Rlci1zcGFjZS01OjE2cHg7LS1tb25zdGVyLXNwYWNlLTY6MjZweDstLW1vbnN0ZXItc3BhY2UtNzo0MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTA6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNDo0ODBweDstLW1vbnN0ZXItYnJlYWtwb2ludC03Ojc2OHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTk6OTkycHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtMTI6MTIwMHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLXdpZHRoOjJweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGg6NHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLWhhbmRsZS1oZWlnaHQ6NTBweH0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmdyaWR7ZGlzcGxheTpncmlkfS5pbmxpbmUtZ3JpZHtkaXNwbGF5OmlubGluZS1ncmlkfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0uaGlkZGVuLC5oaWRlLC5ub25le2Rpc3BsYXk6bm9uZX0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMywubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLTB7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDowfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0yLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMywubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0yLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0zLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKX0ubW9uc3Rlci10aGVtZS1lcnJvci0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTEpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtMXtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xKX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0xKX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS1kaXNhYmxlZC0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yKX0ubW9uc3Rlci10aGVtZS1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLXRoZW1lLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItdGhlbWUtZGVzdHJ1Y3RpdmUtMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yKX0ubW9uc3Rlci10aGVtZS1zdWNjZXNzLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTIpfS5tb25zdGVyLXRoZW1lLXdhcm5pbmctMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMil9Lm1vbnN0ZXItdGhlbWUtZXJyb3ItMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0yKX0ubW9uc3Rlci10aGVtZS1zZWxlY3Rpb24tMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTIpfS5tb25zdGVyLWJvcmRlci1jb2xvci0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWJvcmRlci0yKX0ubW9uc3Rlci1jb2xvci1uZXV0cmFsLTJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMil9Lm1vbnN0ZXItY29sb3Itc3VjY2Vzcy0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0yKX0ubW9uc3Rlci1jb2xvci13YXJuaW5nLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTIpfS5tb25zdGVyLWNvbG9yLWVycm9yLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMil9Lm1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktZGlzYWJsZWQtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMyl9Lm1vbnN0ZXItdGhlbWUtc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci10aGVtZS10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLXRoZW1lLWRlc3RydWN0aXZlLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMyl9Lm1vbnN0ZXItdGhlbWUtc3VjY2Vzcy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zKX0ubW9uc3Rlci10aGVtZS13YXJuaW5nLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTMpfS5tb25zdGVyLXRoZW1lLWVycm9yLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMyl9Lm1vbnN0ZXItdGhlbWUtc2VsZWN0aW9uLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKX0ubW9uc3Rlci1ib3JkZXItY29sb3ItM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ib3JkZXItMyl9Lm1vbnN0ZXItY29sb3ItbmV1dHJhbC0ze2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItY29sb3ItdGVydGlhcnktM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTMpfS5tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMyl9Lm1vbnN0ZXItY29sb3Itd2FybmluZy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0zKX0ubW9uc3Rlci1jb2xvci1lcnJvci0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTMpfS5tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNCl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KX0ubW9uc3Rlci10aGVtZS1lcnJvci00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTQpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTQpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtNHtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00KX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTQpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNCl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci00KX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1yb3ctMXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1lbGVtZW50LC5tb25zdGVyLXRoZW1lLWNvbnRyb2wtcm93LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcil9Lm1vbnN0ZXItdGhlbWUtY29udHJvbC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yKX0ubW9uc3Rlci10aGVtZS1iYWNrZ3JvdW5kLWluaGVyaXR7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0IWltcG9ydGFudH0ubW9uc3Rlci10aGVtZS1vbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tY29sb3IpfS5tb25zdGVyLXRoZW1lLW9mZntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yKTtjb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLW9mZi1jb2xvcil9ZGl2W2RhdGEtbW9uc3Rlci1yb2xlPXBvcHBlcl17YmFja2dyb3VuZDp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7ZGlzcGxheTpub25lO3BhZGRpbmc6MS4xZW07ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtbW9kYWwpfVtkYXRhLXBvcHBlci1hcnJvd10sW2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7YmFja2dyb3VuZDppbmhlcml0O2hlaWdodDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEqdmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkpKjIpO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmNhbGMobWF4KHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpLCAtMSp2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMil9W2RhdGEtcG9wcGVyLWFycm93XXt2aXNpYmlsaXR5OmhpZGRlbn1bZGF0YS1wb3BwZXItYXJyb3ddOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29udGVudDpcXFwiXFxcIjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt2aXNpYmlsaXR5OnZpc2libGV9ZGl2W2RhdGEtcG9wcGVyLXBsYWNlbWVudF49dG9wXT5bZGF0YS1wb3BwZXItYXJyb3dde2JvdHRvbTpjYWxjKHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpIC0gdmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpLzIpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePXRvcF0+W2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7Ym9yZGVyLWJvdHRvbTp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItbGVmdDp0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpIHZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKSB2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXRvcDp0cmFuc3BhcmVudH1kaXZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1ib3R0b21dPltkYXRhLXBvcHBlci1hcnJvd117dG9wOmNhbGModmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkgLSB2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePWJvdHRvbV0+W2RhdGEtcG9wcGVyLWFycm93XTpiZWZvcmV7Ym9yZGVyLWJvdHRvbTp0cmFuc3BhcmVudDtib3JkZXItbGVmdDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmlnaHQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX1kaXZbZGF0YS1wb3BwZXItcGxhY2VtZW50Xj1sZWZ0XT5bZGF0YS1wb3BwZXItYXJyb3dde3JpZ2h0OmNhbGModmFyKC0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZSkgLSB2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePWxlZnRdPltkYXRhLXBvcHBlci1hcnJvd106YmVmb3Jle2JvcmRlci1ib3R0b206dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci10b3A6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpIHZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKSB2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9ZGl2W2RhdGEtcG9wcGVyLXBsYWNlbWVudF49cmlnaHRdPltkYXRhLXBvcHBlci1hcnJvd117bGVmdDpjYWxjKHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpIC0gdmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpLzIpfWRpdltkYXRhLXBvcHBlci1wbGFjZW1lbnRePXJpZ2h0XT5bZGF0YS1wb3BwZXItYXJyb3ddOmJlZm9yZXtib3JkZXItYm90dG9tOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1sZWZ0OnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSB2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yaWdodDp0cmFuc3BhcmVudDtib3JkZXItdG9wOnRyYW5zcGFyZW50fVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fS5tb25zdGVyLWJhZGdlLXByaW1hcnl7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLXByaW1hcnksLm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2Utc2Vjb25kYXJ5e3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnksLm1vbnN0ZXItYmFkZ2Utc2Vjb25kYXJ5LXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnktcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeXtwYWRkaW5nOi4yNWVtIC40ZW19Lm1vbnN0ZXItYmFkZ2UtdGVydGlhcnksLm1vbnN0ZXItYmFkZ2UtdGVydGlhcnktcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Ym9yZGVyLXJhZGl1czouMjVyZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeS1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZle3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1kZXN0cnVjdGl2ZSwubW9uc3Rlci1iYWRnZS1kZXN0cnVjdGl2ZS1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZlLXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2Utc3VjY2Vzc3twYWRkaW5nOi4yNWVtIC40ZW19Lm1vbnN0ZXItYmFkZ2Utc3VjY2VzcywubW9uc3Rlci1iYWRnZS1zdWNjZXNzLXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Ym9yZGVyLXJhZGl1czouMjVyZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLXN1Y2Nlc3MtcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS13YXJuaW5ne3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS13YXJuaW5nLC5tb25zdGVyLWJhZGdlLXdhcm5pbmctcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1vbnN0ZXItYmFkZ2Utd2FybmluZy1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLWVycm9ye3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1lcnJvciwubW9uc3Rlci1iYWRnZS1lcnJvci1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLWVycm9yLXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi13ZWJraXQtZmlsbC1hdmFpbGFibGU7aGVpZ2h0OmZpbGwtYXZhaWxhYmxlO2hlaWdodDotbW96LWF2YWlsYWJsZTtoZWlnaHQ6c3RyZXRjaDtvdmVyZmxvdzphdXRvO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2JvcmRlcjowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtoZWlnaHQ6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTtoZWlnaHQ6ZmlsbC1hdmFpbGFibGU7aGVpZ2h0Oi1tb3otYXZhaWxhYmxlO2hlaWdodDpzdHJldGNoO21hcmdpbjowO291dGxpbmU6bm9uZTtvdmVyZmxvdzphdXRvO3BhZGRpbmc6MDtzY3JvbGxiYXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtzY3JvbGxiYXItd2lkdGg6dGhpbjsvL3Bvc2l0aW9uOmZpeGVkOy8vdG9wOjA7Ly9sZWZ0OjA7Ly9yaWdodDowOy8vYm90dG9tOjA7Ly9vdmVyZmxvdzphdXRvOy8vYm94LXNpemluZzpib3JkZXItYm94fSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBEZWFkTWFuc1N3aXRjaCB9IGZyb20gXCIuLi8uLi91dGlsL2RlYWRtYW5zc3dpdGNoLm1qc1wiO1xuXG5pbXBvcnQgeyBQYW5lbFN0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L3BhbmVsLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBQYW5lbCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBQYW5lbEVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJQYW5lbEVsZW1lbnRcIik7XG5cbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcmVzaXplT2JzZXJ2ZXJTeW1ib2wgPSBTeW1ib2woXCJyZXNpemVPYnNlcnZlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdGltZXJDYWxsYmFja1N5bWJvbCA9IFN5bWJvbChcInRpbWVyQ2FsbGJhY2tcIik7XG5cbi8qKlxuICogQSBTbGlkZXJcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9sYXlvdXQvcGFuZWwvXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvbGF5b3V0L3BhbmVsLXNpbXBsZVxuICpcbiAqIEBzaW5jZSAzLjU0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgUGFuZWwgY29tcG9uZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHBhbmVsLCBpc24ndCB0aGF0IGNvb2w/XG4gKi9cbmNsYXNzIFBhbmVsIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2xheW91dC9wYW5lbFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgVGVtcGxhdGUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIE1haW4gdGVtcGxhdGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGhlaWdodEFkanVzdG1lbnQgSGVpZ2h0IGFkanVzdG1lbnRcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0fSxcblx0XHRcdGhlaWdodEFkanVzdG1lbnQ6IDQsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkhvc3QuVmlld2VyfVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXHRcdGluaXRFdmVudEhhbmRsZXIuY2FsbCh0aGlzKTtcblxuXHRcdGNhbGNIZWlnaHQuY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRvbSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdGF0dGFjaFJlc2l6ZU9ic2VydmVyLmNhbGwodGhpcyk7XG5cblx0XHQvLyBkaXNhYmxlIHNjcm9sbGluZyBpbiBwYXJlbnQgbm9kZVxuXHRcdGlmICh0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdHRoaXMucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZG9tIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICpcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG5cdFx0ZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFRhZygpIHtcblx0XHRyZXR1cm4gXCJtb25zdGVyLXBhbmVsXCI7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtQYW5lbFN0eWxlU2hlZXRdO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsY0hlaWdodCgpIHtcblx0dGhpcy5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcblxuXHRjb25zdCBoZWlnaHQgPSBjYWxjdWxhdGVNYXhpbXVtSGVpZ2h0LmNhbGwodGhpcywgdGhpcyk7XG5cdGlmIChoZWlnaHQgPCAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYW4gZWxlbWVudCBiYXNlZCBvbiB0aGUgd2luZG93J3MgaW5uZXIgaGVpZ2h0XG4gKiBAcGFyYW0gZWxlbWVudFxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlTWF4aW11bUhlaWdodChlbGVtZW50KSB7XG5cdGxldCB0b3RhbEJvdHRvbUJvcmRlciA9IDA7XG5cdGxldCB0b3RhbEJvdHRvbVBhZGRpbmcgPSAwO1xuXHRsZXQgdG90YWxCb3R0b21NYXJnaW4gPSAwO1xuXHRsZXQgdG90YWxPdXRsaW5lSGVpZ2h0ID0gMDtcblx0bGV0IHRvdGFsQm94U2hhZG93SGVpZ2h0ID0gMDtcblx0bGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcblxuXHQvLyBHZXQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHRvcCBvZiB0aGUgZWxlbWVudCB0byB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuXHRjb25zdCBkaXN0YW5jZUZyb21Ub3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcblxuXHQvLyBMb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIHVwIHRvIHRoZSBib2R5IHRvIHN1bSB1cCB0aGUgYm90dG9tIGJvcmRlcnMsIHBhZGRpbmcsIGFuZCBtYXJnaW5cblx0d2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0Y29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50RWxlbWVudCk7XG5cblx0XHQvLyBCb3ggc2l6aW5nXG5cdFx0Y29uc3QgYm94U2l6aW5nID0gc3R5bGUuYm94U2l6aW5nO1xuXG5cdFx0Ly8gQm9yZGVycywgcGFkZGluZywgYW5kIG1hcmdpblxuXHRcdGNvbnN0IGJvcmRlckJvdHRvbVdpZHRoID0gcGFyc2VGbG9hdChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCk7XG5cdFx0Y29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0JvdHRvbSk7XG5cdFx0Y29uc3QgbWFyZ2luQm90dG9tID0gcGFyc2VGbG9hdChzdHlsZS5tYXJnaW5Cb3R0b20pO1xuXG5cdFx0Ly8gT3V0bGluZSBhbmQgYm94LXNoYWRvd1xuXHRcdGNvbnN0IG91dGxpbmVIZWlnaHQgPSBwYXJzZUZsb2F0KHN0eWxlLm91dGxpbmVXaWR0aCk7XG5cdFx0Ly8gVGhpcyBpcyBhIHNpbXBsaWZpY2F0aW9uOyBib3gtc2hhZG93IGlzIG1vcmUgY29tcGxleCB0byBwYXJzZVxuXHRcdGNvbnN0IGJveFNoYWRvd1ZlcnRpY2FsID0gcGFyc2VGbG9hdChzdHlsZS5ib3hTaGFkb3cuc3BsaXQoXCIgXCIpWzNdIHx8IDApO1xuXG5cdFx0Ly8gQWNjdW11bGF0ZSB2YWx1ZXNcblx0XHR0b3RhbEJvdHRvbUJvcmRlciArPSBpc05hTihib3JkZXJCb3R0b21XaWR0aCkgPyAwIDogYm9yZGVyQm90dG9tV2lkdGg7XG5cdFx0dG90YWxCb3R0b21QYWRkaW5nICs9XG5cdFx0XHRpc05hTihwYWRkaW5nQm90dG9tKSB8fCBib3hTaXppbmcgPT09IFwiYm9yZGVyLWJveFwiID8gMCA6IHBhZGRpbmdCb3R0b207XG5cdFx0dG90YWxCb3R0b21NYXJnaW4gKz0gaXNOYU4obWFyZ2luQm90dG9tKSA/IDAgOiBtYXJnaW5Cb3R0b207XG5cdFx0dG90YWxPdXRsaW5lSGVpZ2h0ICs9IGlzTmFOKG91dGxpbmVIZWlnaHQpID8gMCA6IG91dGxpbmVIZWlnaHQ7XG5cdFx0dG90YWxCb3hTaGFkb3dIZWlnaHQgKz0gaXNOYU4oYm94U2hhZG93VmVydGljYWwpID8gMCA6IGJveFNoYWRvd1ZlcnRpY2FsO1xuXG5cdFx0Y3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlIHx8IGN1cnJlbnRFbGVtZW50Lmhvc3Q7XG5cdH1cblxuXHQvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gaGVpZ2h0IGJ5IHN1YnRyYWN0aW5nIHRoZSBkaXN0YW5jZSwgYm9yZGVycywgcGFkZGluZywgbWFyZ2luLCBvdXRsaW5lLCBhbmQgYm94LXNoYWRvdyBmcm9tIHRoZSB3aW5kb3cncyBpbm5lciBoZWlnaHRcblx0Y29uc3QgbWF4aW11bUhlaWdodCA9XG5cdFx0d2luZG93LmlubmVySGVpZ2h0IC1cblx0XHRkaXN0YW5jZUZyb21Ub3AgLVxuXHRcdHRvdGFsQm90dG9tQm9yZGVyIC1cblx0XHR0b3RhbEJvdHRvbVBhZGRpbmcgLVxuXHRcdHRvdGFsQm90dG9tTWFyZ2luIC1cblx0XHR0b3RhbE91dGxpbmVIZWlnaHQgLVxuXHRcdHRvdGFsQm94U2hhZG93SGVpZ2h0O1xuXHRyZXR1cm4gbWF4aW11bUhlaWdodCArIHRoaXMuZ2V0T3B0aW9uKFwiaGVpZ2h0QWRqdXN0bWVudFwiKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhdHRhY2hSZXNpemVPYnNlcnZlcigpIHtcblx0Ly8gYWdhaW5zdCBmbGlja2VyaW5nXG5cdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcblx0XHRpZiAodGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXSBpbnN0YW5jZW9mIERlYWRNYW5zU3dpdGNoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdLnRvdWNoKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXSA9IG5ldyBEZWFkTWFuc1N3aXRjaCgyMDAsICgpID0+IHtcblx0XHRcdGNhbGNIZWlnaHQuY2FsbCh0aGlzKTtcblx0XHR9KTtcblx0fSk7XG5cblx0dGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0ub2JzZXJ2ZSh0aGlzLm93bmVyRG9jdW1lbnQuYm9keSk7XG5cdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLm9ic2VydmUoZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpIHtcblx0aWYgKHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpIHtcblx0XHR0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXS5kaXNjb25uZWN0KCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHR0aGlzW1BhbmVsRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRcIltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXVwiLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRFdmVudEhhbmRsZXIoKSB7XG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHQvLyBsYW5ndWFnZT1IVE1MXG5cdHJldHVybiBgXG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJjb250cm9sXCIgcGFydD1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+YDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFBhbmVsKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdEFUVFJJQlVURV9ST0xFLFxufSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0aW5pdE1ldGhvZFN5bWJvbCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9GT1JNX1JFTE9BRCwgQVRUUklCVVRFX0ZPUk1fVVJMIH0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgbG9hZEFuZEFzc2lnbkNvbnRlbnQgfSBmcm9tIFwiLi91dGlsL2ZldGNoLm1qc1wiO1xuaW1wb3J0IHthZGRFcnJvckF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uL2RvbS9lcnJvci5tanNcIjtcblxuZXhwb3J0IHsgUmVsb2FkIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVyc2VjdGlvbk9ic2VydmVyV2FzSW5pdGlhbGl6ZWQgPSBTeW1ib2woXCJ3YXNJbml0aWFsaXplZFwiKTtcblxuLyoqXG4gKiBUaGlzIEN1c3RvbUNvbnRyb2wgcmVsb2FkcyB0aGUgY29udGVudCBvZiBhIHVybCBhbmQgZW1iZWRzIGl0IGludG8gdGhlIGRvbS5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1hZ2VzL3JlbG9hZC5wbmdcIj5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGlzIGNvbnRyb2wgZWl0aGVyIGJ5IHNwZWNpZnlpbmcgdGhlIEhUTUwgdGFnIGA8bW9uc3Rlci1yZWxvYWQgLz5gIGRpcmVjdGx5IGluIHRoZSBIVE1MIG9yIHVzaW5nXG4gKiBKYXZhc2NyaXB0IHZpYSB0aGUgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItcmVsb2FkJyk7YCBtZXRob2QuXG4gKlxuICogYGBgaHRtbFxuICogPG1vbnN0ZXItcmVsb2FkPjwvbW9uc3Rlci1yZWxvYWQ+XG4gKlxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1JlbG9hZH0gZnJvbSAnQHNjaHVrYWkvY29tcG9uZW50LWZvcm0vc291cmNlL3JlbG9hZC5qcyc7XG4gKiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXJlbG9hZCcpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBIHNpbXBsZSBjb25maWd1cmF0aW9uIGNhbiBsb29rIGxpa2UgdGhpc1xuICpcbiAqIGBgYGh0bWxcbiAqIDxzY3JpcHQgaWQ9XCJjb25maWdcIlxuICogICAgICAgICB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiPlxuICogICAgIHtcbiAqICAgICAgICAgXCJ1cmxcIjogXCIuL2NvbnRlbnQuaHRtbFwiLFxuICogICAgIH1cbiAqIDwvc2NyaXB0PlxuICpcbiAqIDxtb25zdGVyLXJlbG9hZCBkYXRhLW1vbnN0ZXItb3B0aW9ucy1zZWxlY3Rvcj1cIiNjb25maWdcIj5cbiAqIDwvbW9uc3Rlci1yZWxvYWQ+XG4gKiBgYGBcbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGEgbG9hZGVyLCB5b3UgY2FuIGluc2VydCBhIGRpdiB3aXRoIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udGFpbmVyXCJgLlxuICogVGhlIGNvbnRlbnQgb2YgdGhpcyBkaXYgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbG9hZGVkIGNvZGUuXG4gKlxuICogYGBgaHRtbFxuICogPG1vbnN0ZXItcmVsb2FkIGRhdGEtbW9uc3Rlci1vcHRpb25zLXNlbGVjdG9yPVwiI2NvbmZpZ1wiPlxuICogPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRhaW5lclwiPlxuICogTE9BREVSIC4uLlxuICogPC9kaXY+XG4gKiA8L21vbnN0ZXItcmVsb2FkPlxuICogYGBgXG4gKlxuICogSWYgeW91IG5lZWQgYWRkaXRpb25hbCBzdHJ1Y3R1cmUsIHlvdSBjYW4gc2ltcGx5IHNwZWNpZnkgaXQuXG4gKlxuICogYGBgaHRtbFxuICogPG1vbnN0ZXItcmVsb2FkIGRhdGEtbW9uc3Rlci1vcHRpb25zLXNlbGVjdG9yPVwiI2NvbmZpZ1wiPlxuICogPGRpdiBjbGFzcz1cInJvd1wiPlxuICogICA8ZGl2IGNsYXNzPVwiY29sXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJjb250YWluZXJcIj5cbiAqICAgICAgIExPQURFUiAuLi5cbiAqICAgPC9kaXY+XG4gKiA8L2Rpdj5cbiAqIDwvbW9uc3Rlci1yZWxvYWQ+XG4gKiBgYGBcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9mb3JtL3JlbG9hZC9cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3JlbG9hZC1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBiZWF1dGlmdWwgcmVsb2FkIGNvbnRyb2xcbiAqIEBmaXJlcyBtb25zdGVyLWZldGNoZWRcbiAqL1xuY2xhc3MgUmVsb2FkIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvY29tcG9uZW50cy9mb3JtL3JlbG9hZFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgVGVtcGxhdGUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIE1haW4gdGVtcGxhdGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHVybD11bmRlZmluZWRcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbG9hZD11bmRlZmluZWQgY3VycmVudGx5IHRoZSB2YWx1ZXMgZGVmaW5lZCBhcmUgYG9uc2hvd2AgYW5kIGBhbHdheXNgLiBUaGUgZGVmYXVsdCBgb25zaG93YCByZW1vdmVzIHRoZSBJbnRlcnNlY3Rpb25PYnNlcnZlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb250ZW50IGlzIG9ubHkgbG9hZGVkIG9uY2UuIHJlbG9hZGluZyBvZiB0aGUgY29udGVudCBkb2VzIG5vdCBvY2N1ci5cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbHRlcj11bmRlZmluZWQgZG9tIHNlbGVjdG9ycyB0byBzZWFyY2ggZm9yIGVsZW1lbnRzLCBpZiB1bmRlZmluZWQgdGhlbiBldmVyeXRoaW5nIGlzIHRha2VuXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0W119IHByb2Nlc3NvcnNcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoIEZldGNoIFtzZWUgVXNpbmcgRmV0Y2ggbW96aWxsYS5vcmddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkvVXNpbmdfRmV0Y2gpXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5yZWRpcmVjdD1lcnJvclxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubWV0aG9kPUdFVFxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubW9kZT1zYW1lLW9yaWdpblxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2guY3JlZGVudGlhbHM9c2FtZS1vcmlnaW5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoLmhlYWRlcnM9e1wiYWNjZXB0XCI6XCJ0ZXh0L2h0bWxcIn19XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7fSxcblx0XHRcdHN1cGVyLmRlZmF1bHRzLFxuXHRcdFx0e1xuXHRcdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZS5jYWxsKHRoaXMpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzaGFkb3dNb2RlOiBudWxsLFxuXHRcdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRcdHJlbG9hZDogXCJvbnNob3dcIixcblx0XHRcdFx0ZmlsdGVyOiBudWxsLFxuXHRcdFx0XHRmZXRjaDoge1xuXHRcdFx0XHRcdHJlZGlyZWN0OiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdG1vZGU6IFwic2FtZS1vcmlnaW5cIixcblx0XHRcdFx0XHRjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiLFxuXHRcdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRcdGFjY2VwdDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGluaXRPcHRpb25zRnJvbUFyZ3VtZW50cy5jYWxsKHRoaXMpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nW119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRjb25zdCBsaXN0ID0gc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzO1xuXHRcdGxpc3QucHVzaChBVFRSSUJVVEVfRk9STV9VUkwpO1xuXHRcdHJldHVybiBsaXN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRbaW5pdE1ldGhvZFN5bWJvbF0oKSB7XG5cdFx0c3VwZXJbaW5pdE1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdC8vIGRhdGEtbW9uc3Rlci1vcHRpb25zXG5cdFx0dGhpc1thdHRyaWJ1dGVPYnNlcnZlclN5bWJvbF1bQVRUUklCVVRFX0ZPUk1fVVJMXSA9ICh1cmwpID0+IHtcblx0XHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfRk9STV9VUkwpKSB7XG5cdFx0XHRcdHRoaXMuc2V0T3B0aW9uKFwidXJsXCIsIG5ldyBVUkwodXJsLCBkb2N1bWVudC5sb2NhdGlvbikudG9TdHJpbmcoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNldE9wdGlvbihcInVybFwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgZGVmYXVsdCBzbG90XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIHVybFxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gd2Ugd29uJ3QgYmUgYWJsZSB0byByZWFkIHRoZSBkYXRhXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSByZXF1ZXN0IGZhaWxlZFxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gbm90IGZvdW5kXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB1bmRlZmluZWQgc3RhdHVzIG9yIHR5cGVcblx0ICogQGZpcmVzIG1vbnN0ZXItZmV0Y2hlZFxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5Gb3JtfVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblx0XHRpbml0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItcmVsb2FkXCI7XG5cdH1cblxuXHQvKipcblx0ICogbG9hZCBjb250ZW50IGZyb20gdXJsXG5cdCAqXG5cdCAqIEl0IGlzIGltcG9ydGFudCB0byBrbm93IHRoYXQgd2l0aCB0aGlzIGZ1bmN0aW9uIHRoZSBsb2FkaW5nIGlzIGV4ZWN1dGVkXG5cdCAqIGRpcmVjdGx5LiBpdCBpcyBsb2FkZWQgYXMgd2VsbCB3aGVuIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHVybFxuXHQgKi9cblx0ZmV0Y2godXJsKSB7XG5cdFx0aWYgKGlzU3RyaW5nKHVybCkgfHwgdXJsIGluc3RhbmNlb2YgVVJMKSB7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRk9STV9VUkwsIGAke3VybH1gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbG9hZENvbnRlbnQuY2FsbCh0aGlzKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBVUkwgdG8gdGhpcyBzZWxlY3QuXG4gKlxuICogYGBgXG4gKiA8bW9uc3Rlci1zZWxlY3QgZGF0YS1tb25zdGVyLXVybD1cImh0dHBzOi8vZXhhbXBsZS5jb20vXCI+PC9tb25zdGVyLXNlbGVjdD5cbiAqIGBgYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGluaXRPcHRpb25zRnJvbUFyZ3VtZW50cygpIHtcblx0Y29uc3Qgb3B0aW9ucyA9IHt9O1xuXG5cdGNvbnN0IHVybCA9IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9GT1JNX1VSTCk7XG5cblx0aWYgKGlzU3RyaW5nKHVybCkpIHtcblx0XHRvcHRpb25zW1widXJsXCJdID0gbmV3IFVSTCh1cmwsIGRvY3VtZW50LmxvY2F0aW9uKS50b1N0cmluZygpO1xuXHR9XG5cblx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9GT1JNX1JFTE9BRCkpIHtcblx0XHRvcHRpb25zW1wicmVsb2FkXCJdID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fUkVMT0FEKS50b0xvd2VyQ2FzZSgpO1xuXHR9XG5cblx0cmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIGRlZmF1bHQgc2xvdFxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIHVybFxuICogQHRocm93cyB7RXJyb3J9IHdlIHdvbid0IGJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YVxuICogQHRocm93cyB7RXJyb3J9IHJlcXVlc3QgZmFpbGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IGZvdW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5kZWZpbmVkIHN0YXR1cyBvciB0eXBlXG4gKiBAZmlyZXMgbW9uc3Rlci1mZXRjaGVkXG4gKi9cbmZ1bmN0aW9uIGluaXRJbnRlcnNlY3Rpb25PYnNlcnZlcigpIHtcblx0aWYgKHRoaXNbaW50ZXJzZWN0aW9uT2JzZXJ2ZXJXYXNJbml0aWFsaXplZF0gPT09IHRydWUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzW2ludGVyc2VjdGlvbk9ic2VydmVyV2FzSW5pdGlhbGl6ZWRdID0gdHJ1ZTtcblxuXHRjb25zdCBvcHRpb25zID0ge1xuXHRcdHRocmVzaG9sZDogWzAuNV0sXG5cdH07XG5cblx0Y29uc3QgY2FsbGJhY2sgPSAoZW50cmllcywgb2JzZXJ2ZXIpID0+IHtcblx0XHRmb3IgKGNvbnN0IFssIGVudHJ5XSBvZiBlbnRyaWVzLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIHVuZGVmaW5lZCBvciBhbHdheXMgZG8gdGhlIHNhbWVcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwicmVsb2FkXCIpID09PSBcIm9uc2hvd1wiKSB7XG5cdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRsb2FkQ29udGVudC5jYWxsKHRoaXMpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG5cdG9ic2VydmVyLm9ic2VydmUodGhpcyk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIGRlZmF1bHQgc2xvdFxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIHVybFxuICogQHRocm93cyB7RXJyb3J9IHdlIHdvbid0IGJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YVxuICogQHRocm93cyB7RXJyb3J9IHJlcXVlc3QgZmFpbGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IGZvdW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5kZWZpbmVkIHN0YXR1cyBvciB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gY2xpZW50IGVycm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5kZWZpbmVkIHN0YXR1cyBvciB0eXBlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEBmaXJlcyBtb25zdGVyLWZldGNoZWRcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIGxvYWRDb250ZW50KCkge1xuXHRjb25zdCB1cmwgPSB0aGlzLmdldE9wdGlvbihcInVybFwiLCB1bmRlZmluZWQpO1xuXHRpZiAoIWlzU3RyaW5nKHVybCkgfHwgdXJsID09PSBcIlwiKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyB1cmxcIik7XG5cdH1cblxuXHRjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb24oXCJmZXRjaFwiLCB7fSk7XG5cblx0bGV0IHBhcmVudE5vZGUgPSB0aGlzO1xuXHRpZiAodGhpcy5zaGFkb3dSb290KSB7XG5cdFx0cGFyZW50Tm9kZSA9IHRoaXMuc2hhZG93Um9vdDtcblx0fVxuXG5cdGxldCBjb250YWluZXIgPSBwYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoYFske0FUVFJJQlVURV9ST0xFfT1jb250YWluZXJdYCk7XG5cdGxldCBjdXJyZW50RGlzcGxheU1vZGUgPSBjb250YWluZXI/LnN0eWxlPy5kaXNwbGF5O1xuXG5cdGlmIChjdXJyZW50RGlzcGxheU1vZGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdGN1cnJlbnREaXNwbGF5TW9kZSA9IFwiaW5oZXJpdFwiO1xuXHR9XG5cblx0aWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRjb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUsIFwiY29udGFpbmVyXCIpO1xuXHRcdHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblx0fVxuXG5cdHJldHVybiBsb2FkQW5kQXNzaWduQ29udGVudChjb250YWluZXIsIHVybCwgb3B0aW9ucywgdGhpcy5nZXRPcHRpb24oXCJmaWx0ZXJcIikpXG5cdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0aWYgKGN1cnJlbnREaXNwbGF5TW9kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gY3VycmVudERpc3BsYXlNb2RlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHRyZXR1cm4gdGhpcy5pbm5lckhUTUw7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChSZWxvYWQpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50LCBhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCB9IGZyb20gXCIuL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IEN1c3RvbUNvbnRyb2wgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYXR0YWNoZWRJbnRlcm5hbFN5bWJvbCA9IFN5bWJvbChcImF0dGFjaGVkSW50ZXJuYWxcIik7XG5cbi8qKlxuICogVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGN1c3RvbSBjb250cm9scyB1c2luZyB0aGUgcG93ZXIgb2YgQ3VzdG9tRWxlbWVudC5cbiAqXG4gKiBBZnRlciBkZWZpbmluZyBhIGBDdXN0b21FbGVtZW50YCwgdGhlIGByZWdpc3RlckN1c3RvbUVsZW1lbnRgIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgY2xhc3MgbmFtZS4gT25seSB0aGVuXG4gKiB3aWxsIHRoZSB0YWcgZGVmaW5lZCB2aWEgdGhlIGBnZXRUYWdgIG1ldGhvZCBiZSBtYWRlIGtub3duIHRvIHRoZSBET00uXG4gKlxuICogVGhpcyBjb250cm9sIHVzZXMgYGF0dGFjaEludGVybmFscygpYCB0byBpbnRlZ3JhdGUgdGhlIGNvbnRyb2wgaW50byBhIGZvcm0uIElmIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhpcyBtZXRob2QsIHRoZSBbcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2VsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsKSBjYW4gYmUgdXNlZC5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IHVzaW5nIHRoZSBmdW5jdGlvbiBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpYC5cbiAqXG4gKiBUaGlzIGNvbnRyb2wgdXNlcyBgYXR0YWNoSW50ZXJuYWxzKClgIHRvIGludGVncmF0ZSB0aGUgY29udHJvbCBpbnRvIGEgZm9ybS4gSWYgdGhlIHRhcmdldCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGlzIG1ldGhvZCwgdGhlIFBvbHlmaWxsIGZvciBhdHRhY2hJbnRlcm5hbHMoKSBjYW4gYmUgdXNlZDoge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2VsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsfGVsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsfS5cbiAqXG4gKiBMZWFybiBtb3JlIGFib3V0IFdJQ0cgV2ViIENvbXBvbmVudHM6IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vV0lDRy93ZWJjb21wb25lbnRzfFdJQ0cgV2ViIENvbXBvbmVudHN9LlxuICpcbiAqIFJlYWQgdGhlIEhUTUwgc3BlY2lmaWNhdGlvbiBmb3IgQ3VzdG9tIEVsZW1lbnRzOiB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzfEN1c3RvbSBFbGVtZW50c30uXG4gKlxuICogUmVhZCB0aGUgSFRNTCBzcGVjaWZpY2F0aW9uIGZvciBDdXN0b20gRWxlbWVudCBSZWFjdGlvbnM6IHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL2Rldi9jdXN0b20tZWxlbWVudHMuaHRtbCNjdXN0b20tZWxlbWVudC1yZWFjdGlvbnN8Q3VzdG9tIEVsZW1lbnQgUmVhY3Rpb25zfS5cbiAqXG4gKiBAc3VtbWFyeSBBIGJhc2UgY2xhc3MgZm9yIGN1c3RvbSBjb250cm9scyBiYXNlZCBvbiBDdXN0b21FbGVtZW50LlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNC4wXG4gKi9cbmNsYXNzIEN1c3RvbUNvbnRyb2wgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcblx0LyoqXG5cdCAqIFRoZSBjb25zdHJ1Y3RvciBtZXRob2Qgb2YgQ3VzdG9tQ29udHJvbCwgd2hpY2ggaXMgY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UuXG5cdCAqIEl0IGNoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IHN1cHBvcnRzIGBhdHRhY2hJbnRlcm5hbHMoKWAgYW5kIGluaXRpYWxpemVzIGFuIGludGVybmFsIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50XG5cdCAqIGlmIHN1cHBvcnRlZC4gQWRkaXRpb25hbGx5LCBpdCBpbml0aWFsaXplcyBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gd2F0Y2ggZm9yIGF0dHJpYnV0ZSBjaGFuZ2VzLlxuXHQgKlxuXHQgKiBTZWUgdGhlIGxpbmtzIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uOlxuXHQgKiB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjZG9tLWN1c3RvbWVsZW1lbnRyZWdpc3RyeS1kZWZpbmV8Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5LmRlZmluZSgpfVxuXHQgKiB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjZG9tLWN1c3RvbWVsZW1lbnRyZWdpc3RyeS1nZXR8Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5LmdldCgpfVxuXHQgKiBhbmQge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzfEVsZW1lbnRJbnRlcm5hbHN9XG5cdCAqXG5cdCAqIEBpbmhlcml0ZG9jXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdC8vIGNoZWNrIGlmIGVsZW1lbnQgc3VwcG9ydHMgYGF0dGFjaEludGVybmFscygpYFxuXHRcdGlmICh0eXBlb2YgdGhpc1tcImF0dGFjaEludGVybmFsc1wiXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHR0aGlzW2F0dGFjaGVkSW50ZXJuYWxTeW1ib2xdID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYGF0dGFjaEludGVybmFscygpYCBpcyBub3Qgc3VwcG9ydGVkLCBzbyBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuXHRcdFx0dGhyb3cgRXJyb3IoXG5cdFx0XHRcdFwidGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcIixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gaW5pdGlhbGl6ZSBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gd2F0Y2ggZm9yIGF0dHJpYnV0ZSBjaGFuZ2VzXG5cdFx0aW5pdE9ic2VydmVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RvbS9jdXN0b20tY29udHJvbEBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nW119XG5cdCAqIEBzaW5jZSAxLjE1LjBcblx0ICovXG5cdHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuXHRcdHJldHVybiBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkaW5nIGEgc3RhdGljIGBmb3JtQXNzb2NpYXRlZGAgcHJvcGVydHksIHdpdGggYSB0cnVlIHZhbHVlLCBtYWtlcyBhbiBhdXRvbm9tb3VzIGN1c3RvbSBlbGVtZW50IGEgZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2VlIFthdHRhY2hJbnRlcm5hbHMoKV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50L2F0dGFjaEludGVybmFsc31cblx0ICogQHNlZSBbQ3VzdG9tIEVsZW1lbnRzIEZhY2UgRXhhbXBsZV17QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzLWZhY2UtZXhhbXBsZX1cblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0ZG9jXG5cdCAqKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNdXN0IGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKSwgd2hpY2ggaXMgYSBwYXJ0IG9mIHRoZSB3ZWIgc3RhbmRhcmQgZm9yIGN1c3RvbSBlbGVtZW50cy5cblx0ICpcblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSB2YWx1ZSBnZXR0ZXIgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZGVyaXZlZCBjbGFzc1xuXHQgKi9cblx0Z2V0IHZhbHVlKCkge1xuXHRcdHRocm93IEVycm9yKFwidGhlIHZhbHVlIGdldHRlciBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE11c3QgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuXG5cdCAqXG5cdCAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpLCB3aGljaCBpcyBhIHBhcnQgb2YgdGhlIHdlYiBzdGFuZGFyZCBmb3IgY3VzdG9tIGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgdmFsdWUgc2V0dGVyIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3Ncblx0ICovXG5cdHNldCB2YWx1ZSh2YWx1ZSkge1xuXHRcdHRocm93IEVycm9yKFwidGhlIHZhbHVlIHNldHRlciBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG5cdCAqXG5cdCAqIEByZXR1cm4ge05vZGVMaXN0fVxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9sYWJlbHN9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuXHQgKi9cblx0Z2V0IGxhYmVscygpIHtcblx0XHRyZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8ubGFiZWxzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuXHQgKi9cblx0Z2V0IG5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXQgdHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRUYWcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuXHQgKlxuXHQgKiBAcmV0dXJuIHtWYWxpZGl0eVN0YXRlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3Nhcnlcblx0ICogQHNlZSBbVmFsaWRpdHlTdGF0ZV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1ZhbGlkaXR5U3RhdGV9XG5cdCAqIEBzZWUgW3ZhbGlkaXR5XXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvdmFsaWRpdHl9XG5cdCAqL1xuXHRnZXQgdmFsaWRpdHkoKSB7XG5cdFx0cmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LnZhbGlkaXR5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy92YWxpZGF0aW9uTWVzc2FnZVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3Nhcnlcblx0ICovXG5cdGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpIHtcblx0XHRyZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8udmFsaWRhdGlvbk1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcblx0ICpcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy93aWxsVmFsaWRhdGVcblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG5cdCAqL1xuXHRnZXQgd2lsbFZhbGlkYXRlKCkge1xuXHRcdHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy53aWxsVmFsaWRhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcblx0ICpcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zdGF0ZXNcblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG5cdCAqL1xuXHRnZXQgc3RhdGVzKCkge1xuXHRcdHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy5zdGF0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcblx0ICpcblx0ICogQHJldHVybiB7SFRNTEZvbnRFbGVtZW50fG51bGx9XG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvZm9ybVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3Nhcnlcblx0ICovXG5cdGdldCBmb3JtKCkge1xuXHRcdHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy5mb3JtO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG5cdCAqXG5cdCAqIGBgYFxuXHQgKiAvLyBVc2UgdGhlIGNvbnRyb2wncyBuYW1lIGFzIHRoZSBiYXNlIG5hbWUgZm9yIHN1Ym1pdHRlZCBkYXRhXG5cdCAqIGNvbnN0IG4gPSB0aGlzLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXHQgKiBjb25zdCBlbnRyaWVzID0gbmV3IEZvcm1EYXRhKCk7XG5cdCAqIGVudHJpZXMuYXBwZW5kKG4gKyAnLWZpcnN0LW5hbWUnLCB0aGlzLmZpcnN0TmFtZV8pO1xuXHQgKiBlbnRyaWVzLmFwcGVuZChuICsgJy1sYXN0LW5hbWUnLCB0aGlzLmxhc3ROYW1lXyk7XG5cdCAqIHRoaXMuc2V0Rm9ybVZhbHVlKGVudHJpZXMpO1xuXHQgKiBgYGBcblx0ICpcblx0ICogQHBhcmFtIHtGaWxlfHN0cmluZ3xGb3JtRGF0YX0gdmFsdWVcblx0ICogQHBhcmFtIHtGaWxlfHN0cmluZ3xGb3JtRGF0YX0gc3RhdGVcblx0ICogQHJldHVybiB7dW5kZWZpbmVkfVxuXHQgKiBAdGhyb3dzIHtET01FeGNlcHRpb259IE5vdFN1cHBvcnRlZEVycm9yXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3NldEZvcm1WYWx1ZVxuXHQgKi9cblx0c2V0Rm9ybVZhbHVlKHZhbHVlLCBzdGF0ZSkge1xuXHRcdGdldEludGVybmFsLmNhbGwodGhpcykuc2V0Rm9ybVZhbHVlKHZhbHVlLCBzdGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IGZsYWdzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbWVzc2FnZVxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBhbmNob3Jcblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zZXRWYWxpZGl0eVxuXHQgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG5cdCAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gTm90U3VwcG9ydGVkRXJyb3Jcblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG5cdCAqL1xuXHRzZXRWYWxpZGl0eShmbGFncywgbWVzc2FnZSwgYW5jaG9yKSB7XG5cdFx0Z2V0SW50ZXJuYWwuY2FsbCh0aGlzKS5zZXRWYWxpZGl0eShmbGFncywgbWVzc2FnZSwgYW5jaG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL2NoZWNrVmFsaWRpdHlcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICogQHRocm93cyB7RE9NRXhjZXB0aW9ufSBOb3RTdXBwb3J0ZWRFcnJvclxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3Nhcnlcblx0ICovXG5cdGNoZWNrVmFsaWRpdHkoKSB7XG5cdFx0cmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LmNoZWNrVmFsaWRpdHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3JlcG9ydFZhbGlkaXR5XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuXHQgKiBAdGhyb3dzIHtET01FeGNlcHRpb259IE5vdFN1cHBvcnRlZEVycm9yXG5cdCAqL1xuXHRyZXBvcnRWYWxpZGl0eSgpIHtcblx0XHRyZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8ucmVwb3J0VmFsaWRpdHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBgZm9ybWAgYXR0cmlidXRlIG9mIHRoZSBjdXN0b20gY29udHJvbCB0byB0aGUgYGlkYCBvZiB0aGUgcGFzc2VkIGZvcm0gZWxlbWVudC5cblx0ICogSWYgbm8gZm9ybSBlbGVtZW50IGlzIHBhc3NlZCwgcmVtb3ZlcyB0aGUgYGZvcm1gIGF0dHJpYnV0ZS5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm0gLSBUaGUgZm9ybSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjb250cm9sXG5cdCAqL1xuXHRmb3JtQXNzb2NpYXRlZENhbGxiYWNrKGZvcm0pIHtcblx0XHRpZiAoZm9ybSkge1xuXHRcdFx0aWYgKGZvcm0uaWQpIHtcblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm0uaWQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImZvcm1cIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgcmVtb3ZlcyB0aGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUgb2YgdGhlIGN1c3RvbSBjb250cm9sIGJhc2VkIG9uIHRoZSBwYXNzZWQgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQgLSBXaGV0aGVyIG9yIG5vdCB0aGUgY29udHJvbCBzaG91bGQgYmUgZGlzYWJsZWRcblx0ICovXG5cdGZvcm1EaXNhYmxlZENhbGxiYWNrKGRpc2FibGVkKSB7XG5cdFx0aWYgKGRpc2FibGVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikpIHtcblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG5cdCAqL1xuXHRmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGUsIG1vZGUpIHt9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRmb3JtUmVzZXRDYWxsYmFjaygpIHtcblx0XHR0aGlzLnZhbHVlID0gXCJcIjtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAqIEB0aGlzIEN1c3RvbUNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWwoKSB7XG5cdGlmICghKGF0dGFjaGVkSW50ZXJuYWxTeW1ib2wgaW4gdGhpcykpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcIkVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcIixcblx0XHQpO1xuXHR9XG5cblx0cmV0dXJuIHRoaXNbYXR0YWNoZWRJbnRlcm5hbFN5bWJvbF07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEB0aGlzIEN1c3RvbUNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gaW5pdE9ic2VydmVyKCkge1xuXHQvLyB2YWx1ZVxuXHR0aGlzW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXVtcInZhbHVlXCJdID0gKCkgPT4ge1xuXHRcdHRoaXMuc2V0T3B0aW9uKFwidmFsdWVcIiwgdGhpcy5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSk7XG5cdH07XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgQnV0dG9uU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgQnV0dG9uU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdEJ1dHRvblN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgYnV0dG9uIHsgXG5bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Ym94LXNpemluZzpib3JkZXItYm94O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfS5tb25zdGVyLWJ1dHRvbi1wcmltYXJ5LGJ1dHRvbnthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofS5tb25zdGVyLWJ1dHRvbi1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLXNlY29uZGFyeSwubW9uc3Rlci1idXR0b24tdGVydGlhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tdGVydGlhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1idXR0b24tb3V0bGluZS1wcmltYXJ5LC5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXNlY29uZGFyeXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofS5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KX0ubW9uc3Rlci1idXR0b24tb3V0bGluZS10ZXJ0aWFyeXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQpO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofWJ1dHRvbjphY3RpdmUsYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTIpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuOHMsY29sb3IgLjI1cyAuMDgzMzMzMzMzM3N9YnV0dG9uOmFjdGl2ZXt6LWluZGV4OnZhcigtLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lKX0ubW9uc3Rlci1idXR0b24tYmFyLC5tb25zdGVyLWJ1dHRvbi1ncm91cHthbGlnbi1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOm5vd3JhcDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ubW9uc3Rlci1idXR0b24tZ3JvdXB7Ym94LXNpemluZzpib3JkZXItYm94O2dhcDowO21hcmdpbjoxcmVtIDB9Lm1vbnN0ZXItYnV0dG9uLWdyb3VwPjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDpjYWxjKHZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSotMSl9Lm1vbnN0ZXItYnV0dG9uLWdyb3VwIDpob3Zlcntib3gtc2hhZG93Om5vbmV9YnV0dG9uOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00KTtvdXRsaW5lLW9mZnNldDoycHg7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpsaWdodCl7YnV0dG9uOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKTtvdXRsaW5lLW9mZnNldDoycHg7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9fS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMiwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0zLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItMHtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOjB9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMSwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0zLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KX1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlJhbGV3YXk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6MzAwO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUZKNEFCSUFBQUFBdDNBQUFGSVFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRThHKzQ2SElVOEJtQS9VMVJCVkVRQWhRZ0lnUW9KbnhRUkNBcUJ1Z3lCbW5BTGhDSUFBVFlDSkFPSVFBUWdCWVVVQnlBTWd4d2JmYVFYYUplZm1OejBab2wzdjYwY1BlWk1wRzRISlNqazVxSUlOZzZDR01nbFpmLy9uM0Ywak9HR0RSQTFyWGVJbmNKSVVrTkhHbjY5cU1SRFU4WmFqanM5VWJzbXRucW5FM3YzdnFpUW1mUlFwTGtLVzZRWndhbDZzNUlVaUpOVVNVRy9Pd29EWTZCNjc1T2pTamtEU1NNdTJwZWRwdTl2SklMVWxKZDcwN0QrZUxIcGpZREk0ZTF1RG5MakhIdnhwRFhHTXlkdUxMbjFxdDBGQ1FPeUZzSlpFMStrSnEzVCtJZTdCSkZJTk9BTmJpOXZUVXpoSTdXNEdtVUwwbFdqVC9GUVFpL20rK3h1UFAwMm9tUkhlNXBuNERnZk5aZm4rUjl6OTc5dG1FZU5hcTFSeFJxSFRqVFBOQTJKRkVnckhkby9udC9XLzV6YmdHQ3hpYTZFa1ZpQTJGaFlHSXRSbUUxWnZWVXZxdFN0YjdNdnJkM1c3K3QyKzBYZG9Ubnp6allicDdtU0hMQUNraE1XZ0NUTDZzMFd2MEFVb2hKZkVxRTNvcFBkNThpa0puS2xvKzN1YWVTSFlKNmZjSWNYamQrcktVRXNhRWxUcWxVbFZSbS9OK2UvOGlQMEw1QUtvek5sSjMvOWlCd3NoTTZ2NUpJVUp5a2dUM2Zkck9tcTZMY3MrWitxL1hzQVhGeEVFaVFJVWFLb3NGbjdjdFQrN0JCUzVkcURvbEpYdW5ibDdydHR6RC92Mzg0TGZ0SmFnRkZBTFlQRTVBN2duTXJaQmh0NGxYcXNiWkttYmRxMFR0T21wbWdOaXVnTTJQWUJjNzNNcmpxN0dMc29YSGNUcHQ5dVB2RkR6OGVOM2crc3hyUFFBdzZEVEZOcC9PWkk5aWluTml0WmhSbXBRT0NrZG9CZEFOalZXbGF2TWl0d0ROSlgvcFlJQWtWd25PUC92VzV4em9NdzdTQUZBS1UrWnova25QL1o5aitPZGZyTDhLZTJ2ZEtibXBodXhKU3VMOEVVQWdnSElpQkhQKzQ0NEVEenYxUFRRM1lrT2NPU2xUSG1qNlVzZGZvMkwrL2pwWWU3SUhXY1FVZ2Nna3BMRlIxWVRXOENHS1FYOWI4R0ZBQUFIOXRvNFJIUTZHTHZGUnJpNERpd1R6QUFERE1LRFByL2ZaM1YvcWRnUG1rR3pLVEVtV0VYYjdRM3R0Z1RZcW8yblA2Lys5N1hmK0YvOUpIQVZzSUljQUNCWndSeWtHVDdnQ1I4Vm9oSmNVT09TRGppU2JBcGhNb3ptMkpScHRCdFVXNjlYYk5GRzNJVnkyS0xvazQ4L0xmc201MjdJYXFCTE11QmJPRkl3ZUZVZDAxdmVMK1k4eFdodHpjcVRtMkNJVGM1ZUxKd1NJNGZZbExZRklWSEFzLy9UNTNONC9ZeDFoS0dVK0hTcUVyZHBQUG5zNmZxcVdKc05iWmFDbFF0amxPTFVNc2hjZG9BNVRRc3M0SkxjOTBTeENPTU1VSzRLUDlOc2hwenBYNHZ3eEtDaENBU1JFUkUvTEtzV1JsSndOS0FjVG5YQWhFeTNyMUtIY1phL1lkWDU4NDIwL2lhWG10R2hvQ0FpSWlBUjIzdi9QOStLVEFDQU41aGRrQzN4VUM0RUxzZ2d2a1Iya3JFallTRXYwQktTbUhDaEl2WU9DQUprS1FneVlNTTJRb1VNekNvMTZCSjg1cUFXQ0NkSGVrM0FCME9ETDFMcTBQZ1RlM2hTdzJmaGk0WGhQdWV1UVdFSDZ4dElFUUFiRzJObTVvVjU0UUZQK3lLZ08yRDRUNXQvd3oyWFc5Mi9ycHFwTFRTSVA4cVY5dkx2T2RzME5MV3lYNTFLNm9mYnZQWkUxcGFmN3czMThDOVp0aHE3ZjMyYmZ1TDY0VlpIdzUxNFlzbTVsZ2ZOYmZHN1c5bHNVQTRFR3o3MjN2eHdHenA0ZlJSK21QOExzNUI3S0IyZURKWGM2eHdsRzY5MDJ1ZzdBekxBOE5ZMjFCMmRCL1A1cWZPVjh0MW9ueUw1alpERGZRSTVSZzhEOThGdkhzdmNsSHVKc3JkdnNKcnBjL1RyL2d1L0VmWkp6WFV6cFdhRGo3TTcrVVA4LzhFa0FBVmFBUy9DUitYcy9KTjRZYUljTzF4SFpjVWFNTWJrbHJwS3k3TmZRSktRY1VSYWdvR21DVytIQTZFTnZiZzMzc2wycElZUm1FOWJJSGIwbUE2a2s2bE41R2R5TU41RWJtUWh4SEtsd01nVDU4Y2d3N3BkVVJ6N25mTWNRZmNVM3ZJY3pWa2RyaFg4WEhxNDAxMnRGT2Q3a1QvYTdwN204M1dBNzFGN2FPOU0rZGp2ZGQ2ajdmeG0rRDFQdTN6M3VpcnZtdXl6YTUzdHJ2OTNsVGI4MlJUMkthRlZVS01OUDM2QnZRTUNvMEdzRWRrTDhzK3pMZzFFeGJNME5nQ1dBeGd6ZjgyREcxS1hNZmM0cmpOY1FmSEt4U0N1UnVCSTVBb2RERERrR2RWOENuVlZFbUVNYWluNFNhMEFYVEkwUkJOcE9ZQUxWcTFhVjl2eEppVXpIS1dDaXM2bXAwQnVreDA2OUdyNzRzblZOYnNvQ21rVk1vcDUrcERHYVd6MnNMRHIyaU50K29aTzBiMzZZU0lqV2N4dm5sTjB4MFZobFlvVzRVUmpYWEt5TEczWTNxb0xkRWF6SEFFRW9WdU1sM0REZUVSVnBHL2plVEVSMENVWkVVMW1vdHFGb2l3SkZLVWFERmlhY1NsQkpyRWpTUUtKL0NTRlNtU0trMTYxUWxrZEtleVNYWXpzZFhLaTZJOWlrTkpNdENVS2xPdVFxVXExVkhUMXpxNitsemZRTkFJYTVKcFJvdldhRVA3Wnh1Tm1Uak1MQll1cTNYVVRnTmRSRGQ2VXE5QTMzY2J4QXp4RERPTjBJeGFOVmF4ZC8vcy9hanhBRTZKblBiRkdaa3VDM3VhTlU4RXNEU0xaVm14T2oxUGQ4SFF4WFNwZWRrWGF3Ylc2d1pvOCs2RHJpdVFGRnc1SXB2bkpoNi9aZ0ZKSzkzMGFFTTJYSjN5SkIwREhvcGhicWcwdXJrdk1JZ1lsdGJHUlBjZGtkN1ZqL05WNHBiQWJhKy9FNEJqQ2c5cDVaZXJpL3BkTTBDRy83dFhaTnhWRSs2YllhdlFuNnVtV3d5M0ZYZjZnZytYbkF0SERnamtQTmlVYnFwb3d2RFV2YlJsY2o1WFpIWXpWOEppNE5sMXZqc09ock1heE9IeGVEd2Vqei9WSUhKWG42SDB3aGc2cUZPRVVxUW8wV0xFMG9oTENUS0oweVE1TFU5eVJRcFNwVWxmWm5BU0JrV3BsQ2xYb1ZLVjZxaWJUQnRNbVFLWVlXSFZVVWZ0R0l0NjJsZG5NSDNFcGlVMHFWUXFIYkNMeE9VK0U0LzFYTGZCRWh6S2hnVWNnVVNoZnh3bUR6OUc1RVJBQUhMN0ZIUktReXJud3V4UWY1cmhIQkVCUklvU0xVWXN6VWJjNHJ0TWRwbDI2RmdkNTV0Z1FHOHgvZkFaMkp6SXZHYm1scmNYQW0zd1hLYTdFbGZQY1MydHhmcStlZ2ZpSEdvRE14eUJSS0h2eTNTSjMwUTZWOCs2bWRmWnNhRlYzZU9VS3NXTXlua2h5TDF1NFZJMEwxU0pMSXhYeVl6cEx5TnFpV3owWFRwa2FUeW4xWkR0aTkwbVkwMnYwdFVxdHpTQ2wrcXJLN3JJdXYxdjlSRDBzZ3hxR2JKb0dHZkVrbEUxWXpyMjhPMWwyS2V3WDlONEFEYU4xYjdMMElhUlRYT3V5OXlpdTgycE93SFFCQytwbGRDck9tSzBNZy9yMXZSWUVtM0RCRWNnVWVnbVV4MDNHNCt3aXRRZ09mRVJFQ1ZaVVkzbTR0bUVJdndVS1VxMEdMRTA0bElDVHVJMHlUcXRGY2xFQ2xLbFNhODZXRVozSkp2c0ZXaTdJeEtKT0J3T2g4UGhjRVRyUk4zdERwbE1KcE5oUklhaXFBaUdZUmdtY2Jrc3k0Tm96L3JvZlFMN0tjYWxORDBGT1czUkdadU9CUjJ4bVZNeGtVZ2tEbDBYN3VKaXV0UzhiTkdhRSt2L1pRT3dxZTg2R0lJZUVzQ3VvdldZZkNxMnR2cE1PQk43TXpPNjhHV1hMaHRtZ1cyZmZlSHAxTXU3cXdYNU5Ed1RrcENTY2VmQmt4ZHZmaW5BUklSSVVhTEZpS1VSbHhJQWlaRTByVnE2NUlvVVNaVW12ZXFVTXJwcy96MVpXRVo1WUJnR0FBQUFBQUNBMFdac2QxQ3ArSHcrbjIvY09sazRyRHBTbDFLM0hyMzZqZzFDVHR3ek9jTnVDWFlOZ2lEWWhvdEgxb2dPTFJTdXg4bmlsNHIyaVlhdjBub3J6WHZaMm5aalpMZmFLRCtWUmdIL2ZnTm1wa0ZiaGdpR2lVYWNHZlhObUs0OUZQdlk5dHZiY1RtNzUrM2ZkYW1XNllTdHdrZHphQ0haY3ZxMENTNGlVNVptTnhMWEdCZS9yUW9Iak1QMS9RRUdWTVpGSmdiRERKLzVUM2V5QmN2R1BTcVRpbUpjQytZUVVqcUd2Mm5DN3EzbkIwRE9xdjJHM1Z2bEloS0lXOE1SU0JTNnlaVGlOR0ZYK1JHQ0RIczhQWUlkVGpkQVVBeXZRa3dTQ3BwaE5kMjBtcHVNalFYS0JRa1dJalFwbUpSVUtZeEtYY0xEYzZrSWZIYVRLYU9NU2M0TXNWUllRMGV6VTZGTHBWdVAzdExIdXdwcllmdGhpd2lIRkFXa1NwbVdSdCs2bko2VTE4Q3V5Sjg1ajJ4MGIwZDdOOXBpYnEwbGI0Tm5VK3BPN3RFVUxpaGRVTzJocnB0Z1lYQ3N4QkZBM2xRMm5tRmMzRmJSakdCZ0NkNkJVSDdxblhCYmFjanNLOTlSZklETUFGa0Jzb08rblpnOFAwQkJnTUlBdFFFYW45V1FFczlNQUhORzg1NTR3YStBcm5xdlRUanBHUzdlL2lsUG1qQVJQbW5zeFdrZEFBUnlPTDl5QWh5bXg3U0dLbGs3R2g0OHZEdk5mZGcrSVRCWnBEOWd6Z01JQnd3Qms1dG1rRVhJcXFNTWFFVGcvSFVlMjZvTFRUcDR3NGc5VWtaNWJnYnhFSHRDeVRMWVBIbUpVcTN1SnBxenZTTmN1bWJCZFhZUXNrdTFDOTJOOGpUdkRGRVUwcnY4MTdnbXFzR2pQZlJ1Tmp2ZXJURG1IQ0U0cStxYnpPanVJSXZSYURoeloxL1ZKVXBoaGlPUUtIUXdzWjVUamd1QUI4Q3VLcitZSU1LZXdJb01PNXh4OWU0QUVCVERTWXBtMk9UeThvSW95WW9hamVqVVFiOEp3RC9YQjVpU3N3VWlnaEFzUkdoUzBDZ3pKelhNQ1RVMVhFWkhhVEFYVENRU2ljWGJZNFZDb1JnTEV4c3RsZEN0eFoxYVVubHV0R2h0T1F0MTgvUlVkVnBrREJ2YlM0bkVvTkZvTkJxTkZpZFhuMFdKTEpDclU4Q1VicXFNaFpHcG0rRjhFYkJJVWFMRmlLVVJseEtFRWlWVkxWTnlSZ3BTcFVtdnVnQVpoQUdseXBTclVLbEt0YnBtQTZ3clFMY2V2ZnFhRTdEVFdzNllIbTBFMmRjbGlXV3NXRTNubVM3RzViNnVHVm5Qbk51eXlXYkh3eERqcFdrNk0rajIwZVlNTFEvMDNWTW1LbTRabmdsSlNNbTQ4K0RKaXplL0tyZENrVk1sS3N5SW1tZVpmMEdReXdKQkVGeEMvcmdnQ0lJZ0NJSXo5MGJERXdNVGo4ZmpBVUF4ZFM2VnNEY3MxZzh3ZllDWHJOZDk4U0g4Z2FqazV2dVVQcWc0WERQOUptN29HV3ZHWHhTZEVMTGZyc0VTRXNtV1hUY00zY0x0SEZTR2JTSEJBamNDaVVJWEpxSG5NbE9MUkJMYXNuVUsyU3V4MXpxbk1CL1pNR094L3pQdThvaERBREFBT0FBQ0FBbUFBa0FEWUhnbENrQ3VMVkFpU0lLRkNQMGtoV05LUEZVd2JkeUwrc0RCeWVna2FKMldFTXRXckU2LzR2cFc3RzZlNG1EdzBCZnhaaEZ0OUd2ZmhQRUFteWQ0Y010VXFzUGw0YXk3R3VhazV0ME41Mk9Pd0phQmdTTkhzazJOaDdxRVdaWVZxOGUra3N4amozRUtTWGc4TE5pbFFxRlF6RTFmdjV0dnBRUUZ0RklteUx0aXZUZVdrUUNrNVpSZTJRaUoyWnJMWURWODZNQllXWDV4QVB1bmsxeW50WjJ4NmFiTnJpWEFzaFdyY2ZrVTYzeS9qL20rZ256TjhJM1l0eHpmQ2VPaUFQaTdZaDF3QkJLRnpzNzJXcmxpZldiM24rc09ta1NpelhIVFhwbXZBbk9nZWErN1M4RjFFSFA4blU0SW5GWTRRNW1XcDNCQUxsZXNhN0J6NEZ1T2JFNEVYUm5peWs4aHRDT2lrOHZsY3NXWUlLcjQvY0hNM1hYSWNjeU9Ec0JYSDlSM05JQmpVc2QxZmlkajBpaW5INXJpWmZVT0RUaUZRdWx6ZWF4NytqSFpWeXhmMzhVM3hMZHIrVTd1NDNINTlLZWdLOTVKdnd2eXFuM0lneEx5VUcyWTRRZ2tDdjFCVEQrSXZDTVBNZzBsVllSQm5TSVFrYUpFaXhGTEl5NGxDQ1QyaG0wc0VBZ0VKVERycWI0Z0oySllvelNVS1ZlaFVwWHFiTnJaK1poZWpiKzVySHJHemNjTFFoSlNNdTQ4ZVBMaXphL0t6UW5NQ0VLd0VLRkpZWUd5TnlLMWx0SlUvSjZXbUZ4VXFMc0luWFNzMzRzNEFKblROUDlKVjgxWlcwOGJ3b3h3ak1vR2crMWdQUHh3QU1lWmtCRUUrVnN1cHN4bzljV1M1aXZuYVNVcEZKUTFURWJ0ZXlLak1BTGxTUWg2UkszZ0NDUUszZVFVNGpiRUM3dXEvQXlDREh1Q0JRVHNjTWJWdXdNVUJCVERROXlRRk0yd3lSbnlFU3hLc3FKR1UzUmlFRFBYTDlEWjVGNElwQXVTWUNGQ2s4SUdaVk1GQ2RPa0x1RTFJS1ZGbEdneFltbkVOZU5CQ1ZTSmtuSkVqK1NNRkVtVkpyM3FtREtJekdsa1NiYmQ5SExrMWZ4KzNlK1ZDcG1Lb2hnbHlVQlZxa3k1Q3BXcVZLY2FVRzNVbGZwb2tNYmF4TkFzTFZxMWFVOUdJbE9mdkpsTXBwakpaREpiUmp0YU5Xay9yeldvTUlJYU5XZXNhdXQwM3lNTzJQeElJNk1CRTkxcWZvRHl4Q1N3Z0NPUUtIU1Q2UVZ1RGg1aEZYbHB0cmdNanlCS3NxSWFMMTdHY2RrQTU4QThnQ1kvMzJQTGJ3a25DUUJBTm10Q3c2Tm9CclZJcXpidE9Vc1dVNDA1bEN3WjF0RHg1cDFvN1RFZEpCZ1NHTDc3N0JFam85NGFvOW9qdEs5YnY1L2hBTThSYTQ2U2pnbWRlTHpORE1oaVVIbnU3UW1EREJaK0lVRmlUY0pvSGNsSWtTcE4rbVpHY1RjSDVJY0JwY3FVUjBXb1ZLVTY2cVozdXNlZ0YzbW4rYkZscmlxOUJtbW5WN1BiN0cwUnRDYXNPd0tRWkVnaDQ4NkRKeS9lL0o2SnJ6MnJ2ejExOFBrOFBwL1A1eS85TlBKaXI5Z0p3eWxLclV5NUNwV3FWRWZkVkZOdGhyV2dWWnYyWklTWWVyZUJvSmRIS2VhZWcwSjdVQmVxUjhTTzFhbjNwRkFNS0x3SXRWU0orK0ZtbmlIRXNGRVFXK3Bla29NNUhxZjUwbHhCTEx2OXpDTUFaVFBRMTduOVg1a0hGWDdjNlEySnZiK0tTSXNTTFVZc2piaG12SkVFV3hMSEpEWE1TSzVJa1ZScDBxdU9JS09Mekdsa1NiYmQ5SExreVZlZ01CVzVVS3drR1d3cFZhWmNoVXBWcXFPbWo5cDVxbE5UMy8vMXhzaUFSQ0tSU0FCQUJRREFnRUFnRUY0a2NIUEE0eS9mMm03WUdvNUFvdENWU1NJYVRlVkdGQUFseDFSSVpSdkdjNWowSkllb2N4enpwS3RjYXljeEkxaFN5Vis2MS9HQ3d1ekFNZlFNdzZMVEtkOG9zRkFjck5WRFBJZUZzNkxIRnhsTnl0aWVEamI4R09RUWJoU0l0ajAyZ0lnOE9WYlVmZ0YvR3RrYUNzTU1SeUJSNkQ1NW1jUGpMYllrSThKMHdKd1hmL00xbm85ZGpUVmRXaHBpRDRNamtDajBHWVk2a1kxTjVRNEVLZ1VoV0lqUXBOQ2piS29TQ05PaVhvWmJWRjkvenNMZEdZR2dWYk16d0p3ejgrbXFVMnNqWTFCcmNqbDNmRy9zZno2cTdvZzJZMzR2ZnBkVWhlL0NaMkhIOHlBQS94UThEM215QUlETkFWc0NBSmJabnhpMmNINXMyY1JKd1ZhT20yV1dzdFBHWnhZWkExS0lSN210M0F6QW10a0ZVSTVpbERjQW0yUXdvakZYQjZyM0lzQnlWcTVsK3ROYWJjdHJGK1FyQVErbGtpVVd6aUhHS1djNXUxRlVkTUtNaG54aXhuQVU0bGthQW5vL25odVNjRW5IclE2UUVkb1IyRklRNEdGbllIa2ZCZ0pUd05sNDJyUUg3ZFY2SUJLeDRHRElQVFNQQXRZSGN1YS9VemVQMWVwWkpOYXRPQVNxRkVRa1lDV1NqS29tY3ZKNFEvbFltUjZiV2lFV1dWSUZBTmFJVE9WdzJaVkh6cjVNekMvMGkvRDFrd0VXVkQvelQ5YjZERzYzMmlLNFVxQzdUUDJVTmJua0VZODY0WFlpS2xXK0JTM0ZVS3hIRFFZbys4Qjl5ejF3NGgwN0JhNFFra3pMMExHSkdJcnJaK2NOWHVCM1B3NmNlZHBBTVU2R3pSUXFEVzdudEIrY1dpc0Z5bzNXQ21RakwwTW1Yb0JxTldSRklaSTdnRFhodFNjdDhMcEJma0hzUlE2WHBWZklSdlpCVThwODVGNGhIOEVLbnhtRVltdStLNmNZWTNnUWUxKy9UekpBSVJGMWNLdk5tbjJRME04YU9Xc1hqVDlqdkJDcjUyMXhxdFdWSTZhcExwZWhLY3hadVc5QldMSjNRR3FmOUpUaXV2dlUwd2RnaHcvOElCUklYMVZ1TlF5c0JxU3RWTlBYWkR0TCtOaXZjd2kxUGdELzVPMG95bTJKKzc4b24wcnhnQTlPQ2xhMGdOMEpFUEhZL1lQNG5oSWF3YkVKMkhsVW5SOURiemZXTVBBdnhrcnRBMTR4NmpyQW1ZVWNnUmZSbFpubll4czJ5K293TER3a1MyVmszZGZqQUFVVklKZXdEMDZ0eitBdXc2cElxeFRsNGRtam9HbFlRWERNYjMxRkpQcys2N2o5Uk5nc0hZZ3d3T2NZdHVmSzZWaENMTXVjNE5GVGJ2OXBFUWpGTmpOcjBMV0FKQjNYR0htNHg3bkJSZlhtSFFoUTBienFtT3RWVG55ZVM2eDFIYkMvYXJqL1hlLzdxTU9sN00wZVVuRFBnaHlpc0Y4cUlvRmJoZkVncXlENG8zbzJLNVJMck1KWUNhQzVnckh3dXBETnNWb1hGSTMrOVdZUGExbHd2T3A5MWZ2YW5HaG9tSmlwOTd1cE5IbU9IK3liMStoTElwZGRyMjFSaUExM0ppYjc5azZwVEIzZEZBbzcxNHBRMXlSWmJUWE15ZEE3bVFFOVJGR2hML094ckhqZFJubzBYZGY5eUVlMG5YRmZPZXJ6WStETzNmaUJXQkZNQW1xRmJPZWdrQXFYVFZvNWZTNjZ5T0lWbExDU2RjcDY4dWU0eUplbGhVUHRVNlZtMmpuTkFQcXdXYU5ubnYxdzdKUDZ4UVphd1NJUGxPRk1FVUd1elBDQmIyZEpVeWdZNlE5d3I2SlVqSnI2TlpjYkVZd0wvY3haZmVjODJMT3NNSzQ5eFg2MjhQOE5xM1RERWNJQVBad3doTHc1OGhQS2s1SlNvREJKZ2lUTEVTdFBBNTBtN1NxWW1OU3g2Rk52MGlTalUwNHptVGJOWXM0Q3F6ZkpmbG1DL1laSmdOQndEQWFCaThlQkhUNUhBazRJUWtLdVJFUjJjZUhDalN0WFloSmVNTjY4RWZ6NHdmanpKeEVnZ0pTY25FeWdVQXdsSlhkaDFKeUVDK2NoZ2dZcFRoeEt2SGgyRWlSeWxpU0pwMlRwS0RvNlcyVElzRldtVEY2eTVFRHk1RU1LRlBCV3FCQmZrUklDQmxWbzFhcFJhdFN5VTZmT1Z2WHErV2pRd0ZlVEpuNmF0ZU13TWZGbjBjRmVwMDRCdW5UWm9sczNwRWNQdmw2OWtENTkrQ1pOMnVhVVU0Uk9PNDFyMmpTdU9mTjJXckJBNkUweVpNa000Ync1aHdzV25DNWFjcmhreGVteU5ac3JOdHl1MnZLNFpzZHR6WjdIT3N3R0V3dWhrUmlNN1RnNEVDNGVuQjFuaUpBUWJvdWRFQkdSSFZ5SUlSTGVjRDU4SVg3ODRQejVRd0lFMkVsT1RxUVJYSEFRMTZVNGhDN2dnQ0VBZzBZQUJ3b0tEcnVFbDYrR3FiRk5QTFdHQXhEQTIrMm1VU05PaUJnN3QwU2tTMzFveGVNa2pyRm4ySUlqSnpqTVNVaE91a2tvRUpTaWp5R2d4MklhLzlaYzAzYituOCtncWtnUzI4czc1NmNqVXAzendUcitSUGU2U2VybFVkVDVhZXVnZS9BSGdCejlGNGlud0U4cStINE92SVczOUZiZVdyeS9CcU12di9LU3VwaTlIa3JWZWZHNVo0SWF2Zmp5V3krcDRzVlh5aGVWVDVueElxL3pidmJqb3FYWDFaZTBoajBBWUZNUVpzMkJrQWdGSUdGd3hIWU5COVhkYW13cjNzNy9DSWZnWVppZmhUOWdhMTB5d3R6ZFpZL2hjbmVUWWEva2l6OEtDQm9yaEZaNGcxbFhCR0dXS0E3NTJFbElkOWFMSzRTRk5kVjMyOWJHN1JJSUtVNEdFdmhqcjhMVTF3akEyM3M5Qm1nYkdqUTk3b1VLd3FpT3Z5UFpFUklDS0l6QTZXVHBXUXdWNm9KbGUzVlRsajVUeVBLT2ptNE5idk9nL1Q5R1ZmeE5BOWhGaFFEU3cvZlJqcENGMlc4T0E2OGlDeVQrZjJIL0RHOEM2ZSttMXgvSUk4NzlOQTM1cndBQTY4UVdBWWdsVFRBc1lBQ0VxZU4rNm15M3dZb0E0RitqTm9XY05TOE9pYWpRUVA3eU1GYXdJalFSZ1NVTUxJMFE3bjFSQVg2UkY4WUtJSUpVb1ozeWdDK1EyUW9zQ2t0TzVsdU1IR1VhRTNlTGU4VmowaHFwV0FwSUVhbE9hcEc2cmRXKzdxUkFGY0NlWWlrQTRCUFRzTGgvd1VXZk9ieDlSNlU4cWZBNFNLbjVnN1lDWEFTUUNRQllOM2tBLy8xTjFmL2s2Uy8wWS8xb0JyNzRHWHh4KzJOZjB1Ky83Z3ZxQy9MenowRWY5T1JCcWpuMVBnTG9aUThiKzFaMGM4Z04vbC8yRFdmTm1mS3BYMTAzN3oyTHhuM2x0QlhUYkU1WjhJUHZmRy9HSm9TRHk0NkFNeFkyRGdFaEVURUpHU1VNVG9XZ3BrY3hNREo3MjRSMy9lSDE4U0NDUzRJa3lYUXlaTXFTcjBDaElzVU1hdFNwMTZCSk15TVRNNHRPYi9uTlczN3l2di81Mk9jKzhZWGYvVHN1M0xMTWVUOWJkWHQyY05ldlh2THlhUGpGRFUrTmdSY051T0IxcjNuRExCSUdSeU5RR0R4T3lqbW9WSU9MaDYrVUdBd0Frb1A4d0pPT2hoYkpCTlV2aHBVTkxacURVNkowS1ZLbHliT2JYZzZ0RWhWS2xhbFM3bHVWMnJWbzFjYXFWZ2R2bmFNUUNjdVdYSEhWNWNpNFdVUW1VbVUwTU1BbXRnUXNCU3p0RjNSYkJCZXdGSUF3NWw0MWlqY2JCbVFwNnkzQUVOdDgyZEFrd2p4bno3UDc4VlVVREIvVm11QWQreDU2Y1ArK3ZYdkdSa2VHaDFZc1g3WjB5ZWpJOE9LYkZ5MWNNRFE0TUgvZTNEbXorL3Q2ZTdxN09qdmEyM0t0TGRsTU9wVnNibXJjZ1dBMDdQY2VmZVRoaDdxZGRxdlp1UCt1ZEcyMWxzVEFQK2Z6NmRyMW1vcCswTEoxVEVnZ1M2Q3V2QzVveUFpdWIwMTNZUE1MYll6VGJPREFUWDVZRWlZeWNwVTVJVmNQZkpEbEorb091ZHN2TE9VeUNIQTBlcFNoUmQ0ZHVINEtnRXBNRU9XWkdiNUVGY01qVkprQlVCVUJSWmtBMlpLTlJzQU4xKzEweEs4dGk1THZ1OUNRT2Nad3hvYnRWSllTTllTRkkzL2V6d2lMSmRRRWxWQVZxYkZmVmo3R0ZZS1V3aUwyTTljU2RnTm04TEhjc0FJbHYzdCtwVHppa2dqUzhMaG5wUkE0eURwYk83QmNla2hMSVJ0eXJzbzNoT0ZiaVUyOUZnbUtZNUo4MnhSZDhxeWxzRldrRUgvYmFuOGxuRHYzWnk1ZTREVkdpWjNPUVJEQkQ0NjRYbldUbW9GRFI1MnVYSmt6bGZ5Q1JOMGpGVUxlcVpWTE5RRVhtVkVsRG90Wk5PZml6UTRSTGJpMEszVmZRaXVPS09FU01GVHYxM1R2aTZDVnlVN1d4TW1LVzNVYnREbW5JMTd5WDNIY253amdvZm9VNG1hU1VsTG5JUG9kMHc4eXY2Nm9XSU1kU2lHUFV2MnRnbUE0RWRhMTBGcm50UW0vZWx0aGZ3dWhBSFdLcytKcy8zenF0VHhTZmNaZFd2TUJrRWtvMk9XZDVoOFZ4a2wxd1EwdFdxZlh4am5iWFR3RHc1b21XWjVxZHZISURiS1l4eWc5NzBwSnZ6QXo4bjM1T0xSa2ZTYmREVHBaZ05NOWxRSm0yaVUzL0gwbmd4dkgyOWRBZVkyUURRdnhaNHpTaHBRYmhBakJtd1ZiSTdGN0l2SjdraU4xRkpHV051QW4wek1FeVJsMGgyTjE3SkNLaWdDUEtmeTluSE5PdHp3bkl6d21ndXZaWi9UTUJjUWxIQWZ3NUV4SERzWEd1RnVTZW8zeUNKblpSYjNXN1VmM2FOWjczRVlLN2tPU2xWSnN3WVl5SkN0Y0dNMUdyajk4Y25IaGtGbXU3UGRPd24xV3pSMGh4VG5SVThhQkpteHFIOXdRSUljL2ZVV0JIajhxcklTamJPMmhQVzdsUklhb0RKcEtwNldyVkhiMG9sNUxuS0x5RmoyVEhnbXk5NkFwWjYvbHExaU5QWTh2d0RLejVncytFL0NaSUNQd2NhY3FjblJpcjFSelBzbkNnUVZhZzVVTXJLR0o2eTQreVBZWkk3eWpLVEpLU1VONG9VVDdHVGRpeE8wRGtmY1RVZG1rYUJ6cVBiaTVTaUtmSmFKRERLWTFabDEydTFSQU9rd1NwN3pIbjZRa2FpcE5McjZFMHBIZ21JUTBPM3hCbldTeVkyMGN1SDJ6V1l4TlEzdzJtRndQOHhrNWNLZURzZFVha0tsTEhOSkc4czV4enloTnR0RUJpUkROUXNjQ2wydjJaQW4xQ2l0eE1FakxNd0c5cDFkRHRkcWl3SlROQ2ZMU3FSUzBBdFZ1cVFQSXNRQ1JaSW04eDY2SU53cFRDTUpDMnZZSHJOTVdNdzVUeEo0Vmk0SGdSUm9raWdGS1BUcG40NUpZZ3hxaDBib3FndUhQNklna1FUS1ZQcDlCbUN0eVNPSmQ2YnlFMGxRMWRua3RsY2lHVW1wUU85dEJuNkFCUkJ2WWJoL29YYXBuQ0M3NUdHSXhsOFcrWlpPam9IVWh1N05DMjVVSm9MZG92QzFWb0FpMkZBWHArTTROMUR5QXpVVWplU3Y1d0c3WmJmOUVjVDZqTWJzSjFCcFkvSnRvbDdOMGpwUWhnTGhjWWZZZVVaMkJYcUdVSDg1UThSUnR6MmZRZG56bmxsQjE4ZENETTNCTTBSVm1MWEdQRlZSakVkUWhMUDlEaUp2cE56b1VBdmVnOVpBTGZJalRWYjRldDV2UE05QVVWQzExSllCTXlFcEpvTGF3SFZzM0EwQ05EMGNnMi94blhKTitJSlc0QUtmMUdTVWEzVkJjdU1yWGxVWVR1Z1pvT3pQZldLUnVjOHFZTW1sT01Ld2w3eDBrS3Rzd2xmMlpSc3JqMWhnMnl6cUJhUGxBYU1sa1JDN3pHNFdhSGM4QUJybHkwbURWZ1BoS2c2MEtJR3NsbjFGRlFHb0JIWTFUR3Y5S2dKcDNWb28zT0JJdUE0ODVvcmgwYzBORzJMWDZ5U0E5c0djQmFuMlFob2JnbmlKNkZldHVLU0hYTHA1ZWNOMUZpMW8zTWdNbUtkdzBJckZoajgxS2lVTER2UkpESTVLU1VsS0FGSUt4VnpDdWdVeFhwR2daZkFnUEVFOTBOZXpLenB4dkhiUFRWcTJkT2FxODQyRU45dXlUeksyRll0K1dkUVpEZTRVYmVCMThzd3ZsUVVDaUZyYkwreUM3V3FselpPVWIyVnBZUVp1MW1QVWtUMlh5NzI2TmowZ3BVbW9FV0llci9GSmtna2diQUFMNERoLzBsbzVKREJNQzdrZzBEdHpQb2dGMEs3TFdMWFIwNlBFTjBvb0hIMWx1ZUprUURQSVdVNk1aTzZMYTJzZ3VuRjUwOEMybFlHWlBsY3gyWEoxdHVYRmJyZTUxQ0lVV1NoYjRmb2o2TGdHY21sZytVQ2lTaXhjSDlySjZUVEpkQUMyNEFwR2JzYTVoYS9OSXIraDlJZWFYSUNpWnU4QzRKTHpXVDdnS1lUNzYzOStBQWpMbHBwZFhBTGJtdC96Y2RaOG5mSS9zd1hOYlpkdzltUjFTTzdJZmdaS0MvNE1Dd3BDdzVzRDFqNDB3SXViZHRwQk5jc1ZIbXVVUHZoYWtzeE05RjhCTGtzUTM2TS9CT0pBUXQ4VEJCU1ViU29qd0szMkVZYmVRcnp1WUdhOW5XRmhPS1RsUUJ3OUNGajlqVEc0SjNOZ0R2ZXVBZzFVT2hiNEtBcDlwSGdhTUpLYjBTbG9MN0RvZEhzTGpwdFhoa3ZPYWFvZTBDSGpEVTZ0a0tDQjQyZ1pKelJEY1BvMnhOZUpyWkR4Y1hlVjNWMjhKd2swSEpoVTA4THRHRFFNcUtPUDNUR29BSTZZbmJFa1J3RFJrM080a2k2MUlucVQ4MTJ4S2JpaW9CTUdFNURMcE1LcmlPcG92Rkx0YkllOXhxTXEvU1RZc3kwWlFGNXlhWmF2cC9hK0g3dWJEbnBTc2lCd0pGYWdCTWk3d1ZXYzdVSHFsbXczZmNMdnZtblZSU0ZZUlFFbmd4bkh2dXg4UTFDVjdBSUF1QUlEZEFIMUErTHdnK2dIZ1A0QzlRTGdCQU5hZXZPVHdvcU1IVW9OZ21WbUV5REk3THJ4TEhEWFhFazdaQU1JOXpPYkd5Q0dEYms2RzVVZ25UcFBjMytqWlFNallHVXl1TlhnK00vVGliSTJjQnhnSndrYjBiZ2k0ZlpmNUFCQ1dUN0JEU004WWVTL0o4bm80SXN4UVlrNTF3WkttNDRDanc2cFRmUWpYalVMdjllalBPVktKM1BoUzJpSWZ1bEFLNnNNTHV6WTVPbi9iSHpoWkROMkdhUGg0NjZaTFVVWkVtV0ozWFJHKzhBK3Y1WU9PbEZJTVJGQjQrTGpXeXVTdVNPZXAzcXJQV3JOQm9SdkdEV2JncWN1OTcxNWtYejJCRU1GVVpYZmh2TDlVRC9PdW02NHd6ODFJa3NTWHZadUlPcWNZUkNwdCtEVWlnc3VFM1E3YnZnOHo5cUV6ZjhtZmVIRm41NXNKUlV1TFl4UTNmTUhadU83dmhrOE0wOTFReExCWjFTZTJpUU5WMGRqRXVDRlRibnlqZWFxTld0RFVPYnFKZUpzQnVuSVE3UEtXcXZIUFBGeEVYVE1LUmpmQURjK005Yjc1V2l0S2VOMlRUd1BNYjBQQTlxMkZVVUdTYUxoc2xqREFVQU1NTGRLWVFIVmpjd3BnWUtvd2FVUUMxNnJyaHhCRFJVL2FaZ2JFb1VzK0ExMFR4a3Nua1NMalpheXlSYStQaEtLTmpCVDhMb1NxcnFCR2lxR1NSaUY1VEJDN2g1M0Npb2VGNFdGTVYxeks1akRQb2JqSGdQNWE5c0JERDFpTzg0V2NMOTRDbzVFZGNJa0hsTmZKdGZtbUFFdCtBcDFKYXR3N3Y1THhiU1UzbWVLQ1dzMTNjb2RRVVlsSlZ2Kzh0bXVyQUdvRTFucE1oWmV4VExvUEwwa2c3VWV5Mk1MRXV2TTB5NDVLbHdHbFd4QWhuSGZOalphV05jTTZySmJNaW1pMCtzenY5QkJxT3V0ZlBWRWpIakliTmQ1cGFhTm1iSDNGTEp2aTF0bE94TnNvdGRpT3dUOW5lUE83K2VTR0ZGVHowVGFkOVlkbUEvcEo4cUZhNWdzZmFvaXN3NjFBbnQ4T3ZqKzI0MldLM1JWcitjeU9DR1RYVFo3WnEzeUhKUUxSK3FmdVNiZ1BsNFVvVW5uRk1xbHVIOUFQOFJpTzFrYWxzeGVlSFhua3VOSWU5KzYwNnppaDFzOE9LODZla01yNnFzQnM4cnVVcTZ4RkgwZ1VmVnNPWWFuM1dTdEFSZjdGNTB2NndkdUtiMFl2MmJzcDJ2Q3dTcUZhTUFycklMdllWMHF4L1RzNmNEOS9SMHZtYjdxK1VqNFFKREhmTHdxYTFMMllTYUtlNm9jV1hUNkVoK1Z3dWFSeUhzcEx0aVVNZWZwSlJVWUl2ZE9wNVlGKy9NaGdCQjJwZndHamtLY2NmK3dTSStCVnpPWExHZzFjeFc0RFZmOUhPYWFIaVNzMC9SM2RmU2k4aGRGeFloN013bEYvanlod0RhZ0YvQ2UyejBod3dGNFg1SmJEc0ZKdUF3TTBOcXRqc0dNRENWNkdLMTloalVBRGJSTjd5R2RoT2g4dXdITDMwR3pxeWxtY3Y3YUlnN1FvbHpQbkx3cmJqY052MzZYS2FGWno0aThQVkhoZVEzb1FwYXFMSkRJM1NEa0VYTEhNQ0pUWmFQS3lmUVRVV3I4NnFIY1c2WlRlNW9NN3ZhdE5EWGtGbGNrVVA2R1NVUWhWV2l0RjJXNzE5ZlBPWkhlN2c4V3I3Rm0yNHk4aEhrVG1SZ1Y3dmpQUlhQcTRkRDgwYTBhWmc0M2ZCVjV0V3Z2STZBQllPZ2ZHdXRpOGkva3F4UXVMRUdvRzFvNWZUbW02bnNXWnJkbHVFMmJyMExna2RTaDdGMU1TNXBEMERaRHc4VWl0V0tGbXVzeDJIMjF4RC9ibTd4eHM4T0gxbGlZSlNWdzRZdWp3aHhTMzBCdzI1QjdhQ2JHdGdIWlVMSW02dWVhdHhleXByVmtxK2xGbkJtUlZBZDJvVVQ1Q1Y2UExrWFg0a2FLYmRnVG1GaGplc28vS2pDOEltbGdiTHlyR0szOFM3SmpxdDFFNWFDTWlYb3dhK1VQZ3kzYko1NmRvSElneFBQZ2J3SnJkV3RsT0dKN01DTiswNWk2VjdVbWppamhTbUkvZW9kWGpJMld4UUhqYW1mVk9TUHluV0R0NThib3k4eXZMTjRxOTNKaHBMNXBXQm5SRzZsYWExcEVWNW0vdUlBcFJON1JYblRqSXJtbkEyc0hrWnBHY0c2eXM2WmVXWHo2ZDhuVFRmdFpoUU9iYUJYbUxWTVZxWmtnTkRGZ0RpNlhsVFltOWNVMldZanB6U1NGQVNCdHFxc1NvbGlVUEtVZmJBRDErcGliV1o1eWFZemkvZm1Xc0hSWGljai85TnAwWnpmaVp0SjMxMTFlZGdmQXRYOFcrbW12MjUxZGZFd0ZBdHFHOHR6MnlEekxpRHR2YWJlclcrSnFOYmhDeHRTZ3JNNnE0c2xUSlM0MXhhQ3BCR2hwcERycmlRUVdWN05nZGo0RjZoU1VqbW9MU0JzdFpUZHZkZmhBWW5yQmpVaXptK2d3VnU4enFoc1diM3gvRis1WEVVRFVUUVhRQ3h3ZEh4eTV2aTZZSG5zMjhVaUpoMG43eElXQzM1bDJzR1ZRcVNMSGYxQ043Z0NRS2tlR2dSOGFUV3FXL0JsZjVLQ0FRZ1RtdUxDeE16UmpqTElzUjRRZzNWam82K2F2WHRtc0NKb1pNT2tjYnpGMUtPSEdEN1pHeWtsY1dNeHNlaURzU21Vd0NTUmJ4TStPTVZZZ3hLZ3d2UjVaTk1DUjQxT1F1SHN6dVExK2E3K3VmM2dNZVAzR1JHWEhNMEdPZGJHaGZmN3pJYVJFQitPeHZUaDA5OEJzM2YvREFZM3BvRHlyUVV1NlRFSHlVaDVkdGNpYytPQ2hRRmplRitSRHo0dHZxZEQ5RnRPQ2lBMmtmSUh2ZWsyUExSZnRBTzhkeFl1NGUwTGl6N1dCeXkrd0R4WDZaR3VyWmFicnV6R3pXb08rbUMrWkZrbkdzS1R1THpOSENKQzVIOGdVekZzNTNXckJWTWdLM0lsT0JGTC9CRVFXbTlqVG1jUjhVRWswTEovUUVNRGZnUEhUWkNxcVdGL29LZWV2NFVSNHFHVlVTNXp4QjBOZnlyUWRuVDh3ZmRFYUx0cGNqM0poNEZhL0dUNlljNVp1QWkyRGp1d2MrSWIrbk9JN3c2TWFxTytDdkthMGp6YWVmNERxUW9lVUlBa2RrbTV1NW5QTzdabXdUekFBNVZVZnhvdVMyR0ZBSU1BaEExUytmWVlWSXBQY1hpRkxGQ2ptZ2VPRXdBVWRESUh3NjBQZ3BKTkQyT0ZSRmJ3SU1FYXhocEtXVzcyWDdsbXc4T1lXT0Z3MmRac24yZE52OEpwK2ZGSTRaaG1UOXdaY1phOWdTdUFCVHJ1OGh3NWswbWVDajdTc2U5ZEtnZ0pQUlJnVXNlVVZIYWsreHg4TVExRkdEaE1xYXVsbW5QTG5BdERZQUNTOU9XNkpleGUxRis0dzl2Smt6NVV4K3FnVzg1amt4d3p3NXdXQVc1bUhaeWZ6T1JiTk16Q09jNWpkVnBoWnNVcHNlK3BHZ1JweG1aNCtaODlpOXBPM3h4aGc1UmgrLzRiVUNqRXBoNjBPUDEvR1dacldvcmk3YVpXdVFpK0xaSndZcDBiTk1lZlpod3g0OTlpbjZGSmNBSzREbUFHVElpRldKeERUendsSGZ6ZnphdlFZZDR5WU15RFNZUENMTm1KQ3p1RkZicG81RXVpaVFaSm1RbHJJemtFeEJHbUtwMkxUamlraVBzS2ZQdkYySmRENHYxRS9zMmUyNnN4Z0NydUNCNk15Wkxic0lQMlRkOXVuTTdyc3N0UDJINkZCZ1VsT0I2MEMvelk0cTNReTBwcm5jQVM3SlpNODEyeVlkSlpMNDRnSUROdTQ2MllSYVR6eTVIS3E3TGp4akZPY2J4YVhacEIwcmJaYlVQVE9iLzdxeGtmVFBPZ1ovZEtLUmdHejdiZklzb1EwRHh2M3o5ODNMTjRZb3ZvYWJtTloybmpPS0huWjlzUmRUR2pKcXhJT1lNaWRuSndSWkRwa1QyMnBwa2RJVU5YRlNCaFhLSEd1QmgraGwzK2o1YlNyMlhNTzdTQjNWS2FYMkJqck9NbTE0cStSc09HQkhzd1lGTnIra1lMenFBTTAzbmpCOTlHanFqa2FEeE1mT2FOclc2RTlWTWxCaWxUVnhjV1JpQUpldi9QK1Q0YTROYllxRXNrZHNTNGE0clZLTEtRSk5CSlFGYlNyZmp0Qm1Nb0VVS1N2amZBbEFsWVRqUzBSaDFOSFV0TVdIVzRGbjMwWVUwSTRJOUFQVTlyd3R1TitiZW5sU2N0aUVUUlltNGc0ajd0NEFKSkdvY2Vva09SZ1FNOHowZkg5TkxMYVNRUkU4V2NDNEZma2FzQ2JaaFg2azRzU2JHWE5OTGRJdm1RSE9CR29HVjR0Z05LMHM5M3hmQXZyaTdlbU1BaGFVZ2NHSXl5ZmZlWFNwYkhnOS9kOG05NXU4L3QrVHU3L3QrN2E0VHgvc28vZTVOUHd6c3B2S1JyTlRqMXpwL2svYi96WDJvRS8vLzJTV2UrTnF2Z21SZFUwYUtqd1JJdjE2cEU1RlVlbnpiM283NUFqZ0hFT2tJRjkrR1hJOWZFTllLSDljUmtQeXFRMUdoUFhTK0xMR25tWDJlRzU5azVUWnV5ckZYTTlEbVQ3S2w0TG1tUnpZWUxpNVIyZkRrc0tJYmZDNXJreGdBRGI2UjJ1VGZlbzEvSmFKUDRaMnRRYnY3NWlidUc5dlFhK29NK1hhdWlLYUhaczkxckl5UVcrckJtSW9ndjRZRXpoMzE5ZmR0NmVncjg2NWRXVjU2NHJKK0pTSytHN2lVK0llYmovZUx4Zkk5aEZYT3ZFeGNWZE5DOTVTeHgwcDlJL2FVejJhVll4WHZhcTVhOWppbTcybVNjYnNBejJMYTBPT2JyMHZDUTlZSGRoQXBMbFhhL1dNdW93K2MvK3FWdjBEeXFNcFhMSm1mRUxYOEVhRGJ1MXh2K0VXdEpCdm9vVDBhK2tXMk9sbTQyWTNBa1JtRFFZWDZQcmpaV3Y5MnBKa1VCTmlYNmdvMmRMaGU4WWpFUU8xd3lxY3YvUDJqMnVpNUgyUHl5dE9kM0pPQU03dTFFMjIvRnFuZlVScmR2YjA0aTdvWDRORHJ5ZkpMUm91REk3YW1ydlZxOXcrN2FwMDE0akZGeHF4Ti9lcVY3cjgyYW1hYzcxMjVVQ3d1VWRYNitpbEFpbGt2c1d1R0FoVnFvMk8rVk9LK2RXQ2ZRY1o3U3FDK09xOS9yck1QSU16dU1TYTdLRzJGak5naUxjazMvK281VnRETjFGeERqUnBzaXhNM2pad3l3U2tDc0lyeEJHbG1leEtPdXlYU3F3WDFJd1dqS25VYU5Tcnh2N216cU51VGxVVVZacTAzY2xhK3cvTGRCTzZXODVzVWJ0SUtJWVZLTDZIN0hoV1VyT3I0Q0ZxWlBEeG0rL1doNVJQSHFYNExSTnlJZ2pQRjBlVWxESVR0SE9lcXJidW4vVlRpZlVLd1dpaG1JcEFvMTROL3AvZ1Nxemc3bHVqMHI3V0tLTjZPQ1B4bDRYTEIxQmJ3S0VHdll3cXl6VWJPN25OcXZySG03dG9mcUJNMGRMbmRxdXZkRUxCOG1CNW4xelBXT2phNUpBcVNFUXJYZENIM1BEZXduMmgrd29KYS9XU3dzWWhLOU1qV3NsMDY3b3QzQUZEc2xYbjg3ZFNoaVJudnZtYTZCT3Y4blFPbUhVUVRSd3ZYVzkvRDZyUWNTMDJYajMzRGJJL3Z6K2ZYSWJ1U3BWdlZxdkgxWGZOdlh1dW1oZzNWbXkrclFoeWpWOXlYblJhMmIybExkYS9qSDhiYmFVdDdONmE0UGlsVFpjM21ibGpKYm95em92Y291OHV6L3VQSU5Eejg4NFJPajZ3VzIxMHR5TzBvckZVb1BYWE5RYms5WkpYR1Zrcm9HNlpNeTlYVVBMYTB6NnJTZ3FsZ1hLbGJWQmJxNDBxY1g5My90MFBjWnZza1ZKbHRNMU95Ymh2S2t5dEtPWU0vdVYwc1ZnVFVlSUJGV0ZnMnVVTzBEZnpGOWJXQlh0akRqdlNJSGxWMjgya25CbEwvYi85TmpxNHdNK01CZ3RuRVJlRDVseldZRFMyR3Ewdi8wQ2JtNlJhMTN3SDVBL3JrdHlmTGUzWTJzOHE5cnhiL0t1ckdJam1ISHBRL3NhOUYrM0cxalJsTm1Zb1F3NVgwOFgyZnZyVFBtS1NaRHhkak12VXBMSkhwRGtkQmJjeHdSVDZCeEdDQnNReDFLcnRTVG1zZUFDWkJ4MndrVjNqZkxUWTBJSjZna2k3S2VRY1h1Z0wrdWJRajVYUGJ0RG96Qm16b2N0UmErek4ya3lRdXdZYktYM25jb08wV2xrUXNJL09DWHJjZmI3UEdISmZ5ZjRUUHY4T1ZpMnRzSnliWXpjYk1yZ3JCT1hHSlB1L09obUJFSlVmamduaUdDNko3d2dDdUdDOHh5VlJGTmtVbmQ1QVZxSDNMSEF5ODF3azB1UnlKV0dkYjhqNzJJQzBsYzdOYjJzZ2ZNMjZlVU8yWWZidysxbUtTbVgwSmxQV1pHdzFVWWI2REdreVpTbERlc050MWJVWGwwWjVvNkVmZTUwQVdteHNRZDFCcE1NWWRBNHY5UHVEUXdIWGlIOTZDYjVzTWVmU0JvTWhaOFNhTS9xLzlDNmJMQzVOR1kwcEtnaFpPLzMycVQwVlVBWXFIV0RHcVZhSmg4VFZIOTdOMFJuaWthcGR5bDJuQkpJWlZCcWp3MUNyamdMYTZXQXpabkIzZVlFaG9zckw1QVlJWjJhMmN4cm5iTC9XUmlVUmZkaTA0TXhzMjZUc0cxT2xZdi9QSDRjQWhUb2dKK21hdUVJbGllMElBckpMSk5EbWJITW9FMHFyLzZpTG5DU2oxNGQ4Tkg1cWFWVzlRUkF0SW91MHk3Tmt0dXhFWE9MVUdjNmsyMkQ5L1RjMnMvamZuUkFoSklTaGpBdSs2VzIxNEQxUU1mRUJlOG5nSStRa2VjT21OSC83K1NtZE1QR2RiaUUweWF0Z3Y3TnZHcjhLQmJDeUlBbDAybG9jZEVlNjJ1dmNhN3VzMmRjdXlmSzV5Q0wxc3ZKZWQ2MnpMcndTOG5SN25kaWgyUldOQnZoU3Q3b3BXNHMzS0d2OUo0STRuOGZTS0NQdVhxTkFlYU5SVUNRdk5tYVZUQkJ1TnhqaE5uY3dpeG9NR2RSenJtOHpHdUQyelNuelowWWJ1akpXa3lsck0vVFlkOVlkRW95bWpOM1liYjNyVnJid1hCenBvUFdKdkIzVWVjODcxNSs1c2JYQ0taTnBrQ0s0MkRma2M0MkV3cTdSUlg2ZlBvMjVvdWY1aWRHV2V0ODhwMnRrV3FLd2hGZ0pXSE10UnJNNVo1eTEvNjdUM0NSUjYxc3hYNHpVdTZNcEZEZG5ySWJ1V2dmVnphbmYyRnRKS2Nzbi82ck1yU25LYUV6YTArYytIQ3BtK3J6L2VjZ1RSTisvL2JWV1l3cDNoYUdjM205ZE1qdFFoeE4rMkNHSW9TcEpmSHNRd2dYanZhUmxQM3RIQ0FLMCtkTzgycGhRR2plWWM5Wjl1TzR1bmF3MFUrdXdwTlNPcUxSTmJkWDBORHVzbUE4T1ZUMG5rRFY5SlZBRjRBRlJuTTh0TmpUaHRTRlpUbTlBMmwyQk5LYTM1cW4yRXlkSVQySjBMbzc3b1RuUWt6YWQvMnN4RVVTSy94cEFyYnJ1bEIxZ0pqMzVmVkdXMjBNV2FWWTlXdVJtM1ZJeHJlYmY0dHArNVpLT3g1c2hQVk5uSklFdVA4Y1c4WXNjU2gzcGFwSlM5clI4OFBET0xMRUdPamNYRWIrNWEvK2xac2wvaEc5T2d2dWJ2Q2QvY1gyZFRoVktLQTJWNmdyNUp4d0k4WnhBQ0ZvcDlXdXVhdk50MmxRemFhTHFGR3F2R2hUU2drdVI4b2Irc0JZT2UvVmRvdTlGRk05NTZyaFE4TU9ZZUZOQUdYaUdmR1pVT2JwTW1PVkx2aVQ1L21NNENiZlRyUzQ4anRpOWYvbkpDZGN4NlMyek5QbkovTHhIdE5qcnFhdGZLREtTNU0xdloxQ3ZmZjc2NTJTSVZwK2VRYm9BdnFBTUdWNlByNTM0ZFBhTnBzOVUzaWM5VHhLVnRuKzhTQU16SHRsWXZ2emhyeTN2Rjc1WFlIbm9xMlhMSHY3Sy9HN0JlNFUxZzRmL1dWVy9SaUh4QzcwL3o2Q09mdjdhNXpyaC9wei9KTDFLOHdhcmFPYnQxbGY2NUE5Q2MxK1pJMytVN3dHbVZZVEpvaDZTa2oxZzE1Y2MyUzU1ZDgvTHd1TFlQT0FlRUlBSUJNNGdMN29XcTJML3lUY09yUExlNVlMVThNN083dHMrZkJzbVZ2SjljTlZVRVhucTZDblNnRHNyRVBXUlJzRFpNSnNuKythRlc2S1lockdVNTJvUzVSZ2E1dm1WRlF1VkM4c2hlWVZaRmpBWjFGdmo5UW5ISDlMWGVLeSs5aWNURXl5Nmk1V3plaHVoKytxNzF4eDdGbEh0WE1TRUo2WmhoZVNRNUQ1ei9VVVZpNVNMWElsZHVPeSt4RWZNQzVEMHNRenByaVhVOVJhbi9UT0pxa0V0V0hlMnpLTnllaUorNW83aTBWVlkyNnpwWHdDbHhjZlNaRDlDNzUxL3BjeVlNdkMxNHpMSlZleFVSaC9YNG5WcVVwVUlYTGRyc0F1cFZ0VnRmdXdacjlnTE1QSWlSTXNWanE5Z2FKekdyVkpDU2NlbXdZamZQeEFCbmxUcVFGUWRqSTVITm9lMUM1TzAxWktpZ1lXQkxZQmRMTllrL1pkZXhSb1Y0U0IyZkx3MWMwWENJdm16cTBxcnlGS0JTamlUa2ZvWVp2VG83d3NyQU1IWmZ6UkE1OVlqQlpXNlAxMCt2c3BlaitFZUJaclo4dWVkMDg1NnlzQzVCRGZ3KzFjdUVvcG9yYVpVbDlZVkduTHNqUkJaRXhQTkpnS0Ixc1ptSGw2VGFBelk4RzFlR1dGTkc2S0NjK1AxSW8wdHE5TEhLWVhVZlp3L2Y4V1JOTjczQmZoNWtrZ2VxZjhaV1MyWXZrczNFajdwZnFpNzFtNW9KTWdHSTZWTjFPRjZNbzIvcjRsdWJsQVRSdDZwQmtCTjk1bnRYWXpIMlQvUHpNVitZZWk1ODV4dVRUMVlTLzgyVjdlbk5WWnJhM1ZTNk9HQmdDK3lzSVYrWTNlS1hyM0FFL0FPMHM3NWw5WVkwcFNMR3FsVUJraW9EUi94VkRxdDU3L0EzYWsrMVRkdUx1RzlhV2ZTQXhxWGI0N1JsaldxOFlDYkRBbTNZQkFHTzYrSE9RcDVtSE1kcGpFWXUxTjRENk5YQlBnSXRvbGhBK29taGNtblJkQlJOd3NnbXVVbWYrOHlGSTJJRUhsWWJHMVpNUXpCMExEa053SGtFN1RXNGZ6dTNDMHhoelYzYjJsNjFaQW42Qm1TS2VGYUtTTUlHS2xrZUE5eDY0cTkrWE5kdm41b21ZMldyd3oxOWRjeS90bU1mdzYwM09LVXJ3ajF6cTVWOTNBazg2eVpScVBGbHJSWWNxSTVwUEc4anozVGJEVFZXQzJ0dis4cUZxc0lJN0doWnlzKytUMUxYVFAzeTQvenlMY2FiVDdON2RBRTNkVHRpYmpNb3p5a1ZvS2VBR1kyeHFHNnMyS0llN1JKYWcza1RPb01aY0Q4Ym5WRUpxWUY0VnJIYTZMN2lUSnBrYk1YYzBUcU9HektuVkdhRFUySTFvV3B6VXdmNUFOVllNK2dteUUwN2dSTU1oMFdJc1p5VVVtaGh1blhXWk1tNWYrL0hidnMwOG1ES3JPcmNhNWFzRzVpRGo3YUpiWTQwWG5Pc0VaY1Vxd2JEdi9sZnJEYlVkV3B5WHFIYXRjeGJYVFRUZ2JlSjc4ZVhGNW4zenlMWlBGdnJPRGduaE9CcC92SFRhV0xXaEg2VGRuODNmUjdzdEV5L1g1djdzclFLMVhYdkYyTmFZUFJOcVJxREJpNDBmL242eFFsK0w1UTdZWis0M3BrRU45VHpBQ1ltb0d1Y1R4U2lPY3RZb0EzSmhCWnlLWFZ3anVjdkJvNUdIUnExY2lLT0wvc3VnVDRDR2htK2d3N0s4RUt4enZTdlA0eEI5WUptV1U3Snk4K0lwVTZERUExLzY0UlBjMElOVDYzU3lNWkd3UHYzOGVQczY0QzdGY0xheHUwcWM2cTZ0MFE2VkVDY0VMSmNLVmMyZ3VDSUkycWxaOSt1L25aMXdjbEdDTm9rd0RIeHI0ZVJxU0h2WHp1MU95ZnBILy96NzloQnN5elQyOTliVlU0ZGhsMWlZY1I1RW12Qk5ORWxOSTFBbG9xMXpFVUpsRjZSTkxOMHdEODhMZnY3cDArQ2I0T2JKZXEyWE5XdzF1OW9Bb05JcC9tSlh3cEsvem1oOTM1UGdRUFpSYU5STkpOUHBVZnZPZmVPTmxkaEZBbzJncUFXOFZDUWRsV0YyNzNEWkQ2YVpOeVZtNk83RmxmRGFyeWlydkU4bWZRM3k1THBIZlJIQUM0ZUpkRTh1dk1yVFhhR3FaREpPclU4MnNhRndqRVhmRHBqemdsVTRnL2RRTTRKNmEwNGp6LzFVTGNqK1RmL05GVGlOV1h5dXY5SFVBdzNBdmVCU01IL0NEdXl6U0hSOU1MZlErQlc4c0VRdEUyRUZnbUZBcUpwZFhmaC9TeTgzV09leWU1TEZpSGdLRXBKM2hsLzdXQmI0RjFybDVPV3dYSVBqS1pCeDF4b1hDMTg5d2R2eC9penVGZFhqcUNQSTFQVkY4Q09LOTZqNGRNZGprQmRLcml0U0hVN25nSjNkLzNmN3ovSjFrOEV6VDN6eFNOQmFwaCtiNnkxVFcwckZxTUtvZGMrMVMxRkgweUxxRENBdkRwdkxnL2JVRXF0ZkZmcDZweHB0bEwrS0NEVHNCMTF4MkpsNG80TDF5dktjbTlVdU1WWU1jdjZaUWNrdTlXT3V1T3NrdXJiKzRjUHBWUG50LzE0WnNiU0NkT0JlVVk1Z08zQVVlNjBTTHZ3K0JTc2FwYXlyZUVKMHBzWmYvM1doT2ZGSHpvN29OK3p6enYvM2w4ak1WcHJzeTh3RWxXWlNxTzZJUk1kdVhrVDQ5SXBXb0txQzYrcTBHdmNRazFIc2Fsa1R3eGRzTjc2dmhIckl2QVAyWVJYWkxpTkw4ckhzWGZMSmxTM01Xd3R6SGN2RGNnMytmbWJtOVQ5djViSDM5YzNEait6TGpsMmZFUzE2VnV2THVvb0pEWDA4UGo5Q3ptY1cvdTVmQjZ1NHRjaHh1eFJ2Unp5eFZ0OGJKb1ZiT3VtUlV0WXhyeHhuRE13MkV6dk54MzUzVG55Tzk2ZEQzc1cvOGwrNXpXYkozc0tWMzgyWEx5eXczS1czUmY0UG92UGsyM01xUmNvdnR5dlh5bjVpTmMrOUduaThEQ3lXc0M5aWtqSE5UZVN6TWZmRk5mN2N3Y0N2RWVmTlpMZThnbGhtRkc0UGliNGp0TkNSRUt1Ym56SlY0MXVtbUQvOEZNV3orRnZ0R0JkM0MwcHZKZDA0Y3pSVFdhKzVoeEVaZEE4eGZGYzVyakl1eGRBK3g0ejdMY3k4LzJDQTZwRGdHSDhFUGxucHJEcXNPenZJY2I4VVpGWHE1bU4xd2Q1U0xqbjQrYlB4c3ZjYXFJTlVSUm8velcyVGE5cFhqZHY5ZjNGa3VOV0t6b3p3cWdxcnhTVVhhbWVRYVhwU3lNWVdXNmw3QllvWkxGbmVIN3Iwd2htNm9DS203TWlHRkdhZkg2ZjI3c0tXYVhwZVVsM1JqMUFvV1ZOR09HRnd4WWQwbEpRTEluL3JxeHRUT21Tc0pkM0I1MWhCbXpwUm9QMlZiSVZoUjltclJMVjloWDNOdG9UVEZqRVRXbkIrbkNrN2xPVTJ2czlTTFhaZUlpa1RxZmFKYWV2d0pGeGJsRHF2ZDN2cjlEZFc3Lys2SkZBUHIvdjA3cjJRNmpRZlRRZTZMeldQUEJqZyt1ZC80UWhId2ROdlVmZEtQc3RteFp0aXFyeTdLeWdhOFl4eXNvYlY5R3F0dGo0Q3RndGJPR3ZpdnJxTTdvTTZ5T3NsdDVaWmgva3NxcWh3ZkFCclU5SkV0cjNLYkZmUkZQNGMyU200UDU3ZlN1cVdWUjdOL1hSUzV1Y0ducHJ4NVR2UUNlLzhVb1JlVHFITWpMRDhZci91YUc1SHNudXg2UkFZOTJlYnhQZUwzVHpSS0pXZTczRHZzOUhZOEN3TzRPcjN2WTYybW5wZWJwYnM4ZG1zOFVzWEVZbm9DY2NnVkVqOFBRVjVDckJLclVMSUlLbHU0NmUyY0J5SU9XNnlaYkNyWmgvVDkxUTc2NlFkVHFjSldiT2lvNlgwSisxRjlkM0lHb08zUWtCMVVoSXJMTnRKVDEvZGYvNnRkOVAvbjkwNitYRmNrcEJ3UG1Pb1RPNkhVK1hHY0lqSHdPeUxSREhxV25FQzB3K3VmSjFKS2dncEV3Y2pVUmp1RWFmZGIweWY5TElsb1VYTUNEd0w4VkxuRllDOFRVN3FWVitpclJyeS94V1MrTkxkMDFSeUJDVVRHdjkyYjVYVjFKWlA1L05UdmdIVWQxUjdmRDI0V2ZEaUNwTTIzbTEzTnhKbUt4OXVrcnJsaEY3ekM2WnJ0OCsxcmZ0ZTI0VmU0aTlIYTBhTlVKK3hYTEIvV2ZaZkVyeXBjdFg3SGlIejlsNU5MbUJKN0FUSEU4ZnZJd2RqdkdkMytDWUFqYVRra2wzL3ozd0JWajh2TW16dkRBVmJhc0FnS0cxT2ZBakltSjJXRVBac0ZNMklaYjVMZHNTTCs3Qk16NXdydk42UnF4U0ZURC8rVzdBaUQvVHZPSVdKcjlrOHQ1NVhoKzFhWDJVNnFubHhNekcyYVFjTHZ6R1hhZnQwb09jRld2RVYyWnFRckJ0RFVPNERMS3ZEOGZKaVV2UCtmdGhBZmtpZ0dRaWxOQWp0QlVZcVg0LzZlRmtzK3VDMFhIenFkS1cwN3lOa0pUem51MisvUkc2REhnZWxhYm0zejliVWQ1WHpxNDJ0alpZOXBTWHhrc2QvN21sc3RtSHZHK082WFVlMklCTXpsU3o4VnhUOFVGa2gyZVF5SiszdGYvRzJKQ2xlSHNielA5MEJiUm5DYXU5QW11YzZaUEdDUlhwSFBEbE5jOVNtWXoxUEtRbjF5ZWJoMmh2TXBRdGZiSXdycHFOTFRHMU5sbDJoeHZzRzNxYVY5TGJhdzUrZGJHYXZRcE4xc0hPeXUyd0pMZjVWSytVT25wSFQyb294djRxTW9kVldnSkg3Qk5nWkhlT3Z0ZmQvc3RLSU5yY25WU3pOeEN1cFBRa0FQMzR5c1RuUU5tdDdWYlphKzNVTnBZZ2o1WkhqQnNrS0swUVF0dHp4ZFhYcHg4ZGNPRHJ0SnZCM1l0WDM5RzZmMVRaWS9iVmZaRS9vaUo3c1VETGx0OXQvS1pEYzE1ci9ka2V1TWI0dUN1VjQ5WkVReWtuMlJZTXRtOVJRTi9sM1dHQUJYa0ZMNklvSGY4bjZkdkFraEdMeWg3YmVndmhjNFVTQ29JY1BuZXFhZVhYdmdnd0FlZHd0MndJNjQ1RFhuSzEyMUhoWUJ5alZLMDZOSzQvNDhhTHZvWFV5MnQ0U3BlL2tWMnovVFlXcXFqM2JBMkdqR3M3V2pibzdIWU9tcldvQ1VTUGJOMnVDVlJzVytFU0RYclJ2eCtjaVNaR3RYNGZiNVJLcVVkOW5udFZCcCs5SXgwWW5FSmJVVWFLV1ZOSGNYVUs4eTFuWlI3aW85RExQeWZQU3lYVENWeDE3NG5xbGw0OW9rYjNhd0lMS2h1UGFMV1BYWE51enU5MnVIRU9hSjQrZWo1dmErTnFGNUR4bVEwS0h0eXhqbmowNnA1QjlhOTRmM2FwNm8vTVZVYXZmMHpXUEpBN2hKOEtZZWM1ZVdUQXZoTTZrVko4c1V6aUlETXZLWFViNUIrSkpXNXQ5SlJtZlFvVGgrdFpuMTRvb3AxdExHdGVHWjdVOU8wbWM1bHlkV2JBellYYmR4MnArcE8vQzh6U1FWR2pPL0IzdGxEN084ODNGazJOcVZXSHBwcFdwbkVrMW4vbXBab1Y2YUpkSkhtTzdPOVFWSlN2MGh0YTdDVTRKdHljYmd0L21sRHJmNFVaOEVQZ0tVZy9DY0kvZ0dESmZXTjdFa2Urd1NiOVR1WE4xa20zQ0JlQzdJNW50NENvREFsbWk0UTFETjhRWGR2QVZnNDIwN3g5ZmZCSXJpby9ycy9LMXhhVjZSczl4czdYemtvU0MzalF5bUJvQW5jMGZNR3BCaGhwclBldHZ4OXJyZFhzem1lNFFLZ3NKOFlQcjBhYWJ1bnFnQXhNUVRRRHYrTlBjd3hqMk95TTZkdS8zZm5tai9HdjExa1BRSUJmTkJjQ3dLVHczVWdTNXdGckFBZFJ4VndSZ1c4cVFJdWgxdEhLbE9rcjlyWXkxOGZhb3dpVzJzZzY3WUdMMWpKWk1KVXdvY3E0VHVWeUIyLzdRS0s3WFFib1BHd0JxTFdRRDdXUUw3WFFINnpZUTBJSTM3bzYrMmdhQUg3MTIzZDM3Yy9QRGRjSzBJQWgvdWJFWEszQ1d3SHAyRXlQT3liSDlyWW1mMEIyUHNoQVBNc1NIWm1jZXY0RnNmdXhmMzl4ZjJ6Vi8vN0Q0c1hrYmdaaHRsOHF3WU9xSUVIMUdDZis4RWZMOU5xTTUrR3pWZjJuMi8rTUVlMG1VZXRaY0JlL1NIb2NrWWNjSjc0QnJ4NmRSZ0FvRDA0QjA3MHFjaG96WUxrV29iNjVhNXY4bWVXSm1vbUFHcHdtUElmUUJnVzVPOFdhakFIdm8xZHYveWk0OGI3YmZ3VFBaM3N4QUd2L2Flb1lRQWd2bDlLRXdEczZSNjQwZnYxd2JIeFM5SCtUOTg5clNyTmJxM25OTDFmSGx3QStFUkRPSUFmaDF6a3dSVkhXZ3VQVG1FZldLLy8zWHRONzBjZXpxWGJSSC8vczZEM2IzK1FzenpzbE5Kazc3ZDlHeGxzVENIcHh6STh1Ky9UNzc4NFF0Vzhzb0gzUStqSkJIQ1I4a3I0UnlBK2Y2dURNejRNY2pZUDk3U2h2OUhDbnA4S2YzaUdVZ3ZiZy9kRHVORHhTYUlBS01ULzIxY1o4S0Q4REwzeHVUaEZjVzJpNHA5VjdoWExXMEJWSDF5SGw0dDdQTDIvbFF1b3V6aFg3NHJ3aHYwYWtiS25wODk3UE5PN0ZIempvaXVXbEZOZXMrUC9zQmJQLzJLbkhkejh1bXZyUFpTeEZiTGl3Vnh5RFVveHBSazNsKy84ek1lUGg1UjFHQWNBN3NyVis0L3BBbUpYMjVWc2k0Z3ZBd3F4V0RUYUVGSnV5RFEyRWNuV1hxbEtvcEtwdWFuUkFEVEFoWk8wN1haYktqa2JsbldwN1IzWWFBTlRQYjRwR1RkenVVT3FkWTFXaWU4bUQzam9jVDA2VXl3UUFVbEEyMFlCb0tKbFhSQUpETWxOa01aN3lTb3RaRVFqUUkvRVVjbFdsZFdPWFZSbUNsZU9ncllXVkkxQkw3bWIrNzJlMGROcnNMMEM0ZFpzM29FS2hheHVOc25CRWJGeE1rU0VSKytaakxaSFloSlZWM214b3lWUmFVVDBxam92cmVnY1ZkUnNYamttYUZGdEVlSmxqZVFGVlFwbVUwNFFjYkNIakF6MWlVSWF3dmxPWGtPNkxSNmtYZW9tWE1valpSTlYzZnFxeDM3SGg3ZlVlZ0RWQzErWnFFd2xxNjYzemN5OTNxNTc0K3F1QXIwdHRCVXFmK0p0akZpcGMwQmEreWw1YThjbTdZek5yS05BK0lRRk8zcGYxZnJWYmUxRFNwaE5XUnRvSGVKTmhmc1hSZWV4cXZzRnFTZlU3NTZFMWl5cnNuQlpXeHBZYUdZbUlSS3ZXUzd6N09nLzdpNGdkbTRKRGFSY21oanJLMU02Ti9SYWNtT0poR2hsOVkwNEhLeGtqWi9jR3ZLQ25BcnRkdXdJZEsxSVJpaFd0c3ZvYjVIWVdWYWhDTDU3aVpaUzlTVXErRFRIODkxdUFJanlsVmVuTmExdFNpR2JIU24yelhsbnA4dXFkN25xbVBtbkN3WG14MjFYOHVQSHh6Z2ZFSXRFeTU5dHQ5K3V2N0xYZGxQb3k1bDY3MWw0TUFKMW81V29LSUYyRis2WFoxVHQ2MkxONWd1eFdXV2xFdE1reFBmZHZOeEZyWWdSMTIxUmwydmFzb0Q4ZWc2M3NGNHRRN2xRZUd4YlBlTE1DVGlxcjF3REwrdlNKZlYyKzZNWGZXOWNFTVBLMEwvODdrRWk4WTJyYjlWRHQrUDlHeUx2NWNCV0oxb3U3Y0tkRXhXZXI4alA0d3ZEU3MrejZCdVBhR0tPTC9DbWxpU2E0YnlpTHVnK21SQlJSZkJBTjdHU1owMkM0WEg4ZXBkV3IvQ0I4Z2JVWlVwZVNzNXhOUURJT1lWQTFFbUllaUtYV0taUkExVkdUQ1R4b21Pb2dPalFEY2ZYK3oxcmxPeWhuVXd0RVBaaVFEU2xTUTBYSE9WNXNpOWU2WjNxNjlCbnRDMis2dlBvUHZDKzQrMFZiVHQ0LzEvOHdYSXhHNDZtRTR3bjBIaTMvWEFRcGlMZ0FGWmcwTGo1S0grMVhCckhRbnBoVFowdiszT2pJcCs2YjBnczZ1b1NFN3FWd2p1M3RlaDlKOUJPWGMvQ3dEeS8vYVVtRnFsRkxNbUg1bFUxUjloUlV3NFNhSTMwcUZIV0FubW1TbHFvK2F0dUc0WHNzUzE1emYxU3N5bDViWjNiNHBGWDg3YXlBY2RtY1orem9laHp6b1hFZGFRU1prb29Mdm1WNExtenV4NnZFd1c3UlZDRXRXdDNkQVVLM2ZGaVoxYWRpNlZPUVhjaDZtekd6ejJoempmTUtRcVRqaWoydTJhcGppVFByYVJHSjc3YU5qVHBjZDZnUEpCV0FQOVh0YXBjV1A5eCtqTDhqZFBQemEvd3FpTnVmREF3NjNiWEtrbHJtc0FlK1FVOEpmeWZBMnZxRitSUDNZbjEzZWhoNSt1NUhyYk1SSVl3OVBMdG9YOHdPWUcxa1hlQzRlYTlaMDJNM2FNYXVuejljbnlhdlhyN0xFUVBIcStxcGhpSkh5MEpnSmdBeXN6b216M1RsbFlCQ2RiSXZST2NVZUxnTlpMdExPcEZwclgwNFdLT2dWNUFsaXc5ZXgyYk0yd2ZuWStuTnZNVi9pdnUvaE96eEZIVmJsSkRXYU5KNlNSbHVWRzlzVnEweHJWRVhUZlVLQnVNcTZnUFFYZFVzMUl5VnRTd0pXeHZoZCtpblhROUlDNUtoeEhMTXQ0Zm5Kb3N1dFlNdHFYQUxCdm5RRlFCbUhPV2RsVnIrRFRQeGxJZ2QyR01xOGxoUDQ4UkRYT3VFUU1aaTg5K1lpY1NrdGdKSUxubUxoNE9oME8wZU1xemRvOWJ5b2Z3bU8zN3VoUHJKSWRjTDcyc0U1eDh6cWlvVllta3hWRkZhNS9ibGFvM0FLZ2gva0VPQW1QdXg1YkROT1FxMWJJS3dVbUpoaVlIQzNDY21aTHZrV0ZWa1E1WmVqbkU5Y0Ivc0NJaTRsVTBrWTZldFJVTmFYdW9RTHl0SjBOb3kyb01DZ3JMaUpDZFFSM0RCT2YreXhVQ2p2TGZRRmJFZWEvVGw3MlN1Tk91cGxUK25CdGFXZ3JseXpOY1JPeHNiWC9URmRKeS8yZ3hQYTNvVTJHcFliQ2hMMnY1SDJheUlOV05RTC96bUt6WXFVQ3NyVjJhc3JlWFJMNy9jbDRhVDY3U01UQXhFZkpMd2hPaE5oWE9KdS9wMHdOL3ZDVk1xQ3p4T2pmTjVlTFJMT0NLSWMrTXIxeGU2ZkF3YkZzVzRMNGMyN20rYXRvQWRBVGJwbC9OM1JKZ2JCMG5mTTI2TGZ1S2tQUnNEU0VBMFZNVGpkRFhZN0o0Zjc4K1lGL1A0K3NoVitoY2xaVEdmeVBUbTkwdVZLUFJjQmh1dEs1Q0tXWWU5cGdhOGN1Q3FSamhjTW81eE5oNFFjWTZKUjNhazVZNDFtNVNSQjRXRkZVdHNpcUFValVTTUJaNjdQY01JZEJNYTJpY0ZKN1U3ajFXc2YxT2F5R2NxekV6QzNpQVdVYTVDaldhYzNpdjA3Q1NKUkltR0ZQYmlkM09yNVdDd0xmMis0SjJMc2JVMlVGaFZTd1RyRnFEekljNENtQk5qSkRXbFZiVGFEUWE0bVlrWHBkc2t5SjNkVFVlVDF4R3RsVElKdUZNT0duaE9sSEtraE5FR2hKejlCbCtqQWxETUNvRFFtcVp6Qld5VVZTSVBIVmM2MlFEWmc5UEhOd0ZaVERFa0lrbG1nUWlZTEJRa0Q0SFk5Vm9yS3RhQW9TTEtBRnBOY1pVU2htd0lPMnNsUldUTmpXbVZsQjhmNFJSdnVGZXh3b3FRMVprQmF2amh1SmkzZ29keWZESkt3THpBRkR2b2hhV2hEUmlKOTJqVG93bjkzNnR1d1RpM0psWWxNdHdPQ3l0MTV2RjFhQmxBbVpBODJvdE9kSUdDeDBXUUpvT3g2LzNZMW5ab2ZmbmxEbG8zYi9IOXIwU0lETG13WU91SmM5ZGFmMnRXUktBTGEzRFY5cEJHTHRtYnZhM3BDNGFKNjBSNlhxYkdhN1IrL2VUL2Q1UXFuK284b2RZOVdDK3B1eVYwMWhpQ0h3Y28yNFVwVkYxSFIwU212MTRJY3FVc05CanBZcmFYb3BCRjVKYWg2Y3FPay9KYUZYbXA4bGswSmFNZ2hDa0ZCdlFEUHpyRnBRdUFPSXNhWTJ2OTJZd3AxMGdORkVwY3JkaDd0YWVNTFJ0VE1reEd5VXhTVlZnRlNtWFphTlBzeHNZK0lacDhKR2t4cE9iQUY5TmQwYVcwUFB3bnJyOEhqQ2JCQ3Q3cGNyZE55K0gyOG02UStwWGo0OCtVTUhLQzJGTmoyUTNlZiszYVJxSHVSRCttYi81U2Vmdzk0TWFNTENmR1ZaWkNTZjZTNCtKZS9QaEIrU21LMUpmT0RVNkUxWlVxNU10NnZXYzl6YU9VOVZsa2d2cTVJemhlWHFMaFkzcDlkTVA3NW8vL2NYaExHZWZIZXphSzg4ekpWMWY4LzU1aTZyNjllUWZaWEQzMWw3NHBPYmplclBaZlJrM2M0ZngvTFV4ZVlndGJNN3V3LzFxb2U5emJZbnArVHlNQjdkVzA5L0JkeXpLYnF0ZUtIa3NHbHlRVUZiS3hkN05OZHhkRWtaQUFCQThpbE1QR3p2UlNnR0JFRHpZTVhublVGelJUSFVTZ05aN1ZVVDZrZUFlMjVwcWY5UVgxZjg0c1dEaUk5UEhFYlU0Wld0TFlMUEVUNlYwUU5tOWVsOWkwTFE5SGU5NFF2Q2x1bklFR2lSY1JtcFBtWlFwRFFubUY2a2hBQVB4dng5LzMzLy85OExILzF0U05LSWZBTUJhK3c4WjVBRjhQRy85czZJbitlNXNEZ0dnWUFBQUVNQy9IOGdqdDZ2ci8wYTlVNzdYWDBCb0tCVkNlbzdnM1lTTnQ2dlZRNldkNG4vd2xlcTlRbFpOWm0xSXp5LzJ5dWNML0FvSVJ5NERwZnVNUTMyd0pNclA2Q0xQVURmaDZ1ZUJsbHJoUmZBYjhJTjVXNWVTVmNhcE8rcmFQaSt4YnpyZlhhem83T2Q4LzdMWTFRNmcvNTZsMHBlWkJBcW8vcjR0NEY4eTMraGlDR2U0bmtBajArWFdVZ2t1L215Y2ZWMnZ4RTBaRHZxN1QrYVV0aE9VelZmOU9KQVZXQW1Bcnk1dndENG56U09mZVkyZHBVdHQyK2FBZlo2cWQwTmxMc2M0KzRrNEpXRnZmOVFUcXZ0R0xlUmpaaE9DOXhaNTFjTDNzSUQ5UTVValpkdXgyd1dxa0twdEZHVUlMWmxITHdyWklUN0ZVSmNpcEJEOGZLRTl1KzgvNGkwWDh0dmJ2T1lFM0JDUGpiSGxIanRtSXRreHZpc2kyb0V1Zkp5MElRWU56RDI2bzgrSzBiRnNsNHZZL3VJSlFIWW9lTjgrV1FRNmR3SlBTMWlKd2srejJGUzJweWU2cmMwdGJUM0I4MUxmaDJTN2hoZlVtckZ5THEwRW9taUliNTMrWUtWZTc1TE1kQXdEa0pzQ2MvMFNDc1RzeFUrWVdtL0tldWZLK1dqY3NGN1paRnpiaFRFajNwbjV5eFV0RDVWV0Rzc3VlQ3RpYy9DMk1kZkk1N3pJOXIyUUh1TlNmTDI4SnlsejVkazdFbklSUDB2dFh3eHZPMkRyTXZhcnhHSkVxNVhYTEwrTEY5Unh3ZWxJZGhOeDBiVEh0Sm9SUFJLVVRpbnlsWklFNEU5WG5hVVRRRGdveEIyTUFwQW5Ta05LNUo3dTRTdkJ0bk8vc21lLzN0MDBBdWJKL01IZlIrazhaRWNGeWdNQUJOQ1FmclEyRkl3RHRUc0IraDhjZzhNQkNJekRvU1lIQUpiQnR3YkUzWHNjNjkyL05PRFVyallsR2tnN0Y5SkFrVTdYSUtCWVc0TUQzcDdkejlITU1yc0NBckFyNzBJK2ZvYWMzVmVROExYNVJJSjJSajNNR3RWcllDVkcwdEE2S05Xd29kcmVPcFZhL25qWFU2eUhXSnhadXliSjZ1NmdVNGQ0dzE3YXpFSk1vVjhyNHdEK3lrcmtvRVo5MUZacTVITHg5aVhvQXc4K0hEQUlNMnBxV1hEd3pvZlhQTndic2cyZlIrOWs2eUtGZ0xzSEprWDhRcGZtalZjZFltRlNnTnhlcjJPWllnb0VEWktCOVgxbXNtUktFbmxySURRTlFQbEFVRFl1bFNmR1dNY3hlSWVmZXFNSTZ2QkMxYXh3NDk1dkliZndCV0h3eFZVdlVJeVdqdFR3VzFUZytjWlREYjE5amFycCtmVlZFZ3A1Zlg3czQwSzhOam5xcmpuMHRZMjFGZE1iN1lvcGlVMXhWV0tWUHlheHlLY2s1bFJOaUcyRWJSdmdVaWtvVGc5MVNYU2diQkpjYlMwd2E2UUJwaVJxbVUxSXBhb2tLaTVXTVpHTmlycEdTdUdVUkNaUXBUV3FoSytLZWFxSXF3bzU4UUthUDVYaDBkRldrYWx4Y0Z2WS9QVzNRcnI2dzlkYzEzYWxKbTI3cml2dDJsd1ZoVjVGSWxwa3Bhb0JFVlo1WVZheEVGWGFCTmEvdHBqZnhkWmV6dXR3K0RjK0lQL0ovNHl5NE56Z3JnYkl3WDBFR2JWQ1phV3dsclNTY2o2Ty9FMCtJQkZoMGQwaSs0NXYzN2RtTlpYSzlUWHdHdjhNZlBiZXRDeDZYTCtBcENsRFcvSGpOaUsrN3ZycTFTczQyMTI4YmJHL012aU1jNUdvNUpjM0ttZGRaMjhvN0VVN1ZyQ0dCUFo0TnRMODkvdGxYRjBiSVltTkl3QkJBUT09KSBmb3JtYXQoXFxcIndvZmYyXFxcIik7dW5pY29kZS1yYW5nZTp1KzAwPz8sdSswMTMxLHUrMDE1Mi0wMTUzLHUrMDJiYi0wMmJjLHUrMDJjNix1KzAyZGEsdSswMmRjLHUrMjAwMC0yMDZmLHUrMjA3NCx1KzIwYWMsdSsyMTIyLHUrMjE5MSx1KzIxOTMsdSsyMjEyLHUrMjIxNSx1K2ZlZmYsdStmZmZkfUBmb250LWZhY2V7Zm9udC1kaXNwbGF5OnN3YXA7Zm9udC1mYW1pbHk6UXVpY2tzYW5kO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFESTBBQkFBQUFBQWRYQUFBREhUQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbHdibkZZY2h6QUdZRDlUVkVGVUhBQ0ZBQkVJQ29HcUlJR0dWZ3VFS0FBQk5nSWtBNGhNQkNBRmhVSUhJQXdIRzJwZ1JRZGkyRGdBYVBBWkZrV3djUUFGbSs4VFJka21uVWoyL3lsQm16R2hkZWhiWlNGMFI3dW83aGtaQ1pHVDZobnBvYlpUV3h5NmNPRGgwRWcvOW8wRlIrSEE4czNKMWIzdHc1OVhvemdjQ053alptdHR3Q1Z4WDRoTG9wRWtUYVJYdDBaSVkySXQ0amY5MlhzQ3ZNUkxVd2oyUW8wSWtoY3hLa1lxNWlRdGNmbmltcnBaMGpxSHRHbmdKYmwvdERxemlpcWRxd0F6b1EwVEx4ODZNenBYNXRJNVQvenY5Njk3NXI0QW9vc1JCREpmQmJta1dnc0l0b3FOYkcyWEo5Q2tlb2JIYmYzekJCbW9HQTFJNWFneEdPMUdUYW9ORUZUTTY3SXVvbjlGWHZ6ZitpdWl3UUVLL1cvYWhtaWJ6K1ZkRWJWVlI0WU4rUGQvamN6Q1RPN0xud1dnSXFGbDVRQWwyMVlCMnA1S0pGbEw2SmY3WmVCemZ1NGNGSjNxK0FPQzhRVjY2em9iV3dZaFd3RC9WNXNtdkVYb3pFbUVUV3Z0S0cyVFBHM2hXY3BRbTluUU92UjhKRklWZ1pCZDJtYkZjK0kxZllYdndOUWtaaXZxeVAwZTkzODZ5MWJhOWQzekJxR0xxd0FYM1hwemJUSDYrdGJYekdna0EydUpmUXllbGZXZUpTdmdDMEpGVUYxYXhOZFRVMkhUcFNqN2xKbC9uZW1xNys5dlNNay82SmFkR3NzcXJnR2VldG5hTlZQTDR6K2Q3cXgvc2d4bkYyVDVlZ0hTVVd5WDdBRERWTUt4b3h6MEJjaHVYeGkyQXNDYXRUUHl2Z09PTlRPYnJPU2NjR3VDUWx6aEViS0IvdnJ0ejFpckg4aHNabmE3OW5Jbmh5MHlSRUxDSnlMZ1dmODYvM0FnVERBQUFMcGpORWczSk5OUVpMaHNaTG95cEZ3MXBrNGRjdGhoNUtpanlBa25FTUlCUXArdUovaWxraGlwdUNQSGVnK0c5bHBGb1EvYSt4T0tjNkhGQXhCMnpycDNvekFYYWlCdXhWTThWbUNrV21WN3R0ODNVcWw2aTZ4d3lhc3dDcFY5K2N6VTVPZmpyTXJIL0IxYmRzU1pLN21TVy9hL3RDbXZLb0pFaWhZalZpS1BQcnltS1ZEa1AvOXJNTU1zY3kydzBGTExyTFBSRG50ZGN4MHpLek0vRTZpQXBDajZML2svYUtBM0EyOE95VnhhQzRPbFQ1YWR1UE1QV2ZaQjB2QmtSdG5jWUFHZGhTdVdibG8yNTFyVDllQ09DS0xnZmJZR2txQko2VlF5YTRLVEdJSFVnNWZocVJTWUVqTUhSeElISStsSjNGVHp0TjBwV2g3RERERlBwdG9wdU40NEovQUlrZzFTZU9wY2k5aFAwUlRRRWlXT3d6eE4wMFpIVStVcFMxR0Y4QllQRUQzQUJMRjFucUxGZkF0U0lkczR0WlFyRUpDejlUS3RaMlRNVVZoYXhIT0xXM2lZU3QwcG9FY1lnb1N4NDdWRHFjeWhrZ2tGUFlIZHZNU3g5VjkrdDc2TkxacURCMm05WVlobXRtdjR6MGw3MWFEWC9oY3pPd1F1eHE2azFsVUM3bm1udEcvUDNTenpLR1EvZndSVUQvY09NUWlESXBUZ2p4dnZiL1Bid0U5c2xBNmlqTElUeGJrR2xwMm1YaGZVMU81QS95SGVhYlJXSXpJZFdqV1oyVzA5OFMzTkpteElVeEQwSlMySVFxaDcvRExPVkZVWTlJLzA3MWRxSkZ5NGdOOVNOeVBzQXFrbEpHWFBhZmVNK3hiRjVxSVljL0lBQnhtbG00QmNCK29QT1J6MTlDTTJvdWgyb0d0RU5OMkFKRnJDVnpPNE5vRDNleFdTRUtHNHNqTUR0T1ZKU2dZTFYzb1NhTFllZTZPckU1OUpXdEk3WHE2Rk1OQjZwQmFEem1TRzd4OVAvbmNvQVFDMFlPNjVBVi84VnFSNXBDN08wS0pSU1RpWE1IZWFqenZxOGZENlRFYXRkU2VFZEN5SnlPUDdIUzBITnNjam40RVVIN0lWdjVCOU5jSHQ2UStReHI1TmdKbEVZcEJibDdpV0ZUZzJTdnN0TkxwazF3ZDBFT0IvSEtPUDUxb0FrS0hiazBjeGdhVVNtRWR6dnZSRVhmWG5VRXF4cUdnZHgvMXBVQm42eVNVYmlMOGJrSWxDcE9DMkhGL1kweDVxcHhUTDZMbWxVUGJGT0pNallRRGVZSkljWUFodEtWcWZyRktJbmdtak9JNWV4K1diU1VBckNHTndoSURpYUtQUVYxMmV6YWRBMDRDSEc4NUxZbWgyZ2lNRW9oZ3VGQ0U3V3QyUm5wWk9QMExBbXpqSk5KTWwxRnFRMndmYlVCSmI4K2dkZmlTR1NXMWdDMXRaMHo3UVZRZGRvVFN5c2pTZWJ6b2xmeW9oU3RnZ0JlZUxDSE9EZk15bzJCT1M4YTEyaGlkcjNZVWhSRFZYVEFJeEU2eHdtczBERWcxTVJGSEFHdEdaSkxFNkN0QlpsNUoyQTd1bFRQMjBNalFYdStGR2NSaGpDb1ZYdG93Wml0aGVBaWdibG5PWklSZ0RDZ1lLZWpqQlFvUTZoUmgyTElhckdXQjd6K1lpdEtBdXFFTUFsOVFESWdIYzlSc1lpVXpBTmdNc1pHTExvVWF4YWtrVnJmRG96SzIxMFpiSzA0WnBpNkNFQlZvc01PQUFVVmdRaXdWMkhNakJEdUtVZ0pPSWd5WGhFTW5zVUNsU2FhU3h3NlRyaU9tTVJWMjRXU0cvQXIxb2I4TE45TUZhZmJGb3FOcmNjQ055NGtpanFJd0JKbE53QkM4bVdWZ2xHK3RNWit2NTVPTVY0RWlGMktDSWJWU3NsRm9aTnBtRnc4MlhXc3dvQzU2S0QrcVVyb0l6S21udTRHQVplSlovRUFCTTRRV1FScEZxaG9WWUNRZlBkcE9oSEdhV3V4NGV1RmlIbnU0MDBwbzFON0NYVk1uZktqUjJZZEZpc2NXcUZxdUJkTnZBYTlkeTh0RVRQKzcxM0x3Y0RQeHZEZDBhdys5bmV5ZmdkL1kzOENFTDVzSmlXQW5yKzMzL3daS2NRbndLanJYaU1BQnBEdUNvYVVpa0dJU2hDQUVGeUVFVjVKZWxGY0hCcDlMbmUvZS9hN2JNRXc4S3BQNlpaVm1WUjhTNW9iQW1WWkpXT001eTBqOEJBQlFZUVRVbVF5YVpHRVQxeDlIRENVa01HMk0ySEVPaHVYNUhqVHVCcFNwQUt3aVhPbXNxQnFEQVh6UVVJd1orZk9CSHZnWmhZaFBHMy9qVnlJdkpPRGRCSUMwaks1c0tuTjc2cVV4c0k1Ump0QXBpdndjbWVBUUs5RllLR3NFU3RDUVFvZzc2RzRaZW1xVEpUQVJXMUQ4eUJWSVFCVk1JaGFadS9WSDdoU09CUkZLUm1qUWtTYmtnUUhvaXJZemhLRlhYN0xJSm9MQzVhYW5pMHhnV0xnUmdUZ2xrck9hMVdNSnduUTlYemxjZm1BRHNoUTRIOUVvZW55NVNvckhyV2c5dHMwcEk3di8zc0Vld0FhenJ1QytHQ1BDZnhya1Q5Q1lBOUM5YkE1QnhTS0szZHgwQVlJL2V5aXFtdEJ1QW8wdGNOdWJyODB3bDQrbTRNUGo5bUthV1AvRkoxdGx0UGRVek80Ry9oTDlXanBUTnNsVnVJeWZJNlhKWHVWaWVFd3F0NGRibWZqOEFDQ0p6U2ZkbjRwTW80M0tza1hXeXNRVnBqRDlTd20wRjlBUEF2d09BTngydXZjYjJDOXVBQzkrRUM4OTR6enFmR2FQN0tPYmhybk03ejIwQkFZQkVRSDhuZ043SzkzWjFldVZ6TlBxbjdUUEhJdk1jZGRWMWk2MnozbjlPbVdXVCtaYWFhWWtMempsdmdXdUloaVJRc0dhMG1vdGdZR1JpWmhFbFdxdzRkZzVPaVpJa1M1Rm1qZit0OVFBSG9rSjZiLzNnYmpMMTFrZGZPYlEzZ0JoNjZtdTlzdjYzVHVkVG9GQ1JZbVZXdVdlMVMvYWI2N0RqampqaHZwc1JjVXVOTFM3YjdIYlV1T3VpMy8wUkRsZmMwQkFldjZtMTFULys5cStGQkF4SGhTZFNDeEF1Uktnd2tWclEwUXNpYTgycXBiWmFPYU9OQkM3eEZLbGlUTk5lQnJlTzJ1bWdrNjU2NmE2SG5vWVlZS0JCUEVhYllLeHhKaG52cklueTVjaVZwOFJVcFd3bVIwMkVqVGJZYVpjZENBMi9FQUJvRFFCc1A5QnlRTDhGTVA4QThKOEROd2NBQURaMkZieUVoT01VTENXcW9waElpRkZHUDYvSlNiYm5uSmdVeFYxRHpMUUFoQ0pJdUViQm8zZ3lhU1VKUlNOZEVMSFNIdElNM0hIR3NTTnhmZXdFbmNmcjZjQ2dNV2w3amFhSjAwZXhRdFFSOWlpRzRDVXc4Z1NpSm5ud1NiMnJzQWlwUkVsbnhDWU1zNmNTeUkrZTJSeDZFcWIrQ3JHRUhtT29OQU9GcEpTeU5sQVRoSFROUG9COUhRT3J4NGo1WGt6T2c0UU9DV21jUGpSeFRDM1U4WVBvdVVVN1g3ek12cmtpV283ZEpzWm5RUUFFN25uMS90NWZaMlJFUW1vMHdlaXV2SmtMbGcrd1JPa3M1eFM4TThXTGxUb0V4S1JKdU41Wmx1YzlWeG1HcDNYb2hTRlpnNjAyaDBQcGZRamdISExkVTlkWUdaR1VqRjh4R1BhZnBDaU5CcTlWNmkwNlQwNFlZcDRvSzE0b2MzZWxyQ2lWRVlEYy9qL3lRU25QT3RhSm56SEJhYWhjQTBDZkFDcThTNzVadEFrMHBUbktOQXV1TVFXUWJGaXZ0blBVeG5NTFFPdTJmRW1OYjFacTU1SU1jNVFadG1wOFZ5bFIrRkJZb3lsWHBYN1ZCREFtZG1JdEhWMkZSd3hxM2Y0ekpveDR0M0taZnBzank4dS9WV2JVZzdaMVI5TWdwYmpKNHRtNFdBRE1RazQ1d0RTa1VSZ3R5RW13Mk1LUlRXREZaZE4vRkdhUmZaSGJhN09MWU8vdVQ0aUhCNHFNY3F0SDdLVnYwYnF3T1pGL3RlWStEUTRvSFVRWWhRNE9WUW9iVFdOMVM3REI4UFhjK3p1eDZPUTN4TzFGZG1FcUEvdnlpSzN0dWFIU1JhVzQwT1kwOFpWQVBUV01Yd0s0WkVPeEJoQzhmVHdhc0doeEtTdDd5UWxCb1Q1MG9yeCtrTnFvbUcrcUlNMTRUeVhWaFNJRDEwdUVJMkNjdUZPcTU0Q2NRdk56eC9wY2Y4R29kTlkvUzN4bWFWK3pKWnN3NzlpbGU5Ri9VOHJoUFZDNG1RbGNNRHJib0RZUzZDTmI0QUt3eHArUkVGVlMxVEk2VU1adzR3WVdRTlBRVzV0TlRuRlBkTmd3MEZNK2RxZ0hnODI2SjhzaVZpM3VuUTRUbHNpOWdiN0c0NW1XTG5kL0R6Ky9SbmE4UkxFZTU5bXFwcjdTaG9xdFZ3U0l2Zm1HZFYydjh5cHFqVTd2NWo2bnJQMTExcGdzaUx4TmplMVdIQjhiTWpwV0o4MWR0UzJwYW53VGd3bk4yMzNXcXc0YkRKU1pHbEJKVFNEbEhlTVlaWFp0TzlmdWxXTS9lMEROM1p6TkZiemYvZHMydVhJTEtneGRrd045V0VUWnU3bHM1cmt3d1JLd3lWdVYyRk0yZWFsZkdWYWgzTFUwcjUxdFdmTTVXRkhDSi9XTVlZVWpoV3krY0VvOGV5V0JNWEV6V0NWTGt5YllqajF2clZKZG5PUlhleHNyZ1VETHFiYWgyb2lEODU3RVNHTGF2dGtUTEpSZm1OV0U4ZWFHMjkwV201SXNYaTVUaDdXd2xPOGMzTFNuM2V1aTdXUjVIOHhEWTEyTENiQ3lFeFYrNng0ZjN0UXdVREdyM2h0bE9mQUc2MzE4eGtyem1zamJxd1l0RVZTVzh2UjlLTGVoWjdvSjNva2E1aldMVm45cFdxY3JtRDJWdkdPYUo4ZW4rS2lPZFVia1BYSlFmVzV4WmI3VzJSZUR0T0pUYTBOYk56d3RSSlBBWjlSdHFTYXgwcUdsTGs5Mmd2MURYNU9VUSsrM1k2dTBVSzNQUHlEUmM4ZUlsbWtTY0VacDB3UzJ3NndjSzMrS3FuSjM0eWVOYWJ2RjUvUnlEUjBqNzhIdzg1SG16R1ZPUzBXSWc5SkFlbGdPNDl3Tmt0STdoQTBXOWt3SnVqOUNFbDJHYUJMNXFrSlhKbWdzc1M2YWdOVnY3b29HaUFneGFsKzNxd1RYZlRpbHJDbWxWbG84WTBMTTJEL0FOaGZ1aVNKck5YVnNCeDBXdFBia1Zrdk5hSGxrd2dBMWNPUXRJeXlFVWcwT0hIbHpkOTFRVzNybDNXMC9zM2R3bmZZSzBnQ09XendQdElDSFZuTlg3ZUJnUm5SY0dRU3JqaXVjMXdud3FXVWwxNnZSWjlWaFhTZU1JUzBrZkpDNzI4a1BrL3IyREVkVFBJOTBHS0FKbXR1UmcwcGpIYUU1Uy9sbXk3SFFDWTNnQnFrYmJrcERpdDdLTVBwOUxrUVFTWi9QNUlxRHdSQ2VQUno3ZDM2ME9nYUZUanNlTjUvRE84bWE0bEN4bDUxV2NwTzhUbnlkdUZsbWZoZnpWbXQ2ZWNoOExlbThuK2dRS0tLaGd3MkVYK3AvRGVzaTlHQVJWZ0s5a1RsT0xUa1FJYXJYTWJKWnRhRUQwNmI1YmRJNGFKK0VUWCtBaVE1SmR0dWNRMVhhRHp2REZxMXNMYUpjM3R4S1EzdFFMZXlVcXlLV1ZRM0YvcTBkRmo4WUQ4azZ5ZGRWRmE1K1ZzK0RTRzZ1Qy9uTjljZW51RU5xbGpKLzRjb3QvbjdmK3BpWWVZVXBvK0ZaT2xGR3hSdlYxV3k0VkVQR0tMSnBYN0FCM3VDdExGMmJtV2FJQmlORjZoQjkyM0cvVDJtdWR0SUUxZno2NlRVdzNBYnJRcmFsd0VGaE8zWkxMWkpHeld6d3p3TGpEcyt6OG9aazg0Z093b0hVQUhBZ0x3OFhoMmFGTXI2NmpzNVNveGt0SllCZVRyUmpYNXpuQmtkbUk5TSsvMWhyY1lqWXRkWnJnYnJWVFI2YzA2bzNtdWFDa05aY2pyZlBzWGxpcGFqTkx3YXVmTDVFVlNLRUFIZ3pvN0VNeFlKVzAvb2lKeHVOdGtvMFdtVS9PNDROZFVXekl1c05rZFpmamRmU1ZvMng4T0RISDZMelRIdXoycHdPVC9PY0JFakoxUlVqUjhiODc1TklFQkJ1bTNCdHQ2ekVvZGIxaE1kb01ockdHcVhVNDJCMG03M2t5THVSb2E1OFJ4bkdpS3htSUh3dGdOU3V2a0FxdXZSMEtOSnd2MzRZZTRZOStwdlczNUUwdHNGRjFndXVqVExVMzVmcFU4RHdsQWZQbkc3SDAzelc4WDBkSm5tdkp6eVk0NXg4bGhENmcySkFURVI1bXgvckV0M21OenEzT2thVXdKdklmR3UrZnE1WGZCT0hqYWZ2UUQ2SW93aGhiOW5RYXhUNkpEZlNiOFZreHJtVlZucXU1clhJNVJxN1JIeU1KUmlOSm5PSHQ4a212YmdnellqZ25UbjRkeWV4Y1N6TzN2UXlEb0o5bFdJanVJc1JLUjhmYkFBWG16dnNsdk11YmJvdlRhbWM3SzJiUlVmMkgweVJqTHRKcWVUdXlBamU4WVFjSkpBMWRjZHR6dVZDZTAvRXJoWU5Jd3UwWU96RXRlYitTbE1LT1VRc0U5dXVadXZ1UVhXYlhwWGxDYnV2SkFSWFB5QW16RkdoSSt1T0dNQkg3RFBPMG9EVXcxTTc4QU4zaEo2RUIrcW8wWVJoSTU4YkJYQ0lVTElteWdoV1ZzYXlzSVNRQjU2aHFCMkhJcFh6T3pPOUVsRnNkeHVCT1gwaVBoU3hOUDllVmh5U1NJcDJFelhrYWJSN2ZmUXhrZWlURDRMMEZZQ0dHaU56TURkSWpYaGhkelhQemVRNnNIVXdEeWdkVXN3eCt1bUtpcTQ5bzVRcnk0RUpQY2h2WDMybUoxRVpQdkxySjZwY2FWdW1DM3BRcVh6ajJldlg0b3BVN3ZOdTJhK09WK2VyeHZJajJVYmw2QTNuUnNreGtXdzlmTkFlalZ3TUlFNVJIRVNvNXhyMXhOS3M3Y2NOOE53MzFNZi85dFJBS05ETEhEN2NMNjVtbWVwYW9oa25QZUxZbmNiK1pHQVZzM1FtZXM1eUJHdjR4YkpSN1J1V2pLSVd3UTZsZkN0RnRIQWUwV0NvbzFEQytTQjZKc2RucEVtUGdCMmdTUTZKVWk4VkZvSUJoVjNraENoZjAyWXhqOUp2ZWcvVEtxVHdnM2VIUE81c1ZrV0RZdkdDU2FCdXFJN25hQTlvTkI4NzJOZ291SVFia0VySGI4OEoyZE5qUzZKcERyVGZWN3JoOFdyeGtyOGNCM1poMTJLbk1tS3FIbzFwT2VuaHRGNDZhekU5TGE4N3VjUnYzSlIyeXlRN21JTmxmZG5Ham5VSmV0L0YxdWplK3FPNlN3NnZZU3A2RFJzaUdnSjVCY3hYVm8zUjVMVitZVjF1dXpodmlYRCthYjFaR05EeDJQeDRucmFtYWNidHFIS29jeXYzMGV6QjI4R3JralhlMCt4QWtCd2FUTXpMZFltRk85Ty9nMkdJZUhBU1ZOclR6NFV4ckk4VHhLampWSnFydDFYcmRJN0RNKzNEZStDUTFmVzUvVjNUWEhkZnhvckV3TVBUYnhyc1JhWXBubEtITXh4WkhzK0pjZk1iN1hHcFBCV21MZnVDUS9mU3pldjJQUmF1Q3o2QWxsL0I0RUNFdnRGbzlCckdFZFpwbklPSStMZ2duNUJicU93U2JqaS8xaHFCYTM0bjlmSjlBRDNVOGlidWFtR0dkM1cxTHVSbE5vaHpuTGt1aVBlRDFqM0NERHA1VFZOR0ErRmhkWG9hWUV5TVQwcVR4MlJud3BzOEl0QjlmSEozeWE1RmVnQ2xmUDByUmxsOWQ3Q1ozMzNqL2hnM0cyTXRhdk0xZkJVTkJyTjFUZUZXRjBvYzdpd0NvUXZLbWVTcGhCUmVIdHl3MHlpdzkwbjZ4cGdDWXlrbW9OS0dobWgwSVZaWThLQmtPMFcxcHFZSWk5TWlUVkc5NEoyamgrY3ZPUzBSc2VRSzVnVUQ4RUFxUDJDYXI5SWpWaHRWM3N3UFZOelRCM3Z3WUNraVdCVTdyNzNONDJCQW42TjFHOWZsOU5YL0Q1QStKM2s5UjZOVVcvTnlicVRyVnN6dzV6Zk9EOE5vMW90WXZYMlNnWU5YMTBEYzVZb1B1SkxVajY2ZFR0Y09sL1BFYllaUGhyaTMrTysvRTkrTjlqYmVhUXJPUTVnSjE3eDBDSjJtRG9ZWW9OQmxUTldOSHV6eGEvRHVmanJ3dnJHMG9nK1lZYkZDYjBUQkQvM283aXR6TjdkelhHb2R6N2ZKMzZ4c0RPa3lPU0E0NE44ckhQdi8rVE1hREZwSm40MzROODVNL21jcStDS29pZ2h5d2Rqa2xWelM5OEhnNlFHQkdWK2tTYWExSzBseVI1VGtEY0ROL1lKVHBSL3pmYnpTa2s1ZXZGN1J1ZEZZS0pxbUloRWlSRWlyMDdGRUJOYXo0RUt6NzgwQk4zcUs5ck9iKzRZbzE4ejc1OG5ja2dTNk8rUGdMSFprK3ZYZXI3SWJ1OEJxdHJiczFmMzNteDUySGV5Wkp4M29pRzgwWHpkYkE1Uy8rRUo3THhFZnMyZFB6NFlnYXNlaHdSUmFMS0xUa1lnUUpYa1BSYkFoMWpxWG1TcmR6dmdtZkUrMlRaL2ZtNGp0eStkaisvZkc4MGlSMjZuLzY1MWorYk9kRWVWM2VaTDc0UVVpc0liUnIzU0pGNVRvbld4amZpSUdlZDN4YWN1WFlJL1hDOVh0aFlBWWtEVVkzdDFFZ1ROT1JrZ0U4UTRVRFNnVVFjT0hFQXVnUEo2Rjl2VVpRSjRuTGRRci8rOVYrR2dhNHZzUXhDRE5YNzU5NXlOWHBNL2ZXeEFucDl3K0M2ak5JbjI1VTVvc3FRR3JHSFhwQk80TmpiY3U2eTVmY3ZKb2RySHducFdhRlhXRFZHRnFYZjNaV3VOejdGOWV2dHJ5akc1aGFUb0hQN1h2eGJXemEyaUZnTmxYcHVLY0h5SzZ0SEw1SmtpeFMrMWp1dW51d2xxRDM3L1cwRjNRVGNkSUxVVzBHTmczRmMya3A2TktpNWxBVG1lbW9Ba0lUNXJaeFh6M2ZkbXArUU5tRzZSRnh4M0c2eWVYaW9wWmtWemZsZFlyVGZUWnp4WTlnbzIrZ1lYbVlJaFMzY2t0NkVFUGV6WTIzWkhoakcwd1B1SHQxenN6N1lzZEdlUHVaWWxlTU1Jc0thMG1iVEZydWxNR3kzc21KZVJDc3BmOFB1elE0SElScWRhSVhMaEU4NjdZZ1lCZG50WGtjMzZiVS9QNHcva3BaVDhVOUYwTTBCMGhvRm5vTmEwdWNXd3hGaTUwczdUMTV3TjB3cVRaZkI3ckxWOHltaGJxYmNPRi9qYWRhdlVmTjJzaFowR1ExcGI0TjQya2RHbjBjVlREOTEvV015Y241ZXFJUlQvMStkRmtiMHZUMWdPSnVWdnJDSWYyMlV1S3BwOTM2U0ZXMHFsc3FGdW1KUFdPVEN6d1U3NFhzS0ErV0J4bnFETlZrQWZBcUkzaldxc2h5bjlITWE5OVN2WkJtR3cvS2NCMWVqUXlvUEZZNXN1L09FUEQ3MFR5V29RL2lmVlIzbDhxVFNBdXZUVVg0RjRTZVkwYU5GelFBaVZRRmczWkQ3Ry8zMEVLTi9wY0VzQUJTakJYWTlkaTc0cmxYcEpjNGRWNDhqYUlCckF5NHd6THdJRFZadSszV2dmc3UwTnBPY1l3dzN2WEhaUWNyUkMzTnRRc0xQR21FTVgxQThzSDMwWVp1Z0JZdWp4Q0x3N2UrNU5EVGRkUThlYkdCK1lnNWFYMEtwcXdJdXBTTHIzeUQ1Sm5GeFR2ZmFucDZPRzArMStkbUYzNklnR3N3OUJCY1A1M25mSFA3Tm4zUVpYcHN4TStLcHhETm4xK0FxV0I0a2RqYmlhWXZ2UHFQN1dRNEsvRGpEVVo3MTMvRGJGN0JHS1NLSjA4WCtMMVRSUnl4K1ZXNzJvT3ZBMTNBUXVyWHUwNDl0M045RktZRTRXM2M2RTk2YTAxeVlkdmk3NytEQlJYdzltUkMvN0xQR0psa0ErN1I3MjIxY0dRZmNXb3k2VUtjcmZ4QXZBZkJ5RDZjTmFjdGVxSENhZStwQ2xtTEd0R0JnbUNTUDdqQkhSMXRkMFg5NHUzNjFiRCtZbDJnWXM5OXRrb0ExdWM4NjRQZkJUaWNhcHFldmhxWEJmZTJiUGxpK1AxSGpNWkZhdTRCR3VWTUdsMjZJYUtEbEo0ejY5WFI5R3h4WEhzNTBXYkxiaThBMThSVGVFcmg1MVdaWlQxaFRURmdweDhXajdTUGlxVDZzazJPS0g4NXI0QzY0VXNES3pxbkJHWGZVVW9hRjg5Nm5VSm5rU3YrbUh2UklpS01CaFVRT256ekd2SDBxOSthc21ZOWFwcVpxd1djOGFHRE9NRU1sZ2VRcUJTaDBVYVFEMjJJN3NlZlRhcmtGZ0xObk9wQTBlSCtxd2Q2Zy9vZFgrVnlXdzBCMWExbS95TFBjNVZRWjl6MVpKTzhMWGI0WW9yYmQxL1dMbWU3VUVCN0JyMTJGY0ZnL1pWbzI2WElzQTlKdGlCS2RhemxveEZQMFFRd09KcFFVb0VqZ3c5M1ZzUTNwdDByQ0tOb2g2bkp5WFZHY093d2ZNYWRjWFErVVJ2SC81MzUrMDBlWTRFZzUvWkwrd2ZVeTFwR0pVa25aT2puYmpFbUhFWWh1d1kwcCt4bTR4Wk0xSzAydzFEV2NjOGJzaW5NdG1pWldOeXVDQlovdG5oSFlqei9nWk9xTHVzZ3dCelFWZHRQRlFYZVlEdkhsUnhjd3RzUjJJMWpSOVNLaWR2T2IycGs3RDAva2lLdU9YeDNwbUR3NUZBSFJibVhWbForYWxTeGUrNEhTdWRpeGZhL1BKWVk2RWVtbzBrdEpyNjhoNTJZY0dLdnNIOUQ3eDlGVjdMOVM3d2RLd0tCdVhtQlc3ZmJNdFowQklSekZsUGNiMW1ZOG50cHNYMllnQXVzMGNNMHF4UkxQV3QxMUt4dmZjanFyZ0M5YXJFM204SjdmZUpSY1FWSkFlczg0cjZ1L21nYlVucWR6L2cwQzJ1Sm9WN2trOS9LV0NWTG93VzVPUlM3bHZaMmovNnFDT2tldytmNTJJMnJ5cWp4NCtxMjUvLzF5VDl0RG8vbXkrU2xabHo5bHI4T2RkanVDSEdsZHJEQm5FR0V3bkpYQlhtZEo3WHErSkt0QlBtUFJlcGV3bVc5NFJPR1ZFWTlLNDgrcjhpRWhBem5UeGdWR2RFOU9LMEVYblNDRmR4dkY4YTRLVEMxTnk4WnEyNzdCTkxpRmNDSE1ENUhlaFl0Y2hEK2haNzhGV0JvQkFOK2toTHlteXlBSUdXY2xhN0xXODFsZ2ljQ1FkdGRpYThNUEFIZGtIeUhxRzNwSXVodWV2TS9iaXhnUHlzWmU0UndyNHM0TGN2SDNXNUJFOGdWLzZ3MStSd2VqTXpDUitKdjgvRzlFVzhReitRd2VJeFpLQ2pBK25YNGM2dG45WWFmVU5mbDhVK2MxV01kd3ZYQThkYTZaM1JSdURzWGFnQVZ2VDBaeDlRNnBrL3FzQ0tTQXo4MXpYdGZ0RmZFRE5Udy9uTWJoNlFXUlpUWTRLbjUvT0ZYZmZTQWovNzZiQkFkaVlvUkZwN2MyTXJ3WEJUWnQ1cEQxc20yR0lWY0Vmd3RwMjBhZGYyaVpVWEkzd0RXbENBVlpJNVZMZjY2bU13R1lBeHpDdmxpR28rN3ZpTDE5WWo0SUt6MDdab3NNUFcvUHFmMC9ySXpwK21QL083Snh4SDBMelRaOHpHdEdzTzNFSVQ1eDZWVHJYVytMOWxnZTlVTUxQNVpiZkN2T1lsR25PaWVCcEVuUlNCeE4rL2VCTmYwamJ0d0VFNkJhb3pWeFY0cVdPTFE3KzZpa2ZkRytCS3d1eEN5SStyMmIrZzJOTXRrWDdSN2NmVkRLV2kvZ0NFa0QxYzFLeThzTFhodmdlT1B2aDRxSlo2RThHcjdOVGJFRlBjMnZEc1cyVzhtbGp0RnA2Y0NaV29zcnlSSEszUTlEdlI4OG0yOU5rVm5YdXJpUUlPaVNzYURwK3YyMU00ZmxVY0x6WWV2QkFDOXIrTVZxTnZvRFJDZ1ZGamN5Z05YSzdDeFlGamIvbG8wN1Z2WlF0bDBtem4vT3R2K2RKMTFkdHJ3SGsxVUE2dGRDd2VzM2swblUyTFN4c3g3Tk1TUFpldHNtYU11a0pIb1BYZENSOUg2b3pveEdtcjJXWXlKWkxPWkZBZGd3Mms5QkN6M1g2OTNPTHlHVHN5M3ErZWVKSnNlOTJ5YUlnNjcxL2Y4ZWduNFBBTXhRSzJYdzBMdmZkSjlCN2MrUWRTVFBTdmxDclo0TGgvMmhxbTd0YmFYRGJ6QWxodWRTRW83QWV1V21xcHp5MVhLVjF5MVZCcnBLUkxxVlM1bFpxZU45cTlCc1RtTlVvUU1XUk5JSUdHSTBYa3lzRVNjZ1ZabzdIaFlyQTBhQWxTb3dvOEZWZnV5K1hGbW9yaE9FRW9uOHU1eHNGNVlJdzVjaW9ub01JRmgyMVhSMHNIaXV1bUR0SmZ3K25uNWhTVkZXTCtWOVJVM0ZZeUlGSnZTR3cycE5VeWlnWDhLdWNEbWphT08zQnZuMDZYc1FoYmZPYVVkUGJudVNEV21qSWtrNTJUWVYxYU5JM2hsa2hXcktFWlBpd0RHcnlQY1BiNy9JeGx6N2FwSGtUaC9ZV3ZmbXNzRjZTNGtoYnZEM3FKa1FVV1hCWG5maUNVVWtpSmpRSmw4TFh0RThxZEk2akZiZEYySjdtdTI3eVhsNDN6OTdDOWcxU04yV3dFbytERGtPYlBlbHBFSFhrZDBtM0ROSWt1alZOS05GOVRJZXpmMXF4cHBkQ0ltaGY4TnduYXJ2NFAvVk9NTS8zd1FjdzY0RElKdTNCbmp4RHdJRFVqTjNuYU1tb2plem02UEREY0Z4K09sOE81UXV3MThHUW00QzhhNWgvUlN6NlBjRlc2Z0JURjJUR1Z4VlFxT25HWklhS0dZeWFkT0JVd1dod3BGTTRZMU1wWUFnSFhxL0J0ZU8rYUtiY0dJVVdnTUtLeU5TUjZOaDl1dWdZczdDQ3FIQ3owd3FncDNZZlliSG5FbEVaaGdXZkpQNTQzZmQrT1M0MUlNcXN6R2pNNkpHbVV2dmc5dEh5RWd2Q0laVEszV0VIQVJDTG1jaWRpUjhUQjNpUUJxejFCcVJxV0ovREFSRThTMUovVTRJeEwwRVdCZ2I2SStRTHg1eGVQeHJkVjVTZnJaK0YyR0Vqc1VaWFZOSGdhRE1kTldrc1FOWi9IQUtjTkdtVTBudkVFQkkrek9tRTFpeHhYUG00bTFiQkpIVCtrVkhrd284cFhFQWthc1p3VFdDMkFGZlJWWXcwL1VZNHRMcTFZcUxTalp5dWFSNmo1d0piNEFtK3lUM0dXVlh1YzNZZ05VODNnYmJsYzhKS3NmVWpRMEw1ajNwVUZjWElHY29BVjBDN3crYjVxUmlKV3hCRXJrbjhadVhleVdBb1dmZW1sQXhkcHZMZHcvcmhxWGJ2YXNFWFk4c0MxaGZ5S2NwQjhiN2xieVAxWEFlNFdzY0x6eFVOYmQzWDIxTlkzUEVGendYdUx0dDVSZjVpS1BTV1FJanNJdnIvVnJZYncvT0M3Q0w4dk0vQlRISFo1NVlhSk1wRE90N1J0YXRwWk9kdzJuMTVEaCt0TGpTOEFmdVhqUFJ6ZXViOVFCelZ2ZHJZSmhRRVVIMm1rdjB5NDk4Qkd3bmZ2aWp0b0ZiVTNTZHEyWC9kMFMzdEx5elNMOTFOejgyT2dCUGdzYXUreWdUK3RPQWc1MUhDZlhkR2Z5bkdxRVJUdmE4QTJxUEw3UGEyTjNMcy9uWmRBSzk5eTZDazI1NjVETFczVXhMSlJZKzJ0OS94dXZyUFowdHBTV2I2dDByZlYwclNQMDlIV3VxNjFkYnkxVFF1aUVyeE1wSmZjcHJkREZUVVBWYk5GTnp0WWFqMWwrZFc4bjVwYlh1UTBxMXVhRDRNbm9GQ2kzOTBudWhqZjl5RFl2eHl5STNTYUYxMFh4MHJsSml3NjNhM2tVNnAxSzJkd2t2eXhXeHlyMWM4VE9rRk9YV0tLcWozYml2SUVYMkhHYmJwQVl1WERqcXBEMXNFK24xWnRuY1JKcm1tZ2NuaVZET3V3dlBXU0N1eXdubjlhWTdVdjAxRE42eERUdDFxbFE5ZTdoVXRiaE1LV3BjSkVCU0ZiOWVVWVhBSkg1bnEwa3ZzaERtMUZyV1czOG83QjI5Qmx6ODU5V3lQUEExK2Jqd2FwK1B4a2h0ZDFJS0l3OWZ6bHlrN1YyazVNbm11VlhzbXR0VU56ckgzeHR0WUg2SnFqT0tLMlErZW12MTc1UHFRMzhUKzltNlM3eWZVOHE4RCtCeGhUUmVIQ3ZqVG5Xa0FNOTFKWTJRa2I1QUdQUXFXSnFBNzZubHcrdy9lOU9ZQmlwaTRkMmt0SWVPUk92MUJGY1crYWdDaEEzZXNsRVhVR2JjSUdBUlRjNG5oVDExQlo2NlhYelRGTEZOeVpJVDVNTFcrcnlCbW9kVzJWckVYRFJNWnFSRC8ycXlNTDcyWGdRcEdFTGZOb3o3MGd2bzdCa0J6eFdwNmVoQVZhY25wZXRYa042eEpHZGdpSnlocEpoN2FDTUlnRE1jcFJUOHFpYUx2TDdHYU5VK1puNHVpbHJnYTNZb00raUtzSEhxajlHdTRuZ3JwRkhvV3J2bEZRUHNQY3B4bGpxT0xzdmRtbWpicmVtc0hyYTkrdVNzR0Qrb1Z1cGJzT2I3RnhaWVU2c3F4UmJkeDBuV094a2traXVzNHZudy9LMFdDSlI1dUk3NVhYVDMxNEJzKzlEVG5CeGJ5Um1ORzV3dzVCZ1dQVUpoblpzbDJXVzNONSszVXJkaVUwTGlxeElDOWZKaHVmTmwrV1RKcXUwTGNTa2t4WDR6RkFlNVJXUkxWY1BqNVRNMU5GUnRQNWJiZmtjL1liTk5VSWlMbnBUQkxUc3JzcGdDTVp4Mm5GYWtNdkp1Y29pandhVU1hS2VMN1FRdWVqNktPMjNKRmxRSXRVdWpZek8vU1l1RTA3ZmJ2SVJORzhNbmNwbzVkM2w1bEswaklqbWR1NDlZOWJYNm8yNllsWmM3UGZIZjkwdk1kbUhsd1pRVHlIRE5YMUdsNWsxajdjUDQvNU1ORXA0MFFKelRNM0dMaXYwSnJmQlI0dUFmZjBxQkJNVzBLVTRWbXEyT01xY0xNZFREZXZhUGlDbWJZNHdZeVZMMWdaTm5WUnNqNEhMcGFBdWVhbnE0TGNDcGxYcFJLaWt5bVU2WWFjNGV1K0VJbysxL041K3M5RndpOTBRUDJOcmdDS0dwVERMREtXTGFSVzZrYlBhbU4zRVptS1JJUVF5ZFVlYkVTMCtYR3FkcWhiZ01TbTR1SDloYjd3QWFxT0lWMkM0S1BVdm1JRUwxQVBmQTM0SzVsbWl4VjM2RzgwS0xzYlVvMUNudXJDeUJSRjdrY0ZTKzlFc1lYL3pRZmY4Qi9iZmRQa3l6c3BNSTRxanBuc1hyckFvNy8xcWRmblMwVE0zQWFTMlVUdlI4ZUxWdUxlanV3TGxIZGJ3blVXWFpGVm1veGhuYUxMampDYk5maVoyUUpKTGdpSzI4cU91a3lseXhaeWV1SlAzQy9wSWJRNlRGMnVoWGdhY0taV0Zidmd6M0d2d2g1Z2FHZHRJQ0haZEFQd1BhQ3pJdWphZTFmTWRPRjkyZDRRd1dIdk9YMkxLREpsajJpNk5qZm9ocXNnaEZ1dUc5aEtyYVhOMG9oVjBFT2tHYUxMTHpPTXZ1aFhFOHZVNWRib2NzWm9ETWxNSVROeStUV2kwSktJTDVEVSswL3BkMGYwUTRtNkNYV3A4TUhRSStWOW5obmN3U0RLTWNvUS9jaHpWNzliS2MrL3Z2ZzUvU0Z3Tzc5MDdQRDV1L2RVeXZldjlEMmpYMFpaZEFlU1JpL3ZmNnE4M1dPekp4aVlXaGpLSDlwNkRtS1VkdHczNWY0U3hxdGJIN29qU2NXSEZyblcrRDdsWW0xTmsrSG1heXJ3ZFBSQ3ZmWW04TXNsanhvZkVjMk11RFgzMncvTU0raWx1dnpyRFp3VGNlbHR1cDl1aHQwR2w0OGQrUW5IVzA1VXNqelhhL25uMmJOczgzVDlFSFpvdThudDQ4c0ZPUHMxNzg5M0NiWGIyc05MV1RHTmpwVTRBTU9UckxoV3k0NVBYcXVWUnF4T1ZRVFdTR05XaHlyOHlCNTQ4b0pXWUFQWlhjRGh6Y0tPOTMrOEIrTzVSOHhLcU41Y21veWtGQ28xcmhZRllLMm9oR2V6UnRRVmpHNnA4am5BT2xVcGorUHFiY1MvbmxJQ05XUTRDN0JFY1AxT2I5L1luYzZ0YTRJM0xuSklWa2I3Tm1IZFdLajJ3cjlaektUaTc1c1hLMU5EZTV4ZFk0b3B6OHJFL1FlbkgvY3NXWFlxRmRtYmNRalgyQWZpdHBCRUdwRzdmUEl1dmZDckt4VmF2OVlRWW1Xa2pnNDNxQUxUZkpkdHpLb1V4bnhFLzNmUk9tL1JqS2k3dXpBbk9hZ2dTRm5YbnBicklIQzJMTmVXb3ZGbDJwWnFyZ24vNUtMa3NqRWlJTU5pL0loRW8vUkZaWmcvYXhZREtTL1lKVXpyVTd0Z2g5dURtN2p0cENGSVdiODkyeDJJMnlxeU1TcmVicjlJcTJQV3NKMk1YcndyTlNJaDNRQTVBMi9aVUlLMDFmYnd2bVlFRjhxR3FwQmlMR1hxWFM4ZXV3WmlMSTdWOXFhUExoajIwVUpQOTJxVkY2VjR2VVFkWXMzOGw5QlZnU25jWU9HN1pWa3RpdHJmZnZ0QjJiN1FKK0tHbW5OZXZKVWpXZXZoaUJDdlVpR05QZHlHZUFYTHQwSjRmcENjMkdrRjk5WFRVa0c0Vi90cXBLWEg5ZW1wQnhWbnYydURYWHBmRThtc21tTldsT01ZMkYrd3lWRE1HU2RDWWVQbVltNlRvZE95Q3puVDVuRElORkhRSWlYNFluVTZvVjNxOVVnd25jeWxPR2FTWm8rWFNhUW1WanV6QmszR2FLUVhSeFp4dWcxSnZzLzB3MkQ0ZjF2eHlVUWVHQlo1dlRJRCs0ZGM4c2Q0VCszUXZsZkFYQithSTcrVXpjN3pGQStMT1p4ZjVLQzhRbTF2Zjh4SUFkQm9VemwxTktQK1JIZEY0ZmlwNWxjYW1uWTNkMVMxdjFiL3RXUElZaThSaEwyazVRNW5hVUdnOFRvYTEyaVRtRm1iVUEwVVRXaDBDVE9tUytwaWdIY2xwRGh4OEdhb3ZTV2pMWFFyMFZJRW9oL3oxS1VUdG4zWGVPZzc5REMrNUNTVTZScmRQZW1UWC8xc2lkdjZENWdWYVZac0pUUG5VenNsVjZ2RlV2WFZFdW5WSElsRWM3VlhacE5MYmJLdk1iQnNiNi9rczMrTG9lWFRWOUlRc2dNTjlsMGIyZ0pablBOcE9NN3V2WjR1V2JZZDU5UlRPVHczSkdYcG52cXFoYlgrRzBES1ZDdGdFbDFVTFJQZjNlcmdrTjlQRjY0RUVIV1pSdDNFMjYyMWZQU0hhait4U0wySGhsendkVDJ6cXZoL3daZHNDRWpObzRvdUlMZDdJY2UxYlJId2ZwVldCWmhqZlppWlRBdEZOVk1MZzZnV01oaHFtV2hLMFIzRXBvS3R4eXVXelMxcTVtcnBPd3E4ZVZ5M0MvRlJlUk1JSEtlWktFSStlWWl1b21sMkNQb01Galg2cThCbHYwY0UzVnVvUWs4SzV5ZU1wZE5ISUlrczN4aExDU1hsZkU4cXYzeCtqdzlRWXBoUzR6TEhOZjN6dHJFbU1KMDRHMDEyVXNQWDUrdHF1a1hiVjJoS2JVa1JUSTZjK0R4RGZsTWh4b3NDSWMvemdKaEhGVXRkanlsdldDa3B1TDQyZFdEZnBPbHVhcWxaMWhOQnROc0xmQkdScVVKbUlTdjlaNEZFZWt2Z2pXdHNiR3I4UWU1Mkk3aTlKZmdSWGdPUXZWN2JKTmF0K090dFkvUXd5a3VOd0g0akMxYjVaVXZacDcrdXEyRmt1cnM0bWdPaGRyVy9kOWpnVFE2N3BnS0RyOGhtL2s3bzlvN3M1MDZ5MkNlZVkzUHVPOEZtbmJ6dmJ0WVBMYTMvVy9yWkZKWjdHZ0lNMzY3WHdQWWpnTXByL0VNZzRYb0RtNUd1bDFnSHM3L0NJU2FiM3p1Z2swNE1hQTBJVkVVdnJtM3VwV0RSOERjS2hsdFFNRnlOZ2lFVEkvZ25lNjJrVGQ2YzJkYms1V0hEcng3WkpJc3FjS1l2U3VKUmxJYWlvQnRGd1Rzb0N2NlVvZ1RBZGNnSkxjZ0p6eUluUElLYzhLR1VvaTkwd2ZTYVJ1d0FvbytvcWJxUjJ1Y1JwZzQvY2ozQlRKajlLZVp4NEdmam1tQVg1VG1XWUNsVE1OeW16d1FseFdtRFI5VisvaU9jSlBaZm1CNkhsK0FHalkwbzR0UnQxdmNIdTRiRmFuMnl6K0FiUmpOYjhvMVNUamRHR3FOT3hYNFNJVFZweUNQWEk4eWhpVDNCQWlZZTN6SVYrS2hrNWlSQ1BtalQrM1NsZXArdUJ2bmc1REdMUWZFWEE4RUE5bmJyblhvQXNYd3hlNyt1SXRBSWZvMzY4VWczUW1CcSt3am9iZlF4K2dSOWlqNURuNk12d0pmZ1Bla3JVdndhcVNLK1ZkN0Q3K0QzekE4ZTJ2aDJJekQ5dGVueFZENkpDNDUxMnh0OGxqNUhmVDlQZnhwK29zNEh0QVZkd1l6S25LcStRc3p4ZXhvM3JHd0xjcmQyVmRRUU4xbVh4MVBjd0MxdTRzUGJ6Qk5FTHYyTGFMRGRVdFAyb2JReEs4YXpIb080VzNpRDNUNDlmV2VVMmVmUjNmNy95TEZZWm1EUVh2YzlLOWxhZ1VVQU1lTGVmeGFzQWpDSGZWZ0FaQjZJZFlzNTBYdTEzYnFMRjliMjRJOVpEMnNEYmkxNC96OGd5MWl4bHRqZ3ZPVUI1TG9BZ0JYWXphbEpnc2FNclIxdFhZZFJSbEdIOVJRZHNFKzZ4bVJnOHlJZW84b3hSdU1RQlNvUHVNT01ZTUxkczR4R0NKK0gyU01pNWFidXMvd0NWWTV0TkEwWG0weTl4R00wSnRBT3ExcGdLMEJkS0FmN0RLR3YwTWZveTlGL1pHbGFsTnZsd25sQ2NoZ3RSTDlsVzZBcjRLTitvU2RnSXhYcElKeUYyN2dPMk8vTkFsaDFWWGVOT3lQZDkvM1NJS0EvVkNrMzlZNEVQWWl1SGVNQkhKcFdrbTNRZUpFTFBFWUwwVzlnZ1pLYTl6R0h6djhiSTdESGUvNFliaGZlMkU5aW9POUpNMzIzYnVic1NrUXZpTXcrbjNRTkpVZTh0T3Ryenk1djJFYTY3QTJ4VlpUczR1OHkxampudTUzTkMza0ViaUUvWmpzaXVsT2oyMFE2OFU2WUVpbXR4a3V1QzN2TDhZWkxvMnNGRWFkUXh1dkc5bEUwZXQ2K2xrKzdNUUhvTjBQWWxzYVhiK3ZhTjN0cjF5NDJkVm1rZlNiVjV4aTNCYlYxdTExTTl3RDBsT3pMWG5ZQ1I5MHQ0d3Qrcml1b0tBMTl5dXdEMnBMQUp3UTdaM3krY0luaThrZzYxOG5VU0FUMk82VksvM1dCSWExaFQyZXc3RW9GU3JhTUlqK1RXRTArOTRyYUhBSndFVDkrWjdwbFhFanEzeERIM1FEZzVJR08rNUw4TDIrSi8raXd6eFBNeGdFaUJnQUkvaXlab0hBbU1QMC9lRTVrOXk2aU5lMWs2dzdXejR1Y3JxVHB4eVozQmVVSnYyUnlwM1hGVFBZZHlMN0pJd1I0Umtqek43YXpYaTJDSU1FMHBUWG9kWmM3SVNqZCtyTDRGSHhHRXkzQVJIVUF4MVYvTFp2aWpsOHdXVjJtMWZTQ2Yrc3djMFcwNk9xYTVtNlNLenl0Um5oUVZhZ002TWNoUmdrSk1YWUU4WWhCOXVtS29vVHBHUnFOa0s0Zng0T1crdSs0Q3JjR1lyZ1RaNXZtRzlUVWp0Zm5pcVlaVVdUNlVnMGVFM2hraVVHNW5CcGdqRjE0RFhibytEUVJiZnBWMTN6TXBsSUpDdWMrVkxKeEdnYXp4RndXSTNaTG5qNjVYNTAweEIwM29aME1MNGFTUDZHdlFYS2J1UE1yVXF2bWFRaDNVR1pyUlVaTmlZbzl0WFRSVTd4R2xkU3lwWTQ1YkFyTFVMTXp0QWI2NWltZElPYVJEWXBJVUY1QnNJbzdLUTYvVXpTd3RJMlNlZFMxazdRb0lYUFNjMEdURjR1eldoeEx4dndOeEY3aDlyMTJMTFlYSWQ5RkQ1c3JPL1MzMmJLZVd6WlBKcVgvQU0zUWgxcHVmU3Q3NmppUXZZRWwxbU0wZU03VE1rd0FBM3Q5U0RtNzZaYVhLTFo1NjV2cE8waXh2ZlF5Q0kyajVCT2hWL2syUGlWM3NSdDRLcUZsL21EdURuVXo2bTdWdjc4UlBiM0kxalBNWFZDcVZZaWYrRVRGSG5XM3JjaE1iNTFlMXV1VnB6TDBsZ0dUSUFVTWFSVUZjS0FEc0lFRTBRSVptS2Z5RFVsRlpZY28yYTYvNDNRRENhWHNrY01HT0syczVLRnpxUHlpN3NqZko5UzhOVm9qajhvWDFNanV5ZkVFUUlDUGNXaW1BV2dqTEJ3a0pxME9KamlkSFp6MmlZM09aenNFa2RuckVObHluU05ZWWw1eWhES1hZZzhqMWJxVENBaHNuQzd5NUt0UUtKdFhsbUl5aFV1OE5MTEJCWml5dVFPVXlEYkpkRVVteURXWnJMOUNlYWFaWWhJSDdVUzB1SlhtZWJUSWlqWkJjckY4MDI4Nkp5ZXY3RXkxeEVRT3FzbVR3N25LdGRBVVplenlUZURsa3kzWEJHVVo0M0xLcGg3UUhLN3hxZUFRZXZ0b2NXUmxFdEpsQTAxUlpNcFJLVFZGWGVycHhWeEZ4YjY4bkY3anNxN0diZFUyMEJ1ZUlWSk93c2ZGcTRUUEJJVVNPTGk0Sk1yUVZ6OTlkWk1oYVBDNFdUc1l5Z0VuWnFzNG1yd1lLZHhldVBsWUtUTEpxRFMvVjRvNGhDbytEdk5RYi9RSSt2SG9yZWZnTVRQTW00WTV1MDc1UDZKSVhoSC9lMS95bndFQSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1ib2R5LGh0bWx7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseSk7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNH1odG1se2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1wYXJhZ3JhcGgscHtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS42O3RleHQtYWxpZ246anVzdGlmeX0ubW9uc3Rlci1oMSxoMXtmb250LXNpemU6M3JlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46NHJlbSAwIDEuNXJlbX0ubW9uc3Rlci1oMixoMntmb250LXNpemU6Mi41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDMsaDN7Zm9udC1zaXplOjJyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMjU7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg0LGg0e2ZvbnQtc2l6ZToxLjVyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDUsaDV7Zm9udC1zaXplOjEuNHJlbTtmb250LXdlaWdodDpib2xkZXI7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNixoNntmb250LXNpemU6MS4zcmVtO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfXAraDF7bWFyZ2luLXRvcDozLjc1cmVtfXAraDJ7bWFyZ2luLXRvcDozcmVtfXAraDN7bWFyZ2luLXRvcDoyLjI1cmVtfXAraDR7bWFyZ2luLXRvcDoxLjVyZW19cCtoNXttYXJnaW4tdG9wOi43NXJlbX1kaXYraDEsZGl2K2gyLGRpditoMyxkaXYraDQsZGl2K2g1LGRpditoNixwK2g2e21hcmdpbi10b3A6MH0uZGVjb3tiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTEpIDAsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0yKSA1MCUsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0zKSAxMDAlKTstd2Via2l0LWJhY2tncm91bmQtY2xpcDp0ZXh0O2JhY2tncm91bmQtY2xpcDp0ZXh0O2JhY2tncm91bmQtc2l6ZTpjb3Zlcjtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0xKTt0ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnR9OjotbW96LXNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfTo6c2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9a2Jke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2JvcmRlci1yYWRpdXM6MTByZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7cGFkZGluZzouMjVlbSAuNmVtO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH1kZXRhaWxze21hcmdpbi1ib3R0b206MXJlbX1zdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpcXFwidG51bVxcXCI7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4xZW07cGFkZGluZzouNnJlbSAxcmVtfWRldGFpbHNbb3Blbl17cGFkZGluZzouNnJlbSAxcmVtIC43NXJlbX1kZXRhaWxzW29wZW5dIHN1bW1hcnl7bWFyZ2luLWJvdHRvbTouNXJlbTtwYWRkaW5nOjB9Lm1vbnN0ZXItbm8tdXNlci1zZWxlY3R7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfUBrZXlmcmFtZXMgZGV0YWlscy1zaG93ezAle29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtLjVlbSl9fWRldGFpbHNbb3Blbl0+Om5vdChzdW1tYXJ5KXthbmltYXRpb246ZGV0YWlscy1zaG93IC4xNXMgZWFzZS1pbi1vdXR9ZGV0YWlsc1tvcGVuXT46bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9Lm1vbm9zcGFjZXtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSl9Omhvc3QobW9uc3Rlci1idXR0b24pe2Rpc3BsYXk6ZmxleH1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXh9YnV0dG9ue21pbi13aWR0aDotbW96LW1heC1jb250ZW50O21pbi13aWR0aDptYXgtY29udGVudDt3aWR0aDoxMDAlfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBSaXBwbGVTdHlsZVNoZWV0IH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtDU1NTdHlsZVNoZWV0fVxuICovXG5jb25zdCBSaXBwbGVTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0UmlwcGxlU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciByaXBwbGUgeyBcbnNwYW4ubW9uc3Rlci1meC1yaXBwbGV7YW5pbWF0aW9uOm1vbnN0ZXItZngtcmlwcGxlIC42cyBsaW5lYXI7YmFja2dyb3VuZC1jb2xvcjpoc2xhKDAsMCUsMTAwJSwuNyk7Ym9yZGVyLXJhZGl1czo1MCU7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnNjYWxlKDApfUBrZXlmcmFtZXMgbW9uc3Rlci1meC1yaXBwbGV7dG97b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSg0KX19IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHtcblx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0QVRUUklCVVRFX1JPTEUsXG59IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udHJvbCB9IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tY29udHJvbC5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9CVVRUT05fQ0xBU1MgfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBCdXR0b25TdHlsZVNoZWV0IH0gZnJvbSBcIi4vc3R5bGVzaGVldC9idXR0b24ubWpzXCI7XG5pbXBvcnQgeyBSaXBwbGVTdHlsZVNoZWV0IH0gZnJvbSBcIi4uL3N0eWxlc2hlZXQvcmlwcGxlLm1qc1wiO1xuaW1wb3J0IHsgZmlyZUN1c3RvbUV2ZW50IH0gZnJvbSBcIi4uLy4uL2RvbS9ldmVudHMubWpzXCI7XG5pbXBvcnQge2FkZEVycm9yQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vZG9tL2Vycm9yLm1qc1wiO1xuXG5leHBvcnQgeyBCdXR0b24gfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1dHRvbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJidXR0b25FbGVtZW50XCIpO1xuXG4vKipcbiAqIEEgYnV0dG9uXG4gKlxuICogQGZyYWdtZW50cyAvZnJhZ21lbnRzL2NvbXBvbmVudHMvZm9ybS9idXR0b24vXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9idXR0b24tc2ltcGxlIFNpbXBsZSBCdXR0b25cbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2Zvcm0vYnV0dG9uLXdpdGgtY2xpY2stZXZlbnQgQnV0dG9uIHdpdGggZXZlbnRcbiAqXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBiZWF1dGlmdWwgYnV0dG9uIHRoYXQgY2FuIG1ha2UgeW91ciBsaWZlIGVhc2llciBhbmQgYWxzbyBsb29rcyBnb29kLlxuICogQGZpcmVzIG1vbnN0ZXItYnV0dG9uLWNsaWNrZWQgdGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuIEl0IGNvbnRhaW5zIHRoZSBmaWVsZCB7YnV0dG9ufSB3aXRoIHRoZSBidXR0b24gaW5zdGFuY2UuXG4gKi9cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEN1c3RvbUNvbnRyb2wge1xuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSA8Y29kZT5pbnN0YW5jZW9mPC9jb2RlPiBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvY29tcG9uZW50cy9mb3JtL2J1dHRvbkBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7QnV0dG9ufVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblx0XHRpbml0Q29udHJvbFJlZmVyZW5jZXMuY2FsbCh0aGlzKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIDxjb2RlPkJ1dHRvbi5jbGljaygpPC9jb2RlPiBtZXRob2Qgc2ltdWxhdGVzIGEgY2xpY2sgb24gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy4yNy4wXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9jbGlja31cblx0ICovXG5cdGNsaWNrKCkge1xuXHRcdGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXSAmJlxuXHRcdFx0aXNGdW5jdGlvbih0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdLmNsaWNrKVxuXHRcdCkge1xuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5jbGljaygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQnV0dG9uLmZvY3VzKCkgbWV0aG9kIHNldHMgZm9jdXMgb24gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy4yNy4wXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1c31cblx0ICovXG5cdGZvY3VzKG9wdGlvbnMpIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJkaXNhYmxlZFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0gJiZcblx0XHRcdGlzRnVuY3Rpb24odGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5mb2N1cylcblx0XHQpIHtcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uZm9jdXMob3B0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCdXR0b24uYmx1cigpIG1ldGhvZCByZW1vdmVzIGZvY3VzIGZyb20gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKi9cblx0Ymx1cigpIHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdICYmXG5cdFx0XHRpc0Z1bmN0aW9uKHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYmx1cilcblx0XHQpIHtcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYmx1cigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIG1vbml0b3JlZCBieSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKClgLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmdbXX1cblx0ICovXG5cdHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXM7XG5cdFx0YXR0cmlidXRlcy5wdXNoKEFUVFJJQlVURV9CVVRUT05fQ0xBU1MpO1xuXHRcdHJldHVybiBhdHRyaWJ1dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9hdHRhY2hJbnRlcm5hbHN9XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IGZvcm1Bc3NvY2lhdGVkKCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBidXR0b24uXG5cdCAqXG5cdCAqIGBgYGphdmFzY3JpcHRcblx0ICogZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21vbnN0ZXItYnV0dG9uJyk7XG5cdCAqIGNvbnNvbGUubG9nKGUudmFsdWUpXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uXG5cdCAqL1xuXHRnZXQgdmFsdWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVcIik7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uLlxuXHQgKlxuXHQgKiBgYGBqYXZhc2NyaXB0XG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLWJ1dHRvbicpO1xuXHQgKiBlLnZhbHVlPTFcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuXHQgKi9cblx0c2V0IHZhbHVlKHZhbHVlKSB7XG5cdFx0dGhpcy5zZXRPcHRpb24oXCJ2YWx1ZVwiLCB2YWx1ZSk7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXM/LnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgVGVtcGxhdGUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIE1haW4gdGVtcGxhdGVcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGxhYmVscyBMYWJlbHNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5idXR0b249XCI8c2xvdD48L3Nsb3Q+XCIgQnV0dG9uIGxhYmVsXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhY3Rpb25zIENhbGxiYWNrc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9ucy5jbGljaz1cInRocm93IEVycm9yXCIgQ2FsbGJhY2sgd2hlbiBjbGlja2VkXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzc2VzIENTUyBjbGFzc2VzXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc2VzLmJ1dHRvbj1cIm1vbnN0ZXItYnV0dG9uLXByaW1hcnlcIiBDU1MgY2xhc3MgZm9yIHRoZSBidXR0b25cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlZD1mYWxzZSBEaXNhYmxlZCBzdGF0ZVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZWZmZWN0cyBFZmZlY3RzXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWZmZWN0cy5yaXBwbGU9dHJ1ZSBSaXBwbGUgZWZmZWN0XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlPVwiYnV0dG9uXCIgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGJ1dHRvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogc3VibWl0LCByZXNldCwgYnV0dG9uXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0XHRsYWJlbHM6IHtcblx0XHRcdFx0YnV0dG9uOiBcIjxzbG90Pjwvc2xvdD5cIixcblx0XHRcdH0sXG5cdFx0XHRjbGFzc2VzOiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJtb25zdGVyLWJ1dHRvbi1wcmltYXJ5XCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZhbHNlLFxuXHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRjbGljazogKCkgPT4ge30sXG5cdFx0XHR9LFxuXHRcdFx0ZWZmZWN0czoge1xuXHRcdFx0XHRyaXBwbGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0dmFsdWU6IG51bGwsXG5cdFx0XHR0eXBlOiBcImJ1dHRvblwiLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1idXR0b25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0W119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRyZXR1cm4gW1JpcHBsZVN0eWxlU2hlZXQsIEJ1dHRvblN0eWxlU2hlZXRdO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2luaXRFdmVudEhhbmRsZXJ9XG4gKi9cbmZ1bmN0aW9uIGluaXRFdmVudEhhbmRsZXIoKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRjb25zdCBidXR0b24gPSB0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdO1xuXG5cdGNvbnN0IHR5cGUgPSBcImNsaWNrXCI7XG5cblx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSBzZWxmLmdldE9wdGlvbihcImFjdGlvbnMuY2xpY2tcIik7XG5cblx0XHRmaXJlQ3VzdG9tRXZlbnQoc2VsZiwgXCJtb25zdGVyLWJ1dHRvbi1jbGlja2VkXCIsIHtcblx0XHRcdGJ1dHRvbjogc2VsZixcblx0XHR9KTtcblxuXHRcdGlmICghaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBlbGVtZW50ID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoXG5cdFx0XHRldmVudCxcblx0XHRcdEFUVFJJQlVURV9ST0xFLFxuXHRcdFx0XCJjb250cm9sXCIsXG5cdFx0KTtcblxuXHRcdGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHNlbGYuaGFzTm9kZShlbGVtZW50KSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjYWxsYmFjay5jYWxsKHNlbGYsIGV2ZW50KTtcblx0fSk7XG5cblx0aWYgKHNlbGYuZ2V0T3B0aW9uKFwiZWZmZWN0cy5yaXBwbGVcIikpIHtcblx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNyZWF0ZVJpcHBsZS5iaW5kKHNlbGYpKTtcblx0fVxuXG5cdC8vIGRhdGEtbW9uc3Rlci1vcHRpb25zXG5cdHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW0FUVFJJQlVURV9CVVRUT05fQ0xBU1NdID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0c2VsZi5zZXRPcHRpb24oXCJjbGFzc2VzLmJ1dHRvblwiLCB2YWx1ZSk7XG5cdH07XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHR0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1idXR0b25dYCxcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiZGlzYWJsZWQgcGF0aDpkaXNhYmxlZCB8IGlmOnRydWUsIGNsYXNzIHBhdGg6Y2xhc3Nlcy5idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgcGF0aDp0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBwYXJ0PVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmxhYmVscy5idXR0b25cIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmlwcGxlKGV2ZW50KSB7XG5cdGNvbnN0IGJ1dHRvbiA9IHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF07XG5cblx0Y29uc3QgY2lyY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdGNvbnN0IGRpYW1ldGVyID0gTWF0aC5tYXgoYnV0dG9uLmNsaWVudFdpZHRoLCBidXR0b24uY2xpZW50SGVpZ2h0KTtcblx0Y29uc3QgcmFkaXVzID0gZGlhbWV0ZXIgLyAyO1xuXG5cdGNpcmNsZS5zdHlsZS53aWR0aCA9IGNpcmNsZS5zdHlsZS5oZWlnaHQgPSBgJHtkaWFtZXRlcn1weGA7XG5cdGNpcmNsZS5zdHlsZS5sZWZ0ID0gYCR7ZXZlbnQuY2xpZW50WCAtIGJ1dHRvbi5vZmZzZXRMZWZ0IC0gcmFkaXVzfXB4YDtcblx0Y2lyY2xlLnN0eWxlLnRvcCA9IGAke2V2ZW50LmNsaWVudFkgLSBidXR0b24ub2Zmc2V0VG9wIC0gcmFkaXVzfXB4YDtcblx0Y2lyY2xlLmNsYXNzTGlzdC5hZGQoXCJtb25zdGVyLWZ4LXJpcHBsZVwiKTtcblxuXHRjb25zdCByaXBwbGVzID0gYnV0dG9uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJtb25zdGVyLWZ4LXJpcHBsZVwiKTtcblx0Zm9yIChjb25zdCByaXBwbGUgb2YgcmlwcGxlcykge1xuXHRcdHJpcHBsZS5yZW1vdmUoKTtcblx0fVxuXG5cdGJ1dHRvbi5hcHBlbmRDaGlsZChjaXJjbGUpO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoQnV0dG9uKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBTdGF0ZUJ1dHRvblN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFN0YXRlQnV0dG9uU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdFN0YXRlQnV0dG9uU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBzdGF0ZWJ1dHRvbiB7IFxuW2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOm5vbmU7d2lkdGg6MTAwJX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0uZmxleHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd306aG9zdHtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9ja30ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMywubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLTB7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDowfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0yLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMywubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0yLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0zLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWdyYXktMTojZjZmNmY2Oy0tbW9uc3Rlci1jb2xvci1ncmF5LTI6I2UyZTJlMjstLW1vbnN0ZXItY29sb3ItZ3JheS0zOiM4YjhiOGI7LS1tb25zdGVyLWNvbG9yLWdyYXktNDojNmY2ZjZmOy0tbW9uc3Rlci1jb2xvci1ncmF5LTU6IzNlM2UzZTstLW1vbnN0ZXItY29sb3ItZ3JheS02OiMyMjI7LS1tb25zdGVyLWNvbG9yLXJvc2UtMTojZmZmN2Y5Oy0tbW9uc3Rlci1jb2xvci1yb3NlLTI6I2ZmZGNlNTstLW1vbnN0ZXItY29sb3Itcm9zZS0zOiNmZjNiOGQ7LS1tb25zdGVyLWNvbG9yLXJvc2UtNDojZGIwMDcyOy0tbW9uc3Rlci1jb2xvci1yb3NlLTU6IzgwMDA0MDstLW1vbnN0ZXItY29sb3Itcm9zZS02OiM0YzAwMjM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0xOiNmZmY4Zjg7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0yOiNmZmRkZGY7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0zOiNmZjQyNmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS00OiNkZTAwNTE7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS01OiM4MjAwMmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS02OiM1MTAwMTg7LS1tb25zdGVyLWNvbG9yLXJlZC0xOiNmZmY4ZjY7LS1tb25zdGVyLWNvbG9yLXJlZC0yOiNmZmRkZDg7LS1tb25zdGVyLWNvbG9yLXJlZC0zOiNmZjQ2NDc7LS1tb25zdGVyLWNvbG9yLXJlZC00OiNlMDAwMmI7LS1tb25zdGVyLWNvbG9yLXJlZC01OiM4MzAwMTQ7LS1tb25zdGVyLWNvbG9yLXJlZC02OiM1MzAwMDM7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xOiNmZmY4ZjU7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0yOiNmZmRlZDE7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zOiNmZDRkMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS00OiNjZDNjMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS01OiM3NTIxMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS02OiM0MDE2MDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTE6I2ZmZjhmMzstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tMjojZmZkZmM2Oy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0zOiNkNTczMDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTQ6I2FjNWMwMDstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tNTojNjMzMzAwOy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi02OiMzNzFkMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTE6I2ZmZjhlZjstLW1vbnN0ZXItY29sb3ItYW1iZXItMjojZmZlMGIyOy0tbW9uc3Rlci1jb2xvci1hbWJlci0zOiNiOTgzMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTQ6IzkyNjcwMDstLW1vbnN0ZXItY29sb3ItYW1iZXItNTojNTIzODAwOy0tbW9uc3Rlci1jb2xvci1hbWJlci02OiMzMDIxMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0xOiNmZmY5ZTU7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0yOiNmZmU1M2U7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0zOiM5YzhiMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy00OiM3ZDZmMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy01OiM0NjNkMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy02OiMyOTIzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtMTojZjdmZmFjOy0tbW9uc3Rlci1jb2xvci1saW1lLTI6I2Q1ZjIwMDstLW1vbnN0ZXItY29sb3ItbGltZS0zOiM4MTkzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtNDojNjc3NjAwOy0tbW9uc3Rlci1jb2xvci1saW1lLTU6IzM5NDEwMDstLW1vbnN0ZXItY29sb3ItbGltZS02OiMyMjI2MDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtMTojZTVmZmMzOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTI6Izk4ZmIwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS0zOiM1YzliMDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtNDojNDk3YzAwOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTU6IzI2NDUwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS02OiMxODI2MDA7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTE6I2UwZmZkOTstLW1vbnN0ZXItY29sb3ItZ3JlZW4tMjojNzJmZjZjOy0tbW9uc3Rlci1jb2xvci1ncmVlbi0zOiMwMGEyMWY7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTQ6IzAwODIxNzstLW1vbnN0ZXItY29sb3ItZ3JlZW4tNTojMDA0OTA4Oy0tbW9uc3Rlci1jb2xvci1ncmVlbi02OiMwNjI4MDA7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtMTojZGNmZmU2Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTI6IzVkZmZhMjstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC0zOiMwMGEwNWE7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtNDojMDA4MTQ3Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTU6IzAwNDgyNTstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC02OiMwMDI4MTI7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtMTojZGFmZmVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTI6IzQyZmZjNjstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS0zOiMwMDlmNzg7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtNDojMDA3ZjVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTU6IzAwNDczNDstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS02OiMwMDI4MWI7LS1tb25zdGVyLWNvbG9yLXRlYWwtMTojZDdmZmY3Oy0tbW9uc3Rlci1jb2xvci10ZWFsLTI6IzAwZmZlNDstLW1vbnN0ZXItY29sb3ItdGVhbC0zOiMwMDllOGM7LS1tb25zdGVyLWNvbG9yLXRlYWwtNDojMDA3YzZlOy0tbW9uc3Rlci1jb2xvci10ZWFsLTU6IzAwNDQzYzstLW1vbnN0ZXItY29sb3ItdGVhbC02OiMwMDI3MjI7LS1tb25zdGVyLWNvbG9yLWN5YW4tMTojYzRmZmZlOy0tbW9uc3Rlci1jb2xvci1jeWFuLTI6IzAwZmFmYjstLW1vbnN0ZXItY29sb3ItY3lhbi0zOiMwMDk5OWE7LS1tb25zdGVyLWNvbG9yLWN5YW4tNDojMDA3YTdiOy0tbW9uc3Rlci1jb2xvci1jeWFuLTU6IzAwNDM0NDstLW1vbnN0ZXItY29sb3ItY3lhbi02OiMwMDI1MjU7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0xOiNkYWZhZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0yOiM4ZGYwZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0zOiMwMDk4YTk7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci00OiMwMDc5ODc7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci01OiMwMDQwNDg7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci02OiMwMDIyMjc7LS1tb25zdGVyLWNvbG9yLXNreS0xOiNlM2Y3ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0yOiNhZWU5ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0zOiMwMDk0YjQ7LS1tb25zdGVyLWNvbG9yLXNreS00OiMwMDc1OTA7LS1tb25zdGVyLWNvbG9yLXNreS01OiMwMDQwNGY7LS1tb25zdGVyLWNvbG9yLXNreS02OiMwMDFmMjg7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTE6I2U4ZjZmZjstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tMjojYjllM2ZmOy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi0zOiMwMDkyYzU7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTQ6IzAwNzQ5ZDstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tNTojMDAzYzU0Oy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi02OiMwMDFkMmE7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTE6I2U4ZjJmZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtMjojYzZlMGZmOy0tbW9uc3Rlci1jb2xvci1henVyZS0zOiMwMDhmZGI7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTQ6IzAwNzFhZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtNTojMDAzYjVlOy0tbW9uc3Rlci1jb2xvci1henVyZS02OiMwMDFjMzA7LS1tb25zdGVyLWNvbG9yLWJsdWUtMTojZjBmNGZmOy0tbW9uc3Rlci1jb2xvci1ibHVlLTI6I2Q0ZTBmZjstLW1vbnN0ZXItY29sb3ItYmx1ZS0zOiMwMDg5ZmM7LS1tb25zdGVyLWNvbG9yLWJsdWUtNDojMDA2ZGNhOy0tbW9uc3Rlci1jb2xvci1ibHVlLTU6IzAwMzg2ZDstLW1vbnN0ZXItY29sb3ItYmx1ZS02OiMwMDFhMzk7LS1tb25zdGVyLWNvbG9yLWluZGlnby0xOiNmM2YzZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0yOiNkZWRkZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0zOiM2NTdlZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby00OiMwMDYxZmM7LS1tb25zdGVyLWNvbG9yLWluZGlnby01OiMwMDMyOGE7LS1tb25zdGVyLWNvbG9yLWluZGlnby02OiMwMDE2NDk7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0xOiNmN2YxZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0yOiNlOGRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0zOiM5YjcwZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC00OiM3OTRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC01OiMyZDBmYmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC02OiMwYjAwNzQ7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0xOiNmZGY0ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0yOiNmN2Q5ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0zOiNkMTUwZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS00OiNiMDFmZTM7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS01OiM2NjAwODc7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS02OiMzYTAwNGY7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMTojZmZmM2ZjOy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTI6I2ZmZDdmNjstLW1vbnN0ZXItY29sb3ItbWFnZW50YS0zOiNmOTExZTA7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNDojY2EwMGI2Oy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTU6Izc0MDA2ODstLW1vbnN0ZXItY29sb3ItbWFnZW50YS02OiM0NDAwM2M7LS1tb25zdGVyLWNvbG9yLXBpbmstMTojZmZmN2ZiOy0tbW9uc3Rlci1jb2xvci1waW5rLTI6I2ZmZGNlYzstLW1vbnN0ZXItY29sb3ItcGluay0zOiNmZjJmYjI7LS1tb25zdGVyLWNvbG9yLXBpbmstNDojZDIwMDhmOy0tbW9uc3Rlci1jb2xvci1waW5rLTU6Izc5MDA1MTstLW1vbnN0ZXItY29sb3ItcGluay02OiM0YjAwMzA7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0xOiNlNWI4NzU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0yOiNkOWEzNjI7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0zOiNjMDhhNGU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS00OiNhNzcxM2I7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS01OiM4ZjVhMjg7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS02OiMzNjA1MDU7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTE6I2Y3ZjVlZjstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtMjojZTVlMmQ5Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC0zOiNjYmM2YjM7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTQ6I2ExOWQ4YTstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNTojN2E3NTY2Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02OiM1MTRkM2Z9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6c3dhcDtmb250LWZhbWlseTpSYWxld2F5O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFGSjRBQklBQUFBQXQzQUFBRklRQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0U4Rys0NkhJVThCbUEvVTFSQlZFUUFoUWdJZ1FvSm54UVJDQXFCdWd5Qm1uQUxoQ0lBQVRZQ0pBT0lRQVFnQllVVUJ5QU1neHdiZmFRWGFKZWZtTnowWm9sM3Y2MGNQZVpNcEc0SEpTams1cUlJTmc2Q0dNZ2xaZi8vbjNGMGpPR0dEUkExclhlSW5jSklVa05IR242OXFNUkRVOFphampzOVVic210bnFuRTN2M3ZxaVFtZlJRcExrS1c2UVp3YWw2czVJVWlKTlVTVUcvT3dvRFk2QjY3NU9qU2prRFNTTXUycGVkcHU5dkpJTFVsSmQ3MDdEK2VMSHBqWURJNGUxdURuTGpISHZ4cERYR015ZHVMTG4xcXQwRkNRT3lGc0paRTEra0pxM1QrSWU3QkpGSU5PQU5iaTl2VFV6aEk3VzRHbVVMMGxXalQvRlFRaS9tKyt4dVBQMDJvbVJIZTVwbjREZ2ZOWmZuK1I5ejk3OXRtRWVOYXExUnhScUhUalRQTkEySkZFZ3JIZG8vbnQvVy81emJnR0N4aWE2RWtWaUEyRmhZR0l0Um1FMVp2VlV2cXRTdGI3TXZyZDNXNyt0MiswWGRvVG56empZYnA3bVNITEFDa2hNV2dDVEw2czBXdjBBVW9oSmZFcUUzb3BQZDU4aWtKbktsbyszdWFlU0hZSjZmY0ljWGpkK3JLVUVzYUVsVHFsVWxWUm0vTitlLzhpUDBMNUFLb3pObEozLzlpQndzaE02djVKSVVKeWtnVDNmZHJPbXE2TGNzK1orcS9Yc0FYRnhFRWlRSVVhS29zRm43Y3RUKzdCQlM1ZHFEb2xKWHVuYmw3cnR0ekQvdjM4NExmdEphZ0ZGQUxZUEU1QTdnbk1yWkJodDRsWHFzYlpLbWJkcTBUdE9tcG1nTml1Z00yUFlCYzczTXJqcTdHTHNvWEhjVHB0OXVQdkZEejhlTjNnK3N4clBRQXc2RFRGTnAvT1pJOWlpbk5pdFpoUm1wUU9Da2RvQmRBTmpWV2xhdk1pdHdETkpYL3BZSUFrVnduT1Avdlc1eHpvTXc3U0FGQUtVK1p6L2tuUC9aOWorT2Rmckw4S2UydmRLYm1waHV4SlN1TDhFVUFnZ0hJaUJIUCs0NDRFRHp2MVBUUTNZa09jT1NsVEhtajZVc2RmbzJMKy9qcFllN0lIV2NRVWdjZ2twTEZSMVlUVzhDR0tRWDliOEdGQUFBSDl0bzRSSFE2R0x2RlJyaTREaXdUekFBRERNS0RQci9mWjNWL3FkZ1Bta0d6S1RFbVdFWGI3UTN0dGdUWXFvMm5QNi8rOTdYZitGLzlKSEFWc0lJY0FDQlp3UnlrR1Q3Z0NSOFZvaEpjVU9PU0RqaVNiQXBoTW96bTJKUnB0QnRVVzY5WGJORkczSVZ5MktMb2s0OC9MZnNtNTI3SWFxQkxNdUJiT0ZJd2VGVWQwMXZlTCtZOHhXaHR6Y3FUbTJDSVRjNWVMSndTSTRmWWxMWUZJVkhBcy8vVDUzTjQvWXgxaEtHVStIU3FFcmRwUFBuczZmcXFXSnNOYlphQ2xRdGpsT0xVTXNoY2RvQTVUUXNzNEpMYzkwU3hDT01NVUs0S1A5TnNocHpwWDR2d3hLQ2hDQVNSRVJFL0xLc1dSbEp3TktBY1RuWEFoRXkzcjFLSGNaYS9ZZFg1ODQyMC9pYVhtdEdob0NBaUlpQVIyM3YvUDkrS1RBQ0FONWhka0MzeFVDNEVMc2dndmtSMmtyRWpZU0V2MEJLU21IQ2hJdllPQ0FKa0tRZ3lZTU0yUW9VTXpDbzE2Qko4NXFBV0NDZEhlazNBQjBPREwxTHEwUGdUZTNoU3cyZmhpNFhoUHVldVFXRUg2eHRJRVFBYkcyTm01b1Y1NFFGUCt5S2dPMkQ0VDV0L3d6MlhXOTIvcnBxcExUU0lQOHFWOXZMdk9kczBOTFd5WDUxSzZvZmJ2UFpFMXBhZjd3MzE4QzladGhxN2YzMmJmdUw2NFZaSHc1MTRZc201bGdmTmJmRzdXOWxzVUE0RUd6NzIzdnh3R3pwNGZSUittUDhMczVCN0tCMmVESlhjNnh3bEc2OTAydWc3QXpMQThOWTIxQjJkQi9QNXFmT1Y4dDFvbnlMNWpaRERmUUk1Umc4RDk4RnZIc3ZjbEh1SnNyZHZzSnJwYy9Uci9ndS9FZlpKelhVenBXYURqN003K1VQOC84RWtBQVZhQVMvQ1IrWHMvSk40WWFJY08xeEhaY1VhTU1ia2xycEt5N05mUUpLUWNVUmFnb0dtQ1crSEE2RU52YmczM3NsMnBJWVJtRTliSUhiMG1BNmtrNmxONUdkeU1ONUVibVFoeEhLbHdNZ1Q1OGNndzdwZFVSejduZk1jUWZjVTN2SWN6VmtkcmhYOFhIcTQwMTJ0Rk9kN2tUL2E3cDdtODNXQTcxRjdhTzlNK2RqdmRkNmo3ZnhtK0QxUHUzejN1aXJ2bXV5emE1M3RydjkzbFRiODJSVDJLYUZWVUtNTlAzNkJ2UU1DbzBHc0Vka0w4cyt6TGcxRXhiTTBOZ0NXQXhnemY4MkRHMUtYTWZjNHJqTmNRZkhLeFNDdVJ1Qkk1QW9kREREa0dkVjhDblZWRW1FTWFpbjRTYTBBWFRJMFJCTnBPWUFMVnExYVY5dnhKaVV6SEtXQ2lzNm1wMEJ1a3gwNjlHcjc0c25WTmJzb0Nta1ZNb3A1K3BER2FXejJzTERyMmlOdCtvWk8wYjM2WVNJaldjeHZubE4weDBWaGxZb1c0VVJqWFhLeUxHM1kzcW9MZEVhekhBRUVvVnVNbDNERGVFUlZwRy9qZVRFUjBDVVpFVTFtb3RxRm9pd0pGS1VhREZpYWNTbEJKckVqU1FLSi9DU0ZTbVNLazE2MVFsa2RLZXlTWFl6c2RYS2k2STlpa05KTXRDVUtsT3VRcVVxMVZIVDF6cTYrbHpmUU5BSWE1SnBSb3ZXYUVQN1p4dU5tVGpNTEJZdXEzWFVUZ05kUkRkNlVxOUEzM2NieEF6eERET04wSXhhTlZheGQvL3MvYWp4QUU2Sm5QYkZHWmt1QzN1YU5VOEVzRFNMWlZteE9qMVBkOEhReFhTcGVka1hhd2JXNndabzgrNkRyaXVRRkZ3NUlwdm5KaDYvWmdGSks5MzBhRU0yWEozeUpCMERIb3BoYnFnMHVya3ZNSWdZbHRiR1JQY2RrZDdWai9OVjRwYkFiYSsvRTRCakNnOXA1WmVyaS9wZE0wQ0cvN3RYWk54VkUrNmJZYXZRbjZ1bVd3eTNGWGY2Z2crWG5BdEhEZ2prUE5pVWJxcG93dkRVdmJSbGNqNVhaSFl6VjhKaTRObDF2anNPaHJNYXhPSHhlRHdlanovVklISlhuNkgwd2hnNnFGT0VVcVFvMFdMRTBvaExDVEtKMHlRNUxVOXlSUXBTcFVsZlpuQVNCa1dwbENsWG9WS1Y2cWliVEJ0TW1RS1lZV0hWVVVmdEdJdDYybGRuTUgzRXBpVTBxVlFxSGJDTHhPVStFNC8xWExmQkVoektoZ1VjZ1VTaGZ4d21EejlHNUVSQUFITDdGSFJLUXlybnd1eFFmNXJoSEJFQlJJb1NMVVlzelViYzRydE1kcGwyNkZnZDU1dGdRRzh4L2ZBWjJKekl2R2JtbHJjWEFtM3dYS2E3RWxmUGNTMnR4ZnErZWdmaUhHb0RNeHlCUktIdnkzU0ozMFE2VjgrNm1kZlpzYUZWM2VPVUtzV015bmtoeUwxdTRWSTBMMVNKTEl4WHlZenBMeU5xaVd6MFhUcGthVHluMVpEdGk5MG1ZMDJ2MHRVcXR6U0NsK3FySzdySXV2MXY5UkQwc2d4cUdiSm9HR2ZFa2xFMVl6cjI4TzFsMktld1g5TjRBRGFOMWI3TDBJYVJUWE91eTl5aXU4MnBPd0hRQkMrcGxkQ3JPbUswTWcvcjF2UllFbTNEQkVjZ1VlZ21VeDAzRzQrd2l0UWdPZkVSRUNWWlVZM200dG1FSXZ3VUtVcTBHTEUwNGxJQ1R1STB5VHF0RmNsRUNsS2xTYTg2V0VaM0pKdnNGV2k3SXhLSk9Cd09oOFBoY0VUclJOM3REcGxNSnBOaFJJYWlxQWlHWVJnbWNia3N5NE5vei9yb2ZRTDdLY2FsTkQwRk9XM1JHWnVPQlIyeG1WTXhrVWdrRGwwWDd1Sml1dFM4Yk5HYUUrdi9aUU93cWU4NkdJSWVFc0N1b3ZXWWZDcTJ0dnBNT0JON016TzY4R1dYTGh0bWdXMmZmZUhwMU11N3F3WDVORHdUa3BDU2NlZkJreGR2ZmluQVJJUklVYUxGaUtVUmx4SUFpWkUwclZxNjVJb1VTWlVtdmVxVU1ycHMvejFaV0VaNVlCZ0dBQUFBQUFDQTBXWnNkMUNwK0h3K24yL2NPbGs0ckRwU2wxSzNIcjM2amcxQ1R0d3pPY051Q1hZTmdpRFlob3RIMW9nT0xSU3V4OG5pbDRyMmlZYXYwbm9yelh2WjJuWmpaTGZhS0QrVlJnSC9mZ05tcGtGYmhnaUdpVWFjR2ZYTm1LNDlGUHZZOXR2YmNUbTc1KzNmZGFtVzZZU3R3a2R6YUNIWmN2cTBDUzRpVTVabU54TFhHQmUvclFvSGpNUDEvUUVHVk1aRkpnYkRESi81VDNleUJjdkdQU3FUaW1KY0MrWVFVanFHdjJuQzdxM25CMERPcXYyRzNWdmxJaEtJVzhNUlNCUzZ5WlRpTkdGWCtSR0NESHM4UFlJZFRqZEFVQXl2UWt3U0NwcGhOZDIwbXB1TWpRWEtCUWtXSWpRcG1KUlVLWXhLWGNMRGM2a0lmSGFUS2FPTVNjNE1zVlJZUTBlelU2RkxwVnVQM3RMSHV3cHJZZnRoaXdpSEZBV2tTcG1XUnQrNm5KNlUxOEN1eUo4NWoyeDBiMGQ3TjlwaWJxMGxiNE5uVStwTzd0RVVMaWhkVU8yaHJwdGdZWENzeEJGQTNsUTJubUZjM0ZiUmpHQmdDZDZCVUg3cW5YQmJhY2pzSzk5UmZJRE1BRmtCc29PK25aZzhQMEJCZ01JQXRRRWFuOVdRRXM5TUFITkc4NTU0d2ErQXJucXZUVGpwR1M3ZS9pbFBtakFSUG1uc3hXa2RBQVJ5T0w5eUFoeW14N1NHS2xrN0doNDh2RHZOZmRnK0lUQlpwRDlnemdNSUJ3d0JrNXRta0VYSXFxTU1hRVRnL0hVZTI2b0xUVHA0dzRnOVVrWjViZ2J4RUh0Q3lUTFlQSG1KVXEzdUpwcXp2U05jdW1iQmRYWVFza3UxQzkyTjhqVHZERkVVMHJ2ODE3Z21xc0dqUGZSdU5qdmVyVERtSENFNHErcWJ6T2p1SUl2UmFEaHpaMS9WSlVwaGhpT1FLSFF3c1o1VGpndUFCOEN1S3IrWUlNS2V3SW9NTzV4eDllNEFFQlREU1lwbTJPVHk4b0lveVlvYWplalVRYjhKd0QvWEI1aVNzd1VpZ2hBc1JHaFMwQ2d6SnpYTUNUVTFYRVpIYVRBWFRDUVNpY1hiWTRWQ29SZ0xFeHN0bGRDdHhaMWFVbmx1dEdodE9RdDE4L1JVZFZwa0RCdmJTNG5Fb05Gb05CcU5GaWRYbjBXSkxKQ3JVOENVYnFxTWhaR3BtK0Y4RWJCSVVhTEZpS1VSbHhLRUVpVlZMVk55UmdwU3BVbXZ1Z0FaaEFHbHlwU3JVS2xLdGJwbUE2d3JRTGNldmZxYUU3RFRXczZZSG0wRTJkY2xpV1dzV0Uzbm1TN0c1YjZ1R1ZuUG5OdXl5V2JId3hEanBXazZNK2oyMGVZTUxRLzAzVk1tS200Wm5nbEpTTW00OCtESml6ZS9LcmRDa1ZNbEtzeUltbWVaZjBHUXl3SkJFRnhDL3JnZ0NJSWdDSUl6OTBiREV3TVRqOGZqQVVBeGRTNlZzRGNzMWc4d2ZZQ1hyTmQ5OFNIOGdhams1dnVVUHFnNFhEUDlKbTdvR1d2R1h4U2RFTExmcnNFU0VzbVdYVGNNM2NMdEhGU0diU0hCQWpjQ2lVSVhKcUhuTWxPTFJCTGFzblVLMlN1eDF6cW5NQi9aTUdPeC96UHU4b2hEQURBQU9BQUNBQW1BQWtBRFlIZ2xDa0N1TFZBaVNJS0ZDUDBraFdOS1BGVXdiZHlMK3NEQnllZ2thSjJXRU10V3JFNi80dnBXN0c2ZTRtRHcwQmZ4WmhGdDlHdmZoUEVBbXlkNGNNdFVxc1BsNGF5N0d1YWs1dDBONTJPT3dKYUJnU05Ic2syTmg3cUVXWllWcThlK2tzeGpqM0VLU1hnOExOaWxRcUZRekUxZnY1dHZwUVFGdEZJbXlMdGl2VGVXa1FDazVaUmUyUWlKMlpyTFlEVjg2TUJZV1g1eEFQdW5rMXludFoyeDZhYk5yaVhBc2hXcmNma1U2M3kvai9tK2duek44STNZdHh6ZkNlT2lBUGk3WWgxd0JCS0Z6czcyV3JsaWZXYjNuK3NPbWtTaXpYSFRYcG12QW5PZ2VhKzdTOEYxRUhQOG5VNEluRlk0UTVtV3AzQkFMbGVzYTdCejRGdU9iRTRFWFJuaXlrOGh0Q09pazh2bGNzV1lJS3I0L2NITTNYWEljY3lPRHNCWEg5UjNOSUJqVXNkMWZpZGowaWluSDVyaVpmVU9EVGlGUXVsemVheDcrakhaVnl4ZjM4VTN4TGRyK1U3dTQzSDU5S2VnSzk1SnZ3dnlxbjNJZ3hMeVVHMlk0UWdrQ3YxQlREK0l2Q01QTWcwbFZZUkJuU0lRa2FKRWl4RkxJeTRsQ0NUMmhtMHNFQWdFSlREcnFiNGdKMkpZb3pTVUtWZWhVcFhxYk5yWitaaGVqYis1ckhyR3pjY0xRaEpTTXU0OGVQTGl6YS9LelFuTUNFS3dFS0ZKWVlHeU55SzFsdEpVL0o2V21GeFVxTHNJblhTczM0czRBSm5UTlA5SlY4MVpXMDhid294d2pNb0dnKzFnUFB4d0FNZVprQkVFK1ZzdXBzeG85Y1dTNWl2bmFTVXBGSlExVEVidGV5S2pNQUxsU1FoNlJLM2dDQ1FLM2VRVTRqYkVDN3VxL0F5Q0RIdUNCUVRzY01iVnV3TVVCQlREUTl5UUZNMnd5Um55RVN4S3NxSkdVM1JpRURQWEw5RFo1RjRJcEF1U1lDRkNrOElHWlZNRkNkT2tMdUUxSUtWRmxHZ3hZbW5FTmVOQkNWU0prbkpFaitTTUZFbVZKcjNxbURLSXpHbGtTYmJkOUhMazFmeCszZStWQ3BtS29oZ2x5VUJWcWt5NUNwV3FWS2NhVUczVWxmcG9rTWJheE5Bc0xWcTFhVTlHSWxPZnZKbE1wcGpKWkRKYlJqdGFOV2svcnpXb01JSWFOV2VzYXV0MDN5TU8yUHhJSTZNQkU5MXFmb0R5eENTd2dDT1FLSFNUNlFWdURoNWhGWGxwdHJnTWp5QktzcUlhTDE3R2Nka0E1OEE4Z0NZLzMyUExid2tuQ1FCQU5tdEN3Nk5vQnJWSXF6YnRPVXNXVTQwNWxDd1oxdER4NXAxbzdURWRKQmdTR0w3NzdCRWpvOTRhbzlvanRLOWJ2NS9oQU04UmE0NlNqZ21kZUx6TkRNaGlVSG51N1FtRERCWitJVUZpVGNKb0hjbElrU3BOK21aR2NUY0g1SWNCcGNxVVIwV29WS1U2NnFaM3VzZWdGM21uK2JGbHJpcTlCbW1uVjdQYjdHMFJ0Q2FzT3dLUVpFZ2g0ODZESnkvZS9KNkpyejJydnoxMThQazhQcC9QNXkvOU5QSmlyOWdKd3lsS3JVeTVDcFdxVkVmZFZGTnRocldnVlp2MlpJU1llcmVCb0pkSEtlYWVnMEo3VUJlcVI4U08xYW4zcEZBTUtMd0l0VlNKKytGbW5pSEVzRkVRVytwZWtvTTVIcWY1MGx4QkxMdjl6Q01BWlRQUTE3bjlYNWtIRlg3YzZRMkp2YitLU0lzU0xVWXNqYmhtdkpFRVd4TEhKRFhNU0s1SWtWUnAwcXVPSUtPTHpHbGtTYmJkOUhMa3lWZWdNQlc1VUt3a0dXd3BWYVpjaFVwVnFxT21qOXA1cWxOVDMvLzF4c2lBUkNLUlNBQkFCUURBZ0VBZ0VGNGtjSFBBNHkvZjJtN1lHbzVBb3RDVlNTSWFUZVZHRkFBbHgxUklaUnZHYzVqMEpJZW9jeHp6cEt0Y2F5Y3hJMWhTeVYrNjEvR0N3dXpBTWZRTXc2TFRLZDhvc0ZBY3JOVkRQSWVGczZMSEZ4bE55dGllRGpiOEdPUVFiaFNJdGowMmdJZzhPVmJVZmdGL0d0a2FDc01NUnlCUjZENTVtY1BqTGJZa0k4SjB3SndYZi9NMW5vOWRqVFZkV2hwaUQ0TWprQ2owR1lZNmtZMU41UTRFS2dVaFdJalFwTkNqYktvU0NOT2lYb1piVkY5L3pzTGRHWUdnVmJNendKd3o4K21xVTJzalkxQnJjamwzZkcvc2Z6NnE3b2cyWTM0dmZwZFVoZS9DWjJISDh5QUEveFE4RDNteUFJRE5BVnNDQUpiWm54aTJjSDVzMmNSSndWYU9tMldXc3RQR1p4WVpBMUtJUjdtdDNBekFtdGtGVUk1aWxEY0FtMlF3b2pGWEI2cjNJc0J5VnE1bCt0TmFiY3RyRitRckFRK2xraVVXemlIR0tXYzV1MUZVZE1LTWhueGl4bkFVNGxrYUFuby9uaHVTY0VuSHJRNlFFZG9SMkZJUTRHRm5ZSGtmQmdKVHdObDQyclFIN2RWNklCS3g0R0RJUFRTUEF0WUhjdWEvVXplUDFlcFpKTmF0T0FTcUZFUWtZQ1dTaktvbWN2SjRRL2xZbVI2YldpRVdXVklGQU5hSVRPVncyWlZIenI1TXpDLzBpL0Qxa3dFV1ZEL3pUOWI2REc2MzJpSzRVcUM3VFAyVU5ibmtFWTg2NFhZaUtsVytCUzNGVUt4SERRWW8rOEI5eXoxdzRoMDdCYTRRa2t6TDBMR0pHSXJyWitjTlh1QjNQdzZjZWRwQU1VNkd6UlFxRFc3bnRCK2NXaXNGeW8zV0NtUWpMME1tWG9CcU5XUkZJWkk3Z0RYaHRTY3Q4THBCZmtIc1JRNlhwVmZJUnZaQlU4cDg1RjRoSDhFS254bUVZbXUrSzZjWVkzZ1FlMSsvVHpKQUlSRjFjS3ZObW4yUTBNOGFPV3NYalQ5anZCQ3I1MjF4cXRXVkk2YXBMcGVoS2N4WnVXOUJXTEozUUdxZjlKVGl1dnZVMHdkZ2h3LzhJQlJJWDFWdU5ReXNCcVN0Vk5QWFpEdEwrTml2Y3dpMVBnRC81TzBveW0ySis3OG9uMHJ4Z0E5T0NsYTBnTjBKRVBIWS9ZUDRuaElhd2JFSjJIbFVuUjlEYnpmV01QQXZ4a3J0QTE0eDZqckFtWVVjZ1JmUmxabm5ZeHMyeStvd0xEd2tTMlZrM2RmakFBVVZJSmV3RDA2dHorQXV3NnBJcXhUbDRkbWpvR2xZUVhETWIzMUZKUHMrNjdqOVJOZ3NIWWd3d09jWXR1Zks2VmhDTE11YzRORlRidjlwRVFqRk5qTnIwTFdBSkIzWEdIbTR4N25CUmZYbUhRaFEwYnpxbU90VlRueWVTNngxSGJDL2Fyai9YZS83cU1PbDdNMGVVbkRQZ2h5aXNGOHFJb0ZiaGZFZ3F5RDRvM28ySzVSTHJNSllDYUM1Z3JId3VwRE5zVm9YRkkzKzlXWVBhMWx3dk9wOTFmdmFuR2hvbUppcDk3dXBOSG1PSCt5YjEraExJcGRkcjIxUmlBMTNKaWI3OWs2cFRCM2RGQW83MTRwUTF5UlpiVFhNeWRBN21RRTlSRkdoTC9PeHJIamRSbm8wWGRmOXlFZTBuWEZmT2VyelkrRE8zZmlCV0JGTUFtcUZiT2Vna0FxWFRWbzVmUzY2eU9JVmxMQ1NkY3A2OHVlNHlKZWxoVVB0VTZWbTJqbk5BUHF3V2FObm52MXc3SlA2eFFaYXdTSVBsT0ZNRVVHdXpQQ0JiMmRKVXlnWTZROXdyNkpVakpyNk5aY2JFWXdML2N4WmZlYzgyTE9zTUs0OXhYNjI4UDhOcTNUREVjSUFQWnd3aEx3NThoUEtrNUpTb0RCSmdpVExFU3RQQTUwbTdTcVltTlN4NkZOdjBpU2pVMDR6bVRiTllzNENxemZKZmxtQy9ZWkpnTkJ3REFhQmk4ZUJIVDVIQWs0SVFrS3VSRVIyY2VIQ2pTdFhZaEplTU42OEVmejR3Zmp6SnhFZ2dKU2NuRXlnVUF3bEpYZGgxSnlFQytjaGdnWXBUaHhLdkhoMkVpUnlsaVNKcDJUcEtEbzZXMlRJc0ZXbVRGNnk1RUR5NUVNS0ZQQldxQkJma1JJQ0JsVm8xYXBSYXRTeVU2Zk9WdlhxK1dqUXdGZVRKbjZhdGVNd01mRm4wY0ZlcDA0QnVuVFpvbHMzcEVjUHZsNjlrRDU5K0NaTjJ1YVVVNFJPTzQxcjJqU3VPZk4yV3JCQTZFMHlaTWtNNGJ3NWh3c1duQzVhY3Joa3hlbXlOWnNyTnR5dTJ2SzRac2R0elo3SE9zd0dFd3Voa1JpTTdUZzRFQzRlbkIxbmlKQVFib3VkRUJHUkhWeUlJUkxlY0Q1OElYNzg0UHo1UXdJRTJFbE9UcVFSWEhBUTE2VTRoQzdnZ0NFQWcwWUFCd29LRHJ1RWw2K0dxYkZOUExXR0F4REEyKzJtVVNOT2lCZzd0MFNrUzMxb3hlTWtqckZuMklJakp6ak1TVWhPdWtrb0VKU2lqeUdneDJJYS85WmMwM2IrbjgrZ3FrZ1MyOHM3NTZjalVwM3p3VHIrUlBlNlNlcmxVZFQ1YWV1Z2UvQUhnQno5RjRpbndFOHErSDRPdklXMzlGYmVXcnkvQnFNdnYvS1N1cGk5SGtyVmVmRzVaNElhdmZqeVd5K3A0c1ZYeWhlVlQ1bnhJcS96YnZiam9xWFgxWmUwaGowQVlGTVFaczJCa0FnRklHRnd4SFlOQjlYZGFtd3IzczcvQ0lmZ1laaWZoVDlnYTEweXd0emRaWS9oY25lVFlhL2tpejhLQ0JvcmhGWjRnMWxYQkdHV0tBNzUyRWxJZDlhTEs0U0ZOZFYzMjliRzdSSUlLVTRHRXZoanI4TFUxd2pBMjNzOUJtZ2JHalE5N29VS3dxaU92eVBaRVJJQ0tJekE2V1RwV1F3VjZvSmxlM1ZUbGo1VHlQS09qbTROYnZPZy9UOUdWZnhOQTloRmhRRFN3L2ZSanBDRjJXOE9BNjhpQ3lUK2YySC9ERzhDNmUrbTF4L0lJODc5TkEzNXJ3QUE2OFFXQVlnbFRUQXNZQUNFcWVOKzZteTN3WW9BNEYrak5vV2NOUzhPaWFqUVFQN3lNRmF3SWpRUmdTVU1MSTBRN24xUkFYNlJGOFlLSUlKVW9aM3lnQytRMlFvc0NrdE81bHVNSEdVYUUzZUxlOFZqMGhxcFdBcElFYWxPYXBHNnJkVys3cVJBRmNDZVlpa0E0QlBUc0xoL3dVV2ZPYng5UjZVOHFmQTRTS241ZzdZQ1hBU1FDUUJZTjNrQS8vMU4xZi9rNlMvMFkvMW9Ccjc0R1h4eCsyTmYwdSsvN2d2cUMvTHp6MEVmOU9SQnFqbjFQZ0xvWlE4YisxWjBjOGdOL2wvMkRXZk5tZktwWDEwMzd6Mkx4bjNsdEJYVGJFNVo4SVB2ZkcvR0pvU0R5NDZBTXhZMkRnRWhFVEVKR1NVTVRvV2dwa2N4TURKNzI0UjMvZUgxOFNDQ1M0SWt5WFF5Wk1xU3IwQ2hJc1VNYXRTcDE2QkpNeU1UTTR0T2Ivbk5XMzd5dnYvNTJPYys4WVhmL1RzdTNMTE1lVDliZFh0MmNOZXZYdkx5YVBqRkRVK05nUmNOdU9CMXIzbkRMQklHUnlOUUdEeE95am1vVklPTGg2K1VHQXdBa29QOHdKT09oaGJKQk5VdmhwVU5MWnFEVTZKMEtWS2x5Yk9iWGc2dEVoVktsYWxTN2x1VjJyVm8xY2FxVmdkdm5hTVFDY3VXWEhIVjVjaTRXVVFtVW1VME1NQW10Z1FzQlN6dEYzUmJCQmV3RklBdzVsNDFpamNiQm1RcDZ5M0FFTnQ4MmRBa3dqeG56N1A3OFZVVURCL1ZtdUFkK3g1NmNQKyt2WHZHUmtlR2gxWXNYN1oweWVqSThPS2JGeTFjTURRNE1IL2UzRG16Ky90NmU3cTdPanZhMjNLdExkbE1PcFZzYm1yY2dXQTA3UGNlZmVUaGg3cWRkcXZadVArdWRHMjFsc1RBUCtmejZkcjFtb3ArMExKMVRFZ2dTNkN1dkM1b3lBaXViMDEzWVBNTGJZelRiT0RBVFg1WUVpWXljcFU1SVZjUGZKRGxKK29PdWRzdkxPVXlDSEEwZXBTaFJkNGR1SDRLZ0VwTUVPV1pHYjVFRmNNalZKa0JVQlVCUlprQTJaS05Sc0FOMSsxMHhLOHRpNUx2dTlDUU9jWnd4b2J0VkpZU05ZU0ZJMy9lendpTEpkUUVsVkFWcWJGZlZqN0dGWUtVd2lMMk05Y1NkZ05tOExIY3NBSWx2M3QrcFR6aWtnalM4TGhucFJBNHlEcGJPN0JjZWtoTElSdHlyc28zaE9GYmlVMjlGZ21LWTVKODJ4UmQ4cXlsc0ZXa0VIL2JhbjhsbkR2M1p5NWU0RFZHaVozT1FSREJENDY0WG5XVG1vRkRSNTJ1WEpremxmeUNSTjBqRlVMZXFaVkxOUUVYbVZFbERvdFpOT2ZpelE0UkxiaTBLM1ZmUWl1T0tPRVNNRlR2MTNUdmk2Q1Z5VTdXeE1tS1czVWJ0RG1uSTE3eVgzSGNud2pnb2ZvVTRtYVNVbExuSVBvZDB3OHl2NjZvV0lNZFNpR1BVdjJ0Z21BNEVkYTEwRnJudFFtL2VsdGhmd3VoQUhXS3MrSnMvM3pxdFR4U2ZjWmRXdk1Ca0VrbzJPV2Q1aDhWeGtsMXdRMHRXcWZYeGpuYlhUd0R3NW9tV1o1cWR2SElEYktZeHlnOTcwcEp2ekF6OG4zNU9MUmtmU2JkRFRwWmdOTTlsUUptMmlVMy9IMG5neHZIMjlkQWVZMlFEUXZ4WjR6U2hwUWJoQWpCbXdWYkk3RjdJdko3a2lOMUZKR1dOdUFuMHpNRXlSbDBoMk4xN0pDS2lnQ1BLZnk5bkhOT3R6d25JendtZ3V2WlovVE1CY1FsSEFmdzVFeEhEc1hHdUZ1U2VvM3lDSm5aUmIzVzdVZjNhTlo3M0VZSzdrT1NsVkpzd1lZeUpDdGNHTTFHcmo5OGNuSGhrRm11N1BkT3duMVd6UjBoeFRuUlU4YUJKbXhxSDl3UUlJYy9mVVdCSGo4cXJJU2piTzJoUFc3bFJJYW9ESnBLcDZXclZIYjBvbDVMbktMeUZqMlRIZ215OTZBcFo2L2xxMWlOUFk4dndES3o1Z3MrRS9DWklDUHdjYWNxY25SaXIxUnpQc25DZ1FWYWc1VU1yS0dKNnk0K3lQWVpJN3lqS1RKS1NVTjRvVVQ3R1RkaXhPMERrZmNUVWRta2FCenFQYmk1U2lLZkphSkRES1kxWmwxMnUxUkFPa3dTcDd6SG42UWthaXBOTHI2RTBwSGdtSVEwTzN4Qm5XU3lZMjBjdUgyeldZeE5RM3cybUZ3UDh4azVjS2VEc2RVYWtLbExITkpHOHM1eHp5aE50dEVCaVJETlFzY0NsMnYyWkFuMUNpdHhNRWpMTXdHOXAxZER0ZHFpd0pUTkNmTFNxUlMwQXRWdXFRUElzUUNSWkltOHg2NklOd3BUQ01KQzJ2WUhyTk1XTXc1VHhKNFZpNEhnUlJva2lnRktQVHBuNDVKWWd4cWgwYm9xZ3VIUDZJZ2tRVEtWUHA5Qm1DdHlTT0pkNmJ5RTBsUTFkbmt0bGNpR1VtcFFPOXRCbjZBQlJCdlliaC9vWGFwbkNDNzVHR0l4bDhXK1paT2pvSFVodTdOQzI1VUpvTGRvdkMxVm9BaTJGQVhwK000TjFEeUF6VVVqZVN2NXdHN1piZjlFY1Q2ak1ic0oxQnBZL0p0b2w3TjBqcFFoZ0xoY1lmWWVVWjJCWHFHVUg4NVE4UlJ0ejJmUWRuem5sbEIxOGRDRE0zQk0wUlZtTFhHUEZWUmpFZFFoTFA5RGlKdnBOem9VQXZlZzlaQUxmSWpUVmI0ZXQ1dlBNOUFVVkMxMUpZQk15RXBKb0xhd0hWczNBMENORDBjZzIveG5YSk4rSUpXNEFLZjFHU1VhM1ZCY3VNclhsVVlUdWdab096UGZXS1J1YzhxWU1tbE9NS3dsN3gwa0t0c3dsZjJaUnNyajFoZzJ5enFCYVBsQWFNbGtSQzd6RzRXYUhjOEFCcmx5MG1EVmdQaEtnNjBLSUdzbG4xRkZRR29CSFkxVEd2OUtnSnAzVm9vM09CSXVBNDg1b3JoMGMwTkcyTFg2eVNBOXNHY0JhbjJRaG9iZ25pSjZGZXR1S1NIWExwNWVjTjFGaTFvM01nTW1LZHcwSXJGaGo4MUtpVUxEdlJKREk1S1NVbEtBRklLeFZ6Q3VnVXhYcEdnWmZBZ1BFRTkwTmV6S3pweHZIYlBUVnEyZE9hcTg0MkVOOXV5VHpLMkZZdCtXZFFaRGU0VWJlQjE4c3d2bFFVQ2lGcmJMK3lDN1dxbHpaT1ViMlZwWVFadTFtUFVrVDJYeTcyNk5qMGdwVW1vRVdJZXIvRkprZ2tnYkFBTDREaC8wbG81SkRCTUM3a2cwRHR6UG9nRjBLN0xXTFhSMDZQRU4wb29ISDFsdWVKa1FEUElXVTZNWk82TGEyc2d1bkY1MDhDMmxZR1pQbGN4MlhKMXR1WEZicmU1MUNJVVdTaGI0Zm9qNkxnR2NtbGcrVUNpU2l4Y0g5cko2VFRKZEFDMjRBcEdic2E1aGEvTklyK2g5SWVhWElDaVp1OEM0Skx6V1Q3Z0tZVDc2MzkrQUFqTGxwcGRYQUxibXQvemNkWjhuZkkvc3dYTmJaZHc5bVIxU083SWZnWktDLzRNQ3dwQ3c1c0QxajQwd0l1YmR0cEJOY3NWSG11VVB2aGFrc3hNOUY4Qkxrc1EzNk0vQk9KQVF0OFRCQlNVYlNvandLMzJFWWJlUXJ6dVlHYTluV0ZoT0tUbFFCdzlDRmo5alRHNEozTmdEdmV1QWcxVU9oYjRLQXA5cEhnYU1KS2IwU2xvTDdEb2RIc0xqcHRYaGt2T2Fhb2UwQ0hqRFU2dGtLQ0I0MmdaSnpSRGNQbzJ4TmVKclpEeGNYZVYzVjI4SndrMEhKaFUwOEx0R0RRTXFLT1AzVEdvQUk2WW5iRWtSd0RSazNPNGtpNjFJbnFUODEyeEtiaWlvQk1HRTVETHBNS3JpT3BvdkZMdGJJZTl4cU1xL1NUWXN5MFpRRjV5YVphdnAvYStIN3ViRG5wU3NpQndKRmFnQk1pN3dWV2M3VUhxbG13M2ZjTHZ2bW5WUlNGWVJRRW5neG5IdnV4OFExQ1Y3QUlBdUFJRGRBSDFBK0x3ZytnSGdQNEM5UUxnQkFOYWV2T1R3b3FNSFVvTmdtVm1FeURJN0xyeExIRFhYRWs3WkFNSTl6T2JHeUNHRGJrNkc1VWduVHBQYzMralpRTWpZR1V5dU5YZytNL1RpYkkyY0J4Z0p3a2IwYmdpNGZaZjVBQkNXVDdCRFNNOFllUy9KOG5vNElzeFFZazUxd1pLbTQ0Q2p3NnBUZlFqWGpVTHY5ZWpQT1ZLSjNQaFMyaUlmdWxBSzZzTUx1elk1T24vYkh6aFpETjJHYVBoNDY2WkxVVVpFbVdKM1hSRys4QSt2NVlPT2xGSU1SRkI0K0xqV3l1U3VTT2VwM3FyUFdyTkJvUnZHRFdiZ3FjdTk3MTVrWHoyQkVNRlVaWGZodkw5VUQvT3VtNjR3ejgxSWtzU1h2WnVJT3FjWVJDcHQrRFVpZ3N1RTNRN2J2Zzh6OXFFemY4bWZlSEZuNTVzSlJVdUxZeFEzZk1IWnVPN3ZoazhNMDkxUXhMQloxU2UyaVFOVjBkakV1Q0ZUYm55amVhcU5XdERVT2JxSmVKc0J1bklRN1BLV3F2SFBQRnhFWFRNS1JqZkFEYytNOWI3NVdpdEtlTjJUVHdQTWIwUEE5cTJGVVVHU2FMaHNsakRBVUFNTUxkS1lRSFZqY3dwZ1lLb3dhVVFDMTZycmh4QkRSVS9hWmdiRW9VcytBMTBUeGtzbmtTTGpaYXl5UmErUGhLS05qQlQ4TG9TcXJxQkdpcUdTUmlGNVRCQzdoNTNDaW9lRjRXRk1WMXpLNWpEUG9iakhnUDVhOXNCREQxaU84NFdjTDk0Q281RWRjSWtIbE5mSnRmbW1BRXQrQXAxSmF0dzd2NUx4YlNVM21lS0NXczEzY29kUVVZbEpWdis4dG11ckFHb0UxbnBNaFpleFRMb1BMMGtnN1VleTJNTEV1dk0weTQ1S2x3R2xXeEFobkhmTmpaYVdOY002ckpiTWltaTArc3p2OUJCcU91dGZQVkVqSGpJYk5kNXBhYU5tYkgzRkxKdmkxdGxPeE5zb3RkaU93VDluZVBPNytlU0dGRlR6MFRhZDlZZG1BL3BKOHFGYTVnc2Zhb2lzdzYxQW50OE92aisyNDJXSzNSVnIrY3lPQ0dUWFRaN1pxM3lISlFMUitxZnVTYmdQbDRVb1VubkZNcWx1SDlBUDhSaU8xa2Fsc3hlZUhYbmt1TkllOSs2MDZ6aWgxczhPSzg2ZWtNcjZxc0JzOHJ1VXE2eEZIMGdVZlZzT1lhbjNXU3RBUmY3RjUwdjZ3ZHVLYjBZdjJic3AydkN3U3FGYU1BcnJJTHZZVjBxeC9UczZjRDkvUjB2bWI3cStVajRRSkRIZkx3cWExTDJZU2FLZTZvY1dYVDZFaCtWd3VhUnlIc3BMdGlVTWVmcEpSVVlJdmRPcDVZRisvTWhnQkIycGZ3R2prS2NjZit3U0krQlZ6T1hMR2cxY3hXNERWZjlIT2FhSGlTczAvUjNkZlNpOGhkRnhZaDdNd2xGL2p5aHdEYWdGL0NlMnowaHd3RjRYNUpiRHNGSnVBd00wTnF0anNHTURDVjZHSzE5aGpVQURiUk43eUdkaE9oOHV3SEwzMEd6cXlsbWN2N2FJZzdRb2x6UG5Md3JiamNOdjM2WEthRlp6NGk4UFZIaGVRM29RcGFxTEpESTNTRGtFWExITUNKVFphUEt5ZlFUVVdyODZxSGNXNlpUZTVvTTd2YXRORFhrRmxja1VQNkdTVVFoVldpdEYyVzcxOWZQT1pIZTdnOFdyN0ZtMjR5OGhIa1RtUmdWN3ZqUFJYUHE0ZEQ4MGEwYVpnNDNmQlY1dFd2dkk2QUJZT2dmR3V0aThpL2txeFF1TEVHb0cxbzVmVG1tNm5zV1pyZGx1RTJicjBMZ2tkU2g3RjFNUzVwRDBEWkR3OFVpdFdLRm11c3gySDIxeEQvYm03eHhzOE9IMWxpWUpTVnc0WXVqd2h4UzMwQncyNUI3YUNiR3RnSFpVTEltNnVlYXR4ZXlwclZrcStsRm5CbVJWQWQyb1VUNUNWNlBMa1hYNGthS2JkZ1RtRmhqZXNvL0tqQzhJbWxnYkx5ckdLMzhTN0pqcXQxRTVhQ01pWG93YStVUGd5M2JKNTZkb0hJZ3hQUGdid0pyZFd0bE9HSjdNQ04rMDVpNlY3VW1qaWpoU21JL2VvZFhqSTJXeFFIamFtZlZPU1B5bldEdDU4Ym95OHl2TE40cTkzSmhwTDVwV0JuUkc2bGFhMXBFVjVtL3VJQXBSTjdSWG5UaklybW5BMnNIa1pwR2NHNnlzNlplV1h6NmQ4blRUZnRaaFFPYmFCWG1MVk1WcVprZ05ERmdEaTZYbFRZbTljVTJXWWpwelNTRkFTQnRxcXNTb2xpVVBLVWZiQUQxK3BpYldaNXlhWXppL2ZtV3NIUlhpY2ovOU5wMFp6ZmladEozMTExZWRnZkF0WDhXK21tdjI1MWRmRXdGQXRxRzh0ejJ5RHpMaUR0dmFiZXJXK0pxTmJoQ3h0U2dyTTZxNHNsVEpTNDF4YUNwQkdocHBEcnJpUVFXVjdOZ2RqNEY2aFNVam1vTFNCc3RaVGR2ZGZoQVluckJqVWl6bStnd1Z1OHpxaHNXYjN4L0YrNVhFVURVVFFYUUN4d2RIeHk1dmk2WUhuczI4VWlKaDBuN3hJV0MzNWwyc0dWUXFTTEhmMUNON2dDUUtrZUdnUjhhVFdxVy9CbGY1S0NBUWdUbXVMQ3hNelJqakxJc1I0UWczVmpvNithdlh0bXNDSm9aTU9rY2J6RjFLT0hHRDdaR3lrbGNXTXhzZWlEc1NtVXdDU1JieE0rT01WWWd4S2d3dlI1Wk5NQ1I0MU9RdUhzenVRMSthNyt1ZjNnTWVQM0dSR1hITTBHT2RiR2hmZjd6SWFSRUIrT3h2VGgwOThCczNmL0RBWTNwb0R5clFVdTZURUh5VWg1ZHRjaWMrT0NoUUZqZUYrUkR6NHR2cWREOUZ0T0NpQTJrZklIdmVrMlBMUmZ0QU84ZHhZdTRlMExpejdXQnl5K3dEeFg2Wkd1clphYnJ1ekd6V29PK21DK1pGa25Hc0tUdUx6TkhDSkM1SDhnVXpGczUzV3JCVk1nSzNJbE9CRkwvQkVRV205alRtY1I4VUVrMExKL1FFTURmZ1BIVFpDcXFXRi9vS2VldjRVUjRxR1ZVUzV6eEIwTmZ5clFkblQ4d2ZkRWFMdHBjajNKaDRGYS9HVDZZYzVadUFpMkRqdXdjK0liK25PSTd3Nk1hcU8rQ3ZLYTBqemFlZjREcVFvZVVJQWtka201dTVuUE83Wm13VHpBQTVWVWZ4b3VTMkdGQUlNQWhBMVMrZllZVklwUGNYaUZMRkNqbWdlT0V3QVVkRElIdzYwUGdwSk5EMk9GUkZid0lNRWF4aHBLV1c3Mlg3bG13OE9ZV09GdzJkWnNuMmROdjhKcCtmRkk0WmhtVDl3WmNaYTlnU3VBQlRydThodzVrMG1lQ2o3U3NlOWRLZ2dKUFJSZ1VzZVVWSGFrK3h4OE1RMUZHRGhNcWF1bG1uUExuQXREWUFDUzlPVzZKZXhlMUYrNHc5dkprejVVeCtxZ1c4NWpreHd6dzV3V0FXNW1IWnlmek9SYk5NekNPYzVqZFZwaFpzVXBzZStwR2dScHhtWjQrWjg5aTlwTzN4eGhnNVJoKy80YlVDakVwaDYwT1AxL0dXWnJXb3JpN2FaV3VRaStMWkp3WXAwYk5NZWZaaHd4NDk5aW42RkpjQUs0RG1BR1RJaUZXSnhEVHp3bEhmemZ6YXZRWWQ0eVlNeURTWVBDTE5tSkN6dUZGYnBvNUV1aWlRWkptUWxySXprRXhCR21LcDJMVGppa2lQc0tmUHZGMkpkRDR2MUUvczJlMjZzeGdDcnVDQjZNeVpMYnNJUDJUZDl1bk03cnNzdFAySDZGQmdVbE9CNjBDL3pZNHEzUXkwcHJuY0FTN0paTTgxMnlZZEpaTDQ0Z0lETnU0NjJZUmFUenk1SEtxN0xqeGpGT2NieGFYWnBCMHJiWmJVUFRPYi83cXhrZlRQT2daL2RLS1JnR3o3YmZJc29RMER4djN6OTgzTE40WW92b2FibU5aMm5qT0tIblo5c1JkVEdqSnF4SU9ZTWlkbkp3UlpEcGtUMjJwcGtkSVVOWEZTQmhYS0hHdUJoK2hsMytqNWJTcjJYTU83U0IzVkthWDJCanJPTW0xNHErUnNPR0JIc3dZRk5yK2tZTHpxQU0wM25qQjk5R2pxamthRHhNZk9hTnJXNkU5Vk1sQmlsVFZ4Y1dSaUFKZXYvUCtUNGE0TmJZcUVza2RzUzRhNHJWS0xLUUpOQkpRRmJTcmZqdEJtTW9FVUtTdmpmQWxBbFlUalMwUmgxTkhVdE1XSFc0Rm4zMFlVMEk0STlBUFU5cnd0dU4rYmVubFNjdGlFVFJZbTRnNGo3dDRBSkpHb2Nlb2tPUmdRTTh6MGZIOU5MTGFTUVJFOFdjQzRGZmthc0NiWmhYNms0c1NiR1hOTkxkSXZtUUhPQkdvR1Y0dGdOSzBzOTN4ZkF2cmk3ZW1NQWhhVWdjR0l5eWZmZVhTcGJIZzkvZDhtOTV1OC90K1R1Ny90KzdhNFR4L3NvL2U1TlB3enNwdktSck5UajF6cC9rL2Ivelgyb0UvLy8yU1dlK05xdmdtUmRVMGFLandSSXYxNnBFNUZVZW56YjNvNzVBamdIRU9rSUY5K0dYSTlmRU5ZS0g5Y1JrUHlxUTFHaFBYUytMTEdubVgyZUc1OWs1VFp1eXJGWE05RG1UN0tsNExtbVJ6WVlMaTVSMmZEa3NLSWJmQzVya3hnQURiNlIydVRmZW8xL0phSlA0WjJ0UWJ2NzVpYnVHOXZRYStvTStYYXVpS2FIWnM5MXJJeVFXK3JCbUlvZ3Y0WUV6aDMxOWZkdDZlZ3I4NjVkV1Y1NjRySitKU0srRzdpVStJZWJqL2VMeGZJOWhGWE92RXhjVmROQzk1U3h4MHA5SS9hVXoyYVZZeFh2YXE1YTlqaW03Mm1TY2JzQXoyTGEwT09icjB2Q1E5WUhkaEFwTGxYYS9XTXVvdytjLytxVnYwRHlxTXBYTEptZkVMWDhFYURidTF4ditFV3RKQnZvb1QwYStrVzJPbG00MlkzQWtSbURRWVg2UHJqWld2OTJwSmtVQk5pWDZnbzJkTGhlOFlqRVFPMXd5cWN2L1AyajJ1aTVIMlB5eXRPZDNKT0FNN3UxRTIyL0ZxbmZVUnJkdmIwNGk3b1g0TkRyeWZKTFJvdURJN2FtcnZWcTl3KzdhcDAxNGpGRnhxeE4vZXFWN3I4MmFtYWM3MTI1VUN3dVVkWDYraWxBaWxrdnNXdUdBaFZxbzJPK1ZPSytkV0NmUWNaN1NxQytPcTkvcnJNUElNenVNU2E3S0cyRmpOZ2lMY2szLytvNVZ0RE4xRnhEalJwc2l4TTNqWnd5d1NrQ3NJcnhCR2xtZXhLT3V5WFNxd1gxSXdXaktuVWFOU3J4djdtenFOdVRsVVVWWnEwM2NsYSt3L0xkQk82Vzg1c1VidElLSVlWS0w2SDdIaFdVck9yNENGcVpQRHhtKy9XaDVSUEhxWDRMUk55SWdqUEYwZVVsRElUdEhPZXFyYnVuL1ZUaWZVS3dXaWhtSXBBbzE0Ti9wL2dTcXpnN2x1ajByN1dLS042T0NQeGw0WExCMUJid0tFR3ZZd3F5elViTzduTnF2ckhtN3RvZnFCTTBkTG5kcXV2ZEVMQjhtQjVuMXpQV09qYTVKQXFTRVFyWGRDSDNQRGV3bjJoK3dvSmEvV1N3c1loSzlNaldzbDA2N290M0FGRHNsWG44N2RTaGlSbnZ2bWE2Qk92OG5RT21IVVFUUnd2WFc5L0Q2clFjUzAyWGozM0RiSS92eitmWElidVNwVnZWcXZIMVhmTnZYdXVtaGczVm15K3JRaHlqVjl5WG5SYTJiMmxMZGEvakg4YmJhVXQ3TjZhNFBpbFRaYzNtYmxqSmJveXpvdmNvdTh1ei91UElORHo4ODRST2o2d1cyMTB0eU8wb3JGVW9QWFhOUWJrOVpKWEdWa3JvRzZaTXk5WFVQTGEwejZyU2dxbGdYS2xiVkJicTQwcWNYOTMvdDBQY1p2c2tWSmx0TTFPeWJodktreXRLT1lNL3VWMHNWZ1RVZUlCRldGZzJ1VU8wRGZ6RjliV0JYdGpEanZTSUhsVjI4MmtuQmxML2IvOU5qcTR3TStNQmd0bkVSZUQ1bHpXWURTMkdxMHYvMENibTZSYTEzd0g1QS9ya3R5ZkxlM1kyczhxOXJ4Yi9LdXJHSWptSEhwUS9zYTlGKzNHMWpSbE5tWW9RdzVYMDhYMmZ2clRQbUtTWkR4ZGpNdlVwTEpIcERrZEJiY3h3UlQ2QnhHQ0JzUXgxS3J0U1Rtc2VBQ1pCeDJ3a1YzamZMVFkwSUo2Z2tpN0tlUWNYdWdMK3ViUWo1WFBidERvekJtem9jdFJhK3pOMmt5UXV3WWJLWDNuY29PMFdsa1FzSS9PQ1hyY2ZiN1BHSEpmeWY0VFB2OE9WaTJ0c0p5Yll6Y2JNcmdyQk9YR0pQdS9PaG1CRUpVZmpnbmlHQzZKN3dnQ3VHQzh4eVZSRk5rVW5kNUFWcUgzTEhBeTgxd2swdVJ5SldHZGI4ajcySUMwbGM3TmIyc2dmTTI2ZVVPMllmYncrMW1LU21YMEpsUFdaR3cxVVliNkRHa3laU2xEZXNOdDFiVVhsMFo1bzZFZmU1MEFXbXhzUWQxQnBNTVlkQTR2OVB1RFF3SFhpSDk2Q2I1c01lZlNCb01oWjhTYU0vcS85QzZiTEM1TkdZMHBLZ2haTy8zMnFUMFZVQVlxSFdER3FWYUpoOFRWSDk3TjBSbmlrYXBkeWwybkJKSVpWQnFqdzFDcmpnTGE2V0F6Wm5CM2VZRWhvc3JMNUFZSVoyYTJjeHJuYkwvV1JpVVJmZGkwNE14czI2VHNHMU9sWXYvUEg0Y0FoVG9nSittYXVFSWxpZTBJQXJKTEpORG1iSE1vRTBxci82aUxuQ1NqMTRkOE5INXFhVlc5UVJBdElvdTB5N05rdHV4RVhPTFVHYzZrMjJEOS9UYzJzL2pmblJBaEpJU2hqQXUrNlcyMTREMVFNZkVCZThuZ0krUWtlY09tTkgvNytTbWRNUEdkYmlFMHlhdGd2N052R3I4S0JiQ3lJQWwwMmxvY2RFZTYydXZjYTd1czJkY3V5Zks1eUNMMXN2SmVkNjJ6THJ3UzhuUjduZGloMlJXTkJ2aFN0N29wVzRzM0tHdjlKNEk0bjhmU0tDUHVYcU5BZWFOUlVDUXZObWFWVEJCdU54amhObmN3aXhvTUdkUnpybTh6R3VEMnpTbnpaMFlidWpKV2t5bHJNL1RZZDlZZEVveW1qTjNZYmIzclZyYndYQnpwb1BXSnZCM1VlYzg3MTUrNXNiWENLWk5wa0NLNDJEZmtjNDJFd3E3UlJYNmZQbzI1b3VmNWlkR1dldDg4cDJ0a1dxS3doRmdKV0hNdFJyTTVaNXkxLzY3VDNDUlI2MXN4WDR6VXU2TXBGRGRucklidVdnZlZ6YW5mMkZ0Sktjc24vNnJNclNuS2FFemEwK2MrSENwbStyei9lY2dUUk4rLy9iVldZd3AzaGFHYzNtOWRNanRRaHhOKzJDR0lvU3BKZkhzUXdnWGp2YVJsUDN0SENBSzArZE84MnBoUUdqZVljOVo5dU80dW5hdzBVK3V3cE5TT3FMUk5iZFgwTkR1c21BOE9WVDBua0RWOUpWQUY0QUZSbk04dE5qVGh0U0ZaVG05QTJsMkJOS2EzNXFuMkV5ZElUMkowTG83N29UblFremFkLzJzeEVVU0sveHBBcmJydWxCMWdKajM1ZlZHVzIwTVdhVlk5V3VSbTNWSXhyZWJmNHRwKzVaS094NXNoUFZObkpJRXVQOGNXOFlzY1NoM3BhcEpTOXJSODhQRE9MTEVHT2pjWEViKzVhLytsWnNsL2hHOU9ndnVidkNkL2NYMmRUaFZLS0EyVjZncjVKeHdJOFp4QUNGb3A5V3V1YXZOdDJsUXphYUxxRkdxdkdoVFNna3VSOG9iK3NCWU9lL1Zkb3U5RkZNOTU2cmhROE1PWWVGTkFHWGlHZkdaVU9icE1tT1ZMdmlUNS9tTTRDYmZUclM0OGp0aTlmL25KQ2RjeDZTMnpOUG5KL0x4SHROanJxYXRmS0RLUzVNMXZaMUN2ZmY3NjUyU0lWcCtlUWJvQXZxQU1HVjZQcjUzNGRQYU5wczlVM2ljOVR4S1Z0bis4U0FNekh0bFl2dnpocnkzdkY3NVhZSG5vcTJYTEh2N0svRzdCZTRVMWc0Zi9XVlcvUmlIeEM3MC96NkNPZnY3YTV6cmgvcHovSkwxSzh3YXJhT2J0MWxmNjVBOUNjMStaSTMrVTd3R21WWVRKb2g2U2tqMWcxNWNjMlM1NWQ4L0x3dUxZUE9BZUVJQUlCTTRnTDdvV3EyTC95VGNPclBMZTVZTFU4TTdPN3RzK2ZCc21Wdko5Y05WVUVYbnE2Q25TZ0RzckVQV1JSc0RaTUpzbisrYUZXNktZaHJHVTUyb1M1UmdhNXZtVkZRdVZDOHNoZVlWWkZqQVoxRnZqOVFuSEg5TFhlS3krOWljVEV5eTZpNVd6ZWh1aCsrcTcxeHg3RmxIdFhNU0VKNlpoaGVTUTVENXovVVVWaTVTTFhJbGR1T3kreEVmTUM1RDBzUXpwcmlYVTlSYW4vVE9KcWtFdFdIZTJ6S055ZWlKKzVvN2kwVlZZMjZ6cFh3Q2x4Y2ZTWkQ5Qzc1MS9wY3lZTXZDMTR6TEpWZXhVUmgvWDRuVnFVcFVJWExkcnNBdXBWdFZ0ZnV3WnI5Z0xNUElpUk1zVmpxOWdhSnpHclZKQ1NjZW13WWpmUHhBQm5sVHFRRlFkakk1SE5vZTFDNU8wMVpLaWdZV0JMWUJkTE5Zay9aZGV4Um9WNFNCMmZMdzFjMFhDSXZtenEwcXJ5RktCU2ppVGtmb1ladlRvN3dzckFNSFpmelJBNTlZakJaVzZQMTArdnNwZWorRWVCWnJaOHVlZDA4NTZ5c0M1QkRmdysxY3VFb3BvcmFaVWw5WVZHbkxzalJCWkV4UE5KZ0tCMXNabUhsNlRhQXpZOEcxZUdXRk5HNktDYytQMUlvMHRxOUxIS1lYVWZady9mOFdSTk43M0JmaDVra2dlcWY4WldTMll2a3MzRWo3cGZxaTcxbTVvSk1nR0k2Vk4xT0Y2TW8yL3I0bHVibEFUUnQ2cEJrQk45NW50WFl6SDJUL1B6TVYrWWVpNTg1eHVUVDFZUy84MlY3ZW5OVlpyYTNWUzZPR0JnQyt5c0lWK1kzZUtYcjNBRS9BTzBzNzVsOVlZMHBTTEdxbFVCa2lvRFIveFZEcXQ1Ny9BM2FrKzFUZHVMdUc5YVdmU0F4cVhiNDdSbGpXcThZQ2JEQW0zWUJBR082K0hPUXA1bUhNZHBqRVl1MU40RDZOWEJQZ0l0b2xoQStvbWhjbW5SZEJSTndzZ211VW1mKzh5RkkySUVIbFliRzFaTVF6QjBMRGtOd0hrRTdUVzRmenUzQzB4aHpWM2IybDYxWkFuNkJtU0tlRmFLU01JR0tsa2VBOXg2NHE5K1hOZHZuNW9tWTJXcnd6MTlkY3kvdG1NZnc2MDNPS1Vyd2oxenE1VjkzQWs4NnlaUnFQRmxyUlljcUk1cFBHOGp6M1RiRFRWV0MydHYrOHFGcXNJSTdHaFp5cysrVDFMWFRQM3k0L3p5TGNhYlQ3TjdkQUUzZFR0aWJqTW96eWtWb0tlQUdZMnhxRzZzMktJZTdSSmFnM2tUT29NWmNEOGJuVkVKcVlGNFZySGE2TDdpVEpwa2JNWGMwVHFPR3pLblZHYURVMkkxb1dwelV3ZjVBTlZZTStnbXlFMDdnUk1NaDBXSXNaeVVVbWhodW5YV1pNbTVmKy9IYnZzMDhtREtyT3JjYTVhc0c1aURqN2FKYlk0MFhuT3NFWmNVcXdiRHYvbGZyRGJVZFdweVhxSGF0Y3hiWFRUVGdiZUo3OGVYRjVuM3p5TFpQRnZyT0RnbmhPQnAvdkhUYVdMV2hINlRkbjgzZlI3c3RFeS9YNXY3c3JRSzFYWHZGMk5hWVBSTnFScURCaTQwZi9uNnhRbCtMNVE3WVorNDNwa0VOOVR6QUNZbW9HdWNUeFNpT2N0WW9BM0poQlp5S1hWd2p1Y3ZCbzVHSFJxMWNpS09ML3N1Z1Q0Q0dobStndzdLOEVLeHp2U3ZQNHhCOVlKbVdVN0p5OCtJcFU2REVBMS82NFJQYzBJTlQ2M1N5TVpHd1B2MzhlUHM2NEM3RmNMYXh1MHFjNnE2dDBRNlZFQ2NFTEpjS1ZjMmd1Q0lJMnFsWjkrdS9uWjF3Y2xHQ05va3dESHhyNGVScVNIdlh6dTFPeWZwSC8vejc5aEJzeXpUMjk5YlZVNGRobDFpWWNSNUVtdkJOTkVsTkkxQWxvcTF6RVVKbEY2Uk5MTjB3RDg4TGZ2N3AwK0NiNE9iSmVxMlhOV3cxdTlvQW9OSXAvbUpYd3BLL3ptaDkzNVBnUVBaUmFOUk5KTlBwVWZ2T2ZlT05sZGhGQW8yZ3FBVzhWQ1FkbFdGMjczRFpENmFaTnlWbTZPN0ZsZkRhcnlpcnZFOG1mUTN5NUxwSGZSSEFDNGVKZEU4dXZNclRYYUdxWkRKT3JVODJzYUZ3akVYZkRwanpnbFU0Zy9kUU00SjZhMDRqei8xVUxjaitUZi9ORlRpTldYeXV2OUhVQXczQXZlQlNNSC9DRHV5elNIUjlNTGZRK0JXOHNFUXRFMkVGZ21GQXFKcGRYZmgvU3k4M1dPZXllNUxGaUhnS0VwSjNobC83V0JiNEYxcmw1T1d3WElQaktaQngxeG9YQzE4OXdkdngvaXp1RmRYanFDUEkxUFZGOENPSzk2ajRkTWRqa0JkS3JpdFNIVTduZ0ozZC8zZjd6L0oxazhFelQzenhTTkJhcGgrYjZ5MVRXMHJGcU1Lb2RjKzFTMUZIMHlMcURDQXZEcHZMZy9iVUVxdGZGZnA2cHhwdGxMK0tDRFRzQjExeDJKbDRvNEwxeXZLY205VXVNVllNY3Y2WlFja3U5V091dU9za3VyYis0Y1BwVlBudC8xNFpzYlNDZE9CZVVZNWdPM0FVZTYwU0x2dytCU3NhcGF5cmVFSjBwc1pmLzNXaE9mRkh6bzdvTit6enp2LzNsOGpNVnByc3k4d0VsV1pTcU82SVJNZHVYa1Q0OUlwV29LcUM2K3EwR3ZjUWsxSHNhbGtUd3hkc043NnZoSHJJdkFQMllSWFpMaU5MOHJIc1hmTEpsUzNNV3d0ekhjdkRjZzMrZm1ibTlUOXY1YkgzOWMzRGorekxqbDJmRVMxNlZ1dkx1b29KRFgwOFBqOUN6bWNXL3U1ZkI2dTR0Y2h4dXhSdlJ6eXhWdDhiSm9WYk91bVJVdFl4cnh4bkRNdzJFenZOeDM1M1RueU85NmREM3NXLzhsKzV6V2JKM3NLVjM4MlhMeXl3M0tXM1JmNFBvdlBrMjNNcVJjb3Z0eXZYeW41aU5jKzlHbmk4REN5V3NDOWlrakhOVGVTek1mZkZOZjdjd2NDdkVlZk5aTGU4Z2xobUZHNFBpYjRqdE5DUkVLdWJuekpWNDF1bW1ELzhGTVd6K0Z2dEdCZDNDMHB2SmQwNGN6UlRXYSs1aHhFWmRBOHhmRmM1cmpJdXhkQSt4NHo3TGN5OC8yQ0E2cERnR0g4RVBsbnByRHFzT3p2SWNiOFVaRlhxNW1OMXdkNVNMam40K2JQeHN2Y2FxSU5VUlJvL3pXMlRhOXBYamR2OWYzRmt1TldLem96d3FncXJ4U1VYYW1lUWFYcFN5TVlXVzZsN0JZb1pMRm5lSDdyMHdobTZvQ0ttN01pR0ZHYWZINmYyN3NLV2FYcGVVbDNSajFBb1dWTkdPR0Z3eFlkMGxKUUxJbi9ycXh0VE9tU3NKZDNCNTFoQm16cFJvUDJWYklWaFI5bXJSTFY5aFgzTnRvVFRGakVUV25CK25DazdsT1UydnM5U0xYWmVJaWtUcWZhSmFldndKRnhibERxdmQzdnI5RGRXNy8rNkpGQVByL3YwN3IyUTZqUWZUUWU2THpXUFBCamcrdWQvNFFoSHdkTnZVZmRLUHN0bXhadGlxcnk3S3lnYThZeHlzb2JWOUdxdHRqNEN0Z3RiT0d2aXZycU03b002eU9zbHQ1WlpoL2tzcXFod2ZBQnJVOUpFdHIzS2JGZlJGUDRjMlNtNFA1N2ZTdXFXVlI3Ti9YUlM1dWNHbnByeDVUdlFDZS84VW9SZVRxSE1qTEQ4WXIvdWFHNUhzbnV4NlJBWTkyZWJ4UGVMM1R6UktKV2U3M0R2czlIWThDd080T3Izdlk2Mm1ucGVicGJzOGRtczhVc1hFWW5vQ2NjZ1ZFajhQUVY1Q3JCS3JVTElJS2x1NDZlMmNCeUlPVzZ5WmJDclpoL1Q5MVE3NjZRZFRxY0pXYk9pbzZYMEorMUY5ZDNJR29PM1FrQjFVaElyTE50SlQxL2RmLzZ0ZDlQL245MDYrWEZja3BCd1BtT29UTzZIVStYR2NJakh3T3lMUkRIcVduRUMwdyt1ZkoxSktnZ3BFd2NqVVJqdUVhZmRiMHlmOUxJbG9VWE1DRHdMOFZMbkZZQzhUVTdxVlYraXJScnkveFdTK05MZDAxUnlCQ1VUR3Y5MmI1WFYxSlpQNS9OVHZnSFVkMVI3ZkQyNFdmRGlDcE0yM20xM054Sm1LeDl1a3JybGhGN3pDNlpydDgrMXJmdGUyNFZlNGk5SGEwYU5VSit4WExCL1dmWmZFcnlwY3RYN0hpSHo5bDVOTG1CSjdBVEhFOGZ2SXdkanZHZDMrQ1lBamFUa2tsMy96M3dCVmo4dk1tenZEQVZiYXNBZ0tHMU9mQWpJbUoyV0VQWnNGTTJJWmI1TGRzU0wrN0JNejV3cnZONlJxeFNGVEQvK1c3QWlEL1R2T0lXSnI5azh0NTVYaCsxYVgyVTZxbmx4TXpHMmFRY0x2ekdYYWZ0MG9PY0ZXdkVWMlpxUXJCdERVTzRETEt2RDhmSmlVdlArZnRoQWZraWdHUWlsTkFqdEJVWXFYNC82ZUZrcyt1QzBYSHpxZEtXMDd5TmtKVHpudTIrL1JHNkRIZ2VsYWJtM3o5YlVkNVh6cTQydGpaWTlwU1h4a3NkLzdtbHN0bUh2RytPNlhVZTJJQk16bFN6OFZ4VDhVRmtoMmVReUorM3RmL0cySkNsZUhzYnpQOTBCYlJuQ2F1OUFtdWM2WlBHQ1JYcEhQRGxOYzlTbVl6MVBLUW4xeWViaDJodk1wUXRmYkl3cnBxTkxURzFObGwyaHh2c0czcWFWOUxiYXc1K2RiR2F2UXBOMXNIT3l1MndKTGY1VksrVU9ucEhUMm9veHY0cU1vZFZXZ0pIN0JOZ1pIZU92dGZkL3N0S0lOcmNuVlN6TnhDdXBQUWtBUDM0eXNUblFObXQ3VmJaYSszVU5wWWdqNVpIakJza0tLMFFRdHR6eGRYWHB4OGRjT0RydEp2QjNZdFgzOUc2ZjFUWlkvYlZmWkUvb2lKN3NVRExsdDl0L0taRGMxNXIvZGtldU1iNHVDdVY0OVpFUXlrbjJSWU10bTlSUU4vbDNXR0FCWGtGTDZJb0hmOG42ZHZBa2hHTHloN2JlZ3ZoYzRVU0NvSWNQbmVxYWVYWHZnZ3dBZWR3dDJ3STY0NURYbksxMjFIaFlCeWpWSzA2Tks0LzQ4YUx2b1hVeTJ0NFNwZS9rVjJ6L1RZV3FxajNiQTJHakdzN1dqYm83SFlPbXJXb0NVU1BiTjJ1Q1ZSc1crRVNEWHJSdngrY2lTWkd0WDRmYjVSS3FVZDlubnRWQnArOUl4MFluRUpiVVVhS1dWTkhjWFVLOHkxblpSN2lvOURMUHlmUFN5WFRDVngxNzRucWxsNDlva2IzYXdJTEtodVBhTFdQWFhOdXp1OTJ1SEVPYUo0K2VqNXZhK05xRjVEeG1RMEtIdHl4am5qMDZwNUI5YTk0ZjNhcDZvL01WVWF2ZjB6V1BKQTdoSjhLWWVjNWVXVEF2aE02a1ZKOHNVemlJRE12S1hVYjVCK0pKVzV0OUpSbWZRb1RoK3RabjE0b29wMXRMR3RlR1o3VTlPMG1jNWx5ZFdiQXpZWGJkeDJwK3BPL0M4elNRVkdqTy9CM3RsRDdPODgzRmsyTnFWV0hwcHBXcG5FazFuL21wWm9WNmFKZEpIbU83TzlRVkpTdjBodGE3Q1U0SnR5Y2JndC9tbERyZjRVWjhFUGdLVWcvQ2NJL2dHREpmV043RWtlK3dTYjlUdVhOMWttM0NCZUM3STVudDRDb0RBbG1pNFExRE44UVhkdkFWZzQyMDd4OWZmQklyaW8vcnMvSzF4YVY2UnM5eHM3WHprb1NDM2pReW1Cb0FuYzBmTUdwQmhocHJQZXR2eDlycmRYc3ptZTRRS2dzSjhZUHIwYWFidW5xZ0F4TVFUUUR2K05QY3d4ajJPeU02ZHUvM2ZubWovR3YxMWtQUUlCZk5CY0N3S1R3M1VnUzV3RnJBQWRSeFZ3UmdXOHFRSXVoMXRIS2xPa3I5cll5MThmYW93aVcyc2c2N1lHTDFqSlpNSlV3b2NxNFR1VnlCMi83UUtLN1hRYm9QR3dCcUxXUUQ3V1FMN1hRSDZ6WVEwSUkzN282KzJnYUFINzEyM2QzN2MvUERkY0swSUFoL3ViRVhLM0NXd0hwMkV5UE95Ykg5clltZjBCMlBzaEFQTXNTSFptY2V2NEZzZnV4ZjM5eGYyelYvLzdENHNYa2JnWmh0bDhxd1lPcUlFSDFHQ2YrOEVmTDlOcU01K0d6VmYybjIvK01FZTBtVWV0WmNCZS9TSG9ja1ljY0o3NEJyeDZkUmdBb0QwNEIwNzBxY2hvellMa1dvYjY1YTV2OG1lV0ptb21BR3B3bVBJZlFCZ1c1TzhXYWpBSHZvMWR2L3lpNDhiN2Jmd1RQWjNzeEFHdi9hZW9ZUUFndmw5S0V3RHM2UjY0MGZ2MXdiSHhTOUgrVDk4OXJTck5icTNuTkwxZkhsd0ErRVJET0lBZmgxemt3UlZIV2d1UFRtRWZXSy8vM1h0TjcwY2V6cVhiUkgvL3M2RDNiMytRc3p6c2xOSms3N2Q5R3hsc1RDSHB4ekk4dSsvVDc3ODRRdFc4c29IM1ErakpCSENSOGtyNFJ5QStmNnVETXo0TWNqWVA5N1NodjlIQ25wOEtmM2lHVWd2YmcvZER1TkR4U2FJQUtNVC8yMWNaOEtEOERMM3h1VGhGY1cyaTRwOVY3aFhMVzBCVkgxeUhsNHQ3UEwyL2xRdW91emhYNzRyd2h2MGFrYktucDg5N1BOTzdGSHpqb2l1V2xGTmVzK1Avc0JiUC8yS25IZHo4dW12clBaU3hGYkxpd1Z4eURVb3hwUmszbCsvOHpNZVBoNVIxR0FjQTdzclYrNC9wQW1KWDI1VnNpNGd2QXdxeFdEVGFFRkp1eURRMkVjbldYcWxLb3BLcHVhblJBRFRBaFpPMDdYWmJLamtibG5XcDdSM1lhQU5UUGI0cEdUZHp1VU9xZFkxV2llOG1EM2pvY1QwNlV5d1FBVWxBMjBZQm9LSmxYUkFKRE1sTmtNWjd5U290WkVRalFJL0VVY2xXbGRXT1hWUm1DbGVPZ3JZV1ZJMUJMN21iKzcyZTBkTnJzTDBDNGRaczNvRUtoYXh1TnNuQkViRnhNa1NFUisrWmpMWkhZaEpWVjNteG95VlJhVVQwcWpvdnJlZ2NWZFJzWGprbWFGRnRFZUpsamVRRlZRcG1VMDRRY2JDSGpBejFpVUlhd3ZsT1hrTzZMUjZrWGVvbVhNb2paUk5WM2ZxcXgzN0hoN2ZVZWdEVkMxK1pxRXdscTY2M3pjeTkzcTU3NCtxdUFyMHR0QlVxZitKdGpGaXBjMEJhK3lsNWE4Y203WXpOcktOQStJUUZPM3BmMWZyVmJlMURTcGhOV1J0b0hlSk5oZnNYUmVleHF2c0ZxU2ZVNzU2RTFpeXJzbkJaV3hwWWFHWW1JUkt2V1M3ejdPZy83aTRnZG00SkRhUmNtaGpySzFNNk4vUmFjbU9KaEdobDlZMDRIS3hralovY0d2S0NuQXJ0ZHV3SWRLMUlSaWhXdHN2b2I1SFlXVmFoQ0w1N2laWlM5U1VxK0RUSDg5MXVBSWp5bFZlbk5hMXRTaUdiSFNuMnpYbG5wOHVxZDducW1QbW5Dd1hteDIxWDh1UEh4emdmRUl0RXk1OXR0OSt1djdMWGRsUG95NWw2NzFsNE1BSjFvNVdvS0lGMkYrNlhaMVR0NjJMTjVndXhXV1dsRXRNa3hQZmR2TnhGcllnUjEyMVJsMnZhc29EOGVnNjNzRjR0UTdsUWVHeGJQZUxNQ1RpcXIxd0RMK3ZTSmZWMis2TVhmVzljRU1QSzBMLzg3a0VpOFkycmI5VkR0K1A5R3lMdjVjQldKMW91N2NLZEV4V2VyOGpQNHd2RFNzK3o2QnVQYUdLT0wvQ21saVNhNGJ5aUx1ZyttUkJSUmZCQU43R1NaMDJDNFhIOGVwZFdyL0NCOGdiVVpVcGVTczV4TlFESU9ZVkExRW1JZWlLWFdLWlJBMVZHVENUeG9tT29nT2pRRGNmWCt6MXJsT3loblV3dEVQWmlRRFNsU1EwWEhPVjVzaTllNlozcTY5Qm50QzIrNnZQb1B2Qys0KzBWYlR0NC8xLzh3WEl4RzQ2bUU0d24wSGkzL1hBUXBpTGdBRlpnMExqNUtIKzFYQnJIUW5waFRaMHYrM09qSXArNmIwZ3M2dW9TRTdxVndqdTN0ZWg5SjlCT1hjL0N3RHkvL2FVbUZxbEZMTW1INWxVMVI5aFJVdzRTYUkzMHFGSFdBbm1tU2xxbythdHVHNFhzc1MxNXpmMVNzeWw1YlozYjRwRlg4N2F5QWNkbWNaK3pvZWh6em9YRWRhUVNaa29vTHZtVjRMbXp1eDZ2RXdXN1JWQ0V0V3QzZEFVSzNmRmlaMWFkaTZWT1FYY2g2bXpHenoyaHpqZk1LUXFUamlqMnUyYXBqaVRQcmFSR0o3N2FOalRwY2Q2Z1BKQldBUDlYdGFwY1dQOXgrakw4amRQUHphL3dxaU51ZkRBdzYzYlhLa2xybXNBZStRVThKZnlmQTJ2cUYrUlAzWW4xM2VoaDUrdTVIcmJNUklZdzlQTHRvWDh3T1lHMWtYZUM0ZWE5WjAyTTNhTWF1bno5Y255YXZYcjdMRVFQSHErcXBoaUpIeTBKZ0pnQXlzem9tejNUbGxZQkNkYkl2Uk9jVWVMZ05aTHRMT3BGcHJYMDRXS09nVjVBbGl3OWV4MmJNMndmblkrbk52TVYvaXZ1L2hPenhGSFZibEpEV2FOSjZTUmx1Vkc5c1ZxMHhyVkVYVGZVS0J1TXE2Z1BRWGRVczFJeVZ0U3dKV3h2aGQraW5YUTlJQzVLaHhITE10NGZuSm9zdXRZTXRxWEFMQnZuUUZRQm1IT1dkbFZyK0RUUHhsSWdkMkdNcThsaFA0OFJEWE91RVFNWmk4OStZaWNTa3RnSklMbm1MaDRPaDBPMGVNcXpkbzlieW9md21PMzd1aFBySklkY0w3MnNFNXg4enFpb1ZZbWt4VkZGYTUvYmxhbzNBS2doL2tFT0FtUHV4NWJETk9RcTFiSUt3VW1KaGlZSEMzQ2NtWkx2a1dGVmtRNVplam5FOWNCL3NDSWk0bFUwa1k2ZXRSVU5hWHVvUUx5dEowTm95Mm9NQ2dyTGlKQ2RRUjNEQk9mK3l4VUNqdkxmUUZiRWVhL1RsNzJTdU5PdXBsVCtuQnRhV2dybHl6TmNST3hzYlgvVEZkSnkvMmd4UGEzb1UyR3BZYkNoTDJ2NUgyYXlJTldOUUwvem1LellxVUNzclYyYXNyZVhSTDcvY2w0YVQ2N1NNVEF4RWZKTHdoT2hOaFhPSnUvcDB3Ti92Q1ZNcUN6eE9qZk41ZUxSTE9DS0ljK01yMXhlNmZBd2JGc1c0TDRjMjdtK2F0b0FkQVRicGwvTjNSSmdiQjBuZk0yNkxmdUtrUFJzRFNFQTBWTVRqZERYWTdKNGY3OCtZRi9QNCtzaFYraGNsWlRHZnlQVG05MHVWS1BSY0JodXRLNUNLV1llOXBnYThjdUNxUmpoY01vNXhOaDRRY1k2SlIzYWs1WTQxbTVTUkI0V0ZGVXRzaXFBVWpVU01CWjY3UGNNSWRCTWEyaWNGSjdVN2oxV3NmMU9heUdjcXpFekMzaUFXVWE1Q2pXYWMzaXYwN0NTSlJJbUdGUGJpZDNPcjVXQ3dMZjIrNEoyTHNiVTJVRmhWU3dUckZxRHpJYzRDbUJOakpEV2xWYlRhRFFhNG1Za1hwZHNreUozZFRVZVQxeEd0bFRJSnVGTU9HbmhPbEhLa2hORUdoSno5QmwrakFsRE1Db0RRbXFaekJXeVVWU0lQSFZjNjJRRFpnOVBITndGWlRERWtJa2xtZ1FpWUxCUWtENEhZOVZvckt0YUFvU0xLQUZwTmNaVVNobXdJTzJzbFJXVE5qV21WbEI4ZjRSUnZ1RmV4d29xUTFaa0JhdmpodUppM2dvZHlmREpLd0x6QUZEdm9oYVdoRFJpSjkyalRvd245MzZ0dXdUaTNKbFlsTXR3T0N5dDE1dkYxYUJsQW1aQTgyb3RPZElHQ3gwV1FKb094Ni8zWTFuWm9mZm5sRGxvM2IvSDlyMFNJRExtd1lPdUpjOWRhZjJ0V1JLQUxhM0RWOXBCR0x0bWJ2YTNwQzRhSjYwUjZYcWJHYTdSKy9lVC9kNVFxbitvOG9kWTlXQytwdXlWMDFoaUNId2NvMjRVcFZGMUhSMFNtdjE0SWNxVXNOQmpwWXJhWG9wQkY1SmFoNmNxT2svSmFGWG1wOGxrMEphTWdoQ2tGQnZRRFB6ckZwUXVBT0lzYVkydjkyWXdwMTBnTkZFcGNyZGg3dGFlTUxSdFRNa3hHeVV4U1ZWZ0ZTbVhaYU5Qc3hzWStJWnA4SkdreHBPYkFGOU5kMGFXMFBQd25ycjhIakNiQkN0N3BjcmROeStIMjhtNlErcFhqNDgrVU1IS0MyRk5qMlEzZWYrM2FScUh1UkQrbWIvNVNlZnc5NE1hTUxDZkdWWlpDU2Y2UzQrSmUvUGhCK1NtSzFKZk9EVTZFMVpVcTVNdDZ2V2M5emFPVTlWbGtndnE1SXpoZVhxTGhZM3A5ZE1QNzVvLy9jWGhMR2VmSGV6YUs4OHpKVjFmOC81NWk2cjY5ZVFmWlhEMzFsNzRwT2JqZXJQWmZSazNjNGZ4L0xVeGVZZ3RiTTd1dy8xcW9lOXpiWW5wK1R5TUI3ZFcwOS9CZHl6S2JxdGVLSGtzR2x5UVVGYkt4ZDdOTmR4ZEVrWkFBQkE4aWxNUEd6dlJTZ0dCRUR6WU1Ybm5VRnpSVEhVU2dOWjdWVVQ2a2VBZTI1cHFmOVFYMWY4NHNXRGlJOVBIRWJVNFpXdExZTFBFVDZWMFFObTllbDlpMExROUhlOTRRdkNsdW5JRUdpUmNSbXBQbVpRcERRbm1GNmtoQUFQeHZ4OS8zMy8vOThMSC8xdFNOS0lmQU1CYSt3OFo1QUY4UEcvOXM2SW4rZTVzRGdHZ1lBQUFFTUMvSDhnanQ2dnIvMGE5VTc3WFgwQm9LQlZDZW83ZzNZU050NnZWUTZXZDRuL3dsZXE5UWxaTlptMUl6eS8yeXVjTC9Bb0lSeTREcGZ1TVEzMndKTXJQNkNMUFVEZmg2dWVCbGxyaFJmQWI4SU41VzVlU1ZjYXBPK3JhUGkreGJ6cmZYYXpvN09kOC83TFkxUTZnLzU2bDBwZVpCQXFvL3I0dDRGOHkzK2hpQ0dlNG5rQWowK1hXVWdrdS9teWNmVjJ2eEUwWkR2cTdUK2FVdGhPVXpWZjlPSkFWV0FtQXJ5NXZ3RDRuelNPZmVZMmRwVXR0MithQWZaNnFkME5sTHNjNCs0azRKV0Z2ZjlRVHF2dEdMZVJqWmhPQzl4WjUxY0wzc0lEOVE1VWpaZHV4MndXcWtLcHRGR1VJTFpsSEx3clpJVDdGVUpjaXBCRDhmS0U5dSs4LzRpMFg4dHZidk9ZRTNCQ1BqYkhsSGp0bUl0a3h2aXNpMm9FdWZKeTBJUVlOekQyNm84K0swYkZzbDR2WS91SUpRSFlvZU44K1dRUTZkd0pQUzFpSndrK3oyRlMycHllNnJjMHRiVDNCODFMZmgyUzdoaGZVbXJGeUxxMEVvbWlJYjUzK1lLVmU3NUxNZEF3RGtKc0NjLzBTQ3NUc3hVK1lXbS9LZXVmSytXamNzRjdaWkZ6YmhURWozcG41eXhVdEQ1VldEc3N1ZUN0aWMvQzJNZGZJNTd6STlyMlFIdU5TZkwyOEp5bHo1ZGs3RW5JUlAwdnRYd3h2TzJEck12YXJ4R0pFcTVYWExMK0xGOVJ4d2VsSWRoTngwYlRIdEpvUlBSS1VUaW55bFpJRTRFOVhuYVVUUURnb3hCMk1BcEFuU2tOSzVKN3U0U3ZCdG5PL3NtZS8zdDAwQXViSi9NSGZSK2s4WkVjRnlnTUFCTkNRZnJRMkZJd0R0VHNCK2g4Y2c4TUJDSXpEb1NZSEFKYkJ0d2JFM1hzYzY5Mi9OT0RVcmpZbEdrZzdGOUpBa1U3WElLQllXNE1EM3A3ZHo5SE1NcnNDQXJBcjcwSStmb2FjM1ZlUThMWDVSSUoyUmozTUd0VnJZQ1ZHMHRBNktOV3dvZHJlT3BWYS9ualhVNnlIV0p4WnV5Yko2dTZnVTRkNHcxN2F6RUpNb1Y4cjR3RCt5a3Jrb0VaOTFGWnE1SEx4OWlYb0F3OCtIREFJTTJwcVdYRHd6b2ZYUE53YnNnMmZSKzlrNnlLRmdMc0hKa1g4UXBmbWpWY2RZbUZTZ054ZXIyT1pZZ29FRFpLQjlYMW1zbVJLRW5scklEUU5RUGxBVURZdWxTZkdXTWN4ZUllZmVxTUk2dkJDMWF4dzQ5NXZJYmZ3QldId3hWVXZVSXlXanRUd1cxVGcrY1pURGIxOWphcnArZlZWRWdwNWZYN3M0MEs4TmpucXJqbjB0WTIxRmRNYjdZb3BpVTF4VldLVlB5YXh5S2NrNWxSTmlHMkViUnZnVWlrb1RnOTFTWFNnYkJKY2JTMHdhNlFCcGlScW1VMUlwYW9rS2k1V01aR05pcnBHU3VHVVJDWlFwVFdxaEsrS2VhcUlxd281OFFLYVA1WGgwZEZXa2FseGNGdlkvUFczUXJyNnc5ZGMxM2FsSm0yN3JpdnQybHdWaFY1RklscGtwYW9CRVZaNVlWYXhFRlhhQk5hL3RwamZ4ZFplenV0dytEYytJUC9KLzR5eTROemdyZ2JJd1gwRUdiVkNaYVd3bHJTU2NqNk8vRTArSUJGaDBkMGkrNDV2MzdkbU5aWEs5VFh3R3Y4TWZQYmV0Q3g2WEwrQXBDbERXL0hqTmlLKzd2cnExU3M0MjEyOGJiRy9NdmlNYzVHbzVKYzNLbWRkWjI4bzdFVTdWckNHQlBaNE50TDg5L3RsWEYwYklZbU5Jd0JCQVE9PSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlF1aWNrc2FuZDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREkwQUJBQUFBQUFkWEFBQURIVEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2x3Ym5GWWNoekFHWUQ5VFZFRlVIQUNGQUJFSUNvR3FJSUdHVmd1RUtBQUJOZ0lrQTRoTUJDQUZoVUlISUF3SEcycGdSUWRpMkRnQWFQQVpGa1d3Y1FBRm0rOFRSZGttblVqMi95bEJtekdoZGVoYlpTRjBSN3VvN2hrWkNaR1Q2aG5wb2JaVFd4eTZjT0RoMEVnLzlvMEZSK0hBOHMzSjFiM3R3NTlYb3pnY0NOd2pabXR0d0NWeFg0aExvcEVrVGFSWHQwWklZMkl0NGpmOTJYc0N2TVJMVXdqMlFvMElraGN4S2tZcTVpUXRjZm5pbXJwWjBqcUh0R25nSmJsL3REcXppaXFkcXdBem9RMFRMeDg2TXpwWDV0STVUL3p2OTY5NzVyNEFvb3NSQkRKZkJibWtXZ3NJdG9xTmJHMlhKOUNrZW9iSGJmM3pCQm1vR0ExSTVhZ3hHTzFHVGFvTkVGVE02N0l1b245Rlh2emYraXVpd1FFSy9XL2FobWlieitWZEViVlZSNFlOK1BkL2pjekNUTzdMbndXZ0lxRmw1UUFsMjFZQjJwNUtKRmxMNkpmN1plQnpmdTRjRkozcStBT0M4UVY2NnpvYld3WWhXd0QvVjVzbXZFWG96RW1FVFd2dEtHMlRQRzNoV2NwUW05blFPdlI4SkZJVmdaQmQybWJGYytJMWZZWHZ3TlFrWml2cXlQMGU5Mzg2eTFiYTlkM3pCcUdMcXdBWDNYcHpiVEg2K3RiWHpHZ2tBMnVKZlF5ZWxmV2VKU3ZnQzBKRlVGMWF4TmRUVTJIVHBTajdsSmwvbmVtcTcrOXZTTWsvNkphZEdzc3FyZ0dlZXRuYU5WUEw0eitkN3F4L3NneG5GMlQ1ZWdIU1VXeVg3QUREVk1LeG94ejBCY2h1WHhpMkFzQ2F0VFB5dmdPT05UT2JyT1NjY0d1Q1FsemhFYktCL3ZydHoxaXJIOGhzWm5hNzluSW5oeTB5UkVMQ0p5TGdXZjg2LzNBZ1REQUFBTHBqTkVnM0pOTlFaTGhzWkxveXBGdzFwazRkY3RoaDVLaWp5QWtuRU1JQlFwK3VKL2lsa2hpcHVDUEhlZytHOWxwRm9RL2EreE9LYzZIRkF4QjJ6cnAzb3pBWGFpQnV4Vk04Vm1Da1dtVjd0dDgzVXFsNmk2eHd5YXN3Q3BWOStjelU1T2Zqck1ySC9CMWJkc1NaSzdtU1cvYS90Q212S29KRWloWWpWaUtQUHJ5bUtWRGtQLzlyTU1Nc2N5MncwRkxMckxQUkRudGRjeDB6S3pNL0U2aUFwQ2o2TC9rL2FLQTNBMjhPeVZ4YUM0T2xUNWFkdVBNUFdmWkIwdkJrUnRuY1lBR2RoU3VXYmxvMjUxclQ5ZUNPQ0tMZ2ZiWUdrcUJKNlZReWE0S1RHSUhVZzVmaHFSU1lFak1IUnhJSEkrbEozRlR6dE4wcFdoN0REREZQcHRvcHVONDRKL0FJa2cxU2VPcGNpOWhQMFJUUUVpV093enhOMDBaSFUrVXBTMUdGOEJZUEVEM0FCTEYxbnFMRmZBdFNJZHM0dFpRckVKQ3o5VEt0WjJUTVVWaGF4SE9MVzNpWVN0MHBvRWNZZ29TeDQ3VkRxY3loa2drRlBZSGR2TVN4OVY5K3Q3Nk5MWnFEQjJtOVlZaG10bXY0ejBsNzFhRFgvaGN6T3dRdXhxNmsxbFVDN25tbnRHL1AzU3p6S0dRL2Z3UlVEL2NPTVFpRElwVGdqeHZ2Yi9QYndFOXNsQTZpakxJVHhia0dscDJtWGhmVTFPNUEveUhlYWJSV0l6SWRXaldaMlcwOThTM05KbXhJVXhEMEpTMklRcWg3L0RMT1ZGVVk5SS8wNzFkcUpGeTRnTjlTTnlQc0Fxa2xKR1hQYWZlTSt4YkY1cUlZYy9JQUJ4bWxtNEJjQitvUE9SejE5Q00yb3VoMm9HdEVOTjJBSkZyQ1Z6TzROb0QzZXhXU0VLRzRzak1EdE9WSlNnWUxWM29TYUxZZWU2T3JFNTlKV3RJN1hxNkZNTkI2cEJhRHptU0c3eDlQL25jb0FRQzBZTzY1QVYvOFZxUjVwQzdPMEtKUlNUaVhNSGVhanp2cThmRDZURWF0ZFNlRWRDeUp5T1A3SFMwSE5zY2puNEVVSDdJVnY1QjlOY0h0NlErUXhyNU5nSmxFWXBCYmw3aVdGVGcyU3ZzdE5McGsxd2QwRU9CL0hLT1A1MW9Ba0tIYmswY3hnYVVTbUVkenZ2UkVYZlhuVUVxeHFHZ2R4LzFwVUJuNnlTVWJpTDhia0lsQ3BPQzJIRi9ZMHg1cXB4VEw2TG1sVVBiRk9KTWpZUURlWUpJY1lBaHRLVnFmckZLSW5nbWpPSTVleCtXYlNVQXJDR053aElEaWFLUFFWMTJlemFkQTA0Q0hHODVMWW1oMmdpTUVvaGd1RkNFN1d0MlJucFpPUDBMQW16akpOSk1sMUZxUTJ3ZmJVQkpiOCtnZGZpU0dTVzFnQzF0WjB6N1FWUWRkb1RTeXNqU2Viem9sZnlvaFN0Z2dCZWVMQ0hPRGZNeW8yQk9TOGExMmhpZHIzWVVoUkRWWFRBSXhFNnh3bXMwREVnMU1SRkhBR3RHWkpMRTZDdEJabDVKMkE3dWxUUDIwTWpRWHUrRkdjUmhqQ29WWHRvd1ppdGhlQWlnYmxuT1pJUmdEQ2dZS2VqakJRb1E2aFJoMkxJYXJHV0I3eitZaXRLQXVxRU1BbDlRRElnSGM5UnNZaVV6QU5nTXNaR0xMb1VheGFra1ZyZkRveksyMTBaYkswNFpwaTZDRUJWb3NNT0FBVVZnUWl3VjJITWpCRHVLVWdKT0lneVhoRU1uc1VDbFNhYVN4dzZUcmlPbU1SVjI0V1NHL0FyMW9iOExOOU1GYWZiRm9xTnJjY0NOeTRraWpxSXdCSmxOd0JDOG1XVmdsRyt0TVordjU1T01WNEVpRjJLQ0liVlNzbEZvWk5wbUZ3ODJYV3N3b0M1NktEK3FVcm9JekttbnU0R0FaZUpaL0VBQk00UVdRUnBGcWhvVllDUWZQZHBPaEhHYVd1eDRldUZpSG51NDAwcG8xTjdDWFZNbmZLalIyWWRGaXNjV3FGcXVCZE52QWE5ZHk4dEVUUCs3MTNMd2NEUHh2RGQwYXcrOW5leWZnZC9ZMzhDRUw1c0ppV0FuciszMy93WktjUW53S2pyWGlNQUJwRHVDb2FVaWtHSVNoQ0FFRnlFRVY1SmVsRmNIQnA5TG5lL2UvYTdiTUV3OEtwUDZaWlZtVlI4UzVvYkFtVlpKV09NNXkwajhCQUJRWVFUVW1ReWFaR0VUMXg5SERDVWtNRzJNMkhFT2h1WDVIalR1QnBTcEFLd2lYT21zcUJxREFYelFVSXdaK2ZPQkh2Z1poWWhQRzMvalZ5SXZKT0RkQklDMGpLNXNLbk43NnFVeHNJNVJqdEFwaXZ3Y21lQVFLOUZZS0dzRVN0Q1FRb2c3Nkc0WmVtcVRKVEFSVzFEOHlCVklRQlZNSWhhWnUvVkg3aFNPQlJGS1JtalFrU2JrZ1FIb2lyWXpoS0ZYWDdMSUpvTEM1YWFuaTB4Z1dMZ1JnVGdsa3JPYTFXTUp3blE5WHpsY2ZtQURzaFE0SDlFb2VueTVTb3JIcldnOXRzMHBJN3YvM3NFZXdBYXpydUMrR0NQQ2Z4cmtUOUNZQTlDOWJBNUJ4U0tLM2R4MEFZSS9leWlxbXRCdUFvMHRjTnVicjgwd2w0K200TVBqOW1LYVdQL0ZKMXRsdFBkVXpPNEcvaEw5V2pwVE5zbFZ1SXlmSTZYSlh1VmllRXdxdDRkYm1majhBQ0NKelNmZG40cE1vNDNLc2tYV3lzUVZwakQ5U3dtMEY5QVBBdndPQU54MnV2Y2IyQzl1QUM5K0VDODk0enpxZkdhUDdLT2Jocm5NN3oyMEJBWUJFUUg4bmdON0s5M1oxZXVWek5QcW43VFBISXZNY2RkVjFpNjJ6M245T21XV1QrWmFhYVlrTHpqbHZnV3VJaGlSUXNHYTBtb3RnWUdSaVpoRWxXcXc0ZGc1T2laSWtTNUZtamYrdDlRQUhva0o2Yi8zZ2JqTDExa2RmT2JRM2dCaDY2bXU5c3Y2M1R1ZFRvRkNSWW1WV3VXZTFTL2FiNjdEampqamh2cHNSY1V1TkxTN2I3SGJVdU91aTMvMFJEbGZjMEJBZXY2bTExVC8rOXErRkJBeEhoU2RTQ3hBdVJLZ3drVnJRMFFzaWE4MnFwYlphT2FPTkJDN3hGS2xpVE5OZUJyZU8ydW1nazY1NjZhNkhub1lZWUtCQlBFYWJZS3h4SmhudnJJbnk1Y2lWcDhSVXBXd21SMDJFalRiWWFaY2RDQTIvRUFCb0RRQnNQOUJ5UUw4Rk1QOEE4SjhETndjQUFEWjJGYnlFaE9NVUxDV3FvcGhJaUZGR1A2L0pTYmJubkpnVXhWMUR6TFFBaENKSXVFYkJvM2d5YVNVSlJTTmRFTEhTSHRJTTNISEdzU054ZmV3RW5jZnI2Y0NnTVdsN2phYUowMGV4UXRRUjlpaUc0Q1V3OGdTaUpubndTYjJyc0FpcFJFbG54Q1lNczZjU3lJK2UyUng2RXFiK0NyR0VIbU9vTkFPRnBKU3lObEFUaEhUTlBvQjlIUU9yeDRqNVhrek9nNFFPQ1dtY1BqUnhUQzNVOFlQb3VVVTdYN3pNdnJraVdvN2RKc1puUVFBRTdubjEvdDVmWjJSRVFtbzB3ZWl1dkprTGxnK3dST2tzNXhTOE04V0xsVG9FeEtSSnVONVpsdWM5VnhtR3AzWG9oU0ZaZzYwMmgwUHBmUWpnSEhMZFU5ZFlHWkdVakY4eEdQYWZwQ2lOQnE5VjZpMDZUMDRZWXA0b0sxNG9jM2VsckNpVkVZRGMvai95UVNuUE90YUpuekhCYWFoY0EwQ2ZBQ3E4Uzc1WnRBazBwVG5LTkF1dU1RV1FiRml2dG5QVXhuTUxRT3UyZkVtTmIxWnE1NUlNYzVRWnRtcDhWeWxSK0ZCWW95bFhwWDdWQkRBbWRtSXRIVjJGUnd4cTNmNHpKb3g0dDNLWmZwc2p5OHUvVldiVWc3WjFSOU1ncGJqSjR0bTRXQURNUWs0NXdEU2tVUmd0eUVtdzJNS1JUV0RGWmROL0ZHYVJmWkhiYTdPTFlPL3VUNGlIQjRxTWNxdEg3S1Z2MGJxd09aRi90ZVkrRFE0b0hVUVloUTRPVlFvYlRXTjFTN0RCOFBYYyt6dXg2T1EzeE8xRmRtRXFBL3Z5aUszdHVhSFNSYVc0ME9ZMDhaVkFQVFdNWHdLNFpFT3hCaEM4ZlR3YXNHaHhLU3Q3eVFsQm9UNTBvcngra05xb21HK3FJTTE0VHlYVmhTSUQxMHVFSTJDY3VGT3E1NENjUXZOengvcGNmOEdvZE5ZL1MzeG1hVit6Slpzdzc5aWxlOUYvVThyaFBWQzRtUWxjTURyYm9EWVM2Q05iNEFLd3hwK1JFRlZTMVRJNlVNWnc0d1lXUU5QUVc1dE5UbkZQZE5ndzBGTStkcWdIZzgyNko4c2lWaTN1blE0VGxzaTlnYjdHNDVtV0xuZC9EeisvUm5hOFJMRWU1OW1xcHI3U2hvcXRWd1NJdmZtR2RWMnY4eXBxalU3djVqNm5yUDExMXBnc2lMeE5qZTFXSEI4Yk1qcFdKODFkdFMycGFud1Rnd25OMjMzV3F3NGJESlNaR2xCSlRTRGxIZU1ZWlhadE85ZnVsV00vZTBETjNaek5GYnpmL2RzMnVYSUxLZ3hka3dOOVdFVFp1N2xzNXJrd3dSS3d5VnVWMkZNMmVhbGZHVmFoM0xVMHI1MXRXZk01V0ZIQ0ovV01ZWVVqaFd5K2NFbzhleVdCTVhFeldDVkxreWJZamoxdnJWSmRuT1JYZXhzcmdVRExxYmFoMm9pRDg1N0VTR0xhdnRrVExKUmZtTldFOGVhRzI5MFdtNUlzWGk1VGg3V3dsTzhjM0xTbjNldWk3V1I1SDh4RFkxMkxDYkN5RXhWKzZ4NGYzdFF3VURHcjNodGxPZkFHNjMxOHhrcnptc2picXdZdEVWU1c4dlI5S0xlaFo3b0ozb2thNWpXTFZuOXBXcWNybUQyVnZHT2FKOGVuK0tpT2RVYmtQWEpRZlc1eFpiN1cyUmVEdE9KVGEwTmJOend0UkpQQVo5UnRxU2F4MHFHbExrOTJndjFEWDVPVVErKzNZNnUwVUszUFB5RFJjOGVJbG1rU2NFWnAwd1MydzZ3Y0szK0txbkozNHllTmFidkY1L1J5RFIwajc4SHc4NUhtekdWT1MwV0lnOUpBZWxnTzQ5d05rdEk3aEEwVzlrd0p1ajlDRWwyR2FCTDVxa0pYSm1nc3NTNmFnTlZ2N29vR2lBZ3hhbCszcXdUWGZUaWxyQ21sVmxvOFkwTE0yRC9BTmhmdWlTSnJOWFZzQngwV3RQYmtWa3ZOYUhsa3dnQTFjT1F0SXl5RVVnME9ISGx6ZDkxUVczcmwzVzAvczNkd25mWUswZ0NPV3p3UHRJQ0hWbk5YN2VCZ1JuUmNHUVNyaml1YzF3bndxV1VsMTZ2Ulo5VmhYU2VNSVMwa2ZKQzcyOGtQay9yMkRFZFRQSTkwR0tBSm10dVJnMHBqSGFFNVMvbG15N0hRQ1kzZ0Jxa2Jia3BEaXQ3S01QcDlMa1FRU1ovUDVJcUR3UkNlUFJ6N2QzNjBPZ2FGVGpzZU41L0RPOG1hNGxDeGw1MVdjcE84VG55ZHVGbG1maGZ6Vm10NmVjaDhMZW04bitnUUtLS2hndzJFWCtwL0Rlc2k5R0FSVmdLOWtUbE9MVGtRSWFyWE1iSlp0YUVEMDZiNWJkSTRhSitFVFgrQWlRNUpkdHVjUTFYYUR6dkRGcTFzTGFKYzN0eEtRM3RRTGV5VXF5S1dWUTNGL3EwZEZqOFlEOGs2eWRkVkZhNStWcytEU0c2dUMvbk45Y2VudUVOcWxqSi80Y290L243ZitwaVllWVVwbytGWk9sRkd4UnZWMVd5NFZFUEdLTEpwWDdBQjN1Q3RMRjJibVdhSUJpTkY2aEI5MjNHL1QybXVkdElFMWZ6NjZUVXczQWJyUXJhbHdFRmhPM1pMTFpKR3pXend6d0xqRHMrejhvWms4NGdPd29IVUFIQWdMdzhYaDJhRk1yNjZqczVTb3hrdEpZQmVUclJqWDV6bkJrZG1JOU0rLzFocmNZall0ZFpyZ2JyVlRSNmMwNm8zbXVhQ2tOWmNqcmZQc1hsaXBhak5Md2F1Zkw1RVZTS0VBSGd6bzdFTXhZSlcwL29pSnh1TnRrbzBXbVUvTzQ0TmRVV3pJdXNOa2RaZmpkZlNWbzJ4OE9ESEg2THpUSHV6MnB3T1QvT2NCRWpKMVJValI4Yjg3NU5JRUJCdW0zQnR0NnpFb2RiMWhNZG9NaHJHR3FYVTQyQjBtNzNreUx1Um9hNThSeG5HaUt4bUlId3RnTlN1dmtBcXV2UjBLTkp3djM0WWU0WTkrcHZXMzVFMHRzRkYxZ3V1alRMVTM1ZnBVOER3bEFmUG5HN0gwM3pXOFgwZEpubXZKenlZNDV4OGxoRDZnMkpBVEVSNW14L3JFdDNtTnpxM09rYVV3SnZJZkd1K2ZxNVhmQk9IamFmdlFENklvd2hoYjluUWF4VDZKRGZTYjhWa3hybVZWbnF1NXJYSTVScTdSSHlNSlJpTkpuT0h0OGttdmJnZ3pZamduVG40ZHlleGNTek8zdlF5RG9KOWxXSWp1SXNSS1I4ZmJBQVhtenZzbHZNdWJib3ZUYW1jN0syYlJVZjJIMHlSakx0SnFlVHV5QWplOFlRY0pKQTFkY2R0enVWQ2UwL0VyaFlOSXd1MFlPekV0ZWIrU2xNS09VUXNFOXV1WnV2dVFYV2JYcFhsQ2J1dkpBUlhQeUFtekZHaEkrdU9HTUJIN0RQTzBvRFV3MU03OEFOM2hKNkVCK3FvMFlSaEk1OGJCWENJVUxJbXlnaFdWc2F5c0lTUUI1NmhxQjJISXBYek96TzlFbEZzZHh1Qk9YMGlQaFN4TlA5ZVZoeVNTSXAyRXpYa2FiUjdmZlF4a2VpVEQ0TDBGWUNHR2lOek1EZElqWGhoZHpYUHplUTZzSFV3RHlnZFVzd3grdW1LaXE0OW81UXJ5NEVKUGNodlgzMm1KMUVaUHZMcko2cGNhVnVtQzNwUXFYemoyZXZYNG9wVTd2TnUyYStPVitlcnh2SWoyVWJsNkEzblJza3hrV3c5Zk5BZWpWd01JRTVSSEVTbzV4cjF4TktzN2NjTjhOdzMxTWYvOXRSQUtORExIRDdjTDY1bW1lcGFvaGtuUGVMWW5jYitaR0FWczNRbWVzNXlCR3Y0eGJKUjdSdVdqS0lXd1E2bGZDdEZ0SEFlMFdDb28xREMrU0I2SnNkbnBFbVBnQjJnU1E2SlVpOFZGb0lCaFYza2hDaGYwMll4ajlKdmVnL1RLcVR3ZzNlSFBPNXNWa1dEWXZHQ1NhQnVxSTduYUE5b05CODcyTmdvdUlRYmtFckhiODhKMmROalM2SnBEclRmVjdyaDhXcnhrcjhjQjNaaDEyS25NbUtxSG8xcE9lbmh0RjQ2YXpFOUxhODd1Y1J2M0pSMnl5UTdtSU5sZmRuR2puVUpldC9GMXVqZStxTzZTdzZ2WVNwNkRSc2lHZ0o1QmN4WFZvM1I1TFYrWVYxdXV6aHZpWEQrYWIxWkdORHgyUHg0bnJhbWFjYnRxSEtvY3l2MzBlekIyOEdya2pYZTAreEFrQndhVE16TGRZbUZPOU8vZzJHSWVIQVNWTnJUejRVeHJJOFR4S2pqVkpxcnQxWHJkSTdETSszRGUrQ1ExZlc1L1YzVFhIZGZ4b3JFd01QVGJ4cnNSYVlwbmxLSE14eFpIcytKY2ZNYjdYR3BQQldtTGZ1Q1EvZlN6ZXYyUFJhdUN6NkFsbC9CNEVDRXZ0Rm85QnJHRWRacG5JT0krTGdnbjVCYnFPd1NiamkvMWhxQmEzNG45Zko5QUQzVThpYnVhbUdHZDNXMUx1UmxOb2h6bkxrdWlQZUQxajNDRERwNVRWTkdBK0ZoZFhvYVlFeU1UMHFUeDJSbndwczhJdEI5ZkhKM3lhNUZlZ0NsZlAwclJsbDlkN0NaMzMzai9oZzNHMk10YXZNMWZCVU5Cck4xVGVGV0Ywb2M3aXdDb1F2S21lU3BoQlJlSHR5dzB5aXc5MG42eHBnQ1l5a21vTktHaG1oMElWWlk4S0JrTzBXMXBxWUlpOU1pVFZHOTRKMmpoK2N2T1MwUnNlUUs1Z1VEOEVBcVAyQ2FyOUlqVmh0VjNzd1BWTnpUQjN2d1lDa2lXQlU3cjczTjQyQkFuNk4xRzlmbDlOWC9ENUErSjNrOVI2TlVXL055YnFUclZzenc1emZPRDhObzFvdFl2WDJTZ1lOWDEwRGM1WW9QdUpMVWo2NmRUdGNPbC9QRWJZWlBocmkzK08rL0U5K045amJlYVFyT1E1Z0oxN3gwQ0oybURvWVlvTkJsVE5XTkh1enhhL0R1Zmpyd3ZyRzBvZytZWWJGQ2IwVEJELzNvN2l0ek43ZHpYR29kejdmSjM2eHNET2t5T1NBNDROOHJIUHYvK1RNYURGcEpuNDM0Tjg1TS9tY3ErQ0tvaWdoeXdkamtsVnpTOThIZzZRR0JHVitrU2FhMUswbHlSNVRrRGNETi9ZSlRwUi96ZmJ6U2trNWV2RjdSdWRGWUtKcW1JaEVpUkVpcjA3RkVCTmF6NEVLejc4MEJOM3FLOXJPYis0WW8xOHo3NThuY2tnUzZPK1BnTEhaayt2WGVyN0lidThCcXRyYnMxZjMzbXg1MkhleVpKeDNvaUc4MFh6ZGJBNVMvK0VKN0x4RWZzMmRQejRZZ2FzZWh3UlJhTEtMVGtZZ1FKWGtQUmJBaDFqcVhtU3JkenZnbWZFKzJUWi9mbTRqdHkrZGorL2ZHODBpUjI2bi82NTFqK2JPZEVlVjNlWkw3NFFVaXNJYlJyM1NKRjVUb25XeGpmaUlHZWQzeGFjdVhZSS9YQzlYdGhZQVlrRFVZM3QxRWdUTk9Sa2dFOFE0VURTZ1VRY09IRUF1Z1BKNkY5dlVaUUo0bkxkUXIvKzlWK0dnYTR2c1F4Q0ROWDc1OTV5TlhwTS9mV3hBbnA5dytDNmpOSW4yNVU1b3NxUUdyR0hYcEJPNE5qYmN1Nnk1ZmN2Sm9kckh3bnBXYUZYV0RWR0ZxWGYzWld1Tno3RjlldnRyeWpHNWhhVG9IUDdYdnhiV3phMmlGZ05sWHB1S2NIeUs2dEhMNUpraXhTKzFqdXVudXdscUQzNy9XMEYzUVRjZElMVVcwR05nM0ZjMmtwNk5LaTVsQVRtZW1vQWtJVDVyWnhYejNmZG1wK1FObUc2UkZ4eDNHNnllWGlvcFprVnpmbGRZclRmVFp6eFk5Z28yK2dZWG1ZSWhTM2NrdDZFRVBlelkyM1pIaGpHMHdQdUh0MXpzejdZc2RHZVB1WllsZU1NSXNLYTBtYlRGcnVsTUd5M3NtSmVSQ3NwZjhQdXpRNEhJUnFkYUlYTGhFODY3WWdZQmRudFhrYzM2YlUvUDR3L2twWlQ4VTlGME0wQjBob0Zub05hMHVjV3d4Rmk1MHM3VDE1d04wd3FUWmZCN3JMVjh5bWhicWJjT0YvamFkYXZVZk4yc2haMEdRMXBiNE40MmtkR24wY1ZURDkxL1dNeWNuNWVxSVJULzErZEZrYjB2VDFnT0p1VnZyQ0lmMjJVdUtwcDkzNlNGVzBxbHNxRnVtSlBXT1RDendVNzRYc0tBK1dCeG5xRE5Wa0FmQXFJM2pXcXNoeW45SE1hOTlTdlpCbUd3L0tjQjFlalF5b1BGWTVzdS9PRVBENzBUeVdvUS9pZlZSM2w4cVRTQXV2VFVYNEY0U2VZMGFORnpRQWlWUUZnM1pEN0cvMzBFS04vcGNFc0FCU2pCWFk5ZGk3NHJsWHBKYzRkVjQ4amFJQnJBeTR3ekx3SURWWnUrM1dnZnN1ME5wT2NZd3czdlhIWlFjclJDM050UXNMUEdtRU1YMUE4c0gzMFladWdCWXVqeENMdzdlKzVORFRkZFE4ZWJHQitZZzVhWDBLcHF3SXVwU0xyM3lENUpuRnhUdmZhbnA2T0cwKzErZG1GMzZJZ0dzdzlCQmNQNTNuZkhQN05uM1FaWHBzeE0rS3B4RE5uMStBcVdCNGtkamJpYVl2dlBxUDdXUTRLL0RqRFVaNzEzL0RiRjdCR0tTS0owOFgrTDFUUlJ5eCtWVzcyb092QTEzQVF1clh1MDQ5dDNOOUZLWUU0VzNjNkU5NmEwMXlZZHZpNzcrREJSWHc5bVJDLzdMUEdKbGtBKzdSNzIyMWNHUWZjV295NlVLY3JmeEF2QWZCeUQ2Y05hY3RlcUhDYWUrcENsbUxHdEdCZ21DU1A3akJIUjF0ZDBYOTR1MzYxYkQrWWwyZ1lzOTl0a29BMXVjODY0UGZCVGljYXBxZXZocVhCZmUyYlBsaStQMUhqTVpGYXU0Qkd1Vk1HbDI2SWFLRGxKNHo2OVhSOUd4eFhIczUwV2JMYmk4QTE4UlRlRXJoNTFXWlpUMWhUVEZncHg4V2o3U1BpcVQ2c2syT0tIODVyNEM2NFVzREt6cW5CR1hmVVVvYUY4OTZuVUpua1N2K21IdlJJaUtNQmhVUU9uenpHdkgwcTkrYXNtWTlhcHFacXdXYzhhR0RPTUVNbGdlUXFCU2gwVWFRRDIySTdzZWZUYXJrRmdMTm5PcEEwZUgrcXdkNmcvb2RYK1Z5V3cwQjFhMW0veUxQYzVWUVo5ejFaSk84TFhiNFlvcmJkMS9XTG1lN1VFQjdCcjEyRmNGZy9aVm8yNlhJc0E5SnRpQktkYXpsb3hGUDBRUXdPSnBRVW9Famd3OTNWc1EzcHQwckNLTm9oNm5KeVhWR2NPd3dmTWFkY1hRK1VSdkgvNTM1KzAwZVk0RWc1L1pMK3dmVXkxcEdKVWtuWk9qbmJqRW1IRVlodXdZMHAreG00eFpNMUswMncxRFdjYzhic2luTXRtaVpXTnl1Q0JaL3RuaEhZanovZ1pPcUx1c2d3QnpRVmR0UEZRWGVZRHZIbFJ4Y3d0c1IySTFqUjlTS2lkdk9iMnBrN0QwL2tpS3VPWHgzcG1EdzVGQUhSYm1YVmxaK2FsU3hlKzRIU3VkaXhmYS9QSllZNkVlbW8wa3RKcjY4aDUyWWNHS3ZzSDlEN3g5RlY3TDlTN3dkS3dLQnVYbUJXN2ZiTXRaMEJJUnpGbFBjYjFtWThudHBzWDJZZ0F1czBjTTBxeFJMUFd0MTFLeHZmY2pxcmdDOWFyRTNtOEo3ZmVKUmNRVkpBZXM4NHI2dS9tZ2JVbnFkei9nMEMydUpvVjdrazkvS1dDVkxvd1c1T1JTN2x2WjJqLzZxQ09rZXcrZjUySTJyeXFqeDQrcTI1Ly8xeVQ5dERvL215K1NsWmx6OWxyOE9kZGp1Q0hHbGRyREJuRUdFd25KWEJYbWRKN1hxK0pLdEJQbVBSZXBld21XOTRST0dWRVk5SzQ4K3I4aUVoQXpuVHhnVkdkRTlPSzBFWG5TQ0ZkeHZGOGE0S1RDMU55OFpxMjc3Qk5MaUZjQ0hNRDVIZWhZdGNoRCtoWjc4RldCb0JBTitraEx5bXl5QUlHV2NsYTdMVzgxbGdpY0NRZHRkaWE4TVBBSGRrSHlIcUczcEl1aHVldk0vYml4Z1B5c1plNFJ3cjRzNExjdkgzVzVCRThnVi82dzErUndlak16Q1IrSnY4L0c5RVc4UXorUXdlSXhaS0NqQStuWDRjNnRuOVlhZlVOZmw4VStjMVdNZHd2WEE4ZGE2WjNSUnVEc1hhZ0FWdlQwWng5UTZway9xc0NLU0F6ODF6WHRmdEZmRUROVHcvbk1iaDZRV1JaVFk0S241L09GWGZmU0FqLzc2YkJBZGlZb1JGcDdjMk1yd1hCVFp0NXBEMXNtMkdJVmNFZnd0cDIwYWRmMmlaVVhJM3dEV2xDQVZaSTVWTGY2Nm1Nd0dZQXh6Q3ZsaUdvKzd2aUwxOVlqNElLejA3Wm9zTVBXL1BxZjAvckl6cCttUC9PN0p4eEgwTHpUWjh6R3RHc08zRUlUNXg2VlRyWFcrTDlsZ2U5VU1MUDVaYmZDdk9ZbEduT2llQnBFblJTQnhOKy9lQk5mMGpidHdFRTZCYW96VnhWNHFXT0xRNys2aWtmZEcrQkt3dXhDeUkrcjJiK2cyTk10a1g3UjdjZlZES1dpL2dDRWtEMWMxS3k4c0xYaHZnZU9Qdmg0cUpaNkU4R3I3TlRiRUZQYzJ2RHNXMlc4bWxqdEZwNmNDWldvc3J5UkhLM1E5RHZSODhtMjlOa1ZuWHVyaVFJT2lTc2FEcCt2MjFNNGZsVWNMellldkJBQzlyK01WcU52b0RSQ2dWRmpjeWdOWEs3Q3hZRmpiL2xvMDdWdlpRdGwwbXpuL090ditkSjExZHRyd0hrMVVBNnRkQ3dlczNrMG5VMkxTeHN4N05NU1BaZXRzbWFNdWtKSG9QWGRDUjlINm96b3hHbXIyV1l5SlpMT1pGQWRndzJrOUJDejNYNjkzT0x5R1RzeTNxK2VlSkpzZTkyeWFJZzY3MS9mOGVnbjRQQU14UUsyWHcwTHZmZEo5QjdjK1FkU1RQU3ZsQ3JaNExoLzJocW03dGJhWERiekFsaHVkU0VvN0FldVdtcXB6eTFYS1YxeTFWQnJwS1JMcVZTNWxacWVOOXE5QnNUbU5Vb1FNV1JOSUlHR0kwWGt5c0VTY2dWWm83SGhZckEwYUFsU293bzhGVmZ1eStYRm1vcmhPRUVvbjh1NXhzRjVZSXc1Y2lvbm9NSUZoMjFYUjBzSGl1dW1EdEpmdytubjVoU1ZGV0wrVjlSVTNGWXlJRkp2U0d3MnBOVXlpZ1g4S3VjRG1qYU9PM0J2bjA2WHNRaGJmT2FVZFBibnVTRFdtaklrazUyVFlWMWFOSTNobGtoV3JLRVpQaXdER3J5UGNQYjcvSXhsejdhcEhrVGgvWVd2Zm1zc0Y2UzRraGJ2RDNxSmtRVVdYQlhuZmlDVVVraUpqUUpsOExYdEU4cWRJNmpGYmRGMko3bXUyN3lYbDQzejk3QzlnMVNOMld3RW8rRERrT2JQZWxwRUhYa2QwbTNETklrdWpWTktORjlUSWV6ZjFxeHBwZENJbWhmOE53bmFydjRQL1ZPTU0vM3dRY3c2NERJSnUzQm5qeER3SURVak4zbmFNbW9qZXptNlBERGNGeCtPbDhPNVF1dzE4R1FtNEM4YTVoL1JTejZQY0ZXNmdCVEYyVEdWeFZRcU9uR1pJYUtHWXlhZE9CVXdXaHdwRk00WTFNcFlBZ0hYcS9CdGVPK2FLYmNHSVVXZ01LS3lOU1I2Tmg5dXVnWXM3Q0NxSEN6MHdxZ3AzWWZZYkhuRWxFWmhnV2ZKUDU0M2ZkK09TNDFJTXFzekdqTTZKR21VdnZnOXRIeUVndkNJWlRLM1dFSEFSQ0xtY2lkaVI4VEIzaVFCcXoxQnFScVdKL0RBUkU4UzFKL1U0SXhMMEVXQmdiNkkrUUx4NXhlUHhyZFY1U2ZyWitGMkdFanNVWlhWTkhnYURNZE5Xa3NRTlovSEFLY05HbVUwbnZFRUJJK3pPbUUxaXh4WFBtNG0xYkJKSFQra1ZIa3dvOHBYRUFrYXNad1RXQzJBRmZSVll3MC9VWTR0THExWXFMU2paeXVhUjZqNXdKYjRBbSt5VDNHV1ZYdWMzWWdOVTgzZ2JibGM4SktzZlVqUTBMNWozcFVGY1hJR2NvQVYwQzd3K2I1cVJpSld4QkVya244WnVYZXlXQW9XZmVtbEF4ZHB2TGR3L3JocVhidmFzRVhZOHNDMWhmeUtjcEI4YjdsYnlQMVhBZTRXc2NMenhVTmJkM1gyMU5ZM1BFRnp3WHVMdHQ1UmY1aUtQU1dRSWpzSXZyL1ZyWWJ3L09DN0NMOHZNL0JUSEhaNTVZYUpNcERPdDdSdGF0cFpPZHcybjE1RGgrdExqUzhBZnVYalBSemV1YjlRQnpWdmRyWUpoUUVVSDJta3YweTQ5OEJHd25mdmlqdG9GYlUzU2RxMlgvZDBTM3RMeXpTTDkxTno4Mk9nQlBnc2F1K3lnVCt0T0FnNTFIQ2ZYZEdmeW5HcUVSVHZhOEEycVBMN1BhMk4zTHMvblpkQUs5OXk2Q2syNTY1RExXM1V4TEpSWSsydDkveHV2clBaMHRwU1diNnQwcmZWMHJTUDA5SFd1cTYxZGJ5MVRRdWlFcnhNcEpmY3ByZERGVFVQVmJORk56dFlhajFsK2RXOG41cGJYdVEwcTF1YUQ0TW5vRkNpMzkwbnVoamY5eURZdnh5eUkzU2FGMTBYeDBybEppdzYzYTNrVTZwMUsyZHdrdnl4V3h5cjFjOFRPa0ZPWFdLS3FqM2JpdklFWDJIR2JicEFZdVhEanFwRDFzRStuMVp0bmNSSnJtbWdjbmlWRE91d3ZQV1NDdXl3bm45YVk3VXYwMURONnhEVHQxcWxROWU3aFV0YmhNS1dwY0pFQlNGYjllVVlYQUpINW5xMGt2c2hEbTFGcldXMzhvN0IyOUJsejg1OVd5UFBBMStiandhcCtQeGtodGQxSUtJdzlmemx5azdWMms1TW5tdVZYc210dFVOenJIM3h0dFlINkpxak9LSzJRK2VtdjE3NVBxUTM4VCs5bTZTN3lmVThxOEQrQnhoVFJlSEN2alRuV2tBTTkxSlkyUWtiNUFHUFFxV0pxQTc2bmx3K3cvZTlPWUJpcGk0ZDJrdEllT1JPdjFCRmNXK2FnQ2hBM2VzbEVYVUdiY0lHQVJUYzRuaFQxMUJaNjZYWHpURkxGTnlaSVQ1TUxXK3J5Qm1vZFcyVnJFWERSTVpxUkQvMnF5TUw3MlhnUXBHRUxmTm96NzBndm83QmtCenhXcDZlaEFWYWNucGV0WGtONnhKR2RnaUp5aHBKaDdhQ01JZ0RNY3BSVDhxaWFMdkw3R2FOVStabjR1aWxyZ2EzWW9NK2lLc0hIcWo5R3U0bmdycEZIb1dydmxGUVBzUGNweGxqcU9Mc3ZkbW1qYnJlbXNIcmE5K3VTc0dEK29WdXBic09iN0Z4WllVNnNxeFJiZHgwbldPeGtra2l1czR2bncvSzBXQ0pSNXVJNzVYWFQzMTRCcys5RFRuQnhieVJtTkc1d3c1QmdXUFVKaG5ac2wyV1czTjUrM1VyZGlVMExpcXhJQzlmSmh1Zk5sK1dUSnF1MExjU2treFg0ekZBZTVSV1JMVmNQajVUTTFORlJ0UDViYmZrYy9ZYk5OVUlpTG5wVEJMVHNyc3BnQ01aeDJuRmFrTXZKdWNvaWp3YVVNYUtlTDdRUXVlajZLTzIzSkZsUUl0VXVqWXpPL1NZdUUwN2ZidklSTkc4TW5jcG81ZDNsNWxLMGpJam1kdTQ5WTliWDZvMjZZbFpjN1BmSGY5MHZNZG1IbHdaUVR5SEROWDFHbDVrMWo3Y1A0LzVNTkVwNDBRSnpUTTNHTGl2MEpyZkJSNHVBZmYwcUJCTVcwS1U0Vm1xMk9NcWNMTWRURGV2YVBpQ21iWTR3WXlWTDFnWk5uVlJzajRITHBhQXVlYW5xNExjQ3BsWHBSS2lreW1VNllhYzRldStFSW8rMS9ONStzOUZ3aTkwUVAyTnJnQ0tHcFRETERLV0xhUlc2a2JQYW1OM0VabUtSSVFReWRVZWJFUzArWEdxZHFoYmdNU200dUg5aGI3d0FhcU9JVjJDNEtQVXZtSUVMMUFQZkEzNEs1bG1peFYzNkc4MEtMc2JVbzFDbnVyQ3lCUkY3a2NGUys5RXNZWC96UWZmOEIvYmZkUGt5enNwTUk0cWpwbnNYcnJBbzcvMXFkZm5TMFRNM0FhUzJVVHZSOGVMVnVMZWp1d0xsSGRid25VV1haRlZtb3hobmFMTGpqQ2JOZmlaMlFKSkxnaUsyOHFPdWt5bHl4WnlldUpQM0MvcEliUTZURjJ1aFhnYWNLWldGYnZnejNHdndoNWdhR2R0SUNIWmRBUHdQYUN6SXVqYWUxZk1kT0Y5MmQ0UXdXSHZPWDJMS0RKbGoyaTZOamZvaHFzZ2hGdXVHOWhLcmFYTjBvaFYwRU9rR2FMTEx6T012dWhYRTh2VTVkYm9jc1pvRE1sTUlUTnkrVFdpMEpLSUw1RFUrMC9wZDBmMFE0bTZDWFdwOE1IUUkrVjluaG5jd1NES01jb1EvY2h6Vjc5YktjKy92dmc1L1NGd083OTA3UEQ1dS9kVXl2ZXY5RDJqWDBaWmRBZVNSaS92ZjZxODNXT3pKeGlZV2hqS0g5cDZEbUtVZHR3MzVmNFN4cXRiSDdvalNjV0hGcm5XK0Q3bFltMU5rK0htYXlyd2RQUkN2ZlltOE1zbGp4b2ZFYzJNdURYMzJ3L01NK2lsdXZ6ckRad1RjZWx0dXA5dWh0MEdsNDhkK1FuSFcwNVVzanpYYS9ubjJiTnM4M1Q5RUhab3U4bnQ0OHNGT1BzMTc4OTNDYlhiMnNOTFdUR05qcFU0QU1PVHJMaFd5NDVQWHF1VlJxeE9WUVRXU0dOV2h5cjh5QjU0OG9KV1lBUFpYY0RoemNLTzkzKzhCK081Ujh4S3FONWNtb3lrRkNvMXJoWUZZSzJvaEdlelJ0UVZqRzZwOGpuQU9sVXBqK1BxYmNTL25sSUNOV1E0QzdCRWNQMU9iOS9ZbmM2dGE0STNMbkpJVmtiN05tSGRXS2oyd3I5WnpLVGk3NXNYSzFORGU1eGRZNG9wejhyRS9RZW5IL2NzV1hZcUZkbWJjUWpYMkFmaXRwQkVHcEc3ZlBJdXZmQ3JLeFZhdjlZUVltV2tqZzQzcUFMVGZKZHR6S29VeG54RS8zZlJPbS9SaktpN3V6QW5PYWdnU0ZuWG5wYnJJSEMyTE5lV292RmwycFpxcmduLzVLTGtzakVpSU1OaS9JaEVvL1JGWlpnL2F4WURLUy9ZSlV6clU3dGdoOXVEbTdqdHBDRklXYjg5MngySTJ5cXlNU3JlYnI5SXEyUFdzSjJNWHJ3ck5TSWgzUUE1QTIvWlVJSzAxZmJ3dm1ZRUY4cUdxcEJpTEdYcVhTOGV1d1ppTEk3VjlxYVBMaGoyMFVKUDkycVZGNlY0dlVRZFlzMzhsOUJWZ1NuY1lPRzdaVmt0aXRyZmZ2dEIyYjdRSitLR21uTmV2SlVqV2V2aGlCQ3ZVaUdOUGR5R2VBWEx0MEo0ZnBDYzJHa0Y5OVhUVWtHNFYvdHFwS1hIOWVtcEJ4Vm52MnVEWFhwZkU4bXNtbU5XbE9NWTJGK3d5VkRNR1NkQ1llUG1ZbTZUb2RPeUN6blQ1bkRJTkZIUUlpWDRZblU2b1YzcTlVZ3duY3lsT0dhU1pvK1hTYVFtVmp1ekJrM0dhS1FYUnhaeHVnMUp2cy8wdzJENGYxdnh5VVFlR0JaNXZUSUQrNGRjOHNkNFQrM1F2bGZBWEIrYUk3K1V6Yzd6RkErTE9aeGY1S0M4UW0xdmY4eElBZEJvVXpsMU5LUCtSSGRGNGZpcDVsY2FtblkzZDFTMXYxYi90V1BJWWk4UmhMMms1UTVuYVVHZzhUb2ExMmlUbUZtYlVBMFVUV2gwQ1RPbVMrcGlnSGNscERoeDhHYW92U1dqTFhRcjBWSUVvaC96MUtVVHRuM1hlT2c3OURDKzVDU1U2UnJkUGVtVFgvMXNpZHY2RDVnVmFWWnNKVFBuVXpzbFY2dkZVdlhWRXVuVkhJbEVjN1ZYWnBOTGJiS3ZNYkJzYjYva3MzK0xvZVhUVjlJUXNnTU45bDBiMmdKWm5QTnBPTTd1dlo0dVdiWWQ1OVJUT1R3M0pHWHBudnFxaGJYK0cwREtWQ3RnRWwxVUxSUGYzZXJna045UEY2NEVFSFdaUnQzRTI2MjFmUFNIYWoreFNMMkhobHp3ZFQyenF2aC93WmRzQ0VqTm80b3VJTGQ3SWNlMWJSSHdmcFZXQlpoamZaaVpUQXRGTlZNTGc2Z1dNaGhxbVdoSzBSM0Vwb0t0eHl1V3pTMXE1bXJwT3dxOGVWeTNDL0ZSZVJNSUhLZVpLRUkrZVlpdW9tbDJDUG9NRmpYNnE4Qmx2MGNFM1Z1b1FrOEs1eWVNcGROSElJa3MzeGhMQ1NYbGZFOHF2M3granc5UVlwaFM0ekxITmYzenRyRW1NSjA0RzAxMlVzUFg1K3RxdWtYYlYyaEtiVWtSVEk2YytEeERmbE1oeG9zQ0ljL3pnSmhIRlV0ZGp5bHZXQ2twdUw0MmRXRGZwT2x1YXFsWjFoTkJ0TnNMZkJHUnFVSm1JU3Y5WjRGRWVrdmdqV3RzYkdyOFFlNTJJN2k5SmZnUlhnT1F2VjdiSk5hdCtPdHRZL1F3eWt1TndINGpDMWI1WlV2WnA3K3VxMkZrdXJzNG1nT2hkclcvZDlqZ1RRNjdwZ0tEcjhobS9rN285bzdzNTA2eTJDZWVZM1B1TzhGbW5ienZidFlQTGEzL1cvclpGSlo3R2dJTTM2N1h3UFlqZ01wci9FTWc0WG9EbTVHdWwxZ0hzNy9DSVNhYjN6dWdrMDRNYUEwSVZFVXZybTN1cFdEUjhEY0tobHRRTUZ5TmdpRVRJL2duZTYya1RkNmMyZGJrNVdIRHJ4N1pKSXNxY0tZdlN1SlJsSWFpb0J0RndUc29DdjZVb2dUQWRjZ0pMY2dKenlJblBJS2M4S0dVb2k5MHdmU2FSdXdBb28rb3FicVIydWNScGc0L2NqM0JUSmo5S2VaeDRHZmptbUFYNVRtV1lDbFRNTnltendRbHhXbURSOVYrL2lPY0pQWmZtQjZIbCtBR2pZMG80dFJ0MXZjSHU0YkZhbjJ5eitBYlJqTmI4bzFTVGpkR0dxTk94WDRTSVRWcHlDUFhJOHloaVQzQkFpWWUzeklWK0toazVpUkNQbWpUKzNTbGVwK3VCdm5nNURHTFFmRVhBOEVBOW5icm5Yb0FzWHd4ZTcrdUl0QUlmbzM2OFVnM1FtQnErd2pvYmZReCtnUjlpajVEbjZNdndKZmdQZWtyVXZ3YXFTSytWZDdENytEM3pBOGUydmgySXpEOXRlbnhWRDZKQzQ1MTJ4dDhsajVIZlQ5UGZ4cCtvczRIdEFWZHdZektuS3ErUXN6eGV4bzNyR3dMY3JkMlZkUVFOMW1YeDFQY3dDMXU0c1BiekJORUx2MkxhTERkVXRQMm9iUXhLOGF6SG9PNFczaUQzVDQ5ZldlVTJlZlIzZjcveUxGWVptRFFYdmM5SzlsYWdVVUFNZUxlZnhhc0FqQ0hmVmdBWkI2SWRZczUwWHUxM2JxTEY5YjI0STlaRDJzRGJpMTQvejhneTFpeGx0amd2T1VCNUxvQWdCWFl6YWxKZ3NhTXJSMXRYWWRSUmxHSDlSUWRzRSs2eG1SZzh5SWVvOG94UnVNUUJTb1B1TU9NWU1MZHM0eEdDSitIMlNNaTVhYnVzL3dDVlk1dE5BMFhtMHk5eEdNMEp0QU9xMXBnSzBCZEtBZjdES0d2ME1mb3k5Ri9aR2xhbE52bHdubENjaGd0Ukw5bFc2QXI0S04rb1NkZ0l4WHBJSnlGMjdnTzJPL05BbGgxVlhlTk95UGQ5LzNTSUtBL1ZDazM5WTRFUFlpdUhlTUJISnBXa20zUWVKRUxQRVlMMFc5Z2daS2E5ekdIenY4Ykk3REhlLzRZYmhmZTJFOWlvTzlKTTMyM2J1YnNTa1F2aU13K24zUU5KVWU4dE90cnp5NXYyRWE2N0EyeFZaVHM0dTh5MWpqbnU1M05DM2tFYmlFL1pqc2l1bE9qMjBRNjhVNllFaW10eGt1dUMzdkw4WVpMbzJzRkVhZFF4dXZHOWxFMGV0Nitsays3TVFIb04wUFlsc2FYYit2YU4zdHIxeTQyZFZta2ZTYlY1eGkzQmJWMXUxMU05d0QwbE96TFhuWUNSOTB0NHd0K3JpdW9LQTE5eXV3RDJwTEFKd1E3WjN5K2NJbmk4a2c2MThuVVNBVDJPNlZLLzNXQklhMWhUMmV3N0VvRlNyYU1JaitUV0UwKzk0cmFIQUp3RVQ5K1o3cGxYRWpxM3hESDNRRGc1SUdPKzVMOEwyK0ovK2l3enhQTXhnRWlCZ0FJL2l5Wm9IQW1NUDAvZUU1azl5NmlOZTFrNnc3V3o0dWNycVRweHlaM0JlVUp2MlJ5cDNYRlRQWWR5TDdKSXdSNFJranpON2F6WGkyQ0lNRTBwVFhvZFpjN0lTamQrckw0Rkh4R0V5M0FSSFVBeDFWL0xadmlqbDh3V1YybTFmU0NmK3N3YzBXMDZPcWE1bTZTS3p5dFJuaFFWYWdNNk1jaFJna0pNWFlFOFloQjl1bUtvb1RwR1JxTmtLNGZ4NE9XK3UrNENyY0dZcmdUWjV2bUc5VFVqdGZuaXFZWlVXVDZVZzBlRTNoa2lVRzVuQnBnakYxNERYYm8rRFFSYmZwVjEzek1wbElKQ3VjK1ZMSnhHZ2F6eEZ3V0kzWkxuajY1WDUwMHhCMDNvWjBNTDRhU1A2R3ZRWEtidVBNclVxdm1hUWgzVUdaclJVWk5pWW85dFhUUlU3eEdsZFN5cFk0NWJBckxVTE16dEFiNjVpbWRJT2FSRFlwSVVGNUJzSW83S1E2L1V6U3d0STJTZWRTMWs3UW9JWFBTYzBHVEY0dXpXaHhMeHZ3TnhGN2g5cjEyTExZWElkOUZENXNyTy9TMzJiS2VXelpQSnFYL0FNM1FoMXB1ZlN0NzZqaVF2WUVsMW1NMGVNN1RNa3dBQTN0OVNEbTc2WmFYS0xaNTY1dnBPMGl4dmZReUNJMmo1Qk9oVi9rMlBpVjNzUnQ0S3FGbC9tRHVEblV6Nm03VnY3OFJQYjNJMWpQTVhWQ3FWWWlmK0VURkhuVzNyY2hNYjUxZTF1dVZwekwwbGdHVElBVU1hUlVGY0tBRHNJRUUwUUlabUtmeURVbEZaWWNvMmE2LzQzUURDYVhza2NNR09LMnM1S0Z6cVB5aTdzamZKOVM4TlZvamo4b1gxTWp1eWZFRVFJQ1BjV2ltQVdnakxCd2tKcTBPSmppZEhaejJpWTNPWnpzRWtkbnJFTmx5blNOWVlsNXloREtYWWc4ajFicVRDQWhzbkM3eTVLdFFLSnRYbG1JeWhVdThOTExCQlppeXVRT1V5RGJKZEVVbXlEV1pyTDlDZWFhWlloSUg3VVMwdUpYbWViVElpalpCY3JGODAyODZKeWV2N0V5MXhFUU9xc21UdzduS3RkQVVaZXp5VGVEbGt5M1hCR1VaNDNMS3BoN1FISzd4cWVBUWV2dG9jV1JsRXRKbEEwMVJaTXBSS1RWRlhlcnB4VnhGeGI2OG5GN2pzcTdHYmRVMjBCdWVJVkpPd3NmRnE0VFBCSVVTT0xpNEpNclFWejk5ZFpNaGFQQzRXVHNZeWdFblpxczRtcndZS2R4ZXVQbFlLVExKcURTL1Y0bzRoQ28rRHZOUWIvUUkrdkhvcmVmZ01UUE1tNFk1dTA3NVA2SklYaEgvZTEveW53RUEpIGZvcm1hdChcXFwid29mZjJcXFwiKTt1bmljb2RlLXJhbmdlOnUrMDA/Pyx1KzAxMzEsdSswMTUyLTAxNTMsdSswMmJiLTAyYmMsdSswMmM2LHUrMDJkYSx1KzAyZGMsdSsyMDAwLTIwNmYsdSsyMDc0LHUrMjBhYyx1KzIxMjIsdSsyMTkxLHUrMjE5Myx1KzIyMTIsdSsyMjE1LHUrZmVmZix1K2ZmZmR9Ym9keSxodG1se2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjR9aHRtbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItcGFyYWdyYXBoLHB7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNjt0ZXh0LWFsaWduOmp1c3RpZnl9Lm1vbnN0ZXItaDEsaDF7Zm9udC1zaXplOjNyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDIsaDJ7Zm9udC1zaXplOjIuNXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4yO21hcmdpbjo0cmVtIDAgMS41cmVtfS5tb25zdGVyLWgzLGgze2ZvbnQtc2l6ZToycmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI1O21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNCxoNHtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg1LGg1e2ZvbnQtc2l6ZToxLjRyZW07Zm9udC13ZWlnaHQ6Ym9sZGVyO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDYsaDZ7Zm9udC1zaXplOjEuM3JlbTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX1wK2gxe21hcmdpbi10b3A6My43NXJlbX1wK2gye21hcmdpbi10b3A6M3JlbX1wK2gze21hcmdpbi10b3A6Mi4yNXJlbX1wK2g0e21hcmdpbi10b3A6MS41cmVtfXAraDV7bWFyZ2luLXRvcDouNzVyZW19ZGl2K2gxLGRpditoMixkaXYraDMsZGl2K2g0LGRpditoNSxkaXYraDYscCtoNnttYXJnaW4tdG9wOjB9LmRlY297YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xKSAwLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMikgNTAlLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMykgMTAwJSk7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSk7dGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50fTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xKX06OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfWtiZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOi4yNXJlbTtib3JkZXItcmFkaXVzOjEwcmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3BhZGRpbmc6LjI1ZW0gLjZlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9ZGV0YWlsc3ttYXJnaW4tYm90dG9tOjFyZW19c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LWZlYXR1cmUtc2V0dGluZ3M6XFxcInRudW1cXFwiO2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMWVtO3BhZGRpbmc6LjZyZW0gMXJlbX1kZXRhaWxzW29wZW5de3BhZGRpbmc6LjZyZW0gMXJlbSAuNzVyZW19ZGV0YWlsc1tvcGVuXSBzdW1tYXJ5e21hcmdpbi1ib3R0b206LjVyZW07cGFkZGluZzowfS5tb25zdGVyLW5vLXVzZXItc2VsZWN0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX1Aa2V5ZnJhbWVzIGRldGFpbHMtc2hvd3swJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41ZW0pfX1kZXRhaWxzW29wZW5dPjpub3Qoc3VtbWFyeSl7YW5pbWF0aW9uOmRldGFpbHMtc2hvdyAuMTVzIGVhc2UtaW4tb3V0fWRldGFpbHNbb3Blbl0+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5tb25vc3BhY2V7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseS1tb25vc3BhY2UpfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtoZWlnaHQ6MTAwJX1idXR0b257bWluLXdpZHRoOi1tb3otbWF4LWNvbnRlbnQ7bWluLXdpZHRoOm1heC1jb250ZW50O3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWJ1dHRvbl17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6bm93cmFwO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3RyYW5zaXRpb246d2lkdGggMTBzIGVhc2UtaW4tb3V0fWRpdltkYXRhLW1vbnN0ZXItcm9sZT1sYWJlbF17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1zdGF0ZV17YWxpZ24tY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLXNlbGY6c3RyZXRjaDtkaXNwbGF5OmZsZXg7dHJhbnNpdGlvbjp3aWR0aCAxMnMgZWFzZS1pbi1vdXR9W2RhdGEtbW9uc3Rlci1yb2xlPXN0YXRlXT5pbWcsW2RhdGEtbW9uc3Rlci1yb2xlPXN0YXRlXT5zdmd7bWFyZ2luLWxlZnQ6LjNlbX1bZGF0YS1tb25zdGVyLXJvbGU9c3RhdGVdPnN2Zy5zdWNjZXNzZnVse2FuaW1hdGlvbjpib3VuY3kgLjVzIGxpbmVhciBmb3J3YXJkcztjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3NmdWwpfVtkYXRhLW1vbnN0ZXItcm9sZT1zdGF0ZV0+c3ZnLmFjdGl2aXR5e2FuaW1hdGlvbjpib3VuY3kgLjVzIGxpbmVhciBmb3J3YXJkcztjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWFjdGl2aXR5KX1bZGF0YS1tb25zdGVyLXJvbGU9c3RhdGVdPnN2Zy5mYWlsZWR7YW5pbWF0aW9uOmJvdW5jeSAuNXMgbGluZWFyIGZvcndhcmRzO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZmFpbGVkKX1bZGF0YS1tb25zdGVyLXJvbGU9c3RhdGVdPnN2Zy5hY3Rpdml0eXthbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24tbmFtZTphY3Rpdml0eTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDAsLjIsMSl9W2RhdGEtbW9uc3Rlci1yb2xlPXN0YXRlXS5zdGF0ZWxlc3N7ZGlzcGxheTpub25lfUBrZXlmcmFtZXMgYWN0aXZpdHl7MCV7dHJhbnNmb3JtOnNjYWxlKDEpfTUwJXt0cmFuc2Zvcm06c2NhbGUoLjEpfXRve3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBib3VuY3l7MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguMSl9ODAle29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9OTAle3RyYW5zZm9ybTpzY2FsZSguOSl9dG97dHJhbnNmb3JtOnNjYWxlKDEpfX0gXG59YCxcblx0XHQwLFxuXHQpO1xufSBjYXRjaCAoZSkge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRkb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLFxuXHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0ZSArIFwiXCIsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IFN0YXRlLCBnZXRTdGF0ZUluc3RhbmNlRm9yIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVybmFsU3ltYm9sID0gU3ltYm9sKFwiaW50ZXJuYWxTeW1ib2xcIik7XG5cbi8qKlxuICogVGhpcyBTdGF0ZSBjbGFzcyByZXByZXNlbnQgYSBTdGF0ZSB3aXRoIHByZXNlbnRhdGlvblxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuY2xhc3MgU3RhdGUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJlc2VudGF0aW9uXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihzdGF0ZSwgcHJlc2VudGF0aW9uKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IHt9O1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN0YXRlID0gdmFsaWRhdGVTdHJpbmcoc3RhdGUpO1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLnByZXNlbnRhdGlvbiA9IHZhbGlkYXRlU3RyaW5nKHByZXNlbnRhdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IHN0YXRlXG5cdCAqL1xuXHRnZXQgc3RhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN0YXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmVzZW50YXRpb25cblx0ICovXG5cdGdldCBwcmVzZW50YXRpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnByZXNlbnRhdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5UeXBlcy5TdGF0ZX1cblx0ICovXG5cdGdldENsb25lKCkge1xuXHRcdHJldHVybiBuZXcgU3RhdGUoXG5cdFx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5zdGF0ZSxcblx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLnByZXNlbnRhdGlvbixcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogQHNpbmNlIDEuNS4wXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEByZXR1cm4ge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlR5cGVzLlN0YXRlfVxuICovXG5mdW5jdGlvbiBnZXRTdGF0ZUluc3RhbmNlRm9yKHN0YXRlKSB7XG5cdHN3aXRjaCAoc3RhdGUpIHtcblx0XHRjYXNlIFwic3RhdGVsZXNzXCI6XG5cdFx0XHRyZXR1cm4gbmV3IFN0YXRlKFwic3RhdGVsZXNzXCIsIFwiXCIpO1xuXHRcdGNhc2UgXCJzdWNjZXNzZnVsXCI6XG5cdFx0XHRyZXR1cm4gbmV3IFN0YXRlKFxuXHRcdFx0XHRcInN1Y2Nlc3NmdWxcIixcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cInN1Y2Nlc3NmdWxcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+PHBhdGggZD1cIk04IDE1QTcgNyAwIDEgMSA4IDFhNyA3IDAgMCAxIDAgMTR6bTAgMUE4IDggMCAxIDAgOCAwYTggOCAwIDAgMCAwIDE2elwiLz48cGF0aCBkPVwiTTEwLjk3IDQuOTdhLjIzNS4yMzUgMCAwIDAtLjAyLjAyMkw3LjQ3NyA5LjQxNyA1LjM4NCA3LjMyM2EuNzUuNzUgMCAwIDAtMS4wNiAxLjA2TDYuOTcgMTEuMDNhLjc1Ljc1IDAgMCAwIDEuMDc5LS4wMmwzLjk5Mi00Ljk5YS43NS43NSAwIDAgMC0xLjA3MS0xLjA1elwiLz48L3N2Zz4nLFxuXHRcdFx0KTtcblx0XHRjYXNlIFwiYWN0aXZpdHlcIjpcblx0XHRcdHJldHVybiBuZXcgU3RhdGUoXG5cdFx0XHRcdFwiYWN0aXZpdHlcIixcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cImFjdGl2aXR5XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjhcIi8+PC9zdmc+Jyxcblx0XHRcdCk7XG5cdFx0Y2FzZSBcImZhaWxlZFwiOiAvLyBodHRwczovL2ljb25zLmdldGJvb3RzdHJhcC5jb20vaWNvbnMvZXhjbGFtYXRpb24tY2lyY2xlL1xuXHRcdFx0cmV0dXJuIG5ldyBTdGF0ZShcblx0XHRcdFx0XCJmYWlsZWRcIixcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cImZhaWxlZFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj48cGF0aCBkPVwiTTggMTVBNyA3IDAgMSAxIDggMWE3IDcgMCAwIDEgMCAxNHptMCAxQTggOCAwIDEgMCA4IDBhOCA4IDAgMCAwIDAgMTZ6XCIvPjxwYXRoIGQ9XCJNNy4wMDIgMTFhMSAxIDAgMSAxIDIgMCAxIDEgMCAwIDEtMiAwek03LjEgNC45OTVhLjkwNS45MDUgMCAxIDEgMS44IDBsLS4zNSAzLjUwN2EuNTUyLjU1MiAwIDAgMS0xLjEgMEw3LjEgNC45OTV6XCIvPjwvc3ZnPicsXG5cdFx0XHQpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gbmV3IFN0YXRlKHN0YXRlLCBcIlwiKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7IGlzSW50ZWdlciB9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9uLm1qc1wiO1xuaW1wb3J0IHsgU3RhdGVCdXR0b25TdHlsZVNoZWV0IH0gZnJvbSBcIi4vc3R5bGVzaGVldC9zdGF0ZS1idXR0b24ubWpzXCI7XG5pbXBvcnQgeyBnZXRTdGF0ZUluc3RhbmNlRm9yLCBTdGF0ZSB9IGZyb20gXCIuL3R5cGVzL3N0YXRlLm1qc1wiO1xuXG5leHBvcnQgeyBTdGF0ZUJ1dHRvbiB9O1xuXG4vKipcbiAqIEEgc3RhdGUgYnV0dG9uIHdpdGggaWNvbnNcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9mb3JtL3N0YXRlLWJ1dHRvbi9cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3N0YXRlLWJ1dHRvbi1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGJlYXV0aWZ1bCBidXR0b24gd2l0aCBpY29uc1xuICovXG5jbGFzcyBTdGF0ZUJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcblx0XHRcdFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2Zvcm0vc3RhdGUtYnV0dG9uQEBpbnN0YW5jZVwiLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCB0YWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGF0ZXMgQXZhaWxhYmxlIHN0YXR1c1xuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlR5cGVzLlN0YXRlfSBzdGF0ZXMuc3VjY2Vzc2Z1bD0gc3VjY2Vzc2Z1bFxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlR5cGVzLlN0YXRlfSBzdGF0ZXMuYWN0aXZpdHk9IGFjdGl2aXR5XG5cdCAqIEBwcm9wZXJ0eSB7TW9uc3Rlci5Db21wb25lbnRzLkZvcm0uVHlwZXMuU3RhdGV9IHN0YXRlcy5mYWlsZWQ9IGZhaWxlZFxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlR5cGVzLlN0YXRlfSBjdXJyZW50IGN1cnJlbnQgc3RhdHVzXG5cdCAqIEBwcm9wZXJ0eSB7TW9uc3Rlci5Db21wb25lbnRzLkZvcm1+ZXhhbXBsZUFjdGlvbkNhbGxiYWNrfSBhY3Rpb25zLmNsaWNrXG5cdCAqIEBleHRlbmRzIHtCdXR0b259XG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2ljb25zL2Jsb2IvbWFpbi9MSUNFTlNFLm1kfEJvb3RzdHJhcCBpY29ucyBsaWNlbnNlfVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHR9LFxuXHRcdFx0c3RhdGVzOiB7XG5cdFx0XHRcdHN1Y2Nlc3NmdWw6IGdldFN0YXRlSW5zdGFuY2VGb3IoXCJzdWNjZXNzZnVsXCIpLFxuXHRcdFx0XHRhY3Rpdml0eTogZ2V0U3RhdGVJbnN0YW5jZUZvcihcImFjdGl2aXR5XCIpLFxuXHRcdFx0XHRmYWlsZWQ6IGdldFN0YXRlSW5zdGFuY2VGb3IoXCJmYWlsZWRcIiksXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudDogZ2V0U3RhdGVJbnN0YW5jZUZvcihcInN0YXRlbGVzc1wiKSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBidXR0b24uXG5cdCAqIElmIGEgdGltZW91dCBpcyBzZXQsIHRoZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgdGhlXG5cdCAqIHNwZWNpZmllZCB0aW1lLlxuXHQgKlxuXHQgKiBAc2luY2UgMy4xOC4wIGEgcHJldmlvdXNseSBzZXQgdGltZW91dCBpcyBjbGVhcmVkXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5TdGF0ZUJ1dHRvbn1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Vcblx0ICovXG5cdHNldFN0YXRlKHN0YXRlLCB0aW1lb3V0KSB7XG5cdFx0Y29uc3QgdGltZW91dFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJ0aW1lb3V0XCIpO1xuXHRcdGlmICh0aGlzW3RpbWVvdXRTeW1ib2xdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzW3RpbWVvdXRTeW1ib2xdKTtcblx0XHRcdGRlbGV0ZSB0aGlzW3RpbWVvdXRTeW1ib2xdO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9iaiA9IHRoaXMuZ2V0T3B0aW9uKGBzdGF0ZXMuJHt2YWxpZGF0ZVN0cmluZyhzdGF0ZSl9YCk7XG5cdFx0aWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJub3QgZm91bmRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRPcHRpb24oXCJjdXJyZW50XCIsIHZhbGlkYXRlSW5zdGFuY2Uob2JqLCBTdGF0ZSkpO1xuXG5cdFx0aWYgKGlzSW50ZWdlcih0aW1lb3V0KSAmJiB0aW1lb3V0ID4gMCkge1xuXHRcdFx0dGhpc1t0aW1lb3V0U3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnJlbW92ZVN0YXRlKCk7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzW3RpbWVvdXRTeW1ib2xdO1xuXHRcdFx0fSwgdGltZW91dCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkZvcm0uU3RhdGVCdXR0b259XG5cdCAqL1xuXHRyZW1vdmVTdGF0ZSgpIHtcblx0XHR0aGlzLnNldE9wdGlvbihcImN1cnJlbnRcIiwgZ2V0U3RhdGVJbnN0YW5jZUZvcihcInN0YXRlbGVzc1wiKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkZvcm0uVHlwZXMuU3RhdGV8dW5kZWZpbmVkfVxuXHQgKi9cblx0Z2V0U3RhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKFwiY3VycmVudFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItc3RhdGUtYnV0dG9uXCI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7QXJyYXk8Q1NTU3R5bGVTaGVldD59XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRjb25zdCBzdHlsZXMgPSBCdXR0b24uZ2V0Q1NTU3R5bGVTaGVldCgpO1xuXHRcdHN0eWxlcy5wdXNoKFN0YXRlQnV0dG9uU3R5bGVTaGVldCk7XG5cdFx0cmV0dXJuIHN0eWxlcztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHQvLyBsYW5ndWFnZT1IVE1MXG5cdHJldHVybiBgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiPlxuICAgIDxidXR0b24gZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJkaXNhYmxlZCBwYXRoOmRpc2FibGVkIHwgaWY6dHJ1ZSwgY2xhc3MgcGF0aDpjbGFzc2VzLmJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBwYXJ0PVwiYnV0dG9uXCI+XG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJsYWJlbFwiIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpsYWJlbHMuYnV0dG9uXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdGF0ZVwiXG5cdFx0XHQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmN1cnJlbnQuc3RhdGVcIlxuXHRcdFx0IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpjdXJyZW50LnByZXNlbnRhdGlvblwiPjwvZGl2PlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+YDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFN0YXRlQnV0dG9uKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IGNsb25lIH0gZnJvbSBcIi4uL3V0aWwvY2xvbmUubWpzXCI7XG5pbXBvcnQgeyBERUxJTUlURVIsIFBhdGhmaW5kZXIsIFdJTERDQVJEIH0gZnJvbSBcIi4vcGF0aGZpbmRlci5tanNcIjtcblxuZXhwb3J0IHsgYnVpbGRNYXAsIFBBUkVOVCwgYXNzZW1ibGVQYXJ0cyB9O1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFBBUkVOVCA9IFwiXlwiO1xuXG4vKipcbiAqIE1hcHMgY2FuIGJlIGVhc2lseSBjcmVhdGVkIGZyb20gZGF0YSBvYmplY3RzIHdpdGggdGhlIGhlbHAgb2YgdGhlIGZ1bmN0aW9uIGBidWlsZE1hcCgpYC5cbiAqXG4gKiBUaGUgcGF0aCBjYW4gYmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIHNpbXBsZSBkZWZpbml0aW9uIGEuYi5jIG9yIGEgdGVtcGxhdGUgJHthLmIuY30uXG4gKiBLZXkgYW5kIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBkZWZpbml0aW9uIG9yIGEgdGVtcGxhdGUuIFRoZSBrZXkgZG9lcyBub3QgaGF2ZSB0byBiZSBkZWZpbmVkLlxuICogVGhlIHRlbXBsYXRlcyBkZXRlcm1pbmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGtleXMgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFwLiBFaXRoZXIgYSBzaW5nbGUgdmFsdWVcbiAqIGlkIGNhbiBiZSB0YWtlbiBvciBhIGNvbXBvc2l0ZSBrZXkgJHtpZH0gJHtuYW1lfSBjYW4gYmUgdXNlZC5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHZhbHVlcyBvZiB0aGUgcGFyZW50IGRhdGEgc2V0LCB5b3UgaGF2ZSB0byB1c2UgdGhlIF4gY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSwgJHtpZH0gJHteLm5hbWV9LlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kYXRhL2J1aWxkbWFwLm1qc1xuICpcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdCAtIFRoZSBkYXRhIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtYXAgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ3xNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2t9IHNlbGVjdG9yIC0gVGhlIHBhdGggdG8gdGhlIGRhdGEgb2JqZWN0LCBvciBhIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhIG1hcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVUZW1wbGF0ZV0gLSBBIHRlbXBsYXRlIGZvciB0aGUgdmFsdWUgb2YgdGhlIG1hcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5VGVtcGxhdGVdIC0gQSB0ZW1wbGF0ZSBmb3IgdGhlIGtleSBvZiB0aGUgbWFwLlxuICogQHBhcmFtIHtNb25zdGVyLkRhdGF+ZXhhbXBsZUZpbHRlckNhbGxiYWNrfSBbZmlsdGVyXSAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmlsdGVyIG91dCB2YWx1ZXMuXG4gKiBAcmV0dXJuIHsqfSAtIFRoZSBjcmVhdGVkIG1hcC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gLSBJZiB0aGUgdmFsdWUgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgYSBmdW5jdGlvbi5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gLSBJZiB0aGUgc2VsZWN0b3IgY2FsbGJhY2sgZG9lcyBub3QgcmV0dXJuIGEgbWFwLlxuICoqL1xuZnVuY3Rpb24gYnVpbGRNYXAoc3ViamVjdCwgc2VsZWN0b3IsIHZhbHVlVGVtcGxhdGUsIGtleVRlbXBsYXRlLCBmaWx0ZXIpIHtcblx0cmV0dXJuIGFzc2VtYmxlUGFydHMoc3ViamVjdCwgc2VsZWN0b3IsIGZpbHRlciwgZnVuY3Rpb24gKHYsIGssIG0pIHtcblx0XHRrID0gYnVpbGQodiwga2V5VGVtcGxhdGUsIGspO1xuXHRcdHYgPSBidWlsZCh2LCB2YWx1ZVRlbXBsYXRlKTtcblx0XHR0aGlzLnNldChrLCB2KTtcblx0fSk7XG59XG5cbi8qKlxuICogVGhlIGFzc2VtYmxlUGFydHMgZnVuY3Rpb24gaXMgYSBwcml2YXRlIGZ1bmN0aW9uIHRoYXQgaGVscHMgaW4gYnVpbGRpbmcgYSBtYXAgZnJvbSBhIHN1YmplY3Qgb2JqZWN0IGJhc2VkIG9uIGEgcHJvdmlkZWRcbiAqIHNlbGVjdG9yLiBUaGUgc2VsZWN0b3IgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBhIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYVxuICogaGVscGVyIGZ1bmN0aW9uIGJ5IG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB0YWtlcyBmb3VyIHBhcmFtZXRlcnM6XG4gKlxuICogc3ViamVjdDogVGhlIHN1YmplY3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1hcCBpcyB0byBiZSBidWlsdFxuICogc2VsZWN0b3I6IFRoZSBzZWxlY3RvciB0byBkZXRlcm1pbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWFwLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIGZpbHRlciAob3B0aW9uYWwpOiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHZhbHVlcyBiYXNlZCBvbiBzb21lIGNyaXRlcmlhLlxuICogY2FsbGJhY2s6IEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG1hcC5cbiAqIElmIHRoZSBzZWxlY3RvciBwYXJhbWV0ZXIgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiwgaXQgaXMgZXhlY3V0ZWQgcGFzc2luZyB0aGUgc3ViamVjdCBhcyBpdHMgYXJndW1lbnQsXG4gKiBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1hcC4gT3RoZXJ3aXNlLCBpZiB0aGUgc2VsZWN0b3IgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLFxuICogYnVpbGRGbGF0TWFwIGlzIGNhbGxlZCB0byBidWlsZCBhIGZsYXQgbWFwIHdpdGgga2V5cyBhbmQgdmFsdWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBzdWJqZWN0IG9iamVjdCBiYXNlZCBvbiB0aGUgc2VsZWN0b3IuXG4gKlxuICogSWYgdGhlIGZpbHRlciBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGNlcnRhaW4gZWxlbWVudHMgZnJvbSB0aGUgbWFwLCBiYXNlZCBvbiBzb21lXG4gKiBjcml0ZXJpYS4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSB2YWx1ZSwga2V5LCBhbmQgbWFwIG9iamVjdCwgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgc2tpcHBlZC5cbiAqXG4gKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBtYXAsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICogdjogVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50XG4gKiBrOiBUaGUga2V5IG9mIHRoZSBlbGVtZW50XG4gKiBtOiBUaGUgbWFwIG9iamVjdFxuICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgbWFwIHdpdGggdGhlIHByb2Nlc3NlZCB2YWx1ZXMuIElmIG1hcCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgTWFwLCBhbiBlbXB0eSBtYXAgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBFeGFtcGxlIFVzYWdlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IG9iaiA9IHtcbiAqICAgbmFtZTogXCJKb2huXCIsXG4gKiAgIGFnZTogMzAsXG4gKiAgIGFkZHJlc3M6IHtcbiAqICAgICBjaXR5OiBcIk5ldyBZb3JrXCIsXG4gKiAgICAgc3RhdGU6IFwiTllcIixcbiAqICAgICBjb3VudHJ5OiBcIlVTQVwiLFxuICogICB9LFxuICogfTtcbiAqXG4gKiBjb25zdCBzZWxlY3RvciA9IFwiYWRkcmVzc1wiO1xuICpcbiAqIGNvbnN0IG1hcCA9IGFzc2VtYmxlUGFydHMob2JqLCBzZWxlY3RvciwgbnVsbCwgZnVuY3Rpb24gKHYsIGssIG0pIHtcbiAqICAgdGhpcy5zZXQoaywgdik7XG4gKiB9KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtYXApO1xuICogLy8gT3V0cHV0OiBNYXAoMykge1xuICogLy8gICBcImFkZHJlc3MuY2l0eVwiID0+IFwiTmV3IFlvcmtcIixcbiAqIC8vICAgXCJhZGRyZXNzLnN0YXRlXCIgPT4gXCJOWVwiLFxuICogLy8gICBcImFkZHJlc3MuY291bnRyeVwiID0+IFwiVVNBXCJcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBzdWJqZWN0IC0gVGhlIHN1YmplY3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1hcCBpcyB0byBiZSBidWlsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfE1vbnN0ZXIuRGF0YX5leGFtcGxlU2VsZWN0b3JDYWxsYmFja30gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gZGV0ZXJtaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1hcC4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge01vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciB2YWx1ZXMgYmFzZWQgb24gc29tZSBjcml0ZXJpYS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbWFwLlxuICogQHJldHVybiB7TWFwfSAtIEEgbmV3IG1hcCB3aXRoIHRoZSBwcm9jZXNzZWQgdmFsdWVzLlxuICogQHRocm93cyB7VHlwZUVycm9yfSAtIFdoZW4gc2VsZWN0b3IgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgYSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXNzZW1ibGVQYXJ0cyhzdWJqZWN0LCBzZWxlY3RvciwgZmlsdGVyLCBjYWxsYmFjaykge1xuXHRjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG5cblx0bGV0IG1hcDtcblx0aWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG5cdFx0bWFwID0gc2VsZWN0b3Ioc3ViamVjdCk7XG5cdFx0aWYgKCEobWFwIGluc3RhbmNlb2YgTWFwKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInRoZSBzZWxlY3RvciBjYWxsYmFjayBtdXN0IHJldHVybiBhIG1hcFwiKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoaXNTdHJpbmcoc2VsZWN0b3IpKSB7XG5cdFx0bWFwID0gbmV3IE1hcCgpO1xuXHRcdGJ1aWxkRmxhdE1hcC5jYWxsKG1hcCwgc3ViamVjdCwgc2VsZWN0b3IpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJzZWxlY3RvciBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIGZ1bmN0aW9uXCIpO1xuXHR9XG5cblx0aWYgKCEobWFwIGluc3RhbmNlb2YgTWFwKSkge1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRtYXAuZm9yRWFjaCgodiwgaywgbSkgPT4ge1xuXHRcdGlmIChpc0Z1bmN0aW9uKGZpbHRlcikpIHtcblx0XHRcdGlmIChmaWx0ZXIuY2FsbChtLCB2LCBrKSAhPT0gdHJ1ZSkgcmV0dXJuO1xuXHRcdH1cblxuXHRcdGNhbGxiYWNrLmNhbGwocmVzdWx0LCB2LCBrLCBtKTtcblx0fSk7XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHN1YmplY3RcbiAqIEBwYXJhbSBzZWxlY3RvclxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHBhcmVudE1hcFxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gYnVpbGRGbGF0TWFwKHN1YmplY3QsIHNlbGVjdG9yLCBrZXksIHBhcmVudE1hcCkge1xuXHRjb25zdCBjdXJyZW50TWFwID0gbmV3IE1hcCgpO1xuXG5cdGNvbnN0IHJlc3VsdExlbmd0aCA9IHRoaXMuc2l6ZTtcblxuXHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIGtleSA9IFtdO1xuXG5cdGNvbnN0IHBhcnRzID0gc2VsZWN0b3Iuc3BsaXQoREVMSU1JVEVSKTtcblx0bGV0IGN1cnJlbnQgPSBcIlwiO1xuXHRjb25zdCBjdXJyZW50UGF0aCA9IFtdO1xuXHRkbyB7XG5cdFx0Y3VycmVudCA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0Y3VycmVudFBhdGgucHVzaChjdXJyZW50KTtcblxuXHRcdGlmIChjdXJyZW50ID09PSBXSUxEQ0FSRCkge1xuXHRcdFx0Y29uc3QgZmluZGVyID0gbmV3IFBhdGhmaW5kZXIoc3ViamVjdCk7XG5cdFx0XHRsZXQgbWFwO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRtYXAgPSBmaW5kZXIuZ2V0VmlhKGN1cnJlbnRQYXRoLmpvaW4oREVMSU1JVEVSKSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnN0IGEgPSBlO1xuXHRcdFx0XHRtYXAgPSBuZXcgTWFwKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgW2ssIG9dIG9mIG1hcCkge1xuXHRcdFx0XHRjb25zdCBjb3B5S2V5ID0gY2xvbmUoa2V5KTtcblxuXHRcdFx0XHRjdXJyZW50UGF0aC5tYXAoKGEpID0+IHtcblx0XHRcdFx0XHRjb3B5S2V5LnB1c2goYSA9PT0gV0lMRENBUkQgPyBrIDogYSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IGtrID0gY29weUtleS5qb2luKERFTElNSVRFUik7XG5cdFx0XHRcdGNvbnN0IHN1YiA9IGJ1aWxkRmxhdE1hcC5jYWxsKFxuXHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0byxcblx0XHRcdFx0XHRwYXJ0cy5qb2luKERFTElNSVRFUiksXG5cdFx0XHRcdFx0Y29weUtleSxcblx0XHRcdFx0XHRvLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChpc09iamVjdChzdWIpICYmIHBhcmVudE1hcCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c3ViW1BBUkVOVF0gPSBwYXJlbnRNYXA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50TWFwLnNldChraywgc3ViKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gd2hpbGUgKHBhcnRzLmxlbmd0aCA+IDApO1xuXG5cdC8vIG5vIHNldCBpbiBjaGlsZCBydW5cblx0aWYgKHJlc3VsdExlbmd0aCA9PT0gdGhpcy5zaXplKSB7XG5cdFx0Zm9yIChjb25zdCBbaywgb10gb2YgY3VycmVudE1hcCkge1xuXHRcdFx0dGhpcy5zZXQoaywgbyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHN1YmplY3Q7XG59XG5cbi8qKlxuICogV2l0aCB0aGUgaGVscCBvZiB0aGlzIGZpbHRlciBjYWxsYmFjaywgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQuIE9ubHkgaWYgdGhlIGZpbHRlciBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBpcyB0YWtlbiBmb3IgdGhlIG1hcC5cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5EYXRhfmV4YW1wbGVGaWx0ZXJDYWxsYmFja1xuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAgS2V5XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLkRhdGEuYnVpbGRNYXB9XG4gKi9cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZWx5IHRvIGEgc3RyaW5nIHNlbGVjdG9yIGEgY2FsbGJhY2sgY2FuIGJlIHNwZWNpZmllZC4gdGhpcyBtdXN0IHJldHVybiBhIG1hcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtidWlsZE1hcH0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvZGF0YS9idWlsZG1hcC5tanMnO1xuICpcbiAqIGxldCBvYmogPSB7XG4gKiAgICAgICAgICAgICAgICBcImRhdGFcIjogW1xuICogICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ2Fzc2FuZHJhXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDIsIGxhYmVsOiBcIlhTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiA0LCBsYWJlbDogXCJMXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIlllc3NleSFcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLCBwcmljZTogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH07XG4gKlxuICogbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAqICAgICAgICAgICAgICAgIGxldCBtID0gbmV3IE1hcDtcbiAqXG4gKiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBiXSBvZiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmRhdGEpKSB7XG4gKlxuICogICAgICAgICAgICAgICAgICAgIGxldCBrZXkxID0gaTtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaiwgY10gb2YgT2JqZWN0LmVudHJpZXMoYi5lbnJpY2htZW50LnZhcmlhbnRzKSkge1xuICogICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MiA9IGo7XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCBkXSBvZiBPYmplY3QuZW50cmllcyhjLnByaWNlKSkge1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkzID0gaztcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm5hbWUgPSBiLm5hbWU7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmxhYmVsID0gYy5sYWJlbDtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaWQgPSBba2V5MSwga2V5Miwga2V5M10uam9pbignLicpO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0KGQuaWQsIGQpO1xuICogICAgICAgICAgICAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICogICAgICAgICAgICB9XG4gKlxuICogbGV0IG1hcCA9IGJ1aWxkTWFwKG9iaiwgY2FsbGJhY2ssICcke25hbWV9ICR7dmt9JywgJyR7aWR9JylcbiAqXG4gKiAvLyBcdTIxQTYgTWFwKDMpIHtcbiAqIC8vICBcIjAuMC4wXCI6XCJDYXNzYW5kcmEgMTIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjAuMVwiOlwiQ2Fzc2FuZHJhIDEyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4xLjBcIjpcIkNhc3NhbmRyYSAyMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMS4xXCI6XCJDYXNzYW5kcmEgMjIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjIuMFwiOlwiQ2Fzc2FuZHJhIDMyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4yLjFcIjpcIkNhc3NhbmRyYSAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMy4wXCI6XCJDYXNzYW5kcmEgNDIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjMuMVwiOlwiQ2Fzc2FuZHJhIDQyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4wLjBcIjpcIlllc3NleSEgMTIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjAuMVwiOlwiWWVzc2V5ISAxMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMS4wXCI6XCJZZXNzZXkhIDIyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4xLjFcIjpcIlllc3NleSEgMjIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjIuMFwiOlwiWWVzc2V5ISAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMi4xXCI6XCJZZXNzZXkhIDMyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4zLjBcIjpcIlllc3NleSEgNDIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjMuMVwiOlwiWWVzc2V5ISA0Mi4xMiBcdTIwQUNcIlxuICogLy8gfVxuICpcbiAqIEBjYWxsYmFjayBNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdCBzdWJqZWN0XG4gKiBAcmV0dXJuIE1hcFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNy4wXG4gKiBAc2VlIHtAbGluayBNb25zdGVyLkRhdGEuYnVpbGRNYXB9XG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGRlZmluaXRpb25cbiAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBidWlsZChzdWJqZWN0LCBkZWZpbml0aW9uLCBkZWZhdWx0VmFsdWUpIHtcblx0aWYgKGRlZmluaXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZSA/IGRlZmF1bHRWYWx1ZSA6IHN1YmplY3Q7XG5cdHZhbGlkYXRlU3RyaW5nKGRlZmluaXRpb24pO1xuXG5cdGNvbnN0IHJlZ2V4cCA9IC8oPzxwbGFjZWhvbGRlcj5cXCR7KD88cGF0aD5bYS16XFxeQS1aLlxcLV8wLTldKil9KS9nbTtcblx0Y29uc3QgYXJyYXkgPSBbLi4uZGVmaW5pdGlvbi5tYXRjaEFsbChyZWdleHApXTtcblxuXHRjb25zdCBmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihzdWJqZWN0KTtcblxuXHRpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIGZpbmRlci5nZXRWaWEoZGVmaW5pdGlvbik7XG5cdH1cblxuXHRhcnJheS5mb3JFYWNoKChhKSA9PiB7XG5cdFx0Y29uc3QgZ3JvdXBzID0gYT8uW1wiZ3JvdXBzXCJdO1xuXHRcdGNvbnN0IHBsYWNlaG9sZGVyID0gZ3JvdXBzPy5bXCJwbGFjZWhvbGRlclwiXTtcblx0XHRpZiAocGxhY2Vob2xkZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcGF0aCA9IGdyb3Vwcz8uW1wicGF0aFwiXTtcblxuXHRcdGxldCB2ID0gZmluZGVyLmdldFZpYShwYXRoKTtcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB2ID0gZGVmYXVsdFZhbHVlO1xuXG5cdFx0ZGVmaW5pdGlvbiA9IGRlZmluaXRpb24ucmVwbGFjZUFsbChwbGFjZWhvbGRlciwgdik7XG5cdH0pO1xuXG5cdHJldHVybiBkZWZpbml0aW9uO1xufVxuIiwgIi8qKlxuICogQ3VzdG9tIHBvc2l0aW9uaW5nIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3ZpcnR1YWwtZWxlbWVudHNcbiAqL1xuXG5jb25zdCBzaWRlcyA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J107XG5jb25zdCBhbGlnbm1lbnRzID0gWydzdGFydCcsICdlbmQnXTtcbmNvbnN0IHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovc2lkZXMucmVkdWNlKChhY2MsIHNpZGUpID0+IGFjYy5jb25jYXQoc2lkZSwgc2lkZSArIFwiLVwiICsgYWxpZ25tZW50c1swXSwgc2lkZSArIFwiLVwiICsgYWxpZ25tZW50c1sxXSksIFtdKTtcbmNvbnN0IG1pbiA9IE1hdGgubWluO1xuY29uc3QgbWF4ID0gTWF0aC5tYXg7XG5jb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG5jb25zdCBmbG9vciA9IE1hdGguZmxvb3I7XG5jb25zdCBjcmVhdGVDb29yZHMgPSB2ID0+ICh7XG4gIHg6IHYsXG4gIHk6IHZcbn0pO1xuY29uc3Qgb3Bwb3NpdGVTaWRlTWFwID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuY29uc3Qgb3Bwb3NpdGVBbGlnbm1lbnRNYXAgPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gY2xhbXAoc3RhcnQsIHZhbHVlLCBlbmQpIHtcbiAgcmV0dXJuIG1heChzdGFydCwgbWluKHZhbHVlLCBlbmQpKTtcbn1cbmZ1bmN0aW9uIGV2YWx1YXRlKHZhbHVlLCBwYXJhbSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUocGFyYW0pIDogdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRTaWRlKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG5mdW5jdGlvbiBnZXRBeGlzTGVuZ3RoKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbn1cbmZ1bmN0aW9uIGdldFNpZGVBeGlzKHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5jbHVkZXMoZ2V0U2lkZShwbGFjZW1lbnQpKSA/ICd5JyA6ICd4Jztcbn1cbmZ1bmN0aW9uIGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KSB7XG4gIHJldHVybiBnZXRPcHBvc2l0ZUF4aXMoZ2V0U2lkZUF4aXMocGxhY2VtZW50KSk7XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnRTaWRlcyhwbGFjZW1lbnQsIHJlY3RzLCBydGwpIHtcbiAgaWYgKHJ0bCA9PT0gdm9pZCAwKSB7XG4gICAgcnRsID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudEF4aXMgPSBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYWxpZ25tZW50QXhpcyk7XG4gIGxldCBtYWluQWxpZ25tZW50U2lkZSA9IGFsaWdubWVudEF4aXMgPT09ICd4JyA/IGFsaWdubWVudCA9PT0gKHJ0bCA/ICdlbmQnIDogJ3N0YXJ0JykgPyAncmlnaHQnIDogJ2xlZnQnIDogYWxpZ25tZW50ID09PSAnc3RhcnQnID8gJ2JvdHRvbScgOiAndG9wJztcbiAgaWYgKHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdID4gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXSkge1xuICAgIG1haW5BbGlnbm1lbnRTaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpO1xuICB9XG4gIHJldHVybiBbbWFpbkFsaWdubWVudFNpZGUsIGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5BbGlnbm1lbnRTaWRlKV07XG59XG5mdW5jdGlvbiBnZXRFeHBhbmRlZFBsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGNvbnN0IG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBhbGlnbm1lbnQgPT4gb3Bwb3NpdGVBbGlnbm1lbnRNYXBbYWxpZ25tZW50XSk7XG59XG5mdW5jdGlvbiBnZXRTaWRlTGlzdChzaWRlLCBpc1N0YXJ0LCBydGwpIHtcbiAgY29uc3QgbHIgPSBbJ2xlZnQnLCAncmlnaHQnXTtcbiAgY29uc3QgcmwgPSBbJ3JpZ2h0JywgJ2xlZnQnXTtcbiAgY29uc3QgdGIgPSBbJ3RvcCcsICdib3R0b20nXTtcbiAgY29uc3QgYnQgPSBbJ2JvdHRvbScsICd0b3AnXTtcbiAgc3dpdGNoIChzaWRlKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgaWYgKHJ0bCkgcmV0dXJuIGlzU3RhcnQgPyBybCA6IGxyO1xuICAgICAgcmV0dXJuIGlzU3RhcnQgPyBsciA6IHJsO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiBpc1N0YXJ0ID8gdGIgOiBidDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzKHBsYWNlbWVudCwgZmxpcEFsaWdubWVudCwgZGlyZWN0aW9uLCBydGwpIHtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGxldCBsaXN0ID0gZ2V0U2lkZUxpc3QoZ2V0U2lkZShwbGFjZW1lbnQpLCBkaXJlY3Rpb24gPT09ICdzdGFydCcsIHJ0bCk7XG4gIGlmIChhbGlnbm1lbnQpIHtcbiAgICBsaXN0ID0gbGlzdC5tYXAoc2lkZSA9PiBzaWRlICsgXCItXCIgKyBhbGlnbm1lbnQpO1xuICAgIGlmIChmbGlwQWxpZ25tZW50KSB7XG4gICAgICBsaXN0ID0gbGlzdC5jb25jYXQobGlzdC5tYXAoZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgc2lkZSA9PiBvcHBvc2l0ZVNpZGVNYXBbc2lkZV0pO1xufVxuZnVuY3Rpb24gZXhwYW5kUGFkZGluZ09iamVjdChwYWRkaW5nKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIC4uLnBhZGRpbmdcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4gdHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gZXhwYW5kUGFkZGluZ09iamVjdChwYWRkaW5nKSA6IHtcbiAgICB0b3A6IHBhZGRpbmcsXG4gICAgcmlnaHQ6IHBhZGRpbmcsXG4gICAgYm90dG9tOiBwYWRkaW5nLFxuICAgIGxlZnQ6IHBhZGRpbmdcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gcmVjdDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIGxlZnQ6IHgsXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmV4cG9ydCB7IGFsaWdubWVudHMsIGNsYW1wLCBjcmVhdGVDb29yZHMsIGV2YWx1YXRlLCBleHBhbmRQYWRkaW5nT2JqZWN0LCBmbG9vciwgZ2V0QWxpZ25tZW50LCBnZXRBbGlnbm1lbnRBeGlzLCBnZXRBbGlnbm1lbnRTaWRlcywgZ2V0QXhpc0xlbmd0aCwgZ2V0RXhwYW5kZWRQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVBeGlzLCBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZVBsYWNlbWVudCwgZ2V0UGFkZGluZ09iamVjdCwgZ2V0U2lkZSwgZ2V0U2lkZUF4aXMsIG1heCwgbWluLCBwbGFjZW1lbnRzLCByZWN0VG9DbGllbnRSZWN0LCByb3VuZCwgc2lkZXMgfTtcbiIsICJpbXBvcnQgeyBnZXRTaWRlQXhpcywgZ2V0QWxpZ25tZW50QXhpcywgZ2V0QXhpc0xlbmd0aCwgZ2V0U2lkZSwgZ2V0QWxpZ25tZW50LCBldmFsdWF0ZSwgZ2V0UGFkZGluZ09iamVjdCwgcmVjdFRvQ2xpZW50UmVjdCwgbWluLCBjbGFtcCwgcGxhY2VtZW50cywgZ2V0QWxpZ25tZW50U2lkZXMsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50LCBnZXRPcHBvc2l0ZVBsYWNlbWVudCwgZ2V0RXhwYW5kZWRQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzLCBzaWRlcywgbWF4LCBnZXRPcHBvc2l0ZUF4aXMgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuZXhwb3J0IHsgcmVjdFRvQ2xpZW50UmVjdCB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5cbmZ1bmN0aW9uIGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KF9yZWYsIHBsYWNlbWVudCwgcnRsKSB7XG4gIGxldCB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gPSBfcmVmO1xuICBjb25zdCBzaWRlQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudEF4aXMgPSBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWduTGVuZ3RoID0gZ2V0QXhpc0xlbmd0aChhbGlnbm1lbnRBeGlzKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgaXNWZXJ0aWNhbCA9IHNpZGVBeGlzID09PSAneSc7XG4gIGNvbnN0IGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBmbG9hdGluZy53aWR0aCAvIDI7XG4gIGNvbnN0IGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZmxvYXRpbmcuaGVpZ2h0IC8gMjtcbiAgY29uc3QgY29tbW9uQWxpZ24gPSByZWZlcmVuY2VbYWxpZ25MZW5ndGhdIC8gMiAtIGZsb2F0aW5nW2FsaWduTGVuZ3RoXSAvIDI7XG4gIGxldCBjb29yZHM7XG4gIHN3aXRjaCAoc2lkZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZmxvYXRpbmcuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGZsb2F0aW5nLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG4gIHN3aXRjaCAoZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkpIHtcbiAgICBjYXNlICdzdGFydCc6XG4gICAgICBjb29yZHNbYWxpZ25tZW50QXhpc10gLT0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kJzpcbiAgICAgIGNvb3Jkc1thbGlnbm1lbnRBeGlzXSArPSBjb21tb25BbGlnbiAqIChydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMSk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gY29vcmRzO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyB0aGF0IHdpbGwgcGxhY2UgdGhlIGZsb2F0aW5nIGVsZW1lbnRcbiAqIG5leHQgdG8gYSBnaXZlbiByZWZlcmVuY2UgZWxlbWVudC5cbiAqXG4gKiBUaGlzIGV4cG9ydCBkb2VzIG5vdCBoYXZlIGFueSBgcGxhdGZvcm1gIGludGVyZmFjZSBsb2dpYy4gWW91IHdpbGwgbmVlZCB0b1xuICogd3JpdGUgb25lIGZvciB0aGUgcGxhdGZvcm0geW91IGFyZSB1c2luZyBGbG9hdGluZyBVSSB3aXRoLlxuICovXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSBhc3luYyAocmVmZXJlbmNlLCBmbG9hdGluZywgY29uZmlnKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQgPSAnYm90dG9tJyxcbiAgICBzdHJhdGVneSA9ICdhYnNvbHV0ZScsXG4gICAgbWlkZGxld2FyZSA9IFtdLFxuICAgIHBsYXRmb3JtXG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IHZhbGlkTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGZsb2F0aW5nKSk7XG4gIGxldCByZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nLFxuICAgIHN0cmF0ZWd5XG4gIH0pO1xuICBsZXQge1xuICAgIHgsXG4gICAgeVxuICB9ID0gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQocmVjdHMsIHBsYWNlbWVudCwgcnRsKTtcbiAgbGV0IHN0YXRlZnVsUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICBsZXQgbWlkZGxld2FyZURhdGEgPSB7fTtcbiAgbGV0IHJlc2V0Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkTWlkZGxld2FyZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBmblxuICAgIH0gPSB2YWxpZE1pZGRsZXdhcmVbaV07XG4gICAgY29uc3Qge1xuICAgICAgeDogbmV4dFgsXG4gICAgICB5OiBuZXh0WSxcbiAgICAgIGRhdGEsXG4gICAgICByZXNldFxuICAgIH0gPSBhd2FpdCBmbih7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGluaXRpYWxQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgcmVjdHMsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgZmxvYXRpbmdcbiAgICAgIH1cbiAgICB9KTtcbiAgICB4ID0gbmV4dFggIT0gbnVsbCA/IG5leHRYIDogeDtcbiAgICB5ID0gbmV4dFkgIT0gbnVsbCA/IG5leHRZIDogeTtcbiAgICBtaWRkbGV3YXJlRGF0YSA9IHtcbiAgICAgIC4uLm1pZGRsZXdhcmVEYXRhLFxuICAgICAgW25hbWVdOiB7XG4gICAgICAgIC4uLm1pZGRsZXdhcmVEYXRhW25hbWVdLFxuICAgICAgICAuLi5kYXRhXG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAocmVzZXQgJiYgcmVzZXRDb3VudCA8PSA1MCkge1xuICAgICAgcmVzZXRDb3VudCsrO1xuICAgICAgaWYgKHR5cGVvZiByZXNldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHJlc2V0LnBsYWNlbWVudCkge1xuICAgICAgICAgIHN0YXRlZnVsUGxhY2VtZW50ID0gcmVzZXQucGxhY2VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNldC5yZWN0cykge1xuICAgICAgICAgIHJlY3RzID0gcmVzZXQucmVjdHMgPT09IHRydWUgPyBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgZmxvYXRpbmcsXG4gICAgICAgICAgICBzdHJhdGVneVxuICAgICAgICAgIH0pIDogcmVzZXQucmVjdHM7XG4gICAgICAgIH1cbiAgICAgICAgKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBzdGF0ZWZ1bFBsYWNlbWVudCwgcnRsKSk7XG4gICAgICB9XG4gICAgICBpID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgc3RyYXRlZ3ksXG4gICAgbWlkZGxld2FyZURhdGFcbiAgfTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgd2l0aCBhbiBvYmplY3Qgb2Ygb3ZlcmZsb3cgc2lkZSBvZmZzZXRzIHRoYXQgZGV0ZXJtaW5lIGhvdyBtdWNoIHRoZVxuICogZWxlbWVudCBpcyBvdmVyZmxvd2luZyBhIGdpdmVuIGNsaXBwaW5nIGJvdW5kYXJ5IG9uIGVhY2ggc2lkZS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICB2YXIgX2F3YWl0JHBsYXRmb3JtJGlzRWxlO1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgcGxhdGZvcm0sXG4gICAgcmVjdHMsXG4gICAgZWxlbWVudHMsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IHN0YXRlO1xuICBjb25zdCB7XG4gICAgYm91bmRhcnkgPSAnY2xpcHBpbmdBbmNlc3RvcnMnLFxuICAgIHJvb3RCb3VuZGFyeSA9ICd2aWV3cG9ydCcsXG4gICAgZWxlbWVudENvbnRleHQgPSAnZmxvYXRpbmcnLFxuICAgIGFsdEJvdW5kYXJ5ID0gZmFsc2UsXG4gICAgcGFkZGluZyA9IDBcbiAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFBhZGRpbmdPYmplY3QocGFkZGluZyk7XG4gIGNvbnN0IGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/ICdyZWZlcmVuY2UnIDogJ2Zsb2F0aW5nJztcbiAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgY29uc3QgY2xpcHBpbmdDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChhd2FpdCBwbGF0Zm9ybS5nZXRDbGlwcGluZ1JlY3Qoe1xuICAgIGVsZW1lbnQ6ICgoX2F3YWl0JHBsYXRmb3JtJGlzRWxlID0gYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KGVsZW1lbnQpKSkgIT0gbnVsbCA/IF9hd2FpdCRwbGF0Zm9ybSRpc0VsZSA6IHRydWUpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgKGF3YWl0IChwbGF0Zm9ybS5nZXREb2N1bWVudEVsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldERvY3VtZW50RWxlbWVudChlbGVtZW50cy5mbG9hdGluZykpKSxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgc3RyYXRlZ3lcbiAgfSkpO1xuICBjb25zdCByZWN0ID0gZWxlbWVudENvbnRleHQgPT09ICdmbG9hdGluZycgPyB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiByZWN0cy5mbG9hdGluZy53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3RzLmZsb2F0aW5nLmhlaWdodFxuICB9IDogcmVjdHMucmVmZXJlbmNlO1xuICBjb25zdCBvZmZzZXRQYXJlbnQgPSBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgb2Zmc2V0U2NhbGUgPSAoYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KG9mZnNldFBhcmVudCkpKSA/IChhd2FpdCAocGxhdGZvcm0uZ2V0U2NhbGUgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldFNjYWxlKG9mZnNldFBhcmVudCkpKSB8fCB7XG4gICAgeDogMSxcbiAgICB5OiAxXG4gIH0gOiB7XG4gICAgeDogMSxcbiAgICB5OiAxXG4gIH07XG4gIGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCA/IGF3YWl0IHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtcbiAgICBlbGVtZW50cyxcbiAgICByZWN0LFxuICAgIG9mZnNldFBhcmVudCxcbiAgICBzdHJhdGVneVxuICB9KSA6IHJlY3QpO1xuICByZXR1cm4ge1xuICAgIHRvcDogKGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCkgLyBvZmZzZXRTY2FsZS55LFxuICAgIGJvdHRvbTogKGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkgLyBvZmZzZXRTY2FsZS55LFxuICAgIGxlZnQ6IChjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQpIC8gb2Zmc2V0U2NhbGUueCxcbiAgICByaWdodDogKGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCkgLyBvZmZzZXRTY2FsZS54XG4gIH07XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gb3B0aW9ucyA9PiAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBvcHRpb25zLFxuICBhc3luYyBmbihzdGF0ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgcmVjdHMsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgbWlkZGxld2FyZURhdGFcbiAgICB9ID0gc3RhdGU7XG4gICAgLy8gU2luY2UgYGVsZW1lbnRgIGlzIHJlcXVpcmVkLCB3ZSBkb24ndCBQYXJ0aWFsPD4gdGhlIHR5cGUuXG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudCxcbiAgICAgIHBhZGRpbmcgPSAwXG4gICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKSB8fCB7fTtcbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgICBjb25zdCBheGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYXhpcyk7XG4gICAgY29uc3QgYXJyb3dEaW1lbnNpb25zID0gYXdhaXQgcGxhdGZvcm0uZ2V0RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICBjb25zdCBpc1lBeGlzID0gYXhpcyA9PT0gJ3knO1xuICAgIGNvbnN0IG1pblByb3AgPSBpc1lBeGlzID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgY29uc3QgbWF4UHJvcCA9IGlzWUF4aXMgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gICAgY29uc3QgY2xpZW50UHJvcCA9IGlzWUF4aXMgPyAnY2xpZW50SGVpZ2h0JyA6ICdjbGllbnRXaWR0aCc7XG4gICAgY29uc3QgZW5kRGlmZiA9IHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdICsgcmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gY29vcmRzW2F4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXTtcbiAgICBjb25zdCBzdGFydERpZmYgPSBjb29yZHNbYXhpc10gLSByZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gICAgY29uc3QgYXJyb3dPZmZzZXRQYXJlbnQgPSBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkpO1xuICAgIGxldCBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBhcnJvd09mZnNldFBhcmVudFtjbGllbnRQcm9wXSA6IDA7XG5cbiAgICAvLyBET00gcGxhdGZvcm0gY2FuIHJldHVybiBgd2luZG93YCBhcyB0aGUgYG9mZnNldFBhcmVudGAuXG4gICAgaWYgKCFjbGllbnRTaXplIHx8ICEoYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KGFycm93T2Zmc2V0UGFyZW50KSkpKSB7XG4gICAgICBjbGllbnRTaXplID0gZWxlbWVudHMuZmxvYXRpbmdbY2xpZW50UHJvcF0gfHwgcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXTtcbiAgICB9XG4gICAgY29uc3QgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7XG5cbiAgICAvLyBJZiB0aGUgcGFkZGluZyBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBjYXVzZXMgdGhlIGFycm93IHRvIG5vIGxvbmdlciBiZVxuICAgIC8vIGNlbnRlcmVkLCBtb2RpZnkgdGhlIHBhZGRpbmcgc28gdGhhdCBpdCBpcyBjZW50ZXJlZC5cbiAgICBjb25zdCBsYXJnZXN0UG9zc2libGVQYWRkaW5nID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAvIDIgLSAxO1xuICAgIGNvbnN0IG1pblBhZGRpbmcgPSBtaW4ocGFkZGluZ09iamVjdFttaW5Qcm9wXSwgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyk7XG4gICAgY29uc3QgbWF4UGFkZGluZyA9IG1pbihwYWRkaW5nT2JqZWN0W21heFByb3BdLCBsYXJnZXN0UG9zc2libGVQYWRkaW5nKTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgZmxvYXRpbmcgZWxlbWVudCBpZiB0aGUgY2VudGVyXG4gICAgLy8gcG9pbnQgaXMgb3V0c2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGJvdW5kcy5cbiAgICBjb25zdCBtaW4kMSA9IG1pblBhZGRpbmc7XG4gICAgY29uc3QgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC0gbWF4UGFkZGluZztcbiAgICBjb25zdCBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICAgIGNvbnN0IG9mZnNldCA9IGNsYW1wKG1pbiQxLCBjZW50ZXIsIG1heCk7XG5cbiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBhcnJvdydzIHBhZGRpbmcgY2F1c2VzIGl0IHRvXG4gICAgLy8gdG8gcG9pbnQgdG8gbm90aGluZyBmb3IgYW4gYWxpZ25lZCBwbGFjZW1lbnQsIGFkanVzdCB0aGUgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIGZsb2F0aW5nIGVsZW1lbnQgaXRzZWxmLiBUbyBlbnN1cmUgYHNoaWZ0KClgIGNvbnRpbnVlcyB0byB0YWtlIGFjdGlvbixcbiAgICAvLyBhIHNpbmdsZSByZXNldCBpcyBwZXJmb3JtZWQgd2hlbiB0aGlzIGlzIHRydWUuXG4gICAgY29uc3Qgc2hvdWxkQWRkT2Zmc2V0ID0gIW1pZGRsZXdhcmVEYXRhLmFycm93ICYmIGdldEFsaWdubWVudChwbGFjZW1lbnQpICE9IG51bGwgJiYgY2VudGVyICE9PSBvZmZzZXQgJiYgcmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gLyAyIC0gKGNlbnRlciA8IG1pbiQxID8gbWluUGFkZGluZyA6IG1heFBhZGRpbmcpIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyIDwgMDtcbiAgICBjb25zdCBhbGlnbm1lbnRPZmZzZXQgPSBzaG91bGRBZGRPZmZzZXQgPyBjZW50ZXIgPCBtaW4kMSA/IGNlbnRlciAtIG1pbiQxIDogY2VudGVyIC0gbWF4IDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgW2F4aXNdOiBjb29yZHNbYXhpc10gKyBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtheGlzXTogb2Zmc2V0LFxuICAgICAgICBjZW50ZXJPZmZzZXQ6IGNlbnRlciAtIG9mZnNldCAtIGFsaWdubWVudE9mZnNldCxcbiAgICAgICAgLi4uKHNob3VsZEFkZE9mZnNldCAmJiB7XG4gICAgICAgICAgYWxpZ25tZW50T2Zmc2V0XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgcmVzZXQ6IHNob3VsZEFkZE9mZnNldFxuICAgIH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCwgYXV0b0FsaWdubWVudCwgYWxsb3dlZFBsYWNlbWVudHMpIHtcbiAgY29uc3QgYWxsb3dlZFBsYWNlbWVudHNTb3J0ZWRCeUFsaWdubWVudCA9IGFsaWdubWVudCA/IFsuLi5hbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQpLCAuLi5hbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldEFsaWdubWVudChwbGFjZW1lbnQpICE9PSBhbGlnbm1lbnQpXSA6IGFsbG93ZWRQbGFjZW1lbnRzLmZpbHRlcihwbGFjZW1lbnQgPT4gZ2V0U2lkZShwbGFjZW1lbnQpID09PSBwbGFjZW1lbnQpO1xuICByZXR1cm4gYWxsb3dlZFBsYWNlbWVudHNTb3J0ZWRCeUFsaWdubWVudC5maWx0ZXIocGxhY2VtZW50ID0+IHtcbiAgICBpZiAoYWxpZ25tZW50KSB7XG4gICAgICByZXR1cm4gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkgPT09IGFsaWdubWVudCB8fCAoYXV0b0FsaWdubWVudCA/IGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KHBsYWNlbWVudCkgIT09IHBsYWNlbWVudCA6IGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgY2hvb3NpbmcgdGhlIHBsYWNlbWVudFxuICogdGhhdCBoYXMgdGhlIG1vc3Qgc3BhY2UgYXZhaWxhYmxlIGF1dG9tYXRpY2FsbHksIHdpdGhvdXQgbmVlZGluZyB0byBzcGVjaWZ5IGFcbiAqIHByZWZlcnJlZCBwbGFjZW1lbnQuIEFsdGVybmF0aXZlIHRvIGBmbGlwYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2F1dG9QbGFjZW1lbnQnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkYXV0b1AsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDIsIF9wbGFjZW1lbnRzVGhhdEZpdE9uRTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjcm9zc0F4aXMgPSBmYWxzZSxcbiAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMsXG4gICAgICAgIGF1dG9BbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRzJDEgPSBhbGlnbm1lbnQgIT09IHVuZGVmaW5lZCB8fCBhbGxvd2VkUGxhY2VtZW50cyA9PT0gcGxhY2VtZW50cyA/IGdldFBsYWNlbWVudExpc3QoYWxpZ25tZW50IHx8IG51bGwsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSA6IGFsbG93ZWRQbGFjZW1lbnRzO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9ICgoX21pZGRsZXdhcmVEYXRhJGF1dG9QID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUC5pbmRleCkgfHwgMDtcbiAgICAgIGNvbnN0IGN1cnJlbnRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzJDFbY3VycmVudEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50UGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgYWxpZ25tZW50U2lkZXMgPSBnZXRBbGlnbm1lbnRTaWRlcyhjdXJyZW50UGxhY2VtZW50LCByZWN0cywgYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKTtcblxuICAgICAgLy8gTWFrZSBgY29tcHV0ZUNvb3Jkc2Agc3RhcnQgZnJvbSB0aGUgcmlnaHQgcGxhY2UuXG4gICAgICBpZiAocGxhY2VtZW50ICE9PSBjdXJyZW50UGxhY2VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50cyQxWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE92ZXJmbG93cyA9IFtvdmVyZmxvd1tnZXRTaWRlKGN1cnJlbnRQbGFjZW1lbnQpXSwgb3ZlcmZsb3dbYWxpZ25tZW50U2lkZXNbMF1dLCBvdmVyZmxvd1thbGlnbm1lbnRTaWRlc1sxXV1dO1xuICAgICAgY29uc3QgYWxsT3ZlcmZsb3dzID0gWy4uLigoKF9taWRkbGV3YXJlRGF0YSRhdXRvUDIgPSBtaWRkbGV3YXJlRGF0YS5hdXRvUGxhY2VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGF1dG9QMi5vdmVyZmxvd3MpIHx8IFtdKSwge1xuICAgICAgICBwbGFjZW1lbnQ6IGN1cnJlbnRQbGFjZW1lbnQsXG4gICAgICAgIG92ZXJmbG93czogY3VycmVudE92ZXJmbG93c1xuICAgICAgfV07XG4gICAgICBjb25zdCBuZXh0UGxhY2VtZW50ID0gcGxhY2VtZW50cyQxW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAvLyBUaGVyZSBhcmUgbW9yZSBwbGFjZW1lbnRzIHRvIGNoZWNrLlxuICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlID0gYWxsT3ZlcmZsb3dzLm1hcChkID0+IHtcbiAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KGQucGxhY2VtZW50KTtcbiAgICAgICAgcmV0dXJuIFtkLnBsYWNlbWVudCwgYWxpZ25tZW50ICYmIGNyb3NzQXhpcyA/XG4gICAgICAgIC8vIENoZWNrIGFsb25nIHRoZSBtYWluQXhpcyBhbmQgbWFpbiBjcm9zc0F4aXMgc2lkZS5cbiAgICAgICAgZC5vdmVyZmxvd3Muc2xpY2UoMCwgMikucmVkdWNlKChhY2MsIHYpID0+IGFjYyArIHYsIDApIDpcbiAgICAgICAgLy8gQ2hlY2sgb25seSB0aGUgbWFpbkF4aXMuXG4gICAgICAgIGQub3ZlcmZsb3dzWzBdLCBkLm92ZXJmbG93c107XG4gICAgICB9KS5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRzVGhhdEZpdE9uRWFjaFNpZGUgPSBwbGFjZW1lbnRzU29ydGVkQnlNb3N0U3BhY2UuZmlsdGVyKGQgPT4gZFsyXS5zbGljZSgwLFxuICAgICAgLy8gQWxpZ25lZCBwbGFjZW1lbnRzIHNob3VsZCBub3QgY2hlY2sgdGhlaXIgb3Bwb3NpdGUgY3Jvc3NBeGlzXG4gICAgICAvLyBzaWRlLlxuICAgICAgZ2V0QWxpZ25tZW50KGRbMF0pID8gMiA6IDMpLmV2ZXJ5KHYgPT4gdiA8PSAwKSk7XG4gICAgICBjb25zdCByZXNldFBsYWNlbWVudCA9ICgoX3BsYWNlbWVudHNUaGF0Rml0T25FID0gcGxhY2VtZW50c1RoYXRGaXRPbkVhY2hTaWRlWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX3BsYWNlbWVudHNUaGF0Rml0T25FWzBdKSB8fCBwbGFjZW1lbnRzU29ydGVkQnlNb3N0U3BhY2VbMF1bMF07XG4gICAgICBpZiAocmVzZXRQbGFjZW1lbnQgIT09IHBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluZGV4OiBjdXJyZW50SW5kZXggKyAxLFxuICAgICAgICAgICAgb3ZlcmZsb3dzOiBhbGxPdmVyZmxvd3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHJlc2V0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGZsaXBwaW5nIHRoZSBgcGxhY2VtZW50YFxuICogaW4gb3JkZXIgdG8ga2VlcCBpdCBpbiB2aWV3IHdoZW4gdGhlIHByZWZlcnJlZCBwbGFjZW1lbnQocykgd2lsbCBvdmVyZmxvdyB0aGVcbiAqIGNsaXBwaW5nIGJvdW5kYXJ5LiBBbHRlcm5hdGl2ZSB0byBgYXV0b1BsYWNlbWVudGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZmxpcFxuICovXG5jb25zdCBmbGlwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdmbGlwJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGFycm93LCBfbWlkZGxld2FyZURhdGEkZmxpcDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIGluaXRpYWxQbGFjZW1lbnQsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSB0cnVlLFxuICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgICAgZmFsbGJhY2tTdHJhdGVneSA9ICdiZXN0Rml0JyxcbiAgICAgICAgZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiA9ICdub25lJyxcbiAgICAgICAgZmxpcEFsaWdubWVudCA9IHRydWUsXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcblxuICAgICAgLy8gSWYgYSByZXNldCBieSB0aGUgYXJyb3cgd2FzIGNhdXNlZCBkdWUgdG8gYW4gYWxpZ25tZW50IG9mZnNldCBiZWluZ1xuICAgICAgLy8gYWRkZWQsIHdlIHNob3VsZCBza2lwIGFueSBsb2dpYyBub3cgc2luY2UgYGZsaXAoKWAgaGFzIGFscmVhZHkgZG9uZSBpdHNcbiAgICAgIC8vIHdvcmsuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI1NDkjaXNzdWVjb21tZW50LTE3MTk2MDE2NDNcbiAgICAgIGlmICgoX21pZGRsZXdhcmVEYXRhJGFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3cpICE9IG51bGwgJiYgX21pZGRsZXdhcmVEYXRhJGFycm93LmFsaWdubWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaW5pdGlhbFNpZGVBeGlzID0gZ2V0U2lkZUF4aXMoaW5pdGlhbFBsYWNlbWVudCk7XG4gICAgICBjb25zdCBpc0Jhc2VQbGFjZW1lbnQgPSBnZXRTaWRlKGluaXRpYWxQbGFjZW1lbnQpID09PSBpbml0aWFsUGxhY2VtZW50O1xuICAgICAgY29uc3QgcnRsID0gYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpO1xuICAgICAgY29uc3QgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBBbGlnbm1lbnQgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoaW5pdGlhbFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKGluaXRpYWxQbGFjZW1lbnQpKTtcbiAgICAgIGNvbnN0IGhhc0ZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24gPSBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uICE9PSAnbm9uZSc7XG4gICAgICBpZiAoIXNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyAmJiBoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uKSB7XG4gICAgICAgIGZhbGxiYWNrUGxhY2VtZW50cy5wdXNoKC4uLmdldE9wcG9zaXRlQXhpc1BsYWNlbWVudHMoaW5pdGlhbFBsYWNlbWVudCwgZmxpcEFsaWdubWVudCwgZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiwgcnRsKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwbGFjZW1lbnRzID0gW2luaXRpYWxQbGFjZW1lbnQsIC4uLmZhbGxiYWNrUGxhY2VtZW50c107XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzID0gW107XG4gICAgICBsZXQgb3ZlcmZsb3dzRGF0YSA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAgPSBtaWRkbGV3YXJlRGF0YS5mbGlwKSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGZsaXAub3ZlcmZsb3dzKSB8fCBbXTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W3NpZGVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICBjb25zdCBzaWRlcyA9IGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIHJ0bCk7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W3NpZGVzWzBdXSwgb3ZlcmZsb3dbc2lkZXNbMV1dKTtcbiAgICAgIH1cbiAgICAgIG92ZXJmbG93c0RhdGEgPSBbLi4ub3ZlcmZsb3dzRGF0YSwge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG92ZXJmbG93c1xuICAgICAgfV07XG5cbiAgICAgIC8vIE9uZSBvciBtb3JlIHNpZGVzIGlzIG92ZXJmbG93aW5nLlxuICAgICAgaWYgKCFvdmVyZmxvd3MuZXZlcnkoc2lkZSA9PiBzaWRlIDw9IDApKSB7XG4gICAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkZmxpcDIsIF9vdmVyZmxvd3NEYXRhJGZpbHRlcjtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gKCgoX21pZGRsZXdhcmVEYXRhJGZsaXAyID0gbWlkZGxld2FyZURhdGEuZmxpcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRmbGlwMi5pbmRleCkgfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBuZXh0UGxhY2VtZW50ID0gcGxhY2VtZW50c1tuZXh0SW5kZXhdO1xuICAgICAgICBpZiAobmV4dFBsYWNlbWVudCkge1xuICAgICAgICAgIC8vIFRyeSBuZXh0IHBsYWNlbWVudCBhbmQgcmUtcnVuIHRoZSBsaWZlY3ljbGUuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgICAgICAgb3ZlcmZsb3dzOiBvdmVyZmxvd3NEYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0LCBmaW5kIHRoZSBjYW5kaWRhdGVzIHRoYXQgZml0IG9uIHRoZSBtYWluQXhpcyBzaWRlIG9mIG92ZXJmbG93LFxuICAgICAgICAvLyB0aGVuIGZpbmQgdGhlIHBsYWNlbWVudCB0aGF0IGZpdHMgdGhlIGJlc3Qgb24gdGhlIG1haW4gY3Jvc3NBeGlzIHNpZGUuXG4gICAgICAgIGxldCByZXNldFBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIgPSBvdmVyZmxvd3NEYXRhLmZpbHRlcihkID0+IGQub3ZlcmZsb3dzWzBdIDw9IDApLnNvcnQoKGEsIGIpID0+IGEub3ZlcmZsb3dzWzFdIC0gYi5vdmVyZmxvd3NbMV0pWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX292ZXJmbG93c0RhdGEkZmlsdGVyLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBPdGhlcndpc2UgZmFsbGJhY2suXG4gICAgICAgIGlmICghcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICBzd2l0Y2ggKGZhbGxiYWNrU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jlc3RGaXQnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF9vdmVyZmxvd3NEYXRhJGZpbHRlcjI7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gKF9vdmVyZmxvd3NEYXRhJGZpbHRlcjIgPSBvdmVyZmxvd3NEYXRhLmZpbHRlcihkID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaWRlQXhpcyA9IGdldFNpZGVBeGlzKGQucGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTaWRlQXhpcyA9PT0gaW5pdGlhbFNpZGVBeGlzIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJpYXMgdG8gdGhlIGB5YCBzaWRlIGF4aXMgZHVlIHRvIGhvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZGluZyBkaXJlY3Rpb25zIGZhdm9yaW5nIGdyZWF0ZXIgd2lkdGguXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaWRlQXhpcyA9PT0gJ3knO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSkubWFwKGQgPT4gW2QucGxhY2VtZW50LCBkLm92ZXJmbG93cy5maWx0ZXIob3ZlcmZsb3cgPT4gb3ZlcmZsb3cgPiAwKS5yZWR1Y2UoKGFjYywgb3ZlcmZsb3cpID0+IGFjYyArIG92ZXJmbG93LCAwKV0pLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJGZpbHRlcjJbMF07XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgcmVzZXRQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdpbml0aWFsUGxhY2VtZW50JzpcbiAgICAgICAgICAgICAgcmVzZXRQbGFjZW1lbnQgPSBpbml0aWFsUGxhY2VtZW50O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQsXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoXG4gIH07XG59XG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIHNpZGVzLnNvbWUoc2lkZSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBoaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIGFwcGxpY2FibGUgc2l0dWF0aW9ucywgc3VjaCBhc1xuICogd2hlbiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgY2xpcHBpbmcgY29udGV4dCBhcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaGlkZVxuICovXG5jb25zdCBoaWRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdoaWRlJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlY3RzXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0cmF0ZWd5ID0gJ3JlZmVyZW5jZUhpZGRlbicsXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHtcbiAgICAgICAgY2FzZSAncmVmZXJlbmNlSGlkZGVuJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdHMucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VIaWRkZW5PZmZzZXRzOiBvZmZzZXRzLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUhpZGRlbjogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdlc2NhcGVkJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5mbG9hdGluZyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZE9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgZXNjYXBlZDogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdSZWN0KHJlY3RzKSB7XG4gIGNvbnN0IG1pblggPSBtaW4oLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5sZWZ0KSk7XG4gIGNvbnN0IG1pblkgPSBtaW4oLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC50b3ApKTtcbiAgY29uc3QgbWF4WCA9IG1heCguLi5yZWN0cy5tYXAocmVjdCA9PiByZWN0LnJpZ2h0KSk7XG4gIGNvbnN0IG1heFkgPSBtYXgoLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5ib3R0b20pKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBtaW5YLFxuICAgIHk6IG1pblksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pbllcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFJlY3RzQnlMaW5lKHJlY3RzKSB7XG4gIGNvbnN0IHNvcnRlZFJlY3RzID0gcmVjdHMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xuICBjb25zdCBncm91cHMgPSBbXTtcbiAgbGV0IHByZXZSZWN0ID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRSZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHJlY3QgPSBzb3J0ZWRSZWN0c1tpXTtcbiAgICBpZiAoIXByZXZSZWN0IHx8IHJlY3QueSAtIHByZXZSZWN0LnkgPiBwcmV2UmVjdC5oZWlnaHQgLyAyKSB7XG4gICAgICBncm91cHMucHVzaChbcmVjdF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdLnB1c2gocmVjdCk7XG4gICAgfVxuICAgIHByZXZSZWN0ID0gcmVjdDtcbiAgfVxuICByZXR1cm4gZ3JvdXBzLm1hcChyZWN0ID0+IHJlY3RUb0NsaWVudFJlY3QoZ2V0Qm91bmRpbmdSZWN0KHJlY3QpKSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2lubGluZScsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9ID0gc3RhdGU7XG4gICAgICAvLyBBIE1vdXNlRXZlbnQncyBjbGllbnR7WCxZfSBjb29yZHMgY2FuIGJlIHVwIHRvIDIgcGl4ZWxzIG9mZiBhXG4gICAgICAvLyBDbGllbnRSZWN0J3MgYm91bmRzLCBkZXNwaXRlIHRoZSBldmVudCBsaXN0ZW5lciBiZWluZyB0cmlnZ2VyZWQuIEFcbiAgICAgIC8vIHBhZGRpbmcgb2YgMiBzZWVtcyB0byBoYW5kbGUgdGhpcyBpc3N1ZS5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGFkZGluZyA9IDIsXG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBuYXRpdmVDbGllbnRSZWN0cyA9IEFycmF5LmZyb20oKGF3YWl0IChwbGF0Zm9ybS5nZXRDbGllbnRSZWN0cyA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMoZWxlbWVudHMucmVmZXJlbmNlKSkpIHx8IFtdKTtcbiAgICAgIGNvbnN0IGNsaWVudFJlY3RzID0gZ2V0UmVjdHNCeUxpbmUobmF0aXZlQ2xpZW50UmVjdHMpO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZWN0VG9DbGllbnRSZWN0KGdldEJvdW5kaW5nUmVjdChuYXRpdmVDbGllbnRSZWN0cykpO1xuICAgICAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFBhZGRpbmdPYmplY3QocGFkZGluZyk7XG4gICAgICBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcmVjdHMgYW5kIHRoZXkgYXJlIGRpc2pvaW5lZC5cbiAgICAgICAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA9PT0gMiAmJiBjbGllbnRSZWN0c1swXS5sZWZ0ID4gY2xpZW50UmVjdHNbMV0ucmlnaHQgJiYgeCAhPSBudWxsICYmIHkgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHJlY3QgaW4gd2hpY2ggdGhlIHBvaW50IGlzIGZ1bGx5IGluc2lkZS5cbiAgICAgICAgICByZXR1cm4gY2xpZW50UmVjdHMuZmluZChyZWN0ID0+IHggPiByZWN0LmxlZnQgLSBwYWRkaW5nT2JqZWN0LmxlZnQgJiYgeCA8IHJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0ICYmIHkgPiByZWN0LnRvcCAtIHBhZGRpbmdPYmplY3QudG9wICYmIHkgPCByZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tKSB8fCBmYWxsYmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZXJlIGFyZSAyIG9yIG1vcmUgY29ubmVjdGVkIHJlY3RzLlxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBpZiAoZ2V0U2lkZUF4aXMocGxhY2VtZW50KSA9PT0gJ3knKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSBjbGllbnRSZWN0c1swXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZWN0ID0gY2xpZW50UmVjdHNbY2xpZW50UmVjdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpc1RvcCA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ3RvcCc7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSBmaXJzdFJlY3QudG9wO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGlzVG9wID8gZmlyc3RSZWN0LmxlZnQgOiBsYXN0UmVjdC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBpc1RvcCA/IGZpcnN0UmVjdC5yaWdodCA6IGxhc3RSZWN0LnJpZ2h0O1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgIGJvdHRvbSxcbiAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgIHg6IGxlZnQsXG4gICAgICAgICAgICAgIHk6IHRvcFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaXNMZWZ0U2lkZSA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ2xlZnQnO1xuICAgICAgICAgIGNvbnN0IG1heFJpZ2h0ID0gbWF4KC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QucmlnaHQpKTtcbiAgICAgICAgICBjb25zdCBtaW5MZWZ0ID0gbWluKC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcihyZWN0ID0+IGlzTGVmdFNpZGUgPyByZWN0LmxlZnQgPT09IG1pbkxlZnQgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodCk7XG4gICAgICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgICAgICBjb25zdCBib3R0b20gPSBtZWFzdXJlUmVjdHNbbWVhc3VyZVJlY3RzLmxlbmd0aCAtIDFdLmJvdHRvbTtcbiAgICAgICAgICBjb25zdCBsZWZ0ID0gbWluTGVmdDtcbiAgICAgICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYm90dG9tLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNldFJlY3RzID0gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gICAgICAgIH0sXG4gICAgICAgIGZsb2F0aW5nOiBlbGVtZW50cy5mbG9hdGluZyxcbiAgICAgICAgc3RyYXRlZ3lcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlY3RzLnJlZmVyZW5jZS54ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS54IHx8IHJlY3RzLnJlZmVyZW5jZS55ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS55IHx8IHJlY3RzLnJlZmVyZW5jZS53aWR0aCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2Uud2lkdGggfHwgcmVjdHMucmVmZXJlbmNlLmhlaWdodCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiByZXNldFJlY3RzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8vIEZvciB0eXBlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCB0aGUgYE9mZnNldE9wdGlvbnNgIHR5cGUgd2FzIGFsc29cbi8vIERlcml2YWJsZS5cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFZhbHVlVG9Db29yZHMoc3RhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHBsYWNlbWVudCxcbiAgICBwbGF0Zm9ybSxcbiAgICBlbGVtZW50c1xuICB9ID0gc3RhdGU7XG4gIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpID09PSAneSc7XG4gIGNvbnN0IG1haW5BeGlzTXVsdGkgPSBbJ2xlZnQnLCAndG9wJ10uaW5jbHVkZXMoc2lkZSkgPyAtMSA6IDE7XG4gIGNvbnN0IGNyb3NzQXhpc011bHRpID0gcnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDE7XG4gIGNvbnN0IHJhd1ZhbHVlID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgbGV0IHtcbiAgICBtYWluQXhpcyxcbiAgICBjcm9zc0F4aXMsXG4gICAgYWxpZ25tZW50QXhpc1xuICB9ID0gdHlwZW9mIHJhd1ZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogcmF3VmFsdWUsXG4gICAgY3Jvc3NBeGlzOiAwLFxuICAgIGFsaWdubWVudEF4aXM6IG51bGxcbiAgfSA6IHtcbiAgICBtYWluQXhpczogcmF3VmFsdWUubWFpbkF4aXMgfHwgMCxcbiAgICBjcm9zc0F4aXM6IHJhd1ZhbHVlLmNyb3NzQXhpcyB8fCAwLFxuICAgIGFsaWdubWVudEF4aXM6IHJhd1ZhbHVlLmFsaWdubWVudEF4aXNcbiAgfTtcbiAgaWYgKGFsaWdubWVudCAmJiB0eXBlb2YgYWxpZ25tZW50QXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICBjcm9zc0F4aXMgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gYWxpZ25tZW50QXhpcyAqIC0xIDogYWxpZ25tZW50QXhpcztcbiAgfVxuICByZXR1cm4gaXNWZXJ0aWNhbCA/IHtcbiAgICB4OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aSxcbiAgICB5OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGlcbiAgfSA6IHtcbiAgICB4OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGksXG4gICAgeTogY3Jvc3NBeGlzICogY3Jvc3NBeGlzTXVsdGlcbiAgfTtcbn1cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSAwO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ29mZnNldCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJGFycm93O1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCBkaWZmQ29vcmRzID0gYXdhaXQgY29udmVydFZhbHVlVG9Db29yZHMoc3RhdGUsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBJZiB0aGUgcGxhY2VtZW50IGlzIHRoZSBzYW1lIGFuZCB0aGUgYXJyb3cgY2F1c2VkIGFuIGFsaWdubWVudCBvZmZzZXRcbiAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uaW5nIGNvb3JkaW5hdGVzLlxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gKChfbWlkZGxld2FyZURhdGEkb2Zmc2UgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2UucGxhY2VtZW50KSAmJiAoX21pZGRsZXdhcmVEYXRhJGFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3cpICE9IG51bGwgJiYgX21pZGRsZXdhcmVEYXRhJGFycm93LmFsaWdubWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICsgZGlmZkNvb3Jkcy54LFxuICAgICAgICB5OiB5ICsgZGlmZkNvb3Jkcy55LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLi4uZGlmZkNvb3JkcyxcbiAgICAgICAgICBwbGFjZW1lbnRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NoaWZ0JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudFxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSBmYWxzZSxcbiAgICAgICAgbGltaXRlciA9IHtcbiAgICAgICAgICBmbjogX3JlZiA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0U2lkZUF4aXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgIGNvbnN0IG1haW5BeGlzID0gZ2V0T3Bwb3NpdGVBeGlzKGNyb3NzQXhpcyk7XG4gICAgICBsZXQgbWFpbkF4aXNDb29yZCA9IGNvb3Jkc1ttYWluQXhpc107XG4gICAgICBsZXQgY3Jvc3NBeGlzQ29vcmQgPSBjb29yZHNbY3Jvc3NBeGlzXTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IG1pblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBtYWluQXhpc0Nvb3JkICsgb3ZlcmZsb3dbbWluU2lkZV07XG4gICAgICAgIGNvbnN0IG1heCA9IG1haW5BeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgbWFpbkF4aXNDb29yZCA9IGNsYW1wKG1pbiwgbWFpbkF4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gY3Jvc3NBeGlzID09PSAneScgPyAndG9wJyA6ICdsZWZ0JztcbiAgICAgICAgY29uc3QgbWF4U2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBjcm9zc0F4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBjcm9zc0F4aXNDb29yZCAtIG92ZXJmbG93W21heFNpZGVdO1xuICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGNsYW1wKG1pbiwgY3Jvc3NBeGlzQ29vcmQsIG1heCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaW1pdGVkQ29vcmRzID0gbGltaXRlci5mbih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubGltaXRlZENvb3JkcyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHg6IGxpbWl0ZWRDb29yZHMueCAtIHgsXG4gICAgICAgICAgeTogbGltaXRlZENvb3Jkcy55IC0geSxcbiAgICAgICAgICBlbmFibGVkOiB7XG4gICAgICAgICAgICBbbWFpbkF4aXNdOiBjaGVja01haW5BeGlzLFxuICAgICAgICAgICAgW2Nyb3NzQXhpc106IGNoZWNrQ3Jvc3NBeGlzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEJ1aWx0LWluIGBsaW1pdGVyYCB0aGF0IHdpbGwgc3RvcCBgc2hpZnQoKWAgYXQgYSBjZXJ0YWluIHBvaW50LlxuICovXG5jb25zdCBsaW1pdFNoaWZ0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9wdGlvbnMsXG4gICAgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGFcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZVxuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNyb3NzQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE9wcG9zaXRlQXhpcyhjcm9zc0F4aXMpO1xuICAgICAgbGV0IG1haW5BeGlzQ29vcmQgPSBjb29yZHNbbWFpbkF4aXNdO1xuICAgICAgbGV0IGNyb3NzQXhpc0Nvb3JkID0gY29vcmRzW2Nyb3NzQXhpc107XG4gICAgICBjb25zdCByYXdPZmZzZXQgPSBldmFsdWF0ZShvZmZzZXQsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkT2Zmc2V0ID0gdHlwZW9mIHJhd09mZnNldCA9PT0gJ251bWJlcicgPyB7XG4gICAgICAgIG1haW5BeGlzOiByYXdPZmZzZXQsXG4gICAgICAgIGNyb3NzQXhpczogMFxuICAgICAgfSA6IHtcbiAgICAgICAgbWFpbkF4aXM6IDAsXG4gICAgICAgIGNyb3NzQXhpczogMCxcbiAgICAgICAgLi4ucmF3T2Zmc2V0XG4gICAgICB9O1xuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgY29uc3QgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVttYWluQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSAtIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBpZiAobWFpbkF4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKG1haW5BeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNoZWNrQ3Jvc3NBeGlzKSB7XG4gICAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkb2Zmc2UsIF9taWRkbGV3YXJlRGF0YSRvZmZzZTI7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgICAgIGNvbnN0IGlzT3JpZ2luU2lkZSA9IFsndG9wJywgJ2xlZnQnXS5pbmNsdWRlcyhnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgICBjb25zdCBsaW1pdE1pbiA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIChpc09yaWdpblNpZGUgPyAoKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IG1pZGRsZXdhcmVEYXRhLm9mZnNldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRvZmZzZVtjcm9zc0F4aXNdKSB8fCAwIDogMCkgKyAoaXNPcmlnaW5TaWRlID8gMCA6IGNvbXB1dGVkT2Zmc2V0LmNyb3NzQXhpcyk7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF4ID0gcmVjdHMucmVmZXJlbmNlW2Nyb3NzQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSArIChpc09yaWdpblNpZGUgPyAwIDogKChfbWlkZGxld2FyZURhdGEkb2Zmc2UyID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlMltjcm9zc0F4aXNdKSB8fCAwKSAtIChpc09yaWdpblNpZGUgPyBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMgOiAwKTtcbiAgICAgICAgaWYgKGNyb3NzQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgXHUyMDE0XG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzaXplJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX3N0YXRlJG1pZGRsZXdhcmVEYXRhLCBfc3RhdGUkbWlkZGxld2FyZURhdGEyO1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXBwbHkgPSAoKSA9PiB7fSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGlzWUF4aXMgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpID09PSAneSc7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSByZWN0cy5mbG9hdGluZztcbiAgICAgIGxldCBoZWlnaHRTaWRlO1xuICAgICAgbGV0IHdpZHRoU2lkZTtcbiAgICAgIGlmIChzaWRlID09PSAndG9wJyB8fCBzaWRlID09PSAnYm90dG9tJykge1xuICAgICAgICBoZWlnaHRTaWRlID0gc2lkZTtcbiAgICAgICAgd2lkdGhTaWRlID0gYWxpZ25tZW50ID09PSAoKGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSkgPyAnc3RhcnQnIDogJ2VuZCcpID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoU2lkZSA9IHNpZGU7XG4gICAgICAgIGhlaWdodFNpZGUgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heGltdW1DbGlwcGluZ0hlaWdodCA9IGhlaWdodCAtIG92ZXJmbG93LnRvcCAtIG92ZXJmbG93LmJvdHRvbTtcbiAgICAgIGNvbnN0IG1heGltdW1DbGlwcGluZ1dpZHRoID0gd2lkdGggLSBvdmVyZmxvdy5sZWZ0IC0gb3ZlcmZsb3cucmlnaHQ7XG4gICAgICBjb25zdCBvdmVyZmxvd0F2YWlsYWJsZUhlaWdodCA9IG1pbihoZWlnaHQgLSBvdmVyZmxvd1toZWlnaHRTaWRlXSwgbWF4aW11bUNsaXBwaW5nSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG92ZXJmbG93QXZhaWxhYmxlV2lkdGggPSBtaW4od2lkdGggLSBvdmVyZmxvd1t3aWR0aFNpZGVdLCBtYXhpbXVtQ2xpcHBpbmdXaWR0aCk7XG4gICAgICBjb25zdCBub1NoaWZ0ID0gIXN0YXRlLm1pZGRsZXdhcmVEYXRhLnNoaWZ0O1xuICAgICAgbGV0IGF2YWlsYWJsZUhlaWdodCA9IG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0O1xuICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoID0gb3ZlcmZsb3dBdmFpbGFibGVXaWR0aDtcbiAgICAgIGlmICgoX3N0YXRlJG1pZGRsZXdhcmVEYXRhID0gc3RhdGUubWlkZGxld2FyZURhdGEuc2hpZnQpICE9IG51bGwgJiYgX3N0YXRlJG1pZGRsZXdhcmVEYXRhLmVuYWJsZWQueCkge1xuICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1heGltdW1DbGlwcGluZ1dpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKChfc3RhdGUkbWlkZGxld2FyZURhdGEyID0gc3RhdGUubWlkZGxld2FyZURhdGEuc2hpZnQpICE9IG51bGwgJiYgX3N0YXRlJG1pZGRsZXdhcmVEYXRhMi5lbmFibGVkLnkpIHtcbiAgICAgICAgYXZhaWxhYmxlSGVpZ2h0ID0gbWF4aW11bUNsaXBwaW5nSGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKG5vU2hpZnQgJiYgIWFsaWdubWVudCkge1xuICAgICAgICBjb25zdCB4TWluID0gbWF4KG92ZXJmbG93LmxlZnQsIDApO1xuICAgICAgICBjb25zdCB4TWF4ID0gbWF4KG92ZXJmbG93LnJpZ2h0LCAwKTtcbiAgICAgICAgY29uc3QgeU1pbiA9IG1heChvdmVyZmxvdy50b3AsIDApO1xuICAgICAgICBjb25zdCB5TWF4ID0gbWF4KG92ZXJmbG93LmJvdHRvbSwgMCk7XG4gICAgICAgIGlmIChpc1lBeGlzKSB7XG4gICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIDIgKiAoeE1pbiAhPT0gMCB8fCB4TWF4ICE9PSAwID8geE1pbiArIHhNYXggOiBtYXgob3ZlcmZsb3cubGVmdCwgb3ZlcmZsb3cucmlnaHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdmFpbGFibGVIZWlnaHQgPSBoZWlnaHQgLSAyICogKHlNaW4gIT09IDAgfHwgeU1heCAhPT0gMCA/IHlNaW4gKyB5TWF4IDogbWF4KG92ZXJmbG93LnRvcCwgb3ZlcmZsb3cuYm90dG9tKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IGFwcGx5KHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgICBhdmFpbGFibGVIZWlnaHRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dERpbWVuc2lvbnMgPSBhd2FpdCBwbGF0Zm9ybS5nZXREaW1lbnNpb25zKGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICAgIGlmICh3aWR0aCAhPT0gbmV4dERpbWVuc2lvbnMud2lkdGggfHwgaGVpZ2h0ICE9PSBuZXh0RGltZW5zaW9ucy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcmVjdHM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSB9O1xuIiwgImZ1bmN0aW9uIGhhc1dpbmRvdygpIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobm9kZSkge1xuICBpZiAoaXNOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIChub2RlLm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIC8vIE1vY2tlZCBub2RlcyBpbiB0ZXN0aW5nIGVudmlyb25tZW50cyBtYXkgbm90IGJlIGluc3RhbmNlcyBvZiBOb2RlLiBCeVxuICAvLyByZXR1cm5pbmcgYCNkb2N1bWVudGAgYW4gaW5maW5pdGUgbG9vcCB3b24ndCBvY2N1ci5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yMzE3XG4gIHJldHVybiAnI2RvY3VtZW50Jztcbn1cbmZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50O1xuICByZXR1cm4gKG5vZGUgPT0gbnVsbCB8fCAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdztcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChub2RlKSB7XG4gIHZhciBfcmVmO1xuICByZXR1cm4gKF9yZWYgPSAoaXNOb2RlKG5vZGUpID8gbm9kZS5vd25lckRvY3VtZW50IDogbm9kZS5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3JlZi5kb2N1bWVudEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc05vZGUodmFsdWUpIHtcbiAgaWYgKCFoYXNXaW5kb3coKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBOb2RlIHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5Ob2RlO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gIGlmICghaGFzV2luZG93KCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQodmFsdWUpIHtcbiAgaWYgKCFoYXNXaW5kb3coKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuSFRNTEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3QodmFsdWUpIHtcbiAgaWYgKCFoYXNXaW5kb3coKSB8fCB0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2hhZG93Um9vdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuU2hhZG93Um9vdDtcbn1cbmZ1bmN0aW9uIGlzT3ZlcmZsb3dFbGVtZW50KGVsZW1lbnQpIHtcbiAgY29uc3Qge1xuICAgIG92ZXJmbG93LFxuICAgIG92ZXJmbG93WCxcbiAgICBvdmVyZmxvd1ksXG4gICAgZGlzcGxheVxuICB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbnxjbGlwLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKSAmJiAhWydpbmxpbmUnLCAnY29udGVudHMnXS5pbmNsdWRlcyhkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmNsdWRlcyhnZXROb2RlTmFtZShlbGVtZW50KSk7XG59XG5mdW5jdGlvbiBpc1RvcExheWVyKGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsnOnBvcG92ZXItb3BlbicsICc6bW9kYWwnXS5zb21lKHNlbGVjdG9yID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBpc0NvbnRhaW5pbmdCbG9jayhlbGVtZW50T3JDc3MpIHtcbiAgY29uc3Qgd2Via2l0ID0gaXNXZWJLaXQoKTtcbiAgY29uc3QgY3NzID0gaXNFbGVtZW50KGVsZW1lbnRPckNzcykgPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnRPckNzcykgOiBlbGVtZW50T3JDc3M7XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcbiAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10cmFuc2Zvcm1zLTIvI2luZGl2aWR1YWwtdHJhbnNmb3Jtc1xuICByZXR1cm4gWyd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlJywgJ3NjYWxlJywgJ3JvdGF0ZScsICdwZXJzcGVjdGl2ZSddLnNvbWUodmFsdWUgPT4gY3NzW3ZhbHVlXSA/IGNzc1t2YWx1ZV0gIT09ICdub25lJyA6IGZhbHNlKSB8fCAoY3NzLmNvbnRhaW5lclR5cGUgPyBjc3MuY29udGFpbmVyVHlwZSAhPT0gJ25vcm1hbCcgOiBmYWxzZSkgfHwgIXdlYmtpdCAmJiAoY3NzLmJhY2tkcm9wRmlsdGVyID8gY3NzLmJhY2tkcm9wRmlsdGVyICE9PSAnbm9uZScgOiBmYWxzZSkgfHwgIXdlYmtpdCAmJiAoY3NzLmZpbHRlciA/IGNzcy5maWx0ZXIgIT09ICdub25lJyA6IGZhbHNlKSB8fCBbJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUnLCAnc2NhbGUnLCAncm90YXRlJywgJ3BlcnNwZWN0aXZlJywgJ2ZpbHRlciddLnNvbWUodmFsdWUgPT4gKGNzcy53aWxsQ2hhbmdlIHx8ICcnKS5pbmNsdWRlcyh2YWx1ZSkpIHx8IFsncGFpbnQnLCAnbGF5b3V0JywgJ3N0cmljdCcsICdjb250ZW50J10uc29tZSh2YWx1ZSA9PiAoY3NzLmNvbnRhaW4gfHwgJycpLmluY2x1ZGVzKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICBsZXQgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICBpZiAoaXNDb250YWluaW5nQmxvY2soY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIGlmIChpc1RvcExheWVyKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBpc1dlYktpdCgpIHtcbiAgaWYgKHR5cGVvZiBDU1MgPT09ICd1bmRlZmluZWQnIHx8ICFDU1Muc3VwcG9ydHMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIENTUy5zdXBwb3J0cygnLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXInLCAnbm9uZScpO1xufVxuZnVuY3Rpb24gaXNMYXN0VHJhdmVyc2FibGVOb2RlKG5vZGUpIHtcbiAgcmV0dXJuIFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKG5vZGUpKTtcbn1cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59XG5mdW5jdGlvbiBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpIHtcbiAgaWYgKGlzRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsWCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsWVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShub2RlKSB7XG4gIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgLy8gU3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGUuXG4gIG5vZGUuYXNzaWduZWRTbG90IHx8XG4gIC8vIERPTSBFbGVtZW50IGRldGVjdGVkLlxuICBub2RlLnBhcmVudE5vZGUgfHxcbiAgLy8gU2hhZG93Um9vdCBkZXRlY3RlZC5cbiAgaXNTaGFkb3dSb290KG5vZGUpICYmIG5vZGUuaG9zdCB8fFxuICAvLyBGYWxsYmFjay5cbiAgZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpO1xuICByZXR1cm4gaXNTaGFkb3dSb290KHJlc3VsdCkgPyByZXN1bHQuaG9zdCA6IHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUobm9kZSk7XG4gIGlmIChpc0xhc3RUcmF2ZXJzYWJsZU5vZGUocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50ID8gbm9kZS5vd25lckRvY3VtZW50LmJvZHkgOiBub2RlLmJvZHk7XG4gIH1cbiAgaWYgKGlzSFRNTEVsZW1lbnQocGFyZW50Tm9kZSkgJiYgaXNPdmVyZmxvd0VsZW1lbnQocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3IocGFyZW50Tm9kZSk7XG59XG5mdW5jdGlvbiBnZXRPdmVyZmxvd0FuY2VzdG9ycyhub2RlLCBsaXN0LCB0cmF2ZXJzZUlmcmFtZXMpIHtcbiAgdmFyIF9ub2RlJG93bmVyRG9jdW1lbnQyO1xuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG4gIGlmICh0cmF2ZXJzZUlmcmFtZXMgPT09IHZvaWQgMCkge1xuICAgIHRyYXZlcnNlSWZyYW1lcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc2Nyb2xsYWJsZUFuY2VzdG9yID0gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3Iobm9kZSk7XG4gIGNvbnN0IGlzQm9keSA9IHNjcm9sbGFibGVBbmNlc3RvciA9PT0gKChfbm9kZSRvd25lckRvY3VtZW50MiA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQyLmJvZHkpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsYWJsZUFuY2VzdG9yKTtcbiAgaWYgKGlzQm9keSkge1xuICAgIGNvbnN0IGZyYW1lRWxlbWVudCA9IGdldEZyYW1lRWxlbWVudCh3aW4pO1xuICAgIHJldHVybiBsaXN0LmNvbmNhdCh3aW4sIHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNPdmVyZmxvd0VsZW1lbnQoc2Nyb2xsYWJsZUFuY2VzdG9yKSA/IHNjcm9sbGFibGVBbmNlc3RvciA6IFtdLCBmcmFtZUVsZW1lbnQgJiYgdHJhdmVyc2VJZnJhbWVzID8gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZnJhbWVFbGVtZW50KSA6IFtdKTtcbiAgfVxuICByZXR1cm4gbGlzdC5jb25jYXQoc2Nyb2xsYWJsZUFuY2VzdG9yLCBnZXRPdmVyZmxvd0FuY2VzdG9ycyhzY3JvbGxhYmxlQW5jZXN0b3IsIFtdLCB0cmF2ZXJzZUlmcmFtZXMpKTtcbn1cbmZ1bmN0aW9uIGdldEZyYW1lRWxlbWVudCh3aW4pIHtcbiAgcmV0dXJuIHdpbi5wYXJlbnQgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHdpbi5wYXJlbnQpID8gd2luLmZyYW1lRWxlbWVudCA6IG51bGw7XG59XG5cbmV4cG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldENvbnRhaW5pbmdCbG9jaywgZ2V0RG9jdW1lbnRFbGVtZW50LCBnZXRGcmFtZUVsZW1lbnQsIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yLCBnZXROb2RlTmFtZSwgZ2V0Tm9kZVNjcm9sbCwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIGdldFBhcmVudE5vZGUsIGdldFdpbmRvdywgaXNDb250YWluaW5nQmxvY2ssIGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNMYXN0VHJhdmVyc2FibGVOb2RlLCBpc05vZGUsIGlzT3ZlcmZsb3dFbGVtZW50LCBpc1NoYWRvd1Jvb3QsIGlzVGFibGVFbGVtZW50LCBpc1RvcExheWVyLCBpc1dlYktpdCB9O1xuIiwgImltcG9ydCB7IHJlY3RUb0NsaWVudFJlY3QsIGRldGVjdE92ZXJmbG93IGFzIGRldGVjdE92ZXJmbG93JDEsIG9mZnNldCBhcyBvZmZzZXQkMSwgYXV0b1BsYWNlbWVudCBhcyBhdXRvUGxhY2VtZW50JDEsIHNoaWZ0IGFzIHNoaWZ0JDEsIGZsaXAgYXMgZmxpcCQxLCBzaXplIGFzIHNpemUkMSwgaGlkZSBhcyBoaWRlJDEsIGFycm93IGFzIGFycm93JDEsIGlubGluZSBhcyBpbmxpbmUkMSwgbGltaXRTaGlmdCBhcyBsaW1pdFNoaWZ0JDEsIGNvbXB1dGVQb3NpdGlvbiBhcyBjb21wdXRlUG9zaXRpb24kMSB9IGZyb20gJ0BmbG9hdGluZy11aS9jb3JlJztcbmltcG9ydCB7IHJvdW5kLCBjcmVhdGVDb29yZHMsIG1heCwgbWluLCBmbG9vciB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5pbXBvcnQgeyBnZXRDb21wdXRlZFN0eWxlLCBpc0hUTUxFbGVtZW50LCBpc0VsZW1lbnQsIGdldFdpbmRvdywgaXNXZWJLaXQsIGdldEZyYW1lRWxlbWVudCwgZ2V0Tm9kZVNjcm9sbCwgZ2V0RG9jdW1lbnRFbGVtZW50LCBpc1RvcExheWVyLCBnZXROb2RlTmFtZSwgaXNPdmVyZmxvd0VsZW1lbnQsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBnZXRQYXJlbnROb2RlLCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGlzQ29udGFpbmluZ0Jsb2NrLCBpc1RhYmxlRWxlbWVudCwgZ2V0Q29udGFpbmluZ0Jsb2NrIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5leHBvcnQgeyBnZXRPdmVyZmxvd0FuY2VzdG9ycyB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuXG5mdW5jdGlvbiBnZXRDc3NEaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgLy8gSW4gdGVzdGluZyBlbnZpcm9ubWVudHMsIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIGFyZSBlbXB0eVxuICAvLyBzdHJpbmdzIGZvciBTVkcgZWxlbWVudHMsIHJldHVybmluZyBOYU4uIEZhbGxiYWNrIHRvIGAwYCBpbiB0aGlzIGNhc2UuXG4gIGxldCB3aWR0aCA9IHBhcnNlRmxvYXQoY3NzLndpZHRoKSB8fCAwO1xuICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChjc3MuaGVpZ2h0KSB8fCAwO1xuICBjb25zdCBoYXNPZmZzZXQgPSBpc0hUTUxFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBvZmZzZXRXaWR0aCA9IGhhc09mZnNldCA/IGVsZW1lbnQub2Zmc2V0V2lkdGggOiB3aWR0aDtcbiAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gaGFzT2Zmc2V0ID8gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiBoZWlnaHQ7XG4gIGNvbnN0IHNob3VsZEZhbGxiYWNrID0gcm91bmQod2lkdGgpICE9PSBvZmZzZXRXaWR0aCB8fCByb3VuZChoZWlnaHQpICE9PSBvZmZzZXRIZWlnaHQ7XG4gIGlmIChzaG91bGRGYWxsYmFjaykge1xuICAgIHdpZHRoID0gb2Zmc2V0V2lkdGg7XG4gICAgaGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0O1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICQ6IHNob3VsZEZhbGxiYWNrXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVud3JhcEVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gIWlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgOiBlbGVtZW50O1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZShlbGVtZW50KSB7XG4gIGNvbnN0IGRvbUVsZW1lbnQgPSB1bndyYXBFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZG9tRWxlbWVudCkpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29vcmRzKDEpO1xuICB9XG4gIGNvbnN0IHJlY3QgPSBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICRcbiAgfSA9IGdldENzc0RpbWVuc2lvbnMoZG9tRWxlbWVudCk7XG4gIGxldCB4ID0gKCQgPyByb3VuZChyZWN0LndpZHRoKSA6IHJlY3Qud2lkdGgpIC8gd2lkdGg7XG4gIGxldCB5ID0gKCQgPyByb3VuZChyZWN0LmhlaWdodCkgOiByZWN0LmhlaWdodCkgLyBoZWlnaHQ7XG5cbiAgLy8gMCwgTmFOLCBvciBJbmZpbml0eSBzaG91bGQgYWx3YXlzIGZhbGxiYWNrIHRvIDEuXG5cbiAgaWYgKCF4IHx8ICFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB4ID0gMTtcbiAgfVxuICBpZiAoIXkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkge1xuICAgIHkgPSAxO1xuICB9XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmNvbnN0IG5vT2Zmc2V0cyA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb29yZHMoMCk7XG5mdW5jdGlvbiBnZXRWaXN1YWxPZmZzZXRzKGVsZW1lbnQpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBpZiAoIWlzV2ViS2l0KCkgfHwgIXdpbi52aXN1YWxWaWV3cG9ydCkge1xuICAgIHJldHVybiBub09mZnNldHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCxcbiAgICB5OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wXG4gIH07XG59XG5mdW5jdGlvbiBzaG91bGRBZGRWaXN1YWxPZmZzZXRzKGVsZW1lbnQsIGlzRml4ZWQsIGZsb2F0aW5nT2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cbiAgaWYgKCFmbG9hdGluZ09mZnNldFBhcmVudCB8fCBpc0ZpeGVkICYmIGZsb2F0aW5nT2Zmc2V0UGFyZW50ICE9PSBnZXRXaW5kb3coZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzRml4ZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSwgb2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBkb21FbGVtZW50ID0gdW53cmFwRWxlbWVudChlbGVtZW50KTtcbiAgbGV0IHNjYWxlID0gY3JlYXRlQ29vcmRzKDEpO1xuICBpZiAoaW5jbHVkZVNjYWxlKSB7XG4gICAgaWYgKG9mZnNldFBhcmVudCkge1xuICAgICAgaWYgKGlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICAgIHNjYWxlID0gZ2V0U2NhbGUob2Zmc2V0UGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2NhbGUgPSBnZXRTY2FsZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdmlzdWFsT2Zmc2V0cyA9IHNob3VsZEFkZFZpc3VhbE9mZnNldHMoZG9tRWxlbWVudCwgaXNGaXhlZFN0cmF0ZWd5LCBvZmZzZXRQYXJlbnQpID8gZ2V0VmlzdWFsT2Zmc2V0cyhkb21FbGVtZW50KSA6IGNyZWF0ZUNvb3JkcygwKTtcbiAgbGV0IHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgdmlzdWFsT2Zmc2V0cy54KSAvIHNjYWxlLng7XG4gIGxldCB5ID0gKGNsaWVudFJlY3QudG9wICsgdmlzdWFsT2Zmc2V0cy55KSAvIHNjYWxlLnk7XG4gIGxldCB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZS54O1xuICBsZXQgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZS55O1xuICBpZiAoZG9tRWxlbWVudCkge1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhkb21FbGVtZW50KTtcbiAgICBjb25zdCBvZmZzZXRXaW4gPSBvZmZzZXRQYXJlbnQgJiYgaXNFbGVtZW50KG9mZnNldFBhcmVudCkgPyBnZXRXaW5kb3cob2Zmc2V0UGFyZW50KSA6IG9mZnNldFBhcmVudDtcbiAgICBsZXQgY3VycmVudFdpbiA9IHdpbjtcbiAgICBsZXQgY3VycmVudElGcmFtZSA9IGdldEZyYW1lRWxlbWVudChjdXJyZW50V2luKTtcbiAgICB3aGlsZSAoY3VycmVudElGcmFtZSAmJiBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0V2luICE9PSBjdXJyZW50V2luKSB7XG4gICAgICBjb25zdCBpZnJhbWVTY2FsZSA9IGdldFNjYWxlKGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY29uc3QgaWZyYW1lUmVjdCA9IGN1cnJlbnRJRnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY29uc3QgbGVmdCA9IGlmcmFtZVJlY3QubGVmdCArIChjdXJyZW50SUZyYW1lLmNsaWVudExlZnQgKyBwYXJzZUZsb2F0KGNzcy5wYWRkaW5nTGVmdCkpICogaWZyYW1lU2NhbGUueDtcbiAgICAgIGNvbnN0IHRvcCA9IGlmcmFtZVJlY3QudG9wICsgKGN1cnJlbnRJRnJhbWUuY2xpZW50VG9wICsgcGFyc2VGbG9hdChjc3MucGFkZGluZ1RvcCkpICogaWZyYW1lU2NhbGUueTtcbiAgICAgIHggKj0gaWZyYW1lU2NhbGUueDtcbiAgICAgIHkgKj0gaWZyYW1lU2NhbGUueTtcbiAgICAgIHdpZHRoICo9IGlmcmFtZVNjYWxlLng7XG4gICAgICBoZWlnaHQgKj0gaWZyYW1lU2NhbGUueTtcbiAgICAgIHggKz0gbGVmdDtcbiAgICAgIHkgKz0gdG9wO1xuICAgICAgY3VycmVudFdpbiA9IGdldFdpbmRvdyhjdXJyZW50SUZyYW1lKTtcbiAgICAgIGN1cnJlbnRJRnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoY3VycmVudFdpbik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH0pO1xufVxuXG4vLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4vLyBpbmNvcnJlY3QgZm9yIFJUTC5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCwgcmVjdCkge1xuICBjb25zdCBsZWZ0U2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xuICBpZiAoIXJlY3QpIHtcbiAgICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGxlZnRTY3JvbGw7XG4gIH1cbiAgcmV0dXJuIHJlY3QubGVmdCArIGxlZnRTY3JvbGw7XG59XG5cbmZ1bmN0aW9uIGdldEhUTUxPZmZzZXQoZG9jdW1lbnRFbGVtZW50LCBzY3JvbGwsIGlnbm9yZVNjcm9sbGJhclgpIHtcbiAgaWYgKGlnbm9yZVNjcm9sbGJhclggPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVNjcm9sbGJhclggPSBmYWxzZTtcbiAgfVxuICBjb25zdCBodG1sUmVjdCA9IGRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgeCA9IGh0bWxSZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIChpZ25vcmVTY3JvbGxiYXJYID8gMCA6XG4gIC8vIFJUTCA8Ym9keT4gc2Nyb2xsYmFyLlxuICBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCwgaHRtbFJlY3QpKTtcbiAgY29uc3QgeSA9IGh0bWxSZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3A7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBlbGVtZW50cyxcbiAgICByZWN0LFxuICAgIG9mZnNldFBhcmVudCxcbiAgICBzdHJhdGVneVxuICB9ID0gX3JlZjtcbiAgY29uc3QgaXNGaXhlZCA9IHN0cmF0ZWd5ID09PSAnZml4ZWQnO1xuICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgdG9wTGF5ZXIgPSBlbGVtZW50cyA/IGlzVG9wTGF5ZXIoZWxlbWVudHMuZmxvYXRpbmcpIDogZmFsc2U7XG4gIGlmIChvZmZzZXRQYXJlbnQgPT09IGRvY3VtZW50RWxlbWVudCB8fCB0b3BMYXllciAmJiBpc0ZpeGVkKSB7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH1cbiAgbGV0IHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICBsZXQgc2NhbGUgPSBjcmVhdGVDb29yZHMoMSk7XG4gIGNvbnN0IG9mZnNldHMgPSBjcmVhdGVDb29yZHMoMCk7XG4gIGNvbnN0IGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIGNvbnN0IG9mZnNldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcbiAgICAgIHNjYWxlID0gZ2V0U2NhbGUob2Zmc2V0UGFyZW50KTtcbiAgICAgIG9mZnNldHMueCA9IG9mZnNldFJlY3QueCArIG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ID0gb2Zmc2V0UmVjdC55ICsgb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9XG4gIH1cbiAgY29uc3QgaHRtbE9mZnNldCA9IGRvY3VtZW50RWxlbWVudCAmJiAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQgPyBnZXRIVE1MT2Zmc2V0KGRvY3VtZW50RWxlbWVudCwgc2Nyb2xsLCB0cnVlKSA6IGNyZWF0ZUNvb3JkcygwKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCAqIHNjYWxlLngsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCAqIHNjYWxlLnksXG4gICAgeDogcmVjdC54ICogc2NhbGUueCAtIHNjcm9sbC5zY3JvbGxMZWZ0ICogc2NhbGUueCArIG9mZnNldHMueCArIGh0bWxPZmZzZXQueCxcbiAgICB5OiByZWN0LnkgKiBzY2FsZS55IC0gc2Nyb2xsLnNjcm9sbFRvcCAqIHNjYWxlLnkgKyBvZmZzZXRzLnkgKyBodG1sT2Zmc2V0LnlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdHMoZWxlbWVudCkge1xuICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpO1xufVxuXG4vLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlLlxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3Qgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChlbGVtZW50KTtcbiAgY29uc3QgYm9keSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICBjb25zdCB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5LnNjcm9sbFdpZHRoLCBib2R5LmNsaWVudFdpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keS5zY3JvbGxIZWlnaHQsIGJvZHkuY2xpZW50SGVpZ2h0KTtcbiAgbGV0IHggPSAtc2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICBjb25zdCB5ID0gLXNjcm9sbC5zY3JvbGxUb3A7XG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5LmNsaWVudFdpZHRoKSAtIHdpZHRoO1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgbGV0IHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgbGV0IGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdmlzdWFsVmlld3BvcnRCYXNlZCA9IGlzV2ViS2l0KCk7XG4gICAgaWYgKCF2aXN1YWxWaWV3cG9ydEJhc2VkIHx8IHZpc3VhbFZpZXdwb3J0QmFzZWQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbi8vIFJldHVybnMgdGhlIGlubmVyIGNsaWVudCByZWN0LCBzdWJ0cmFjdGluZyBzY3JvbGxiYXJzIGlmIHByZXNlbnQuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHRydWUsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgY29uc3QgdG9wID0gY2xpZW50UmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgY29uc3QgbGVmdCA9IGNsaWVudFJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgY29uc3Qgc2NhbGUgPSBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0U2NhbGUoZWxlbWVudCkgOiBjcmVhdGVDb29yZHMoMSk7XG4gIGNvbnN0IHdpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aCAqIHNjYWxlLng7XG4gIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogc2NhbGUueTtcbiAgY29uc3QgeCA9IGxlZnQgKiBzY2FsZS54O1xuICBjb25zdCB5ID0gdG9wICogc2NhbGUueTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpIHtcbiAgbGV0IHJlY3Q7XG4gIGlmIChjbGlwcGluZ0FuY2VzdG9yID09PSAndmlld3BvcnQnKSB7XG4gICAgcmVjdCA9IGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSk7XG4gIH0gZWxzZSBpZiAoY2xpcHBpbmdBbmNlc3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgIHJlY3QgPSBnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSBlbHNlIGlmIChpc0VsZW1lbnQoY2xpcHBpbmdBbmNlc3RvcikpIHtcbiAgICByZWN0ID0gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZpc3VhbE9mZnNldHMgPSBnZXRWaXN1YWxPZmZzZXRzKGVsZW1lbnQpO1xuICAgIHJlY3QgPSB7XG4gICAgICB4OiBjbGlwcGluZ0FuY2VzdG9yLnggLSB2aXN1YWxPZmZzZXRzLngsXG4gICAgICB5OiBjbGlwcGluZ0FuY2VzdG9yLnkgLSB2aXN1YWxPZmZzZXRzLnksXG4gICAgICB3aWR0aDogY2xpcHBpbmdBbmNlc3Rvci53aWR0aCxcbiAgICAgIGhlaWdodDogY2xpcHBpbmdBbmNlc3Rvci5oZWlnaHRcbiAgICB9O1xuICB9XG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KHJlY3QpO1xufVxuZnVuY3Rpb24gaGFzRml4ZWRQb3NpdGlvbkFuY2VzdG9yKGVsZW1lbnQsIHN0b3BOb2RlKSB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICBpZiAocGFyZW50Tm9kZSA9PT0gc3RvcE5vZGUgfHwgIWlzRWxlbWVudChwYXJlbnROb2RlKSB8fCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUocGFyZW50Tm9kZSkucG9zaXRpb24gPT09ICdmaXhlZCcgfHwgaGFzRml4ZWRQb3NpdGlvbkFuY2VzdG9yKHBhcmVudE5vZGUsIHN0b3BOb2RlKTtcbn1cblxuLy8gQSBcImNsaXBwaW5nIGFuY2VzdG9yXCIgaXMgYW4gYG92ZXJmbG93YCBlbGVtZW50IHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBjaGlsZCBlbGVtZW50cy4gVGhpcyByZXR1cm5zIGFsbCBjbGlwcGluZyBhbmNlc3RvcnNcbi8vIG9mIHRoZSBnaXZlbiBlbGVtZW50IHVwIHRoZSB0cmVlLlxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdFbGVtZW50QW5jZXN0b3JzKGVsZW1lbnQsIGNhY2hlKSB7XG4gIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGNhY2hlLmdldChlbGVtZW50KTtcbiAgaWYgKGNhY2hlZFJlc3VsdCkge1xuICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gIH1cbiAgbGV0IHJlc3VsdCA9IGdldE92ZXJmbG93QW5jZXN0b3JzKGVsZW1lbnQsIFtdLCBmYWxzZSkuZmlsdGVyKGVsID0+IGlzRWxlbWVudChlbCkgJiYgZ2V0Tm9kZU5hbWUoZWwpICE9PSAnYm9keScpO1xuICBsZXQgY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgPSBudWxsO1xuICBjb25zdCBlbGVtZW50SXNGaXhlZCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCc7XG4gIGxldCBjdXJyZW50Tm9kZSA9IGVsZW1lbnRJc0ZpeGVkID8gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcbiAgd2hpbGUgKGlzRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7XG4gICAgY29uc3QgY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgPSBpc0NvbnRhaW5pbmdCbG9jayhjdXJyZW50Tm9kZSk7XG4gICAgaWYgKCFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBjb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICBjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZERyb3BDdXJyZW50Tm9kZSA9IGVsZW1lbnRJc0ZpeGVkID8gIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmICFjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA6ICFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBjb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJyAmJiAhIWN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlICYmIFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmNsdWRlcyhjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZS5wb3NpdGlvbikgfHwgaXNPdmVyZmxvd0VsZW1lbnQoY3VycmVudE5vZGUpICYmICFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IoZWxlbWVudCwgY3VycmVudE5vZGUpO1xuICAgIGlmIChzaG91bGREcm9wQ3VycmVudE5vZGUpIHtcbiAgICAgIC8vIERyb3Agbm9uLWNvbnRhaW5pbmcgYmxvY2tzLlxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihhbmNlc3RvciA9PiBhbmNlc3RvciAhPT0gY3VycmVudE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWNvcmQgbGFzdCBjb250YWluaW5nIGJsb2NrIGZvciBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgIGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKTtcbiAgfVxuICBjYWNoZS5zZXQoZWxlbWVudCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgYW5jZXN0b3JzLlxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBlbGVtZW50LFxuICAgIGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeSxcbiAgICBzdHJhdGVneVxuICB9ID0gX3JlZjtcbiAgY29uc3QgZWxlbWVudENsaXBwaW5nQW5jZXN0b3JzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ0FuY2VzdG9ycycgPyBpc1RvcExheWVyKGVsZW1lbnQpID8gW10gOiBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnMoZWxlbWVudCwgdGhpcy5fYykgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICBjb25zdCBjbGlwcGluZ0FuY2VzdG9ycyA9IFsuLi5lbGVtZW50Q2xpcHBpbmdBbmNlc3RvcnMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdBbmNlc3RvciA9IGNsaXBwaW5nQW5jZXN0b3JzWzBdO1xuICBjb25zdCBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ0FuY2VzdG9ycy5yZWR1Y2UoKGFjY1JlY3QsIGNsaXBwaW5nQW5jZXN0b3IpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgZmlyc3RDbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSkpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdCxcbiAgICBoZWlnaHQ6IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wLFxuICAgIHg6IGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIHk6IGNsaXBwaW5nUmVjdC50b3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbGVtZW50KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IGdldENzc0RpbWVuc2lvbnMoZWxlbWVudCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGVsZW1lbnQsIG9mZnNldFBhcmVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCBpc0ZpeGVkID0gc3RyYXRlZ3kgPT09ICdmaXhlZCc7XG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgdHJ1ZSwgaXNGaXhlZCwgb2Zmc2V0UGFyZW50KTtcbiAgbGV0IHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICBjb25zdCBvZmZzZXRzID0gY3JlYXRlQ29vcmRzKDApO1xuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUsIGlzRml4ZWQsIG9mZnNldFBhcmVudCk7XG4gICAgICBvZmZzZXRzLnggPSBvZmZzZXRSZWN0LnggKyBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSA9IG9mZnNldFJlY3QueSArIG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIC8vIElmIHRoZSA8Ym9keT4gc2Nyb2xsYmFyIGFwcGVhcnMgb24gdGhlIGxlZnQgKGUuZy4gUlRMIHN5c3RlbXMpLiBVc2VcbiAgICAgIC8vIEZpcmVmb3ggd2l0aCBsYXlvdXQuc2Nyb2xsYmFyLnNpZGUgPSAzIGluIGFib3V0OmNvbmZpZyB0byB0ZXN0IHRoaXMuXG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGh0bWxPZmZzZXQgPSBkb2N1bWVudEVsZW1lbnQgJiYgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkID8gZ2V0SFRNTE9mZnNldChkb2N1bWVudEVsZW1lbnQsIHNjcm9sbCkgOiBjcmVhdGVDb29yZHMoMCk7XG4gIGNvbnN0IHggPSByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCAtIGh0bWxPZmZzZXQueDtcbiAgY29uc3QgeSA9IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSAtIGh0bWxPZmZzZXQueTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1N0YXRpY1Bvc2l0aW9uZWQoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYyc7XG59XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCwgcG9seWZpbGwpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocG9seWZpbGwpIHtcbiAgICByZXR1cm4gcG9seWZpbGwoZWxlbWVudCk7XG4gIH1cbiAgbGV0IHJhd09mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuXG4gIC8vIEZpcmVmb3ggcmV0dXJucyB0aGUgPGh0bWw+IGVsZW1lbnQgYXMgdGhlIG9mZnNldFBhcmVudCBpZiBpdCdzIG5vbi1zdGF0aWMsXG4gIC8vIHdoaWxlIENocm9tZSBhbmQgU2FmYXJpIHJldHVybiB0aGUgPGJvZHk+IGVsZW1lbnQuIFRoZSA8Ym9keT4gZWxlbWVudCBtdXN0XG4gIC8vIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBjYWxjdWxhdGlvbnMgZXZlbiBpZiB0aGUgPGh0bWw+IGVsZW1lbnQgaXNcbiAgLy8gbm9uLXN0YXRpYy5cbiAgaWYgKGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSA9PT0gcmF3T2Zmc2V0UGFyZW50KSB7XG4gICAgcmF3T2Zmc2V0UGFyZW50ID0gcmF3T2Zmc2V0UGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuICByZXR1cm4gcmF3T2Zmc2V0UGFyZW50O1xufVxuXG4vLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgaWYgKGlzVG9wTGF5ZXIoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gd2luO1xuICB9XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIGxldCBzdmdPZmZzZXRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgIHdoaWxlIChzdmdPZmZzZXRQYXJlbnQgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShzdmdPZmZzZXRQYXJlbnQpKSB7XG4gICAgICBpZiAoaXNFbGVtZW50KHN2Z09mZnNldFBhcmVudCkgJiYgIWlzU3RhdGljUG9zaXRpb25lZChzdmdPZmZzZXRQYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBzdmdPZmZzZXRQYXJlbnQ7XG4gICAgICB9XG4gICAgICBzdmdPZmZzZXRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKHN2Z09mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiB3aW47XG4gIH1cbiAgbGV0IG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCwgcG9seWZpbGwpO1xuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNTdGF0aWNQb3NpdGlvbmVkKG9mZnNldFBhcmVudCkpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCwgcG9seWZpbGwpO1xuICB9XG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgaXNMYXN0VHJhdmVyc2FibGVOb2RlKG9mZnNldFBhcmVudCkgJiYgaXNTdGF0aWNQb3NpdGlvbmVkKG9mZnNldFBhcmVudCkgJiYgIWlzQ29udGFpbmluZ0Jsb2NrKG9mZnNldFBhcmVudCkpIHtcbiAgICByZXR1cm4gd2luO1xuICB9XG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbjtcbn1cblxuY29uc3QgZ2V0RWxlbWVudFJlY3RzID0gYXN5bmMgZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgZ2V0T2Zmc2V0UGFyZW50Rm4gPSB0aGlzLmdldE9mZnNldFBhcmVudCB8fCBnZXRPZmZzZXRQYXJlbnQ7XG4gIGNvbnN0IGdldERpbWVuc2lvbnNGbiA9IHRoaXMuZ2V0RGltZW5zaW9ucztcbiAgY29uc3QgZmxvYXRpbmdEaW1lbnNpb25zID0gYXdhaXQgZ2V0RGltZW5zaW9uc0ZuKGRhdGEuZmxvYXRpbmcpO1xuICByZXR1cm4ge1xuICAgIHJlZmVyZW5jZTogZ2V0UmVjdFJlbGF0aXZlVG9PZmZzZXRQYXJlbnQoZGF0YS5yZWZlcmVuY2UsIGF3YWl0IGdldE9mZnNldFBhcmVudEZuKGRhdGEuZmxvYXRpbmcpLCBkYXRhLnN0cmF0ZWd5KSxcbiAgICBmbG9hdGluZzoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICB3aWR0aDogZmxvYXRpbmdEaW1lbnNpb25zLndpZHRoLFxuICAgICAgaGVpZ2h0OiBmbG9hdGluZ0RpbWVuc2lvbnMuaGVpZ2h0XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gaXNSVEwoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnO1xufVxuXG5jb25zdCBwbGF0Zm9ybSA9IHtcbiAgY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QsXG4gIGdldERvY3VtZW50RWxlbWVudCxcbiAgZ2V0Q2xpcHBpbmdSZWN0LFxuICBnZXRPZmZzZXRQYXJlbnQsXG4gIGdldEVsZW1lbnRSZWN0cyxcbiAgZ2V0Q2xpZW50UmVjdHMsXG4gIGdldERpbWVuc2lvbnMsXG4gIGdldFNjYWxlLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMXG59O1xuXG5mdW5jdGlvbiByZWN0c0FyZUVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEueCA9PT0gYi54ICYmIGEueSA9PT0gYi55ICYmIGEud2lkdGggPT09IGIud2lkdGggJiYgYS5oZWlnaHQgPT09IGIuaGVpZ2h0O1xufVxuXG4vLyBodHRwczovL3NhbXRob3IuYXUvMjAyMS9vYnNlcnZpbmctZG9tL1xuZnVuY3Rpb24gb2JzZXJ2ZU1vdmUoZWxlbWVudCwgb25Nb3ZlKSB7XG4gIGxldCBpbyA9IG51bGw7XG4gIGxldCB0aW1lb3V0SWQ7XG4gIGNvbnN0IHJvb3QgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgdmFyIF9pbztcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAoX2lvID0gaW8pID09IG51bGwgfHwgX2lvLmRpc2Nvbm5lY3QoKTtcbiAgICBpbyA9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gcmVmcmVzaChza2lwLCB0aHJlc2hvbGQpIHtcbiAgICBpZiAoc2tpcCA9PT0gdm9pZCAwKSB7XG4gICAgICBza2lwID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aHJlc2hvbGQgPT09IHZvaWQgMCkge1xuICAgICAgdGhyZXNob2xkID0gMTtcbiAgICB9XG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IGVsZW1lbnRSZWN0Rm9yUm9vdE1hcmdpbiA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGVsZW1lbnRSZWN0Rm9yUm9vdE1hcmdpbjtcbiAgICBpZiAoIXNraXApIHtcbiAgICAgIG9uTW92ZSgpO1xuICAgIH1cbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zZXRUb3AgPSBmbG9vcih0b3ApO1xuICAgIGNvbnN0IGluc2V0UmlnaHQgPSBmbG9vcihyb290LmNsaWVudFdpZHRoIC0gKGxlZnQgKyB3aWR0aCkpO1xuICAgIGNvbnN0IGluc2V0Qm90dG9tID0gZmxvb3Iocm9vdC5jbGllbnRIZWlnaHQgLSAodG9wICsgaGVpZ2h0KSk7XG4gICAgY29uc3QgaW5zZXRMZWZ0ID0gZmxvb3IobGVmdCk7XG4gICAgY29uc3Qgcm9vdE1hcmdpbiA9IC1pbnNldFRvcCArIFwicHggXCIgKyAtaW5zZXRSaWdodCArIFwicHggXCIgKyAtaW5zZXRCb3R0b20gKyBcInB4IFwiICsgLWluc2V0TGVmdCArIFwicHhcIjtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbixcbiAgICAgIHRocmVzaG9sZDogbWF4KDAsIG1pbigxLCB0aHJlc2hvbGQpKSB8fCAxXG4gICAgfTtcbiAgICBsZXQgaXNGaXJzdFVwZGF0ZSA9IHRydWU7XG4gICAgZnVuY3Rpb24gaGFuZGxlT2JzZXJ2ZShlbnRyaWVzKSB7XG4gICAgICBjb25zdCByYXRpbyA9IGVudHJpZXNbMF0uaW50ZXJzZWN0aW9uUmF0aW87XG4gICAgICBpZiAocmF0aW8gIT09IHRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIWlzRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmF0aW8pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIGNsaXBwZWQsIHRoZSByYXRpbyBpcyAwLiBUaHJvdHRsZSB0aGUgcmVmcmVzaFxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiB1cGRhdGVzLlxuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaChmYWxzZSwgMWUtNyk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmcmVzaChmYWxzZSwgcmF0aW8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmF0aW8gPT09IDEgJiYgIXJlY3RzQXJlRXF1YWwoZWxlbWVudFJlY3RGb3JSb290TWFyZ2luLCBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSkge1xuICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIHJhdGlvIGlzIHJlcG9ydGVkIGFzIDEsIHRoZVxuICAgICAgICAvLyBlbGVtZW50IGlzIG5vdCBhY3R1YWxseSBmdWxseSB3aXRoaW4gdGhlIEludGVyc2VjdGlvbk9ic2VydmVyJ3Mgcm9vdFxuICAgICAgICAvLyBhcmVhIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiB1bmRlciBwZXJmb3JtYW5jZSBjb25zdHJhaW50cy4gVGhpcyBtYXlcbiAgICAgICAgLy8gYmUgYSBidWcgaW4gdGhlIGJyb3dzZXIncyBJbnRlcnNlY3Rpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbi4gVG9cbiAgICAgICAgLy8gd29yayBhcm91bmQgdGhpcywgd2UgY29tcGFyZSB0aGUgZWxlbWVudCdzIGJvdW5kaW5nIHJlY3Qgbm93IHdpdGhcbiAgICAgICAgLy8gd2hhdCBpdCB3YXMgYXQgdGhlIHRpbWUgd2UgY3JlYXRlZCB0aGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIuIElmIHRoZXlcbiAgICAgICAgLy8gYXJlIG5vdCBlcXVhbCB0aGVuIHRoZSBlbGVtZW50IG1vdmVkLCBzbyB3ZSByZWZyZXNoLlxuICAgICAgICByZWZyZXNoKCk7XG4gICAgICB9XG4gICAgICBpc0ZpcnN0VXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT2xkZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBhIGBkb2N1bWVudGAgYXMgdGhlIHJvb3QgYW5kIHdpbGwgdGhyb3cgYW5cbiAgICAvLyBlcnJvci5cbiAgICB0cnkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAvLyBIYW5kbGUgPGlmcmFtZT5zXG4gICAgICAgIHJvb3Q6IHJvb3Qub3duZXJEb2N1bWVudFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlvLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cbiAgcmVmcmVzaCh0cnVlKTtcbiAgcmV0dXJuIGNsZWFudXA7XG59XG5cbi8qKlxuICogQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeS5cbiAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG1vdW50ZWQgb24gdGhlIERPTSBvclxuICogdmlzaWJsZSBvbiB0aGUgc2NyZWVuLlxuICogQHJldHVybnMgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBpbnZva2VkIHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXNcbiAqIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIGhpZGRlbiBmcm9tIHRoZSBzY3JlZW4uXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1VwZGF0ZVxuICovXG5mdW5jdGlvbiBhdXRvVXBkYXRlKHJlZmVyZW5jZSwgZmxvYXRpbmcsIHVwZGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBhbmNlc3RvclNjcm9sbCA9IHRydWUsXG4gICAgYW5jZXN0b3JSZXNpemUgPSB0cnVlLFxuICAgIGVsZW1lbnRSZXNpemUgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgbGF5b3V0U2hpZnQgPSB0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgYW5pbWF0aW9uRnJhbWUgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVmZXJlbmNlRWwgPSB1bndyYXBFbGVtZW50KHJlZmVyZW5jZSk7XG4gIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yU2Nyb2xsIHx8IGFuY2VzdG9yUmVzaXplID8gWy4uLihyZWZlcmVuY2VFbCA/IGdldE92ZXJmbG93QW5jZXN0b3JzKHJlZmVyZW5jZUVsKSA6IFtdKSwgLi4uZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpXSA6IFtdO1xuICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgfSk7XG4gIGNvbnN0IGNsZWFudXBJbyA9IHJlZmVyZW5jZUVsICYmIGxheW91dFNoaWZ0ID8gb2JzZXJ2ZU1vdmUocmVmZXJlbmNlRWwsIHVwZGF0ZSkgOiBudWxsO1xuICBsZXQgcmVvYnNlcnZlRnJhbWUgPSAtMTtcbiAgbGV0IHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgaWYgKGVsZW1lbnRSZXNpemUpIHtcbiAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihfcmVmID0+IHtcbiAgICAgIGxldCBbZmlyc3RFbnRyeV0gPSBfcmVmO1xuICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZmlyc3RFbnRyeS50YXJnZXQgPT09IHJlZmVyZW5jZUVsICYmIHJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgIC8vIFByZXZlbnQgdXBkYXRlIGxvb3BzIHdoZW4gdXNpbmcgdGhlIGBzaXplYCBtaWRkbGV3YXJlLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE3NDBcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmVvYnNlcnZlRnJhbWUpO1xuICAgICAgICByZW9ic2VydmVGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdmFyIF9yZXNpemVPYnNlcnZlcjtcbiAgICAgICAgICAoX3Jlc2l6ZU9ic2VydmVyID0gcmVzaXplT2JzZXJ2ZXIpID09IG51bGwgfHwgX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIGlmIChyZWZlcmVuY2VFbCAmJiAhYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVmZXJlbmNlRWwpO1xuICAgIH1cbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgfVxuICBsZXQgZnJhbWVJZDtcbiAgbGV0IHByZXZSZWZSZWN0ID0gYW5pbWF0aW9uRnJhbWUgPyBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlKSA6IG51bGw7XG4gIGlmIChhbmltYXRpb25GcmFtZSkge1xuICAgIGZyYW1lTG9vcCgpO1xuICB9XG4gIGZ1bmN0aW9uIGZyYW1lTG9vcCgpIHtcbiAgICBjb25zdCBuZXh0UmVmUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpO1xuICAgIGlmIChwcmV2UmVmUmVjdCAmJiAhcmVjdHNBcmVFcXVhbChwcmV2UmVmUmVjdCwgbmV4dFJlZlJlY3QpKSB7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gICAgcHJldlJlZlJlY3QgPSBuZXh0UmVmUmVjdDtcbiAgICBmcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lTG9vcCk7XG4gIH1cbiAgdXBkYXRlKCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgdmFyIF9yZXNpemVPYnNlcnZlcjI7XG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlKTtcbiAgICAgIGFuY2VzdG9yUmVzaXplICYmIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZSk7XG4gICAgfSk7XG4gICAgY2xlYW51cElvID09IG51bGwgfHwgY2xlYW51cElvKCk7XG4gICAgKF9yZXNpemVPYnNlcnZlcjIgPSByZXNpemVPYnNlcnZlcikgPT0gbnVsbCB8fCBfcmVzaXplT2JzZXJ2ZXIyLmRpc2Nvbm5lY3QoKTtcbiAgICByZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgaWYgKGFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZUlkKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd2l0aCBhbiBvYmplY3Qgb2Ygb3ZlcmZsb3cgc2lkZSBvZmZzZXRzIHRoYXQgZGV0ZXJtaW5lIGhvdyBtdWNoIHRoZVxuICogZWxlbWVudCBpcyBvdmVyZmxvd2luZyBhIGdpdmVuIGNsaXBwaW5nIGJvdW5kYXJ5IG9uIGVhY2ggc2lkZS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5jb25zdCBkZXRlY3RPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93JDE7XG5cbi8qKlxuICogTW9kaWZpZXMgdGhlIHBsYWNlbWVudCBieSB0cmFuc2xhdGluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbG9uZyB0aGVcbiAqIHNwZWNpZmllZCBheGVzLlxuICogQSBudW1iZXIgKHNob3J0aGFuZCBmb3IgYG1haW5BeGlzYCBvciBkaXN0YW5jZSksIG9yIGFuIGF4ZXMgY29uZmlndXJhdGlvblxuICogb2JqZWN0IG1heSBiZSBwYXNzZWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cbmNvbnN0IG9mZnNldCA9IG9mZnNldCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBjaG9vc2luZyB0aGUgcGxhY2VtZW50XG4gKiB0aGF0IGhhcyB0aGUgbW9zdCBzcGFjZSBhdmFpbGFibGUgYXV0b21hdGljYWxseSwgd2l0aG91dCBuZWVkaW5nIHRvIHNwZWNpZnkgYVxuICogcHJlZmVycmVkIHBsYWNlbWVudC4gQWx0ZXJuYXRpdmUgdG8gYGZsaXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9QbGFjZW1lbnRcbiAqL1xuY29uc3QgYXV0b1BsYWNlbWVudCA9IGF1dG9QbGFjZW1lbnQkMTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgc2hpZnRpbmcgaXQgaW4gb3JkZXIgdG9cbiAqIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3cgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NoaWZ0XG4gKi9cbmNvbnN0IHNoaWZ0ID0gc2hpZnQkMTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgZmxpcHBpbmcgdGhlIGBwbGFjZW1lbnRgXG4gKiBpbiBvcmRlciB0byBrZWVwIGl0IGluIHZpZXcgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudChzKSB3aWxsIG92ZXJmbG93IHRoZVxuICogY2xpcHBpbmcgYm91bmRhcnkuIEFsdGVybmF0aXZlIHRvIGBhdXRvUGxhY2VtZW50YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSBmbGlwJDE7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IFx1MjAxNFxuICogZm9yIGluc3RhbmNlLCBwcmV2ZW50IGl0IGZyb20gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5IG9yIG1hdGNoIHRoZVxuICogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NpemVcbiAqL1xuY29uc3Qgc2l6ZSA9IHNpemUkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSBoaWRlJDE7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gYXJyb3ckMTtcblxuLyoqXG4gKiBQcm92aWRlcyBpbXByb3ZlZCBwb3NpdGlvbmluZyBmb3IgaW5saW5lIHJlZmVyZW5jZSBlbGVtZW50cyB0aGF0IGNhbiBzcGFuXG4gKiBvdmVyIG11bHRpcGxlIGxpbmVzLCBzdWNoIGFzIGh5cGVybGlua3Mgb3IgcmFuZ2Ugc2VsZWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbmxpbmVcbiAqL1xuY29uc3QgaW5saW5lID0gaW5saW5lJDE7XG5cbi8qKlxuICogQnVpbHQtaW4gYGxpbWl0ZXJgIHRoYXQgd2lsbCBzdG9wIGBzaGlmdCgpYCBhdCBhIGNlcnRhaW4gcG9pbnQuXG4gKi9cbmNvbnN0IGxpbWl0U2hpZnQgPSBsaW1pdFNoaWZ0JDE7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRoYXQgd2lsbCBwbGFjZSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICogbmV4dCB0byBhIGdpdmVuIHJlZmVyZW5jZSBlbGVtZW50LlxuICovXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSAocmVmZXJlbmNlLCBmbG9hdGluZywgb3B0aW9ucykgPT4ge1xuICAvLyBUaGlzIGNhY2hlcyB0aGUgZXhwZW5zaXZlIGBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnNgIGZ1bmN0aW9uIHNvIHRoYXRcbiAgLy8gbXVsdGlwbGUgbGlmZWN5Y2xlIHJlc2V0cyByZS11c2UgdGhlIHNhbWUgcmVzdWx0LiBJdCBvbmx5IGxpdmVzIGZvciBhXG4gIC8vIHNpbmdsZSBjYWxsLiBJZiBvdGhlciBmdW5jdGlvbnMgYmVjb21lIGV4cGVuc2l2ZSwgd2UgY2FuIGFkZCB0aGVtIGFzIHdlbGwuXG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuICAgIHBsYXRmb3JtLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgY29uc3QgcGxhdGZvcm1XaXRoQ2FjaGUgPSB7XG4gICAgLi4ubWVyZ2VkT3B0aW9ucy5wbGF0Zm9ybSxcbiAgICBfYzogY2FjaGVcbiAgfTtcbiAgcmV0dXJuIGNvbXB1dGVQb3NpdGlvbiQxKHJlZmVyZW5jZSwgZmxvYXRpbmcsIHtcbiAgICAuLi5tZXJnZWRPcHRpb25zLFxuICAgIHBsYXRmb3JtOiBwbGF0Zm9ybVdpdGhDYWNoZVxuICB9KTtcbn07XG5cbmV4cG9ydCB7IGFycm93LCBhdXRvUGxhY2VtZW50LCBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGRldGVjdE92ZXJmbG93LCBmbGlwLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgcGxhdGZvcm0sIHNoaWZ0LCBzaXplIH07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHtcblx0YXJyb3csXG5cdGF1dG9QbGFjZW1lbnQsXG5cdGF1dG9VcGRhdGUsXG5cdGRldGVjdE92ZXJmbG93LFxuXHRjb21wdXRlUG9zaXRpb24sXG5cdG9mZnNldCxcblx0ZmxpcCxcblx0c2l6ZSxcblx0c2hpZnQsXG59IGZyb20gXCJAZmxvYXRpbmctdWkvZG9tXCI7XG5pbXBvcnQgeyBQcm9jZXNzaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvcHJvY2Vzc2luZy5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50IH0gZnJvbSBcIi4uLy4uLy4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzQXJyYXksIGlzT2JqZWN0LCBpc0Z1bmN0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuXG5leHBvcnQgeyBwb3NpdGlvblBvcHBlciB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gY29udHJvbEVsZW1lbnRcbiAqIEBwYXJhbSBwb3BwZXJFbGVtZW50XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybiB7UHJvbWlzZXwqfVxuICovXG5mdW5jdGlvbiBwb3NpdGlvblBvcHBlcihjb250cm9sRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgb3B0aW9ucykge1xuXHRjb25zdCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5O1xuXG5cdHJldHVybiBuZXcgUHJvY2Vzc2luZygoKSA9PiB7XG5cdFx0Y29uc3QgYXJyb3dFbGVtZW50ID0gY29udHJvbEVsZW1lbnQucXVlcnlTZWxlY3Rvcihcblx0XHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPWFycm93XVwiLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKFxuXHRcdFx0e30sXG5cdFx0XHR7XG5cdFx0XHRcdHBsYWNlbWVudDogXCJ0b3BcIixcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBtaWRkbGV3YXJlID0gY29uZmlnPy5bXCJtaWRkbGV3YXJlXCJdO1xuXHRcdGlmICghaXNBcnJheShtaWRkbGV3YXJlKSkge1xuXHRcdFx0aWYgKGlzU3RyaW5nKG1pZGRsZXdhcmUpKSB7XG5cdFx0XHRcdGNvbmZpZ1tcIm1pZGRsZXdhcmVcIl0gPSBtaWRkbGV3YXJlLnNwbGl0KFwiLFwiKS5maWx0ZXIoKGxpbmUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbGluZS50cmltKCkubGVuZ3RoID4gMDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25maWdbXCJtaWRkbGV3YXJlXCJdID0gW107XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gbWlkZGxld2FyZSkge1xuXHRcdFx0Y29uc3QgbGluZSA9IG1pZGRsZXdhcmVba2V5XTtcblx0XHRcdGlmIChpc0Z1bmN0aW9uKGxpbmUpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPYmplY3QobGluZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNTdHJpbmcobGluZSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGBNaWRkbGV3YXJlIG11c3QgYmUgYSBzdHJpbmcsIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LiBHb3QgJHt0eXBlb2YgbGluZX1gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBrdiA9IGxpbmUuc3BsaXQoXCI6XCIpO1xuXHRcdFx0Y29uc3QgZm4gPSBrdi5zaGlmdCgpO1xuXG5cdFx0XHRzd2l0Y2ggKGZuKSB7XG5cdFx0XHRcdGNhc2UgXCJmbGlwXCI6XG5cdFx0XHRcdFx0Y29uZmlnW1wibWlkZGxld2FyZVwiXVtrZXldID0gZmxpcCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2hpZnRcIjpcblx0XHRcdFx0XHRjb25maWdbXCJtaWRkbGV3YXJlXCJdW2tleV0gPSBzaGlmdCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiYXV0b1BsYWNlbWVudFwiOlxuXHRcdFx0XHRcdGxldCBkZWZhdWx0QWxsb3dlZFBsYWNlbWVudHMgPSBbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl07XG5cblx0XHRcdFx0XHRjb25zdCBkZWZQbGFjZW1lbnQgPSBrdj8uc2hpZnQoKTtcblx0XHRcdFx0XHRpZiAoaXNTdHJpbmcoZGVmUGxhY2VtZW50KSAmJiBkZWZQbGFjZW1lbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGRlZmF1bHRBbGxvd2VkUGxhY2VtZW50cyA9IGRlZlBsYWNlbWVudFxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIsXCIpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoKGxpbmUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbGluZS50cmltKCkubGVuZ3RoID4gMDtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGRlZmF1bHRBbGxvd2VkUGxhY2VtZW50cy5pbmNsdWRlcyhjb25maWcucGxhY2VtZW50KSkge1xuXHRcdFx0XHRcdFx0ZGVmYXVsdEFsbG93ZWRQbGFjZW1lbnRzLnNwbGljZShcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdEFsbG93ZWRQbGFjZW1lbnRzLmluZGV4T2YoY29uZmlnLnBsYWNlbWVudCksXG5cdFx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWZhdWx0QWxsb3dlZFBsYWNlbWVudHMudW5zaGlmdChjb25maWcucGxhY2VtZW50KTtcblxuXHRcdFx0XHRcdGNvbmZpZ1tcIm1pZGRsZXdhcmVcIl1ba2V5XSA9IGF1dG9QbGFjZW1lbnQoe1xuXHRcdFx0XHRcdFx0Y3Jvc3NBeGlzOiB0cnVlLFxuXHRcdFx0XHRcdFx0YXV0b0FsaWdubWVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsbG93ZWRQbGFjZW1lbnRzOiBkZWZhdWx0QWxsb3dlZFBsYWNlbWVudHMsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImRldGVjdE92ZXJmbG93XCI6XG5cdFx0XHRcdFx0Y29uZmlnW1wibWlkZGxld2FyZVwiXVtrZXldID0gZGV0ZWN0T3ZlcmZsb3coKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImFycm93XCI6XG5cdFx0XHRcdFx0aWYgKGFycm93RWxlbWVudCkge1xuXHRcdFx0XHRcdFx0Y29uZmlnW1wibWlkZGxld2FyZVwiXVtrZXldID0gYXJyb3coeyBlbGVtZW50OiBhcnJvd0VsZW1lbnQgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic2l6ZVwiOlxuXHRcdFx0XHRcdGNvbmZpZ1tcIm1pZGRsZXdhcmVcIl1ba2V5XSA9IHNpemUoe1xuXHRcdFx0XHRcdFx0YXBwbHkoeyBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0LCBlbGVtZW50cyB9KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1heFdpZHRoID0gYm9keS5jbGllbnRXaWR0aDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWF4SGVpZ2h0ID0gYm9keS5jbGllbnRIZWlnaHQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRcdGF2YWlsYWJsZVdpZHRoID0gMDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhdmFpbGFibGVIZWlnaHQgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0YXZhaWxhYmxlSGVpZ2h0ID0gMDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhdmFpbGFibGVXaWR0aCA+IG1heFdpZHRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0YXZhaWxhYmxlV2lkdGggPSBtYXhXaWR0aDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhdmFpbGFibGVIZWlnaHQgPiBtYXhIZWlnaHQpIHtcblx0XHRcdFx0XHRcdFx0XHRhdmFpbGFibGVIZWlnaHQgPSBtYXhIZWlnaHQ7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGVsZW1lbnRzLmZsb2F0aW5nLnN0eWxlLCB7XG5cdFx0XHRcdFx0XHRcdFx0Ym94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRcdFx0XHRtYXhXaWR0aDogYCR7YXZhaWxhYmxlV2lkdGh9cHhgLFxuXHRcdFx0XHRcdFx0XHRcdG1heEhlaWdodDogYCR7YXZhaWxhYmxlSGVpZ2h0fXB4YCxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwib2Zmc2V0XCI6XG5cdFx0XHRcdFx0Y29uc3QgbyA9IGt2Py5zaGlmdCgpO1xuXHRcdFx0XHRcdGNvbmZpZ1tcIm1pZGRsZXdhcmVcIl1ba2V5XSA9IG9mZnNldChwYXJzZUludChvKSB8fCAxMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJoaWRlXCI6XG5cdFx0XHRcdFx0Y29uZmlnW1wibWlkZGxld2FyZVwiXVtrZXldID0gaGlkZSgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbjogJHtmbn1gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwb3BwZXJFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidmlzaWJpbGl0eVwiKTtcblx0XHRwb3BwZXJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cblx0XHRhdXRvVXBkYXRlKGNvbnRyb2xFbGVtZW50LCBwb3BwZXJFbGVtZW50LCAoKSA9PiB7XG5cdFx0XHRjb21wdXRlUG9zaXRpb24oY29udHJvbEVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIGNvbmZpZykudGhlbihcblx0XHRcdFx0KHsgeCwgeSwgcGxhY2VtZW50LCBtaWRkbGV3YXJlRGF0YSB9KSA9PiB7XG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihwb3BwZXJFbGVtZW50LnN0eWxlLCB7XG5cdFx0XHRcdFx0XHR0b3A6IFwiMFwiLFxuXHRcdFx0XHRcdFx0bGVmdDogXCIwXCIsXG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHtyb3VuZEJ5RFBSKHgpfXB4LCR7cm91bmRCeURQUih5KX1weClgLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKG1pZGRsZXdhcmVEYXRhLmFycm93KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWRlID0gcGxhY2VtZW50LnNwbGl0KFwiLVwiKVswXTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGljU2lkZSA9IHtcblx0XHRcdFx0XHRcdFx0dG9wOiBcImJvdHRvbVwiLFxuXHRcdFx0XHRcdFx0XHRyaWdodDogXCJsZWZ0XCIsXG5cdFx0XHRcdFx0XHRcdGJvdHRvbTogXCJ0b3BcIixcblx0XHRcdFx0XHRcdFx0bGVmdDogXCJyaWdodFwiLFxuXHRcdFx0XHRcdFx0fVtzaWRlXTtcblxuXHRcdFx0XHRcdFx0Ly8gbW9uc3Rlci1ib3JkZXItd2lkdGggPSArIDQgKDIqMikgKHNob3VsZCBjb21lIGZyb20gY3NzKVxuXHRcdFx0XHRcdFx0Y29uc3QgYXJyb3dMZW4gPSBhcnJvd0VsZW1lbnQub2Zmc2V0V2lkdGggKyA0O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBib3JkZXJTdHlsZSA9IHtcblx0XHRcdFx0XHRcdFx0Ym9yZGVyTGVmdDogXCJ0cmFuc3BhcmVudFwiLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJSaWdodDogXCJ0cmFuc3BhcmVudFwiLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJCb3R0b206IFwidHJhbnNwYXJlbnRcIixcblx0XHRcdFx0XHRcdFx0Ym9yZGVyVG9wOiBcInRyYW5zcGFyZW50XCIsXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBkZWZhdWx0Qm9yZGVyID1cblx0XHRcdFx0XHRcdFx0XCJ2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkgdmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpIHZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KVwiO1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHNpZGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBcInRvcFwiOlxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclN0eWxlLmJvcmRlclJpZ2h0ID0gZGVmYXVsdEJvcmRlcjtcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJTdHlsZS5ib3JkZXJCb3R0b20gPSBkZWZhdWx0Qm9yZGVyO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJib3R0b21cIjpcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJTdHlsZS5ib3JkZXJUb3AgPSBkZWZhdWx0Qm9yZGVyO1xuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclN0eWxlLmJvcmRlckxlZnQgPSBkZWZhdWx0Qm9yZGVyO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJsZWZ0XCI6XG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyU3R5bGUuYm9yZGVyUmlnaHQgPSBkZWZhdWx0Qm9yZGVyO1xuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclN0eWxlLmJvcmRlclRvcCA9IGRlZmF1bHRCb3JkZXI7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBcInJpZ2h0XCI6XG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyU3R5bGUuYm9yZGVyQm90dG9tID0gZGVmYXVsdEJvcmRlcjtcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJTdHlsZS5ib3JkZXJMZWZ0ID0gZGVmYXVsdEJvcmRlcjtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgeyB4LCB5IH0gPSBtaWRkbGV3YXJlRGF0YS5hcnJvdztcblxuXHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdFx0YXJyb3dFbGVtZW50LnN0eWxlLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGVmdDogeCAhPSBudWxsID8gYCR7eH1weGAgOiBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdHRvcDogeSAhPSBudWxsID8gYCR7eX1weGAgOiBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdC8vIEVuc3VyZSB0aGUgc3RhdGljIHNpZGUgZ2V0cyB1bnNldCB3aGVuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZmxpcHBpbmcgdG8gb3RoZXIgcGxhY2VtZW50cycgYXhlcy5cblx0XHRcdFx0XHRcdFx0XHRyaWdodDogXCJcIixcblx0XHRcdFx0XHRcdFx0XHRib3R0b206IFwiXCIsXG5cdFx0XHRcdFx0XHRcdFx0W3N0YXRpY1NpZGVdOiBgJHstYXJyb3dMZW4gLyAyfXB4YCxcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm06IFwicm90YXRlKDQ1ZGVnKVwiLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRib3JkZXJTdHlsZSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fSkucnVuKCk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kQnlEUFIodmFsdWUpIHtcblx0Y29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblx0cmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBkcHIpIC8gZHByO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IFNlbGVjdFN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFNlbGVjdFN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRTZWxlY3RTdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIHNlbGVjdCB7IFxuLmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZH0uZmxleHtkaXNwbGF5OmZsZXh9LmlubGluZS1mbGV4e2Rpc3BsYXk6aW5saW5lLWZsZXh9LmhpZGRlbiwuaGlkZSwubm9uZXtkaXNwbGF5Om5vbmV9LnZpc2libGV7dmlzaWJpbGl0eTp2aXNpYmxlfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMSwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0yLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci0we2JvcmRlci1yYWRpdXM6MDtib3JkZXItc3R5bGU6bm9uZTtib3JkZXItd2lkdGg6MH0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMiwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMSwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMiwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMywubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfS5tb25zdGVyLWJhZGdlLXByaW1hcnl7cGFkZGluZzouMjVlbSAuNGVtfS5tb25zdGVyLWJhZGdlLXByaW1hcnksLm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2Utc2Vjb25kYXJ5e3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnksLm1vbnN0ZXItYmFkZ2Utc2Vjb25kYXJ5LXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS1zZWNvbmRhcnktcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeXtwYWRkaW5nOi4yNWVtIC40ZW19Lm1vbnN0ZXItYmFkZ2UtdGVydGlhcnksLm1vbnN0ZXItYmFkZ2UtdGVydGlhcnktcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Ym9yZGVyLXJhZGl1czouMjVyZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH0ubW9uc3Rlci1iYWRnZS10ZXJ0aWFyeS1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZle3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1kZXN0cnVjdGl2ZSwubW9uc3Rlci1iYWRnZS1kZXN0cnVjdGl2ZS1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLWRlc3RydWN0aXZlLXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19Lm1vbnN0ZXItYmFkZ2Utc3VjY2Vzc3twYWRkaW5nOi4yNWVtIC40ZW19Lm1vbnN0ZXItYmFkZ2Utc3VjY2VzcywubW9uc3Rlci1iYWRnZS1zdWNjZXNzLXBpbGx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Ym9yZGVyLXJhZGl1czouMjVyZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLXN1Y2Nlc3MtcGlsbHtib3JkZXItcmFkaXVzOjEwcmVtO3BhZGRpbmc6LjI1ZW0gLjZlbX0ubW9uc3Rlci1iYWRnZS13YXJuaW5ne3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS13YXJuaW5nLC5tb25zdGVyLWJhZGdlLXdhcm5pbmctcGlsbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1vbnN0ZXItYmFkZ2Utd2FybmluZy1waWxse2JvcmRlci1yYWRpdXM6MTByZW07cGFkZGluZzouMjVlbSAuNmVtfS5tb25zdGVyLWJhZGdlLWVycm9ye3BhZGRpbmc6LjI1ZW0gLjRlbX0ubW9uc3Rlci1iYWRnZS1lcnJvciwubW9uc3Rlci1iYWRnZS1lcnJvci1waWxse2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtib3JkZXItcmFkaXVzOi4yNXJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfS5tb25zdGVyLWJhZGdlLWVycm9yLXBpbGx7Ym9yZGVyLXJhZGl1czoxMHJlbTtwYWRkaW5nOi4yNWVtIC42ZW19ZGl2W2RhdGEtbW9uc3Rlci1yb2xlPXBvcHBlcl17YWxpZ24tY29udGVudDpjZW50ZXI7YmFja2dyb3VuZDp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2xlZnQ6MDtwYWRkaW5nOjEuMWVtO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3dpZHRoOi1tb3otbWF4LWNvbnRlbnQ7d2lkdGg6bWF4LWNvbnRlbnQ7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtbW9kYWwpfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXJdIGRpdltkYXRhLW1vbnN0ZXItcm9sZT1hcnJvd117YmFja2dyb3VuZDp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7aGVpZ2h0OmNhbGMobWF4KHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpLCAtMSAqIHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpKSoyKTtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmNhbGMobWF4KHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpLCAtMSAqIHZhcigtLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2UpKSoyKTt6LWluZGV4Oi0xfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250YWluZXJdey13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lO2FwcGVhcmFuY2U6bm9uZTtmbGV4OjQgMCA5MCU7bWluLWhlaWdodDoxLjRlbTtvdmVyZmxvdzphdXRvO3Njcm9sbGJhci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO3Njcm9sbGJhci13aWR0aDp0aGluO3dpZHRoOjEwMCV9LmQtbm9uZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fWRpdltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtkaXNwbGF5OmZsZXg7aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRhaW5lcl0ub3Blbnstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBkPSdNNy42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA1LjcwN2wtNS42NDYgNS42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDh6Jy8lM0UlM0Mvc3ZnJTNFXFxcIik7bWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGQ9J003LjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDUuNzA3bC01LjY0NiA1LjY0N2EuNS41IDAgMCAxLS43MDgtLjcwOHonLyUzRSUzQy9zdmclM0VcXFwiKX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udGFpbmVyXS5jbGVhcixbZGF0YS1tb25zdGVyLXJvbGU9Y29udGFpbmVyXS5vcGVue2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTIpOy13ZWJraXQtbWFzay1wb3NpdGlvbjpjZW50ZXIgY2VudGVyO21hc2stcG9zaXRpb246Y2VudGVyIGNlbnRlcjstd2Via2l0LW1hc2stcmVwZWF0Om5vLXJlcGVhdDttYXNrLXJlcGVhdDpuby1yZXBlYXQ7LXdlYmtpdC1tYXNrLXNpemU6LjhlbTttYXNrLXNpemU6LjhlbX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udGFpbmVyXS5jbGVhcnstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOCcvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOCcvJTNFJTNDL3N2ZyUzRVxcXCIpfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXthY2NlbnQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpOy1vLWJvcmRlci1pbWFnZTppbml0aWFsO2JvcmRlci1pbWFnZTppbml0aWFsO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aCk7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtkaXNwbGF5OmZsZXg7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTAwJTttYXJnaW46MDtvdXRsaW5lOm5vbmU7cGFkZGluZzouNHJlbSAuNnJlbTt3aWR0aDotd2Via2l0LWZpbGwtYXZhaWxhYmxlO3dpZHRoOi1tb3otYXZhaWxhYmxlO3dpZHRoOmZpbGwtYXZhaWxhYmxlfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6bGlnaHQpe1tkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF06Zm9jdXN7b3V0bGluZToxcHggZGFzaGVkIHZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpO291dGxpbmUtb2Zmc2V0OjJweH19W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTIpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuOHMsY29sb3IgLjI1cyAuMDgzMzMzMzMzM3N9ZGl2W2RhdGEtbW9uc3Rlci1yb2xlPXNlbGVjdGlvbl17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOndyYXA7Z2FwOjVweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDttYXJnaW46NXB4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb24tY29udHJvbF17bWFyZ2luLXJpZ2h0OjhweH1bZGF0YS1tb25zdGVyLXJvbGU9YmFkZ2Vde2Rpc3BsYXk6aW5saW5lLWZsZXh9W2RhdGEtbW9uc3Rlci1yb2xlPWJhZGdlLWxhYmVsXXthbGlnbi1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6N3B4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufVtkYXRhLW1vbnN0ZXItcm9sZT1maWx0ZXJdLFtkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXItZmlsdGVyXXtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjIwMDtvcmRlcjo5OTk5OTk5OTt2aXNpYmlsaXR5OmhpZGRlbn1bZGF0YS1tb25zdGVyLXJvbGU9ZmlsdGVyXS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMik7Ym9yZGVyOjA7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zKTtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpO21pbi13aWR0aDo0MCU7b3V0bGluZTpub25lO3Zpc2liaWxpdHk6dmlzaWJsZX0uYWN0aXZlW2RhdGEtbW9uc3Rlci1yb2xlPWZpbHRlcl1bbmFtZT1wb3BwZXItZmlsdGVyXXtoZWlnaHQ6MS41ZW07bWFyZ2luOjIuNWVtO3BhZGRpbmc6MnB4O3dpZHRoOmNhbGMoMTAwJSAtIHZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSoyKX0ub3B0aW9uLWZpbHRlci1jb250cm9se2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtkaXNwbGF5OmZsZXg7aGVpZ2h0OjIuNWVtO21hcmdpbjotMS4xZW0gLTEuMWVtIC4zZW19W2RhdGEtbW9uc3Rlci1yb2xlPXJlbW92ZS1iYWRnZV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMik7aGVpZ2h0OjE2cHg7bWFyZ2luLWxlZnQ6NXB4Oy13ZWJraXQtbWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNNC42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCA3LjI5M2wyLjY0Ni0yLjY0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsMi42NDcgMi42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC0yLjY0NiAyLjY0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDQuNjQ2IDUuMzU0YS41LjUgMCAwIDEgMC0uNzA4Jy8lM0UlM0Mvc3ZnJTNFXFxcIik7bWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNNC42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCA3LjI5M2wyLjY0Ni0yLjY0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsMi42NDcgMi42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC0yLjY0NiAyLjY0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDQuNjQ2IDUuMzU0YS41LjUgMCAwIDEgMC0uNzA4Jy8lM0UlM0Mvc3ZnJTNFXFxcIik7b3JkZXI6Mn1bZGF0YS1tb25zdGVyLXJvbGU9cmVtb3ZlLWJhZGdlXSxbZGF0YS1tb25zdGVyLXJvbGU9c3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNdey13ZWJraXQtbWFzay1wb3NpdGlvbjpjZW50ZXIgY2VudGVyO21hc2stcG9zaXRpb246Y2VudGVyIGNlbnRlcjstd2Via2l0LW1hc2stcmVwZWF0Om5vLXJlcGVhdDttYXNrLXJlcGVhdDpuby1yZXBlYXQ7LXdlYmtpdC1tYXNrLXNpemU6LjhlbTttYXNrLXNpemU6LjhlbTttaW4taGVpZ2h0OjE2cHg7d2lkdGg6MTZweH1bZGF0YS1tb25zdGVyLXJvbGU9c3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNdey13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lO2FwcGVhcmFuY2U6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBkPSdNMS42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCAxMC4yOTNsNS42NDYtNS42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOCAwbC02LTZhLjUuNSAwIDAgMSAwLS43MDgnLyUzRSUzQy9zdmclM0VcXFwiKTttYXNrLWltYWdlOnVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdjdXJyZW50Q29sb3InIHZpZXdCb3g9JzAgMCAxNiAxNiclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgZD0nTTEuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggMTAuMjkzbDUuNjQ2LTUuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDggMGwtNi02YS41LjUgMCAwIDEgMC0uNzA4Jy8lM0UlM0Mvc3ZnJTNFXFxcIil9Lm9wZW5bZGF0YS1tb25zdGVyLXJvbGU9c3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNde2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpOy13ZWJraXQtbWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGQ9J003LjY0NiA0LjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDUuNzA3bC01LjY0NiA1LjY0N2EuNS41IDAgMCAxLS43MDgtLjcwOHonLyUzRSUzQy9zdmclM0VcXFwiKTttYXNrLWltYWdlOnVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdjdXJyZW50Q29sb3InIHZpZXdCb3g9JzAgMCAxNiAxNiclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgZD0nTTcuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxLS43MDguNzA4TDggNS43MDdsLTUuNjQ2IDUuNjQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4eicvJTNFJTNDL3N2ZyUzRVxcXCIpfS5lbXB0eVtkYXRhLW1vbnN0ZXItcm9sZT1zdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc117YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7LXdlYmtpdC1tYXNrLWltYWdlOnVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdjdXJyZW50Q29sb3InIGNsYXNzPSdiaSBiaS1kYXNoLWNpcmNsZScgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTggMTVBNyA3IDAgMSAxIDggMWE3IDcgMCAwIDEgMCAxNG0wIDFBOCA4IDAgMSAwIDggMGE4IDggMCAwIDAgMCAxNicvJTNFJTNDcGF0aCBkPSdNNCA4YS41LjUgMCAwIDEgLjUtLjVoN2EuNS41IDAgMCAxIDAgMWgtN0EuNS41IDAgMCAxIDQgOCcvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgY2xhc3M9J2JpIGJpLWRhc2gtY2lyY2xlJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNOCAxNUE3IDcgMCAxIDEgOCAxYTcgNyAwIDAgMSAwIDE0bTAgMUE4IDggMCAxIDAgOCAwYTggOCAwIDAgMCAwIDE2Jy8lM0UlM0NwYXRoIGQ9J000IDhhLjUuNSAwIDAgMSAuNS0uNWg3YS41LjUgMCAwIDEgMCAxaC03QS41LjUgMCAwIDEgNCA4Jy8lM0UlM0Mvc3ZnJTNFXFxcIil9LmNsZWFyW2RhdGEtbW9uc3Rlci1yb2xlPXN0YXR1cy1vci1yZW1vdmUtYmFkZ2VzXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOCcvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOCcvJTNFJTNDL3N2ZyUzRVxcXCIpfS5lcnJvcltkYXRhLW1vbnN0ZXItcm9sZT1zdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc117YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTEpOy13ZWJraXQtbWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNOCAxNUE3IDcgMCAxIDEgOCAxYTcgNyAwIDAgMSAwIDE0bTAgMUE4IDggMCAxIDAgOCAwYTggOCAwIDAgMCAwIDE2Jy8lM0UlM0NwYXRoIGQ9J003LjAwMiAxMWExIDEgMCAxIDEgMiAwIDEgMSAwIDAgMS0yIDBNNy4xIDQuOTk1YS45MDUuOTA1IDAgMSAxIDEuOCAwbC0uMzUgMy41MDdhLjU1Mi41NTIgMCAwIDEtMS4xIDB6Jy8lM0UlM0Mvc3ZnJTNFXFxcIik7bWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNOCAxNUE3IDcgMCAxIDEgOCAxYTcgNyAwIDAgMSAwIDE0bTAgMUE4IDggMCAxIDAgOCAwYTggOCAwIDAgMCAwIDE2Jy8lM0UlM0NwYXRoIGQ9J003LjAwMiAxMWExIDEgMCAxIDEgMiAwIDEgMSAwIDAgMS0yIDBNNy4xIDQuOTk1YS45MDUuOTA1IDAgMSAxIDEuOCAwbC0uMzUgMy41MDdhLjU1Mi41NTIgMCAwIDEtMS4xIDB6Jy8lM0UlM0Mvc3ZnJTNFXFxcIil9LmxvYWRpbmdbZGF0YS1tb25zdGVyLXJvbGU9c3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNde2FuaW1hdGlvbi1kdXJhdGlvbjoxczthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1uYW1lOmFjdGl2aXR5O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsMCwuMiwxKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgY2xhc3M9J2FjdGl2aXR5JyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDY2lyY2xlIGN4PSc4JyBjeT0nOCcgcj0nOCcvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgY2xhc3M9J2FjdGl2aXR5JyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDY2lyY2xlIGN4PSc4JyBjeT0nOCcgcj0nOCcvJTNFJTNDL3N2ZyUzRVxcXCIpfUBrZXlmcmFtZXMgYWN0aXZpdHl7MCV7dHJhbnNmb3JtOnNjYWxlKDEpfTUwJXt0cmFuc2Zvcm06c2NhbGUoLjEpfXRve3RyYW5zZm9ybTpzY2FsZSgxKX19W2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbnNde2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZ3JvdzoxO3Njcm9sbGJhci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSkgdmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO3Njcm9sbGJhci13aWR0aDp0aGlufVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25de2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpmbGV4O3BhZGRpbmc6NnB4IDVweH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXSBsYWJlbHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dIGxhYmVsPmRpdnthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtvdXRsaW5lOm5vbmU7d2lkdGg6MTAwJX1bZGF0YS1tb25zdGVyLXJvbGU9bm8tb3B0aW9uc117YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctNCk7Ym9yZGVyLXJhZGl1czouMmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KTttYXJnaW46MS4xZW0gMS4xZW0gMDtwYWRkaW5nOi4zZW0gLjhlbX0uc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1maWx0ZXJlZD10cnVlXSxbZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItdmlzaWJpbGl0eT1oaWRkZW5de2Rpc3BsYXk6bm9uZX1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItZm9jdXNlZD10cnVlXXtvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMik7b3V0bGluZS1vZmZzZXQ6LTJweH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXT5pbnB1dDpmb2N1cyxbZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXT5sYWJlbDpmb2N1c3tvdXRsaW5lOm5vbmV9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGJ1aWxkTWFwIH0gZnJvbSBcIi4uLy4uL2RhdGEvYnVpbGRtYXAubWpzXCI7XG5pbXBvcnQgeyBEZWFkTWFuc1N3aXRjaCB9IGZyb20gXCIuLi8uLi91dGlsL2RlYWRtYW5zc3dpdGNoLm1qc1wiO1xuaW1wb3J0IHsgcG9zaXRpb25Qb3BwZXIgfSBmcm9tIFwiLi91dGlsL2Zsb2F0aW5nLXVpLm1qc1wiO1xuaW1wb3J0IHtcblx0YWRkQXR0cmlidXRlVG9rZW4sXG5cdGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUsXG5cdHJlbW92ZUF0dHJpYnV0ZVRva2VuLFxufSBmcm9tIFwiLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge1xuXHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRBVFRSSUJVVEVfUFJFRklYLFxuXHRBVFRSSUJVVEVfUk9MRSxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBDdXN0b21Db250cm9sIH0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21jb250cm9sLm1qc1wiO1xuaW1wb3J0IHtcblx0YXNzZW1ibGVNZXRob2RTeW1ib2wsXG5cdGdldFNsb3R0ZWRFbGVtZW50cyxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQge1xuXHRmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCxcblx0ZmlyZUN1c3RvbUV2ZW50LFxuXHRmaXJlRXZlbnQsXG59IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0RG9jdW1lbnQsIGdldFdpbmRvdyB9IGZyb20gXCIuLi8uLi9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7IEZvcm1hdHRlciB9IGZyb20gXCIuLi8uLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbCB9IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBJRCB9IGZyb20gXCIuLi8uLi90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7XG5cdGlzQXJyYXksXG5cdGlzRnVuY3Rpb24sXG5cdGlzSW50ZWdlcixcblx0aXNJdGVyYWJsZSxcblx0aXNPYmplY3QsXG5cdGlzUHJpbWl0aXZlLFxuXHRpc1N0cmluZyxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vLi4vdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyBQcm94eU9ic2VydmVyIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUFycmF5LCB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi8uLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IFByb2Nlc3NpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbC9wcm9jZXNzaW5nLm1qc1wiO1xuaW1wb3J0IHsgU1RZTEVfRElTUExBWV9NT0RFX0JMT0NLIH0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgU2VsZWN0U3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvc2VsZWN0Lm1qc1wiO1xuaW1wb3J0IHtcblx0Z2V0RG9jdW1lbnRUcmFuc2xhdGlvbnMsXG5cdFRyYW5zbGF0aW9ucyxcbn0gZnJvbSBcIi4uLy4uL2kxOG4vdHJhbnNsYXRpb25zLm1qc1wiO1xuaW1wb3J0IHsgZ2V0TG9jYWxlT2ZEb2N1bWVudCB9IGZyb20gXCIuLi8uLi9kb20vbG9jYWxlLm1qc1wiO1xuXG5leHBvcnQge1xuXHRTZWxlY3QsXG5cdHBvcHBlckVsZW1lbnRTeW1ib2wsXG5cdGdldFN1bW1hcnlUZW1wbGF0ZSxcblx0Z2V0U2VsZWN0aW9uVGVtcGxhdGUsXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCB0aW1lckNhbGxiYWNrU3ltYm9sID0gU3ltYm9sKFwidGltZXJDYWxsYmFja1wiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3Qga2V5RmlsdGVyRXZlbnRTeW1ib2wgPSBTeW1ib2woXCJrZXlGaWx0ZXJFdmVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgbGF6eUxvYWREb25lU3ltYm9sID0gU3ltYm9sKFwibGF6eUxvYWREb25lXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBpc0xvYWRpbmdTeW1ib2wgPSBTeW1ib2woXCJpc0xvYWRpbmdcIik7XG5cbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgY2xvc2VFdmVudEhhbmRsZXIgPSBTeW1ib2woXCJjbG9zZUV2ZW50SGFuZGxlclwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBjbGVhck9wdGlvbkV2ZW50SGFuZGxlciA9IFN5bWJvbChcImNsZWFyT3B0aW9uRXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IHJlc2l6ZU9ic2VydmVyU3ltYm9sID0gU3ltYm9sKFwicmVzaXplT2JzZXJ2ZXJcIik7XG5cbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3Qga2V5RXZlbnRIYW5kbGVyID0gU3ltYm9sKFwia2V5RXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IGxhc3RGZXRjaGVkRGF0YVN5bWJvbCA9IFN5bWJvbChcImxhc3RGZXRjaGVkRGF0YVwiKTtcbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgaW5wdXRFdmVudEhhbmRsZXIgPSBTeW1ib2woXCJpbnB1dEV2ZW50SGFuZGxlclwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBjaGFuZ2VFdmVudEhhbmRsZXIgPSBTeW1ib2woXCJjaGFuZ2VFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgY29udHJvbEVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJjb250cm9sRWxlbWVudFwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBzZWxlY3Rpb25FbGVtZW50U3ltYm9sID0gU3ltYm9sKFwic2VsZWN0aW9uRWxlbWVudFwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBjb250YWluZXJFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29udGFpbmVyRWxlbWVudFwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBwb3BwZXJFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwicG9wcGVyRWxlbWVudFwiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiaW5saW5lRmlsdGVyRWxlbWVudFwiKTtcbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgcG9wcGVyRmlsdGVyRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcInBvcHBlckZpbHRlckVsZW1lbnRcIik7XG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IHBvcHBlckZpbHRlckNvbnRhaW5lckVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXG5cdFwicG9wcGVyRmlsdGVyQ29udGFpbmVyRWxlbWVudFwiLFxuKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBvcHRpb25zRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcIm9wdGlvbnNFbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IG5vT3B0aW9uc0F2YWlsYWJsZUVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJub09wdGlvbnNBdmFpbGFibGVFbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IHN0YXR1c09yUmVtb3ZlQmFkZ2VzRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcInN0YXR1c09yUmVtb3ZlQmFkZ2VzRWxlbWVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge1N5bWJvbH1cbiAqL1xuY29uc3QgYXJlT3B0aW9uc0F2YWlsYWJsZUFuZEluaXRTeW1ib2wgPSBTeW1ib2woXCJAQGFyZU9wdGlvbnNBdmFpbGFibGVBbmRJbml0XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBkaXNhYmxlZFJlcXVlc3RNYXJrZXIgPSBTeW1ib2woXCJAQGRpc2FibGVkUmVxdWVzdE1hcmtlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgRk9DVVNfRElSRUNUSU9OX1VQID0gMTtcbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IEZPQ1VTX0RJUkVDVElPTl9ET1dOID0gMjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgRklMVEVSX01PREVfUkVNT1RFID0gXCJyZW1vdGVcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgRklMVEVSX01PREVfT1BUSU9OUyA9IFwib3B0aW9uc1wiO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBGSUxURVJfTU9ERV9ESVNBQkxFRCA9IFwiZGlzYWJsZWRcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgRklMVEVSX1BPU0lUSU9OX1BPUFBFUiA9IFwicG9wcGVyXCI7XG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBGSUxURVJfUE9TSVRJT05fSU5MSU5FID0gXCJpbmxpbmVcIjtcblxuLyoqXG4gKiBBIHNlbGVjdCBjb250cm9sIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9wdGlvbnMgZnJvbSBhIGxpc3QuXG4gKlxuICogQGZyYWdtZW50cyAvZnJhZ21lbnRzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QvXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3Qtd2l0aC1vcHRpb25zIFNlbGVjdCB3aXRoIG9wdGlvbnNcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0LXdpdGgtaHRtbC1vcHRpb25zIFNlbGVjdCB3aXRoIEhUTUwgb3B0aW9uc1xuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QtbXVsdGlwbGUgTXVsdGlwbGUgc2VsZWN0aW9uXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3NlbGVjdC1maWx0ZXIgRmlsdGVyXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3NlbGVjdC1mZXRjaCBGZXRjaCBvcHRpb25zXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3NlbGVjdC1sYXp5IExhenkgbG9hZFxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3QtcmVtb3RlLWZpbHRlciBSZW1vdGUgZmlsdGVyXG4gKlxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgYmVhdXRpZnVsIHNlbGVjdCBjb250cm9sIHRoYXQgY2FuIG1ha2UgeW91ciBsaWZlIGVhc2llciBhbmQgYWxzbyBsb29rcyBnb29kLlxuICogQGZpcmVzIG1vbnN0ZXItY2hhbmdlXG4gKiBAZmlyZXMgbW9uc3Rlci1jaGFuZ2VkXG4gKi9cbmNsYXNzIFNlbGVjdCBleHRlbmRzIEN1c3RvbUNvbnRyb2wge1xuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0aW5pdE9wdGlvbk9ic2VydmVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge1N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvY29tcG9uZW50cy9mb3JtL3NlbGVjdEBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSBTZWxlY3Rcblx0ICpcblx0ICogYGBgXG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLXNlbGVjdCcpO1xuXHQgKiBjb25zb2xlLmxvZyhlLnZhbHVlKVxuXHQgKiAvLyBcdTIxQTYgMVxuXHQgKiAvLyBcdTIxQTYgWycxJywnMiddXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXQgdmFsdWUoKSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRTZWxlY3Rpb25Ub1ZhbHVlLmNhbGwodGhpcywgdGhpcy5nZXRPcHRpb24oXCJzZWxlY3Rpb25cIikpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9hdHRhY2hJbnRlcm5hbHN9XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IGZvcm1Bc3NvY2lhdGVkKCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBzZWxlY3Rpb25cblx0ICpcblx0ICogYGBgXG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLXNlbGVjdCcpO1xuXHQgKiBlLnZhbHVlPTFcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfGFycmF5fSB2YWx1ZVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuXHQgKiBAZmlyZXMgbW9uc3Rlci1zZWxlY3RlZCB0aGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBzZXRcblx0ICovXG5cdHNldCB2YWx1ZSh2YWx1ZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRWYWx1ZVRvU2VsZWN0aW9uLmNhbGwodGhpcywgdmFsdWUpO1xuXHRcdHNldFNlbGVjdGlvblxuXHRcdFx0LmNhbGwodGhpcywgcmVzdWx0LnNlbGVjdGlvbilcblx0XHRcdC50aGVuKCgpID0+IHt9KVxuXHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0b2dnbGVFdmVudFR5cGU9Y2xpY2ssdG91Y2ggTGlzdCBvZiBldmVudCB0eXBlcyB0byBiZSBvYnNlcnZlZCBmb3Igb3BlbmluZyB0aGUgZHJvcGRvd25cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBkZWxlZ2F0ZXNGb2N1cz1mYWxzZSBsb3JlbSBbc2VlIG1vemlsbGEub3JnXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2hhZG93Um9vdC9kZWxlZ2F0ZXNGb2N1cylcblx0ICogQHByb3BlcnR5IHtPYmplY3RbXX0gb3B0aW9ucyBTZWxlY3Rpb24gb2Yga2V5IGlkZW50aWZpZXIgcGFpcnMgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gYW5kIGRpc3BsYXllZCBpbiB0aGUgZHJvcGRvd24uXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcHRpb25zW10ubGFiZWxcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IG9wdGlvbnNbXS52YWx1ZVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gb3B0aW9uc1tdLnZpc2liaWxpdHkgaGlkZGVuIG9yIHZpc2libGVcblx0ICogQHByb3BlcnR5IHtBcnJheX0gc2VsZWN0aW9uIFNlbGVjdGVkIG9wdGlvbnNcblx0ICogQHByb3BlcnR5IHtJbnRlZ2VyfSBzaG93TWF4T3B0aW9ucz0xMCBNYXhpbXVtIG51bWJlciBvZiB2aXNpYmxlIG9wdGlvbnMgYmVmb3JlIGEgc2Nyb2xsIGJhciBzaG91bGQgYmUgZGlzcGxheWVkLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZT1yYWRpbyBNdWx0aXBsZSAoY2hlY2tib3gpIG9yIHNpbmdsZSBzZWxlY3Rpb24gKHJhZGlvKVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZT0ocmFuZG9tIGlkKSBOYW1lIG9mIHRoZSBmb3JtIGZpZWxkXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgTG9hZCBvcHRpb25zIGZyb20gc2VydmVyIHBlciB1cmxcblx0ICogQHByb3BlcnR5IHtvYmplY3R9IGxvb2t1cCBMb2FkIG9wdGlvbnMgZnJvbSBzZXJ2ZXIgcGVyIHVybFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbG9va3VwLnVybD1udWxsIExvYWQgb3B0aW9ucyBmcm9tIHNlcnZlciBwZXIgdXJsXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9va3VwLmdyb3VwaW5nPWZhbHNlIExvYWQgYWxsIHNlbGVjdGVkIG9wdGlvbnMgZnJvbSBzZXJ2ZXIgcGVyIHVybCBhdCBvbmNlICh0cnVlKSBvciBvbmUgYnkgb25lIChmYWxzZSlcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoIEZldGNoIFtzZWUgVXNpbmcgRmV0Y2ggbW96aWxsYS5vcmddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkvVXNpbmdfRmV0Y2gpXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5yZWRpcmVjdD1lcnJvclxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubWV0aG9kPUdFVFxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubW9kZT1zYW1lLW9yaWdpblxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2guY3JlZGVudGlhbHM9c2FtZS1vcmlnaW5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoLmhlYWRlcnM9e1wiYWNjZXB0XCI6XCJhcHBsaWNhdGlvbi9qc29uXCJ9fVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gbGFiZWxzXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbHMuY2Fubm90LWJlLWxvYWRlZCBjYW5ub3QgYmUgbG9hZGVkXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbHMubm8tb3B0aW9ucy1hdmFpbGFibGUgbm8gb3B0aW9ucyBhdmFpbGFibGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5zZWxlY3QtYW4tb3B0aW9uIHNlbGVjdCBhbiBvcHRpb25cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5uby1vcHRpb24gbm8gb3B0aW9uIGluIHRoZSBsaXN0LCBtYXliZSB5b3UgaGF2ZSB0byBjaGFuZ2UgdGhlIGZpbHRlclxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZmVhdHVyZXMgTGlzdCB3aXRoIGZlYXR1cmVzXG5cdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZmVhdHVyZXMuY2xlYXJBbGw9dHJ1ZSBEaXNwbGF5IG9mIGEgZGVsZXRlIGJ1dHRvbiB0byBkZWxldGUgdGhlIGVudGlyZSBzZWxlY3Rpb25cblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBmZWF0dXJlcy5jbGVhcj10cnVlIERpc3BsYXkgb2YgYSBkZWxldGUga2V5IGZvciBkZWxldGluZyB0aGUgc3BlY2lmaWMgc2VsZWN0aW9uXG5cdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZmVhdHVyZXMubGF6eUxvYWQ9ZmFsc2UgTG9hZCBvcHRpb25zIHdoZW4gZmlyc3Qgb3BlbmluZyB0aGUgZHJvcGRvd24uIChIaW50OyBsYXp5bExvYWQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHJlbW90ZSBmaWx0ZXIpXG5cdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZmVhdHVyZXMuY2xvc2VPblNlbGVjdD1mYWxzZSBDbG9zZSB0aGUgZHJvcGRvd24gd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHNpbmNlIDMuNTQuMClcblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBmZWF0dXJlcy5lbXB0eVZhbHVlSWZOb09wdGlvbnM9ZmFsc2UgSWYgbm8gb3B0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgc2VsZWN0aW9uIGlzIHNldCB0byBhbiBlbXB0eSBhcnJheVxuXHQgKiBAcHJvcGVydHkge0Jvb2xlYW59IGZlYXR1cmVzLnN0b3JlRmV0Y2hlZERhdGE9ZmFsc2UgU3RvcmUgZmV0Y2hlZCBkYXRhIGluIHRoZSBvYmplY3Rcblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBmZWF0dXJlcy51c2VTdHJpY3RWYWx1ZUNvbXBhcmlzb249dHJ1ZSBVc2Ugc3RyaWN0IHZhbHVlIGNvbXBhcmlzb24gZm9yIHRoZSBzZWxlY3Rpb25cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbHRlci5kZWZhdWx0VmFsdWU9bnVsbCBEZWZhdWx0IGZpbHRlciB2YWx1ZSwgaWYgdGhlIGZpbHRlciBpcyBlbXB0eSwgaWYgdGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbCwgdGhlbiBubyByZXF1ZXN0IGlzIG1hZGVcblx0ICogQHByb3BlcnR5IHtCb29sZWFufSBmaWx0ZXIubW9kZT1vcHRpb25zIEZpbHRlciBtb2RlLCB2YWx1ZXM6IG9wdGlvbnMsIHJlbW90ZSwgZGlzYWJsZWQgKEhpbnQ7IGxhenlsTG9hZCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggcmVtb3RlIGZpbHRlciwgaWYgeW91IHVzZSByZW1vdGUgZmlsdGVyLCB0aGUgbGF6eUxvYWQgaXMgZGlzYWJsZWQpXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgVGVtcGxhdGUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIE1haW4gdGVtcGxhdGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlTWFwcGluZyBNYXBwaW5nIG9mIHRoZSB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlTWFwcGluZy5zZWxlY3RlZCBTZWxlY3RlZCBUZW1wbGF0ZVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gcG9wcGVyIFtQb3BwZXJKUyBPcHRpb25zXShodHRwczovL3BvcHBlci5qcy5vcmcvZG9jcy92Mi8pXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwb3BwZXIucGxhY2VtZW50PWJvdHRvbSBQb3BwZXJKUyBwbGFjZW1lbnRcblx0ICogQHByb3BlcnR5IHtPYmplY3RbXX0gbW9kaWZpZXJzPXtuYW1lOm9mZnNldH0gUG9wcGVySlMgcGxhY2VtZW50XG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtYXBwaW5nXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXBwaW5nLnNlbGVjdG9yPSogUGF0aCB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IG1hcHBpbmcubGFiZWxUZW1wbGF0ZT1cIlwiIHRlbXBsYXRlIHdpdGggdGhlIGxhYmVsIHBsYWNlaG9sZGVycyBpbiB0aGUgZm9ybSAke25hbWV9LCB3aGVyZSBuYW1lIGlzIHRoZSBrZXkgKCoqKVxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gbWFwcGluZy52YWx1ZVRlbXBsYXRlPVwiXCIgdGVtcGxhdGUgd2l0aCB0aGUgdmFsdWUgcGxhY2Vob2xkZXJzIGluIHRoZSBmb3JtICR7bmFtZX0sIHdoZXJlIG5hbWUgaXMgdGhlIGtleVxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtfmV4YW1wbGVGaWx0ZXJDYWxsYmFja3x1bmRlZmluZWR9IG1hcHBpbmcuZmlsdGVyIEZpbHRlcmluZyBvZiB2YWx1ZXMgdmlhIGEgZnVuY3Rpb25cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZvcm1hdHRlclxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtfmZvcm1hdHRlclNlbGVjdGlvbkNhbGxiYWNrfHVuZGVmaW5lZH0gZm9ybWF0dGVyLnNlbGVjdGlvbiBmb3JtYXQgc2VsZWN0aW9uIGxhYmVsXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7fSxcblx0XHRcdHN1cGVyLmRlZmF1bHRzLFxuXHRcdFx0e1xuXHRcdFx0XHR0b2dnbGVFdmVudFR5cGU6IFtcImNsaWNrXCIsIFwidG91Y2hcIl0sXG5cdFx0XHRcdGRlbGVnYXRlc0ZvY3VzOiBmYWxzZSxcblx0XHRcdFx0b3B0aW9uczogW10sXG5cdFx0XHRcdHNlbGVjdGlvbjogW10sXG5cdFx0XHRcdHNob3dNYXhPcHRpb25zOiAxMCxcblx0XHRcdFx0dHlwZTogXCJyYWRpb1wiLFxuXHRcdFx0XHRuYW1lOiBuZXcgSUQoXCJzXCIpLnRvU3RyaW5nKCksXG5cdFx0XHRcdGZlYXR1cmVzOiB7XG5cdFx0XHRcdFx0Y2xlYXJBbGw6IHRydWUsXG5cdFx0XHRcdFx0Y2xlYXI6IHRydWUsXG5cdFx0XHRcdFx0bGF6eUxvYWQ6IGZhbHNlLFxuXHRcdFx0XHRcdGNsb3NlT25TZWxlY3Q6IGZhbHNlLFxuXHRcdFx0XHRcdGVtcHR5VmFsdWVJZk5vT3B0aW9uczogZmFsc2UsXG5cdFx0XHRcdFx0c3RvcmVGZXRjaGVkRGF0YTogZmFsc2UsXG5cdFx0XHRcdFx0dXNlU3RyaWN0VmFsdWVDb21wYXJpc29uOiBmYWxzZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dXJsOiBudWxsLFxuXHRcdFx0XHRsb29rdXA6IHtcblx0XHRcdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRcdFx0Z3JvdXBpbmc6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbHM6IGdldFRyYW5zbGF0aW9ucygpLFxuXHRcdFx0XHRtZXNzYWdlczoge1xuXHRcdFx0XHRcdGNvbnRyb2w6IG51bGwsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IG51bGwsXG5cdFx0XHRcdFx0ZW1wdHlPcHRpb25zOiBudWxsLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmZXRjaDoge1xuXHRcdFx0XHRcdHJlZGlyZWN0OiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdG1vZGU6IFwic2FtZS1vcmlnaW5cIixcblx0XHRcdFx0XHRjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiLFxuXHRcdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRcdGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZmlsdGVyOiB7XG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlOiBudWxsLFxuXHRcdFx0XHRcdG1vZGU6IEZJTFRFUl9NT0RFX0RJU0FCTEVELFxuXHRcdFx0XHRcdHBvc2l0aW9uOiBGSUxURVJfUE9TSVRJT05fSU5MSU5FLFxuXHRcdFx0XHRcdG1hcmtlcjoge1xuXHRcdFx0XHRcdFx0b3BlbjogXCJ7XCIsXG5cdFx0XHRcdFx0XHRjbG9zZTogXCJ9XCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2xhc3Nlczoge1xuXHRcdFx0XHRcdGJhZGdlOiBcIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeVwiLFxuXHRcdFx0XHRcdHN0YXR1c09yUmVtb3ZlQmFkZ2U6IFwiZW1wdHlcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0bWFwcGluZzoge1xuXHRcdFx0XHRcdHNlbGVjdG9yOiBcIipcIixcblx0XHRcdFx0XHRsYWJlbFRlbXBsYXRlOiBcIlwiLFxuXHRcdFx0XHRcdHZhbHVlVGVtcGxhdGU6IFwiXCIsXG5cdFx0XHRcdFx0ZmlsdGVyOiBudWxsLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmb3JtYXR0ZXI6IHtcblx0XHRcdFx0XHRzZWxlY3Rpb246IGJ1aWxkU2VsZWN0aW9uTGFiZWwsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRlbXBsYXRlTWFwcGluZzoge1xuXHRcdFx0XHRcdC8qKiB3aXRoIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1zZWxlY3RlZC10ZW1wbGF0ZWAgdGhlIHRlbXBsYXRlIGZvciB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBjYW4gYmUgZGVmaW5lZC4gKi9cblx0XHRcdFx0XHRzZWxlY3RlZDogZ2V0U2VsZWN0aW9uVGVtcGxhdGUoKSxcblx0XHRcdFx0fSxcblxuXHRcdFx0XHRwb3BwZXI6IHtcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0bWlkZGxld2FyZTogW1wiZmxpcFwiLCBcIm9mZnNldDoxXCJdLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGluaXRPcHRpb25zRnJvbUFyZ3VtZW50cy5jYWxsKHRoaXMpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7U2VsZWN0fVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHNlbGYpO1xuXHRcdGluaXRFdmVudEhhbmRsZXIuY2FsbChzZWxmKTtcblxuXHRcdGxldCBsYXp5TG9hZEZsYWcgPSBzZWxmLmdldE9wdGlvbihcImZlYXR1cmVzLmxhenlMb2FkXCIsIGZhbHNlKTtcblx0XHRsZXQgcmVtb3RlRmlsdGVyRmxhZyA9IGdldEZpbHRlck1vZGUuY2FsbCh0aGlzKSA9PT0gRklMVEVSX01PREVfUkVNT1RFO1xuXG5cdFx0aWYgKGdldEZpbHRlck1vZGUuY2FsbCh0aGlzKSA9PT0gRklMVEVSX01PREVfUkVNT1RFKSB7XG5cdFx0XHRzZWxmLmdldE9wdGlvbihcImZlYXR1cmVzLmxhenlMb2FkXCIsIGZhbHNlKTtcblx0XHRcdGlmIChsYXp5TG9hZEZsYWcgPT09IHRydWUpIHtcblx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdFx0XHRcdFwibGF6eUxvYWQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHJlbW90ZSBmaWx0ZXJcIixcblx0XHRcdFx0KTtcblx0XHRcdFx0bGF6eUxvYWRGbGFnID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGYuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcblx0XHRcdG5ldyBQcm9jZXNzaW5nKDEwLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuXHRcdFx0fSlcblx0XHRcdFx0LnJ1bigpXG5cdFx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChzZWxmLmdldE9wdGlvbihcInVybFwiKSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKGxhenlMb2FkRmxhZyB8fCByZW1vdGVGaWx0ZXJGbGFnKSB7XG5cdFx0XHRcdGxvb2t1cFNlbGVjdGlvbi5jYWxsKHNlbGYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5mZXRjaCgpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgYCR7ZX1gKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IGxhc3RWYWx1ZSA9IHNlbGYudmFsdWU7XG5cdFx0c2VsZltpbnRlcm5hbFN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIoXG5cdFx0XHRuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoaXNPYmplY3QodGhpcykgJiYgdGhpcyBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXIpIHtcblx0XHRcdFx0XHRjb25zdCBuID0gdGhpcy5nZXRTdWJqZWN0KCk/Lm9wdGlvbnM/LnZhbHVlO1xuXG5cdFx0XHRcdFx0aWYgKGxhc3RWYWx1ZSAhPT0gbikge1xuXHRcdFx0XHRcdFx0bGFzdFZhbHVlID0gbjtcblx0XHRcdFx0XHRcdHNldFNlbGVjdGlvblxuXHRcdFx0XHRcdFx0XHQuY2FsbChzZWxmLCBuKVxuXHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgYCR7ZX1gKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHQpO1xuXG5cdFx0YXJlT3B0aW9uc0F2YWlsYWJsZUFuZEluaXQuY2FsbChzZWxmKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBzdG9yZUZldGNoZWREYXRhIGlzIG5vdCBlbmFibGVkXG5cdCAqIEBzaW5jZSAzLjY2LjBcblx0ICovXG5cdGdldExhc3RGZXRjaGVkRGF0YSgpIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5zdG9yZUZldGNoZWREYXRhXCIpID09PSBmYWxzZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3RvcmVGZXRjaGVkRGF0YSBpcyBub3QgZW5hYmxlZFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcz8uW2xhc3RGZXRjaGVkRGF0YVN5bWJvbF07XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJ1dHRvbi5jbGljaygpIG1ldGhvZCBzaW11bGF0ZXMgYSBjbGljayBvbiB0aGUgaW50ZXJuYWwgYnV0dG9uIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjI3LjBcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50L2NsaWNrfVxuXHQgKi9cblx0Y2xpY2soKSB7XG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZGlzYWJsZWRcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0b2dnbGUuY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQnV0dG9uLmZvY3VzKCkgbWV0aG9kIHNldHMgZm9jdXMgb24gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy4yNy4wXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1c31cblx0ICovXG5cdGZvY3VzKG9wdGlvbnMpIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJkaXNhYmxlZFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRcdGdhdGhlclN0YXRlLmNhbGwodGhpcyk7XG5cdFx0XHRmb2N1c0ZpbHRlci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHRcdH0pXG5cdFx0XHQucnVuKClcblx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBgJHtlfWApO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJ1dHRvbi5ibHVyKCkgbWV0aG9kIHJlbW92ZXMgZm9jdXMgZnJvbSB0aGUgaW50ZXJuYWwgYnV0dG9uIGVsZW1lbnQuXG5cdCAqIEBsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9ibHVyXG5cdCAqL1xuXHRibHVyKCkge1xuXHRcdG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRcdGdhdGhlclN0YXRlLmNhbGwodGhpcyk7XG5cdFx0XHRibHVyRmlsdGVyLmNhbGwodGhpcyk7XG5cdFx0fSlcblx0XHRcdC5ydW4oKVxuXHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGAke2V9YCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiBubyB1cmwgaXMgc3BlY2lmaWVkLCB0aGUgb3B0aW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgQ29tcG9uZW50IGl0c2VsZi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmwgVVJMIHRvIGZldGNoIHRoZSBvcHRpb25zXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHRmZXRjaCh1cmwpIHtcblx0XHRyZXR1cm4gZmV0Y2hJdC5jYWxsKHRoaXMsIHVybCk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdFx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG5cdFx0Zm9yIChjb25zdCBbLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyhbXCJjbGlja1wiLCBcInRvdWNoXCJdKSkge1xuXHRcdFx0Ly8gY2xvc2Ugb24gb3V0c2lkZSB1aS1ldmVudHNcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc1tjbG9zZUV2ZW50SGFuZGxlcl0pO1xuXHRcdH1cblxuXHRcdHBhcnNlU2xvdHNUb09wdGlvbnMuY2FsbCh0aGlzKTtcblx0XHRhdHRhY2hSZXNpemVPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHRcdHVwZGF0ZVBvcHBlci5jYWxsKHRoaXMpO1xuXG5cdFx0bmV3IFByb2Nlc3NpbmcoKCkgPT4ge1xuXHRcdFx0Z2F0aGVyU3RhdGUuY2FsbCh0aGlzKTtcblx0XHRcdGZvY3VzRmlsdGVyLmNhbGwodGhpcyk7XG5cdFx0fSlcblx0XHRcdC5ydW4oKVxuXHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGAke2V9YCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0XHRjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cblx0XHQvLyBjbG9zZSBvbiBvdXRzaWRlIHVpLWV2ZW50c1xuXHRcdGZvciAoY29uc3QgWywgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMoW1wiY2xpY2tcIiwgXCJ0b3VjaFwiXSkpIHtcblx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc1tjbG9zZUV2ZW50SGFuZGxlcl0pO1xuXHRcdH1cblxuXHRcdGRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEltcG9ydCBTZWxlY3QgT3B0aW9ucyBmcm9tIGRhdGFzZXRcblx0ICogTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdGhlIGNvbnRyb2wgZGVmYXVsdHMvb3B0aW9uc1xuXHQgKlxuXHQgKiBAcGFyYW0ge2FycmF5fG9iamVjdHxNYXB8U2V0fSBkYXRhXG5cdCAqIEByZXR1cm4ge1NlbGVjdH1cblx0ICogQHRocm93cyB7RXJyb3J9IG1hcCBpcyBub3QgaXRlcmFibGVcblx0ICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgbGFiZWwgY29uZmlndXJhdGlvblxuXHQgKiBAZmlyZXMgbW9uc3Rlci1vcHRpb25zLXNldCB0aGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIG9wdGlvbnMgYXJlIHNldFxuXHQgKi9cblx0aW1wb3J0T3B0aW9ucyhkYXRhKSB7XG5cdFx0Y29uc3QgbWFwcGluZ09wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcIm1hcHBpbmdcIiwge30pO1xuXHRcdGNvbnN0IHNlbGVjdG9yID0gbWFwcGluZ09wdGlvbnM/LltcInNlbGVjdG9yXCJdO1xuXHRcdGNvbnN0IGxhYmVsVGVtcGxhdGUgPSBtYXBwaW5nT3B0aW9ucz8uW1wibGFiZWxUZW1wbGF0ZVwiXTtcblx0XHRjb25zdCB2YWx1ZVRlbXBsYXRlID0gbWFwcGluZ09wdGlvbnM/LltcInZhbHVlVGVtcGxhdGVcIl07XG5cdFx0Y29uc3QgZmlsdGVyID0gbWFwcGluZ09wdGlvbnM/LltcImZpbHRlclwiXTtcblxuXHRcdGxldCBmbGFnID0gZmFsc2U7XG5cdFx0aWYgKGxhYmVsVGVtcGxhdGUgPT09IFwiXCIpIHtcblx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIFwiZW1wdHkgbGFiZWwgdGVtcGxhdGVcIik7XG5cdFx0XHRmbGFnID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWVUZW1wbGF0ZSA9PT0gXCJcIikge1xuXHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgXCJlbXB0eSB2YWx1ZSB0ZW1wbGF0ZVwiKTtcblx0XHRcdGZsYWcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChmbGFnID09PSB0cnVlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIGxhYmVsIGNvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWFwID0gYnVpbGRNYXAoZGF0YSwgc2VsZWN0b3IsIGxhYmVsVGVtcGxhdGUsIHZhbHVlVGVtcGxhdGUsIGZpbHRlcik7XG5cblx0XHRjb25zdCBvcHRpb25zID0gW107XG5cblx0XHRpZiAoIWlzSXRlcmFibGUobWFwKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWFwIGlzIG5vdCBpdGVyYWJsZVwiKTtcblx0XHR9XG5cblx0XHRjb25zdCB2aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG5cblx0XHRtYXAuZm9yRWFjaCgobGFiZWwsIHZhbHVlKSA9PiB7XG5cdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0bGFiZWwsXG5cdFx0XHRcdHZpc2liaWxpdHksXG5cdFx0XHRcdGRhdGE6IG1hcC5nZXQodmFsdWUpLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRydW5Bc09wdGlvbkxlbmd0aENoYW5nZWQuY2FsbCh0aGlzLCBtYXAuc2l6ZSk7XG5cdFx0dGhpcy5zZXRPcHRpb24oXCJvcHRpb25zXCIsIG9wdGlvbnMpO1xuXG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1vcHRpb25zLXNldFwiLCB7XG5cdFx0XHRvcHRpb25zLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQHJldHVybiB7U2VsZWN0fVxuXHQgKi9cblx0Y2FsY0FuZFNldE9wdGlvbnNEaW1lbnNpb24oKSB7XG5cdFx0Y2FsY0FuZFNldE9wdGlvbnNEaW1lbnNpb24uY2FsbCh0aGlzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItc2VsZWN0XCI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtTZWxlY3RTdHlsZVNoZWV0XTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRUcmFuc2xhdGlvbnMoKSB7XG5cdGNvbnN0IGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKTtcblx0c3dpdGNoIChsb2NhbGUubGFuZ3VhZ2UpIHtcblx0XHRjYXNlIFwiZGVcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwiY2Fubm90LWJlLWxvYWRlZFwiOiBcIkthbm4gbmljaHQgZ2VsYWRlbiB3ZXJkZW5cIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWF2YWlsYWJsZVwiOiBcIktlaW5lIE9wdGlvbmVuIHZlcmZcdTAwRkNnYmFyLlwiLFxuXHRcdFx0XHRcImNsaWNrLXRvLWxvYWQtb3B0aW9uc1wiOiBcIktsaWNrZW4sIHVtIE9wdGlvbmVuIHp1IGxhZGVuLlwiLFxuXHRcdFx0XHRcInNlbGVjdC1hbi1vcHRpb25cIjogXCJXXHUwMEU0aGxlIGVpbmUgT3B0aW9uXCIsXG5cdFx0XHRcdFwic3VtbWFyeS10ZXh0XCI6IHtcblx0XHRcdFx0XHR6ZXJvOiBcIktlaW5lIEVpbnRyXHUwMEU0Z2UgYXVzZ2V3XHUwMEU0aGx0XCIsXG5cdFx0XHRcdFx0b25lOiAnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPjE8L3NwYW4+IEVpbnRyYWcgYXVzZ2V3XHUwMEU0aGx0Jyxcblx0XHRcdFx0XHRvdGhlcjpcblx0XHRcdFx0XHRcdCc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+JHtjb3VudH08L3NwYW4+IEVpbnRyXHUwMEU0Z2UgYXVzZ2V3XHUwMEU0aGx0Jyxcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJuby1vcHRpb25zXCI6IFwiTGVpZGVyIGdpYnQgZXMga2VpbmUgT3B0aW9uZW4gaW4gZGVyIExpc3RlLlwiLFxuXHRcdFx0XHRcIm5vLW9wdGlvbnMtZm91bmRcIjpcblx0XHRcdFx0XHRcIktlaW5lIE9wdGlvbmVuIGluIGRlciBMaXN0ZSB2ZXJmXHUwMEZDZ2Jhci4gQml0dGUgXHUwMEU0bmRlcm4gU2llIGRlbiBGaWx0ZXIuXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJmclwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJjYW5ub3QtYmUtbG9hZGVkXCI6IFwiSW1wb3NzaWJsZSBkZSBjaGFyZ2VyXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1hdmFpbGFibGVcIjogXCJBdWN1bmUgb3B0aW9uIGRpc3BvbmlibGUuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiQ2xpcXVleiBwb3VyIGNoYXJnZXIgbGVzIG9wdGlvbnMuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIlNcdTAwRTlsZWN0aW9ubmV6IHVuZSBvcHRpb25cIixcblx0XHRcdFx0XCJzdW1tYXJ5LXRleHRcIjoge1xuXHRcdFx0XHRcdHplcm86IFwiQXVjdW5lIGVudHJcdTAwRTllIHNcdTAwRTlsZWN0aW9ublx1MDBFOWVcIixcblx0XHRcdFx0XHRvbmU6ICc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+MTwvc3Bhbj4gZW50clx1MDBFOWUgc1x1MDBFOWxlY3Rpb25uXHUwMEU5ZScsXG5cdFx0XHRcdFx0b3RoZXI6XG5cdFx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPiR7Y291bnR9PC9zcGFuPiBlbnRyXHUwMEU5ZXMgc1x1MDBFOWxlY3Rpb25uXHUwMEU5ZXMnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIm5vLW9wdGlvbnNcIjpcblx0XHRcdFx0XHRcIk1hbGhldXJldXNlbWVudCwgaWwgbid5IGEgcGFzIGQnb3B0aW9ucyBkaXNwb25pYmxlcyBkYW5zIGxhIGxpc3RlLlwiLFxuXHRcdFx0XHRcIm5vLW9wdGlvbnMtZm91bmRcIjpcblx0XHRcdFx0XHRcIkF1Y3VuZSBvcHRpb24gZGlzcG9uaWJsZSBkYW5zIGxhIGxpc3RlLiBWZXVpbGxleiBtb2RpZmllciBsZSBmaWx0cmUuXCIsXG5cdFx0XHR9O1xuXG5cdFx0Y2FzZSBcInNwXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImNhbm5vdC1iZS1sb2FkZWRcIjogXCJObyBzZSBwdWVkZSBjYXJnYXJcIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWF2YWlsYWJsZVwiOiBcIk5vIGhheSBvcGNpb25lcyBkaXNwb25pYmxlcy5cIixcblx0XHRcdFx0XCJjbGljay10by1sb2FkLW9wdGlvbnNcIjogXCJIYWdhIGNsaWMgcGFyYSBjYXJnYXIgb3BjaW9uZXMuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIlNlbGVjY2lvbmUgdW5hIG9wY2lcdTAwRjNuXCIsXG5cdFx0XHRcdFwic3VtbWFyeS10ZXh0XCI6IHtcblx0XHRcdFx0XHR6ZXJvOiBcIk5vIHNlIHNlbGVjY2lvbmFyb24gZW50cmFkYXNcIixcblx0XHRcdFx0XHRvbmU6ICc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+MTwvc3Bhbj4gZW50cmFkYSBzZWxlY2Npb25hZGEnLFxuXHRcdFx0XHRcdG90aGVyOlxuXHRcdFx0XHRcdFx0JzxzcGFuIGNsYXNzPVwibW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGxcIj4ke2NvdW50fTwvc3Bhbj4gZW50cmFkYXMgc2VsZWNjaW9uYWRhcycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwibm8tb3B0aW9uc1wiOlxuXHRcdFx0XHRcdFwiRGVzYWZvcnR1bmFkYW1lbnRlLCBubyBoYXkgb3BjaW9uZXMgZGlzcG9uaWJsZXMgZW4gbGEgbGlzdGEuXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1mb3VuZFwiOlxuXHRcdFx0XHRcdFwiTm8gaGF5IG9wY2lvbmVzIGRpc3BvbmlibGVzIGVuIGxhIGxpc3RhLiBDb25zaWRlcmUgbW9kaWZpY2FyIGVsIGZpbHRyby5cIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcIml0XCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImNhbm5vdC1iZS1sb2FkZWRcIjogXCJOb24gcHVcdTAwRjIgZXNzZXJlIGNhcmljYXRvXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1hdmFpbGFibGVcIjogXCJOZXNzdW5hIG9wemlvbmUgZGlzcG9uaWJpbGUuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiQ2xpY2NhIHBlciBjYXJpY2FyZSBsZSBvcHppb25pLlwiLFxuXHRcdFx0XHRcInNlbGVjdC1hbi1vcHRpb25cIjogXCJTZWxlemlvbmEgdW4nb3B6aW9uZVwiLFxuXHRcdFx0XHRcInN1bW1hcnktdGV4dFwiOiB7XG5cdFx0XHRcdFx0emVybzogXCJOZXNzdW5hIHZvY2Ugc2VsZXppb25hdGFcIixcblx0XHRcdFx0XHRvbmU6ICc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+MTwvc3Bhbj4gdm9jZSBzZWxlemlvbmF0YScsXG5cdFx0XHRcdFx0b3RoZXI6XG5cdFx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPiR7Y291bnR9PC9zcGFuPiB2b2NpIHNlbGV6aW9uYXRlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJuby1vcHRpb25zXCI6IFwiUHVydHJvcHBvLCBub24gY2kgc29ubyBvcHppb25pIGRpc3BvbmliaWxpIG5lbGxhIGxpc3RhLlwiLFxuXHRcdFx0XHRcIm5vLW9wdGlvbnMtZm91bmRcIjpcblx0XHRcdFx0XHRcIk5lc3N1bmEgb3B6aW9uZSBkaXNwb25pYmlsZSBuZWxsYSBsaXN0YS4gU2kgcHJlZ2EgZGkgbW9kaWZpY2FyZSBpbCBmaWx0cm8uXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJwbFwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJjYW5ub3QtYmUtbG9hZGVkXCI6IFwiTmllIG1vXHUwMTdDbmEgemFcdTAxNDJhZG93YVx1MDEwN1wiLFxuXHRcdFx0XHRcIm5vLW9wdGlvbnMtYXZhaWxhYmxlXCI6IFwiQnJhayBkb3N0XHUwMTE5cG55Y2ggb3BjamkuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiS2xpa25paiwgYWJ5IHphXHUwMTQyYWRvd2FcdTAxMDcgb3BjamUuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIld5Ymllcnogb3Bjalx1MDExOVwiLFxuXHRcdFx0XHRcInN1bW1hcnktdGV4dFwiOiB7XG5cdFx0XHRcdFx0emVybzogXCJOaWUgd3licmFubyBcdTAxN0NhZG55Y2ggd3Bpc1x1MDBGM3dcIixcblx0XHRcdFx0XHRvbmU6ICc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+MTwvc3Bhbj4gd3BpcyB6b3N0YVx1MDE0MiB3eWJyYW55Jyxcblx0XHRcdFx0XHRvdGhlcjpcblx0XHRcdFx0XHRcdCc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+JHtjb3VudH08L3NwYW4+IHdwaXN5IHpvc3RhXHUwMTQyeSB3eWJyYW5lJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJuby1vcHRpb25zXCI6IFwiTmllc3RldHksIG5pZSBtYSBkb3N0XHUwMTE5cG55Y2ggb3BjamkgbmEgbGlcdTAxNUJjaWUuXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1mb3VuZFwiOlxuXHRcdFx0XHRcdFwiQnJhayBkb3N0XHUwMTE5cG55Y2ggb3BjamkgbmEgbGlcdTAxNUJjaWUuIFJvendhXHUwMTdDIHptaWFuXHUwMTE5IGZpbHRyYS5cIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcIm5vXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImNhbm5vdC1iZS1sb2FkZWRcIjogXCJLYW4gaWtrZSBsYXN0ZXNcIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWF2YWlsYWJsZVwiOiBcIkluZ2VuIGFsdGVybmF0aXZlciB0aWxnamVuZ2VsaWcuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiS2xpa2sgZm9yIFx1MDBFNSBsYXN0ZSBhbHRlcm5hdGl2ZXIuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIlZlbGcgZXQgYWx0ZXJuYXRpdlwiLFxuXHRcdFx0XHRcInN1bW1hcnktdGV4dFwiOiB7XG5cdFx0XHRcdFx0emVybzogXCJJbmdlbiBvcHBmXHUwMEY4cmluZ2VyIGJsZSB2YWxndFwiLFxuXHRcdFx0XHRcdG9uZTogJzxzcGFuIGNsYXNzPVwibW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGxcIj4xPC9zcGFuPiBvcHBmXHUwMEY4cmluZyB2YWxndCcsXG5cdFx0XHRcdFx0b3RoZXI6XG5cdFx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPiR7Y291bnR9PC9zcGFuPiBvcHBmXHUwMEY4cmluZ2VyIHZhbGd0Jyxcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJuby1vcHRpb25zXCI6XG5cdFx0XHRcdFx0XCJEZXNzdmVycmUgZXIgZGV0IGluZ2VuIGFsdGVybmF0aXZlciB0aWxnamVuZ2VsaWcgaSBsaXN0ZW4uXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1mb3VuZFwiOlxuXHRcdFx0XHRcdFwiSW5nZW4gYWx0ZXJuYXRpdmVyIHRpbGdqZW5nZWxpZyBwXHUwMEU1IGxpc3Rlbi4gVnVyZGVyIFx1MDBFNSBlbmRyZSBmaWx0ZXJldC5cIixcblx0XHRcdH07XG5cblx0XHRjYXNlIFwiZGtcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwiY2Fubm90LWJlLWxvYWRlZFwiOiBcIkthbiBpa2tlIGluZGxcdTAwRTZzZXNcIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWF2YWlsYWJsZVwiOiBcIkluZ2VuIG11bGlnaGVkZXIgdGlsZ1x1MDBFNm5nZWxpZ2UuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiS2xpayBmb3IgYXQgaW5kbFx1MDBFNnNlIG11bGlnaGVkZXIuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIlZcdTAwRTZsZyBlbiBtdWxpZ2hlZFwiLFxuXHRcdFx0XHRcInN1bW1hcnktdGV4dFwiOiB7XG5cdFx0XHRcdFx0emVybzogXCJJbmdlbiBpbmRsXHUwMEU2ZyBibGV2IHZhbGd0XCIsXG5cdFx0XHRcdFx0b25lOiAnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPjE8L3NwYW4+IGluZGxcdTAwRTZnIGJsZXYgdmFsZ3QnLFxuXHRcdFx0XHRcdG90aGVyOlxuXHRcdFx0XHRcdFx0JzxzcGFuIGNsYXNzPVwibW9uc3Rlci1iYWRnZS1wcmltYXJ5LXBpbGxcIj4ke2NvdW50fTwvc3Bhbj4gaW5kbFx1MDBFNmcgYmxldiB2YWxndCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwibm8tb3B0aW9uc1wiOlxuXHRcdFx0XHRcdFwiRGVzdlx1MDBFNnJyZSBlciBkZXIgaW5nZW4gbXVsaWdoZWRlciB0aWxnXHUwMEU2bmdlbGlnZSBwXHUwMEU1IGxpc3Rlbi5cIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWZvdW5kXCI6XG5cdFx0XHRcdFx0XCJJbmdlbiBtdWxpZ2hlZGVyIHRpbGdcdTAwRTZuZ2VsaWdlIHBcdTAwRTUgbGlzdGVuLiBPdmVydmVqIGF0IFx1MDBFNm5kcmUgZmlsdGVyZXQuXCIsXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJzd1wiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJjYW5ub3QtYmUtbG9hZGVkXCI6IFwiS2FuIGludGUgbGFkZGFzXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1hdmFpbGFibGVcIjogXCJJbmdhIGFsdGVybmF0aXYgdGlsbGdcdTAwRTRuZ2xpZ2EuXCIsXG5cdFx0XHRcdFwiY2xpY2stdG8tbG9hZC1vcHRpb25zXCI6IFwiS2xpY2thIGZcdTAwRjZyIGF0dCBsYWRkYSBhbHRlcm5hdGl2LlwiLFxuXHRcdFx0XHRcInNlbGVjdC1hbi1vcHRpb25cIjogXCJWXHUwMEU0bGogZXR0IGFsdGVybmF0aXZcIixcblx0XHRcdFx0XCJzdW1tYXJ5LXRleHRcIjoge1xuXHRcdFx0XHRcdHplcm86IFwiSW5nYSBwb3N0ZXIgdmFsZGVzXCIsXG5cdFx0XHRcdFx0b25lOiAnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPjE8L3NwYW4+IHBvc3QgdmFsZGVzJyxcblx0XHRcdFx0XHRvdGhlcjpcblx0XHRcdFx0XHRcdCc8c3BhbiBjbGFzcz1cIm1vbnN0ZXItYmFkZ2UtcHJpbWFyeS1waWxsXCI+JHtjb3VudH08L3NwYW4+IHBvc3RlciB2YWxkZXMnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIm5vLW9wdGlvbnNcIjogXCJUeXZcdTAwRTRyciBmaW5ucyBkZXQgaW5nYSBhbHRlcm5hdGl2IHRpbGxnXHUwMEU0bmdsaWdhIGkgbGlzdGFuLlwiLFxuXHRcdFx0XHRcIm5vLW9wdGlvbnMtZm91bmRcIjpcblx0XHRcdFx0XHRcIkluZ2EgYWx0ZXJuYXRpdiBmaW5ucyB0aWxsZ1x1MDBFNG5nbGlnYSBpIGxpc3Rhbi4gXHUwMEQ2dmVydlx1MDBFNGcgYXR0IG1vZGlmaWVyYSBmaWx0cmV0LlwiLFxuXHRcdFx0fTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0Y2FzZSBcImVuXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImNhbm5vdC1iZS1sb2FkZWRcIjogXCJDYW5ub3QgYmUgbG9hZGVkXCIsXG5cdFx0XHRcdFwibm8tb3B0aW9ucy1hdmFpbGFibGVcIjogXCJObyBvcHRpb25zIGF2YWlsYWJsZS5cIixcblx0XHRcdFx0XCJjbGljay10by1sb2FkLW9wdGlvbnNcIjogXCJDbGljayB0byBsb2FkIG9wdGlvbnMuXCIsXG5cdFx0XHRcdFwic2VsZWN0LWFuLW9wdGlvblwiOiBcIlNlbGVjdCBhbiBvcHRpb25cIixcblx0XHRcdFx0XCJzdW1tYXJ5LXRleHRcIjoge1xuXHRcdFx0XHRcdHplcm86IFwiTm8gZW50cmllcyB3ZXJlIHNlbGVjdGVkXCIsXG5cdFx0XHRcdFx0b25lOiAnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPjE8L3NwYW4+IGVudHJ5IHdhcyBzZWxlY3RlZCcsXG5cdFx0XHRcdFx0b3RoZXI6XG5cdFx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJtb25zdGVyLWJhZGdlLXByaW1hcnktcGlsbFwiPiR7Y291bnR9PC9zcGFuPiBlbnRyaWVzIHdlcmUgc2VsZWN0ZWQnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIm5vLW9wdGlvbnNcIjpcblx0XHRcdFx0XHRcIlVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBubyBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUgbGlzdC5cIixcblx0XHRcdFx0XCJuby1vcHRpb25zLWZvdW5kXCI6XG5cdFx0XHRcdFx0XCJObyBvcHRpb25zIGFyZSBhdmFpbGFibGUgaW4gdGhlIGxpc3QuIFBsZWFzZSBjb25zaWRlciBtb2RpZnlpbmcgdGhlIGZpbHRlci5cIixcblx0XHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb29rdXBTZWxlY3Rpb24oKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHNlbGYuZ2V0T3B0aW9uKFwic2VsZWN0aW9uXCIpO1xuXHRcdGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGZbaXNMb2FkaW5nU3ltYm9sXSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzZWxmW2xhenlMb2FkRG9uZVN5bWJvbF0gPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgdXJsID0gc2VsZi5nZXRPcHRpb24oXCJ1cmxcIik7XG5cdFx0bGV0IGxvb2t1cFVybCA9IHNlbGYuZ2V0T3B0aW9uKFwibG9va3VwLnVybFwiKTtcblx0XHRpZiAobG9va3VwVXJsICE9PSBudWxsKSB7XG5cdFx0XHR1cmwgPSBsb29rdXBVcmw7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwibG9va3VwLmdyb3VwaW5nXCIpID09PSB0cnVlKSB7XG5cdFx0XHRmaWx0ZXJGcm9tUmVtb3RlQnlWYWx1ZVxuXHRcdFx0XHQuY2FsbChcblx0XHRcdFx0XHRzZWxmLFxuXHRcdFx0XHRcdHVybCxcblx0XHRcdFx0XHRzZWxlY3Rpb24ubWFwKChzKSA9PiBzPy5bXCJ2YWx1ZVwiXSksXG5cdFx0XHRcdClcblx0XHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgYCR7ZX1gKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBzIG9mIHNlbGVjdGlvbikge1xuXHRcdFx0aWYgKHM/LltcInZhbHVlXCJdKSB7XG5cdFx0XHRcdGZpbHRlckZyb21SZW1vdGVCeVZhbHVlLmNhbGwoc2VsZiwgdXJsLCBzPy5bXCJ2YWx1ZVwiXSkuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbihzZWxmLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBgJHtlfWApO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIDEwMCk7XG59XG5cbmZ1bmN0aW9uIGZldGNoSXQodXJsLCBjb250cm9sT3B0aW9ucykge1xuXHRpZiAodXJsIGluc3RhbmNlb2YgVVJMKSB7XG5cdFx0dXJsID0gdXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRpZiAodXJsICE9PSB1bmRlZmluZWQgJiYgdXJsICE9PSBudWxsKSB7XG5cdFx0dXJsID0gdmFsaWRhdGVTdHJpbmcodXJsKTtcblx0fSBlbHNlIHtcblx0XHR1cmwgPSB0aGlzLmdldE9wdGlvbihcInVybFwiKTtcblx0XHRpZiAodXJsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gdXJsIGRlZmluZWRcIikpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImxvYWRpbmdcIik7XG5cblx0XHRuZXcgUHJvY2Vzc2luZygxMCwgKCkgPT4ge1xuXHRcdFx0ZmV0Y2hEYXRhXG5cdFx0XHRcdC5jYWxsKHRoaXMsIHVybClcblx0XHRcdFx0LnRoZW4oKG1hcCkgPT4ge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGlzT2JqZWN0KG1hcCkgfHxcblx0XHRcdFx0XHRcdGlzQXJyYXkobWFwKSB8fFxuXHRcdFx0XHRcdFx0bWFwIGluc3RhbmNlb2YgU2V0IHx8XG5cdFx0XHRcdFx0XHRtYXAgaW5zdGFuY2VvZiBNYXBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaW1wb3J0T3B0aW9ucyhtYXApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRzZXRTdGF0dXNPclJlbW92ZUJhZGdlcy5jYWxsKHRoaXMsIFwiZXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR0aGlzW2xhc3RGZXRjaGVkRGF0YVN5bWJvbF0gPSBtYXA7XG5cblx0XHRcdFx0XHRcdGxldCByZXN1bHQ7XG5cdFx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldE9wdGlvbihcInNlbGVjdGlvblwiKTtcblx0XHRcdFx0XHRcdGxldCBuZXdWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRuZXdWYWx1ZSA9IHNlbGVjdGlvbjtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRuZXdWYWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJlc3VsdCA9IHNldFNlbGVjdGlvbi5jYWxsKHRoaXMsIG5ld1ZhbHVlKTtcblx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrT3B0aW9uU3RhdGUuY2FsbCh0aGlzKTtcblx0XHRcdFx0XHRcdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImNsb3NlZFwiKTtcblx0XHRcdFx0XHRcdFx0dXBkYXRlUG9wcGVyLmNhbGwodGhpcyk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImVycm9yXCIpO1xuXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJpbnZhbGlkIHJlc3BvbnNlXCIpKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImVycm9yXCIpO1xuXHRcdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHRcdC5ydW4oKVxuXHRcdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdHNldFN0YXR1c09yUmVtb3ZlQmFkZ2VzLmNhbGwodGhpcywgXCJlcnJvclwiKTtcblx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlKTtcblx0XHRcdFx0cmVqZWN0KGUpO1xuXHRcdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBVUkwgdG8gdGhpcyBzZWxlY3QuXG4gKlxuICogYGBgXG4gKiA8bW9uc3Rlci1zZWxlY3QgZGF0YS1tb25zdGVyLXVybD1cImh0dHBzOi8vZXhhbXBsZS5jb20vXCI+PC9tb25zdGVyLXNlbGVjdD5cbiAqIGBgYFxuICpcbiAqIEBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZCAyMDI0LTAxLTIxICh5b3Ugc2hvdWxkIHVzZSBkYXRhLW1vbnN0ZXItb3B0aW9uLS4uLilcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gaW5pdE9wdGlvbnNGcm9tQXJndW1lbnRzKCkge1xuXHRjb25zdCBvcHRpb25zID0ge307XG5cblx0Y29uc3QgdGVtcGxhdGUgPSB0aGlzLmdldEF0dHJpYnV0ZShcImRhdGEtbW9uc3Rlci1zZWxlY3RlZC10ZW1wbGF0ZVwiKTtcblx0aWYgKGlzU3RyaW5nKHRlbXBsYXRlKSkge1xuXHRcdGlmICghb3B0aW9uc1tcInRlbXBsYXRlTWFwcGluZ1wiXSkgb3B0aW9uc1tcInRlbXBsYXRlTWFwcGluZ1wiXSA9IHt9O1xuXG5cdFx0c3dpdGNoICh0ZW1wbGF0ZSkge1xuXHRcdFx0Y2FzZSBcInN1bW1hcnlcIjpcblx0XHRcdGNhc2UgXCJkZWZhdWx0XCI6XG5cdFx0XHRcdG9wdGlvbnNbXCJ0ZW1wbGF0ZU1hcHBpbmdcIl1bXCJzZWxlY3RlZFwiXSA9IGdldFN1bW1hcnlUZW1wbGF0ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJzZWxlY3RlZFwiOlxuXHRcdFx0XHRvcHRpb25zW1widGVtcGxhdGVNYXBwaW5nXCJdW1wic2VsZWN0ZWRcIl0gPSBnZXRTZWxlY3Rpb25UZW1wbGF0ZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRcdFx0XHRcImludmFsaWQgdGVtcGxhdGUsIHVzZSBzdW1tYXJ5IG9yIHNlbGVjdGVkXCIsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXR0YWNoUmVzaXplT2JzZXJ2ZXIoKSB7XG5cdC8vIGFnYWluc3QgZmxpY2tlcmluZ1xuXHR0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXSA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuXHRcdGlmICh0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdIGluc3RhbmNlb2YgRGVhZE1hbnNTd2l0Y2gpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0udG91Y2goKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdID0gbmV3IERlYWRNYW5zU3dpdGNoKDIwMCwgKCkgPT4ge1xuXHRcdFx0dXBkYXRlUG9wcGVyLmNhbGwodGhpcyk7XG5cdFx0XHRkZWxldGUgdGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXTtcblx0XHR9KTtcblx0fSk7XG5cblx0dGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0ub2JzZXJ2ZSh0aGlzLnBhcmVudEVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIoKSB7XG5cdGlmICh0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXSBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XG5cdFx0dGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0uZGlzY29ubmVjdCgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvblRlbXBsYXRlKCkge1xuXHRyZXR1cm4gYDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzZWxlY3Rpb25cIiBwYXJ0PVwic2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWluc2VydD1cInNlbGVjdGlvbiBwYXRoOnNlbGVjdGlvblwiIHJvbGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgPjxpbnB1dCB0eXBlPVwidGV4dFwiIHJvbGU9XCJzZWFyY2hib3hcIlxuICAgICAgICAgICAgICAgICAgICBwYXJ0PVwiaW5saW5lLWZpbHRlclwiIG5hbWU9XCJpbmxpbmUtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgPjxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm1lc3NhZ2VzLmNvbnRyb2xcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmA7XG59XG5cbmZ1bmN0aW9uIGdldFN1bW1hcnlUZW1wbGF0ZSgpIHtcblx0cmV0dXJuIGA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic2VsZWN0aW9uXCIgcm9sZT1cInNlYXJjaFwiIHBhcnQ9XCJzdW1tYXJ5XCI+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcm9sZT1cInNlYXJjaGJveFwiXG4gICAgICAgICAgIHBhcnQ9XCJpbmxpbmUtZmlsdGVyXCIgbmFtZT1cImlubGluZS1maWx0ZXJcIlxuICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImZpbHRlclwiXG4gICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgPlxuICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm1lc3NhZ2VzLnNlbGVjdGVkXCI+PC9kaXY+ICAgIFxuPC9kaXY+YDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcGFyc2VTbG90c1RvT3B0aW9ucygpIHtcblx0bGV0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcIm9wdGlvbnNcIik7XG5cdGlmICghaXNJdGVyYWJsZShvcHRpb25zKSkge1xuXHRcdG9wdGlvbnMgPSBbXTtcblx0fVxuXG5cdGxldCBjb3VudGVyID0gMTtcblx0Z2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwodGhpcywgXCJkaXZcIikuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdGxldCB2YWx1ZSA9IChjb3VudGVyKyspLnRvU3RyaW5nKCk7XG5cdFx0bGV0IHZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcblxuXHRcdGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGEtbW9uc3Rlci12YWx1ZVwiKSkge1xuXHRcdFx0dmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImRhdGEtbW9uc3Rlci12YWx1ZVwiKTtcblx0XHR9XG5cblx0XHRsZXQgbGFiZWwgPSBub2RlLm91dGVySFRNTDtcblxuXHRcdGlmIChub2RlLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XG5cdFx0XHR2aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcblx0XHR9XG5cblx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0dmFsdWUsXG5cdFx0XHRsYWJlbCxcblx0XHRcdHZpc2liaWxpdHksXG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJ1bkFzT3B0aW9uTGVuZ3RoQ2hhbmdlZC5jYWxsKHRoaXMsIG9wdGlvbnMubGVuZ3RoKTtcblx0dGhpcy5zZXRPcHRpb24oXCJvcHRpb25zXCIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIHdhaXQgdW50aWwgYWxsIG9wdGlvbnMgYXJlIGZpbmlzaGVkIHJlbmRlcmluZ1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2ludH0gdGFyZ2V0TGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIHJ1bkFzT3B0aW9uTGVuZ3RoQ2hhbmdlZCh0YXJnZXRMZW5ndGgpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0aWYgKCFzZWxmW29wdGlvbnNFbGVtZW50U3ltYm9sXSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNhbGxiYWNrID0gZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QsIG9ic2VydmVyKSB7XG5cdFx0Y29uc3QgcnVuID0gZmFsc2U7XG5cdFx0Zm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG5cdFx0XHRpZiAobXV0YXRpb24udHlwZSA9PT0gXCJjaGlsZExpc3RcIikge1xuXHRcdFx0XHRjb25zdCBydW4gPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocnVuID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBub2RlcyA9IHNlbGZbb3B0aW9uc0VsZW1lbnRTeW1ib2xdLnF1ZXJ5U2VsZWN0b3JBbGwoXG5cdFx0XHRcdGBkaXZbJHtBVFRSSUJVVEVfUk9MRX09b3B0aW9uXWAsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobm9kZXMubGVuZ3RoID09PSB0YXJnZXRMZW5ndGgpIHtcblx0XHRcdFx0Y2hlY2tPcHRpb25TdGF0ZS5jYWxsKHNlbGYpO1xuXHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRvYnNlcnZlci5vYnNlcnZlKHNlbGZbb3B0aW9uc0VsZW1lbnRTeW1ib2xdLCB7XG5cdFx0YXR0cmlidXRlczogZmFsc2UsXG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHRcdHN1YnRyZWU6IHRydWUsXG5cdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBidWlsZFNlbGVjdGlvbkxhYmVsKHZhbHVlKSB7XG5cdGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcIm9wdGlvbnNcIik7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0bGV0IG8gPSBvcHRpb25zPy5baV07XG5cdFx0bGV0IGwsIHYsIHYyO1xuXG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMudXNlU3RyaWN0VmFsdWVDb21wYXJpc29uXCIpID09PSB0cnVlKSB7XG5cdFx0XHR2ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHYgPSBgJHt2YWx1ZX1gO1xuXHRcdH1cblxuXHRcdGlmIChpc1ByaW1pdGl2ZShvKSAmJiBvID09PSB2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIG87XG5cdFx0fSBlbHNlIGlmICghaXNPYmplY3QobykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLnVzZVN0cmljdFZhbHVlQ29tcGFyaXNvblwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0bCA9IG8/LltcImxhYmVsXCJdO1xuXHRcdFx0djIgPSBvPy5bXCJ2YWx1ZVwiXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bCA9IGAke28/LltcImxhYmVsXCJdfWA7XG5cdFx0XHR2MiA9IGAke28/LltcInZhbHVlXCJdfWA7XG5cdFx0fVxuXG5cdFx0aWYgKHYyID09PSB2KSB7XG5cdFx0XHRyZXR1cm4gbDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gdmFsdWUgZm91bmRcbiAqL1xuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTGFiZWwodmFsdWUpIHtcblx0Y29uc3QgY2FsbGJhY2sgPSB0aGlzLmdldE9wdGlvbihcImZvcm1hdHRlci5zZWxlY3Rpb25cIik7XG5cdGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuXHRcdGNvbnN0IGxhYmVsID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdFx0aWYgKGlzU3RyaW5nKGxhYmVsKSkgcmV0dXJuIGxhYmVsO1xuXHR9XG5cblx0aWYgKGlzU3RyaW5nKHZhbHVlKSB8fCBpc0ludGVnZXIodmFsdWUpKSB7XG5cdFx0cmV0dXJuIGAke3ZhbHVlfWA7XG5cdH1cblxuXHRyZXR1cm4gdGhpcy5nZXRPcHRpb24oXCJsYWJlbHMuY2Fubm90LWJlLWxvYWRlZFwiLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVRvZ2dsZUtleWJvYXJkRXZlbnRzKGV2ZW50KSB7XG5cdHN3aXRjaCAoZXZlbnQ/LltcImNvZGVcIl0pIHtcblx0XHRjYXNlIFwiRXNjYXBlXCI6XG5cdFx0XHR0b2dnbGUuY2FsbCh0aGlzKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiU3BhY2VcIjpcblx0XHRcdHRvZ2dsZS5jYWxsKHRoaXMpO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcblx0XHRcdHNob3cuY2FsbCh0aGlzKTtcblx0XHRcdGFjdGl2YXRlQ3VycmVudE9wdGlvbi5jYWxsKHRoaXMsIEZPQ1VTX0RJUkVDVElPTl9ET1dOKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQXJyb3dVcFwiOlxuXHRcdFx0aGlkZS5jYWxsKHRoaXMpO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGJyZWFrO1xuXHR9XG59XG5cbi8qKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNS4wXG4gKiBAcHJpdmF0ZVxuICogQHRoaXMgQ3VzdG9tRWxlbWVudFxuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uT2JzZXJ2ZXIoKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdHNlbGYuYXR0YWNoT2JzZXJ2ZXIoXG5cdFx0bmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblx0XHRcdG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRzZWxmLnVwZGF0ZUkxOG4oKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHNlbGYsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRcdHNldFN0YXR1c09yUmVtb3ZlQmFkZ2VzLmNhbGwoc2VsZiwgXCJlcnJvclwiKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGFyZU9wdGlvbnNBdmFpbGFibGVBbmRJbml0LmNhbGwoc2VsZik7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbihzZWxmLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRzZXRTdGF0dXNPclJlbW92ZUJhZGdlcy5jYWxsKHNlbGYsIFwiZXJyb3JcIik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZXRTdW1tYXJ5QW5kQ29udHJvbFRleHQuY2FsbChzZWxmKTtcblx0XHRcdH0pLnJ1bigpO1xuXHRcdH0pLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7VHJhbnNsYXRpb25zfVxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJhbnNsYXRpb24oKSB7XG5cdGNvbnN0IHRyYW5zbGF0aW9uID0gbmV3IFRyYW5zbGF0aW9ucyhcImVuXCIpLmFzc2lnblRyYW5zbGF0aW9ucyhcblx0XHR0aGlzLmdldE9wdGlvbihcImxhYmVsc1wiLCB7fSksXG5cdCk7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkb2MgPSBnZXREb2N1bWVudFRyYW5zbGF0aW9ucygpO1xuXHRcdHRyYW5zbGF0aW9uLmxvY2FsZSA9IGRvYy5sb2NhbGU7XG5cdH0gY2F0Y2ggKGUpIHt9XG5cblx0cmV0dXJuIHRyYW5zbGF0aW9uO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd8Kn1cbiAqL1xuZnVuY3Rpb24gc2V0U3VtbWFyeUFuZENvbnRyb2xUZXh0KCkge1xuXHRjb25zdCB0cmFuc2xhdGlvbnMgPSBnZXREZWZhdWx0VHJhbnNsYXRpb24uY2FsbCh0aGlzKTtcblx0Y29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuZ2V0T3B0aW9uKFwic2VsZWN0aW9uXCIpO1xuXG5cdGNvbnN0IHRleHQgPSB0cmFuc2xhdGlvbnMuZ2V0UGx1cmFsUnVsZVRleHQoXG5cdFx0XCJzdW1tYXJ5LXRleHRcIixcblx0XHRzZWxlY3Rpb25zLmxlbmd0aCxcblx0XHRcIlwiLFxuXHQpO1xuXG5cdGNvbnN0IHNlbGVjdGVkVGV4dCA9IG5ldyBGb3JtYXR0ZXIoe1xuXHRcdGNvdW50OiBTdHJpbmcoc2VsZWN0aW9ucy5sZW5ndGgpLFxuXHR9KS5mb3JtYXQodGV4dCk7XG5cblx0dGhpcy5zZXRPcHRpb24oXCJtZXNzYWdlcy5zZWxlY3RlZFwiLCBzZWxlY3RlZFRleHQpO1xuXG5cdGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldE9wdGlvbihcIm1lc3NhZ2VzLmNvbnRyb2xcIik7XG5cdGNvbnN0IG1zZyA9IHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzLnNlbGVjdC1hbi1vcHRpb25cIik7XG5cblx0aWYgKFxuXHRcdGN1cnJlbnQgPT09IFwiXCIgfHxcblx0XHRjdXJyZW50ID09PSB1bmRlZmluZWQgfHxcblx0XHRjdXJyZW50ID09PSBtc2cgfHxcblx0XHRjdXJyZW50ID09PSBudWxsXG5cdCkge1xuXHRcdGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5zZXRPcHRpb24oXCJtZXNzYWdlcy5jb250cm9sXCIsIG1zZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0T3B0aW9uKFwibWVzc2FnZXMuY29udHJvbFwiLCBcIlwiKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Tm9kZUxpc3R9XG4gKi9cbmZ1bmN0aW9uIGdldE9wdGlvbkVsZW1lbnRzKCkge1xuXHRyZXR1cm4gdGhpc1tvcHRpb25zRWxlbWVudFN5bWJvbF0ucXVlcnlTZWxlY3RvckFsbChcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PW9wdGlvbl1gLFxuXHQpO1xufVxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhpcyBmaWx0ZXIgY2FsbGJhY2ssIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LiBPbmx5IGlmIHRoZSBmaWx0ZXIgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgdmFsdWUgaXMgdGFrZW4gZm9yIHRoZSBtYXAuXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtfmV4YW1wbGVGaWx0ZXJDYWxsYmFja1xuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAgS2V5XG4gKiBAc2VlIE1vbnN0ZXIuRGF0YS5idWlsZE1hcFxuICovXG5cbi8qKlxuICpcbiAqIEBjYWxsYmFjayBNb25zdGVyLkNvbXBvbmVudHMuRm9ybX5mb3JtYXR0ZXJTZWxlY3Rpb25DYWxsYmFja1xuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZVxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqIEBzZWUgTW9uc3Rlci5EYXRhLmJ1aWxkTWFwXG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjYWxjQW5kU2V0T3B0aW9uc0RpbWVuc2lvbigpIHtcblx0Y29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbkVsZW1lbnRzLmNhbGwodGhpcyk7XG5cdGNvbnN0IGNvbnRhaW5lciA9IHRoaXNbb3B0aW9uc0VsZW1lbnRTeW1ib2xdO1xuXHRpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBvcHRpb25zIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IHZpc2libGUgPSAwO1xuXHRsZXQgb3B0aW9uSGVpZ2h0ID0gMDtcblx0Y29uc3QgbWF4ID0gdGhpcy5nZXRPcHRpb24oXCJzaG93TWF4T3B0aW9uc1wiLCAxMCk7XG5cblx0bGV0IHNjcm9sbEZsYWcgPSBmYWxzZTtcblx0Zm9yIChjb25zdCBbLCBvcHRpb25dIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpKSB7XG5cdFx0Y29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldEdsb2JhbCgpLmdldENvbXB1dGVkU3R5bGUob3B0aW9uKTtcblx0XHRpZiAoY29tcHV0ZWRTdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikgY29udGludWU7XG5cblx0XHRsZXQgaCA9IG9wdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cdFx0aCArPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tdG9wXCIpLCAxMCk7XG5cdFx0aCArPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tYm90dG9tXCIpLCAxMCk7XG5cdFx0b3B0aW9uSGVpZ2h0ICs9IGg7XG5cblx0XHR2aXNpYmxlKys7XG5cblx0XHRpZiAodmlzaWJsZSA+IG1heCkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZpc2libGUgPiBtYXgpIHtcblx0XHR2aXNpYmxlID0gbWF4O1xuXHRcdHNjcm9sbEZsYWcgPSB0cnVlO1xuXHR9XG5cblx0aWYgKHZpc2libGUgPT09IDApIHtcblx0XHRpZiAoZ2V0RmlsdGVyTW9kZS5jYWxsKHRoaXMpID09PSBGSUxURVJfTU9ERV9ESVNBQkxFRCkge1xuXHRcdFx0dGhpcy5zZXRPcHRpb24oXG5cdFx0XHRcdFwibWVzc2FnZXMuZW1wdHlPcHRpb25zXCIsXG5cdFx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzLm5vLW9wdGlvbnMtYXZhaWxhYmxlXCIpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXRPcHRpb24oXG5cdFx0XHRcdFwibWVzc2FnZXMuZW1wdHlPcHRpb25zXCIsXG5cdFx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzLm5vLW9wdGlvbnMtZm91bmRcIiksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR0aGlzW25vT3B0aW9uc0F2YWlsYWJsZUVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJkLW5vbmVcIik7XG5cdH0gZWxzZSB7XG5cdFx0dGhpc1tub09wdGlvbnNBdmFpbGFibGVFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwiZC1ub25lXCIpO1xuXHR9XG5cblx0Y29uc3Qgc3R5bGVzID0gZ2V0R2xvYmFsKCkuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzW29wdGlvbnNFbGVtZW50U3ltYm9sXSk7XG5cdGxldCBwYWRkaW5nID0gcGFyc2VJbnQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nLXRvcFwiKSwgMTApO1xuXHRwYWRkaW5nICs9IHBhcnNlSW50KHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1ib3R0b21cIiksIDEwKTtcblxuXHRsZXQgbWFyZ2luID0gcGFyc2VJbnQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tdG9wXCIpLCAxMCk7XG5cdG1hcmdpbiArPSBwYXJzZUludChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1ib3R0b21cIiksIDEwKTtcblxuXHRjb25zdCBjb250YWluZXJIZWlnaHQgPSBvcHRpb25IZWlnaHQgKyBwYWRkaW5nICsgbWFyZ2luO1xuXHRjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7Y29udGFpbmVySGVpZ2h0fXB4YDtcblxuXHRpZiAoc2Nyb2xsRmxhZyA9PT0gdHJ1ZSkge1xuXHRcdGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcInNjcm9sbFwiO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcblx0fVxuXG5cdGNvbnN0IGRvbVJlY3QgPSB0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHR0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLndpZHRoID0gYCR7ZG9tUmVjdC53aWR0aH1weGA7XG5cdGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1ggPSBcImF1dG9cIjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IGRpcmVjdGlvblxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gYWN0aXZhdGVDdXJyZW50T3B0aW9uKGRpcmVjdGlvbikge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHRsZXQgZm9jdXNlZCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbJHtBVFRSSUJVVEVfUFJFRklYfWZvY3VzZWRdYCk7XG5cblx0aWYgKFxuXHRcdCEoZm9jdXNlZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fFxuXHRcdGZvY3VzZWQubWF0Y2hlcyhcIltkYXRhLW1vbnN0ZXItdmlzaWJpbGl0eT1oaWRkZW5dXCIpXG5cdCkge1xuXHRcdGZvciAoY29uc3QgWywgZV0gb2YgT2JqZWN0LmVudHJpZXMoXG5cdFx0XHR0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7QVRUUklCVVRFX1JPTEV9PW9wdGlvbl1gKSxcblx0XHQpKSB7XG5cdFx0XHRpZiAoZS5tYXRjaGVzKFwiW2RhdGEtbW9uc3Rlci12aXNpYmlsaXR5PXZpc2libGVdXCIpKSB7XG5cdFx0XHRcdGZvY3VzZWQgPSBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aWYgKGRpcmVjdGlvbiA9PT0gRk9DVVNfRElSRUNUSU9OX0RPV04pIHtcblx0XHRcdHdoaWxlIChmb2N1c2VkLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdGZvY3VzZWQgPSBmb2N1c2VkLm5leHRTaWJsaW5nO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRmb2N1c2VkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcblx0XHRcdFx0XHRmb2N1c2VkLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSkgJiZcblx0XHRcdFx0XHRmb2N1c2VkLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSkgPT09IFwib3B0aW9uXCIgJiZcblx0XHRcdFx0XHRmb2N1c2VkLm1hdGNoZXMoXCJbZGF0YS1tb25zdGVyLXZpc2liaWxpdHk9dmlzaWJsZV1cIikgJiZcblx0XHRcdFx0XHRmb2N1c2VkLm1hdGNoZXMoXCI6bm90KFtkYXRhLW1vbnN0ZXItZmlsdGVyZWQ9dHJ1ZV0pXCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0d2hpbGUgKGZvY3VzZWQucHJldmlvdXNTaWJsaW5nKSB7XG5cdFx0XHRcdGZvY3VzZWQgPSBmb2N1c2VkLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGZvY3VzZWQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuXHRcdFx0XHRcdGZvY3VzZWQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKSAmJlxuXHRcdFx0XHRcdGZvY3VzZWQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKSA9PT0gXCJvcHRpb25cIiAmJlxuXHRcdFx0XHRcdGZvY3VzZWQubWF0Y2hlcyhcIltkYXRhLW1vbnN0ZXItdmlzaWJpbGl0eT12aXNpYmxlXVwiKSAmJlxuXHRcdFx0XHRcdGZvY3VzZWQubWF0Y2hlcyhcIjpub3QoW2RhdGEtbW9uc3Rlci1maWx0ZXJlZD10cnVlXSlcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm91bmQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdGZvY3VzRmlsdGVyLmNhbGwodGhpcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bmV3IFByb2Nlc3NpbmcoKCkgPT4ge1xuXHRcdGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdHRoaXMuc2hhZG93Um9vdFxuXHRcdFx0XHQucXVlcnlTZWxlY3RvckFsbChgWyR7QVRUUklCVVRFX1BSRUZJWH1mb2N1c2VkXWApXG5cdFx0XHRcdC5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRcdFx0ZS5yZW1vdmVBdHRyaWJ1dGUoYCR7QVRUUklCVVRFX1BSRUZJWH1mb2N1c2VkYCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRmb2N1c2VkLmZvY3VzKCk7XG5cdFx0XHRmb2N1c2VkLnNldEF0dHJpYnV0ZShgJHtBVFRSSUJVVEVfUFJFRklYfWZvY3VzZWRgLCB0cnVlKTtcblx0XHR9XG5cdH0pXG5cdFx0LnJ1bigpXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGZpbHRlck9wdGlvbnMoKSB7XG5cdG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRsZXQgZmlsdGVyVmFsdWU7XG5cblx0XHRzd2l0Y2ggKHRoaXMuZ2V0T3B0aW9uKFwiZmlsdGVyLnBvc2l0aW9uXCIpKSB7XG5cdFx0XHRjYXNlIEZJTFRFUl9QT1NJVElPTl9JTkxJTkU6XG5cdFx0XHRcdGlmICh0aGlzW2lubGluZUZpbHRlckVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0udmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgRklMVEVSX1BPU0lUSU9OX1BPUFBFUjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmICh0aGlzW3BvcHBlckZpbHRlckVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuXHRcdFx0XHRcdGZpbHRlclZhbHVlID0gdGhpc1twb3BwZXJGaWx0ZXJFbGVtZW50U3ltYm9sXS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcIm9wdGlvbnNcIik7XG5cdFx0Zm9yIChjb25zdCBbaSwgb3B0aW9uXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zKSkge1xuXHRcdFx0aWYgKG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyVmFsdWUpID09PSAtMSkge1xuXHRcdFx0XHR0aGlzLnNldE9wdGlvbihgb3B0aW9ucy4ke2l9LmZpbHRlcmVkYCwgXCJ0cnVlXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZXRPcHRpb24oYG9wdGlvbnMuJHtpfS5maWx0ZXJlZGAsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KVxuXHRcdC5ydW4oKVxuXHRcdC50aGVuKCgpID0+IHtcblx0XHRcdG5ldyBQcm9jZXNzaW5nKDEwMCwgKCkgPT4ge1xuXHRcdFx0XHRjYWxjQW5kU2V0T3B0aW9uc0RpbWVuc2lvbi5jYWxsKHRoaXMpO1xuXHRcdFx0XHRmb2N1c0ZpbHRlci5jYWxsKHRoaXMpO1xuXHRcdFx0fSlcblx0XHRcdFx0LnJ1bigpXG5cdFx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBoYW5kbGVGaWx0ZXJLZXlib2FyZEV2ZW50cyhldmVudCkge1xuXHRjb25zdCBzaGlmdEtleSA9IGV2ZW50Py5bXCJzaGlmdEtleVwiXTtcblxuXHRzd2l0Y2ggKGV2ZW50Py5bXCJjb2RlXCJdKSB7XG5cdFx0Y2FzZSBcIlRhYlwiOlxuXHRcdFx0YWN0aXZhdGVDdXJyZW50T3B0aW9uLmNhbGwodGhpcywgRk9DVVNfRElSRUNUSU9OX0RPV04pO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFc2NhcGVcIjpcblx0XHRcdHRvZ2dsZS5jYWxsKHRoaXMpO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUYWJcIiAmJiBzaGlmdEtleSA9PT0gdHJ1ZTpcblx0XHRjYXNlIFwiQXJyb3dVcFwiOlxuXHRcdFx0YWN0aXZhdGVDdXJyZW50T3B0aW9uLmNhbGwodGhpcywgRk9DVVNfRElSRUNUSU9OX1VQKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVGFiXCIgJiYgIXNoaWZ0S2V5OlxuXHRcdGNhc2UgXCJBcnJvd0Rvd25cIjpcblx0XHRcdGFjdGl2YXRlQ3VycmVudE9wdGlvbi5jYWxsKHRoaXMsIEZPQ1VTX0RJUkVDVElPTl9ET1dOKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLmxhenlMb2FkXCIpID09PSB0cnVlICYmXG5cdFx0XHRcdHRoaXNbbGF6eUxvYWREb25lU3ltYm9sXSAhPT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlRmlsdGVyS2V5RXZlbnRzLmNhbGwodGhpcyk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgaGFuZGxlRmlsdGVyS2V5RXZlbnRzIGlzIHVzZWQgdG8gaGFuZGxlIGZpbHRlciBrZXkgZXZlbnRzLlxuICogRGVib3VuY2UgaXMgdXNlZCB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgaGFuZGxlRmlsdGVyS2V5RXZlbnRzXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3ZvaWR9IFRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlRmlsdGVyS2V5RXZlbnRzKCkge1xuXHRpZiAodGhpc1trZXlGaWx0ZXJFdmVudFN5bWJvbF0gaW5zdGFuY2VvZiBEZWFkTWFuc1N3aXRjaCkge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzW2tleUZpbHRlckV2ZW50U3ltYm9sXS50b3VjaCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGRlbGV0ZSB0aGlzW2tleUZpbHRlckV2ZW50U3ltYm9sXTtcblx0XHR9XG5cdH1cblxuXHR0aGlzW2tleUZpbHRlckV2ZW50U3ltYm9sXSA9IG5ldyBEZWFkTWFuc1N3aXRjaCgyMDAsICgpID0+IHtcblx0XHRpZiAoZ2V0RmlsdGVyTW9kZS5jYWxsKHRoaXMpICE9PSBGSUxURVJfTU9ERV9SRU1PVEUpIHtcblx0XHRcdGZpbHRlck9wdGlvbnMuY2FsbCh0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZmlsdGVyRnJvbVJlbW90ZS5jYWxsKHRoaXMpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRkZWxldGUgdGhpc1trZXlGaWx0ZXJFdmVudFN5bWJvbF07XG5cdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckZyb21SZW1vdGUoKSB7XG5cdGlmIChcblx0XHQhKHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiZcblx0XHQhKHRoaXNbcG9wcGVyRmlsdGVyRWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcblx0KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c2hvdy5jYWxsKHRoaXMpO1xuXG5cdGNvbnN0IHVybCA9IHRoaXMuZ2V0T3B0aW9uKFwidXJsXCIpO1xuXHRpZiAoIXVybCkge1xuXHRcdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdFx0dGhpcyxcblx0XHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0XHRcIk1pc3NpbmcgVVJMIGZvciBSZW1vdGUgRmlsdGVyLlwiLFxuXHRcdCk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IGZpbHRlclZhbHVlO1xuXG5cdHN3aXRjaCAodGhpcy5nZXRPcHRpb24oXCJmaWx0ZXIucG9zaXRpb25cIikpIHtcblx0XHRjYXNlIEZJTFRFUl9QT1NJVElPTl9JTkxJTkU6XG5cdFx0XHRpZiAodGhpc1tpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRcdGZpbHRlclZhbHVlID0gdGhpc1tpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sXS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEZJTFRFUl9QT1NJVElPTl9QT1BQRVI6XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlmICh0aGlzW3BvcHBlckZpbHRlckVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IHRoaXNbcG9wcGVyRmlsdGVyRWxlbWVudFN5bWJvbF0udmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdH1cblx0fVxuXG5cdHJldHVybiBmaWx0ZXJGcm9tUmVtb3RlQnlWYWx1ZS5jYWxsKHRoaXMsIHVybCwgZmlsdGVyVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVUkwodXJsLCB2YWx1ZSkge1xuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuXHRcdHZhbHVlID0gdGhpcy5nZXRPcHRpb24oXCJmaWx0ZXIuZGVmYXVsdFZhbHVlXCIpO1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG5cdFx0XHR2YWx1ZSA9IGRpc2FibGVkUmVxdWVzdE1hcmtlci50b1N0cmluZygpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoeyBmaWx0ZXI6IGVuY29kZVVSSSh2YWx1ZSkgfSk7XG5cdGNvbnN0IG9wZW5NYXJrZXIgPSB0aGlzLmdldE9wdGlvbihcImZpbHRlci5tYXJrZXIub3BlblwiKTtcblx0bGV0IGNsb3NlTWFya2VyID0gdGhpcy5nZXRPcHRpb24oXCJmaWx0ZXIubWFya2VyLmNsb3NlXCIpO1xuXHRpZiAoIWNsb3NlTWFya2VyKSB7XG5cdFx0Y2xvc2VNYXJrZXIgPSBvcGVuTWFya2VyO1xuXHR9XG5cblx0aWYgKG9wZW5NYXJrZXIgJiYgY2xvc2VNYXJrZXIpIHtcblx0XHRmb3JtYXR0ZXIuc2V0TWFya2VyKG9wZW5NYXJrZXIsIGNsb3NlTWFya2VyKTtcblx0fVxuXG5cdHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHVybCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvcHRpb25VcmxcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gKi9cbmZ1bmN0aW9uIGZpbHRlckZyb21SZW1vdGVCeVZhbHVlKG9wdGlvblVybCwgdmFsdWUpIHtcblx0cmV0dXJuIG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRsZXQgdXJsID0gZm9ybWF0VVJMLmNhbGwodGhpcywgb3B0aW9uVXJsLCB2YWx1ZSk7XG5cdFx0aWYgKHVybC5pbmRleE9mKGRpc2FibGVkUmVxdWVzdE1hcmtlci50b1N0cmluZygpKSAhPT0gLTEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmZXRjaEl0XG5cdFx0XHQuY2FsbCh0aGlzLCB1cmwsIHtcblx0XHRcdFx0ZGlzYWJsZUhpZGluZzogdHJ1ZSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNoZWNrT3B0aW9uU3RhdGUuY2FsbCh0aGlzKTtcblx0XHRcdFx0c2hvdy5jYWxsKHRoaXMpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0fSk7XG5cdH0pXG5cdFx0LnJ1bigpXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBoYW5kbGVPcHRpb25LZXlib2FyZEV2ZW50cyhldmVudCkge1xuXHRjb25zdCBzaGlmdEtleSA9IGV2ZW50Py5bXCJzaGlmdEtleVwiXTtcblxuXHRzd2l0Y2ggKGV2ZW50Py5bXCJjb2RlXCJdKSB7XG5cdFx0Y2FzZSBcIkVzY2FwZVwiOlxuXHRcdFx0dG9nZ2xlLmNhbGwodGhpcyk7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVudGVyXCI6XG5cdFx0Y2FzZSBcIlNwYWNlXCI6XG5cdFx0XHRjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cdFx0XHRjb25zdCBlbGVtZW50ID0gcGF0aD8uWzBdO1xuXHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBpbnB1dCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKTtcblx0XHRcdFx0aWYgKCFpbnB1dCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmaXJlRXZlbnQoaW5wdXQsIFwiY2xpY2tcIik7XG5cdFx0XHR9XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiVGFiXCIgJiYgc2hpZnRLZXkgPT09IHRydWU6XG5cdFx0Y2FzZSBcIkFycm93VXBcIjpcblx0XHRcdGFjdGl2YXRlQ3VycmVudE9wdGlvbi5jYWxsKHRoaXMsIEZPQ1VTX0RJUkVDVElPTl9VUCk7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiVGFiXCIgJiYgIXNoaWZ0S2V5OlxuXHRcdGNhc2UgXCJBcnJvd0xlZnRcIjpcblx0XHRjYXNlIFwiQXJyb3dSaWdodFwiOlxuXHRcdFx0Ly8gaGFuZGxlZCBieSB0cmVlIHNlbGVjdFxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkFycm93RG93blwiOlxuXHRcdFx0YWN0aXZhdGVDdXJyZW50T3B0aW9uLmNhbGwodGhpcywgRk9DVVNfRElSRUNUSU9OX0RPV04pO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRjb25zdCBwID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cdFx0XHRpZiAocD8uWzBdIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRmb2N1c0ZpbHRlci5jYWxsKHRoaXMpO1xuXHRcdFx0YnJlYWs7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJNb2RlKCkge1xuXHRzd2l0Y2ggKHRoaXMuZ2V0T3B0aW9uKFwiZmlsdGVyLm1vZGVcIikpIHtcblx0XHRjYXNlIEZJTFRFUl9NT0RFX09QVElPTlM6XG5cdFx0XHRyZXR1cm4gRklMVEVSX01PREVfT1BUSU9OUztcblx0XHRjYXNlIEZJTFRFUl9NT0RFX1JFTU9URTpcblx0XHRcdHJldHVybiBGSUxURVJfTU9ERV9SRU1PVEU7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBGSUxURVJfTU9ERV9ESVNBQkxFRDtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGJsdXJGaWx0ZXIoKSB7XG5cdGlmICghKHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoZ2V0RmlsdGVyTW9kZS5jYWxsKHRoaXMpID09PSBGSUxURVJfTU9ERV9ESVNBQkxFRCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbcG9wcGVyRmlsdGVyQ29udGFpbmVyRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblx0dGhpc1twb3BwZXJGaWx0ZXJDb250YWluZXJFbGVtZW50U3ltYm9sXS5ibHVyKCk7XG5cblx0dGhpc1tpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuXHR0aGlzW2lubGluZUZpbHRlckVsZW1lbnRTeW1ib2xdLmJsdXIoKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGZvY3VzT3B0aW9uc1xuICovXG5mdW5jdGlvbiBmb2N1c1BvcHBlckZpbHRlcihmb2N1c09wdGlvbnMpIHtcblx0dGhpc1twb3BwZXJGaWx0ZXJDb250YWluZXJFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QucmVtb3ZlKFwiZC1ub25lXCIpO1xuXHR0aGlzW3BvcHBlckZpbHRlckVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cdHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblx0dGhpc1tpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwiZC1ub25lXCIpO1xuXG5cdGlmICghKHRoaXNbcG9wcGVyRmlsdGVyRWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRcdHRoaXMsXG5cdFx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdFx0XCJNaXNzaW5nIFBvcHBlciBGaWx0ZXIgRWxlbWVudC5cIixcblx0XHQpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIHZpc2liaWxpdHkgaXMgc2V0IHRvIHZpc2libGUsIGJlY2F1c2UgZm9jdXMoKSBkb2VzIG5vdCB3b3JrIG9uIGludmlzaWJsZSBlbGVtZW50c1xuXHQvLyBhbmQgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgYXNzaWduZWQgbGF0ZXIgaW4gdGhlIHByb2Nlc3Npbmdcblx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0aWYgKGZvY3VzT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZvY3VzT3B0aW9ucyA9PT0gbnVsbCkge1xuXHRcdFx0dGhpc1twb3BwZXJGaWx0ZXJFbGVtZW50U3ltYm9sXS5mb2N1cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzW3BvcHBlckZpbHRlckVsZW1lbnRTeW1ib2xdLmZvY3VzKGZvY3VzT3B0aW9ucyk7XG5cdFx0fVxuXHR9LCAxMDApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gZm9jdXNPcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGZvY3VzSW5saW5lRmlsdGVyKGZvY3VzT3B0aW9ucykge1xuXHRjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb24oXCJvcHRpb25zXCIpO1xuXHRpZiAoXG5cdFx0KCFpc0FycmF5KG9wdGlvbnMpIHx8IG9wdGlvbnMubGVuZ3RoID09PSAwKSAmJlxuXHRcdGdldEZpbHRlck1vZGUuY2FsbCh0aGlzKSAhPT0gRklMVEVSX01PREVfUkVNT1RFXG5cdCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbcG9wcGVyRmlsdGVyQ29udGFpbmVyRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZChcImQtbm9uZVwiKTtcblx0dGhpc1tpbmxpbmVGaWx0ZXJFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXHR0aGlzW2lubGluZUZpbHRlckVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJkLW5vbmVcIik7XG5cblx0Ly8gdmlzaWJpbGl0eSBpcyBzZXQgdG8gdmlzaWJsZSwgYmVjYXVzZSBmb2N1cygpIGRvZXMgbm90IHdvcmsgb24gaW52aXNpYmxlIGVsZW1lbnRzXG5cdC8vIGFuZCB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyBhc3NpZ25lZCBsYXRlciBpbiB0aGUgcHJvY2Vzc2luZ1xuXHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRpZiAoZm9jdXNPcHRpb25zID09PSB1bmRlZmluZWQgfHwgZm9jdXNPcHRpb25zID09PSBudWxsKSB7XG5cdFx0XHR0aGlzW2lubGluZUZpbHRlckVsZW1lbnRTeW1ib2xdLmZvY3VzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0uZm9jdXMoZm9jdXNPcHRpb25zKTtcblx0XHR9XG5cdH0sIDEwMCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZm9jdXNGaWx0ZXIoZm9jdXNPcHRpb25zKSB7XG5cdGlmIChnZXRGaWx0ZXJNb2RlLmNhbGwodGhpcykgPT09IEZJTFRFUl9NT0RFX0RJU0FCTEVEKSB7XG5cdFx0dGhpc1twb3BwZXJGaWx0ZXJDb250YWluZXJFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwiZC1ub25lXCIpO1xuXHRcdHRoaXNbaW5saW5lRmlsdGVyRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZChcImQtbm9uZVwiKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAodGhpcy5nZXRPcHRpb24oXCJmaWx0ZXIucG9zaXRpb25cIikgPT09IEZJTFRFUl9QT1NJVElPTl9JTkxJTkUpIHtcblx0XHRyZXR1cm4gZm9jdXNJbmxpbmVGaWx0ZXIuY2FsbCh0aGlzLCBmb2N1c09wdGlvbnMpO1xuXHR9XG5cblx0cmV0dXJuIGZvY3VzUG9wcGVyRmlsdGVyLmNhbGwodGhpcywgZm9jdXNPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2F0aGVyU3RhdGUoKSB7XG5cdGNvbnN0IHR5cGUgPSB0aGlzLmdldE9wdGlvbihcInR5cGVcIik7XG5cdGlmIChbXCJyYWRpb1wiLCBcImNoZWNrYm94XCJdLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgdHlwZVwiKTtcblx0fVxuXG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbiA9IFtdO1xuXHRjb25zdCBlbGVtZW50cyA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdGBpbnB1dFt0eXBlPSR7dHlwZX1dOmNoZWNrZWRgLFxuXHQpO1xuXG5cdGZvciAoY29uc3QgZSBvZiBlbGVtZW50cykge1xuXHRcdHNlbGVjdGlvbi5wdXNoKHtcblx0XHRcdGxhYmVsOiBnZXRTZWxlY3Rpb25MYWJlbC5jYWxsKHRoaXMsIGUudmFsdWUpLFxuXHRcdFx0dmFsdWU6IGUudmFsdWUsXG5cdFx0fSk7XG5cdH1cblxuXHRzZXRTZWxlY3Rpb25cblx0XHQuY2FsbCh0aGlzLCBzZWxlY3Rpb24pXG5cdFx0LnRoZW4oKCkgPT4ge30pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBgJHtlfWApO1xuXHRcdH0pO1xuXG5cdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLmNsb3NlT25TZWxlY3RcIikgPT09IHRydWUpIHtcblx0XHR0b2dnbGUuY2FsbCh0aGlzKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG5cdGNvbnN0IHR5cGUgPSB0aGlzLmdldE9wdGlvbihcInR5cGVcIik7XG5cdGlmIChbXCJyYWRpb1wiLCBcImNoZWNrYm94XCJdLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgdHlwZVwiKTtcblx0fVxuXG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdHNldFNlbGVjdGlvblxuXHRcdC5jYWxsKHRoaXMsIFtdKVxuXHRcdC50aGVuKCgpID0+IHt9KVxuXHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgYCR7ZX1gKTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhcmVPcHRpb25zQXZhaWxhYmxlQW5kSW5pdCgpIHtcblx0Ly8gcHJldmVudCBtdWx0aXBsZSBjYWxsc1xuXHRpZiAodGhpc1thcmVPcHRpb25zQXZhaWxhYmxlQW5kSW5pdFN5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdHRoaXNbYXJlT3B0aW9uc0F2YWlsYWJsZUFuZEluaXRTeW1ib2xdID0gMDtcblx0fVxuXG5cdGlmICh0aGlzW2FyZU9wdGlvbnNBdmFpbGFibGVBbmRJbml0U3ltYm9sXSA+IDApIHtcblx0XHR0aGlzW2FyZU9wdGlvbnNBdmFpbGFibGVBbmRJbml0U3ltYm9sXS0tO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0dGhpc1thcmVPcHRpb25zQXZhaWxhYmxlQW5kSW5pdFN5bWJvbF0rKztcblxuXHRjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb24oXCJvcHRpb25zXCIpO1xuXG5cdGlmIChcblx0XHRvcHRpb25zID09PSB1bmRlZmluZWQgfHxcblx0XHRvcHRpb25zID09PSBudWxsIHx8XG5cdFx0KGlzQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucy5sZW5ndGggPT09IDApXG5cdCkge1xuXHRcdHNldFN0YXR1c09yUmVtb3ZlQmFkZ2VzLmNhbGwodGhpcywgXCJlbXB0eVwiKTtcblxuXHRcdC8vIGhpZGUuY2FsbCh0aGlzKTtcblxuXHRcdGxldCBtc2cgPSB0aGlzLmdldE9wdGlvbihcImxhYmVscy5uby1vcHRpb25zLWF2YWlsYWJsZVwiKTtcblxuXHRcdGlmIChcblx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwidXJsXCIpICE9PSBudWxsICYmXG5cdFx0XHR0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLmxhenlMb2FkXCIpID09PSB0cnVlICYmXG5cdFx0XHR0aGlzW2xhenlMb2FkRG9uZVN5bWJvbF0gIT09IHRydWVcblx0XHQpIHtcblx0XHRcdG1zZyA9IHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzLmNsaWNrLXRvLWxvYWQtb3B0aW9uc1wiKTtcblx0XHR9XG5cblx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2VzLmNvbnRyb2xcIiwgbXNnKTtcblx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2VzLnN1bW1hcnlcIiwgXCJcIik7XG5cblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5lbXB0eVZhbHVlSWZOb09wdGlvbnNcIikgPT09IHRydWUpIHtcblx0XHRcdHRoaXMudmFsdWUgPSBcIlwiO1xuXHRcdH1cblx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBcIk5vIG9wdGlvbnMgYXZhaWxhYmxlLlwiKTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBzZWxlY3Rpb25zID0gdGhpcy5nZXRPcHRpb24oXCJzZWxlY3Rpb25cIik7XG5cdGlmIChcblx0XHRzZWxlY3Rpb25zID09PSB1bmRlZmluZWQgfHxcblx0XHRzZWxlY3Rpb25zID09PSBudWxsIHx8XG5cdFx0c2VsZWN0aW9ucy5sZW5ndGggPT09IDBcblx0KSB7XG5cdFx0dGhpcy5zZXRPcHRpb24oXG5cdFx0XHRcIm1lc3NhZ2VzLmNvbnRyb2xcIixcblx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwibGFiZWxzLnNlbGVjdC1hbi1vcHRpb25cIiksXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2VzLmNvbnRyb2xcIiwgXCJcIik7XG5cdH1cblxuXHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2VzLnN1bW1hcnlcIiwgc2V0U3VtbWFyeUFuZENvbnRyb2xUZXh0LmNhbGwodGhpcykpO1xuXG5cdGxldCB1cGRhdGVkID0gZmFsc2U7XG5cdGxldCB2YWx1ZUNvdW50ZXIgPSAxO1xuXHRmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbj8udmlzaWJpbGl0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb24udmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuXHRcdFx0dXBkYXRlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbj8udmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvcHRpb24/LmxhYmVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbi52YWx1ZSA9IGAke3ZhbHVlQ291bnRlcisrfWA7XG5cdFx0XHRvcHRpb24ubGFiZWwgPSBvcHRpb24udmFsdWU7XG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb24/LnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbi52YWx1ZSA9IG9wdGlvbi5sYWJlbDtcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb24/LmxhYmVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbi5sYWJlbCA9IG9wdGlvbi52YWx1ZTtcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdGlmICh1cGRhdGVkKSB7XG5cdFx0dGhpcy5zZXRPcHRpb24oXCJvcHRpb25zXCIsIG9wdGlvbnMpO1xuXHR9XG5cblx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzKTtcblxuXHRyZW1vdmVBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBcIk5vIG9wdGlvbnMgYXZhaWxhYmxlLlwiKTtcblx0cmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT3B0aW9uU3RhdGUoKSB7XG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1vcHRpb25dIGlucHV0YCxcblx0KTtcblxuXHRsZXQgc2VsZWN0aW9uID0gdGhpcy5nZXRPcHRpb24oXCJzZWxlY3Rpb25cIik7XG5cdGlmICghaXNBcnJheShzZWxlY3Rpb24pKSB7XG5cdFx0c2VsZWN0aW9uID0gW107XG5cdH1cblxuXHRjb25zdCBjaGVja2VkVmFsdWVzID0gc2VsZWN0aW9uLm1hcCgoYSkgPT4ge1xuXHRcdHJldHVybiBhLnZhbHVlO1xuXHR9KTtcblxuXHRmb3IgKGNvbnN0IGUgb2YgZWxlbWVudHMpIHtcblx0XHRpZiAoY2hlY2tlZFZhbHVlcy5pbmRleE9mKGUudmFsdWUpICE9PSAtMSkge1xuXHRcdFx0aWYgKGUuY2hlY2tlZCAhPT0gdHJ1ZSkgZS5jaGVja2VkID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGUuY2hlY2tlZCAhPT0gZmFsc2UpIGUuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvU2VsZWN0aW9uKHZhbHVlKSB7XG5cdGNvbnN0IHNlbGVjdGlvbiA9IFtdO1xuXG5cdGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcblx0XHR2YWx1ZSA9IHZhbHVlXG5cdFx0XHQuc3BsaXQoXCIsXCIpXG5cdFx0XHQubWFwKChhKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhLnRyaW0oKTtcblx0XHRcdH0pXG5cdFx0XHQuZmlsdGVyKChhKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhICE9PSBcIlwiO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRpZiAoaXNTdHJpbmcodmFsdWUpIHx8IGlzSW50ZWdlcih2YWx1ZSkpIHtcblx0XHRzZWxlY3Rpb24ucHVzaCh7XG5cdFx0XHRsYWJlbDogZ2V0U2VsZWN0aW9uTGFiZWwuY2FsbCh0aGlzLCB2YWx1ZSksXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcblx0XHRcdHNlbGVjdGlvbi5wdXNoKHtcblx0XHRcdFx0bGFiZWw6IGdldFNlbGVjdGlvbkxhYmVsLmNhbGwodGhpcywgdiksXG5cdFx0XHRcdHZhbHVlOiB2LFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiLFwiKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCB0eXBlXCIpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRzZWxlY3Rpb246IHNlbGVjdGlvbixcblx0XHR2YWx1ZTogdmFsdWUsXG5cdH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7YXJyYXl9IHNlbGVjdGlvblxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjb252ZXJ0U2VsZWN0aW9uVG9WYWx1ZShzZWxlY3Rpb24pIHtcblx0Y29uc3QgdmFsdWUgPSBbXTtcblxuXHRpZiAoaXNBcnJheShzZWxlY3Rpb24pKSB7XG5cdFx0Zm9yIChjb25zdCBvYmogb2Ygc2VsZWN0aW9uKSB7XG5cdFx0XHRjb25zdCB2ID0gb2JqPy5bXCJ2YWx1ZVwiXTtcblx0XHRcdGlmICh2ICE9PSB1bmRlZmluZWQpIHZhbHVlLnB1c2goYCR7dn1gKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7XG5cdFx0Y29uc3QgdiA9IHZhbHVlLnBvcCgpO1xuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHJldHVybiBcIlwiO1xuXHRcdGlmICh2ID09PSBudWxsKSByZXR1cm4gXCJcIjtcblx0XHRyZXR1cm4gYCR7dn1gO1xuXHR9XG5cblx0cmV0dXJuIHZhbHVlLmpvaW4oXCIsXCIpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2FycmF5fSBzZWxlY3Rpb25cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICovXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKSB7XG5cdGlmIChpc1N0cmluZyhzZWxlY3Rpb24pIHx8IGlzSW50ZWdlcihzZWxlY3Rpb24pKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gY29udmVydFZhbHVlVG9TZWxlY3Rpb24uY2FsbCh0aGlzLCBzZWxlY3Rpb24pO1xuXHRcdHNlbGVjdGlvbiA9IHJlc3VsdD8uc2VsZWN0aW9uO1xuXHR9IGVsc2UgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gbnVsbCkge1xuXHRcdHNlbGVjdGlvbiA9IFtdO1xuXHR9XG5cblx0dmFsaWRhdGVBcnJheShzZWxlY3Rpb24pO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdFx0bGV0IGwgPSBnZXRTZWxlY3Rpb25MYWJlbC5jYWxsKHRoaXMsIHNlbGVjdGlvbltpXS52YWx1ZSk7XG5cdFx0aWYgKGwgPT09IHNlbGVjdGlvbltpXS52YWx1ZSkge1xuXHRcdFx0bCA9IHNlbGVjdGlvbltpXS5sYWJlbDtcblx0XHR9XG5cblx0XHRzZWxlY3Rpb25baV0gPSB7XG5cdFx0XHRsYWJlbDogbCxcblx0XHRcdHZhbHVlOiBzZWxlY3Rpb25baV0udmFsdWUsXG5cdFx0fTtcblx0fVxuXG5cdHRoaXMuc2V0T3B0aW9uKFwic2VsZWN0aW9uXCIsIHNlbGVjdGlvbik7XG5cdGNoZWNrT3B0aW9uU3RhdGUuY2FsbCh0aGlzKTtcblx0c2V0U3VtbWFyeUFuZENvbnRyb2xUZXh0LmNhbGwodGhpcyk7XG5cblx0dHJ5IHtcblx0XHR0aGlzPy5zZXRGb3JtVmFsdWUodGhpcy52YWx1ZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHR9XG5cblx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1zZWxlY3RlZFwiLCB7XG5cdFx0c2VsZWN0aW9uLFxuXHR9KTtcblxuXHRmaXJlRXZlbnQodGhpcywgXCJjaGFuZ2VcIik7XG5cblx0cmV0dXJuIG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRjb25zdCBDTEFTU05BTUUgPSBcInNlbGVjdGVkXCI7XG5cblx0XHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBub3RTZWxlY3RlZCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKFwiOm5vdCg6Y2hlY2tlZClcIik7XG5cblx0XHRpZiAobm90U2VsZWN0ZWQpIHtcblx0XHRcdG5vdFNlbGVjdGVkLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gbm9kZS5jbG9zZXN0KGBbJHtBVFRSSUJVVEVfUk9MRX09b3B0aW9uXWApO1xuXHRcdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdFx0cGFyZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NOQU1FKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpO1xuXG5cdFx0aWYgKHNlbGVjdGVkKSB7XG5cdFx0XHRzZWxlY3RlZC5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudCA9IG5vZGUuY2xvc2VzdChgWyR7QVRUUklCVVRFX1JPTEV9PW9wdGlvbl1gKTtcblx0XHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRcdHBhcmVudC5jbGFzc0xpc3QuYWRkKENMQVNTTkFNRSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSlcblx0XHQucnVuKClcblx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0fSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHRoZSByZXN1bHQgY2Fubm90IGJlIHBhcnNlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCByZXNwb25zZVxuICovXG5mdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRpZiAoIXVybCkgdXJsID0gdGhpcy5nZXRPcHRpb24oXCJ1cmxcIik7XG5cdGlmICghdXJsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0Y29uc3QgZmV0Y2hPcHRpb25zID0gdGhpcy5nZXRPcHRpb24oXCJmZXRjaFwiLCB7fSk7XG5cblx0bGV0IGRlbGF5V2F0Y2ggPSBmYWxzZTtcblxuXHQvLyBpZiBmZXRjaCBzaG9ydCB0aW1lLCBkbyBub3Qgc2hvdyBsb2FkaW5nIGJhZGdlLCBiZWNhdXNlIG9mIGZsaWNrZXJpbmdcblx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRpZiAoZGVsYXlXYXRjaCA9PT0gdHJ1ZSkgcmV0dXJuO1xuXHRcdHNldFN0YXR1c09yUmVtb3ZlQmFkZ2VzLmNhbGwodGhpcywgXCJsb2FkaW5nXCIpO1xuXHRcdGRlbGF5V2F0Y2ggPSB0cnVlO1xuXHR9KTtcblxuXHR1cmwgPSBmb3JtYXRVUkwuY2FsbCh0aGlzLCB1cmwpO1xuXG5cdHNlbGZbaXNMb2FkaW5nU3ltYm9sXSA9IHRydWU7XG5cdGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuXHRyZXR1cm4gZ2xvYmFsXG5cdFx0LmZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuXHRcdC50aGVuKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0c2VsZltpc0xvYWRpbmdTeW1ib2xdID0gZmFsc2U7XG5cdFx0XHRkZWxheVdhdGNoID0gdHJ1ZTtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG5cdFx0XHRpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5kZXhPZihcImFwcGxpY2F0aW9uL2pzb25cIikgIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiByZXNwb25zZS50ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHJlc3BvbnNlICR7Y29udGVudFR5cGV9YCk7XG5cdFx0fSlcblx0XHQudGhlbigodGV4dCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKFN0cmluZyh0ZXh0KSkpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwidGhlIHJlc3VsdCBjYW5ub3QgYmUgcGFyc2VkLCBjaGVjayB0aGUgVVJMXCIpO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRzZWxmW2lzTG9hZGluZ1N5bWJvbF0gPSBmYWxzZTtcblx0XHRcdGRlbGF5V2F0Y2ggPSB0cnVlO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBoaWRlKCkge1xuXHR0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImNsb3NlZFwiKTtcblx0cmVtb3ZlQXR0cmlidXRlVG9rZW4odGhpc1tjb250cm9sRWxlbWVudFN5bWJvbF0sIFwiY2xhc3NcIiwgXCJvcGVuXCIpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3coKSB7XG5cdGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIsIHVuZGVmaW5lZCkgPT09IHRydWUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAodGhpc1twb3BwZXJFbGVtZW50U3ltYm9sXS5zdHlsZS5kaXNwbGF5ID09PSBTVFlMRV9ESVNQTEFZX01PREVfQkxPQ0spIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRmb2N1c0ZpbHRlci5jYWxsKHRoaXMpO1xuXG5cdGNvbnN0IGxhenlMb2FkRmxhZyA9XG5cdFx0dGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5sYXp5TG9hZFwiKSAmJiB0aGlzW2xhenlMb2FkRG9uZVN5bWJvbF0gIT09IHRydWU7XG5cblx0aWYgKGxhenlMb2FkRmxhZyA9PT0gdHJ1ZSkge1xuXHRcdHRoaXNbbGF6eUxvYWREb25lU3ltYm9sXSA9IHRydWU7XG5cdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImxvYWRpbmdcIik7XG5cblx0XHRuZXcgUHJvY2Vzc2luZygyMDAsICgpID0+IHtcblx0XHRcdHRoaXMuZmV0Y2goKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y2hlY2tPcHRpb25TdGF0ZS5jYWxsKHRoaXMpO1xuXHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRzaG93LmNhbGwodGhpcyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImVycm9yXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9KVxuXHRcdFx0LnJ1bigpXG5cdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS5tZXNzYWdlKTtcblx0XHRcdFx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcImVycm9yXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBoYXNQb3BwZXJGaWx0ZXJGbGFnID1cblx0XHR0aGlzLmdldE9wdGlvbihcImZpbHRlci5wb3NpdGlvblwiKSA9PT0gRklMVEVSX1BPU0lUSU9OX1BPUFBFUiAmJlxuXHRcdGdldEZpbHRlck1vZGUuY2FsbCh0aGlzKSAhPT0gRklMVEVSX01PREVfRElTQUJMRUQ7XG5cblx0Y29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbkVsZW1lbnRzLmNhbGwodGhpcyk7XG5cdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCAmJiBoYXNQb3BwZXJGaWx0ZXJGbGFnID09PSBmYWxzZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSA9IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSztcblx0c2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMuY2FsbCh0aGlzLCBcIm9wZW5cIik7XG5cblx0YWRkQXR0cmlidXRlVG9rZW4odGhpc1tjb250cm9sRWxlbWVudFN5bWJvbF0sIFwiY2xhc3NcIiwgXCJvcGVuXCIpO1xuXG5cdG5ldyBQcm9jZXNzaW5nKCgpID0+IHtcblx0XHRjYWxjQW5kU2V0T3B0aW9uc0RpbWVuc2lvbi5jYWxsKHRoaXMpO1xuXHRcdGZvY3VzRmlsdGVyLmNhbGwodGhpcyk7XG5cdFx0dGhpc1twb3BwZXJFbGVtZW50U3ltYm9sXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInZpc2liaWxpdHlcIik7XG5cdFx0dXBkYXRlUG9wcGVyLmNhbGwodGhpcyk7XG5cdH0pXG5cdFx0LnJ1bigpXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZSgpIHtcblx0aWYgKHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSA9PT0gU1RZTEVfRElTUExBWV9NT0RFX0JMT0NLKSB7XG5cdFx0aGlkZS5jYWxsKHRoaXMpO1xuXHR9IGVsc2Uge1xuXHRcdHNob3cuY2FsbCh0aGlzKTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAZmlyZXMgbW9uc3Rlci1zZWxlY3Rpb24tcmVtb3ZlZFxuICogQGZpcmVzIG1vbnN0ZXItc2VsZWN0aW9uLWNsZWFyZWRcbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50SGFuZGxlcigpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHRzZWxmW2NsZWFyT3B0aW9uRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChcblx0XHRcdGV2ZW50LFxuXHRcdFx0QVRUUklCVVRFX1JPTEUsXG5cdFx0XHRcInJlbW92ZS1iYWRnZVwiLFxuXHRcdCk7XG5cblx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRjb25zdCBiYWRnZSA9IGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZWxlbWVudCwgQVRUUklCVVRFX1JPTEUsIFwiYmFkZ2VcIik7XG5cdFx0XHRpZiAoYmFkZ2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGJhZGdlLmdldEF0dHJpYnV0ZShgJHtBVFRSSUJVVEVfUFJFRklYfXZhbHVlYCk7XG5cblx0XHRcdFx0bGV0IHNlbGVjdGlvbiA9IHNlbGYuZ2V0T3B0aW9uKFwic2VsZWN0aW9uXCIpO1xuXHRcdFx0XHRzZWxlY3Rpb24gPSBzZWxlY3Rpb24uZmlsdGVyKChiKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlICE9PSBiLnZhbHVlO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRzZXRTZWxlY3Rpb25cblx0XHRcdFx0XHQuY2FsbChzZWxmLCBzZWxlY3Rpb24pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZmlyZUN1c3RvbUV2ZW50KHNlbGYsIFwibW9uc3Rlci1zZWxlY3Rpb24tcmVtb3ZlZFwiLCB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHNlbGYsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKi9cblx0c2VsZltjbG9zZUV2ZW50SGFuZGxlcl0gPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cblx0XHRmb3IgKGNvbnN0IFssIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGgpKSB7XG5cdFx0XHRpZiAoZWxlbWVudCA9PT0gc2VsZikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGhpZGUuY2FsbChzZWxmKTtcblx0fTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICovXG5cdHNlbGZbaW5wdXRFdmVudEhhbmRsZXJdID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgcGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBwYXRoPy5bMF07XG5cblx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKSAmJlxuXHRcdFx0XHRlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSkgPT09IFwib3B0aW9uLWNvbnRyb2xcIlxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpcmVDdXN0b21FdmVudChzZWxmLCBcIm1vbnN0ZXItY2hhbmdlXCIsIHtcblx0XHRcdFx0XHR0eXBlOiBldmVudC50eXBlLFxuXHRcdFx0XHRcdHZhbHVlOiBlbGVtZW50LnZhbHVlLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IGVsZW1lbnQuY2hlY2tlZCxcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRlbGVtZW50Lmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSkgJiZcblx0XHRcdFx0ZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUpID09PSBcImZpbHRlclwiXG5cdFx0XHQpIHtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHRzZWxmW2NoYW5nZUV2ZW50SGFuZGxlcl0gPSAoZXZlbnQpID0+IHtcblx0XHRnYXRoZXJTdGF0ZS5jYWxsKHNlbGYpO1xuXHRcdGZpcmVDdXN0b21FdmVudChzZWxmLCBcIm1vbnN0ZXItY2hhbmdlZFwiLCBldmVudD8uZGV0YWlsKTtcblx0fTtcblxuXHRzZWxmW2tleUV2ZW50SGFuZGxlcl0gPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cdFx0Y29uc3QgZWxlbWVudCA9IHBhdGguc2hpZnQoKTtcblxuXHRcdGxldCByb2xlO1xuXG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0aWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKSkge1xuXHRcdFx0XHRyb2xlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50ID09PSB0aGlzKSB7XG5cdFx0XHRcdHNob3cuY2FsbCh0aGlzKTtcblx0XHRcdFx0Ly8gZm9jdXNGaWx0ZXIuY2FsbChzZWxmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGUgPSBlbGVtZW50LmNsb3Nlc3QoYFske0FUVFJJQlVURV9ST0xFfV1gKTtcblx0XHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSkpIHtcblx0XHRcdFx0XHRyb2xlID0gZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHJvbGUpIHtcblx0XHRcdGNhc2UgXCJmaWx0ZXJcIjpcblx0XHRcdFx0aGFuZGxlRmlsdGVyS2V5Ym9hcmRFdmVudHMuY2FsbChzZWxmLCBldmVudCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIm9wdGlvbi1sYWJlbFwiOlxuXHRcdFx0Y2FzZSBcIm9wdGlvbi1jb250cm9sXCI6XG5cdFx0XHRjYXNlIFwib3B0aW9uXCI6XG5cdFx0XHRcdGhhbmRsZU9wdGlvbktleWJvYXJkRXZlbnRzLmNhbGwoc2VsZiwgZXZlbnQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJjb250cm9sXCI6XG5cdFx0XHRjYXNlIFwidG9nZ2xlXCI6XG5cdFx0XHRcdGhhbmRsZVRvZ2dsZUtleWJvYXJkRXZlbnRzLmNhbGwoc2VsZiwgZXZlbnQpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgdHlwZXMgPSBzZWxmLmdldE9wdGlvbihcInRvZ2dsZUV2ZW50VHlwZVwiLCBbXCJjbGlja1wiXSk7XG5cblx0Zm9yIChjb25zdCBbLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyh0eXBlcykpIHtcblx0XHRzZWxmW2NvbnRyb2xFbGVtZW50U3ltYm9sXVxuXHRcdFx0LnF1ZXJ5U2VsZWN0b3IoYFske0FUVFJJQlVURV9ST0xFfT1cImNvbnRhaW5lclwiXWApXG5cdFx0XHQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0Y29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KFxuXHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdEFUVFJJQlVURV9ST0xFLFxuXHRcdFx0XHRcdFwicmVtb3ZlLWJhZGdlXCIsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0b2dnbGUuY2FsbChzZWxmKTtcblx0XHRcdH0pO1xuXG5cdFx0c2VsZltjb250cm9sRWxlbWVudFN5bWJvbF1cblx0XHRcdC5xdWVyeVNlbGVjdG9yKGBbJHtBVFRSSUJVVEVfUk9MRX09XCJzdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc1wiXWApXG5cdFx0XHQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aWYgKHNlbGYuZ2V0T3B0aW9uKFwiZGlzYWJsZWRcIiwgdW5kZWZpbmVkKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgZWxlbWVudCA9IHBhdGg/LlswXTtcblx0XHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRyb2wgPSBlbGVtZW50LmNsb3Nlc3QoXG5cdFx0XHRcdFx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PVwic3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNcIl1gLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0aWYgKGNvbnRyb2wuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY2xlYXJcIikpIHtcblx0XHRcdFx0XHRcdFx0Y2xlYXJTZWxlY3Rpb24uY2FsbChzZWxmKTtcblxuXHRcdFx0XHRcdFx0XHRmaXJlQ3VzdG9tRXZlbnQoc2VsZiwgXCJtb25zdGVyLXNlbGVjdGlvbi1jbGVhcmVkXCIsIHt9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRBVFRSSUJVVEVfUk9MRSxcblx0XHRcdFx0XHRcdFx0XHRcInJlbW92ZS1iYWRnZVwiLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dG9nZ2xlLmNhbGwoc2VsZik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdC8vIGJhZGdlLCBzZWxlY3Rpb25cblx0XHRzZWxmLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgc2VsZltjbGVhck9wdGlvbkV2ZW50SGFuZGxlcl0pO1xuXHR9XG5cblx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwibW9uc3Rlci1jaGFuZ2VcIiwgc2VsZltjaGFuZ2VFdmVudEhhbmRsZXJdKTtcblx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgc2VsZltpbnB1dEV2ZW50SGFuZGxlcl0pO1xuXHRzZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHNlbGZba2V5RXZlbnRIYW5kbGVyXSk7XG5cblx0cmV0dXJuIHNlbGY7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqL1xuZnVuY3Rpb24gc2V0U3RhdHVzT3JSZW1vdmVCYWRnZXMoc3VnZ2VzdGlvbikge1xuXHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0T3B0aW9uKFwic2VsZWN0aW9uXCIpO1xuXG5cdFx0Y29uc3QgY2xlYXJBbGxGbGFnID1cblx0XHRcdGlzQXJyYXkoc2VsZWN0aW9uKSAmJlxuXHRcdFx0c2VsZWN0aW9uLmxlbmd0aCA+IDAgJiZcblx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMuY2xlYXJBbGxcIikgPT09IHRydWU7XG5cblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRPcHRpb24oXCJjbGFzc2VzLnN0YXR1c09yUmVtb3ZlQmFkZ2VcIik7XG5cblx0XHRpZiAoc3VnZ2VzdGlvbiA9PT0gXCJlcnJvclwiKSB7XG5cdFx0XHRpZiAoY3VycmVudCAhPT0gXCJlcnJvclwiKSB7XG5cdFx0XHRcdHRoaXMuc2V0T3B0aW9uKFwiY2xhc3Nlcy5zdGF0dXNPclJlbW92ZUJhZGdlXCIsIFwiZXJyb3JcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXNbaXNMb2FkaW5nU3ltYm9sXSA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKGN1cnJlbnQgIT09IFwibG9hZGluZ1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0T3B0aW9uKFwiY2xhc3Nlcy5zdGF0dXNPclJlbW92ZUJhZGdlXCIsIFwibG9hZGluZ1wiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoc3VnZ2VzdGlvbiA9PT0gXCJsb2FkaW5nXCIpIHtcblx0XHRcdGlmIChjdXJyZW50ICE9PSBcImxvYWRpbmdcIikge1xuXHRcdFx0XHR0aGlzLnNldE9wdGlvbihcImNsYXNzZXMuc3RhdHVzT3JSZW1vdmVCYWRnZVwiLCBcImxvYWRpbmdcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNsZWFyQWxsRmxhZykge1xuXHRcdFx0aWYgKGN1cnJlbnQgIT09IFwiY2xlYXJcIikge1xuXHRcdFx0XHR0aGlzLnNldE9wdGlvbihcImNsYXNzZXMuc3RhdHVzT3JSZW1vdmVCYWRnZVwiLCBcImNsZWFyXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuY29udGFpbnMoXCJvcGVuXCIpKSB7XG5cdFx0XHRpZiAoY3VycmVudCAhPT0gXCJvcGVuXCIpIHtcblx0XHRcdFx0dGhpcy5zZXRPcHRpb24oXCJjbGFzc2VzLnN0YXR1c09yUmVtb3ZlQmFkZ2VcIiwgXCJvcGVuXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcIm9wdGlvbnNcIik7XG5cdFx0aWYgKFxuXHRcdFx0b3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRvcHRpb25zID09PSBudWxsIHx8XG5cdFx0XHQoaXNBcnJheShvcHRpb25zKSAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMClcblx0XHQpIHtcblx0XHRcdGlmIChjdXJyZW50ICE9PSBcImVtcHR5XCIpIHtcblx0XHRcdFx0dGhpcy5zZXRPcHRpb24oXCJjbGFzc2VzLnN0YXR1c09yUmVtb3ZlQmFkZ2VcIiwgXCJlbXB0eVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoc3VnZ2VzdGlvbikge1xuXHRcdFx0aWYgKGN1cnJlbnQgIT09IHN1Z2dlc3Rpb24pIHtcblx0XHRcdFx0dGhpcy5zZXRPcHRpb24oXCJjbGFzc2VzLnN0YXR1c09yUmVtb3ZlQmFkZ2VcIiwgc3VnZ2VzdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHR0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBbJHtBVFRSSUJVVEVfUk9MRX09Y29udHJvbF1gLFxuXHQpO1xuXHR0aGlzW3NlbGVjdGlvbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1zZWxlY3Rpb25dYCxcblx0KTtcblx0dGhpc1tjb250YWluZXJFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBbJHtBVFRSSUJVVEVfUk9MRX09Y29udGFpbmVyXWAsXG5cdCk7XG5cdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PXBvcHBlcl1gLFxuXHQpO1xuXHR0aGlzW2lubGluZUZpbHRlckVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1maWx0ZXJdW25hbWU9XCJpbmxpbmUtZmlsdGVyXCJdYCxcblx0KTtcblx0dGhpc1twb3BwZXJGaWx0ZXJFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBbJHtBVFRSSUJVVEVfUk9MRX09ZmlsdGVyXVtuYW1lPVwicG9wcGVyLWZpbHRlclwiXWAsXG5cdCk7XG5cdHRoaXNbcG9wcGVyRmlsdGVyQ29udGFpbmVyRWxlbWVudFN5bWJvbF0gPVxuXHRcdHRoaXNbcG9wcGVyRmlsdGVyRWxlbWVudFN5bWJvbF0ucGFyZW50RWxlbWVudDtcblx0dGhpc1tvcHRpb25zRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PW9wdGlvbnNdYCxcblx0KTtcblx0dGhpc1tub09wdGlvbnNBdmFpbGFibGVFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBbJHtBVFRSSUJVVEVfUk9MRX09XCJuby1vcHRpb25zXCJdYCxcblx0KTtcblx0dGhpc1tzdGF0dXNPclJlbW92ZUJhZGdlc0VsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1zdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc11gLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvcHBlcigpIHtcblx0aWYgKHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSAhPT0gU1RZTEVfRElTUExBWV9NT0RFX0JMT0NLKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZGlzYWJsZWRcIiwgZmFsc2UpID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bmV3IFByb2Nlc3NpbmcoKCkgPT4ge1xuXHRcdGNhbGNBbmRTZXRPcHRpb25zRGltZW5zaW9uLmNhbGwodGhpcyk7XG5cdFx0cG9zaXRpb25Qb3BwZXIuY2FsbChcblx0XHRcdHRoaXMsXG5cdFx0XHR0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXSxcblx0XHRcdHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0sXG5cdFx0XHR0aGlzLmdldE9wdGlvbihcInBvcHBlclwiLCB7fSksXG5cdFx0KTtcblx0fSlcblx0XHQucnVuKClcblx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG5cdFx0fSk7XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG5cdC8vIGxhbmd1YWdlPUhUTUxcblx0cmV0dXJuIGBcbiAgICAgICAgPHRlbXBsYXRlIGlkPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cIm9wdGlvblwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cIlxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItZmlsdGVyZWQgcGF0aDpvcHRpb25zLmZpbHRlcmVkLFxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItdmlzaWJpbGl0eSBwYXRoOm9wdGlvbnMudmlzaWJpbGl0eVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBwYXJ0PVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItcm9sZT1cIm9wdGlvbi1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiXG4gICAgICAgICAgICB0eXBlIHBhdGg6dHlwZSxcbiAgICAgICAgICAgIHJvbGUgcGF0aDpyb2xlLFxuICAgICAgICAgICAgdmFsdWUgcGF0aDpvcHRpb25zIHwgaW5kZXg6dmFsdWUsIFxuICAgICAgICAgICAgbmFtZSBwYXRoOm5hbWUsIFxuICAgICAgICAgICAgcGFydCBwYXRoOnR5cGUgfCBwcmVmaXg6b3B0aW9uLSB8IHN1ZmZpeDogZm9ybSxcbiAgICAgICAgICAgIGNsYXNzIHBhdGg6b3B0aW9ucy5jbGFzcyBcbiAgICAgICAgICAgIFwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6b3B0aW9ucyB8IGluZGV4OmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0PVwib3B0aW9uLWxhYmVsXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgIDx0ZW1wbGF0ZSBpZD1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImJhZGdlXCJcbiAgICAgICAgICAgICAgICAgcGFydD1cImJhZGdlXCJcbiAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJcbiAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXZhbHVlIHBhdGg6c2VsZWN0aW9uIHwgaW5kZXg6dmFsdWUsIFxuICAgICAgICAgICAgICAgICBjbGFzcyBwYXRoOmNsYXNzZXMgfCBpbmRleDpiYWRnZSwgXG4gICAgICAgIHBhcnQgcGF0aDp0eXBlIHwgc3VmZml4Oi1vcHRpb24gfCBwcmVmaXg6IGZvcm0tXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnNlbGVjdGlvbiB8IGluZGV4OmxhYmVsXCIgcGFydD1cImJhZGdlLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yb2xlPVwiYmFkZ2UtbGFiZWxcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJyZW1vdmUtYmFkZ2VcIiBkYXRhLW1vbnN0ZXItc2VsZWN0LXRoaXNcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2xhc3MgcGF0aDpmZWF0dXJlcy5jbGVhciB8ID86OmhpZGRlbiBcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJyZW1vdmUtYmFkZ2VcIiB0YWJpbmRleD1cIi0xXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICA8c2xvdCBjbGFzcz1cImhpZGRlblwiPjwvc2xvdD5cblxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgXFwke3NlbGVjdGVkfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJwb3BwZXJcIiBwYXJ0PVwicG9wcGVyXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwibW9uc3Rlci1jb2xvci1wcmltYXJ5LTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWZpbHRlci1jb250cm9sXCIgcm9sZT1cInNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQ9XCJwb3BwZXItZmlsdGVyXCIgbmFtZT1cInBvcHBlci1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgcGFydD1cImNvbnRlbnRcIiBjbGFzcz1cImZsZXhcIiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6Y29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJvcHRpb25zXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJvcHRpb25zXCIgZGF0YS1tb25zdGVyLWluc2VydD1cIm9wdGlvbnMgcGF0aDpvcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBwYXJ0PVwibm8tb3B0aW9uc1wiIGRhdGEtbW9uc3Rlci1yb2xlPVwibm8tb3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bWVzc2FnZXMuZW1wdHlPcHRpb25zXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgcGFydD1cInN0YXR1cy1vci1yZW1vdmUtYmFkZ2VzXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJzdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc1wiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2xhc3MgcGF0aDpjbGFzc2VzLnN0YXR1c09yUmVtb3ZlQmFkZ2VcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgYDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFNlbGVjdCk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgUG9wcGVyU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgUG9wcGVyU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdFBvcHBlclN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgcG9wcGVyIHsgXG5bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Ym94LXNpemluZzpib3JkZXItYm94O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXJde2FsaWduLWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtsZWZ0OjA7cGFkZGluZzoxLjFlbTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDotbW96LW1heC1jb250ZW50O3dpZHRoOm1heC1jb250ZW50O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW1vZGFsKX1kaXZbZGF0YS1tb25zdGVyLXJvbGU9cG9wcGVyXSBkaXZbZGF0YS1tb25zdGVyLXJvbGU9YXJyb3dde2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2hlaWdodDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7ei1pbmRleDotMX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbixcblx0cmVtb3ZlQXR0cmlidXRlVG9rZW4sXG59IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9ST0xFIH0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBmaXJlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vLi4vZG9tL2V2ZW50cy5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50IH0gZnJvbSBcIi4uLy4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgRGVhZE1hbnNTd2l0Y2ggfSBmcm9tIFwiLi4vLi4vdXRpbC9kZWFkbWFuc3N3aXRjaC5tanNcIjtcbmltcG9ydCB7IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSyB9IGZyb20gXCIuLi9mb3JtL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IHBvc2l0aW9uUG9wcGVyIH0gZnJvbSBcIi4uL2Zvcm0vdXRpbC9mbG9hdGluZy11aS5tanNcIjtcbmltcG9ydCB7IFBvcHBlclN0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L3BvcHBlci5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5cbmV4cG9ydCB7IFBvcHBlciB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCB0aW1lckNhbGxiYWNrU3ltYm9sID0gU3ltYm9sKFwidGltZXJDYWxsYmFja1wiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCByZXNpemVPYnNlcnZlclN5bWJvbCA9IFN5bWJvbChcInJlc2l6ZU9ic2VydmVyXCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNsb3NlRXZlbnRIYW5kbGVyID0gU3ltYm9sKFwiY2xvc2VFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbnRyb2xFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29udHJvbEVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGJ1dHRvbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJidXR0b25FbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBvcHBlckVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJwb3BwZXJFbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGFycm93RWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImFycm93RWxlbWVudFwiKTtcblxuLyoqXG4gKiBBIFBvcHBlciBpcyBhIGZsb2F0aW5nIFVJIGVsZW1lbnQgdGhhdCBjYW4gYmUgc2hvd24gb3IgaGlkZGVuLlxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL2xheW91dC9wb3BwZXIvXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvbGF5b3V0L3BvcHBlci1zaW1wbGVcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2xheW91dC9wb3BwZXItY2xpY2tcbiAqXG4gKiBAc2luY2UgMS42NS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBiZWF1dGlmdWwgcG9wcGVyIHRoYXQgY2FuIG1ha2UgeW91ciBsaWZlIGVhc2llciBhbmQgYWxzbyBsb29rcyBnb29kLlxuICogQGZpcmVzIG1vbnN0ZXItcG9wcGVyLWhpZGUgZmlyZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGhpZGUuXG4gKiBAZmlyZXMgbW9uc3Rlci1wb3BwZXItaGlkZGVuIGZpcmVkIHdoZW4gdGhlIHBvcHBlciBpcyBoaWRkZW4uXG4gKiBAZmlyZXMgbW9uc3Rlci1wb3BwZXItb3BlbiBmaXJlZCB3aGVuIHRoZSBwb3BwZXIgaXMgb3Blbi5cbiAqIEBmaXJlcyBtb25zdGVyLXBvcHBlci1vcGVuZWQgZmlyZWQgd2hlbiB0aGUgcG9wcGVyIGlzIG9wZW5lZC5cbiAqL1xuY2xhc3MgUG9wcGVyIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2xheW91dC9wb3BwZXJAQGluc3RhbmNlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jLyNjb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH1cblx0ICpcblx0ICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUaGUgdGVtcGxhdGVzIGZvciB0aGUgY29udHJvbC5cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIFRoZSBtYWluIHRlbXBsYXRlLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZSBUaGUgbW9kZSBvZiB0aGUgcG9wcGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBjbGlja2AsIGBlbnRlcmAsIGBtYW51YWxgLCBgZm9jdXNgLCBcImF1dG9cIiBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZW0uXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBwb3BwZXIuXG5cdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwb3BwZXIgVGhlIHBvcHBlciBvcHRpb25zLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gcG9wcGVyLnBsYWNlbWVudCBUaGUgcGxhY2VtZW50IG9mIHRoZSBwb3BwZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYHRvcGAsIGBib3R0b21gLCBgbGVmdGAgYW5kIGByaWdodGAuXG5cdCAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb25bXX0gcG9wcGVyLm1pZGRsZXdhcmUgVGhlIG1pZGRsZXdhcmUgZnVuY3Rpb25zIG9mIHRoZSBwb3BwZXIuXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZWF0dXJlcyBUaGUgZmVhdHVyZXMgb2YgdGhlIHBvcHBlci5cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy5wcmV2ZW50T3BlbkV2ZW50U2VudCBQcmV2ZW50cyB0aGUgb3BlbiBldmVudCBmcm9tIGJlaW5nIHNlbnQuXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0XHRtb2RlOiBcImF1dG8gZm9jdXNcIixcblx0XHRcdGNvbnRlbnQ6IFwiPHNsb3Q+PC9zbG90PlwiLFxuXHRcdFx0cG9wcGVyOiB7XG5cdFx0XHRcdHBsYWNlbWVudDogXCJ0b3BcIixcblx0XHRcdFx0bWlkZGxld2FyZTogW1wiYXV0b1BsYWNlbWVudFwiLCBcInNoaWZ0XCIsIFwib2Zmc2V0OjE1XCIsIFwiYXJyb3dcIl0sXG5cdFx0XHR9LFxuXHRcdFx0ZmVhdHVyZXM6IHtcblx0XHRcdFx0cHJldmVudE9wZW5FdmVudFNlbnQ6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbWV0aG9kIG9uIHRoZSBmaXJzdCBjYWxsLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtWb2lkfVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblx0XHRpbml0Q29udHJvbFJlZmVyZW5jZXMuY2FsbCh0aGlzKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1wb3BwZXJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjc3Mgc3R5bGVzIG9mIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0W119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRyZXR1cm4gW1BvcHBlclN0eWxlU2hlZXRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9tLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0Y29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuXHRcdGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuXHRcdGZvciAoY29uc3QgWywgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMoW1wiY2xpY2tcIiwgXCJ0b3VjaFwiXSkpIHtcblx0XHRcdC8vIGNsb3NlIG9uIG91dHNpZGUgdWktZXZlbnRzXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbY2xvc2VFdmVudEhhbmRsZXJdKTtcblx0XHR9XG5cblx0XHR1cGRhdGVQb3BwZXIuY2FsbCh0aGlzKTtcblx0XHRhdHRhY2hSZXNpemVPYnNlcnZlci5jYWxsKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBkb20uXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG5cdFx0Ly8gY2xvc2Ugb24gb3V0c2lkZSB1aS1ldmVudHNcblx0XHRmb3IgKGNvbnN0IFssIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKFtcImNsaWNrXCIsIFwidG91Y2hcIl0pKSB7XG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbY2xvc2VFdmVudEhhbmRsZXJdKTtcblx0XHR9XG5cblx0XHRkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIuY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgbWV0aG9kIHlvdSBjYW4gc2hvdyB0aGUgcG9wcGVyLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQb3BwZXJ9XG5cdCAqL1xuXHRzaG93RGlhbG9nKCkge1xuXHRcdHNob3cuY2FsbCh0aGlzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgbWV0aG9kIHlvdSBjYW4gaGlkZSB0aGUgcG9wcGVyLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQb3BwZXJ9XG5cdCAqL1xuXHRoaWRlRGlhbG9nKCkge1xuXHRcdGhpZGUuY2FsbCh0aGlzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgbWV0aG9kIHlvdSBjYW4gdG9nZ2xlIHRoZSBwb3BwZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1BvcHBlcn1cblx0ICovXG5cdHRvZ2dsZURpYWxvZygpIHtcblx0XHRpZiAodGhpc1twb3BwZXJFbGVtZW50U3ltYm9sXS5zdHlsZS5kaXNwbGF5ID09PSBTVFlMRV9ESVNQTEFZX01PREVfQkxPQ0spIHtcblx0XHRcdHRoaXMuaGlkZURpYWxvZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dEaWFsb2coKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UG9wcGVyfVxuICovXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyKCkge1xuXHR0aGlzW2Nsb3NlRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuXHRcdGZvciAoY29uc3QgWywgZWxlbWVudF0gb2YgT2JqZWN0LmVudHJpZXMocGF0aCkpIHtcblx0XHRcdGlmIChlbGVtZW50ID09PSB0aGlzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aGlkZS5jYWxsKHRoaXMpO1xuXHR9O1xuXG5cdGxldCBtb2RlcyA9IG51bGw7XG5cdGNvbnN0IG1vZGVPcHRpb24gPSB0aGlzLmdldE9wdGlvbihcIm1vZGVcIik7XG5cblx0aWYgKHR5cGVvZiBtb2RlT3B0aW9uID09PSBcInN0cmluZ1wiKSB7XG5cdFx0bW9kZXMgPSBtb2RlT3B0aW9uLnNwbGl0KFwiIFwiKTtcblx0fVxuXG5cdGlmIChcblx0XHRtb2RlcyA9PT0gbnVsbCB8fFxuXHRcdG1vZGVzID09PSB1bmRlZmluZWQgfHxcblx0XHRpc0FycmF5KG1vZGVzKSA9PT0gZmFsc2UgfHxcblx0XHRtb2Rlcy5sZW5ndGggPT09IDBcblx0KSB7XG5cdFx0bW9kZXMgPSBbXCJtYW51YWxcIl07XG5cdH1cblxuXHRmb3IgKGNvbnN0IFssIG1vZGVdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVzKSkge1xuXHRcdGluaXRFdmVudEhhbmRsZXJCeU1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gbW9kZVxuICogQHJldHVybiB7UG9wcGVyfVxuICogQHRocm93cyBFcnJvclxuICovXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyQnlNb2RlKG1vZGUpIHtcblx0c3dpdGNoIChtb2RlKSB7XG5cdFx0Y2FzZSBcIm1hbnVhbFwiOlxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiZm9jdXNcIjpcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5wcmV2ZW50T3BlbkV2ZW50U2VudFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zaG93RGlhbG9nKCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLnByZXZlbnRPcGVuRXZlbnRTZW50XCIpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhpZGVEaWFsb2coKTtcblx0XHRcdH0pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiY2xpY2tcIjpcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5wcmV2ZW50T3BlbkV2ZW50U2VudFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy50b2dnbGVEaWFsb2coKTtcblx0XHRcdH0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImVudGVyXCI6XG5cdFx0XHR0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5wcmV2ZW50T3BlbkV2ZW50U2VudFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zaG93RGlhbG9nKCk7XG5cdFx0XHR9KTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImF1dG9cIjogLy8gaXMgaG92ZXJcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLnByZXZlbnRPcGVuRXZlbnRTZW50XCIpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNob3dEaWFsb2coKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMucHJldmVudE9wZW5FdmVudFNlbnRcIikgPT09IHRydWUpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGlkZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1vZGUgJHttb2RlfWApO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXR0YWNoUmVzaXplT2JzZXJ2ZXIoKSB7XG5cdC8vIGFnYWluc3QgZmxpY2tlcmluZ1xuXHR0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXSA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuXHRcdGlmICh0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdIGluc3RhbmNlb2YgRGVhZE1hbnNTd2l0Y2gpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0udG91Y2goKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdID0gbmV3IERlYWRNYW5zU3dpdGNoKDIwMCwgKCkgPT4ge1xuXHRcdFx0dXBkYXRlUG9wcGVyLmNhbGwodGhpcyk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCkge1xuXHRpZiAodGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0gaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xuXHRcdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLmRpc2Nvbm5lY3QoKTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGhpZGUoKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdGZpcmVDdXN0b21FdmVudChzZWxmLCBcIm1vbnN0ZXItcG9wcGVyLWhpZGVcIiwge1xuXHRcdHNlbGYsXG5cdH0pO1xuXG5cdHNlbGZbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRyZW1vdmVBdHRyaWJ1dGVUb2tlbihzZWxmW2NvbnRyb2xFbGVtZW50U3ltYm9sXSwgXCJjbGFzc1wiLCBcIm9wZW5cIik7XG5cblx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHNlbGYsIFwibW9uc3Rlci1wb3BwZXItaGlkZGVuXCIsIHtcblx0XHRcdHNlbGYsXG5cdFx0fSk7XG5cdH0sIDApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3coKSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdGlmIChzZWxmLmdldE9wdGlvbihcImRpc2FibGVkXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmIChzZWxmW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgPT09IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZpcmVDdXN0b21FdmVudChzZWxmLCBcIm1vbnN0ZXItcG9wcGVyLW9wZW5cIiwge1xuXHRcdHNlbGYsXG5cdH0pO1xuXG5cdHNlbGZbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdHNlbGZbcG9wcGVyRWxlbWVudFN5bWJvbF0uc3R5bGUuZGlzcGxheSA9IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSztcblxuXHRhZGRBdHRyaWJ1dGVUb2tlbihzZWxmW2NvbnRyb2xFbGVtZW50U3ltYm9sXSwgXCJjbGFzc1wiLCBcIm9wZW5cIik7XG5cdHVwZGF0ZVBvcHBlci5jYWxsKHNlbGYpO1xuXG5cdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdGZpcmVDdXN0b21FdmVudChzZWxmLCBcIm1vbnN0ZXItcG9wcGVyLW9wZW5lZFwiLCB7XG5cdFx0XHRzZWxmLFxuXHRcdH0pO1xuXHR9LCAwKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3BwZXIoKSB7XG5cdGlmICh0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgIT09IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHBvc2l0aW9uUG9wcGVyLmNhbGwoXG5cdFx0dGhpcyxcblx0XHR0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXSxcblx0XHR0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLFxuXHRcdHRoaXMuZ2V0T3B0aW9uKFwicG9wcGVyXCIsIHt9KSxcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UG9wcGVyfVxuICovXG5mdW5jdGlvbiBpbml0Q29udHJvbFJlZmVyZW5jZXMoKSB7XG5cdHRoaXNbY29udHJvbEVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1jb250cm9sXWAsXG5cdCk7XG5cdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PWJ1dHRvbl1gLFxuXHQpO1xuXHR0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1wb3BwZXJdYCxcblx0KTtcblx0dGhpc1thcnJvd0VsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1hcnJvd11gLFxuXHQpO1xuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiYnV0dG9uXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJidXR0b25cIj48L3Nsb3Q+XG5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJwb3BwZXJcIiBwYXJ0PVwicG9wcGVyXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwibW9uc3Rlci1jb2xvci1wcmltYXJ5LTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiYXJyb3dcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJjb250ZW50XCIgY2xhc3M9XCJmbGV4XCIgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoUG9wcGVyKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBQb3BwZXIgYXMgTmV3UG9wcGVyIH0gZnJvbSBcIi4uL2xheW91dC9wb3BwZXIubWpzXCI7XG5cbmV4cG9ydCB7IFBvcHBlciB9O1xuXG4vKipcbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSAzLjY1LjBcbiAqL1xuY2xhc3MgUG9wcGVyIGV4dGVuZHMgTmV3UG9wcGVyIHt9XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgUG9wcGVyQnV0dG9uU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgUG9wcGVyQnV0dG9uU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdFBvcHBlckJ1dHRvblN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgcG9wcGVyYnV0dG9uIHsgXG5bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Ym94LXNpemluZzpib3JkZXItYm94O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXJde2FsaWduLWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtsZWZ0OjA7cGFkZGluZzoxLjFlbTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDotbW96LW1heC1jb250ZW50O3dpZHRoOm1heC1jb250ZW50O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW1vZGFsKX1kaXZbZGF0YS1tb25zdGVyLXJvbGU9cG9wcGVyXSBkaXZbZGF0YS1tb25zdGVyLXJvbGU9YXJyb3dde2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2hlaWdodDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7ei1pbmRleDotMX0ubW9uc3Rlci1idXR0b24tcHJpbWFyeSxidXR0b257YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1idXR0b24tc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1zZWNvbmRhcnksLm1vbnN0ZXItYnV0dG9uLXRlcnRpYXJ5e2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseSk7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2dhcDouNHJlbTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTtvdXRsaW5lOm5vbmU7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6LjM3NXJlbSAuNzVyZW07cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aWR0aDotd2Via2l0LWZpbGwtYXZhaWxhYmxlO3dpZHRoOi1tb3otYXZhaWxhYmxlO3dpZHRoOnN0cmV0Y2h9Lm1vbnN0ZXItYnV0dG9uLXRlcnRpYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtcHJpbWFyeSwubW9uc3Rlci1idXR0b24tb3V0bGluZS1zZWNvbmRhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tb3V0bGluZS1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtdGVydGlhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH1idXR0b246YWN0aXZlLGJ1dHRvbjpob3Zlcntib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0yKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjhzLGNvbG9yIC4yNXMgLjA4MzMzMzMzMzNzfWJ1dHRvbjphY3RpdmV7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9Lm1vbnN0ZXItYnV0dG9uLWJhciwubW9uc3Rlci1idXR0b24tZ3JvdXB7YWxpZ24tY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59Lm1vbnN0ZXItYnV0dG9uLWdyb3Vwe2JveC1zaXppbmc6Ym9yZGVyLWJveDtnYXA6MDttYXJnaW46MXJlbSAwfS5tb25zdGVyLWJ1dHRvbi1ncm91cD46bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tcmlnaHQ6Y2FsYyh2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkqLTEpfS5tb25zdGVyLWJ1dHRvbi1ncm91cCA6aG92ZXJ7Ym94LXNoYWRvdzpub25lfWJ1dHRvbjpmb2N1c3tvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCk7b3V0bGluZS1vZmZzZXQ6MnB4O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW91dGxpbmUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6bGlnaHQpe2J1dHRvbjpmb2N1c3tvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyk7b3V0bGluZS1vZmZzZXQ6MnB4O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW91dGxpbmUpfX1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlJhbGV3YXk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6MzAwO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUZKNEFCSUFBQUFBdDNBQUFGSVFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRThHKzQ2SElVOEJtQS9VMVJCVkVRQWhRZ0lnUW9KbnhRUkNBcUJ1Z3lCbW5BTGhDSUFBVFlDSkFPSVFBUWdCWVVVQnlBTWd4d2JmYVFYYUplZm1OejBab2wzdjYwY1BlWk1wRzRISlNqazVxSUlOZzZDR01nbFpmLy9uM0Ywak9HR0RSQTFyWGVJbmNKSVVrTkhHbjY5cU1SRFU4WmFqanM5VWJzbXRucW5FM3YzdnFpUW1mUlFwTGtLVzZRWndhbDZzNUlVaUpOVVNVRy9Pd29EWTZCNjc1T2pTamtEU1NNdTJwZWRwdTl2SklMVWxKZDcwN0QrZUxIcGpZREk0ZTF1RG5MakhIdnhwRFhHTXlkdUxMbjFxdDBGQ1FPeUZzSlpFMStrSnEzVCtJZTdCSkZJTk9BTmJpOXZUVXpoSTdXNEdtVUwwbFdqVC9GUVFpL20rK3h1UFAwMm9tUkhlNXBuNERnZk5aZm4rUjl6OTc5dG1FZU5hcTFSeFJxSFRqVFBOQTJKRkVnckhkby9udC9XLzV6YmdHQ3hpYTZFa1ZpQTJGaFlHSXRSbUUxWnZWVXZxdFN0YjdNdnJkM1c3K3QyKzBYZG9Ubnp6allicDdtU0hMQUNraE1XZ0NUTDZzMFd2MEFVb2hKZkVxRTNvcFBkNThpa0puS2xvKzN1YWVTSFlKNmZjSWNYamQrcktVRXNhRWxUcWxVbFZSbS9OK2UvOGlQMEw1QUtvek5sSjMvOWlCd3NoTTZ2NUpJVUp5a2dUM2Zkck9tcTZMY3MrWitxL1hzQVhGeEVFaVFJVWFLb3NGbjdjdFQrN0JCUzVkcURvbEpYdW5ibDdydHR6RC92Mzg0TGZ0SmFnRkZBTFlQRTVBN2duTXJaQmh0NGxYcXNiWkttYmRxMFR0T21wbWdOaXVnTTJQWUJjNzNNcmpxN0dMc29YSGNUcHQ5dVB2RkR6OGVOM2crc3hyUFFBdzZEVEZOcC9PWkk5aWluTml0WmhSbXBRT0NrZG9CZEFOalZXbGF2TWl0d0ROSlgvcFlJQWtWd25PUC92VzV4em9NdzdTQUZBS1UrWnova25QL1o5aitPZGZyTDhLZTJ2ZEtibXBodXhKU3VMOEVVQWdnSElpQkhQKzQ0NEVEenYxUFRRM1lrT2NPU2xUSG1qNlVzZGZvMkwrL2pwWWU3SUhXY1FVZ2Nna3BMRlIxWVRXOENHS1FYOWI4R0ZBQUFIOXRvNFJIUTZHTHZGUnJpNERpd1R6QUFERE1LRFByL2ZaM1YvcWRnUG1rR3pLVEVtV0VYYjdRM3R0Z1RZcW8yblA2Lys5N1hmK0YvOUpIQVZzSUljQUNCWndSeWtHVDdnQ1I4Vm9oSmNVT09TRGppU2JBcGhNb3ptMkpScHRCdFVXNjlYYk5GRzNJVnkyS0xvazQ4L0xmc201MjdJYXFCTE11QmJPRkl3ZUZVZDAxdmVMK1k4eFdodHpjcVRtMkNJVGM1ZUxKd1NJNGZZbExZRklWSEFzLy9UNTNONC9ZeDFoS0dVK0hTcUVyZHBQUG5zNmZxcVdKc05iWmFDbFF0amxPTFVNc2hjZG9BNVRRc3M0SkxjOTBTeENPTU1VSzRLUDlOc2hwenBYNHZ3eEtDaENBU1JFUkUvTEtzV1JsSndOS0FjVG5YQWhFeTNyMUtIY1phL1lkWDU4NDIwL2lhWG10R2hvQ0FpSWlBUjIzdi9QOStLVEFDQU41aGRrQzN4VUM0RUxzZ2d2a1Iya3JFallTRXYwQktTbUhDaEl2WU9DQUprS1FneVlNTTJRb1VNekNvMTZCSjg1cUFXQ0NkSGVrM0FCME9ETDFMcTBQZ1RlM2hTdzJmaGk0WGhQdWV1UVdFSDZ4dElFUUFiRzJObTVvVjU0UUZQK3lLZ08yRDRUNXQvd3oyWFc5Mi9ycHFwTFRTSVA4cVY5dkx2T2RzME5MV3lYNTFLNm9mYnZQWkUxcGFmN3czMThDOVp0aHE3ZjMyYmZ1TDY0VlpIdzUxNFlzbTVsZ2ZOYmZHN1c5bHNVQTRFR3o3MjN2eHdHenA0ZlJSK21QOExzNUI3S0IyZURKWGM2eHdsRzY5MDJ1ZzdBekxBOE5ZMjFCMmRCL1A1cWZPVjh0MW9ueUw1alpERGZRSTVSZzhEOThGdkhzdmNsSHVKc3JkdnNKcnBjL1RyL2d1L0VmWkp6WFV6cFdhRGo3TTcrVVA4LzhFa0FBVmFBUy9DUitYcy9KTjRZYUljTzF4SFpjVWFNTWJrbHJwS3k3TmZRSktRY1VSYWdvR21DVytIQTZFTnZiZzMzc2wycElZUm1FOWJJSGIwbUE2a2s2bE41R2R5TU41RWJtUWh4SEtsd01nVDU4Y2d3N3BkVVJ6N25mTWNRZmNVM3ZJY3pWa2RyaFg4WEhxNDAxMnRGT2Q3a1QvYTdwN204M1dBNzFGN2FPOU0rZGp2ZGQ2ajdmeG0rRDFQdTN6M3VpcnZtdXl6YTUzdHJ2OTNsVGI4MlJUMkthRlZVS01OUDM2QnZRTUNvMEdzRWRrTDhzK3pMZzFFeGJNME5nQ1dBeGd6ZjgyREcxS1hNZmM0cmpOY1FmSEt4U0N1UnVCSTVBb2RERERrR2RWOENuVlZFbUVNYWluNFNhMEFYVEkwUkJOcE9ZQUxWcTFhVjl2eEppVXpIS1dDaXM2bXAwQnVreDA2OUdyNzRzblZOYnNvQ21rVk1vcDUrcERHYVd6MnNMRHIyaU50K29aTzBiMzZZU0lqV2N4dm5sTjB4MFZobFlvVzRVUmpYWEt5TEczWTNxb0xkRWF6SEFFRW9WdU1sM0REZUVSVnBHL2plVEVSMENVWkVVMW1vdHFGb2l3SkZLVWFERmlhY1NsQkpyRWpTUUtKL0NTRlNtU0trMTYxUWxrZEtleVNYWXpzZFhLaTZJOWlrTkpNdENVS2xPdVFxVXExVkhUMXpxNitsemZRTkFJYTVKcFJvdldhRVA3Wnh1Tm1Uak1MQll1cTNYVVRnTmRSRGQ2VXE5QTMzY2J4QXp4RERPTjBJeGFOVmF4ZC8vcy9hanhBRTZKblBiRkdaa3VDM3VhTlU4RXNEU0xaVm14T2oxUGQ4SFF4WFNwZWRrWGF3Ylc2d1pvOCs2RHJpdVFGRnc1SXB2bkpoNi9aZ0ZKSzkzMGFFTTJYSjN5SkIwREhvcGhicWcwdXJrdk1JZ1lsdGJHUlBjZGtkN1ZqL05WNHBiQWJhKy9FNEJqQ2c5cDVaZXJpL3BkTTBDRy83dFhaTnhWRSs2YllhdlFuNnVtV3d5M0ZYZjZnZytYbkF0SERnamtQTmlVYnFwb3d2RFV2YlJsY2o1WFpIWXpWOEppNE5sMXZqc09ock1heE9IeGVEd2Vqei9WSUhKWG42SDB3aGc2cUZPRVVxUW8wV0xFMG9oTENUS0oweVE1TFU5eVJRcFNwVWxmWm5BU0JrV3BsQ2xYb1ZLVjZxaWJUQnRNbVFLWVlXSFZVVWZ0R0l0NjJsZG5NSDNFcGlVMHFWUXFIYkNMeE9VK0U0LzFYTGZCRWh6S2hnVWNnVVNoZnh3bUR6OUc1RVJBQUhMN0ZIUktReXJud3V4UWY1cmhIQkVCUklvU0xVWXN6VWJjNHJ0TWRwbDI2RmdkNTV0Z1FHOHgvZkFaMkp6SXZHYm1scmNYQW0zd1hLYTdFbGZQY1MydHhmcStlZ2ZpSEdvRE14eUJSS0h2eTNTSjMwUTZWOCs2bWRmWnNhRlYzZU9VS3NXTXlua2h5TDF1NFZJMEwxU0pMSXhYeVl6cEx5TnFpV3owWFRwa2FUeW4xWkR0aTkwbVkwMnYwdFVxdHpTQ2wrcXJLN3JJdXYxdjlSRDBzZ3hxR2JKb0dHZkVrbEUxWXpyMjhPMWwyS2V3WDlONEFEYU4xYjdMMElhUlRYT3V5OXlpdTgycE93SFFCQytwbGRDck9tSzBNZy9yMXZSWUVtM0RCRWNnVWVnbVV4MDNHNCt3aXRRZ09mRVJFQ1ZaVVkzbTR0bUVJdndVS1VxMEdMRTA0bElDVHVJMHlUcXRGY2xFQ2xLbFNhODZXRVozSkp2c0ZXaTdJeEtKT0J3T2g4UGhjRVRyUk4zdERwbE1KcE5oUklhaXFBaUdZUmdtY2Jrc3k0Tm96L3JvZlFMN0tjYWxORDBGT1czUkdadU9CUjJ4bVZNeGtVZ2tEbDBYN3VKaXV0UzhiTkdhRSt2L1pRT3dxZTg2R0lJZUVzQ3VvdldZZkNxMnR2cE1PQk43TXpPNjhHV1hMaHRtZ1cyZmZlSHAxTXU3cXdYNU5Ed1RrcENTY2VmQmt4ZHZmaW5BUklSSVVhTEZpS1VSbHhJQWlaRTByVnE2NUlvVVNaVW12ZXFVTXJwcy96MVpXRVo1WUJnR0FBQUFBQUNBMFdac2QxQ3ArSHcrbjIvY09sazRyRHBTbDFLM0hyMzZqZzFDVHR3ek9jTnVDWFlOZ2lEWWhvdEgxb2dPTFJTdXg4bmlsNHIyaVlhdjBub3J6WHZaMm5aalpMZmFLRCtWUmdIL2ZnTm1wa0ZiaGdpR2lVYWNHZlhObUs0OUZQdlk5dHZiY1RtNzUrM2ZkYW1XNllTdHdrZHphQ0haY3ZxMENTNGlVNVptTnhMWEdCZS9yUW9Iak1QMS9RRUdWTVpGSmdiRERKLzVUM2V5QmN2R1BTcVRpbUpjQytZUVVqcUd2Mm5DN3EzbkIwRE9xdjJHM1Z2bEloS0lXOE1SU0JTNnlaVGlOR0ZYK1JHQ0RIczhQWUlkVGpkQVVBeXZRa3dTQ3BwaE5kMjBtcHVNalFYS0JRa1dJalFwbUpSVUtZeEtYY0xEYzZrSWZIYVRLYU9NU2M0TXNWUllRMGV6VTZGTHBWdVAzdExIdXdwcllmdGhpd2lIRkFXa1NwbVdSdCs2bko2VTE4Q3V5Sjg1ajJ4MGIwZDdOOXBpYnEwbGI0Tm5VK3BPN3RFVUxpaGRVTzJocnB0Z1lYQ3N4QkZBM2xRMm5tRmMzRmJSakdCZ0NkNkJVSDdxblhCYmFjanNLOTlSZklETUFGa0Jzb08rblpnOFAwQkJnTUlBdFFFYW45V1FFczlNQUhORzg1NTR3YStBcm5xdlRUanBHUzdlL2lsUG1qQVJQbW5zeFdrZEFBUnlPTDl5QWh5bXg3U0dLbGs3R2g0OHZEdk5mZGcrSVRCWnBEOWd6Z01JQnd3Qms1dG1rRVhJcXFNTWFFVGcvSFVlMjZvTFRUcDR3NGc5VWtaNWJnYnhFSHRDeVRMWVBIbUpVcTN1SnBxenZTTmN1bWJCZFhZUXNrdTFDOTJOOGpUdkRGRVUwcnY4MTdnbXFzR2pQZlJ1Tmp2ZXJURG1IQ0U0cStxYnpPanVJSXZSYURoeloxL1ZKVXBoaGlPUUtIUXdzWjVUamd1QUI4Q3VLcitZSU1LZXdJb01PNXh4OWU0QUVCVERTWXBtMk9UeThvSW95WW9hamVqVVFiOEp3RC9YQjVpU3N3VWlnaEFzUkdoUzBDZ3pKelhNQ1RVMVhFWkhhVEFYVENRU2ljWGJZNFZDb1JnTEV4c3RsZEN0eFoxYVVubHV0R2h0T1F0MTgvUlVkVnBrREJ2YlM0bkVvTkZvTkJxTkZpZFhuMFdKTEpDclU4Q1VicXFNaFpHcG0rRjhFYkJJVWFMRmlLVVJseEtFRWlWVkxWTnlSZ3BTcFVtdnVnQVpoQUdseXBTclVLbEt0YnBtQTZ3clFMY2V2ZnFhRTdEVFdzNllIbTBFMmRjbGlXV3NXRTNubVM3RzViNnVHVm5Qbk51eXlXYkh3eERqcFdrNk0rajIwZVlNTFEvMDNWTW1LbTRabmdsSlNNbTQ4K0RKaXplL0tyZENrVk1sS3N5SW1tZVpmMEdReXdKQkVGeEMvcmdnQ0lJZ0NJSXo5MGJERXdNVGo4ZmpBVUF4ZFM2VnNEY3MxZzh3ZllDWHJOZDk4U0g4Z2FqazV2dVVQcWc0WERQOUptN29HV3ZHWHhTZEVMTGZyc0VTRXNtV1hUY00zY0x0SEZTR2JTSEJBamNDaVVJWEpxSG5NbE9MUkJMYXNuVUsyU3V4MXpxbk1CL1pNR094L3pQdThvaERBREFBT0FBQ0FBbUFBa0FEWUhnbENrQ3VMVkFpU0lLRkNQMGtoV05LUEZVd2JkeUwrc0RCeWVna2FKMldFTXRXckU2LzR2cFc3RzZlNG1EdzBCZnhaaEZ0OUd2ZmhQRUFteWQ0Y010VXFzUGw0YXk3R3VhazV0ME41Mk9Pd0phQmdTTkhzazJOaDdxRVdaWVZxOGUra3N4amozRUtTWGc4TE5pbFFxRlF6RTFmdjV0dnBRUUZ0RklteUx0aXZUZVdrUUNrNVpSZTJRaUoyWnJMWURWODZNQllXWDV4QVB1bmsxeW50WjJ4NmFiTnJpWEFzaFdyY2ZrVTYzeS9qL20rZ256TjhJM1l0eHpmQ2VPaUFQaTdZaDF3QkJLRnpzNzJXcmxpZldiM24rc09ta1NpelhIVFhwbXZBbk9nZWErN1M4RjFFSFA4blU0SW5GWTRRNW1XcDNCQUxsZXNhN0J6NEZ1T2JFNEVYUm5peWs4aHRDT2lrOHZsY3NXWUlLcjQvY0hNM1hYSWNjeU9Ec0JYSDlSM05JQmpVc2QxZmlkajBpaW5INXJpWmZVT0RUaUZRdWx6ZWF4NytqSFpWeXhmMzhVM3hMZHIrVTd1NDNINTlLZWdLOTVKdnd2eXFuM0lneEx5VUcyWTRRZ2tDdjFCVEQrSXZDTVBNZzBsVllSQm5TSVFrYUpFaXhGTEl5NGxDQ1QyaG0wc0VBZ0VKVERycWI0Z0oySllvelNVS1ZlaFVwWHFiTnJaK1poZWpiKzVySHJHemNjTFFoSlNNdTQ4ZVBMaXphL0t6UW5NQ0VLd0VLRkpZWUd5TnlLMWx0SlUvSjZXbUZ4VXFMc0luWFNzMzRzNEFKblROUDlKVjgxWlcwOGJ3b3h3ak1vR2crMWdQUHh3QU1lWmtCRUUrVnN1cHN4bzljV1M1aXZuYVNVcEZKUTFURWJ0ZXlLak1BTGxTUWg2UkszZ0NDUUszZVFVNGpiRUM3dXEvQXlDREh1Q0JRVHNjTWJWdXdNVUJCVERROXlRRk0yd3lSbnlFU3hLc3FKR1UzUmlFRFBYTDlEWjVGNElwQXVTWUNGQ2s4SUdaVk1GQ2RPa0x1RTFJS1ZGbEdneFltbkVOZU5CQ1ZTSmtuSkVqK1NNRkVtVkpyM3FtREtJekdsa1NiYmQ5SExrMWZ4KzNlK1ZDcG1Lb2hnbHlVQlZxa3k1Q3BXcVZLY2FVRzNVbGZwb2tNYmF4TkFzTFZxMWFVOUdJbE9mdkpsTXBwakpaREpiUmp0YU5Xay9yeldvTUlJYU5XZXNhdXQwM3lNTzJQeElJNk1CRTkxcWZvRHl4Q1N3Z0NPUUtIU1Q2UVZ1RGg1aEZYbHB0cmdNanlCS3NxSWFMMTdHY2RrQTU4QThnQ1kvMzJQTGJ3a25DUUJBTm10Q3c2Tm9CclZJcXpidE9Vc1dVNDA1bEN3WjF0RHg1cDFvN1RFZEpCZ1NHTDc3N0JFam85NGFvOW9qdEs5YnY1L2hBTThSYTQ2U2pnbWRlTHpORE1oaVVIbnU3UW1EREJaK0lVRmlUY0pvSGNsSWtTcE4rbVpHY1RjSDVJY0JwY3FVUjBXb1ZLVTY2cVozdXNlZ0YzbW4rYkZscmlxOUJtbW5WN1BiN0cwUnRDYXNPd0tRWkVnaDQ4NkRKeS9lL0o2SnJ6MnJ2ejExOFBrOFBwL1A1eS85TlBKaXI5Z0p3eWxLclV5NUNwV3FWRWZkVkZOdGhyV2dWWnYyWklTWWVyZUJvSmRIS2VhZWcwSjdVQmVxUjhTTzFhbjNwRkFNS0x3SXRWU0orK0ZtbmlIRXNGRVFXK3Bla29NNUhxZjUwbHhCTEx2OXpDTUFaVFBRMTduOVg1a0hGWDdjNlEySnZiK0tTSXNTTFVZc2piaG12SkVFV3hMSEpEWE1TSzVJa1ZScDBxdU9JS09Mekdsa1NiYmQ5SExreVZlZ01CVzVVS3drR1d3cFZhWmNoVXBWcXFPbWo5cDVxbE5UMy8vMXhzaUFSQ0tSU0FCQUJRREFnRUFnRUY0a2NIUEE0eS9mMm03WUdvNUFvdENWU1NJYVRlVkdGQUFseDFSSVpSdkdjNWowSkllb2N4enpwS3RjYXljeEkxaFN5Vis2MS9HQ3d1ekFNZlFNdzZMVEtkOG9zRkFjck5WRFBJZUZzNkxIRnhsTnl0aWVEamI4R09RUWJoU0l0ajAyZ0lnOE9WYlVmZ0YvR3RrYUNzTU1SeUJSNkQ1NW1jUGpMYllrSThKMHdKd1hmL00xbm85ZGpUVmRXaHBpRDRNamtDajBHWVk2a1kxTjVRNEVLZ1VoV0lqUXBOQ2piS29TQ05PaVhvWmJWRjkvenNMZEdZR2dWYk16d0p3ejgrbXFVMnNqWTFCcmNqbDNmRy9zZno2cTdvZzJZMzR2ZnBkVWhlL0NaMkhIOHlBQS94UThEM215QUlETkFWc0NBSmJabnhpMmNINXMyY1JKd1ZhT20yV1dzdFBHWnhZWkExS0lSN210M0F6QW10a0ZVSTVpbERjQW0yUXdvakZYQjZyM0lzQnlWcTVsK3ROYWJjdHJGK1FyQVErbGtpVVd6aUhHS1djNXUxRlVkTUtNaG54aXhuQVU0bGthQW5vL25odVNjRW5IclE2UUVkb1IyRklRNEdGbllIa2ZCZ0pUd05sNDJyUUg3ZFY2SUJLeDRHRElQVFNQQXRZSGN1YS9VemVQMWVwWkpOYXRPQVNxRkVRa1lDV1NqS29tY3ZKNFEvbFltUjZiV2lFV1dWSUZBTmFJVE9WdzJaVkh6cjVNekMvMGkvRDFrd0VXVkQvelQ5YjZERzYzMmlLNFVxQzdUUDJVTmJua0VZODY0WFlpS2xXK0JTM0ZVS3hIRFFZbys4Qjl5ejF3NGgwN0JhNFFra3pMMExHSkdJcnJaK2NOWHVCM1B3NmNlZHBBTVU2R3pSUXFEVzdudEIrY1dpc0Z5bzNXQ21RakwwTW1Yb0JxTldSRklaSTdnRFhodFNjdDhMcEJma0hzUlE2WHBWZklSdlpCVThwODVGNGhIOEVLbnhtRVltdStLNmNZWTNnUWUxKy9UekpBSVJGMWNLdk5tbjJRME04YU9Xc1hqVDlqdkJDcjUyMXhxdFdWSTZhcExwZWhLY3hadVc5QldMSjNRR3FmOUpUaXV2dlUwd2RnaHcvOElCUklYMVZ1TlF5c0JxU3RWTlBYWkR0TCtOaXZjd2kxUGdELzVPMG95bTJKKzc4b24wcnhnQTlPQ2xhMGdOMEpFUEhZL1lQNG5oSWF3YkVKMkhsVW5SOURiemZXTVBBdnhrcnRBMTR4NmpyQW1ZVWNnUmZSbFpubll4czJ5K293TER3a1MyVmszZGZqQUFVVklKZXdEMDZ0eitBdXc2cElxeFRsNGRtam9HbFlRWERNYjMxRkpQcys2N2o5Uk5nc0hZZ3d3T2NZdHVmSzZWaENMTXVjNE5GVGJ2OXBFUWpGTmpOcjBMV0FKQjNYR0htNHg3bkJSZlhtSFFoUTBienFtT3RWVG55ZVM2eDFIYkMvYXJqL1hlLzdxTU9sN00wZVVuRFBnaHlpc0Y4cUlvRmJoZkVncXlENG8zbzJLNVJMck1KWUNhQzVnckh3dXBETnNWb1hGSTMrOVdZUGExbHd2T3A5MWZ2YW5HaG9tSmlwOTd1cE5IbU9IK3liMStoTElwZGRyMjFSaUExM0ppYjc5azZwVEIzZEZBbzcxNHBRMXlSWmJUWE15ZEE3bVFFOVJGR2hML094ckhqZFJubzBYZGY5eUVlMG5YRmZPZXJ6WStETzNmaUJXQkZNQW1xRmJPZWdrQXFYVFZvNWZTNjZ5T0lWbExDU2RjcDY4dWU0eUplbGhVUHRVNlZtMmpuTkFQcXdXYU5ubnYxdzdKUDZ4UVphd1NJUGxPRk1FVUd1elBDQmIyZEpVeWdZNlE5d3I2SlVqSnI2TlpjYkVZd0wvY3haZmVjODJMT3NNSzQ5eFg2MjhQOE5xM1RERWNJQVBad3doTHc1OGhQS2s1SlNvREJKZ2lUTEVTdFBBNTBtN1NxWW1OU3g2Rk52MGlTalUwNHptVGJOWXM0Q3F6ZkpmbG1DL1laSmdOQndEQWFCaThlQkhUNUhBazRJUWtLdVJFUjJjZUhDalN0WFloSmVNTjY4RWZ6NHdmanpKeEVnZ0pTY25FeWdVQXdsSlhkaDFKeUVDK2NoZ2dZcFRoeEt2SGgyRWlSeWxpU0pwMlRwS0RvNlcyVElzRldtVEY2eTVFRHk1RU1LRlBCV3FCQmZrUklDQmxWbzFhcFJhdFN5VTZmT1Z2WHErV2pRd0ZlVEpuNmF0ZU13TWZGbjBjRmVwMDRCdW5UWm9sczNwRWNQdmw2OWtENTkrQ1pOMnVhVVU0Uk9PNDFyMmpTdU9mTjJXckJBNkUweVpNa000Ync1aHdzV25DNWFjcmhreGVteU5ac3JOdHl1MnZLNFpzZHR6WjdIT3N3R0V3dWhrUmlNN1RnNEVDNGVuQjFuaUpBUWJvdWRFQkdSSFZ5SUlSTGVjRDU4SVg3ODRQejVRd0lFMkVsT1RxUVJYSEFRMTZVNGhDN2dnQ0VBZzBZQUJ3b0tEcnVFbDYrR3FiRk5QTFdHQXhEQTIrMm1VU05PaUJnN3QwU2tTMzFveGVNa2pyRm4ySUlqSnpqTVNVaE91a2tvRUpTaWp5R2d4MklhLzlaYzAzYituOCtncWtnUzI4czc1NmNqVXAzendUcitSUGU2U2VybFVkVDVhZXVnZS9BSGdCejlGNGlud0U4cStINE92SVczOUZiZVdyeS9CcU12di9LU3VwaTlIa3JWZWZHNVo0SWF2Zmp5V3krcDRzVlh5aGVWVDVueElxL3pidmJqb3FYWDFaZTBoajBBWUZNUVpzMkJrQWdGSUdGd3hIWU5COVhkYW13cjNzNy9DSWZnWVppZmhUOWdhMTB5d3R6ZFpZL2hjbmVUWWEva2l6OEtDQm9yaEZaNGcxbFhCR0dXS0E3NTJFbElkOWFMSzRTRk5kVjMyOWJHN1JJSUtVNEdFdmhqcjhMVTF3akEyM3M5Qm1nYkdqUTk3b1VLd3FpT3Z5UFpFUklDS0l6QTZXVHBXUXdWNm9KbGUzVlRsajVUeVBLT2ptNE5idk9nL1Q5R1ZmeE5BOWhGaFFEU3cvZlJqcENGMlc4T0E2OGlDeVQrZjJIL0RHOEM2ZSttMXgvSUk4NzlOQTM1cndBQTY4UVdBWWdsVFRBc1lBQ0VxZU4rNm15M3dZb0E0RitqTm9XY05TOE9pYWpRUVA3eU1GYXdJalFSZ1NVTUxJMFE3bjFSQVg2UkY4WUtJSUpVb1ozeWdDK1EyUW9zQ2t0TzVsdU1IR1VhRTNlTGU4VmowaHFwV0FwSUVhbE9hcEc2cmRXKzdxUkFGY0NlWWlrQTRCUFRzTGgvd1VXZk9ieDlSNlU4cWZBNFNLbjVnN1lDWEFTUUNRQllOM2tBLy8xTjFmL2s2Uy8wWS8xb0JyNzRHWHh4KzJOZjB1Ky83Z3ZxQy9MenowRWY5T1JCcWpuMVBnTG9aUThiKzFaMGM4Z04vbC8yRFdmTm1mS3BYMTAzN3oyTHhuM2x0QlhUYkU1WjhJUHZmRy9HSm9TRHk0NkFNeFkyRGdFaEVURUpHU1VNVG9XZ3BrY3hNREo3MjRSMy9lSDE4U0NDUzRJa3lYUXlaTXFTcjBDaElzVU1hdFNwMTZCSk15TVRNNHRPYi9uTlczN3l2di81Mk9jKzhZWGYvVHN1M0xMTWVUOWJkWHQyY05ldlh2THlhUGpGRFUrTmdSY051T0IxcjNuRExCSUdSeU5RR0R4T3lqbW9WSU9MaDYrVUdBd0Frb1A4d0pPT2hoYkpCTlV2aHBVTkxacURVNkowS1ZLbHliT2JYZzZ0RWhWS2xhbFM3bHVWMnJWbzFjYXFWZ2R2bmFNUUNjdVdYSEhWNWNpNFdVUW1VbVUwTU1BbXRnUXNCU3p0RjNSYkJCZXdGSUF3NWw0MWlqY2JCbVFwNnkzQUVOdDgyZEFrd2p4bno3UDc4VlVVREIvVm11QWQreDU2Y1ArK3ZYdkdSa2VHaDFZc1g3WjB5ZWpJOE9LYkZ5MWNNRFE0TUgvZTNEbXorL3Q2ZTdxN09qdmEyM0t0TGRsTU9wVnNibXJjZ1dBMDdQY2VmZVRoaDdxZGRxdlp1UCt1ZEcyMWxzVEFQK2Z6NmRyMW1vcCswTEoxVEVnZ1M2Q3V2QzVveUFpdWIwMTNZUE1MYll6VGJPREFUWDVZRWlZeWNwVTVJVmNQZkpEbEorb091ZHN2TE9VeUNIQTBlcFNoUmQ0ZHVINEtnRXBNRU9XWkdiNUVGY01qVkprQlVCVUJSWmtBMlpLTlJzQU4xKzEweEs4dGk1THZ1OUNRT2Nad3hvYnRWSllTTllTRkkzL2V6d2lMSmRRRWxWQVZxYkZmVmo3R0ZZS1V3aUwyTTljU2RnTm04TEhjc0FJbHYzdCtwVHppa2dqUzhMaG5wUkE0eURwYk83QmNla2hMSVJ0eXJzbzNoT0ZiaVUyOUZnbUtZNUo4MnhSZDhxeWxzRldrRUgvYmFuOGxuRHYzWnk1ZTREVkdpWjNPUVJEQkQ0NjRYbldUbW9GRFI1MnVYSmt6bGZ5Q1JOMGpGVUxlcVpWTE5RRVhtVkVsRG90Wk5PZml6UTRSTGJpMEszVmZRaXVPS09FU01GVHYxM1R2aTZDVnlVN1d4TW1LVzNVYnREbW5JMTd5WDNIY253amdvZm9VNG1hU1VsTG5JUG9kMHc4eXY2Nm9XSU1kU2lHUFV2MnRnbUE0RWRhMTBGcm50UW0vZWx0aGZ3dWhBSFdLcytKcy8zenF0VHhTZmNaZFd2TUJrRWtvMk9XZDVoOFZ4a2wxd1EwdFdxZlh4am5iWFR3RHc1b21XWjVxZHZISURiS1l4eWc5NzBwSnZ6QXo4bjM1T0xSa2ZTYmREVHBaZ05NOWxRSm0yaVUzL0gwbmd4dkgyOWRBZVkyUURRdnhaNHpTaHBRYmhBakJtd1ZiSTdGN0l2SjdraU4xRkpHV051QW4wek1FeVJsMGgyTjE3SkNLaWdDUEtmeTluSE5PdHp3bkl6d21ndXZaWi9UTUJjUWxIQWZ3NUV4SERzWEd1RnVTZW8zeUNKblpSYjNXN1VmM2FOWjczRVlLN2tPU2xWSnN3WVl5SkN0Y0dNMUdyajk4Y25IaGtGbXU3UGRPd24xV3pSMGh4VG5SVThhQkpteHFIOXdRSUljL2ZVV0JIajhxcklTamJPMmhQVzdsUklhb0RKcEtwNldyVkhiMG9sNUxuS0x5RmoyVEhnbXk5NkFwWjYvbHExaU5QWTh2d0RLejVncytFL0NaSUNQd2NhY3FjblJpcjFSelBzbkNnUVZhZzVVTXJLR0o2eTQreVBZWkk3eWpLVEpLU1VONG9VVDdHVGRpeE8wRGtmY1RVZG1rYUJ6cVBiaTVTaUtmSmFKRERLWTFabDEydTFSQU9rd1NwN3pIbjZRa2FpcE5McjZFMHBIZ21JUTBPM3hCbldTeVkyMGN1SDJ6V1l4TlEzdzJtRndQOHhrNWNLZURzZFVha0tsTEhOSkc4czV4enloTnR0RUJpUkROUXNjQ2wydjJaQW4xQ2l0eE1FakxNd0c5cDFkRHRkcWl3SlROQ2ZMU3FSUzBBdFZ1cVFQSXNRQ1JaSW04eDY2SU53cFRDTUpDMnZZSHJOTVdNdzVUeEo0Vmk0SGdSUm9raWdGS1BUcG40NUpZZ3hxaDBib3FndUhQNklna1FUS1ZQcDlCbUN0eVNPSmQ2YnlFMGxRMWRua3RsY2lHVW1wUU85dEJuNkFCUkJ2WWJoL29YYXBuQ0M3NUdHSXhsOFcrWlpPam9IVWh1N05DMjVVSm9MZG92QzFWb0FpMkZBWHArTTROMUR5QXpVVWplU3Y1d0c3WmJmOUVjVDZqTWJzSjFCcFkvSnRvbDdOMGpwUWhnTGhjWWZZZVVaMkJYcUdVSDg1UThSUnR6MmZRZG56bmxsQjE4ZENETTNCTTBSVm1MWEdQRlZSakVkUWhMUDlEaUp2cE56b1VBdmVnOVpBTGZJalRWYjRldDV2UE05QVVWQzExSllCTXlFcEpvTGF3SFZzM0EwQ05EMGNnMi94blhKTitJSlc0QUtmMUdTVWEzVkJjdU1yWGxVWVR1Z1pvT3pQZldLUnVjOHFZTW1sT01Ld2w3eDBrS3Rzd2xmMlpSc3JqMWhnMnl6cUJhUGxBYU1sa1JDN3pHNFdhSGM4QUJybHkwbURWZ1BoS2c2MEtJR3NsbjFGRlFHb0JIWTFUR3Y5S2dKcDNWb28zT0JJdUE0ODVvcmgwYzBORzJMWDZ5U0E5c0djQmFuMlFob2JnbmlKNkZldHVLU0hYTHA1ZWNOMUZpMW8zTWdNbUtkdzBJckZoajgxS2lVTER2UkpESTVLU1VsS0FGSUt4VnpDdWdVeFhwR2daZkFnUEVFOTBOZXpLenB4dkhiUFRWcTJkT2FxODQyRU45dXlUeksyRll0K1dkUVpEZTRVYmVCMThzd3ZsUVVDaUZyYkwreUM3V3FselpPVWIyVnBZUVp1MW1QVWtUMlh5NzI2TmowZ3BVbW9FV0llci9GSmtna2diQUFMNERoLzBsbzVKREJNQzdrZzBEdHpQb2dGMEs3TFdMWFIwNlBFTjBvb0hIMWx1ZUprUURQSVdVNk1aTzZMYTJzZ3VuRjUwOEMybFlHWlBsY3gyWEoxdHVYRmJyZTUxQ0lVV1NoYjRmb2o2TGdHY21sZytVQ2lTaXhjSDlySjZUVEpkQUMyNEFwR2JzYTVoYS9OSXIraDlJZWFYSUNpWnU4QzRKTHpXVDdnS1lUNzYzOStBQWpMbHBwZFhBTGJtdC96Y2RaOG5mSS9zd1hOYlpkdzltUjFTTzdJZmdaS0MvNE1Dd3BDdzVzRDFqNDB3SXViZHRwQk5jc1ZIbXVVUHZoYWtzeE05RjhCTGtzUTM2TS9CT0pBUXQ4VEJCU1ViU29qd0szMkVZYmVRcnp1WUdhOW5XRmhPS1RsUUJ3OUNGajlqVEc0SjNOZ0R2ZXVBZzFVT2hiNEtBcDlwSGdhTUpLYjBTbG9MN0RvZEhzTGpwdFhoa3ZPYWFvZTBDSGpEVTZ0a0tDQjQyZ1pKelJEY1BvMnhOZUpyWkR4Y1hlVjNWMjhKd2swSEpoVTA4THRHRFFNcUtPUDNUR29BSTZZbmJFa1J3RFJrM080a2k2MUlucVQ4MTJ4S2JpaW9CTUdFNURMcE1LcmlPcG92Rkx0YkllOXhxTXEvU1RZc3kwWlFGNXlhWmF2cC9hK0g3dWJEbnBTc2lCd0pGYWdCTWk3d1ZXYzdVSHFsbXczZmNMdnZtblZSU0ZZUlFFbmd4bkh2dXg4UTFDVjdBSUF1QUlEZEFIMUErTHdnK2dIZ1A0QzlRTGdCQU5hZXZPVHdvcU1IVW9OZ21WbUV5REk3THJ4TEhEWFhFazdaQU1JOXpPYkd5Q0dEYms2RzVVZ25UcFBjMytqWlFNallHVXl1TlhnK00vVGliSTJjQnhnSndrYjBiZ2k0ZlpmNUFCQ1dUN0JEU004WWVTL0o4bm80SXN4UVlrNTF3WkttNDRDanc2cFRmUWpYalVMdjllalBPVktKM1BoUzJpSWZ1bEFLNnNNTHV6WTVPbi9iSHpoWkROMkdhUGg0NjZaTFVVWkVtV0ozWFJHKzhBK3Y1WU9PbEZJTVJGQjQrTGpXeXVTdVNPZXAzcXJQV3JOQm9SdkdEV2JncWN1OTcxNWtYejJCRU1GVVpYZmh2TDlVRC9PdW02NHd6ODFJa3NTWHZadUlPcWNZUkNwdCtEVWlnc3VFM1E3YnZnOHo5cUV6ZjhtZmVIRm41NXNKUlV1TFl4UTNmTUhadU83dmhrOE0wOTFReExCWjFTZTJpUU5WMGRqRXVDRlRibnlqZWFxTld0RFVPYnFKZUpzQnVuSVE3UEtXcXZIUFBGeEVYVE1LUmpmQURjK005Yjc1V2l0S2VOMlRUd1BNYjBQQTlxMkZVVUdTYUxoc2xqREFVQU1NTGRLWVFIVmpjd3BnWUtvd2FVUUMxNnJyaHhCRFJVL2FaZ2JFb1VzK0ExMFR4a3Nua1NMalpheXlSYStQaEtLTmpCVDhMb1NxcnFCR2lxR1NSaUY1VEJDN2g1M0Npb2VGNFdGTVYxeks1akRQb2JqSGdQNWE5c0JERDFpTzg0V2NMOTRDbzVFZGNJa0hsTmZKdGZtbUFFdCtBcDFKYXR3N3Y1THhiU1UzbWVLQ1dzMTNjb2RRVVlsSlZ2Kzh0bXVyQUdvRTFucE1oWmV4VExvUEwwa2c3VWV5Mk1MRXV2TTB5NDVLbHdHbFd4QWhuSGZOalphV05jTTZySmJNaW1pMCtzenY5QkJxT3V0ZlBWRWpIakliTmQ1cGFhTm1iSDNGTEp2aTF0bE94TnNvdGRpT3dUOW5lUE83K2VTR0ZGVHowVGFkOVlkbUEvcEo4cUZhNWdzZmFvaXN3NjFBbnQ4T3ZqKzI0MldLM1JWcitjeU9DR1RYVFo3WnEzeUhKUUxSK3FmdVNiZ1BsNFVvVW5uRk1xbHVIOUFQOFJpTzFrYWxzeGVlSFhua3VOSWU5KzYwNnppaDFzOE9LODZla01yNnFzQnM4cnVVcTZ4RkgwZ1VmVnNPWWFuM1dTdEFSZjdGNTB2NndkdUtiMFl2MmJzcDJ2Q3dTcUZhTUFycklMdllWMHF4L1RzNmNEOS9SMHZtYjdxK1VqNFFKREhmTHdxYTFMMllTYUtlNm9jV1hUNkVoK1Z3dWFSeUhzcEx0aVVNZWZwSlJVWUl2ZE9wNVlGKy9NaGdCQjJwZndHamtLY2NmK3dTSStCVnpPWExHZzFjeFc0RFZmOUhPYWFIaVNzMC9SM2RmU2k4aGRGeFloN013bEYvanlod0RhZ0YvQ2UyejBod3dGNFg1SmJEc0ZKdUF3TTBOcXRqc0dNRENWNkdLMTloalVBRGJSTjd5R2RoT2g4dXdITDMwR3pxeWxtY3Y3YUlnN1FvbHpQbkx3cmJqY052MzZYS2FGWno0aThQVkhoZVEzb1FwYXFMSkRJM1NEa0VYTEhNQ0pUWmFQS3lmUVRVV3I4NnFIY1c2WlRlNW9NN3ZhdE5EWGtGbGNrVVA2R1NVUWhWV2l0RjJXNzE5ZlBPWkhlN2c4V3I3Rm0yNHk4aEhrVG1SZ1Y3dmpQUlhQcTRkRDgwYTBhWmc0M2ZCVjV0V3Z2STZBQllPZ2ZHdXRpOGkva3F4UXVMRUdvRzFvNWZUbW02bnNXWnJkbHVFMmJyMExna2RTaDdGMU1TNXBEMERaRHc4VWl0V0tGbXVzeDJIMjF4RC9ibTd4eHM4T0gxbGlZSlNWdzRZdWp3aHhTMzBCdzI1QjdhQ2JHdGdIWlVMSW02dWVhdHhleXByVmtxK2xGbkJtUlZBZDJvVVQ1Q1Y2UExrWFg0a2FLYmRnVG1GaGplc28vS2pDOEltbGdiTHlyR0szOFM3SmpxdDFFNWFDTWlYb3dhK1VQZ3kzYko1NmRvSElneFBQZ2J3SnJkV3RsT0dKN01DTiswNWk2VjdVbWppamhTbUkvZW9kWGpJMld4UUhqYW1mVk9TUHluV0R0NThib3k4eXZMTjRxOTNKaHBMNXBXQm5SRzZsYWExcEVWNW0vdUlBcFJON1JYblRqSXJtbkEyc0hrWnBHY0c2eXM2WmVXWHo2ZDhuVFRmdFpoUU9iYUJYbUxWTVZxWmtnTkRGZ0RpNlhsVFltOWNVMldZanB6U1NGQVNCdHFxc1NvbGlVUEtVZmJBRDErcGliV1o1eWFZemkvZm1Xc0hSWGljai85TnAwWnpmaVp0SjMxMTFlZGdmQXRYOFcrbW12MjUxZGZFd0ZBdHFHOHR6MnlEekxpRHR2YWJlclcrSnFOYmhDeHRTZ3JNNnE0c2xUSlM0MXhhQ3BCR2hwcERycmlRUVdWN05nZGo0RjZoU1VqbW9MU0JzdFpUZHZkZmhBWW5yQmpVaXptK2d3VnU4enFoc1diM3gvRis1WEVVRFVUUVhRQ3h3ZEh4eTV2aTZZSG5zMjhVaUpoMG43eElXQzM1bDJzR1ZRcVNMSGYxQ043Z0NRS2tlR2dSOGFUV3FXL0JsZjVLQ0FRZ1RtdUxDeE16UmpqTElzUjRRZzNWam82K2F2WHRtc0NKb1pNT2tjYnpGMUtPSEdEN1pHeWtsY1dNeHNlaURzU21Vd0NTUmJ4TStPTVZZZ3hLZ3d2UjVaTk1DUjQxT1F1SHN6dVExK2E3K3VmM2dNZVAzR1JHWEhNMEdPZGJHaGZmN3pJYVJFQitPeHZUaDA5OEJzM2YvREFZM3BvRHlyUVV1NlRFSHlVaDVkdGNpYytPQ2hRRmplRitSRHo0dHZxZEQ5RnRPQ2lBMmtmSUh2ZWsyUExSZnRBTzhkeFl1NGUwTGl6N1dCeXkrd0R4WDZaR3VyWmFicnV6R3pXb08rbUMrWkZrbkdzS1R1THpOSENKQzVIOGdVekZzNTNXckJWTWdLM0lsT0JGTC9CRVFXbTlqVG1jUjhVRWswTEovUUVNRGZnUEhUWkNxcVdGL29LZWV2NFVSNHFHVlVTNXp4QjBOZnlyUWRuVDh3ZmRFYUx0cGNqM0poNEZhL0dUNlljNVp1QWkyRGp1d2MrSWIrbk9JN3c2TWFxTytDdkthMGp6YWVmNERxUW9lVUlBa2RrbTV1NW5QTzdabXdUekFBNVZVZnhvdVMyR0ZBSU1BaEExUytmWVlWSXBQY1hpRkxGQ2ptZ2VPRXdBVWRESUh3NjBQZ3BKTkQyT0ZSRmJ3SU1FYXhocEtXVzcyWDdsbXc4T1lXT0Z3MmRac24yZE52OEpwK2ZGSTRaaG1UOXdaY1phOWdTdUFCVHJ1OGh3NWswbWVDajdTc2U5ZEtnZ0pQUlJnVXNlVVZIYWsreHg4TVExRkdEaE1xYXVsbW5QTG5BdERZQUNTOU9XNkpleGUxRis0dzl2Smt6NVV4K3FnVzg1amt4d3p3NXdXQVc1bUhaeWZ6T1JiTk16Q09jNWpkVnBoWnNVcHNlK3BHZ1JweG1aNCtaODlpOXBPM3h4aGc1UmgrLzRiVUNqRXBoNjBPUDEvR1dacldvcmk3YVpXdVFpK0xaSndZcDBiTk1lZlpod3g0OTlpbjZGSmNBSzREbUFHVElpRldKeERUendsSGZ6ZnphdlFZZDR5WU15RFNZUENMTm1KQ3p1RkZicG81RXVpaVFaSm1RbHJJemtFeEJHbUtwMkxUamlraVBzS2ZQdkYySmRENHYxRS9zMmUyNnN4Z0NydUNCNk15Wkxic0lQMlRkOXVuTTdyc3N0UDJINkZCZ1VsT0I2MEMvelk0cTNReTBwcm5jQVM3SlpNODEyeVlkSlpMNDRnSUROdTQ2MllSYVR6eTVIS3E3TGp4akZPY2J4YVhacEIwcmJaYlVQVE9iLzdxeGtmVFBPZ1ovZEtLUmdHejdiZklzb1EwRHh2M3o5ODNMTjRZb3ZvYWJtTloybmpPS0huWjlzUmRUR2pKcXhJT1lNaWRuSndSWkRwa1QyMnBwa2RJVU5YRlNCaFhLSEd1QmgraGwzK2o1YlNyMlhNTzdTQjNWS2FYMkJqck9NbTE0cStSc09HQkhzd1lGTnIra1lMenFBTTAzbmpCOTlHanFqa2FEeE1mT2FOclc2RTlWTWxCaWxUVnhjV1JpQUpldi9QK1Q0YTROYllxRXNrZHNTNGE0clZLTEtRSk5CSlFGYlNyZmp0Qm1Nb0VVS1N2amZBbEFsWVRqUzBSaDFOSFV0TVdIVzRGbjMwWVUwSTRJOUFQVTlyd3R1TitiZW5sU2N0aUVUUlltNGc0ajd0NEFKSkdvY2Vva09SZ1FNOHowZkg5TkxMYVNRUkU4V2NDNEZma2FzQ2JaaFg2azRzU2JHWE5OTGRJdm1RSE9CR29HVjR0Z05LMHM5M3hmQXZyaTdlbU1BaGFVZ2NHSXl5ZmZlWFNwYkhnOS9kOG05NXU4L3QrVHU3L3QrN2E0VHgvc28vZTVOUHd6c3B2S1JyTlRqMXpwL2svYi96WDJvRS8vLzJTV2UrTnF2Z21SZFUwYUtqd1JJdjE2cEU1RlVlbnpiM283NUFqZ0hFT2tJRjkrR1hJOWZFTllLSDljUmtQeXFRMUdoUFhTK0xMR25tWDJlRzU5azVUWnV5ckZYTTlEbVQ3S2w0TG1tUnpZWUxpNVIyZkRrc0tJYmZDNXJreGdBRGI2UjJ1VGZlbzEvSmFKUDRaMnRRYnY3NWlidUc5dlFhK29NK1hhdWlLYUhaczkxckl5UVcrckJtSW9ndjRZRXpoMzE5ZmR0NmVncjg2NWRXVjU2NHJKK0pTSytHN2lVK0llYmovZUx4Zkk5aEZYT3ZFeGNWZE5DOTVTeHgwcDlJL2FVejJhVll4WHZhcTVhOWppbTcybVNjYnNBejJMYTBPT2JyMHZDUTlZSGRoQXBMbFhhL1dNdW93K2MvK3FWdjBEeXFNcFhMSm1mRUxYOEVhRGJ1MXh2K0VXdEpCdm9vVDBhK2tXMk9sbTQyWTNBa1JtRFFZWDZQcmpaV3Y5MnBKa1VCTmlYNmdvMmRMaGU4WWpFUU8xd3lxY3YvUDJqMnVpNUgyUHl5dE9kM0pPQU03dTFFMjIvRnFuZlVScmR2YjA0aTdvWDRORHJ5ZkpMUm91REk3YW1ydlZxOXcrN2FwMDE0akZGeHF4Ti9lcVY3cjgyYW1hYzcxMjVVQ3d1VWRYNitpbEFpbGt2c1d1R0FoVnFvMk8rVk9LK2RXQ2ZRY1o3U3FDK09xOS9yck1QSU16dU1TYTdLRzJGak5naUxjazMvK281VnRETjFGeERqUnBzaXhNM2pad3l3U2tDc0lyeEJHbG1leEtPdXlYU3F3WDFJd1dqS25VYU5Tcnh2N216cU51VGxVVVZacTAzY2xhK3cvTGRCTzZXODVzVWJ0SUtJWVZLTDZIN0hoV1VyT3I0Q0ZxWlBEeG0rL1doNVJQSHFYNExSTnlJZ2pQRjBlVWxESVR0SE9lcXJidW4vVlRpZlVLd1dpaG1JcEFvMTROL3AvZ1Nxemc3bHVqMHI3V0tLTjZPQ1B4bDRYTEIxQmJ3S0VHdll3cXl6VWJPN25OcXZySG03dG9mcUJNMGRMbmRxdXZkRUxCOG1CNW4xelBXT2phNUpBcVNFUXJYZENIM1BEZXduMmgrd29KYS9XU3dzWWhLOU1qV3NsMDY3b3QzQUZEc2xYbjg3ZFNoaVJudnZtYTZCT3Y4blFPbUhVUVRSd3ZYVzkvRDZyUWNTMDJYajMzRGJJL3Z6K2ZYSWJ1U3BWdlZxdkgxWGZOdlh1dW1oZzNWbXkrclFoeWpWOXlYblJhMmIybExkYS9qSDhiYmFVdDdONmE0UGlsVFpjM21ibGpKYm95em92Y291OHV6L3VQSU5Eejg4NFJPajZ3VzIxMHR5TzBvckZVb1BYWE5RYms5WkpYR1Zrcm9HNlpNeTlYVVBMYTB6NnJTZ3FsZ1hLbGJWQmJxNDBxY1g5My90MFBjWnZza1ZKbHRNMU95Ymh2S2t5dEtPWU0vdVYwc1ZnVFVlSUJGV0ZnMnVVTzBEZnpGOWJXQlh0akRqdlNJSGxWMjgya25CbEwvYi85TmpxNHdNK01CZ3RuRVJlRDVseldZRFMyR3Ewdi8wQ2JtNlJhMTN3SDVBL3JrdHlmTGUzWTJzOHE5cnhiL0t1ckdJam1ISHBRL3NhOUYrM0cxalJsTm1Zb1F3NVgwOFgyZnZyVFBtS1NaRHhkak12VXBMSkhwRGtkQmJjeHdSVDZCeEdDQnNReDFLcnRTVG1zZUFDWkJ4MndrVjNqZkxUWTBJSjZna2k3S2VRY1h1Z0wrdWJRajVYUGJ0RG96Qm16b2N0UmErek4ya3lRdXdZYktYM25jb08wV2xrUXNJL09DWHJjZmI3UEdISmZ5ZjRUUHY4T1ZpMnRzSnliWXpjYk1yZ3JCT1hHSlB1L09obUJFSlVmamduaUdDNko3d2dDdUdDOHh5VlJGTmtVbmQ1QVZxSDNMSEF5ODF3azB1UnlKV0dkYjhqNzJJQzBsYzdOYjJzZ2ZNMjZlVU8yWWZidysxbUtTbVgwSmxQV1pHdzFVWWI2REdreVpTbERlc050MWJVWGwwWjVvNkVmZTUwQVdteHNRZDFCcE1NWWRBNHY5UHVEUXdIWGlIOTZDYjVzTWVmU0JvTWhaOFNhTS9xLzlDNmJMQzVOR1kwcEtnaFpPLzMycVQwVlVBWXFIV0RHcVZhSmg4VFZIOTdOMFJuaWthcGR5bDJuQkpJWlZCcWp3MUNyamdMYTZXQXpabkIzZVlFaG9zckw1QVlJWjJhMmN4cm5iTC9XUmlVUmZkaTA0TXhzMjZUc0cxT2xZdi9QSDRjQWhUb2dKK21hdUVJbGllMElBckpMSk5EbWJITW9FMHFyLzZpTG5DU2oxNGQ4Tkg1cWFWVzlRUkF0SW91MHk3Tmt0dXhFWE9MVUdjNmsyMkQ5L1RjMnMvamZuUkFoSklTaGpBdSs2VzIxNEQxUU1mRUJlOG5nSStRa2VjT21OSC83K1NtZE1QR2RiaUUweWF0Z3Y3TnZHcjhLQmJDeUlBbDAybG9jZEVlNjJ1dmNhN3VzMmRjdXlmSzV5Q0wxc3ZKZWQ2MnpMcndTOG5SN25kaWgyUldOQnZoU3Q3b3BXNHMzS0d2OUo0STRuOGZTS0NQdVhxTkFlYU5SVUNRdk5tYVZUQkJ1TnhqaE5uY3dpeG9NR2RSenJtOHpHdUQyelNuelowWWJ1akpXa3lsck0vVFlkOVlkRW95bWpOM1liYjNyVnJid1hCenBvUFdKdkIzVWVjODcxNSs1c2JYQ0taTnBrQ0s0MkRma2M0MkV3cTdSUlg2ZlBvMjVvdWY1aWRHV2V0ODhwMnRrV3FLd2hGZ0pXSE10UnJNNVo1eTEvNjdUM0NSUjYxc3hYNHpVdTZNcEZEZG5ySWJ1V2dmVnphbmYyRnRKS2Nzbi82ck1yU25LYUV6YTArYytIQ3BtK3J6L2VjZ1RSTisvL2JWV1l3cDNoYUdjM205ZE1qdFFoeE4rMkNHSW9TcEpmSHNRd2dYanZhUmxQM3RIQ0FLMCtkTzgycGhRR2plWWM5Wjl1TzR1bmF3MFUrdXdwTlNPcUxSTmJkWDBORHVzbUE4T1ZUMG5rRFY5SlZBRjRBRlJuTTh0TmpUaHRTRlpUbTlBMmwyQk5LYTM1cW4yRXlkSVQySjBMbzc3b1RuUWt6YWQvMnN4RVVTSy94cEFyYnJ1bEIxZ0pqMzVmVkdXMjBNV2FWWTlXdVJtM1ZJeHJlYmY0dHArNVpLT3g1c2hQVk5uSklFdVA4Y1c4WXNjU2gzcGFwSlM5clI4OFBET0xMRUdPamNYRWIrNWEvK2xac2wvaEc5T2d2dWJ2Q2QvY1gyZFRoVktLQTJWNmdyNUp4d0k4WnhBQ0ZvcDlXdXVhdk50MmxRemFhTHFGR3F2R2hUU2drdVI4b2Irc0JZT2UvVmRvdTlGRk05NTZyaFE4TU9ZZUZOQUdYaUdmR1pVT2JwTW1PVkx2aVQ1L21NNENiZlRyUzQ4anRpOWYvbkpDZGN4NlMyek5QbkovTHhIdE5qcnFhdGZLREtTNU0xdloxQ3ZmZjc2NTJTSVZwK2VRYm9BdnFBTUdWNlByNTM0ZFBhTnBzOVUzaWM5VHhLVnRuKzhTQU16SHRsWXZ2emhyeTN2Rjc1WFlIbm9xMlhMSHY3Sy9HN0JlNFUxZzRmL1dWVy9SaUh4QzcwL3o2Q09mdjdhNXpyaC9wei9KTDFLOHdhcmFPYnQxbGY2NUE5Q2MxK1pJMytVN3dHbVZZVEpvaDZTa2oxZzE1Y2MyUzU1ZDgvTHd1TFlQT0FlRUlBSUJNNGdMN29XcTJML3lUY09yUExlNVlMVThNN083dHMrZkJzbVZ2SjljTlZVRVhucTZDblNnRHNyRVBXUlJzRFpNSnNuKythRlc2S1lockdVNTJvUzVSZ2E1dm1WRlF1VkM4c2hlWVZaRmpBWjFGdmo5UW5ISDlMWGVLeSs5aWNURXl5Nmk1V3plaHVoKytxNzF4eDdGbEh0WE1TRUo2WmhoZVNRNUQ1ei9VVVZpNVNMWElsZHVPeSt4RWZNQzVEMHNRenByaVhVOVJhbi9UT0pxa0V0V0hlMnpLTnllaUorNW83aTBWVlkyNnpwWHdDbHhjZlNaRDlDNzUxL3BjeVlNdkMxNHpMSlZleFVSaC9YNG5WcVVwVUlYTGRyc0F1cFZ0VnRmdXdacjlnTE1QSWlSTXNWanE5Z2FKekdyVkpDU2NlbXdZamZQeEFCbmxUcVFGUWRqSTVITm9lMUM1TzAxWktpZ1lXQkxZQmRMTllrL1pkZXhSb1Y0U0IyZkx3MWMwWENJdm16cTBxcnlGS0JTamlUa2ZvWVp2VG83d3NyQU1IWmZ6UkE1OVlqQlpXNlAxMCt2c3BlaitFZUJaclo4dWVkMDg1NnlzQzVCRGZ3KzFjdUVvcG9yYVpVbDlZVkduTHNqUkJaRXhQTkpnS0Ixc1ptSGw2VGFBelk4RzFlR1dGTkc2S0NjK1AxSW8wdHE5TEhLWVhVZlp3L2Y4V1JOTjczQmZoNWtrZ2VxZjhaV1MyWXZrczNFajdwZnFpNzFtNW9KTWdHSTZWTjFPRjZNbzIvcjRsdWJsQVRSdDZwQmtCTjk1bnRYWXpIMlQvUHpNVitZZWk1ODV4dVRUMVlTLzgyVjdlbk5WWnJhM1ZTNk9HQmdDK3lzSVYrWTNlS1hyM0FFL0FPMHM3NWw5WVkwcFNMR3FsVUJraW9EUi94VkRxdDU3L0EzYWsrMVRkdUx1RzlhV2ZTQXhxWGI0N1JsaldxOFlDYkRBbTNZQkFHTzYrSE9RcDVtSE1kcGpFWXUxTjRENk5YQlBnSXRvbGhBK29taGNtblJkQlJOd3NnbXVVbWYrOHlGSTJJRUhsWWJHMVpNUXpCMExEa053SGtFN1RXNGZ6dTNDMHhoelYzYjJsNjFaQW42Qm1TS2VGYUtTTUlHS2xrZUE5eDY0cTkrWE5kdm41b21ZMldyd3oxOWRjeS90bU1mdzYwM09LVXJ3ajF6cTVWOTNBazg2eVpScVBGbHJSWWNxSTVwUEc4anozVGJEVFZXQzJ0dis4cUZxc0lJN0doWnlzKytUMUxYVFAzeTQvenlMY2FiVDdON2RBRTNkVHRpYmpNb3p5a1ZvS2VBR1kyeHFHNnMyS0llN1JKYWcza1RPb01aY0Q4Ym5WRUpxWUY0VnJIYTZMN2lUSnBrYk1YYzBUcU9HektuVkdhRFUySTFvV3B6VXdmNUFOVllNK2dteUUwN2dSTU1oMFdJc1p5VVVtaGh1blhXWk1tNWYrL0hidnMwOG1ES3JPcmNhNWFzRzVpRGo3YUpiWTQwWG5Pc0VaY1Vxd2JEdi9sZnJEYlVkV3B5WHFIYXRjeGJYVFRUZ2JlSjc4ZVhGNW4zenlMWlBGdnJPRGduaE9CcC92SFRhV0xXaEg2VGRuODNmUjdzdEV5L1g1djdzclFLMVhYdkYyTmFZUFJOcVJxREJpNDBmL242eFFsK0w1UTdZWis0M3BrRU45VHpBQ1ltb0d1Y1R4U2lPY3RZb0EzSmhCWnlLWFZ3anVjdkJvNUdIUnExY2lLT0wvc3VnVDRDR2htK2d3N0s4RUt4enZTdlA0eEI5WUptV1U3Snk4K0lwVTZERUExLzY0UlBjMElOVDYzU3lNWkd3UHYzOGVQczY0QzdGY0xheHUwcWM2cTZ0MFE2VkVDY0VMSmNLVmMyZ3VDSUkycWxaOSt1L25aMXdjbEdDTm9rd0RIeHI0ZVJxU0h2WHp1MU95ZnBILy96NzloQnN5elQyOTliVlU0ZGhsMWlZY1I1RW12Qk5ORWxOSTFBbG9xMXpFVUpsRjZSTkxOMHdEODhMZnY3cDArQ2I0T2JKZXEyWE5XdzF1OW9Bb05JcC9tSlh3cEsvem1oOTM1UGdRUFpSYU5STkpOUHBVZnZPZmVPTmxkaEZBbzJncUFXOFZDUWRsV0YyNzNEWkQ2YVpOeVZtNk83RmxmRGFyeWlydkU4bWZRM3k1THBIZlJIQUM0ZUpkRTh1dk1yVFhhR3FaREpPclU4MnNhRndqRVhmRHBqemdsVTRnL2RRTTRKNmEwNGp6LzFVTGNqK1RmL05GVGlOV1h5dXY5SFVBdzNBdmVCU01IL0NEdXl6U0hSOU1MZlErQlc4c0VRdEUyRUZnbUZBcUpwZFhmaC9TeTgzV09leWU1TEZpSGdLRXBKM2hsLzdXQmI0RjFybDVPV3dYSVBqS1pCeDF4b1hDMTg5d2R2eC9penVGZFhqcUNQSTFQVkY4Q09LOTZqNGRNZGprQmRLcml0U0hVN25nSjNkLzNmN3ovSjFrOEV6VDN6eFNOQmFwaCtiNnkxVFcwckZxTUtvZGMrMVMxRkgweUxxRENBdkRwdkxnL2JVRXF0ZkZmcDZweHB0bEwrS0NEVHNCMTF4MkpsNG80TDF5dktjbTlVdU1WWU1jdjZaUWNrdTlXT3V1T3NrdXJiKzRjUHBWUG50LzE0WnNiU0NkT0JlVVk1Z08zQVVlNjBTTHZ3K0JTc2FwYXlyZUVKMHBzWmYvM1doT2ZGSHpvN29OK3p6enYvM2w4ak1WcHJzeTh3RWxXWlNxTzZJUk1kdVhrVDQ5SXBXb0txQzYrcTBHdmNRazFIc2Fsa1R3eGRzTjc2dmhIckl2QVAyWVJYWkxpTkw4ckhzWGZMSmxTM01Xd3R6SGN2RGNnMytmbWJtOVQ5djViSDM5YzNEait6TGpsMmZFUzE2VnV2THVvb0pEWDA4UGo5Q3ptY1cvdTVmQjZ1NHRjaHh1eFJ2Unp5eFZ0OGJKb1ZiT3VtUlV0WXhyeHhuRE13MkV6dk54MzUzVG55Tzk2ZEQzc1cvOGwrNXpXYkozc0tWMzgyWEx5eXczS1czUmY0UG92UGsyM01xUmNvdnR5dlh5bjVpTmMrOUduaThEQ3lXc0M5aWtqSE5UZVN6TWZmRk5mN2N3Y0N2RWVmTlpMZThnbGhtRkc0UGliNGp0TkNSRUt1Ym56SlY0MXVtbUQvOEZNV3orRnZ0R0JkM0MwcHZKZDA0Y3pSVFdhKzVoeEVaZEE4eGZGYzVyakl1eGRBK3g0ejdMY3k4LzJDQTZwRGdHSDhFUGxucHJEcXNPenZJY2I4VVpGWHE1bU4xd2Q1U0xqbjQrYlB4c3ZjYXFJTlVSUm8velcyVGE5cFhqZHY5ZjNGa3VOV0t6b3p3cWdxcnhTVVhhbWVRYVhwU3lNWVdXNmw3QllvWkxGbmVIN3Iwd2htNm9DS203TWlHRkdhZkg2ZjI3c0tXYVhwZVVsM1JqMUFvV1ZOR09HRnd4WWQwbEpRTEluL3JxeHRUT21Tc0pkM0I1MWhCbXpwUm9QMlZiSVZoUjltclJMVjloWDNOdG9UVEZqRVRXbkIrbkNrN2xPVTJ2czlTTFhaZUlpa1RxZmFKYWV2d0pGeGJsRHF2ZDN2cjlEZFc3Lys2SkZBUHIvdjA3cjJRNmpRZlRRZTZMeldQUEJqZyt1ZC80UWhId2ROdlVmZEtQc3RteFp0aXFyeTdLeWdhOFl4eXNvYlY5R3F0dGo0Q3RndGJPR3ZpdnJxTTdvTTZ5T3NsdDVaWmgva3NxcWh3ZkFCclU5SkV0cjNLYkZmUkZQNGMyU200UDU3ZlN1cVdWUjdOL1hSUzV1Y0ducHJ4NVR2UUNlLzhVb1JlVHFITWpMRDhZci91YUc1SHNudXg2UkFZOTJlYnhQZUwzVHpSS0pXZTczRHZzOUhZOEN3TzRPcjN2WTYybW5wZWJwYnM4ZG1zOFVzWEVZbm9DY2NnVkVqOFBRVjVDckJLclVMSUlLbHU0NmUyY0J5SU9XNnlaYkNyWmgvVDkxUTc2NlFkVHFjSldiT2lvNlgwSisxRjlkM0lHb08zUWtCMVVoSXJMTnRKVDEvZGYvNnRkOVAvbjkwNitYRmNrcEJ3UG1Pb1RPNkhVK1hHY0lqSHdPeUxSREhxV25FQzB3K3VmSjFKS2dncEV3Y2pVUmp1RWFmZGIweWY5TElsb1VYTUNEd0w4VkxuRllDOFRVN3FWVitpclJyeS94V1MrTkxkMDFSeUJDVVRHdjkyYjVYVjFKWlA1L05UdmdIVWQxUjdmRDI0V2ZEaUNwTTIzbTEzTnhKbUt4OXVrcnJsaEY3ekM2WnJ0OCsxcmZ0ZTI0VmU0aTlIYTBhTlVKK3hYTEIvV2ZaZkVyeXBjdFg3SGlIejlsNU5MbUJKN0FUSEU4ZnZJd2RqdkdkMytDWUFqYVRra2wzL3ozd0JWajh2TW16dkRBVmJhc0FnS0cxT2ZBakltSjJXRVBac0ZNMklaYjVMZHNTTCs3Qk16NXdydk42UnF4U0ZURC8rVzdBaUQvVHZPSVdKcjlrOHQ1NVhoKzFhWDJVNnFubHhNekcyYVFjTHZ6R1hhZnQwb09jRld2RVYyWnFRckJ0RFVPNERMS3ZEOGZKaVV2UCtmdGhBZmtpZ0dRaWxOQWp0QlVZcVg0LzZlRmtzK3VDMFhIenFkS1cwN3lOa0pUem51MisvUkc2REhnZWxhYm0zejliVWQ1WHpxNDJ0alpZOXBTWHhrc2QvN21sc3RtSHZHK082WFVlMklCTXpsU3o4VnhUOFVGa2gyZVF5SiszdGYvRzJKQ2xlSHNielA5MEJiUm5DYXU5QW11YzZaUEdDUlhwSFBEbE5jOVNtWXoxUEtRbjF5ZWJoMmh2TXBRdGZiSXdycHFOTFRHMU5sbDJoeHZzRzNxYVY5TGJhdzUrZGJHYXZRcE4xc0hPeXUyd0pMZjVWSytVT25wSFQyb294djRxTW9kVldnSkg3Qk5nWkhlT3Z0ZmQvc3RLSU5yY25WU3pOeEN1cFBRa0FQMzR5c1RuUU5tdDdWYlphKzNVTnBZZ2o1WkhqQnNrS0swUVF0dHp4ZFhYcHg4ZGNPRHJ0SnZCM1l0WDM5RzZmMVRaWS9iVmZaRS9vaUo3c1VETGx0OXQvS1pEYzE1ci9ka2V1TWI0dUN1VjQ5WkVReWtuMlJZTXRtOVJRTi9sM1dHQUJYa0ZMNklvSGY4bjZkdkFraEdMeWg3YmVndmhjNFVTQ29JY1BuZXFhZVhYdmdnd0FlZHd0MndJNjQ1RFhuSzEyMUhoWUJ5alZLMDZOSzQvNDhhTHZvWFV5MnQ0U3BlL2tWMnovVFlXcXFqM2JBMkdqR3M3V2pibzdIWU9tcldvQ1VTUGJOMnVDVlJzVytFU0RYclJ2eCtjaVNaR3RYNGZiNVJLcVVkOW5udFZCcCs5SXgwWW5FSmJVVWFLV1ZOSGNYVUs4eTFuWlI3aW85RExQeWZQU3lYVENWeDE3NG5xbGw0OW9rYjNhd0lMS2h1UGFMV1BYWE51enU5MnVIRU9hSjQrZWo1dmErTnFGNUR4bVEwS0h0eXhqbmowNnA1QjlhOTRmM2FwNm8vTVZVYXZmMHpXUEpBN2hKOEtZZWM1ZVdUQXZoTTZrVko4c1V6aUlETXZLWFViNUIrSkpXNXQ5SlJtZlFvVGgrdFpuMTRvb3AxdExHdGVHWjdVOU8wbWM1bHlkV2JBellYYmR4MnArcE8vQzh6U1FWR2pPL0IzdGxEN084ODNGazJOcVZXSHBwcFdwbkVrMW4vbXBab1Y2YUpkSkhtTzdPOVFWSlN2MGh0YTdDVTRKdHljYmd0L21sRHJmNFVaOEVQZ0tVZy9DY0kvZ0dESmZXTjdFa2Urd1NiOVR1WE4xa20zQ0JlQzdJNW50NENvREFsbWk0UTFETjhRWGR2QVZnNDIwN3g5ZmZCSXJpby9ycy9LMXhhVjZSczl4czdYemtvU0MzalF5bUJvQW5jMGZNR3BCaGhwclBldHZ4OXJyZFhzem1lNFFLZ3NKOFlQcjBhYWJ1bnFnQXhNUVRRRHYrTlBjd3hqMk95TTZkdS8zZm5tai9HdjExa1BRSUJmTkJjQ3dLVHczVWdTNXdGckFBZFJ4VndSZ1c4cVFJdWgxdEhLbE9rcjlyWXkxOGZhb3dpVzJzZzY3WUdMMWpKWk1KVXdvY3E0VHVWeUIyLzdRS0s3WFFib1BHd0JxTFdRRDdXUUw3WFFINnpZUTBJSTM3bzYrMmdhQUg3MTIzZDM3Yy9QRGRjSzBJQWgvdWJFWEszQ1d3SHAyRXlQT3liSDlyWW1mMEIyUHNoQVBNc1NIWm1jZXY0RnNmdXhmMzl4ZjJ6Vi8vN0Q0c1hrYmdaaHRsOHF3WU9xSUVIMUdDZis4RWZMOU5xTTUrR3pWZjJuMi8rTUVlMG1VZXRaY0JlL1NIb2NrWWNjSjc0QnJ4NmRSZ0FvRDA0QjA3MHFjaG96WUxrV29iNjVhNXY4bWVXSm1vbUFHcHdtUElmUUJnVzVPOFdhakFIdm8xZHYveWk0OGI3YmZ3VFBaM3N4QUd2L2Flb1lRQWd2bDlLRXdEczZSNjQwZnYxd2JIeFM5SCtUOTg5clNyTmJxM25OTDFmSGx3QStFUkRPSUFmaDF6a3dSVkhXZ3VQVG1FZldLLy8zWHRONzBjZXpxWGJSSC8vczZEM2IzK1FzenpzbE5Kazc3ZDlHeGxzVENIcHh6STh1Ky9UNzc4NFF0Vzhzb0gzUStqSkJIQ1I4a3I0UnlBK2Y2dURNejRNY2pZUDk3U2h2OUhDbnA4S2YzaUdVZ3ZiZy9kRHVORHhTYUlBS01ULzIxY1o4S0Q4REwzeHVUaEZjVzJpNHA5VjdoWExXMEJWSDF5SGw0dDdQTDIvbFF1b3V6aFg3NHJ3aHYwYWtiS25wODk3UE5PN0ZIempvaXVXbEZOZXMrUC9zQmJQLzJLbkhkejh1bXZyUFpTeEZiTGl3Vnh5RFVveHBSazNsKy84ek1lUGg1UjFHQWNBN3NyVis0L3BBbUpYMjVWc2k0Z3ZBd3F4V0RUYUVGSnV5RFEyRWNuV1hxbEtvcEtwdWFuUkFEVEFoWk8wN1haYktqa2JsbldwN1IzWWFBTlRQYjRwR1RkenVVT3FkWTFXaWU4bUQzam9jVDA2VXl3UUFVbEEyMFlCb0tKbFhSQUpETWxOa01aN3lTb3RaRVFqUUkvRVVjbFdsZFdPWFZSbUNsZU9ncllXVkkxQkw3bWIrNzJlMGROcnNMMEM0ZFpzM29FS2hheHVOc25CRWJGeE1rU0VSKytaakxaSFloSlZWM214b3lWUmFVVDBxam92cmVnY1ZkUnNYamttYUZGdEVlSmxqZVFGVlFwbVUwNFFjYkNIakF6MWlVSWF3dmxPWGtPNkxSNmtYZW9tWE1valpSTlYzZnFxeDM3SGg3ZlVlZ0RWQzErWnFFd2xxNjYzemN5OTNxNTc0K3F1QXIwdHRCVXFmK0p0akZpcGMwQmEreWw1YThjbTdZek5yS05BK0lRRk8zcGYxZnJWYmUxRFNwaE5XUnRvSGVKTmhmc1hSZWV4cXZzRnFTZlU3NTZFMWl5cnNuQlpXeHBZYUdZbUlSS3ZXUzd6N09nLzdpNGdkbTRKRGFSY21oanJLMU02Ti9SYWNtT0poR2hsOVkwNEhLeGtqWi9jR3ZLQ25BcnRkdXdJZEsxSVJpaFd0c3ZvYjVIWVdWYWhDTDU3aVpaUzlTVXErRFRIODkxdUFJanlsVmVuTmExdFNpR2JIU24yelhsbnA4dXFkN25xbVBtbkN3WG14MjFYOHVQSHh6Z2ZFSXRFeTU5dHQ5K3V2N0xYZGxQb3k1bDY3MWw0TUFKMW81V29LSUYyRis2WFoxVHQ2MkxONWd1eFdXV2xFdE1reFBmZHZOeEZyWWdSMTIxUmwydmFzb0Q4ZWc2M3NGNHRRN2xRZUd4YlBlTE1DVGlxcjF3REwrdlNKZlYyKzZNWGZXOWNFTVBLMEwvODdrRWk4WTJyYjlWRHQrUDlHeUx2NWNCV0oxb3U3Y0tkRXhXZXI4alA0d3ZEU3MrejZCdVBhR0tPTC9DbWxpU2E0YnlpTHVnK21SQlJSZkJBTjdHU1owMkM0WEg4ZXBkV3IvQ0I4Z2JVWlVwZVNzNXhOUURJT1lWQTFFbUllaUtYV0taUkExVkdUQ1R4b21Pb2dPalFEY2ZYK3oxcmxPeWhuVXd0RVBaaVFEU2xTUTBYSE9WNXNpOWU2WjNxNjlCbnRDMis2dlBvUHZDKzQrMFZiVHQ0LzEvOHdYSXhHNDZtRTR3bjBIaTMvWEFRcGlMZ0FGWmcwTGo1S0grMVhCckhRbnBoVFowdiszT2pJcCs2YjBnczZ1b1NFN3FWd2p1M3RlaDlKOUJPWGMvQ3dEeS8vYVVtRnFsRkxNbUg1bFUxUjloUlV3NFNhSTMwcUZIV0FubW1TbHFvK2F0dUc0WHNzUzE1emYxU3N5bDViWjNiNHBGWDg3YXlBY2RtY1orem9laHp6b1hFZGFRU1prb29Mdm1WNExtenV4NnZFd1c3UlZDRXRXdDNkQVVLM2ZGaVoxYWRpNlZPUVhjaDZtekd6ejJoempmTUtRcVRqaWoydTJhcGppVFByYVJHSjc3YU5qVHBjZDZnUEpCV0FQOVh0YXBjV1A5eCtqTDhqZFBQemEvd3FpTnVmREF3NjNiWEtrbHJtc0FlK1FVOEpmeWZBMnZxRitSUDNZbjEzZWhoNSt1NUhyYk1SSVl3OVBMdG9YOHdPWUcxa1hlQzRlYTlaMDJNM2FNYXVuejljbnlhdlhyN0xFUVBIcStxcGhpSkh5MEpnSmdBeXN6b216M1RsbFlCQ2RiSXZST2NVZUxnTlpMdExPcEZwclgwNFdLT2dWNUFsaXc5ZXgyYk0yd2ZuWStuTnZNVi9pdnUvaE96eEZIVmJsSkRXYU5KNlNSbHVWRzlzVnEweHJWRVhUZlVLQnVNcTZnUFFYZFVzMUl5VnRTd0pXeHZoZCtpblhROUlDNUtoeEhMTXQ0Zm5Kb3N1dFlNdHFYQUxCdm5RRlFCbUhPV2RsVnIrRFRQeGxJZ2QyR01xOGxoUDQ4UkRYT3VFUU1aaTg5K1lpY1NrdGdKSUxubUxoNE9oME8wZU1xemRvOWJ5b2Z3bU8zN3VoUHJKSWRjTDcyc0U1eDh6cWlvVllta3hWRkZhNS9ibGFvM0FLZ2gva0VPQW1QdXg1YkROT1FxMWJJS3dVbUpoaVlIQzNDY21aTHZrV0ZWa1E1WmVqbkU5Y0Ivc0NJaTRsVTBrWTZldFJVTmFYdW9RTHl0SjBOb3kyb01DZ3JMaUpDZFFSM0RCT2YreXhVQ2p2TGZRRmJFZWEvVGw3MlN1Tk91cGxUK25CdGFXZ3JseXpOY1JPeHNiWC9URmRKeS8yZ3hQYTNvVTJHcFliQ2hMMnY1SDJheUlOV05RTC96bUt6WXFVQ3NyVjJhc3JlWFJMNy9jbDRhVDY3U01UQXhFZkpMd2hPaE5oWE9KdS9wMHdOL3ZDVk1xQ3p4T2pmTjVlTFJMT0NLSWMrTXIxeGU2ZkF3YkZzVzRMNGMyN20rYXRvQWRBVGJwbC9OM1JKZ2JCMG5mTTI2TGZ1S2tQUnNEU0VBMFZNVGpkRFhZN0o0Zjc4K1lGL1A0K3NoVitoY2xaVEdmeVBUbTkwdVZLUFJjQmh1dEs1Q0tXWWU5cGdhOGN1Q3FSamhjTW81eE5oNFFjWTZKUjNhazVZNDFtNVNSQjRXRkZVdHNpcUFValVTTUJaNjdQY01JZEJNYTJpY0ZKN1U3ajFXc2YxT2F5R2NxekV6QzNpQVdVYTVDaldhYzNpdjA3Q1NKUkltR0ZQYmlkM09yNVdDd0xmMis0SjJMc2JVMlVGaFZTd1RyRnFEekljNENtQk5qSkRXbFZiVGFEUWE0bVlrWHBkc2t5SjNkVFVlVDF4R3RsVElKdUZNT0duaE9sSEtraE5FR2hKejlCbCtqQWxETUNvRFFtcVp6Qld5VVZTSVBIVmM2MlFEWmc5UEhOd0ZaVERFa0lrbG1nUWlZTEJRa0Q0SFk5Vm9yS3RhQW9TTEtBRnBOY1pVU2htd0lPMnNsUldUTmpXbVZsQjhmNFJSdnVGZXh3b3FRMVprQmF2amh1SmkzZ29keWZESkt3THpBRkR2b2hhV2hEUmlKOTJqVG93bjkzNnR1d1RpM0psWWxNdHdPQ3l0MTV2RjFhQmxBbVpBODJvdE9kSUdDeDBXUUpvT3g2LzNZMW5ab2ZmbmxEbG8zYi9IOXIwU0lETG13WU91SmM5ZGFmMnRXUktBTGEzRFY5cEJHTHRtYnZhM3BDNGFKNjBSNlhxYkdhN1IrL2VUL2Q1UXFuK284b2RZOVdDK3B1eVYwMWhpQ0h3Y28yNFVwVkYxSFIwU212MTRJY3FVc05CanBZcmFYb3BCRjVKYWg2Y3FPay9KYUZYbXA4bGswSmFNZ2hDa0ZCdlFEUHpyRnBRdUFPSXNhWTJ2OTJZd3AxMGdORkVwY3JkaDd0YWVNTFJ0VE1reEd5VXhTVlZnRlNtWFphTlBzeHNZK0lacDhKR2t4cE9iQUY5TmQwYVcwUFB3bnJyOEhqQ2JCQ3Q3cGNyZE55K0gyOG02UStwWGo0OCtVTUhLQzJGTmoyUTNlZiszYVJxSHVSRCttYi81U2Vmdzk0TWFNTENmR1ZaWkNTZjZTNCtKZS9QaEIrU21LMUpmT0RVNkUxWlVxNU10NnZXYzl6YU9VOVZsa2d2cTVJemhlWHFMaFkzcDlkTVA3NW8vL2NYaExHZWZIZXphSzg4ekpWMWY4LzU1aTZyNjllUWZaWEQzMWw3NHBPYmplclBaZlJrM2M0ZngvTFV4ZVlndGJNN3V3LzFxb2U5emJZbnArVHlNQjdkVzA5L0JkeXpLYnF0ZUtIa3NHbHlRVUZiS3hkN05OZHhkRWtaQUFCQThpbE1QR3p2UlNnR0JFRHpZTVhublVGelJUSFVTZ05aN1ZVVDZrZUFlMjVwcWY5UVgxZjg0c1dEaUk5UEhFYlU0Wld0TFlMUEVUNlYwUU5tOWVsOWkwTFE5SGU5NFF2Q2x1bklFR2lSY1JtcFBtWlFwRFFubUY2a2hBQVB4dng5LzMzLy85OExILzF0U05LSWZBTUJhK3c4WjVBRjhQRy85czZJbitlNXNEZ0dnWUFBQUVNQy9IOGdqdDZ2ci8wYTlVNzdYWDBCb0tCVkNlbzdnM1lTTnQ2dlZRNldkNG4vd2xlcTlRbFpOWm0xSXp5LzJ5dWNML0FvSVJ5NERwZnVNUTMyd0pNclA2Q0xQVURmaDZ1ZUJsbHJoUmZBYjhJTjVXNWVTVmNhcE8rcmFQaSt4YnpyZlhhem83T2Q4LzdMWTFRNmcvNTZsMHBlWkJBcW8vcjR0NEY4eTMraGlDR2U0bmtBajArWFdVZ2t1L215Y2ZWMnZ4RTBaRHZxN1QrYVV0aE9VelZmOU9KQVZXQW1Bcnk1dndENG56U09mZVkyZHBVdHQyK2FBZlo2cWQwTmxMc2M0KzRrNEpXRnZmOVFUcXZ0R0xlUmpaaE9DOXhaNTFjTDNzSUQ5UTVValpkdXgyd1dxa0twdEZHVUlMWmxITHdyWklUN0ZVSmNpcEJEOGZLRTl1KzgvNGkwWDh0dmJ2T1lFM0JDUGpiSGxIanRtSXRreHZpc2kyb0V1Zkp5MElRWU56RDI2bzgrSzBiRnNsNHZZL3VJSlFIWW9lTjgrV1FRNmR3SlBTMWlKd2srejJGUzJweWU2cmMwdGJUM0I4MUxmaDJTN2hoZlVtckZ5THEwRW9taUliNTMrWUtWZTc1TE1kQXdEa0pzQ2MvMFNDc1RzeFUrWVdtL0tldWZLK1dqY3NGN1paRnpiaFRFajNwbjV5eFV0RDVWV0Rzc3VlQ3RpYy9DMk1kZkk1N3pJOXIyUUh1TlNmTDI4SnlsejVkazdFbklSUDB2dFh3eHZPMkRyTXZhcnhHSkVxNVhYTEwrTEY5Unh3ZWxJZGhOeDBiVEh0Sm9SUFJLVVRpbnlsWklFNEU5WG5hVVRRRGdveEIyTUFwQW5Ta05LNUo3dTRTdkJ0bk8vc21lLzN0MDBBdWJKL01IZlIrazhaRWNGeWdNQUJOQ1FmclEyRkl3RHRUc0IraDhjZzhNQkNJekRvU1lIQUpiQnR3YkUzWHNjNjkyL05PRFVyallsR2tnN0Y5SkFrVTdYSUtCWVc0TUQzcDdkejlITU1yc0NBckFyNzBJK2ZvYWMzVmVROExYNVJJSjJSajNNR3RWcllDVkcwdEE2S05Xd29kcmVPcFZhL25qWFU2eUhXSnhadXliSjZ1NmdVNGQ0dzE3YXpFSk1vVjhyNHdEK3lrcmtvRVo5MUZacTVITHg5aVhvQXc4K0hEQUlNMnBxV1hEd3pvZlhQTndic2cyZlIrOWs2eUtGZ0xzSEprWDhRcGZtalZjZFltRlNnTnhlcjJPWllnb0VEWktCOVgxbXNtUktFbmxySURRTlFQbEFVRFl1bFNmR1dNY3hlSWVmZXFNSTZ2QkMxYXh3NDk1dkliZndCV0h3eFZVdlVJeVdqdFR3VzFUZytjWlREYjE5amFycCtmVlZFZ3A1Zlg3czQwSzhOam5xcmpuMHRZMjFGZE1iN1lvcGlVMXhWV0tWUHlheHlLY2s1bFJOaUcyRWJSdmdVaWtvVGc5MVNYU2diQkpjYlMwd2E2UUJwaVJxbVUxSXBhb2tLaTVXTVpHTmlycEdTdUdVUkNaUXBUV3FoSytLZWFxSXF3bzU4UUthUDVYaDBkRldrYWx4Y0Z2WS9QVzNRcnI2dzlkYzEzYWxKbTI3cml2dDJsd1ZoVjVGSWxwa3Bhb0JFVlo1WVZheEVGWGFCTmEvdHBqZnhkWmV6dXR3K0RjK0lQL0ovNHl5NE56Z3JnYkl3WDBFR2JWQ1phV3dsclNTY2o2Ty9FMCtJQkZoMGQwaSs0NXYzN2RtTlpYSzlUWHdHdjhNZlBiZXRDeDZYTCtBcENsRFcvSGpOaUsrN3ZycTFTczQyMTI4YmJHL012aU1jNUdvNUpjM0ttZGRaMjhvN0VVN1ZyQ0dCUFo0TnRMODkvdGxYRjBiSVltTkl3QkJBUT09KSBmb3JtYXQoXFxcIndvZmYyXFxcIik7dW5pY29kZS1yYW5nZTp1KzAwPz8sdSswMTMxLHUrMDE1Mi0wMTUzLHUrMDJiYi0wMmJjLHUrMDJjNix1KzAyZGEsdSswMmRjLHUrMjAwMC0yMDZmLHUrMjA3NCx1KzIwYWMsdSsyMTIyLHUrMjE5MSx1KzIxOTMsdSsyMjEyLHUrMjIxNSx1K2ZlZmYsdStmZmZkfUBmb250LWZhY2V7Zm9udC1kaXNwbGF5OnN3YXA7Zm9udC1mYW1pbHk6UXVpY2tzYW5kO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFESTBBQkFBQUFBQWRYQUFBREhUQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbHdibkZZY2h6QUdZRDlUVkVGVUhBQ0ZBQkVJQ29HcUlJR0dWZ3VFS0FBQk5nSWtBNGhNQkNBRmhVSUhJQXdIRzJwZ1JRZGkyRGdBYVBBWkZrV3djUUFGbSs4VFJka21uVWoyL3lsQm16R2hkZWhiWlNGMFI3dW83aGtaQ1pHVDZobnBvYlpUV3h5NmNPRGgwRWcvOW8wRlIrSEE4czNKMWIzdHc1OVhvemdjQ053alptdHR3Q1Z4WDRoTG9wRWtUYVJYdDBaSVkySXQ0amY5MlhzQ3ZNUkxVd2oyUW8wSWtoY3hLa1lxNWlRdGNmbmltcnBaMGpxSHRHbmdKYmwvdERxemlpcWRxd0F6b1EwVEx4ODZNenBYNXRJNVQvenY5Njk3NXI0QW9vc1JCREpmQmJta1dnc0l0b3FOYkcyWEo5Q2tlb2JIYmYzekJCbW9HQTFJNWFneEdPMUdUYW9ORUZUTTY3SXVvbjlGWHZ6ZitpdWl3UUVLL1cvYWhtaWJ6K1ZkRWJWVlI0WU4rUGQvamN6Q1RPN0xud1dnSXFGbDVRQWwyMVlCMnA1S0pGbEw2SmY3WmVCemZ1NGNGSjNxK0FPQzhRVjY2em9iV3dZaFd3RC9WNXNtdkVYb3pFbUVUV3Z0S0cyVFBHM2hXY3BRbTluUU92UjhKRklWZ1pCZDJtYkZjK0kxZllYdndOUWtaaXZxeVAwZTkzODZ5MWJhOWQzekJxR0xxd0FYM1hwemJUSDYrdGJYekdna0EydUpmUXllbGZXZUpTdmdDMEpGVUYxYXhOZFRVMkhUcFNqN2xKbC9uZW1xNys5dlNNay82SmFkR3NzcXJnR2VldG5hTlZQTDR6K2Q3cXgvc2d4bkYyVDVlZ0hTVVd5WDdBRERWTUt4b3h6MEJjaHVYeGkyQXNDYXRUUHl2Z09PTlRPYnJPU2NjR3VDUWx6aEViS0IvdnJ0ejFpckg4aHNabmE3OW5Jbmh5MHlSRUxDSnlMZ1dmODYvM0FnVERBQUFMcGpORWczSk5OUVpMaHNaTG95cEZ3MXBrNGRjdGhoNUtpanlBa25FTUlCUXArdUovaWxraGlwdUNQSGVnK0c5bHBGb1EvYSt4T0tjNkhGQXhCMnpycDNvekFYYWlCdXhWTThWbUNrV21WN3R0ODNVcWw2aTZ4d3lhc3dDcFY5K2N6VTVPZmpyTXJIL0IxYmRzU1pLN21TVy9hL3RDbXZLb0pFaWhZalZpS1BQcnltS1ZEa1AvOXJNTU1zY3kydzBGTExyTFBSRG50ZGN4MHpLek0vRTZpQXBDajZML2svYUtBM0EyOE95VnhhQzRPbFQ1YWR1UE1QV2ZaQjB2QmtSdG5jWUFHZGhTdVdibG8yNTFyVDllQ09DS0xnZmJZR2txQko2VlF5YTRLVEdJSFVnNWZocVJTWUVqTUhSeElISStsSjNGVHp0TjBwV2g3RERERlBwdG9wdU40NEovQUlrZzFTZU9wY2k5aFAwUlRRRWlXT3d6eE4wMFpIVStVcFMxR0Y4QllQRUQzQUJMRjFucUxGZkF0U0lkczR0WlFyRUpDejlUS3RaMlRNVVZoYXhIT0xXM2lZU3QwcG9FY1lnb1N4NDdWRHFjeWhrZ2tGUFlIZHZNU3g5VjkrdDc2TkxacURCMm05WVlobXRtdjR6MGw3MWFEWC9oY3pPd1F1eHE2azFsVUM3bm1udEcvUDNTenpLR1EvZndSVUQvY09NUWlESXBUZ2p4dnZiL1Bid0U5c2xBNmlqTElUeGJrR2xwMm1YaGZVMU81QS95SGVhYlJXSXpJZFdqV1oyVzA5OFMzTkpteElVeEQwSlMySVFxaDcvRExPVkZVWTlJLzA3MWRxSkZ5NGdOOVNOeVBzQXFrbEpHWFBhZmVNK3hiRjVxSVljL0lBQnhtbG00QmNCK29QT1J6MTlDTTJvdWgyb0d0RU5OMkFKRnJDVnpPNE5vRDNleFdTRUtHNHNqTUR0T1ZKU2dZTFYzb1NhTFllZTZPckU1OUpXdEk3WHE2Rk1OQjZwQmFEem1TRzd4OVAvbmNvQVFDMFlPNjVBVi84VnFSNXBDN08wS0pSU1RpWE1IZWFqenZxOGZENlRFYXRkU2VFZEN5SnlPUDdIUzBITnNjam40RVVIN0lWdjVCOU5jSHQ2UStReHI1TmdKbEVZcEJibDdpV0ZUZzJTdnN0TkxwazF3ZDBFT0IvSEtPUDUxb0FrS0hiazBjeGdhVVNtRWR6dnZSRVhmWG5VRXF4cUdnZHgvMXBVQm42eVNVYmlMOGJrSWxDcE9DMkhGL1kweDVxcHhUTDZMbWxVUGJGT0pNallRRGVZSkljWUFodEtWcWZyRktJbmdtak9JNWV4K1diU1VBckNHTndoSURpYUtQUVYxMmV6YWRBMDRDSEc4NUxZbWgyZ2lNRW9oZ3VGQ0U3V3QyUm5wWk9QMExBbXpqSk5KTWwxRnFRMndmYlVCSmI4K2dkZmlTR1NXMWdDMXRaMHo3UVZRZGRvVFN5c2pTZWJ6b2xmeW9oU3RnZ0JlZUxDSE9EZk15bzJCT1M4YTEyaGlkcjNZVWhSRFZYVEFJeEU2eHdtczBERWcxTVJGSEFHdEdaSkxFNkN0QlpsNUoyQTd1bFRQMjBNalFYdStGR2NSaGpDb1ZYdG93Wml0aGVBaWdibG5PWklSZ0RDZ1lLZWpqQlFvUTZoUmgyTElhckdXQjd6K1lpdEtBdXFFTUFsOVFESWdIYzlSc1lpVXpBTmdNc1pHTExvVWF4YWtrVnJmRG96SzIxMFpiSzA0WnBpNkNFQlZvc01PQUFVVmdRaXdWMkhNakJEdUtVZ0pPSWd5WGhFTW5zVUNsU2FhU3h3NlRyaU9tTVJWMjRXU0cvQXIxb2I4TE45TUZhZmJGb3FOcmNjQ055NGtpanFJd0JKbE53QkM4bVdWZ2xHK3RNWit2NTVPTVY0RWlGMktDSWJWU3NsRm9aTnBtRnc4MlhXc3dvQzU2S0QrcVVyb0l6S21udTRHQVplSlovRUFCTTRRV1FScEZxaG9WWUNRZlBkcE9oSEdhV3V4NGV1RmlIbnU0MDBwbzFON0NYVk1uZktqUjJZZEZpc2NXcUZxdUJkTnZBYTlkeTh0RVRQKzcxM0x3Y0RQeHZEZDBhdys5bmV5ZmdkL1kzOENFTDVzSmlXQW5yKzMzL3daS2NRbndLanJYaU1BQnBEdUNvYVVpa0dJU2hDQUVGeUVFVjVKZWxGY0hCcDlMbmUvZS9hN2JNRXc4S3BQNlpaVm1WUjhTNW9iQW1WWkpXT001eTBqOEJBQlFZUVRVbVF5YVpHRVQxeDlIRENVa01HMk0ySEVPaHVYNUhqVHVCcFNwQUt3aVhPbXNxQnFEQVh6UVVJd1orZk9CSHZnWmhZaFBHMy9qVnlJdkpPRGRCSUMwaks1c0tuTjc2cVV4c0k1Ump0QXBpdndjbWVBUUs5RllLR3NFU3RDUVFvZzc2RzRaZW1xVEpUQVJXMUQ4eUJWSVFCVk1JaGFadS9WSDdoU09CUkZLUm1qUWtTYmtnUUhvaXJZemhLRlhYN0xJSm9MQzVhYW5pMHhnV0xnUmdUZ2xrck9hMVdNSnduUTlYemxjZm1BRHNoUTRIOUVvZW55NVNvckhyV2c5dHMwcEk3di8zc0Vld0FhenJ1QytHQ1BDZnhya1Q5Q1lBOUM5YkE1QnhTS0szZHgwQVlJL2V5aXFtdEJ1QW8wdGNOdWJyODB3bDQrbTRNUGo5bUthV1AvRkoxdGx0UGRVek80Ry9oTDlXanBUTnNsVnVJeWZJNlhKWHVWaWVFd3F0NGRibWZqOEFDQ0p6U2ZkbjRwTW80M0tza1hXeXNRVnBqRDlTd20wRjlBUEF2d09BTngydXZjYjJDOXVBQzkrRUM4OTR6enFmR2FQN0tPYmhybk03ejIwQkFZQkVRSDhuZ043SzkzWjFldVZ6TlBxbjdUUEhJdk1jZGRWMWk2MnozbjlPbVdXVCtaYWFhWWtMempsdmdXdUloaVJRc0dhMG1vdGdZR1JpWmhFbFdxdzRkZzVPaVpJa1M1Rm1qZit0OVFBSG9rSjZiLzNnYmpMMTFrZGZPYlEzZ0JoNjZtdTlzdjYzVHVkVG9GQ1JZbVZXdVdlMVMvYWI2N0RqampqaHZwc1JjVXVOTFM3YjdIYlV1T3VpMy8wUkRsZmMwQkFldjZtMTFULys5cStGQkF4SGhTZFNDeEF1Uktnd2tWclEwUXNpYTgycXBiWmFPYU9OQkM3eEZLbGlUTk5lQnJlTzJ1bWdrNjU2NmE2SG5vWVlZS0JCUEVhYllLeHhKaG52cklueTVjaVZwOFJVcFd3bVIwMkVqVGJZYVpjZENBMi9FQUJvRFFCc1A5QnlRTDhGTVA4QThKOEROd2NBQURaMkZieUVoT01VTENXcW9waElpRkZHUDYvSlNiYm5uSmdVeFYxRHpMUUFoQ0pJdUViQm8zZ3lhU1VKUlNOZEVMSFNIdElNM0hIR3NTTnhmZXdFbmNmcjZjQ2dNV2w3amFhSjAwZXhRdFFSOWlpRzRDVXc4Z1NpSm5ud1NiMnJzQWlwUkVsbnhDWU1zNmNTeUkrZTJSeDZFcWIrQ3JHRUhtT29OQU9GcEpTeU5sQVRoSFROUG9COUhRT3J4NGo1WGt6T2c0UU9DV21jUGpSeFRDM1U4WVBvdVVVN1g3ek12cmtpV283ZEpzWm5RUUFFN25uMS90NWZaMlJFUW1vMHdlaXV2SmtMbGcrd1JPa3M1eFM4TThXTGxUb0V4S1JKdU41Wmx1YzlWeG1HcDNYb2hTRlpnNjAyaDBQcGZRamdISExkVTlkWUdaR1VqRjh4R1BhZnBDaU5CcTlWNmkwNlQwNFlZcDRvSzE0b2MzZWxyQ2lWRVlEYy9qL3lRU25QT3RhSm56SEJhYWhjQTBDZkFDcThTNzVadEFrMHBUbktOQXV1TVFXUWJGaXZ0blBVeG5NTFFPdTJmRW1OYjFacTU1SU1jNVFadG1wOFZ5bFIrRkJZb3lsWHBYN1ZCREFtZG1JdEhWMkZSd3hxM2Y0ekpveDR0M0taZnBzank4dS9WV2JVZzdaMVI5TWdwYmpKNHRtNFdBRE1RazQ1d0RTa1VSZ3R5RW13Mk1LUlRXREZaZE4vRkdhUmZaSGJhN09MWU8vdVQ0aUhCNHFNY3F0SDdLVnYwYnF3T1pGL3RlWStEUTRvSFVRWWhRNE9WUW9iVFdOMVM3REI4UFhjK3p1eDZPUTN4TzFGZG1FcUEvdnlpSzN0dWFIU1JhVzQwT1kwOFpWQVBUV01Yd0s0WkVPeEJoQzhmVHdhc0doeEtTdDd5UWxCb1Q1MG9yeCtrTnFvbUcrcUlNMTRUeVhWaFNJRDEwdUVJMkNjdUZPcTU0Q2NRdk56eC9wY2Y4R29kTlkvUzN4bWFWK3pKWnN3NzlpbGU5Ri9VOHJoUFZDNG1RbGNNRHJib0RZUzZDTmI0QUt3eHArUkVGVlMxVEk2VU1adzR3WVdRTlBRVzV0TlRuRlBkTmd3MEZNK2RxZ0hnODI2SjhzaVZpM3VuUTRUbHNpOWdiN0c0NW1XTG5kL0R6Ky9SbmE4UkxFZTU5bXFwcjdTaG9xdFZ3U0l2Zm1HZFYydjh5cHFqVTd2NWo2bnJQMTExcGdzaUx4TmplMVdIQjhiTWpwV0o4MWR0UzJwYW53VGd3bk4yMzNXcXc0YkRKU1pHbEJKVFNEbEhlTVlaWFp0TzlmdWxXTS9lMEROM1p6TkZiemYvZHMydVhJTEtneGRrd045V0VUWnU3bHM1cmt3d1JLd3lWdVYyRk0yZWFsZkdWYWgzTFUwcjUxdFdmTTVXRkhDSi9XTVlZVWpoV3krY0VvOGV5V0JNWEV6V0NWTGt5YllqajF2clZKZG5PUlhleHNyZ1VETHFiYWgyb2lEODU3RVNHTGF2dGtUTEpSZm1OV0U4ZWFHMjkwV201SXNYaTVUaDdXd2xPOGMzTFNuM2V1aTdXUjVIOHhEWTEyTENiQ3lFeFYrNng0ZjN0UXdVREdyM2h0bE9mQUc2MzE4eGtyem1zamJxd1l0RVZTVzh2UjlLTGVoWjdvSjNva2E1aldMVm45cFdxY3JtRDJWdkdPYUo4ZW4rS2lPZFVia1BYSlFmVzV4WmI3VzJSZUR0T0pUYTBOYk56d3RSSlBBWjlSdHFTYXgwcUdsTGs5Mmd2MURYNU9VUSsrM1k2dTBVSzNQUHlEUmM4ZUlsbWtTY0VacDB3UzJ3NndjSzMrS3FuSjM0eWVOYWJ2RjUvUnlEUjBqNzhIdzg1SG16R1ZPUzBXSWc5SkFlbGdPNDl3Tmt0STdoQTBXOWt3SnVqOUNFbDJHYUJMNXFrSlhKbWdzc1M2YWdOVnY3b29HaUFneGFsKzNxd1RYZlRpbHJDbWxWbG84WTBMTTJEL0FOaGZ1aVNKck5YVnNCeDBXdFBia1Zrdk5hSGxrd2dBMWNPUXRJeXlFVWcwT0hIbHpkOTFRVzNybDNXMC9zM2R3bmZZSzBnQ09XendQdElDSFZuTlg3ZUJnUm5SY0dRU3JqaXVjMXdud3FXVWwxNnZSWjlWaFhTZU1JUzBrZkpDNzI4a1BrL3IyREVkVFBJOTBHS0FKbXR1UmcwcGpIYUU1Uy9sbXk3SFFDWTNnQnFrYmJrcERpdDdLTVBwOUxrUVFTWi9QNUlxRHdSQ2VQUno3ZDM2ME9nYUZUanNlTjUvRE84bWE0bEN4bDUxV2NwTzhUbnlkdUZsbWZoZnpWbXQ2ZWNoOExlbThuK2dRS0tLaGd3MkVYK3AvRGVzaTlHQVJWZ0s5a1RsT0xUa1FJYXJYTWJKWnRhRUQwNmI1YmRJNGFKK0VUWCtBaVE1SmR0dWNRMVhhRHp2REZxMXNMYUpjM3R4S1EzdFFMZXlVcXlLV1ZRM0YvcTBkRmo4WUQ4azZ5ZGRWRmE1K1ZzK0RTRzZ1Qy9uTjljZW51RU5xbGpKLzRjb3QvbjdmK3BpWWVZVXBvK0ZaT2xGR3hSdlYxV3k0VkVQR0tMSnBYN0FCM3VDdExGMmJtV2FJQmlORjZoQjkyM0cvVDJtdWR0SUUxZno2NlRVdzNBYnJRcmFsd0VGaE8zWkxMWkpHeld6d3p3TGpEcyt6OG9aazg0Z093b0hVQUhBZ0x3OFhoMmFGTXI2NmpzNVNveGt0SllCZVRyUmpYNXpuQmtkbUk5TSsvMWhyY1lqWXRkWnJnYnJWVFI2YzA2bzNtdWFDa05aY2pyZlBzWGxpcGFqTkx3YXVmTDVFVlNLRUFIZ3pvN0VNeFlKVzAvb2lKeHVOdGtvMFdtVS9PNDROZFVXekl1c05rZFpmamRmU1ZvMng4T0RISDZMelRIdXoycHdPVC9PY0JFakoxUlVqUjhiODc1TklFQkJ1bTNCdHQ2ekVvZGIxaE1kb01ockdHcVhVNDJCMG03M2t5THVSb2E1OFJ4bkdpS3htSUh3dGdOU3V2a0FxdXZSMEtOSnd2MzRZZTRZOStwdlczNUUwdHNGRjFndXVqVExVMzVmcFU4RHdsQWZQbkc3SDAzelc4WDBkSm5tdkp6eVk0NXg4bGhENmcySkFURVI1bXgvckV0M21OenEzT2thVXdKdklmR3UrZnE1WGZCT0hqYWZ2UUQ2SW93aGhiOW5RYXhUNkpEZlNiOFZreHJtVlZucXU1clhJNVJxN1JIeU1KUmlOSm5PSHQ4a212YmdnellqZ25UbjRkeWV4Y1N6TzN2UXlEb0o5bFdJanVJc1JLUjhmYkFBWG16dnNsdk11YmJvdlRhbWM3SzJiUlVmMkgweVJqTHRKcWVUdXlBamU4WVFjSkpBMWRjZHR6dVZDZTAvRXJoWU5Jd3UwWU96RXRlYitTbE1LT1VRc0U5dXVadXZ1UVhXYlhwWGxDYnV2SkFSWFB5QW16RkdoSSt1T0dNQkg3RFBPMG9EVXcxTTc4QU4zaEo2RUIrcW8wWVJoSTU4YkJYQ0lVTElteWdoV1ZzYXlzSVNRQjU2aHFCMkhJcFh6T3pPOUVsRnNkeHVCT1gwaVBoU3hOUDllVmh5U1NJcDJFelhrYWJSN2ZmUXhrZWlURDRMMEZZQ0dHaU56TURkSWpYaGhkelhQemVRNnNIVXdEeWdkVXN3eCt1bUtpcTQ5bzVRcnk0RUpQY2h2WDMybUoxRVpQdkxySjZwY2FWdW1DM3BRcVh6ajJldlg0b3BVN3ZOdTJhK09WK2VyeHZJajJVYmw2QTNuUnNreGtXdzlmTkFlalZ3TUlFNVJIRVNvNXhyMXhOS3M3Y2NOOE53MzFNZi85dFJBS05ETEhEN2NMNjVtbWVwYW9oa25QZUxZbmNiK1pHQVZzM1FtZXM1eUJHdjR4YkpSN1J1V2pLSVd3UTZsZkN0RnRIQWUwV0NvbzFEQytTQjZKc2RucEVtUGdCMmdTUTZKVWk4VkZvSUJoVjNraENoZjAyWXhqOUp2ZWcvVEtxVHdnM2VIUE81c1ZrV0RZdkdDU2FCdXFJN25hQTlvTkI4NzJOZ291SVFia0VySGI4OEoyZE5qUzZKcERyVGZWN3JoOFdyeGtyOGNCM1poMTJLbk1tS3FIbzFwT2VuaHRGNDZhekU5TGE4N3VjUnYzSlIyeXlRN21JTmxmZG5Ham5VSmV0L0YxdWplK3FPNlN3NnZZU3A2RFJzaUdnSjVCY3hYVm8zUjVMVitZVjF1dXpodmlYRCthYjFaR05EeDJQeDRucmFtYWNidHFIS29jeXYzMGV6QjI4R3JralhlMCt4QWtCd2FUTXpMZFltRk85Ty9nMkdJZUhBU1ZOclR6NFV4ckk4VHhLampWSnFydDFYcmRJN0RNKzNEZStDUTFmVzUvVjNUWEhkZnhvckV3TVBUYnhyc1JhWXBubEtITXh4WkhzK0pjZk1iN1hHcFBCV21MZnVDUS9mU3pldjJQUmF1Q3o2QWxsL0I0RUNFdnRGbzlCckdFZFpwbklPSStMZ2duNUJicU93U2JqaS8xaHFCYTM0bjlmSjlBRDNVOGlidWFtR0dkM1cxTHVSbE5vaHpuTGt1aVBlRDFqM0NERHA1VFZOR0ErRmhkWG9hWUV5TVQwcVR4MlJud3BzOEl0QjlmSEozeWE1RmVnQ2xmUDByUmxsOWQ3Q1ozMzNqL2hnM0cyTXRhdk0xZkJVTkJyTjFUZUZXRjBvYzdpd0NvUXZLbWVTcGhCUmVIdHl3MHlpdzkwbjZ4cGdDWXlrbW9OS0dobWgwSVZaWThLQmtPMFcxcHFZSWk5TWlUVkc5NEoyamgrY3ZPUzBSc2VRSzVnVUQ4RUFxUDJDYXI5SWpWaHRWM3N3UFZOelRCM3Z3WUNraVdCVTdyNzNONDJCQW42TjFHOWZsOU5YL0Q1QStKM2s5UjZOVVcvTnlicVRyVnN6dzV6Zk9EOE5vMW90WXZYMlNnWU5YMTBEYzVZb1B1SkxVajY2ZFR0Y09sL1BFYllaUGhyaTMrTysvRTkrTjlqYmVhUXJPUTVnSjE3eDBDSjJtRG9ZWW9OQmxUTldOSHV6eGEvRHVmanJ3dnJHMG9nK1lZYkZDYjBUQkQvM283aXR6TjdkelhHb2R6N2ZKMzZ4c0RPa3lPU0E0NE44ckhQdi8rVE1hREZwSm40MzROODVNL21jcStDS29pZ2h5d2Rqa2xWelM5OEhnNlFHQkdWK2tTYWExSzBseVI1VGtEY0ROL1lKVHBSL3pmYnpTa2s1ZXZGN1J1ZEZZS0pxbUloRWlSRWlyMDdGRUJOYXo0RUt6NzgwQk4zcUs5ck9iKzRZbzE4ejc1OG5ja2dTNk8rUGdMSFprK3ZYZXI3SWJ1OEJxdHJiczFmMzNteDUySGV5Wkp4M29pRzgwWHpkYkE1Uy8rRUo3THhFZnMyZFB6NFlnYXNlaHdSUmFMS0xUa1lnUUpYa1BSYkFoMWpxWG1TcmR6dmdtZkUrMlRaL2ZtNGp0eStkaisvZkc4MGlSMjZuLzY1MWorYk9kRWVWM2VaTDc0UVVpc0liUnIzU0pGNVRvbld4amZpSUdlZDN4YWN1WFlJL1hDOVh0aFlBWWtEVVkzdDFFZ1ROT1JrZ0U4UTRVRFNnVVFjT0hFQXVnUEo2Rjl2VVpRSjRuTGRRci8rOVYrR2dhNHZzUXhDRE5YNzU5NXlOWHBNL2ZXeEFucDl3K0M2ak5JbjI1VTVvc3FRR3JHSFhwQk80TmpiY3U2eTVmY3ZKb2RySHducFdhRlhXRFZHRnFYZjNaV3VOejdGOWV2dHJ5akc1aGFUb0hQN1h2eGJXemEyaUZnTmxYcHVLY0h5SzZ0SEw1SmtpeFMrMWp1dW51d2xxRDM3L1cwRjNRVGNkSUxVVzBHTmczRmMya3A2TktpNWxBVG1lbW9Ba0lUNXJaeFh6M2ZkbXArUU5tRzZSRnh4M0c2eWVYaW9wWmtWemZsZFlyVGZUWnp4WTlnbzIrZ1lYbVlJaFMzY2t0NkVFUGV6WTIzWkhoakcwd1B1SHQxenN6N1lzZEdlUHVaWWxlTU1Jc0thMG1iVEZydWxNR3kzc21KZVJDc3BmOFB1elE0SElScWRhSVhMaEU4NjdZZ1lCZG50WGtjMzZiVS9QNHcva3BaVDhVOUYwTTBCMGhvRm5vTmEwdWNXd3hGaTUwczdUMTV3TjB3cVRaZkI3ckxWOHltaGJxYmNPRi9qYWRhdlVmTjJzaFowR1ExcGI0TjQya2RHbjBjVlREOTEvV015Y241ZXFJUlQvMStkRmtiMHZUMWdPSnVWdnJDSWYyMlV1S3BwOTM2U0ZXMHFsc3FGdW1KUFdPVEN6d1U3NFhzS0ErV0J4bnFETlZrQWZBcUkzaldxc2h5bjlITWE5OVN2WkJtR3cvS2NCMWVqUXlvUEZZNXN1L09FUEQ3MFR5V29RL2lmVlIzbDhxVFNBdXZUVVg0RjRTZVkwYU5GelFBaVZRRmczWkQ3Ry8zMEVLTi9wY0VzQUJTakJYWTlkaTc0cmxYcEpjNGRWNDhqYUlCckF5NHd6THdJRFZadSszV2dmc3UwTnBPY1l3dzN2WEhaUWNyUkMzTnRRc0xQR21FTVgxQThzSDMwWVp1Z0JZdWp4Q0x3N2UrNU5EVGRkUThlYkdCK1lnNWFYMEtwcXdJdXBTTHIzeUQ1Sm5GeFR2ZmFucDZPRzArMStkbUYzNklnR3N3OUJCY1A1M25mSFA3Tm4zUVpYcHN4TStLcHhETm4xK0FxV0I0a2RqYmlhWXZ2UHFQN1dRNEsvRGpEVVo3MTMvRGJGN0JHS1NLSjA4WCtMMVRSUnl4K1ZXNzJvT3ZBMTNBUXVyWHUwNDl0M045RktZRTRXM2M2RTk2YTAxeVlkdmk3NytEQlJYdzltUkMvN0xQR0psa0ErN1I3MjIxY0dRZmNXb3k2VUtjcmZ4QXZBZkJ5RDZjTmFjdGVxSENhZStwQ2xtTEd0R0JnbUNTUDdqQkhSMXRkMFg5NHUzNjFiRCtZbDJnWXM5OXRrb0ExdWM4NjRQZkJUaWNhcHFldmhxWEJmZTJiUGxpK1AxSGpNWkZhdTRCR3VWTUdsMjZJYUtEbEo0ejY5WFI5R3h4WEhzNTBXYkxiaThBMThSVGVFcmg1MVdaWlQxaFRURmdweDhXajdTUGlxVDZzazJPS0g4NXI0QzY0VXNES3pxbkJHWGZVVW9hRjg5Nm5VSm5rU3YrbUh2UklpS01CaFVRT256ekd2SDBxOSthc21ZOWFwcVpxd1djOGFHRE9NRU1sZ2VRcUJTaDBVYVFEMjJJN3NlZlRhcmtGZ0xObk9wQTBlSCtxd2Q2Zy9vZFgrVnlXdzBCMWExbS95TFBjNVZRWjl6MVpKTzhMWGI0WW9yYmQxL1dMbWU3VUVCN0JyMTJGY0ZnL1pWbzI2WElzQTlKdGlCS2RhemxveEZQMFFRd09KcFFVb0VqZ3c5M1ZzUTNwdDByQ0tOb2g2bkp5WFZHY093d2ZNYWRjWFErVVJ2SC81MzUrMDBlWTRFZzUvWkwrd2ZVeTFwR0pVa25aT2puYmpFbUhFWWh1d1kwcCt4bTR4Wk0xSzAydzFEV2NjOGJzaW5NdG1pWldOeXVDQlovdG5oSFlqei9nWk9xTHVzZ3dCelFWZHRQRlFYZVlEdkhsUnhjd3RzUjJJMWpSOVNLaWR2T2IycGs3RDAva2lLdU9YeDNwbUR3NUZBSFJibVhWbForYWxTeGUrNEhTdWRpeGZhL1BKWVk2RWVtbzBrdEpyNjhoNTJZY0dLdnNIOUQ3eDlGVjdMOVM3d2RLd0tCdVhtQlc3ZmJNdFowQklSekZsUGNiMW1ZOG50cHNYMllnQXVzMGNNMHF4UkxQV3QxMUt4dmZjanFyZ0M5YXJFM204SjdmZUpSY1FWSkFlczg0cjZ1L21nYlVucWR6L2cwQzJ1Sm9WN2trOS9LV0NWTG93VzVPUlM3bHZaMmovNnFDT2tldytmNTJJMnJ5cWp4NCtxMjUvLzF5VDl0RG8vbXkrU2xabHo5bHI4T2RkanVDSEdsZHJEQm5FR0V3bkpYQlhtZEo3WHErSkt0QlBtUFJlcGV3bVc5NFJPR1ZFWTlLNDgrcjhpRWhBem5UeGdWR2RFOU9LMEVYblNDRmR4dkY4YTRLVEMxTnk4WnEyNzdCTkxpRmNDSE1ENUhlaFl0Y2hEK2haNzhGV0JvQkFOK2toTHlteXlBSUdXY2xhN0xXODFsZ2ljQ1FkdGRpYThNUEFIZGtIeUhxRzNwSXVodWV2TS9iaXhnUHlzWmU0UndyNHM0TGN2SDNXNUJFOGdWLzZ3MStSd2VqTXpDUitKdjgvRzlFVzhReitRd2VJeFpLQ2pBK25YNGM2dG45WWFmVU5mbDhVK2MxV01kd3ZYQThkYTZaM1JSdURzWGFnQVZ2VDBaeDlRNnBrL3FzQ0tTQXo4MXpYdGZ0RmZFRE5Udy9uTWJoNlFXUlpUWTRLbjUvT0ZYZmZTQWovNzZiQkFkaVlvUkZwN2MyTXJ3WEJUWnQ1cEQxc20yR0lWY0Vmd3RwMjBhZGYyaVpVWEkzd0RXbENBVlpJNVZMZjY2bU13R1lBeHpDdmxpR28rN3ZpTDE5WWo0SUt6MDdab3NNUFcvUHFmMC9ySXpwK21QL083Snh4SDBMelRaOHpHdEdzTzNFSVQ1eDZWVHJYVytMOWxnZTlVTUxQNVpiZkN2T1lsR25PaWVCcEVuUlNCeE4rL2VCTmYwamJ0d0VFNkJhb3pWeFY0cVdPTFE3KzZpa2ZkRytCS3d1eEN5SStyMmIrZzJOTXRrWDdSN2NmVkRLV2kvZ0NFa0QxYzFLeThzTFhodmdlT1B2aDRxSlo2RThHcjdOVGJFRlBjMnZEc1cyVzhtbGp0RnA2Y0NaV29zcnlSSEszUTlEdlI4OG0yOU5rVm5YdXJpUUlPaVNzYURwK3YyMU00ZmxVY0x6WWV2QkFDOXIrTVZxTnZvRFJDZ1ZGamN5Z05YSzdDeFlGamIvbG8wN1Z2WlF0bDBtem4vT3R2K2RKMTFkdHJ3SGsxVUE2dGRDd2VzM2swblUyTFN4c3g3Tk1TUFpldHNtYU11a0pIb1BYZENSOUg2b3pveEdtcjJXWXlKWkxPWkZBZGd3Mms5QkN6M1g2OTNPTHlHVHN5M3ErZWVKSnNlOTJ5YUlnNjcxL2Y4ZWduNFBBTXhRSzJYdzBMdmZkSjlCN2MrUWRTVFBTdmxDclo0TGgvMmhxbTd0YmFYRGJ6QWxodWRTRW83QWV1V21xcHp5MVhLVjF5MVZCcnBLUkxxVlM1bFpxZU45cTlCc1RtTlVvUU1XUk5JSUdHSTBYa3lzRVNjZ1ZabzdIaFlyQTBhQWxTb3dvOEZWZnV5K1hGbW9yaE9FRW9uOHU1eHNGNVlJdzVjaW9ub01JRmgyMVhSMHNIaXV1bUR0SmZ3K25uNWhTVkZXTCtWOVJVM0ZZeUlGSnZTR3cycE5VeWlnWDhLdWNEbWphT08zQnZuMDZYc1FoYmZPYVVkUGJudVNEV21qSWtrNTJUWVYxYU5JM2hsa2hXcktFWlBpd0RHcnlQY1BiNy9JeGx6N2FwSGtUaC9ZV3ZmbXNzRjZTNGtoYnZEM3FKa1FVV1hCWG5maUNVVWtpSmpRSmw4TFh0RThxZEk2akZiZEYySjdtdTI3eVhsNDN6OTdDOWcxU04yV3dFbytERGtPYlBlbHBFSFhrZDBtM0ROSWt1alZOS05GOVRJZXpmMXF4cHBkQ0ltaGY4TnduYXJ2NFAvVk9NTS8zd1FjdzY0RElKdTNCbmp4RHdJRFVqTjNuYU1tb2plem02UEREY0Z4K09sOE81UXV3MThHUW00QzhhNWgvUlN6NlBjRlc2Z0JURjJUR1Z4VlFxT25HWklhS0dZeWFkT0JVd1dod3BGTTRZMU1wWUFnSFhxL0J0ZU8rYUtiY0dJVVdnTUtLeU5TUjZOaDl1dWdZczdDQ3FIQ3owd3FncDNZZlliSG5FbEVaaGdXZkpQNTQzZmQrT1M0MUlNcXN6R2pNNkpHbVV2dmc5dEh5RWd2Q0laVEszV0VIQVJDTG1jaWRpUjhUQjNpUUJxejFCcVJxV0ovREFSRThTMUovVTRJeEwwRVdCZ2I2SStRTHg1eGVQeHJkVjVTZnJaK0YyR0Vqc1VaWFZOSGdhRE1kTldrc1FOWi9IQUtjTkdtVTBudkVFQkkrek9tRTFpeHhYUG00bTFiQkpIVCtrVkhrd284cFhFQWthc1p3VFdDMkFGZlJWWXcwL1VZNHRMcTFZcUxTalp5dWFSNmo1d0piNEFtK3lUM0dXVlh1YzNZZ05VODNnYmJsYzhKS3NmVWpRMEw1ajNwVUZjWElHY29BVjBDN3crYjVxUmlKV3hCRXJrbjhadVhleVdBb1dmZW1sQXhkcHZMZHcvcmhxWGJ2YXNFWFk4c0MxaGZ5S2NwQjhiN2xieVAxWEFlNFdzY0x6eFVOYmQzWDIxTlkzUEVGendYdUx0dDVSZjVpS1BTV1FJanNJdnIvVnJZYncvT0M3Q0w4dk0vQlRISFo1NVlhSk1wRE90N1J0YXRwWk9kdzJuMTVEaCt0TGpTOEFmdVhqUFJ6ZXViOVFCelZ2ZHJZSmhRRVVIMm1rdjB5NDk4Qkd3bmZ2aWp0b0ZiVTNTZHEyWC9kMFMzdEx5elNMOTFOejgyT2dCUGdzYXUreWdUK3RPQWc1MUhDZlhkR2Z5bkdxRVJUdmE4QTJxUEw3UGEyTjNMcy9uWmRBSzk5eTZDazI1NjVETFczVXhMSlJZKzJ0OS94dXZyUFowdHBTV2I2dDByZlYwclNQMDlIV3VxNjFkYnkxVFF1aUVyeE1wSmZjcHJkREZUVVBWYk5GTnp0WWFqMWwrZFc4bjVwYlh1UTBxMXVhRDRNbm9GQ2kzOTBudWhqZjl5RFl2eHl5STNTYUYxMFh4MHJsSml3NjNhM2tVNnAxSzJkd2t2eXhXeHlyMWM4VE9rRk9YV0tLcWozYml2SUVYMkhHYmJwQVl1WERqcXBEMXNFK24xWnRuY1JKcm1tZ2NuaVZET3V3dlBXU0N1eXdubjlhWTdVdjAxRE42eERUdDFxbFE5ZTdoVXRiaE1LV3BjSkVCU0ZiOWVVWVhBSkg1bnEwa3ZzaERtMUZyV1czOG83QjI5Qmx6ODU5V3lQUEExK2Jqd2FwK1B4a2h0ZDFJS0l3OWZ6bHlrN1YyazVNbm11VlhzbXR0VU56ckgzeHR0WUg2SnFqT0tLMlErZW12MTc1UHFRMzhUKzltNlM3eWZVOHE4RCtCeGhUUmVIQ3ZqVG5Xa0FNOTFKWTJRa2I1QUdQUXFXSnFBNzZubHcrdy9lOU9ZQmlwaTRkMmt0SWVPUk92MUJGY1crYWdDaEEzZXNsRVhVR2JjSUdBUlRjNG5oVDExQlo2NlhYelRGTEZOeVpJVDVNTFcrcnlCbW9kVzJWckVYRFJNWnFSRC8ycXlNTDcyWGdRcEdFTGZOb3o3MGd2bzdCa0J6eFdwNmVoQVZhY25wZXRYa042eEpHZGdpSnlocEpoN2FDTUlnRE1jcFJUOHFpYUx2TDdHYU5VK1puNHVpbHJnYTNZb00raUtzSEhxajlHdTRuZ3JwRkhvV3J2bEZRUHNQY3B4bGpxT0xzdmRtbWpicmVtc0hyYTkrdVNzR0Qrb1Z1cGJzT2I3RnhaWVU2c3F4UmJkeDBuV094a2traXVzNHZudy9LMFdDSlI1dUk3NVhYVDMxNEJzKzlEVG5CeGJ5Um1ORzV3dzVCZ1dQVUpoblpzbDJXVzNONSszVXJkaVUwTGlxeElDOWZKaHVmTmwrV1RKcXUwTGNTa2t4WDR6RkFlNVJXUkxWY1BqNVRNMU5GUnRQNWJiZmtjL1liTk5VSWlMbnBUQkxUc3JzcGdDTVp4Mm5GYWtNdkp1Y29pandhVU1hS2VMN1FRdWVqNktPMjNKRmxRSXRVdWpZek8vU1l1RTA3ZmJ2SVJORzhNbmNwbzVkM2w1bEswaklqbWR1NDlZOWJYNm8yNllsWmM3UGZIZjkwdk1kbUhsd1pRVHlIRE5YMUdsNWsxajdjUDQvNU1ORXA0MFFKelRNM0dMaXYwSnJmQlI0dUFmZjBxQkJNVzBLVTRWbXEyT01xY0xNZFREZXZhUGlDbWJZNHdZeVZMMWdaTm5WUnNqNEhMcGFBdWVhbnE0TGNDcGxYcFJLaWt5bVU2WWFjNGV1K0VJbysxL041K3M5RndpOTBRUDJOcmdDS0dwVERMREtXTGFSVzZrYlBhbU4zRVptS1JJUVF5ZFVlYkVTMCtYR3FkcWhiZ01TbTR1SDloYjd3QWFxT0lWMkM0S1BVdm1JRUwxQVBmQTM0SzVsbWl4VjM2RzgwS0xzYlVvMUNudXJDeUJSRjdrY0ZTKzlFc1lYL3pRZmY4Qi9iZmRQa3l6c3BNSTRxanBuc1hyckFvNy8xcWRmblMwVE0zQWFTMlVUdlI4ZUxWdUxlanV3TGxIZGJ3blVXWFpGVm1veGhuYUxMampDYk5maVoyUUpKTGdpSzI4cU91a3lseXhaeWV1SlAzQy9wSWJRNlRGMnVoWGdhY0taV0Zidmd6M0d2d2g1Z2FHZHRJQ0haZEFQd1BhQ3pJdWphZTFmTWRPRjkyZDRRd1dIdk9YMkxLREpsajJpNk5qZm9ocXNnaEZ1dUc5aEtyYVhOMG9oVjBFT2tHYUxMTHpPTXZ1aFhFOHZVNWRib2NzWm9ETWxNSVROeStUV2kwSktJTDVEVSswL3BkMGYwUTRtNkNYV3A4TUhRSStWOW5obmN3U0RLTWNvUS9jaHpWNzliS2MrL3Z2ZzUvU0Z3Tzc5MDdQRDV1L2RVeXZldjlEMmpYMFpaZEFlU1JpL3ZmNnE4M1dPekp4aVlXaGpLSDlwNkRtS1VkdHczNWY0U3hxdGJIN29qU2NXSEZyblcrRDdsWW0xTmsrSG1heXJ3ZFBSQ3ZmWW04TXNsanhvZkVjMk11RFgzMncvTU0raWx1dnpyRFp3VGNlbHR1cDl1aHQwR2w0OGQrUW5IVzA1VXNqelhhL25uMmJOczgzVDlFSFpvdThudDQ4c0ZPUHMxNzg5M0NiWGIyc05MV1RHTmpwVTRBTU9UckxoV3k0NVBYcXVWUnF4T1ZRVFdTR05XaHlyOHlCNTQ4b0pXWUFQWlhjRGh6Y0tPOTMrOEIrTzVSOHhLcU41Y21veWtGQ28xcmhZRllLMm9oR2V6UnRRVmpHNnA4am5BT2xVcGorUHFiY1MvbmxJQ05XUTRDN0JFY1AxT2I5L1luYzZ0YTRJM0xuSklWa2I3Tm1IZFdLajJ3cjlaektUaTc1c1hLMU5EZTV4ZFk0b3B6OHJFL1FlbkgvY3NXWFlxRmRtYmNRalgyQWZpdHBCRUdwRzdmUEl1dmZDckt4VmF2OVlRWW1Xa2pnNDNxQUxUZkpkdHpLb1V4bnhFLzNmUk9tL1JqS2k3dXpBbk9hZ2dTRm5YbnBicklIQzJMTmVXb3ZGbDJwWnFyZ24vNUtMa3NqRWlJTU5pL0loRW8vUkZaWmcvYXhZREtTL1lKVXpyVTd0Z2g5dURtN2p0cENGSVdiODkyeDJJMnlxeU1TcmVicjlJcTJQV3NKMk1YcndyTlNJaDNRQTVBMi9aVUlLMDFmYnd2bVlFRjhxR3FwQmlMR1hxWFM4ZXV3WmlMSTdWOXFhUExoajIwVUpQOTJxVkY2VjR2VVFkWXMzOGw5QlZnU25jWU9HN1pWa3RpdHJmZnZ0QjJiN1FKK0tHbW5OZXZKVWpXZXZoaUJDdlVpR05QZHlHZUFYTHQwSjRmcENjMkdrRjk5WFRVa0c0Vi90cXBLWEg5ZW1wQnhWbnYydURYWHBmRThtc21tTldsT01ZMkYrd3lWRE1HU2RDWWVQbVltNlRvZE95Q3puVDVuRElORkhRSWlYNFluVTZvVjNxOVVnd25jeWxPR2FTWm8rWFNhUW1WanV6QmszR2FLUVhSeFp4dWcxSnZzLzB3MkQ0ZjF2eHlVUWVHQlo1dlRJRCs0ZGM4c2Q0VCszUXZsZkFYQithSTcrVXpjN3pGQStMT1p4ZjVLQzhRbTF2Zjh4SUFkQm9VemwxTktQK1JIZEY0ZmlwNWxjYW1uWTNkMVMxdjFiL3RXUElZaThSaEwyazVRNW5hVUdnOFRvYTEyaVRtRm1iVUEwVVRXaDBDVE9tUytwaWdIY2xwRGh4OEdhb3ZTV2pMWFFyMFZJRW9oL3oxS1VUdG4zWGVPZzc5REMrNUNTVTZScmRQZW1UWC8xc2lkdjZENWdWYVZac0pUUG5VenNsVjZ2RlV2WFZFdW5WSElsRWM3VlhacE5MYmJLdk1iQnNiNi9rczMrTG9lWFRWOUlRc2dNTjlsMGIyZ0pablBOcE9NN3V2WjR1V2JZZDU5UlRPVHczSkdYcG52cXFoYlgrRzBES1ZDdGdFbDFVTFJQZjNlcmdrTjlQRjY0RUVIV1pSdDNFMjYyMWZQU0hhait4U0wySGhsendkVDJ6cXZoL3daZHNDRWpObzRvdUlMZDdJY2UxYlJId2ZwVldCWmhqZlppWlRBdEZOVk1MZzZnV01oaHFtV2hLMFIzRXBvS3R4eXVXelMxcTVtcnBPd3E4ZVZ5M0MvRlJlUk1JSEtlWktFSStlWWl1b21sMkNQb01Galg2cThCbHYwY0UzVnVvUWs4SzV5ZU1wZE5ISUlrczN4aExDU1hsZkU4cXYzeCtqdzlRWXBoUzR6TEhOZjN6dHJFbU1KMDRHMDEyVXNQWDUrdHF1a1hiVjJoS2JVa1JUSTZjK0R4RGZsTWh4b3NDSWMvemdKaEhGVXRkanlsdldDa3B1TDQyZFdEZnBPbHVhcWxaMWhOQnROc0xmQkdScVVKbUlTdjlaNEZFZWt2Z2pXdHNiR3I4UWU1Mkk3aTlKZmdSWGdPUXZWN2JKTmF0K090dFkvUXd5a3VOd0g0akMxYjVaVXZacDcrdXEyRmt1cnM0bWdPaGRyVy9kOWpnVFE2N3BnS0RyOGhtL2s3bzlvN3M1MDZ5MkNlZVkzUHVPOEZtbmJ6dmJ0WVBMYTMvVy9yWkZKWjdHZ0lNMzY3WHdQWWpnTXByL0VNZzRYb0RtNUd1bDFnSHM3L0NJU2FiM3p1Z2swNE1hQTBJVkVVdnJtM3VwV0RSOERjS2hsdFFNRnlOZ2lFVEkvZ25lNjJrVGQ2YzJkYms1V0hEcng3WkpJc3FjS1l2U3VKUmxJYWlvQnRGd1Rzb0N2NlVvZ1RBZGNnSkxjZ0p6eUluUElLYzhLR1VvaTkwd2ZTYVJ1d0FvbytvcWJxUjJ1Y1JwZzQvY2ozQlRKajlLZVp4NEdmam1tQVg1VG1XWUNsVE1OeW16d1FseFdtRFI5VisvaU9jSlBaZm1CNkhsK0FHalkwbzR0UnQxdmNIdTRiRmFuMnl6K0FiUmpOYjhvMVNUamRHR3FOT3hYNFNJVFZweUNQWEk4eWhpVDNCQWlZZTN6SVYrS2hrNWlSQ1BtalQrM1NsZXArdUJ2bmc1REdMUWZFWEE4RUE5bmJyblhvQXNYd3hlNyt1SXRBSWZvMzY4VWczUW1CcSt3am9iZlF4K2dSOWlqNURuNk12d0pmZ1Bla3JVdndhcVNLK1ZkN0Q3K0QzekE4ZTJ2aDJJekQ5dGVueFZENkpDNDUxMnh0OGxqNUhmVDlQZnhwK29zNEh0QVZkd1l6S25LcStRc3p4ZXhvM3JHd0xjcmQyVmRRUU4xbVh4MVBjd0MxdTRzUGJ6Qk5FTHYyTGFMRGRVdFAyb2JReEs4YXpIb080VzNpRDNUNDlmV2VVMmVmUjNmNy95TEZZWm1EUVh2YzlLOWxhZ1VVQU1lTGVmeGFzQWpDSGZWZ0FaQjZJZFlzNTBYdTEzYnFMRjliMjRJOVpEMnNEYmkxNC96OGd5MWl4bHRqZ3ZPVUI1TG9BZ0JYWXphbEpnc2FNclIxdFhZZFJSbEdIOVJRZHNFKzZ4bVJnOHlJZW84b3hSdU1RQlNvUHVNT01ZTUxkczR4R0NKK0gyU01pNWFidXMvd0NWWTV0TkEwWG0weTl4R00wSnRBT3ExcGdLMEJkS0FmN0RLR3YwTWZveTlGL1pHbGFsTnZsd25sQ2NoZ3RSTDlsVzZBcjRLTitvU2RnSXhYcElKeUYyN2dPMk8vTkFsaDFWWGVOT3lQZDkvM1NJS0EvVkNrMzlZNEVQWWl1SGVNQkhKcFdrbTNRZUpFTFBFWUwwVzlnZ1pLYTl6R0h6djhiSTdESGUvNFliaGZlMkU5aW9POUpNMzIzYnVic1NrUXZpTXcrbjNRTkpVZTh0T3Ryenk1djJFYTY3QTJ4VlpUczR1OHkxampudTUzTkMza0ViaUUvWmpzaXVsT2oyMFE2OFU2WUVpbXR4a3V1QzN2TDhZWkxvMnNGRWFkUXh1dkc5bEUwZXQ2K2xrKzdNUUhvTjBQWWxzYVhiK3ZhTjN0cjF5NDJkVm1rZlNiVjV4aTNCYlYxdTExTTl3RDBsT3pMWG5ZQ1I5MHQ0d3Qrcml1b0tBMTl5dXdEMnBMQUp3UTdaM3krY0luaThrZzYxOG5VU0FUMk82VksvM1dCSWExaFQyZXc3RW9GU3JhTUlqK1RXRTArOTRyYUhBSndFVDkrWjdwbFhFanEzeERIM1FEZzVJR08rNUw4TDIrSi8raXd6eFBNeGdFaUJnQUkvaXlab0hBbU1QMC9lRTVrOXk2aU5lMWs2dzdXejR1Y3JxVHB4eVozQmVVSnYyUnlwM1hGVFBZZHlMN0pJd1I0Umtqek43YXpYaTJDSU1FMHBUWG9kWmM3SVNqZCtyTDRGSHhHRXkzQVJIVUF4MVYvTFp2aWpsOHdXVjJtMWZTQ2Yrc3djMFcwNk9xYTVtNlNLenl0Um5oUVZhZ002TWNoUmdrSk1YWUU4WWhCOXVtS29vVHBHUnFOa0s0Zng0T1crdSs0Q3JjR1lyZ1RaNXZtRzlUVWp0Zm5pcVlaVVdUNlVnMGVFM2hraVVHNW5CcGdqRjE0RFhibytEUVJiZnBWMTN6TXBsSUpDdWMrVkxKeEdnYXp4RndXSTNaTG5qNjVYNTAweEIwM29aME1MNGFTUDZHdlFYS2J1UE1yVXF2bWFRaDNVR1pyUlVaTmlZbzl0WFRSVTd4R2xkU3lwWTQ1YkFyTFVMTXp0QWI2NWltZElPYVJEWXBJVUY1QnNJbzdLUTYvVXpTd3RJMlNlZFMxazdRb0lYUFNjMEdURjR1eldoeEx4dndOeEY3aDlyMTJMTFlYSWQ5RkQ1c3JPL1MzMmJLZVd6WlBKcVgvQU0zUWgxcHVmU3Q3NmppUXZZRWwxbU0wZU03VE1rd0FBM3Q5U0RtNzZaYVhLTFo1NjV2cE8waXh2ZlF5Q0kyajVCT2hWL2syUGlWM3NSdDRLcUZsL21EdURuVXo2bTdWdjc4UlBiM0kxalBNWFZDcVZZaWYrRVRGSG5XM3JjaE1iNTFlMXV1VnB6TDBsZ0dUSUFVTWFSVUZjS0FEc0lFRTBRSVptS2Z5RFVsRlpZY28yYTYvNDNRRENhWHNrY01HT0syczVLRnpxUHlpN3NqZko5UzhOVm9qajhvWDFNanV5ZkVFUUlDUGNXaW1BV2dqTEJ3a0pxME9KamlkSFp6MmlZM09aenNFa2RuckVObHluU05ZWWw1eWhES1hZZzhqMWJxVENBaHNuQzd5NUt0UUtKdFhsbUl5aFV1OE5MTEJCWml5dVFPVXlEYkpkRVVteURXWnJMOUNlYWFaWWhJSDdVUzB1SlhtZWJUSWlqWkJjckY4MDI4Nkp5ZXY3RXkxeEVRT3FzbVR3N25LdGRBVVplenlUZURsa3kzWEJHVVo0M0xLcGg3UUhLN3hxZUFRZXZ0b2NXUmxFdEpsQTAxUlpNcFJLVFZGWGVycHhWeEZ4YjY4bkY3anNxN0diZFUyMEJ1ZUlWSk93c2ZGcTRUUEJJVVNPTGk0Sk1yUVZ6OTlkWk1oYVBDNFdUc1l5Z0VuWnFzNG1yd1lLZHhldVBsWUtUTEpxRFMvVjRvNGhDbytEdk5RYi9RSSt2SG9yZWZnTVRQTW00WTV1MDc1UDZKSVhoSC9lMS95bndFQSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1ib2R5LGh0bWx7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseSk7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNH1odG1se2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1wYXJhZ3JhcGgscHtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS42O3RleHQtYWxpZ246anVzdGlmeX0ubW9uc3Rlci1oMSxoMXtmb250LXNpemU6M3JlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46NHJlbSAwIDEuNXJlbX0ubW9uc3Rlci1oMixoMntmb250LXNpemU6Mi41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDMsaDN7Zm9udC1zaXplOjJyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMjU7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg0LGg0e2ZvbnQtc2l6ZToxLjVyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDUsaDV7Zm9udC1zaXplOjEuNHJlbTtmb250LXdlaWdodDpib2xkZXI7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNixoNntmb250LXNpemU6MS4zcmVtO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfXAraDF7bWFyZ2luLXRvcDozLjc1cmVtfXAraDJ7bWFyZ2luLXRvcDozcmVtfXAraDN7bWFyZ2luLXRvcDoyLjI1cmVtfXAraDR7bWFyZ2luLXRvcDoxLjVyZW19cCtoNXttYXJnaW4tdG9wOi43NXJlbX1kaXYraDEsZGl2K2gyLGRpditoMyxkaXYraDQsZGl2K2g1LGRpditoNixwK2g2e21hcmdpbi10b3A6MH0uZGVjb3tiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTEpIDAsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0yKSA1MCUsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0zKSAxMDAlKTstd2Via2l0LWJhY2tncm91bmQtY2xpcDp0ZXh0O2JhY2tncm91bmQtY2xpcDp0ZXh0O2JhY2tncm91bmQtc2l6ZTpjb3Zlcjtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0xKTt0ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnR9OjotbW96LXNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfTo6c2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9a2Jke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6LjI1cmVtO2JvcmRlci1yYWRpdXM6MTByZW07Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7cGFkZGluZzouMjVlbSAuNmVtO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3doaXRlLXNwYWNlOm5vd3JhcH1kZXRhaWxze21hcmdpbi1ib3R0b206MXJlbX1zdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpcXFwidG51bVxcXCI7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi4xZW07cGFkZGluZzouNnJlbSAxcmVtfWRldGFpbHNbb3Blbl17cGFkZGluZzouNnJlbSAxcmVtIC43NXJlbX1kZXRhaWxzW29wZW5dIHN1bW1hcnl7bWFyZ2luLWJvdHRvbTouNXJlbTtwYWRkaW5nOjB9Lm1vbnN0ZXItbm8tdXNlci1zZWxlY3R7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfUBrZXlmcmFtZXMgZGV0YWlscy1zaG93ezAle29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtLjVlbSl9fWRldGFpbHNbb3Blbl0+Om5vdChzdW1tYXJ5KXthbmltYXRpb246ZGV0YWlscy1zaG93IC4xNXMgZWFzZS1pbi1vdXR9ZGV0YWlsc1tvcGVuXT46bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9Lm1vbm9zcGFjZXtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSl9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0gYnV0dG9ue3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWJ1dHRvbl17d2lkdGg6LW1vei1tYXgtY29udGVudDt3aWR0aDptYXgtY29udGVudH1kaXZbZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17aGVpZ2h0OjEwMCV9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7aW5zdGFuY2VTeW1ib2x9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2FkZEF0dHJpYnV0ZVRva2VufSBmcm9tIFwiLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge1xuICAgIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG4gICAgQVRUUklCVVRFX1JPTEUsXG59IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBhc3NlbWJsZU1ldGhvZFN5bWJvbCxcbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQsXG59IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7Z2V0RG9jdW1lbnR9IGZyb20gXCIuLi8uLi9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7aXNGdW5jdGlvbn0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtEZWFkTWFuc1N3aXRjaH0gZnJvbSBcIi4uLy4uL3V0aWwvZGVhZG1hbnNzd2l0Y2gubWpzXCI7XG5pbXBvcnQge1BvcHBlcn0gZnJvbSBcIi4vcG9wcGVyLm1qc1wiO1xuaW1wb3J0IHtTVFlMRV9ESVNQTEFZX01PREVfQkxPQ0t9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7UG9wcGVyQnV0dG9uU3R5bGVTaGVldH0gZnJvbSBcIi4vc3R5bGVzaGVldC9wb3BwZXItYnV0dG9uLm1qc1wiO1xuaW1wb3J0IHtwb3NpdGlvblBvcHBlcn0gZnJvbSBcIi4vdXRpbC9mbG9hdGluZy11aS5tanNcIjtcbmltcG9ydCBcIi4vYnV0dG9uLm1qc1wiO1xuaW1wb3J0IHthZGRFcnJvckF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uL2RvbS9lcnJvci5tanNcIjtcblxuZXhwb3J0IHtQb3BwZXJCdXR0b259O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCB0aW1lckNhbGxiYWNrU3ltYm9sID0gU3ltYm9sKFwidGltZXJDYWxsYmFja1wiKTtcblxuLyoqXG4gKiBsb2NhbCBzeW1ib2xcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCByZXNpemVPYnNlcnZlclN5bWJvbCA9IFN5bWJvbChcInJlc2l6ZU9ic2VydmVyXCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNsb3NlRXZlbnRIYW5kbGVyID0gU3ltYm9sKFwiY2xvc2VFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbnRyb2xFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29udHJvbEVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGJ1dHRvbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJidXR0b25FbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBvcHBlckVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJwb3BwZXJFbGVtZW50XCIpO1xuXG4vKipcbiAqIGxvY2FsIHN5bWJvbFxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGFycm93RWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImFycm93RWxlbWVudFwiKTtcblxuLyoqXG4gKiBUaGlzIGFjdGlvbiBjYWxsYmFjayBleGVjdXRlcyB0aGUgYWN0aW9ucyB3aGVuIGEgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtfmV4YW1wbGVBY3Rpb25DYWxsYmFja1xuICogQHBhcmFtIHtFdmVudH0gZSBFdmVudFxuICogQHRoaXMge0N1c3RvbUNvbnRyb2x9XG4gKi9cblxuLyoqXG4gKiBUaGUgUG9wcGVyQnV0dG9uIGlzIGEgYnV0dG9uIHRoYXQgb3BlbnMgYSBwb3BwZXIgZWxlbWVudC5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1hZ2VzL3BvcHBlci1idXR0b24ucG5nXCI+XG4gKlxuICogRGVwZW5kZW5jaWVzOiB0aGUgc3lzdGVtIHVzZXMgZnVuY3Rpb25zIG9mIHRoZSBbbW9uc3RlcmpzXShodHRwczovL21vbnN0ZXJqcy5vcmcvKSBsaWJyYXJ5XG4gKiBhcyB3ZWxsIGFzIFtwb29wZXJqc10oaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKS5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGlzIGNvbnRyb2wgZWl0aGVyIGJ5IHNwZWNpZnlpbmcgdGhlIEhUTUwgdGFnIDxtb25zdGVyLXBvcHBlci1idXR0b24gLz5gIGRpcmVjdGx5IGluIHRoZSBIVE1MIG9yIHVzaW5nXG4gKiBKYXZhc2NyaXB0IHZpYSB0aGUgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItcG9wcGVyLWJ1dHRvbicpO2AgbWV0aG9kLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxtb25zdGVyLXBvcHBlci1idXR0b24+PC9tb25zdGVyLXBvcHBlci1idXR0b24+XG4gKiBgYGBcbiAqXG4gKiBPciB5b3UgY2FuIGNyZWF0ZSB0aGlzIEN1c3RvbUNvbnRyb2wgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdDpcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHtQb3BwZXJCdXR0b259IGZyb20gJ0BzY2h1a2FpL2NvbXBvbmVudC1mb3JtL3NvdXJjZS9wb3BwZXItYnV0dG9uLmpzJztcbiAqIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItcG9wcGVyLWJ1dHRvbicpO1xuICogYGBgXG4gKlxuICogVGhlIGBkYXRhLW1vbnN0ZXItb3B0aW9uLWNsYXNzZXMtYnV0dG9uYCBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGJ1dHRvbi5cbiAqXG4gKiBAc3RhcnR1bWwgcG9wcGVyLWJ1dHRvbi5wbmdcbiAqIHNraW5wYXJhbSBtb25vY2hyb21lIHRydWVcbiAqIHNraW5wYXJhbSBzaGFkb3dpbmcgZmFsc2VcbiAqIEhUTUxFbGVtZW50IDx8LS0gQ3VzdG9tRWxlbWVudFxuICogQ3VzdG9tRWxlbWVudCA8fC0tIEN1c3RvbUNvbnRyb2xcbiAqIEN1c3RvbUNvbnRyb2wgPHwtLSBQb3BwZXJcbiAqIFBvcHBlciA8fC0tIFBvcHBlckJ1dHRvblxuICogQGVuZHVtbFxuICpcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIHBvcHBlciBidXR0b25cbiAqL1xuXG4vKipcbiAqIEEgYmVhdXRpZnVsIHBvcHBlciBidXR0b24gdGhhdCBjYW4gbWFrZSB5b3VyIGxpZmUgZWFzaWVyIGFuZCBhbHNvIGxvb2tzIGdvb2QuXG4gKlxuICogQGZyYWdtZW50cyAvZnJhZ21lbnRzL2NvbXBvbmVudHMvZm9ybS9wb3BwZXItYnV0dG9uL1xuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2Zvcm0vcG9wcGVyLWJ1dHRvbi1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGJlYXV0aWZ1bCBwb3BwZXIgYnV0dG9uXG4gKiBAZmlyZXMgbW9uc3Rlci1vcHRpb25zLXNldFxuICogQGZpcmVzIG1vbnN0ZXItc2VsZWN0ZWRcbiAqIEBmaXJlcyBtb25zdGVyLWNoYW5nZVxuICogQGZpcmVzIG1vbnN0ZXItY2hhbmdlZFxuICovXG5jbGFzcyBQb3BwZXJCdXR0b24gZXh0ZW5kcyBQb3BwZXIge1xuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuICAgICAqIEByZXR1cm4ge3N5bWJvbH1cbiAgICAgKiBAc2luY2UgMi4xLjBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiBTeW1ib2wuZm9yKFxuICAgICAgICAgICAgXCJAc2NodWthaS9tb25zdGVyL2NvbXBvbmVudHMvZm9ybS9wb3BwZXItYnV0dG9uQEBpbnN0YW5jZVwiLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuICAgICAqXG4gICAgICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgLSBUaGUgdGVtcGxhdGVzIGZvciB0aGUgY29udHJvbC5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gLSBUaGUgbWFpbiB0ZW1wbGF0ZS5cbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gbGFiZWxzIC0gVGhlIGxhYmVscyBmb3IgdGhlIGNvbnRyb2wuXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5idXR0b24gLSBUaGUgbGFiZWwgZm9yIHRoZSBidXR0b24uXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnQgLSBUaGUgY29udGVudCBvZiB0aGUgcG9wcGVyLlxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwb3BwZXIgLSBUaGUgcG9wcGVyIG9wdGlvbnMuXG4gICAgICogQGV4dGVuZHMge0J1dHRvbi5kZWZhdWx0c31cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgbWFpbjogZ2V0VGVtcGxhdGUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpb25zOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uOiBcIm1vbnN0ZXItYnV0dG9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uOiAnPHNsb3QgbmFtZT1cImJ1dHRvblwiPjwvc2xvdD4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZGU6IFwiY2xpY2tcIixcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlBvcHBlckJ1dHRvbn1cbiAgICAgKi9cbiAgICBbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuICAgICAgICBzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcbiAgICAgICAgaW5pdENvbnRyb2xSZWZlcmVuY2VzLmNhbGwodGhpcyk7XG4gICAgICAgIGluaXRFdmVudEhhbmRsZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgcmV0dXJuIFwibW9uc3Rlci1wb3BwZXItYnV0dG9uXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBzdXBlci5nZXRDU1NTdHlsZVNoZWV0KCk7XG4gICAgICAgIHN0eWxlcy5wdXNoKFBvcHBlckJ1dHRvblN0eWxlU2hlZXQpO1xuICAgICAgICByZXR1cm4gc3R5bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgWywgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMoW1wiY2xpY2tcIiwgXCJ0b3VjaFwiXSkpIHtcbiAgICAgICAgICAgIC8vIGNsb3NlIG9uIG91dHNpZGUgdWktZXZlbnRzXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbY2xvc2VFdmVudEhhbmRsZXJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZVBvcHBlci5jYWxsKHRoaXMpO1xuICAgICAgICBhdHRhY2hSZXNpemVPYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgICAgLy8gY2xvc2Ugb24gb3V0c2lkZSB1aS1ldmVudHNcbiAgICAgICAgZm9yIChjb25zdCBbLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyhbXCJjbGlja1wiLCBcInRvdWNoXCJdKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzW2Nsb3NlRXZlbnRIYW5kbGVyXSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQnV0dG9uLmNsaWNrKCkgbWV0aG9kIHNpbXVsYXRlcyBhIGNsaWNrIG9uIHRoZSBpbnRlcm5hbCBidXR0b24gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjI3LjBcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQvY2xpY2t9XG4gICAgICovXG4gICAgY2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdICYmXG4gICAgICAgICAgICBpc0Z1bmN0aW9uKHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uY2xpY2spXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIEJ1dHRvbi5mb2N1cygpIG1ldGhvZCBzZXRzIGZvY3VzIG9uIHRoZSBpbnRlcm5hbCBidXR0b24gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjI3LjBcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1c31cbiAgICAgKi9cbiAgICBmb2N1cyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdICYmXG4gICAgICAgICAgICBpc0Z1bmN0aW9uKHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uZm9jdXMpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5mb2N1cyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBCdXR0b24uYmx1cigpIG1ldGhvZCByZW1vdmVzIGZvY3VzIGZyb20gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuICAgICAqL1xuICAgIGJsdXIoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0gJiZcbiAgICAgICAgICAgIGlzRnVuY3Rpb24odGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5ibHVyKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50L2F0dGFjaEludGVybmFsc31cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgZm9ybUFzc29jaWF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGUgU2VsZWN0XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9uc3Rlci1zZWxlY3QnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhlLnZhbHVlKVxuICAgICAqIC8vIFx1MjFBNiAxXG4gICAgICogLy8gXHUyMUE2IFsnMScsJzInXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd8YXJyYXl9XG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZWN0aW9uXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9uc3Rlci1zZWxlY3QnKTtcbiAgICAgKiBlLnZhbHVlPTFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfGFycmF5fSB2YWx1ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICovXG4gICAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uKFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcz8uc2V0Rm9ybVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhZGRFcnJvckF0dHJpYnV0ZSh0aGlzLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7aW5pdEV2ZW50SGFuZGxlcn1cbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50SGFuZGxlcigpIHtcbiAgICB0aGlzW2Nsb3NlRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhwYXRoKSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlRGlhbG9nKCk7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaFJlc2l6ZU9ic2VydmVyKCkge1xuICAgIC8vIGFnYWluc3QgZmxpY2tlcmluZ1xuICAgIHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0gaW5zdGFuY2VvZiBEZWFkTWFuc1N3aXRjaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdLnRvdWNoKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXSA9IG5ldyBEZWFkTWFuc1N3aXRjaCgyMDAsICgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVBvcHBlci5jYWxsKHRoaXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCkge1xuICAgIGlmICh0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXSBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgIHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlUG9wcGVyKCkge1xuICAgIGlmICh0aGlzW3BvcHBlckVsZW1lbnRTeW1ib2xdLnN0eWxlLmRpc3BsYXkgIT09IFNUWUxFX0RJU1BMQVlfTU9ERV9CTE9DSykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0T3B0aW9uKFwiZGlzYWJsZWRcIiwgZmFsc2UpID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwb3NpdGlvblBvcHBlci5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzW2NvbnRyb2xFbGVtZW50U3ltYm9sXSxcbiAgICAgICAgdGhpc1twb3BwZXJFbGVtZW50U3ltYm9sXSxcbiAgICAgICAgdGhpcy5nZXRPcHRpb24oXCJwb3BwZXJcIiwge30pLFxuICAgICk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuICAgIHRoaXNbY29udHJvbEVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbJHtBVFRSSUJVVEVfUk9MRX09Y29udHJvbF1gLFxuICAgICk7XG5cbiAgICB0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbJHtBVFRSSUJVVEVfUk9MRX09YnV0dG9uXWAsXG4gICAgKTtcblxuICAgIHRoaXNbcG9wcGVyRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYFske0FUVFJJQlVURV9ST0xFfT1wb3BwZXJdYCxcbiAgICApO1xuXG4gICAgdGhpc1thcnJvd0VsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbJHtBVFRSSUJVVEVfUk9MRX09YXJyb3ddYCxcbiAgICApO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuICAgIC8vIGxhbmd1YWdlPUhUTUxcbiAgICByZXR1cm4gYFxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiZGlzYWJsZWQgcGF0aDpkaXNhYmxlZCB8IGlmOnRydWUsIGNsYXNzIHBhdGg6Y2xhc3Nlcy5idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHBhcnQ9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bGFiZWxzLmJ1dHRvblwiPjwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwicG9wcGVyXCIgcGFydD1cInBvcHBlclwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImFycm93XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBwYXJ0PVwiY29udGVudFwiIGNsYXNzPVwiZmxleFwiIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpjb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgYDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFBvcHBlckJ1dHRvbik7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgQ29uZmlybUJ1dHRvblN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IENvbmZpcm1CdXR0b25TdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0Q29uZmlybUJ1dHRvblN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgY29uZmlybWJ1dHRvbiB7IFxuLmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZH0uZmxleHtkaXNwbGF5OmZsZXh9LmlubGluZS1mbGV4e2Rpc3BsYXk6aW5saW5lLWZsZXh9LmhpZGRlbiwuaGlkZSwubm9uZXtkaXNwbGF5Om5vbmV9LnZpc2libGV7dmlzaWJpbGl0eTp2aXNpYmxlfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOm5vbmU7d2lkdGg6MTAwJX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0uZmxleHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd306aG9zdHtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9ja30ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMywubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLTB7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdHlsZTpub25lO2JvcmRlci13aWR0aDowfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0yLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMywubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0yLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0zLC5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6c3dhcDtmb250LWZhbWlseTpSYWxld2F5O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFGSjRBQklBQUFBQXQzQUFBRklRQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0U4Rys0NkhJVThCbUEvVTFSQlZFUUFoUWdJZ1FvSm54UVJDQXFCdWd5Qm1uQUxoQ0lBQVRZQ0pBT0lRQVFnQllVVUJ5QU1neHdiZmFRWGFKZWZtTnowWm9sM3Y2MGNQZVpNcEc0SEpTams1cUlJTmc2Q0dNZ2xaZi8vbjNGMGpPR0dEUkExclhlSW5jSklVa05IR242OXFNUkRVOFphampzOVVic210bnFuRTN2M3ZxaVFtZlJRcExrS1c2UVp3YWw2czVJVWlKTlVTVUcvT3dvRFk2QjY3NU9qU2prRFNTTXUycGVkcHU5dkpJTFVsSmQ3MDdEK2VMSHBqWURJNGUxdURuTGpISHZ4cERYR015ZHVMTG4xcXQwRkNRT3lGc0paRTEra0pxM1QrSWU3QkpGSU5PQU5iaTl2VFV6aEk3VzRHbVVMMGxXalQvRlFRaS9tKyt4dVBQMDJvbVJIZTVwbjREZ2ZOWmZuK1I5ejk3OXRtRWVOYXExUnhScUhUalRQTkEySkZFZ3JIZG8vbnQvVy81emJnR0N4aWE2RWtWaUEyRmhZR0l0Um1FMVp2VlV2cXRTdGI3TXZyZDNXNyt0MiswWGRvVG56empZYnA3bVNITEFDa2hNV2dDVEw2czBXdjBBVW9oSmZFcUUzb3BQZDU4aWtKbktsbyszdWFlU0hZSjZmY0ljWGpkK3JLVUVzYUVsVHFsVWxWUm0vTitlLzhpUDBMNUFLb3pObEozLzlpQndzaE02djVKSVVKeWtnVDNmZHJPbXE2TGNzK1orcS9Yc0FYRnhFRWlRSVVhS29zRm43Y3RUKzdCQlM1ZHFEb2xKWHVuYmw3cnR0ekQvdjM4NExmdEphZ0ZGQUxZUEU1QTdnbk1yWkJodDRsWHFzYlpLbWJkcTBUdE9tcG1nTml1Z00yUFlCYzczTXJqcTdHTHNvWEhjVHB0OXVQdkZEejhlTjNnK3N4clBRQXc2RFRGTnAvT1pJOWlpbk5pdFpoUm1wUU9Da2RvQmRBTmpWV2xhdk1pdHdETkpYL3BZSUFrVnduT1Avdlc1eHpvTXc3U0FGQUtVK1p6L2tuUC9aOWorT2Rmckw4S2UydmRLYm1waHV4SlN1TDhFVUFnZ0hJaUJIUCs0NDRFRHp2MVBUUTNZa09jT1NsVEhtajZVc2RmbzJMKy9qcFllN0lIV2NRVWdjZ2twTEZSMVlUVzhDR0tRWDliOEdGQUFBSDl0bzRSSFE2R0x2RlJyaTREaXdUekFBRERNS0RQci9mWjNWL3FkZ1Bta0d6S1RFbVdFWGI3UTN0dGdUWXFvMm5QNi8rOTdYZitGLzlKSEFWc0lJY0FDQlp3UnlrR1Q3Z0NSOFZvaEpjVU9PU0RqaVNiQXBoTW96bTJKUnB0QnRVVzY5WGJORkczSVZ5MktMb2s0OC9MZnNtNTI3SWFxQkxNdUJiT0ZJd2VGVWQwMXZlTCtZOHhXaHR6Y3FUbTJDSVRjNWVMSndTSTRmWWxMWUZJVkhBcy8vVDUzTjQvWXgxaEtHVStIU3FFcmRwUFBuczZmcXFXSnNOYlphQ2xRdGpsT0xVTXNoY2RvQTVUUXNzNEpMYzkwU3hDT01NVUs0S1A5TnNocHpwWDR2d3hLQ2hDQVNSRVJFL0xLc1dSbEp3TktBY1RuWEFoRXkzcjFLSGNaYS9ZZFg1ODQyMC9pYVhtdEdob0NBaUlpQVIyM3YvUDkrS1RBQ0FONWhka0MzeFVDNEVMc2dndmtSMmtyRWpZU0V2MEJLU21IQ2hJdllPQ0FKa0tRZ3lZTU0yUW9VTXpDbzE2Qko4NXFBV0NDZEhlazNBQjBPREwxTHEwUGdUZTNoU3cyZmhpNFhoUHVldVFXRUg2eHRJRVFBYkcyTm01b1Y1NFFGUCt5S2dPMkQ0VDV0L3d6MlhXOTIvcnBxcExUU0lQOHFWOXZMdk9kczBOTFd5WDUxSzZvZmJ2UFpFMXBhZjd3MzE4QzladGhxN2YzMmJmdUw2NFZaSHc1MTRZc201bGdmTmJmRzdXOWxzVUE0RUd6NzIzdnh3R3pwNGZSUittUDhMczVCN0tCMmVESlhjNnh3bEc2OTAydWc3QXpMQThOWTIxQjJkQi9QNXFmT1Y4dDFvbnlMNWpaRERmUUk1Umc4RDk4RnZIc3ZjbEh1SnNyZHZzSnJwYy9Uci9ndS9FZlpKelhVenBXYURqN003K1VQOC84RWtBQVZhQVMvQ1IrWHMvSk40WWFJY08xeEhaY1VhTU1ia2xycEt5N05mUUpLUWNVUmFnb0dtQ1crSEE2RU52YmczM3NsMnBJWVJtRTliSUhiMG1BNmtrNmxONUdkeU1ONUVibVFoeEhLbHdNZ1Q1OGNndzdwZFVSejduZk1jUWZjVTN2SWN6VmtkcmhYOFhIcTQwMTJ0Rk9kN2tUL2E3cDdtODNXQTcxRjdhTzlNK2RqdmRkNmo3ZnhtK0QxUHUzejN1aXJ2bXV5emE1M3RydjkzbFRiODJSVDJLYUZWVUtNTlAzNkJ2UU1DbzBHc0Vka0w4cyt6TGcxRXhiTTBOZ0NXQXhnemY4MkRHMUtYTWZjNHJqTmNRZkhLeFNDdVJ1Qkk1QW9kREREa0dkVjhDblZWRW1FTWFpbjRTYTBBWFRJMFJCTnBPWUFMVnExYVY5dnhKaVV6SEtXQ2lzNm1wMEJ1a3gwNjlHcjc0c25WTmJzb0Nta1ZNb3A1K3BER2FXejJzTERyMmlOdCtvWk8wYjM2WVNJaldjeHZubE4weDBWaGxZb1c0VVJqWFhLeUxHM1kzcW9MZEVhekhBRUVvVnVNbDNERGVFUlZwRy9qZVRFUjBDVVpFVTFtb3RxRm9pd0pGS1VhREZpYWNTbEJKckVqU1FLSi9DU0ZTbVNLazE2MVFsa2RLZXlTWFl6c2RYS2k2STlpa05KTXRDVUtsT3VRcVVxMVZIVDF6cTYrbHpmUU5BSWE1SnBSb3ZXYUVQN1p4dU5tVGpNTEJZdXEzWFVUZ05kUkRkNlVxOUEzM2NieEF6eERET04wSXhhTlZheGQvL3MvYWp4QUU2Sm5QYkZHWmt1QzN1YU5VOEVzRFNMWlZteE9qMVBkOEhReFhTcGVka1hhd2JXNndabzgrNkRyaXVRRkZ3NUlwdm5KaDYvWmdGSks5MzBhRU0yWEozeUpCMERIb3BoYnFnMHVya3ZNSWdZbHRiR1JQY2RrZDdWai9OVjRwYkFiYSsvRTRCakNnOXA1WmVyaS9wZE0wQ0cvN3RYWk54VkUrNmJZYXZRbjZ1bVd3eTNGWGY2Z2crWG5BdEhEZ2prUE5pVWJxcG93dkRVdmJSbGNqNVhaSFl6VjhKaTRObDF2anNPaHJNYXhPSHhlRHdlanovVklISlhuNkgwd2hnNnFGT0VVcVFvMFdMRTBvaExDVEtKMHlRNUxVOXlSUXBTcFVsZlpuQVNCa1dwbENsWG9WS1Y2cWliVEJ0TW1RS1lZV0hWVVVmdEdJdDYybGRuTUgzRXBpVTBxVlFxSGJDTHhPVStFNC8xWExmQkVoektoZ1VjZ1VTaGZ4d21EejlHNUVSQUFITDdGSFJLUXlybnd1eFFmNXJoSEJFQlJJb1NMVVlzelViYzRydE1kcGwyNkZnZDU1dGdRRzh4L2ZBWjJKekl2R2JtbHJjWEFtM3dYS2E3RWxmUGNTMnR4ZnErZWdmaUhHb0RNeHlCUktIdnkzU0ozMFE2VjgrNm1kZlpzYUZWM2VPVUtzV015bmtoeUwxdTRWSTBMMVNKTEl4WHlZenBMeU5xaVd6MFhUcGthVHluMVpEdGk5MG1ZMDJ2MHRVcXR6U0NsK3FySzdySXV2MXY5UkQwc2d4cUdiSm9HR2ZFa2xFMVl6cjI4TzFsMktld1g5TjRBRGFOMWI3TDBJYVJUWE91eTl5aXU4MnBPd0hRQkMrcGxkQ3JPbUswTWcvcjF2UllFbTNEQkVjZ1VlZ21VeDAzRzQrd2l0UWdPZkVSRUNWWlVZM200dG1FSXZ3VUtVcTBHTEUwNGxJQ1R1STB5VHF0RmNsRUNsS2xTYTg2V0VaM0pKdnNGV2k3SXhLSk9Cd09oOFBoY0VUclJOM3REcGxNSnBOaFJJYWlxQWlHWVJnbWNia3N5NE5vei9yb2ZRTDdLY2FsTkQwRk9XM1JHWnVPQlIyeG1WTXhrVWdrRGwwWDd1Sml1dFM4Yk5HYUUrdi9aUU93cWU4NkdJSWVFc0N1b3ZXWWZDcTJ0dnBNT0JON016TzY4R1dYTGh0bWdXMmZmZUhwMU11N3F3WDVORHdUa3BDU2NlZkJreGR2ZmluQVJJUklVYUxGaUtVUmx4SUFpWkUwclZxNjVJb1VTWlVtdmVxVU1ycHMvejFaV0VaNVlCZ0dBQUFBQUFDQTBXWnNkMUNwK0h3K24yL2NPbGs0ckRwU2wxSzNIcjM2amcxQ1R0d3pPY051Q1hZTmdpRFlob3RIMW9nT0xSU3V4OG5pbDRyMmlZYXYwbm9yelh2WjJuWmpaTGZhS0QrVlJnSC9mZ05tcGtGYmhnaUdpVWFjR2ZYTm1LNDlGUHZZOXR2YmNUbTc1KzNmZGFtVzZZU3R3a2R6YUNIWmN2cTBDUzRpVTVabU54TFhHQmUvclFvSGpNUDEvUUVHVk1aRkpnYkRESi81VDNleUJjdkdQU3FUaW1KY0MrWVFVanFHdjJuQzdxM25CMERPcXYyRzNWdmxJaEtJVzhNUlNCUzZ5WlRpTkdGWCtSR0NESHM4UFlJZFRqZEFVQXl2UWt3U0NwcGhOZDIwbXB1TWpRWEtCUWtXSWpRcG1KUlVLWXhLWGNMRGM2a0lmSGFUS2FPTVNjNE1zVlJZUTBlelU2RkxwVnVQM3RMSHV3cHJZZnRoaXdpSEZBV2tTcG1XUnQrNm5KNlUxOEN1eUo4NWoyeDBiMGQ3TjlwaWJxMGxiNE5uVStwTzd0RVVMaWhkVU8yaHJwdGdZWENzeEJGQTNsUTJubUZjM0ZiUmpHQmdDZDZCVUg3cW5YQmJhY2pzSzk5UmZJRE1BRmtCc29PK25aZzhQMEJCZ01JQXRRRWFuOVdRRXM5TUFITkc4NTU0d2ErQXJucXZUVGpwR1M3ZS9pbFBtakFSUG1uc3hXa2RBQVJ5T0w5eUFoeW14N1NHS2xrN0doNDh2RHZOZmRnK0lUQlpwRDlnemdNSUJ3d0JrNXRta0VYSXFxTU1hRVRnL0hVZTI2b0xUVHA0dzRnOVVrWjViZ2J4RUh0Q3lUTFlQSG1KVXEzdUpwcXp2U05jdW1iQmRYWVFza3UxQzkyTjhqVHZERkVVMHJ2ODE3Z21xc0dqUGZSdU5qdmVyVERtSENFNHErcWJ6T2p1SUl2UmFEaHpaMS9WSlVwaGhpT1FLSFF3c1o1VGpndUFCOEN1S3IrWUlNS2V3SW9NTzV4eDllNEFFQlREU1lwbTJPVHk4b0lveVlvYWplalVRYjhKd0QvWEI1aVNzd1VpZ2hBc1JHaFMwQ2d6SnpYTUNUVTFYRVpIYVRBWFRDUVNpY1hiWTRWQ29SZ0xFeHN0bGRDdHhaMWFVbmx1dEdodE9RdDE4L1JVZFZwa0RCdmJTNG5Fb05Gb05CcU5GaWRYbjBXSkxKQ3JVOENVYnFxTWhaR3BtK0Y4RWJCSVVhTEZpS1VSbHhLRUVpVlZMVk55UmdwU3BVbXZ1Z0FaaEFHbHlwU3JVS2xLdGJwbUE2d3JRTGNldmZxYUU3RFRXczZZSG0wRTJkY2xpV1dzV0Uzbm1TN0c1YjZ1R1ZuUG5OdXl5V2JId3hEanBXazZNK2oyMGVZTUxRLzAzVk1tS200Wm5nbEpTTW00OCtESml6ZS9LcmRDa1ZNbEtzeUltbWVaZjBHUXl3SkJFRnhDL3JnZ0NJSWdDSUl6OTBiREV3TVRqOGZqQVVBeGRTNlZzRGNzMWc4d2ZZQ1hyTmQ5OFNIOGdhams1dnVVUHFnNFhEUDlKbTdvR1d2R1h4U2RFTExmcnNFU0VzbVdYVGNNM2NMdEhGU0diU0hCQWpjQ2lVSVhKcUhuTWxPTFJCTGFzblVLMlN1eDF6cW5NQi9aTUdPeC96UHU4b2hEQURBQU9BQUNBQW1BQWtBRFlIZ2xDa0N1TFZBaVNJS0ZDUDBraFdOS1BGVXdiZHlMK3NEQnllZ2thSjJXRU10V3JFNi80dnBXN0c2ZTRtRHcwQmZ4WmhGdDlHdmZoUEVBbXlkNGNNdFVxc1BsNGF5N0d1YWs1dDBONTJPT3dKYUJnU05Ic2syTmg3cUVXWllWcThlK2tzeGpqM0VLU1hnOExOaWxRcUZRekUxZnY1dHZwUVFGdEZJbXlMdGl2VGVXa1FDazVaUmUyUWlKMlpyTFlEVjg2TUJZV1g1eEFQdW5rMXludFoyeDZhYk5yaVhBc2hXcmNma1U2M3kvai9tK2duek44STNZdHh6ZkNlT2lBUGk3WWgxd0JCS0Z6czcyV3JsaWZXYjNuK3NPbWtTaXpYSFRYcG12QW5PZ2VhKzdTOEYxRUhQOG5VNEluRlk0UTVtV3AzQkFMbGVzYTdCejRGdU9iRTRFWFJuaXlrOGh0Q09pazh2bGNzV1lJS3I0L2NITTNYWEljY3lPRHNCWEg5UjNOSUJqVXNkMWZpZGowaWluSDVyaVpmVU9EVGlGUXVsemVheDcrakhaVnl4ZjM4VTN4TGRyK1U3dTQzSDU5S2VnSzk1SnZ3dnlxbjNJZ3hMeVVHMlk0UWdrQ3YxQlREK0l2Q01QTWcwbFZZUkJuU0lRa2FKRWl4RkxJeTRsQ0NUMmhtMHNFQWdFSlREcnFiNGdKMkpZb3pTVUtWZWhVcFhxYk5yWitaaGVqYis1ckhyR3pjY0xRaEpTTXU0OGVQTGl6YS9LelFuTUNFS3dFS0ZKWVlHeU55SzFsdEpVL0o2V21GeFVxTHNJblhTczM0czRBSm5UTlA5SlY4MVpXMDhid294d2pNb0dnKzFnUFB4d0FNZVprQkVFK1ZzdXBzeG85Y1dTNWl2bmFTVXBGSlExVEVidGV5S2pNQUxsU1FoNlJLM2dDQ1FLM2VRVTRqYkVDN3VxL0F5Q0RIdUNCUVRzY01iVnV3TVVCQlREUTl5UUZNMnd5Um55RVN4S3NxSkdVM1JpRURQWEw5RFo1RjRJcEF1U1lDRkNrOElHWlZNRkNkT2tMdUUxSUtWRmxHZ3hZbW5FTmVOQkNWU0prbkpFaitTTUZFbVZKcjNxbURLSXpHbGtTYmJkOUhMazFmeCszZStWQ3BtS29oZ2x5VUJWcWt5NUNwV3FWS2NhVUczVWxmcG9rTWJheE5Bc0xWcTFhVTlHSWxPZnZKbE1wcGpKWkRKYlJqdGFOV2svcnpXb01JSWFOV2VzYXV0MDN5TU8yUHhJSTZNQkU5MXFmb0R5eENTd2dDT1FLSFNUNlFWdURoNWhGWGxwdHJnTWp5QktzcUlhTDE3R2Nka0E1OEE4Z0NZLzMyUExid2tuQ1FCQU5tdEN3Nk5vQnJWSXF6YnRPVXNXVTQwNWxDd1oxdER4NXAxbzdURWRKQmdTR0w3NzdCRWpvOTRhbzlvanRLOWJ2NS9oQU04UmE0NlNqZ21kZUx6TkRNaGlVSG51N1FtRERCWitJVUZpVGNKb0hjbElrU3BOK21aR2NUY0g1SWNCcGNxVVIwV29WS1U2NnFaM3VzZWdGM21uK2JGbHJpcTlCbW1uVjdQYjdHMFJ0Q2FzT3dLUVpFZ2g0ODZESnkvZS9KNkpyejJydnoxMThQazhQcC9QNXkvOU5QSmlyOWdKd3lsS3JVeTVDcFdxVkVmZFZGTnRocldnVlp2MlpJU1llcmVCb0pkSEtlYWVnMEo3VUJlcVI4U08xYW4zcEZBTUtMd0l0VlNKKytGbW5pSEVzRkVRVytwZWtvTTVIcWY1MGx4QkxMdjl6Q01BWlRQUTE3bjlYNWtIRlg3YzZRMkp2YitLU0lzU0xVWXNqYmhtdkpFRVd4TEhKRFhNU0s1SWtWUnAwcXVPSUtPTHpHbGtTYmJkOUhMa3lWZWdNQlc1VUt3a0dXd3BWYVpjaFVwVnFxT21qOXA1cWxOVDMvLzF4c2lBUkNLUlNBQkFCUURBZ0VBZ0VGNGtjSFBBNHkvZjJtN1lHbzVBb3RDVlNTSWFUZVZHRkFBbHgxUklaUnZHYzVqMEpJZW9jeHp6cEt0Y2F5Y3hJMWhTeVYrNjEvR0N3dXpBTWZRTXc2TFRLZDhvc0ZBY3JOVkRQSWVGczZMSEZ4bE55dGllRGpiOEdPUVFiaFNJdGowMmdJZzhPVmJVZmdGL0d0a2FDc01NUnlCUjZENTVtY1BqTGJZa0k4SjB3SndYZi9NMW5vOWRqVFZkV2hwaUQ0TWprQ2owR1lZNmtZMU41UTRFS2dVaFdJalFwTkNqYktvU0NOT2lYb1piVkY5L3pzTGRHWUdnVmJNendKd3o4K21xVTJzalkxQnJjamwzZkcvc2Z6NnE3b2cyWTM0dmZwZFVoZS9DWjJISDh5QUEveFE4RDNteUFJRE5BVnNDQUpiWm54aTJjSDVzMmNSSndWYU9tMldXc3RQR1p4WVpBMUtJUjdtdDNBekFtdGtGVUk1aWxEY0FtMlF3b2pGWEI2cjNJc0J5VnE1bCt0TmFiY3RyRitRckFRK2xraVVXemlIR0tXYzV1MUZVZE1LTWhueGl4bkFVNGxrYUFuby9uaHVTY0VuSHJRNlFFZG9SMkZJUTRHRm5ZSGtmQmdKVHdObDQyclFIN2RWNklCS3g0R0RJUFRTUEF0WUhjdWEvVXplUDFlcFpKTmF0T0FTcUZFUWtZQ1dTaktvbWN2SjRRL2xZbVI2YldpRVdXVklGQU5hSVRPVncyWlZIenI1TXpDLzBpL0Qxa3dFV1ZEL3pUOWI2REc2MzJpSzRVcUM3VFAyVU5ibmtFWTg2NFhZaUtsVytCUzNGVUt4SERRWW8rOEI5eXoxdzRoMDdCYTRRa2t6TDBMR0pHSXJyWitjTlh1QjNQdzZjZWRwQU1VNkd6UlFxRFc3bnRCK2NXaXNGeW8zV0NtUWpMME1tWG9CcU5XUkZJWkk3Z0RYaHRTY3Q4THBCZmtIc1JRNlhwVmZJUnZaQlU4cDg1RjRoSDhFS254bUVZbXUrSzZjWVkzZ1FlMSsvVHpKQUlSRjFjS3ZObW4yUTBNOGFPV3NYalQ5anZCQ3I1MjF4cXRXVkk2YXBMcGVoS2N4WnVXOUJXTEozUUdxZjlKVGl1dnZVMHdkZ2h3LzhJQlJJWDFWdU5ReXNCcVN0Vk5QWFpEdEwrTml2Y3dpMVBnRC81TzBveW0ySis3OG9uMHJ4Z0E5T0NsYTBnTjBKRVBIWS9ZUDRuaElhd2JFSjJIbFVuUjlEYnpmV01QQXZ4a3J0QTE0eDZqckFtWVVjZ1JmUmxabm5ZeHMyeStvd0xEd2tTMlZrM2RmakFBVVZJSmV3RDA2dHorQXV3NnBJcXhUbDRkbWpvR2xZUVhETWIzMUZKUHMrNjdqOVJOZ3NIWWd3d09jWXR1Zks2VmhDTE11YzRORlRidjlwRVFqRk5qTnIwTFdBSkIzWEdIbTR4N25CUmZYbUhRaFEwYnpxbU90VlRueWVTNngxSGJDL2Fyai9YZS83cU1PbDdNMGVVbkRQZ2h5aXNGOHFJb0ZiaGZFZ3F5RDRvM28ySzVSTHJNSllDYUM1Z3JId3VwRE5zVm9YRkkzKzlXWVBhMWx3dk9wOTFmdmFuR2hvbUppcDk3dXBOSG1PSCt5YjEraExJcGRkcjIxUmlBMTNKaWI3OWs2cFRCM2RGQW83MTRwUTF5UlpiVFhNeWRBN21RRTlSRkdoTC9PeHJIamRSbm8wWGRmOXlFZTBuWEZmT2VyelkrRE8zZmlCV0JGTUFtcUZiT2Vna0FxWFRWbzVmUzY2eU9JVmxMQ1NkY3A2OHVlNHlKZWxoVVB0VTZWbTJqbk5BUHF3V2FObm52MXc3SlA2eFFaYXdTSVBsT0ZNRVVHdXpQQ0JiMmRKVXlnWTZROXdyNkpVakpyNk5aY2JFWXdML2N4WmZlYzgyTE9zTUs0OXhYNjI4UDhOcTNUREVjSUFQWnd3aEx3NThoUEtrNUpTb0RCSmdpVExFU3RQQTUwbTdTcVltTlN4NkZOdjBpU2pVMDR6bVRiTllzNENxemZKZmxtQy9ZWkpnTkJ3REFhQmk4ZUJIVDVIQWs0SVFrS3VSRVIyY2VIQ2pTdFhZaEplTU42OEVmejR3Zmp6SnhFZ2dKU2NuRXlnVUF3bEpYZGgxSnlFQytjaGdnWXBUaHhLdkhoMkVpUnlsaVNKcDJUcEtEbzZXMlRJc0ZXbVRGNnk1RUR5NUVNS0ZQQldxQkJma1JJQ0JsVm8xYXBSYXRTeVU2Zk9WdlhxK1dqUXdGZVRKbjZhdGVNd01mRm4wY0ZlcDA0QnVuVFpvbHMzcEVjUHZsNjlrRDU5K0NaTjJ1YVVVNFJPTzQxcjJqU3VPZk4yV3JCQTZFMHlaTWtNNGJ3NWh3c1duQzVhY3Joa3hlbXlOWnNyTnR5dTJ2SzRac2R0elo3SE9zd0dFd3Voa1JpTTdUZzRFQzRlbkIxbmlKQVFib3VkRUJHUkhWeUlJUkxlY0Q1OElYNzg0UHo1UXdJRTJFbE9UcVFSWEhBUTE2VTRoQzdnZ0NFQWcwWUFCd29LRHJ1RWw2K0dxYkZOUExXR0F4REEyKzJtVVNOT2lCZzd0MFNrUzMxb3hlTWtqckZuMklJakp6ak1TVWhPdWtrb0VKU2lqeUdneDJJYS85WmMwM2IrbjgrZ3FrZ1MyOHM3NTZjalVwM3p3VHIrUlBlNlNlcmxVZFQ1YWV1Z2UvQUhnQno5RjRpbndFOHErSDRPdklXMzlGYmVXcnkvQnFNdnYvS1N1cGk5SGtyVmVmRzVaNElhdmZqeVd5K3A0c1ZYeWhlVlQ1bnhJcS96YnZiam9xWFgxWmUwaGowQVlGTVFaczJCa0FnRklHRnd4SFlOQjlYZGFtd3IzczcvQ0lmZ1laaWZoVDlnYTEweXd0emRaWS9oY25lVFlhL2tpejhLQ0JvcmhGWjRnMWxYQkdHV0tBNzUyRWxJZDlhTEs0U0ZOZFYzMjliRzdSSUlLVTRHRXZoanI4TFUxd2pBMjNzOUJtZ2JHalE5N29VS3dxaU92eVBaRVJJQ0tJekE2V1RwV1F3VjZvSmxlM1ZUbGo1VHlQS09qbTROYnZPZy9UOUdWZnhOQTloRmhRRFN3L2ZSanBDRjJXOE9BNjhpQ3lUK2YySC9ERzhDNmUrbTF4L0lJODc5TkEzNXJ3QUE2OFFXQVlnbFRUQXNZQUNFcWVOKzZteTN3WW9BNEYrak5vV2NOUzhPaWFqUVFQN3lNRmF3SWpRUmdTVU1MSTBRN24xUkFYNlJGOFlLSUlKVW9aM3lnQytRMlFvc0NrdE81bHVNSEdVYUUzZUxlOFZqMGhxcFdBcElFYWxPYXBHNnJkVys3cVJBRmNDZVlpa0E0QlBUc0xoL3dVV2ZPYng5UjZVOHFmQTRTS241ZzdZQ1hBU1FDUUJZTjNrQS8vMU4xZi9rNlMvMFkvMW9Ccjc0R1h4eCsyTmYwdSsvN2d2cUMvTHp6MEVmOU9SQnFqbjFQZ0xvWlE4YisxWjBjOGdOL2wvMkRXZk5tZktwWDEwMzd6Mkx4bjNsdEJYVGJFNVo4SVB2ZkcvR0pvU0R5NDZBTXhZMkRnRWhFVEVKR1NVTVRvV2dwa2N4TURKNzI0UjMvZUgxOFNDQ1M0SWt5WFF5Wk1xU3IwQ2hJc1VNYXRTcDE2QkpNeU1UTTR0T2Ivbk5XMzd5dnYvNTJPYys4WVhmL1RzdTNMTE1lVDliZFh0MmNOZXZYdkx5YVBqRkRVK05nUmNOdU9CMXIzbkRMQklHUnlOUUdEeE95am1vVklPTGg2K1VHQXdBa29QOHdKT09oaGJKQk5VdmhwVU5MWnFEVTZKMEtWS2x5Yk9iWGc2dEVoVktsYWxTN2x1VjJyVm8xY2FxVmdkdm5hTVFDY3VXWEhIVjVjaTRXVVFtVW1VME1NQW10Z1FzQlN6dEYzUmJCQmV3RklBdzVsNDFpamNiQm1RcDZ5M0FFTnQ4MmRBa3dqeG56N1A3OFZVVURCL1ZtdUFkK3g1NmNQKyt2WHZHUmtlR2gxWXNYN1oweWVqSThPS2JGeTFjTURRNE1IL2UzRG16Ky90NmU3cTdPanZhMjNLdExkbE1PcFZzYm1yY2dXQTA3UGNlZmVUaGg3cWRkcXZadVArdWRHMjFsc1RBUCtmejZkcjFtb3ArMExKMVRFZ2dTNkN1dkM1b3lBaXViMDEzWVBNTGJZelRiT0RBVFg1WUVpWXljcFU1SVZjUGZKRGxKK29PdWRzdkxPVXlDSEEwZXBTaFJkNGR1SDRLZ0VwTUVPV1pHYjVFRmNNalZKa0JVQlVCUlprQTJaS05Sc0FOMSsxMHhLOHRpNUx2dTlDUU9jWnd4b2J0VkpZU05ZU0ZJMy9lendpTEpkUUVsVkFWcWJGZlZqN0dGWUtVd2lMMk05Y1NkZ05tOExIY3NBSWx2M3QrcFR6aWtnalM4TGhucFJBNHlEcGJPN0JjZWtoTElSdHlyc28zaE9GYmlVMjlGZ21LWTVKODJ4UmQ4cXlsc0ZXa0VIL2JhbjhsbkR2M1p5NWU0RFZHaVozT1FSREJENDY0WG5XVG1vRkRSNTJ1WEpremxmeUNSTjBqRlVMZXFaVkxOUUVYbVZFbERvdFpOT2ZpelE0UkxiaTBLM1ZmUWl1T0tPRVNNRlR2MTNUdmk2Q1Z5VTdXeE1tS1czVWJ0RG1uSTE3eVgzSGNud2pnb2ZvVTRtYVNVbExuSVBvZDB3OHl2NjZvV0lNZFNpR1BVdjJ0Z21BNEVkYTEwRnJudFFtL2VsdGhmd3VoQUhXS3MrSnMvM3pxdFR4U2ZjWmRXdk1Ca0VrbzJPV2Q1aDhWeGtsMXdRMHRXcWZYeGpuYlhUd0R3NW9tV1o1cWR2SElEYktZeHlnOTcwcEp2ekF6OG4zNU9MUmtmU2JkRFRwWmdOTTlsUUptMmlVMy9IMG5neHZIMjlkQWVZMlFEUXZ4WjR6U2hwUWJoQWpCbXdWYkk3RjdJdko3a2lOMUZKR1dOdUFuMHpNRXlSbDBoMk4xN0pDS2lnQ1BLZnk5bkhOT3R6d25JendtZ3V2WlovVE1CY1FsSEFmdzVFeEhEc1hHdUZ1U2VvM3lDSm5aUmIzVzdVZjNhTlo3M0VZSzdrT1NsVkpzd1lZeUpDdGNHTTFHcmo5OGNuSGhrRm11N1BkT3duMVd6UjBoeFRuUlU4YUJKbXhxSDl3UUlJYy9mVVdCSGo4cXJJU2piTzJoUFc3bFJJYW9ESnBLcDZXclZIYjBvbDVMbktMeUZqMlRIZ215OTZBcFo2L2xxMWlOUFk4dndES3o1Z3MrRS9DWklDUHdjYWNxY25SaXIxUnpQc25DZ1FWYWc1VU1yS0dKNnk0K3lQWVpJN3lqS1RKS1NVTjRvVVQ3R1RkaXhPMERrZmNUVWRta2FCenFQYmk1U2lLZkphSkRES1kxWmwxMnUxUkFPa3dTcDd6SG42UWthaXBOTHI2RTBwSGdtSVEwTzN4Qm5XU3lZMjBjdUgyeldZeE5RM3cybUZ3UDh4azVjS2VEc2RVYWtLbExITkpHOHM1eHp5aE50dEVCaVJETlFzY0NsMnYyWkFuMUNpdHhNRWpMTXdHOXAxZER0ZHFpd0pUTkNmTFNxUlMwQXRWdXFRUElzUUNSWkltOHg2NklOd3BUQ01KQzJ2WUhyTk1XTXc1VHhKNFZpNEhnUlJva2lnRktQVHBuNDVKWWd4cWgwYm9xZ3VIUDZJZ2tRVEtWUHA5Qm1DdHlTT0pkNmJ5RTBsUTFkbmt0bGNpR1VtcFFPOXRCbjZBQlJCdlliaC9vWGFwbkNDNzVHR0l4bDhXK1paT2pvSFVodTdOQzI1VUpvTGRvdkMxVm9BaTJGQVhwK000TjFEeUF6VVVqZVN2NXdHN1piZjlFY1Q2ak1ic0oxQnBZL0p0b2w3TjBqcFFoZ0xoY1lmWWVVWjJCWHFHVUg4NVE4UlJ0ejJmUWRuem5sbEIxOGRDRE0zQk0wUlZtTFhHUEZWUmpFZFFoTFA5RGlKdnBOem9VQXZlZzlaQUxmSWpUVmI0ZXQ1dlBNOUFVVkMxMUpZQk15RXBKb0xhd0hWczNBMENORDBjZzIveG5YSk4rSUpXNEFLZjFHU1VhM1ZCY3VNclhsVVlUdWdab096UGZXS1J1YzhxWU1tbE9NS3dsN3gwa0t0c3dsZjJaUnNyajFoZzJ5enFCYVBsQWFNbGtSQzd6RzRXYUhjOEFCcmx5MG1EVmdQaEtnNjBLSUdzbG4xRkZRR29CSFkxVEd2OUtnSnAzVm9vM09CSXVBNDg1b3JoMGMwTkcyTFg2eVNBOXNHY0JhbjJRaG9iZ25pSjZGZXR1S1NIWExwNWVjTjFGaTFvM01nTW1LZHcwSXJGaGo4MUtpVUxEdlJKREk1S1NVbEtBRklLeFZ6Q3VnVXhYcEdnWmZBZ1BFRTkwTmV6S3pweHZIYlBUVnEyZE9hcTg0MkVOOXV5VHpLMkZZdCtXZFFaRGU0VWJlQjE4c3d2bFFVQ2lGcmJMK3lDN1dxbHpaT1ViMlZwWVFadTFtUFVrVDJYeTcyNk5qMGdwVW1vRVdJZXIvRkprZ2tnYkFBTDREaC8wbG81SkRCTUM3a2cwRHR6UG9nRjBLN0xXTFhSMDZQRU4wb29ISDFsdWVKa1FEUElXVTZNWk82TGEyc2d1bkY1MDhDMmxZR1pQbGN4MlhKMXR1WEZicmU1MUNJVVdTaGI0Zm9qNkxnR2NtbGcrVUNpU2l4Y0g5cko2VFRKZEFDMjRBcEdic2E1aGEvTklyK2g5SWVhWElDaVp1OEM0Skx6V1Q3Z0tZVDc2MzkrQUFqTGxwcGRYQUxibXQvemNkWjhuZkkvc3dYTmJaZHc5bVIxU083SWZnWktDLzRNQ3dwQ3c1c0QxajQwd0l1YmR0cEJOY3NWSG11VVB2aGFrc3hNOUY4Qkxrc1EzNk0vQk9KQVF0OFRCQlNVYlNvandLMzJFWWJlUXJ6dVlHYTluV0ZoT0tUbFFCdzlDRmo5alRHNEozTmdEdmV1QWcxVU9oYjRLQXA5cEhnYU1KS2IwU2xvTDdEb2RIc0xqcHRYaGt2T2Fhb2UwQ0hqRFU2dGtLQ0I0MmdaSnpSRGNQbzJ4TmVKclpEeGNYZVYzVjI4SndrMEhKaFUwOEx0R0RRTXFLT1AzVEdvQUk2WW5iRWtSd0RSazNPNGtpNjFJbnFUODEyeEtiaWlvQk1HRTVETHBNS3JpT3BvdkZMdGJJZTl4cU1xL1NUWXN5MFpRRjV5YVphdnAvYStIN3ViRG5wU3NpQndKRmFnQk1pN3dWV2M3VUhxbG13M2ZjTHZ2bW5WUlNGWVJRRW5neG5IdnV4OFExQ1Y3QUlBdUFJRGRBSDFBK0x3ZytnSGdQNEM5UUxnQkFOYWV2T1R3b3FNSFVvTmdtVm1FeURJN0xyeExIRFhYRWs3WkFNSTl6T2JHeUNHRGJrNkc1VWduVHBQYzMralpRTWpZR1V5dU5YZytNL1RpYkkyY0J4Z0p3a2IwYmdpNGZaZjVBQkNXVDdCRFNNOFllUy9KOG5vNElzeFFZazUxd1pLbTQ0Q2p3NnBUZlFqWGpVTHY5ZWpQT1ZLSjNQaFMyaUlmdWxBSzZzTUx1elk1T24vYkh6aFpETjJHYVBoNDY2WkxVVVpFbVdKM1hSRys4QSt2NVlPT2xGSU1SRkI0K0xqV3l1U3VTT2VwM3FyUFdyTkJvUnZHRFdiZ3FjdTk3MTVrWHoyQkVNRlVaWGZodkw5VUQvT3VtNjR3ejgxSWtzU1h2WnVJT3FjWVJDcHQrRFVpZ3N1RTNRN2J2Zzh6OXFFemY4bWZlSEZuNTVzSlJVdUxZeFEzZk1IWnVPN3ZoazhNMDkxUXhMQloxU2UyaVFOVjBkakV1Q0ZUYm55amVhcU5XdERVT2JxSmVKc0J1bklRN1BLV3F2SFBQRnhFWFRNS1JqZkFEYytNOWI3NVdpdEtlTjJUVHdQTWIwUEE5cTJGVVVHU2FMaHNsakRBVUFNTUxkS1lRSFZqY3dwZ1lLb3dhVVFDMTZycmh4QkRSVS9hWmdiRW9VcytBMTBUeGtzbmtTTGpaYXl5UmErUGhLS05qQlQ4TG9TcXJxQkdpcUdTUmlGNVRCQzdoNTNDaW9lRjRXRk1WMXpLNWpEUG9iakhnUDVhOXNCREQxaU84NFdjTDk0Q281RWRjSWtIbE5mSnRmbW1BRXQrQXAxSmF0dzd2NUx4YlNVM21lS0NXczEzY29kUVVZbEpWdis4dG11ckFHb0UxbnBNaFpleFRMb1BMMGtnN1VleTJNTEV1dk0weTQ1S2x3R2xXeEFobkhmTmpaYVdOY002ckpiTWltaTArc3p2OUJCcU91dGZQVkVqSGpJYk5kNXBhYU5tYkgzRkxKdmkxdGxPeE5zb3RkaU93VDluZVBPNytlU0dGRlR6MFRhZDlZZG1BL3BKOHFGYTVnc2Zhb2lzdzYxQW50OE92aisyNDJXSzNSVnIrY3lPQ0dUWFRaN1pxM3lISlFMUitxZnVTYmdQbDRVb1VubkZNcWx1SDlBUDhSaU8xa2Fsc3hlZUhYbmt1TkllOSs2MDZ6aWgxczhPSzg2ZWtNcjZxc0JzOHJ1VXE2eEZIMGdVZlZzT1lhbjNXU3RBUmY3RjUwdjZ3ZHVLYjBZdjJic3AydkN3U3FGYU1BcnJJTHZZVjBxeC9UczZjRDkvUjB2bWI3cStVajRRSkRIZkx3cWExTDJZU2FLZTZvY1dYVDZFaCtWd3VhUnlIc3BMdGlVTWVmcEpSVVlJdmRPcDVZRisvTWhnQkIycGZ3R2prS2NjZit3U0krQlZ6T1hMR2cxY3hXNERWZjlIT2FhSGlTczAvUjNkZlNpOGhkRnhZaDdNd2xGL2p5aHdEYWdGL0NlMnowaHd3RjRYNUpiRHNGSnVBd00wTnF0anNHTURDVjZHSzE5aGpVQURiUk43eUdkaE9oOHV3SEwzMEd6cXlsbWN2N2FJZzdRb2x6UG5Md3JiamNOdjM2WEthRlp6NGk4UFZIaGVRM29RcGFxTEpESTNTRGtFWExITUNKVFphUEt5ZlFUVVdyODZxSGNXNlpUZTVvTTd2YXRORFhrRmxja1VQNkdTVVFoVldpdEYyVzcxOWZQT1pIZTdnOFdyN0ZtMjR5OGhIa1RtUmdWN3ZqUFJYUHE0ZEQ4MGEwYVpnNDNmQlY1dFd2dkk2QUJZT2dmR3V0aThpL2txeFF1TEVHb0cxbzVmVG1tNm5zV1pyZGx1RTJicjBMZ2tkU2g3RjFNUzVwRDBEWkR3OFVpdFdLRm11c3gySDIxeEQvYm03eHhzOE9IMWxpWUpTVnc0WXVqd2h4UzMwQncyNUI3YUNiR3RnSFpVTEltNnVlYXR4ZXlwclZrcStsRm5CbVJWQWQyb1VUNUNWNlBMa1hYNGthS2JkZ1RtRmhqZXNvL0tqQzhJbWxnYkx5ckdLMzhTN0pqcXQxRTVhQ01pWG93YStVUGd5M2JKNTZkb0hJZ3hQUGdid0pyZFd0bE9HSjdNQ04rMDVpNlY3VW1qaWpoU21JL2VvZFhqSTJXeFFIamFtZlZPU1B5bldEdDU4Ym95OHl2TE40cTkzSmhwTDVwV0JuUkc2bGFhMXBFVjVtL3VJQXBSTjdSWG5UaklybW5BMnNIa1pwR2NHNnlzNlplV1h6NmQ4blRUZnRaaFFPYmFCWG1MVk1WcVprZ05ERmdEaTZYbFRZbTljVTJXWWpwelNTRkFTQnRxcXNTb2xpVVBLVWZiQUQxK3BpYldaNXlhWXppL2ZtV3NIUlhpY2ovOU5wMFp6ZmladEozMTExZWRnZkF0WDhXK21tdjI1MWRmRXdGQXRxRzh0ejJ5RHpMaUR0dmFiZXJXK0pxTmJoQ3h0U2dyTTZxNHNsVEpTNDF4YUNwQkdocHBEcnJpUVFXVjdOZ2RqNEY2aFNVam1vTFNCc3RaVGR2ZGZoQVluckJqVWl6bStnd1Z1OHpxaHNXYjN4L0YrNVhFVURVVFFYUUN4d2RIeHk1dmk2WUhuczI4VWlKaDBuN3hJV0MzNWwyc0dWUXFTTEhmMUNON2dDUUtrZUdnUjhhVFdxVy9CbGY1S0NBUWdUbXVMQ3hNelJqakxJc1I0UWczVmpvNithdlh0bXNDSm9aTU9rY2J6RjFLT0hHRDdaR3lrbGNXTXhzZWlEc1NtVXdDU1JieE0rT01WWWd4S2d3dlI1Wk5NQ1I0MU9RdUhzenVRMSthNyt1ZjNnTWVQM0dSR1hITTBHT2RiR2hmZjd6SWFSRUIrT3h2VGgwOThCczNmL0RBWTNwb0R5clFVdTZURUh5VWg1ZHRjaWMrT0NoUUZqZUYrUkR6NHR2cWREOUZ0T0NpQTJrZklIdmVrMlBMUmZ0QU84ZHhZdTRlMExpejdXQnl5K3dEeFg2Wkd1clphYnJ1ekd6V29PK21DK1pGa25Hc0tUdUx6TkhDSkM1SDhnVXpGczUzV3JCVk1nSzNJbE9CRkwvQkVRV205alRtY1I4VUVrMExKL1FFTURmZ1BIVFpDcXFXRi9vS2VldjRVUjRxR1ZVUzV6eEIwTmZ5clFkblQ4d2ZkRWFMdHBjajNKaDRGYS9HVDZZYzVadUFpMkRqdXdjK0liK25PSTd3Nk1hcU8rQ3ZLYTBqemFlZjREcVFvZVVJQWtka201dTVuUE83Wm13VHpBQTVWVWZ4b3VTMkdGQUlNQWhBMVMrZllZVklwUGNYaUZMRkNqbWdlT0V3QVVkRElIdzYwUGdwSk5EMk9GUkZid0lNRWF4aHBLV1c3Mlg3bG13OE9ZV09GdzJkWnNuMmROdjhKcCtmRkk0WmhtVDl3WmNaYTlnU3VBQlRydThodzVrMG1lQ2o3U3NlOWRLZ2dKUFJSZ1VzZVVWSGFrK3h4OE1RMUZHRGhNcWF1bG1uUExuQXREWUFDUzlPVzZKZXhlMUYrNHc5dkprejVVeCtxZ1c4NWpreHd6dzV3V0FXNW1IWnlmek9SYk5NekNPYzVqZFZwaFpzVXBzZStwR2dScHhtWjQrWjg5aTlwTzN4eGhnNVJoKy80YlVDakVwaDYwT1AxL0dXWnJXb3JpN2FaV3VRaStMWkp3WXAwYk5NZWZaaHd4NDk5aW42RkpjQUs0RG1BR1RJaUZXSnhEVHp3bEhmemZ6YXZRWWQ0eVlNeURTWVBDTE5tSkN6dUZGYnBvNUV1aWlRWkptUWxySXprRXhCR21LcDJMVGppa2lQc0tmUHZGMkpkRDR2MUUvczJlMjZzeGdDcnVDQjZNeVpMYnNJUDJUZDl1bk03cnNzdFAySDZGQmdVbE9CNjBDL3pZNHEzUXkwcHJuY0FTN0paTTgxMnlZZEpaTDQ0Z0lETnU0NjJZUmFUenk1SEtxN0xqeGpGT2NieGFYWnBCMHJiWmJVUFRPYi83cXhrZlRQT2daL2RLS1JnR3o3YmZJc29RMER4djN6OTgzTE40WW92b2FibU5aMm5qT0tIblo5c1JkVEdqSnF4SU9ZTWlkbkp3UlpEcGtUMjJwcGtkSVVOWEZTQmhYS0hHdUJoK2hsMytqNWJTcjJYTU83U0IzVkthWDJCanJPTW0xNHErUnNPR0JIc3dZRk5yK2tZTHpxQU0wM25qQjk5R2pxamthRHhNZk9hTnJXNkU5Vk1sQmlsVFZ4Y1dSaUFKZXYvUCtUNGE0TmJZcUVza2RzUzRhNHJWS0xLUUpOQkpRRmJTcmZqdEJtTW9FVUtTdmpmQWxBbFlUalMwUmgxTkhVdE1XSFc0Rm4zMFlVMEk0STlBUFU5cnd0dU4rYmVubFNjdGlFVFJZbTRnNGo3dDRBSkpHb2Nlb2tPUmdRTTh6MGZIOU5MTGFTUVJFOFdjQzRGZmthc0NiWmhYNms0c1NiR1hOTkxkSXZtUUhPQkdvR1Y0dGdOSzBzOTN4ZkF2cmk3ZW1NQWhhVWdjR0l5eWZmZVhTcGJIZzkvZDhtOTV1OC90K1R1Ny90KzdhNFR4L3NvL2U1TlB3enNwdktSck5UajF6cC9rL2Ivelgyb0UvLy8yU1dlK05xdmdtUmRVMGFLandSSXYxNnBFNUZVZW56YjNvNzVBamdIRU9rSUY5K0dYSTlmRU5ZS0g5Y1JrUHlxUTFHaFBYUytMTEdubVgyZUc1OWs1VFp1eXJGWE05RG1UN0tsNExtbVJ6WVlMaTVSMmZEa3NLSWJmQzVya3hnQURiNlIydVRmZW8xL0phSlA0WjJ0UWJ2NzVpYnVHOXZRYStvTStYYXVpS2FIWnM5MXJJeVFXK3JCbUlvZ3Y0WUV6aDMxOWZkdDZlZ3I4NjVkV1Y1NjRySitKU0srRzdpVStJZWJqL2VMeGZJOWhGWE92RXhjVmROQzk1U3h4MHA5SS9hVXoyYVZZeFh2YXE1YTlqaW03Mm1TY2JzQXoyTGEwT09icjB2Q1E5WUhkaEFwTGxYYS9XTXVvdytjLytxVnYwRHlxTXBYTEptZkVMWDhFYURidTF4ditFV3RKQnZvb1QwYStrVzJPbG00MlkzQWtSbURRWVg2UHJqWld2OTJwSmtVQk5pWDZnbzJkTGhlOFlqRVFPMXd5cWN2L1AyajJ1aTVIMlB5eXRPZDNKT0FNN3UxRTIyL0ZxbmZVUnJkdmIwNGk3b1g0TkRyeWZKTFJvdURJN2FtcnZWcTl3KzdhcDAxNGpGRnhxeE4vZXFWN3I4MmFtYWM3MTI1VUN3dVVkWDYraWxBaWxrdnNXdUdBaFZxbzJPK1ZPSytkV0NmUWNaN1NxQytPcTkvcnJNUElNenVNU2E3S0cyRmpOZ2lMY2szLytvNVZ0RE4xRnhEalJwc2l4TTNqWnd5d1NrQ3NJcnhCR2xtZXhLT3V5WFNxd1gxSXdXaktuVWFOU3J4djdtenFOdVRsVVVWWnEwM2NsYSt3L0xkQk82Vzg1c1VidElLSVlWS0w2SDdIaFdVck9yNENGcVpQRHhtKy9XaDVSUEhxWDRMUk55SWdqUEYwZVVsRElUdEhPZXFyYnVuL1ZUaWZVS3dXaWhtSXBBbzE0Ti9wL2dTcXpnN2x1ajByN1dLS042T0NQeGw0WExCMUJid0tFR3ZZd3F5elViTzduTnF2ckhtN3RvZnFCTTBkTG5kcXV2ZEVMQjhtQjVuMXpQV09qYTVKQXFTRVFyWGRDSDNQRGV3bjJoK3dvSmEvV1N3c1loSzlNaldzbDA2N290M0FGRHNsWG44N2RTaGlSbnZ2bWE2Qk92OG5RT21IVVFUUnd2WFc5L0Q2clFjUzAyWGozM0RiSS92eitmWElidVNwVnZWcXZIMVhmTnZYdXVtaGczVm15K3JRaHlqVjl5WG5SYTJiMmxMZGEvakg4YmJhVXQ3TjZhNFBpbFRaYzNtYmxqSmJveXpvdmNvdTh1ei91UElORHo4ODRST2o2d1cyMTB0eU8wb3JGVW9QWFhOUWJrOVpKWEdWa3JvRzZaTXk5WFVQTGEwejZyU2dxbGdYS2xiVkJicTQwcWNYOTMvdDBQY1p2c2tWSmx0TTFPeWJodktreXRLT1lNL3VWMHNWZ1RVZUlCRldGZzJ1VU8wRGZ6RjliV0JYdGpEanZTSUhsVjI4MmtuQmxML2IvOU5qcTR3TStNQmd0bkVSZUQ1bHpXWURTMkdxMHYvMENibTZSYTEzd0g1QS9ya3R5ZkxlM1kyczhxOXJ4Yi9LdXJHSWptSEhwUS9zYTlGKzNHMWpSbE5tWW9RdzVYMDhYMmZ2clRQbUtTWkR4ZGpNdlVwTEpIcERrZEJiY3h3UlQ2QnhHQ0JzUXgxS3J0U1Rtc2VBQ1pCeDJ3a1YzamZMVFkwSUo2Z2tpN0tlUWNYdWdMK3ViUWo1WFBidERvekJtem9jdFJhK3pOMmt5UXV3WWJLWDNuY29PMFdsa1FzSS9PQ1hyY2ZiN1BHSEpmeWY0VFB2OE9WaTJ0c0p5Yll6Y2JNcmdyQk9YR0pQdS9PaG1CRUpVZmpnbmlHQzZKN3dnQ3VHQzh4eVZSRk5rVW5kNUFWcUgzTEhBeTgxd2swdVJ5SldHZGI4ajcySUMwbGM3TmIyc2dmTTI2ZVVPMllmYncrMW1LU21YMEpsUFdaR3cxVVliNkRHa3laU2xEZXNOdDFiVVhsMFo1bzZFZmU1MEFXbXhzUWQxQnBNTVlkQTR2OVB1RFF3SFhpSDk2Q2I1c01lZlNCb01oWjhTYU0vcS85QzZiTEM1TkdZMHBLZ2haTy8zMnFUMFZVQVlxSFdER3FWYUpoOFRWSDk3TjBSbmlrYXBkeWwybkJKSVpWQnFqdzFDcmpnTGE2V0F6Wm5CM2VZRWhvc3JMNUFZSVoyYTJjeHJuYkwvV1JpVVJmZGkwNE14czI2VHNHMU9sWXYvUEg0Y0FoVG9nSittYXVFSWxpZTBJQXJKTEpORG1iSE1vRTBxci82aUxuQ1NqMTRkOE5INXFhVlc5UVJBdElvdTB5N05rdHV4RVhPTFVHYzZrMjJEOS9UYzJzL2pmblJBaEpJU2hqQXUrNlcyMTREMVFNZkVCZThuZ0krUWtlY09tTkgvNytTbWRNUEdkYmlFMHlhdGd2N052R3I4S0JiQ3lJQWwwMmxvY2RFZTYydXZjYTd1czJkY3V5Zks1eUNMMXN2SmVkNjJ6THJ3UzhuUjduZGloMlJXTkJ2aFN0N29wVzRzM0tHdjlKNEk0bjhmU0tDUHVYcU5BZWFOUlVDUXZObWFWVEJCdU54amhObmN3aXhvTUdkUnpybTh6R3VEMnpTbnpaMFlidWpKV2t5bHJNL1RZZDlZZEVveW1qTjNZYmIzclZyYndYQnpwb1BXSnZCM1VlYzg3MTUrNXNiWENLWk5wa0NLNDJEZmtjNDJFd3E3UlJYNmZQbzI1b3VmNWlkR1dldDg4cDJ0a1dxS3doRmdKV0hNdFJyTTVaNXkxLzY3VDNDUlI2MXN4WDR6VXU2TXBGRGRucklidVdnZlZ6YW5mMkZ0Sktjc24vNnJNclNuS2FFemEwK2MrSENwbStyei9lY2dUUk4rLy9iVldZd3AzaGFHYzNtOWRNanRRaHhOKzJDR0lvU3BKZkhzUXdnWGp2YVJsUDN0SENBSzArZE84MnBoUUdqZVljOVo5dU80dW5hdzBVK3V3cE5TT3FMUk5iZFgwTkR1c21BOE9WVDBua0RWOUpWQUY0QUZSbk04dE5qVGh0U0ZaVG05QTJsMkJOS2EzNXFuMkV5ZElUMkowTG83N29UblFremFkLzJzeEVVU0sveHBBcmJydWxCMWdKajM1ZlZHVzIwTVdhVlk5V3VSbTNWSXhyZWJmNHRwKzVaS094NXNoUFZObkpJRXVQOGNXOFlzY1NoM3BhcEpTOXJSODhQRE9MTEVHT2pjWEViKzVhLytsWnNsL2hHOU9ndnVidkNkL2NYMmRUaFZLS0EyVjZncjVKeHdJOFp4QUNGb3A5V3V1YXZOdDJsUXphYUxxRkdxdkdoVFNna3VSOG9iK3NCWU9lL1Zkb3U5RkZNOTU2cmhROE1PWWVGTkFHWGlHZkdaVU9icE1tT1ZMdmlUNS9tTTRDYmZUclM0OGp0aTlmL25KQ2RjeDZTMnpOUG5KL0x4SHROanJxYXRmS0RLUzVNMXZaMUN2ZmY3NjUyU0lWcCtlUWJvQXZxQU1HVjZQcjUzNGRQYU5wczlVM2ljOVR4S1Z0bis4U0FNekh0bFl2dnpocnkzdkY3NVhZSG5vcTJYTEh2N0svRzdCZTRVMWc0Zi9XVlcvUmlIeEM3MC96NkNPZnY3YTV6cmgvcHovSkwxSzh3YXJhT2J0MWxmNjVBOUNjMStaSTMrVTd3R21WWVRKb2g2U2tqMWcxNWNjMlM1NWQ4L0x3dUxZUE9BZUVJQUlCTTRnTDdvV3EyTC95VGNPclBMZTVZTFU4TTdPN3RzK2ZCc21Wdko5Y05WVUVYbnE2Q25TZ0RzckVQV1JSc0RaTUpzbisrYUZXNktZaHJHVTUyb1M1UmdhNXZtVkZRdVZDOHNoZVlWWkZqQVoxRnZqOVFuSEg5TFhlS3krOWljVEV5eTZpNVd6ZWh1aCsrcTcxeHg3RmxIdFhNU0VKNlpoaGVTUTVENXovVVVWaTVTTFhJbGR1T3kreEVmTUM1RDBzUXpwcmlYVTlSYW4vVE9KcWtFdFdIZTJ6S055ZWlKKzVvN2kwVlZZMjZ6cFh3Q2x4Y2ZTWkQ5Qzc1MS9wY3lZTXZDMTR6TEpWZXhVUmgvWDRuVnFVcFVJWExkcnNBdXBWdFZ0ZnV3WnI5Z0xNUElpUk1zVmpxOWdhSnpHclZKQ1NjZW13WWpmUHhBQm5sVHFRRlFkakk1SE5vZTFDNU8wMVpLaWdZV0JMWUJkTE5Zay9aZGV4Um9WNFNCMmZMdzFjMFhDSXZtenEwcXJ5RktCU2ppVGtmb1ladlRvN3dzckFNSFpmelJBNTlZakJaVzZQMTArdnNwZWorRWVCWnJaOHVlZDA4NTZ5c0M1QkRmdysxY3VFb3BvcmFaVWw5WVZHbkxzalJCWkV4UE5KZ0tCMXNabUhsNlRhQXpZOEcxZUdXRk5HNktDYytQMUlvMHRxOUxIS1lYVWZady9mOFdSTk43M0JmaDVra2dlcWY4WldTMll2a3MzRWo3cGZxaTcxbTVvSk1nR0k2Vk4xT0Y2TW8yL3I0bHVibEFUUnQ2cEJrQk45NW50WFl6SDJUL1B6TVYrWWVpNTg1eHVUVDFZUy84MlY3ZW5OVlpyYTNWUzZPR0JnQyt5c0lWK1kzZUtYcjNBRS9BTzBzNzVsOVlZMHBTTEdxbFVCa2lvRFIveFZEcXQ1Ny9BM2FrKzFUZHVMdUc5YVdmU0F4cVhiNDdSbGpXcThZQ2JEQW0zWUJBR082K0hPUXA1bUhNZHBqRVl1MU40RDZOWEJQZ0l0b2xoQStvbWhjbW5SZEJSTndzZ211VW1mKzh5RkkySUVIbFliRzFaTVF6QjBMRGtOd0hrRTdUVzRmenUzQzB4aHpWM2IybDYxWkFuNkJtU0tlRmFLU01JR0tsa2VBOXg2NHE5K1hOZHZuNW9tWTJXcnd6MTlkY3kvdG1NZnc2MDNPS1Vyd2oxenE1VjkzQWs4NnlaUnFQRmxyUlljcUk1cFBHOGp6M1RiRFRWV0MydHYrOHFGcXNJSTdHaFp5cysrVDFMWFRQM3k0L3p5TGNhYlQ3TjdkQUUzZFR0aWJqTW96eWtWb0tlQUdZMnhxRzZzMktJZTdSSmFnM2tUT29NWmNEOGJuVkVKcVlGNFZySGE2TDdpVEpwa2JNWGMwVHFPR3pLblZHYURVMkkxb1dwelV3ZjVBTlZZTStnbXlFMDdnUk1NaDBXSXNaeVVVbWhodW5YV1pNbTVmKy9IYnZzMDhtREtyT3JjYTVhc0c1aURqN2FKYlk0MFhuT3NFWmNVcXdiRHYvbGZyRGJVZFdweVhxSGF0Y3hiWFRUVGdiZUo3OGVYRjVuM3p5TFpQRnZyT0RnbmhPQnAvdkhUYVdMV2hINlRkbjgzZlI3c3RFeS9YNXY3c3JRSzFYWHZGMk5hWVBSTnFScURCaTQwZi9uNnhRbCtMNVE3WVorNDNwa0VOOVR6QUNZbW9HdWNUeFNpT2N0WW9BM0poQlp5S1hWd2p1Y3ZCbzVHSFJxMWNpS09ML3N1Z1Q0Q0dobStndzdLOEVLeHp2U3ZQNHhCOVlKbVdVN0p5OCtJcFU2REVBMS82NFJQYzBJTlQ2M1N5TVpHd1B2MzhlUHM2NEM3RmNMYXh1MHFjNnE2dDBRNlZFQ2NFTEpjS1ZjMmd1Q0lJMnFsWjkrdS9uWjF3Y2xHQ05va3dESHhyNGVScVNIdlh6dTFPeWZwSC8vejc5aEJzeXpUMjk5YlZVNGRobDFpWWNSNUVtdkJOTkVsTkkxQWxvcTF6RVVKbEY2Uk5MTjB3RDg4TGZ2N3AwK0NiNE9iSmVxMlhOV3cxdTlvQW9OSXAvbUpYd3BLL3ptaDkzNVBnUVBaUmFOUk5KTlBwVWZ2T2ZlT05sZGhGQW8yZ3FBVzhWQ1FkbFdGMjczRFpENmFaTnlWbTZPN0ZsZkRhcnlpcnZFOG1mUTN5NUxwSGZSSEFDNGVKZEU4dXZNclRYYUdxWkRKT3JVODJzYUZ3akVYZkRwanpnbFU0Zy9kUU00SjZhMDRqei8xVUxjaitUZi9ORlRpTldYeXV2OUhVQXczQXZlQlNNSC9DRHV5elNIUjlNTGZRK0JXOHNFUXRFMkVGZ21GQXFKcGRYZmgvU3k4M1dPZXllNUxGaUhnS0VwSjNobC83V0JiNEYxcmw1T1d3WElQaktaQngxeG9YQzE4OXdkdngvaXp1RmRYanFDUEkxUFZGOENPSzk2ajRkTWRqa0JkS3JpdFNIVTduZ0ozZC8zZjd6L0oxazhFelQzenhTTkJhcGgrYjZ5MVRXMHJGcU1Lb2RjKzFTMUZIMHlMcURDQXZEcHZMZy9iVUVxdGZGZnA2cHhwdGxMK0tDRFRzQjExeDJKbDRvNEwxeXZLY205VXVNVllNY3Y2WlFja3U5V091dU9za3VyYis0Y1BwVlBudC8xNFpzYlNDZE9CZVVZNWdPM0FVZTYwU0x2dytCU3NhcGF5cmVFSjBwc1pmLzNXaE9mRkh6bzdvTit6enp2LzNsOGpNVnByc3k4d0VsV1pTcU82SVJNZHVYa1Q0OUlwV29LcUM2K3EwR3ZjUWsxSHNhbGtUd3hkc043NnZoSHJJdkFQMllSWFpMaU5MOHJIc1hmTEpsUzNNV3d0ekhjdkRjZzMrZm1ibTlUOXY1YkgzOWMzRGorekxqbDJmRVMxNlZ1dkx1b29KRFgwOFBqOUN6bWNXL3U1ZkI2dTR0Y2h4dXhSdlJ6eXhWdDhiSm9WYk91bVJVdFl4cnh4bkRNdzJFenZOeDM1M1RueU85NmREM3NXLzhsKzV6V2JKM3NLVjM4MlhMeXl3M0tXM1JmNFBvdlBrMjNNcVJjb3Z0eXZYeW41aU5jKzlHbmk4REN5V3NDOWlrakhOVGVTek1mZkZOZjdjd2NDdkVlZk5aTGU4Z2xobUZHNFBpYjRqdE5DUkVLdWJuekpWNDF1bW1ELzhGTVd6K0Z2dEdCZDNDMHB2SmQwNGN6UlRXYSs1aHhFWmRBOHhmRmM1cmpJdXhkQSt4NHo3TGN5OC8yQ0E2cERnR0g4RVBsbnByRHFzT3p2SWNiOFVaRlhxNW1OMXdkNVNMam40K2JQeHN2Y2FxSU5VUlJvL3pXMlRhOXBYamR2OWYzRmt1TldLem96d3FncXJ4U1VYYW1lUWFYcFN5TVlXVzZsN0JZb1pMRm5lSDdyMHdobTZvQ0ttN01pR0ZHYWZINmYyN3NLV2FYcGVVbDNSajFBb1dWTkdPR0Z3eFlkMGxKUUxJbi9ycXh0VE9tU3NKZDNCNTFoQm16cFJvUDJWYklWaFI5bXJSTFY5aFgzTnRvVFRGakVUV25CK25DazdsT1UydnM5U0xYWmVJaWtUcWZhSmFldndKRnhibERxdmQzdnI5RGRXNy8rNkpGQVByL3YwN3IyUTZqUWZUUWU2THpXUFBCamcrdWQvNFFoSHdkTnZVZmRLUHN0bXhadGlxcnk3S3lnYThZeHlzb2JWOUdxdHRqNEN0Z3RiT0d2aXZycU03b002eU9zbHQ1WlpoL2tzcXFod2ZBQnJVOUpFdHIzS2JGZlJGUDRjMlNtNFA1N2ZTdXFXVlI3Ti9YUlM1dWNHbnByeDVUdlFDZS84VW9SZVRxSE1qTEQ4WXIvdWFHNUhzbnV4NlJBWTkyZWJ4UGVMM1R6UktKV2U3M0R2czlIWThDd080T3Izdlk2Mm1ucGVicGJzOGRtczhVc1hFWW5vQ2NjZ1ZFajhQUVY1Q3JCS3JVTElJS2x1NDZlMmNCeUlPVzZ5WmJDclpoL1Q5MVE3NjZRZFRxY0pXYk9pbzZYMEorMUY5ZDNJR29PM1FrQjFVaElyTE50SlQxL2RmLzZ0ZDlQL245MDYrWEZja3BCd1BtT29UTzZIVStYR2NJakh3T3lMUkRIcVduRUMwdyt1ZkoxSktnZ3BFd2NqVVJqdUVhZmRiMHlmOUxJbG9VWE1DRHdMOFZMbkZZQzhUVTdxVlYraXJScnkveFdTK05MZDAxUnlCQ1VUR3Y5MmI1WFYxSlpQNS9OVHZnSFVkMVI3ZkQyNFdmRGlDcE0yM20xM054Sm1LeDl1a3JybGhGN3pDNlpydDgrMXJmdGUyNFZlNGk5SGEwYU5VSit4WExCL1dmWmZFcnlwY3RYN0hpSHo5bDVOTG1CSjdBVEhFOGZ2SXdkanZHZDMrQ1lBamFUa2tsMy96M3dCVmo4dk1tenZEQVZiYXNBZ0tHMU9mQWpJbUoyV0VQWnNGTTJJWmI1TGRzU0wrN0JNejV3cnZONlJxeFNGVEQvK1c3QWlEL1R2T0lXSnI5azh0NTVYaCsxYVgyVTZxbmx4TXpHMmFRY0x2ekdYYWZ0MG9PY0ZXdkVWMlpxUXJCdERVTzRETEt2RDhmSmlVdlArZnRoQWZraWdHUWlsTkFqdEJVWXFYNC82ZUZrcyt1QzBYSHpxZEtXMDd5TmtKVHpudTIrL1JHNkRIZ2VsYWJtM3o5YlVkNVh6cTQydGpaWTlwU1h4a3NkLzdtbHN0bUh2RytPNlhVZTJJQk16bFN6OFZ4VDhVRmtoMmVReUorM3RmL0cySkNsZUhzYnpQOTBCYlJuQ2F1OUFtdWM2WlBHQ1JYcEhQRGxOYzlTbVl6MVBLUW4xeWViaDJodk1wUXRmYkl3cnBxTkxURzFObGwyaHh2c0czcWFWOUxiYXc1K2RiR2F2UXBOMXNIT3l1MndKTGY1VksrVU9ucEhUMm9veHY0cU1vZFZXZ0pIN0JOZ1pIZU92dGZkL3N0S0lOcmNuVlN6TnhDdXBQUWtBUDM0eXNUblFObXQ3VmJaYSszVU5wWWdqNVpIakJza0tLMFFRdHR6eGRYWHB4OGRjT0RydEp2QjNZdFgzOUc2ZjFUWlkvYlZmWkUvb2lKN3NVRExsdDl0L0taRGMxNXIvZGtldU1iNHVDdVY0OVpFUXlrbjJSWU10bTlSUU4vbDNXR0FCWGtGTDZJb0hmOG42ZHZBa2hHTHloN2JlZ3ZoYzRVU0NvSWNQbmVxYWVYWHZnZ3dBZWR3dDJ3STY0NURYbksxMjFIaFlCeWpWSzA2Tks0LzQ4YUx2b1hVeTJ0NFNwZS9rVjJ6L1RZV3FxajNiQTJHakdzN1dqYm83SFlPbXJXb0NVU1BiTjJ1Q1ZSc1crRVNEWHJSdngrY2lTWkd0WDRmYjVSS3FVZDlubnRWQnArOUl4MFluRUpiVVVhS1dWTkhjWFVLOHkxblpSN2lvOURMUHlmUFN5WFRDVngxNzRucWxsNDlva2IzYXdJTEtodVBhTFdQWFhOdXp1OTJ1SEVPYUo0K2VqNXZhK05xRjVEeG1RMEtIdHl4am5qMDZwNUI5YTk0ZjNhcDZvL01WVWF2ZjB6V1BKQTdoSjhLWWVjNWVXVEF2aE02a1ZKOHNVemlJRE12S1hVYjVCK0pKVzV0OUpSbWZRb1RoK3RabjE0b29wMXRMR3RlR1o3VTlPMG1jNWx5ZFdiQXpZWGJkeDJwK3BPL0M4elNRVkdqTy9CM3RsRDdPODgzRmsyTnFWV0hwcHBXcG5FazFuL21wWm9WNmFKZEpIbU83TzlRVkpTdjBodGE3Q1U0SnR5Y2JndC9tbERyZjRVWjhFUGdLVWcvQ2NJL2dHREpmV043RWtlK3dTYjlUdVhOMWttM0NCZUM3STVudDRDb0RBbG1pNFExRE44UVhkdkFWZzQyMDd4OWZmQklyaW8vcnMvSzF4YVY2UnM5eHM3WHprb1NDM2pReW1Cb0FuYzBmTUdwQmhocHJQZXR2eDlycmRYc3ptZTRRS2dzSjhZUHIwYWFidW5xZ0F4TVFUUUR2K05QY3d4ajJPeU02ZHUvM2ZubWovR3YxMWtQUUlCZk5CY0N3S1R3M1VnUzV3RnJBQWRSeFZ3UmdXOHFRSXVoMXRIS2xPa3I5cll5MThmYW93aVcyc2c2N1lHTDFqSlpNSlV3b2NxNFR1VnlCMi83UUtLN1hRYm9QR3dCcUxXUUQ3V1FMN1hRSDZ6WVEwSUkzN282KzJnYUFINzEyM2QzN2MvUERkY0swSUFoL3ViRVhLM0NXd0hwMkV5UE95Ykg5clltZjBCMlBzaEFQTXNTSFptY2V2NEZzZnV4ZjM5eGYyelYvLzdENHNYa2JnWmh0bDhxd1lPcUlFSDFHQ2YrOEVmTDlOcU01K0d6VmYybjIvK01FZTBtVWV0WmNCZS9TSG9ja1ljY0o3NEJyeDZkUmdBb0QwNEIwNzBxY2hvellMa1dvYjY1YTV2OG1lV0ptb21BR3B3bVBJZlFCZ1c1TzhXYWpBSHZvMWR2L3lpNDhiN2Jmd1RQWjNzeEFHdi9hZW9ZUUFndmw5S0V3RHM2UjY0MGZ2MXdiSHhTOUgrVDk4OXJTck5icTNuTkwxZkhsd0ErRVJET0lBZmgxemt3UlZIV2d1UFRtRWZXSy8vM1h0TjcwY2V6cVhiUkgvL3M2RDNiMytRc3p6c2xOSms3N2Q5R3hsc1RDSHB4ekk4dSsvVDc3ODRRdFc4c29IM1ErakpCSENSOGtyNFJ5QStmNnVETXo0TWNqWVA5N1NodjlIQ25wOEtmM2lHVWd2YmcvZER1TkR4U2FJQUtNVC8yMWNaOEtEOERMM3h1VGhGY1cyaTRwOVY3aFhMVzBCVkgxeUhsNHQ3UEwyL2xRdW91emhYNzRyd2h2MGFrYktucDg5N1BOTzdGSHpqb2l1V2xGTmVzK1Avc0JiUC8yS25IZHo4dW12clBaU3hGYkxpd1Z4eURVb3hwUmszbCsvOHpNZVBoNVIxR0FjQTdzclYrNC9wQW1KWDI1VnNpNGd2QXdxeFdEVGFFRkp1eURRMkVjbldYcWxLb3BLcHVhblJBRFRBaFpPMDdYWmJLamtibG5XcDdSM1lhQU5UUGI0cEdUZHp1VU9xZFkxV2llOG1EM2pvY1QwNlV5d1FBVWxBMjBZQm9LSmxYUkFKRE1sTmtNWjd5U290WkVRalFJL0VVY2xXbGRXT1hWUm1DbGVPZ3JZV1ZJMUJMN21iKzcyZTBkTnJzTDBDNGRaczNvRUtoYXh1TnNuQkViRnhNa1NFUisrWmpMWkhZaEpWVjNteG95VlJhVVQwcWpvdnJlZ2NWZFJzWGprbWFGRnRFZUpsamVRRlZRcG1VMDRRY2JDSGpBejFpVUlhd3ZsT1hrTzZMUjZrWGVvbVhNb2paUk5WM2ZxcXgzN0hoN2ZVZWdEVkMxK1pxRXdscTY2M3pjeTkzcTU3NCtxdUFyMHR0QlVxZitKdGpGaXBjMEJhK3lsNWE4Y203WXpOcktOQStJUUZPM3BmMWZyVmJlMURTcGhOV1J0b0hlSk5oZnNYUmVleHF2c0ZxU2ZVNzU2RTFpeXJzbkJaV3hwWWFHWW1JUkt2V1M3ejdPZy83aTRnZG00SkRhUmNtaGpySzFNNk4vUmFjbU9KaEdobDlZMDRIS3hralovY0d2S0NuQXJ0ZHV3SWRLMUlSaWhXdHN2b2I1SFlXVmFoQ0w1N2laWlM5U1VxK0RUSDg5MXVBSWp5bFZlbk5hMXRTaUdiSFNuMnpYbG5wOHVxZDducW1QbW5Dd1hteDIxWDh1UEh4emdmRUl0RXk1OXR0OSt1djdMWGRsUG95NWw2NzFsNE1BSjFvNVdvS0lGMkYrNlhaMVR0NjJMTjVndXhXV1dsRXRNa3hQZmR2TnhGcllnUjEyMVJsMnZhc29EOGVnNjNzRjR0UTdsUWVHeGJQZUxNQ1RpcXIxd0RMK3ZTSmZWMis2TVhmVzljRU1QSzBMLzg3a0VpOFkycmI5VkR0K1A5R3lMdjVjQldKMW91N2NLZEV4V2VyOGpQNHd2RFNzK3o2QnVQYUdLT0wvQ21saVNhNGJ5aUx1ZyttUkJSUmZCQU43R1NaMDJDNFhIOGVwZFdyL0NCOGdiVVpVcGVTczV4TlFESU9ZVkExRW1JZWlLWFdLWlJBMVZHVENUeG9tT29nT2pRRGNmWCt6MXJsT3loblV3dEVQWmlRRFNsU1EwWEhPVjVzaTllNlozcTY5Qm50QzIrNnZQb1B2Qys0KzBWYlR0NC8xLzh3WEl4RzQ2bUU0d24wSGkzL1hBUXBpTGdBRlpnMExqNUtIKzFYQnJIUW5waFRaMHYrM09qSXArNmIwZ3M2dW9TRTdxVndqdTN0ZWg5SjlCT1hjL0N3RHkvL2FVbUZxbEZMTW1INWxVMVI5aFJVdzRTYUkzMHFGSFdBbm1tU2xxbythdHVHNFhzc1MxNXpmMVNzeWw1YlozYjRwRlg4N2F5QWNkbWNaK3pvZWh6em9YRWRhUVNaa29vTHZtVjRMbXp1eDZ2RXdXN1JWQ0V0V3QzZEFVSzNmRmlaMWFkaTZWT1FYY2g2bXpHenoyaHpqZk1LUXFUamlqMnUyYXBqaVRQcmFSR0o3N2FOalRwY2Q2Z1BKQldBUDlYdGFwY1dQOXgrakw4amRQUHphL3dxaU51ZkRBdzYzYlhLa2xybXNBZStRVThKZnlmQTJ2cUYrUlAzWW4xM2VoaDUrdTVIcmJNUklZdzlQTHRvWDh3T1lHMWtYZUM0ZWE5WjAyTTNhTWF1bno5Y255YXZYcjdMRVFQSHErcXBoaUpIeTBKZ0pnQXlzem9tejNUbGxZQkNkYkl2Uk9jVWVMZ05aTHRMT3BGcHJYMDRXS09nVjVBbGl3OWV4MmJNMndmblkrbk52TVYvaXZ1L2hPenhGSFZibEpEV2FOSjZTUmx1Vkc5c1ZxMHhyVkVYVGZVS0J1TXE2Z1BRWGRVczFJeVZ0U3dKV3h2aGQraW5YUTlJQzVLaHhITE10NGZuSm9zdXRZTXRxWEFMQnZuUUZRQm1IT1dkbFZyK0RUUHhsSWdkMkdNcThsaFA0OFJEWE91RVFNWmk4OStZaWNTa3RnSklMbm1MaDRPaDBPMGVNcXpkbzlieW9md21PMzd1aFBySklkY0w3MnNFNXg4enFpb1ZZbWt4VkZGYTUvYmxhbzNBS2doL2tFT0FtUHV4NWJETk9RcTFiSUt3VW1KaGlZSEMzQ2NtWkx2a1dGVmtRNVplam5FOWNCL3NDSWk0bFUwa1k2ZXRSVU5hWHVvUUx5dEowTm95Mm9NQ2dyTGlKQ2RRUjNEQk9mK3l4VUNqdkxmUUZiRWVhL1RsNzJTdU5PdXBsVCtuQnRhV2dybHl6TmNST3hzYlgvVEZkSnkvMmd4UGEzb1UyR3BZYkNoTDJ2NUgyYXlJTldOUUwvem1LellxVUNzclYyYXNyZVhSTDcvY2w0YVQ2N1NNVEF4RWZKTHdoT2hOaFhPSnUvcDB3Ti92Q1ZNcUN6eE9qZk41ZUxSTE9DS0ljK01yMXhlNmZBd2JGc1c0TDRjMjdtK2F0b0FkQVRicGwvTjNSSmdiQjBuZk0yNkxmdUtrUFJzRFNFQTBWTVRqZERYWTdKNGY3OCtZRi9QNCtzaFYraGNsWlRHZnlQVG05MHVWS1BSY0JodXRLNUNLV1llOXBnYThjdUNxUmpoY01vNXhOaDRRY1k2SlIzYWs1WTQxbTVTUkI0V0ZGVXRzaXFBVWpVU01CWjY3UGNNSWRCTWEyaWNGSjdVN2oxV3NmMU9heUdjcXpFekMzaUFXVWE1Q2pXYWMzaXYwN0NTSlJJbUdGUGJpZDNPcjVXQ3dMZjIrNEoyTHNiVTJVRmhWU3dUckZxRHpJYzRDbUJOakpEV2xWYlRhRFFhNG1Za1hwZHNreUozZFRVZVQxeEd0bFRJSnVGTU9HbmhPbEhLa2hORUdoSno5QmwrakFsRE1Db0RRbXFaekJXeVVWU0lQSFZjNjJRRFpnOVBITndGWlRERWtJa2xtZ1FpWUxCUWtENEhZOVZvckt0YUFvU0xLQUZwTmNaVVNobXdJTzJzbFJXVE5qV21WbEI4ZjRSUnZ1RmV4d29xUTFaa0JhdmpodUppM2dvZHlmREpLd0x6QUZEdm9oYVdoRFJpSjkyalRvd245MzZ0dXdUaTNKbFlsTXR3T0N5dDE1dkYxYUJsQW1aQTgyb3RPZElHQ3gwV1FKb094Ni8zWTFuWm9mZm5sRGxvM2IvSDlyMFNJRExtd1lPdUpjOWRhZjJ0V1JLQUxhM0RWOXBCR0x0bWJ2YTNwQzRhSjYwUjZYcWJHYTdSKy9lVC9kNVFxbitvOG9kWTlXQytwdXlWMDFoaUNId2NvMjRVcFZGMUhSMFNtdjE0SWNxVXNOQmpwWXJhWG9wQkY1SmFoNmNxT2svSmFGWG1wOGxrMEphTWdoQ2tGQnZRRFB6ckZwUXVBT0lzYVkydjkyWXdwMTBnTkZFcGNyZGg3dGFlTUxSdFRNa3hHeVV4U1ZWZ0ZTbVhaYU5Qc3hzWStJWnA4SkdreHBPYkFGOU5kMGFXMFBQd25ycjhIakNiQkN0N3BjcmROeStIMjhtNlErcFhqNDgrVU1IS0MyRk5qMlEzZWYrM2FScUh1UkQrbWIvNVNlZnc5NE1hTUxDZkdWWlpDU2Y2UzQrSmUvUGhCK1NtSzFKZk9EVTZFMVpVcTVNdDZ2V2M5emFPVTlWbGtndnE1SXpoZVhxTGhZM3A5ZE1QNzVvLy9jWGhMR2VmSGV6YUs4OHpKVjFmOC81NWk2cjY5ZVFmWlhEMzFsNzRwT2JqZXJQWmZSazNjNGZ4L0xVeGVZZ3RiTTd1dy8xcW9lOXpiWW5wK1R5TUI3ZFcwOS9CZHl6S2JxdGVLSGtzR2x5UVVGYkt4ZDdOTmR4ZEVrWkFBQkE4aWxNUEd6dlJTZ0dCRUR6WU1Ybm5VRnpSVEhVU2dOWjdWVVQ2a2VBZTI1cHFmOVFYMWY4NHNXRGlJOVBIRWJVNFpXdExZTFBFVDZWMFFObTllbDlpMExROUhlOTRRdkNsdW5JRUdpUmNSbXBQbVpRcERRbm1GNmtoQUFQeHZ4OS8zMy8vOThMSC8xdFNOS0lmQU1CYSt3OFo1QUY4UEcvOXM2SW4rZTVzRGdHZ1lBQUFFTUMvSDhnanQ2dnIvMGE5VTc3WFgwQm9LQlZDZW83ZzNZU050NnZWUTZXZDRuL3dsZXE5UWxaTlptMUl6eS8yeXVjTC9Bb0lSeTREcGZ1TVEzMndKTXJQNkNMUFVEZmg2dWVCbGxyaFJmQWI4SU41VzVlU1ZjYXBPK3JhUGkreGJ6cmZYYXpvN09kOC83TFkxUTZnLzU2bDBwZVpCQXFvL3I0dDRGOHkzK2hpQ0dlNG5rQWowK1hXVWdrdS9teWNmVjJ2eEUwWkR2cTdUK2FVdGhPVXpWZjlPSkFWV0FtQXJ5NXZ3RDRuelNPZmVZMmRwVXR0MithQWZaNnFkME5sTHNjNCs0azRKV0Z2ZjlRVHF2dEdMZVJqWmhPQzl4WjUxY0wzc0lEOVE1VWpaZHV4MndXcWtLcHRGR1VJTFpsSEx3clpJVDdGVUpjaXBCRDhmS0U5dSs4LzRpMFg4dHZidk9ZRTNCQ1BqYkhsSGp0bUl0a3h2aXNpMm9FdWZKeTBJUVlOekQyNm84K0swYkZzbDR2WS91SUpRSFlvZU44K1dRUTZkd0pQUzFpSndrK3oyRlMycHllNnJjMHRiVDNCODFMZmgyUzdoaGZVbXJGeUxxMEVvbWlJYjUzK1lLVmU3NUxNZEF3RGtKc0NjLzBTQ3NUc3hVK1lXbS9LZXVmSytXamNzRjdaWkZ6YmhURWozcG41eXhVdEQ1VldEc3N1ZUN0aWMvQzJNZGZJNTd6STlyMlFIdU5TZkwyOEp5bHo1ZGs3RW5JUlAwdnRYd3h2TzJEck12YXJ4R0pFcTVYWExMK0xGOVJ4d2VsSWRoTngwYlRIdEpvUlBSS1VUaW55bFpJRTRFOVhuYVVUUURnb3hCMk1BcEFuU2tOSzVKN3U0U3ZCdG5PL3NtZS8zdDAwQXViSi9NSGZSK2s4WkVjRnlnTUFCTkNRZnJRMkZJd0R0VHNCK2g4Y2c4TUJDSXpEb1NZSEFKYkJ0d2JFM1hzYzY5Mi9OT0RVcmpZbEdrZzdGOUpBa1U3WElLQllXNE1EM3A3ZHo5SE1NcnNDQXJBcjcwSStmb2FjM1ZlUThMWDVSSUoyUmozTUd0VnJZQ1ZHMHRBNktOV3dvZHJlT3BWYS9ualhVNnlIV0p4WnV5Yko2dTZnVTRkNHcxN2F6RUpNb1Y4cjR3RCt5a3Jrb0VaOTFGWnE1SEx4OWlYb0F3OCtIREFJTTJwcVdYRHd6b2ZYUE53YnNnMmZSKzlrNnlLRmdMc0hKa1g4UXBmbWpWY2RZbUZTZ054ZXIyT1pZZ29FRFpLQjlYMW1zbVJLRW5scklEUU5RUGxBVURZdWxTZkdXTWN4ZUllZmVxTUk2dkJDMWF4dzQ5NXZJYmZ3QldId3hWVXZVSXlXanRUd1cxVGcrY1pURGIxOWphcnArZlZWRWdwNWZYN3M0MEs4TmpucXJqbjB0WTIxRmRNYjdZb3BpVTF4VldLVlB5YXh5S2NrNWxSTmlHMkViUnZnVWlrb1RnOTFTWFNnYkJKY2JTMHdhNlFCcGlScW1VMUlwYW9rS2k1V01aR05pcnBHU3VHVVJDWlFwVFdxaEsrS2VhcUlxd281OFFLYVA1WGgwZEZXa2FseGNGdlkvUFczUXJyNnc5ZGMxM2FsSm0yN3JpdnQybHdWaFY1RklscGtwYW9CRVZaNVlWYXhFRlhhQk5hL3RwamZ4ZFplenV0dytEYytJUC9KLzR5eTROemdyZ2JJd1gwRUdiVkNaYVd3bHJTU2NqNk8vRTArSUJGaDBkMGkrNDV2MzdkbU5aWEs5VFh3R3Y4TWZQYmV0Q3g2WEwrQXBDbERXL0hqTmlLKzd2cnExU3M0MjEyOGJiRy9NdmlNYzVHbzVKYzNLbWRkWjI4bzdFVTdWckNHQlBaNE50TDg5L3RsWEYwYklZbU5Jd0JCQVE9PSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlF1aWNrc2FuZDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREkwQUJBQUFBQUFkWEFBQURIVEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2x3Ym5GWWNoekFHWUQ5VFZFRlVIQUNGQUJFSUNvR3FJSUdHVmd1RUtBQUJOZ0lrQTRoTUJDQUZoVUlISUF3SEcycGdSUWRpMkRnQWFQQVpGa1d3Y1FBRm0rOFRSZGttblVqMi95bEJtekdoZGVoYlpTRjBSN3VvN2hrWkNaR1Q2aG5wb2JaVFd4eTZjT0RoMEVnLzlvMEZSK0hBOHMzSjFiM3R3NTlYb3pnY0NOd2pabXR0d0NWeFg0aExvcEVrVGFSWHQwWklZMkl0NGpmOTJYc0N2TVJMVXdqMlFvMElraGN4S2tZcTVpUXRjZm5pbXJwWjBqcUh0R25nSmJsL3REcXppaXFkcXdBem9RMFRMeDg2TXpwWDV0STVUL3p2OTY5NzVyNEFvb3NSQkRKZkJibWtXZ3NJdG9xTmJHMlhKOUNrZW9iSGJmM3pCQm1vR0ExSTVhZ3hHTzFHVGFvTkVGVE02N0l1b245Rlh2emYraXVpd1FFSy9XL2FobWlieitWZEViVlZSNFlOK1BkL2pjekNUTzdMbndXZ0lxRmw1UUFsMjFZQjJwNUtKRmxMNkpmN1plQnpmdTRjRkozcStBT0M4UVY2NnpvYld3WWhXd0QvVjVzbXZFWG96RW1FVFd2dEtHMlRQRzNoV2NwUW05blFPdlI4SkZJVmdaQmQybWJGYytJMWZZWHZ3TlFrWml2cXlQMGU5Mzg2eTFiYTlkM3pCcUdMcXdBWDNYcHpiVEg2K3RiWHpHZ2tBMnVKZlF5ZWxmV2VKU3ZnQzBKRlVGMWF4TmRUVTJIVHBTajdsSmwvbmVtcTcrOXZTTWsvNkphZEdzc3FyZ0dlZXRuYU5WUEw0eitkN3F4L3NneG5GMlQ1ZWdIU1VXeVg3QUREVk1LeG94ejBCY2h1WHhpMkFzQ2F0VFB5dmdPT05UT2JyT1NjY0d1Q1FsemhFYktCL3ZydHoxaXJIOGhzWm5hNzluSW5oeTB5UkVMQ0p5TGdXZjg2LzNBZ1REQUFBTHBqTkVnM0pOTlFaTGhzWkxveXBGdzFwazRkY3RoaDVLaWp5QWtuRU1JQlFwK3VKL2lsa2hpcHVDUEhlZytHOWxwRm9RL2EreE9LYzZIRkF4QjJ6cnAzb3pBWGFpQnV4Vk04Vm1Da1dtVjd0dDgzVXFsNmk2eHd5YXN3Q3BWOStjelU1T2Zqck1ySC9CMWJkc1NaSzdtU1cvYS90Q212S29KRWloWWpWaUtQUHJ5bUtWRGtQLzlyTU1Nc2N5MncwRkxMckxQUkRudGRjeDB6S3pNL0U2aUFwQ2o2TC9rL2FLQTNBMjhPeVZ4YUM0T2xUNWFkdVBNUFdmWkIwdkJrUnRuY1lBR2RoU3VXYmxvMjUxclQ5ZUNPQ0tMZ2ZiWUdrcUJKNlZReWE0S1RHSUhVZzVmaHFSU1lFak1IUnhJSEkrbEozRlR6dE4wcFdoN0REREZQcHRvcHVONDRKL0FJa2cxU2VPcGNpOWhQMFJUUUVpV093enhOMDBaSFUrVXBTMUdGOEJZUEVEM0FCTEYxbnFMRmZBdFNJZHM0dFpRckVKQ3o5VEt0WjJUTVVWaGF4SE9MVzNpWVN0MHBvRWNZZ29TeDQ3VkRxY3loa2drRlBZSGR2TVN4OVY5K3Q3Nk5MWnFEQjJtOVlZaG10bXY0ejBsNzFhRFgvaGN6T3dRdXhxNmsxbFVDN25tbnRHL1AzU3p6S0dRL2Z3UlVEL2NPTVFpRElwVGdqeHZ2Yi9QYndFOXNsQTZpakxJVHhia0dscDJtWGhmVTFPNUEveUhlYWJSV0l6SWRXaldaMlcwOThTM05KbXhJVXhEMEpTMklRcWg3L0RMT1ZGVVk5SS8wNzFkcUpGeTRnTjlTTnlQc0Fxa2xKR1hQYWZlTSt4YkY1cUlZYy9JQUJ4bWxtNEJjQitvUE9SejE5Q00yb3VoMm9HdEVOTjJBSkZyQ1Z6TzROb0QzZXhXU0VLRzRzak1EdE9WSlNnWUxWM29TYUxZZWU2T3JFNTlKV3RJN1hxNkZNTkI2cEJhRHptU0c3eDlQL25jb0FRQzBZTzY1QVYvOFZxUjVwQzdPMEtKUlNUaVhNSGVhanp2cThmRDZURWF0ZFNlRWRDeUp5T1A3SFMwSE5zY2puNEVVSDdJVnY1QjlOY0h0NlErUXhyNU5nSmxFWXBCYmw3aVdGVGcyU3ZzdE5McGsxd2QwRU9CL0hLT1A1MW9Ba0tIYmswY3hnYVVTbUVkenZ2UkVYZlhuVUVxeHFHZ2R4LzFwVUJuNnlTVWJpTDhia0lsQ3BPQzJIRi9ZMHg1cXB4VEw2TG1sVVBiRk9KTWpZUURlWUpJY1lBaHRLVnFmckZLSW5nbWpPSTVleCtXYlNVQXJDR053aElEaWFLUFFWMTJlemFkQTA0Q0hHODVMWW1oMmdpTUVvaGd1RkNFN1d0MlJucFpPUDBMQW16akpOSk1sMUZxUTJ3ZmJVQkpiOCtnZGZpU0dTVzFnQzF0WjB6N1FWUWRkb1RTeXNqU2Viem9sZnlvaFN0Z2dCZWVMQ0hPRGZNeW8yQk9TOGExMmhpZHIzWVVoUkRWWFRBSXhFNnh3bXMwREVnMU1SRkhBR3RHWkpMRTZDdEJabDVKMkE3dWxUUDIwTWpRWHUrRkdjUmhqQ29WWHRvd1ppdGhlQWlnYmxuT1pJUmdEQ2dZS2VqakJRb1E2aFJoMkxJYXJHV0I3eitZaXRLQXVxRU1BbDlRRElnSGM5UnNZaVV6QU5nTXNaR0xMb1VheGFra1ZyZkRveksyMTBaYkswNFpwaTZDRUJWb3NNT0FBVVZnUWl3VjJITWpCRHVLVWdKT0lneVhoRU1uc1VDbFNhYVN4dzZUcmlPbU1SVjI0V1NHL0FyMW9iOExOOU1GYWZiRm9xTnJjY0NOeTRraWpxSXdCSmxOd0JDOG1XVmdsRyt0TVordjU1T01WNEVpRjJLQ0liVlNzbEZvWk5wbUZ3ODJYV3N3b0M1NktEK3FVcm9JekttbnU0R0FaZUpaL0VBQk00UVdRUnBGcWhvVllDUWZQZHBPaEhHYVd1eDRldUZpSG51NDAwcG8xTjdDWFZNbmZLalIyWWRGaXNjV3FGcXVCZE52QWE5ZHk4dEVUUCs3MTNMd2NEUHh2RGQwYXcrOW5leWZnZC9ZMzhDRUw1c0ppV0FuciszMy93WktjUW53S2pyWGlNQUJwRHVDb2FVaWtHSVNoQ0FFRnlFRVY1SmVsRmNIQnA5TG5lL2UvYTdiTUV3OEtwUDZaWlZtVlI4UzVvYkFtVlpKV09NNXkwajhCQUJRWVFUVW1ReWFaR0VUMXg5SERDVWtNRzJNMkhFT2h1WDVIalR1QnBTcEFLd2lYT21zcUJxREFYelFVSXdaK2ZPQkh2Z1poWWhQRzMvalZ5SXZKT0RkQklDMGpLNXNLbk43NnFVeHNJNVJqdEFwaXZ3Y21lQVFLOUZZS0dzRVN0Q1FRb2c3Nkc0WmVtcVRKVEFSVzFEOHlCVklRQlZNSWhhWnUvVkg3aFNPQlJGS1JtalFrU2JrZ1FIb2lyWXpoS0ZYWDdMSUpvTEM1YWFuaTB4Z1dMZ1JnVGdsa3JPYTFXTUp3blE5WHpsY2ZtQURzaFE0SDlFb2VueTVTb3JIcldnOXRzMHBJN3YvM3NFZXdBYXpydUMrR0NQQ2Z4cmtUOUNZQTlDOWJBNUJ4U0tLM2R4MEFZSS9leWlxbXRCdUFvMHRjTnVicjgwd2w0K200TVBqOW1LYVdQL0ZKMXRsdFBkVXpPNEcvaEw5V2pwVE5zbFZ1SXlmSTZYSlh1VmllRXdxdDRkYm1majhBQ0NKelNmZG40cE1vNDNLc2tYV3lzUVZwakQ5U3dtMEY5QVBBdndPQU54MnV2Y2IyQzl1QUM5K0VDODk0enpxZkdhUDdLT2Jocm5NN3oyMEJBWUJFUUg4bmdON0s5M1oxZXVWek5QcW43VFBISXZNY2RkVjFpNjJ6M245T21XV1QrWmFhYVlrTHpqbHZnV3VJaGlSUXNHYTBtb3RnWUdSaVpoRWxXcXc0ZGc1T2laSWtTNUZtamYrdDlRQUhva0o2Yi8zZ2JqTDExa2RmT2JRM2dCaDY2bXU5c3Y2M1R1ZFRvRkNSWW1WV3VXZTFTL2FiNjdEampqamh2cHNSY1V1TkxTN2I3SGJVdU91aTMvMFJEbGZjMEJBZXY2bTExVC8rOXErRkJBeEhoU2RTQ3hBdVJLZ3drVnJRMFFzaWE4MnFwYlphT2FPTkJDN3hGS2xpVE5OZUJyZU8ydW1nazY1NjZhNkhub1lZWUtCQlBFYWJZS3h4SmhudnJJbnk1Y2lWcDhSVXBXd21SMDJFalRiWWFaY2RDQTIvRUFCb0RRQnNQOUJ5UUw4Rk1QOEE4SjhETndjQUFEWjJGYnlFaE9NVUxDV3FvcGhJaUZGR1A2L0pTYmJubkpnVXhWMUR6TFFBaENKSXVFYkJvM2d5YVNVSlJTTmRFTEhTSHRJTTNISEdzU054ZmV3RW5jZnI2Y0NnTVdsN2phYUowMGV4UXRRUjlpaUc0Q1V3OGdTaUpubndTYjJyc0FpcFJFbG54Q1lNczZjU3lJK2UyUng2RXFiK0NyR0VIbU9vTkFPRnBKU3lObEFUaEhUTlBvQjlIUU9yeDRqNVhrek9nNFFPQ1dtY1BqUnhUQzNVOFlQb3VVVTdYN3pNdnJraVdvN2RKc1puUVFBRTdubjEvdDVmWjJSRVFtbzB3ZWl1dkprTGxnK3dST2tzNXhTOE04V0xsVG9FeEtSSnVONVpsdWM5VnhtR3AzWG9oU0ZaZzYwMmgwUHBmUWpnSEhMZFU5ZFlHWkdVakY4eEdQYWZwQ2lOQnE5VjZpMDZUMDRZWXA0b0sxNG9jM2VsckNpVkVZRGMvai95UVNuUE90YUpuekhCYWFoY0EwQ2ZBQ3E4Uzc1WnRBazBwVG5LTkF1dU1RV1FiRml2dG5QVXhuTUxRT3UyZkVtTmIxWnE1NUlNYzVRWnRtcDhWeWxSK0ZCWW95bFhwWDdWQkRBbWRtSXRIVjJGUnd4cTNmNHpKb3g0dDNLWmZwc2p5OHUvVldiVWc3WjFSOU1ncGJqSjR0bTRXQURNUWs0NXdEU2tVUmd0eUVtdzJNS1JUV0RGWmROL0ZHYVJmWkhiYTdPTFlPL3VUNGlIQjRxTWNxdEg3S1Z2MGJxd09aRi90ZVkrRFE0b0hVUVloUTRPVlFvYlRXTjFTN0RCOFBYYyt6dXg2T1EzeE8xRmRtRXFBL3Z5aUszdHVhSFNSYVc0ME9ZMDhaVkFQVFdNWHdLNFpFT3hCaEM4ZlR3YXNHaHhLU3Q3eVFsQm9UNTBvcngra05xb21HK3FJTTE0VHlYVmhTSUQxMHVFSTJDY3VGT3E1NENjUXZOengvcGNmOEdvZE5ZL1MzeG1hVit6Slpzdzc5aWxlOUYvVThyaFBWQzRtUWxjTURyYm9EWVM2Q05iNEFLd3hwK1JFRlZTMVRJNlVNWnc0d1lXUU5QUVc1dE5UbkZQZE5ndzBGTStkcWdIZzgyNko4c2lWaTN1blE0VGxzaTlnYjdHNDVtV0xuZC9EeisvUm5hOFJMRWU1OW1xcHI3U2hvcXRWd1NJdmZtR2RWMnY4eXBxalU3djVqNm5yUDExMXBnc2lMeE5qZTFXSEI4Yk1qcFdKODFkdFMycGFud1Rnd25OMjMzV3F3NGJESlNaR2xCSlRTRGxIZU1ZWlhadE85ZnVsV00vZTBETjNaek5GYnpmL2RzMnVYSUxLZ3hka3dOOVdFVFp1N2xzNXJrd3dSS3d5VnVWMkZNMmVhbGZHVmFoM0xVMHI1MXRXZk01V0ZIQ0ovV01ZWVVqaFd5K2NFbzhleVdCTVhFeldDVkxreWJZamoxdnJWSmRuT1JYZXhzcmdVRExxYmFoMm9pRDg1N0VTR0xhdnRrVExKUmZtTldFOGVhRzI5MFdtNUlzWGk1VGg3V3dsTzhjM0xTbjNldWk3V1I1SDh4RFkxMkxDYkN5RXhWKzZ4NGYzdFF3VURHcjNodGxPZkFHNjMxOHhrcnptc2picXdZdEVWU1c4dlI5S0xlaFo3b0ozb2thNWpXTFZuOXBXcWNybUQyVnZHT2FKOGVuK0tpT2RVYmtQWEpRZlc1eFpiN1cyUmVEdE9KVGEwTmJOend0UkpQQVo5UnRxU2F4MHFHbExrOTJndjFEWDVPVVErKzNZNnUwVUszUFB5RFJjOGVJbG1rU2NFWnAwd1MydzZ3Y0szK0txbkozNHllTmFidkY1L1J5RFIwajc4SHc4NUhtekdWT1MwV0lnOUpBZWxnTzQ5d05rdEk3aEEwVzlrd0p1ajlDRWwyR2FCTDVxa0pYSm1nc3NTNmFnTlZ2N29vR2lBZ3hhbCszcXdUWGZUaWxyQ21sVmxvOFkwTE0yRC9BTmhmdWlTSnJOWFZzQngwV3RQYmtWa3ZOYUhsa3dnQTFjT1F0SXl5RVVnME9ISGx6ZDkxUVczcmwzVzAvczNkd25mWUswZ0NPV3p3UHRJQ0hWbk5YN2VCZ1JuUmNHUVNyaml1YzF3bndxV1VsMTZ2Ulo5VmhYU2VNSVMwa2ZKQzcyOGtQay9yMkRFZFRQSTkwR0tBSm10dVJnMHBqSGFFNVMvbG15N0hRQ1kzZ0Jxa2Jia3BEaXQ3S01QcDlMa1FRU1ovUDVJcUR3UkNlUFJ6N2QzNjBPZ2FGVGpzZU41L0RPOG1hNGxDeGw1MVdjcE84VG55ZHVGbG1maGZ6Vm10NmVjaDhMZW04bitnUUtLS2hndzJFWCtwL0Rlc2k5R0FSVmdLOWtUbE9MVGtRSWFyWE1iSlp0YUVEMDZiNWJkSTRhSitFVFgrQWlRNUpkdHVjUTFYYUR6dkRGcTFzTGFKYzN0eEtRM3RRTGV5VXF5S1dWUTNGL3EwZEZqOFlEOGs2eWRkVkZhNStWcytEU0c2dUMvbk45Y2VudUVOcWxqSi80Y290L243ZitwaVllWVVwbytGWk9sRkd4UnZWMVd5NFZFUEdLTEpwWDdBQjN1Q3RMRjJibVdhSUJpTkY2aEI5MjNHL1QybXVkdElFMWZ6NjZUVXczQWJyUXJhbHdFRmhPM1pMTFpKR3pXend6d0xqRHMrejhvWms4NGdPd29IVUFIQWdMdzhYaDJhRk1yNjZqczVTb3hrdEpZQmVUclJqWDV6bkJrZG1JOU0rLzFocmNZall0ZFpyZ2JyVlRSNmMwNm8zbXVhQ2tOWmNqcmZQc1hsaXBhak5Md2F1Zkw1RVZTS0VBSGd6bzdFTXhZSlcwL29pSnh1TnRrbzBXbVUvTzQ0TmRVV3pJdXNOa2RaZmpkZlNWbzJ4OE9ESEg2THpUSHV6MnB3T1QvT2NCRWpKMVJValI4Yjg3NU5JRUJCdW0zQnR0NnpFb2RiMWhNZG9NaHJHR3FYVTQyQjBtNzNreUx1Um9hNThSeG5HaUt4bUlId3RnTlN1dmtBcXV2UjBLTkp3djM0WWU0WTkrcHZXMzVFMHRzRkYxZ3V1alRMVTM1ZnBVOER3bEFmUG5HN0gwM3pXOFgwZEpubXZKenlZNDV4OGxoRDZnMkpBVEVSNW14L3JFdDNtTnpxM09rYVV3SnZJZkd1K2ZxNVhmQk9IamFmdlFENklvd2hoYjluUWF4VDZKRGZTYjhWa3hybVZWbnF1NXJYSTVScTdSSHlNSlJpTkpuT0h0OGttdmJnZ3pZamduVG40ZHlleGNTek8zdlF5RG9KOWxXSWp1SXNSS1I4ZmJBQVhtenZzbHZNdWJib3ZUYW1jN0syYlJVZjJIMHlSakx0SnFlVHV5QWplOFlRY0pKQTFkY2R0enVWQ2UwL0VyaFlOSXd1MFlPekV0ZWIrU2xNS09VUXNFOXV1WnV2dVFYV2JYcFhsQ2J1dkpBUlhQeUFtekZHaEkrdU9HTUJIN0RQTzBvRFV3MU03OEFOM2hKNkVCK3FvMFlSaEk1OGJCWENJVUxJbXlnaFdWc2F5c0lTUUI1NmhxQjJISXBYek96TzlFbEZzZHh1Qk9YMGlQaFN4TlA5ZVZoeVNTSXAyRXpYa2FiUjdmZlF4a2VpVEQ0TDBGWUNHR2lOek1EZElqWGhoZHpYUHplUTZzSFV3RHlnZFVzd3grdW1LaXE0OW81UXJ5NEVKUGNodlgzMm1KMUVaUHZMcko2cGNhVnVtQzNwUXFYemoyZXZYNG9wVTd2TnUyYStPVitlcnh2SWoyVWJsNkEzblJza3hrV3c5Zk5BZWpWd01JRTVSSEVTbzV4cjF4TktzN2NjTjhOdzMxTWYvOXRSQUtORExIRDdjTDY1bW1lcGFvaGtuUGVMWW5jYitaR0FWczNRbWVzNXlCR3Y0eGJKUjdSdVdqS0lXd1E2bGZDdEZ0SEFlMFdDb28xREMrU0I2SnNkbnBFbVBnQjJnU1E2SlVpOFZGb0lCaFYza2hDaGYwMll4ajlKdmVnL1RLcVR3ZzNlSFBPNXNWa1dEWXZHQ1NhQnVxSTduYUE5b05CODcyTmdvdUlRYmtFckhiODhKMmROalM2SnBEclRmVjdyaDhXcnhrcjhjQjNaaDEyS25NbUtxSG8xcE9lbmh0RjQ2YXpFOUxhODd1Y1J2M0pSMnl5UTdtSU5sZmRuR2puVUpldC9GMXVqZStxTzZTdzZ2WVNwNkRSc2lHZ0o1QmN4WFZvM1I1TFYrWVYxdXV6aHZpWEQrYWIxWkdORHgyUHg0bnJhbWFjYnRxSEtvY3l2MzBlekIyOEdya2pYZTAreEFrQndhVE16TGRZbUZPOU8vZzJHSWVIQVNWTnJUejRVeHJJOFR4S2pqVkpxcnQxWHJkSTdETSszRGUrQ1ExZlc1L1YzVFhIZGZ4b3JFd01QVGJ4cnNSYVlwbmxLSE14eFpIcytKY2ZNYjdYR3BQQldtTGZ1Q1EvZlN6ZXYyUFJhdUN6NkFsbC9CNEVDRXZ0Rm85QnJHRWRacG5JT0krTGdnbjVCYnFPd1NiamkvMWhxQmEzNG45Zko5QUQzVThpYnVhbUdHZDNXMUx1UmxOb2h6bkxrdWlQZUQxajNDRERwNVRWTkdBK0ZoZFhvYVlFeU1UMHFUeDJSbndwczhJdEI5ZkhKM3lhNUZlZ0NsZlAwclJsbDlkN0NaMzMzai9oZzNHMk10YXZNMWZCVU5Cck4xVGVGV0Ywb2M3aXdDb1F2S21lU3BoQlJlSHR5dzB5aXc5MG42eHBnQ1l5a21vTktHaG1oMElWWlk4S0JrTzBXMXBxWUlpOU1pVFZHOTRKMmpoK2N2T1MwUnNlUUs1Z1VEOEVBcVAyQ2FyOUlqVmh0VjNzd1BWTnpUQjN2d1lDa2lXQlU3cjczTjQyQkFuNk4xRzlmbDlOWC9ENUErSjNrOVI2TlVXL055YnFUclZzenc1emZPRDhObzFvdFl2WDJTZ1lOWDEwRGM1WW9QdUpMVWo2NmRUdGNPbC9QRWJZWlBocmkzK08rL0U5K045amJlYVFyT1E1Z0oxN3gwQ0oybURvWVlvTkJsVE5XTkh1enhhL0R1Zmpyd3ZyRzBvZytZWWJGQ2IwVEJELzNvN2l0ek43ZHpYR29kejdmSjM2eHNET2t5T1NBNDROOHJIUHYvK1RNYURGcEpuNDM0Tjg1TS9tY3ErQ0tvaWdoeXdkamtsVnpTOThIZzZRR0JHVitrU2FhMUswbHlSNVRrRGNETi9ZSlRwUi96ZmJ6U2trNWV2RjdSdWRGWUtKcW1JaEVpUkVpcjA3RkVCTmF6NEVLejc4MEJOM3FLOXJPYis0WW8xOHo3NThuY2tnUzZPK1BnTEhaayt2WGVyN0lidThCcXRyYnMxZjMzbXg1MkhleVpKeDNvaUc4MFh6ZGJBNVMvK0VKN0x4RWZzMmRQejRZZ2FzZWh3UlJhTEtMVGtZZ1FKWGtQUmJBaDFqcVhtU3JkenZnbWZFKzJUWi9mbTRqdHkrZGorL2ZHODBpUjI2bi82NTFqK2JPZEVlVjNlWkw3NFFVaXNJYlJyM1NKRjVUb25XeGpmaUlHZWQzeGFjdVhZSS9YQzlYdGhZQVlrRFVZM3QxRWdUTk9Sa2dFOFE0VURTZ1VRY09IRUF1Z1BKNkY5dlVaUUo0bkxkUXIvKzlWK0dnYTR2c1F4Q0ROWDc1OTV5TlhwTS9mV3hBbnA5dytDNmpOSW4yNVU1b3NxUUdyR0hYcEJPNE5qYmN1Nnk1ZmN2Sm9kckh3bnBXYUZYV0RWR0ZxWGYzWld1Tno3RjlldnRyeWpHNWhhVG9IUDdYdnhiV3phMmlGZ05sWHB1S2NIeUs2dEhMNUpraXhTKzFqdXVudXdscUQzNy9XMEYzUVRjZElMVVcwR05nM0ZjMmtwNk5LaTVsQVRtZW1vQWtJVDVyWnhYejNmZG1wK1FObUc2UkZ4eDNHNnllWGlvcFprVnpmbGRZclRmVFp6eFk5Z28yK2dZWG1ZSWhTM2NrdDZFRVBlelkyM1pIaGpHMHdQdUh0MXpzejdZc2RHZVB1WllsZU1NSXNLYTBtYlRGcnVsTUd5M3NtSmVSQ3NwZjhQdXpRNEhJUnFkYUlYTGhFODY3WWdZQmRudFhrYzM2YlUvUDR3L2twWlQ4VTlGME0wQjBob0Zub05hMHVjV3d4Rmk1MHM3VDE1d04wd3FUWmZCN3JMVjh5bWhicWJjT0YvamFkYXZVZk4yc2haMEdRMXBiNE40MmtkR24wY1ZURDkxL1dNeWNuNWVxSVJULzErZEZrYjB2VDFnT0p1VnZyQ0lmMjJVdUtwcDkzNlNGVzBxbHNxRnVtSlBXT1RDendVNzRYc0tBK1dCeG5xRE5Wa0FmQXFJM2pXcXNoeW45SE1hOTlTdlpCbUd3L0tjQjFlalF5b1BGWTVzdS9PRVBENzBUeVdvUS9pZlZSM2w4cVRTQXV2VFVYNEY0U2VZMGFORnpRQWlWUUZnM1pEN0cvMzBFS04vcGNFc0FCU2pCWFk5ZGk3NHJsWHBKYzRkVjQ4amFJQnJBeTR3ekx3SURWWnUrM1dnZnN1ME5wT2NZd3czdlhIWlFjclJDM050UXNMUEdtRU1YMUE4c0gzMFladWdCWXVqeENMdzdlKzVORFRkZFE4ZWJHQitZZzVhWDBLcHF3SXVwU0xyM3lENUpuRnhUdmZhbnA2T0cwKzErZG1GMzZJZ0dzdzlCQmNQNTNuZkhQN05uM1FaWHBzeE0rS3B4RE5uMStBcVdCNGtkamJpYVl2dlBxUDdXUTRLL0RqRFVaNzEzL0RiRjdCR0tTS0owOFgrTDFUUlJ5eCtWVzcyb092QTEzQVF1clh1MDQ5dDNOOUZLWUU0VzNjNkU5NmEwMXlZZHZpNzcrREJSWHc5bVJDLzdMUEdKbGtBKzdSNzIyMWNHUWZjV295NlVLY3JmeEF2QWZCeUQ2Y05hY3RlcUhDYWUrcENsbUxHdEdCZ21DU1A3akJIUjF0ZDBYOTR1MzYxYkQrWWwyZ1lzOTl0a29BMXVjODY0UGZCVGljYXBxZXZocVhCZmUyYlBsaStQMUhqTVpGYXU0Qkd1Vk1HbDI2SWFLRGxKNHo2OVhSOUd4eFhIczUwV2JMYmk4QTE4UlRlRXJoNTFXWlpUMWhUVEZncHg4V2o3U1BpcVQ2c2syT0tIODVyNEM2NFVzREt6cW5CR1hmVVVvYUY4OTZuVUpua1N2K21IdlJJaUtNQmhVUU9uenpHdkgwcTkrYXNtWTlhcHFacXdXYzhhR0RPTUVNbGdlUXFCU2gwVWFRRDIySTdzZWZUYXJrRmdMTm5PcEEwZUgrcXdkNmcvb2RYK1Z5V3cwQjFhMW0veUxQYzVWUVo5ejFaSk84TFhiNFlvcmJkMS9XTG1lN1VFQjdCcjEyRmNGZy9aVm8yNlhJc0E5SnRpQktkYXpsb3hGUDBRUXdPSnBRVW9Famd3OTNWc1EzcHQwckNLTm9oNm5KeVhWR2NPd3dmTWFkY1hRK1VSdkgvNTM1KzAwZVk0RWc1L1pMK3dmVXkxcEdKVWtuWk9qbmJqRW1IRVlodXdZMHAreG00eFpNMUswMncxRFdjYzhic2luTXRtaVpXTnl1Q0JaL3RuaEhZanovZ1pPcUx1c2d3QnpRVmR0UEZRWGVZRHZIbFJ4Y3d0c1IySTFqUjlTS2lkdk9iMnBrN0QwL2tpS3VPWHgzcG1EdzVGQUhSYm1YVmxaK2FsU3hlKzRIU3VkaXhmYS9QSllZNkVlbW8wa3RKcjY4aDUyWWNHS3ZzSDlEN3g5RlY3TDlTN3dkS3dLQnVYbUJXN2ZiTXRaMEJJUnpGbFBjYjFtWThudHBzWDJZZ0F1czBjTTBxeFJMUFd0MTFLeHZmY2pxcmdDOWFyRTNtOEo3ZmVKUmNRVkpBZXM4NHI2dS9tZ2JVbnFkei9nMEMydUpvVjdrazkvS1dDVkxvd1c1T1JTN2x2WjJqLzZxQ09rZXcrZjUySTJyeXFqeDQrcTI1Ly8xeVQ5dERvL215K1NsWmx6OWxyOE9kZGp1Q0hHbGRyREJuRUdFd25KWEJYbWRKN1hxK0pLdEJQbVBSZXBld21XOTRST0dWRVk5SzQ4K3I4aUVoQXpuVHhnVkdkRTlPSzBFWG5TQ0ZkeHZGOGE0S1RDMU55OFpxMjc3Qk5MaUZjQ0hNRDVIZWhZdGNoRCtoWjc4RldCb0JBTitraEx5bXl5QUlHV2NsYTdMVzgxbGdpY0NRZHRkaWE4TVBBSGRrSHlIcUczcEl1aHVldk0vYml4Z1B5c1plNFJ3cjRzNExjdkgzVzVCRThnVi82dzErUndlak16Q1IrSnY4L0c5RVc4UXorUXdlSXhaS0NqQStuWDRjNnRuOVlhZlVOZmw4VStjMVdNZHd2WEE4ZGE2WjNSUnVEc1hhZ0FWdlQwWng5UTZway9xc0NLU0F6ODF6WHRmdEZmRUROVHcvbk1iaDZRV1JaVFk0S241L09GWGZmU0FqLzc2YkJBZGlZb1JGcDdjMk1yd1hCVFp0NXBEMXNtMkdJVmNFZnd0cDIwYWRmMmlaVVhJM3dEV2xDQVZaSTVWTGY2Nm1Nd0dZQXh6Q3ZsaUdvKzd2aUwxOVlqNElLejA3Wm9zTVBXL1BxZjAvckl6cCttUC9PN0p4eEgwTHpUWjh6R3RHc08zRUlUNXg2VlRyWFcrTDlsZ2U5VU1MUDVaYmZDdk9ZbEduT2llQnBFblJTQnhOKy9lQk5mMGpidHdFRTZCYW96VnhWNHFXT0xRNys2aWtmZEcrQkt3dXhDeUkrcjJiK2cyTk10a1g3UjdjZlZES1dpL2dDRWtEMWMxS3k4c0xYaHZnZU9Qdmg0cUpaNkU4R3I3TlRiRUZQYzJ2RHNXMlc4bWxqdEZwNmNDWldvc3J5UkhLM1E5RHZSODhtMjlOa1ZuWHVyaVFJT2lTc2FEcCt2MjFNNGZsVWNMellldkJBQzlyK01WcU52b0RSQ2dWRmpjeWdOWEs3Q3hZRmpiL2xvMDdWdlpRdGwwbXpuL090ditkSjExZHRyd0hrMVVBNnRkQ3dlczNrMG5VMkxTeHN4N05NU1BaZXRzbWFNdWtKSG9QWGRDUjlINm96b3hHbXIyV1l5SlpMT1pGQWRndzJrOUJDejNYNjkzT0x5R1RzeTNxK2VlSkpzZTkyeWFJZzY3MS9mOGVnbjRQQU14UUsyWHcwTHZmZEo5QjdjK1FkU1RQU3ZsQ3JaNExoLzJocW03dGJhWERiekFsaHVkU0VvN0FldVdtcXB6eTFYS1YxeTFWQnJwS1JMcVZTNWxacWVOOXE5QnNUbU5Vb1FNV1JOSUlHR0kwWGt5c0VTY2dWWm83SGhZckEwYUFsU293bzhGVmZ1eStYRm1vcmhPRUVvbjh1NXhzRjVZSXc1Y2lvbm9NSUZoMjFYUjBzSGl1dW1EdEpmdytubjVoU1ZGV0wrVjlSVTNGWXlJRkp2U0d3MnBOVXlpZ1g4S3VjRG1qYU9PM0J2bjA2WHNRaGJmT2FVZFBibnVTRFdtaklrazUyVFlWMWFOSTNobGtoV3JLRVpQaXdER3J5UGNQYjcvSXhsejdhcEhrVGgvWVd2Zm1zc0Y2UzRraGJ2RDNxSmtRVVdYQlhuZmlDVVVraUpqUUpsOExYdEU4cWRJNmpGYmRGMko3bXUyN3lYbDQzejk3QzlnMVNOMld3RW8rRERrT2JQZWxwRUhYa2QwbTNETklrdWpWTktORjlUSWV6ZjFxeHBwZENJbWhmOE53bmFydjRQL1ZPTU0vM3dRY3c2NERJSnUzQm5qeER3SURVak4zbmFNbW9qZXptNlBERGNGeCtPbDhPNVF1dzE4R1FtNEM4YTVoL1JTejZQY0ZXNmdCVEYyVEdWeFZRcU9uR1pJYUtHWXlhZE9CVXdXaHdwRk00WTFNcFlBZ0hYcS9CdGVPK2FLYmNHSVVXZ01LS3lOU1I2Tmg5dXVnWXM3Q0NxSEN6MHdxZ3AzWWZZYkhuRWxFWmhnV2ZKUDU0M2ZkK09TNDFJTXFzekdqTTZKR21VdnZnOXRIeUVndkNJWlRLM1dFSEFSQ0xtY2lkaVI4VEIzaVFCcXoxQnFScVdKL0RBUkU4UzFKL1U0SXhMMEVXQmdiNkkrUUx4NXhlUHhyZFY1U2ZyWitGMkdFanNVWlhWTkhnYURNZE5Xa3NRTlovSEFLY05HbVUwbnZFRUJJK3pPbUUxaXh4WFBtNG0xYkJKSFQra1ZIa3dvOHBYRUFrYXNad1RXQzJBRmZSVll3MC9VWTR0THExWXFMU2paeXVhUjZqNXdKYjRBbSt5VDNHV1ZYdWMzWWdOVTgzZ2JibGM4SktzZlVqUTBMNWozcFVGY1hJR2NvQVYwQzd3K2I1cVJpSld4QkVya244WnVYZXlXQW9XZmVtbEF4ZHB2TGR3L3JocVhidmFzRVhZOHNDMWhmeUtjcEI4YjdsYnlQMVhBZTRXc2NMenhVTmJkM1gyMU5ZM1BFRnp3WHVMdHQ1UmY1aUtQU1dRSWpzSXZyL1ZyWWJ3L09DN0NMOHZNL0JUSEhaNTVZYUpNcERPdDdSdGF0cFpPZHcybjE1RGgrdExqUzhBZnVYalBSemV1YjlRQnpWdmRyWUpoUUVVSDJta3YweTQ5OEJHd25mdmlqdG9GYlUzU2RxMlgvZDBTM3RMeXpTTDkxTno4Mk9nQlBnc2F1K3lnVCt0T0FnNTFIQ2ZYZEdmeW5HcUVSVHZhOEEycVBMN1BhMk4zTHMvblpkQUs5OXk2Q2syNTY1RExXM1V4TEpSWSsydDkveHV2clBaMHRwU1diNnQwcmZWMHJTUDA5SFd1cTYxZGJ5MVRRdWlFcnhNcEpmY3ByZERGVFVQVmJORk56dFlhajFsK2RXOG41cGJYdVEwcTF1YUQ0TW5vRkNpMzkwbnVoamY5eURZdnh5eUkzU2FGMTBYeDBybEppdzYzYTNrVTZwMUsyZHdrdnl4V3h5cjFjOFRPa0ZPWFdLS3FqM2JpdklFWDJIR2JicEFZdVhEanFwRDFzRStuMVp0bmNSSnJtbWdjbmlWRE91d3ZQV1NDdXl3bm45YVk3VXYwMURONnhEVHQxcWxROWU3aFV0YmhNS1dwY0pFQlNGYjllVVlYQUpINW5xMGt2c2hEbTFGcldXMzhvN0IyOUJsejg1OVd5UFBBMStiandhcCtQeGtodGQxSUtJdzlmemx5azdWMms1TW5tdVZYc210dFVOenJIM3h0dFlINkpxak9LSzJRK2VtdjE3NVBxUTM4VCs5bTZTN3lmVThxOEQrQnhoVFJlSEN2alRuV2tBTTkxSlkyUWtiNUFHUFFxV0pxQTc2bmx3K3cvZTlPWUJpcGk0ZDJrdEllT1JPdjFCRmNXK2FnQ2hBM2VzbEVYVUdiY0lHQVJUYzRuaFQxMUJaNjZYWHpURkxGTnlaSVQ1TUxXK3J5Qm1vZFcyVnJFWERSTVpxUkQvMnF5TUw3MlhnUXBHRUxmTm96NzBndm83QmtCenhXcDZlaEFWYWNucGV0WGtONnhKR2RnaUp5aHBKaDdhQ01JZ0RNY3BSVDhxaWFMdkw3R2FOVStabjR1aWxyZ2EzWW9NK2lLc0hIcWo5R3U0bmdycEZIb1dydmxGUVBzUGNweGxqcU9Mc3ZkbW1qYnJlbXNIcmE5K3VTc0dEK29WdXBic09iN0Z4WllVNnNxeFJiZHgwbldPeGtra2l1czR2bncvSzBXQ0pSNXVJNzVYWFQzMTRCcys5RFRuQnhieVJtTkc1d3c1QmdXUFVKaG5ac2wyV1czTjUrM1VyZGlVMExpcXhJQzlmSmh1Zk5sK1dUSnF1MExjU2treFg0ekZBZTVSV1JMVmNQajVUTTFORlJ0UDViYmZrYy9ZYk5OVUlpTG5wVEJMVHNyc3BnQ01aeDJuRmFrTXZKdWNvaWp3YVVNYUtlTDdRUXVlajZLTzIzSkZsUUl0VXVqWXpPL1NZdUUwN2ZidklSTkc4TW5jcG81ZDNsNWxLMGpJam1kdTQ5WTliWDZvMjZZbFpjN1BmSGY5MHZNZG1IbHdaUVR5SEROWDFHbDVrMWo3Y1A0LzVNTkVwNDBRSnpUTTNHTGl2MEpyZkJSNHVBZmYwcUJCTVcwS1U0Vm1xMk9NcWNMTWRURGV2YVBpQ21iWTR3WXlWTDFnWk5uVlJzajRITHBhQXVlYW5xNExjQ3BsWHBSS2lreW1VNllhYzRldStFSW8rMS9ONStzOUZ3aTkwUVAyTnJnQ0tHcFRETERLV0xhUlc2a2JQYW1OM0VabUtSSVFReWRVZWJFUzArWEdxZHFoYmdNU200dUg5aGI3d0FhcU9JVjJDNEtQVXZtSUVMMUFQZkEzNEs1bG1peFYzNkc4MEtMc2JVbzFDbnVyQ3lCUkY3a2NGUys5RXNZWC96UWZmOEIvYmZkUGt5enNwTUk0cWpwbnNYcnJBbzcvMXFkZm5TMFRNM0FhUzJVVHZSOGVMVnVMZWp1d0xsSGRid25VV1haRlZtb3hobmFMTGpqQ2JOZmlaMlFKSkxnaUsyOHFPdWt5bHl4WnlldUpQM0MvcEliUTZURjJ1aFhnYWNLWldGYnZnejNHdndoNWdhR2R0SUNIWmRBUHdQYUN6SXVqYWUxZk1kT0Y5MmQ0UXdXSHZPWDJMS0RKbGoyaTZOamZvaHFzZ2hGdXVHOWhLcmFYTjBvaFYwRU9rR2FMTEx6T012dWhYRTh2VTVkYm9jc1pvRE1sTUlUTnkrVFdpMEpLSUw1RFUrMC9wZDBmMFE0bTZDWFdwOE1IUUkrVjluaG5jd1NES01jb1EvY2h6Vjc5YktjKy92dmc1L1NGd083OTA3UEQ1dS9kVXl2ZXY5RDJqWDBaWmRBZVNSaS92ZjZxODNXT3pKeGlZV2hqS0g5cDZEbUtVZHR3MzVmNFN4cXRiSDdvalNjV0hGcm5XK0Q3bFltMU5rK0htYXlyd2RQUkN2ZlltOE1zbGp4b2ZFYzJNdURYMzJ3L01NK2lsdXZ6ckRad1RjZWx0dXA5dWh0MEdsNDhkK1FuSFcwNVVzanpYYS9ubjJiTnM4M1Q5RUhab3U4bnQ0OHNGT1BzMTc4OTNDYlhiMnNOTFdUR05qcFU0QU1PVHJMaFd5NDVQWHF1VlJxeE9WUVRXU0dOV2h5cjh5QjU0OG9KV1lBUFpYY0RoemNLTzkzKzhCK081Ujh4S3FONWNtb3lrRkNvMXJoWUZZSzJvaEdlelJ0UVZqRzZwOGpuQU9sVXBqK1BxYmNTL25sSUNOV1E0QzdCRWNQMU9iOS9ZbmM2dGE0STNMbkpJVmtiN05tSGRXS2oyd3I5WnpLVGk3NXNYSzFORGU1eGRZNG9wejhyRS9RZW5IL2NzV1hZcUZkbWJjUWpYMkFmaXRwQkVHcEc3ZlBJdXZmQ3JLeFZhdjlZUVltV2tqZzQzcUFMVGZKZHR6S29VeG54RS8zZlJPbS9SaktpN3V6QW5PYWdnU0ZuWG5wYnJJSEMyTE5lV292RmwycFpxcmduLzVLTGtzakVpSU1OaS9JaEVvL1JGWlpnL2F4WURLUy9ZSlV6clU3dGdoOXVEbTdqdHBDRklXYjg5MngySTJ5cXlNU3JlYnI5SXEyUFdzSjJNWHJ3ck5TSWgzUUE1QTIvWlVJSzAxZmJ3dm1ZRUY4cUdxcEJpTEdYcVhTOGV1d1ppTEk3VjlxYVBMaGoyMFVKUDkycVZGNlY0dlVRZFlzMzhsOUJWZ1NuY1lPRzdaVmt0aXRyZmZ2dEIyYjdRSitLR21uTmV2SlVqV2V2aGlCQ3ZVaUdOUGR5R2VBWEx0MEo0ZnBDYzJHa0Y5OVhUVWtHNFYvdHFwS1hIOWVtcEJ4Vm52MnVEWFhwZkU4bXNtbU5XbE9NWTJGK3d5VkRNR1NkQ1llUG1ZbTZUb2RPeUN6blQ1bkRJTkZIUUlpWDRZblU2b1YzcTlVZ3duY3lsT0dhU1pvK1hTYVFtVmp1ekJrM0dhS1FYUnhaeHVnMUp2cy8wdzJENGYxdnh5VVFlR0JaNXZUSUQrNGRjOHNkNFQrM1F2bGZBWEIrYUk3K1V6Yzd6RkErTE9aeGY1S0M4UW0xdmY4eElBZEJvVXpsMU5LUCtSSGRGNGZpcDVsY2FtblkzZDFTMXYxYi90V1BJWWk4UmhMMms1UTVuYVVHZzhUb2ExMmlUbUZtYlVBMFVUV2gwQ1RPbVMrcGlnSGNscERoeDhHYW92U1dqTFhRcjBWSUVvaC96MUtVVHRuM1hlT2c3OURDKzVDU1U2UnJkUGVtVFgvMXNpZHY2RDVnVmFWWnNKVFBuVXpzbFY2dkZVdlhWRXVuVkhJbEVjN1ZYWnBOTGJiS3ZNYkJzYjYva3MzK0xvZVhUVjlJUXNnTU45bDBiMmdKWm5QTnBPTTd1dlo0dVdiWWQ1OVJUT1R3M0pHWHBudnFxaGJYK0cwREtWQ3RnRWwxVUxSUGYzZXJna045UEY2NEVFSFdaUnQzRTI2MjFmUFNIYWoreFNMMkhobHp3ZFQyenF2aC93WmRzQ0VqTm80b3VJTGQ3SWNlMWJSSHdmcFZXQlpoamZaaVpUQXRGTlZNTGc2Z1dNaGhxbVdoSzBSM0Vwb0t0eHl1V3pTMXE1bXJwT3dxOGVWeTNDL0ZSZVJNSUhLZVpLRUkrZVlpdW9tbDJDUG9NRmpYNnE4Qmx2MGNFM1Z1b1FrOEs1eWVNcGROSElJa3MzeGhMQ1NYbGZFOHF2M3granc5UVlwaFM0ekxITmYzenRyRW1NSjA0RzAxMlVzUFg1K3RxdWtYYlYyaEtiVWtSVEk2YytEeERmbE1oeG9zQ0ljL3pnSmhIRlV0ZGp5bHZXQ2twdUw0MmRXRGZwT2x1YXFsWjFoTkJ0TnNMZkJHUnFVSm1JU3Y5WjRGRWVrdmdqV3RzYkdyOFFlNTJJN2k5SmZnUlhnT1F2VjdiSk5hdCtPdHRZL1F3eWt1TndINGpDMWI1WlV2WnA3K3VxMkZrdXJzNG1nT2hkclcvZDlqZ1RRNjdwZ0tEcjhobS9rN285bzdzNTA2eTJDZWVZM1B1TzhGbW5ienZidFlQTGEzL1cvclpGSlo3R2dJTTM2N1h3UFlqZ01wci9FTWc0WG9EbTVHdWwxZ0hzNy9DSVNhYjN6dWdrMDRNYUEwSVZFVXZybTN1cFdEUjhEY0tobHRRTUZ5TmdpRVRJL2duZTYya1RkNmMyZGJrNVdIRHJ4N1pKSXNxY0tZdlN1SlJsSWFpb0J0RndUc29DdjZVb2dUQWRjZ0pMY2dKenlJblBJS2M4S0dVb2k5MHdmU2FSdXdBb28rb3FicVIydWNScGc0L2NqM0JUSmo5S2VaeDRHZmptbUFYNVRtV1lDbFRNTnltendRbHhXbURSOVYrL2lPY0pQWmZtQjZIbCtBR2pZMG80dFJ0MXZjSHU0YkZhbjJ5eitBYlJqTmI4bzFTVGpkR0dxTk94WDRTSVRWcHlDUFhJOHloaVQzQkFpWWUzeklWK0toazVpUkNQbWpUKzNTbGVwK3VCdm5nNURHTFFmRVhBOEVBOW5icm5Yb0FzWHd4ZTcrdUl0QUlmbzM2OFVnM1FtQnErd2pvYmZReCtnUjlpajVEbjZNdndKZmdQZWtyVXZ3YXFTSytWZDdENytEM3pBOGUydmgySXpEOXRlbnhWRDZKQzQ1MTJ4dDhsajVIZlQ5UGZ4cCtvczRIdEFWZHdZektuS3ErUXN6eGV4bzNyR3dMY3JkMlZkUVFOMW1YeDFQY3dDMXU0c1BiekJORUx2MkxhTERkVXRQMm9iUXhLOGF6SG9PNFczaUQzVDQ5ZldlVTJlZlIzZjcveUxGWVptRFFYdmM5SzlsYWdVVUFNZUxlZnhhc0FqQ0hmVmdBWkI2SWRZczUwWHUxM2JxTEY5YjI0STlaRDJzRGJpMTQvejhneTFpeGx0amd2T1VCNUxvQWdCWFl6YWxKZ3NhTXJSMXRYWWRSUmxHSDlSUWRzRSs2eG1SZzh5SWVvOG94UnVNUUJTb1B1TU9NWU1MZHM0eEdDSitIMlNNaTVhYnVzL3dDVlk1dE5BMFhtMHk5eEdNMEp0QU9xMXBnSzBCZEtBZjdES0d2ME1mb3k5Ri9aR2xhbE52bHdubENjaGd0Ukw5bFc2QXI0S04rb1NkZ0l4WHBJSnlGMjdnTzJPL05BbGgxVlhlTk95UGQ5LzNTSUtBL1ZDazM5WTRFUFlpdUhlTUJISnBXa20zUWVKRUxQRVlMMFc5Z2daS2E5ekdIenY4Ykk3REhlLzRZYmhmZTJFOWlvTzlKTTMyM2J1YnNTa1F2aU13K24zUU5KVWU4dE90cnp5NXYyRWE2N0EyeFZaVHM0dTh5MWpqbnU1M05DM2tFYmlFL1pqc2l1bE9qMjBRNjhVNllFaW10eGt1dUMzdkw4WVpMbzJzRkVhZFF4dXZHOWxFMGV0Nitsays3TVFIb04wUFlsc2FYYit2YU4zdHIxeTQyZFZta2ZTYlY1eGkzQmJWMXUxMU05d0QwbE96TFhuWUNSOTB0NHd0K3JpdW9LQTE5eXV3RDJwTEFKd1E3WjN5K2NJbmk4a2c2MThuVVNBVDJPNlZLLzNXQklhMWhUMmV3N0VvRlNyYU1JaitUV0UwKzk0cmFIQUp3RVQ5K1o3cGxYRWpxM3hESDNRRGc1SUdPKzVMOEwyK0ovK2l3enhQTXhnRWlCZ0FJL2l5Wm9IQW1NUDAvZUU1azl5NmlOZTFrNnc3V3o0dWNycVRweHlaM0JlVUp2MlJ5cDNYRlRQWWR5TDdKSXdSNFJranpON2F6WGkyQ0lNRTBwVFhvZFpjN0lTamQrckw0Rkh4R0V5M0FSSFVBeDFWL0xadmlqbDh3V1YybTFmU0NmK3N3YzBXMDZPcWE1bTZTS3p5dFJuaFFWYWdNNk1jaFJna0pNWFlFOFloQjl1bUtvb1RwR1JxTmtLNGZ4NE9XK3UrNENyY0dZcmdUWjV2bUc5VFVqdGZuaXFZWlVXVDZVZzBlRTNoa2lVRzVuQnBnakYxNERYYm8rRFFSYmZwVjEzek1wbElKQ3VjK1ZMSnhHZ2F6eEZ3V0kzWkxuajY1WDUwMHhCMDNvWjBNTDRhU1A2R3ZRWEtidVBNclVxdm1hUWgzVUdaclJVWk5pWW85dFhUUlU3eEdsZFN5cFk0NWJBckxVTE16dEFiNjVpbWRJT2FSRFlwSVVGNUJzSW83S1E2L1V6U3d0STJTZWRTMWs3UW9JWFBTYzBHVEY0dXpXaHhMeHZ3TnhGN2g5cjEyTExZWElkOUZENXNyTy9TMzJiS2VXelpQSnFYL0FNM1FoMXB1ZlN0NzZqaVF2WUVsMW1NMGVNN1RNa3dBQTN0OVNEbTc2WmFYS0xaNTY1dnBPMGl4dmZReUNJMmo1Qk9oVi9rMlBpVjNzUnQ0S3FGbC9tRHVEblV6Nm03VnY3OFJQYjNJMWpQTVhWQ3FWWWlmK0VURkhuVzNyY2hNYjUxZTF1dVZwekwwbGdHVElBVU1hUlVGY0tBRHNJRUUwUUlabUtmeURVbEZaWWNvMmE2LzQzUURDYVhza2NNR09LMnM1S0Z6cVB5aTdzamZKOVM4TlZvamo4b1gxTWp1eWZFRVFJQ1BjV2ltQVdnakxCd2tKcTBPSmppZEhaejJpWTNPWnpzRWtkbnJFTmx5blNOWVlsNXloREtYWWc4ajFicVRDQWhzbkM3eTVLdFFLSnRYbG1JeWhVdThOTExCQlppeXVRT1V5RGJKZEVVbXlEV1pyTDlDZWFhWlloSUg3VVMwdUpYbWViVElpalpCY3JGODAyODZKeWV2N0V5MXhFUU9xc21UdzduS3RkQVVaZXp5VGVEbGt5M1hCR1VaNDNMS3BoN1FISzd4cWVBUWV2dG9jV1JsRXRKbEEwMVJaTXBSS1RWRlhlcnB4VnhGeGI2OG5GN2pzcTdHYmRVMjBCdWVJVkpPd3NmRnE0VFBCSVVTT0xpNEpNclFWejk5ZFpNaGFQQzRXVHNZeWdFblpxczRtcndZS2R4ZXVQbFlLVExKcURTL1Y0bzRoQ28rRHZOUWIvUUkrdkhvcmVmZ01UUE1tNFk1dTA3NVA2SklYaEgvZTEveW53RUEpIGZvcm1hdChcXFwid29mZjJcXFwiKTt1bmljb2RlLXJhbmdlOnUrMDA/Pyx1KzAxMzEsdSswMTUyLTAxNTMsdSswMmJiLTAyYmMsdSswMmM2LHUrMDJkYSx1KzAyZGMsdSsyMDAwLTIwNmYsdSsyMDc0LHUrMjBhYyx1KzIxMjIsdSsyMTkxLHUrMjE5Myx1KzIyMTIsdSsyMjE1LHUrZmVmZix1K2ZmZmR9Ym9keSxodG1se2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjR9aHRtbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItcGFyYWdyYXBoLHB7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNjt0ZXh0LWFsaWduOmp1c3RpZnl9Lm1vbnN0ZXItaDEsaDF7Zm9udC1zaXplOjNyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDIsaDJ7Zm9udC1zaXplOjIuNXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4yO21hcmdpbjo0cmVtIDAgMS41cmVtfS5tb25zdGVyLWgzLGgze2ZvbnQtc2l6ZToycmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI1O21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNCxoNHtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg1LGg1e2ZvbnQtc2l6ZToxLjRyZW07Zm9udC13ZWlnaHQ6Ym9sZGVyO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDYsaDZ7Zm9udC1zaXplOjEuM3JlbTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX1wK2gxe21hcmdpbi10b3A6My43NXJlbX1wK2gye21hcmdpbi10b3A6M3JlbX1wK2gze21hcmdpbi10b3A6Mi4yNXJlbX1wK2g0e21hcmdpbi10b3A6MS41cmVtfXAraDV7bWFyZ2luLXRvcDouNzVyZW19ZGl2K2gxLGRpditoMixkaXYraDMsZGl2K2g0LGRpditoNSxkaXYraDYscCtoNnttYXJnaW4tdG9wOjB9LmRlY297YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xKSAwLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMikgNTAlLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMykgMTAwJSk7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSk7dGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50fTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xKX06OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfWtiZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOi4yNXJlbTtib3JkZXItcmFkaXVzOjEwcmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3BhZGRpbmc6LjI1ZW0gLjZlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9ZGV0YWlsc3ttYXJnaW4tYm90dG9tOjFyZW19c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LWZlYXR1cmUtc2V0dGluZ3M6XFxcInRudW1cXFwiO2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMWVtO3BhZGRpbmc6LjZyZW0gMXJlbX1kZXRhaWxzW29wZW5de3BhZGRpbmc6LjZyZW0gMXJlbSAuNzVyZW19ZGV0YWlsc1tvcGVuXSBzdW1tYXJ5e21hcmdpbi1ib3R0b206LjVyZW07cGFkZGluZzowfS5tb25zdGVyLW5vLXVzZXItc2VsZWN0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX1Aa2V5ZnJhbWVzIGRldGFpbHMtc2hvd3swJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41ZW0pfX1kZXRhaWxzW29wZW5dPjpub3Qoc3VtbWFyeSl7YW5pbWF0aW9uOmRldGFpbHMtc2hvdyAuMTVzIGVhc2UtaW4tb3V0fWRldGFpbHNbb3Blbl0+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5tb25vc3BhY2V7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseS1tb25vc3BhY2UpfWRpdltkYXRhLW1vbnN0ZXItcm9sZT1wb3BwZXJde2FsaWduLWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtsZWZ0OjA7cGFkZGluZzoxLjFlbTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDotbW96LW1heC1jb250ZW50O3dpZHRoOm1heC1jb250ZW50O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW1vZGFsKX1kaXZbZGF0YS1tb25zdGVyLXJvbGU9cG9wcGVyXSBkaXZbZGF0YS1tb25zdGVyLXJvbGU9YXJyb3dde2JhY2tncm91bmQ6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2hlaWdodDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDpjYWxjKG1heCh2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSwgLTEgKiB2YXIoLS1tb25zdGVyLXBvcHBlci13aXRoYXJycm93LWRpc3RhbmNlKSkqMik7ei1pbmRleDotMX1kaXZbZGF0YS1tb25zdGVyLXJvbGU9ZGVjaXNpb25de2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWV2ZW5seTttYXJnaW46MXJlbSAwIC40cmVtO3dpZHRoOi1tb3otbWF4LWNvbnRlbnQ7d2lkdGg6bWF4LWNvbnRlbnR9ZGl2W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde2hlaWdodDoxMDAlO3dpZHRoOi1tb3otbWF4LWNvbnRlbnQ7d2lkdGg6bWF4LWNvbnRlbnR9YnV0dG9ue3dpZHRoOjEwMCV9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IE1lc3NhZ2VTdGF0ZUJ1dHRvblN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IE1lc3NhZ2VTdGF0ZUJ1dHRvblN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRNZXNzYWdlU3RhdGVCdXR0b25TdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIG1lc3NhZ2VzdGF0ZWJ1dHRvbiB7IFxuQGZvbnQtZmFjZXtmb250LWRpc3BsYXk6c3dhcDtmb250LWZhbWlseTpSYWxld2F5O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFGSjRBQklBQUFBQXQzQUFBRklRQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0U4Rys0NkhJVThCbUEvVTFSQlZFUUFoUWdJZ1FvSm54UVJDQXFCdWd5Qm1uQUxoQ0lBQVRZQ0pBT0lRQVFnQllVVUJ5QU1neHdiZmFRWGFKZWZtTnowWm9sM3Y2MGNQZVpNcEc0SEpTams1cUlJTmc2Q0dNZ2xaZi8vbjNGMGpPR0dEUkExclhlSW5jSklVa05IR242OXFNUkRVOFphampzOVVic210bnFuRTN2M3ZxaVFtZlJRcExrS1c2UVp3YWw2czVJVWlKTlVTVUcvT3dvRFk2QjY3NU9qU2prRFNTTXUycGVkcHU5dkpJTFVsSmQ3MDdEK2VMSHBqWURJNGUxdURuTGpISHZ4cERYR015ZHVMTG4xcXQwRkNRT3lGc0paRTEra0pxM1QrSWU3QkpGSU5PQU5iaTl2VFV6aEk3VzRHbVVMMGxXalQvRlFRaS9tKyt4dVBQMDJvbVJIZTVwbjREZ2ZOWmZuK1I5ejk3OXRtRWVOYXExUnhScUhUalRQTkEySkZFZ3JIZG8vbnQvVy81emJnR0N4aWE2RWtWaUEyRmhZR0l0Um1FMVp2VlV2cXRTdGI3TXZyZDNXNyt0MiswWGRvVG56empZYnA3bVNITEFDa2hNV2dDVEw2czBXdjBBVW9oSmZFcUUzb3BQZDU4aWtKbktsbyszdWFlU0hZSjZmY0ljWGpkK3JLVUVzYUVsVHFsVWxWUm0vTitlLzhpUDBMNUFLb3pObEozLzlpQndzaE02djVKSVVKeWtnVDNmZHJPbXE2TGNzK1orcS9Yc0FYRnhFRWlRSVVhS29zRm43Y3RUKzdCQlM1ZHFEb2xKWHVuYmw3cnR0ekQvdjM4NExmdEphZ0ZGQUxZUEU1QTdnbk1yWkJodDRsWHFzYlpLbWJkcTBUdE9tcG1nTml1Z00yUFlCYzczTXJqcTdHTHNvWEhjVHB0OXVQdkZEejhlTjNnK3N4clBRQXc2RFRGTnAvT1pJOWlpbk5pdFpoUm1wUU9Da2RvQmRBTmpWV2xhdk1pdHdETkpYL3BZSUFrVnduT1Avdlc1eHpvTXc3U0FGQUtVK1p6L2tuUC9aOWorT2Rmckw4S2UydmRLYm1waHV4SlN1TDhFVUFnZ0hJaUJIUCs0NDRFRHp2MVBUUTNZa09jT1NsVEhtajZVc2RmbzJMKy9qcFllN0lIV2NRVWdjZ2twTEZSMVlUVzhDR0tRWDliOEdGQUFBSDl0bzRSSFE2R0x2RlJyaTREaXdUekFBRERNS0RQci9mWjNWL3FkZ1Bta0d6S1RFbVdFWGI3UTN0dGdUWXFvMm5QNi8rOTdYZitGLzlKSEFWc0lJY0FDQlp3UnlrR1Q3Z0NSOFZvaEpjVU9PU0RqaVNiQXBoTW96bTJKUnB0QnRVVzY5WGJORkczSVZ5MktMb2s0OC9MZnNtNTI3SWFxQkxNdUJiT0ZJd2VGVWQwMXZlTCtZOHhXaHR6Y3FUbTJDSVRjNWVMSndTSTRmWWxMWUZJVkhBcy8vVDUzTjQvWXgxaEtHVStIU3FFcmRwUFBuczZmcXFXSnNOYlphQ2xRdGpsT0xVTXNoY2RvQTVUUXNzNEpMYzkwU3hDT01NVUs0S1A5TnNocHpwWDR2d3hLQ2hDQVNSRVJFL0xLc1dSbEp3TktBY1RuWEFoRXkzcjFLSGNaYS9ZZFg1ODQyMC9pYVhtdEdob0NBaUlpQVIyM3YvUDkrS1RBQ0FONWhka0MzeFVDNEVMc2dndmtSMmtyRWpZU0V2MEJLU21IQ2hJdllPQ0FKa0tRZ3lZTU0yUW9VTXpDbzE2Qko4NXFBV0NDZEhlazNBQjBPREwxTHEwUGdUZTNoU3cyZmhpNFhoUHVldVFXRUg2eHRJRVFBYkcyTm01b1Y1NFFGUCt5S2dPMkQ0VDV0L3d6MlhXOTIvcnBxcExUU0lQOHFWOXZMdk9kczBOTFd5WDUxSzZvZmJ2UFpFMXBhZjd3MzE4QzladGhxN2YzMmJmdUw2NFZaSHc1MTRZc201bGdmTmJmRzdXOWxzVUE0RUd6NzIzdnh3R3pwNGZSUittUDhMczVCN0tCMmVESlhjNnh3bEc2OTAydWc3QXpMQThOWTIxQjJkQi9QNXFmT1Y4dDFvbnlMNWpaRERmUUk1Umc4RDk4RnZIc3ZjbEh1SnNyZHZzSnJwYy9Uci9ndS9FZlpKelhVenBXYURqN003K1VQOC84RWtBQVZhQVMvQ1IrWHMvSk40WWFJY08xeEhaY1VhTU1ia2xycEt5N05mUUpLUWNVUmFnb0dtQ1crSEE2RU52YmczM3NsMnBJWVJtRTliSUhiMG1BNmtrNmxONUdkeU1ONUVibVFoeEhLbHdNZ1Q1OGNndzdwZFVSejduZk1jUWZjVTN2SWN6VmtkcmhYOFhIcTQwMTJ0Rk9kN2tUL2E3cDdtODNXQTcxRjdhTzlNK2RqdmRkNmo3ZnhtK0QxUHUzejN1aXJ2bXV5emE1M3RydjkzbFRiODJSVDJLYUZWVUtNTlAzNkJ2UU1DbzBHc0Vka0w4cyt6TGcxRXhiTTBOZ0NXQXhnemY4MkRHMUtYTWZjNHJqTmNRZkhLeFNDdVJ1Qkk1QW9kREREa0dkVjhDblZWRW1FTWFpbjRTYTBBWFRJMFJCTnBPWUFMVnExYVY5dnhKaVV6SEtXQ2lzNm1wMEJ1a3gwNjlHcjc0c25WTmJzb0Nta1ZNb3A1K3BER2FXejJzTERyMmlOdCtvWk8wYjM2WVNJaldjeHZubE4weDBWaGxZb1c0VVJqWFhLeUxHM1kzcW9MZEVhekhBRUVvVnVNbDNERGVFUlZwRy9qZVRFUjBDVVpFVTFtb3RxRm9pd0pGS1VhREZpYWNTbEJKckVqU1FLSi9DU0ZTbVNLazE2MVFsa2RLZXlTWFl6c2RYS2k2STlpa05KTXRDVUtsT3VRcVVxMVZIVDF6cTYrbHpmUU5BSWE1SnBSb3ZXYUVQN1p4dU5tVGpNTEJZdXEzWFVUZ05kUkRkNlVxOUEzM2NieEF6eERET04wSXhhTlZheGQvL3MvYWp4QUU2Sm5QYkZHWmt1QzN1YU5VOEVzRFNMWlZteE9qMVBkOEhReFhTcGVka1hhd2JXNndabzgrNkRyaXVRRkZ3NUlwdm5KaDYvWmdGSks5MzBhRU0yWEozeUpCMERIb3BoYnFnMHVya3ZNSWdZbHRiR1JQY2RrZDdWai9OVjRwYkFiYSsvRTRCakNnOXA1WmVyaS9wZE0wQ0cvN3RYWk54VkUrNmJZYXZRbjZ1bVd3eTNGWGY2Z2crWG5BdEhEZ2prUE5pVWJxcG93dkRVdmJSbGNqNVhaSFl6VjhKaTRObDF2anNPaHJNYXhPSHhlRHdlanovVklISlhuNkgwd2hnNnFGT0VVcVFvMFdMRTBvaExDVEtKMHlRNUxVOXlSUXBTcFVsZlpuQVNCa1dwbENsWG9WS1Y2cWliVEJ0TW1RS1lZV0hWVVVmdEdJdDYybGRuTUgzRXBpVTBxVlFxSGJDTHhPVStFNC8xWExmQkVoektoZ1VjZ1VTaGZ4d21EejlHNUVSQUFITDdGSFJLUXlybnd1eFFmNXJoSEJFQlJJb1NMVVlzelViYzRydE1kcGwyNkZnZDU1dGdRRzh4L2ZBWjJKekl2R2JtbHJjWEFtM3dYS2E3RWxmUGNTMnR4ZnErZWdmaUhHb0RNeHlCUktIdnkzU0ozMFE2VjgrNm1kZlpzYUZWM2VPVUtzV015bmtoeUwxdTRWSTBMMVNKTEl4WHlZenBMeU5xaVd6MFhUcGthVHluMVpEdGk5MG1ZMDJ2MHRVcXR6U0NsK3FySzdySXV2MXY5UkQwc2d4cUdiSm9HR2ZFa2xFMVl6cjI4TzFsMktld1g5TjRBRGFOMWI3TDBJYVJUWE91eTl5aXU4MnBPd0hRQkMrcGxkQ3JPbUswTWcvcjF2UllFbTNEQkVjZ1VlZ21VeDAzRzQrd2l0UWdPZkVSRUNWWlVZM200dG1FSXZ3VUtVcTBHTEUwNGxJQ1R1STB5VHF0RmNsRUNsS2xTYTg2V0VaM0pKdnNGV2k3SXhLSk9Cd09oOFBoY0VUclJOM3REcGxNSnBOaFJJYWlxQWlHWVJnbWNia3N5NE5vei9yb2ZRTDdLY2FsTkQwRk9XM1JHWnVPQlIyeG1WTXhrVWdrRGwwWDd1Sml1dFM4Yk5HYUUrdi9aUU93cWU4NkdJSWVFc0N1b3ZXWWZDcTJ0dnBNT0JON016TzY4R1dYTGh0bWdXMmZmZUhwMU11N3F3WDVORHdUa3BDU2NlZkJreGR2ZmluQVJJUklVYUxGaUtVUmx4SUFpWkUwclZxNjVJb1VTWlVtdmVxVU1ycHMvejFaV0VaNVlCZ0dBQUFBQUFDQTBXWnNkMUNwK0h3K24yL2NPbGs0ckRwU2wxSzNIcjM2amcxQ1R0d3pPY051Q1hZTmdpRFlob3RIMW9nT0xSU3V4OG5pbDRyMmlZYXYwbm9yelh2WjJuWmpaTGZhS0QrVlJnSC9mZ05tcGtGYmhnaUdpVWFjR2ZYTm1LNDlGUHZZOXR2YmNUbTc1KzNmZGFtVzZZU3R3a2R6YUNIWmN2cTBDUzRpVTVabU54TFhHQmUvclFvSGpNUDEvUUVHVk1aRkpnYkRESi81VDNleUJjdkdQU3FUaW1KY0MrWVFVanFHdjJuQzdxM25CMERPcXYyRzNWdmxJaEtJVzhNUlNCUzZ5WlRpTkdGWCtSR0NESHM4UFlJZFRqZEFVQXl2UWt3U0NwcGhOZDIwbXB1TWpRWEtCUWtXSWpRcG1KUlVLWXhLWGNMRGM2a0lmSGFUS2FPTVNjNE1zVlJZUTBlelU2RkxwVnVQM3RMSHV3cHJZZnRoaXdpSEZBV2tTcG1XUnQrNm5KNlUxOEN1eUo4NWoyeDBiMGQ3TjlwaWJxMGxiNE5uVStwTzd0RVVMaWhkVU8yaHJwdGdZWENzeEJGQTNsUTJubUZjM0ZiUmpHQmdDZDZCVUg3cW5YQmJhY2pzSzk5UmZJRE1BRmtCc29PK25aZzhQMEJCZ01JQXRRRWFuOVdRRXM5TUFITkc4NTU0d2ErQXJucXZUVGpwR1M3ZS9pbFBtakFSUG1uc3hXa2RBQVJ5T0w5eUFoeW14N1NHS2xrN0doNDh2RHZOZmRnK0lUQlpwRDlnemdNSUJ3d0JrNXRta0VYSXFxTU1hRVRnL0hVZTI2b0xUVHA0dzRnOVVrWjViZ2J4RUh0Q3lUTFlQSG1KVXEzdUpwcXp2U05jdW1iQmRYWVFza3UxQzkyTjhqVHZERkVVMHJ2ODE3Z21xc0dqUGZSdU5qdmVyVERtSENFNHErcWJ6T2p1SUl2UmFEaHpaMS9WSlVwaGhpT1FLSFF3c1o1VGpndUFCOEN1S3IrWUlNS2V3SW9NTzV4eDllNEFFQlREU1lwbTJPVHk4b0lveVlvYWplalVRYjhKd0QvWEI1aVNzd1VpZ2hBc1JHaFMwQ2d6SnpYTUNUVTFYRVpIYVRBWFRDUVNpY1hiWTRWQ29SZ0xFeHN0bGRDdHhaMWFVbmx1dEdodE9RdDE4L1JVZFZwa0RCdmJTNG5Fb05Gb05CcU5GaWRYbjBXSkxKQ3JVOENVYnFxTWhaR3BtK0Y4RWJCSVVhTEZpS1VSbHhLRUVpVlZMVk55UmdwU3BVbXZ1Z0FaaEFHbHlwU3JVS2xLdGJwbUE2d3JRTGNldmZxYUU3RFRXczZZSG0wRTJkY2xpV1dzV0Uzbm1TN0c1YjZ1R1ZuUG5OdXl5V2JId3hEanBXazZNK2oyMGVZTUxRLzAzVk1tS200Wm5nbEpTTW00OCtESml6ZS9LcmRDa1ZNbEtzeUltbWVaZjBHUXl3SkJFRnhDL3JnZ0NJSWdDSUl6OTBiREV3TVRqOGZqQVVBeGRTNlZzRGNzMWc4d2ZZQ1hyTmQ5OFNIOGdhams1dnVVUHFnNFhEUDlKbTdvR1d2R1h4U2RFTExmcnNFU0VzbVdYVGNNM2NMdEhGU0diU0hCQWpjQ2lVSVhKcUhuTWxPTFJCTGFzblVLMlN1eDF6cW5NQi9aTUdPeC96UHU4b2hEQURBQU9BQUNBQW1BQWtBRFlIZ2xDa0N1TFZBaVNJS0ZDUDBraFdOS1BGVXdiZHlMK3NEQnllZ2thSjJXRU10V3JFNi80dnBXN0c2ZTRtRHcwQmZ4WmhGdDlHdmZoUEVBbXlkNGNNdFVxc1BsNGF5N0d1YWs1dDBONTJPT3dKYUJnU05Ic2syTmg3cUVXWllWcThlK2tzeGpqM0VLU1hnOExOaWxRcUZRekUxZnY1dHZwUVFGdEZJbXlMdGl2VGVXa1FDazVaUmUyUWlKMlpyTFlEVjg2TUJZV1g1eEFQdW5rMXludFoyeDZhYk5yaVhBc2hXcmNma1U2M3kvai9tK2duek44STNZdHh6ZkNlT2lBUGk3WWgxd0JCS0Z6czcyV3JsaWZXYjNuK3NPbWtTaXpYSFRYcG12QW5PZ2VhKzdTOEYxRUhQOG5VNEluRlk0UTVtV3AzQkFMbGVzYTdCejRGdU9iRTRFWFJuaXlrOGh0Q09pazh2bGNzV1lJS3I0L2NITTNYWEljY3lPRHNCWEg5UjNOSUJqVXNkMWZpZGowaWluSDVyaVpmVU9EVGlGUXVsemVheDcrakhaVnl4ZjM4VTN4TGRyK1U3dTQzSDU5S2VnSzk1SnZ3dnlxbjNJZ3hMeVVHMlk0UWdrQ3YxQlREK0l2Q01QTWcwbFZZUkJuU0lRa2FKRWl4RkxJeTRsQ0NUMmhtMHNFQWdFSlREcnFiNGdKMkpZb3pTVUtWZWhVcFhxYk5yWitaaGVqYis1ckhyR3pjY0xRaEpTTXU0OGVQTGl6YS9LelFuTUNFS3dFS0ZKWVlHeU55SzFsdEpVL0o2V21GeFVxTHNJblhTczM0czRBSm5UTlA5SlY4MVpXMDhid294d2pNb0dnKzFnUFB4d0FNZVprQkVFK1ZzdXBzeG85Y1dTNWl2bmFTVXBGSlExVEVidGV5S2pNQUxsU1FoNlJLM2dDQ1FLM2VRVTRqYkVDN3VxL0F5Q0RIdUNCUVRzY01iVnV3TVVCQlREUTl5UUZNMnd5Um55RVN4S3NxSkdVM1JpRURQWEw5RFo1RjRJcEF1U1lDRkNrOElHWlZNRkNkT2tMdUUxSUtWRmxHZ3hZbW5FTmVOQkNWU0prbkpFaitTTUZFbVZKcjNxbURLSXpHbGtTYmJkOUhMazFmeCszZStWQ3BtS29oZ2x5VUJWcWt5NUNwV3FWS2NhVUczVWxmcG9rTWJheE5Bc0xWcTFhVTlHSWxPZnZKbE1wcGpKWkRKYlJqdGFOV2svcnpXb01JSWFOV2VzYXV0MDN5TU8yUHhJSTZNQkU5MXFmb0R5eENTd2dDT1FLSFNUNlFWdURoNWhGWGxwdHJnTWp5QktzcUlhTDE3R2Nka0E1OEE4Z0NZLzMyUExid2tuQ1FCQU5tdEN3Nk5vQnJWSXF6YnRPVXNXVTQwNWxDd1oxdER4NXAxbzdURWRKQmdTR0w3NzdCRWpvOTRhbzlvanRLOWJ2NS9oQU04UmE0NlNqZ21kZUx6TkRNaGlVSG51N1FtRERCWitJVUZpVGNKb0hjbElrU3BOK21aR2NUY0g1SWNCcGNxVVIwV29WS1U2NnFaM3VzZWdGM21uK2JGbHJpcTlCbW1uVjdQYjdHMFJ0Q2FzT3dLUVpFZ2g0ODZESnkvZS9KNkpyejJydnoxMThQazhQcC9QNXkvOU5QSmlyOWdKd3lsS3JVeTVDcFdxVkVmZFZGTnRocldnVlp2MlpJU1llcmVCb0pkSEtlYWVnMEo3VUJlcVI4U08xYW4zcEZBTUtMd0l0VlNKKytGbW5pSEVzRkVRVytwZWtvTTVIcWY1MGx4QkxMdjl6Q01BWlRQUTE3bjlYNWtIRlg3YzZRMkp2YitLU0lzU0xVWXNqYmhtdkpFRVd4TEhKRFhNU0s1SWtWUnAwcXVPSUtPTHpHbGtTYmJkOUhMa3lWZWdNQlc1VUt3a0dXd3BWYVpjaFVwVnFxT21qOXA1cWxOVDMvLzF4c2lBUkNLUlNBQkFCUURBZ0VBZ0VGNGtjSFBBNHkvZjJtN1lHbzVBb3RDVlNTSWFUZVZHRkFBbHgxUklaUnZHYzVqMEpJZW9jeHp6cEt0Y2F5Y3hJMWhTeVYrNjEvR0N3dXpBTWZRTXc2TFRLZDhvc0ZBY3JOVkRQSWVGczZMSEZ4bE55dGllRGpiOEdPUVFiaFNJdGowMmdJZzhPVmJVZmdGL0d0a2FDc01NUnlCUjZENTVtY1BqTGJZa0k4SjB3SndYZi9NMW5vOWRqVFZkV2hwaUQ0TWprQ2owR1lZNmtZMU41UTRFS2dVaFdJalFwTkNqYktvU0NOT2lYb1piVkY5L3pzTGRHWUdnVmJNendKd3o4K21xVTJzalkxQnJjamwzZkcvc2Z6NnE3b2cyWTM0dmZwZFVoZS9DWjJISDh5QUEveFE4RDNteUFJRE5BVnNDQUpiWm54aTJjSDVzMmNSSndWYU9tMldXc3RQR1p4WVpBMUtJUjdtdDNBekFtdGtGVUk1aWxEY0FtMlF3b2pGWEI2cjNJc0J5VnE1bCt0TmFiY3RyRitRckFRK2xraVVXemlIR0tXYzV1MUZVZE1LTWhueGl4bkFVNGxrYUFuby9uaHVTY0VuSHJRNlFFZG9SMkZJUTRHRm5ZSGtmQmdKVHdObDQyclFIN2RWNklCS3g0R0RJUFRTUEF0WUhjdWEvVXplUDFlcFpKTmF0T0FTcUZFUWtZQ1dTaktvbWN2SjRRL2xZbVI2YldpRVdXVklGQU5hSVRPVncyWlZIenI1TXpDLzBpL0Qxa3dFV1ZEL3pUOWI2REc2MzJpSzRVcUM3VFAyVU5ibmtFWTg2NFhZaUtsVytCUzNGVUt4SERRWW8rOEI5eXoxdzRoMDdCYTRRa2t6TDBMR0pHSXJyWitjTlh1QjNQdzZjZWRwQU1VNkd6UlFxRFc3bnRCK2NXaXNGeW8zV0NtUWpMME1tWG9CcU5XUkZJWkk3Z0RYaHRTY3Q4THBCZmtIc1JRNlhwVmZJUnZaQlU4cDg1RjRoSDhFS254bUVZbXUrSzZjWVkzZ1FlMSsvVHpKQUlSRjFjS3ZObW4yUTBNOGFPV3NYalQ5anZCQ3I1MjF4cXRXVkk2YXBMcGVoS2N4WnVXOUJXTEozUUdxZjlKVGl1dnZVMHdkZ2h3LzhJQlJJWDFWdU5ReXNCcVN0Vk5QWFpEdEwrTml2Y3dpMVBnRC81TzBveW0ySis3OG9uMHJ4Z0E5T0NsYTBnTjBKRVBIWS9ZUDRuaElhd2JFSjJIbFVuUjlEYnpmV01QQXZ4a3J0QTE0eDZqckFtWVVjZ1JmUmxabm5ZeHMyeStvd0xEd2tTMlZrM2RmakFBVVZJSmV3RDA2dHorQXV3NnBJcXhUbDRkbWpvR2xZUVhETWIzMUZKUHMrNjdqOVJOZ3NIWWd3d09jWXR1Zks2VmhDTE11YzRORlRidjlwRVFqRk5qTnIwTFdBSkIzWEdIbTR4N25CUmZYbUhRaFEwYnpxbU90VlRueWVTNngxSGJDL2Fyai9YZS83cU1PbDdNMGVVbkRQZ2h5aXNGOHFJb0ZiaGZFZ3F5RDRvM28ySzVSTHJNSllDYUM1Z3JId3VwRE5zVm9YRkkzKzlXWVBhMWx3dk9wOTFmdmFuR2hvbUppcDk3dXBOSG1PSCt5YjEraExJcGRkcjIxUmlBMTNKaWI3OWs2cFRCM2RGQW83MTRwUTF5UlpiVFhNeWRBN21RRTlSRkdoTC9PeHJIamRSbm8wWGRmOXlFZTBuWEZmT2VyelkrRE8zZmlCV0JGTUFtcUZiT2Vna0FxWFRWbzVmUzY2eU9JVmxMQ1NkY3A2OHVlNHlKZWxoVVB0VTZWbTJqbk5BUHF3V2FObm52MXc3SlA2eFFaYXdTSVBsT0ZNRVVHdXpQQ0JiMmRKVXlnWTZROXdyNkpVakpyNk5aY2JFWXdML2N4WmZlYzgyTE9zTUs0OXhYNjI4UDhOcTNUREVjSUFQWnd3aEx3NThoUEtrNUpTb0RCSmdpVExFU3RQQTUwbTdTcVltTlN4NkZOdjBpU2pVMDR6bVRiTllzNENxemZKZmxtQy9ZWkpnTkJ3REFhQmk4ZUJIVDVIQWs0SVFrS3VSRVIyY2VIQ2pTdFhZaEplTU42OEVmejR3Zmp6SnhFZ2dKU2NuRXlnVUF3bEpYZGgxSnlFQytjaGdnWXBUaHhLdkhoMkVpUnlsaVNKcDJUcEtEbzZXMlRJc0ZXbVRGNnk1RUR5NUVNS0ZQQldxQkJma1JJQ0JsVm8xYXBSYXRTeVU2Zk9WdlhxK1dqUXdGZVRKbjZhdGVNd01mRm4wY0ZlcDA0QnVuVFpvbHMzcEVjUHZsNjlrRDU5K0NaTjJ1YVVVNFJPTzQxcjJqU3VPZk4yV3JCQTZFMHlaTWtNNGJ3NWh3c1duQzVhY3Joa3hlbXlOWnNyTnR5dTJ2SzRac2R0elo3SE9zd0dFd3Voa1JpTTdUZzRFQzRlbkIxbmlKQVFib3VkRUJHUkhWeUlJUkxlY0Q1OElYNzg0UHo1UXdJRTJFbE9UcVFSWEhBUTE2VTRoQzdnZ0NFQWcwWUFCd29LRHJ1RWw2K0dxYkZOUExXR0F4REEyKzJtVVNOT2lCZzd0MFNrUzMxb3hlTWtqckZuMklJakp6ak1TVWhPdWtrb0VKU2lqeUdneDJJYS85WmMwM2IrbjgrZ3FrZ1MyOHM3NTZjalVwM3p3VHIrUlBlNlNlcmxVZFQ1YWV1Z2UvQUhnQno5RjRpbndFOHErSDRPdklXMzlGYmVXcnkvQnFNdnYvS1N1cGk5SGtyVmVmRzVaNElhdmZqeVd5K3A0c1ZYeWhlVlQ1bnhJcS96YnZiam9xWFgxWmUwaGowQVlGTVFaczJCa0FnRklHRnd4SFlOQjlYZGFtd3IzczcvQ0lmZ1laaWZoVDlnYTEweXd0emRaWS9oY25lVFlhL2tpejhLQ0JvcmhGWjRnMWxYQkdHV0tBNzUyRWxJZDlhTEs0U0ZOZFYzMjliRzdSSUlLVTRHRXZoanI4TFUxd2pBMjNzOUJtZ2JHalE5N29VS3dxaU92eVBaRVJJQ0tJekE2V1RwV1F3VjZvSmxlM1ZUbGo1VHlQS09qbTROYnZPZy9UOUdWZnhOQTloRmhRRFN3L2ZSanBDRjJXOE9BNjhpQ3lUK2YySC9ERzhDNmUrbTF4L0lJODc5TkEzNXJ3QUE2OFFXQVlnbFRUQXNZQUNFcWVOKzZteTN3WW9BNEYrak5vV2NOUzhPaWFqUVFQN3lNRmF3SWpRUmdTVU1MSTBRN24xUkFYNlJGOFlLSUlKVW9aM3lnQytRMlFvc0NrdE81bHVNSEdVYUUzZUxlOFZqMGhxcFdBcElFYWxPYXBHNnJkVys3cVJBRmNDZVlpa0E0QlBUc0xoL3dVV2ZPYng5UjZVOHFmQTRTS241ZzdZQ1hBU1FDUUJZTjNrQS8vMU4xZi9rNlMvMFkvMW9Ccjc0R1h4eCsyTmYwdSsvN2d2cUMvTHp6MEVmOU9SQnFqbjFQZ0xvWlE4YisxWjBjOGdOL2wvMkRXZk5tZktwWDEwMzd6Mkx4bjNsdEJYVGJFNVo4SVB2ZkcvR0pvU0R5NDZBTXhZMkRnRWhFVEVKR1NVTVRvV2dwa2N4TURKNzI0UjMvZUgxOFNDQ1M0SWt5WFF5Wk1xU3IwQ2hJc1VNYXRTcDE2QkpNeU1UTTR0T2Ivbk5XMzd5dnYvNTJPYys4WVhmL1RzdTNMTE1lVDliZFh0MmNOZXZYdkx5YVBqRkRVK05nUmNOdU9CMXIzbkRMQklHUnlOUUdEeE95am1vVklPTGg2K1VHQXdBa29QOHdKT09oaGJKQk5VdmhwVU5MWnFEVTZKMEtWS2x5Yk9iWGc2dEVoVktsYWxTN2x1VjJyVm8xY2FxVmdkdm5hTVFDY3VXWEhIVjVjaTRXVVFtVW1VME1NQW10Z1FzQlN6dEYzUmJCQmV3RklBdzVsNDFpamNiQm1RcDZ5M0FFTnQ4MmRBa3dqeG56N1A3OFZVVURCL1ZtdUFkK3g1NmNQKyt2WHZHUmtlR2gxWXNYN1oweWVqSThPS2JGeTFjTURRNE1IL2UzRG16Ky90NmU3cTdPanZhMjNLdExkbE1PcFZzYm1yY2dXQTA3UGNlZmVUaGg3cWRkcXZadVArdWRHMjFsc1RBUCtmejZkcjFtb3ArMExKMVRFZ2dTNkN1dkM1b3lBaXViMDEzWVBNTGJZelRiT0RBVFg1WUVpWXljcFU1SVZjUGZKRGxKK29PdWRzdkxPVXlDSEEwZXBTaFJkNGR1SDRLZ0VwTUVPV1pHYjVFRmNNalZKa0JVQlVCUlprQTJaS05Sc0FOMSsxMHhLOHRpNUx2dTlDUU9jWnd4b2J0VkpZU05ZU0ZJMy9lendpTEpkUUVsVkFWcWJGZlZqN0dGWUtVd2lMMk05Y1NkZ05tOExIY3NBSWx2M3QrcFR6aWtnalM4TGhucFJBNHlEcGJPN0JjZWtoTElSdHlyc28zaE9GYmlVMjlGZ21LWTVKODJ4UmQ4cXlsc0ZXa0VIL2JhbjhsbkR2M1p5NWU0RFZHaVozT1FSREJENDY0WG5XVG1vRkRSNTJ1WEpremxmeUNSTjBqRlVMZXFaVkxOUUVYbVZFbERvdFpOT2ZpelE0UkxiaTBLM1ZmUWl1T0tPRVNNRlR2MTNUdmk2Q1Z5VTdXeE1tS1czVWJ0RG1uSTE3eVgzSGNud2pnb2ZvVTRtYVNVbExuSVBvZDB3OHl2NjZvV0lNZFNpR1BVdjJ0Z21BNEVkYTEwRnJudFFtL2VsdGhmd3VoQUhXS3MrSnMvM3pxdFR4U2ZjWmRXdk1Ca0VrbzJPV2Q1aDhWeGtsMXdRMHRXcWZYeGpuYlhUd0R3NW9tV1o1cWR2SElEYktZeHlnOTcwcEp2ekF6OG4zNU9MUmtmU2JkRFRwWmdOTTlsUUptMmlVMy9IMG5neHZIMjlkQWVZMlFEUXZ4WjR6U2hwUWJoQWpCbXdWYkk3RjdJdko3a2lOMUZKR1dOdUFuMHpNRXlSbDBoMk4xN0pDS2lnQ1BLZnk5bkhOT3R6d25JendtZ3V2WlovVE1CY1FsSEFmdzVFeEhEc1hHdUZ1U2VvM3lDSm5aUmIzVzdVZjNhTlo3M0VZSzdrT1NsVkpzd1lZeUpDdGNHTTFHcmo5OGNuSGhrRm11N1BkT3duMVd6UjBoeFRuUlU4YUJKbXhxSDl3UUlJYy9mVVdCSGo4cXJJU2piTzJoUFc3bFJJYW9ESnBLcDZXclZIYjBvbDVMbktMeUZqMlRIZ215OTZBcFo2L2xxMWlOUFk4dndES3o1Z3MrRS9DWklDUHdjYWNxY25SaXIxUnpQc25DZ1FWYWc1VU1yS0dKNnk0K3lQWVpJN3lqS1RKS1NVTjRvVVQ3R1RkaXhPMERrZmNUVWRta2FCenFQYmk1U2lLZkphSkRES1kxWmwxMnUxUkFPa3dTcDd6SG42UWthaXBOTHI2RTBwSGdtSVEwTzN4Qm5XU3lZMjBjdUgyeldZeE5RM3cybUZ3UDh4azVjS2VEc2RVYWtLbExITkpHOHM1eHp5aE50dEVCaVJETlFzY0NsMnYyWkFuMUNpdHhNRWpMTXdHOXAxZER0ZHFpd0pUTkNmTFNxUlMwQXRWdXFRUElzUUNSWkltOHg2NklOd3BUQ01KQzJ2WUhyTk1XTXc1VHhKNFZpNEhnUlJva2lnRktQVHBuNDVKWWd4cWgwYm9xZ3VIUDZJZ2tRVEtWUHA5Qm1DdHlTT0pkNmJ5RTBsUTFkbmt0bGNpR1VtcFFPOXRCbjZBQlJCdlliaC9vWGFwbkNDNzVHR0l4bDhXK1paT2pvSFVodTdOQzI1VUpvTGRvdkMxVm9BaTJGQVhwK000TjFEeUF6VVVqZVN2NXdHN1piZjlFY1Q2ak1ic0oxQnBZL0p0b2w3TjBqcFFoZ0xoY1lmWWVVWjJCWHFHVUg4NVE4UlJ0ejJmUWRuem5sbEIxOGRDRE0zQk0wUlZtTFhHUEZWUmpFZFFoTFA5RGlKdnBOem9VQXZlZzlaQUxmSWpUVmI0ZXQ1dlBNOUFVVkMxMUpZQk15RXBKb0xhd0hWczNBMENORDBjZzIveG5YSk4rSUpXNEFLZjFHU1VhM1ZCY3VNclhsVVlUdWdab096UGZXS1J1YzhxWU1tbE9NS3dsN3gwa0t0c3dsZjJaUnNyajFoZzJ5enFCYVBsQWFNbGtSQzd6RzRXYUhjOEFCcmx5MG1EVmdQaEtnNjBLSUdzbG4xRkZRR29CSFkxVEd2OUtnSnAzVm9vM09CSXVBNDg1b3JoMGMwTkcyTFg2eVNBOXNHY0JhbjJRaG9iZ25pSjZGZXR1S1NIWExwNWVjTjFGaTFvM01nTW1LZHcwSXJGaGo4MUtpVUxEdlJKREk1S1NVbEtBRklLeFZ6Q3VnVXhYcEdnWmZBZ1BFRTkwTmV6S3pweHZIYlBUVnEyZE9hcTg0MkVOOXV5VHpLMkZZdCtXZFFaRGU0VWJlQjE4c3d2bFFVQ2lGcmJMK3lDN1dxbHpaT1ViMlZwWVFadTFtUFVrVDJYeTcyNk5qMGdwVW1vRVdJZXIvRkprZ2tnYkFBTDREaC8wbG81SkRCTUM3a2cwRHR6UG9nRjBLN0xXTFhSMDZQRU4wb29ISDFsdWVKa1FEUElXVTZNWk82TGEyc2d1bkY1MDhDMmxZR1pQbGN4MlhKMXR1WEZicmU1MUNJVVdTaGI0Zm9qNkxnR2NtbGcrVUNpU2l4Y0g5cko2VFRKZEFDMjRBcEdic2E1aGEvTklyK2g5SWVhWElDaVp1OEM0Skx6V1Q3Z0tZVDc2MzkrQUFqTGxwcGRYQUxibXQvemNkWjhuZkkvc3dYTmJaZHc5bVIxU083SWZnWktDLzRNQ3dwQ3c1c0QxajQwd0l1YmR0cEJOY3NWSG11VVB2aGFrc3hNOUY4Qkxrc1EzNk0vQk9KQVF0OFRCQlNVYlNvandLMzJFWWJlUXJ6dVlHYTluV0ZoT0tUbFFCdzlDRmo5alRHNEozTmdEdmV1QWcxVU9oYjRLQXA5cEhnYU1KS2IwU2xvTDdEb2RIc0xqcHRYaGt2T2Fhb2UwQ0hqRFU2dGtLQ0I0MmdaSnpSRGNQbzJ4TmVKclpEeGNYZVYzVjI4SndrMEhKaFUwOEx0R0RRTXFLT1AzVEdvQUk2WW5iRWtSd0RSazNPNGtpNjFJbnFUODEyeEtiaWlvQk1HRTVETHBNS3JpT3BvdkZMdGJJZTl4cU1xL1NUWXN5MFpRRjV5YVphdnAvYStIN3ViRG5wU3NpQndKRmFnQk1pN3dWV2M3VUhxbG13M2ZjTHZ2bW5WUlNGWVJRRW5neG5IdnV4OFExQ1Y3QUlBdUFJRGRBSDFBK0x3ZytnSGdQNEM5UUxnQkFOYWV2T1R3b3FNSFVvTmdtVm1FeURJN0xyeExIRFhYRWs3WkFNSTl6T2JHeUNHRGJrNkc1VWduVHBQYzMralpRTWpZR1V5dU5YZytNL1RpYkkyY0J4Z0p3a2IwYmdpNGZaZjVBQkNXVDdCRFNNOFllUy9KOG5vNElzeFFZazUxd1pLbTQ0Q2p3NnBUZlFqWGpVTHY5ZWpQT1ZLSjNQaFMyaUlmdWxBSzZzTUx1elk1T24vYkh6aFpETjJHYVBoNDY2WkxVVVpFbVdKM1hSRys4QSt2NVlPT2xGSU1SRkI0K0xqV3l1U3VTT2VwM3FyUFdyTkJvUnZHRFdiZ3FjdTk3MTVrWHoyQkVNRlVaWGZodkw5VUQvT3VtNjR3ejgxSWtzU1h2WnVJT3FjWVJDcHQrRFVpZ3N1RTNRN2J2Zzh6OXFFemY4bWZlSEZuNTVzSlJVdUxZeFEzZk1IWnVPN3ZoazhNMDkxUXhMQloxU2UyaVFOVjBkakV1Q0ZUYm55amVhcU5XdERVT2JxSmVKc0J1bklRN1BLV3F2SFBQRnhFWFRNS1JqZkFEYytNOWI3NVdpdEtlTjJUVHdQTWIwUEE5cTJGVVVHU2FMaHNsakRBVUFNTUxkS1lRSFZqY3dwZ1lLb3dhVVFDMTZycmh4QkRSVS9hWmdiRW9VcytBMTBUeGtzbmtTTGpaYXl5UmErUGhLS05qQlQ4TG9TcXJxQkdpcUdTUmlGNVRCQzdoNTNDaW9lRjRXRk1WMXpLNWpEUG9iakhnUDVhOXNCREQxaU84NFdjTDk0Q281RWRjSWtIbE5mSnRmbW1BRXQrQXAxSmF0dzd2NUx4YlNVM21lS0NXczEzY29kUVVZbEpWdis4dG11ckFHb0UxbnBNaFpleFRMb1BMMGtnN1VleTJNTEV1dk0weTQ1S2x3R2xXeEFobkhmTmpaYVdOY002ckpiTWltaTArc3p2OUJCcU91dGZQVkVqSGpJYk5kNXBhYU5tYkgzRkxKdmkxdGxPeE5zb3RkaU93VDluZVBPNytlU0dGRlR6MFRhZDlZZG1BL3BKOHFGYTVnc2Zhb2lzdzYxQW50OE92aisyNDJXSzNSVnIrY3lPQ0dUWFRaN1pxM3lISlFMUitxZnVTYmdQbDRVb1VubkZNcWx1SDlBUDhSaU8xa2Fsc3hlZUhYbmt1TkllOSs2MDZ6aWgxczhPSzg2ZWtNcjZxc0JzOHJ1VXE2eEZIMGdVZlZzT1lhbjNXU3RBUmY3RjUwdjZ3ZHVLYjBZdjJic3AydkN3U3FGYU1BcnJJTHZZVjBxeC9UczZjRDkvUjB2bWI3cStVajRRSkRIZkx3cWExTDJZU2FLZTZvY1dYVDZFaCtWd3VhUnlIc3BMdGlVTWVmcEpSVVlJdmRPcDVZRisvTWhnQkIycGZ3R2prS2NjZit3U0krQlZ6T1hMR2cxY3hXNERWZjlIT2FhSGlTczAvUjNkZlNpOGhkRnhZaDdNd2xGL2p5aHdEYWdGL0NlMnowaHd3RjRYNUpiRHNGSnVBd00wTnF0anNHTURDVjZHSzE5aGpVQURiUk43eUdkaE9oOHV3SEwzMEd6cXlsbWN2N2FJZzdRb2x6UG5Md3JiamNOdjM2WEthRlp6NGk4UFZIaGVRM29RcGFxTEpESTNTRGtFWExITUNKVFphUEt5ZlFUVVdyODZxSGNXNlpUZTVvTTd2YXRORFhrRmxja1VQNkdTVVFoVldpdEYyVzcxOWZQT1pIZTdnOFdyN0ZtMjR5OGhIa1RtUmdWN3ZqUFJYUHE0ZEQ4MGEwYVpnNDNmQlY1dFd2dkk2QUJZT2dmR3V0aThpL2txeFF1TEVHb0cxbzVmVG1tNm5zV1pyZGx1RTJicjBMZ2tkU2g3RjFNUzVwRDBEWkR3OFVpdFdLRm11c3gySDIxeEQvYm03eHhzOE9IMWxpWUpTVnc0WXVqd2h4UzMwQncyNUI3YUNiR3RnSFpVTEltNnVlYXR4ZXlwclZrcStsRm5CbVJWQWQyb1VUNUNWNlBMa1hYNGthS2JkZ1RtRmhqZXNvL0tqQzhJbWxnYkx5ckdLMzhTN0pqcXQxRTVhQ01pWG93YStVUGd5M2JKNTZkb0hJZ3hQUGdid0pyZFd0bE9HSjdNQ04rMDVpNlY3VW1qaWpoU21JL2VvZFhqSTJXeFFIamFtZlZPU1B5bldEdDU4Ym95OHl2TE40cTkzSmhwTDVwV0JuUkc2bGFhMXBFVjVtL3VJQXBSTjdSWG5UaklybW5BMnNIa1pwR2NHNnlzNlplV1h6NmQ4blRUZnRaaFFPYmFCWG1MVk1WcVprZ05ERmdEaTZYbFRZbTljVTJXWWpwelNTRkFTQnRxcXNTb2xpVVBLVWZiQUQxK3BpYldaNXlhWXppL2ZtV3NIUlhpY2ovOU5wMFp6ZmladEozMTExZWRnZkF0WDhXK21tdjI1MWRmRXdGQXRxRzh0ejJ5RHpMaUR0dmFiZXJXK0pxTmJoQ3h0U2dyTTZxNHNsVEpTNDF4YUNwQkdocHBEcnJpUVFXVjdOZ2RqNEY2aFNVam1vTFNCc3RaVGR2ZGZoQVluckJqVWl6bStnd1Z1OHpxaHNXYjN4L0YrNVhFVURVVFFYUUN4d2RIeHk1dmk2WUhuczI4VWlKaDBuN3hJV0MzNWwyc0dWUXFTTEhmMUNON2dDUUtrZUdnUjhhVFdxVy9CbGY1S0NBUWdUbXVMQ3hNelJqakxJc1I0UWczVmpvNithdlh0bXNDSm9aTU9rY2J6RjFLT0hHRDdaR3lrbGNXTXhzZWlEc1NtVXdDU1JieE0rT01WWWd4S2d3dlI1Wk5NQ1I0MU9RdUhzenVRMSthNyt1ZjNnTWVQM0dSR1hITTBHT2RiR2hmZjd6SWFSRUIrT3h2VGgwOThCczNmL0RBWTNwb0R5clFVdTZURUh5VWg1ZHRjaWMrT0NoUUZqZUYrUkR6NHR2cWREOUZ0T0NpQTJrZklIdmVrMlBMUmZ0QU84ZHhZdTRlMExpejdXQnl5K3dEeFg2Wkd1clphYnJ1ekd6V29PK21DK1pGa25Hc0tUdUx6TkhDSkM1SDhnVXpGczUzV3JCVk1nSzNJbE9CRkwvQkVRV205alRtY1I4VUVrMExKL1FFTURmZ1BIVFpDcXFXRi9vS2VldjRVUjRxR1ZVUzV6eEIwTmZ5clFkblQ4d2ZkRWFMdHBjajNKaDRGYS9HVDZZYzVadUFpMkRqdXdjK0liK25PSTd3Nk1hcU8rQ3ZLYTBqemFlZjREcVFvZVVJQWtka201dTVuUE83Wm13VHpBQTVWVWZ4b3VTMkdGQUlNQWhBMVMrZllZVklwUGNYaUZMRkNqbWdlT0V3QVVkRElIdzYwUGdwSk5EMk9GUkZid0lNRWF4aHBLV1c3Mlg3bG13OE9ZV09GdzJkWnNuMmROdjhKcCtmRkk0WmhtVDl3WmNaYTlnU3VBQlRydThodzVrMG1lQ2o3U3NlOWRLZ2dKUFJSZ1VzZVVWSGFrK3h4OE1RMUZHRGhNcWF1bG1uUExuQXREWUFDUzlPVzZKZXhlMUYrNHc5dkprejVVeCtxZ1c4NWpreHd6dzV3V0FXNW1IWnlmek9SYk5NekNPYzVqZFZwaFpzVXBzZStwR2dScHhtWjQrWjg5aTlwTzN4eGhnNVJoKy80YlVDakVwaDYwT1AxL0dXWnJXb3JpN2FaV3VRaStMWkp3WXAwYk5NZWZaaHd4NDk5aW42RkpjQUs0RG1BR1RJaUZXSnhEVHp3bEhmemZ6YXZRWWQ0eVlNeURTWVBDTE5tSkN6dUZGYnBvNUV1aWlRWkptUWxySXprRXhCR21LcDJMVGppa2lQc0tmUHZGMkpkRDR2MUUvczJlMjZzeGdDcnVDQjZNeVpMYnNJUDJUZDl1bk03cnNzdFAySDZGQmdVbE9CNjBDL3pZNHEzUXkwcHJuY0FTN0paTTgxMnlZZEpaTDQ0Z0lETnU0NjJZUmFUenk1SEtxN0xqeGpGT2NieGFYWnBCMHJiWmJVUFRPYi83cXhrZlRQT2daL2RLS1JnR3o3YmZJc29RMER4djN6OTgzTE40WW92b2FibU5aMm5qT0tIblo5c1JkVEdqSnF4SU9ZTWlkbkp3UlpEcGtUMjJwcGtkSVVOWEZTQmhYS0hHdUJoK2hsMytqNWJTcjJYTU83U0IzVkthWDJCanJPTW0xNHErUnNPR0JIc3dZRk5yK2tZTHpxQU0wM25qQjk5R2pxamthRHhNZk9hTnJXNkU5Vk1sQmlsVFZ4Y1dSaUFKZXYvUCtUNGE0TmJZcUVza2RzUzRhNHJWS0xLUUpOQkpRRmJTcmZqdEJtTW9FVUtTdmpmQWxBbFlUalMwUmgxTkhVdE1XSFc0Rm4zMFlVMEk0STlBUFU5cnd0dU4rYmVubFNjdGlFVFJZbTRnNGo3dDRBSkpHb2Nlb2tPUmdRTTh6MGZIOU5MTGFTUVJFOFdjQzRGZmthc0NiWmhYNms0c1NiR1hOTkxkSXZtUUhPQkdvR1Y0dGdOSzBzOTN4ZkF2cmk3ZW1NQWhhVWdjR0l5eWZmZVhTcGJIZzkvZDhtOTV1OC90K1R1Ny90KzdhNFR4L3NvL2U1TlB3enNwdktSck5UajF6cC9rL2Ivelgyb0UvLy8yU1dlK05xdmdtUmRVMGFLandSSXYxNnBFNUZVZW56YjNvNzVBamdIRU9rSUY5K0dYSTlmRU5ZS0g5Y1JrUHlxUTFHaFBYUytMTEdubVgyZUc1OWs1VFp1eXJGWE05RG1UN0tsNExtbVJ6WVlMaTVSMmZEa3NLSWJmQzVya3hnQURiNlIydVRmZW8xL0phSlA0WjJ0UWJ2NzVpYnVHOXZRYStvTStYYXVpS2FIWnM5MXJJeVFXK3JCbUlvZ3Y0WUV6aDMxOWZkdDZlZ3I4NjVkV1Y1NjRySitKU0srRzdpVStJZWJqL2VMeGZJOWhGWE92RXhjVmROQzk1U3h4MHA5SS9hVXoyYVZZeFh2YXE1YTlqaW03Mm1TY2JzQXoyTGEwT09icjB2Q1E5WUhkaEFwTGxYYS9XTXVvdytjLytxVnYwRHlxTXBYTEptZkVMWDhFYURidTF4ditFV3RKQnZvb1QwYStrVzJPbG00MlkzQWtSbURRWVg2UHJqWld2OTJwSmtVQk5pWDZnbzJkTGhlOFlqRVFPMXd5cWN2L1AyajJ1aTVIMlB5eXRPZDNKT0FNN3UxRTIyL0ZxbmZVUnJkdmIwNGk3b1g0TkRyeWZKTFJvdURJN2FtcnZWcTl3KzdhcDAxNGpGRnhxeE4vZXFWN3I4MmFtYWM3MTI1VUN3dVVkWDYraWxBaWxrdnNXdUdBaFZxbzJPK1ZPSytkV0NmUWNaN1NxQytPcTkvcnJNUElNenVNU2E3S0cyRmpOZ2lMY2szLytvNVZ0RE4xRnhEalJwc2l4TTNqWnd5d1NrQ3NJcnhCR2xtZXhLT3V5WFNxd1gxSXdXaktuVWFOU3J4djdtenFOdVRsVVVWWnEwM2NsYSt3L0xkQk82Vzg1c1VidElLSVlWS0w2SDdIaFdVck9yNENGcVpQRHhtKy9XaDVSUEhxWDRMUk55SWdqUEYwZVVsRElUdEhPZXFyYnVuL1ZUaWZVS3dXaWhtSXBBbzE0Ti9wL2dTcXpnN2x1ajByN1dLS042T0NQeGw0WExCMUJid0tFR3ZZd3F5elViTzduTnF2ckhtN3RvZnFCTTBkTG5kcXV2ZEVMQjhtQjVuMXpQV09qYTVKQXFTRVFyWGRDSDNQRGV3bjJoK3dvSmEvV1N3c1loSzlNaldzbDA2N290M0FGRHNsWG44N2RTaGlSbnZ2bWE2Qk92OG5RT21IVVFUUnd2WFc5L0Q2clFjUzAyWGozM0RiSS92eitmWElidVNwVnZWcXZIMVhmTnZYdXVtaGczVm15K3JRaHlqVjl5WG5SYTJiMmxMZGEvakg4YmJhVXQ3TjZhNFBpbFRaYzNtYmxqSmJveXpvdmNvdTh1ei91UElORHo4ODRST2o2d1cyMTB0eU8wb3JGVW9QWFhOUWJrOVpKWEdWa3JvRzZaTXk5WFVQTGEwejZyU2dxbGdYS2xiVkJicTQwcWNYOTMvdDBQY1p2c2tWSmx0TTFPeWJodktreXRLT1lNL3VWMHNWZ1RVZUlCRldGZzJ1VU8wRGZ6RjliV0JYdGpEanZTSUhsVjI4MmtuQmxML2IvOU5qcTR3TStNQmd0bkVSZUQ1bHpXWURTMkdxMHYvMENibTZSYTEzd0g1QS9ya3R5ZkxlM1kyczhxOXJ4Yi9LdXJHSWptSEhwUS9zYTlGKzNHMWpSbE5tWW9RdzVYMDhYMmZ2clRQbUtTWkR4ZGpNdlVwTEpIcERrZEJiY3h3UlQ2QnhHQ0JzUXgxS3J0U1Rtc2VBQ1pCeDJ3a1YzamZMVFkwSUo2Z2tpN0tlUWNYdWdMK3ViUWo1WFBidERvekJtem9jdFJhK3pOMmt5UXV3WWJLWDNuY29PMFdsa1FzSS9PQ1hyY2ZiN1BHSEpmeWY0VFB2OE9WaTJ0c0p5Yll6Y2JNcmdyQk9YR0pQdS9PaG1CRUpVZmpnbmlHQzZKN3dnQ3VHQzh4eVZSRk5rVW5kNUFWcUgzTEhBeTgxd2swdVJ5SldHZGI4ajcySUMwbGM3TmIyc2dmTTI2ZVVPMllmYncrMW1LU21YMEpsUFdaR3cxVVliNkRHa3laU2xEZXNOdDFiVVhsMFo1bzZFZmU1MEFXbXhzUWQxQnBNTVlkQTR2OVB1RFF3SFhpSDk2Q2I1c01lZlNCb01oWjhTYU0vcS85QzZiTEM1TkdZMHBLZ2haTy8zMnFUMFZVQVlxSFdER3FWYUpoOFRWSDk3TjBSbmlrYXBkeWwybkJKSVpWQnFqdzFDcmpnTGE2V0F6Wm5CM2VZRWhvc3JMNUFZSVoyYTJjeHJuYkwvV1JpVVJmZGkwNE14czI2VHNHMU9sWXYvUEg0Y0FoVG9nSittYXVFSWxpZTBJQXJKTEpORG1iSE1vRTBxci82aUxuQ1NqMTRkOE5INXFhVlc5UVJBdElvdTB5N05rdHV4RVhPTFVHYzZrMjJEOS9UYzJzL2pmblJBaEpJU2hqQXUrNlcyMTREMVFNZkVCZThuZ0krUWtlY09tTkgvNytTbWRNUEdkYmlFMHlhdGd2N052R3I4S0JiQ3lJQWwwMmxvY2RFZTYydXZjYTd1czJkY3V5Zks1eUNMMXN2SmVkNjJ6THJ3UzhuUjduZGloMlJXTkJ2aFN0N29wVzRzM0tHdjlKNEk0bjhmU0tDUHVYcU5BZWFOUlVDUXZObWFWVEJCdU54amhObmN3aXhvTUdkUnpybTh6R3VEMnpTbnpaMFlidWpKV2t5bHJNL1RZZDlZZEVveW1qTjNZYmIzclZyYndYQnpwb1BXSnZCM1VlYzg3MTUrNXNiWENLWk5wa0NLNDJEZmtjNDJFd3E3UlJYNmZQbzI1b3VmNWlkR1dldDg4cDJ0a1dxS3doRmdKV0hNdFJyTTVaNXkxLzY3VDNDUlI2MXN4WDR6VXU2TXBGRGRucklidVdnZlZ6YW5mMkZ0Sktjc24vNnJNclNuS2FFemEwK2MrSENwbStyei9lY2dUUk4rLy9iVldZd3AzaGFHYzNtOWRNanRRaHhOKzJDR0lvU3BKZkhzUXdnWGp2YVJsUDN0SENBSzArZE84MnBoUUdqZVljOVo5dU80dW5hdzBVK3V3cE5TT3FMUk5iZFgwTkR1c21BOE9WVDBua0RWOUpWQUY0QUZSbk04dE5qVGh0U0ZaVG05QTJsMkJOS2EzNXFuMkV5ZElUMkowTG83N29UblFremFkLzJzeEVVU0sveHBBcmJydWxCMWdKajM1ZlZHVzIwTVdhVlk5V3VSbTNWSXhyZWJmNHRwKzVaS094NXNoUFZObkpJRXVQOGNXOFlzY1NoM3BhcEpTOXJSODhQRE9MTEVHT2pjWEViKzVhLytsWnNsL2hHOU9ndnVidkNkL2NYMmRUaFZLS0EyVjZncjVKeHdJOFp4QUNGb3A5V3V1YXZOdDJsUXphYUxxRkdxdkdoVFNna3VSOG9iK3NCWU9lL1Zkb3U5RkZNOTU2cmhROE1PWWVGTkFHWGlHZkdaVU9icE1tT1ZMdmlUNS9tTTRDYmZUclM0OGp0aTlmL25KQ2RjeDZTMnpOUG5KL0x4SHROanJxYXRmS0RLUzVNMXZaMUN2ZmY3NjUyU0lWcCtlUWJvQXZxQU1HVjZQcjUzNGRQYU5wczlVM2ljOVR4S1Z0bis4U0FNekh0bFl2dnpocnkzdkY3NVhZSG5vcTJYTEh2N0svRzdCZTRVMWc0Zi9XVlcvUmlIeEM3MC96NkNPZnY3YTV6cmgvcHovSkwxSzh3YXJhT2J0MWxmNjVBOUNjMStaSTMrVTd3R21WWVRKb2g2U2tqMWcxNWNjMlM1NWQ4L0x3dUxZUE9BZUVJQUlCTTRnTDdvV3EyTC95VGNPclBMZTVZTFU4TTdPN3RzK2ZCc21Wdko5Y05WVUVYbnE2Q25TZ0RzckVQV1JSc0RaTUpzbisrYUZXNktZaHJHVTUyb1M1UmdhNXZtVkZRdVZDOHNoZVlWWkZqQVoxRnZqOVFuSEg5TFhlS3krOWljVEV5eTZpNVd6ZWh1aCsrcTcxeHg3RmxIdFhNU0VKNlpoaGVTUTVENXovVVVWaTVTTFhJbGR1T3kreEVmTUM1RDBzUXpwcmlYVTlSYW4vVE9KcWtFdFdIZTJ6S055ZWlKKzVvN2kwVlZZMjZ6cFh3Q2x4Y2ZTWkQ5Qzc1MS9wY3lZTXZDMTR6TEpWZXhVUmgvWDRuVnFVcFVJWExkcnNBdXBWdFZ0ZnV3WnI5Z0xNUElpUk1zVmpxOWdhSnpHclZKQ1NjZW13WWpmUHhBQm5sVHFRRlFkakk1SE5vZTFDNU8wMVpLaWdZV0JMWUJkTE5Zay9aZGV4Um9WNFNCMmZMdzFjMFhDSXZtenEwcXJ5RktCU2ppVGtmb1ladlRvN3dzckFNSFpmelJBNTlZakJaVzZQMTArdnNwZWorRWVCWnJaOHVlZDA4NTZ5c0M1QkRmdysxY3VFb3BvcmFaVWw5WVZHbkxzalJCWkV4UE5KZ0tCMXNabUhsNlRhQXpZOEcxZUdXRk5HNktDYytQMUlvMHRxOUxIS1lYVWZady9mOFdSTk43M0JmaDVra2dlcWY4WldTMll2a3MzRWo3cGZxaTcxbTVvSk1nR0k2Vk4xT0Y2TW8yL3I0bHVibEFUUnQ2cEJrQk45NW50WFl6SDJUL1B6TVYrWWVpNTg1eHVUVDFZUy84MlY3ZW5OVlpyYTNWUzZPR0JnQyt5c0lWK1kzZUtYcjNBRS9BTzBzNzVsOVlZMHBTTEdxbFVCa2lvRFIveFZEcXQ1Ny9BM2FrKzFUZHVMdUc5YVdmU0F4cVhiNDdSbGpXcThZQ2JEQW0zWUJBR082K0hPUXA1bUhNZHBqRVl1MU40RDZOWEJQZ0l0b2xoQStvbWhjbW5SZEJSTndzZ211VW1mKzh5RkkySUVIbFliRzFaTVF6QjBMRGtOd0hrRTdUVzRmenUzQzB4aHpWM2IybDYxWkFuNkJtU0tlRmFLU01JR0tsa2VBOXg2NHE5K1hOZHZuNW9tWTJXcnd6MTlkY3kvdG1NZnc2MDNPS1Vyd2oxenE1VjkzQWs4NnlaUnFQRmxyUlljcUk1cFBHOGp6M1RiRFRWV0MydHYrOHFGcXNJSTdHaFp5cysrVDFMWFRQM3k0L3p5TGNhYlQ3TjdkQUUzZFR0aWJqTW96eWtWb0tlQUdZMnhxRzZzMktJZTdSSmFnM2tUT29NWmNEOGJuVkVKcVlGNFZySGE2TDdpVEpwa2JNWGMwVHFPR3pLblZHYURVMkkxb1dwelV3ZjVBTlZZTStnbXlFMDdnUk1NaDBXSXNaeVVVbWhodW5YV1pNbTVmKy9IYnZzMDhtREtyT3JjYTVhc0c1aURqN2FKYlk0MFhuT3NFWmNVcXdiRHYvbGZyRGJVZFdweVhxSGF0Y3hiWFRUVGdiZUo3OGVYRjVuM3p5TFpQRnZyT0RnbmhPQnAvdkhUYVdMV2hINlRkbjgzZlI3c3RFeS9YNXY3c3JRSzFYWHZGMk5hWVBSTnFScURCaTQwZi9uNnhRbCtMNVE3WVorNDNwa0VOOVR6QUNZbW9HdWNUeFNpT2N0WW9BM0poQlp5S1hWd2p1Y3ZCbzVHSFJxMWNpS09ML3N1Z1Q0Q0dobStndzdLOEVLeHp2U3ZQNHhCOVlKbVdVN0p5OCtJcFU2REVBMS82NFJQYzBJTlQ2M1N5TVpHd1B2MzhlUHM2NEM3RmNMYXh1MHFjNnE2dDBRNlZFQ2NFTEpjS1ZjMmd1Q0lJMnFsWjkrdS9uWjF3Y2xHQ05va3dESHhyNGVScVNIdlh6dTFPeWZwSC8vejc5aEJzeXpUMjk5YlZVNGRobDFpWWNSNUVtdkJOTkVsTkkxQWxvcTF6RVVKbEY2Uk5MTjB3RDg4TGZ2N3AwK0NiNE9iSmVxMlhOV3cxdTlvQW9OSXAvbUpYd3BLL3ptaDkzNVBnUVBaUmFOUk5KTlBwVWZ2T2ZlT05sZGhGQW8yZ3FBVzhWQ1FkbFdGMjczRFpENmFaTnlWbTZPN0ZsZkRhcnlpcnZFOG1mUTN5NUxwSGZSSEFDNGVKZEU4dXZNclRYYUdxWkRKT3JVODJzYUZ3akVYZkRwanpnbFU0Zy9kUU00SjZhMDRqei8xVUxjaitUZi9ORlRpTldYeXV2OUhVQXczQXZlQlNNSC9DRHV5elNIUjlNTGZRK0JXOHNFUXRFMkVGZ21GQXFKcGRYZmgvU3k4M1dPZXllNUxGaUhnS0VwSjNobC83V0JiNEYxcmw1T1d3WElQaktaQngxeG9YQzE4OXdkdngvaXp1RmRYanFDUEkxUFZGOENPSzk2ajRkTWRqa0JkS3JpdFNIVTduZ0ozZC8zZjd6L0oxazhFelQzenhTTkJhcGgrYjZ5MVRXMHJGcU1Lb2RjKzFTMUZIMHlMcURDQXZEcHZMZy9iVUVxdGZGZnA2cHhwdGxMK0tDRFRzQjExeDJKbDRvNEwxeXZLY205VXVNVllNY3Y2WlFja3U5V091dU9za3VyYis0Y1BwVlBudC8xNFpzYlNDZE9CZVVZNWdPM0FVZTYwU0x2dytCU3NhcGF5cmVFSjBwc1pmLzNXaE9mRkh6bzdvTit6enp2LzNsOGpNVnByc3k4d0VsV1pTcU82SVJNZHVYa1Q0OUlwV29LcUM2K3EwR3ZjUWsxSHNhbGtUd3hkc043NnZoSHJJdkFQMllSWFpMaU5MOHJIc1hmTEpsUzNNV3d0ekhjdkRjZzMrZm1ibTlUOXY1YkgzOWMzRGorekxqbDJmRVMxNlZ1dkx1b29KRFgwOFBqOUN6bWNXL3U1ZkI2dTR0Y2h4dXhSdlJ6eXhWdDhiSm9WYk91bVJVdFl4cnh4bkRNdzJFenZOeDM1M1RueU85NmREM3NXLzhsKzV6V2JKM3NLVjM4MlhMeXl3M0tXM1JmNFBvdlBrMjNNcVJjb3Z0eXZYeW41aU5jKzlHbmk4REN5V3NDOWlrakhOVGVTek1mZkZOZjdjd2NDdkVlZk5aTGU4Z2xobUZHNFBpYjRqdE5DUkVLdWJuekpWNDF1bW1ELzhGTVd6K0Z2dEdCZDNDMHB2SmQwNGN6UlRXYSs1aHhFWmRBOHhmRmM1cmpJdXhkQSt4NHo3TGN5OC8yQ0E2cERnR0g4RVBsbnByRHFzT3p2SWNiOFVaRlhxNW1OMXdkNVNMam40K2JQeHN2Y2FxSU5VUlJvL3pXMlRhOXBYamR2OWYzRmt1TldLem96d3FncXJ4U1VYYW1lUWFYcFN5TVlXVzZsN0JZb1pMRm5lSDdyMHdobTZvQ0ttN01pR0ZHYWZINmYyN3NLV2FYcGVVbDNSajFBb1dWTkdPR0Z3eFlkMGxKUUxJbi9ycXh0VE9tU3NKZDNCNTFoQm16cFJvUDJWYklWaFI5bXJSTFY5aFgzTnRvVFRGakVUV25CK25DazdsT1UydnM5U0xYWmVJaWtUcWZhSmFldndKRnhibERxdmQzdnI5RGRXNy8rNkpGQVByL3YwN3IyUTZqUWZUUWU2THpXUFBCamcrdWQvNFFoSHdkTnZVZmRLUHN0bXhadGlxcnk3S3lnYThZeHlzb2JWOUdxdHRqNEN0Z3RiT0d2aXZycU03b002eU9zbHQ1WlpoL2tzcXFod2ZBQnJVOUpFdHIzS2JGZlJGUDRjMlNtNFA1N2ZTdXFXVlI3Ti9YUlM1dWNHbnByeDVUdlFDZS84VW9SZVRxSE1qTEQ4WXIvdWFHNUhzbnV4NlJBWTkyZWJ4UGVMM1R6UktKV2U3M0R2czlIWThDd080T3Izdlk2Mm1ucGVicGJzOGRtczhVc1hFWW5vQ2NjZ1ZFajhQUVY1Q3JCS3JVTElJS2x1NDZlMmNCeUlPVzZ5WmJDclpoL1Q5MVE3NjZRZFRxY0pXYk9pbzZYMEorMUY5ZDNJR29PM1FrQjFVaElyTE50SlQxL2RmLzZ0ZDlQL245MDYrWEZja3BCd1BtT29UTzZIVStYR2NJakh3T3lMUkRIcVduRUMwdyt1ZkoxSktnZ3BFd2NqVVJqdUVhZmRiMHlmOUxJbG9VWE1DRHdMOFZMbkZZQzhUVTdxVlYraXJScnkveFdTK05MZDAxUnlCQ1VUR3Y5MmI1WFYxSlpQNS9OVHZnSFVkMVI3ZkQyNFdmRGlDcE0yM20xM054Sm1LeDl1a3JybGhGN3pDNlpydDgrMXJmdGUyNFZlNGk5SGEwYU5VSit4WExCL1dmWmZFcnlwY3RYN0hpSHo5bDVOTG1CSjdBVEhFOGZ2SXdkanZHZDMrQ1lBamFUa2tsMy96M3dCVmo4dk1tenZEQVZiYXNBZ0tHMU9mQWpJbUoyV0VQWnNGTTJJWmI1TGRzU0wrN0JNejV3cnZONlJxeFNGVEQvK1c3QWlEL1R2T0lXSnI5azh0NTVYaCsxYVgyVTZxbmx4TXpHMmFRY0x2ekdYYWZ0MG9PY0ZXdkVWMlpxUXJCdERVTzRETEt2RDhmSmlVdlArZnRoQWZraWdHUWlsTkFqdEJVWXFYNC82ZUZrcyt1QzBYSHpxZEtXMDd5TmtKVHpudTIrL1JHNkRIZ2VsYWJtM3o5YlVkNVh6cTQydGpaWTlwU1h4a3NkLzdtbHN0bUh2RytPNlhVZTJJQk16bFN6OFZ4VDhVRmtoMmVReUorM3RmL0cySkNsZUhzYnpQOTBCYlJuQ2F1OUFtdWM2WlBHQ1JYcEhQRGxOYzlTbVl6MVBLUW4xeWViaDJodk1wUXRmYkl3cnBxTkxURzFObGwyaHh2c0czcWFWOUxiYXc1K2RiR2F2UXBOMXNIT3l1MndKTGY1VksrVU9ucEhUMm9veHY0cU1vZFZXZ0pIN0JOZ1pIZU92dGZkL3N0S0lOcmNuVlN6TnhDdXBQUWtBUDM0eXNUblFObXQ3VmJaYSszVU5wWWdqNVpIakJza0tLMFFRdHR6eGRYWHB4OGRjT0RydEp2QjNZdFgzOUc2ZjFUWlkvYlZmWkUvb2lKN3NVRExsdDl0L0taRGMxNXIvZGtldU1iNHVDdVY0OVpFUXlrbjJSWU10bTlSUU4vbDNXR0FCWGtGTDZJb0hmOG42ZHZBa2hHTHloN2JlZ3ZoYzRVU0NvSWNQbmVxYWVYWHZnZ3dBZWR3dDJ3STY0NURYbksxMjFIaFlCeWpWSzA2Tks0LzQ4YUx2b1hVeTJ0NFNwZS9rVjJ6L1RZV3FxajNiQTJHakdzN1dqYm83SFlPbXJXb0NVU1BiTjJ1Q1ZSc1crRVNEWHJSdngrY2lTWkd0WDRmYjVSS3FVZDlubnRWQnArOUl4MFluRUpiVVVhS1dWTkhjWFVLOHkxblpSN2lvOURMUHlmUFN5WFRDVngxNzRucWxsNDlva2IzYXdJTEtodVBhTFdQWFhOdXp1OTJ1SEVPYUo0K2VqNXZhK05xRjVEeG1RMEtIdHl4am5qMDZwNUI5YTk0ZjNhcDZvL01WVWF2ZjB6V1BKQTdoSjhLWWVjNWVXVEF2aE02a1ZKOHNVemlJRE12S1hVYjVCK0pKVzV0OUpSbWZRb1RoK3RabjE0b29wMXRMR3RlR1o3VTlPMG1jNWx5ZFdiQXpZWGJkeDJwK3BPL0M4elNRVkdqTy9CM3RsRDdPODgzRmsyTnFWV0hwcHBXcG5FazFuL21wWm9WNmFKZEpIbU83TzlRVkpTdjBodGE3Q1U0SnR5Y2JndC9tbERyZjRVWjhFUGdLVWcvQ2NJL2dHREpmV043RWtlK3dTYjlUdVhOMWttM0NCZUM3STVudDRDb0RBbG1pNFExRE44UVhkdkFWZzQyMDd4OWZmQklyaW8vcnMvSzF4YVY2UnM5eHM3WHprb1NDM2pReW1Cb0FuYzBmTUdwQmhocHJQZXR2eDlycmRYc3ptZTRRS2dzSjhZUHIwYWFidW5xZ0F4TVFUUUR2K05QY3d4ajJPeU02ZHUvM2ZubWovR3YxMWtQUUlCZk5CY0N3S1R3M1VnUzV3RnJBQWRSeFZ3UmdXOHFRSXVoMXRIS2xPa3I5cll5MThmYW93aVcyc2c2N1lHTDFqSlpNSlV3b2NxNFR1VnlCMi83UUtLN1hRYm9QR3dCcUxXUUQ3V1FMN1hRSDZ6WVEwSUkzN282KzJnYUFINzEyM2QzN2MvUERkY0swSUFoL3ViRVhLM0NXd0hwMkV5UE95Ykg5clltZjBCMlBzaEFQTXNTSFptY2V2NEZzZnV4ZjM5eGYyelYvLzdENHNYa2JnWmh0bDhxd1lPcUlFSDFHQ2YrOEVmTDlOcU01K0d6VmYybjIvK01FZTBtVWV0WmNCZS9TSG9ja1ljY0o3NEJyeDZkUmdBb0QwNEIwNzBxY2hvellMa1dvYjY1YTV2OG1lV0ptb21BR3B3bVBJZlFCZ1c1TzhXYWpBSHZvMWR2L3lpNDhiN2Jmd1RQWjNzeEFHdi9hZW9ZUUFndmw5S0V3RHM2UjY0MGZ2MXdiSHhTOUgrVDk4OXJTck5icTNuTkwxZkhsd0ErRVJET0lBZmgxemt3UlZIV2d1UFRtRWZXSy8vM1h0TjcwY2V6cVhiUkgvL3M2RDNiMytRc3p6c2xOSms3N2Q5R3hsc1RDSHB4ekk4dSsvVDc3ODRRdFc4c29IM1ErakpCSENSOGtyNFJ5QStmNnVETXo0TWNqWVA5N1NodjlIQ25wOEtmM2lHVWd2YmcvZER1TkR4U2FJQUtNVC8yMWNaOEtEOERMM3h1VGhGY1cyaTRwOVY3aFhMVzBCVkgxeUhsNHQ3UEwyL2xRdW91emhYNzRyd2h2MGFrYktucDg5N1BOTzdGSHpqb2l1V2xGTmVzK1Avc0JiUC8yS25IZHo4dW12clBaU3hGYkxpd1Z4eURVb3hwUmszbCsvOHpNZVBoNVIxR0FjQTdzclYrNC9wQW1KWDI1VnNpNGd2QXdxeFdEVGFFRkp1eURRMkVjbldYcWxLb3BLcHVhblJBRFRBaFpPMDdYWmJLamtibG5XcDdSM1lhQU5UUGI0cEdUZHp1VU9xZFkxV2llOG1EM2pvY1QwNlV5d1FBVWxBMjBZQm9LSmxYUkFKRE1sTmtNWjd5U290WkVRalFJL0VVY2xXbGRXT1hWUm1DbGVPZ3JZV1ZJMUJMN21iKzcyZTBkTnJzTDBDNGRaczNvRUtoYXh1TnNuQkViRnhNa1NFUisrWmpMWkhZaEpWVjNteG95VlJhVVQwcWpvdnJlZ2NWZFJzWGprbWFGRnRFZUpsamVRRlZRcG1VMDRRY2JDSGpBejFpVUlhd3ZsT1hrTzZMUjZrWGVvbVhNb2paUk5WM2ZxcXgzN0hoN2ZVZWdEVkMxK1pxRXdscTY2M3pjeTkzcTU3NCtxdUFyMHR0QlVxZitKdGpGaXBjMEJhK3lsNWE4Y203WXpOcktOQStJUUZPM3BmMWZyVmJlMURTcGhOV1J0b0hlSk5oZnNYUmVleHF2c0ZxU2ZVNzU2RTFpeXJzbkJaV3hwWWFHWW1JUkt2V1M3ejdPZy83aTRnZG00SkRhUmNtaGpySzFNNk4vUmFjbU9KaEdobDlZMDRIS3hralovY0d2S0NuQXJ0ZHV3SWRLMUlSaWhXdHN2b2I1SFlXVmFoQ0w1N2laWlM5U1VxK0RUSDg5MXVBSWp5bFZlbk5hMXRTaUdiSFNuMnpYbG5wOHVxZDducW1QbW5Dd1hteDIxWDh1UEh4emdmRUl0RXk1OXR0OSt1djdMWGRsUG95NWw2NzFsNE1BSjFvNVdvS0lGMkYrNlhaMVR0NjJMTjVndXhXV1dsRXRNa3hQZmR2TnhGcllnUjEyMVJsMnZhc29EOGVnNjNzRjR0UTdsUWVHeGJQZUxNQ1RpcXIxd0RMK3ZTSmZWMis2TVhmVzljRU1QSzBMLzg3a0VpOFkycmI5VkR0K1A5R3lMdjVjQldKMW91N2NLZEV4V2VyOGpQNHd2RFNzK3o2QnVQYUdLT0wvQ21saVNhNGJ5aUx1ZyttUkJSUmZCQU43R1NaMDJDNFhIOGVwZFdyL0NCOGdiVVpVcGVTczV4TlFESU9ZVkExRW1JZWlLWFdLWlJBMVZHVENUeG9tT29nT2pRRGNmWCt6MXJsT3loblV3dEVQWmlRRFNsU1EwWEhPVjVzaTllNlozcTY5Qm50QzIrNnZQb1B2Qys0KzBWYlR0NC8xLzh3WEl4RzQ2bUU0d24wSGkzL1hBUXBpTGdBRlpnMExqNUtIKzFYQnJIUW5waFRaMHYrM09qSXArNmIwZ3M2dW9TRTdxVndqdTN0ZWg5SjlCT1hjL0N3RHkvL2FVbUZxbEZMTW1INWxVMVI5aFJVdzRTYUkzMHFGSFdBbm1tU2xxbythdHVHNFhzc1MxNXpmMVNzeWw1YlozYjRwRlg4N2F5QWNkbWNaK3pvZWh6em9YRWRhUVNaa29vTHZtVjRMbXp1eDZ2RXdXN1JWQ0V0V3QzZEFVSzNmRmlaMWFkaTZWT1FYY2g2bXpHenoyaHpqZk1LUXFUamlqMnUyYXBqaVRQcmFSR0o3N2FOalRwY2Q2Z1BKQldBUDlYdGFwY1dQOXgrakw4amRQUHphL3dxaU51ZkRBdzYzYlhLa2xybXNBZStRVThKZnlmQTJ2cUYrUlAzWW4xM2VoaDUrdTVIcmJNUklZdzlQTHRvWDh3T1lHMWtYZUM0ZWE5WjAyTTNhTWF1bno5Y255YXZYcjdMRVFQSHErcXBoaUpIeTBKZ0pnQXlzem9tejNUbGxZQkNkYkl2Uk9jVWVMZ05aTHRMT3BGcHJYMDRXS09nVjVBbGl3OWV4MmJNMndmblkrbk52TVYvaXZ1L2hPenhGSFZibEpEV2FOSjZTUmx1Vkc5c1ZxMHhyVkVYVGZVS0J1TXE2Z1BRWGRVczFJeVZ0U3dKV3h2aGQraW5YUTlJQzVLaHhITE10NGZuSm9zdXRZTXRxWEFMQnZuUUZRQm1IT1dkbFZyK0RUUHhsSWdkMkdNcThsaFA0OFJEWE91RVFNWmk4OStZaWNTa3RnSklMbm1MaDRPaDBPMGVNcXpkbzlieW9md21PMzd1aFBySklkY0w3MnNFNXg4enFpb1ZZbWt4VkZGYTUvYmxhbzNBS2doL2tFT0FtUHV4NWJETk9RcTFiSUt3VW1KaGlZSEMzQ2NtWkx2a1dGVmtRNVplam5FOWNCL3NDSWk0bFUwa1k2ZXRSVU5hWHVvUUx5dEowTm95Mm9NQ2dyTGlKQ2RRUjNEQk9mK3l4VUNqdkxmUUZiRWVhL1RsNzJTdU5PdXBsVCtuQnRhV2dybHl6TmNST3hzYlgvVEZkSnkvMmd4UGEzb1UyR3BZYkNoTDJ2NUgyYXlJTldOUUwvem1LellxVUNzclYyYXNyZVhSTDcvY2w0YVQ2N1NNVEF4RWZKTHdoT2hOaFhPSnUvcDB3Ti92Q1ZNcUN6eE9qZk41ZUxSTE9DS0ljK01yMXhlNmZBd2JGc1c0TDRjMjdtK2F0b0FkQVRicGwvTjNSSmdiQjBuZk0yNkxmdUtrUFJzRFNFQTBWTVRqZERYWTdKNGY3OCtZRi9QNCtzaFYraGNsWlRHZnlQVG05MHVWS1BSY0JodXRLNUNLV1llOXBnYThjdUNxUmpoY01vNXhOaDRRY1k2SlIzYWs1WTQxbTVTUkI0V0ZGVXRzaXFBVWpVU01CWjY3UGNNSWRCTWEyaWNGSjdVN2oxV3NmMU9heUdjcXpFekMzaUFXVWE1Q2pXYWMzaXYwN0NTSlJJbUdGUGJpZDNPcjVXQ3dMZjIrNEoyTHNiVTJVRmhWU3dUckZxRHpJYzRDbUJOakpEV2xWYlRhRFFhNG1Za1hwZHNreUozZFRVZVQxeEd0bFRJSnVGTU9HbmhPbEhLa2hORUdoSno5QmwrakFsRE1Db0RRbXFaekJXeVVWU0lQSFZjNjJRRFpnOVBITndGWlRERWtJa2xtZ1FpWUxCUWtENEhZOVZvckt0YUFvU0xLQUZwTmNaVVNobXdJTzJzbFJXVE5qV21WbEI4ZjRSUnZ1RmV4d29xUTFaa0JhdmpodUppM2dvZHlmREpLd0x6QUZEdm9oYVdoRFJpSjkyalRvd245MzZ0dXdUaTNKbFlsTXR3T0N5dDE1dkYxYUJsQW1aQTgyb3RPZElHQ3gwV1FKb094Ni8zWTFuWm9mZm5sRGxvM2IvSDlyMFNJRExtd1lPdUpjOWRhZjJ0V1JLQUxhM0RWOXBCR0x0bWJ2YTNwQzRhSjYwUjZYcWJHYTdSKy9lVC9kNVFxbitvOG9kWTlXQytwdXlWMDFoaUNId2NvMjRVcFZGMUhSMFNtdjE0SWNxVXNOQmpwWXJhWG9wQkY1SmFoNmNxT2svSmFGWG1wOGxrMEphTWdoQ2tGQnZRRFB6ckZwUXVBT0lzYVkydjkyWXdwMTBnTkZFcGNyZGg3dGFlTUxSdFRNa3hHeVV4U1ZWZ0ZTbVhaYU5Qc3hzWStJWnA4SkdreHBPYkFGOU5kMGFXMFBQd25ycjhIakNiQkN0N3BjcmROeStIMjhtNlErcFhqNDgrVU1IS0MyRk5qMlEzZWYrM2FScUh1UkQrbWIvNVNlZnc5NE1hTUxDZkdWWlpDU2Y2UzQrSmUvUGhCK1NtSzFKZk9EVTZFMVpVcTVNdDZ2V2M5emFPVTlWbGtndnE1SXpoZVhxTGhZM3A5ZE1QNzVvLy9jWGhMR2VmSGV6YUs4OHpKVjFmOC81NWk2cjY5ZVFmWlhEMzFsNzRwT2JqZXJQWmZSazNjNGZ4L0xVeGVZZ3RiTTd1dy8xcW9lOXpiWW5wK1R5TUI3ZFcwOS9CZHl6S2JxdGVLSGtzR2x5UVVGYkt4ZDdOTmR4ZEVrWkFBQkE4aWxNUEd6dlJTZ0dCRUR6WU1Ybm5VRnpSVEhVU2dOWjdWVVQ2a2VBZTI1cHFmOVFYMWY4NHNXRGlJOVBIRWJVNFpXdExZTFBFVDZWMFFObTllbDlpMExROUhlOTRRdkNsdW5JRUdpUmNSbXBQbVpRcERRbm1GNmtoQUFQeHZ4OS8zMy8vOThMSC8xdFNOS0lmQU1CYSt3OFo1QUY4UEcvOXM2SW4rZTVzRGdHZ1lBQUFFTUMvSDhnanQ2dnIvMGE5VTc3WFgwQm9LQlZDZW83ZzNZU050NnZWUTZXZDRuL3dsZXE5UWxaTlptMUl6eS8yeXVjTC9Bb0lSeTREcGZ1TVEzMndKTXJQNkNMUFVEZmg2dWVCbGxyaFJmQWI4SU41VzVlU1ZjYXBPK3JhUGkreGJ6cmZYYXpvN09kOC83TFkxUTZnLzU2bDBwZVpCQXFvL3I0dDRGOHkzK2hpQ0dlNG5rQWowK1hXVWdrdS9teWNmVjJ2eEUwWkR2cTdUK2FVdGhPVXpWZjlPSkFWV0FtQXJ5NXZ3RDRuelNPZmVZMmRwVXR0MithQWZaNnFkME5sTHNjNCs0azRKV0Z2ZjlRVHF2dEdMZVJqWmhPQzl4WjUxY0wzc0lEOVE1VWpaZHV4MndXcWtLcHRGR1VJTFpsSEx3clpJVDdGVUpjaXBCRDhmS0U5dSs4LzRpMFg4dHZidk9ZRTNCQ1BqYkhsSGp0bUl0a3h2aXNpMm9FdWZKeTBJUVlOekQyNm84K0swYkZzbDR2WS91SUpRSFlvZU44K1dRUTZkd0pQUzFpSndrK3oyRlMycHllNnJjMHRiVDNCODFMZmgyUzdoaGZVbXJGeUxxMEVvbWlJYjUzK1lLVmU3NUxNZEF3RGtKc0NjLzBTQ3NUc3hVK1lXbS9LZXVmSytXamNzRjdaWkZ6YmhURWozcG41eXhVdEQ1VldEc3N1ZUN0aWMvQzJNZGZJNTd6STlyMlFIdU5TZkwyOEp5bHo1ZGs3RW5JUlAwdnRYd3h2TzJEck12YXJ4R0pFcTVYWExMK0xGOVJ4d2VsSWRoTngwYlRIdEpvUlBSS1VUaW55bFpJRTRFOVhuYVVUUURnb3hCMk1BcEFuU2tOSzVKN3U0U3ZCdG5PL3NtZS8zdDAwQXViSi9NSGZSK2s4WkVjRnlnTUFCTkNRZnJRMkZJd0R0VHNCK2g4Y2c4TUJDSXpEb1NZSEFKYkJ0d2JFM1hzYzY5Mi9OT0RVcmpZbEdrZzdGOUpBa1U3WElLQllXNE1EM3A3ZHo5SE1NcnNDQXJBcjcwSStmb2FjM1ZlUThMWDVSSUoyUmozTUd0VnJZQ1ZHMHRBNktOV3dvZHJlT3BWYS9ualhVNnlIV0p4WnV5Yko2dTZnVTRkNHcxN2F6RUpNb1Y4cjR3RCt5a3Jrb0VaOTFGWnE1SEx4OWlYb0F3OCtIREFJTTJwcVdYRHd6b2ZYUE53YnNnMmZSKzlrNnlLRmdMc0hKa1g4UXBmbWpWY2RZbUZTZ054ZXIyT1pZZ29FRFpLQjlYMW1zbVJLRW5scklEUU5RUGxBVURZdWxTZkdXTWN4ZUllZmVxTUk2dkJDMWF4dzQ5NXZJYmZ3QldId3hWVXZVSXlXanRUd1cxVGcrY1pURGIxOWphcnArZlZWRWdwNWZYN3M0MEs4TmpucXJqbjB0WTIxRmRNYjdZb3BpVTF4VldLVlB5YXh5S2NrNWxSTmlHMkViUnZnVWlrb1RnOTFTWFNnYkJKY2JTMHdhNlFCcGlScW1VMUlwYW9rS2k1V01aR05pcnBHU3VHVVJDWlFwVFdxaEsrS2VhcUlxd281OFFLYVA1WGgwZEZXa2FseGNGdlkvUFczUXJyNnc5ZGMxM2FsSm0yN3JpdnQybHdWaFY1RklscGtwYW9CRVZaNVlWYXhFRlhhQk5hL3RwamZ4ZFplenV0dytEYytJUC9KLzR5eTROemdyZ2JJd1gwRUdiVkNaYVd3bHJTU2NqNk8vRTArSUJGaDBkMGkrNDV2MzdkbU5aWEs5VFh3R3Y4TWZQYmV0Q3g2WEwrQXBDbERXL0hqTmlLKzd2cnExU3M0MjEyOGJiRy9NdmlNYzVHbzVKYzNLbWRkWjI4bzdFVTdWckNHQlBaNE50TDg5L3RsWEYwYklZbU5Jd0JCQVE9PSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlF1aWNrc2FuZDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREkwQUJBQUFBQUFkWEFBQURIVEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2x3Ym5GWWNoekFHWUQ5VFZFRlVIQUNGQUJFSUNvR3FJSUdHVmd1RUtBQUJOZ0lrQTRoTUJDQUZoVUlISUF3SEcycGdSUWRpMkRnQWFQQVpGa1d3Y1FBRm0rOFRSZGttblVqMi95bEJtekdoZGVoYlpTRjBSN3VvN2hrWkNaR1Q2aG5wb2JaVFd4eTZjT0RoMEVnLzlvMEZSK0hBOHMzSjFiM3R3NTlYb3pnY0NOd2pabXR0d0NWeFg0aExvcEVrVGFSWHQwWklZMkl0NGpmOTJYc0N2TVJMVXdqMlFvMElraGN4S2tZcTVpUXRjZm5pbXJwWjBqcUh0R25nSmJsL3REcXppaXFkcXdBem9RMFRMeDg2TXpwWDV0STVUL3p2OTY5NzVyNEFvb3NSQkRKZkJibWtXZ3NJdG9xTmJHMlhKOUNrZW9iSGJmM3pCQm1vR0ExSTVhZ3hHTzFHVGFvTkVGVE02N0l1b245Rlh2emYraXVpd1FFSy9XL2FobWlieitWZEViVlZSNFlOK1BkL2pjekNUTzdMbndXZ0lxRmw1UUFsMjFZQjJwNUtKRmxMNkpmN1plQnpmdTRjRkozcStBT0M4UVY2NnpvYld3WWhXd0QvVjVzbXZFWG96RW1FVFd2dEtHMlRQRzNoV2NwUW05blFPdlI4SkZJVmdaQmQybWJGYytJMWZZWHZ3TlFrWml2cXlQMGU5Mzg2eTFiYTlkM3pCcUdMcXdBWDNYcHpiVEg2K3RiWHpHZ2tBMnVKZlF5ZWxmV2VKU3ZnQzBKRlVGMWF4TmRUVTJIVHBTajdsSmwvbmVtcTcrOXZTTWsvNkphZEdzc3FyZ0dlZXRuYU5WUEw0eitkN3F4L3NneG5GMlQ1ZWdIU1VXeVg3QUREVk1LeG94ejBCY2h1WHhpMkFzQ2F0VFB5dmdPT05UT2JyT1NjY0d1Q1FsemhFYktCL3ZydHoxaXJIOGhzWm5hNzluSW5oeTB5UkVMQ0p5TGdXZjg2LzNBZ1REQUFBTHBqTkVnM0pOTlFaTGhzWkxveXBGdzFwazRkY3RoaDVLaWp5QWtuRU1JQlFwK3VKL2lsa2hpcHVDUEhlZytHOWxwRm9RL2EreE9LYzZIRkF4QjJ6cnAzb3pBWGFpQnV4Vk04Vm1Da1dtVjd0dDgzVXFsNmk2eHd5YXN3Q3BWOStjelU1T2Zqck1ySC9CMWJkc1NaSzdtU1cvYS90Q212S29KRWloWWpWaUtQUHJ5bUtWRGtQLzlyTU1Nc2N5MncwRkxMckxQUkRudGRjeDB6S3pNL0U2aUFwQ2o2TC9rL2FLQTNBMjhPeVZ4YUM0T2xUNWFkdVBNUFdmWkIwdkJrUnRuY1lBR2RoU3VXYmxvMjUxclQ5ZUNPQ0tMZ2ZiWUdrcUJKNlZReWE0S1RHSUhVZzVmaHFSU1lFak1IUnhJSEkrbEozRlR6dE4wcFdoN0REREZQcHRvcHVONDRKL0FJa2cxU2VPcGNpOWhQMFJUUUVpV093enhOMDBaSFUrVXBTMUdGOEJZUEVEM0FCTEYxbnFMRmZBdFNJZHM0dFpRckVKQ3o5VEt0WjJUTVVWaGF4SE9MVzNpWVN0MHBvRWNZZ29TeDQ3VkRxY3loa2drRlBZSGR2TVN4OVY5K3Q3Nk5MWnFEQjJtOVlZaG10bXY0ejBsNzFhRFgvaGN6T3dRdXhxNmsxbFVDN25tbnRHL1AzU3p6S0dRL2Z3UlVEL2NPTVFpRElwVGdqeHZ2Yi9QYndFOXNsQTZpakxJVHhia0dscDJtWGhmVTFPNUEveUhlYWJSV0l6SWRXaldaMlcwOThTM05KbXhJVXhEMEpTMklRcWg3L0RMT1ZGVVk5SS8wNzFkcUpGeTRnTjlTTnlQc0Fxa2xKR1hQYWZlTSt4YkY1cUlZYy9JQUJ4bWxtNEJjQitvUE9SejE5Q00yb3VoMm9HdEVOTjJBSkZyQ1Z6TzROb0QzZXhXU0VLRzRzak1EdE9WSlNnWUxWM29TYUxZZWU2T3JFNTlKV3RJN1hxNkZNTkI2cEJhRHptU0c3eDlQL25jb0FRQzBZTzY1QVYvOFZxUjVwQzdPMEtKUlNUaVhNSGVhanp2cThmRDZURWF0ZFNlRWRDeUp5T1A3SFMwSE5zY2puNEVVSDdJVnY1QjlOY0h0NlErUXhyNU5nSmxFWXBCYmw3aVdGVGcyU3ZzdE5McGsxd2QwRU9CL0hLT1A1MW9Ba0tIYmswY3hnYVVTbUVkenZ2UkVYZlhuVUVxeHFHZ2R4LzFwVUJuNnlTVWJpTDhia0lsQ3BPQzJIRi9ZMHg1cXB4VEw2TG1sVVBiRk9KTWpZUURlWUpJY1lBaHRLVnFmckZLSW5nbWpPSTVleCtXYlNVQXJDR053aElEaWFLUFFWMTJlemFkQTA0Q0hHODVMWW1oMmdpTUVvaGd1RkNFN1d0MlJucFpPUDBMQW16akpOSk1sMUZxUTJ3ZmJVQkpiOCtnZGZpU0dTVzFnQzF0WjB6N1FWUWRkb1RTeXNqU2Viem9sZnlvaFN0Z2dCZWVMQ0hPRGZNeW8yQk9TOGExMmhpZHIzWVVoUkRWWFRBSXhFNnh3bXMwREVnMU1SRkhBR3RHWkpMRTZDdEJabDVKMkE3dWxUUDIwTWpRWHUrRkdjUmhqQ29WWHRvd1ppdGhlQWlnYmxuT1pJUmdEQ2dZS2VqakJRb1E2aFJoMkxJYXJHV0I3eitZaXRLQXVxRU1BbDlRRElnSGM5UnNZaVV6QU5nTXNaR0xMb1VheGFra1ZyZkRveksyMTBaYkswNFpwaTZDRUJWb3NNT0FBVVZnUWl3VjJITWpCRHVLVWdKT0lneVhoRU1uc1VDbFNhYVN4dzZUcmlPbU1SVjI0V1NHL0FyMW9iOExOOU1GYWZiRm9xTnJjY0NOeTRraWpxSXdCSmxOd0JDOG1XVmdsRyt0TVordjU1T01WNEVpRjJLQ0liVlNzbEZvWk5wbUZ3ODJYV3N3b0M1NktEK3FVcm9JekttbnU0R0FaZUpaL0VBQk00UVdRUnBGcWhvVllDUWZQZHBPaEhHYVd1eDRldUZpSG51NDAwcG8xTjdDWFZNbmZLalIyWWRGaXNjV3FGcXVCZE52QWE5ZHk4dEVUUCs3MTNMd2NEUHh2RGQwYXcrOW5leWZnZC9ZMzhDRUw1c0ppV0FuciszMy93WktjUW53S2pyWGlNQUJwRHVDb2FVaWtHSVNoQ0FFRnlFRVY1SmVsRmNIQnA5TG5lL2UvYTdiTUV3OEtwUDZaWlZtVlI4UzVvYkFtVlpKV09NNXkwajhCQUJRWVFUVW1ReWFaR0VUMXg5SERDVWtNRzJNMkhFT2h1WDVIalR1QnBTcEFLd2lYT21zcUJxREFYelFVSXdaK2ZPQkh2Z1poWWhQRzMvalZ5SXZKT0RkQklDMGpLNXNLbk43NnFVeHNJNVJqdEFwaXZ3Y21lQVFLOUZZS0dzRVN0Q1FRb2c3Nkc0WmVtcVRKVEFSVzFEOHlCVklRQlZNSWhhWnUvVkg3aFNPQlJGS1JtalFrU2JrZ1FIb2lyWXpoS0ZYWDdMSUpvTEM1YWFuaTB4Z1dMZ1JnVGdsa3JPYTFXTUp3blE5WHpsY2ZtQURzaFE0SDlFb2VueTVTb3JIcldnOXRzMHBJN3YvM3NFZXdBYXpydUMrR0NQQ2Z4cmtUOUNZQTlDOWJBNUJ4U0tLM2R4MEFZSS9leWlxbXRCdUFvMHRjTnVicjgwd2w0K200TVBqOW1LYVdQL0ZKMXRsdFBkVXpPNEcvaEw5V2pwVE5zbFZ1SXlmSTZYSlh1VmllRXdxdDRkYm1majhBQ0NKelNmZG40cE1vNDNLc2tYV3lzUVZwakQ5U3dtMEY5QVBBdndPQU54MnV2Y2IyQzl1QUM5K0VDODk0enpxZkdhUDdLT2Jocm5NN3oyMEJBWUJFUUg4bmdON0s5M1oxZXVWek5QcW43VFBISXZNY2RkVjFpNjJ6M245T21XV1QrWmFhYVlrTHpqbHZnV3VJaGlSUXNHYTBtb3RnWUdSaVpoRWxXcXc0ZGc1T2laSWtTNUZtamYrdDlRQUhva0o2Yi8zZ2JqTDExa2RmT2JRM2dCaDY2bXU5c3Y2M1R1ZFRvRkNSWW1WV3VXZTFTL2FiNjdEampqamh2cHNSY1V1TkxTN2I3SGJVdU91aTMvMFJEbGZjMEJBZXY2bTExVC8rOXErRkJBeEhoU2RTQ3hBdVJLZ3drVnJRMFFzaWE4MnFwYlphT2FPTkJDN3hGS2xpVE5OZUJyZU8ydW1nazY1NjZhNkhub1lZWUtCQlBFYWJZS3h4SmhudnJJbnk1Y2lWcDhSVXBXd21SMDJFalRiWWFaY2RDQTIvRUFCb0RRQnNQOUJ5UUw4Rk1QOEE4SjhETndjQUFEWjJGYnlFaE9NVUxDV3FvcGhJaUZGR1A2L0pTYmJubkpnVXhWMUR6TFFBaENKSXVFYkJvM2d5YVNVSlJTTmRFTEhTSHRJTTNISEdzU054ZmV3RW5jZnI2Y0NnTVdsN2phYUowMGV4UXRRUjlpaUc0Q1V3OGdTaUpubndTYjJyc0FpcFJFbG54Q1lNczZjU3lJK2UyUng2RXFiK0NyR0VIbU9vTkFPRnBKU3lObEFUaEhUTlBvQjlIUU9yeDRqNVhrek9nNFFPQ1dtY1BqUnhUQzNVOFlQb3VVVTdYN3pNdnJraVdvN2RKc1puUVFBRTdubjEvdDVmWjJSRVFtbzB3ZWl1dkprTGxnK3dST2tzNXhTOE04V0xsVG9FeEtSSnVONVpsdWM5VnhtR3AzWG9oU0ZaZzYwMmgwUHBmUWpnSEhMZFU5ZFlHWkdVakY4eEdQYWZwQ2lOQnE5VjZpMDZUMDRZWXA0b0sxNG9jM2VsckNpVkVZRGMvai95UVNuUE90YUpuekhCYWFoY0EwQ2ZBQ3E4Uzc1WnRBazBwVG5LTkF1dU1RV1FiRml2dG5QVXhuTUxRT3UyZkVtTmIxWnE1NUlNYzVRWnRtcDhWeWxSK0ZCWW95bFhwWDdWQkRBbWRtSXRIVjJGUnd4cTNmNHpKb3g0dDNLWmZwc2p5OHUvVldiVWc3WjFSOU1ncGJqSjR0bTRXQURNUWs0NXdEU2tVUmd0eUVtdzJNS1JUV0RGWmROL0ZHYVJmWkhiYTdPTFlPL3VUNGlIQjRxTWNxdEg3S1Z2MGJxd09aRi90ZVkrRFE0b0hVUVloUTRPVlFvYlRXTjFTN0RCOFBYYyt6dXg2T1EzeE8xRmRtRXFBL3Z5aUszdHVhSFNSYVc0ME9ZMDhaVkFQVFdNWHdLNFpFT3hCaEM4ZlR3YXNHaHhLU3Q3eVFsQm9UNTBvcngra05xb21HK3FJTTE0VHlYVmhTSUQxMHVFSTJDY3VGT3E1NENjUXZOengvcGNmOEdvZE5ZL1MzeG1hVit6Slpzdzc5aWxlOUYvVThyaFBWQzRtUWxjTURyYm9EWVM2Q05iNEFLd3hwK1JFRlZTMVRJNlVNWnc0d1lXUU5QUVc1dE5UbkZQZE5ndzBGTStkcWdIZzgyNko4c2lWaTN1blE0VGxzaTlnYjdHNDVtV0xuZC9EeisvUm5hOFJMRWU1OW1xcHI3U2hvcXRWd1NJdmZtR2RWMnY4eXBxalU3djVqNm5yUDExMXBnc2lMeE5qZTFXSEI4Yk1qcFdKODFkdFMycGFud1Rnd25OMjMzV3F3NGJESlNaR2xCSlRTRGxIZU1ZWlhadE85ZnVsV00vZTBETjNaek5GYnpmL2RzMnVYSUxLZ3hka3dOOVdFVFp1N2xzNXJrd3dSS3d5VnVWMkZNMmVhbGZHVmFoM0xVMHI1MXRXZk01V0ZIQ0ovV01ZWVVqaFd5K2NFbzhleVdCTVhFeldDVkxreWJZamoxdnJWSmRuT1JYZXhzcmdVRExxYmFoMm9pRDg1N0VTR0xhdnRrVExKUmZtTldFOGVhRzI5MFdtNUlzWGk1VGg3V3dsTzhjM0xTbjNldWk3V1I1SDh4RFkxMkxDYkN5RXhWKzZ4NGYzdFF3VURHcjNodGxPZkFHNjMxOHhrcnptc2picXdZdEVWU1c4dlI5S0xlaFo3b0ozb2thNWpXTFZuOXBXcWNybUQyVnZHT2FKOGVuK0tpT2RVYmtQWEpRZlc1eFpiN1cyUmVEdE9KVGEwTmJOend0UkpQQVo5UnRxU2F4MHFHbExrOTJndjFEWDVPVVErKzNZNnUwVUszUFB5RFJjOGVJbG1rU2NFWnAwd1MydzZ3Y0szK0txbkozNHllTmFidkY1L1J5RFIwajc4SHc4NUhtekdWT1MwV0lnOUpBZWxnTzQ5d05rdEk3aEEwVzlrd0p1ajlDRWwyR2FCTDVxa0pYSm1nc3NTNmFnTlZ2N29vR2lBZ3hhbCszcXdUWGZUaWxyQ21sVmxvOFkwTE0yRC9BTmhmdWlTSnJOWFZzQngwV3RQYmtWa3ZOYUhsa3dnQTFjT1F0SXl5RVVnME9ISGx6ZDkxUVczcmwzVzAvczNkd25mWUswZ0NPV3p3UHRJQ0hWbk5YN2VCZ1JuUmNHUVNyaml1YzF3bndxV1VsMTZ2Ulo5VmhYU2VNSVMwa2ZKQzcyOGtQay9yMkRFZFRQSTkwR0tBSm10dVJnMHBqSGFFNVMvbG15N0hRQ1kzZ0Jxa2Jia3BEaXQ3S01QcDlMa1FRU1ovUDVJcUR3UkNlUFJ6N2QzNjBPZ2FGVGpzZU41L0RPOG1hNGxDeGw1MVdjcE84VG55ZHVGbG1maGZ6Vm10NmVjaDhMZW04bitnUUtLS2hndzJFWCtwL0Rlc2k5R0FSVmdLOWtUbE9MVGtRSWFyWE1iSlp0YUVEMDZiNWJkSTRhSitFVFgrQWlRNUpkdHVjUTFYYUR6dkRGcTFzTGFKYzN0eEtRM3RRTGV5VXF5S1dWUTNGL3EwZEZqOFlEOGs2eWRkVkZhNStWcytEU0c2dUMvbk45Y2VudUVOcWxqSi80Y290L243ZitwaVllWVVwbytGWk9sRkd4UnZWMVd5NFZFUEdLTEpwWDdBQjN1Q3RMRjJibVdhSUJpTkY2aEI5MjNHL1QybXVkdElFMWZ6NjZUVXczQWJyUXJhbHdFRmhPM1pMTFpKR3pXend6d0xqRHMrejhvWms4NGdPd29IVUFIQWdMdzhYaDJhRk1yNjZqczVTb3hrdEpZQmVUclJqWDV6bkJrZG1JOU0rLzFocmNZall0ZFpyZ2JyVlRSNmMwNm8zbXVhQ2tOWmNqcmZQc1hsaXBhak5Md2F1Zkw1RVZTS0VBSGd6bzdFTXhZSlcwL29pSnh1TnRrbzBXbVUvTzQ0TmRVV3pJdXNOa2RaZmpkZlNWbzJ4OE9ESEg2THpUSHV6MnB3T1QvT2NCRWpKMVJValI4Yjg3NU5JRUJCdW0zQnR0NnpFb2RiMWhNZG9NaHJHR3FYVTQyQjBtNzNreUx1Um9hNThSeG5HaUt4bUlId3RnTlN1dmtBcXV2UjBLTkp3djM0WWU0WTkrcHZXMzVFMHRzRkYxZ3V1alRMVTM1ZnBVOER3bEFmUG5HN0gwM3pXOFgwZEpubXZKenlZNDV4OGxoRDZnMkpBVEVSNW14L3JFdDNtTnpxM09rYVV3SnZJZkd1K2ZxNVhmQk9IamFmdlFENklvd2hoYjluUWF4VDZKRGZTYjhWa3hybVZWbnF1NXJYSTVScTdSSHlNSlJpTkpuT0h0OGttdmJnZ3pZamduVG40ZHlleGNTek8zdlF5RG9KOWxXSWp1SXNSS1I4ZmJBQVhtenZzbHZNdWJib3ZUYW1jN0syYlJVZjJIMHlSakx0SnFlVHV5QWplOFlRY0pKQTFkY2R0enVWQ2UwL0VyaFlOSXd1MFlPekV0ZWIrU2xNS09VUXNFOXV1WnV2dVFYV2JYcFhsQ2J1dkpBUlhQeUFtekZHaEkrdU9HTUJIN0RQTzBvRFV3MU03OEFOM2hKNkVCK3FvMFlSaEk1OGJCWENJVUxJbXlnaFdWc2F5c0lTUUI1NmhxQjJISXBYek96TzlFbEZzZHh1Qk9YMGlQaFN4TlA5ZVZoeVNTSXAyRXpYa2FiUjdmZlF4a2VpVEQ0TDBGWUNHR2lOek1EZElqWGhoZHpYUHplUTZzSFV3RHlnZFVzd3grdW1LaXE0OW81UXJ5NEVKUGNodlgzMm1KMUVaUHZMcko2cGNhVnVtQzNwUXFYemoyZXZYNG9wVTd2TnUyYStPVitlcnh2SWoyVWJsNkEzblJza3hrV3c5Zk5BZWpWd01JRTVSSEVTbzV4cjF4TktzN2NjTjhOdzMxTWYvOXRSQUtORExIRDdjTDY1bW1lcGFvaGtuUGVMWW5jYitaR0FWczNRbWVzNXlCR3Y0eGJKUjdSdVdqS0lXd1E2bGZDdEZ0SEFlMFdDb28xREMrU0I2SnNkbnBFbVBnQjJnU1E2SlVpOFZGb0lCaFYza2hDaGYwMll4ajlKdmVnL1RLcVR3ZzNlSFBPNXNWa1dEWXZHQ1NhQnVxSTduYUE5b05CODcyTmdvdUlRYmtFckhiODhKMmROalM2SnBEclRmVjdyaDhXcnhrcjhjQjNaaDEyS25NbUtxSG8xcE9lbmh0RjQ2YXpFOUxhODd1Y1J2M0pSMnl5UTdtSU5sZmRuR2puVUpldC9GMXVqZStxTzZTdzZ2WVNwNkRSc2lHZ0o1QmN4WFZvM1I1TFYrWVYxdXV6aHZpWEQrYWIxWkdORHgyUHg0bnJhbWFjYnRxSEtvY3l2MzBlekIyOEdya2pYZTAreEFrQndhVE16TGRZbUZPOU8vZzJHSWVIQVNWTnJUejRVeHJJOFR4S2pqVkpxcnQxWHJkSTdETSszRGUrQ1ExZlc1L1YzVFhIZGZ4b3JFd01QVGJ4cnNSYVlwbmxLSE14eFpIcytKY2ZNYjdYR3BQQldtTGZ1Q1EvZlN6ZXYyUFJhdUN6NkFsbC9CNEVDRXZ0Rm85QnJHRWRacG5JT0krTGdnbjVCYnFPd1NiamkvMWhxQmEzNG45Zko5QUQzVThpYnVhbUdHZDNXMUx1UmxOb2h6bkxrdWlQZUQxajNDRERwNVRWTkdBK0ZoZFhvYVlFeU1UMHFUeDJSbndwczhJdEI5ZkhKM3lhNUZlZ0NsZlAwclJsbDlkN0NaMzMzai9oZzNHMk10YXZNMWZCVU5Cck4xVGVGV0Ywb2M3aXdDb1F2S21lU3BoQlJlSHR5dzB5aXc5MG42eHBnQ1l5a21vTktHaG1oMElWWlk4S0JrTzBXMXBxWUlpOU1pVFZHOTRKMmpoK2N2T1MwUnNlUUs1Z1VEOEVBcVAyQ2FyOUlqVmh0VjNzd1BWTnpUQjN2d1lDa2lXQlU3cjczTjQyQkFuNk4xRzlmbDlOWC9ENUErSjNrOVI2TlVXL055YnFUclZzenc1emZPRDhObzFvdFl2WDJTZ1lOWDEwRGM1WW9QdUpMVWo2NmRUdGNPbC9QRWJZWlBocmkzK08rL0U5K045amJlYVFyT1E1Z0oxN3gwQ0oybURvWVlvTkJsVE5XTkh1enhhL0R1Zmpyd3ZyRzBvZytZWWJGQ2IwVEJELzNvN2l0ek43ZHpYR29kejdmSjM2eHNET2t5T1NBNDROOHJIUHYvK1RNYURGcEpuNDM0Tjg1TS9tY3ErQ0tvaWdoeXdkamtsVnpTOThIZzZRR0JHVitrU2FhMUswbHlSNVRrRGNETi9ZSlRwUi96ZmJ6U2trNWV2RjdSdWRGWUtKcW1JaEVpUkVpcjA3RkVCTmF6NEVLejc4MEJOM3FLOXJPYis0WW8xOHo3NThuY2tnUzZPK1BnTEhaayt2WGVyN0lidThCcXRyYnMxZjMzbXg1MkhleVpKeDNvaUc4MFh6ZGJBNVMvK0VKN0x4RWZzMmRQejRZZ2FzZWh3UlJhTEtMVGtZZ1FKWGtQUmJBaDFqcVhtU3JkenZnbWZFKzJUWi9mbTRqdHkrZGorL2ZHODBpUjI2bi82NTFqK2JPZEVlVjNlWkw3NFFVaXNJYlJyM1NKRjVUb25XeGpmaUlHZWQzeGFjdVhZSS9YQzlYdGhZQVlrRFVZM3QxRWdUTk9Sa2dFOFE0VURTZ1VRY09IRUF1Z1BKNkY5dlVaUUo0bkxkUXIvKzlWK0dnYTR2c1F4Q0ROWDc1OTV5TlhwTS9mV3hBbnA5dytDNmpOSW4yNVU1b3NxUUdyR0hYcEJPNE5qYmN1Nnk1ZmN2Sm9kckh3bnBXYUZYV0RWR0ZxWGYzWld1Tno3RjlldnRyeWpHNWhhVG9IUDdYdnhiV3phMmlGZ05sWHB1S2NIeUs2dEhMNUpraXhTKzFqdXVudXdscUQzNy9XMEYzUVRjZElMVVcwR05nM0ZjMmtwNk5LaTVsQVRtZW1vQWtJVDVyWnhYejNmZG1wK1FObUc2UkZ4eDNHNnllWGlvcFprVnpmbGRZclRmVFp6eFk5Z28yK2dZWG1ZSWhTM2NrdDZFRVBlelkyM1pIaGpHMHdQdUh0MXpzejdZc2RHZVB1WllsZU1NSXNLYTBtYlRGcnVsTUd5M3NtSmVSQ3NwZjhQdXpRNEhJUnFkYUlYTGhFODY3WWdZQmRudFhrYzM2YlUvUDR3L2twWlQ4VTlGME0wQjBob0Zub05hMHVjV3d4Rmk1MHM3VDE1d04wd3FUWmZCN3JMVjh5bWhicWJjT0YvamFkYXZVZk4yc2haMEdRMXBiNE40MmtkR24wY1ZURDkxL1dNeWNuNWVxSVJULzErZEZrYjB2VDFnT0p1VnZyQ0lmMjJVdUtwcDkzNlNGVzBxbHNxRnVtSlBXT1RDendVNzRYc0tBK1dCeG5xRE5Wa0FmQXFJM2pXcXNoeW45SE1hOTlTdlpCbUd3L0tjQjFlalF5b1BGWTVzdS9PRVBENzBUeVdvUS9pZlZSM2w4cVRTQXV2VFVYNEY0U2VZMGFORnpRQWlWUUZnM1pEN0cvMzBFS04vcGNFc0FCU2pCWFk5ZGk3NHJsWHBKYzRkVjQ4amFJQnJBeTR3ekx3SURWWnUrM1dnZnN1ME5wT2NZd3czdlhIWlFjclJDM050UXNMUEdtRU1YMUE4c0gzMFladWdCWXVqeENMdzdlKzVORFRkZFE4ZWJHQitZZzVhWDBLcHF3SXVwU0xyM3lENUpuRnhUdmZhbnA2T0cwKzErZG1GMzZJZ0dzdzlCQmNQNTNuZkhQN05uM1FaWHBzeE0rS3B4RE5uMStBcVdCNGtkamJpYVl2dlBxUDdXUTRLL0RqRFVaNzEzL0RiRjdCR0tTS0owOFgrTDFUUlJ5eCtWVzcyb092QTEzQVF1clh1MDQ5dDNOOUZLWUU0VzNjNkU5NmEwMXlZZHZpNzcrREJSWHc5bVJDLzdMUEdKbGtBKzdSNzIyMWNHUWZjV295NlVLY3JmeEF2QWZCeUQ2Y05hY3RlcUhDYWUrcENsbUxHdEdCZ21DU1A3akJIUjF0ZDBYOTR1MzYxYkQrWWwyZ1lzOTl0a29BMXVjODY0UGZCVGljYXBxZXZocVhCZmUyYlBsaStQMUhqTVpGYXU0Qkd1Vk1HbDI2SWFLRGxKNHo2OVhSOUd4eFhIczUwV2JMYmk4QTE4UlRlRXJoNTFXWlpUMWhUVEZncHg4V2o3U1BpcVQ2c2syT0tIODVyNEM2NFVzREt6cW5CR1hmVVVvYUY4OTZuVUpua1N2K21IdlJJaUtNQmhVUU9uenpHdkgwcTkrYXNtWTlhcHFacXdXYzhhR0RPTUVNbGdlUXFCU2gwVWFRRDIySTdzZWZUYXJrRmdMTm5PcEEwZUgrcXdkNmcvb2RYK1Z5V3cwQjFhMW0veUxQYzVWUVo5ejFaSk84TFhiNFlvcmJkMS9XTG1lN1VFQjdCcjEyRmNGZy9aVm8yNlhJc0E5SnRpQktkYXpsb3hGUDBRUXdPSnBRVW9Famd3OTNWc1EzcHQwckNLTm9oNm5KeVhWR2NPd3dmTWFkY1hRK1VSdkgvNTM1KzAwZVk0RWc1L1pMK3dmVXkxcEdKVWtuWk9qbmJqRW1IRVlodXdZMHAreG00eFpNMUswMncxRFdjYzhic2luTXRtaVpXTnl1Q0JaL3RuaEhZanovZ1pPcUx1c2d3QnpRVmR0UEZRWGVZRHZIbFJ4Y3d0c1IySTFqUjlTS2lkdk9iMnBrN0QwL2tpS3VPWHgzcG1EdzVGQUhSYm1YVmxaK2FsU3hlKzRIU3VkaXhmYS9QSllZNkVlbW8wa3RKcjY4aDUyWWNHS3ZzSDlEN3g5RlY3TDlTN3dkS3dLQnVYbUJXN2ZiTXRaMEJJUnpGbFBjYjFtWThudHBzWDJZZ0F1czBjTTBxeFJMUFd0MTFLeHZmY2pxcmdDOWFyRTNtOEo3ZmVKUmNRVkpBZXM4NHI2dS9tZ2JVbnFkei9nMEMydUpvVjdrazkvS1dDVkxvd1c1T1JTN2x2WjJqLzZxQ09rZXcrZjUySTJyeXFqeDQrcTI1Ly8xeVQ5dERvL215K1NsWmx6OWxyOE9kZGp1Q0hHbGRyREJuRUdFd25KWEJYbWRKN1hxK0pLdEJQbVBSZXBld21XOTRST0dWRVk5SzQ4K3I4aUVoQXpuVHhnVkdkRTlPSzBFWG5TQ0ZkeHZGOGE0S1RDMU55OFpxMjc3Qk5MaUZjQ0hNRDVIZWhZdGNoRCtoWjc4RldCb0JBTitraEx5bXl5QUlHV2NsYTdMVzgxbGdpY0NRZHRkaWE4TVBBSGRrSHlIcUczcEl1aHVldk0vYml4Z1B5c1plNFJ3cjRzNExjdkgzVzVCRThnVi82dzErUndlak16Q1IrSnY4L0c5RVc4UXorUXdlSXhaS0NqQStuWDRjNnRuOVlhZlVOZmw4VStjMVdNZHd2WEE4ZGE2WjNSUnVEc1hhZ0FWdlQwWng5UTZway9xc0NLU0F6ODF6WHRmdEZmRUROVHcvbk1iaDZRV1JaVFk0S241L09GWGZmU0FqLzc2YkJBZGlZb1JGcDdjMk1yd1hCVFp0NXBEMXNtMkdJVmNFZnd0cDIwYWRmMmlaVVhJM3dEV2xDQVZaSTVWTGY2Nm1Nd0dZQXh6Q3ZsaUdvKzd2aUwxOVlqNElLejA3Wm9zTVBXL1BxZjAvckl6cCttUC9PN0p4eEgwTHpUWjh6R3RHc08zRUlUNXg2VlRyWFcrTDlsZ2U5VU1MUDVaYmZDdk9ZbEduT2llQnBFblJTQnhOKy9lQk5mMGpidHdFRTZCYW96VnhWNHFXT0xRNys2aWtmZEcrQkt3dXhDeUkrcjJiK2cyTk10a1g3UjdjZlZES1dpL2dDRWtEMWMxS3k4c0xYaHZnZU9Qdmg0cUpaNkU4R3I3TlRiRUZQYzJ2RHNXMlc4bWxqdEZwNmNDWldvc3J5UkhLM1E5RHZSODhtMjlOa1ZuWHVyaVFJT2lTc2FEcCt2MjFNNGZsVWNMellldkJBQzlyK01WcU52b0RSQ2dWRmpjeWdOWEs3Q3hZRmpiL2xvMDdWdlpRdGwwbXpuL090ditkSjExZHRyd0hrMVVBNnRkQ3dlczNrMG5VMkxTeHN4N05NU1BaZXRzbWFNdWtKSG9QWGRDUjlINm96b3hHbXIyV1l5SlpMT1pGQWRndzJrOUJDejNYNjkzT0x5R1RzeTNxK2VlSkpzZTkyeWFJZzY3MS9mOGVnbjRQQU14UUsyWHcwTHZmZEo5QjdjK1FkU1RQU3ZsQ3JaNExoLzJocW03dGJhWERiekFsaHVkU0VvN0FldVdtcXB6eTFYS1YxeTFWQnJwS1JMcVZTNWxacWVOOXE5QnNUbU5Vb1FNV1JOSUlHR0kwWGt5c0VTY2dWWm83SGhZckEwYUFsU293bzhGVmZ1eStYRm1vcmhPRUVvbjh1NXhzRjVZSXc1Y2lvbm9NSUZoMjFYUjBzSGl1dW1EdEpmdytubjVoU1ZGV0wrVjlSVTNGWXlJRkp2U0d3MnBOVXlpZ1g4S3VjRG1qYU9PM0J2bjA2WHNRaGJmT2FVZFBibnVTRFdtaklrazUyVFlWMWFOSTNobGtoV3JLRVpQaXdER3J5UGNQYjcvSXhsejdhcEhrVGgvWVd2Zm1zc0Y2UzRraGJ2RDNxSmtRVVdYQlhuZmlDVVVraUpqUUpsOExYdEU4cWRJNmpGYmRGMko3bXUyN3lYbDQzejk3QzlnMVNOMld3RW8rRERrT2JQZWxwRUhYa2QwbTNETklrdWpWTktORjlUSWV6ZjFxeHBwZENJbWhmOE53bmFydjRQL1ZPTU0vM3dRY3c2NERJSnUzQm5qeER3SURVak4zbmFNbW9qZXptNlBERGNGeCtPbDhPNVF1dzE4R1FtNEM4YTVoL1JTejZQY0ZXNmdCVEYyVEdWeFZRcU9uR1pJYUtHWXlhZE9CVXdXaHdwRk00WTFNcFlBZ0hYcS9CdGVPK2FLYmNHSVVXZ01LS3lOU1I2Tmg5dXVnWXM3Q0NxSEN6MHdxZ3AzWWZZYkhuRWxFWmhnV2ZKUDU0M2ZkK09TNDFJTXFzekdqTTZKR21VdnZnOXRIeUVndkNJWlRLM1dFSEFSQ0xtY2lkaVI4VEIzaVFCcXoxQnFScVdKL0RBUkU4UzFKL1U0SXhMMEVXQmdiNkkrUUx4NXhlUHhyZFY1U2ZyWitGMkdFanNVWlhWTkhnYURNZE5Xa3NRTlovSEFLY05HbVUwbnZFRUJJK3pPbUUxaXh4WFBtNG0xYkJKSFQra1ZIa3dvOHBYRUFrYXNad1RXQzJBRmZSVll3MC9VWTR0THExWXFMU2paeXVhUjZqNXdKYjRBbSt5VDNHV1ZYdWMzWWdOVTgzZ2JibGM4SktzZlVqUTBMNWozcFVGY1hJR2NvQVYwQzd3K2I1cVJpSld4QkVya244WnVYZXlXQW9XZmVtbEF4ZHB2TGR3L3JocVhidmFzRVhZOHNDMWhmeUtjcEI4YjdsYnlQMVhBZTRXc2NMenhVTmJkM1gyMU5ZM1BFRnp3WHVMdHQ1UmY1aUtQU1dRSWpzSXZyL1ZyWWJ3L09DN0NMOHZNL0JUSEhaNTVZYUpNcERPdDdSdGF0cFpPZHcybjE1RGgrdExqUzhBZnVYalBSemV1YjlRQnpWdmRyWUpoUUVVSDJta3YweTQ5OEJHd25mdmlqdG9GYlUzU2RxMlgvZDBTM3RMeXpTTDkxTno4Mk9nQlBnc2F1K3lnVCt0T0FnNTFIQ2ZYZEdmeW5HcUVSVHZhOEEycVBMN1BhMk4zTHMvblpkQUs5OXk2Q2syNTY1RExXM1V4TEpSWSsydDkveHV2clBaMHRwU1diNnQwcmZWMHJTUDA5SFd1cTYxZGJ5MVRRdWlFcnhNcEpmY3ByZERGVFVQVmJORk56dFlhajFsK2RXOG41cGJYdVEwcTF1YUQ0TW5vRkNpMzkwbnVoamY5eURZdnh5eUkzU2FGMTBYeDBybEppdzYzYTNrVTZwMUsyZHdrdnl4V3h5cjFjOFRPa0ZPWFdLS3FqM2JpdklFWDJIR2JicEFZdVhEanFwRDFzRStuMVp0bmNSSnJtbWdjbmlWRE91d3ZQV1NDdXl3bm45YVk3VXYwMURONnhEVHQxcWxROWU3aFV0YmhNS1dwY0pFQlNGYjllVVlYQUpINW5xMGt2c2hEbTFGcldXMzhvN0IyOUJsejg1OVd5UFBBMStiandhcCtQeGtodGQxSUtJdzlmemx5azdWMms1TW5tdVZYc210dFVOenJIM3h0dFlINkpxak9LSzJRK2VtdjE3NVBxUTM4VCs5bTZTN3lmVThxOEQrQnhoVFJlSEN2alRuV2tBTTkxSlkyUWtiNUFHUFFxV0pxQTc2bmx3K3cvZTlPWUJpcGk0ZDJrdEllT1JPdjFCRmNXK2FnQ2hBM2VzbEVYVUdiY0lHQVJUYzRuaFQxMUJaNjZYWHpURkxGTnlaSVQ1TUxXK3J5Qm1vZFcyVnJFWERSTVpxUkQvMnF5TUw3MlhnUXBHRUxmTm96NzBndm83QmtCenhXcDZlaEFWYWNucGV0WGtONnhKR2RnaUp5aHBKaDdhQ01JZ0RNY3BSVDhxaWFMdkw3R2FOVStabjR1aWxyZ2EzWW9NK2lLc0hIcWo5R3U0bmdycEZIb1dydmxGUVBzUGNweGxqcU9Mc3ZkbW1qYnJlbXNIcmE5K3VTc0dEK29WdXBic09iN0Z4WllVNnNxeFJiZHgwbldPeGtra2l1czR2bncvSzBXQ0pSNXVJNzVYWFQzMTRCcys5RFRuQnhieVJtTkc1d3c1QmdXUFVKaG5ac2wyV1czTjUrM1VyZGlVMExpcXhJQzlmSmh1Zk5sK1dUSnF1MExjU2treFg0ekZBZTVSV1JMVmNQajVUTTFORlJ0UDViYmZrYy9ZYk5OVUlpTG5wVEJMVHNyc3BnQ01aeDJuRmFrTXZKdWNvaWp3YVVNYUtlTDdRUXVlajZLTzIzSkZsUUl0VXVqWXpPL1NZdUUwN2ZidklSTkc4TW5jcG81ZDNsNWxLMGpJam1kdTQ5WTliWDZvMjZZbFpjN1BmSGY5MHZNZG1IbHdaUVR5SEROWDFHbDVrMWo3Y1A0LzVNTkVwNDBRSnpUTTNHTGl2MEpyZkJSNHVBZmYwcUJCTVcwS1U0Vm1xMk9NcWNMTWRURGV2YVBpQ21iWTR3WXlWTDFnWk5uVlJzajRITHBhQXVlYW5xNExjQ3BsWHBSS2lreW1VNllhYzRldStFSW8rMS9ONStzOUZ3aTkwUVAyTnJnQ0tHcFRETERLV0xhUlc2a2JQYW1OM0VabUtSSVFReWRVZWJFUzArWEdxZHFoYmdNU200dUg5aGI3d0FhcU9JVjJDNEtQVXZtSUVMMUFQZkEzNEs1bG1peFYzNkc4MEtMc2JVbzFDbnVyQ3lCUkY3a2NGUys5RXNZWC96UWZmOEIvYmZkUGt5enNwTUk0cWpwbnNYcnJBbzcvMXFkZm5TMFRNM0FhUzJVVHZSOGVMVnVMZWp1d0xsSGRid25VV1haRlZtb3hobmFMTGpqQ2JOZmlaMlFKSkxnaUsyOHFPdWt5bHl4WnlldUpQM0MvcEliUTZURjJ1aFhnYWNLWldGYnZnejNHdndoNWdhR2R0SUNIWmRBUHdQYUN6SXVqYWUxZk1kT0Y5MmQ0UXdXSHZPWDJMS0RKbGoyaTZOamZvaHFzZ2hGdXVHOWhLcmFYTjBvaFYwRU9rR2FMTEx6T012dWhYRTh2VTVkYm9jc1pvRE1sTUlUTnkrVFdpMEpLSUw1RFUrMC9wZDBmMFE0bTZDWFdwOE1IUUkrVjluaG5jd1NES01jb1EvY2h6Vjc5YktjKy92dmc1L1NGd083OTA3UEQ1dS9kVXl2ZXY5RDJqWDBaWmRBZVNSaS92ZjZxODNXT3pKeGlZV2hqS0g5cDZEbUtVZHR3MzVmNFN4cXRiSDdvalNjV0hGcm5XK0Q3bFltMU5rK0htYXlyd2RQUkN2ZlltOE1zbGp4b2ZFYzJNdURYMzJ3L01NK2lsdXZ6ckRad1RjZWx0dXA5dWh0MEdsNDhkK1FuSFcwNVVzanpYYS9ubjJiTnM4M1Q5RUhab3U4bnQ0OHNGT1BzMTc4OTNDYlhiMnNOTFdUR05qcFU0QU1PVHJMaFd5NDVQWHF1VlJxeE9WUVRXU0dOV2h5cjh5QjU0OG9KV1lBUFpYY0RoemNLTzkzKzhCK081Ujh4S3FONWNtb3lrRkNvMXJoWUZZSzJvaEdlelJ0UVZqRzZwOGpuQU9sVXBqK1BxYmNTL25sSUNOV1E0QzdCRWNQMU9iOS9ZbmM2dGE0STNMbkpJVmtiN05tSGRXS2oyd3I5WnpLVGk3NXNYSzFORGU1eGRZNG9wejhyRS9RZW5IL2NzV1hZcUZkbWJjUWpYMkFmaXRwQkVHcEc3ZlBJdXZmQ3JLeFZhdjlZUVltV2tqZzQzcUFMVGZKZHR6S29VeG54RS8zZlJPbS9SaktpN3V6QW5PYWdnU0ZuWG5wYnJJSEMyTE5lV292RmwycFpxcmduLzVLTGtzakVpSU1OaS9JaEVvL1JGWlpnL2F4WURLUy9ZSlV6clU3dGdoOXVEbTdqdHBDRklXYjg5MngySTJ5cXlNU3JlYnI5SXEyUFdzSjJNWHJ3ck5TSWgzUUE1QTIvWlVJSzAxZmJ3dm1ZRUY4cUdxcEJpTEdYcVhTOGV1d1ppTEk3VjlxYVBMaGoyMFVKUDkycVZGNlY0dlVRZFlzMzhsOUJWZ1NuY1lPRzdaVmt0aXRyZmZ2dEIyYjdRSitLR21uTmV2SlVqV2V2aGlCQ3ZVaUdOUGR5R2VBWEx0MEo0ZnBDYzJHa0Y5OVhUVWtHNFYvdHFwS1hIOWVtcEJ4Vm52MnVEWFhwZkU4bXNtbU5XbE9NWTJGK3d5VkRNR1NkQ1llUG1ZbTZUb2RPeUN6blQ1bkRJTkZIUUlpWDRZblU2b1YzcTlVZ3duY3lsT0dhU1pvK1hTYVFtVmp1ekJrM0dhS1FYUnhaeHVnMUp2cy8wdzJENGYxdnh5VVFlR0JaNXZUSUQrNGRjOHNkNFQrM1F2bGZBWEIrYUk3K1V6Yzd6RkErTE9aeGY1S0M4UW0xdmY4eElBZEJvVXpsMU5LUCtSSGRGNGZpcDVsY2FtblkzZDFTMXYxYi90V1BJWWk4UmhMMms1UTVuYVVHZzhUb2ExMmlUbUZtYlVBMFVUV2gwQ1RPbVMrcGlnSGNscERoeDhHYW92U1dqTFhRcjBWSUVvaC96MUtVVHRuM1hlT2c3OURDKzVDU1U2UnJkUGVtVFgvMXNpZHY2RDVnVmFWWnNKVFBuVXpzbFY2dkZVdlhWRXVuVkhJbEVjN1ZYWnBOTGJiS3ZNYkJzYjYva3MzK0xvZVhUVjlJUXNnTU45bDBiMmdKWm5QTnBPTTd1dlo0dVdiWWQ1OVJUT1R3M0pHWHBudnFxaGJYK0cwREtWQ3RnRWwxVUxSUGYzZXJna045UEY2NEVFSFdaUnQzRTI2MjFmUFNIYWoreFNMMkhobHp3ZFQyenF2aC93WmRzQ0VqTm80b3VJTGQ3SWNlMWJSSHdmcFZXQlpoamZaaVpUQXRGTlZNTGc2Z1dNaGhxbVdoSzBSM0Vwb0t0eHl1V3pTMXE1bXJwT3dxOGVWeTNDL0ZSZVJNSUhLZVpLRUkrZVlpdW9tbDJDUG9NRmpYNnE4Qmx2MGNFM1Z1b1FrOEs1eWVNcGROSElJa3MzeGhMQ1NYbGZFOHF2M3granc5UVlwaFM0ekxITmYzenRyRW1NSjA0RzAxMlVzUFg1K3RxdWtYYlYyaEtiVWtSVEk2YytEeERmbE1oeG9zQ0ljL3pnSmhIRlV0ZGp5bHZXQ2twdUw0MmRXRGZwT2x1YXFsWjFoTkJ0TnNMZkJHUnFVSm1JU3Y5WjRGRWVrdmdqV3RzYkdyOFFlNTJJN2k5SmZnUlhnT1F2VjdiSk5hdCtPdHRZL1F3eWt1TndINGpDMWI1WlV2WnA3K3VxMkZrdXJzNG1nT2hkclcvZDlqZ1RRNjdwZ0tEcjhobS9rN285bzdzNTA2eTJDZWVZM1B1TzhGbW5ienZidFlQTGEzL1cvclpGSlo3R2dJTTM2N1h3UFlqZ01wci9FTWc0WG9EbTVHdWwxZ0hzNy9DSVNhYjN6dWdrMDRNYUEwSVZFVXZybTN1cFdEUjhEY0tobHRRTUZ5TmdpRVRJL2duZTYya1RkNmMyZGJrNVdIRHJ4N1pKSXNxY0tZdlN1SlJsSWFpb0J0RndUc29DdjZVb2dUQWRjZ0pMY2dKenlJblBJS2M4S0dVb2k5MHdmU2FSdXdBb28rb3FicVIydWNScGc0L2NqM0JUSmo5S2VaeDRHZmptbUFYNVRtV1lDbFRNTnltendRbHhXbURSOVYrL2lPY0pQWmZtQjZIbCtBR2pZMG80dFJ0MXZjSHU0YkZhbjJ5eitBYlJqTmI4bzFTVGpkR0dxTk94WDRTSVRWcHlDUFhJOHloaVQzQkFpWWUzeklWK0toazVpUkNQbWpUKzNTbGVwK3VCdm5nNURHTFFmRVhBOEVBOW5icm5Yb0FzWHd4ZTcrdUl0QUlmbzM2OFVnM1FtQnErd2pvYmZReCtnUjlpajVEbjZNdndKZmdQZWtyVXZ3YXFTSytWZDdENytEM3pBOGUydmgySXpEOXRlbnhWRDZKQzQ1MTJ4dDhsajVIZlQ5UGZ4cCtvczRIdEFWZHdZektuS3ErUXN6eGV4bzNyR3dMY3JkMlZkUVFOMW1YeDFQY3dDMXU0c1BiekJORUx2MkxhTERkVXRQMm9iUXhLOGF6SG9PNFczaUQzVDQ5ZldlVTJlZlIzZjcveUxGWVptRFFYdmM5SzlsYWdVVUFNZUxlZnhhc0FqQ0hmVmdBWkI2SWRZczUwWHUxM2JxTEY5YjI0STlaRDJzRGJpMTQvejhneTFpeGx0amd2T1VCNUxvQWdCWFl6YWxKZ3NhTXJSMXRYWWRSUmxHSDlSUWRzRSs2eG1SZzh5SWVvOG94UnVNUUJTb1B1TU9NWU1MZHM0eEdDSitIMlNNaTVhYnVzL3dDVlk1dE5BMFhtMHk5eEdNMEp0QU9xMXBnSzBCZEtBZjdES0d2ME1mb3k5Ri9aR2xhbE52bHdubENjaGd0Ukw5bFc2QXI0S04rb1NkZ0l4WHBJSnlGMjdnTzJPL05BbGgxVlhlTk95UGQ5LzNTSUtBL1ZDazM5WTRFUFlpdUhlTUJISnBXa20zUWVKRUxQRVlMMFc5Z2daS2E5ekdIenY4Ykk3REhlLzRZYmhmZTJFOWlvTzlKTTMyM2J1YnNTa1F2aU13K24zUU5KVWU4dE90cnp5NXYyRWE2N0EyeFZaVHM0dTh5MWpqbnU1M05DM2tFYmlFL1pqc2l1bE9qMjBRNjhVNllFaW10eGt1dUMzdkw4WVpMbzJzRkVhZFF4dXZHOWxFMGV0Nitsays3TVFIb04wUFlsc2FYYit2YU4zdHIxeTQyZFZta2ZTYlY1eGkzQmJWMXUxMU05d0QwbE96TFhuWUNSOTB0NHd0K3JpdW9LQTE5eXV3RDJwTEFKd1E3WjN5K2NJbmk4a2c2MThuVVNBVDJPNlZLLzNXQklhMWhUMmV3N0VvRlNyYU1JaitUV0UwKzk0cmFIQUp3RVQ5K1o3cGxYRWpxM3hESDNRRGc1SUdPKzVMOEwyK0ovK2l3enhQTXhnRWlCZ0FJL2l5Wm9IQW1NUDAvZUU1azl5NmlOZTFrNnc3V3o0dWNycVRweHlaM0JlVUp2MlJ5cDNYRlRQWWR5TDdKSXdSNFJranpON2F6WGkyQ0lNRTBwVFhvZFpjN0lTamQrckw0Rkh4R0V5M0FSSFVBeDFWL0xadmlqbDh3V1YybTFmU0NmK3N3YzBXMDZPcWE1bTZTS3p5dFJuaFFWYWdNNk1jaFJna0pNWFlFOFloQjl1bUtvb1RwR1JxTmtLNGZ4NE9XK3UrNENyY0dZcmdUWjV2bUc5VFVqdGZuaXFZWlVXVDZVZzBlRTNoa2lVRzVuQnBnakYxNERYYm8rRFFSYmZwVjEzek1wbElKQ3VjK1ZMSnhHZ2F6eEZ3V0kzWkxuajY1WDUwMHhCMDNvWjBNTDRhU1A2R3ZRWEtidVBNclVxdm1hUWgzVUdaclJVWk5pWW85dFhUUlU3eEdsZFN5cFk0NWJBckxVTE16dEFiNjVpbWRJT2FSRFlwSVVGNUJzSW83S1E2L1V6U3d0STJTZWRTMWs3UW9JWFBTYzBHVEY0dXpXaHhMeHZ3TnhGN2g5cjEyTExZWElkOUZENXNyTy9TMzJiS2VXelpQSnFYL0FNM1FoMXB1ZlN0NzZqaVF2WUVsMW1NMGVNN1RNa3dBQTN0OVNEbTc2WmFYS0xaNTY1dnBPMGl4dmZReUNJMmo1Qk9oVi9rMlBpVjNzUnQ0S3FGbC9tRHVEblV6Nm03VnY3OFJQYjNJMWpQTVhWQ3FWWWlmK0VURkhuVzNyY2hNYjUxZTF1dVZwekwwbGdHVElBVU1hUlVGY0tBRHNJRUUwUUlabUtmeURVbEZaWWNvMmE2LzQzUURDYVhza2NNR09LMnM1S0Z6cVB5aTdzamZKOVM4TlZvamo4b1gxTWp1eWZFRVFJQ1BjV2ltQVdnakxCd2tKcTBPSmppZEhaejJpWTNPWnpzRWtkbnJFTmx5blNOWVlsNXloREtYWWc4ajFicVRDQWhzbkM3eTVLdFFLSnRYbG1JeWhVdThOTExCQlppeXVRT1V5RGJKZEVVbXlEV1pyTDlDZWFhWlloSUg3VVMwdUpYbWViVElpalpCY3JGODAyODZKeWV2N0V5MXhFUU9xc21UdzduS3RkQVVaZXp5VGVEbGt5M1hCR1VaNDNMS3BoN1FISzd4cWVBUWV2dG9jV1JsRXRKbEEwMVJaTXBSS1RWRlhlcnB4VnhGeGI2OG5GN2pzcTdHYmRVMjBCdWVJVkpPd3NmRnE0VFBCSVVTT0xpNEpNclFWejk5ZFpNaGFQQzRXVHNZeWdFblpxczRtcndZS2R4ZXVQbFlLVExKcURTL1Y0bzRoQ28rRHZOUWIvUUkrdkhvcmVmZ01UUE1tNFk1dTA3NVA2SklYaEgvZTEveW53RUEpIGZvcm1hdChcXFwid29mZjJcXFwiKTt1bmljb2RlLXJhbmdlOnUrMDA/Pyx1KzAxMzEsdSswMTUyLTAxNTMsdSswMmJiLTAyYmMsdSswMmM2LHUrMDJkYSx1KzAyZGMsdSsyMDAwLTIwNmYsdSsyMDc0LHUrMjBhYyx1KzIxMjIsdSsyMTkxLHUrMjE5Myx1KzIyMTIsdSsyMjE1LHUrZmVmZix1K2ZmZmR9Ym9keSxodG1se2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjR9aHRtbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItcGFyYWdyYXBoLHB7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNjt0ZXh0LWFsaWduOmp1c3RpZnl9Lm1vbnN0ZXItaDEsaDF7Zm9udC1zaXplOjNyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDIsaDJ7Zm9udC1zaXplOjIuNXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4yO21hcmdpbjo0cmVtIDAgMS41cmVtfS5tb25zdGVyLWgzLGgze2ZvbnQtc2l6ZToycmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI1O21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNCxoNHtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg1LGg1e2ZvbnQtc2l6ZToxLjRyZW07Zm9udC13ZWlnaHQ6Ym9sZGVyO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDYsaDZ7Zm9udC1zaXplOjEuM3JlbTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX1wK2gxe21hcmdpbi10b3A6My43NXJlbX1wK2gye21hcmdpbi10b3A6M3JlbX1wK2gze21hcmdpbi10b3A6Mi4yNXJlbX1wK2g0e21hcmdpbi10b3A6MS41cmVtfXAraDV7bWFyZ2luLXRvcDouNzVyZW19ZGl2K2gxLGRpditoMixkaXYraDMsZGl2K2g0LGRpditoNSxkaXYraDYscCtoNnttYXJnaW4tdG9wOjB9LmRlY297YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xKSAwLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMikgNTAlLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMykgMTAwJSk7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSk7dGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50fTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xKX06OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfWtiZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOi4yNXJlbTtib3JkZXItcmFkaXVzOjEwcmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3BhZGRpbmc6LjI1ZW0gLjZlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9ZGV0YWlsc3ttYXJnaW4tYm90dG9tOjFyZW19c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LWZlYXR1cmUtc2V0dGluZ3M6XFxcInRudW1cXFwiO2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMWVtO3BhZGRpbmc6LjZyZW0gMXJlbX1kZXRhaWxzW29wZW5de3BhZGRpbmc6LjZyZW0gMXJlbSAuNzVyZW19ZGV0YWlsc1tvcGVuXSBzdW1tYXJ5e21hcmdpbi1ib3R0b206LjVyZW07cGFkZGluZzowfS5tb25zdGVyLW5vLXVzZXItc2VsZWN0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX1Aa2V5ZnJhbWVzIGRldGFpbHMtc2hvd3swJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41ZW0pfX1kZXRhaWxzW29wZW5dPjpub3Qoc3VtbWFyeSl7YW5pbWF0aW9uOmRldGFpbHMtc2hvdyAuMTVzIGVhc2UtaW4tb3V0fWRldGFpbHNbb3Blbl0+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5tb25vc3BhY2V7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseS1tb25vc3BhY2UpfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSBbZGF0YS1tb25zdGVyLXJvbGU9YnV0dG9uXXttaW4td2lkdGg6LW1vei1tYXgtY29udGVudDttaW4td2lkdGg6bWF4LWNvbnRlbnQ7d2lkdGg6MTAwJX1idXR0b257d2lkdGg6LW1vei1tYXgtY29udGVudDt3aWR0aDptYXgtY29udGVudH0gXG59YCxcblx0XHQwLFxuXHQpO1xufSBjYXRjaCAoZSkge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRkb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLFxuXHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0ZSArIFwiXCIsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX1JPTEUgfSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRyZWdpc3RlckN1c3RvbUVsZW1lbnQsXG59IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBQb3BwZXIgfSBmcm9tIFwiLi9wb3BwZXIubWpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlU3RhdGVCdXR0b25TdHlsZVNoZWV0IH0gZnJvbSBcIi4vc3R5bGVzaGVldC9tZXNzYWdlLXN0YXRlLWJ1dHRvbi5tanNcIjtcbmltcG9ydCB7IFN0YXRlQnV0dG9uU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvc3RhdGUtYnV0dG9uLm1qc1wiO1xuaW1wb3J0IFwiLi9zdGF0ZS1idXR0b24ubWpzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuXG5leHBvcnQgeyBNZXNzYWdlU3RhdGVCdXR0b24gfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYnV0dG9uRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImJ1dHRvbkVsZW1lbnRcIik7XG5cbi8qKlxuICogQSBzZWxlY3QgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvcHRpb25zIGZyb20gYSBsaXN0LlxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL2Zvcm0vbWVzc2FnZS1zdGF0ZS1idXR0b24vXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9tZXNzYWdlLXN0YXRlLWJ1dHRvbi1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMi4xMS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBiZWF1dGlmdWwgc2VsZWN0IGNvbnRyb2wgdGhhdCBjYW4gbWFrZSB5b3VyIGxpZmUgZWFzaWVyIGFuZCBhbHNvIGxvb2tzIGdvb2QuXG4gKiBAZmlyZXMgbW9uc3Rlci1vcHRpb25zLXNldFxuICogQGZpcmVzIG1vbnN0ZXItc2VsZWN0ZWRcbiAqIEBmaXJlcyBtb25zdGVyLWNoYW5nZVxuICogQGZpcmVzIG1vbnN0ZXItY2hhbmdlZFxuICovXG5jbGFzcyBNZXNzYWdlU3RhdGVCdXR0b24gZXh0ZW5kcyBQb3BwZXIge1xuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcblx0XHRcdFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2Zvcm0vbWVzc2FnZS1zdGF0ZS1idXR0b25AQGluc3RhbmNlXCIsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRcblx0ICogQHJldHVybiB7TWVzc2FnZVN0YXRlQnV0dG9ufVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZVxuXHQgKi9cblx0c2V0U3RhdGUoc3RhdGUsIHRpbWVvdXQpIHtcblx0XHRyZXR1cm4gdGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5zZXRTdGF0ZShzdGF0ZSwgdGltZW91dCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TWVzc2FnZVN0YXRlQnV0dG9ufVxuXHQgKi9cblx0cmVtb3ZlU3RhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0ucmVtb3ZlU3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5UeXBlcy5TdGF0ZXx1bmRlZmluZWR9XG5cdCAqL1xuXHRnZXRTdGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5nZXRTdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jLyNjb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH1cblx0ICpcblx0ICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUZW1wbGF0ZSBkZWZpbml0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gTWFpbiB0ZW1wbGF0ZVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gbGFiZWxzIExhYmVsIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbHMuYnV0dG9uIEJ1dHRvbiBsYWJlbFxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gbW9kZSBNb2RlIGRlZmluaXRpb25zIChtYW51YWwsIHN1Ym1pdClcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdG1lc3NhZ2U6IHtcblx0XHRcdFx0dGl0bGU6IHVuZGVmaW5lZCxcblx0XHRcdFx0Y29udGVudDogdW5kZWZpbmVkLFxuXHRcdFx0XHRpY29uOiB1bmRlZmluZWQsXG5cdFx0XHR9LFxuXHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHR9LFxuXHRcdFx0bW9kZTogXCJtYW51YWxcIixcblx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRidXR0b246IFwiPHNsb3Q+PC9zbG90PlwiLFxuXHRcdFx0fSxcblx0XHRcdGNsYXNzZXM6IHtcblx0XHRcdFx0YnV0dG9uOiBcIm1vbnN0ZXItYnV0dG9uLXByaW1hcnlcIixcblx0XHRcdH0sXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGNsaWNrOiAoZSkgPT4ge30sXG5cdFx0XHR9LFxuXHRcdFx0ZmVhdHVyZXM6IHtcblx0XHRcdFx0ZGlzYWJsZUJ1dHRvbjogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXG5cdFx0bGV0IG1vZGVzID0gbnVsbDtcblx0XHRjb25zdCBtb2RlT3B0aW9uID0gdGhpcy5nZXRPcHRpb24oXCJtb2RlXCIpO1xuXHRcdGlmICh0eXBlb2YgbW9kZU9wdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0bW9kZXMgPSBtb2RlT3B0aW9uLnNwbGl0KFwiIFwiKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRtb2RlcyA9PT0gbnVsbCB8fFxuXHRcdFx0bW9kZXMgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0aXNBcnJheShtb2RlcykgPT09IGZhbHNlIHx8XG5cdFx0XHRtb2Rlcy5sZW5ndGggPT09IDBcblx0XHQpIHtcblx0XHRcdG1vZGVzID0gW1wibWFudWFsXCJdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgWywgbW9kZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kZXMpKSB7XG5cdFx0XHRpbml0RXZlbnRIYW5kbGVyQnlNb2RlLmNhbGwodGhpcywgbW9kZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbWVzc2FnZVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudH1tZXNzYWdlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWNvblxuXHQgKiBAcmV0dXJuIHtNZXNzYWdlU3RhdGVCdXR0b259XG5cdCAqL1xuXHRzZXRNZXNzYWdlKG1lc3NhZ2UsIHRpdGxlLCBpY29uKSB7XG5cdFx0aWYgKGlzU3RyaW5nKG1lc3NhZ2UpKSB7XG5cdFx0XHRpZiAobWVzc2FnZSA9PT0gXCJcIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwibWVzc2FnZSBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdGNvbnN0IG1lc3NhZ2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0Y29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0dGl0bGVEaXYuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9ST0xFLCBcIm1lc3NhZ2UtdGl0bGUtYm94XCIpO1xuXG5cdFx0XHRsZXQgdGl0bGVFbGVtZW50LCBpY29uRWxlbWVudDtcblx0XHRcdGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRpdGxlID0gdmFsaWRhdGVTdHJpbmcodGl0bGUpO1xuXHRcdFx0XHR0aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHR0aXRsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJcIik7XG5cdFx0XHRcdHRpdGxlRWxlbWVudC5pbm5lckhUTUwgPSB0aXRsZTtcblx0XHRcdFx0dGl0bGVFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUk9MRSwgXCJtZXNzYWdlLXRpdGxlXCIpO1xuXHRcdFx0XHR0aXRsZURpdi5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaWNvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGljb24gPSB2YWxpZGF0ZVN0cmluZyhpY29uKTtcblx0XHRcdFx0aWNvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRpY29uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcIlwiKTtcblx0XHRcdFx0aWNvbkVsZW1lbnQuaW5uZXJIVE1MID0gaWNvbjtcblx0XHRcdFx0aWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9ST0xFLCBcIm1lc3NhZ2UtaWNvblwiKTtcblx0XHRcdFx0dGl0bGVEaXYuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRtZXNzYWdlRGl2LmlubmVySFRNTCA9IG1lc3NhZ2U7XG5cdFx0XHRjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuXHRcdFx0Y29udGFpbmVyRGl2LmFwcGVuZENoaWxkKG1lc3NhZ2VEaXYpO1xuXG5cdFx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2UuY29udGVudFwiLCBjb250YWluZXJEaXYpO1xuXHRcdH0gZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2UuY29udGVudFwiLCBtZXNzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdFx0XCJtZXNzYWdlIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcIixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogY2xlYXJzIHRoZSBNZXNzYWdlXG5cdCAqXG5cdCAqIEByZXR1cm4ge01lc3NhZ2VTdGF0ZUJ1dHRvbn1cblx0ICovXG5cdGNsZWFyTWVzc2FnZSgpIHtcblx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2UudGl0bGVcIiwgdW5kZWZpbmVkKTtcblx0XHR0aGlzLnNldE9wdGlvbihcIm1lc3NhZ2UuY29udGVudFwiLCB1bmRlZmluZWQpO1xuXHRcdHRoaXMuc2V0T3B0aW9uKFwibWVzc2FnZS5pY29uXCIsIHVuZGVmaW5lZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogV2l0aCB0aGlzIG1ldGhvZCB5b3UgY2FuIHNob3cgdGhlIHBvcHBlciB3aXRoIHRpbWVvdXQgZmVhdHVyZS5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRcblx0ICogQHJldHVybiB7TWVzc2FnZVN0YXRlQnV0dG9ufVxuXHQgKi9cblx0c2hvd01lc3NhZ2UodGltZW91dCkge1xuXHRcdHRoaXMuc2hvd0RpYWxvZy5jYWxsKHRoaXMpO1xuXG5cdFx0aWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHN1cGVyLmhpZGVEaWFsb2coKTtcblx0XHRcdH0sIHRpbWVvdXQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpdGggdGhpcyBtZXRob2QgeW91IGNhbiBzaG93IHRoZSBwb3BwZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge01lc3NhZ2VTdGF0ZUJ1dHRvbn1cblx0ICovXG5cdHNob3dEaWFsb2coKSB7XG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwibWVzc2FnZS5jb250ZW50XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0c3VwZXIuc2hvd0RpYWxvZygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge01lc3NhZ2VTdGF0ZUJ1dHRvbn1cblx0ICovXG5cdGhpZGVNZXNzYWdlKCkge1xuXHRcdHN1cGVyLmhpZGVEaWFsb2coKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNZXNzYWdlU3RhdGVCdXR0b259XG5cdCAqL1xuXHR0b2dnbGVNZXNzYWdlKCkge1xuXHRcdHN1cGVyLnRvZ2dsZURpYWxvZygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge09iamVjdH1cblx0ICovXG5cdGdldE1lc3NhZ2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKFwibWVzc2FnZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItbWVzc2FnZS1zdGF0ZS1idXR0b25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtBcnJheTxDU1NTdHlsZVNoZWV0Pn1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdGNvbnN0IHN0eWxlcyA9IFBvcHBlci5nZXRDU1NTdHlsZVNoZWV0KCk7XG5cdFx0c3R5bGVzLnB1c2goU3RhdGVCdXR0b25TdHlsZVNoZWV0KTtcblx0XHRzdHlsZXMucHVzaChNZXNzYWdlU3RhdGVCdXR0b25TdHlsZVNoZWV0KTtcblx0XHRyZXR1cm4gc3R5bGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCdXR0b24uY2xpY2soKSBtZXRob2Qgc2ltdWxhdGVzIGEgY2xpY2sgb24gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy4yNy4wXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9jbGlja31cblx0ICovXG5cdGNsaWNrKCkge1xuXHRcdGlmICh0aGlzLmdldE9wdGlvbihcImRpc2FibGVkXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXSAmJlxuXHRcdFx0aXNGdW5jdGlvbih0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdLmNsaWNrKVxuXHRcdCkge1xuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5jbGljaygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQnV0dG9uLmZvY3VzKCkgbWV0aG9kIHNldHMgZm9jdXMgb24gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAc2luY2UgMy4yNy4wXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1c31cblx0ICovXG5cdGZvY3VzKG9wdGlvbnMpIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJkaXNhYmxlZFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0gJiZcblx0XHRcdGlzRnVuY3Rpb24odGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5mb2N1cylcblx0XHQpIHtcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uZm9jdXMob3B0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCdXR0b24uYmx1cigpIG1ldGhvZCByZW1vdmVzIGZvY3VzIGZyb20gdGhlIGludGVybmFsIGJ1dHRvbiBlbGVtZW50LlxuXHQgKi9cblx0Ymx1cigpIHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdICYmXG5cdFx0XHRpc0Z1bmN0aW9uKHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYmx1cilcblx0XHQpIHtcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uYmx1cigpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyQnlNb2RlKG1vZGUpIHtcblx0c3dpdGNoIChtb2RlKSB7XG5cdFx0Y2FzZSBcIm1hbnVhbFwiOlxuXHRcdFx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5zZXRPcHRpb24oXCJhY3Rpb25zLmNsaWNrXCIsIChlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gdGhpcy5nZXRPcHRpb24oXCJhY3Rpb25zLmNsaWNrXCIpO1xuXHRcdFx0XHRpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRcdFx0XHRjYWxsYmFjayhlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJzdWJtaXRcIjpcblx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uc2V0T3B0aW9uKFwiYWN0aW9ucy5jbGlja1wiLCAoZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBmb3JtID0gdGhpcy5mb3JtO1xuXG5cdFx0XHRcdGlmIChmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG5cdFx0XHRcdFx0Zm9ybS5yZXF1ZXN0U3VibWl0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRicmVhaztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtTZWxlY3R9XG4gKi9cbmZ1bmN0aW9uIGluaXRDb250cm9sUmVmZXJlbmNlcygpIHtcblx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdGBbJHtBVFRSSUJVVEVfUk9MRX09YnV0dG9uXWAsXG5cdCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG5cdC8vIGxhbmd1YWdlPUhUTUxcblx0cmV0dXJuIGBcbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiPlxuXG4gICAgICAgICAgICA8bW9uc3Rlci1zdGF0ZS1idXR0b24gZXhwb3J0cGFydHM9XCJidXR0b246YnV0dG9uLWJ1dHRvbixjb250cm9sOmJ1dHRvbi1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImRhdGEtbW9uc3Rlci1vcHRpb24tY2xhc3Nlcy1idXR0b24gcGF0aDpjbGFzc2VzLmJ1dHRvbiwgZGlzYWJsZWQgcGF0aDpmZWF0dXJlcy5kaXNhYmxlQnV0dG9uIHwgaWY6dHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydD1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bGFiZWxzLmJ1dHRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbW9uc3Rlci1zdGF0ZS1idXR0b24+XG5cblxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInBvcHBlclwiIHBhcnQ9XCJwb3BwZXJcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJtb25zdGVyLWNvbG9yLXByaW1hcnktMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJhcnJvd1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJtZXNzYWdlXCIgcGFydD1cIm1lc3NhZ2VcIiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm1lc3NhZ2UuY29udGVudFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoTWVzc2FnZVN0YXRlQnV0dG9uKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfUk9MRSB9IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtcblx0YXNzZW1ibGVNZXRob2RTeW1ib2wsXG5cdHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHsgdHlwZU9mIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVvZi5tanNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvbi5tanNcIjtcbmltcG9ydCB7IFBvcHBlckJ1dHRvbiB9IGZyb20gXCIuL3BvcHBlci1idXR0b24ubWpzXCI7XG5pbXBvcnQgeyBDb25maXJtQnV0dG9uU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvY29uZmlybS1idXR0b24ubWpzXCI7XG5pbXBvcnQgeyBmaXJlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vLi4vZG9tL2V2ZW50cy5tanNcIjtcblxuaW1wb3J0IFwiLi9idXR0b24ubWpzXCI7XG5pbXBvcnQgXCIuL21lc3NhZ2Utc3RhdGUtYnV0dG9uLm1qc1wiO1xuaW1wb3J0IHsgUG9wcGVyQnV0dG9uU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvcG9wcGVyLWJ1dHRvbi5tanNcIjtcbmltcG9ydCB7IFN0YXRlQnV0dG9uU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvc3RhdGUtYnV0dG9uLm1qc1wiO1xuXG5leHBvcnQgeyBDb25maXJtQnV0dG9uIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbmZpcm1CdXR0b25FbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29uZmlybUJ1dHRvbkVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNhbmNlbEJ1dHRvbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJjYW5jZWxCdXR0b25FbGVtZW50XCIpO1xuXG4vKipcbiAqIFRoaXMgYWN0aW9uIGNhbGxiYWNrIGV4ZWN1dGVzIHRoZSBhY3Rpb25zIHdoZW4gYSBidXR0b24gaXMgY2xpY2tlZC5cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5Db21wb25lbnRzLkZvcm1+ZXhhbXBsZUFjdGlvbkNhbGxiYWNrXG4gKiBAcGFyYW0ge0V2ZW50fSBlIEV2ZW50XG4gKiBAdGhpcyB7Q3VzdG9tQ29udHJvbH1cbiAqL1xuXG4vKipcbiAqIFRoaXMgQ3VzdG9tQ29udHJvbCBjcmVhdGVzIGEgY29uZmlybSBidXR0b24gZWxlbWVudCB3aXRoIGEgdmFyaWV0eSBvZiBvcHRpb25zLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWFnZXMvY29uZmlybS1idXR0b24ucG5nXCI+XG4gKlxuICogRGVwZW5kZW5jaWVzOiB0aGUgc3lzdGVtIHVzZXMgZnVuY3Rpb25zIG9mIHRoZSBbbW9uc3RlcmpzXShodHRwczovL21vbnN0ZXJqcy5vcmcvKSBsaWJyYXJ5XG4gKiBhcyB3ZWxsIGFzIFtwb29wZXJqc10oaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKS5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGlzIGNvbnRyb2wgZWl0aGVyIGJ5IHNwZWNpZnlpbmcgdGhlIEhUTUwgdGFnIDxtb25zdGVyLWNvbmZpcm0tYnV0dG9uIC8+YCBkaXJlY3RseSBpbiB0aGUgSFRNTCBvciB1c2luZ1xuICogSmF2YXNjcmlwdCB2aWEgdGhlIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWNvbmZpcm0tYnV0dG9uJyk7YCBtZXRob2QuXG4gKlxuICogYGBgaHRtbFxuICogPG1vbnN0ZXItY29uZmlybS1idXR0b24+PC9tb25zdGVyLWNvbmZpcm0tYnV0dG9uPlxuICogYGBgXG4gKlxuICogT3IgeW91IGNhbiBjcmVhdGUgdGhpcyBDdXN0b21Db250cm9sIGRpcmVjdGx5IGluIEphdmFzY3JpcHQ6XG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7Q29uZmlybUJ1dHRvbn0gZnJvbSAnQHNjaHVrYWkvY29tcG9uZW50LWZvcm0vc291cmNlL2NvbmZpcm0tYnV0dG9uLmpzJztcbiAqIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY29uZmlybS1idXR0b24nKTtcbiAqIGBgYFxuICogVGhlIGBkYXRhLW1vbnN0ZXItYnV0dG9uLWNsYXNzYCBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGJ1dHRvbi5cbiAqXG4gKiBAc3RhcnR1bWwgY29uZmlybS1idXR0b24ucG5nXG4gKiBza2lucGFyYW0gbW9ub2Nocm9tZSB0cnVlXG4gKiBza2lucGFyYW0gc2hhZG93aW5nIGZhbHNlXG4gKiBIVE1MRWxlbWVudCA8fC0tIEN1c3RvbUVsZW1lbnRcbiAqIEN1c3RvbUVsZW1lbnQgPHwtLSBDdXN0b21Db250cm9sXG4gKiBDdXN0b21Db250cm9sIDx8LS0gQnV0dG9uXG4gKiBCdXR0b24gPHwtLSBQb3BwZXJCdXR0b25cbiAqIFBvcHBlckJ1dHRvbiA8fC0tIENvbmZpcm1CdXR0b25cbiAqIEBlbmR1bWxcbiAqXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBjb25maXJtIGJ1dHRvblxuICovXG5cbi8qKlxuICogQSBjb25maXJtIGJ1dHRvbiBjb250cm9sLlxuICpcbiAqIEBmcmFnbWVudHMgL2ZyYWdtZW50cy9jb21wb25lbnRzL2Zvcm0vY29uZmlybS1idXR0b24vXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS9jb25maXJtLWJ1dHRvbi1zaW1wbGUgY29uZmlybSBidXR0b25cbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGNvbmZpcm0gYnV0dG9uIGNvbnRyb2xcbiAqL1xuY2xhc3MgQ29uZmlybUJ1dHRvbiBleHRlbmRzIFBvcHBlckJ1dHRvbiB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcblx0XHRcdFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2Zvcm0vY29uZmlybS1idXR0b25AQGluc3RhbmNlXCIsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0b2dnbGVFdmVudFR5cGU9Y2xpY2ssdG91Y2ggTGlzdCBvZiBldmVudCB0eXBlcyB0byBiZSBvYnNlcnZlZCBmb3Igb3BlbmluZyB0aGUgY29uZmlybSBtZXNzYWdlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXMgVGVtcGxhdGUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIE1haW4gdGVtcGxhdGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5idXR0b249JzxzbG90IG5hbWU9XCJidXR0b25cIj48L3Nsb3Q+JyBCdXR0b24gbGFiZWxcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5tZXNzYWdlPSc8c2xvdD5TaG91bGQgSSBTdGF5IG9yIFNob3VsZCBJIEdvPzwvc2xvdD4nIE1lc3NhZ2Vcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVscy5jb25maXJtPSc8c2xvdCBuYW1lPVwiY29uZmlybVwiPkNvbmZpcm08L3Nsb3Q+JyBDb25maXJtIGJ1dHRvbiBsYWJlbFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWxzLmNhbmNlbD0nPHNsb3QgbmFtZT1cImNhbmNlbFwiPkNhbmNlbDwvc2xvdD4nIENhbmNlbCBidXR0b24gbGFiZWxcblx0ICogQHByb3BlcnR5IHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybX5leGFtcGxlQWN0aW9uQ2FsbGJhY2t9IGFjdGlvbnMuY29uZmlybVxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtfmV4YW1wbGVBY3Rpb25DYWxsYmFja30gYWN0aW9ucy5jYW5jZWwgTGlzdCBvZiBldmVudCB0eXBlcyB0byBiZSBvYnNlcnZlZCBmb3Igb3BlbmluZyB0aGUgZHJvcGRvd25cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHBvcHBlciBbUG9wcGVySlMgT3B0aW9uc10oaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gcG9wcGVyLnBsYWNlbWVudD10b3AgUG9wcGVySlMgcGxhY2VtZW50XG5cdCAqIEBleHRlbmRzIHtQb3BwZXJCdXR0b259XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0Y29uc3Qgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0fSxcblx0XHRcdGxhYmVsczoge1xuXHRcdFx0XHRidXR0b246ICc8c2xvdCBuYW1lPVwiYnV0dG9uXCI+PC9zbG90PicsXG5cdFx0XHRcdG1lc3NhZ2U6IFwiPHNsb3Q+U2hvdWxkIEkgU3RheSBvciBTaG91bGQgSSBHbz88L3Nsb3Q+XCIsXG5cdFx0XHRcdGNvbmZpcm06ICc8c2xvdCBuYW1lPVwiY29uZmlybVwiPkNvbmZpcm08L3Nsb3Q+Jyxcblx0XHRcdFx0Y2FuY2VsOiAnPHNsb3QgbmFtZT1cImNhbmNlbFwiPkNhbmNlbDwvc2xvdD4nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdG9ialtcImNsYXNzZXNcIl1bXCJjb25maXJtQnV0dG9uXCJdID0gXCJtb25zdGVyLWJ1dHRvbi1wcmltYXJ5XCI7XG5cdFx0b2JqW1wiY2xhc3Nlc1wiXVtcImNhbmNlbEJ1dHRvblwiXSA9IFwibW9uc3Rlci1idXR0b24tc2Vjb25kYXJ5XCI7XG5cdFx0b2JqW1wiYWN0aW9uc1wiXVtcImNhbmNlbFwiXSA9IChlKSA9PiB7XG5cdFx0XHR0aGlzLmhpZGVEaWFsb2coKTtcblx0XHR9O1xuXG5cdFx0b2JqW1wiYWN0aW9uc1wiXVtcImNvbmZpcm1cIl0gPSAoZSkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidGhpcyBjYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkXCIpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9XG5cblx0aGlkZURpYWxvZygpIHtcblx0XHRzdXBlci5oaWRlRGlhbG9nKCk7XG5cdFx0dGhpc1tjb25maXJtQnV0dG9uRWxlbWVudFN5bWJvbF0ucmVtb3ZlU3RhdGUoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5Qb3BwZXJCdXR0b259XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXHRcdGluaXRFdmVudGhhbmRsZXIuY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItY29uZmlybS1idXR0b25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtBcnJheX1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdGNvbnN0IHN0eWxlcyA9IFBvcHBlckJ1dHRvbi5nZXRDU1NTdHlsZVNoZWV0KCk7XG5cdFx0c3R5bGVzLnB1c2goQ29uZmlybUJ1dHRvblN0eWxlU2hlZXQpO1xuXHRcdHJldHVybiBzdHlsZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkZvcm0uUG9wcGVyQnV0dG9ufVxuXHQgKi9cblx0c2hvd0RpYWxvZygpIHtcblx0XHRjb25zdCBjb25maXJtQnV0dG9uQ2xhc3MgPSB0aGlzLmdldE9wdGlvbihcImNsYXNzZXMuY29uZmlybUJ1dHRvblwiKTtcblx0XHRpZiAoY29uZmlybUJ1dHRvbkNsYXNzKSB7XG5cdFx0XHR0aGlzW2NvbmZpcm1CdXR0b25FbGVtZW50U3ltYm9sXS5zZXRPcHRpb24oXG5cdFx0XHRcdFwiY2xhc3Nlcy5idXR0b25cIixcblx0XHRcdFx0Y29uZmlybUJ1dHRvbkNsYXNzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjYW5jZWxCdXR0b25DbGFzcyA9IHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5jYW5jZWxCdXR0b25cIik7XG5cdFx0aWYgKGNhbmNlbEJ1dHRvbkNsYXNzKSB7XG5cdFx0XHR0aGlzW2NhbmNlbEJ1dHRvbkVsZW1lbnRTeW1ib2xdLnNldE9wdGlvbihcblx0XHRcdFx0XCJjbGFzc2VzLmJ1dHRvblwiLFxuXHRcdFx0XHRjYW5jZWxCdXR0b25DbGFzcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1cGVyLnNob3dEaWFsb2coKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGNvbmZpcm0gYnV0dG9uIHN0YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5Db25maXJtQnV0dG9ufVxuXHQgKi9cblx0c2V0Q29uZmlybUJ1dHRvblN0YXRlKHN0YXRlLCB0aW1lb3V0KSB7XG5cdFx0dGhpc1tjb25maXJtQnV0dG9uRWxlbWVudFN5bWJvbF0uc2V0U3RhdGUoc3RhdGUsIHRpbWVvdXQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbmQgc2hvdyB0aGUgY29uZmlybSBidXR0b24gbWVzc2FnZVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5Db25maXJtQnV0dG9ufVxuXHQgKi9cblx0c2hvd0NvbmZpcm1CdXR0b25NZXNzYWdlKG1lc3NhZ2UsIHRpbWVvdXQpIHtcblx0XHR0aGlzW2NvbmZpcm1CdXR0b25FbGVtZW50U3ltYm9sXS5zZXRNZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpc1tjb25maXJtQnV0dG9uRWxlbWVudFN5bWJvbF0uc2hvd01lc3NhZ2UodGltZW91dCk7XG5cdFx0fSwgMCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHR5cGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb24odHlwZSkge1xuXHRjb25zdCBzZWxmID0gdGhpcztcblxuXHRyZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSBzZWxmLmdldE9wdGlvbihgYWN0aW9ucy4ke3R5cGV9YCk7XG5cdFx0aWYgKHR5cGVPZihjYWxsYmFjaykgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNhbGxiYWNrLmNhbGwodGhpcywgZXZlbnQpO1xuXHR9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtpbml0RXZlbnRoYW5kbGVyfVxuICogQGZpcmVzIE1vbnN0ZXIuQ29tcG9uZW50cy5Gb3JtLlBvcHBlckJ1dHRvbiNtb25zdGVyLWNvbmZpcm1cbiAqIEBmaXJlcyBNb25zdGVyLkNvbXBvbmVudHMuRm9ybS5Qb3BwZXJCdXR0b24jbW9uc3Rlci1jb25maXJtZWRcbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50aGFuZGxlcigpIHtcblx0dGhpc1tjYW5jZWxCdXR0b25FbGVtZW50U3ltYm9sXS5zZXRPcHRpb24oXG5cdFx0XCJjbGlja0V2ZW50VHlwZVwiLFxuXHRcdHRoaXMuZ2V0T3B0aW9uKFwiY2xpY2tFdmVudFR5cGVcIiwgW1wiY2xpY2tcIl0pLFxuXHQpO1xuXHR0aGlzW2NhbmNlbEJ1dHRvbkVsZW1lbnRTeW1ib2xdLnNldE9wdGlvbihcblx0XHRcImFjdGlvbnMuY2xpY2tcIixcblx0XHRnZXRBY3Rpb24uY2FsbCh0aGlzLCBcImNhbmNlbFwiKSxcblx0KTtcblxuXHR0aGlzW2NvbmZpcm1CdXR0b25FbGVtZW50U3ltYm9sXS5zZXRPcHRpb24oXG5cdFx0XCJjbGlja0V2ZW50VHlwZVwiLFxuXHRcdHRoaXMuZ2V0T3B0aW9uKFwiY2xpY2tFdmVudFR5cGVcIiwgW1wiY2xpY2tcIl0pLFxuXHQpO1xuXHR0aGlzW2NvbmZpcm1CdXR0b25FbGVtZW50U3ltYm9sXS5zZXRPcHRpb24oXCJhY3Rpb25zLmNsaWNrXCIsICgpID0+IHtcblx0XHRjb25zdCBjYWxsYmFjayA9IGdldEFjdGlvbi5jYWxsKHRoaXMsIFwiY29uZmlybVwiKTtcblx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLWNvbmZpcm1cIiwge30pO1xuXHRcdGNhbGxiYWNrLmNhbGwodGhpcyk7XG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1jb25maXJtZWRcIiwge30pO1xuXHR9KTtcblxuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICovXG5mdW5jdGlvbiBpbml0Q29udHJvbFJlZmVyZW5jZXMoKSB7XG5cdHRoaXNbY29uZmlybUJ1dHRvbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1jb25maXJtXWAsXG5cdCk7XG5cdHRoaXNbY2FuY2VsQnV0dG9uRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRgWyR7QVRUUklCVVRFX1JPTEV9PWNhbmNlbF1gLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRlbXBsYXRlKCkge1xuXHQvLyBsYW5ndWFnZT1IVE1MXG5cdHJldHVybiBgXG5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImRpc2FibGVkIHBhdGg6ZGlzYWJsZWQgfCBpZjp0cnVlLCBjbGFzcyBwYXRoOmNsYXNzZXMuYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBwYXJ0PVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmxhYmVscy5idXR0b25cIj48L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInBvcHBlclwiIHBhcnQ9XCJwb3BwZXJcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJtb25zdGVyLWNvbG9yLXByaW1hcnktMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJhcnJvd1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgcGFydD1cIm1lc3NhZ2VcIiBjbGFzcz1cImZsZXhcIiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bGFiZWxzLm1lc3NhZ2VcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiZGVjaXNpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1vbnN0ZXItbWVzc2FnZS1zdGF0ZS1idXR0b24gZXhwb3J0cGFydHM9XCJtb25zdGVyLXN0YXRlLWJ1dHRvbjpjb25maXJtLWJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6Y29uZmlybS1jb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLWJ1dHRvbjpjb25maXJtLWNvbnRyb2wtYnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLWNvbnRyb2w6Y29uZmlybS1idXR0b24tY29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHBlcjpjb25maXJtLXBvcHBlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6Y29uZmlybS1wb3BwZXItbWVzc2FnZS1tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjpjb25maXJtLXBvcHBlci1tZXNzYWdlLWljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTpjb25maXJtLXBvcHBlci1tZXNzYWdlLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJkYXRhLW1vbnN0ZXItYnV0dG9uLWNsYXNzIHBhdGg6Y2xhc3Nlcy5jb25maXJtQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJjb25maXJtXCIgcGFydD1cImNvbmZpcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpsYWJlbHMuY29uZmlybVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tb25zdGVyLW1lc3NhZ2Utc3RhdGUtYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtb25zdGVyLWJ1dHRvbiBleHBvcnRwYXJ0cz1cImJ1dHRvbjpjYW5jZWwtYnV0dG9uLGNvbnRyb2w6Y2FuY2VsLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJkYXRhLW1vbnN0ZXItYnV0dG9uLWNsYXNzIHBhdGg6Y2xhc3Nlcy5jYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJjYW5jZWxcIiBwYXJ0PVwiY2FuY2VsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bGFiZWxzLmNhbmNlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tb25zdGVyLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoQ29uZmlybUJ1dHRvbik7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaXNBcnJheSwgaXNJbnN0YW5jZSB9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL25vZGUubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUluc3RhbmNlIH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBOb2RlTGlzdCB9O1xuXG4vKipcbiAqIFlvdSBjYW4gY3JlYXRlIHRoZSBpbnN0YW5jZSB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5UeXBlcy5Ob2RlTGlzdCgpYC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI2LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIE5vZGVMaXN0IGNsYXNzXG4gKi9cbmNsYXNzIE5vZGVMaXN0IGV4dGVuZHMgU2V0IHtcblx0LyoqXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBpbnZhbGlkIHZhbHVlIHR5cGVcblx0ICogQHBhcmFtIHtOb2RlTGlzdHxOb2RlfEFycmF5PE5vZGU+fXZhbHVlc1xuXHQgKi9cblx0Y29uc3RydWN0b3IodmFsdWVzKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGlmICh2YWx1ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG5cdFx0aWYgKGlzQXJyYXkodmFsdWVzKSkge1xuXHRcdFx0dmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB0aGlzLmFkZCh2YWx1ZSkpO1xuXHRcdH0gZWxzZSBpZiAoaXNJbnN0YW5jZSh2YWx1ZXMsIE5vZGVMaXN0KSkge1xuXHRcdFx0dmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB0aGlzLmFkZCh2YWx1ZSkpO1xuXHRcdH0gZWxzZSBpZiAoaXNJbnN0YW5jZSh2YWx1ZXMsIE5vZGUpKSB7XG5cdFx0XHR0aGlzLmFkZCh2YWx1ZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHZhbHVlIHR5cGVcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci90eXBlcy9ub2RlLWxpc3RcIik7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuTm9kZUxpc3R9XG5cdCAqL1xuXHRhZGQobm9kZSkge1xuXHRcdHN1cGVyLmFkZCh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0ICogQHJldHVybiB7Tm9kZUxpc3R9XG5cdCAqL1xuXHRyZW1vdmUobm9kZSkge1xuXHRcdHN1cGVyLmRlbGV0ZSh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGhhcyhub2RlKSB7XG5cdFx0cmV0dXJuIHN1cGVyLmhhcyh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtOb2RlTGlzdH1cblx0ICovXG5cdGNsZWFyKCkge1xuXHRcdHN1cGVyLmNsZWFyKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Tm9kZUxpc3R9XG5cdCAqL1xuXHR0b0FycmF5KCkge1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge05vZGVMaXN0fVxuXHQgKi9cblx0dG9KU09OKCkge1xuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtOb2RlTGlzdH1cblx0ICovXG5cdHRvU3RyaW5nKCkge1xuXHRcdGNvbnN0IHBhcnRzID0gW107XG5cblx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy50b0FycmF5KCkpIHtcblx0XHRcdHBhcnRzLnB1c2gobm9kZS50b1N0cmluZygpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcblx0fVxuXG5cdGdldCBsZW5ndGgoKSB7XG5cdFx0cmV0dXJuIHN1cGVyLnNpemU7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQgeyBOb2RlTGlzdCB9IGZyb20gXCIuL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnN0YW5jZSB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBOb2RlIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVybmFsVmFsdWVTeW1ib2wgPSBTeW1ib2woXCJpbnRlcm5hbERhdGFcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHRyZWVTdHJ1Y3R1cmVTeW1ib2wgPSBTeW1ib2woXCJ0cmVlU3RydWN0dXJlXCIpO1xuXG4vKipcbiAqIFlvdSBjYW4gY3JlYXRlIHRoZSBpbnN0YW5jZSB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5UeXBlcy5Ob2RlKClgLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgTm9kZSBDbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9JdGVyYXRpb25fcHJvdG9jb2xzXG4gKi9cbmNsYXNzIE5vZGUgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqIEBwYXJhbSB7Kn0gW3ZhbHVlXVxuXHQgKi9cblx0Y29uc3RydWN0b3IodmFsdWUpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0gPSB2YWx1ZTtcblxuXHRcdHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0gPSB7XG5cdFx0XHRwYXJlbnQ6IG51bGwsXG5cdFx0XHRjaGlsZE5vZGVzOiBuZXcgTm9kZUxpc3QoKSxcblx0XHRcdGxldmVsOiAwLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL3R5cGVzL25vZGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHsqfVxuXHQgKi9cblx0Z2V0IHZhbHVlKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7Kn1cblx0ICovXG5cdHNldCB2YWx1ZSh2YWx1ZSkge1xuXHRcdHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuVHlwZXMuTm9kZXxudWxsfVxuXHQgKi9cblx0Z2V0IHBhcmVudCgpIHtcblx0XHRyZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtpbnRlZ2VyfVxuXHQgKi9cblx0Z2V0IGxldmVsKCkge1xuXHRcdHJldHVybiB0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmxldmVsO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7Tm9kZUxpc3R9XG5cdCAqL1xuXHRnZXQgY2hpbGROb2RlcygpIHtcblx0XHRyZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7Tm9kZUxpc3R9XG5cdCAqL1xuXHRzZXQgY2hpbGROb2RlcyhjaGlsZE5vZGVzKSB7XG5cdFx0dGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzID0gdmFsaWRhdGVJbnN0YW5jZShcblx0XHRcdGNoaWxkTm9kZXMsXG5cdFx0XHROb2RlTGlzdCxcblx0XHQpO1xuXHRcdHNldENoaWxkTGV2ZWxBbmRQYXJlbnQuY2FsbCh0aGlzLCB0aGlzLCAxLCBuZXcgU2V0KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuTm9kZX1cblx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdCAqL1xuXHRhcHBlbmRDaGlsZChub2RlKSB7XG5cdFx0dGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmFkZCh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcblx0XHRub2RlW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLnBhcmVudCA9IHRoaXM7XG5cblx0XHRub2RlW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmxldmVsID0gdGhpcy5sZXZlbCArIDE7XG5cdFx0c2V0Q2hpbGRMZXZlbEFuZFBhcmVudC5jYWxsKHRoaXMsIG5vZGUsIDEsIG5ldyBTZXQoKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0ICovXG5cdHJlbW92ZUNoaWxkKG5vZGUpIHtcblx0XHR0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmNoaWxkTm9kZXMucmVtb3ZlKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuXHRcdG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ucGFyZW50ID0gbnVsbDtcblxuXHRcdG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWwgPSAwO1xuXHRcdHNldENoaWxkTGV2ZWxBbmRQYXJlbnQuY2FsbCh0aGlzLCBub2RlLCAtMSwgbmV3IFNldCgpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0aGFzQ2hpbGROb2RlcygpIHtcblx0XHRyZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmxlbmd0aCA+IDA7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0ICovXG5cdGhhc0NoaWxkKG5vZGUpIHtcblx0XHRyZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmhhcyhcblx0XHRcdHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMS4yOC4wXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHRvU3RyaW5nKCkge1xuXHRcdGNvbnN0IHBhcnRzID0gW107XG5cdFx0aWYgKHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0pIHtcblx0XHRcdGxldCBsYWJlbCA9IHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF07XG5cdFx0XHRpZiAoIWlzUHJpbWl0aXZlKGxhYmVsKSlcblx0XHRcdFx0bGFiZWwgPSBKU09OLnN0cmluZ2lmeSh0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdKTtcblxuXHRcdFx0cGFydHMucHVzaChsYWJlbCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0cmV0dXJuIHBhcnRzLmpvaW4oXCJcXG5cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY291bnQgPSB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO1xuXHRcdGxldCBjb3VudGVyID0gMDtcblxuXHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmNoaWxkTm9kZXMpIHtcblx0XHRcdGNvdW50ZXIrKztcblx0XHRcdGNvbnN0IHByZWZpeCA9IChjb3VudCA9PT0gY291bnRlciA/IFwiXHUyNTE0XCIgOiBcIlx1MjUxQ1wiKS5wYWRTdGFydChcblx0XHRcdFx0MiAqIG5vZGUubGV2ZWwsXG5cdFx0XHRcdFwiIHxcIixcblx0XHRcdCk7XG5cdFx0XHRwYXJ0cy5wdXNoKHByZWZpeCArIG5vZGUudG9TdHJpbmcoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcnRzLmpvaW4oXCJcXG5cIik7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcGFyYW0ge2ludH0gb3BlcmFuZFxuICogQHBhcmFtIHtTZXR9IHZpc2l0ZWROb2Rlc1xuICogQHJldHVybiB7c2V0Q2hpbGRMZXZlbEFuZFBhcmVudH1cbiAqL1xuZnVuY3Rpb24gc2V0Q2hpbGRMZXZlbEFuZFBhcmVudChub2RlLCBvcGVyYW5kLCB2aXNpdGVkTm9kZXMpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0aWYgKHZpc2l0ZWROb2Rlcy5oYXMobm9kZSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcInRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCBhbmQgY2Fubm90IGJlIHRyYXZlcnNlZCBhZ2FpblwiLFxuXHRcdCk7XG5cdH1cblxuXHR2aXNpdGVkTm9kZXMuYWRkKG5vZGUpO1xuXG5cdGlmIChub2RlICE9PSB0aGlzKSB7XG5cdFx0bm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQgPSB0aGlzO1xuXHR9XG5cblx0bm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG5cdFx0Y2hpbGRbdHJlZVN0cnVjdHVyZVN5bWJvbF0ucGFyZW50ID0gbm9kZTtcblx0XHRjaGlsZFt0cmVlU3RydWN0dXJlU3ltYm9sXS5sZXZlbCA9XG5cdFx0XHRub2RlW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmxldmVsICsgb3BlcmFuZDtcblx0XHRzZXRDaGlsZExldmVsQW5kUGFyZW50LmNhbGwoc2VsZiwgY2hpbGQsIG9wZXJhbmQsIHZpc2l0ZWROb2Rlcyk7XG5cdH0pO1xuXHRyZXR1cm4gdGhpcztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCB9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwiLi4vdHlwZXMvbm9kZS5tanNcIjtcbmltcG9ydCB7IE5vZGVMaXN0IH0gZnJvbSBcIi4uL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7IGFzc2VtYmxlUGFydHMgfSBmcm9tIFwiLi9idWlsZG1hcC5tanNcIjtcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuL2V4dGVuZC5tanNcIjtcblxuZXhwb3J0IHsgYnVpbGRUcmVlIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBhcmVudFN5bWJvbCA9IFN5bWJvbChcInBhcmVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgcm9vdFN5bWJvbCA9IFN5bWJvbChcInJvb3RcIik7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gYnVpbGRUcmVlT3B0aW9uc1xuICogQHByb3BlcnR5IHthcnJheX0gb3B0aW9ucy5yb290UmVmZXJlbmNlcz1bbnVsbCwgdW5kZWZpbmVkXSBkZWZpbmVzIHRoZSB2YWx1ZXMgZm9yIGVsZW1lbnRzIHdpdGhvdXQgcGFyZW50c1xuICogQHByb3BlcnR5IHtNb25zdGVyLkRhdGF+ZXhhbXBsZUZpbHRlckNhbGxiYWNrfSBvcHRpb25zLmZpbHRlciBmaWx0ZXJpbmcgb2YgdGhlIHZhbHVlc1xuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyZWUgc3RydWN0dXJlIGZyb20gYSBnaXZlbiBzdWJqZWN0IHVzaW5nIGEgc2VsZWN0b3IgYW5kIHNwZWNpZmllZCBJRCBhbmQgcGFyZW50IElEIGtleXMuXG4gKlxuICogVGhlIGJ1aWxkVHJlZSBmdW5jdGlvbiBpcyBhIHBvd2VyZnVsIHRvb2wgZm9yIGNyZWF0aW5nIHRyZWUtbGlrZSBkYXRhIHN0cnVjdHVyZXMgZnJvbSBwbGFpbiBKYXZhU2NyaXB0XG4gKiBvYmplY3RzLiBJdCB0YWtlcyBpbiBmb3VyIHJlcXVpcmVkIHBhcmFtZXRlcnM6IHRoZSBzdWJqZWN0IG9iamVjdCB0aGF0IHlvdSB3YW50IHRvIHR1cm4gaW50byBhIHRyZWUsIGFcbiAqIHNlbGVjdG9yIHRoYXQgaWRlbnRpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgc3ViamVjdCB0byB1c2Ugd2hlbiBidWlsZGluZyB0aGUgdHJlZSwgYW5kIHR3byBrZXlzXG4gKiAoaWRLZXkgYW5kIHBhcmVudElES2V5KSB0aGF0IHNwZWNpZnkgd2hpY2ggcHJvcGVydGllcyBpbiB0aGUgc3ViamVjdCByZXByZXNlbnQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyc1xuICogYW5kIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gbm9kZXMgaW4gdGhlIHRyZWUuXG4gKlxuICogT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gb3B0aW9ucyBvYmplY3QgdG8gZnVydGhlciBjb25maWd1cmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBmdW5jdGlvbixcbiAqIHN1Y2ggYXMgc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcm9vdHMgb2YgdGhlIHRyZWUsIG9yIHByb3ZpZGluZyBhIGN1c3RvbSBmaWx0ZXJcbiAqIGZ1bmN0aW9uIHRvIG9ubHkgaW5jbHVkZSBjZXJ0YWluIG5vZGVzIGluIHRoZSBmaW5hbCBvdXRwdXQuXG4gKlxuICogVGhlIGJ1aWxkVHJlZSBmdW5jdGlvbiB3b3JrcyBieSBmaXJzdCB1c2luZyB0aGUgYXNzZW1ibGVQYXJ0cyBoZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgcmVsZXZhbnRcbiAqIHBhcnRzIG9mIHRoZSBzdWJqZWN0IGJhc2VkIG9uIHRoZSBzZWxlY3RvciwgYW5kIHRoZW4gaXRlcmF0ZXMgb3ZlciB0aGUgcmVzdWx0aW5nIG1hcCB0byBjcmVhdGUgTm9kZVxuICogb2JqZWN0cyBhbmQgb3JnYW5pemUgdGhlbSBpbnRvIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGlkS2V5IGFuZCBwYXJlbnRJREtleSBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSByZXN1bHRpbmcgTm9kZUxpc3QgcmVwcmVzZW50cyB0aGUgdHJlZSBzdHJ1Y3R1cmUsIHdpdGggZWFjaCBOb2RlIG9iamVjdCBjb250YWluaW5nIHRoZSBvcmlnaW5hbFxuICogb2JqZWN0IGRhdGEgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IGl0cyBwb3NpdGlvbiBpbiB0aGUgdHJlZS4gWW91IGNhbiB0aGVuIHVzZSB0aGUgY2hpbGROb2Rlc1xuICogcHJvcGVydHkgb2YgZWFjaCBOb2RlIHRvIGFjY2VzcyBpdHMgY2hpbGRyZW4sIG9yIHRoZSBwYXJlbnQgcHJvcGVydHkgdG8gYWNjZXNzIGl0cyBwYXJlbnQuXG4gKlxuICogT3ZlcmFsbCwgdGhlIGJ1aWxkVHJlZSBmdW5jdGlvbiBpcyBhIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bCB3YXkgdG8gdHJhbnNmb3JtIGZsYXQgZGF0YSBpbnRvIGhpZXJhcmNoaWNhbFxuICogc3RydWN0dXJlcywgYW5kIGNhbiBiZSBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBzY2VuYXJpb3Mgc3VjaCBhcyBkaXNwbGF5aW5nIGZvbGRlciBzdHJ1Y3R1cmVzIG9yXG4gKiB2aXN1YWxpemluZyBjb21wbGV4IGRhdGEgcmVsYXRpb25zaGlwcy5cbiAqXG4gKiBMZXQncyBzYXkgeW91IGhhdmUgYW4gYXJyYXkgb2YgZGF0YSBvYmplY3RzIHJlcHJlc2VudGluZyBhIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCB5b3Ugd2FudFxuICogdG8gdHVybiBpdCBpbnRvIGEgdHJlZS1saWtlIHN0cnVjdHVyZSB3aGVyZSBlYWNoIG5vZGUgcmVwcmVzZW50cyBhIGZvbGRlciBvciBmaWxlLCBhbmQgY2hpbGQgbm9kZXNcbiAqIHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgdGhlIGZvbGRlcjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBmaWxlU3lzdGVtID0gW1xuICogICB7IGlkOiAnZm9sZGVyMScsIG5hbWU6ICdGb2xkZXIgMScsIHR5cGU6ICdmb2xkZXInLCBwYXJlbnQ6IG51bGwgfSxcbiAqICAgeyBpZDogJ2ZpbGUxJywgbmFtZTogJ0ZpbGUgMScsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ2ZpbGUyJywgbmFtZTogJ0ZpbGUgMicsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ3N1YmZvbGRlcjEnLCBuYW1lOiAnU3ViZm9sZGVyIDEnLCB0eXBlOiAnZm9sZGVyJywgcGFyZW50OiAnZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ2ZpbGUzJywgbmFtZTogJ0ZpbGUgMycsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnc3ViZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ2ZpbGU0JywgbmFtZTogJ0ZpbGUgNCcsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnc3ViZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ3N1YmZvbGRlcjInLCBuYW1lOiAnU3ViZm9sZGVyIDInLCB0eXBlOiAnZm9sZGVyJywgcGFyZW50OiAnZm9sZGVyMScgfSxcbiAqICAgeyBpZDogJ2ZpbGU1JywgbmFtZTogJ0ZpbGUgNScsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnc3ViZm9sZGVyMicgfSxcbiAqICAgeyBpZDogJ2ZpbGU2JywgbmFtZTogJ0ZpbGUgNicsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnc3ViZm9sZGVyMicgfSxcbiAqICAgeyBpZDogJ2ZvbGRlcjInLCBuYW1lOiAnRm9sZGVyIDInLCB0eXBlOiAnZm9sZGVyJywgcGFyZW50OiBudWxsIH0sXG4gKiAgIHsgaWQ6ICdmaWxlNycsIG5hbWU6ICdGaWxlIDcnLCB0eXBlOiAnZmlsZScsIHBhcmVudDogJ2ZvbGRlcjInIH0sXG4gKiAgIHsgaWQ6ICdmaWxlOCcsIG5hbWU6ICdGaWxlIDgnLCB0eXBlOiAnZmlsZScsIHBhcmVudDogJ2ZvbGRlcjInIH0sXG4gKiAgIHsgaWQ6ICdzdWJmb2xkZXIzJywgbmFtZTogJ1N1YmZvbGRlciAzJywgdHlwZTogJ2ZvbGRlcicsIHBhcmVudDogJ2ZvbGRlcjInIH0sXG4gKiAgIHsgaWQ6ICdmaWxlOScsIG5hbWU6ICdGaWxlIDknLCB0eXBlOiAnZmlsZScsIHBhcmVudDogJ3N1YmZvbGRlcjMnIH0sXG4gKiAgIHsgaWQ6ICdmaWxlMTAnLCBuYW1lOiAnRmlsZSAxMCcsIHR5cGU6ICdmaWxlJywgcGFyZW50OiAnc3ViZm9sZGVyMycgfSxcbiAqIF07XG4gKlxuICogY29uc3QgdHJlZSA9IGJ1aWxkVHJlZShmaWxlU3lzdGVtLCAnaWQnLCAnaWQnLCAncGFyZW50JywgeyByb290UmVmZXJlbmNlczogW251bGxdIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKHRyZWUudG9TdHJpbmcoKSk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYnVpbGRUcmVlIGZ1bmN0aW9uIHRha2VzIGluIHRoZSBhcnJheSBvZiBkYXRhIG9iamVjdHMsIGFzIHdlbGwgYXMgc29tZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmeWluZ1xuICogdGhlIGtleXMgdG8gdXNlIGZvciBpZGVudGlmeWluZyBub2RlcyBhbmQgdGhlaXIgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMuIEluIHRoaXMgZXhhbXBsZSwgd2UgdXNlIHRoZSBpZFxuICoga2V5IHRvIGlkZW50aWZ5IG5vZGVzLCBhbmQgdGhlIHBhcmVudCBrZXkgdG8gc3BlY2lmeSB0aGUgcGFyZW50IG9mIGVhY2ggbm9kZS5cbiAqXG4gKiBUaGUgcmVzdWx0aW5nIHRyZWUgb2JqZWN0IGlzIGEgbmVzdGVkIHRyZWUgc3RydWN0dXJlLCB3aGVyZSBlYWNoIG5vZGUgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgb3JcbiAqIGZvbGRlciwgYW5kIGhhcyBjaGlsZCBub2RlcyByZXByZXNlbnRpbmcgaXRzIGNvbnRlbnRzLiBUaGUgdG9TdHJpbmcgbWV0aG9kIG9mIHRoZSB0cmVlIG9iamVjdFxuICogY2FuIGJlIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSB0cmVlIGluIGEgcmVhZGFibGUgZm9ybWF0OlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiAtIEZvbGRlciAxXG4gKiAgIC0gRmlsZSAxXG4gKiAgIC0gRmlsZSAyXG4gKiAgIC0gU3ViZm9sZGVyIDFcbiAqICAgICAtIEZpbGUgM1xuICogICAgIC0gRmlsZSA0XG4gKiAgIC0gU3ViZm9sZGVyIDJcbiAqICAgICAtIEZpbGUgNVxuICogICAgIC0gRmlsZSA2XG4gKiAtIEZvbGRlciAyXG4gKiAgIC0gRmlsZSA3XG4gKiAgIC0gRmlsZSA4XG4gKiAgIC0gU3ViZm9sZGVyIDNcbiAqICAgICAtIEZpbGUgOVxuICogICAgIC0gRmlsZSAxMFxuICogYGBgXG4gKlxuICogQG1lbWJlcm9mIE1vbnN0ZXIuRGF0YVxuICpcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdCAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYnVpbGQgdGhlIHRyZWUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfE1vbnN0ZXIuRGF0YX5leGFtcGxlU2VsZWN0b3JDYWxsYmFja30gc2VsZWN0b3IgLSBFaXRoZXIgYSBzdHJpbmcgdG8gc3BlY2lmeSBhIHByb3BlcnR5IG9mIGVhY2ggb2JqZWN0IHRvIHVzZSBhcyBhIHNlbGVjdG9yLCBvciBhIHNlbGVjdG9yIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIG9mIG9iamVjdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHVzZSBhcyB0aGUgdW5pcXVlIElEIG9mIGVhY2ggbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRJREtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gdXNlIGFzIHRoZSBwYXJlbnQgSUQgb2YgZWFjaCBub2RlLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBtb2RpZnkgdGhlIGZ1bmN0aW9uIGJlaGF2aW9yLlxuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMucm9vdFJlZmVyZW5jZXM9W251bGwsIHVuZGVmaW5lZF1dIC0gQW4gYXJyYXkgb2YgdmFsdWVzIHRvIHRyZWF0IGFzIHJvb3QgcmVmZXJlbmNlcyB3aGVuIGNyZWF0aW5nIHRoZSB0cmVlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSAtIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggbm9kZS5cbiAqXG4gKiBAcmV0dXJuIHsqfSBUaGUgcmVzdWx0aW5nIHRyZWUgc3RydWN0dXJlIGFzIGEgTm9kZUxpc3QuXG4gKlxuICogQHRocm93cyB7VHlwZUVycm9yfSBzZWxlY3RvciBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIGZ1bmN0aW9uLlxuICogQHRocm93cyB7VHlwZUVycm9yfSB0aGUgc2VsZWN0b3IgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBtYXAuXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKlxuICogQHNpbmNlIDEuMjYuMFxuICovXG5mdW5jdGlvbiBidWlsZFRyZWUoc3ViamVjdCwgc2VsZWN0b3IsIGlkS2V5LCBwYXJlbnRJREtleSwgb3B0aW9ucykge1xuXHRjb25zdCBub2RlcyA9IG5ldyBNYXAoKTtcblxuXHRjb25zdCBtYXhEZXB0aCA9IDEwMDtcblxuXHRpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0b3B0aW9ucyA9IHt9O1xuXHR9XG5cblx0b3B0aW9ucyA9IGV4dGVuZChcblx0XHR7fSxcblx0XHR7XG5cdFx0XHRyb290UmVmZXJlbmNlczogW251bGwsIHVuZGVmaW5lZF0sXG5cdFx0XHRmaWx0ZXI6IHVuZGVmaW5lZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cblx0Y29uc3QgZmlsdGVyID0gb3B0aW9ucz8uZmlsdGVyO1xuXHRsZXQgcm9vdFJlZmVyZW5jZXMgPSBvcHRpb25zLnJvb3RSZWZlcmVuY2VzO1xuXHRpZiAoIWlzQXJyYXkocm9vdFJlZmVyZW5jZXMpKSB7XG5cdFx0cm9vdFJlZmVyZW5jZXMgPSBbcm9vdFJlZmVyZW5jZXNdO1xuXHR9XG5cblx0Y29uc3QgY2hpbGRNYXAgPSBhc3NlbWJsZVBhcnRzKHN1YmplY3QsIHNlbGVjdG9yLCBmaWx0ZXIsIGZ1bmN0aW9uIChvLCBrLCBtKSB7XG5cdFx0Y29uc3Qga2V5ID0gbz8uW2lkS2V5XTtcblx0XHRsZXQgcmVmID0gbz8uW3BhcmVudElES2V5XTtcblx0XHRpZiAocm9vdFJlZmVyZW5jZXMuaW5kZXhPZihyZWYpICE9PSAtMSkgcmVmID0gcm9vdFN5bWJvbDtcblxuXHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWRcIik7XG5cdFx0fVxuXG5cdFx0b1twYXJlbnRTeW1ib2xdID0gcmVmO1xuXG5cdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKG8pO1xuXHRcdHRoaXMuaGFzKHJlZilcblx0XHRcdD8gdGhpcy5nZXQocmVmKS5hZGQobm9kZSlcblx0XHRcdDogdGhpcy5zZXQocmVmLCBuZXcgTm9kZUxpc3QoKS5hZGQobm9kZSkpO1xuXHRcdG5vZGVzLnNldChrZXksIG5vZGUpO1xuXHR9KTtcblxuXHRub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0Y29uc3QgaWQgPSBub2RlPy5bXCJ2YWx1ZVwiXT8uW2lkS2V5XTtcblxuXHRcdGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgb2JqZWN0IGhhcyBubyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBpZFwiKTtcblx0XHR9XG5cblx0XHRpZiAoY2hpbGRNYXAuaGFzKGlkKSkge1xuXHRcdFx0bm9kZS5jaGlsZE5vZGVzID0gY2hpbGRNYXAuZ2V0KGlkKTtcblx0XHRcdGNoaWxkTWFwLmRlbGV0ZShpZCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBsaXN0ID0gbmV3IE5vZGVMaXN0KCk7XG5cblx0Y2hpbGRNYXAuZm9yRWFjaCgocykgPT4ge1xuXHRcdGlmIChzIGluc3RhbmNlb2YgU2V0KSB7XG5cdFx0XHRzLmZvckVhY2goKG4pID0+IHtcblx0XHRcdFx0bGlzdC5hZGQobik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBsaXN0O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBpc0luc3RhbmNlIH0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIi4vbm9kZS5tanNcIjtcbmltcG9ydCB7IE5vZGVMaXN0IH0gZnJvbSBcIi4vbm9kZWxpc3QubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUluc3RhbmNlIH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IE5vZGVSZWN1cnNpdmVJdGVyYXRvciB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpc05vZGVMaXN0U3ltYm9sID0gU3ltYm9sKFwiaXNOb2RlTGlzdFwiKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVjdXJzaXZlIGl0ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIG5vZGVzIGluIGEgRE9NIHRyZWUuXG4gKlxuICogQHNpbmNlIDEuMjYuMFxuICogQHN1bW1hcnkgQW4gaXRlcmF0b3IgdG8gcnVuIHJlY3Vyc2l2ZWx5IHRocm91Z2ggYSB0cmVlIG9mIG5vZGVzXG4gKiBAZXh0ZW5kcyBCYXNlXG4gKi9cbmNsYXNzIE5vZGVSZWN1cnNpdmVJdGVyYXRvciBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICogQHBhcmFtIG5vZGVcblx0ICovXG5cdGNvbnN0cnVjdG9yKG5vZGUpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpc1tpc05vZGVMaXN0U3ltYm9sXSA9IGZhbHNlO1xuXG5cdFx0Ly8gaXRlcmF0b3IgaXMgYSBOb2RlTGlzdFxuXHRcdGlmIChpc0luc3RhbmNlKG5vZGUsIE5vZGVMaXN0KSkge1xuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBub2RlO1xuXHRcdFx0Y29uc3QgbiA9IG5ldyBOb2RlKCk7XG5cdFx0XHRuLmNoaWxkTm9kZXMgPSBjaGlsZHJlbjtcblx0XHRcdHRoaXNbaXNOb2RlTGlzdFN5bWJvbF0gPSB0cnVlO1xuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdID0gdmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy95aWVsZFxuXHQgKi9cblx0W1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiogKCkge1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBlbmQgb2YgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBpcyByZWFjaGVkLiBJbiB0aGlzIGNhc2UsIGV4ZWN1dGlvbiBvZiB0aGUgZ2VuZXJhdG9yXG5cdFx0ICogZW5kcyBhbmQgYW4gSXRlcmF0b3JSZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBpbiB3aGljaCB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCBkb25lIGlzIHRydWUuXG5cdFx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMveWllbGRcblx0XHQgKi9cblx0XHRpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGl0ZXJhdG9yIGlzIGEgbm9kZWxpc3QgYW5kIHRoZSBtYWluIG5vZGUgaXMgb25seSBhIHBsYWNlaG9sZGVyXG5cdFx0aWYgKHRoaXNbaXNOb2RlTGlzdFN5bWJvbF0gIT09IHRydWUpIHtcblx0XHRcdHlpZWxkIHRoaXNbaW50ZXJuYWxTeW1ib2xdO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzW2ludGVybmFsU3ltYm9sXS5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdGNvbnN0IGNoaWxkTm9kZXMgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5jaGlsZE5vZGVzO1xuXG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgY2hpbGROb2Rlcykge1xuXHRcdFx0XHR5aWVsZCogbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihub2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG5cdCAqIEByZXR1cm4ge05vZGVSZWN1cnNpdmVJdGVyYXRvcn1cblx0ICovXG5cdGZvckVhY2goY2FsbGJhY2spIHtcblx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykge1xuXHRcdFx0Y2FsbGJhY2sobm9kZSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgVHJlZVNlbGVjdFN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFRyZWVTZWxlY3RTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0VHJlZVNlbGVjdFN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgdHJlZXNlbGVjdCB7IFxuW2RhdGEtbW9uc3Rlci1yb2xlPWJhZGdlXXtkaXNwbGF5OmlubGluZS1mbGV4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25de2Rpc3BsYXk6ZmxleH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItc3RhdGU9b3Blbl1bZGF0YS1tb25zdGVyLWhhcy1jaGlsZHJlbj10cnVlXSBbZGF0YS1tb25zdGVyLXJvbGU9Zm9sZGVyLWhhbmRsZXJde2NvbnRlbnQ6dXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7IHV0ZjgsIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMTZcXFwiIGhlaWdodD1cXFwiMTZcXFwiIGZpbGw9XFxcImN1cnJlbnRDb2xvclxcXCIgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIj48cGF0aCBkPVxcXCJNMi41IDBjLS4xNjYgMC0uMzMuMDE2LS40ODcuMDQ4bC4xOTQuOThBMS41MSAxLjUxIDAgMCAxIDIuNSAxaC40NThWMEgyLjV6bTIuMjkyIDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTZ2MWguOTE2VjB6bTEuODM0IDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTd2MWguOTE3VjB6TTEzLjUgMGgtLjQ1OHYxaC40NThjLjEgMCAuMTk5LjAxLjI5My4wMjlsLjE5NC0uOTgxQTIuNTEgMi41MSAwIDAgMCAxMy41IDB6bTIuMDc5IDEuMTFhMi41MTEgMi41MTEgMCAwIDAtLjY5LS42ODlsLS41NTYuODMxYy4xNjQuMTEuMzA1LjI1MS40MTUuNDE1bC44My0uNTU2ek0xLjExLjQyMWEyLjUxMSAyLjUxMSAwIDAgMC0uNjg5LjY5bC44MzEuNTU2Yy4xMS0uMTY0LjI1MS0uMzA1LjQxNS0uNDE1TDEuMTEuNDIyek0xNiAyLjVjMC0uMTY2LS4wMTYtLjMzLS4wNDgtLjQ4N2wtLjk4LjE5NGMuMDE4LjA5NC4wMjguMTkyLjAyOC4yOTN2LjQ1OGgxVjIuNXpNLjA0OCAyLjAxM0EyLjUxIDIuNTEgMCAwIDAgMCAyLjV2LjQ1OGgxVjIuNWMwLS4xLjAxLS4xOTkuMDI5LS4yOTNsLS45ODEtLjE5NHpNMCAzLjg3NXYuOTE3aDF2LS45MTdIMHptMTYgLjkxN3YtLjkxN2gtMXYuOTE3aDF6TTAgNS43MDh2LjkxN2gxdi0uOTE3SDB6bTE2IC45MTd2LS45MTdoLTF2LjkxN2gxek0wIDcuNTQydi45MTZoMXYtLjkxNkgwem0xNSAuOTE2aDF2LS45MTZoLTF2LjkxNnpNMCA5LjM3NXYuOTE3aDF2LS45MTdIMHptMTYgLjkxN3YtLjkxN2gtMXYuOTE3aDF6bS0xNiAuOTE2di45MTdoMXYtLjkxN0gwem0xNiAuOTE3di0uOTE3aC0xdi45MTdoMXptLTE2IC45MTd2LjQ1OGMwIC4xNjYuMDE2LjMzLjA0OC40ODdsLjk4LS4xOTRBMS41MSAxLjUxIDAgMCAxIDEgMTMuNXYtLjQ1OEgwem0xNiAuNDU4di0uNDU4aC0xdi40NThjMCAuMS0uMDEuMTk5LS4wMjkuMjkzbC45ODEuMTk0Yy4wMzItLjE1OC4wNDgtLjMyLjA0OC0uNDg3ek0uNDIxIDE0Ljg5Yy4xODMuMjcyLjQxNy41MDYuNjkuNjg5bC41NTYtLjgzMWExLjUxIDEuNTEgMCAwIDEtLjQxNS0uNDE1bC0uODMuNTU2em0xNC40NjkuNjg5Yy4yNzItLjE4My41MDYtLjQxNy42ODktLjY5bC0uODMxLS41NTZjLS4xMS4xNjQtLjI1MS4zMDUtLjQxNS40MTVsLjU1Ni44M3ptLTEyLjg3Ny4zNzNjLjE1OC4wMzIuMzIuMDQ4LjQ4Ny4wNDhoLjQ1OHYtMUgyLjVjLS4xIDAtLjE5OS0uMDEtLjI5My0uMDI5bC0uMTk0Ljk4MXpNMTMuNSAxNmMuMTY2IDAgLjMzLS4wMTYuNDg3LS4wNDhsLS4xOTQtLjk4QTEuNTEgMS41MSAwIDAgMSAxMy41IDE1aC0uNDU4djFoLjQ1OHptLTkuNjI1IDBoLjkxN3YtMWgtLjkxN3Yxem0xLjgzMyAwaC45MTd2LTFoLS45MTd2MXptMS44MzQgMGguOTE2di0xaC0uOTE2djF6bTEuODMzIDBoLjkxN3YtMWgtLjkxN3Yxem0xLjgzMyAwaC45MTd2LTFoLS45MTd2MXpNNC41IDcuNWEuNS41IDAgMCAwIDAgMWg3YS41LjUgMCAwIDAgMC0xaC03elxcXCIvPjwvc3ZnPicpO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEzcHg7bWFyZ2luLXJpZ2h0OjhweDt3aWR0aDoxM3B4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1zdGF0ZT1jbG9zZV1bZGF0YS1tb25zdGVyLWhhcy1jaGlsZHJlbj10cnVlXSBbZGF0YS1tb25zdGVyLXJvbGU9Zm9sZGVyLWhhbmRsZXJde2NvbnRlbnQ6dXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7IHV0ZjgsIDxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMTZcXFwiIGhlaWdodD1cXFwiMTZcXFwiIGZpbGw9XFxcImN1cnJlbnRDb2xvclxcXCIgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIj48cGF0aCBkPVxcXCJNMi41IDBjLS4xNjYgMC0uMzMuMDE2LS40ODcuMDQ4bC4xOTQuOThBMS41MSAxLjUxIDAgMCAxIDIuNSAxaC40NThWMEgyLjV6bTIuMjkyIDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTZ2MWguOTE2VjB6bTEuODM0IDBoLS45MTd2MWguOTE3VjB6bTEuODMzIDBoLS45MTd2MWguOTE3VjB6TTEzLjUgMGgtLjQ1OHYxaC40NThjLjEgMCAuMTk5LjAxLjI5My4wMjlsLjE5NC0uOTgxQTIuNTEgMi41MSAwIDAgMCAxMy41IDB6bTIuMDc5IDEuMTFhMi41MTEgMi41MTEgMCAwIDAtLjY5LS42ODlsLS41NTYuODMxYy4xNjQuMTEuMzA1LjI1MS40MTUuNDE1bC44My0uNTU2ek0xLjExLjQyMWEyLjUxMSAyLjUxMSAwIDAgMC0uNjg5LjY5bC44MzEuNTU2Yy4xMS0uMTY0LjI1MS0uMzA1LjQxNS0uNDE1TDEuMTEuNDIyek0xNiAyLjVjMC0uMTY2LS4wMTYtLjMzLS4wNDgtLjQ4N2wtLjk4LjE5NGMuMDE4LjA5NC4wMjguMTkyLjAyOC4yOTN2LjQ1OGgxVjIuNXpNLjA0OCAyLjAxM0EyLjUxIDIuNTEgMCAwIDAgMCAyLjV2LjQ1OGgxVjIuNWMwLS4xLjAxLS4xOTkuMDI5LS4yOTNsLS45ODEtLjE5NHpNMCAzLjg3NXYuOTE3aDF2LS45MTdIMHptMTYgLjkxN3YtLjkxN2gtMXYuOTE3aDF6TTAgNS43MDh2LjkxN2gxdi0uOTE3SDB6bTE2IC45MTd2LS45MTdoLTF2LjkxN2gxek0wIDcuNTQydi45MTZoMXYtLjkxNkgwem0xNSAuOTE2aDF2LS45MTZoLTF2LjkxNnpNMCA5LjM3NXYuOTE3aDF2LS45MTdIMHptMTYgLjkxN3YtLjkxN2gtMXYuOTE3aDF6bS0xNiAuOTE2di45MTdoMXYtLjkxN0gwem0xNiAuOTE3di0uOTE3aC0xdi45MTdoMXptLTE2IC45MTd2LjQ1OGMwIC4xNjYuMDE2LjMzLjA0OC40ODdsLjk4LS4xOTRBMS41MSAxLjUxIDAgMCAxIDEgMTMuNXYtLjQ1OEgwem0xNiAuNDU4di0uNDU4aC0xdi40NThjMCAuMS0uMDEuMTk5LS4wMjkuMjkzbC45ODEuMTk0Yy4wMzItLjE1OC4wNDgtLjMyLjA0OC0uNDg3ek0uNDIxIDE0Ljg5Yy4xODMuMjcyLjQxNy41MDYuNjkuNjg5bC41NTYtLjgzMWExLjUxIDEuNTEgMCAwIDEtLjQxNS0uNDE1bC0uODMuNTU2em0xNC40NjkuNjg5Yy4yNzItLjE4My41MDYtLjQxNy42ODktLjY5bC0uODMxLS41NTZjLS4xMS4xNjQtLjI1MS4zMDUtLjQxNS40MTVsLjU1Ni44M3ptLTEyLjg3Ny4zNzNjLjE1OC4wMzIuMzIuMDQ4LjQ4Ny4wNDhoLjQ1OHYtMUgyLjVjLS4xIDAtLjE5OS0uMDEtLjI5My0uMDI5bC0uMTk0Ljk4MXpNMTMuNSAxNmMuMTY2IDAgLjMzLS4wMTYuNDg3LS4wNDhsLS4xOTQtLjk4QTEuNTEgMS41MSAwIDAgMSAxMy41IDE1aC0uNDU4djFoLjQ1OHptLTkuNjI1IDBoLjkxN3YtMWgtLjkxN3Yxem0xLjgzMyAwaC45MTd2LTFoLS45MTd2MXptMS44MzQtMXYxaC45MTZ2LTFoLS45MTZ6bTEuODMzIDFoLjkxN3YtMWgtLjkxN3Yxem0xLjgzMyAwaC45MTd2LTFoLS45MTd2MXpNOC41IDQuNWEuNS41IDAgMCAwLTEgMHYzaC0zYS41LjUgMCAwIDAgMCAxaDN2M2EuNS41IDAgMCAwIDEgMHYtM2gzYS41LjUgMCAwIDAgMC0xaC0zdi0zelxcXCIvPjwvc3ZnPicpO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEzcHg7bWFyZ2luLXJpZ2h0OjhweDt3aWR0aDoxM3B4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci12aXNpYmlsaXR5PWhpZGRlbl17ZGlzcGxheTpub25lfVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci12aXNpYmlsaXR5PXZpc2libGVde2Rpc3BsYXk6ZmxleH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItaGFzLWNoaWxkcmVuPWZhbHNlXSBbZGF0YS1tb25zdGVyLXJvbGU9Zm9sZGVyLWhhbmRsZXJde2NvbnRlbnQ6XFxcIiBcXFwiO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEzcHg7bWFyZ2luLXJpZ2h0OjhweDt3aWR0aDoxM3B4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1pbnRlbmQ9XFxcIjBcXFwiXXtkaXNwbGF5OmZsZXg7bWFyZ2luOjB9W2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbl1bZGF0YS1tb25zdGVyLWludGVuZD1cXFwiMVxcXCJde21hcmdpbjowIDAgMCAyMHB4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1pbnRlbmQ9XFxcIjJcXFwiXXttYXJnaW46MCAwIDAgNDBweH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItaW50ZW5kPVxcXCIzXFxcIl17bWFyZ2luOjAgMCAwIDYwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbl1bZGF0YS1tb25zdGVyLWludGVuZD1cXFwiNFxcXCJde21hcmdpbjowIDAgMCA4MHB4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1pbnRlbmQ9XFxcIjVcXFwiXXttYXJnaW46MCAwIDAgMTAwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbl1bZGF0YS1tb25zdGVyLWludGVuZD1cXFwiNlxcXCJde21hcmdpbjowIDAgMCAxMTBweH1bZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uXVtkYXRhLW1vbnN0ZXItaW50ZW5kPVxcXCI3XFxcIl17bWFyZ2luOjAgMCAwIDEyMHB4fVtkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dW2RhdGEtbW9uc3Rlci1pbnRlbmQ9XFxcIjhcXFwiXXttYXJnaW46MCAwIDAgMTMwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbl1bZGF0YS1tb25zdGVyLWZpbHRlcmVkPXRydWVde2Rpc3BsYXk6bm9uZX0gXG59YCxcblx0XHQwLFxuXHQpO1xufSBjYXRjaCAoZSkge1xuXHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRkb2N1bWVudC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLFxuXHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0ZSArIFwiXCIsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRUcmVlIH0gZnJvbSBcIi4uLy4uL2RhdGEvYnVpbGR0cmVlLm1qc1wiO1xuaW1wb3J0IHtcblx0YWRkQXR0cmlidXRlVG9rZW4sXG5cdGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUsXG59IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdEFUVFJJQlVURV9ST0xFLFxuXHRBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlRfUkVGRVJFTkNFLFxufSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRyZWdpc3RlckN1c3RvbUVsZW1lbnQsXG59IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7XG5cdGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50LFxuXHRmaXJlQ3VzdG9tRXZlbnQsXG5cdGZpcmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9ldmVudHMubWpzXCI7XG5pbXBvcnQgeyBGb3JtYXR0ZXIgfSBmcm9tIFwiLi4vLi4vdGV4dC9mb3JtYXR0ZXIubWpzXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvbm9kZS5tanNcIjtcbmltcG9ydCB7IE5vZGVSZWN1cnNpdmVJdGVyYXRvciB9IGZyb20gXCIuLi8uLi90eXBlcy9ub2RlcmVjdXJzaXZlaXRlcmF0b3IubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0ZPUk1fVVJMLCBBVFRSSUJVVEVfSU5URU5EIH0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSBcIi4vc2VsZWN0Lm1qc1wiO1xuaW1wb3J0IHsgU2VsZWN0U3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvc2VsZWN0Lm1qc1wiO1xuaW1wb3J0IHsgVHJlZVNlbGVjdFN0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L3RyZWUtc2VsZWN0Lm1qc1wiO1xuXG5leHBvcnQgeyBUcmVlU2VsZWN0LCBmb3JtYXRIaWVyYXJjaGljYWxTZWxlY3Rpb24gfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW50ZXJuYWxOb2Rlc1N5bWJvbCA9IFN5bWJvbChcImludGVybmFsTm9kZXNcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGtleUV2ZW50SGFuZGxlciA9IFN5bWJvbChcImtleUV2ZW50SGFuZGxlclwiKTtcblxuLyoqXG4gKiBBIHRyZWUgc2VsZWN0IGNvbnRyb2wgaXMgYSBzZWxlY3QgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhIHZhbHVlIGZyb20gYSB0cmVlIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9mb3JtL3RyZWUtc2VsZWN0XG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS90cmVlLXNlbGVjdC1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGJlYXV0aWZ1bCB0cmVlIHNlbGVjdCBjb250cm9sIHdpdGggYSBsb3Qgb2Ygb3B0aW9uc1xuICogQGZpcmVzIG1vbnN0ZXItb3B0aW9ucy1zZXRcbiAqIEBmaXJlcyBtb25zdGVyLXNlbGVjdGVkXG4gKiBAZmlyZXMgbW9uc3Rlci1jaGFuZ2VcbiAqIEBmaXJlcyBtb25zdGVyLWNoYW5nZWRcbiAqL1xuY2xhc3MgVHJlZVNlbGVjdCBleHRlbmRzIFNlbGVjdCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvY29tcG9uZW50cy9mb3JtL3RyZWUtc2VsZWN0QEBpbnN0YW5jZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBleHRlbmRzIFNlbGVjdFxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gbWFwcGluZy5yb290UmVmZXJlbmNlcz1bJzAnLCB1bmRlZmluZWQsIG51bGxdXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXBwaW5nLmlkVGVtcGxhdGU9aWRcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IG1hcHBpbmcucGFyZW50VGVtcGxhdGU9cGFyZW50XG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXBwaW5nLnNlbGVjdGlvblxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZm9ybWF0dGVyXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmb3JtYXR0ZXIuc2VwYXJhdG9yPVwiIC8gXCJcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihcblx0XHRcdHt9LFxuXHRcdFx0c3VwZXIuZGVmYXVsdHMsXG5cdFx0XHR7XG5cdFx0XHRcdG1hcHBpbmc6IHtcblx0XHRcdFx0XHRyb290UmVmZXJlbmNlczogW1wiMFwiLCB1bmRlZmluZWQsIG51bGxdLFxuXHRcdFx0XHRcdGlkOiBcImlkXCIsXG5cdFx0XHRcdFx0cGFyZW50OiBcInBhcmVudFwiLFxuXG5cdFx0XHRcdFx0c2VsZWN0b3I6IFwiKlwiLFxuXHRcdFx0XHRcdGxhYmVsVGVtcGxhdGU6IFwiXCIsXG5cdFx0XHRcdFx0dmFsdWVUZW1wbGF0ZTogXCJcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0Zm9ybWF0dGVyOiB7XG5cdFx0XHRcdFx0c2VsZWN0aW9uOiBmb3JtYXRIaWVyYXJjaGljYWxTZWxlY3Rpb24sXG5cdFx0XHRcdFx0c2VwYXJhdG9yOiBcIiAvIFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGluaXRPcHRpb25zRnJvbUFyZ3VtZW50cy5jYWxsKHRoaXMpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFRhZygpIHtcblx0XHRyZXR1cm4gXCJtb25zdGVyLXRyZWUtc2VsZWN0XCI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtTZWxlY3RTdHlsZVNoZWV0LCBUcmVlU2VsZWN0U3R5bGVTaGVldF07XG5cdH1cblxuXHQvKipcblx0ICogSW1wb3J0IFNlbGVjdCBPcHRpb25zIGZyb20gZGF0YXNldFxuXHQgKiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgY29udHJvbCBkZWZhdWx0cy9vcHRpb25zXG5cdCAqXG5cdCAqIEBwYXJhbSB7YXJyYXl8b2JqZWN0fE1hcHxTZXR9IGRhdGFcblx0ICogQHJldHVybiB7U2VsZWN0fVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gbWFwIGlzIG5vdCBpdGVyYWJsZVxuXHQgKi9cblx0aW1wb3J0T3B0aW9ucyhkYXRhKSB7XG5cdFx0dGhpc1tpbnRlcm5hbE5vZGVzU3ltYm9sXSA9IG5ldyBNYXAoKTtcblxuXHRcdGNvbnN0IG1hcHBpbmdPcHRpb25zID0gdGhpcy5nZXRPcHRpb24oXCJtYXBwaW5nXCIsIHt9KTtcblxuXHRcdGNvbnN0IGZpbHRlciA9IG1hcHBpbmdPcHRpb25zPy5bXCJmaWx0ZXJcIl07XG5cdFx0Y29uc3Qgcm9vdFJlZmVyZW5jZXMgPSBtYXBwaW5nT3B0aW9ucz8uW1wicm9vdFJlZmVyZW5jZXNcIl07XG5cblx0XHRjb25zdCBpZCA9IHRoaXMuZ2V0T3B0aW9uKFwibWFwcGluZy5pZFwiLCBcImlkXCIpO1xuXHRcdGNvbnN0IHBhcmVudElEID0gdGhpcy5nZXRPcHRpb24oXCJtYXBwaW5nLnBhcmVudFwiLCBcInBhcmVudFwiKTtcblxuXHRcdGNvbnN0IHNlbGVjdG9yID0gbWFwcGluZ09wdGlvbnM/LltcInNlbGVjdG9yXCJdO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBub2RlcyA9IGJ1aWxkVHJlZShkYXRhLCBzZWxlY3RvciwgaWQsIHBhcmVudElELCB7XG5cdFx0XHRcdGZpbHRlcixcblx0XHRcdFx0cm9vdFJlZmVyZW5jZXMsXG5cdFx0XHR9KTtcblxuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihub2RlKTtcblx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgZm9ybWF0dGVkVmFsdWVzID0gZm9ybWF0S2V5TGFiZWwuY2FsbCh0aGlzLCBuKTtcblxuXHRcdFx0XHRcdGNvbnN0IGxhYmVsID0gZm9ybWF0dGVkVmFsdWVzLmxhYmVsO1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gZm9ybWF0dGVkVmFsdWVzLnZhbHVlO1xuXHRcdFx0XHRcdGNvbnN0IGludGVuZCA9IG4ubGV2ZWw7XG5cblx0XHRcdFx0XHRjb25zdCB2aXNpYmlsaXR5ID0gaW50ZW5kID4gMCA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcblx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IFwiY2xvc2VcIjtcblxuXHRcdFx0XHRcdHRoaXNbaW50ZXJuYWxOb2Rlc1N5bWJvbF0uc2V0KHZhbHVlLCBuKTtcblxuXHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRcdGxhYmVsLFxuXHRcdFx0XHRcdFx0aW50ZW5kLFxuXHRcdFx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdFx0XHR2aXNpYmlsaXR5LFxuXHRcdFx0XHRcdFx0W1wiaGFzLWNoaWxkcmVuXCJdOiBuLmhhc0NoaWxkTm9kZXMoKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldE9wdGlvbihcIm9wdGlvbnNcIiwgb3B0aW9ucyk7XG5cblx0XHRcdGZpcmVDdXN0b21FdmVudCh0aGlzLCBcIm1vbnN0ZXItb3B0aW9ucy1zZXRcIiwge1xuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZT8ubWVzc2FnZSB8fCBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtUcmVlU2VsZWN0fVxuXHQgKi9cblx0W2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU9wdGlvbktleWJvYXJkRXZlbnRzKGV2ZW50KSB7XG5cdHN3aXRjaCAoZXZlbnQ/LltcImNvZGVcIl0pIHtcblx0XHRjYXNlIFwiQXJyb3dMZWZ0XCI6XG5cdFx0XHRjbG9zZU9yT3BlbkN1cnJlbnRPcHRpb24uY2FsbCh0aGlzLCBldmVudCwgXCJjbG9zZVwiKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQXJyb3dSaWdodFwiOlxuXHRcdFx0Y2xvc2VPck9wZW5DdXJyZW50T3B0aW9uLmNhbGwodGhpcywgZXZlbnQsIFwib3BlblwiKTtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRicmVhaztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBjbG9zZU9yT3BlbkN1cnJlbnRPcHRpb24oZXZlbnQsIG1vZGUpIHtcblx0dmFsaWRhdGVJbnN0YW5jZShldmVudCwgRXZlbnQpO1xuXG5cdGlmICh0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBldmVudFwiKTtcblx0fVxuXG5cdGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblx0Y29uc3Qgb3B0aW9uTm9kZSA9IHBhdGguc2hpZnQoKTtcblxuXHRjb25zdCBzdGF0ZSA9IG9wdGlvbk5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1tb25zdGVyLXN0YXRlXCIpO1xuXHRpZiAoc3RhdGUgIT09IG1vZGUpIHtcblx0XHRjb25zdCBoYW5kbGVyID0gb3B0aW9uTm9kZS5xdWVyeVNlbGVjdG9yKFxuXHRcdFx0XCJbZGF0YS1tb25zdGVyLXJvbGU9Zm9sZGVyLWhhbmRsZXJdXCIsXG5cdFx0KTtcblx0XHRpZiAoaGFuZGxlciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRmaXJlRXZlbnQoaGFuZGxlciwgXCJjbGlja1wiKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcmV0dXJuIHthcnJheTxsYWJlbCwgdmFsdWU+fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZm9ybWF0S2V5TGFiZWwobm9kZSkge1xuXHR2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpO1xuXG5cdGNvbnN0IHYgPSBub2RlLnZhbHVlO1xuXHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWRcIik7XG5cdH1cblxuXHRjb25zdCBsYWJlbCA9IG5ldyBGb3JtYXR0ZXIodikuZm9ybWF0KFxuXHRcdHRoaXMuZ2V0T3B0aW9uKFwibWFwcGluZy5sYWJlbFRlbXBsYXRlXCIsIFwiXCIpLFxuXHQpO1xuXG5cdGNvbnN0IHZhbHVlID0gbmV3IEZvcm1hdHRlcih2KS5mb3JtYXQoXG5cdFx0dGhpcy5nZXRPcHRpb24oXCJtYXBwaW5nLnZhbHVlVGVtcGxhdGVcIiwgXCJcIiksXG5cdCk7XG5cblx0cmV0dXJuIHtcblx0XHR2YWx1ZSxcblx0XHRsYWJlbCxcblx0fTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gYnVpbGRUcmVlTGFiZWxzKHZhbHVlKSB7XG5cdGxldCBub2RlID0gdGhpc1tpbnRlcm5hbE5vZGVzU3ltYm9sXS5nZXQodmFsdWUpO1xuXHRpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0bm9kZSA9IHRoaXNbaW50ZXJuYWxOb2Rlc1N5bWJvbF0uZ2V0KHBhcnNlSW50KHZhbHVlKSk7XG5cdH1cblxuXHRjb25zdCBwYXJ0cyA9IFtdO1xuXG5cdGlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkge1xuXHRcdGxldCBwdHIgPSBub2RlO1xuXHRcdHdoaWxlIChwdHIpIHtcblx0XHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlcyA9IGZvcm1hdEtleUxhYmVsLmNhbGwodGhpcywgcHRyKTtcblx0XHRcdHBhcnRzLnVuc2hpZnQoZm9ybWF0dGVkVmFsdWVzLmxhYmVsKTtcblx0XHRcdHB0ciA9IHB0ci5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHBhcnRzO1xufVxuXG4vKipcbiAqIFRoaXMgZm9ybWF0dGVyIGNhbiBmb3JtYXQgYSBsYWJlbCBoaWVyYXJjaGljYWxseS5cbiAqIFRoZSBvcHRpb24gYGZvcm1hdHRlci5zZXBhcmF0b3JgIGRldGVybWluZXMgdGhlIHNlcGFyYXRvci5cbiAqXG4gKiBgYGBcbiAqIGEgLyBiIC8gY1xuICogYGBgXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGFyZ3VtZW50IG9mIHRoZSBvcHRpb24gYGZvcm1hdHRlci5zZWxlY3Rpb246YC5cbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZm9ybWF0SGllcmFyY2hpY2FsU2VsZWN0aW9uKHZhbHVlKSB7XG5cdHJldHVybiBidWlsZFRyZWVMYWJlbHNcblx0XHQuY2FsbCh0aGlzLCB2YWx1ZSlcblx0XHQuam9pbih0aGlzLmdldE9wdGlvbihcImZvcm1hdHRlci5zZXBhcmF0b3JcIiwgXCIgLyBcIikpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBvcGVuT3B0aW9uRXZlbnRIYW5kbGVyID0gU3ltYm9sKFwib3Blbk9wdGlvbkV2ZW50SGFuZGxlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50SGFuZGxlcigpIHtcblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0dGhpc1tvcGVuT3B0aW9uRXZlbnRIYW5kbGVyXSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChcblx0XHRcdGV2ZW50LFxuXHRcdFx0QVRUUklCVVRFX1JPTEUsXG5cdFx0XHRcImZvbGRlci1oYW5kbGVyXCIsXG5cdFx0KTtcblx0XHRpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29udGFpbmVyID0gZmluZENsb3Nlc3RCeUF0dHJpYnV0ZShlbGVtZW50LCBBVFRSSUJVVEVfUk9MRSwgXCJvcHRpb25cIik7XG5cdFx0Y29uc3QgaW5kZXggPSBjb250YWluZXJcblx0XHRcdC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSlcblx0XHRcdC5zcGxpdChcIi1cIilcblx0XHRcdC5wb3AoKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0T3B0aW9uKGBvcHRpb25zLiR7aW5kZXh9LnN0YXRlYCk7XG5cblx0XHRjb25zdCBuZXdTdGF0ZSA9IGN1cnJlbnRTdGF0ZSA9PT0gXCJjbG9zZVwiID8gXCJvcGVuXCIgOiBcImNsb3NlXCI7XG5cdFx0dGhpcy5zZXRPcHRpb24oYG9wdGlvbnMuJHtpbmRleH0uc3RhdGVgLCBuZXdTdGF0ZSk7XG5cblx0XHRjb25zdCBuZXdWaXNpYmlsaXR5ID0gbmV3U3RhdGUgPT09IFwib3BlblwiID8gXCJ2aXNpYmxlXCIgOiBcImhpZGRlblwiO1xuXG5cdFx0aWYgKGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0lOVEVORCkpIHtcblx0XHRcdGNvbnN0IGludGVuZCA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lOVEVORCk7XG5cblx0XHRcdGxldCByZWYgPSBjb250YWluZXIubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0Y29uc3QgY2hpbGRJbnRlbmQgPSBwYXJzZUludChpbnRlbmQpICsgMTtcblxuXHRcdFx0Y29uc3QgY21wID0gKGEsIGIpID0+IHtcblx0XHRcdFx0aWYgKG5ld1N0YXRlID09PSBcIm9wZW5cIikge1xuXHRcdFx0XHRcdHJldHVybiBhID09PSBiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGEgPj0gYjtcblx0XHRcdH07XG5cblx0XHRcdHdoaWxlIChcblx0XHRcdFx0cmVmPy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0lOVEVORCkgJiZcblx0XHRcdFx0Y21wKHBhcnNlSW50KHJlZi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0lOVEVORCkpLCBjaGlsZEludGVuZClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCByZWZJbmRleCA9IHJlZlxuXHRcdFx0XHRcdC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSlcblx0XHRcdFx0XHQuc3BsaXQoXCItXCIpXG5cdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0XHR0aGlzLnNldE9wdGlvbihgb3B0aW9ucy4ke3JlZkluZGV4fS52aXNpYmlsaXR5YCwgbmV3VmlzaWJpbGl0eSk7XG5cblx0XHRcdFx0aWYgKG5ld1N0YXRlID09PSBcImNsb3NlXCIpIHtcblx0XHRcdFx0XHR0aGlzLnNldE9wdGlvbihgb3B0aW9ucy4ke3JlZkluZGV4fS5zdGF0ZWAsIFwiY2xvc2VcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZWYgPSByZWYubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR0aGlzW2tleUV2ZW50SGFuZGxlcl0gPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cdFx0Y29uc3QgZWxlbWVudCA9IHBhdGg/LlswXTtcblxuXHRcdGxldCByb2xlO1xuXG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0aWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKSkge1xuXHRcdFx0XHRyb2xlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50ID09PSB0aGlzKSB7XG5cdFx0XHRcdHNob3cuY2FsbCh0aGlzKTtcblx0XHRcdFx0Zm9jdXNGaWx0ZXIuY2FsbCh0aGlzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGUgPSBlbGVtZW50LmNsb3Nlc3QoYFske0FUVFJJQlVURV9ST0xFfV1gKTtcblx0XHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLmhhc0F0dHJpYnV0ZSgpKSB7XG5cdFx0XHRcdFx0cm9sZSA9IGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9ST0xFKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChyb2xlKSB7XG5cdFx0XHRjYXNlIFwib3B0aW9uLWxhYmVsXCI6XG5cdFx0XHRjYXNlIFwib3B0aW9uLWNvbnRyb2xcIjpcblx0XHRcdGNhc2UgXCJvcHRpb25cIjpcblx0XHRcdFx0aGFuZGxlT3B0aW9uS2V5Ym9hcmRFdmVudHMuY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblxuXHR0aGlzLnNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpc1trZXlFdmVudEhhbmRsZXJdKTtcblx0dGhpcy5zaGFkb3dSb290LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzW29wZW5PcHRpb25FdmVudEhhbmRsZXJdKTtcbn1cblxuLyoqXG4gKiBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBwYXNzIGEgVVJMIHRvIHRoaXMgc2VsZWN0LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxtb25zdGVyLXNlbGVjdCBkYXRhLW1vbnN0ZXItdXJsPVwiaHR0cHM6Ly9leGFtcGxlLmNvbS9cIj48L21vbnN0ZXItc2VsZWN0PlxuICogYGBgXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gaW5pdE9wdGlvbnNGcm9tQXJndW1lbnRzKCkge1xuXHRjb25zdCBvcHRpb25zID0ge307XG5cblx0Y29uc3QgdXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fVVJMKTtcblx0aWYgKGlzU3RyaW5nKHVybCkpIHtcblx0XHRvcHRpb25zW1widXJsXCJdID0gbmV3IFVSTCh1cmwpLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRyZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8dGVtcGxhdGUgaWQ9XCJvcHRpb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1pbnRlbmQgcGF0aDpvcHRpb25zLmludGVuZCwgXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1zdGF0ZSBwYXRoOm9wdGlvbnMuc3RhdGUsIFxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItdmlzaWJpbGl0eSBwYXRoOm9wdGlvbnMudmlzaWJpbGl0eSwgXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1maWx0ZXJlZCBwYXRoOm9wdGlvbnMuZmlsdGVyZWQsXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1oYXMtY2hpbGRyZW4gcGF0aDpvcHRpb25zLmhhcy1jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJmb2xkZXItaGFuZGxlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBwYXJ0PVwib3B0aW9uXCIgcm9sZT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLXJvbGU9XCJvcHRpb24tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cIlxuICAgICAgICAgICAgdHlwZSBwYXRoOnR5cGUsXG4gICAgICAgICAgICByb2xlIHBhdGg6cm9sZSxcbiAgICAgICAgICAgIHZhbHVlIHBhdGg6b3B0aW9ucy52YWx1ZSwgXG4gICAgICAgICAgICBuYW1lIHBhdGg6bmFtZSwgXG4gICAgICAgICAgICBwYXJ0IHBhdGg6dHlwZSB8IHByZWZpeDpvcHRpb24tIHwgc3VmZml4OiBmb3JtXG4gICAgICAgICAgICBcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpvcHRpb25zIHwgaW5kZXg6bGFiZWxcIiBwYXJ0PVwib3B0aW9uLWxhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICA8dGVtcGxhdGUgaWQ9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJiYWRnZVwiXG4gICAgICAgICAgICAgICAgIHBhcnQ9XCJiYWRnZVwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci12YWx1ZSBwYXRoOnNlbGVjdGlvbiB8IGluZGV4OnZhbHVlLCBcbiAgICAgICAgICAgICAgICAgY2xhc3MgcGF0aDpjbGFzc2VzIHwgaW5kZXg6YmFkZ2UsIFxuICAgICAgICBwYXJ0IHBhdGg6dHlwZSB8IHN1ZmZpeDotb3B0aW9uIHwgcHJlZml4OiBmb3JtLVwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpzZWxlY3Rpb24gfCBpbmRleDpsYWJlbFwiIHBhcnQ9XCJiYWRnZS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImJhZGdlLWxhYmVsXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBwYXJ0PVwicmVtb3ZlLWJhZGdlXCIgZGF0YS1tb25zdGVyLXNlbGVjdC10aGlzXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6ZmVhdHVyZXMuY2xlYXIgfCA/OjpoaWRkZW4gXCJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yb2xlPVwicmVtb3ZlLWJhZGdlXCIgdGFiaW5kZXg9XCItMVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgICAgPHNsb3QgY2xhc3M9XCJoaWRkZW5cIj48L3Nsb3Q+XG5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIFxcJHtzZWxlY3RlZH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwicG9wcGVyXCIgcGFydD1cInBvcHBlclwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cIm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1maWx0ZXItY29udHJvbFwiIHJvbGU9XCJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcm9sZT1cInNlYXJjaGJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0PVwicG9wcGVyLWZpbHRlclwiIG5hbWU9XCJwb3BwZXItZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yb2xlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJjb250ZW50XCIgY2xhc3M9XCJmbGV4XCIgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBwYXJ0PVwib3B0aW9uc1wiIGRhdGEtbW9uc3Rlci1yb2xlPVwib3B0aW9uc1wiIGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJvcHRpb25zIHBhdGg6b3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgcGFydD1cIm5vLW9wdGlvbnNcIiBkYXRhLW1vbnN0ZXItcm9sZT1cIm5vLW9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm1lc3NhZ2VzLmVtcHR5T3B0aW9uc1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHBhcnQ9XCJzdGF0dXMtb3ItcmVtb3ZlLWJhZGdlc1wiIGRhdGEtbW9uc3Rlci1yb2xlPVwic3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNcIlxuICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6Y2xhc3Nlcy5zdGF0dXNPclJlbW92ZUJhZGdlIHwgc3VmZml4OlxcXFwgc3RhdHVzLW9yLXJlbW92ZS1iYWRnZXNcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgYDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFRyZWVTZWxlY3QpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IFRvZ2dsZVN3aXRjaFN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IFRvZ2dsZVN3aXRjaFN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRUb2dnbGVTd2l0Y2hTdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIHRvZ2dsZXN3aXRjaCB7IFxuOmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWdyYXktMTojZjZmNmY2Oy0tbW9uc3Rlci1jb2xvci1ncmF5LTI6I2UyZTJlMjstLW1vbnN0ZXItY29sb3ItZ3JheS0zOiM4YjhiOGI7LS1tb25zdGVyLWNvbG9yLWdyYXktNDojNmY2ZjZmOy0tbW9uc3Rlci1jb2xvci1ncmF5LTU6IzNlM2UzZTstLW1vbnN0ZXItY29sb3ItZ3JheS02OiMyMjI7LS1tb25zdGVyLWNvbG9yLXJvc2UtMTojZmZmN2Y5Oy0tbW9uc3Rlci1jb2xvci1yb3NlLTI6I2ZmZGNlNTstLW1vbnN0ZXItY29sb3Itcm9zZS0zOiNmZjNiOGQ7LS1tb25zdGVyLWNvbG9yLXJvc2UtNDojZGIwMDcyOy0tbW9uc3Rlci1jb2xvci1yb3NlLTU6IzgwMDA0MDstLW1vbnN0ZXItY29sb3Itcm9zZS02OiM0YzAwMjM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0xOiNmZmY4Zjg7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0yOiNmZmRkZGY7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS0zOiNmZjQyNmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS00OiNkZTAwNTE7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS01OiM4MjAwMmM7LS1tb25zdGVyLWNvbG9yLXJhc3BiZXJyeS02OiM1MTAwMTg7LS1tb25zdGVyLWNvbG9yLXJlZC0xOiNmZmY4ZjY7LS1tb25zdGVyLWNvbG9yLXJlZC0yOiNmZmRkZDg7LS1tb25zdGVyLWNvbG9yLXJlZC0zOiNmZjQ2NDc7LS1tb25zdGVyLWNvbG9yLXJlZC00OiNlMDAwMmI7LS1tb25zdGVyLWNvbG9yLXJlZC01OiM4MzAwMTQ7LS1tb25zdGVyLWNvbG9yLXJlZC02OiM1MzAwMDM7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xOiNmZmY4ZjU7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0yOiNmZmRlZDE7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zOiNmZDRkMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS00OiNjZDNjMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS01OiM3NTIxMDA7LS1tb25zdGVyLWNvbG9yLW9yYW5nZS02OiM0MDE2MDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTE6I2ZmZjhmMzstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tMjojZmZkZmM2Oy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0zOiNkNTczMDA7LS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTQ6I2FjNWMwMDstLW1vbnN0ZXItY29sb3ItY2lubmFtb24tNTojNjMzMzAwOy0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi02OiMzNzFkMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTE6I2ZmZjhlZjstLW1vbnN0ZXItY29sb3ItYW1iZXItMjojZmZlMGIyOy0tbW9uc3Rlci1jb2xvci1hbWJlci0zOiNiOTgzMDA7LS1tb25zdGVyLWNvbG9yLWFtYmVyLTQ6IzkyNjcwMDstLW1vbnN0ZXItY29sb3ItYW1iZXItNTojNTIzODAwOy0tbW9uc3Rlci1jb2xvci1hbWJlci02OiMzMDIxMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0xOiNmZmY5ZTU7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0yOiNmZmU1M2U7LS1tb25zdGVyLWNvbG9yLXllbGxvdy0zOiM5YzhiMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy00OiM3ZDZmMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy01OiM0NjNkMDA7LS1tb25zdGVyLWNvbG9yLXllbGxvdy02OiMyOTIzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtMTojZjdmZmFjOy0tbW9uc3Rlci1jb2xvci1saW1lLTI6I2Q1ZjIwMDstLW1vbnN0ZXItY29sb3ItbGltZS0zOiM4MTkzMDA7LS1tb25zdGVyLWNvbG9yLWxpbWUtNDojNjc3NjAwOy0tbW9uc3Rlci1jb2xvci1saW1lLTU6IzM5NDEwMDstLW1vbnN0ZXItY29sb3ItbGltZS02OiMyMjI2MDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtMTojZTVmZmMzOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTI6Izk4ZmIwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS0zOiM1YzliMDA7LS1tb25zdGVyLWNvbG9yLWNoYXJ0cmV1c2UtNDojNDk3YzAwOy0tbW9uc3Rlci1jb2xvci1jaGFydHJldXNlLTU6IzI2NDUwMDstLW1vbnN0ZXItY29sb3ItY2hhcnRyZXVzZS02OiMxODI2MDA7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTE6I2UwZmZkOTstLW1vbnN0ZXItY29sb3ItZ3JlZW4tMjojNzJmZjZjOy0tbW9uc3Rlci1jb2xvci1ncmVlbi0zOiMwMGEyMWY7LS1tb25zdGVyLWNvbG9yLWdyZWVuLTQ6IzAwODIxNzstLW1vbnN0ZXItY29sb3ItZ3JlZW4tNTojMDA0OTA4Oy0tbW9uc3Rlci1jb2xvci1ncmVlbi02OiMwNjI4MDA7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtMTojZGNmZmU2Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTI6IzVkZmZhMjstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC0zOiMwMGEwNWE7LS1tb25zdGVyLWNvbG9yLWVtZXJhbGQtNDojMDA4MTQ3Oy0tbW9uc3Rlci1jb2xvci1lbWVyYWxkLTU6IzAwNDgyNTstLW1vbnN0ZXItY29sb3ItZW1lcmFsZC02OiMwMDI4MTI7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtMTojZGFmZmVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTI6IzQyZmZjNjstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS0zOiMwMDlmNzg7LS1tb25zdGVyLWNvbG9yLWFxdWFtYXJpbmUtNDojMDA3ZjVmOy0tbW9uc3Rlci1jb2xvci1hcXVhbWFyaW5lLTU6IzAwNDczNDstLW1vbnN0ZXItY29sb3ItYXF1YW1hcmluZS02OiMwMDI4MWI7LS1tb25zdGVyLWNvbG9yLXRlYWwtMTojZDdmZmY3Oy0tbW9uc3Rlci1jb2xvci10ZWFsLTI6IzAwZmZlNDstLW1vbnN0ZXItY29sb3ItdGVhbC0zOiMwMDllOGM7LS1tb25zdGVyLWNvbG9yLXRlYWwtNDojMDA3YzZlOy0tbW9uc3Rlci1jb2xvci10ZWFsLTU6IzAwNDQzYzstLW1vbnN0ZXItY29sb3ItdGVhbC02OiMwMDI3MjI7LS1tb25zdGVyLWNvbG9yLWN5YW4tMTojYzRmZmZlOy0tbW9uc3Rlci1jb2xvci1jeWFuLTI6IzAwZmFmYjstLW1vbnN0ZXItY29sb3ItY3lhbi0zOiMwMDk5OWE7LS1tb25zdGVyLWNvbG9yLWN5YW4tNDojMDA3YTdiOy0tbW9uc3Rlci1jb2xvci1jeWFuLTU6IzAwNDM0NDstLW1vbnN0ZXItY29sb3ItY3lhbi02OiMwMDI1MjU7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0xOiNkYWZhZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0yOiM4ZGYwZmY7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci0zOiMwMDk4YTk7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci00OiMwMDc5ODc7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci01OiMwMDQwNDg7LS1tb25zdGVyLWNvbG9yLXBvd2Rlci02OiMwMDIyMjc7LS1tb25zdGVyLWNvbG9yLXNreS0xOiNlM2Y3ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0yOiNhZWU5ZmY7LS1tb25zdGVyLWNvbG9yLXNreS0zOiMwMDk0YjQ7LS1tb25zdGVyLWNvbG9yLXNreS00OiMwMDc1OTA7LS1tb25zdGVyLWNvbG9yLXNreS01OiMwMDQwNGY7LS1tb25zdGVyLWNvbG9yLXNreS02OiMwMDFmMjg7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTE6I2U4ZjZmZjstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tMjojYjllM2ZmOy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi0zOiMwMDkyYzU7LS1tb25zdGVyLWNvbG9yLWNlcnVsZWFuLTQ6IzAwNzQ5ZDstLW1vbnN0ZXItY29sb3ItY2VydWxlYW4tNTojMDAzYzU0Oy0tbW9uc3Rlci1jb2xvci1jZXJ1bGVhbi02OiMwMDFkMmE7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTE6I2U4ZjJmZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtMjojYzZlMGZmOy0tbW9uc3Rlci1jb2xvci1henVyZS0zOiMwMDhmZGI7LS1tb25zdGVyLWNvbG9yLWF6dXJlLTQ6IzAwNzFhZjstLW1vbnN0ZXItY29sb3ItYXp1cmUtNTojMDAzYjVlOy0tbW9uc3Rlci1jb2xvci1henVyZS02OiMwMDFjMzA7LS1tb25zdGVyLWNvbG9yLWJsdWUtMTojZjBmNGZmOy0tbW9uc3Rlci1jb2xvci1ibHVlLTI6I2Q0ZTBmZjstLW1vbnN0ZXItY29sb3ItYmx1ZS0zOiMwMDg5ZmM7LS1tb25zdGVyLWNvbG9yLWJsdWUtNDojMDA2ZGNhOy0tbW9uc3Rlci1jb2xvci1ibHVlLTU6IzAwMzg2ZDstLW1vbnN0ZXItY29sb3ItYmx1ZS02OiMwMDFhMzk7LS1tb25zdGVyLWNvbG9yLWluZGlnby0xOiNmM2YzZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0yOiNkZWRkZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby0zOiM2NTdlZmY7LS1tb25zdGVyLWNvbG9yLWluZGlnby00OiMwMDYxZmM7LS1tb25zdGVyLWNvbG9yLWluZGlnby01OiMwMDMyOGE7LS1tb25zdGVyLWNvbG9yLWluZGlnby02OiMwMDE2NDk7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0xOiNmN2YxZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0yOiNlOGRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC0zOiM5YjcwZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC00OiM3OTRhZmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC01OiMyZDBmYmY7LS1tb25zdGVyLWNvbG9yLXZpb2xldC02OiMwYjAwNzQ7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0xOiNmZGY0ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0yOiNmN2Q5ZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS0zOiNkMTUwZmY7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS00OiNiMDFmZTM7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS01OiM2NjAwODc7LS1tb25zdGVyLWNvbG9yLXB1cnBsZS02OiMzYTAwNGY7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMTojZmZmM2ZjOy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTI6I2ZmZDdmNjstLW1vbnN0ZXItY29sb3ItbWFnZW50YS0zOiNmOTExZTA7LS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNDojY2EwMGI2Oy0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTU6Izc0MDA2ODstLW1vbnN0ZXItY29sb3ItbWFnZW50YS02OiM0NDAwM2M7LS1tb25zdGVyLWNvbG9yLXBpbmstMTojZmZmN2ZiOy0tbW9uc3Rlci1jb2xvci1waW5rLTI6I2ZmZGNlYzstLW1vbnN0ZXItY29sb3ItcGluay0zOiNmZjJmYjI7LS1tb25zdGVyLWNvbG9yLXBpbmstNDojZDIwMDhmOy0tbW9uc3Rlci1jb2xvci1waW5rLTU6Izc5MDA1MTstLW1vbnN0ZXItY29sb3ItcGluay02OiM0YjAwMzA7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0xOiNlNWI4NzU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0yOiNkOWEzNjI7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS0zOiNjMDhhNGU7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS00OiNhNzcxM2I7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS01OiM4ZjVhMjg7LS1tb25zdGVyLWdyYWRpZW50LXRhbmdlcmluZS02OiMzNjA1MDU7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTE6I2Y3ZjVlZjstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtMjojZTVlMmQ5Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC0zOiNjYmM2YjM7LS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTQ6I2ExOWQ4YTstLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNTojN2E3NTY2Oy0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02OiM1MTRkM2Z9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTEpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTEpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMSl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0xKX0ubW9uc3Rlci10aGVtZS1lcnJvci0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTEpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTEpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtMXtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS0xe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMSl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xKX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTEpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMSl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0xKX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS1kaXNhYmxlZC0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yKX0ubW9uc3Rlci10aGVtZS1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLXRoZW1lLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMil9Lm1vbnN0ZXItdGhlbWUtZGVzdHJ1Y3RpdmUtMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yKX0ubW9uc3Rlci10aGVtZS1zdWNjZXNzLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTIpfS5tb25zdGVyLXRoZW1lLXdhcm5pbmctMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMil9Lm1vbnN0ZXItdGhlbWUtZXJyb3ItMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci0yKX0ubW9uc3Rlci10aGVtZS1zZWxlY3Rpb24tMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTIpfS5tb25zdGVyLWJvcmRlci1jb2xvci0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWJvcmRlci0yKX0ubW9uc3Rlci1jb2xvci1uZXV0cmFsLTJ7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLXByaW1hcnktMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMil9Lm1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMil9Lm1vbnN0ZXItY29sb3Itc3VjY2Vzcy0ye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0yKX0ubW9uc3Rlci1jb2xvci13YXJuaW5nLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMik7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTIpfS5tb25zdGVyLWNvbG9yLWVycm9yLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMil9Lm1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yKX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLXRoZW1lLXByaW1hcnktZGlzYWJsZWQtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMyl9Lm1vbnN0ZXItdGhlbWUtc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci10aGVtZS10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLXRoZW1lLWRlc3RydWN0aXZlLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtMyl9Lm1vbnN0ZXItdGhlbWUtc3VjY2Vzcy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zKX0ubW9uc3Rlci10aGVtZS13YXJuaW5nLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTMpfS5tb25zdGVyLXRoZW1lLWVycm9yLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZXJyb3ItMyl9Lm1vbnN0ZXItdGhlbWUtc2VsZWN0aW9uLTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKX0ubW9uc3Rlci1ib3JkZXItY29sb3ItM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ib3JkZXItMyl9Lm1vbnN0ZXItY29sb3ItbmV1dHJhbC0ze2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zKX0ubW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1wcmltYXJ5LTN7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTMpfS5tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItY29sb3ItdGVydGlhcnktM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTMpfS5tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtM3tiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMyl9Lm1vbnN0ZXItY29sb3Itd2FybmluZy0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTMpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy0zKX0ubW9uc3Rlci1jb2xvci1lcnJvci0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTMpfS5tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0ze2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMyk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyl9Lm1vbnN0ZXItdGhlbWUtcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci10aGVtZS1wcmltYXJ5LWRpc2FibGVkLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQpfS5tb25zdGVyLXRoZW1lLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItdGhlbWUtdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KX0ubW9uc3Rlci10aGVtZS1kZXN0cnVjdGl2ZS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQpfS5tb25zdGVyLXRoZW1lLXN1Y2Nlc3MtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNCl9Lm1vbnN0ZXItdGhlbWUtd2FybmluZy00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itd2FybmluZy00KX0ubW9uc3Rlci10aGVtZS1lcnJvci00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWVycm9yLTQpfS5tb25zdGVyLXRoZW1lLXNlbGVjdGlvbi00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCl9Lm1vbnN0ZXItYm9yZGVyLWNvbG9yLTR7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItYm9yZGVyLTQpfS5tb25zdGVyLWNvbG9yLW5ldXRyYWwtNHtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItcHJpbWFyeS00e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItY29sb3ItZGVzdHJ1Y3RpdmUtNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00KX0ubW9uc3Rlci1jb2xvci1zdWNjZXNzLTR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTQpfS5tb25zdGVyLWNvbG9yLXdhcm5pbmctNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00KTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNCl9Lm1vbnN0ZXItY29sb3ItZXJyb3ItNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1lcnJvci00KX0ubW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1yb3ctMXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpfS5tb25zdGVyLXRoZW1lLWNvbnRyb2wtY29udGFpbmVyLTEsLm1vbnN0ZXItdGhlbWUtY29udHJvbC1lbGVtZW50LC5tb25zdGVyLXRoZW1lLWNvbnRyb2wtcm93LTF7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcil9Lm1vbnN0ZXItdGhlbWUtY29udHJvbC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yKX0ubW9uc3Rlci10aGVtZS1iYWNrZ3JvdW5kLWluaGVyaXR7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0IWltcG9ydGFudH0ubW9uc3Rlci10aGVtZS1vbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3IpO2NvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb24tY29sb3IpfS5tb25zdGVyLXRoZW1lLW9mZntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yKTtjb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLW9mZi1jb2xvcil9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMSwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0yLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci0we2JvcmRlci1yYWRpdXM6MDtib3JkZXItc3R5bGU6bm9uZTtib3JkZXItd2lkdGg6MH0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMiwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMSwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMiwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMywubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDttYXJnaW46MDtvdXRsaW5lOm5vbmV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKTtvdXRsaW5lLW9mZnNldDoycHh9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIC5zd2l0Y2h7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aCk7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6aW5saW5lLWdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4yczt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSAubGFiZWx7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowIC4yZW07dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1vdmVyZmxvdzplbGxpcHNpczstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7d2hpdGUtc3BhY2U6bm93cmFwfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSAuc3dpdGNoLXNsaWRlcntib3R0b206NHB4O2xlZnQ6NHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjRweDt0b3A6NHB4O3RyYW5zaXRpb246LjJzO3dpZHRoOmNhbGMoNTAlIC0gNHB4KX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0gLnN3aXRjaFtkYXRhLW1vbnN0ZXItc3RhdGU9b25dIC5sYWJlbC5vZmZ7dmlzaWJpbGl0eTpoaWRkZW59W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIC5zd2l0Y2hbZGF0YS1tb25zdGVyLXN0YXRlPW9mZl0gLmxhYmVsLm9mZixbZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0gLnN3aXRjaFtkYXRhLW1vbnN0ZXItc3RhdGU9b25dIC5sYWJlbC5vbnt2aXNpYmlsaXR5OnZpc2libGV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIC5zd2l0Y2hbZGF0YS1tb25zdGVyLXN0YXRlPW9mZl0gLmxhYmVsLm9ue3Zpc2liaWxpdHk6aGlkZGVufVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSAuc3dpdGNoW2RhdGEtbW9uc3Rlci1zdGF0ZT1vbl0gLnN3aXRjaC1zbGlkZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIC5zd2l0Y2hbZGF0YS1tb25zdGVyLXN0YXRlPW9mZl0gLnN3aXRjaC1zbGlkZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9Omhvc3R7Y3Vyc29yOnBvaW50ZXJ9Omhvc3QoW2Rpc2FibGVkXSl7Y3Vyc29yOm5vdC1hbGxvd2VkfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCwgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udHJvbCB9IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tY29udHJvbC5tanNcIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uLy4uL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHsgUHJveHlPYnNlcnZlciB9IGZyb20gXCIuLi8uLi90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRyZWdpc3RlckN1c3RvbUVsZW1lbnQsXG5cdHVwZGF0ZXJUcmFuc2Zvcm1lck1ldGhvZHNTeW1ib2wsXG59IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgVG9nZ2xlU3dpdGNoU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvdG9nZ2xlLXN3aXRjaC5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdEFUVFJJQlVURV9ST0xFLFxufSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gXCIuLi8uLi9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7IGZpcmVFdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHthZGRFcnJvckF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uL2RvbS9lcnJvci5tanNcIjtcblxuZXhwb3J0IHsgVG9nZ2xlU3dpdGNoIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHN3aXRjaEVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJzd2l0Y2hFbGVtZW50XCIpO1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBTVEFURV9PTiA9IFwib25cIjtcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgU1RBVEVfT0ZGID0gXCJvZmZcIjtcblxuLyoqXG4gKiBBIHNpbXBsZSB0b2dnbGUgc3dpdGNoXG4gKlxuICogQGZyYWdtZW50cyAvZnJhZ21lbnRzL2NvbXBvbmVudHMvZm9ybS90b2dnbGUtc3dpdGNoXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS90b2dnbGUtc3dpdGNoLXNpbXBsZSBTaW1wbGUgZXhhbXBsZVxuICpcbiAqIEBzaW5jZSAzLjU3LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGJlYXV0aWZ1bCBzd2l0Y2ggZWxlbWVudFxuICogQGZpcmVzIG1vbnN0ZXItb3B0aW9ucy1zZXRcbiAqIEBmaXJlcyBtb25zdGVyLXNlbGVjdGVkXG4gKiBAZmlyZXMgbW9uc3Rlci1jaGFuZ2VcbiAqIEBmaXJlcyBtb25zdGVyLWNoYW5nZWRcbiAqL1xuY2xhc3MgVG9nZ2xlU3dpdGNoIGV4dGVuZHMgQ3VzdG9tQ29udHJvbCB7XG5cdC8qKlxuXHQgKiBUbyBzZXQgdGhlIG9wdGlvbnMgdmlhIHRoZSBIVE1MIHRhZywgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLW9wdGlvbnNgIG11c3QgYmUgdXNlZC5cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy8jY29uZmlndXJhdGUtYS1tb25zdGVyLWNvbnRyb2x9XG5cdCAqXG5cdCAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZT1jdXJyZW50IHZhbHVlIG9mIHRoZSBlbGVtZW50XG5cdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGlzYWJsZWQ9ZGlzYWJsZWQ9ZmFsc2UgRGlzYWJsZWQgc3RhdGVcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGNsYXNzZXNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzZXMub249c3BlY2lmaWVzIHRoZSBjbGFzcyBmb3IgdGhlIG9uIHN0YXRlLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3Nlcy5vZmY9c3BlY2lmaWVzIHRoZSBjbGFzcyBmb3IgdGhlIG9mZiBzdGF0ZS5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHZhbHVlc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVzLm9mZj1zcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGlmIGl0IGlzIG5vdCBzZWxlY3RlZFxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gbGFiZWxzXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbHMub249c3BlY2lmaWVzIHRoZSBsYWJlbCBmb3IgdGhlIG9uIHN0YXRlLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWxzLm9mZj1zcGVjaWZpZXMgdGhlIGxhYmVsIGZvciB0aGUgb2ZmIHN0YXRlLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9ucy5vbj1zcGVjaWZpZXMgdGhlIGFjdGlvbiBmb3IgdGhlIG9uIHN0YXRlLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9ucy5vZmY9c3BlY2lmaWVzIHRoZSBhY3Rpb24gZm9yIHRoZSBvZmYgc3RhdGUuXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0ZW1wbGF0ZXNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRlbXBsYXRlcy5tYWluIHRoZSBtYWluIHRlbXBsYXRlIHVzZWQgYnkgdGhlIGNvbnRyb2wuXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR2YWx1ZTogbnVsbCxcblx0XHRcdGRpc2FibGVkOiBmYWxzZSxcblx0XHRcdGNsYXNzZXM6IHtcblx0XHRcdFx0b246IFwibW9uc3Rlci10aGVtZS1vblwiLFxuXHRcdFx0XHRvZmY6IFwibW9uc3Rlci10aGVtZS1vZmZcIixcblx0XHRcdFx0aGFuZGxlOiBcIm1vbnN0ZXItdGhlbWUtcHJpbWFyeS0xXCIsXG5cdFx0XHRcdGVycm9yOiBcIm1vbnN0ZXItdGhlbWUtZXJyb3ItMVwiLFxuXHRcdFx0fSxcblx0XHRcdHZhbHVlczoge1xuXHRcdFx0XHRvbjogXCJvblwiLFxuXHRcdFx0XHRvZmY6IFwib2ZmXCIsXG5cdFx0XHR9LFxuXHRcdFx0bGFiZWxzOiB7XG5cdFx0XHRcdHRvZ2dsZVN3aXRjaE9uOiBcIlx1MjcxNFwiLFxuXHRcdFx0XHR0b2dnbGVTd2l0Y2hPZmY6IFwiXHUyNzE2XCIsXG5cdFx0XHR9LFxuXHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHR9LFxuXHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRvbjogKCkgPT4ge30sXG5cdFx0XHRcdG9mZjogKCkgPT4ge30sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXG5cdFx0aW5pdENvbnRyb2xSZWZlcmVuY2VzLmNhbGwodGhpcyk7XG5cdFx0aW5pdEV2ZW50SGFuZGxlci5jYWxsKHRoaXMpO1xuXG5cdFx0Z2V0V2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogaW5pdCB2YWx1ZSB0byBvZmZcblx0XHRcdCAqIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYmVmb3JlIGluc2VydGluZyBpdCBpbnRvIHRoZSBIVE1MXG5cdFx0XHQgKi9cblx0XHRcdGlmIChzZWxmLmdldE9wdGlvbihcInZhbHVlXCIpID09PSBudWxsKSB7XG5cdFx0XHRcdHNlbGYuc2V0T3B0aW9uKFwidmFsdWVcIiwgc2VsZi5nZXRPcHRpb24oXCJ2YWx1ZXMub2ZmXCIpKTtcblx0XHRcdH1cblxuXHRcdFx0LyoqXG5cdFx0XHQgKiB2YWx1ZSBmcm9tIGF0dHJpYnV0ZVxuXHRcdFx0ICovXG5cdFx0XHRpZiAoc2VsZi5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuXHRcdFx0XHRzZWxmLnNldE9wdGlvbihcInZhbHVlXCIsIHNlbGYuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIHZhbGlkYXRlIHZhbHVlXG5cdFx0XHQgKi9cblx0XHRcdHZhbGlkYXRlQW5kU2V0VmFsdWUuY2FsbChzZWxmKTtcblxuXHRcdFx0Ly8gdGhpcyBzdGF0ZSBpcyBhIGdldHRlclxuXHRcdFx0aWYgKHRoaXMuc3RhdGUgPT09IFNUQVRFX09OKSB7XG5cdFx0XHRcdHRvZ2dsZU9uLmNhbGwoc2VsZik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0b2dnbGVPZmYuY2FsbChzZWxmKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiB1cGRhdGVyIHRyYW5zZm9ybWVyIG1ldGhvZHMgZm9yIHBpcGVcblx0ICpcblx0ICogQHJldHVybiB7ZnVuY3Rpb259XG5cdCAqL1xuXHRbdXBkYXRlclRyYW5zZm9ybWVyTWV0aG9kc1N5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdFwic3RhdGUtY2FsbGJhY2tcIjogKFdlcnQpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuc3RhdGU7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiBbQ1NTU3R5bGVTaGVldF1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdHJldHVybiBbVG9nZ2xlU3dpdGNoU3R5bGVTaGVldF07XG5cdH1cblxuXHQvKipcblx0ICogdG9nZ2xlIHN3aXRjaFxuXHQgKlxuXHQgKiBgYGBcblx0ICogZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuXHQgKiBlLmNsaWNrKClcblx0ICogYGBgXG5cdCAqL1xuXHRjbGljaygpIHtcblx0XHR0aGlzLnRvZ2dsZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHRvZ2dsZSBzd2l0Y2ggb24vb2ZmXG5cdCAqXG5cdCAqIGBgYFxuXHQgKiBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9uc3Rlci10b2dnbGUtc3dpdGNoJyk7XG5cdCAqIGUudG9nZ2xlKClcblx0ICogYGBgXG5cdCAqXG5cdCAqIEByZXR1cm4ge1RvZ2dsZVN3aXRjaH1cblx0ICovXG5cdHRvZ2dsZSgpIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJ2YWx1ZVwiKSA9PT0gdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub25cIikpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvZ2dsZU9mZigpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy50b2dnbGVPbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHRvZ2dsZSBzd2l0Y2ggb25cblx0ICpcblx0ICogYGBgXG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLXRvZ2dsZS1zd2l0Y2gnKTtcblx0ICogZS50b2dnbGVPbigpXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtUb2dnbGVTd2l0Y2h9XG5cdCAqL1xuXHR0b2dnbGVPbigpIHtcblx0XHR0aGlzLnNldE9wdGlvbihcInZhbHVlXCIsIHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9uXCIpKTtcblx0XHRmaXJlRXZlbnQodGhpcywgXCJjaGFuZ2VcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogdG9nZ2xlIHN3aXRjaCBvZmZcblx0ICpcblx0ICogYGBgXG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLXRvZ2dsZS1zd2l0Y2gnKTtcblx0ICogZS50b2dnbGVPZmYoKVxuXHQgKiBgYGBcblx0ICpcblx0ICogQHJldHVybiB7VG9nZ2xlU3dpdGNofVxuXHQgKi9cblx0dG9nZ2xlT2ZmKCkge1xuXHRcdHRoaXMuc2V0T3B0aW9uKFwidmFsdWVcIiwgdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub2ZmXCIpKTtcblx0XHRmaXJlRXZlbnQodGhpcywgXCJjaGFuZ2VcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBlbGVtZW50XG5cdCAqXG5cdCAqIGBgYFxuXHQgKiBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9uc3Rlci10b2dnbGUtc3dpdGNoJyk7XG5cdCAqIGNvbnNvbGUubG9nKGUuc3RhdGUpXG5cdCAqIC8vIFx1MjFBNiBvZmZcblx0ICogYGBgXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdGdldCBzdGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZVwiKSA9PT0gdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub25cIilcblx0XHRcdD8gU1RBVEVfT05cblx0XHRcdDogU1RBVEVfT0ZGO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBTd2l0Y2hcblx0ICpcblx0ICogYGBgXG5cdCAqIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLXRvZ2dsZS1zd2l0Y2gnKTtcblx0ICogY29uc29sZS5sb2coZS52YWx1ZSlcblx0ICogLy8gXHUyMUE2IG9uXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXQgdmFsdWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVcIik7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHZhbHVlXG5cdCAqXG5cdCAqIGBgYFxuXHQgKiBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9uc3Rlci10b2dnbGUtc3dpdGNoJyk7XG5cdCAqIGUudmFsdWU9XCJvblwiXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVcblx0ICovXG5cdHNldCB2YWx1ZSh2YWx1ZSkge1xuXHRcdGlmIChcblx0XHRcdHZhbHVlID09PSB0aGlzLmdldE9wdGlvbihcInZhbHVlcy5vblwiKSB8fFxuXHRcdFx0dmFsdWUgPT09IHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9mZlwiKVxuXHRcdCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLnN0YXRlICE9PVxuXHRcdFx0XHQodmFsdWUgPT09IHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9uXCIpID8gU1RBVEVfT04gOiBTVEFURV9PRkYpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5zZXRPcHRpb24oXCJ2YWx1ZVwiLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YWRkRXJyb3JBdHRyaWJ1dGUoXG5cdFx0XHR0aGlzLFxuXHRcdFx0J1RoZSB2YWx1ZSBcIicgK1xuXHRcdFx0XHR2YWx1ZSArXG5cdFx0XHRcdCdcIiBtdXN0IGJlIFwiJyArXG5cdFx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9uXCIpICtcblx0XHRcdFx0J1wiIG9yIFwiJyArXG5cdFx0XHRcdHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9mZlwiKSxcblx0XHQpO1xuXG5cdFx0c2hvd0Vycm9yLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcblx0XHRcdFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2Zvcm0vdG9nZ2xlLXN3aXRjaEBAaW5zdGFuY2VcIixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItdG9nZ2xlLXN3aXRjaFwiO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHR0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1zd2l0Y2hdYCxcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0b2dnbGVPbigpIHtcblx0aWYgKCF0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpc1tzd2l0Y2hFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5vZmZcIikpOyAvLyBjaGFuZ2UgY29sb3Jcblx0dGhpc1tzd2l0Y2hFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5vblwiKSk7IC8vIGNoYW5nZSBjb2xvclxuXG5cdGNvbnN0IGNhbGxiYWNrID0gdGhpcy5nZXRPcHRpb24oXCJhY3Rpb25zLm9uXCIpO1xuXHRpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRjYWxsYmFjay5jYWxsKHRoaXMpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB0aGlzLnNldEZvcm1WYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dGhpcy5zZXRGb3JtVmFsdWUodGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub25cIikpO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlT2ZmKCkge1xuXHRpZiAoIXRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRPcHRpb24oXCJjbGFzc2VzLm9uXCIpKTsgLy8gY2hhbmdlIGNvbG9yXG5cdHRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZCh0aGlzLmdldE9wdGlvbihcImNsYXNzZXMub2ZmXCIpKTsgLy8gY2hhbmdlIGNvbG9yXG5cblx0Y29uc3QgY2FsbGJhY2sgPSB0aGlzLmdldE9wdGlvbihcImFjdGlvbnMub2ZmXCIpO1xuXHRpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRjYWxsYmFjay5jYWxsKHRoaXMpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB0aGlzLnNldEZvcm1WYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dGhpcy5zZXRGb3JtVmFsdWUodGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub2ZmXCIpKTtcblx0fVxufVxuXG5mdW5jdGlvbiBzaG93RXJyb3IoKSB7XG5cdGlmICghdGhpc1tzd2l0Y2hFbGVtZW50U3ltYm9sXSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmdldE9wdGlvbihcImNsYXNzZXMub25cIikpO1xuXHR0aGlzW3N3aXRjaEVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5nZXRPcHRpb24oXCJjbGFzc2VzLm9mZlwiKSk7XG5cdHRoaXNbc3dpdGNoRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZCh0aGlzLmdldE9wdGlvbihcImNsYXNzZXMuZXJyb3JcIikpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQW5kU2V0VmFsdWUoKSB7XG5cdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPcHRpb24oXCJ2YWx1ZVwiKTtcblxuXHRjb25zdCB2YWxpZGF0ZWRWYWx1ZXMgPSBbXTtcblx0dmFsaWRhdGVkVmFsdWVzLnB1c2godGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub25cIikpO1xuXHR2YWxpZGF0ZWRWYWx1ZXMucHVzaCh0aGlzLmdldE9wdGlvbihcInZhbHVlcy5vZmZcIikpO1xuXG5cdGlmICh2YWxpZGF0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpID09PSBmYWxzZSkge1xuXHRcdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdFx0dGhpcyxcblx0XHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0XHQnVGhlIHZhbHVlIFwiJyArXG5cdFx0XHRcdHZhbHVlICtcblx0XHRcdFx0J1wiIG11c3QgYmUgXCInICtcblx0XHRcdFx0dGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub25cIikgK1xuXHRcdFx0XHQnXCIgb3IgXCInICtcblx0XHRcdFx0dGhpcy5nZXRPcHRpb24oXCJ2YWx1ZXMub2ZmXCIpLFxuXHRcdCk7XG5cdFx0dGhpcy5zZXRPcHRpb24oXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR0aGlzLmZvcm1EaXNhYmxlZENhbGxiYWNrKHRydWUpO1xuXHRcdHNob3dFcnJvci5jYWxsKHRoaXMpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXMuc2V0T3B0aW9uKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHR0aGlzLmZvcm1EaXNhYmxlZENhbGxiYWNrKGZhbHNlKTtcblxuXHRpZiAodmFsdWUgPT09IHRoaXMuZ2V0T3B0aW9uKFwidmFsdWVzLm9uXCIpKSB7XG5cdFx0dG9nZ2xlT24uY2FsbCh0aGlzKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0b2dnbGVPZmYuY2FsbCh0aGlzKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7aW5pdEV2ZW50SGFuZGxlcn1cbiAqL1xuZnVuY3Rpb24gaW5pdEV2ZW50SGFuZGxlcigpIHtcblx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cblx0bGV0IGxhc3RWYWx1ZSA9IHNlbGYudmFsdWU7XG5cdHNlbGZbaW50ZXJuYWxTeW1ib2xdLmF0dGFjaE9ic2VydmVyKFxuXHRcdG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoaXNPYmplY3QodGhpcykgJiYgdGhpcyBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXIpIHtcblx0XHRcdFx0Y29uc3QgbiA9IHRoaXMuZ2V0U3ViamVjdCgpPy5vcHRpb25zPy52YWx1ZTtcblx0XHRcdFx0aWYgKGxhc3RWYWx1ZSAhPT0gbikge1xuXHRcdFx0XHRcdGxhc3RWYWx1ZSA9IG47XG5cdFx0XHRcdFx0dmFsaWRhdGVBbmRTZXRWYWx1ZS5jYWxsKHNlbGYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSksXG5cdCk7XG5cblx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XG5cdFx0XHRzZWxmLnRvZ2dsZSgpO1xuXHRcdH1cblx0fSk7XG5cblx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG5cdFx0c2VsZi50b2dnbGUoKTtcblx0fSk7XG5cblx0c2VsZi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hcIiwgKGV2ZW50KSA9PiB7XG5cdFx0c2VsZi50b2dnbGUoKTtcblx0fSk7XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG5cdC8vIGxhbmd1YWdlPUhUTUxcblx0cmV0dXJuIGBcbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaFwiIGRhdGEtbW9uc3Rlci1yb2xlPVwic3dpdGNoXCJcbiAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJkYXRhLW1vbnN0ZXItc3RhdGUgcGF0aDp2YWx1ZSB8IGNhbGw6c3RhdGUtY2FsbGJhY2tcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgb25cIiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bGFiZWxzLnRvZ2dsZVN3aXRjaE9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIG9mZlwiIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpsYWJlbHMudG9nZ2xlU3dpdGNoT2ZmXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6Y2xhc3Nlcy5oYW5kbGUgfCBzdWZmaXg6XFxcXCBzd2l0Y2gtc2xpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KFRvZ2dsZVN3aXRjaCk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge1xuXHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRBVFRSSUJVVEVfUk9MRSxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0YXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2wsXG5cdEN1c3RvbUVsZW1lbnQsXG5cdGluaXRNZXRob2RTeW1ib2wsXG5cdHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRk9STV9SRUxPQUQsIEFUVFJJQlVURV9GT1JNX1VSTCB9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGxvYWRBbmRBc3NpZ25Db250ZW50IH0gZnJvbSBcIi4vdXRpbC9mZXRjaC5tanNcIjtcblxuZXhwb3J0IHsgVGVtcGxhdGUgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJXYXNJbml0aWFsaXplZCA9IFN5bWJvbChcIndhc0luaXRpYWxpemVkXCIpO1xuXG4vKipcbiAqIEEgVGVtcGxhdGUgY29udHJvbCBpcyBhIGNvbnRyb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2FkIGNvbnRlbnQgZnJvbSBhIFVSTCBhbmQgZGlzcGxheSBpdCBpbiB0aGUgU2hhZG93Um9vdC5cbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9mb3JtL3RlbXBsYXRlXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvZm9ybS90ZW1wbGF0ZS1zaW1wbGVcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2Zvcm0vdGVtcGxhdGUtd2l0aC1kZWZhdWx0XG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3RlbXBsYXRlLXdpdGgtcHJvY2Vzc29yXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9mb3JtL3RlbXBsYXRlLW9uc2hvd1xuICpcbiAqIEBzaW5jZSAxLjExLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIHRlbXBsYXRlIGNvbnRyb2xcbiAqIEBmaXJlcyBtb25zdGVyLWZldGNoZWRcbiAqL1xuY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2Zvcm0vdGVtcGxhdGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCB0YWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmw9dW5kZWZpbmVkXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWxvYWQ9dW5kZWZpbmVkICBjdXJyZW50bHkgdGhlIG9ubHkgdmFsdWUgZGVmaW5lZCBpcyBgb25zaG93YC4gQ3VycmVudGx5IHRoZSBvbmx5IHZhbHVlIGRlZmluZWQgaXMgb25zaG93LiB0aGlzIHJlbW92ZXMgdGhlIEludGVyc2VjdGlvbk9ic2VydmVyLiB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgaXMgb25seSBsb2FkZWQgb25jZS4gcmVsb2FkaW5nIG9mIHRoZSBjb250ZW50IGRvZXMgbm90IG9jY3VyLlxuXHQgKiBAcHJvcGVydHkge09iamVjdFtdfSBwcm9jZXNzb3JzXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZXRjaCBGZXRjaCBbc2VlIFVzaW5nIEZldGNoIG1vemlsbGEub3JnXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoKVxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gucmVkaXJlY3Q9ZXJyb3Jcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLm1ldGhvZD1HRVRcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLm1vZGU9c2FtZS1vcmlnaW5cblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNyZWRlbnRpYWxzPXNhbWUtb3JpZ2luXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZXRjaC5oZWFkZXJzPXtcImFjY2VwdFwiOlwidGV4dC9odG1sXCJ9fVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e30sXG5cdFx0XHRzdXBlci5kZWZhdWx0cyxcblx0XHRcdHtcblx0XHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dXJsOiBudWxsLFxuXHRcdFx0XHRyZWxvYWQ6IG51bGwsXG5cdFx0XHRcdHByb2Nlc3NvcnM6IFtdLFxuXHRcdFx0XHRmZXRjaDoge1xuXHRcdFx0XHRcdHJlZGlyZWN0OiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdG1vZGU6IFwic2FtZS1vcmlnaW5cIixcblx0XHRcdFx0XHRjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiLFxuXHRcdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRcdGFjY2VwdDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGluaXRPcHRpb25zRnJvbUFyZ3VtZW50cy5jYWxsKHRoaXMpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nW119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRjb25zdCBsaXN0ID0gc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzO1xuXHRcdGxpc3QucHVzaChBVFRSSUJVVEVfRk9STV9VUkwpO1xuXHRcdHJldHVybiBsaXN0O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRbaW5pdE1ldGhvZFN5bWJvbF0oKSB7XG5cdFx0c3VwZXJbaW5pdE1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdC8vIGRhdGEtbW9uc3Rlci1vcHRpb25zXG5cdFx0dGhpc1thdHRyaWJ1dGVPYnNlcnZlclN5bWJvbF1bQVRUUklCVVRFX0ZPUk1fVVJMXSA9ICh1cmwpID0+IHtcblx0XHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfRk9STV9VUkwpKSB7XG5cdFx0XHRcdHRoaXMuc2V0T3B0aW9uKFwidXJsXCIsIG5ldyBVUkwodXJsLCBkb2N1bWVudC5sb2NhdGlvbikudG9TdHJpbmcoKSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gbWlzc2luZyBkZWZhdWx0IHNsb3Rcblx0ICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcblx0ICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgdXJsXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFcblx0ICogQHRocm93cyB7RXJyb3J9IHJlcXVlc3QgZmFpbGVkXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBub3QgZm91bmRcblx0ICogQHRocm93cyB7RXJyb3J9IHVuZGVmaW5lZCBzdGF0dXMgb3IgdHlwZVxuXHQgKiBAZmlyZXMgbW9uc3Rlci1mZXRjaGVkXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHRcdGluaXRJbnRlcnNlY3Rpb25PYnNlcnZlci5jYWxsKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqXG5cdCAqIEByZXR1cm4ge0NTU1N0eWxlU2hlZXRbXX1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItdGVtcGxhdGVcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBsb2FkIGNvbnRlbnQgZnJvbSB1cmxcblx0ICpcblx0ICogSXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhhdCB3aXRoIHRoaXMgZnVuY3Rpb24gdGhlIGxvYWRpbmcgaXMgZXhlY3V0ZWRcblx0ICogZGlyZWN0bHkuIGl0IGlzIGxvYWRlZCBhcyB3ZWxsIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gdXJsXG5cdCAqL1xuXHRmZXRjaCh1cmwpIHtcblx0XHRpZiAoaXNTdHJpbmcodXJsKSB8fCB1cmwgaW5zdGFuY2VvZiBVUkwpIHtcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9GT1JNX1VSTCwgYCR7dXJsfWApO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2FkQ29udGVudC5jYWxsKHRoaXMpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gcGFzcyBhIFVSTCB0byB0aGlzIHNlbGVjdC5cbiAqXG4gKiBgYGBcbiAqIDxtb25zdGVyLXNlbGVjdCBkYXRhLW1vbnN0ZXItdXJsPVwiaHR0cHM6Ly9leGFtcGxlLmNvbS9cIj48L21vbnN0ZXItc2VsZWN0PlxuICogYGBgXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gaW5pdE9wdGlvbnNGcm9tQXJndW1lbnRzKCkge1xuXHRjb25zdCBvcHRpb25zID0ge307XG5cblx0Y29uc3QgdXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fVVJMKTtcblxuXHRpZiAoaXNTdHJpbmcodXJsKSkge1xuXHRcdG9wdGlvbnNbXCJ1cmxcIl0gPSBuZXcgVVJMKHVybCwgZG9jdW1lbnQubG9jYXRpb24pLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRpZiAodGhpcy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0ZPUk1fUkVMT0FEKSkge1xuXHRcdG9wdGlvbnNbXCJyZWxvYWRcIl0gPSB0aGlzLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRk9STV9SRUxPQUQpLnRvTG93ZXJDYXNlKCk7XG5cdH1cblxuXHRyZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgZGVmYXVsdCBzbG90XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgdXJsXG4gKiBAdGhyb3dzIHtFcnJvcn0gd2Ugd29uJ3QgYmUgYWJsZSB0byByZWFkIHRoZSBkYXRhXG4gKiBAdGhyb3dzIHtFcnJvcn0gcmVxdWVzdCBmYWlsZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBub3QgZm91bmRcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmRlZmluZWQgc3RhdHVzIG9yIHR5cGVcbiAqIEBmaXJlcyBtb25zdGVyLWZldGNoZWRcbiAqL1xuZnVuY3Rpb24gaW5pdEludGVyc2VjdGlvbk9ic2VydmVyKCkge1xuXHRpZiAodGhpc1tpbnRlcnNlY3Rpb25PYnNlcnZlcldhc0luaXRpYWxpemVkXSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXNbaW50ZXJzZWN0aW9uT2JzZXJ2ZXJXYXNJbml0aWFsaXplZF0gPSB0cnVlO1xuXG5cdGNvbnN0IG9wdGlvbnMgPSB7XG5cdFx0dGhyZXNob2xkOiBbMC41XSxcblx0fTtcblxuXHRjb25zdCBjYWxsYmFjayA9IChlbnRyaWVzLCBvYnNlcnZlcikgPT4ge1xuXHRcdGZvciAoY29uc3QgWywgZW50cnldIG9mIGVudHJpZXMuZW50cmllcygpKSB7XG5cdFx0XHRpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcgPT09IHRydWUpIHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwicmVsb2FkXCIpID09PSBcIm9uc2hvd1wiKSB7XG5cdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRsb2FkQ29udGVudC5jYWxsKHRoaXMpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG5cdG9ic2VydmVyLm9ic2VydmUodGhpcyk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIGRlZmF1bHQgc2xvdFxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIHVybFxuICogQHRocm93cyB7RXJyb3J9IHdlIHdvbid0IGJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YVxuICogQHRocm93cyB7RXJyb3J9IHJlcXVlc3QgZmFpbGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IGZvdW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5kZWZpbmVkIHN0YXR1cyBvciB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gY2xpZW50IGVycm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5kZWZpbmVkIHN0YXR1cyBvciB0eXBlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEBmaXJlcyBtb25zdGVyLWZldGNoZWRcbiAqL1xuZnVuY3Rpb24gbG9hZENvbnRlbnQoKSB7XG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdGxldCB1cmwgPSB0aGlzLmdldE9wdGlvbihcInVybFwiLCB1bmRlZmluZWQpO1xuXG5cdGlmICh1cmwgaW5zdGFuY2VvZiBVUkwpIHtcblx0XHR1cmwgPSB1cmwudG9TdHJpbmcoKTtcblx0fVxuXG5cdGlmICghaXNTdHJpbmcodXJsKSB8fCB1cmwgPT09IFwiXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHVybFwiKTtcblx0fVxuXG5cdGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbihcImZldGNoXCIsIHt9KTtcblxuXHRjb25zdCBkZWZhdWx0U2xvdCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwic2xvdFtuYW1lPWRlZmF1bHRdXCIpO1xuXHRpZiAoIShkZWZhdWx0U2xvdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgZGVmYXVsdCBzbG90XCIpO1xuXHR9XG5cblx0ZGVmYXVsdFNsb3Quc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuXHRsZXQgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0YFske0FUVFJJQlVURV9ST0xFfT1jb250YWluZXJdYCxcblx0KTtcblx0aWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRjb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JPTEUsIFwiY29udGFpbmVyXCIpO1xuXHRcdHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXHR9XG5cblx0bG9hZEFuZEFzc2lnbkNvbnRlbnQoY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpXG5cdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0ZGVmYXVsdFNsb3Quc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdFx0XHRydW5Qcm9jZXNzb3JzLmNhbGwodGhpcyk7XG5cdFx0fSlcblx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdHRocm93IGU7XG5cdFx0fSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3J1blByb2Nlc3NvcnN9XG4gKi9cbmZ1bmN0aW9uIHJ1blByb2Nlc3NvcnMoKSB7XG5cdGNvbnN0IHByb2Nlc3NvcnMgPSB0aGlzLmdldE9wdGlvbihcInByb2Nlc3NvcnNcIik7XG5cdGlmICghaXNBcnJheShwcm9jZXNzb3JzKSkgcmV0dXJuIHRoaXM7XG5cblx0Zm9yIChjb25zdCBbLCBwcm9jZXNzb3JdIG9mIHByb2Nlc3NvcnMuZW50cmllcygpKSB7XG5cdFx0Y29uc3Qgc291cmNlID0gcHJvY2Vzc29yPy5zb3VyY2U7XG5cdFx0bGV0IGRlc3RpbmF0aW9uID0gcHJvY2Vzc29yPy5kZXN0aW5hdGlvbjtcblxuXHRcdGlmIChzb3VyY2UgPT09IG51bGwpIHtcblx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKHRoaXMsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIFwibWlzc2luZyBzb3VyY2VcIik7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRkZXN0aW5hdGlvbiA9PT0gbnVsbCB8fFxuXHRcdFx0ZGVzdGluYXRpb24gPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0ZGVzdGluYXRpb24gPT09IFwiXCJcblx0XHQpIHtcblx0XHRcdGRlc3RpbmF0aW9uID0gXCJbXCIgKyBBVFRSSUJVVEVfUk9MRSArIFwiPWNvbnRhaW5lcl1cIjtcblx0XHR9XG5cblx0XHRpZiAoaXNTdHJpbmcoc291cmNlKSAmJiBpc1N0cmluZyhkZXN0aW5hdGlvbikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZU5vZGUgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihzb3VyY2UpO1xuXHRcdFx0bGV0IGRlc3RpbmF0aW9uTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZGVzdGluYXRpb24pO1xuXG5cdFx0XHRpZiAoZGVzdGluYXRpb25Ob2RlID09PSBudWxsKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uTm9kZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGRlc3RpbmF0aW9uKTtcblx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uTm9kZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG5cdFx0XHRcdFx0XHRcImRlc3RpbmF0aW9uIG5vdCBmb3VuZFwiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRzb3VyY2VOb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcblx0XHRcdFx0ZGVzdGluYXRpb25Ob2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcblx0XHRcdCkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbk5vZGUuaW5uZXJIVE1MID0gc291cmNlTm9kZS5jbG9uZU5vZGUodHJ1ZSkuaW5uZXJIVE1MO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbihcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRcdFx0XCJpbnZhbGlkIHNvdXJjZSBvciBkZXN0aW5hdGlvblwiLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8c2xvdCBuYW1lPVwiZGVmYXVsdFwiPjwvc2xvdD5cbiAgICBgO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVtcGxhdGUpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IEhvc3RTdHlsZVNoZWV0IH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtDU1NTdHlsZVNoZWV0fVxuICovXG5jb25zdCBIb3N0U3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdEhvc3RTdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIGhvc3QgeyBcbi5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9ja30uZ3JpZHtkaXNwbGF5OmdyaWR9LmlubGluZS1ncmlke2Rpc3BsYXk6aW5saW5lLWdyaWR9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS5oaWRkZW4sLmhpZGUsLm5vbmV7ZGlzcGxheTpub25lfS52aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZX0uaW52aXNpYmxle3Zpc2liaWxpdHk6aGlkZGVufTp3aGVyZShodG1sKXtsaW5lLWhlaWdodDoxLjE1Oy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tb3otdGV4dC1zaXplLWFkanVzdDoxMDAlO3RleHQtc2l6ZS1hZGp1c3Q6MTAwJX06d2hlcmUoaDEpe2ZvbnQtc2l6ZToyZW07bWFyZ2luLWJsb2NrLWVuZDouNjdlbTttYXJnaW4tYmxvY2stc3RhcnQ6LjY3ZW19OndoZXJlKGRsLG9sLHVsKSA6d2hlcmUoZGwsb2wsdWwpe21hcmdpbi1ibG9jay1lbmQ6MDttYXJnaW4tYmxvY2stc3RhcnQ6MH06d2hlcmUoaHIpe2JveC1zaXppbmc6Y29udGVudC1ib3g7Y29sb3I6aW5oZXJpdDtoZWlnaHQ6MH06d2hlcmUoYWJiclt0aXRsZV0pe3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZH06d2hlcmUoYixzdHJvbmcpe2ZvbnQtd2VpZ2h0OmJvbGRlcn06d2hlcmUoY29kZSxrYmQscHJlLHNhbXApe2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2U7Zm9udC1zaXplOjFlbX06d2hlcmUoc21hbGwpe2ZvbnQtc2l6ZTo4MCV9OndoZXJlKHRhYmxlKXtib3JkZXItY29sb3I6Y3VycmVudENvbG9yO3RleHQtaW5kZW50OjB9OndoZXJlKGJ1dHRvbixpbnB1dCxzZWxlY3Qpe21hcmdpbjowfTp3aGVyZShidXR0b24pe3RleHQtdHJhbnNmb3JtOm5vbmV9OndoZXJlKGJ1dHRvbixpbnB1dDppcyhbdHlwZT1idXR0b24gaV0sW3R5cGU9cmVzZXQgaV0sW3R5cGU9c3VibWl0IGldKSl7LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn06d2hlcmUocHJvZ3Jlc3Mpe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfTp3aGVyZShzZWxlY3Qpe3RleHQtdHJhbnNmb3JtOm5vbmV9OndoZXJlKHRleHRhcmVhKXttYXJnaW46MH06d2hlcmUoaW5wdXRbdHlwZT1zZWFyY2ggaV0pey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjppbmhlcml0O29wYWNpdHk6LjU0fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fTp3aGVyZShidXR0b24saW5wdXQ6aXMoW3R5cGU9YnV0dG9uIGldLFt0eXBlPWNvbG9yIGldLFt0eXBlPXJlc2V0IGldLFt0eXBlPXN1Ym1pdCBpXSkpOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH06d2hlcmUoYnV0dG9uLGlucHV0OmlzKFt0eXBlPWJ1dHRvbiBpXSxbdHlwZT1jb2xvciBpXSxbdHlwZT1yZXNldCBpXSxbdHlwZT1zdWJtaXQgaV0pKTo6LW1vei1mb2N1c3Jpbmd7b3V0bGluZToxcHggZG90dGVkIEJ1dHRvblRleHR9OndoZXJlKDotbW96LXVpLWludmFsaWQpe2JveC1zaGFkb3c6bm9uZX06d2hlcmUoZGlhbG9nKXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOnNvbGlkO2NvbG9yOiMwMDA7aGVpZ2h0Oi1tb3otZml0LWNvbnRlbnQ7aGVpZ2h0OmZpdC1jb250ZW50O2xlZnQ6MDttYXJnaW46YXV0bztwYWRkaW5nOjFlbTtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9OndoZXJlKGRpYWxvZzpub3QoW29wZW5dKSl7ZGlzcGxheTpub25lfTp3aGVyZShzdW1tYXJ5KXtkaXNwbGF5Omxpc3QtaXRlbX1odG1se2hlaWdodDoxMDAlfWJvZHksaHRtbHttaW4taGVpZ2h0OmNhbGMoMTAwdmggLSA0MHB4KX1ib2R5e2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDtwYWRkaW5nOjA7d29yZC1icmVhazpicmVhay13b3JkfWJvZHk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmV9OmZvY3VzLXZpc2libGV7b3V0bGluZTpub25lfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMiwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0zLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItMHtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOjB9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMSwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0zLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTMpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTEsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTIsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXRlcnRpYXJ5LTR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMXtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KX1pbnB1dCxtZXRlcixwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWF7YWNjZW50LWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTIpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItd2lkdGgpO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTAwJTttYXJnaW46MDtvdXRsaW5lOm5vbmV9aW5wdXQsc2VsZWN0LHRleHRhcmVhe2hlaWdodDotbW96LWZpdC1jb250ZW50O2hlaWdodDpmaXQtY29udGVudDtwYWRkaW5nOi40cmVtIC42cmVtfXRleHRhcmVhe21pbi1oZWlnaHQ6NnJlbTtyZXNpemU6dmVydGljYWx9aW5wdXRbdHlwZT1jb2xvcl17aGVpZ2h0OjJyZW07bWFyZ2luOjA7cGFkZGluZzouMXJlbTt3aWR0aDoycmVtfWlucHV0OmhvdmVyOm5vdChbdHlwZT1yYWRpb10pOm5vdChbdHlwZT1jaGVja2JveF0pOm5vdChbdHlwZT1yYW5nZV0pLHNlbGVjdDpob3Zlcix0ZXh0YXJlYTpob3Zlcntib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0yKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjhzLGNvbG9yIC4yNXMgLjA4MzMzMzMzMzNzfWlucHV0OmZvY3VzLHNlbGVjdDpmb2N1cyx0ZXh0YXJlYTpmb2N1c3tvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyk7b3V0bGluZS1vZmZzZXQ6M3B4fUBmb250LWZhY2V7Zm9udC1kaXNwbGF5OnN3YXA7Zm9udC1mYW1pbHk6UmFsZXdheTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRko0QUJJQUFBQUF0M0FBQUZJUUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FOEcrNDZISVU4Qm1BL1UxUkJWRVFBaFFnSWdRb0pueFFSQ0FxQnVneUJtbkFMaENJQUFUWUNKQU9JUUFRZ0JZVVVCeUFNZ3h3YmZhUVhhSmVmbU56MFpvbDN2NjBjUGVaTXBHNEhKU2prNXFJSU5nNkNHTWdsWmYvL24zRjBqT0dHRFJBMXJYZUluY0pJVWtOSEduNjlxTVJEVThaYWpqczlVYnNtdG5xbkUzdjN2cWlRbWZSUXBMa0tXNlFad2FsNnM1SVVpSk5VU1VHL093b0RZNkI2NzVPalNqa0RTU011MnBlZHB1OXZKSUxVbEpkNzA3RCtlTEhwallESTRlMXVEbkxqSEh2eHBEWEdNeWR1TExuMXF0MEZDUU95RnNKWkUxK2tKcTNUK0llN0JKRklOT0FOYmk5dlRVemhJN1c0R21VTDBsV2pUL0ZRUWkvbSsreHVQUDAyb21SSGU1cG40RGdmTlpmbitSOXo5Nzl0bUVlTmFxMVJ4UnFIVGpUUE5BMkpGRWdySGRvL250L1cvNXpiZ0dDeGlhNkVrVmlBMkZoWUdJdFJtRTFadlZVdnF0U3RiN012cmQzVzcrdDIrMFhkb1RuenpqWWJwN21TSExBQ2toTVdnQ1RMNnMwV3YwQVVvaEpmRXFFM29wUGQ1OGlrSm5LbG8rM3VhZVNIWUo2ZmNJY1hqZCtyS1VFc2FFbFRxbFVsVlJtL04rZS84aVAwTDVBS296TmxKMy85aUJ3c2hNNnY1SklVSnlrZ1QzZmRyT21xNkxjcytaK3EvWHNBWEZ4RUVpUUlVYUtvc0ZuN2N0VCs3QkJTNWRxRG9sSlh1bmJsN3J0dHpEL3YzODRMZnRKYWdGRkFMWVBFNUE3Z25NclpCaHQ0bFhxc2JaS21iZHEwVHRPbXBtZ05pdWdNMlBZQmM3M01yanE3R0xzb1hIY1RwdDl1UHZGRHo4ZU4zZytzeHJQUUF3NkRURk5wL09aSTlpaW5OaXRaaFJtcFFPQ2tkb0JkQU5qVldsYXZNaXR3RE5KWC9wWUlBa1Z3bk9QL3ZXNXh6b013N1NBRkFLVStaei9rblAvWjlqK09kZnJMOEtlMnZkS2JtcGh1eEpTdUw4RVVBZ2dISWlCSFArNDQ0RUR6djFQVFEzWWtPY09TbFRIbWo2VXNkZm8yTCsvanBZZTdJSFdjUVVnY2drcExGUjFZVFc4Q0dLUVg5YjhHRkFBQUg5dG80UkhRNkdMdkZScmk0RGl3VHpBQURETUtEUHIvZlozVi9xZGdQbWtHektURW1XRVhiN1EzdHRnVFlxbzJuUDYvKzk3WGYrRi85SkhBVnNJSWNBQ0Jad1J5a0dUN2dDUjhWb2hKY1VPT1NEamlTYkFwaE1vem0ySlJwdEJ0VVc2OVhiTkZHM0lWeTJLTG9rNDgvTGZzbTUyN0lhcUJMTXVCYk9GSXdlRlVkMDF2ZUwrWTh4V2h0emNxVG0yQ0lUYzVlTEp3U0k0ZllsTFlGSVZIQXMvL1Q1M040L1l4MWhLR1UrSFNxRXJkcFBQbnM2ZnFxV0pzTmJaYUNsUXRqbE9MVU1zaGNkb0E1VFFzczRKTGM5MFN4Q09NTVVLNEtQOU5zaHB6cFg0dnd4S0NoQ0FTUkVSRS9MS3NXUmxKd05LQWNUblhBaEV5M3IxS0hjWmEvWWRYNTg0MjAvaWFYbXRHaG9DQWlJaUFSMjN2L1A5K0tUQUNBTjVoZGtDM3hVQzRFTHNnZ3ZrUjJrckVqWVNFdjBCS1NtSENoSXZZT0NBSmtLUWd5WU1NMlFvVU16Q28xNkJKODVxQVdDQ2RIZWszQUIwT0RMMUxxMFBnVGUzaFN3MmZoaTRYaFB1ZXVRV0VINnh0SUVRQWJHMk5tNW9WNTRRRlAreUtnTzJENFQ1dC93ejJYVzkyL3JwcXBMVFNJUDhxVjl2THZPZHMwTkxXeVg1MUs2b2ZidlBaRTFwYWY3dzMxOEM5WnRocTdmMzJiZnVMNjRWWkh3NTE0WXNtNWxnZk5iZkc3Vzlsc1VBNEVHejcyM3Z4d0d6cDRmUlIrbVA4THM1QjdLQjJlREpYYzZ4d2xHNjkwMnVnN0F6TEE4TlkyMUIyZEIvUDVxZk9WOHQxb255TDVqWkREZlFJNVJnOEQ5OEZ2SHN2Y2xIdUpzcmR2c0pycGMvVHIvZ3UvRWZaSnpYVXpwV2FEajdNNytVUDgvOEVrQUFWYUFTL0NSK1hzL0pONFlhSWNPMXhIWmNVYU1NYmtscnBLeTdOZlFKS1FjVVJhZ29HbUNXK0hBNkVOdmJnMzNzbDJwSVlSbUU5YklIYjBtQTZrazZsTjVHZHlNTjVFYm1RaHhIS2x3TWdUNThjZ3c3cGRVUno3bmZNY1FmY1UzdkljelZrZHJoWDhYSHE0MDEydEZPZDdrVC9hN3A3bTgzV0E3MUY3YU85TStkanZkZDZqN2Z4bStEMVB1M3ozdWlydm11eXphNTN0cnY5M2xUYjgyUlQyS2FGVlVLTU5QMzZCdlFNQ28wR3NFZGtMOHMrekxnMUV4Yk0wTmdDV0F4Z3pmODJERzFLWE1mYzRyak5jUWZIS3hTQ3VSdUJJNUFvZERERGtHZFY4Q25WVkVtRU1haW40U2EwQVhUSTBSQk5wT1lBTFZxMWFWOXZ4SmlVekhLV0NpczZtcDBCdWt4MDY5R3I3NHNuVk5ic29DbWtWTW9wNStwREdhV3oyc0xEcjJpTnQrb1pPMGIzNllTSWpXY3h2bmxOMHgwVmhsWW9XNFVSalhYS3lMRzNZM3FvTGRFYXpIQUVFb1Z1TWwzRERlRVJWcEcvamVURVIwQ1VaRVUxbW90cUZvaXdKRktVYURGaWFjU2xCSnJFalNRS0ovQ1NGU21TS2sxNjFRbGtkS2V5U1hZenNkWEtpNkk5aWtOSk10Q1VLbE91UXFVcTFWSFQxenE2K2x6ZlFOQUlhNUpwUm92V2FFUDdaeHVObVRqTUxCWXVxM1hVVGdOZFJEZDZVcTlBMzNjYnhBenhERE9OMEl4YU5WYXhkLy9zL2FqeEFFNkpuUGJGR1prdUMzdWFOVThFc0RTTFpWbXhPajFQZDhIUXhYU3BlZGtYYXdiVzZ3Wm84KzZEcml1UUZGdzVJcHZuSmg2L1pnRkpLOTMwYUVNMlhKM3lKQjBESG9waGJxZzB1cmt2TUlnWWx0YkdSUGNka2Q3VmovTlY0cGJBYmErL0U0QmpDZzlwNVplcmkvcGRNMENHLzd0WFpOeFZFKzZiWWF2UW42dW1Xd3kzRlhmNmdnK1huQXRIRGdqa1BOaVVicXBvd3ZEVXZiUmxjajVYWkhZelY4Smk0TmwxdmpzT2hyTWF4T0h4ZUR3ZWp6L1ZJSEpYbjZIMHdoZzZxRk9FVXFRbzBXTEUwb2hMQ1RLSjB5UTVMVTl5UlFwU3BVbGZabkFTQmtXcGxDbFhvVktWNnFpYlRCdE1tUUtZWVdIVlVVZnRHSXQ2Mmxkbk1IM0VwaVUwcVZRcUhiQ0x4T1UrRTQvMVhMZkJFaHpLaGdVY2dVU2hmeHdtRHo5RzVFUkFBSEw3RkhSS1F5cm53dXhRZjVyaEhCRUJSSW9TTFVZc3pVYmM0cnRNZHBsMjZGZ2Q1NXRnUUc4eC9mQVoySnpJdkdibWxyY1hBbTN3WEthN0VsZlBjUzJ0eGZxK2VnZmlIR29ETXh5QlJLSHZ5M1NKMzBRNlY4KzZtZGZac2FGVjNlT1VLc1dNeW5raHlMMXU0VkkwTDFTSkxJeFh5WXpwTHlOcWlXejBYVHBrYVR5bjFaRHRpOTBtWTAydjB0VXF0elNDbCtxcks3ckl1djF2OVJEMHNneHFHYkpvR0dmRWtsRTFZenIyOE8xbDJLZXdYOU40QURhTjFiN0wwSWFSVFhPdXk5eWl1ODJwT3dIUUJDK3BsZENyT21LME1nL3IxdlJZRW0zREJFY2dVZWdtVXgwM0c0K3dpdFFnT2ZFUkVDVlpVWTNtNHRtRUl2d1VLVXEwR0xFMDRsSUNUdUkweVRxdEZjbEVDbEtsU2E4NldFWjNKSnZzRldpN0l4S0pPQndPaDhQaGNFVHJSTjN0RHBsTUpwTmhSSWFpcUFpR1lSZ21jYmtzeTROb3ovcm9mUUw3S2NhbE5EMEZPVzNSR1p1T0JSMnhtVk14a1Vna0RsMFg3dUppdXRTOGJOR2FFK3YvWlFPd3FlODZHSUllRXNDdW92V1lmQ3EydHZwTU9CTjdNek82OEdXWExodG1nVzJmZmVIcDFNdTdxd1g1TkR3VGtwQ1NjZWZCa3hkdmZpbkFSSVJJVWFMRmlLVVJseElBaVpFMHJWcTY1SW9VU1pVbXZlcVVNcnBzL3oxWldFWjVZQmdHQUFBQUFBQ0EwV1pzZDFDcCtIdytuMi9jT2xrNHJEcFNsMUszSHIzNmpnMUNUdHd6T2NOdUNYWU5naURZaG90SDFvZ09MUlN1eDhuaWw0cjJpWWF2MG5vcnpYdloyblpqWkxmYUtEK1ZSZ0gvZmdObXBrRmJoZ2lHaVVhY0dmWE5tSzQ5RlB2WTl0dmJjVG03NSszZmRhbVc2WVN0d2tkemFDSFpjdnEwQ1M0aVU1Wm1OeExYR0JlL3JRb0hqTVAxL1FFR1ZNWkZKZ2JEREovNVQzZXlCY3ZHUFNxVGltSmNDK1lRVWpxR3YybkM3cTNuQjBET3F2MkczVnZsSWhLSVc4TVJTQlM2eVpUaU5HRlgrUkdDREhzOFBZSWRUamRBVUF5dlFrd1NDcHBoTmQyMG1wdU1qUVhLQlFrV0lqUXBtSlJVS1l4S1hjTERjNmtJZkhhVEthT01TYzRNc1ZSWVEwZXpVNkZMcFZ1UDN0TEh1d3ByWWZ0aGl3aUhGQVdrU3BtV1J0KzZuSjZVMThDdXlKODVqMngwYjBkN045cGlicTBsYjROblUrcE83dEVVTGloZFVPMmhycHRnWVhDc3hCRkEzbFEybm1GYzNGYlJqR0JnQ2Q2QlVIN3FuWEJiYWNqc0s5OVJmSURNQUZrQnNvTytuWmc4UDBCQmdNSUF0UUVhbjlXUUVzOU1BSE5HODU1NHdhK0FybnF2VFRqcEdTN2UvaWxQbWpBUlBtbnN4V2tkQUFSeU9MOXlBaHlteDdTR0tsazdHaDQ4dkR2TmZkZytJVEJacEQ5Z3pnTUlCd3dCazV0bWtFWElxcU1NYUVUZy9IVWUyNm9MVFRwNHc0ZzlVa1o1YmdieEVIdEN5VExZUEhtSlVxM3VKcHF6dlNOY3VtYkJkWFlRc2t1MUM5Mk44alR2REZFVTBydjgxN2dtcXNHalBmUnVOanZlclREbUhDRTRxK3Fiek9qdUlJdlJhRGh6WjEvVkpVcGhoaU9RS0hRd3NaNVRqZ3VBQjhDdUtyK1lJTUtld0lvTU81eHg5ZTRBRUJURFNZcG0yT1R5OG9Jb3lZb2FqZWpVUWI4SndEL1hCNWlTc3dVaWdoQXNSR2hTMENnekp6WE1DVFUxWEVaSGFUQVhUQ1FTaWNYYlk0VkNvUmdMRXhzdGxkQ3R4WjFhVW5sdXRHaHRPUXQxOC9SVWRWcGtEQnZiUzRuRW9ORm9OQnFORmlkWG4wV0pMSkNyVThDVWJxcU1oWkdwbStGOEViQklVYUxGaUtVUmx4S0VFaVZWTFZOeVJncFNwVW12dWdBWmhBR2x5cFNyVUtsS3RicG1BNndyUUxjZXZmcWFFN0RUV3M2WUhtMEUyZGNsaVdXc1dFM25tUzdHNWI2dUdWblBuTnV5eVdiSHd4RGpwV2s2TStqMjBlWU1MUS8wM1ZNbUttNFpuZ2xKU01tNDgrREppemUvS3JkQ2tWTWxLc3lJbW1lWmYwR1F5d0pCRUZ4Qy9yZ2dDSUlnQ0lJejkwYkRFd01UajhmakFVQXhkUzZWc0RjczFnOHdmWUNYck5kOThTSDhnYWprNXZ1VVBxZzRYRFA5Sm03b0dXdkdYeFNkRUxMZnJzRVNFc21XWFRjTTNjTHRIRlNHYlNIQkFqY0NpVUlYSnFIbk1sT0xSQkxhc25VSzJTdXgxenFuTUIvWk1HT3gvelB1OG9oREFEQUFPQUFDQUFtQUFrQURZSGdsQ2tDdUxWQWlTSUtGQ1Awa2hXTktQRlV3YmR5TCtzREJ5ZWdrYUoyV0VNdFdyRTYvNHZwVzdHNmU0bUR3MEJmeFpoRnQ5R3ZmaFBFQW15ZDRjTXRVcXNQbDRheTdHdWFrNXQwTjUyT093SmFCZ1NOSHNrMk5oN3FFV1pZVnE4ZStrc3hqajNFS1NYZzhMTmlsUXFGUXpFMWZ2NXR2cFFRRnRGSW15THRpdlRlV2tRQ2s1WlJlMlFpSjJackxZRFY4Nk1CWVdYNXhBUHVuazF5bnRaMng2YWJOcmlYQXNoV3JjZmtVNjN5L2ovbStnbnpOOEkzWXR4emZDZU9pQVBpN1loMXdCQktGenM3MldybGlmV2IzbitzT21rU2l6WEhUWHBtdkFuT2dlYSs3UzhGMUVIUDhuVTRJbkZZNFE1bVdwM0JBTGxlc2E3Qno0RnVPYkU0RVhSbml5azhodENPaWs4dmxjc1dZSUtyNC9jSE0zWFhJY2N5T0RzQlhIOVIzTklCalVzZDFmaWRqMGlpbkg1cmlaZlVPRFRpRlF1bHplYXg3K2pIWlZ5eGYzOFUzeExkcitVN3U0M0g1OUtlZ0s5NUp2d3Z5cW4zSWd4THlVRzJZNFFna0N2MUJURCtJdkNNUE1nMGxWWVJCblNJUWthSkVpeEZMSXk0bENDVDJobTBzRUFnRUpURHJxYjRnSjJKWW96U1VLVmVoVXBYcWJOclorWmhlamIrNXJIckd6Y2NMUWhKU011NDhlUExpemEvS3pRbk1DRUt3RUtGSllZR3lOeUsxbHRKVS9KNldtRnhVcUxzSW5YU3MzNHM0QUpuVE5QOUpWODFaVzA4YndveHdqTW9HZysxZ1BQeHdBTWVaa0JFRStWc3Vwc3hvOWNXUzVpdm5hU1VwRkpRMVRFYnRleUtqTUFMbFNRaDZSSzNnQ0NRSzNlUVU0amJFQzd1cS9BeUNESHVDQlFUc2NNYlZ1d01VQkJURFE5eVFGTTJ3eVJueUVTeEtzcUpHVTNSaUVEUFhMOURaNUY0SXBBdVNZQ0ZDazhJR1pWTUZDZE9rTHVFMUlLVkZsR2d4WW1uRU5lTkJDVlNKa25KRWorU01GRW1WSnIzcW1ES0l6R2xrU2JiZDlITGsxZngrM2UrVkNwbUtvaGdseVVCVnFreTVDcFdxVktjYVVHM1VsZnBva01iYXhOQXNMVnExYVU5R0lsT2Z2SmxNcHBqSlpESmJSanRhTldrL3J6V29NSUlhTldlc2F1dDAzeU1PMlB4SUk2TUJFOTFxZm9EeXhDU3dnQ09RS0hTVDZRVnVEaDVoRlhscHRyZ01qeUJLc3FJYUwxN0djZGtBNThBOGdDWS8zMlBMYndrbkNRQkFObXRDdzZOb0JyVklxemJ0T1VzV1U0MDVsQ3daMXREeDVwMW83VEVkSkJnU0dMNzc3QkVqbzk0YW85b2p0SzlidjUvaEFNOFJhNDZTamdtZGVMek5ETWhpVUhudTdRbUREQlorSVVGaVRjSm9IY2xJa1NwTittWkdjVGNINUljQnBjcVVSMFdvVktVNjZxWjN1c2VnRjNtbitiRmxyaXE5Qm1tblY3UGI3RzBSdENhc093S1FaRWdoNDg2REp5L2UvSjZKcnoycnZ6MTE4UGs4UHAvUDV5LzlOUEppcjlnSnd5bEtyVXk1Q3BXcVZFZmRWRk50aHJXZ1ZadjJaSVNZZXJlQm9KZEhLZWFlZzBKN1VCZXFSOFNPMWFuM3BGQU1LTHdJdFZTSisrRm1uaUhFc0ZFUVcrcGVrb001SHFmNTBseEJMTHY5ekNNQVpUUFExN245WDVrSEZYN2M2UTJKdmIrS1NJc1NMVVlzamJobXZKRUVXeExISkRYTVNLNUlrVlJwMHF1T0lLT0x6R2xrU2JiZDlITGt5VmVnTUJXNVVLd2tHV3dwVmFaY2hVcFZxcU9tajlwNXFsTlQzLy8xeHNpQVJDS1JTQUJBQlFEQWdFQWdFRjRrY0hQQTR5L2YybTdZR281QW90Q1ZTU0lhVGVWR0ZBQWx4MVJJWlJ2R2M1ajBKSWVvY3h6enBLdGNheWN4STFoU3lWKzYxL0dDd3V6QU1mUU13NkxUS2Q4b3NGQWNyTlZEUEllRnM2TEhGeGxOeXRpZURqYjhHT1FRYmhTSXRqMDJnSWc4T1ZiVWZnRi9HdGthQ3NNTVJ5QlI2RDU1bWNQakxiWWtJOEowd0p3WGYvTTFubzlkalRWZFdocGlENE1qa0NqMEdZWTZrWTFONVE0RUtnVWhXSWpRcE5DamJLb1NDTk9pWG9aYlZGOS96c0xkR1lHZ1ZiTXp3Snd6OCttcVUyc2pZMUJyY2psM2ZHL3NmejZxN29nMlkzNHZmcGRVaGUvQ1oySEg4eUFBL3hROEQzbXlBSUROQVZzQ0FKYlpueGkyY0g1czJjUkp3VmFPbTJXV3N0UEdaeFlaQTFLSVI3bXQzQXpBbXRrRlVJNWlsRGNBbTJRd29qRlhCNnIzSXNCeVZxNWwrdE5hYmN0ckYrUXJBUStsa2lVV3ppSEdLV2M1dTFGVWRNS01obnhpeG5BVTRsa2FBbm8vbmh1U2NFbkhyUTZRRWRvUjJGSVE0R0ZuWUhrZkJnSlR3Tmw0MnJRSDdkVjZJQkt4NEdESVBUU1BBdFlIY3VhL1V6ZVAxZXBaSk5hdE9BU3FGRVFrWUNXU2pLb21jdko0US9sWW1SNmJXaUVXV1ZJRkFOYUlUT1Z3MlpWSHpyNU16Qy8waS9EMWt3RVdWRC96VDliNkRHNjMyaUs0VXFDN1RQMlVOYm5rRVk4NjRYWWlLbFcrQlMzRlVLeEhEUVlvKzhCOXl6MXc0aDA3QmE0UWtrekwwTEdKR0lyclorY05YdUIzUHc2Y2VkcEFNVTZHelJRcURXN250QitjV2lzRnlvM1dDbVFqTDBNbVhvQnFOV1JGSVpJN2dEWGh0U2N0OExwQmZrSHNSUTZYcFZmSVJ2WkJVOHA4NUY0aEg4RUtueG1FWW11K0s2Y1lZM2dRZTErL1R6SkFJUkYxY0t2Tm1uMlEwTThhT1dzWGpUOWp2QkNyNTIxeHF0V1ZJNmFwTHBlaEtjeFp1VzlCV0xKM1FHcWY5SlRpdXZ2VTB3ZGdody84SUJSSVgxVnVOUXlzQnFTdFZOUFhaRHRMK05pdmN3aTFQZ0QvNU8wb3ltMkorNzhvbjByeGdBOU9DbGEwZ04wSkVQSFkvWVA0bmhJYXdiRUoySGxVblI5RGJ6ZldNUEF2eGtydEExNHg2anJBbVlVY2dSZlJsWm5uWXhzMnkrb3dMRHdrUzJWazNkZmpBQVVWSUpld0QwNnR6K0F1dzZwSXF4VGw0ZG1qb0dsWVFYRE1iMzFGSlBzKzY3ajlSTmdzSFlnd3dPY1l0dWZLNlZoQ0xNdWM0TkZUYnY5cEVRakZOak5yMExXQUpCM1hHSG00eDduQlJmWG1IUWhRMGJ6cW1PdFZUbnllUzZ4MUhiQy9hcmovWGUvN3FNT2w3TTBlVW5EUGdoeWlzRjhxSW9GYmhmRWdxeUQ0bzNvMks1UkxyTUpZQ2FDNWdySHd1cEROc1ZvWEZJMys5V1lQYTFsd3ZPcDkxZnZhbkdob21KaXA5N3VwTkhtT0greWIxK2hMSXBkZHIyMVJpQTEzSmliNzlrNnBUQjNkRkFvNzE0cFExeVJaYlRYTXlkQTdtUUU5UkZHaEwvT3hySGpkUm5vMFhkZjl5RWUwblhGZk9lcnpZK0RPM2ZpQldCRk1BbXFGYk9lZ2tBcVhUVm81ZlM2NnlPSVZsTENTZGNwNjh1ZTR5SmVsaFVQdFU2Vm0yam5OQVBxd1dhTm5udjF3N0pQNnhRWmF3U0lQbE9GTUVVR3V6UENCYjJkSlV5Z1k2UTl3cjZKVWpKcjZOWmNiRVl3TC9jeFpmZWM4MkxPc01LNDl4WDYyOFA4TnEzVERFY0lBUFp3d2hMdzU4aFBLazVKU29EQkpnaVRMRVN0UEE1MG03U3FZbU5TeDZGTnYwaVNqVTA0em1UYk5ZczRDcXpmSmZsbUMvWVpKZ05Cd0RBYUJpOGVCSFQ1SEFrNElRa0t1UkVSMmNlSENqU3RYWWhKZU1ONjhFZno0d2Zqekp4RWdnSlNjbkV5Z1VBd2xKWGRoMUp5RUMrY2hnZ1lwVGh4S3ZIaDJFaVJ5bGlTSnAyVHBLRG82VzJUSXNGV21URjZ5NUVEeTVFTUtGUEJXcUJCZmtSSUNCbFZvMWFwUmF0U3lVNmZPVnZYcStXalF3RmVUSm42YXRlTXdNZkZuMGNGZXAwNEJ1blRab2xzM3BFY1B2bDY5a0Q1OStDWk4ydWFVVTRST080MXIyalN1T2ZOMldyQkE2RTB5Wk1rTTRidzVod3NXbkM1YWNyaGt4ZW15Tlpzck50eXUydks0WnNkdHpaN0hPc3dHRXd1aGtSaU03VGc0RUM0ZW5CMW5pSkFRYm91ZEVCR1JIVnlJSVJMZWNENThJWDc4NFB6NVF3SUUyRWxPVHFRUlhIQVExNlU0aEM3Z2dDRUFnMFlBQndvS0RydUVsNitHcWJGTlBMV0dBeERBMisybVVTTk9pQmc3dDBTa1MzMW94ZU1ranJGbjJJSWpKempNU1VoT3Vra29FSlNpanlHZ3gySWEvOVpjMDNiK244K2dxa2dTMjhzNzU2Y2pVcDN6d1RyK1JQZTZTZXJsVWRUNWFldWdlL0FIZ0J6OUY0aW53RThxK0g0T3ZJVzM5RmJlV3J5L0JxTXZ2L0tTdXBpOUhrclZlZkc1WjRJYXZmanlXeStwNHNWWHloZVZUNW54SXEvemJ2YmpvcVhYMVplMGhqMEFZRk1RWnMyQmtBZ0ZJR0Z3eEhZTkI5WGRhbXdyM3M3L0NJZmdZWmlmaFQ5Z2ExMHl3dHpkWlkvaGNuZVRZYS9raXo4S0NCb3JoRlo0ZzFsWEJHR1dLQTc1MkVsSWQ5YUxLNFNGTmRWMzI5Ykc3UklJS1U0R0V2aGpyOExVMXdqQTIzczlCbWdiR2pROTdvVUt3cWlPdnlQWkVSSUNLSXpBNldUcFdRd1Y2b0psZTNWVGxqNVR5UEtPam00TmJ2T2cvVDlHVmZ4TkE5aEZoUURTdy9mUmpwQ0YyVzhPQTY4aUN5VCtmMkgvREc4QzZlK20xeC9JSTg3OU5BMzVyd0FBNjhRV0FZZ2xUVEFzWUFDRXFlTis2bXkzd1lvQTRGK2pOb1djTlM4T2lhalFRUDd5TUZhd0lqUVJnU1VNTEkwUTduMVJBWDZSRjhZS0lJSlVvWjN5Z0MrUTJRb3NDa3RPNWx1TUhHVWFFM2VMZThWajBocXBXQXBJRWFsT2FwRzZyZFcrN3FSQUZjQ2VZaWtBNEJQVHNMaC93VVdmT2J4OVI2VThxZkE0U0tuNWc3WUNYQVNRQ1FCWU4za0EvLzFOMWYvazZTLzBZLzFvQnI3NEdYeHgrMk5mMHUrLzdndnFDL0x6ejBFZjlPUkJxam4xUGdMb1pROGIrMVowYzhnTi9sLzJEV2ZObWZLcFgxMDM3ejJMeG4zbHRCWFRiRTVaOElQdmZHL0dKb1NEeTQ2QU14WTJEZ0VoRVRFSkdTVU1Ub1dncGtjeE1ESjcyNFIzL2VIMThTQ0NTNElreVhReVpNcVNyMENoSXNVTWF0U3AxNkJKTXlNVE00dE9iL25OVzM3eXZ2LzUyT2MrOFlYZi9Uc3UzTExNZVQ5YmRYdDJjTmV2WHZMeWFQakZEVStOZ1JjTnVPQjFyM25ETEJJR1J5TlFHRHhPeWptb1ZJT0xoNitVR0F3QWtvUDh3Sk9PaGhiSkJOVXZocFVOTFpxRFU2SjBLVktseWJPYlhnNnRFaFZLbGFsUzdsdVYyclZvMWNhcVZnZHZuYU1RQ2N1V1hISFY1Y2k0V1VRbVVtVTBNTUFtdGdRc0JTenRGM1JiQkJld0ZJQXc1bDQxaWpjYkJtUXA2eTNBRU50ODJkQWt3anhuejdQNzhWVVVEQi9WbXVBZCt4NTZjUCsrdlh2R1JrZUdoMVlzWDdaMHllakk4T0tiRnkxY01EUTRNSC9lM0RteisvdDZlN3E3T2p2YTIzS3RMZGxNT3BWc2JtcmNnV0EwN1BjZWZlVGhoN3FkZHF2WnVQK3VkRzIxbHNUQVArZno2ZHIxbW9wKzBMSjFURWdnUzZDdXZDNW95QWl1YjAxM1lQTUxiWXpUYk9EQVRYNVlFaVl5Y3BVNUlWY1BmSkRsSitvT3Vkc3ZMT1V5Q0hBMGVwU2hSZDRkdUg0S2dFcE1FT1daR2I1RUZjTWpWSmtCVUJVQlJaa0EyWktOUnNBTjErMTB4Szh0aTVMdnU5Q1FPY1p3eG9idFZKWVNOWVNGSTMvZXp3aUxKZFFFbFZBVnFiRmZWajdHRllLVXdpTDJNOWNTZGdObThMSGNzQUlsdjN0K3BUemlrZ2pTOExobnBSQTR5RHBiTzdCY2VraExJUnR5cnNvM2hPRmJpVTI5RmdtS1k1SjgyeFJkOHF5bHNGV2tFSC9iYW44bG5EdjNaeTVlNERWR2laM09RUkRCRDQ2NFhuV1Rtb0ZEUjUydVhKa3psZnlDUk4wakZVTGVxWlZMTlFFWG1WRWxEb3RaTk9maXpRNFJMYmkwSzNWZlFpdU9LT0VTTUZUdjEzVHZpNkNWeVU3V3hNbUtXM1VidERtbkkxN3lYM0hjbndqZ29mb1U0bWFTVWxMbklQb2Qwdzh5djY2b1dJTWRTaUdQVXYydGdtQTRFZGExMEZybnRRbS9lbHRoZnd1aEFIV0tzK0pzLzN6cXRUeFNmY1pkV3ZNQmtFa28yT1dkNWg4VnhrbDF3UTB0V3FmWHhqbmJYVHdEdzVvbVdaNXFkdkhJRGJLWXh5Zzk3MHBKdnpBejhuMzVPTFJrZlNiZERUcFpnTk05bFFKbTJpVTMvSDBuZ3h2SDI5ZEFlWTJRRFF2eFo0elNocFFiaEFqQm13VmJJN0Y3SXZKN2tpTjFGSkdXTnVBbjB6TUV5UmwwaDJOMTdKQ0tpZ0NQS2Z5OW5ITk90enduSXp3bWd1dlpaL1RNQmNRbEhBZnc1RXhIRHNYR3VGdVNlbzN5Q0puWlJiM1c3VWYzYU5aNzNFWUs3a09TbFZKc3dZWXlKQ3RjR00xR3JqOThjbkhoa0ZtdTdQZE93bjFXelIwaHhUblJVOGFCSm14cUg5d1FJSWMvZlVXQkhqOHFySVNqYk8yaFBXN2xSSWFvREpwS3A2V3JWSGIwb2w1TG5LTHlGajJUSGdteTk2QXBaNi9scTFpTlBZOHZ3REt6NWdzK0UvQ1pJQ1B3Y2FjcWNuUmlyMVJ6UHNuQ2dRVmFnNVVNcktHSjZ5NCt5UFlaSTd5aktUSktTVU40b1VUN0dUZGl4TzBEa2ZjVFVkbWthQnpxUGJpNVNpS2ZKYUpEREtZMVpsMTJ1MVJBT2t3U3A3ekhuNlFrYWlwTkxyNkUwcEhnbUlRME8zeEJuV1N5WTIwY3VIMnpXWXhOUTN3Mm1Gd1A4eGs1Y0tlRHNkVWFrS2xMSE5KRzhzNXh6eWhOdHRFQmlSRE5Rc2NDbDJ2MlpBbjFDaXR4TUVqTE13RzlwMWREdGRxaXdKVE5DZkxTcVJTMEF0VnVxUVBJc1FDUlpJbTh4NjZJTndwVENNSkMydllIck5NV013NVR4SjRWaTRIZ1JSb2tpZ0ZLUFRwbjQ1SllneHFoMGJvcWd1SFA2SWdrUVRLVlBwOUJtQ3R5U09KZDZieUUwbFExZG5rdGxjaUdVbXBRTzl0Qm42QUJSQnZZYmgvb1hhcG5DQzc1R0dJeGw4VytaWk9qb0hVaHU3TkMyNVVKb0xkb3ZDMVZvQWkyRkFYcCtNNE4xRHlBelVVamVTdjV3RzdaYmY5RWNUNmpNYnNKMUJwWS9KdG9sN04wanBRaGdMaGNZZlllVVoyQlhxR1VIODVROFJSdHoyZlFkbnpubGxCMThkQ0RNM0JNMFJWbUxYR1BGVlJqRWRRaExQOURpSnZwTnpvVUF2ZWc5WkFMZklqVFZiNGV0NXZQTTlBVVZDMTFKWUJNeUVwSm9MYXdIVnMzQTBDTkQwY2cyL3huWEpOK0lKVzRBS2YxR1NVYTNWQmN1TXJYbFVZVHVnWm9PelBmV0tSdWM4cVlNbWxPTUt3bDd4MGtLdHN3bGYyWlJzcmoxaGcyeXpxQmFQbEFhTWxrUkM3ekc0V2FIYzhBQnJseTBtRFZnUGhLZzYwS0lHc2xuMUZGUUdvQkhZMVRHdjlLZ0pwM1ZvbzNPQkl1QTQ4NW9yaDBjME5HMkxYNnlTQTlzR2NCYW4yUWhvYmduaUo2RmV0dUtTSFhMcDVlY04xRmkxbzNNZ01tS2R3MElyRmhqODFLaVVMRHZSSkRJNUtTVWxLQUZJS3hWekN1Z1V4WHBHZ1pmQWdQRUU5ME5lekt6cHh2SGJQVFZxMmRPYXE4NDJFTjl1eVR6SzJGWXQrV2RRWkRlNFViZUIxOHN3dmxRVUNpRnJiTCt5QzdXcWx6Wk9VYjJWcFlRWnUxbVBVa1QyWHk3MjZOajBncFVtb0VXSWVyL0ZKa2drZ2JBQUw0RGgvMGxvNUpEQk1DN2tnMER0elBvZ0YwSzdMV0xYUjA2UEVOMG9vSEgxbHVlSmtRRFBJV1U2TVpPNkxhMnNndW5GNTA4QzJsWUdaUGxjeDJYSjF0dVhGYnJlNTFDSVVXU2hiNGZvajZMZ0djbWxnK1VDaVNpeGNIOXJKNlRUSmRBQzI0QXBHYnNhNWhhL05JcitoOUllYVhJQ2ladThDNEpMeldUN2dLWVQ3NjM5K0FBakxscHBkWEFMYm10L3pjZFo4bmZJL3N3WE5iWmR3OW1SMVNPN0lmZ1pLQy80TUN3cEN3NXNEMWo0MHdJdWJkdHBCTmNzVkhtdVVQdmhha3N4TTlGOEJMa3NRMzZNL0JPSkFRdDhUQkJTVWJTb2p3SzMyRVliZVFyenVZR2E5bldGaE9LVGxRQnc5Q0ZqOWpURzRKM05nRHZldUFnMVVPaGI0S0FwOXBIZ2FNSktiMFNsb0w3RG9kSHNManB0WGhrdk9hYW9lMENIakRVNnRrS0NCNDJnWkp6UkRjUG8yeE5lSnJaRHhjWGVWM1YyOEp3azBISmhVMDhMdEdEUU1xS09QM1RHb0FJNlluYkVrUndEUmszTzRraTYxSW5xVDgxMnhLYmlpb0JNR0U1RExwTUtyaU9wb3ZGTHRiSWU5eHFNcS9TVFlzeTBaUUY1eWFaYXZwL2ErSDd1YkRucFNzaUJ3SkZhZ0JNaTd3VldjN1VIcWxtdzNmY0x2dm1uVlJTRllSUUVuZ3huSHZ1eDhRMUNWN0FJQXVBSURkQUgxQStMd2crZ0hnUDRDOVFMZ0JBTmFldk9Ud29xTUhVb05nbVZtRXlESTdMcnhMSERYWEVrN1pBTUk5ek9iR3lDR0RiazZHNVVnblRwUGMzK2paUU1qWUdVeXVOWGcrTS9UaWJJMmNCeGdKd2tiMGJnaTRmWmY1QUJDV1Q3QkRTTThZZVMvSjhubzRJc3hRWWs1MXdaS200NENqdzZwVGZRalhqVUx2OWVqUE9WS0ozUGhTMmlJZnVsQUs2c01MdXpZNU9uL2JIemhaRE4yR2FQaDQ2NlpMVVVaRW1XSjNYUkcrOEErdjVZT09sRklNUkZCNCtMald5dVN1U09lcDNxclBXck5Cb1J2R0RXYmdxY3U5NzE1a1h6MkJFTUZVWlhmaHZMOVVEL091bTY0d3o4MUlrc1NYdlp1SU9xY1lSQ3B0K0RVaWdzdUUzUTdidmc4ejlxRXpmOG1mZUhGbjU1c0pSVXVMWXhRM2ZNSFp1Tzd2aGs4TTA5MVF4TEJaMVNlMmlRTlYwZGpFdUNGVGJueWplYXFOV3REVU9icUplSnNCdW5JUTdQS1dxdkhQUEZ4RVhUTUtSamZBRGMrTTliNzVXaXRLZU4yVFR3UE1iMFBBOXEyRlVVR1NhTGhzbGpEQVVBTU1MZEtZUUhWamN3cGdZS293YVVRQzE2cnJoeEJEUlUvYVpnYkVvVXMrQTEwVHhrc25rU0xqWmF5eVJhK1BoS0tOakJUOExvU3FycUJHaXFHU1JpRjVUQkM3aDUzQ2lvZUY0V0ZNVjF6SzVqRFBvYmpIZ1A1YTlzQkREMWlPODRXY0w5NENvNUVkY0lrSGxOZkp0Zm1tQUV0K0FwMUphdHc3djVMeGJTVTNtZUtDV3MxM2NvZFFVWWxKVnYrOHRtdXJBR29FMW5wTWhaZXhUTG9QTDBrZzdVZXkyTUxFdXZNMHk0NUtsd0dsV3hBaG5IZk5qWmFXTmNNNnJKYk1pbWkwK3N6djlCQnFPdXRmUFZFakhqSWJOZDVwYWFObWJIM0ZMSnZpMXRsT3hOc290ZGlPd1Q5bmVQTzcrZVNHRkZUejBUYWQ5WWRtQS9wSjhxRmE1Z3NmYW9pc3c2MUFudDhPdmorMjQyV0szUlZyK2N5T0NHVFhUWjdacTN5SEpRTFIrcWZ1U2JnUGw0VW9Vbm5GTXFsdUg5QVA4UmlPMWthbHN4ZWVIWG5rdU5JZTkrNjA2emloMXM4T0s4NmVrTXI2cXNCczhydVVxNnhGSDBnVWZWc09ZYW4zV1N0QVJmN0Y1MHY2d2R1S2IwWXYyYnNwMnZDd1NxRmFNQXJySUx2WVYwcXgvVHM2Y0Q5L1Iwdm1iN3ErVWo0UUpESGZMd3FhMUwyWVNhS2U2b2NXWFQ2RWgrVnd1YVJ5SHNwTHRpVU1lZnBKUlVZSXZkT3A1WUYrL01oZ0JCMnBmd0dqa0tjY2Yrd1NJK0JWek9YTEdnMWN4VzREVmY5SE9hYUhpU3MwL1IzZGZTaThoZEZ4WWg3TXdsRi9qeWh3RGFnRi9DZTJ6MGh3d0Y0WDVKYkRzRkp1QXdNME5xdGpzR01EQ1Y2R0sxOWhqVUFEYlJON3lHZGhPaDh1d0hMMzBHenF5bG1jdjdhSWc3UW9selBuTHdyYmpjTnYzNlhLYUZaejRpOFBWSGhlUTNvUXBhcUxKREkzU0RrRVhMSE1DSlRaYVBLeWZRVFVXcjg2cUhjVzZaVGU1b003dmF0TkRYa0ZsY2tVUDZHU1VRaFZXaXRGMlc3MTlmUE9aSGU3ZzhXcjdGbTI0eThoSGtUbVJnVjd2alBSWFBxNGREODBhMGFaZzQzZkJWNXRXdnZJNkFCWU9nZkd1dGk4aS9rcXhRdUxFR29HMW81ZlRtbTZuc1dacmRsdUUyYnIwTGdrZFNoN0YxTVM1cEQwRFpEdzhVaXRXS0ZtdXN4MkgyMXhEL2JtN3h4czhPSDFsaVlKU1Z3NFl1andoeFMzMEJ3MjVCN2FDYkd0Z0haVUxJbTZ1ZWF0eGV5cHJWa3ErbEZuQm1SVkFkMm9VVDVDVjZQTGtYWDRrYUtiZGdUbUZoamVzby9LakM4SW1sZ2JMeXJHSzM4UzdKanF0MUU1YUNNaVhvd2ErVVBneTNiSjU2ZG9ISWd4UFBnYndKcmRXdGxPR0o3TUNOKzA1aTZWN1VtamlqaFNtSS9lb2RYakkyV3hRSGphbWZWT1NQeW5XRHQ1OGJveTh5dkxONHE5M0pocEw1cFdCblJHNmxhYTFwRVY1bS91SUFwUk43UlhuVGpJcm1uQTJzSGtacEdjRzZ5czZaZVdYejZkOG5UVGZ0WmhRT2JhQlhtTFZNVnFaa2dOREZnRGk2WGxUWW05Y1UyV1lqcHpTU0ZBU0J0cXFzU29saVVQS1VmYkFEMStwaWJXWjV5YVl6aS9mbVdzSFJYaWNqLzlOcDBaemZpWnRKMzExMWVkZ2ZBdFg4VyttbXYyNTFkZkV3RkF0cUc4dHoyeUR6TGlEdHZhYmVyVytKcU5iaEN4dFNnck02cTRzbFRKUzQxeGFDcEJHaHBwRHJyaVFRV1Y3TmdkajRGNmhTVWptb0xTQnN0WlRkdmRmaEFZbnJCalVpem0rZ3dWdTh6cWhzV2IzeC9GKzVYRVVEVVRRWFFDeHdkSHh5NXZpNllIbnMyOFVpSmgwbjd4SVdDMzVsMnNHVlFxU0xIZjFDTjdnQ1FLa2VHZ1I4YVRXcVcvQmxmNUtDQVFnVG11TEN4TXpSampMSXNSNFFnM1ZqbzYrYXZYdG1zQ0pvWk1Pa2NiekYxS09IR0Q3Wkd5a2xjV014c2VpRHNTbVV3Q1NSYnhNK09NVllneEtnd3ZSNVpOTUNSNDFPUXVIc3p1UTErYTcrdWYzZ01lUDNHUkdYSE0wR09kYkdoZmY3eklhUkVCK094dlRoMDk4QnMzZi9EQVkzcG9EeXJRVXU2VEVIeVVoNWR0Y2ljK09DaFFGamVGK1JEejR0dnFkRDlGdE9DaUEya2ZJSHZlazJQTFJmdEFPOGR4WXU0ZTBMaXo3V0J5eSt3RHhYNlpHdXJaYWJydXpHeldvTyttQytaRmtuR3NLVHVMek5IQ0pDNUg4Z1V6RnM1M1dyQlZNZ0szSWxPQkZML0JFUVdtOWpUbWNSOFVFazBMSi9RRU1EZmdQSFRaQ3FxV0Yvb0tlZXY0VVI0cUdWVVM1enhCME5meXJRZG5UOHdmZEVhTHRwY2ozSmg0RmEvR1Q2WWM1WnVBaTJEanV3YytJYituT0k3dzZNYXFPK0N2S2EwanphZWY0RHFRb2VVSUFrZGttNXU1blBPN1ptd1R6QUE1VlVmeG91UzJHRkFJTUFoQTFTK2ZZWVZJcFBjWGlGTEZDam1nZU9Fd0FVZERJSHc2MFBncEpORDJPRlJGYndJTUVheGhwS1dXNzJYN2xtdzhPWVdPRncyZFpzbjJkTnY4SnArZkZJNFpobVQ5d1pjWmE5Z1N1QUJUcnU4aHc1azBtZUNqN1NzZTlkS2dnSlBSUmdVc2VVVkhhayt4eDhNUTFGR0RoTXFhdWxtblBMbkF0RFlBQ1M5T1c2SmV4ZTFGKzR3OXZKa3o1VXgrcWdXODVqa3h3enc1d1dBVzVtSFp5ZnpPUmJOTXpDT2M1amRWcGhac1Vwc2UrcEdnUnB4bVo0K1o4OWk5cE8zeHhoZzVSaCsvNGJVQ2pFcGg2ME9QMS9HV1pyV29yaTdhWld1UWkrTFpKd1lwMGJOTWVmWmh3eDQ5OWluNkZKY0FLNERtQUdUSWlGV0p4RFR6d2xIZnpmemF2UVlkNHlZTXlEU1lQQ0xObUpDenVGRmJwbzVFdWlpUVpKbVFsckl6a0V4QkdtS3AyTFRqaWtpUHNLZlB2RjJKZEQ0djFFL3MyZTI2c3hnQ3J1Q0I2TXlaTGJzSVAyVGQ5dW5NN3Jzc3RQMkg2RkJnVWxPQjYwQy96WTRxM1F5MHBybmNBUzdKWk04MTJ5WWRKWkw0NGdJRE51NDYyWVJhVHp5NUhLcTdManhqRk9jYnhhWFpwQjByYlpiVVBUT2IvN3F4a2ZUUE9nWi9kS0tSZ0d6N2JmSXNvUTBEeHYzejk4M0xONFlvdm9hYm1OWjJuak9LSG5aOXNSZFRHakpxeElPWU1pZG5Kd1JaRHBrVDIycHBrZElVTlhGU0JoWEtIR3VCaCtobDMrajViU3IyWE1PN1NCM1ZLYVgyQmpyT01tMTRxK1JzT0dCSHN3WUZOcitrWUx6cUFNMDNuakI5OUdqcWprYUR4TWZPYU5yVzZFOVZNbEJpbFRWeGNXUmlBSmV2L1ArVDRhNE5iWXFFc2tkc1M0YTRyVktMS1FKTkJKUUZiU3JmanRCbU1vRVVLU3ZqZkFsQWxZVGpTMFJoMU5IVXRNV0hXNEZuMzBZVTBJNEk5QVBVOXJ3dHVOK2JlbmxTY3RpRVRSWW00ZzRqN3Q0QUpKR29jZW9rT1JnUU04ejBmSDlOTExhU1FSRThXY0M0RmZrYXNDYlpoWDZrNHNTYkdYTk5MZEl2bVFIT0JHb0dWNHRnTkswczkzeGZBdnJpN2VtTUFoYVVnY0dJeXlmZmVYU3BiSGc5L2Q4bTk1dTgvdCtUdTcvdCs3YTRUeC9zby9lNU5Qd3pzcHZLUnJOVGoxenAvay9iL3pYMm9FLy8vMlNXZStOcXZnbVJkVTBhS2p3Ukl2MTZwRTVGVWVuemIzbzc1QWpnSEVPa0lGOStHWEk5ZkVOWUtIOWNSa1B5cVExR2hQWFMrTExHbm1YMmVHNTlrNVRadXlyRlhNOURtVDdLbDRMbW1SellZTGk1UjJmRGtzS0liZkM1cmt4Z0FEYjZSMnVUZmVvMS9KYUpQNFoydFFidjc1aWJ1Rzl2UWErb00rWGF1aUthSFpzOTFySXlRVytyQm1Jb2d2NFlFemgzMTlmZHQ2ZWdyODY1ZFdWNTY0ckorSlNLK0c3aVUrSWViai9lTHhmSTloRlhPdkV4Y1ZkTkM5NVN4eDBwOUkvYVV6MmFWWXhYdmFxNWE5amltNzJtU2Nic0F6MkxhME9PYnIwdkNROVlIZGhBcExsWGEvV011b3crYy8rcVZ2MER5cU1wWExKbWZFTFg4RWFEYnUxeHYrRVd0SkJ2b29UMGEra1cyT2xtNDJZM0FrUm1EUVlYNlByalpXdjkycEprVUJOaVg2Z28yZExoZThZakVRTzF3eXFjdi9QMmoydWk1SDJQeXl0T2QzSk9BTTd1MUUyMi9GcW5mVVJyZHZiMDRpN29YNE5EcnlmSkxSb3VESTdhbXJ2VnE5dys3YXAwMTRqRkZ4cXhOL2VxVjdyODJhbWFjNzEyNVVDd3VVZFg2K2lsQWlsa3ZzV3VHQWhWcW8yTytWT0srZFdDZlFjWjdTcUMrT3E5L3JyTVBJTXp1TVNhN0tHMkZqTmdpTGNrMy8rbzVWdEROMUZ4RGpScHNpeE0zalp3eXdTa0NzSXJ4QkdsbWV4S091eVhTcXdYMUl3V2pLblVhTlNyeHY3bXpxTnVUbFVVVlpxMDNjbGErdy9MZEJPNlc4NXNVYnRJS0lZVktMNkg3SGhXVXJPcjRDRnFaUER4bSsvV2g1UlBIcVg0TFJOeUlnalBGMGVVbERJVHRIT2VxcmJ1bi9WVGlmVUt3V2lobUlwQW8xNE4vcC9nU3F6ZzdsdWowcjdXS0tONk9DUHhsNFhMQjFCYndLRUd2WXdxeXpVYk83bk5xdnJIbTd0b2ZxQk0wZExuZHF1dmRFTEI4bUI1bjF6UFdPamE1SkFxU0VRclhkQ0gzUERld24yaCt3b0phL1dTd3NZaEs5TWpXc2wwNjdvdDNBRkRzbFhuODdkU2hpUm52dm1hNkJPdjhuUU9tSFVRVFJ3dlhXOS9ENnJRY1MwMlhqMzNEYkkvdnorZlhJYnVTcFZ2VnF2SDFYZk52WHV1bWhnM1ZteStyUWh5alY5eVhuUmEyYjJsTGRhL2pIOGJiYVV0N042YTRQaWxUWmMzbWJsakpib3l6b3Zjb3U4dXovdVBJTkR6ODg0Uk9qNndXMjEwdHlPMG9yRlVvUFhYTlFiazlaSlhHVmtyb0c2Wk15OVhVUExhMHo2clNncWxnWEtsYlZCYnE0MHFjWDkzL3QwUGNadnNrVkpsdE0xT3liaHZLa3l0S09ZTS91VjBzVmdUVWVJQkZXRmcydVVPMERmekY5YldCWHRqRGp2U0lIbFYyODJrbkJsTC9iLzlOanE0d00rTUJndG5FUmVENWx6V1lEUzJHcTB2LzBDYm02UmExM3dINUEvcmt0eWZMZTNZMnM4cTlyeGIvS3VyR0lqbUhIcFEvc2E5RiszRzFqUmxObVlvUXc1WDA4WDJmdnJUUG1LU1pEeGRqTXZVcExKSHBEa2RCYmN4d1JUNkJ4R0NCc1F4MUtydFNUbXNlQUNaQngyd2tWM2pmTFRZMElKNmdraTdLZVFjWHVnTCt1YlFqNVhQYnREb3pCbXpvY3RSYSt6TjJreVF1d1liS1gzbmNvTzBXbGtRc0kvT0NYcmNmYjdQR0hKZnlmNFRQdjhPVmkydHNKeWJZemNiTXJnckJPWEdKUHUvT2htQkVKVWZqZ25pR0M2Sjd3Z0N1R0M4eHlWUkZOa1VuZDVBVnFIM0xIQXk4MXdrMHVSeUpXR2RiOGo3MklDMGxjN05iMnNnZk0yNmVVTzJZZmJ3KzFtS1NtWDBKbFBXWkd3MVVZYjZER2t5WlNsRGVzTnQxYlVYbDBaNW82RWZlNTBBV214c1FkMUJwTU1ZZEE0djlQdURRd0hYaUg5NkNiNXNNZWZTQm9NaFo4U2FNL3EvOUM2YkxDNU5HWTBwS2doWk8vMzJxVDBWVUFZcUhXREdxVmFKaDhUVkg5N04wUm5pa2FwZHlsMm5CSklaVkJxancxQ3JqZ0xhNldBelpuQjNlWUVob3NyTDVBWUlaMmEyY3hybmJML1dSaVVSZmRpMDRNeHMyNlRzRzFPbFl2L1BINGNBaFRvZ0orbWF1RUlsaWUwSUFySkxKTkRtYkhNb0UwcXIvNmlMbkNTajE0ZDhOSDVxYVZXOVFSQXRJb3UweTdOa3R1eEVYT0xVR2M2azIyRDkvVGMycy9qZm5SQWhKSVNoakF1KzZXMjE0RDFRTWZFQmU4bmdJK1FrZWNPbU5ILzcrU21kTVBHZGJpRTB5YXRndjdOdkdyOEtCYkN5SUFsMDJsb2NkRWU2MnV2Y2E3dXMyZGN1eWZLNXlDTDFzdkplZDYyekxyd1M4blI3bmRpaDJSV05CdmhTdDdvcFc0czNLR3Y5SjRJNG44ZlNLQ1B1WHFOQWVhTlJVQ1F2Tm1hVlRCQnVOeGpoTm5jd2l4b01HZFJ6cm04ekd1RDJ6U256WjBZYnVqSldreWxyTS9UWWQ5WWRFb3ltak4zWWJiM3JWcmJ3WEJ6cG9QV0p2QjNVZWM4NzE1KzVzYlhDS1pOcGtDSzQyRGZrYzQyRXdxN1JSWDZmUG8yNW91ZjVpZEdXZXQ4OHAydGtXcUt3aEZnSldITXRSck01WjV5MS82N1QzQ1JSNjFzeFg0elV1Nk1wRkRkbnJJYnVXZ2ZWemFuZjJGdEpLY3NuLzZyTXJTbkthRXphMCtjK0hDcG0rcnovZWNnVFJOKy8vYlZXWXdwM2hhR2MzbTlkTWp0UWh4TisyQ0dJb1NwSmZIc1F3Z1hqdmFSbFAzdEhDQUswK2RPODJwaFFHamVZYzlaOXVPNHVuYXcwVSt1d3BOU09xTFJOYmRYME5EdXNtQThPVlQwbmtEVjlKVkFGNEFGUm5NOHROalRodFNGWlRtOUEybDJCTkthMzVxbjJFeWRJVDJKMExvNzdvVG5Ra3phZC8yc3hFVVNLL3hwQXJicnVsQjFnSmozNWZWR1cyME1XYVZZOVd1Um0zVkl4cmViZjR0cCs1WktPeDVzaFBWTm5KSUV1UDhjVzhZc2NTaDNwYXBKUzlyUjg4UERPTExFR09qY1hFYis1YS8rbFpzbC9oRzlPZ3Z1YnZDZC9jWDJkVGhWS0tBMlY2Z3I1Snh3SThaeEFDRm9wOVd1dWF2TnQybFF6YWFMcUZHcXZHaFRTZ2t1UjhvYitzQllPZS9WZG91OUZGTTk1NnJoUThNT1llRk5BR1hpR2ZHWlVPYnBNbU9WTHZpVDUvbU00Q2JmVHJTNDhqdGk5Zi9uSkNkY3g2UzJ6TlBuSi9MeEh0TmpycWF0ZktES1M1TTF2WjFDdmZmNzY1MlNJVnArZVFib0F2cUFNR1Y2UHI1MzRkUGFOcHM5VTNpYzlUeEtWdG4rOFNBTXpIdGxZdnZ6aHJ5M3ZGNzVYWUhub3EyWExIdjdLL0c3QmU0VTFnNGYvV1ZXL1JpSHhDNzAvejZDT2Z2N2E1enJoL3B6L0pMMUs4d2FyYU9idDFsZjY1QTlDYzErWkkzK1U3d0dtVllUSm9oNlNrajFnMTVjYzJTNTVkOC9Md3VMWVBPQWVFSUFJQk00Z0w3b1dxMkwveVRjT3JQTGU1WUxVOE03Tzd0cytmQnNtVnZKOWNOVlVFWG5xNkNuU2dEc3JFUFdSUnNEWk1Kc24rK2FGVzZLWWhyR1U1Mm9TNVJnYTV2bVZGUXVWQzhzaGVZVlpGakFaMUZ2ajlRbkhIOUxYZUt5KzlpY1RFeXk2aTVXemVodWgrK3E3MXh4N0ZsSHRYTVNFSjZaaGhlU1E1RDV6L1VVVmk1U0xYSWxkdU95K3hFZk1DNUQwc1F6cHJpWFU5UmFuL1RPSnFrRXRXSGUyektOeWVpSis1bzdpMFZWWTI2enBYd0NseGNmU1pEOUM3NTEvcGN5WU12QzE0ekxKVmV4VVJoL1g0blZxVXBVSVhMZHJzQXVwVnRWdGZ1d1pyOWdMTVBJaVJNc1ZqcTlnYUp6R3JWSkNTY2Vtd1lqZlB4QUJubFRxUUZRZGpJNUhOb2UxQzVPMDFaS2lnWVdCTFlCZExOWWsvWmRleFJvVjRTQjJmTHcxYzBYQ0l2bXpxMHFyeUZLQlNqaVRrZm9ZWnZUbzd3c3JBTUhaZnpSQTU5WWpCWlc2UDEwK3ZzcGVqK0VlQlpyWjh1ZWQwODU2eXNDNUJEZncrMWN1RW9wb3JhWlVsOVlWR25Mc2pSQlpFeFBOSmdLQjFzWm1IbDZUYUF6WThHMWVHV0ZORzZLQ2MrUDFJbzB0cTlMSEtZWFVmWncvZjhXUk5ONzNCZmg1a2tnZXFmOFpXUzJZdmtzM0VqN3BmcWk3MW01b0pNZ0dJNlZOMU9GNk1vMi9yNGx1YmxBVFJ0NnBCa0JOOTVudFhZekgyVC9Qek1WK1llaTU4NXh1VFQxWVMvODJWN2VuTlZacmEzVlM2T0dCZ0MreXNJVitZM2VLWHIzQUUvQU8wczc1bDlZWTBwU0xHcWxVQmtpb0RSL3hWRHF0NTcvQTNhaysxVGR1THVHOWFXZlNBeHFYYjQ3UmxqV3E4WUNiREFtM1lCQUdPNitIT1FwNW1ITWRwakVZdTFONEQ2TlhCUGdJdG9saEErb21oY21uUmRCUk53c2dtdVVtZis4eUZJMklFSGxZYkcxWk1RekIwTERrTndIa0U3VFc0Znp1M0MweGh6VjNiMmw2MVpBbjZCbVNLZUZhS1NNSUdLbGtlQTl4NjRxOStYTmR2bjVvbVkyV3J3ejE5ZGN5L3RtTWZ3NjAzT0tVcndqMXpxNVY5M0FrODZ5WlJxUEZsclJZY3FJNXBQRzhqejNUYkRUVldDMnR2KzhxRnFzSUk3R2haeXMrK1QxTFhUUDN5NC96eUxjYWJUN043ZEFFM2RUdGliak1venlrVm9LZUFHWTJ4cUc2czJLSWU3UkphZzNrVE9vTVpjRDhiblZFSnFZRjRWckhhNkw3aVRKcGtiTVhjMFRxT0d6S25WR2FEVTJJMW9XcHpVd2Y1QU5WWU0rZ215RTA3Z1JNTWgwV0lzWnlVVW1oaHVuWFdaTW01ZisvSGJ2czA4bURLck9yY2E1YXNHNWlEajdhSmJZNDBYbk9zRVpjVXF3YkR2L2xmckRiVWRXcHlYcUhhdGN4YlhUVFRnYmVKNzhlWEY1bjN6eUxaUEZ2ck9EZ25oT0JwL3ZIVGFXTFdoSDZUZG44M2ZSN3N0RXkvWDV2N3NyUUsxWFh2RjJOYVlQUk5xUnFEQmk0MGYvbjZ4UWwrTDVRN1laKzQzcGtFTjlUekFDWW1vR3VjVHhTaU9jdFlvQTNKaEJaeUtYVndqdWN2Qm81R0hScTFjaUtPTC9zdWdUNENHaG0rZ3c3SzhFS3h6dlN2UDR4QjlZSm1XVTdKeTgrSXBVNkRFQTEvNjRSUGMwSU5UNjNTeU1aR3dQdjM4ZVBzNjRDN0ZjTGF4dTBxYzZxNnQwUTZWRUNjRUxKY0tWYzJndUNJSTJxbFo5K3Uvbloxd2NsR0NOb2t3REh4cjRlUnFTSHZYenUxT3lmcEgvL3o3OWhCc3l6VDI5OWJWVTRkaGwxaVljUjVFbXZCTk5FbE5JMUFsb3ExekVVSmxGNlJOTE4wd0Q4OExmdjdwMCtDYjRPYkplcTJYTld3MXU5b0FvTklwL21KWHdwSy96bWg5MzVQZ1FQWlJhTlJOSk5QcFVmdk9mZU9ObGRoRkFvMmdxQVc4VkNRZGxXRjI3M0RaRDZhWk55Vm02TzdGbGZEYXJ5aXJ2RThtZlEzeTVMcEhmUkhBQzRlSmRFOHV2TXJUWGFHcVpESk9yVTgyc2FGd2pFWGZEcGp6Z2xVNGcvZFFNNEo2YTA0anovMVVMY2orVGYvTkZUaU5XWHl1djlIVUF3M0F2ZUJTTUgvQ0R1eXpTSFI5TUxmUStCVzhzRVF0RTJFRmdtRkFxSnBkWGZoL1N5ODNXT2V5ZTVMRmlIZ0tFcEozaGwvN1dCYjRGMXJsNU9Xd1hJUGpLWkJ4MXhvWEMxODl3ZHZ4L2l6dUZkWGpxQ1BJMVBWRjhDT0s5Nmo0ZE1kamtCZEtyaXRTSFU3bmdKM2QvM2Y3ei9KMWs4RXpUM3p4U05CYXBoK2I2eTFUVzByRnFNS29kYysxUzFGSDB5THFEQ0F2RHB2TGcvYlVFcXRmRmZwNnB4cHRsTCtLQ0RUc0IxMXgySmw0bzRMMXl2S2NtOVV1TVZZTWN2NlpRY2t1OVdPdXVPc2t1cmIrNGNQcFZQbnQvMTRac2JTQ2RPQmVVWTVnTzNBVWU2MFNMdncrQlNzYXBheXJlRUowcHNaZi8zV2hPZkZIem83b04renp6di8zbDhqTVZwcnN5OHdFbFdaU3FPNklSTWR1WGtUNDlJcFdvS3FDNitxMEd2Y1FrMUhzYWxrVHd4ZHNONzZ2aEhySXZBUDJZUlhaTGlOTDhySHNYZkxKbFMzTVd3dHpIY3ZEY2czK2ZtYm05VDl2NWJIMzljM0RqK3pMamwyZkVTMTZWdXZMdW9vSkRYMDhQajlDem1jVy91NWZCNnU0dGNoeHV4UnZSenl4VnQ4YkpvVmJPdW1SVXRZeHJ4eG5ETXcyRXp2TngzNTNUbnlPOTZkRDNzVy84bCs1eldiSjNzS1YzODJYTHl5dzNLVzNSZjRQb3ZQazIzTXFSY292dHl2WHluNWlOYys5R25pOERDeVdzQzlpa2pITlRlU3pNZmZGTmY3Y3djQ3ZFZWZOWkxlOGdsaG1GRzRQaWI0anROQ1JFS3VibnpKVjQxdW1tRC84Rk1XeitGdnRHQmQzQzBwdkpkMDRjelJUV2ErNWh4RVpkQTh4ZkZjNXJqSXV4ZEEreDR6N0xjeTgvMkNBNnBEZ0dIOEVQbG5wckRxc096dkljYjhVWkZYcTVtTjF3ZDVTTGpuNCtiUHhzdmNhcUlOVVJSby96VzJUYTlwWGpkdjlmM0ZrdU5XS3pvendxZ3FyeFNVWGFtZVFhWHBTeU1ZV1c2bDdCWW9aTEZuZUg3cjB3aG02b0NLbTdNaUdGR2FmSDZmMjdzS1dhWHBlVWwzUmoxQW9XVk5HT0dGd3hZZDBsSlFMSW4vcnF4dFRPbVNzSmQzQjUxaEJtenBSb1AyVmJJVmhSOW1yUkxWOWhYM050b1RURmpFVFduQituQ2s3bE9VMnZzOVNMWFplSWlrVHFmYUphZXZ3SkZ4YmxEcXZkM3ZyOURkVzcvKzZKRkFQci92MDdyMlE2alFmVFFlNkx6V1BQQmpnK3VkLzRRaEh3ZE52VWZkS1BzdG14WnRpcXJ5N0t5Z2E4WXh5c29iVjlHcXR0ajRDdGd0Yk9Hdml2cnFNN29NNnlPc2x0NVpaaC9rc3FxaHdmQUJyVTlKRXRyM0tiRmZSRlA0YzJTbTRQNTdmU3VxV1ZSN04vWFJTNXVjR25wcng1VHZRQ2UvOFVvUmVUcUhNakxEOFlyL3VhRzVIc251eDZSQVk5MmVieFBlTDNUelJLSldlNzNEdnM5SFk4Q3dPNE9yM3ZZNjJtbnBlYnBiczhkbXM4VXNYRVlub0NjY2dWRWo4UFFWNUNyQktyVUxJSUtsdTQ2ZTJjQnlJT1c2eVpiQ3JaaC9UOTFRNzY2UWRUcWNKV2JPaW82WDBKKzFGOWQzSUdvTzNRa0IxVWhJckxOdEpUMS9kZi82dGQ5UC9uOTA2K1hGY2twQndQbU9vVE82SFUrWEdjSWpId095TFJESHFXbkVDMHcrdWZKMUpLZ2dwRXdjalVSanVFYWZkYjB5ZjlMSWxvVVhNQ0R3TDhWTG5GWUM4VFU3cVZWK2lyUnJ5L3hXUytOTGQwMVJ5QkNVVEd2OTJiNVhWMUpaUDUvTlR2Z0hVZDFSN2ZEMjRXZkRpQ3BNMjNtMTNOeEptS3g5dWtycmxoRjd6QzZacnQ4KzFyZnRlMjRWZTRpOUhhMGFOVUoreFhMQi9XZlpmRXJ5cGN0WDdIaUh6OWw1TkxtQko3QVRIRThmdkl3ZGp2R2QzK0NZQWphVGtrbDMvejN3QlZqOHZNbXp2REFWYmFzQWdLRzFPZkFqSW1KMldFUFpzRk0ySVpiNUxkc1NMKzdCTXo1d3J2TjZScXhTRlRELytXN0FpRC9Udk9JV0pyOWs4dDU1WGgrMWFYMlU2cW5seE16RzJhUWNMdnpHWGFmdDBvT2NGV3ZFVjJacVFyQnREVU80RExLdkQ4ZkppVXZQK2Z0aEFma2lnR1FpbE5BanRCVVlxWDQvNmVGa3MrdUMwWEh6cWRLVzA3eU5rSlR6bnUyKy9SRzZESGdlbGFibTN6OWJVZDVYenE0MnRqWlk5cFNYeGtzZC83bWxzdG1IdkcrTzZYVWUySUJNemxTejhWeFQ4VUZraDJlUXlKKzN0Zi9HMkpDbGVIc2J6UDkwQmJSbkNhdTlBbXVjNlpQR0NSWHBIUERsTmM5U21ZejFQS1FuMXllYmgyaHZNcFF0ZmJJd3JwcU5MVEcxTmxsMmh4dnNHM3FhVjlMYmF3NStkYkdhdlFwTjFzSE95dTJ3SkxmNVZLK1VPbnBIVDJvb3h2NHFNb2RWV2dKSDdCTmdaSGVPdnRmZC9zdEtJTnJjblZTek54Q3VwUFFrQVAzNHlzVG5RTm10N1ZiWmErM1VOcFlnajVaSGpCc2tLSzBRUXR0enhkWFhweDhkY09EcnRKdkIzWXRYMzlHNmYxVFpZL2JWZlpFL29pSjdzVURMbHQ5dC9LWkRjMTVyL2RrZXVNYjR1Q3VWNDlaRVF5a24yUllNdG05UlFOL2wzV0dBQlhrRkw2SW9IZjhuNmR2QWtoR0x5aDdiZWd2aGM0VVNDb0ljUG5lcWFlWFh2Z2d3QWVkd3Qyd0k2NDVEWG5LMTIxSGhZQnlqVkswNk5LNC80OGFMdm9YVXkydDRTcGUva1Yyei9UWVdxcWozYkEyR2pHczdXamJvN0hZT21yV29DVVNQYk4ydUNWUnNXK0VTRFhyUnZ4K2NpU1pHdFg0ZmI1UktxVWQ5bm50VkJwKzlJeDBZbkVKYlVVYUtXVk5IY1hVSzh5MW5aUjdpbzlETFB5ZlBTeVhUQ1Z4MTc0bnFsbDQ5b2tiM2F3SUxLaHVQYUxXUFhYTnV6dTkydUhFT2FKNCtlajV2YStOcUY1RHhtUTBLSHR5eGpuajA2cDVCOWE5NGYzYXA2by9NVlVhdmYweldQSkE3aEo4S1llYzVlV1RBdmhNNmtWSjhzVXppSURNdktYVWI1QitKSlc1dDlKUm1mUW9UaCt0Wm4xNG9vcDF0TEd0ZUdaN1U5TzBtYzVseWRXYkF6WVhiZHgycCtwTy9DOHpTUVZHak8vQjN0bEQ3Tzg4M0ZrMk5xVldIcHBwV3BuRWsxbi9tcFpvVjZhSmRKSG1PN085UVZKU3YwaHRhN0NVNEp0eWNiZ3QvbWxEcmY0VVo4RVBnS1VnL0NjSS9nR0RKZldON0VrZSt3U2I5VHVYTjFrbTNDQmVDN0k1bnQ0Q29EQWxtaTRRMUROOFFYZHZBVmc0MjA3eDlmZkJJcmlvL3JzL0sxeGFWNlJzOXhzN1h6a29TQzNqUXltQm9BbmMwZk1HcEJoaHByUGV0dng5cnJkWHN6bWU0UUtnc0o4WVByMGFhYnVucWdBeE1RVFFEditOUGN3eGoyT3lNNmR1LzNmbm1qL0d2MTFrUFFJQmZOQmNDd0tUdzNVZ1M1d0ZyQUFkUnhWd1JnVzhxUUl1aDF0SEtsT2tyOXJZeTE4ZmFvd2lXMnNnNjdZR0wxakpaTUpVd29jcTRUdVZ5QjIvN1FLSzdYUWJvUEd3QnFMV1FEN1dRTDdYUUg2ellRMElJMzdvNisyZ2FBSDcxMjNkMzdjL1BEZGNLMElBaC91YkVYSzNDV3dIcDJFeVBPeWJIOXJZbWYwQjJQc2hBUE1zU0habWNldjRGc2Z1eGYzOXhmMnpWLy83RDRzWGtiZ1podGw4cXdZT3FJRUgxR0NmKzhFZkw5TnFNNStHelZmMm4yLytNRWUwbVVldFpjQmUvU0hvY2tZY2NKNzRCcng2ZFJnQW9EMDRCMDcwcWNob3pZTGtXb2I2NWE1djhtZVdKbW9tQUdwd21QSWZRQmdXNU84V2FqQUh2bzFkdi95aTQ4YjdiZndUUFozc3hBR3YvYWVvWVFBZ3ZsOUtFd0RzNlI2NDBmdjF3Ykh4UzlIK1Q5ODlyU3JOYnEzbk5MMWZIbHdBK0VSRE9JQWZoMXprd1JWSFdndVBUbUVmV0svLzNYdE43MGNlenFYYlJILy9zNkQzYjMrUXN6enNsTkprNzdkOUd4bHNUQ0hweHpJOHUrL1Q3Nzg0UXRXOHNvSDNRK2pKQkhDUjhrcjRSeUErZjZ1RE16NE1jallQOTdTaHY5SENucDhLZjNpR1VndmJnL2REdU5EeFNhSUFLTVQvMjFjWjhLRDhETDN4dVRoRmNXMmk0cDlWN2hYTFcwQlZIMXlIbDR0N1BMMi9sUXVvdXpoWDc0cndodjBha2JLbnA4OTdQTk83Rkh6am9pdVdsRk5lcytQL3NCYlAvMktuSGR6OHVtdnJQWlN4RmJMaXdWeHlEVW94cFJrM2wrLzh6TWVQaDVSMUdBY0E3c3JWKzQvcEFtSlgyNVZzaTRndkF3cXhXRFRhRUZKdXlEUTJFY25XWHFsS29wS3B1YW5SQURUQWhaTzA3WFpiS2prYmxuV3A3UjNZYUFOVFBiNHBHVGR6dVVPcWRZMVdpZThtRDNqb2NUMDZVeXdRQVVsQTIwWUJvS0psWFJBSkRNbE5rTVo3eVNvdFpFUWpRSS9FVWNsV2xkV09YVlJtQ2xlT2dyWVdWSTFCTDdtYis3MmUwZE5yc0wwQzRkWnMzb0VLaGF4dU5zbkJFYkZ4TWtTRVIrK1pqTFpIWWhKVlYzbXhveVZSYVVUMHFqb3ZyZWdjVmRSc1hqa21hRkZ0RWVKbGplUUZWUXBtVTA0UWNiQ0hqQXoxaVVJYXd2bE9Ya082TFI2a1hlb21YTW9qWlJOVjNmcXF4MzdIaDdmVWVnRFZDMStacUV3bHE2NjN6Y3k5M3E1NzQrcXVBcjB0dEJVcWYrSnRqRmlwYzBCYSt5bDVhOGNtN1l6TnJLTkErSVFGTzNwZjFmclZiZTFEU3BoTldSdG9IZUpOaGZzWFJlZXhxdnNGcVNmVTc1NkUxaXlyc25CWld4cFlhR1ltSVJLdldTN3o3T2cvN2k0Z2RtNEpEYVJjbWhqcksxTTZOL1JhY21PSmhHaGw5WTA0SEt4a2paL2NHdktDbkFydGR1d0lkSzFJUmloV3Rzdm9iNUhZV1ZhaENMNTdpWlpTOVNVcStEVEg4OTF1QUlqeWxWZW5OYTF0U2lHYkhTbjJ6WGxucDh1cWQ3bnFtUG1uQ3dYbXgyMVg4dVBIeHpnZkVJdEV5NTl0dDkrdXY3TFhkbFBveTVsNjcxbDRNQUoxbzVXb0tJRjJGKzZYWjFUdDYyTE41Z3V4V1dXbEV0TWt4UGZkdk54RnJZZ1IxMjFSbDJ2YXNvRDhlZzYzc0Y0dFE3bFFlR3hiUGVMTUNUaXFyMXdETCt2U0pmVjIrNk1YZlc5Y0VNUEswTC84N2tFaThZMnJiOVZEdCtQOUd5THY1Y0JXSjFvdTdjS2RFeFdlcjhqUDR3dkRTcyt6NkJ1UGFHS09ML0NtbGlTYTRieWlMdWcrbVJCUlJmQkFON0dTWjAyQzRYSDhlcGRXci9DQjhnYlVaVXBlU3M1eE5RRElPWVZBMUVtSWVpS1hXS1pSQTFWR1RDVHhvbU9vZ09qUURjZlgrejFybE95aG5Vd3RFUFppUURTbFNRMFhIT1Y1c2k5ZTZaM3E2OUJudEMyKzZ2UG9QdkMrNCswVmJUdDQvMS84d1hJeEc0Nm1FNHduMEhpMy9YQVFwaUxnQUZaZzBMajVLSCsxWEJySFFucGhUWjB2KzNPaklwKzZiMGdzNnVvU0U3cVZ3anUzdGVoOUo5Qk9YYy9Dd0R5Ly9hVW1GcWxGTE1tSDVsVTFSOWhSVXc0U2FJMzBxRkhXQW5tbVNscW8rYXR1RzRYc3NTMTV6ZjFTc3lsNWJaM2I0cEZYODdheUFjZG1jWit6b2VoenpvWEVkYVFTWmtvb0x2bVY0TG16dXg2dkV3VzdSVkNFdFd0M2RBVUszZkZpWjFhZGk2Vk9RWGNoNm16R3p6Mmh6amZNS1FxVGppajJ1MmFwamlUUHJhUkdKNzdhTmpUcGNkNmdQSkJXQVA5WHRhcGNXUDl4K2pMOGpkUFB6YS93cWlOdWZEQXc2M2JYS2tscm1zQWUrUVU4SmZ5ZkEydnFGK1JQM1luMTNlaGg1K3U1SHJiTVJJWXc5UEx0b1g4d09ZRzFrWGVDNGVhOVowMk0zYU1hdW56OWNueWF2WHI3TEVRUEhxK3FwaGlKSHkwSmdKZ0F5c3pvbXozVGxsWUJDZGJJdlJPY1VlTGdOWkx0TE9wRnByWDA0V0tPZ1Y1QWxpdzlleDJiTTJ3Zm5ZK25Odk1WL2l2dS9oT3p4RkhWYmxKRFdhTko2U1JsdVZHOXNWcTB4clZFWFRmVUtCdU1xNmdQUVhkVXMxSXlWdFN3Sld4dmhkK2luWFE5SUM1S2h4SExNdDRmbkpvc3V0WU10cVhBTEJ2blFGUUJtSE9XZGxWcitEVFB4bElnZDJHTXE4bGhQNDhSRFhPdUVRTVppODkrWWljU2t0Z0pJTG5tTGg0T2gwTzBlTXF6ZG85YnlvZndtTzM3dWhQckpJZGNMNzJzRTV4OHpxaW9WWW1reFZGRmE1L2JsYW8zQUtnaC9rRU9BbVB1eDViRE5PUXExYklLd1VtSmhpWUhDM0NjbVpMdmtXRlZrUTVaZWpuRTljQi9zQ0lpNGxVMGtZNmV0UlVOYVh1b1FMeXRKME5veTJvTUNnckxpSkNkUVIzREJPZit5eFVDanZMZlFGYkVlYS9UbDcyU3VOT3VwbFQrbkJ0YVdncmx5ek5jUk94c2JYL1RGZEp5LzJneFBhM29VMkdwWWJDaEwydjVIMmF5SU5XTlFML3ptS3pZcVVDc3JWMmFzcmVYUkw3L2NsNGFUNjdTTVRBeEVmSkx3aE9oTmhYT0p1L3Awd04vdkNWTXFDenhPamZONWVMUkxPQ0tJYytNcjF4ZTZmQXdiRnNXNEw0YzI3bSthdG9BZEFUYnBsL04zUkpnYkIwbmZNMjZMZnVLa1BSc0RTRUEwVk1UamREWFk3SjRmNzgrWUYvUDQrc2hWK2hjbFpUR2Z5UFRtOTB1VktQUmNCaHV0SzVDS1dZZTlwZ2E4Y3VDcVJqaGNNbzV4Tmg0UWNZNkpSM2FrNVk0MW01U1JCNFdGRlV0c2lxQVVqVVNNQlo2N1BjTUlkQk1hMmljRko3VTdqMVdzZjFPYXlHY3F6RXpDM2lBV1VhNUNqV2FjM2l2MDdDU0pSSW1HRlBiaWQzT3I1V0N3TGYyKzRKMkxzYlUyVUZoVlN3VHJGcUR6SWM0Q21CTmpKRFdsVmJUYURRYTRtWWtYcGRza3lKM2RUVWVUMXhHdGxUSUp1Rk1PR25oT2xIS2toTkVHaEp6OUJsK2pBbERNQ29EUW1xWnpCV3lVVlNJUEhWYzYyUURaZzlQSE53RlpUREVrSWtsbWdRaVlMQlFrRDRIWTlWb3JLdGFBb1NMS0FGcE5jWlVTaG13SU8yc2xSV1ROaldtVmxCOGY0UlJ2dUZleHdvcVExWmtCYXZqaHVKaTNnb2R5ZkRKS3dMekFGRHZvaGFXaERSaUo5MmpUb3duOTM2dHV3VGkzSmxZbE10d09DeXQxNXZGMWFCbEFtWkE4Mm90T2RJR0N4MFdRSm9PeDYvM1kxblpvZmZubERsbzNiL0g5cjBTSURMbXdZT3VKYzlkYWYydFdSS0FMYTNEVjlwQkdMdG1idmEzcEM0YUo2MFI2WHFiR2E3UisvZVQvZDVRcW4rbzhvZFk5V0MrcHV5VjAxaGlDSHdjbzI0VXBWRjFIUjBTbXYxNEljcVVzTkJqcFlyYVhvcEJGNUphaDZjcU9rL0phRlhtcDhsazBKYU1naENrRkJ2UURQenJGcFF1QU9Jc2FZMnY5Mll3cDEwZ05GRXBjcmRoN3RhZU1MUnRUTWt4R3lVeFNWVmdGU21YWmFOUHN4c1krSVpwOEpHa3hwT2JBRjlOZDBhVzBQUHducnI4SGpDYkJDdDdwY3JkTnkrSDI4bTZRK3BYajQ4K1VNSEtDMkZOajJRM2VmKzNhUnFIdVJEK21iLzVTZWZ3OTRNYU1MQ2ZHVlpaQ1NmNlM0K0plL1BoQitTbUsxSmZPRFU2RTFaVXE1TXQ2dldjOXphT1U5VmxrZ3ZxNUl6aGVYcUxoWTNwOWRNUDc1by8vY1hoTEdlZkhlemFLODh6SlYxZjgvNTVpNnI2OWVRZlpYRDMxbDc0cE9iamVyUFpmUmszYzRmeC9MVXhlWWd0Yk03dXcvMXFvZTl6YllucCtUeU1CN2RXMDkvQmR5ekticXRlS0hrc0dseVFVRmJLeGQ3Tk5keGRFa1pBQUJBOGlsTVBHenZSU2dHQkVEellNWG5uVUZ6UlRIVVNnTlo3VlVUNmtlQWUyNXBxZjlRWDFmODRzV0RpSTlQSEViVTRaV3RMWUxQRVQ2VjBRTm05ZWw5aTBMUTlIZTk0UXZDbHVuSUVHaVJjUm1wUG1aUXBEUW5tRjZraEFBUHh2eDkvMzMvLzk4TEgvMXRTTktJZkFNQmErdzhaNUFGOFBHLzlzNkluK2U1c0RnR2dZQUFBRU1DL0g4Z2p0NnZyLzBhOVU3N1hYMEJvS0JWQ2VvN2czWVNOdDZ2VlE2V2Q0bi93bGVxOVFsWk5abTFJenkvMnl1Y0wvQW9JUnk0RHBmdU1RMzJ3Sk1yUDZDTFBVRGZoNnVlQmxscmhSZkFiOElONVc1ZVNWY2FwTytyYVBpK3hienJmWGF6bzdPZDgvN0xZMVE2Zy81NmwwcGVaQkFxby9yNHQ0Rjh5MytoaUNHZTRua0FqMCtYV1Vna3UvbXljZlYydnhFMFpEdnE3VCthVXRoT1V6VmY5T0pBVldBbUFyeTV2d0Q0bnpTT2ZlWTJkcFV0dDIrYUFmWjZxZDBObExzYzQrNGs0SldGdmY5UVRxdnRHTGVSalpoT0M5eFo1MWNMM3NJRDlRNVVqWmR1eDJ3V3FrS3B0RkdVSUxabEhMd3JaSVQ3RlVKY2lwQkQ4ZktFOXUrOC80aTBYOHR2YnZPWUUzQkNQamJIbEhqdG1JdGt4dmlzaTJvRXVmSnkwSVFZTnpEMjZvOCtLMGJGc2w0dlkvdUlKUUhZb2VOOCtXUVE2ZHdKUFMxaUp3ayt6MkZTMnB5ZTZyYzB0YlQzQjgxTGZoMlM3aGhmVW1yRnlMcTBFb21pSWI1MytZS1ZlNzVMTWRBd0RrSnNDYy8wU0NzVHN4VStZV20vS2V1ZksrV2pjc0Y3WlpGemJoVEVqM3BuNXl4VXRENVZXRHNzdWVDdGljL0MyTWRmSTU3ekk5cjJRSHVOU2ZMMjhKeWx6NWRrN0VuSVJQMHZ0WHd4dk8yRHJNdmFyeEdKRXE1WFhMTCtMRjlSeHdlbElkaE54MGJUSHRKb1JQUktVVGlueWxaSUU0RTlYbmFVVFFEZ294QjJNQXBBblNrTks1Sjd1NFN2QnRuTy9zbWUvM3QwMEF1YkovTUhmUitrOFpFY0Z5Z01BQk5DUWZyUTJGSXdEdFRzQitoOGNnOE1CQ0l6RG9TWUhBSmJCdHdiRTNYc2M2OTIvTk9EVXJqWWxHa2c3RjlKQWtVN1hJS0JZVzRNRDNwN2R6OUhNTXJzQ0FyQXI3MEkrZm9hYzNWZVE4TFg1UklKMlJqM01HdFZyWUNWRzB0QTZLTld3b2RyZU9wVmEvbmpYVTZ5SFdKeFp1eWJKNnU2Z1U0ZDR3MTdhekVKTW9WOHI0d0QreWtya29FWjkxRlpxNUhMeDlpWG9BdzgrSERBSU0ycHFXWER3em9mWFBOd2JzZzJmUis5azZ5S0ZnTHNISmtYOFFwZm1qVmNkWW1GU2dOeGVyMk9aWWdvRURaS0I5WDFtc21SS0VubHJJRFFOUVBsQVVEWXVsU2ZHV01jeGVJZWZlcU1JNnZCQzFheHc0OTV2SWJmd0JXSHd4VlV2VUl5V2p0VHdXMVRnK2NaVERiMTlqYXJwK2ZWVkVncDVmWDdzNDBLOE5qbnFyam4wdFkyMUZkTWI3WW9waVUxeFZXS1ZQeWF4eUtjazVsUk5pRzJFYlJ2Z1Vpa29UZzkxU1hTZ2JCSmNiUzB3YTZRQnBpUnFtVTFJcGFva0tpNVdNWkdOaXJwR1N1R1VSQ1pRcFRXcWhLK0tlYXFJcXdvNThRS2FQNVhoMGRGV2thbHhjRnZZL1BXM1FycjZ3OWRjMTNhbEptMjdyaXZ0Mmx3VmhWNUZJbHBrcGFvQkVWWjVZVmF4RUZYYUJOYS90cGpmeGRaZXp1dHcrRGMrSVAvSi80eXk0TnpncmdiSXdYMEVHYlZDWmFXd2xyU1NjajZPL0UwK0lCRmgwZDBpKzQ1djM3ZG1OWlhLOVRYd0d2OE1mUGJldEN4NlhMK0FwQ2xEVy9Iak5pSys3dnJxMVNzNDIxMjhiYkcvTXZpTWM1R281SmMzS21kZFoyOG83RVU3VnJDR0JQWjROdEw4OS90bFhGMGJJWW1OSXdCQkFRPT0pIGZvcm1hdChcXFwid29mZjJcXFwiKTt1bmljb2RlLXJhbmdlOnUrMDA/Pyx1KzAxMzEsdSswMTUyLTAxNTMsdSswMmJiLTAyYmMsdSswMmM2LHUrMDJkYSx1KzAyZGMsdSsyMDAwLTIwNmYsdSsyMDc0LHUrMjBhYyx1KzIxMjIsdSsyMTkxLHUrMjE5Myx1KzIyMTIsdSsyMjE1LHUrZmVmZix1K2ZmZmR9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6c3dhcDtmb250LWZhbWlseTpRdWlja3NhbmQ7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6MzAwO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQURJMEFCQUFBQUFBZFhBQUFESFRBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsd2JuRlljaHpBR1lEOVRWRUZVSEFDRkFCRUlDb0dxSUlHR1ZndUVLQUFCTmdJa0E0aE1CQ0FGaFVJSElBd0hHMnBnUlFkaTJEZ0FhUEFaRmtXd2NRQUZtKzhUUmRrbW5VajIveWxCbXpHaGRlaGJaU0YwUjd1bzdoa1pDWkdUNmhucG9iWlRXeHk2Y09EaDBFZy85bzBGUitIQThzM0oxYjN0dzU5WG96Z2NDTndqWm10dHdDVnhYNGhMb3BFa1RhUlh0MFpJWTJJdDRqZjkyWHNDdk1STFV3ajJRbzBJa2hjeEtrWXE1aVF0Y2ZuaW1ycFowanFIdEduZ0pibC90RHF6aWlxZHF3QXpvUTBUTHg4Nk16cFg1dEk1VC96djk2OTc1cjRBb29zUkJESmZCYm1rV2dzSXRvcU5iRzJYSjlDa2VvYkhiZjN6QkJtb0dBMUk1YWd4R08xR1Rhb05FRlRNNjdJdW9uOUZYdnpmK2l1aXdRRUsvVy9haG1pYnorVmRFYlZWUjRZTitQZC9qY3pDVE83TG53V2dJcUZsNVFBbDIxWUIycDVLSkZsTDZKZjdaZUJ6ZnU0Y0ZKM3ErQU9DOFFWNjZ6b2JXd1loV3dEL1Y1c212RVhvekVtRVRXdnRLRzJUUEczaFdjcFFtOW5RT3ZSOEpGSVZnWkJkMm1iRmMrSTFmWVh2d05Ra1ppdnF5UDBlOTM4NnkxYmE5ZDN6QnFHTHF3QVgzWHB6YlRINit0Ylh6R2drQTJ1SmZReWVsZldlSlN2Z0MwSkZVRjFheE5kVFUySFRwU2o3bEpsL25lbXE3Kzl2U01rLzZKYWRHc3NxcmdHZWV0bmFOVlBMNHorZDdxeC9zZ3huRjJUNWVnSFNVV3lYN0FERFZNS3hveHowQmNodVh4aTJBc0NhdFRQeXZnT09OVE9ick9TY2NHdUNRbHpoRWJLQi92cnR6MWlySDhoc1puYTc5bkluaHkweVJFTENKeUxnV2Y4Ni8zQWdUREFBQUxwak5FZzNKTk5RWkxoc1pMb3lwRncxcGs0ZGN0aGg1S2lqeUFrbkVNSUJRcCt1Si9pbGtoaXB1Q1BIZWcrRzlscEZvUS9hK3hPS2M2SEZBeEIyenJwM296QVhhaUJ1eFZNOFZtQ2tXbVY3dHQ4M1VxbDZpNnh3eWFzd0NwVjkrY3pVNU9manJNckgvQjFiZHNTWks3bVNXL2EvdENtdktvSkVpaFlqVmlLUFByeW1LVkRrUC85ck1NTXNjeTJ3MEZMTHJMUFJEbnRkY3gwekt6TS9FNmlBcENqNkwvay9hS0EzQTI4T3lWeGFDNE9sVDVhZHVQTVBXZlpCMHZCa1J0bmNZQUdkaFN1V2JsbzI1MXJUOWVDT0NLTGdmYllHa3FCSjZWUXlhNEtUR0lIVWc1ZmhxUlNZRWpNSFJ4SUhJK2xKM0ZUenROMHBXaDdERERGUHB0b3B1TjQ0Si9BSWtnMVNlT3BjaTloUDBSVFFFaVdPd3p4TjAwWkhVK1VwUzFHRjhCWVBFRDNBQkxGMW5xTEZmQXRTSWRzNHRaUXJFSkN6OVRLdFoyVE1VVmhheEhPTFczaVlTdDBwb0VjWWdvU3g0N1ZEcWN5aGtna0ZQWUhkdk1TeDlWOSt0NzZOTFpxREIybTlZWWhtdG12NHowbDcxYURYL2hjek93UXV4cTZrMWxVQzdubW50Ry9QM1N6ektHUS9md1JVRC9jT01RaURJcFRnanh2dmIvUGJ3RTlzbEE2aWpMSVR4YmtHbHAybVhoZlUxTzVBL3lIZWFiUldJeklkV2pXWjJXMDk4UzNOSm14SVV4RDBKUzJJUXFoNy9ETE9WRlVZOUkvMDcxZHFKRnk0Z045U055UHNBcWtsSkdYUGFmZU0reGJGNXFJWWMvSUFCeG1sbTRCY0Irb1BPUnoxOUNNMm91aDJvR3RFTk4yQUpGckNWek80Tm9EM2V4V1NFS0c0c2pNRHRPVkpTZ1lMVjNvU2FMWWVlNk9yRTU5Sld0STdYcTZGTU5CNnBCYUR6bVNHN3g5UC9uY29BUUMwWU82NUFWLzhWcVI1cEM3TzBLSlJTVGlYTUhlYWp6dnE4ZkQ2VEVhdGRTZUVkQ3lKeU9QN0hTMEhOc2NqbjRFVUg3SVZ2NUI5TmNIdDZRK1F4cjVOZ0psRVlwQmJsN2lXRlRnMlN2c3ROTHBrMXdkMEVPQi9IS09QNTFvQWtLSGJrMGN4Z2FVU21FZHp2dlJFWGZYblVFcXhxR2dkeC8xcFVCbjZ5U1ViaUw4YmtJbENwT0MySEYvWTB4NXFweFRMNkxtbFVQYkZPSk1qWVFEZVlKSWNZQWh0S1ZxZnJGS0luZ21qT0k1ZXgrV2JTVUFyQ0dOd2hJRGlhS1BRVjEyZXphZEEwNENIRzg1TFltaDJnaU1Fb2hndUZDRTdXdDJSbnBaT1AwTEFtempKTkpNbDFGcVEyd2ZiVUJKYjgrZ2RmaVNHU1cxZ0MxdFowejdRVlFkZG9UU3lzalNlYnpvbGZ5b2hTdGdnQmVlTENIT0RmTXlvMkJPUzhhMTJoaWRyM1lVaFJEVlhUQUl4RTZ4d21zMERFZzFNUkZIQUd0R1pKTEU2Q3RCWmw1SjJBN3VsVFAyME1qUVh1K0ZHY1JoakNvVlh0b3daaXRoZUFpZ2Jsbk9aSVJnRENnWUtlampCUW9RNmhSaDJMSWFyR1dCN3orWWl0S0F1cUVNQWw5UURJZ0hjOVJzWWlVekFOZ01zWkdMTG9VYXhha2tWcmZEb3pLMjEwWmJLMDRacGk2Q0VCVm9zTU9BQVVWZ1Fpd1YySE1qQkR1S1VnSk9JZ3lYaEVNbnNVQ2xTYWFTeHc2VHJpT21NUlYyNFdTRy9BcjFvYjhMTjlNRmFmYkZvcU5yY2NDTnk0a2lqcUl3QkpsTndCQzhtV1ZnbEcrdE1aK3Y1NU9NVjRFaUYyS0NJYlZTc2xGb1pOcG1GdzgyWFdzd29DNTZLRCtxVXJvSXpLbW51NEdBWmVKWi9FQUJNNFFXUVJwRnFob1ZZQ1FmUGRwT2hIR2FXdXg0ZXVGaUhudTQwMHBvMU43Q1hWTW5mS2pSMllkRmlzY1dxRnF1QmROdkFhOWR5OHRFVFArNzEzTHdjRFB4dkRkMGF3KzluZXlmZ2QvWTM4Q0VMNXNKaVdBbnIrMzMvd1pLY1Fud0tqclhpTUFCcER1Q29hVWlrR0lTaENBRUZ5RUVWNUplbEZjSEJwOUxuZS9lL2E3Yk1FdzhLcFA2WlpWbVZSOFM1b2JBbVZaSldPTTV5MGo4QkFCUVlRVFVtUXlhWkdFVDF4OUhEQ1VrTUcyTTJIRU9odVg1SGpUdUJwU3BBS3dpWE9tc3FCcURBWHpRVUl3WitmT0JIdmdaaFloUEczL2pWeUl2Sk9EZEJJQzBqSzVzS25ONzZxVXhzSTVSanRBcGl2d2NtZUFRSzlGWUtHc0VTdENRUW9nNzZHNFplbXFUSlRBUlcxRDh5QlZJUUJWTUloYVp1L1ZIN2hTT0JSRktSbWpRa1Nia2dRSG9pcll6aEtGWFg3TElKb0xDNWFhbmkweGdXTGdSZ1RnbGtyT2ExV01Kd25ROVh6bGNmbUFEc2hRNEg5RW9lbnk1U29ySHJXZzl0czBwSTd2LzNzRWV3QWF6cnVDK0dDUENmeHJrVDlDWUE5QzliQTVCeFNLSzNkeDBBWUkvZXlpcW10QnVBbzB0Y051YnI4MHdsNCttNE1QajltS2FXUC9GSjF0bHRQZFV6TzRHL2hMOVdqcFROc2xWdUl5Zkk2WEpYdVZpZUV3cXQ0ZGJtZmo4QUNDSnpTZmRuNHBNbzQzS3NrWFd5c1FWcGpEOVN3bTBGOUFQQXZ3T0FOeDJ1dmNiMkM5dUFDOStFQzg5NHp6cWZHYVA3S09iaHJuTTd6MjBCQVlCRVFIOG5nTjdLOTNaMWV1VnpOUHFuN1RQSEl2TWNkZFYxaTYyejNuOU9tV1dUK1phYWFZa0x6amx2Z1d1SWhpUlFzR2EwbW90Z1lHUmlaaEVsV3F3NGRnNU9pWklrUzVGbWpmK3Q5UUFIb2tKNmIvM2diakwxMWtkZk9iUTNnQmg2Nm11OXN2NjNUdWRUb0ZDUlltVld1V2UxUy9hYjY3RGpqampodnBzUmNVdU5MUzdiN0hiVXVPdWkzLzBSRGxmYzBCQWV2Nm0xMVQvKzlxK0ZCQXhIaFNkU0N4QXVSS2d3a1ZyUTBRc2lhODJxcGJaYU9hT05CQzd4RktsaVROTmVCcmVPMnVtZ2s2NTY2YTZIbm9ZWVlLQkJQRWFiWUt4eEpobnZySW55NWNpVnA4UlVwV3dtUjAyRWpUYllhWmNkQ0EyL0VBQm9EUUJzUDlCeVFMOEZNUDhBOEo4RE53Y0FBRFoyRmJ5RWhPTVVMQ1dxb3BoSWlGRkdQNi9KU2Jibm5KZ1V4VjFEekxRQWhDSkl1RWJCbzNneWFTVUpSU05kRUxIU0h0SU0zSEhHc1NOeGZld0VuY2ZyNmNDZ01XbDdqYWFKMDBleFF0UVI5aWlHNENVdzhnU2lKbm53U2IycnNBaXBSRWxueENZTXM2Y1N5SStlMlJ4NkVxYitDckdFSG1Pb05BT0ZwSlN5TmxBVGhIVE5Qb0I5SFFPcng0ajVYa3pPZzRRT0NXbWNQalJ4VEMzVThZUG91VVU3WDd6TXZya2lXbzdkSnNablFRQUU3bm4xL3Q1ZloyUkVRbW8wd2VpdXZKa0xsZyt3Uk9rczV4UzhNOFdMbFRvRXhLUkp1TjVabHVjOVZ4bUdwM1hvaFNGWmc2MDJoMFBwZlFqZ0hITGRVOWRZR1pHVWpGOHhHUGFmcENpTkJxOVY2aTA2VDA0WVlwNG9LMTRvYzNlbHJDaVZFWURjL2oveVFTblBPdGFKbnpIQmFhaGNBMENmQUNxOFM3NVp0QWswcFRuS05BdXVNUVdRYkZpdnRuUFV4bk1MUU91MmZFbU5iMVpxNTVJTWM1UVp0bXA4VnlsUitGQllveWxYcFg3VkJEQW1kbUl0SFYyRlJ3eHEzZjR6Sm94NHQzS1pmcHNqeTh1L1ZXYlVnN1oxUjlNZ3Biako0dG00V0FETVFrNDV3RFNrVVJndHlFbXcyTUtSVFdERlpkTi9GR2FSZlpIYmE3T0xZTy91VDRpSEI0cU1jcXRIN0tWdjBicXdPWkYvdGVZK0RRNG9IVVFZaFE0T1ZRb2JUV04xUzdEQjhQWGMrenV4Nk9RM3hPMUZkbUVxQS92eWlLM3R1YUhTUmFXNDBPWTA4WlZBUFRXTVh3SzRaRU94QmhDOGZUd2FzR2h4S1N0N3lRbEJvVDUwb3J4K2tOcW9tRytxSU0xNFR5WFZoU0lEMTB1RUkyQ2N1Rk9xNTRDY1F2Tnp4L3BjZjhHb2ROWS9TM3htYVYrekpac3c3OWlsZTlGL1U4cmhQVkM0bVFsY01EcmJvRFlTNkNOYjRBS3d4cCtSRUZWUzFUSTZVTVp3NHdZV1FOUFFXNXROVG5GUGROZ3cwRk0rZHFnSGc4MjZKOHNpVmkzdW5RNFRsc2k5Z2I3RzQ1bVdMbmQvRHorL1JuYThSTEVlNTltcXByN1Nob3F0VndTSXZmbUdkVjJ2OHlwcWpVN3Y1ajZuclAxMTFwZ3NpTHhOamUxV0hCOGJNanBXSjgxZHRTMnBhbndUZ3duTjIzM1dxdzRiREpTWkdsQkpUU0RsSGVNWVpYWnRPOWZ1bFdNL2UwRE4zWnpORmJ6Zi9kczJ1WElMS2d4ZGt3TjlXRVRadTdsczVya3d3Ukt3eVZ1VjJGTTJlYWxmR1ZhaDNMVTByNTF0V2ZNNVdGSENKL1dNWVlVamhXeStjRW84ZXlXQk1YRXpXQ1ZMa3liWWpqMXZyVkpkbk9SWGV4c3JnVURMcWJhaDJvaUQ4NTdFU0dMYXZ0a1RMSlJmbU5XRThlYUcyOTBXbTVJc1hpNVRoN1d3bE84YzNMU24zZXVpN1dSNUg4eERZMTJMQ2JDeUV4Vis2eDRmM3RRd1VER3IzaHRsT2ZBRzYzMTh4a3J6bXNqYnF3WXRFVlNXOHZSOUtMZWhaN29KM29rYTVqV0xWbjlwV3Fjcm1EMlZ2R09hSjhlbitLaU9kVWJrUFhKUWZXNXhaYjdXMlJlRHRPSlRhME5iTnp3dFJKUEFaOVJ0cVNheDBxR2xMazkyZ3YxRFg1T1VRKyszWTZ1MFVLM1BQeURSYzhlSWxta1NjRVpwMHdTMnc2d2NLMytLcW5KMzR5ZU5hYnZGNS9SeURSMGo3OEh3ODVIbXpHVk9TMFdJZzlKQWVsZ080OXdOa3RJN2hBMFc5a3dKdWo5Q0VsMkdhQkw1cWtKWEptZ3NzUzZhZ05Wdjdvb0dpQWd4YWwrM3F3VFhmVGlsckNtbFZsbzhZMExNMkQvQU5oZnVpU0pyTlhWc0J4MFd0UGJrVmt2TmFIbGt3Z0ExY09RdEl5eUVVZzBPSEhsemQ5MVFXM3JsM1cwL3MzZHduZllLMGdDT1d6d1B0SUNIVm5OWDdlQmdSblJjR1FTcmppdWMxd253cVdVbDE2dlJaOVZoWFNlTUlTMGtmSkM3MjhrUGsvcjJERWRUUEk5MEdLQUptdHVSZzBwakhhRTVTL2xteTdIUUNZM2dCcWtiYmtwRGl0N0tNUHA5TGtRUVNaL1A1SXFEd1JDZVBSejdkMzYwT2dhRlRqc2VONS9ETzhtYTRsQ3hsNTFXY3BPOFRueWR1RmxtZmhmelZtdDZlY2g4TGVtOG4rZ1FLS0toZ3cyRVgrcC9EZXNpOUdBUlZnSzlrVGxPTFRrUUlhclhNYkpadGFFRDA2YjViZEk0YUorRVRYK0FpUTVKZHR1Y1ExWGFEenZERnExc0xhSmMzdHhLUTN0UUxleVVxeUtXVlEzRi9xMGRGajhZRDhrNnlkZFZGYTUrVnMrRFNHNnVDL25OOWNlbnVFTnFsakovNGNvdC9uN2YrcGlZZVlVcG8rRlpPbEZHeFJ2VjFXeTRWRVBHS0xKcFg3QUIzdUN0TEYyYm1XYUlCaU5GNmhCOTIzRy9UMm11ZHRJRTFmejY2VFV3M0FiclFyYWx3RUZoTzNaTExaSkd6V3p3endMakRzK3o4b1prODRnT3dvSFVBSEFnTHc4WGgyYUZNcjY2anM1U294a3RKWUJlVHJSalg1em5Ca2RtSTlNKy8xaHJjWWpZdGRacmdiclZUUjZjMDZvM211YUNrTlpjanJmUHNYbGlwYWpOTHdhdWZMNUVWU0tFQUhnem83RU14WUpXMC9vaUp4dU50a28wV21VL080NE5kVVd6SXVzTmtkWmZqZGZTVm8yeDhPREhINkx6VEh1ejJwd09UL09jQkVqSjFSVWpSOGI4NzVOSUVCQnVtM0J0dDZ6RW9kYjFoTWRvTWhyR0dxWFU0MkIwbTcza3lMdVJvYTU4UnhuR2lLeG1JSHd0Z05TdXZrQXF1dlIwS05Kd3YzNFllNFk5K3B2VzM1RTB0c0ZGMWd1dWpUTFUzNWZwVThEd2xBZlBuRzdIMDN6VzhYMGRKbm12Snp5WTQ1eDhsaEQ2ZzJKQVRFUjVteC9yRXQzbU56cTNPa2FVd0p2SWZHdStmcTVYZkJPSGphZnZRRDZJb3doaGI5blFheFQ2SkRmU2I4Vmt4cm1WVm5xdTVyWEk1UnE3Ukh5TUpSaU5Kbk9IdDhrbXZiZ2d6WWpnblRuNGR5ZXhjU3pPM3ZReURvSjlsV0lqdUlzUktSOGZiQUFYbXp2c2x2TXViYm92VGFtYzdLMmJSVWYySDB5UmpMdEpxZVR1eUFqZThZUWNKSkExZGNkdHp1VkNlMC9FcmhZTkl3dTBZT3pFdGViK1NsTUtPVVFzRTl1dVp1dnVRWFdiWHBYbENidXZKQVJYUHlBbXpGR2hJK3VPR01CSDdEUE8wb0RVdzFNNzhBTjNoSjZFQitxbzBZUmhJNThiQlhDSVVMSW15Z2hXVnNheXNJU1FCNTZocUIySElwWHpPek85RWxGc2R4dUJPWDBpUGhTeE5QOWVWaHlTU0lwMkV6WGthYlI3ZmZReGtlaVRENEwwRllDR0dpTnpNRGRJalhoaGR6WFB6ZVE2c0hVd0R5Z2RVc3d4K3VtS2lxNDlvNVFyeTRFSlBjaHZYMzJtSjFFWlB2THJKNnBjYVZ1bUMzcFFxWHpqMmV2WDRvcFU3dk51MmErT1YrZXJ4dklqMlVibDZBM25Sc2t4a1d3OWZOQWVqVndNSUU1UkhFU281eHIxeE5LczdjY044TnczMU1mLzl0UkFLTkRMSEQ3Y0w2NW1tZXBhb2hrblBlTFluY2IrWkdBVnMzUW1lczV5Qkd2NHhiSlI3UnVXaktJV3dRNmxmQ3RGdEhBZTBXQ29vMURDK1NCNkpzZG5wRW1QZ0IyZ1NRNkpVaThWRm9JQmhWM2toQ2hmMDJZeGo5SnZlZy9US3FUd2czZUhQTzVzVmtXRFl2R0NTYUJ1cUk3bmFBOW9OQjg3Mk5nb3VJUWJrRXJIYjg4SjJkTmpTNkpwRHJUZlY3cmg4V3J4a3I4Y0IzWmgxMktuTW1LcUhvMXBPZW5odEY0NmF6RTlMYTg3dWNSdjNKUjJ5eVE3bUlObGZkbkdqblVKZXQvRjF1amUrcU82U3c2dllTcDZEUnNpR2dKNUJjeFhWbzNSNUxWK1lWMXV1emh2aVhEK2FiMVpHTkR4MlB4NG5yYW1hY2J0cUhLb2N5djMwZXpCMjhHcmtqWGUwK3hBa0J3YVRNekxkWW1GTzlPL2cyR0llSEFTVk5yVHo0VXhySThUeEtqalZKcXJ0MVhyZEk3RE0rM0RlK0NRMWZXNS9WM1RYSGRmeG9yRXdNUFRieHJzUmFZcG5sS0hNeHhaSHMrSmNmTWI3WEdwUEJXbUxmdUNRL2ZTemV2MlBSYXVDejZBbGwvQjRFQ0V2dEZvOUJyR0VkWnBuSU9JK0xnZ241QmJxT3dTYmppLzFocUJhMzRuOWZKOUFEM1U4aWJ1YW1HR2QzVzFMdVJsTm9oem5Ma3VpUGVEMWozQ0REcDVUVk5HQStGaGRYb2FZRXlNVDBxVHgyUm53cHM4SXRCOWZISjN5YTVGZWdDbGZQMHJSbGw5ZDdDWjMzM2ovaGczRzJNdGF2TTFmQlVOQnJOMVRlRldGMG9jN2l3Q29RdkttZVNwaEJSZUh0eXcweWl3OTBuNnhwZ0NZeWttb05LR2htaDBJVlpZOEtCa08wVzFwcVlJaTlNaVRWRzk0SjJqaCtjdk9TMFJzZVFLNWdVRDhFQXFQMkNhcjlJalZodFYzc3dQVk56VEIzdndZQ2tpV0JVN3I3M040MkJBbjZOMUc5Zmw5TlgvRDVBK0ozazlSNk5VVy9OeWJxVHJWc3p3NXpmT0Q4Tm8xb3RZdlgyU2dZTlgxMERjNVlvUHVKTFVqNjZkVHRjT2wvUEViWVpQaHJpMytPKy9FOStOOWpiZWFRck9RNWdKMTd4MENKMm1Eb1lZb05CbFROV05IdXp4YS9EdWZqcnd2ckcwb2crWVliRkNiMFRCRC8zbzdpdHpON2R6WEdvZHo3ZkozNnhzRE9reU9TQTQ0TjhySFB2LytUTWFERnBKbjQzNE44NU0vbWNxK0NLb2lnaHl3ZGprbFZ6Uzk4SGc2UUdCR1Yra1NhYTFLMGx5UjVUa0RjRE4vWUpUcFIvemZielNrazVldkY3UnVkRllLSnFtSWhFaVJFaXIwN0ZFQk5hejRFS3o3ODBCTjNxSzlyT2IrNFlvMTh6NzU4bmNrZ1M2TytQZ0xIWmsrdlhlcjdJYnU4QnF0cmJzMWYzM214NTJIZXlaSngzb2lHODBYemRiQTVTLytFSjdMeEVmczJkUHo0WWdhc2Vod1JSYUxLTFRrWWdRSlhrUFJiQWgxanFYbVNyZHp2Z21mRSsyVFovZm00anR5K2RqKy9mRzgwaVIyNm4vNjUxaitiT2RFZVYzZVpMNzRRVWlzSWJScjNTSkY1VG9uV3hqZmlJR2VkM3hhY3VYWUkvWEM5WHRoWUFZa0RVWTN0MUVnVE5PUmtnRThRNFVEU2dVUWNPSEVBdWdQSjZGOXZVWlFKNG5MZFFyLys5VitHZ2E0dnNReENETlg3NTk1eU5YcE0vZld4QW5wOXcrQzZqTkluMjVVNW9zcVFHckdIWHBCTzROamJjdTZ5NWZjdkpvZHJId25wV2FGWFdEVkdGcVhmM1pXdU56N0Y5ZXZ0cnlqRzVoYVRvSFA3WHZ4Yld6YTJpRmdObFhwdUtjSHlLNnRITDVKa2l4UysxanV1bnV3bHFEMzcvVzBGM1FUY2RJTFVXMEdOZzNGYzJrcDZOS2k1bEFUbWVtb0FrSVQ1clp4WHozZmRtcCtRTm1HNlJGeHgzRzZ5ZVhpb3Baa1Z6ZmxkWXJUZlRaenhZOWdvMitnWVhtWUloUzNja3Q2RUVQZXpZMjNaSGhqRzB3UHVIdDF6c3o3WXNkR2VQdVpZbGVNTUlzS2EwbWJURnJ1bE1HeTNzbUplUkNzcGY4UHV6UTRISVJxZGFJWExoRTg2N1lnWUJkbnRYa2MzNmJVL1A0dy9rcFpUOFU5RjBNMEIwaG9Gbm9OYTB1Y1d3eEZpNTBzN1QxNXdOMHdxVFpmQjdyTFY4eW1oYnFiY09GL2phZGF2VWZOMnNoWjBHUTFwYjRONDJrZEduMGNWVEQ5MS9XTXljbjVlcUlSVC8xK2RGa2IwdlQxZ09KdVZ2ckNJZjIyVXVLcHA5MzZTRlcwcWxzcUZ1bUpQV09UQ3p3VTc0WHNLQStXQnhucUROVmtBZkFxSTNqV3FzaHluOUhNYTk5U3ZaQm1Hdy9LY0IxZWpReW9QRlk1c3UvT0VQRDcwVHlXb1EvaWZWUjNsOHFUU0F1dlRVWDRGNFNlWTBhTkZ6UUFpVlFGZzNaRDdHLzMwRUtOL3BjRXNBQlNqQlhZOWRpNzRybFhwSmM0ZFY0OGphSUJyQXk0d3pMd0lEVlp1KzNXZ2ZzdTBOcE9jWXd3M3ZYSFpRY3JSQzNOdFFzTFBHbUVNWDFBOHNIMzBZWnVnQll1anhDTHc3ZSs1TkRUZGRROGViR0IrWWc1YVgwS3Bxd0l1cFNMcjN5RDVKbkZ4VHZmYW5wNk9HMCsxK2RtRjM2SWdHc3c5QkJjUDUzbmZIUDdObjNRWlhwc3hNK0tweERObjErQXFXQjRrZGpiaWFZdnZQcVA3V1E0Sy9EakRVWjcxMy9EYkY3QkdLU0tKMDhYK0wxVFJSeXgrVlc3Mm9PdkExM0FRdXJYdTA0OXQzTjlGS1lFNFczYzZFOTZhMDF5WWR2aTc3K0RCUlh3OW1SQy83TFBHSmxrQSs3UjcyMjFjR1FmY1dveTZVS2NyZnhBdkFmQnlENmNOYWN0ZXFIQ2FlK3BDbG1MR3RHQmdtQ1NQN2pCSFIxdGQwWDk0dTM2MWJEK1lsMmdZczk5dGtvQTF1Yzg2NFBmQlRpY2FwcWV2aHFYQmZlMmJQbGkrUDFIak1aRmF1NEJHdVZNR2wyNklhS0RsSjR6NjlYUjlHeHhYSHM1MFdiTGJpOEExOFJUZUVyaDUxV1paVDFoVFRGZ3B4OFdqN1NQaXFUNnNrMk9LSDg1cjRDNjRVc0RLenFuQkdYZlVVb2FGODk2blVKbmtTdittSHZSSWlLTUJoVVFPbnp6R3ZIMHE5K2FzbVk5YXBxWnF3V2M4YUdET01FTWxnZVFxQlNoMFVhUUQyMkk3c2VmVGFya0ZnTE5uT3BBMGVIK3F3ZDZnL29kWCtWeVd3MEIxYTFtL3lMUGM1VlFaOXoxWkpPOExYYjRZb3JiZDEvV0xtZTdVRUI3QnIxMkZjRmcvWlZvMjZYSXNBOUp0aUJLZGF6bG94RlAwUVF3T0pwUVVvRWpndzkzVnNRM3B0MHJDS05vaDZuSnlYVkdjT3d3Zk1hZGNYUStVUnZILzUzNSswMGVZNEVnNS9aTCt3ZlV5MXBHSlVrblpPam5iakVtSEVZaHV3WTBwK3htNHhaTTFLMDJ3MURXY2M4YnNpbk10bWlaV055dUNCWi90bmhIWWp6L2daT3FMdXNnd0J6UVZkdFBGUVhlWUR2SGxSeGN3dHNSMkkxalI5U0tpZHZPYjJwazdEMC9raUt1T1h4M3BtRHc1RkFIUmJtWFZsWithbFN4ZSs0SFN1ZGl4ZmEvUEpZWTZFZW1vMGt0SnI2OGg1MlljR0t2c0g5RDd4OUZWN0w5Uzd3ZEt3S0J1WG1CVzdmYk10WjBCSVJ6RmxQY2IxbVk4bnRwc1gyWWdBdXMwY00wcXhSTFBXdDExS3h2ZmNqcXJnQzlhckUzbThKN2ZlSlJjUVZKQWVzODRyNnUvbWdiVW5xZHovZzBDMnVKb1Y3a2s5L0tXQ1ZMb3dXNU9SUzdsdloyai82cUNPa2V3K2Y1Mkkycnlxang0K3EyNS8vMXlUOXREby9teStTbFpsejlscjhPZGRqdUNIR2xkckRCbkVHRXduSlhCWG1kSjdYcStKS3RCUG1QUmVwZXdtVzk0Uk9HVkVZOUs0OCtyOGlFaEF6blR4Z1ZHZEU5T0swRVhuU0NGZHh2RjhhNEtUQzFOeThacTI3N0JOTGlGY0NITUQ1SGVoWXRjaEQraFo3OEZXQm9CQU4ra2hMeW15eUFJR1djbGE3TFc4MWxnaWNDUWR0ZGlhOE1QQUhka0h5SHFHM3BJdWh1ZXZNL2JpeGdQeXNaZTRSd3I0czRMY3ZIM1c1QkU4Z1YvNncxK1J3ZWpNekNSK0p2OC9HOUVXOFF6K1F3ZUl4WktDakErblg0YzZ0bjlZYWZVTmZsOFUrYzFXTWR3dlhBOGRhNlozUlJ1RHNYYWdBVnZUMFp4OVE2cGsvcXNDS1NBejgxelh0ZnRGZkVETlR3L25NYmg2UVdSWlRZNEtuNS9PRlhmZlNBai83NmJCQWRpWW9SRnA3YzJNcndYQlRadDVwRDFzbTJHSVZjRWZ3dHAyMGFkZjJpWlVYSTN3RFdsQ0FWWkk1VkxmNjZtTXdHWUF4ekN2bGlHbys3dmlMMTlZajRJS3owN1pvc01QVy9QcWYwL3JJenArbVAvTzdKeHhIMEx6VFo4ekd0R3NPM0VJVDV4NlZUclhXK0w5bGdlOVVNTFA1WmJmQ3ZPWWxHbk9pZUJwRW5SU0J4TisvZUJOZjBqYnR3RUU2QmFvelZ4VjRxV09MUTcrNmlrZmRHK0JLd3V4Q3lJK3IyYitnMk5NdGtYN1I3Y2ZWREtXaS9nQ0VrRDFjMUt5OHNMWGh2Z2VPUHZoNHFKWjZFOEdyN05UYkVGUGMydkRzVzJXOG1sanRGcDZjQ1pXb3NyeVJISzNROUR2Ujg4bTI5TmtWblh1cmlRSU9pU3NhRHArdjIxTTRmbFVjTHpZZXZCQUM5citNVnFOdm9EUkNnVkZqY3lnTlhLN0N4WUZqYi9sbzA3VnZaUXRsMG16bi9PdHYrZEoxMWR0cndIazFVQTZ0ZEN3ZXMzazBuVTJMU3hzeDdOTVNQWmV0c21hTXVrSkhvUFhkQ1I5SDZvem94R21yMldZeUpaTE9aRkFkZ3cyazlCQ3ozWDY5M09MeUdUc3kzcStlZUpKc2U5MnlhSWc2NzEvZjhlZ240UEFNeFFLMlh3MEx2ZmRKOUI3YytRZFNUUFN2bENyWjRMaC8yaHFtN3RiYVhEYnpBbGh1ZFNFbzdBZXVXbXFwenkxWEtWMXkxVkJycEtSTHFWUzVsWnFlTjlxOUJzVG1OVW9RTVdSTklJR0dJMFhreXNFU2NnVlpvN0hoWXJBMGFBbFNvd284RlZmdXkrWEZtb3JoT0VFb244dTV4c0Y1WUl3NWNpb25vTUlGaDIxWFIwc0hpdXVtRHRKZncrbm41aFNWRldMK1Y5UlUzRll5SUZKdlNHdzJwTlV5aWdYOEt1Y0RtamFPTzNCdm4wNlhzUWhiZk9hVWRQYm51U0RXbWpJa2s1MlRZVjFhTkkzaGxraFdyS0VaUGl3REdyeVBjUGI3L0l4bHo3YXBIa1RoL1lXdmZtc3NGNlM0a2hidkQzcUprUVVXWEJYbmZpQ1VVa2lKalFKbDhMWHRFOHFkSTZqRmJkRjJKN211Mjd5WGw0M3o5N0M5ZzFTTjJXd0VvK0REa09iUGVscEVIWGtkMG0zRE5Ja3VqVk5LTkY5VEllemYxcXhwcGRDSW1oZjhOd25hcnY0UC9WT01NLzN3UWN3NjRESUp1M0JuanhEd0lEVWpOM25hTW1vamV6bTZQRERjRngrT2w4TzVRdXcxOEdRbTRDOGE1aC9SU3o2UGNGVzZnQlRGMlRHVnhWUXFPbkdaSWFLR1l5YWRPQlV3V2h3cEZNNFkxTXBZQWdIWHEvQnRlTythS2JjR0lVV2dNS0t5TlNSNk5oOXV1Z1lzN0NDcUhDejB3cWdwM1lmWWJIbkVsRVpoZ1dmSlA1NDNmZCtPUzQxSU1xc3pHak02SkdtVXZ2Zzl0SHlFZ3ZDSVpUSzNXRUhBUkNMbWNpZGlSOFRCM2lRQnF6MUJxUnFXSi9EQVJFOFMxSi9VNEl4TDBFV0JnYjZJK1FMeDV4ZVB4cmRWNVNmclorRjJHRWpzVVpYVk5IZ2FETWROV2tzUU5aL0hBS2NOR21VMG52RUVCSSt6T21FMWl4eFhQbTRtMWJCSkhUK2tWSGt3bzhwWEVBa2FzWndUV0MyQUZmUlZZdzAvVVk0dExxMVlxTFNqWnl1YVI2ajV3SmI0QW0reVQzR1dWWHVjM1lnTlU4M2diYmxjOEpLc2ZValEwTDVqM3BVRmNYSUdjb0FWMEM3dytiNXFSaUpXeEJFcmtuOFp1WGV5V0FvV2ZlbWxBeGRwdkxkdy9yaHFYYnZhc0VYWThzQzFoZnlLY3BCOGI3bGJ5UDFYQWU0V3NjTHp4VU5iZDNYMjFOWTNQRUZ6d1h1THR0NVJmNWlLUFNXUUlqc0l2ci9Wcllidy9PQzdDTDh2TS9CVEhIWjU1WWFKTXBET3Q3UnRhdHBaT2R3Mm4xNURoK3RMalM4QWZ1WGpQUnpldWI5UUJ6VnZkcllKaFFFVUgybWt2MHk0OThCR3duZnZpanRvRmJVM1NkcTJYL2QwUzN0THl6U0w5MU56ODJPZ0JQZ3NhdSt5Z1QrdE9BZzUxSENmWGRHZnluR3FFUlR2YThBMnFQTDdQYTJOM0xzL25aZEFLOTl5NkNrMjU2NURMVzNVeExKUlkrMnQ5L3h1dnJQWjB0cFNXYjZ0MHJmVjByU1AwOUhXdXE2MWRieTFUUXVpRXJ4TXBKZmNwcmRERlRVUFZiTkZOenRZYWoxbCtkVzhuNXBiWHVRMHExdWFENE1ub0ZDaTM5MG51aGpmOXlEWXZ4eXlJM1NhRjEwWHgwcmxKaXc2M2Eza1U2cDFLMmR3a3Z5eFd4eXIxYzhUT2tGT1hXS0txajNiaXZJRVgySEdiYnBBWXVYRGpxcEQxc0UrbjFadG5jUkpybW1nY25pVkRPdXd2UFdTQ3V5d25uOWFZN1V2MDFETjZ4RFR0MXFsUTllN2hVdGJoTUtXcGNKRUJTRmI5ZVVZWEFKSDVucTBrdnNoRG0xRnJXVzM4bzdCMjlCbHo4NTlXeVBQQTErYmp3YXArUHhraHRkMUlLSXc5ZnpseWs3VjJrNU1ubXVWWHNtdHRVTnpySDN4dHRZSDZKcWpPS0syUStlbXYxNzVQcVEzOFQrOW02Uzd5ZlU4cThEK0J4aFRSZUhDdmpUbldrQU05MUpZMlFrYjVBR1BRcVdKcUE3Nm5sdyt3L2U5T1lCaXBpNGQya3RJZU9ST3YxQkZjVythZ0NoQTNlc2xFWFVHYmNJR0FSVGM0bmhUMTFCWjY2WFh6VEZMRk55WklUNU1MVytyeUJtb2RXMlZyRVhEUk1acVJELzJxeU1MNzJYZ1FwR0VMZk5vejcwZ3ZvN0JrQnp4V3A2ZWhBVmFjbnBldFhrTjZ4SkdkZ2lKeWhwSmg3YUNNSWdETWNwUlQ4cWlhTHZMN0dhTlUrWm40dWlscmdhM1lvTStpS3NISHFqOUd1NG5ncnBGSG9XcnZsRlFQc1BjcHhsanFPTHN2ZG1tamJyZW1zSHJhOSt1U3NHRCtvVnVwYnNPYjdGeFpZVTZzcXhSYmR4MG5XT3hra2tpdXM0dm53L0swV0NKUjV1STc1WFhUMzE0QnMrOURUbkJ4YnlSbU5HNXd3NUJnV1BVSmhuWnNsMldXM041KzNVcmRpVTBMaXF4SUM5ZkpodWZObCtXVEpxdTBMY1Nra3hYNHpGQWU1UldSTFZjUGo1VE0xTkZSdFA1YmJma2MvWWJOTlVJaUxucFRCTFRzcnNwZ0NNWngybkZha012SnVjb2lqd2FVTWFLZUw3UVF1ZWo2S08yM0pGbFFJdFV1all6Ty9TWXVFMDdmYnZJUk5HOE1uY3BvNWQzbDVsSzBqSWptZHU0OVk5Ylg2bzI2WWxaYzdQZkhmOTB2TWRtSGx3WlFUeUhETlgxR2w1azFqN2NQNC81TU5FcDQwUUp6VE0zR0xpdjBKcmZCUjR1QWZmMHFCQk1XMEtVNFZtcTJPTXFjTE1kVERldmFQaUNtYlk0d1l5VkwxZ1pOblZSc2o0SExwYUF1ZWFucTRMY0NwbFhwUktpa3ltVTZZYWM0ZXUrRUlvKzEvTjUrczlGd2k5MFFQMk5yZ0NLR3BURExES1dMYVJXNmtiUGFtTjNFWm1LUklRUXlkVWViRVMwK1hHcWRxaGJnTVNtNHVIOWhiN3dBYXFPSVYyQzRLUFV2bUlFTDFBUGZBMzRLNWxtaXhWMzZHODBLTHNiVW8xQ251ckN5QlJGN2tjRlMrOUVzWVgvelFmZjhCL2JmZFBreXpzcE1JNHFqcG5zWHJyQW83LzFxZGZuUzBUTTNBYVMyVVR2UjhlTFZ1TGVqdXdMbEhkYnduVVdYWkZWbW94aG5hTExqakNiTmZpWjJRSkpMZ2lLMjhxT3VreWx5eFp5ZXVKUDNDL3BJYlE2VEYydWhYZ2FjS1pXRmJ2Z3ozR3Z3aDVnYUdkdElDSFpkQVB3UGFDekl1amFlMWZNZE9GOTJkNFF3V0h2T1gyTEtESmxqMmk2Tmpmb2hxc2doRnV1RzloS3JhWE4wb2hWMEVPa0dhTExMek9NdnVoWEU4dlU1ZGJvY3Nab0RNbE1JVE55K1RXaTBKS0lMNURVKzAvcGQwZjBRNG02Q1hXcDhNSFFJK1Y5bmhuY3dTREtNY29RL2NoelY3OWJLYysvdnZnNS9TRndPNzkwN1BENXUvZFV5dmV2OUQyalgwWlpkQWVTUmkvdmY2cTgzV096SnhpWVdoaktIOXA2RG1LVWR0dzM1ZjRTeHF0Ykg3b2pTY1dIRnJuVytEN2xZbTFOaytIbWF5cndkUFJDdmZZbThNc2xqeG9mRWMyTXVEWDMydy9NTStpbHV2enJEWndUY2VsdHVwOXVodDBHbDQ4ZCtRbkhXMDVVc2p6WGEvbm4yYk5zODNUOUVIWm91OG50NDhzRk9QczE3ODkzQ2JYYjJzTkxXVEdOanBVNEFNT1RyTGhXeTQ1UFhxdVZScXhPVlFUV1NHTldoeXI4eUI1NDhvSldZQVBaWGNEaHpjS085Mys4QitPNVI4eEtxTjVjbW95a0ZDbzFyaFlGWUsyb2hHZXpSdFFWakc2cDhqbkFPbFVwaitQcWJjUy9ubElDTldRNEM3QkVjUDFPYjkvWW5jNnRhNEkzTG5KSVZrYjdObUhkV0tqMndyOVp6S1RpNzVzWEsxTkRlNXhkWTRvcHo4ckUvUWVuSC9jc1dYWXFGZG1iY1FqWDJBZml0cEJFR3BHN2ZQSXV2ZkNyS3hWYXY5WVFZbVdramc0M3FBTFRmSmR0ektvVXhueEUvM2ZST20vUmpLaTd1ekFuT2FnZ1NGblhucGJySUhDMkxOZVdvdkZsMnBacXJnbi81S0xrc2pFaUlNTmkvSWhFby9SRlpaZy9heFlES1MvWUpVenJVN3RnaDl1RG03anRwQ0ZJV2I4OTJ4MkkyeXF5TVNyZWJyOUlxMlBXc0oyTVhyd3JOU0loM1FBNUEyL1pVSUswMWZid3ZtWUVGOHFHcXBCaUxHWHFYUzhldXdaaUxJN1Y5cWFQTGhqMjBVSlA5MnFWRjZWNHZVUWRZczM4bDlCVmdTbmNZT0c3WlZrdGl0cmZmdnRCMmI3UUorS0dtbk5ldkpValdldmhpQkN2VWlHTlBkeUdlQVhMdDBKNGZwQ2MyR2tGOTlYVFVrRzRWL3RxcEtYSDllbXBCeFZudjJ1RFhYcGZFOG1zbW1OV2xPTVkyRit3eVZETUdTZENZZVBtWW02VG9kT3lDem5UNW5ESU5GSFFJaVg0WW5VNm9WM3E5VWd3bmN5bE9HYVNabytYU2FRbVZqdXpCazNHYUtRWFJ4Wnh1ZzFKdnMvMHcyRDRmMXZ4eVVRZUdCWjV2VElEKzRkYzhzZDRUKzNRdmxmQVhCK2FJNytVemM3ekZBK0xPWnhmNUtDOFFtMXZmOHhJQWRCb1V6bDFOS1ArUkhkRjRmaXA1bGNhbW5ZM2QxUzF2MWIvdFdQSVlpOFJoTDJrNVE1bmFVR2c4VG9hMTJpVG1GbWJVQTBVVFdoMENUT21TK3BpZ0hjbHBEaHg4R2FvdlNXakxYUXIwVklFb2gvejFLVVR0bjNYZU9nNzlEQys1Q1NVNlJyZFBlbVRYLzFzaWR2NkQ1Z1ZhVlpzSlRQblV6c2xWNnZGVXZYVkV1blZISWxFYzdWWFpwTkxiYkt2TWJCc2I2L2tzMytMb2VYVFY5SVFzZ01OOWwwYjJnSlpuUE5wT003dXZaNHVXYllkNTlSVE9UdzNKR1hwbnZxcWhiWCtHMERLVkN0Z0VsMVVMUlBmM2VyZ2tOOVBGNjRFRUhXWlJ0M0UyNjIxZlBTSGFqK3hTTDJIaGx6d2RUMnpxdmgvd1pkc0NFak5vNG91SUxkN0ljZTFiUkh3ZnBWV0JaaGpmWmlaVEF0Rk5WTUxnNmdXTWhocW1XaEswUjNFcG9LdHh5dVd6UzFxNW1ycE93cThlVnkzQy9GUmVSTUlIS2VaS0VJK2VZaXVvbWwyQ1BvTUZqWDZxOEJsdjBjRTNWdW9RazhLNXllTXBkTkhJSWtzM3hoTENTWGxmRThxdjN4K2p3OVFZcGhTNHpMSE5mM3p0ckVtTUowNEcwMTJVc1BYNSt0cXVrWGJWMmhLYlVrUlRJNmMrRHhEZmxNaHhvc0NJYy96Z0poSEZVdGRqeWx2V0NrcHVMNDJkV0RmcE9sdWFxbFoxaE5CdE5zTGZCR1JxVUptSVN2OVo0RkVla3Znald0c2JHcjhRZTUySTdpOUpmZ1JYZ09RdlY3YkpOYXQrT3R0WS9Rd3lrdU53SDRqQzFiNVpVdlpwNyt1cTJGa3VyczRtZ09oZHJXL2Q5amdUUTY3cGdLRHI4aG0vazdvOW83czUwNnkyQ2VlWTNQdU84Rm1uYnp2YnRZUExhMy9XL3JaRkpaN0dnSU0zNjdYd1BZamdNcHIvRU1nNFhvRG01R3VsMWdIczcvQ0lTYWIzenVnazA0TWFBMElWRVV2cm0zdXBXRFI4RGNLaGx0UU1GeU5naUVUSS9nbmU2MmtUZDZjMmRiazVXSERyeDdaSklzcWNLWXZTdUpSbElhaW9CdEZ3VHNvQ3Y2VW9nVEFkY2dKTGNnSnp5SW5QSUtjOEtHVW9pOTB3ZlNhUnV3QW9vK29xYnFSMnVjUnBnNC9jajNCVEpqOUtlWng0R2ZqbW1BWDVUbVdZQ2xUTU55bXp3UWx4V21EUjlWKy9pT2NKUFpmbUI2SGwrQUdqWTBvNHRSdDF2Y0h1NGJGYW4yeXorQWJSak5iOG8xU1RqZEdHcU5PeFg0U0lUVnB5Q1BYSTh5aGlUM0JBaVllM3pJVitLaGs1aVJDUG1qVCszU2xlcCt1QnZuZzVER0xRZkVYQThFQTluYnJuWG9Bc1h3eGU3K3VJdEFJZm8zNjhVZzNRbUJxK3dqb2JmUXgrZ1I5aWo1RG42TXZ3SmZnUGVrclV2d2FxU0srVmQ3RDcrRDN6QThlMnZoMkl6RDl0ZW54VkQ2SkM0NTEyeHQ4bGo1SGZUOVBmeHArb3M0SHRBVmR3WXpLbktxK1FzenhleG8zckd3TGNyZDJWZFFRTjFtWHgxUGN3QzF1NHNQYnpCTkVMdjJMYUxEZFV0UDJvYlF4SzhhekhvTzRXM2lEM1Q0OWZXZVUyZWZSM2Y3L3lMRllabURRWHZjOUs5bGFnVVVBTWVMZWZ4YXNBakNIZlZnQVpCNklkWXM1MFh1MTNicUxGOWIyNEk5WkQyc0RiaTE0L3o4Z3kxaXhsdGpndk9VQjVMb0FnQlhZemFsSmdzYU1yUjF0WFlkUlJsR0g5UlFkc0UrNnhtUmc4eUllbzhveFJ1TVFCU29QdU1PTVlNTGRzNHhHQ0orSDJTTWk1YWJ1cy93Q1ZZNXROQTBYbTB5OXhHTTBKdEFPcTFwZ0swQmRLQWY3REtHdjBNZm95OUYvWkdsYWxOdmx3bmxDY2hndFJMOWxXNkFyNEtOK29TZGdJeFhwSUp5RjI3Z08yTy9OQWxoMVZYZU5PeVBkOS8zU0lLQS9WQ2szOVk0RVBZaXVIZU1CSEpwV2ttM1FlSkVMUEVZTDBXOWdnWkthOXpHSHp2OGJJN0RIZS80WWJoZmUyRTlpb085Sk0zMjNidWJzU2tRdmlNdytuM1FOSlVlOHRPdHJ6eTV2MkVhNjdBMnhWWlRzNHU4eTFqam51NTNOQzNrRWJpRS9aanNpdWxPajIwUTY4VTZZRWltdHhrdXVDM3ZMOFlaTG8yc0ZFYWRReHV2RzlsRTBldDYrbGsrN01RSG9OMFBZbHNhWGIrdmFOM3RyMXk0MmRWbWtmU2JWNXhpM0JiVjF1MTFNOXdEMGxPekxYbllDUjkwdDR3dCtyaXVvS0ExOXl1d0QycExBSndRN1ozeStjSW5pOGtnNjE4blVTQVQyTzZWSy8zV0JJYTFoVDJldzdFb0ZTcmFNSWorVFdFMCs5NHJhSEFKd0VUOStaN3BsWEVqcTN4REgzUURnNUlHTys1TDhMMitKLytpd3p4UE14Z0VpQmdBSS9peVpvSEFtTVAwL2VFNWs5eTZpTmUxazZ3N1d6NHVjcnFUcHh5WjNCZVVKdjJSeXAzWEZUUFlkeUw3Skl3UjRSa2p6TjdhelhpMkNJTUUwcFRYb2RaYzdJU2pkK3JMNEZIeEdFeTNBUkhVQXgxVi9MWnZpamw4d1dWMm0xZlNDZitzd2MwVzA2T3FhNW02U0t6eXRSbmhRVmFnTTZNY2hSZ2tKTVhZRThZaEI5dW1Lb29UcEdScU5rSzRmeDRPVyt1KzRDcmNHWXJnVFo1dm1HOVRVanRmbmlxWVpVV1Q2VWcwZUUzaGtpVUc1bkJwZ2pGMTREWGJvK0RRUmJmcFYxM3pNcGxJSkN1YytWTEp4R2dhenhGd1dJM1pMbmo2NVg1MDB4QjAzb1owTUw0YVNQNkd2UVhLYnVQTXJVcXZtYVFoM1VHWnJSVVpOaVlvOXRYVFJVN3hHbGRTeXBZNDViQXJMVUxNenRBYjY1aW1kSU9hUkRZcElVRjVCc0lvN0tRNi9VelN3dEkyU2VkUzFrN1FvSVhQU2MwR1RGNHV6V2h4THh2d054RjdoOXIxMkxMWVhJZDlGRDVzck8vUzMyYktlV3paUEpxWC9BTTNRaDFwdWZTdDc2amlRdllFbDFtTTBlTTdUTWt3QUEzdDlTRG03NlphWEtMWjU2NXZwTzBpeHZmUXlDSTJqNUJPaFYvazJQaVYzc1J0NEtxRmwvbUR1RG5VejZtN1Z2NzhSUGIzSTFqUE1YVkNxVllpZitFVEZIblczcmNoTWI1MWUxdXVWcHpMMGxnR1RJQVVNYVJVRmNLQURzSUVFMFFJWm1LZnlEVWxGWlljbzJhNi80M1FEQ2FYc2tjTUdPSzJzNUtGenFQeWk3c2pmSjlTOE5Wb2pqOG9YMU1qdXlmRUVRSUNQY1dpbUFXZ2pMQndrSnEwT0pqaWRIWnoyaVkzT1p6c0VrZG5yRU5seW5TTllZbDV5aERLWFlnOGoxYnFUQ0Foc25DN3k1S3RRS0p0WGxtSXloVXU4TkxMQkJaaXl1UU9VeURiSmRFVW15RFdackw5Q2VhYVpZaElIN1VTMHVKWG1lYlRJaWpaQmNyRjgwMjg2SnlldjdFeTF4RVFPcXNtVHc3bkt0ZEFVWmV6eVRlRGxreTNYQkdVWjQzTEtwaDdRSEs3eHFlQVFldnRvY1dSbEV0SmxBMDFSWk1wUktUVkZYZXJweFZ4RnhiNjhuRjdqc3E3R2JkVTIwQnVlSVZKT3dzZkZxNFRQQklVU09MaTRKTXJRVno5OWRaTWhhUEM0V1RzWXlnRW5acXM0bXJ3WUtkeGV1UGxZS1RMSnFEUy9WNG80aENvK0R2TlFiL1FJK3ZIb3JlZmdNVFBNbTRZNXUwNzVQNkpJWGhIL2UxL3lud0VBKSBmb3JtYXQoXFxcIndvZmYyXFxcIik7dW5pY29kZS1yYW5nZTp1KzAwPz8sdSswMTMxLHUrMDE1Mi0wMTUzLHUrMDJiYi0wMmJjLHUrMDJjNix1KzAyZGEsdSswMmRjLHUrMjAwMC0yMDZmLHUrMjA3NCx1KzIwYWMsdSsyMTIyLHUrMjE5MSx1KzIxOTMsdSsyMjEyLHUrMjIxNSx1K2ZlZmYsdStmZmZkfWJvZHksaHRtbHtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS40fWh0bWx7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfS5tb25zdGVyLXBhcmFncmFwaCxwe2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjY7dGV4dC1hbGlnbjpqdXN0aWZ5fS5tb25zdGVyLWgxLGgxe2ZvbnQtc2l6ZTozcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjE1O21hcmdpbjo0cmVtIDAgMS41cmVtfS5tb25zdGVyLWgyLGgye2ZvbnQtc2l6ZToyLjVyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMjttYXJnaW46NHJlbSAwIDEuNXJlbX0ubW9uc3Rlci1oMyxoM3tmb250LXNpemU6MnJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4yNTttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDQsaDR7Zm9udC1zaXplOjEuNXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNSxoNXtmb250LXNpemU6MS40cmVtO2ZvbnQtd2VpZ2h0OmJvbGRlcjtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg2LGg2e2ZvbnQtc2l6ZToxLjNyZW07Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19cCtoMXttYXJnaW4tdG9wOjMuNzVyZW19cCtoMnttYXJnaW4tdG9wOjNyZW19cCtoM3ttYXJnaW4tdG9wOjIuMjVyZW19cCtoNHttYXJnaW4tdG9wOjEuNXJlbX1wK2g1e21hcmdpbi10b3A6Ljc1cmVtfWRpditoMSxkaXYraDIsZGl2K2gzLGRpditoNCxkaXYraDUsZGl2K2g2LHAraDZ7bWFyZ2luLXRvcDowfS5kZWNve2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMSkgMCx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTIpIDUwJSx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTMpIDEwMCUpOy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnRleHQ7YmFja2dyb3VuZC1jbGlwOnRleHQ7YmFja2dyb3VuZC1zaXplOmNvdmVyO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTEpO3RleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudH06Oi1tb3otc2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMSl9OjpzZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xKX1rYmR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLXJhZGl1czouMjVyZW07Ym9yZGVyLXJhZGl1czoxMHJlbTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCk7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtwYWRkaW5nOi4yNWVtIC42ZW07dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwfWRldGFpbHN7bWFyZ2luLWJvdHRvbToxcmVtfXN1bW1hcnl7Y3Vyc29yOnBvaW50ZXI7Zm9udC1mZWF0dXJlLXNldHRpbmdzOlxcXCJ0bnVtXFxcIjtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LjFlbTtwYWRkaW5nOi42cmVtIDFyZW19ZGV0YWlsc1tvcGVuXXtwYWRkaW5nOi42cmVtIDFyZW0gLjc1cmVtfWRldGFpbHNbb3Blbl0gc3VtbWFyeXttYXJnaW4tYm90dG9tOi41cmVtO3BhZGRpbmc6MH0ubW9uc3Rlci1uby11c2VyLXNlbGVjdHstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9QGtleWZyYW1lcyBkZXRhaWxzLXNob3d7MCV7b3BhY2l0eTowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNWVtKX19ZGV0YWlsc1tvcGVuXT46bm90KHN1bW1hcnkpe2FuaW1hdGlvbjpkZXRhaWxzLXNob3cgLjE1cyBlYXNlLWluLW91dH1kZXRhaWxzW29wZW5dPjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0ubW9ub3NwYWNle2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHktbW9ub3NwYWNlKX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17b3V0bGluZTpub25lO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdLmZsZXh7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2t9OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJRdWlja3NhbmRcXFwiLFxcXCJTZWdvZSBVSVxcXCIsXFxcIlJvYm90b1xcXCIsXFxcIk94eWdlblxcXCIsXFxcIlVidW50dVxcXCIsXFxcIkNhbnRhcmVsbFxcXCIsXFxcIkZpcmEgU2Fuc1xcXCIsXFxcIkRyb2lkIFNhbnNcXFwiLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZixcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCI7LS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTpcXFwiQ29uc29sYXNcXFwiLFxcXCJDb3VyaWVyIE5ld1xcXCIsXFxcIlJvYm90byBNb25vXFxcIixcXFwiU291cmNlIENvZGUgUHJvXFxcIixcXFwiRmlyYSBNb25vXFxcIixtb25vc3BhY2U7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTQpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi02KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTIpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMyl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTYpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTIpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xOiM4MzNhYjQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTI6I2ZkMWQxZDstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMzojZmNiMDQ1Oy0tbW9uc3Rlci1ib3gtc2hhZG93LTE6bm9uZTstLW1vbnN0ZXItYm94LXNoYWRvdy0yOi0xcHggMXB4IDEwcHggMXB4IGhzbGEoMCwwJSw3NiUsLjYxKTstLW1vbnN0ZXItdGV4dC1zaGFkb3c6bm9uZTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTEpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTIpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aDoycHg7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXM6MDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci10aGVtZS1vbi1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLW9uLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci1ib3JkZXItd2lkdGg6M3B4Oy0tbW9uc3Rlci1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLW91dGxpbmUtd2lkdGg6MXB4Oy0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZTotNHB4Oy0tbW9uc3Rlci16LWluZGV4LWRlZmF1bHQ6MDstLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lOjEwOy0tbW9uc3Rlci16LWluZGV4LWRyb3Bkb3duOjIwMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bi1vdmVybGF5OjIxMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3k6MzAwOy0tbW9uc3Rlci16LWluZGV4LXN0aWNreS1vdmVybGF5OjMxMDstLW1vbnN0ZXItei1pbmRleC1maXhlZDo0MDA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQtb3ZlcmxheTo0MTA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtYmFja2Ryb3A6NTAwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wLW92ZXJsYXk6NTEwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhczo2MDA7LS1tb25zdGVyLXotaW5kZXgtb2ZmY2FudmFzLW92ZXJsYXk6NjEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsOjcwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5OjcxMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyOjgwMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyLW92ZXJsYXk6ODEwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXA6ODAwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXAtb3ZlcmxheTo5MTA7LS1tb25zdGVyLXNwYWNlLTA6MDstLW1vbnN0ZXItc3BhY2UtMToycHg7LS1tb25zdGVyLXNwYWNlLTI6NHB4Oy0tbW9uc3Rlci1zcGFjZS0zOjZweDstLW1vbnN0ZXItc3BhY2UtNDoxMHB4Oy0tbW9uc3Rlci1zcGFjZS01OjE2cHg7LS1tb25zdGVyLXNwYWNlLTY6MjZweDstLW1vbnN0ZXItc3BhY2UtNzo0MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTA6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNDo0ODBweDstLW1vbnN0ZXItYnJlYWtwb2ludC03Ojc2OHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTk6OTkycHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtMTI6MTIwMHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLXdpZHRoOjJweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGg6NHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLWhhbmRsZS1oZWlnaHQ6NTBweH1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17YWxpZ24tY29udGVudDpzdHJldGNoO2JvcmRlcjowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7bWFyZ2luOjA7bWluLWhlaWdodDoxMDB2aDtwYWRkaW5nOjB9W2RhdGEtbW9uc3Rlci1yb2xlPWhlYWRlcl17aGVpZ2h0OjY0cHg7bWFyZ2luOjAgMCAwIDYwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRlbnRdLFtkYXRhLW1vbnN0ZXItcm9sZT1mb290ZXJdLFtkYXRhLW1vbnN0ZXItcm9sZT1oZWFkZXJde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi8uLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50IH0gZnJvbSBcIi4uLy4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBwYXJzZUxvY2FsZSB9IGZyb20gXCIuLi9sb2NhbGUubWpzXCI7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCIuLi9wcm92aWRlci5tanNcIjtcbmltcG9ydCB7IFRyYW5zbGF0aW9ucyB9IGZyb20gXCIuLi90cmFuc2xhdGlvbnMubWpzXCI7XG5cbmV4cG9ydCB7IEVtYmVkIH07XG5cbi8qKlxuICogVGhlIEVtYmVkIHByb3ZpZGVyIHJldHJpZXZlcyBhIEpTT04gZmlsZSBmcm9tIHRoZSBnaXZlbiBTY3JpcHQgVGFnLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vLi4vZXhhbXBsZS9pMThuL3Byb3ZpZGVycy9lbWJlZC5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzA2Nn1cbiAqL1xuY2xhc3MgRW1iZWQgZXh0ZW5kcyBQcm92aWRlciB7XG5cdC8qKlxuXHQgKiBgYGBodG1sXG5cdCAqIDxzY3JpcHQgaWQ9XCJ0cmFuc2xhdGlvbnNcIiB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiPlxuXHQgKiB7XG5cdCAqICAgICBcImhlbGxvXCI6IFwiSGFsbG9cIlxuXHQgKiB9XG5cdCAqIDwvc2NyaXB0PlxuXHQgKiBgYGBcblx0ICpcblx0ICpcblx0ICogYGBgamF2YXNjcmlwdFxuXHQgKiBuZXcgRW1iZWQoJ3RyYW5zbGF0aW9ucycpXG5cdCAqIGBgYFxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gZWxlbWVudE9ySWRcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICovXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnRPcklkLCBvcHRpb25zKSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cblx0XHRpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKGVsZW1lbnRPcklkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogQHByb3BlcnR5IHtIVE1MRWxlbWVudHxzdHJpbmd9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudHJhbnNsYXRlRWxlbWVudCA9IGVsZW1lbnRPcklkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR8c3RyaW5nfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZUVsZW1lbnQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKFxuXHRcdFx0XHR2YWxpZGF0ZVN0cmluZyhlbGVtZW50T3JJZCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IGV4dGVuZChcblx0XHRcdHt9LFxuXHRcdFx0c3VwZXIuZGVmYXVsdHMsXG5cdFx0XHR0aGlzLmRlZmF1bHRzLFxuXHRcdFx0dmFsaWRhdGVPYmplY3Qob3B0aW9ucyksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZhdWx0c1xuXHQgKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJfVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0xvY2FsZXxzdHJpbmd9IGxvY2FsZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Z2V0VHJhbnNsYXRpb25zKGxvY2FsZSkge1xuXHRcdGlmIChpc1N0cmluZyhsb2NhbGUpKSB7XG5cdFx0XHRsb2NhbGUgPSBwYXJzZUxvY2FsZShsb2NhbGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRpZiAodGhpcy50cmFuc2xhdGVFbGVtZW50ID09PSBudWxsKSB7XG5cdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJUZXh0IG5vdCBmb3VuZFwiKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCEodGhpcy50cmFuc2xhdGVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFNjcmlwdEVsZW1lbnQpKSB7XG5cdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJFbGVtZW50IGlzIG5vdCBhIHNjcmlwdCB0YWdcIikpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnRyYW5zbGF0ZUVsZW1lbnQudHlwZSAhPT0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIHtcblx0XHRcdFx0cmVqZWN0KFxuXHRcdFx0XHRcdG5ldyBFcnJvcihcIkVsZW1lbnQgaXMgbm90IGEgc2NyaXB0IHRhZyB3aXRoIHR5cGUgYXBwbGljYXRpb24vanNvblwiKSxcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgdHJhbnNsYXRpb25zID0gbnVsbDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRyYW5zbGF0aW9ucyA9IEpTT04ucGFyc2UodGhpcy50cmFuc2xhdGVFbGVtZW50LmlubmVySFRNTC50cmltKCkpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRyYW5zbGF0aW9ucyA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiVHJhbnNsYXRpb25zIG5vdCBmb3VuZCBvciBpbnZhbGlkXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB0ID0gbmV3IFRyYW5zbGF0aW9ucyhsb2NhbGUpO1xuXHRcdFx0dC5hc3NpZ25UcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKTtcblxuXHRcdFx0cmVzb2x2ZSh0KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdHJhbnNsYXRpb25zIGZvciB0aGUgY3VycmVudCBkb2N1bWVudC5cblx0ICpcblx0ICogYHNjcmlwdFtkYXRhLW1vbnN0ZXItcm9sZT10cmFuc2xhdGlvbnNdYCBpcyBzZWFyY2hlZCBmb3IgYW5kIHRoZSB0cmFuc2xhdGlvbnMgYXJlIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPCpbXT4+fFByb21pc2U8QXdhaXRlZDx1bmtub3duPltdPn1cblx0ICovXG5cdHN0YXRpYyBhc3NpZ25UcmFuc2xhdGlvbnNUb0VsZW1lbnQoZWxlbWVudCkge1xuXHRcdGNvbnN0IGQgPSBnZXREb2N1bWVudCgpO1xuXG5cdFx0aWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdFx0ZWxlbWVudCA9IGQucXVlcnlTZWxlY3RvcihcImJvZHlcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFtkYXRhLW1vbnN0ZXItcm9sZT10cmFuc2xhdGlvbnNdXCIpO1xuXHRcdGlmIChsaXN0ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlcyA9IFtdO1xuXG5cdFx0bGlzdC5mb3JFYWNoKCh0cmFuc2xhdGlvbkVsZW1lbnQpID0+IHtcblx0XHRcdGNvbnN0IHAgPSBuZXcgRW1iZWQodHJhbnNsYXRpb25FbGVtZW50LCB7fSk7XG5cdFx0XHRwcm9taXNlcy5wdXNoKHAuYXNzaWduVG9FbGVtZW50KHVuZGVmaW5lZCwgZWxlbWVudCkpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGdldERvY3VtZW50LCBnZXRXaW5kb3cgfSBmcm9tIFwiLi91dGlsLm1qc1wiO1xuXG5leHBvcnQgeyBkb21SZWFkeSwgd2luZG93UmVhZHkgfTtcblxuLyoqXG4gKiBUaGlzIHZhcmlhYmxlIGlzIGEgcHJvbWlzZSBmdWxmaWxsZWQgYXMgc29vbiBhcyB0aGUgZG9tIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgRE9NQ29udGVudExvYWRlZCBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBvcmlnaW5hbCBIVE1MIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZCBhbmQgcGFyc2VkXG4gKiB3aXRob3V0IHdhaXRpbmcgZm9yIHN0eWxlc2hlZXRzLCBpbWFnZXMsIGFuZCBzdWJmcmFtZXMgdG8gZmluaXNoIGxvYWRpbmcuXG4gKlxuICogZG9jdW1lbnQucmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIGludGVyYWN0aXZlXG4gKiB3aW5kb3cncyBET01Db250ZW50TG9hZGVkIGV2ZW50IGdldHMgZmlyZWRcbiAqIGRvY3VtZW50LnJlYWR5U3RhdGUgY2hhbmdlcyB0byBjb21wbGV0ZVxuICogd2luZG93J3MgbG9hZCBldmVudCBnZXRzIGZpcmVkIGxvYWRcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMxLjBcbiAqIEBzdW1tYXJ5IHZhcmlhYmxlIHRvIGNoZWNrIGlmIGRvbSBpcyByZWFkeVxuICogQHR5cGUge1Byb21pc2V9XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9ET01Db250ZW50TG9hZGVkX2V2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9yZWFkeVN0YXRlXG4gKi9cbmNvbnN0IGRvbVJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImxvYWRpbmdcIikge1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIHJlc29sdmUpO1xuXHR9IGVsc2Uge1xuXHRcdHJlc29sdmUoKTtcblx0fVxufSk7XG5cbi8qKlxuICogVGhpcyB2YXJpYWJsZSBpcyBhIHByb21pc2UgaXMgZnVsZmlsbGVkIGFzIHNvb24gYXMgdGhlIHdpbmRvd3MgaXMgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBsb2FkIGV2ZW50IGZpcmVzIHdoZW4gdGhlIGVudGlyZSBwYWdlIGlzIGxvYWRlZCwgaW5jbHVkaW5nIGFsbCBkZXBlbmRlbnQgcmVzb3VyY2VzIHN1Y2ggYXMgc3R5bGVzaGVldHMsXG4gKiBhc3NldHMsIGFuZCBpbWFnZXMuIFVubGlrZSBET01Db250ZW50TG9hZGVkLCB3aGljaCBmaXJlcyBhcyBzb29uIGFzIHRoZSBET00gb2YgdGhlIHBhZ2UgaXMgbG9hZGVkLFxuICogd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcmVzb3VyY2VzIHRvIGZpbmlzaCBsb2FkaW5nLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMzEuMFxuICogQHN1bW1hcnkgdmFyaWFibGUgdG8gY2hlY2sgaWYgd2luZG93IGlzIHJlYWR5XG4gKiBAdHlwZSB7UHJvbWlzZX1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9sb2FkX2V2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9yZWFkeVN0YXRlXG4gKi9cbmNvbnN0IHdpbmRvd1JlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0Y29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXHRjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcblxuXHRpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB7XG5cdFx0cmVzb2x2ZSgpO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCByZXNvbHZlKTtcblx0fVxufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHsgQmFzZVdpdGhPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiLi4vdHlwZXMvc3RhY2subWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmV4cG9ydCB7IEZvY3VzTWFuYWdlciB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfRE9DVU1FTlQgPSBcImRvY3VtZW50XCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEtFWV9DT05URVhUID0gXCJjb250ZXh0XCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IHN0YWNrU3ltYm9sID0gU3ltYm9sKFwic3RhY2tcIik7XG5cbi8qKlxuICogV2l0aCB0aGUgZm9jdXMgbWFuYWdlciB0aGUgZm9jdXMgY2FuIGJlIHN0b3JlZCBpbiBhIGRvY3VtZW50LCByZWNhbGxlZCBhbmQgbW92ZWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuICogQHN1bW1hcnkgSGFuZGxlIHRoZSBmb2N1c1xuICovXG5jbGFzcyBGb2N1c01hbmFnZXIgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cdFx0dmFsaWRhdGVJbnN0YW5jZSh0aGlzLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpLCBIVE1MRG9jdW1lbnQpO1xuXG5cdFx0dGhpc1tzdGFja1N5bWJvbF0gPSBuZXcgU3RhY2soKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvZG9tL2ZvY3VzbWFuYWdlclwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge0hUTUxEb2N1bWVudH0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBub2RlIGlzIHRvIGJlIGFwcGVuZGVkXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdFtLRVlfRE9DVU1FTlRdOiBnZXRHbG9iYWxPYmplY3QoXCJkb2N1bWVudFwiKSxcblx0XHRcdFtLRVlfQ09OVEVYVF06IHVuZGVmaW5lZCxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1lbWJlcnMgdGhlIGN1cnJlbnQgZm9jdXMgb24gYSBzdGFjay5cblx0ICogU2V2ZXJhbCBmb2N1cyBjYW4gYmUgc3RvcmVkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG5cdCAqL1xuXHRzdG9yZUZvY3VzKCkge1xuXHRcdGNvbnN0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlKCk7XG5cdFx0aWYgKGFjdGl2ZSBpbnN0YW5jZW9mIE5vZGUpIHtcblx0XHRcdHRoaXNbc3RhY2tTeW1ib2xdLnB1c2goYWN0aXZlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGxhc3QgZm9jdXMgb24gdGhlIHN0YWNrIGlzIHNldCBhZ2FpblxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG5cdCAqL1xuXHRyZXN0b3JlRm9jdXMoKSB7XG5cdFx0Y29uc3QgbGFzdCA9IHRoaXNbc3RhY2tTeW1ib2xdLnBvcCgpO1xuXHRcdGlmIChsYXN0IGluc3RhbmNlb2YgTm9kZSkge1xuXHRcdFx0dGhpcy5mb2N1cyhsYXN0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcblx0ICogQHBhcmFtIHtib29sZWFufSBwcmV2ZW50U2Nyb2xsXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cblx0ICovXG5cdGZvY3VzKGVsZW1lbnQsIHByZXZlbnRTY3JvbGwpIHtcblx0XHR2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIE5vZGUpO1xuXG5cdFx0ZWxlbWVudC5mb2N1cyh7XG5cdFx0XHRwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50U2Nyb2xsID8/IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7RWxlbWVudH1cblx0ICovXG5cdGdldEFjdGl2ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKS5hY3RpdmVFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgZWxlbWVudHMgdGhhdCBjYW4gYmUgZm9jdXNlZFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IHF1ZXJ5XG5cdCAqIEByZXR1cm4ge2FycmF5fVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuXHQgKi9cblx0Z2V0Rm9jdXNhYmxlKHF1ZXJ5KSB7XG5cdFx0bGV0IGNvbnRleHRFbGVtZW50ID0gdGhpcy5nZXRPcHRpb24oS0VZX0NPTlRFWFQpO1xuXHRcdGlmIChjb250ZXh0RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb250ZXh0RWxlbWVudCA9IHRoaXMuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCk7XG5cdFx0fVxuXG5cdFx0dmFsaWRhdGVJbnN0YW5jZShjb250ZXh0RWxlbWVudCwgTm9kZSk7XG5cblx0XHRpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsaWRhdGVTdHJpbmcocXVlcnkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHQuLi5jb250ZXh0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdFx0XHQnZGV0YWlscywgYnV0dG9uLCBpbnB1dCwgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pLCBzZWxlY3QsIHRleHRhcmVhLCBhW2hyZWZdLCBib2R5Jyxcblx0XHRcdCksXG5cdFx0XS5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkICYmICFlbGVtZW50Lm1hdGNoZXMocXVlcnkpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikpIHJldHVybiBmYWxzZTtcblx0XHRcdGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHRjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdGlmIChyZWN0LndpZHRoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRpZiAocmVjdC5oZWlnaHQgPT09IDApIHJldHVybiBmYWxzZTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5XG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cblx0ICovXG5cdGZvY3VzTmV4dChxdWVyeSkge1xuXHRcdGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEFjdGl2ZSgpO1xuXHRcdGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZ2V0Rm9jdXNhYmxlKHF1ZXJ5KTtcblxuXHRcdGlmICghaXNBcnJheShmb2N1c2FibGUpIHx8IGZvY3VzYWJsZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmIChjdXJyZW50IGluc3RhbmNlb2YgTm9kZSkge1xuXHRcdFx0Y29uc3QgaW5kZXggPSBmb2N1c2FibGUuaW5kZXhPZihjdXJyZW50KTtcblxuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0dGhpcy5mb2N1cyhmb2N1c2FibGVbaW5kZXggKyAxXSB8fCBmb2N1c2FibGVbMF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5mb2N1cyhmb2N1c2FibGVbMF0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmZvY3VzKGZvY3VzYWJsZVswXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5XG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cblx0ICovXG5cdGZvY3VzUHJldihxdWVyeSkge1xuXHRcdGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEFjdGl2ZSgpO1xuXHRcdGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZ2V0Rm9jdXNhYmxlKHF1ZXJ5KTtcblxuXHRcdGlmICghaXNBcnJheShmb2N1c2FibGUpIHx8IGZvY3VzYWJsZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmIChjdXJyZW50IGluc3RhbmNlb2YgTm9kZSkge1xuXHRcdFx0Y29uc3QgaW5kZXggPSBmb2N1c2FibGUuaW5kZXhPZihjdXJyZW50KTtcblxuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0dGhpcy5mb2N1cyhmb2N1c2FibGVbaW5kZXggLSAxXSB8fCBmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZm9jdXMoZm9jdXNhYmxlW2ZvY3VzYWJsZS5sZW5ndGggLSAxXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZm9jdXMoZm9jdXNhYmxlW2ZvY3VzYWJsZS5sZW5ndGggLSAxXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBQYXRoZmluZGVyIH0gZnJvbSBcIi4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcbmltcG9ydCB7IHBhcnNlRGF0YVVSTCB9IGZyb20gXCIuL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7IFByb3h5T2JzZXJ2ZXIgfSBmcm9tIFwiLi9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVPYmplY3QgfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4vaXMubWpzXCI7XG5cbmV4cG9ydCB7IGVxdWlwV2l0aEludGVybmFsIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHByb3BlcnR5TmFtZSA9IFwiaW50ZXJuYWxEZWZhdWx0c1wiO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZXh0ZW5kcyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBtZXRob2RzOlxuICpcbiAqIC0gYXR0YWNoSW50ZXJuYWxPYnNlcnZlclxuICogLSBkZXRhY2hJbnRlcm5hbE9ic2VydmVyXG4gKiAtIGNvbnRhaW5zSW50ZXJuYWxPYnNlcnZlclxuICogLSBzZXRJbnRlcm5hbFxuICogLSBzZXRJbnRlcm5hbHNcbiAqIC0gZ2V0SW50ZXJuYWxcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjE1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmZ1bmN0aW9uIGVxdWlwV2l0aEludGVybmFsKCkge1xuXHR2YWxpZGF0ZU9iamVjdCh0aGlzKTtcblxuXHRpZiAoIWhhc0dldHRlcih0aGlzLCBwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5TmFtZSwge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRjb25zdCBkZWZhdWx0cyA9IGV4dGVuZCh7fSwgdGhpc1twcm9wZXJ0eU5hbWVdIHx8IHt9KTtcblx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcihkZWZhdWx0cyk7XG5cblx0LyoqXG5cdCAqIEF0dGFjaCBhIG5ldyBvYnNlcnZlclxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtQcm94eU9ic2VydmVyfVxuXHQgKi9cblx0dGhpc1tcImF0dGFjaEludGVybmFsT2JzZXJ2ZXJcIl0gPSAob2JzZXJ2ZXIpID0+IHtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIERldGFjaCBhIG9ic2VydmVyXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge1Byb3h5T2JzZXJ2ZXJ9XG5cdCAqL1xuXHR0aGlzW1wiZGV0YWNoSW50ZXJuYWxPYnNlcnZlclwiXSA9IChvYnNlcnZlcikgPT4ge1xuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmRldGFjaE9ic2VydmVyKG9ic2VydmVyKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBvYnNlcnZlciBpcyBhdHRhY2hlZFxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0dGhpc1tcImNvbnRhaW5zSW50ZXJuYWxPYnNlcnZlclwiXSA9IChvYnNlcnZlcikgPT4ge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5jb250YWluc09ic2VydmVyKG9ic2VydmVyKTtcblx0fTtcblxuXHQvKipcblx0ICogU2V0IGFuIGludGVybmFsIHZhbHVlLCBuZXN0ZWQgaW50ZXJuYWxzIGNhbiBiZSBzcGVjaWZpZWQgYnkgcGF0aCBgYS5iLmNgXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7RGF0YXNvdXJjZX1cblx0ICovXG5cdHRoaXNbXCJzZXRJbnRlcm5hbFwiXSA9IChwYXRoLCB2YWx1ZSkgPT4ge1xuXHRcdG5ldyBQYXRoZmluZGVyKHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFN1YmplY3QoKSkuc2V0VmlhKHBhdGgsIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogc2V0IG11bHRpcGxlIGludGVybmFscyBhdCBvbmNlXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gb3B0aW9uc1xuXHQgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuXHQgKi9cblx0dGhpc1tcInNldEludGVybmFsc1wiXSA9IChvcHRpb25zKSA9PiB7XG5cdFx0aWYgKGlzU3RyaW5nKG9wdGlvbnMpKSB7XG5cdFx0XHRvcHRpb25zID0gcGFyc2VPcHRpb25zSlNPTihvcHRpb25zKTtcblx0XHR9XG5cblx0XHRleHRlbmQodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpLCBkZWZhdWx0cywgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIG5lc3RlZCBpbnRlcm5hbHMgY2FuIGJlIHNwZWNpZmllZCBieSBwYXRoIGBhLmIuY2Bcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWVcblx0ICogQHJldHVybiB7Kn1cblx0ICovXG5cdHRoaXNbXCJnZXRJbnRlcm5hbFwiXSA9IChwYXRoLCBkZWZhdWx0VmFsdWUpID0+IHtcblx0XHRsZXQgdmFsdWU7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFsdWUgPSBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpKS5nZXRWaWEoXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBwcm9wXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNHZXR0ZXIob2JqLCBwcm9wKSB7XG5cdHdoaWxlIChpc09iamVjdChvYmopKSB7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKT8uW1wiZ2V0XCJdKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0b2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uc0pTT04oZGF0YSkge1xuXHRsZXQgb2JqID0ge307XG5cblx0aWYgKCFpc1N0cmluZyhkYXRhKSkge1xuXHRcdHJldHVybiBvYmo7XG5cdH1cblxuXHQvLyB0aGUgY29uZmlndXJhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgZGF0YSB1cmwuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGF0YVVybCA9IHBhcnNlRGF0YVVSTChkYXRhKTtcblx0XHRkYXRhID0gZGF0YVVybC5jb250ZW50O1xuXHR9IGNhdGNoIChlKSB7fVxuXG5cdHRyeSB7XG5cdFx0b2JqID0gSlNPTi5wYXJzZShkYXRhKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHRocm93IGU7XG5cdH1cblxuXHRyZXR1cm4gdmFsaWRhdGVPYmplY3Qob2JqKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN0YXRlU3ltYm9sLCBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBCYXNlV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IElEIH0gZnJvbSBcIi4uL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7IFByb3h5T2JzZXJ2ZXIgfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9DTEFTUyxcblx0QVRUUklCVVRFX0lELFxuXHRBVFRSSUJVVEVfVElUTEUsXG59IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgUmVzb3VyY2UsIEtFWV9ET0NVTUVOVCwgS0VZX1FVRVJZLCByZWZlcmVuY2VTeW1ib2wgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgS0VZX0RPQ1VNRU5UID0gXCJkb2N1bWVudFwiO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfUVVFUlkgPSBcInF1ZXJ5XCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEtFWV9USU1FT1VUID0gXCJ0aW1lb3V0XCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHJlZmVyZW5jZVN5bWJvbCA9IFN5bWJvbChcInJlZmVyZW5jZVwiKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgcmVzb3VyY2VzIHRvIGJlIGxvYWRlZC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIFJlc291cmNlIGNsYXNzXG4gKi9cbmNsYXNzIFJlc291cmNlIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fHVuZGVmaW5lZH0gb3B0aW9uc1xuXHQgKi9cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKG9wdGlvbnMpO1xuXG5cdFx0bGV0IHVyaSA9IHRoaXMuZ2V0T3B0aW9uKHRoaXMuY29uc3RydWN0b3IuZ2V0VVJMQXR0cmlidXRlKCkpO1xuXG5cdFx0aWYgKHVyaSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHNvdXJjZVwiKTtcblx0XHR9IGVsc2UgaWYgKHVyaSBpbnN0YW5jZW9mIFVSTCkge1xuXHRcdFx0dXJpID0gdXJpLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIGlmICghaXNTdHJpbmcodXJpKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgdXJsIHR5cGVcIik7XG5cdFx0fVxuXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF1bdGhpcy5jb25zdHJ1Y3Rvci5nZXRVUkxBdHRyaWJ1dGUoKV0gPSB1cmk7XG5cdFx0dGhpc1tpbnRlcm5hbFN0YXRlU3ltYm9sXSA9IG5ldyBQcm94eU9ic2VydmVyKHtcblx0XHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0XHRlcnJvcjogdW5kZWZpbmVkLFxuXHRcdH0pO1xuXG5cdFx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRpc0Nvbm5lY3RlZCgpIHtcblx0XHRpZiAodGhpc1tyZWZlcmVuY2VTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzW3JlZmVyZW5jZVN5bWJvbF0uaXNDb25uZWN0ZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgdGhlIHNwZWNpYWwgY2xhc3NlcyBhbmQgY3JlYXRlcyB0aGUgRE9NIG9iamVjdC5cblx0ICogVGhpcyBtZXRob2QgaXMgYWxzbyBjYWxsZWQgaW1wbGljaXRseSwgaWYgbm90IHlldCBkb25lIGV4cGxpY2l0bHksIGJ5IGNhbGxpbmcgYGNvbm5lY3QoKWAuXG5cdCAqXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlc1xuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZX1cblx0ICovXG5cdGNyZWF0ZSgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlc1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIHRoZSBIVE1MRWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LlxuXHQgKiBJZiB0aGUgZWxlbWVudCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsIGBjcmVhdGUoKWAgaXMgY2FsbGVkIGltcGxpY2l0bHkuXG5cdCAqXG5cdCAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcblx0ICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2V9XG5cdCAqL1xuXHRjb25uZWN0KCkge1xuXHRcdGlmICghKHRoaXNbcmVmZXJlbmNlU3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdFx0dGhpcy5jcmVhdGUoKTtcblx0XHR9XG5cblx0XHRhcHBlbmRUb0RvY3VtZW50LmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtEb2N1bWVudH0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBub2RlIGlzIHRvIGJlIGFwcGVuZGVkXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzcmMvaHJlZiB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Vcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5IGRlZmluZXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXNvdXJjZSBpcyB0byBiZSBob29rZWQgaW50byB0aGUgZG9tLlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gaWQgZWxlbWVudCBhdHRyaWJ1dGUgaWRcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIGVsZW1lbnQgYXR0cmlidXRlIHRpdGxlXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzcyBlbGVtZW50IGF0dHJpYnV0ZSBjbGFzc1xuXHQgKiBAcHJvcGVydHkge2ludH0gdGltZW91dCB0aW1lb3V0XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdFt0aGlzLmNvbnN0cnVjdG9yLmdldFVSTEF0dHJpYnV0ZSgpXTogdW5kZWZpbmVkLFxuXHRcdFx0W0tFWV9ET0NVTUVOVF06IGdldEdsb2JhbE9iamVjdChcImRvY3VtZW50XCIpLFxuXHRcdFx0W0tFWV9RVUVSWV06IFwiaGVhZFwiLFxuXHRcdFx0W0tFWV9USU1FT1VUXTogMTAwMDAsXG5cdFx0XHRbQVRUUklCVVRFX0lEXTogbmV3IElEKFwicmVzb3VyY2VcIikudG9TdHJpbmcoKSxcblx0XHRcdFtBVFRSSUJVVEVfQ0xBU1NdOiB1bmRlZmluZWQsXG5cdFx0XHRbQVRUUklCVVRFX1RJVExFXTogdW5kZWZpbmVkLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpdGggYGF2YWlsYWJsZSgpYCB5b3UgY2FuIGNoZWNrIGlmIGEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLlxuXHQgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIHRhZyBpcyBpbmNsdWRlZCBhbmQgdGhlIHJlc291cmNlIGlzIGxvYWRlZC5cblx0ICpcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdGF2YWlsYWJsZSgpIHtcblx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRpZiAoIShzZWxmW3JlZmVyZW5jZVN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIm5vIGVsZW1lbnRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKCFzZWxmLmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcImVsZW1lbnQgbm90IGNvbm5lY3RlZFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbXCJsb2FkZWRcIl0gPT09IHRydWUpIHtcblx0XHRcdGlmIChzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLmdldFN1YmplY3QoKVtcImVycm9yXCJdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uZ2V0U3ViamVjdCgpW1wiZXJyb3JcIl0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVqZWN0KFwidGltZW91dFwiKTtcblx0XHRcdH0sIHNlbGYuZ2V0T3B0aW9uKFwidGltZW91dFwiKSk7XG5cblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKCgpID0+IHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLmRldGFjaE9ic2VydmVyKG9ic2VydmVyKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXNcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vcmVzb3VyY2VcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9Eb2N1bWVudCgpIHtcblx0Y29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRPcHRpb24oS0VZX1FVRVJZLCBcImhlYWRcIikpO1xuXHRpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidGFyZ2V0IG5vdCBmb3VuZFwiKTtcblx0fVxuXG5cdGFkZEV2ZW50cy5jYWxsKHRoaXMpO1xuXHR0YXJnZXROb2RlLmFwcGVuZENoaWxkKHRoaXNbcmVmZXJlbmNlU3ltYm9sXSk7XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2FkZEV2ZW50c31cbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRzKCkge1xuXHRjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuXHRcdHRoaXNbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG5cdFx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIG9uTG9hZCk7XG5cblx0XHR0aGlzW2ludGVybmFsU3RhdGVTeW1ib2xdLnNldFN1YmplY3Qoe1xuXHRcdFx0bG9hZGVkOiB0cnVlLFxuXHRcdFx0ZXJyb3I6IGAke1xuXHRcdFx0XHR0aGlzW3JlZmVyZW5jZVN5bWJvbF1bdGhpcy5jb25zdHJ1Y3Rvci5nZXRVUkxBdHRyaWJ1dGUoKV1cblx0XHRcdH0gaXMgbm90IGF2YWlsYWJsZWAsXG5cdFx0fSk7XG5cblx0XHRyZXR1cm47XG5cdH07XG5cblx0Y29uc3Qgb25Mb2FkID0gKCkgPT4ge1xuXHRcdHRoaXNbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG5cdFx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIG9uTG9hZCk7XG5cdFx0dGhpc1tpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbXCJsb2FkZWRcIl0gPSB0cnVlO1xuXHR9O1xuXG5cdHRoaXNbcmVmZXJlbmNlU3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBvbkxvYWQsIGZhbHNlKTtcblx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yLCBmYWxzZSk7XG5cblx0cmV0dXJuIHRoaXM7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTdGF0ZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHtcblx0QVRUUklCVVRFX0NMQVNTLFxuXHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRBVFRSSUJVVEVfSUQsXG5cdEFUVFJJQlVURV9TUkMsXG5cdEFUVFJJQlVURV9USVRMRSxcblx0QVRUUklCVVRFX1RZUEUsXG5cdFRBR19TQ1JJUFQsXG59IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge1xuXHRLRVlfRE9DVU1FTlQsXG5cdEtFWV9RVUVSWSxcblx0cmVmZXJlbmNlU3ltYm9sLFxuXHRSZXNvdXJjZSxcbn0gZnJvbSBcIi4uL3Jlc291cmNlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBEYXRhIH07XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIGVtYmVkIGRhdGEuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBEYXRhIFJlc291cmNlIGNsYXNzXG4gKi9cbmNsYXNzIERhdGEgZXh0ZW5kcyBSZXNvdXJjZSB7XG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZT1jb3JzIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9mZXRjaFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY3JlZGVudGlhbHM9c2FtZS1vcmlnaW4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL2ZldGNoXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlPWFwcGxpY2F0aW9uL2pzb24ge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci10eXBlfVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHRtb2RlOiBcImNvcnNcIixcblx0XHRcdGNyZWRlbnRpYWxzOiBcInNhbWUtb3JpZ2luXCIsXG5cdFx0XHR0eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5EYXRhfVxuXHQgKi9cblx0Y3JlYXRlKCkge1xuXHRcdGNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIHRoZSBIVE1MRWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGRvY3VtZW50XG5cdCAqXG5cdCAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcblx0ICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2V9XG5cdCAqL1xuXHRjb25uZWN0KCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdGlmICghKHRoaXNbcmVmZXJlbmNlU3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdFx0dGhpcy5jcmVhdGUoKTtcblx0XHR9XG5cblx0XHRhcHBlbmRUb0RvY3VtZW50LmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RvbS9yZXNvdXJjZS9kYXRhXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG5cdFx0cmV0dXJuIEFUVFJJQlVURV9TUkM7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCgpIHtcblx0Y29uc3QgZG9jdW1lbnQgPSB0aGlzLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpO1xuXHR0aGlzW3JlZmVyZW5jZVN5bWJvbF0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19TQ1JJUFQpO1xuXG5cdGZvciAoY29uc3Qga2V5IG9mIFtcblx0XHRBVFRSSUJVVEVfVFlQRSxcblx0XHRBVFRSSUJVVEVfSUQsXG5cdFx0QVRUUklCVVRFX0NMQVNTLFxuXHRcdEFUVFJJQlVURV9USVRMRSxcblx0XSkge1xuXHRcdGlmICh0aGlzLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXNbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gdGhpcy5nZXRPcHRpb24oa2V5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9Eb2N1bWVudCgpIHtcblx0Y29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRPcHRpb24oS0VZX1FVRVJZLCBcImhlYWRcIikpO1xuXHRpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidGFyZ2V0IG5vdCBmb3VuZFwiKTtcblx0fVxuXG5cdHRhcmdldE5vZGUuYXBwZW5kQ2hpbGQodGhpc1tyZWZlcmVuY2VTeW1ib2xdKTtcblxuXHRnZXRHbG9iYWxGdW5jdGlvbihcImZldGNoXCIpKHRoaXMuZ2V0T3B0aW9uKEFUVFJJQlVURV9TUkMpLCB7XG5cdFx0bWV0aG9kOiBcIkdFVFwiLCAvLyAqR0VULCBQT1NULCBQVVQsIERFTEVURSwgZXRjLlxuXHRcdG1vZGU6IHRoaXMuZ2V0T3B0aW9uKFwibW9kZVwiLCBcImNvcnNcIiksIC8vIG5vLWNvcnMsICpjb3JzLCBzYW1lLW9yaWdpblxuXHRcdGNhY2hlOiBcIm5vLWNhY2hlXCIsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcblx0XHRjcmVkZW50aWFsczogdGhpcy5nZXRPcHRpb24oXCJjcmVkZW50aWFsc1wiLCBcInNhbWUtb3JpZ2luXCIpLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcblx0XHRoZWFkZXJzOiB7XG5cdFx0XHRBY2NlcHQ6IHRoaXMuZ2V0T3B0aW9uKFwidHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiksXG5cdFx0fSxcblx0XHRyZWRpcmVjdDogXCJmb2xsb3dcIiwgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxuXHRcdHJlZmVycmVyUG9saWN5OiBcIm5vLXJlZmVycmVyXCIsIC8vIG5vLXJlZmVycmVyLFxuXHR9KVxuXHRcdC50aGVuKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcblx0XHR9KVxuXHRcdC50aGVuKCh0ZXh0KSA9PiB7XG5cdFx0XHRjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuXHRcdFx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdLmFwcGVuZENoaWxkKHRleHROb2RlKTtcblxuXHRcdFx0dGhpc1tpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbXCJsb2FkZWRcIl0gPSB0cnVlO1xuXHRcdH0pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHR0aGlzW2ludGVybmFsU3RhdGVTeW1ib2xdLnNldFN1YmplY3Qoe1xuXHRcdFx0XHRsb2FkZWQ6IHRydWUsXG5cdFx0XHRcdGVycm9yOiBlLnRvU3RyaW5nKCksXG5cdFx0XHR9KTtcblxuXHRcdFx0dGFyZ2V0Tm9kZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcblx0XHR9KTtcblxuXHRyZXR1cm4gdGhpcztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge1xuXHRBVFRSSUJVVEVfQ0xBU1MsXG5cdEFUVFJJQlVURV9IUkVGLFxuXHRBVFRSSUJVVEVfSUQsXG5cdEFUVFJJQlVURV9OT05DRSxcblx0QVRUUklCVVRFX1NSQyxcblx0QVRUUklCVVRFX1RJVExFLFxuXHRBVFRSSUJVVEVfVFlQRSxcblx0VEFHX0xJTkssXG59IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBLRVlfRE9DVU1FTlQsIHJlZmVyZW5jZVN5bWJvbCwgUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2UubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBMaW5rIH07XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIGVtYmVkIGV4dGVybmFsIHJlc291cmNlcy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIFJlc291cmNlIGNsYXNzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rXG4gKi9cbmNsYXNzIExpbmsgZXh0ZW5kcyBSZXNvdXJjZSB7XG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gYXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItYXN9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcm9zc09yaWdpbj1hbm9ueW1vdXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1jcm9zc29yaWdpbn1cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBkaXNhYmxlZFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gaHJlZiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1ocmVmfVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gaHJlZmxhbmcge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaHJlZmxhbmd9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbWFnZXNpemVzIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLWltYWdlc2l6ZXN9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbWFnZXNyY3NldCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1pbWFnZXNyY3NldH1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGludGVncml0eSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1pbnRlZ3JpdHl9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1tZWRpYX1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHByZWZldGNoIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLXByZWZldGNofVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gcmVmZXJyZXJwb2xpY3kge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItcmVmZXJyZXJwb2xpY3l9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWwge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItcmVsfVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci10eXBlfVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gc2l6ZXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItc2l6ZXN9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub25jZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLW5vbmNlfVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHRhczogdW5kZWZpbmVkLFxuXHRcdFx0Y3Jvc3NPcmlnaW46IFwiYW5vbnltb3VzXCIsXG5cdFx0XHRkaXNhYmxlZDogdW5kZWZpbmVkLFxuXHRcdFx0aHJlZjogdW5kZWZpbmVkLFxuXHRcdFx0aHJlZmxhbmc6IHVuZGVmaW5lZCxcblx0XHRcdGltYWdlc2l6ZXM6IHVuZGVmaW5lZCxcblx0XHRcdGltYWdlc3Jjc2V0OiB1bmRlZmluZWQsXG5cdFx0XHRpbnRlZ3JpdHk6IHVuZGVmaW5lZCxcblx0XHRcdG1lZGlhOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVmZXRjaDogdW5kZWZpbmVkLFxuXHRcdFx0cmVmZXJyZXJwb2xpY3k6IHVuZGVmaW5lZCxcblx0XHRcdHJlbDogdW5kZWZpbmVkLFxuXHRcdFx0c2l6ZXM6IHVuZGVmaW5lZCxcblx0XHRcdHR5cGU6IHVuZGVmaW5lZCxcblx0XHRcdG5vbmNlOiB1bmRlZmluZWQsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RvbS9yZXNvdXJjZS9saW5rXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlLkxpbmt9XG5cdCAqL1xuXHRjcmVhdGUoKSB7XG5cdFx0Y3JlYXRlRWxlbWVudC5jYWxsKHRoaXMpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG5cdFx0cmV0dXJuIEFUVFJJQlVURV9IUkVGO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlLkxpbmt9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG5cdGNvbnN0IGRvY3VtZW50ID0gdGhpcy5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKTtcblx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfTElOSyk7XG5cblx0Zm9yIChjb25zdCBrZXkgb2YgW1xuXHRcdFwiYXNcIixcblx0XHRcImNyb3NzT3JpZ2luXCIsXG5cdFx0XCJkaXNhYmxlZFwiLFxuXHRcdFwiaHJlZlwiLFxuXHRcdFwiaHJlZmxhbmdcIixcblx0XHRcImltYWdlc2l6ZXNcIixcblx0XHRcImltYWdlc3Jjc2V0XCIsXG5cdFx0XCJpbnRlZ3JpdHlcIixcblx0XHRcIm1lZGlhXCIsXG5cdFx0XCJwcmVmZXRjaFwiLFxuXHRcdFwicmVmZXJyZXJwb2xpY3lcIixcblx0XHRcInNpemVzXCIsXG5cdFx0XCJyZWxcIixcblx0XHRcInR5cGVcIixcblx0XHRBVFRSSUJVVEVfSFJFRixcblx0XHRBVFRSSUJVVEVfSUQsXG5cdFx0QVRUUklCVVRFX0NMQVNTLFxuXHRcdEFUVFJJQlVURV9USVRMRSxcblx0XHRBVFRSSUJVVEVfTk9OQ0UsXG5cdF0pIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzW3JlZmVyZW5jZVN5bWJvbF1ba2V5XSA9IHRoaXMuZ2V0T3B0aW9uKGtleSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSBcIi4uLy4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHsgTGluayB9IGZyb20gXCIuLi9saW5rLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgU3R5bGVzaGVldCB9O1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBlbWJlZCBleHRlcm5hbCByZXNvdXJjZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGlua1xuICovXG5jbGFzcyBTdHlsZXNoZWV0IGV4dGVuZHMgTGluayB7XG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gcmVsIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLXJlbH1cblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0cmVsOiBcInN0eWxlc2hlZXRcIixcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvZG9tL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldFwiKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi8uLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7XG5cdEFUVFJJQlVURV9DTEFTUyxcblx0QVRUUklCVVRFX0lELFxuXHRBVFRSSUJVVEVfTk9OQ0UsXG5cdEFUVFJJQlVURV9TUkMsXG5cdEFUVFJJQlVURV9USVRMRSxcblx0QVRUUklCVVRFX1RZUEUsXG5cdFRBR19TQ1JJUFQsXG59IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBLRVlfRE9DVU1FTlQsIHJlZmVyZW5jZVN5bWJvbCwgUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2UubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBTY3JpcHQgfTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gZW1iZWQgc2NyaXB0cy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIFJlc291cmNlIGNsYXNzXG4gKi9cbmNsYXNzIFNjcmlwdCBleHRlbmRzIFJlc291cmNlIHtcblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXN5bmM9dHJ1ZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLWFzeW5jfVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY3Jvc3NPcmlnaW49YW5vbnltb3VzIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItY3Jvc3NvcmlnaW59XG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVmZXI9ZmFsc2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1kZWZlcn1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGludGVncml0eSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLWludGVncml0eX1cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBub21vZHVsZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLW5vbW9kdWxlfVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gbm9uY2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1ub25jZX1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHJlZmVycmVycG9saWN5IHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItcmVmZXJyZXJwb2xpY3l9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItdHlwZX1cblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0YXN5bmM6IHRydWUsXG5cdFx0XHRjcm9zc09yaWdpbjogXCJhbm9ueW1vdXNcIixcblx0XHRcdGRlZmVyOiBmYWxzZSxcblx0XHRcdGludGVncml0eTogdW5kZWZpbmVkLFxuXHRcdFx0bm9tb2R1bGU6IGZhbHNlLFxuXHRcdFx0bm9uY2U6IHVuZGVmaW5lZCxcblx0XHRcdHJlZmVycmVycG9saWN5OiB1bmRlZmluZWQsXG5cdFx0XHR0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kb20vcmVzb3VyY2Uvc2NyaXB0XCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlLlNjcmlwdH1cblx0ICovXG5cdGNyZWF0ZSgpIHtcblx0XHRjcmVhdGVFbGVtZW50LmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFVSTEF0dHJpYnV0ZSgpIHtcblx0XHRyZXR1cm4gQVRUUklCVVRFX1NSQztcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG5cdGNvbnN0IGRvY3VtZW50ID0gdGhpcy5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKTtcblx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfU0NSSVBUKTtcblxuXHRmb3IgKGNvbnN0IGtleSBvZiBbXG5cdFx0XCJjcm9zc09yaWdpblwiLFxuXHRcdFwiZGVmZXJcIixcblx0XHRcImFzeW5jXCIsXG5cdFx0XCJpbnRlZ3JpdHlcIixcblx0XHRcIm5vbW9kdWxlXCIsXG5cdFx0QVRUUklCVVRFX05PTkNFLFxuXHRcdFwicmVmZXJyZXJwb2xpY3lcIixcblx0XHRBVFRSSUJVVEVfVFlQRSxcblx0XHRBVFRSSUJVVEVfU1JDLFxuXHRcdEFUVFJJQlVURV9JRCxcblx0XHRBVFRSSUJVVEVfQ0xBU1MsXG5cdFx0QVRUUklCVVRFX1RJVExFLFxuXHRdKSB7XG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKGtleSkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpc1tyZWZlcmVuY2VTeW1ib2xdW2tleV0gPSB0aGlzLmdldE9wdGlvbihrZXkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0aGlzO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBlcXVpcFdpdGhJbnRlcm5hbCB9IGZyb20gXCIuLi90eXBlcy9pbnRlcm5hbC5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfSFJFRiwgQVRUUklCVVRFX1NSQyB9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IFJlc291cmNlIH0gZnJvbSBcIi4vcmVzb3VyY2UubWpzXCI7XG5pbXBvcnQgeyBEYXRhIH0gZnJvbSBcIi4vcmVzb3VyY2UvZGF0YS5tanNcIjtcbmltcG9ydCB7IFN0eWxlc2hlZXQgfSBmcm9tIFwiLi9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzXCI7XG5pbXBvcnQgeyBTY3JpcHQgfSBmcm9tIFwiLi9yZXNvdXJjZS9zY3JpcHQubWpzXCI7XG5cbmV4cG9ydCB7IFJlc291cmNlTWFuYWdlciB9O1xuXG4vKipcbiAqIFRoZSBSZXNvdXJjZU1hbmFnZXIgaXMgYSBzaW5nbGV0b24gdGhhdCBtYW5hZ2VzIGFsbCByZXNvdXJjZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICovXG5jbGFzcyBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIHRocm93IHtFcnJvcn0gdW5zdXBwb3J0ZWQgZG9jdW1lbnQgdHlwZVxuXHQgKi9cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKG9wdGlvbnMpO1xuXHRcdGVxdWlwV2l0aEludGVybmFsLmNhbGwodGhpcyk7XG5cblx0XHRpZiAoISh0aGlzLmdldE9wdGlvbihcImRvY3VtZW50XCIpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBkb2N1bWVudCB0eXBlXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSAzLjE1LjAgdXNlIGdldEludGVybmFsIGluc3RlYWRcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGJhc2V1cmxcblx0ICovXG5cdGdldE9wdGlvbihrZXkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnRlcm5hbChrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYXNldXJsXG5cdCAqL1xuXHRnZXRCYXNlVVJMKCkge1xuXHRcdHRoaXMuZ2V0T3B0aW9uKFwiZG9jdW1lbnRcIik/LmJhc2VVUkw7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGJhc2V1cmxcblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgMy4xNS4wIHVzZSBpbnRlcm5hbERlZmF1bHRzIGluc3RlYWRcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcm5hbERlZmF1bHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwcm9wZXJ0eSB7SFRNTERvY3VtZW50fSBkb2N1bWVudD1kb2N1bWVudCBEb2N1bWVudFxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gcmVzb3VyY2VzXG5cdCAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlc291cmNlcy5zY3JpcHRzPVtdIGFycmF5IHdpdGgge0BsaW5rIE1vbnN0ZXIuRE9NLlJlc291cmNlLlNjcmlwdH0gb2JqZWN0c1xuXHQgKiBAcHJvcGVydHkge0FycmF5fSByZXNvdXJjZXMuc3R5bGVzaGVldHM9W10gYXJyYXkgd2l0aCB7QGxpbmsgTW9uc3Rlci5ET00uUmVzb3VyY2UuTGluay5TdHlsZXNoZWV0fSBvYmplY3RzXG5cdCAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlc291cmNlcy5kYXRhPVtdIGFycmF5IHdpdGgge0BsaW5rIE1vbnN0ZXIuRE9NLlJlc291cmNlLkRhdGF9IG9iamVjdHNcblx0ICovXG5cdGdldCBpbnRlcm5hbERlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e30sXG5cdFx0XHR7XG5cdFx0XHRcdGRvY3VtZW50OiBnZXRHbG9iYWxPYmplY3QoXCJkb2N1bWVudFwiKSxcblx0XHRcdFx0cmVzb3VyY2VzOiB7XG5cdFx0XHRcdFx0c2NyaXB0czogW10sXG5cdFx0XHRcdFx0c3R5bGVzaGVldHM6IFtdLFxuXHRcdFx0XHRcdGRhdGE6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGVuZCBUYWdzIHRvIERPTVxuXHQgKlxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCByZXNvdXJjZSBkZWZpbml0aW9uXG5cdCAqL1xuXHRjb25uZWN0KCkge1xuXHRcdHJ1blJlc291cmNlTWV0aG9kLmNhbGwodGhpcywgXCJjb25uZWN0XCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGF2YWlsYWJsZVxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgcmVzb3VyY2UgZGVmaW5pdGlvblxuXHQgKi9cblx0YXZhaWxhYmxlKCkge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChydW5SZXNvdXJjZU1ldGhvZC5jYWxsKHRoaXMsIFwiYXZhaWxhYmxlXCIpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBzY3JpcHRcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcblx0ICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlTWFuYWdlcn1cblx0ICogQHNlZSBNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHRcblx0ICovXG5cdGFkZFNjcmlwdCh1cmwsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gYWRkUmVzb3VyY2UuY2FsbCh0aGlzLCBcInNjcmlwdHNcIiwgdXJsLCBvcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgU3R5bGVzaGVldFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuXHQgKiBAcGFyYW0gW09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcblx0ICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuXHQgKiBAc2VlIE1vbnN0ZXIuRE9NLlJlc291cmNlLkxpbmsuU3R5bGVzaGVldFxuXHQgKi9cblx0YWRkU3R5bGVzaGVldCh1cmwsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gYWRkUmVzb3VyY2UuY2FsbCh0aGlzLCBcInN0eWxlc2hlZXRzXCIsIHVybCwgb3B0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIERhdGEgVGFnXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG5cdCAqIEBwYXJhbSBbT2JqZWN0fHVuZGVmaW5lZH0gb3B0aW9uc1xuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG5cdCAqIEBzZWUgTW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YVxuXHQgKi9cblx0YWRkRGF0YSh1cmwsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gYWRkUmVzb3VyY2UuY2FsbCh0aGlzLCBcImRhdGFcIiwgdXJsLCBvcHRpb25zKTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVzb3VyY2VNZXRob2QobWV0aG9kKSB7XG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXG5cdGZvciAoY29uc3QgdHlwZSBvZiBbXCJzY3JpcHRzXCIsIFwic3R5bGVzaGVldHNcIiwgXCJkYXRhXCJdKSB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5nZXRPcHRpb24oYHJlc291cmNlcy4ke3R5cGV9YCk7XG5cdFx0aWYgKCFpc0FycmF5KHJlc291cmNlcykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHRpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIFJlc291cmNlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCByZXNvdXJjZSBkZWZpbml0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZVttZXRob2RdKCkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRSZXNvdXJjZSh0eXBlLCB1cmwsIG9wdGlvbnMpIHtcblx0aWYgKHVybCBpbnN0YW5jZW9mIFVSTCkge1xuXHRcdHVybCA9IHVybC50b1N0cmluZygpO1xuXHR9XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0bGV0IHJlc291cmNlO1xuXHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRjYXNlIFwic2NyaXB0c1wiOlxuXHRcdFx0cmVzb3VyY2UgPSBuZXcgU2NyaXB0KGV4dGVuZCh7fSwgb3B0aW9ucywgeyBbQVRUUklCVVRFX1NSQ106IHVybCB9KSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwic3R5bGVzaGVldHNcIjpcblx0XHRcdHJlc291cmNlID0gbmV3IFN0eWxlc2hlZXQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7IFtBVFRSSUJVVEVfSFJFRl06IHVybCB9KSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiZGF0YVwiOlxuXHRcdFx0cmVzb3VyY2UgPSBuZXcgRGF0YShleHRlbmQoe30sIG9wdGlvbnMsIHsgW0FUVFJJQlVURV9TUkNdOiB1cmwgfSkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZSAke3R5cGV9YCk7XG5cdH1cblxuXHR0aGlzLmdldE9wdGlvbihcInJlc291cmNlc1wiKT8uW3R5cGVdLnB1c2gocmVzb3VyY2UpO1xuXHRyZXR1cm4gdGhpcztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIDIwMjUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICovXG5cbmltcG9ydCB7IGFkZEF0dHJpYnV0ZVRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0VSUk9STUVTU0FHRSB9IGZyb20gXCIuLi8uLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBDb25maWdNYW5hZ2VyU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgQ29uZmlnTWFuYWdlclN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuXG50cnkge1xuXHRDb25maWdNYW5hZ2VyU3R5bGVTaGVldC5pbnNlcnRSdWxlKFxuXHRcdGBcbkBsYXllciBjb25maWdtYW5hZ2VyIHsgXG5bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17ZGlzcGxheTpub25lfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyU3R5bGVTaGVldCB9IGZyb20gXCIuL3N0eWxlc2hlZXQvY29uZmlnLW1hbmFnZXIubWpzXCI7XG5pbXBvcnQgeyBnZXRXaW5kb3cgfSBmcm9tIFwiLi4vLi4vZG9tL3V0aWwubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IENvbmZpZ01hbmFnZXIgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW5kZXhEQkluc3RhbmNlU3ltYm9sID0gU3ltYm9sKFwiaW5kZXhEQkluc3RhbmNlXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbml0aWFsaXplZFByb21pc2VTeW1ib2wgPSBTeW1ib2woXCJpbml0aWFsaXplZFByb21pc2VTeW1ib2xcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IE1PREVfUkVBRE9OTFkgPSBcInJlYWRvbmx5XCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IE1PREVfUkVBRF9XUklURSA9IFwicmVhZHdyaXRlXCI7XG5cbi8qKlxuICogVGhlIENvbmZpZyBNYW5hZ2VyIGNvbXBvbmVudCBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBjb25maWcgbWFuYWdlciBjb21wb25lbnRcbiAqL1xuY2xhc3MgQ29uZmlnTWFuYWdlciBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL2NvbXBvbmVudC1ob3N0L2NvbmZpZy1tYW5hZ2VyQEBpbnN0YW5jZVwiKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEB0eXBlIHtzeW1ib2x9XG5cdFx0ICovXG5cdFx0dGhpc1tpbml0aWFsaXplZFByb21pc2VTeW1ib2xdID0gW107XG5cdFx0dGhpc1tpbmRleERCSW5zdGFuY2VTeW1ib2xdID0gbnVsbDtcblx0XHR0aGlzW2luaXRpYWxpemVkUHJvbWlzZVN5bWJvbF0ucHVzaChvcGVuRGF0YWJhc2UuY2FsbCh0aGlzKSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdHJlYWR5KCkge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbCh0aGlzW2luaXRpYWxpemVkUHJvbWlzZVN5bWJvbF0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jLyNjb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH1cblx0ICpcblx0ICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUZW1wbGF0ZSBkZWZpbml0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gTWFpbiB0ZW1wbGF0ZVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHR9LFxuXHRcdFx0aW5kZXhEQjoge1xuXHRcdFx0XHRuYW1lOiBcIm1vbnN0ZXJcIixcblx0XHRcdFx0dmVyc2lvbjogMixcblx0XHRcdFx0b2JqZWN0U3RvcmU6IHtcblx0XHRcdFx0XHRuYW1lOiBcImNvbmZpZ1wiLFxuXHRcdFx0XHRcdGtleVBhdGg6IFwia2V5XCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHJldHVybiB7UHJvbWlzZTx1bmtub3duPn1cblx0ICovXG5cdGdldENvbmZpZyhrZXkpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGdldEJsb2IuY2FsbCh0aGlzLCBrZXkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn1cblx0ICovXG5cdGhhc0NvbmZpZyhrZXkpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRCbG9iLmNhbGwodGhpcywga2V5KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPHVua25vd24+fVxuXHQgKi9cblx0c2V0Q29uZmlnKGtleSwgdmFsdWUpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHNldEJsb2IuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcblx0XHR9KTtcblx0fVxuXG5cdGRlbGV0ZUNvbmZpZyhrZXkpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGRlbGV0ZUJsb2IuY2FsbCh0aGlzLCBrZXkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1jb25maWctbWFuYWdlclwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge0NTU1N0eWxlU2hlZXRbXX1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdHJldHVybiBbQ29uZmlnTWFuYWdlclN0eWxlU2hlZXRdO1xuXHR9XG5cblx0LyoqXG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG9wZW5EYXRhYmFzZSgpIHtcblx0Y29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG5cblx0Y29uc3QgbmFtZSA9IHRoaXMuZ2V0T3B0aW9uKFwiaW5kZXhEQi5uYW1lXCIpO1xuXHRjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRPcHRpb24oXCJpbmRleERCLnZlcnNpb25cIik7XG5cdGNvbnN0IHN0b3JhZ2VOYW1lID0gdGhpcy5nZXRPcHRpb24oXCJpbmRleERCLm9iamVjdFN0b3JlLm5hbWVcIik7XG5cdGNvbnN0IEtleVBhdGggPSB0aGlzLmdldE9wdGlvbihcImluZGV4REIub2JqZWN0U3RvcmUua2V5UGF0aFwiKTtcblxuXHRpZiAoIW5hbWUgfHwgIXZlcnNpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGF0YWJhc2UgbmFtZSBhbmQgdmVyc2lvbiBtdXN0IGJlIHNldC5cIik7XG5cdH1cblxuXHRjb25zdCByZXF1ZXN0ID0gd2luZG93LmluZGV4ZWREQi5vcGVuKG5hbWUsIHZlcnNpb24pO1xuXG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0cmVxdWVzdC5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3Igb3BlbmluZyBkYXRhYmFzZVwiLCBldmVudCk7XG5cdFx0XHRyZWplY3QocmVxdWVzdC5lcnJvcik7XG5cdFx0fTtcblxuXHRcdHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzW2luZGV4REJJbnN0YW5jZVN5bWJvbF0gPSBldmVudD8udGFyZ2V0Py5yZXN1bHQ7XG5cdFx0XHRyZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcblx0XHR9O1xuXG5cdFx0cmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdGNvbnN0IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcblxuXHRcdFx0bGV0IG9iamVjdFN0b3JlO1xuXHRcdFx0aWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHN0b3JhZ2VOYW1lKSkge1xuXHRcdFx0XHRvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHN0b3JhZ2VOYW1lLCB7IGtleVBhdGg6IEtleVBhdGggfSk7XG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coXCJEYXRhYmFzZSB1cGdyYWRlIGNvbXBsZXRlXCIpO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlIGVpdGhlciBcInJlYWRvbmx5XCIgb3IgXCJyZWFkd3JpdGVcIlxuICovXG5mdW5jdGlvbiBnZXRPYmplY3RTdG9yZShtb2RlKSB7XG5cdGNvbnN0IHN0b3JhZ2VOYW1lID0gdGhpcy5nZXRPcHRpb24oXCJpbmRleERCLm9iamVjdFN0b3JlLm5hbWVcIik7XG5cblx0aWYgKCF0aGlzW2luZGV4REJJbnN0YW5jZVN5bWJvbF0pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGF0YWJhc2UgaXMgbm90IG9wZW4uXCIpO1xuXHR9XG5cblx0Ly8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSURCRGF0YWJhc2UvdHJhbnNhY3Rpb25cblx0Ly8gdHJhbnNhY3Rpb24oc3RvcmVOYW1lcywgbW9kZSwgb3B0aW9ucylcblx0Y29uc3QgdHggPSB0aGlzW2luZGV4REJJbnN0YW5jZVN5bWJvbF0udHJhbnNhY3Rpb24oc3RvcmFnZU5hbWUsIG1vZGUpO1xuXHRyZXR1cm4gdHgub2JqZWN0U3RvcmUoc3RvcmFnZU5hbWUpO1xufVxuXG4vKipcbiAqIEByZXR1cm4ge1Byb21pc2U8dW5rbm93bj59XG4gKi9cbmZ1bmN0aW9uIGNsZWFyT2JqZWN0U3RvcmUoKSB7XG5cdGNvbnN0IHN0b3JlID0gZ2V0T2JqZWN0U3RvcmUuY2FsbCh0aGlzLCBcInJlYWR3cml0ZVwiKTtcblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlcSA9IHN0b3JlLmNsZWFyKCk7XG5cdFx0cmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldnQpIHtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9O1xuXHRcdHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGV2dCkge1xuXHRcdFx0cmVqZWN0KGV2dC50YXJnZXQ/LmVycm9yQ29kZSk7XG5cdFx0fTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldEJsb2Ioa2V5KSB7XG5cdGNvbnN0IHN0b3JlID0gZ2V0T2JqZWN0U3RvcmUuY2FsbCh0aGlzLCBNT0RFX1JFQURPTkxZKTtcblxuXHRjb25zdCByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZ0KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGV2dC50YXJnZXQucmVzdWx0O1xuXHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdHJlc29sdmUodmFsdWUuYmxvYik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJUaGUgdmFsdWUgb2YgdGhlIGtleSAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGRlZmluZWQuXCIpKTtcblx0XHR9O1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlQmxvYihrZXkpIHtcblx0Y29uc3Qgc3RvcmUgPSBnZXRPYmplY3RTdG9yZS5jYWxsKHRoaXMsIE1PREVfUkVBRF9XUklURSk7XG5cblx0Y29uc3QgcmVxID0gc3RvcmUuZGVsZXRlKGtleSk7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRyZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2dCkge1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH07XG5cblx0XHRyZXEub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJkZWxldGVCbG9iOlwiLCBldnQudGFyZ2V0LmVycm9yQ29kZSk7XG5cdFx0XHRyZWplY3QoZXZ0LnRhcmdldC5lcnJvckNvZGUpO1xuXHRcdH07XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzZXRCbG9iKGtleSwgYmxvYikge1xuXHRjb25zdCBzdG9yZSA9IGdldE9iamVjdFN0b3JlLmNhbGwodGhpcywgTU9ERV9SRUFEX1dSSVRFKTtcblxuXHRjb25zdCBLZXlQYXRoID0gdGhpcy5nZXRPcHRpb24oXCJpbmRleERCLm9iamVjdFN0b3JlLmtleVBhdGhcIik7XG5cdGNvbnN0IG9iaiA9IHt9O1xuXHRvYmpbS2V5UGF0aF0gPSBrZXk7XG5cdG9iai5ibG9iID0gYmxvYjtcblx0Y29uc3QgcmVxID0gc3RvcmUucHV0KG9iaik7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRyZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2dCkge1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH07XG5cblx0XHRyZXEub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJzZXRCbG9iOlwiLCBldnQudGFyZ2V0LmVycm9yQ29kZSk7XG5cdFx0XHRyZWplY3QoZXZ0LnRhcmdldC5lcnJvckNvZGUpO1xuXHRcdH07XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PmA7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChDb25maWdNYW5hZ2VyKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgXCIuLi9ub3RpZnkvbm90aWZ5Lm1qc1wiO1xuaW1wb3J0IHsgSG9zdFN0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L2hvc3QubWpzXCI7XG5pbXBvcnQgeyBnZXRMb2NhbGVPZkRvY3VtZW50IH0gZnJvbSBcIi4uLy4uL2RvbS9sb2NhbGUubWpzXCI7XG5pbXBvcnQgeyBFbWJlZCB9IGZyb20gXCIuLi8uLi9pMThuL3Byb3ZpZGVycy9lbWJlZC5tanNcIjtcbmltcG9ydCB7IGdldERvY3VtZW50VHJhbnNsYXRpb25zIH0gZnJvbSBcIi4uLy4uL2kxOG4vdHJhbnNsYXRpb25zLm1qc1wiO1xuaW1wb3J0IHsgd2luZG93UmVhZHkgfSBmcm9tIFwiLi4vLi4vZG9tL3JlYWR5Lm1qc1wiO1xuaW1wb3J0IHsgRm9jdXNNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2RvbS9mb2N1c21hbmFnZXIubWpzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZG9tL3Jlc291cmNlbWFuYWdlci5tanNcIjtcbmltcG9ydCB7IGZpcmVDdXN0b21FdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgaXNJdGVyYWJsZSB9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCBcIi4vY29uZmlnLW1hbmFnZXIubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IEhvc3QgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcHJvbWlzZXNTeW1ib2wgPSBTeW1ib2woXCJwcm9taXNlc1N5bWJvbFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgbm90aWZ5RWxlbWVudFN5bWJvbCA9IFN5bWJvbChcIm5vdGlmeUVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG92ZXJsYXlFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwib3ZlcmxheUVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbmZpZ01hbmFnZXJFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29uZmlnTWFuYWdlckVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGZvY3VzTWFuYWdlclN5bWJvbCA9IFN5bWJvbChcImZvY3VzTWFuYWdlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcmVzb3VyY2VNYW5hZ2VyU3ltYm9sID0gU3ltYm9sKFwicmVzb3VyY2VNYW5hZ2VyXCIpO1xuXG4vKipcbiAqIFRoZSBIb3N0IGNvbXBvbmVudCBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBjb250ZW50IG9mIGEgd2ViIGFwcC5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1hZ2VzL2hvc3QucG5nXCI+XG4gKlxuICogRGVwZW5kZW5jaWVzOiB0aGUgc3lzdGVtIHVzZXMgZnVuY3Rpb25zIG9mIHRoZSBbbW9uc3RlcmpzXShodHRwczovL21vbnN0ZXJqcy5vcmcvKSBsaWJyYXJ5XG4gKlxuICogWW91IGNhbiBjcmVhdGUgdGhpcyBjb250cm9sIGVpdGhlciBieSBzcGVjaWZ5aW5nIHRoZSBIVE1MIHRhZyA8bW9uc3Rlci1ob3N0IC8+YCBkaXJlY3RseSBpbiB0aGUgSFRNTCBvciB1c2luZ1xuICogSmF2YXNjcmlwdCB2aWEgdGhlIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWhvc3QnKTtgIG1ldGhvZC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8bW9uc3Rlci1ob3N0PjwvbW9uc3Rlci1ob3N0PlxuICogYGBgXG4gKlxuICogT3IgeW91IGNhbiBjcmVhdGUgdGhpcyBDdXN0b21Db250cm9sIGRpcmVjdGx5IGluIEphdmFzY3JpcHQ6XG4gKlxuICogYGBganNcbiAqIGltcG9ydCAnQHNjaHVrYWkvY29tcG9uZW50LXN0YXRlL3NvdXJjZS9ob3N0Lm1qcyc7XG4gKiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWhvc3QnKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBCb2R5IHNob3VsZCBoYXZlIGEgY2xhc3MgXCJoaWRkZW5cIiB0byBlbnN1cmUgdGhhdCB0aGUgc3R5bGVzIGFyZSBhcHBsaWVkIGNvcnJlY3RseS5cbiAqXG4gKiBgYGBjc3NcbiAqIGJvZHkuaGlkZGVuIHtcbiAqICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBzdGFydHVtbCBob3N0LnBuZ1xuICogc2tpbnBhcmFtIG1vbm9jaHJvbWUgdHJ1ZVxuICogc2tpbnBhcmFtIHNoYWRvd2luZyBmYWxzZVxuICogSFRNTEVsZW1lbnQgPHwtLSBDdXN0b21FbGVtZW50XG4gKiBDdXN0b21FbGVtZW50IDx8LS0gSG9zdFxuICogQGVuZHVtbFxuICpcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIHNpbXBsZSBob3N0IGNvbXBvbmVudFxuICogQGZpcmVzIE1vbnN0ZXIuQ29tcG9uZW50cy5Ib3N0Lkhvc3QjbW9uc3Rlci1ob3N0LWNvbm5lY3RlZFxuICogQGZpcmVzIE1vbnN0ZXIuQ29tcG9uZW50cy5Ib3N0Lkhvc3QjbW9uc3Rlci1ob3N0LWRpc2Nvbm5lY3RlZFxuICovXG5jbGFzcyBIb3N0IGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvY29tcG9uZW50LWhvc3QvSG9zdEBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCB0YWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZWF0dXJlcyBGZWF0dXJlIGRlZmluaXRpb25zXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIGtleVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Z2V0Q29uZmlnKGtleSkge1xuXHRcdGlmICh0aGlzW2NvbmZpZ01hbmFnZXJFbGVtZW50U3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gY29uZmlnIG1hbmFnZXIgZWxlbWVudFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXNbY29uZmlnTWFuYWdlckVsZW1lbnRTeW1ib2xdLmdldENvbmZpZyhrZXkpO1xuXHR9XG5cblx0aGFzQ29uZmlnKGtleSkge1xuXHRcdGlmICh0aGlzW2NvbmZpZ01hbmFnZXJFbGVtZW50U3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gY29uZmlnIG1hbmFnZXIgZWxlbWVudFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXNbY29uZmlnTWFuYWdlckVsZW1lbnRTeW1ib2xdLmhhc0NvbmZpZyhrZXkpO1xuXHR9XG5cblx0ZGVsZXRlQ29uZmlnKGtleSkge1xuXHRcdGlmICh0aGlzW2NvbmZpZ01hbmFnZXJFbGVtZW50U3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gY29uZmlnIG1hbmFnZXIgZWxlbWVudFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXNbY29uZmlnTWFuYWdlckVsZW1lbnRTeW1ib2xdLmRlbGV0ZUNvbmZpZyhrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0c2V0Q29uZmlnKGtleSwgdmFsdWUpIHtcblx0XHRpZiAodGhpc1tjb25maWdNYW5hZ2VyRWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIGNvbmZpZyBtYW5hZ2VyIGVsZW1lbnRcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNbY29uZmlnTWFuYWdlckVsZW1lbnRTeW1ib2xdLnNldENvbmZpZyhrZXksIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAZmlyZXMgTW9uc3Rlci5Db21wb25lbnRzLkhvc3QuSG9zdCNtb25zdGVyLWhvc3QtY29ubmVjdGVkXG5cdCAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG5cdFx0LyoqXG5cdFx0ICogc2hvdyB0aGUgc2Nyb2xsIGJhciBhbHdheXNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqL1xuXHRcdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcInNjcm9sbFwiO1xuXG5cdFx0Y29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5ib2R5XCIpO1xuXG5cdFx0aWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZXMpKSB7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lcyk7XG5cdFx0fVxuXG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1ob3N0LWNvbm5lY3RlZFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAZmlyZXMgTW9uc3Rlci5Db21wb25lbnRzLkhvc3QuSG9zdCNtb25zdGVyLWhvc3QtZGlzY29ubmVjdGVkXG5cdCAqL1xuXHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiO1xuXG5cdFx0Y29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuZ2V0T3B0aW9uKFwiY2xhc3Nlcy5ib2R5XCIpO1xuXHRcdGlmICghZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lcykpIHtcblx0XHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVzKTtcblx0XHR9XG5cblx0XHRpZiAoaXNJdGVyYWJsZSh0aGlzW3Byb21pc2VzU3ltYm9sXSkgPT09IGZhbHNlKSB7XG5cdFx0XHR0aGlzW3Byb21pc2VzU3ltYm9sXSA9IFtdO1xuXHRcdH1cblxuXHRcdHRoaXNbcHJvbWlzZXNTeW1ib2xdLnB1c2goXG5cdFx0XHRuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdFx0XHRcIm1vbnN0ZXItaG9zdC1jb25uZWN0ZWRcIixcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7IG9uY2U6IHRydWUgfSxcblx0XHRcdFx0KTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cblx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLWhvc3QtZGlzY29ubmVjdGVkXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuQ29tcG9uZW50cy5Ib3N0Lkhvc3R9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHRoaXNbcHJvbWlzZXNTeW1ib2xdID0gW107XG5cdFx0dGhpc1twcm9taXNlc1N5bWJvbF0ucHVzaCh3aW5kb3dSZWFkeSk7XG5cblx0XHRzdXBlclthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKTtcblxuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXHRcdGluaXRFdmVudEhhbmRsZXIuY2FsbCh0aGlzKTtcblx0XHRpbml0VHJhbnNsYXRpb25zLmNhbGwodGhpcyk7XG5cblx0XHR0aGlzW2ZvY3VzTWFuYWdlclN5bWJvbF0gPSBuZXcgRm9jdXNNYW5hZ2VyKHRoaXMpO1xuXHRcdHRoaXNbcmVzb3VyY2VNYW5hZ2VyU3ltYm9sXSA9IG5ldyBSZXNvdXJjZU1hbmFnZXIodGhpcyk7XG5cblx0XHR0cnkge1xuXHRcdFx0dGhpc1twcm9taXNlc1N5bWJvbF0ucHVzaCh0aGlzW3Jlc291cmNlTWFuYWdlclN5bWJvbF0uYXZhaWxhYmxlKCkpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pc0Nvbm5lY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdHRoaXNbcHJvbWlzZXNTeW1ib2xdLnB1c2goXG5cdFx0XHRcdG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdFx0XHRcIm1vbnN0ZXItaG9zdC1jb25uZWN0ZWRcIixcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHsgb25jZTogdHJ1ZSB9LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhlIFByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTSBhbmQgYWxsIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLlxuXHQgKiBJZiB0aGUgZWxlbWVudCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBET00sIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0b25SZWFkeSgpIHtcblx0XHRpZiAoaXNJdGVyYWJsZSh0aGlzW3Byb21pc2VzU3ltYm9sXSkgPT09IGZhbHNlKSB7XG5cdFx0XHR0aGlzW3Byb21pc2VzU3ltYm9sXSA9IFtdO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCh0aGlzW3Byb21pc2VzU3ltYm9sXSkudGhlbigoKSA9PiB7XG5cdFx0XHR0aGlzW3Byb21pc2VzU3ltYm9sXSA9IFtdO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9tb25zdGVyanMub3JnL2VuL2RvYy9tb25zdGVyL01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlci5odG1sfE1vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cblx0ICogQHJldHVybiB7Kn1cblx0ICovXG5cdGdldCBmb2N1c01hbmFnZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXNbZm9jdXNNYW5hZ2VyU3ltYm9sXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jL21vbnN0ZXIvTW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyLmh0bWx8TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuXHQgKiBAcmV0dXJuIHsqfVxuXHQgKi9cblx0Z2V0IHJlc291cmNlTWFuYWdlcigpIHtcblx0XHRyZXR1cm4gdGhpc1tyZXNvdXJjZU1hbmFnZXJTeW1ib2xdO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuQ29tcG9uZW50cy5Ib3N0Lkhvc3R9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBUaGVyZSBpcyBubyBvdmVybGF5IGVsZW1lbnQgZGVmaW5lZC5cblx0ICovXG5cdHRvZ2dsZU92ZXJsYXkoKSB7XG5cdFx0aWYgKHRoaXNbb3ZlcmxheUVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBvdmVybGF5IGVsZW1lbnQgZGVmaW5lZC5cIik7XG5cdFx0fVxuXG5cdFx0dGhpc1tvdmVybGF5RWxlbWVudFN5bWJvbF0udG9nZ2xlKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7SG9zdH1cblx0ICogQHRocm93cyB7RXJyb3J9IFRoZXJlIGlzIG5vIG92ZXJsYXkgZWxlbWVudCBkZWZpbmVkLlxuXHQgKi9cblx0b3Blbk92ZXJsYXkoKSB7XG5cdFx0aWYgKHRoaXNbb3ZlcmxheUVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBvdmVybGF5IGVsZW1lbnQgZGVmaW5lZC5cIik7XG5cdFx0fVxuXG5cdFx0dGhpc1tvdmVybGF5RWxlbWVudFN5bWJvbF0ub3BlbigpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge0hvc3R9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBUaGVyZSBpcyBubyBvdmVybGF5IGVsZW1lbnQgZGVmaW5lZC5cblx0ICovXG5cdGNsb3NlT3ZlcmxheSgpIHtcblx0XHRpZiAodGhpc1tvdmVybGF5RWxlbWVudFN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIG92ZXJsYXkgZWxlbWVudCBkZWZpbmVkLlwiKTtcblx0XHR9XG5cblx0XHR0aGlzW292ZXJsYXlFbGVtZW50U3ltYm9sXS5jbG9zZSgpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1ob3N0XCI7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Q1NTU3R5bGVTaGVldFtdfVxuXHQgKi9cblx0c3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cdFx0cmV0dXJuIFtIb3N0U3R5bGVTaGVldF07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5JMThuLkxvY2FsZX1cblx0ICovXG5cdGdldCBsb2NhbGUoKSB7XG5cdFx0cmV0dXJuIGdldExvY2FsZU9mRG9jdW1lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtUcmFuc2xhdGlvbnN9XG5cdCAqL1xuXHRnZXQgdHJhbnNsYXRpb25zKCkge1xuXHRcdHJldHVybiBnZXREb2N1bWVudFRyYW5zbGF0aW9ucygpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfE1lc3NhZ2V9IG1lc3NhZ2Vcblx0ICovXG5cdHB1c2hOb3RpZmljYXRpb24obWVzc2FnZSkge1xuXHRcdGlmICh0aGlzW25vdGlmeUVsZW1lbnRTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBub3RpZnkgZWxlbWVudCBkZWZpbmVkLlwiKTtcblx0XHR9XG5cblx0XHR0aGlzW25vdGlmeUVsZW1lbnRTeW1ib2xdLnB1c2gobWVzc2FnZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHR0aGlzW292ZXJsYXlFbGVtZW50U3ltYm9sXSA9IHRoaXMucXVlcnlTZWxlY3RvcihcIm1vbnN0ZXItb3ZlcmxheVwiKTtcblx0dGhpc1tub3RpZnlFbGVtZW50U3ltYm9sXSA9IHRoaXMucXVlcnlTZWxlY3RvcihcIm1vbnN0ZXItbm90aWZ5XCIpO1xuXHR0aGlzW2NvbmZpZ01hbmFnZXJFbGVtZW50U3ltYm9sXSA9IHRoaXMucXVlcnlTZWxlY3Rvcihcblx0XHRcIm1vbnN0ZXItY29uZmlnLW1hbmFnZXJcIixcblx0KTtcbn1cblxuZnVuY3Rpb24gaW5pdFRyYW5zbGF0aW9ucygpIHtcblx0aWYgKGlzSXRlcmFibGUodGhpc1twcm9taXNlc1N5bWJvbF0pID09PSBmYWxzZSkge1xuXHRcdHRoaXNbcHJvbWlzZXNTeW1ib2xdID0gW107XG5cdH1cblxuXHR0aGlzW3Byb21pc2VzU3ltYm9sXS5wdXNoKEVtYmVkLmFzc2lnblRyYW5zbGF0aW9uc1RvRWxlbWVudCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyKCkge1xuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8dGVtcGxhdGUgaWQ9XCJob3N0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6aG9zdC1jb250YWluZXIuY29udGVudFwiXG4gICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwicGFydCBwYXRoOmhvc3QtY29udGFpbmVyLm5hbWUsIGRhdGEtbW9uc3Rlci1yb2xlIHBhdGg6aG9zdC1jb250YWluZXIubmFtZVwiPjwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJob3N0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICA8L2Rpdj5gO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoSG9zdCk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCAyMDI1LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqL1xuXG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgT3ZlcmxheVN0eWxlU2hlZXQgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0NTU1N0eWxlU2hlZXR9XG4gKi9cbmNvbnN0IE92ZXJsYXlTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0T3ZlcmxheVN0eWxlU2hlZXQuaW5zZXJ0UnVsZShcblx0XHRgXG5AbGF5ZXIgb3ZlcmxheSB7IFxuOndoZXJlKGh0bWwpe2xpbmUtaGVpZ2h0OjEuMTU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10ZXh0LXNpemUtYWRqdXN0OjEwMCU7dGV4dC1zaXplLWFkanVzdDoxMDAlfTp3aGVyZShoMSl7Zm9udC1zaXplOjJlbTttYXJnaW4tYmxvY2stZW5kOi42N2VtO21hcmdpbi1ibG9jay1zdGFydDouNjdlbX06d2hlcmUoZGwsb2wsdWwpIDp3aGVyZShkbCxvbCx1bCl7bWFyZ2luLWJsb2NrLWVuZDowO21hcmdpbi1ibG9jay1zdGFydDowfTp3aGVyZShocil7Ym94LXNpemluZzpjb250ZW50LWJveDtjb2xvcjppbmhlcml0O2hlaWdodDowfTp3aGVyZShhYmJyW3RpdGxlXSl7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTstd2Via2l0LXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkfTp3aGVyZShiLHN0cm9uZyl7Zm9udC13ZWlnaHQ6Ym9sZGVyfTp3aGVyZShjb2RlLGtiZCxwcmUsc2FtcCl7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6MWVtfTp3aGVyZShzbWFsbCl7Zm9udC1zaXplOjgwJX06d2hlcmUodGFibGUpe2JvcmRlci1jb2xvcjpjdXJyZW50Q29sb3I7dGV4dC1pbmRlbnQ6MH06d2hlcmUoYnV0dG9uLGlucHV0LHNlbGVjdCl7bWFyZ2luOjB9OndoZXJlKGJ1dHRvbil7dGV4dC10cmFuc2Zvcm06bm9uZX06d2hlcmUoYnV0dG9uLGlucHV0OmlzKFt0eXBlPWJ1dHRvbiBpXSxbdHlwZT1yZXNldCBpXSxbdHlwZT1zdWJtaXQgaV0pKXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufTp3aGVyZShwcm9ncmVzcyl7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9OndoZXJlKHNlbGVjdCl7dGV4dC10cmFuc2Zvcm06bm9uZX06d2hlcmUodGV4dGFyZWEpe21hcmdpbjowfTp3aGVyZShpbnB1dFt0eXBlPXNlYXJjaCBpXSl7LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiw6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOmluaGVyaXQ7b3BhY2l0eTouNTR9Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9OndoZXJlKGJ1dHRvbixpbnB1dDppcyhbdHlwZT1idXR0b24gaV0sW3R5cGU9Y29sb3IgaV0sW3R5cGU9cmVzZXQgaV0sW3R5cGU9c3VibWl0IGldKSk6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyLXN0eWxlOm5vbmU7cGFkZGluZzowfTp3aGVyZShidXR0b24saW5wdXQ6aXMoW3R5cGU9YnV0dG9uIGldLFt0eXBlPWNvbG9yIGldLFt0eXBlPXJlc2V0IGldLFt0eXBlPXN1Ym1pdCBpXSkpOjotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH06d2hlcmUoOi1tb3otdWktaW52YWxpZCl7Ym94LXNoYWRvdzpub25lfTp3aGVyZShkaWFsb2cpe2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6c29saWQ7Y29sb3I6IzAwMDtoZWlnaHQ6LW1vei1maXQtY29udGVudDtoZWlnaHQ6Zml0LWNvbnRlbnQ7bGVmdDowO21hcmdpbjphdXRvO3BhZGRpbmc6MWVtO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudH06d2hlcmUoZGlhbG9nOm5vdChbb3Blbl0pKXtkaXNwbGF5Om5vbmV9OndoZXJlKHN1bW1hcnkpe2Rpc3BsYXk6bGlzdC1pdGVtfWh0bWx7aGVpZ2h0OjEwMCV9Ym9keSxodG1se21pbi1oZWlnaHQ6Y2FsYygxMDB2aCAtIDQwcHgpfWJvZHl7Ym94LXNpemluZzpib3JkZXItYm94O21hcmdpbjowO3BhZGRpbmc6MDt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9Ym9keTpmb2N1cy12aXNpYmxle291dGxpbmU6bm9uZX06Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmV9LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaW5saW5lLWdyaWR7ZGlzcGxheTppbmxpbmUtZ3JpZH0uZmxleHtkaXNwbGF5OmZsZXh9LmlubGluZS1mbGV4e2Rpc3BsYXk6aW5saW5lLWZsZXh9LmhpZGRlbiwuaGlkZSwubm9uZXtkaXNwbGF5Om5vbmV9LnZpc2libGV7dmlzaWJpbGl0eTp2aXNpYmxlfS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMSwubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0yLC5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXByaW1hcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci0we2JvcmRlci1yYWRpdXM6MDtib3JkZXItc3R5bGU6bm9uZTtib3JkZXItd2lkdGg6MH0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItYm9yZGVyLXByaW1hcnktMntib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1wcmltYXJ5LTN7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zKX0ubW9uc3Rlci1ib3JkZXItcHJpbWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xLC5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktMiwubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTMsLm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xKX0ubW9uc3Rlci1ib3JkZXItc2Vjb25kYXJ5LTJ7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTIpfS5tb25zdGVyLWJvcmRlci1zZWNvbmRhcnktM3tib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMyl9Lm1vbnN0ZXItYm9yZGVyLXNlY29uZGFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KX0ubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMSwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMiwubW9uc3Rlci1ib3JkZXItdGVydGlhcnktMywubW9uc3Rlci1ib3JkZXItdGVydGlhcnktNHtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0xe2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTEpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ye2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTIpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS0ze2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTMpfS5tb25zdGVyLWJvcmRlci10ZXJ0aWFyeS00e2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpfWlucHV0LG1ldGVyLHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYXthY2NlbnQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aCk7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxMDAlO21hcmdpbjowO291dGxpbmU6bm9uZX1pbnB1dCxzZWxlY3QsdGV4dGFyZWF7aGVpZ2h0Oi1tb3otZml0LWNvbnRlbnQ7aGVpZ2h0OmZpdC1jb250ZW50O3BhZGRpbmc6LjRyZW0gLjZyZW19dGV4dGFyZWF7bWluLWhlaWdodDo2cmVtO3Jlc2l6ZTp2ZXJ0aWNhbH1pbnB1dFt0eXBlPWNvbG9yXXtoZWlnaHQ6MnJlbTttYXJnaW46MDtwYWRkaW5nOi4xcmVtO3dpZHRoOjJyZW19aW5wdXQ6aG92ZXI6bm90KFt0eXBlPXJhZGlvXSk6bm90KFt0eXBlPWNoZWNrYm94XSk6bm90KFt0eXBlPXJhbmdlXSksc2VsZWN0OmhvdmVyLHRleHRhcmVhOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTIpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuOHMsY29sb3IgLjI1cyAuMDgzMzMzMzMzM3N9aW5wdXQ6Zm9jdXMsc2VsZWN0OmZvY3VzLHRleHRhcmVhOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKTtvdXRsaW5lLW9mZnNldDozcHh9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6c3dhcDtmb250LWZhbWlseTpSYWxld2F5O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjMwMDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFGSjRBQklBQUFBQXQzQUFBRklRQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0U4Rys0NkhJVThCbUEvVTFSQlZFUUFoUWdJZ1FvSm54UVJDQXFCdWd5Qm1uQUxoQ0lBQVRZQ0pBT0lRQVFnQllVVUJ5QU1neHdiZmFRWGFKZWZtTnowWm9sM3Y2MGNQZVpNcEc0SEpTams1cUlJTmc2Q0dNZ2xaZi8vbjNGMGpPR0dEUkExclhlSW5jSklVa05IR242OXFNUkRVOFphampzOVVic210bnFuRTN2M3ZxaVFtZlJRcExrS1c2UVp3YWw2czVJVWlKTlVTVUcvT3dvRFk2QjY3NU9qU2prRFNTTXUycGVkcHU5dkpJTFVsSmQ3MDdEK2VMSHBqWURJNGUxdURuTGpISHZ4cERYR015ZHVMTG4xcXQwRkNRT3lGc0paRTEra0pxM1QrSWU3QkpGSU5PQU5iaTl2VFV6aEk3VzRHbVVMMGxXalQvRlFRaS9tKyt4dVBQMDJvbVJIZTVwbjREZ2ZOWmZuK1I5ejk3OXRtRWVOYXExUnhScUhUalRQTkEySkZFZ3JIZG8vbnQvVy81emJnR0N4aWE2RWtWaUEyRmhZR0l0Um1FMVp2VlV2cXRTdGI3TXZyZDNXNyt0MiswWGRvVG56empZYnA3bVNITEFDa2hNV2dDVEw2czBXdjBBVW9oSmZFcUUzb3BQZDU4aWtKbktsbyszdWFlU0hZSjZmY0ljWGpkK3JLVUVzYUVsVHFsVWxWUm0vTitlLzhpUDBMNUFLb3pObEozLzlpQndzaE02djVKSVVKeWtnVDNmZHJPbXE2TGNzK1orcS9Yc0FYRnhFRWlRSVVhS29zRm43Y3RUKzdCQlM1ZHFEb2xKWHVuYmw3cnR0ekQvdjM4NExmdEphZ0ZGQUxZUEU1QTdnbk1yWkJodDRsWHFzYlpLbWJkcTBUdE9tcG1nTml1Z00yUFlCYzczTXJqcTdHTHNvWEhjVHB0OXVQdkZEejhlTjNnK3N4clBRQXc2RFRGTnAvT1pJOWlpbk5pdFpoUm1wUU9Da2RvQmRBTmpWV2xhdk1pdHdETkpYL3BZSUFrVnduT1Avdlc1eHpvTXc3U0FGQUtVK1p6L2tuUC9aOWorT2Rmckw4S2UydmRLYm1waHV4SlN1TDhFVUFnZ0hJaUJIUCs0NDRFRHp2MVBUUTNZa09jT1NsVEhtajZVc2RmbzJMKy9qcFllN0lIV2NRVWdjZ2twTEZSMVlUVzhDR0tRWDliOEdGQUFBSDl0bzRSSFE2R0x2RlJyaTREaXdUekFBRERNS0RQci9mWjNWL3FkZ1Bta0d6S1RFbVdFWGI3UTN0dGdUWXFvMm5QNi8rOTdYZitGLzlKSEFWc0lJY0FDQlp3UnlrR1Q3Z0NSOFZvaEpjVU9PU0RqaVNiQXBoTW96bTJKUnB0QnRVVzY5WGJORkczSVZ5MktMb2s0OC9MZnNtNTI3SWFxQkxNdUJiT0ZJd2VGVWQwMXZlTCtZOHhXaHR6Y3FUbTJDSVRjNWVMSndTSTRmWWxMWUZJVkhBcy8vVDUzTjQvWXgxaEtHVStIU3FFcmRwUFBuczZmcXFXSnNOYlphQ2xRdGpsT0xVTXNoY2RvQTVUUXNzNEpMYzkwU3hDT01NVUs0S1A5TnNocHpwWDR2d3hLQ2hDQVNSRVJFL0xLc1dSbEp3TktBY1RuWEFoRXkzcjFLSGNaYS9ZZFg1ODQyMC9pYVhtdEdob0NBaUlpQVIyM3YvUDkrS1RBQ0FONWhka0MzeFVDNEVMc2dndmtSMmtyRWpZU0V2MEJLU21IQ2hJdllPQ0FKa0tRZ3lZTU0yUW9VTXpDbzE2Qko4NXFBV0NDZEhlazNBQjBPREwxTHEwUGdUZTNoU3cyZmhpNFhoUHVldVFXRUg2eHRJRVFBYkcyTm01b1Y1NFFGUCt5S2dPMkQ0VDV0L3d6MlhXOTIvcnBxcExUU0lQOHFWOXZMdk9kczBOTFd5WDUxSzZvZmJ2UFpFMXBhZjd3MzE4QzladGhxN2YzMmJmdUw2NFZaSHc1MTRZc201bGdmTmJmRzdXOWxzVUE0RUd6NzIzdnh3R3pwNGZSUittUDhMczVCN0tCMmVESlhjNnh3bEc2OTAydWc3QXpMQThOWTIxQjJkQi9QNXFmT1Y4dDFvbnlMNWpaRERmUUk1Umc4RDk4RnZIc3ZjbEh1SnNyZHZzSnJwYy9Uci9ndS9FZlpKelhVenBXYURqN003K1VQOC84RWtBQVZhQVMvQ1IrWHMvSk40WWFJY08xeEhaY1VhTU1ia2xycEt5N05mUUpLUWNVUmFnb0dtQ1crSEE2RU52YmczM3NsMnBJWVJtRTliSUhiMG1BNmtrNmxONUdkeU1ONUVibVFoeEhLbHdNZ1Q1OGNndzdwZFVSejduZk1jUWZjVTN2SWN6VmtkcmhYOFhIcTQwMTJ0Rk9kN2tUL2E3cDdtODNXQTcxRjdhTzlNK2RqdmRkNmo3ZnhtK0QxUHUzejN1aXJ2bXV5emE1M3RydjkzbFRiODJSVDJLYUZWVUtNTlAzNkJ2UU1DbzBHc0Vka0w4cyt6TGcxRXhiTTBOZ0NXQXhnemY4MkRHMUtYTWZjNHJqTmNRZkhLeFNDdVJ1Qkk1QW9kREREa0dkVjhDblZWRW1FTWFpbjRTYTBBWFRJMFJCTnBPWUFMVnExYVY5dnhKaVV6SEtXQ2lzNm1wMEJ1a3gwNjlHcjc0c25WTmJzb0Nta1ZNb3A1K3BER2FXejJzTERyMmlOdCtvWk8wYjM2WVNJaldjeHZubE4weDBWaGxZb1c0VVJqWFhLeUxHM1kzcW9MZEVhekhBRUVvVnVNbDNERGVFUlZwRy9qZVRFUjBDVVpFVTFtb3RxRm9pd0pGS1VhREZpYWNTbEJKckVqU1FLSi9DU0ZTbVNLazE2MVFsa2RLZXlTWFl6c2RYS2k2STlpa05KTXRDVUtsT3VRcVVxMVZIVDF6cTYrbHpmUU5BSWE1SnBSb3ZXYUVQN1p4dU5tVGpNTEJZdXEzWFVUZ05kUkRkNlVxOUEzM2NieEF6eERET04wSXhhTlZheGQvL3MvYWp4QUU2Sm5QYkZHWmt1QzN1YU5VOEVzRFNMWlZteE9qMVBkOEhReFhTcGVka1hhd2JXNndabzgrNkRyaXVRRkZ3NUlwdm5KaDYvWmdGSks5MzBhRU0yWEozeUpCMERIb3BoYnFnMHVya3ZNSWdZbHRiR1JQY2RrZDdWai9OVjRwYkFiYSsvRTRCakNnOXA1WmVyaS9wZE0wQ0cvN3RYWk54VkUrNmJZYXZRbjZ1bVd3eTNGWGY2Z2crWG5BdEhEZ2prUE5pVWJxcG93dkRVdmJSbGNqNVhaSFl6VjhKaTRObDF2anNPaHJNYXhPSHhlRHdlanovVklISlhuNkgwd2hnNnFGT0VVcVFvMFdMRTBvaExDVEtKMHlRNUxVOXlSUXBTcFVsZlpuQVNCa1dwbENsWG9WS1Y2cWliVEJ0TW1RS1lZV0hWVVVmdEdJdDYybGRuTUgzRXBpVTBxVlFxSGJDTHhPVStFNC8xWExmQkVoektoZ1VjZ1VTaGZ4d21EejlHNUVSQUFITDdGSFJLUXlybnd1eFFmNXJoSEJFQlJJb1NMVVlzelViYzRydE1kcGwyNkZnZDU1dGdRRzh4L2ZBWjJKekl2R2JtbHJjWEFtM3dYS2E3RWxmUGNTMnR4ZnErZWdmaUhHb0RNeHlCUktIdnkzU0ozMFE2VjgrNm1kZlpzYUZWM2VPVUtzV015bmtoeUwxdTRWSTBMMVNKTEl4WHlZenBMeU5xaVd6MFhUcGthVHluMVpEdGk5MG1ZMDJ2MHRVcXR6U0NsK3FySzdySXV2MXY5UkQwc2d4cUdiSm9HR2ZFa2xFMVl6cjI4TzFsMktld1g5TjRBRGFOMWI3TDBJYVJUWE91eTl5aXU4MnBPd0hRQkMrcGxkQ3JPbUswTWcvcjF2UllFbTNEQkVjZ1VlZ21VeDAzRzQrd2l0UWdPZkVSRUNWWlVZM200dG1FSXZ3VUtVcTBHTEUwNGxJQ1R1STB5VHF0RmNsRUNsS2xTYTg2V0VaM0pKdnNGV2k3SXhLSk9Cd09oOFBoY0VUclJOM3REcGxNSnBOaFJJYWlxQWlHWVJnbWNia3N5NE5vei9yb2ZRTDdLY2FsTkQwRk9XM1JHWnVPQlIyeG1WTXhrVWdrRGwwWDd1Sml1dFM4Yk5HYUUrdi9aUU93cWU4NkdJSWVFc0N1b3ZXWWZDcTJ0dnBNT0JON016TzY4R1dYTGh0bWdXMmZmZUhwMU11N3F3WDVORHdUa3BDU2NlZkJreGR2ZmluQVJJUklVYUxGaUtVUmx4SUFpWkUwclZxNjVJb1VTWlVtdmVxVU1ycHMvejFaV0VaNVlCZ0dBQUFBQUFDQTBXWnNkMUNwK0h3K24yL2NPbGs0ckRwU2wxSzNIcjM2amcxQ1R0d3pPY051Q1hZTmdpRFlob3RIMW9nT0xSU3V4OG5pbDRyMmlZYXYwbm9yelh2WjJuWmpaTGZhS0QrVlJnSC9mZ05tcGtGYmhnaUdpVWFjR2ZYTm1LNDlGUHZZOXR2YmNUbTc1KzNmZGFtVzZZU3R3a2R6YUNIWmN2cTBDUzRpVTVabU54TFhHQmUvclFvSGpNUDEvUUVHVk1aRkpnYkRESi81VDNleUJjdkdQU3FUaW1KY0MrWVFVanFHdjJuQzdxM25CMERPcXYyRzNWdmxJaEtJVzhNUlNCUzZ5WlRpTkdGWCtSR0NESHM4UFlJZFRqZEFVQXl2UWt3U0NwcGhOZDIwbXB1TWpRWEtCUWtXSWpRcG1KUlVLWXhLWGNMRGM2a0lmSGFUS2FPTVNjNE1zVlJZUTBlelU2RkxwVnVQM3RMSHV3cHJZZnRoaXdpSEZBV2tTcG1XUnQrNm5KNlUxOEN1eUo4NWoyeDBiMGQ3TjlwaWJxMGxiNE5uVStwTzd0RVVMaWhkVU8yaHJwdGdZWENzeEJGQTNsUTJubUZjM0ZiUmpHQmdDZDZCVUg3cW5YQmJhY2pzSzk5UmZJRE1BRmtCc29PK25aZzhQMEJCZ01JQXRRRWFuOVdRRXM5TUFITkc4NTU0d2ErQXJucXZUVGpwR1M3ZS9pbFBtakFSUG1uc3hXa2RBQVJ5T0w5eUFoeW14N1NHS2xrN0doNDh2RHZOZmRnK0lUQlpwRDlnemdNSUJ3d0JrNXRta0VYSXFxTU1hRVRnL0hVZTI2b0xUVHA0dzRnOVVrWjViZ2J4RUh0Q3lUTFlQSG1KVXEzdUpwcXp2U05jdW1iQmRYWVFza3UxQzkyTjhqVHZERkVVMHJ2ODE3Z21xc0dqUGZSdU5qdmVyVERtSENFNHErcWJ6T2p1SUl2UmFEaHpaMS9WSlVwaGhpT1FLSFF3c1o1VGpndUFCOEN1S3IrWUlNS2V3SW9NTzV4eDllNEFFQlREU1lwbTJPVHk4b0lveVlvYWplalVRYjhKd0QvWEI1aVNzd1VpZ2hBc1JHaFMwQ2d6SnpYTUNUVTFYRVpIYVRBWFRDUVNpY1hiWTRWQ29SZ0xFeHN0bGRDdHhaMWFVbmx1dEdodE9RdDE4L1JVZFZwa0RCdmJTNG5Fb05Gb05CcU5GaWRYbjBXSkxKQ3JVOENVYnFxTWhaR3BtK0Y4RWJCSVVhTEZpS1VSbHhLRUVpVlZMVk55UmdwU3BVbXZ1Z0FaaEFHbHlwU3JVS2xLdGJwbUE2d3JRTGNldmZxYUU3RFRXczZZSG0wRTJkY2xpV1dzV0Uzbm1TN0c1YjZ1R1ZuUG5OdXl5V2JId3hEanBXazZNK2oyMGVZTUxRLzAzVk1tS200Wm5nbEpTTW00OCtESml6ZS9LcmRDa1ZNbEtzeUltbWVaZjBHUXl3SkJFRnhDL3JnZ0NJSWdDSUl6OTBiREV3TVRqOGZqQVVBeGRTNlZzRGNzMWc4d2ZZQ1hyTmQ5OFNIOGdhams1dnVVUHFnNFhEUDlKbTdvR1d2R1h4U2RFTExmcnNFU0VzbVdYVGNNM2NMdEhGU0diU0hCQWpjQ2lVSVhKcUhuTWxPTFJCTGFzblVLMlN1eDF6cW5NQi9aTUdPeC96UHU4b2hEQURBQU9BQUNBQW1BQWtBRFlIZ2xDa0N1TFZBaVNJS0ZDUDBraFdOS1BGVXdiZHlMK3NEQnllZ2thSjJXRU10V3JFNi80dnBXN0c2ZTRtRHcwQmZ4WmhGdDlHdmZoUEVBbXlkNGNNdFVxc1BsNGF5N0d1YWs1dDBONTJPT3dKYUJnU05Ic2syTmg3cUVXWllWcThlK2tzeGpqM0VLU1hnOExOaWxRcUZRekUxZnY1dHZwUVFGdEZJbXlMdGl2VGVXa1FDazVaUmUyUWlKMlpyTFlEVjg2TUJZV1g1eEFQdW5rMXludFoyeDZhYk5yaVhBc2hXcmNma1U2M3kvai9tK2duek44STNZdHh6ZkNlT2lBUGk3WWgxd0JCS0Z6czcyV3JsaWZXYjNuK3NPbWtTaXpYSFRYcG12QW5PZ2VhKzdTOEYxRUhQOG5VNEluRlk0UTVtV3AzQkFMbGVzYTdCejRGdU9iRTRFWFJuaXlrOGh0Q09pazh2bGNzV1lJS3I0L2NITTNYWEljY3lPRHNCWEg5UjNOSUJqVXNkMWZpZGowaWluSDVyaVpmVU9EVGlGUXVsemVheDcrakhaVnl4ZjM4VTN4TGRyK1U3dTQzSDU5S2VnSzk1SnZ3dnlxbjNJZ3hMeVVHMlk0UWdrQ3YxQlREK0l2Q01QTWcwbFZZUkJuU0lRa2FKRWl4RkxJeTRsQ0NUMmhtMHNFQWdFSlREcnFiNGdKMkpZb3pTVUtWZWhVcFhxYk5yWitaaGVqYis1ckhyR3pjY0xRaEpTTXU0OGVQTGl6YS9LelFuTUNFS3dFS0ZKWVlHeU55SzFsdEpVL0o2V21GeFVxTHNJblhTczM0czRBSm5UTlA5SlY4MVpXMDhid294d2pNb0dnKzFnUFB4d0FNZVprQkVFK1ZzdXBzeG85Y1dTNWl2bmFTVXBGSlExVEVidGV5S2pNQUxsU1FoNlJLM2dDQ1FLM2VRVTRqYkVDN3VxL0F5Q0RIdUNCUVRzY01iVnV3TVVCQlREUTl5UUZNMnd5Um55RVN4S3NxSkdVM1JpRURQWEw5RFo1RjRJcEF1U1lDRkNrOElHWlZNRkNkT2tMdUUxSUtWRmxHZ3hZbW5FTmVOQkNWU0prbkpFaitTTUZFbVZKcjNxbURLSXpHbGtTYmJkOUhMazFmeCszZStWQ3BtS29oZ2x5VUJWcWt5NUNwV3FWS2NhVUczVWxmcG9rTWJheE5Bc0xWcTFhVTlHSWxPZnZKbE1wcGpKWkRKYlJqdGFOV2svcnpXb01JSWFOV2VzYXV0MDN5TU8yUHhJSTZNQkU5MXFmb0R5eENTd2dDT1FLSFNUNlFWdURoNWhGWGxwdHJnTWp5QktzcUlhTDE3R2Nka0E1OEE4Z0NZLzMyUExid2tuQ1FCQU5tdEN3Nk5vQnJWSXF6YnRPVXNXVTQwNWxDd1oxdER4NXAxbzdURWRKQmdTR0w3NzdCRWpvOTRhbzlvanRLOWJ2NS9oQU04UmE0NlNqZ21kZUx6TkRNaGlVSG51N1FtRERCWitJVUZpVGNKb0hjbElrU3BOK21aR2NUY0g1SWNCcGNxVVIwV29WS1U2NnFaM3VzZWdGM21uK2JGbHJpcTlCbW1uVjdQYjdHMFJ0Q2FzT3dLUVpFZ2g0ODZESnkvZS9KNkpyejJydnoxMThQazhQcC9QNXkvOU5QSmlyOWdKd3lsS3JVeTVDcFdxVkVmZFZGTnRocldnVlp2MlpJU1llcmVCb0pkSEtlYWVnMEo3VUJlcVI4U08xYW4zcEZBTUtMd0l0VlNKKytGbW5pSEVzRkVRVytwZWtvTTVIcWY1MGx4QkxMdjl6Q01BWlRQUTE3bjlYNWtIRlg3YzZRMkp2YitLU0lzU0xVWXNqYmhtdkpFRVd4TEhKRFhNU0s1SWtWUnAwcXVPSUtPTHpHbGtTYmJkOUhMa3lWZWdNQlc1VUt3a0dXd3BWYVpjaFVwVnFxT21qOXA1cWxOVDMvLzF4c2lBUkNLUlNBQkFCUURBZ0VBZ0VGNGtjSFBBNHkvZjJtN1lHbzVBb3RDVlNTSWFUZVZHRkFBbHgxUklaUnZHYzVqMEpJZW9jeHp6cEt0Y2F5Y3hJMWhTeVYrNjEvR0N3dXpBTWZRTXc2TFRLZDhvc0ZBY3JOVkRQSWVGczZMSEZ4bE55dGllRGpiOEdPUVFiaFNJdGowMmdJZzhPVmJVZmdGL0d0a2FDc01NUnlCUjZENTVtY1BqTGJZa0k4SjB3SndYZi9NMW5vOWRqVFZkV2hwaUQ0TWprQ2owR1lZNmtZMU41UTRFS2dVaFdJalFwTkNqYktvU0NOT2lYb1piVkY5L3pzTGRHWUdnVmJNendKd3o4K21xVTJzalkxQnJjamwzZkcvc2Z6NnE3b2cyWTM0dmZwZFVoZS9DWjJISDh5QUEveFE4RDNteUFJRE5BVnNDQUpiWm54aTJjSDVzMmNSSndWYU9tMldXc3RQR1p4WVpBMUtJUjdtdDNBekFtdGtGVUk1aWxEY0FtMlF3b2pGWEI2cjNJc0J5VnE1bCt0TmFiY3RyRitRckFRK2xraVVXemlIR0tXYzV1MUZVZE1LTWhueGl4bkFVNGxrYUFuby9uaHVTY0VuSHJRNlFFZG9SMkZJUTRHRm5ZSGtmQmdKVHdObDQyclFIN2RWNklCS3g0R0RJUFRTUEF0WUhjdWEvVXplUDFlcFpKTmF0T0FTcUZFUWtZQ1dTaktvbWN2SjRRL2xZbVI2YldpRVdXVklGQU5hSVRPVncyWlZIenI1TXpDLzBpL0Qxa3dFV1ZEL3pUOWI2REc2MzJpSzRVcUM3VFAyVU5ibmtFWTg2NFhZaUtsVytCUzNGVUt4SERRWW8rOEI5eXoxdzRoMDdCYTRRa2t6TDBMR0pHSXJyWitjTlh1QjNQdzZjZWRwQU1VNkd6UlFxRFc3bnRCK2NXaXNGeW8zV0NtUWpMME1tWG9CcU5XUkZJWkk3Z0RYaHRTY3Q4THBCZmtIc1JRNlhwVmZJUnZaQlU4cDg1RjRoSDhFS254bUVZbXUrSzZjWVkzZ1FlMSsvVHpKQUlSRjFjS3ZObW4yUTBNOGFPV3NYalQ5anZCQ3I1MjF4cXRXVkk2YXBMcGVoS2N4WnVXOUJXTEozUUdxZjlKVGl1dnZVMHdkZ2h3LzhJQlJJWDFWdU5ReXNCcVN0Vk5QWFpEdEwrTml2Y3dpMVBnRC81TzBveW0ySis3OG9uMHJ4Z0E5T0NsYTBnTjBKRVBIWS9ZUDRuaElhd2JFSjJIbFVuUjlEYnpmV01QQXZ4a3J0QTE0eDZqckFtWVVjZ1JmUmxabm5ZeHMyeStvd0xEd2tTMlZrM2RmakFBVVZJSmV3RDA2dHorQXV3NnBJcXhUbDRkbWpvR2xZUVhETWIzMUZKUHMrNjdqOVJOZ3NIWWd3d09jWXR1Zks2VmhDTE11YzRORlRidjlwRVFqRk5qTnIwTFdBSkIzWEdIbTR4N25CUmZYbUhRaFEwYnpxbU90VlRueWVTNngxSGJDL2Fyai9YZS83cU1PbDdNMGVVbkRQZ2h5aXNGOHFJb0ZiaGZFZ3F5RDRvM28ySzVSTHJNSllDYUM1Z3JId3VwRE5zVm9YRkkzKzlXWVBhMWx3dk9wOTFmdmFuR2hvbUppcDk3dXBOSG1PSCt5YjEraExJcGRkcjIxUmlBMTNKaWI3OWs2cFRCM2RGQW83MTRwUTF5UlpiVFhNeWRBN21RRTlSRkdoTC9PeHJIamRSbm8wWGRmOXlFZTBuWEZmT2VyelkrRE8zZmlCV0JGTUFtcUZiT2Vna0FxWFRWbzVmUzY2eU9JVmxMQ1NkY3A2OHVlNHlKZWxoVVB0VTZWbTJqbk5BUHF3V2FObm52MXc3SlA2eFFaYXdTSVBsT0ZNRVVHdXpQQ0JiMmRKVXlnWTZROXdyNkpVakpyNk5aY2JFWXdML2N4WmZlYzgyTE9zTUs0OXhYNjI4UDhOcTNUREVjSUFQWnd3aEx3NThoUEtrNUpTb0RCSmdpVExFU3RQQTUwbTdTcVltTlN4NkZOdjBpU2pVMDR6bVRiTllzNENxemZKZmxtQy9ZWkpnTkJ3REFhQmk4ZUJIVDVIQWs0SVFrS3VSRVIyY2VIQ2pTdFhZaEplTU42OEVmejR3Zmp6SnhFZ2dKU2NuRXlnVUF3bEpYZGgxSnlFQytjaGdnWXBUaHhLdkhoMkVpUnlsaVNKcDJUcEtEbzZXMlRJc0ZXbVRGNnk1RUR5NUVNS0ZQQldxQkJma1JJQ0JsVm8xYXBSYXRTeVU2Zk9WdlhxK1dqUXdGZVRKbjZhdGVNd01mRm4wY0ZlcDA0QnVuVFpvbHMzcEVjUHZsNjlrRDU5K0NaTjJ1YVVVNFJPTzQxcjJqU3VPZk4yV3JCQTZFMHlaTWtNNGJ3NWh3c1duQzVhY3Joa3hlbXlOWnNyTnR5dTJ2SzRac2R0elo3SE9zd0dFd3Voa1JpTTdUZzRFQzRlbkIxbmlKQVFib3VkRUJHUkhWeUlJUkxlY0Q1OElYNzg0UHo1UXdJRTJFbE9UcVFSWEhBUTE2VTRoQzdnZ0NFQWcwWUFCd29LRHJ1RWw2K0dxYkZOUExXR0F4REEyKzJtVVNOT2lCZzd0MFNrUzMxb3hlTWtqckZuMklJakp6ak1TVWhPdWtrb0VKU2lqeUdneDJJYS85WmMwM2IrbjgrZ3FrZ1MyOHM3NTZjalVwM3p3VHIrUlBlNlNlcmxVZFQ1YWV1Z2UvQUhnQno5RjRpbndFOHErSDRPdklXMzlGYmVXcnkvQnFNdnYvS1N1cGk5SGtyVmVmRzVaNElhdmZqeVd5K3A0c1ZYeWhlVlQ1bnhJcS96YnZiam9xWFgxWmUwaGowQVlGTVFaczJCa0FnRklHRnd4SFlOQjlYZGFtd3IzczcvQ0lmZ1laaWZoVDlnYTEweXd0emRaWS9oY25lVFlhL2tpejhLQ0JvcmhGWjRnMWxYQkdHV0tBNzUyRWxJZDlhTEs0U0ZOZFYzMjliRzdSSUlLVTRHRXZoanI4TFUxd2pBMjNzOUJtZ2JHalE5N29VS3dxaU92eVBaRVJJQ0tJekE2V1RwV1F3VjZvSmxlM1ZUbGo1VHlQS09qbTROYnZPZy9UOUdWZnhOQTloRmhRRFN3L2ZSanBDRjJXOE9BNjhpQ3lUK2YySC9ERzhDNmUrbTF4L0lJODc5TkEzNXJ3QUE2OFFXQVlnbFRUQXNZQUNFcWVOKzZteTN3WW9BNEYrak5vV2NOUzhPaWFqUVFQN3lNRmF3SWpRUmdTVU1MSTBRN24xUkFYNlJGOFlLSUlKVW9aM3lnQytRMlFvc0NrdE81bHVNSEdVYUUzZUxlOFZqMGhxcFdBcElFYWxPYXBHNnJkVys3cVJBRmNDZVlpa0E0QlBUc0xoL3dVV2ZPYng5UjZVOHFmQTRTS241ZzdZQ1hBU1FDUUJZTjNrQS8vMU4xZi9rNlMvMFkvMW9Ccjc0R1h4eCsyTmYwdSsvN2d2cUMvTHp6MEVmOU9SQnFqbjFQZ0xvWlE4YisxWjBjOGdOL2wvMkRXZk5tZktwWDEwMzd6Mkx4bjNsdEJYVGJFNVo4SVB2ZkcvR0pvU0R5NDZBTXhZMkRnRWhFVEVKR1NVTVRvV2dwa2N4TURKNzI0UjMvZUgxOFNDQ1M0SWt5WFF5Wk1xU3IwQ2hJc1VNYXRTcDE2QkpNeU1UTTR0T2Ivbk5XMzd5dnYvNTJPYys4WVhmL1RzdTNMTE1lVDliZFh0MmNOZXZYdkx5YVBqRkRVK05nUmNOdU9CMXIzbkRMQklHUnlOUUdEeE95am1vVklPTGg2K1VHQXdBa29QOHdKT09oaGJKQk5VdmhwVU5MWnFEVTZKMEtWS2x5Yk9iWGc2dEVoVktsYWxTN2x1VjJyVm8xY2FxVmdkdm5hTVFDY3VXWEhIVjVjaTRXVVFtVW1VME1NQW10Z1FzQlN6dEYzUmJCQmV3RklBdzVsNDFpamNiQm1RcDZ5M0FFTnQ4MmRBa3dqeG56N1A3OFZVVURCL1ZtdUFkK3g1NmNQKyt2WHZHUmtlR2gxWXNYN1oweWVqSThPS2JGeTFjTURRNE1IL2UzRG16Ky90NmU3cTdPanZhMjNLdExkbE1PcFZzYm1yY2dXQTA3UGNlZmVUaGg3cWRkcXZadVArdWRHMjFsc1RBUCtmejZkcjFtb3ArMExKMVRFZ2dTNkN1dkM1b3lBaXViMDEzWVBNTGJZelRiT0RBVFg1WUVpWXljcFU1SVZjUGZKRGxKK29PdWRzdkxPVXlDSEEwZXBTaFJkNGR1SDRLZ0VwTUVPV1pHYjVFRmNNalZKa0JVQlVCUlprQTJaS05Sc0FOMSsxMHhLOHRpNUx2dTlDUU9jWnd4b2J0VkpZU05ZU0ZJMy9lendpTEpkUUVsVkFWcWJGZlZqN0dGWUtVd2lMMk05Y1NkZ05tOExIY3NBSWx2M3QrcFR6aWtnalM4TGhucFJBNHlEcGJPN0JjZWtoTElSdHlyc28zaE9GYmlVMjlGZ21LWTVKODJ4UmQ4cXlsc0ZXa0VIL2JhbjhsbkR2M1p5NWU0RFZHaVozT1FSREJENDY0WG5XVG1vRkRSNTJ1WEpremxmeUNSTjBqRlVMZXFaVkxOUUVYbVZFbERvdFpOT2ZpelE0UkxiaTBLM1ZmUWl1T0tPRVNNRlR2MTNUdmk2Q1Z5VTdXeE1tS1czVWJ0RG1uSTE3eVgzSGNud2pnb2ZvVTRtYVNVbExuSVBvZDB3OHl2NjZvV0lNZFNpR1BVdjJ0Z21BNEVkYTEwRnJudFFtL2VsdGhmd3VoQUhXS3MrSnMvM3pxdFR4U2ZjWmRXdk1Ca0VrbzJPV2Q1aDhWeGtsMXdRMHRXcWZYeGpuYlhUd0R3NW9tV1o1cWR2SElEYktZeHlnOTcwcEp2ekF6OG4zNU9MUmtmU2JkRFRwWmdOTTlsUUptMmlVMy9IMG5neHZIMjlkQWVZMlFEUXZ4WjR6U2hwUWJoQWpCbXdWYkk3RjdJdko3a2lOMUZKR1dOdUFuMHpNRXlSbDBoMk4xN0pDS2lnQ1BLZnk5bkhOT3R6d25JendtZ3V2WlovVE1CY1FsSEFmdzVFeEhEc1hHdUZ1U2VvM3lDSm5aUmIzVzdVZjNhTlo3M0VZSzdrT1NsVkpzd1lZeUpDdGNHTTFHcmo5OGNuSGhrRm11N1BkT3duMVd6UjBoeFRuUlU4YUJKbXhxSDl3UUlJYy9mVVdCSGo4cXJJU2piTzJoUFc3bFJJYW9ESnBLcDZXclZIYjBvbDVMbktMeUZqMlRIZ215OTZBcFo2L2xxMWlOUFk4dndES3o1Z3MrRS9DWklDUHdjYWNxY25SaXIxUnpQc25DZ1FWYWc1VU1yS0dKNnk0K3lQWVpJN3lqS1RKS1NVTjRvVVQ3R1RkaXhPMERrZmNUVWRta2FCenFQYmk1U2lLZkphSkRES1kxWmwxMnUxUkFPa3dTcDd6SG42UWthaXBOTHI2RTBwSGdtSVEwTzN4Qm5XU3lZMjBjdUgyeldZeE5RM3cybUZ3UDh4azVjS2VEc2RVYWtLbExITkpHOHM1eHp5aE50dEVCaVJETlFzY0NsMnYyWkFuMUNpdHhNRWpMTXdHOXAxZER0ZHFpd0pUTkNmTFNxUlMwQXRWdXFRUElzUUNSWkltOHg2NklOd3BUQ01KQzJ2WUhyTk1XTXc1VHhKNFZpNEhnUlJva2lnRktQVHBuNDVKWWd4cWgwYm9xZ3VIUDZJZ2tRVEtWUHA5Qm1DdHlTT0pkNmJ5RTBsUTFkbmt0bGNpR1VtcFFPOXRCbjZBQlJCdlliaC9vWGFwbkNDNzVHR0l4bDhXK1paT2pvSFVodTdOQzI1VUpvTGRvdkMxVm9BaTJGQVhwK000TjFEeUF6VVVqZVN2NXdHN1piZjlFY1Q2ak1ic0oxQnBZL0p0b2w3TjBqcFFoZ0xoY1lmWWVVWjJCWHFHVUg4NVE4UlJ0ejJmUWRuem5sbEIxOGRDRE0zQk0wUlZtTFhHUEZWUmpFZFFoTFA5RGlKdnBOem9VQXZlZzlaQUxmSWpUVmI0ZXQ1dlBNOUFVVkMxMUpZQk15RXBKb0xhd0hWczNBMENORDBjZzIveG5YSk4rSUpXNEFLZjFHU1VhM1ZCY3VNclhsVVlUdWdab096UGZXS1J1YzhxWU1tbE9NS3dsN3gwa0t0c3dsZjJaUnNyajFoZzJ5enFCYVBsQWFNbGtSQzd6RzRXYUhjOEFCcmx5MG1EVmdQaEtnNjBLSUdzbG4xRkZRR29CSFkxVEd2OUtnSnAzVm9vM09CSXVBNDg1b3JoMGMwTkcyTFg2eVNBOXNHY0JhbjJRaG9iZ25pSjZGZXR1S1NIWExwNWVjTjFGaTFvM01nTW1LZHcwSXJGaGo4MUtpVUxEdlJKREk1S1NVbEtBRklLeFZ6Q3VnVXhYcEdnWmZBZ1BFRTkwTmV6S3pweHZIYlBUVnEyZE9hcTg0MkVOOXV5VHpLMkZZdCtXZFFaRGU0VWJlQjE4c3d2bFFVQ2lGcmJMK3lDN1dxbHpaT1ViMlZwWVFadTFtUFVrVDJYeTcyNk5qMGdwVW1vRVdJZXIvRkprZ2tnYkFBTDREaC8wbG81SkRCTUM3a2cwRHR6UG9nRjBLN0xXTFhSMDZQRU4wb29ISDFsdWVKa1FEUElXVTZNWk82TGEyc2d1bkY1MDhDMmxZR1pQbGN4MlhKMXR1WEZicmU1MUNJVVdTaGI0Zm9qNkxnR2NtbGcrVUNpU2l4Y0g5cko2VFRKZEFDMjRBcEdic2E1aGEvTklyK2g5SWVhWElDaVp1OEM0Skx6V1Q3Z0tZVDc2MzkrQUFqTGxwcGRYQUxibXQvemNkWjhuZkkvc3dYTmJaZHc5bVIxU083SWZnWktDLzRNQ3dwQ3c1c0QxajQwd0l1YmR0cEJOY3NWSG11VVB2aGFrc3hNOUY4Qkxrc1EzNk0vQk9KQVF0OFRCQlNVYlNvandLMzJFWWJlUXJ6dVlHYTluV0ZoT0tUbFFCdzlDRmo5alRHNEozTmdEdmV1QWcxVU9oYjRLQXA5cEhnYU1KS2IwU2xvTDdEb2RIc0xqcHRYaGt2T2Fhb2UwQ0hqRFU2dGtLQ0I0MmdaSnpSRGNQbzJ4TmVKclpEeGNYZVYzVjI4SndrMEhKaFUwOEx0R0RRTXFLT1AzVEdvQUk2WW5iRWtSd0RSazNPNGtpNjFJbnFUODEyeEtiaWlvQk1HRTVETHBNS3JpT3BvdkZMdGJJZTl4cU1xL1NUWXN5MFpRRjV5YVphdnAvYStIN3ViRG5wU3NpQndKRmFnQk1pN3dWV2M3VUhxbG13M2ZjTHZ2bW5WUlNGWVJRRW5neG5IdnV4OFExQ1Y3QUlBdUFJRGRBSDFBK0x3ZytnSGdQNEM5UUxnQkFOYWV2T1R3b3FNSFVvTmdtVm1FeURJN0xyeExIRFhYRWs3WkFNSTl6T2JHeUNHRGJrNkc1VWduVHBQYzMralpRTWpZR1V5dU5YZytNL1RpYkkyY0J4Z0p3a2IwYmdpNGZaZjVBQkNXVDdCRFNNOFllUy9KOG5vNElzeFFZazUxd1pLbTQ0Q2p3NnBUZlFqWGpVTHY5ZWpQT1ZLSjNQaFMyaUlmdWxBSzZzTUx1elk1T24vYkh6aFpETjJHYVBoNDY2WkxVVVpFbVdKM1hSRys4QSt2NVlPT2xGSU1SRkI0K0xqV3l1U3VTT2VwM3FyUFdyTkJvUnZHRFdiZ3FjdTk3MTVrWHoyQkVNRlVaWGZodkw5VUQvT3VtNjR3ejgxSWtzU1h2WnVJT3FjWVJDcHQrRFVpZ3N1RTNRN2J2Zzh6OXFFemY4bWZlSEZuNTVzSlJVdUxZeFEzZk1IWnVPN3ZoazhNMDkxUXhMQloxU2UyaVFOVjBkakV1Q0ZUYm55amVhcU5XdERVT2JxSmVKc0J1bklRN1BLV3F2SFBQRnhFWFRNS1JqZkFEYytNOWI3NVdpdEtlTjJUVHdQTWIwUEE5cTJGVVVHU2FMaHNsakRBVUFNTUxkS1lRSFZqY3dwZ1lLb3dhVVFDMTZycmh4QkRSVS9hWmdiRW9VcytBMTBUeGtzbmtTTGpaYXl5UmErUGhLS05qQlQ4TG9TcXJxQkdpcUdTUmlGNVRCQzdoNTNDaW9lRjRXRk1WMXpLNWpEUG9iakhnUDVhOXNCREQxaU84NFdjTDk0Q281RWRjSWtIbE5mSnRmbW1BRXQrQXAxSmF0dzd2NUx4YlNVM21lS0NXczEzY29kUVVZbEpWdis4dG11ckFHb0UxbnBNaFpleFRMb1BMMGtnN1VleTJNTEV1dk0weTQ1S2x3R2xXeEFobkhmTmpaYVdOY002ckpiTWltaTArc3p2OUJCcU91dGZQVkVqSGpJYk5kNXBhYU5tYkgzRkxKdmkxdGxPeE5zb3RkaU93VDluZVBPNytlU0dGRlR6MFRhZDlZZG1BL3BKOHFGYTVnc2Zhb2lzdzYxQW50OE92aisyNDJXSzNSVnIrY3lPQ0dUWFRaN1pxM3lISlFMUitxZnVTYmdQbDRVb1VubkZNcWx1SDlBUDhSaU8xa2Fsc3hlZUhYbmt1TkllOSs2MDZ6aWgxczhPSzg2ZWtNcjZxc0JzOHJ1VXE2eEZIMGdVZlZzT1lhbjNXU3RBUmY3RjUwdjZ3ZHVLYjBZdjJic3AydkN3U3FGYU1BcnJJTHZZVjBxeC9UczZjRDkvUjB2bWI3cStVajRRSkRIZkx3cWExTDJZU2FLZTZvY1dYVDZFaCtWd3VhUnlIc3BMdGlVTWVmcEpSVVlJdmRPcDVZRisvTWhnQkIycGZ3R2prS2NjZit3U0krQlZ6T1hMR2cxY3hXNERWZjlIT2FhSGlTczAvUjNkZlNpOGhkRnhZaDdNd2xGL2p5aHdEYWdGL0NlMnowaHd3RjRYNUpiRHNGSnVBd00wTnF0anNHTURDVjZHSzE5aGpVQURiUk43eUdkaE9oOHV3SEwzMEd6cXlsbWN2N2FJZzdRb2x6UG5Md3JiamNOdjM2WEthRlp6NGk4UFZIaGVRM29RcGFxTEpESTNTRGtFWExITUNKVFphUEt5ZlFUVVdyODZxSGNXNlpUZTVvTTd2YXRORFhrRmxja1VQNkdTVVFoVldpdEYyVzcxOWZQT1pIZTdnOFdyN0ZtMjR5OGhIa1RtUmdWN3ZqUFJYUHE0ZEQ4MGEwYVpnNDNmQlY1dFd2dkk2QUJZT2dmR3V0aThpL2txeFF1TEVHb0cxbzVmVG1tNm5zV1pyZGx1RTJicjBMZ2tkU2g3RjFNUzVwRDBEWkR3OFVpdFdLRm11c3gySDIxeEQvYm03eHhzOE9IMWxpWUpTVnc0WXVqd2h4UzMwQncyNUI3YUNiR3RnSFpVTEltNnVlYXR4ZXlwclZrcStsRm5CbVJWQWQyb1VUNUNWNlBMa1hYNGthS2JkZ1RtRmhqZXNvL0tqQzhJbWxnYkx5ckdLMzhTN0pqcXQxRTVhQ01pWG93YStVUGd5M2JKNTZkb0hJZ3hQUGdid0pyZFd0bE9HSjdNQ04rMDVpNlY3VW1qaWpoU21JL2VvZFhqSTJXeFFIamFtZlZPU1B5bldEdDU4Ym95OHl2TE40cTkzSmhwTDVwV0JuUkc2bGFhMXBFVjVtL3VJQXBSTjdSWG5UaklybW5BMnNIa1pwR2NHNnlzNlplV1h6NmQ4blRUZnRaaFFPYmFCWG1MVk1WcVprZ05ERmdEaTZYbFRZbTljVTJXWWpwelNTRkFTQnRxcXNTb2xpVVBLVWZiQUQxK3BpYldaNXlhWXppL2ZtV3NIUlhpY2ovOU5wMFp6ZmladEozMTExZWRnZkF0WDhXK21tdjI1MWRmRXdGQXRxRzh0ejJ5RHpMaUR0dmFiZXJXK0pxTmJoQ3h0U2dyTTZxNHNsVEpTNDF4YUNwQkdocHBEcnJpUVFXVjdOZ2RqNEY2aFNVam1vTFNCc3RaVGR2ZGZoQVluckJqVWl6bStnd1Z1OHpxaHNXYjN4L0YrNVhFVURVVFFYUUN4d2RIeHk1dmk2WUhuczI4VWlKaDBuN3hJV0MzNWwyc0dWUXFTTEhmMUNON2dDUUtrZUdnUjhhVFdxVy9CbGY1S0NBUWdUbXVMQ3hNelJqakxJc1I0UWczVmpvNithdlh0bXNDSm9aTU9rY2J6RjFLT0hHRDdaR3lrbGNXTXhzZWlEc1NtVXdDU1JieE0rT01WWWd4S2d3dlI1Wk5NQ1I0MU9RdUhzenVRMSthNyt1ZjNnTWVQM0dSR1hITTBHT2RiR2hmZjd6SWFSRUIrT3h2VGgwOThCczNmL0RBWTNwb0R5clFVdTZURUh5VWg1ZHRjaWMrT0NoUUZqZUYrUkR6NHR2cWREOUZ0T0NpQTJrZklIdmVrMlBMUmZ0QU84ZHhZdTRlMExpejdXQnl5K3dEeFg2Wkd1clphYnJ1ekd6V29PK21DK1pGa25Hc0tUdUx6TkhDSkM1SDhnVXpGczUzV3JCVk1nSzNJbE9CRkwvQkVRV205alRtY1I4VUVrMExKL1FFTURmZ1BIVFpDcXFXRi9vS2VldjRVUjRxR1ZVUzV6eEIwTmZ5clFkblQ4d2ZkRWFMdHBjajNKaDRGYS9HVDZZYzVadUFpMkRqdXdjK0liK25PSTd3Nk1hcU8rQ3ZLYTBqemFlZjREcVFvZVVJQWtka201dTVuUE83Wm13VHpBQTVWVWZ4b3VTMkdGQUlNQWhBMVMrZllZVklwUGNYaUZMRkNqbWdlT0V3QVVkRElIdzYwUGdwSk5EMk9GUkZid0lNRWF4aHBLV1c3Mlg3bG13OE9ZV09GdzJkWnNuMmROdjhKcCtmRkk0WmhtVDl3WmNaYTlnU3VBQlRydThodzVrMG1lQ2o3U3NlOWRLZ2dKUFJSZ1VzZVVWSGFrK3h4OE1RMUZHRGhNcWF1bG1uUExuQXREWUFDUzlPVzZKZXhlMUYrNHc5dkprejVVeCtxZ1c4NWpreHd6dzV3V0FXNW1IWnlmek9SYk5NekNPYzVqZFZwaFpzVXBzZStwR2dScHhtWjQrWjg5aTlwTzN4eGhnNVJoKy80YlVDakVwaDYwT1AxL0dXWnJXb3JpN2FaV3VRaStMWkp3WXAwYk5NZWZaaHd4NDk5aW42RkpjQUs0RG1BR1RJaUZXSnhEVHp3bEhmemZ6YXZRWWQ0eVlNeURTWVBDTE5tSkN6dUZGYnBvNUV1aWlRWkptUWxySXprRXhCR21LcDJMVGppa2lQc0tmUHZGMkpkRDR2MUUvczJlMjZzeGdDcnVDQjZNeVpMYnNJUDJUZDl1bk03cnNzdFAySDZGQmdVbE9CNjBDL3pZNHEzUXkwcHJuY0FTN0paTTgxMnlZZEpaTDQ0Z0lETnU0NjJZUmFUenk1SEtxN0xqeGpGT2NieGFYWnBCMHJiWmJVUFRPYi83cXhrZlRQT2daL2RLS1JnR3o3YmZJc29RMER4djN6OTgzTE40WW92b2FibU5aMm5qT0tIblo5c1JkVEdqSnF4SU9ZTWlkbkp3UlpEcGtUMjJwcGtkSVVOWEZTQmhYS0hHdUJoK2hsMytqNWJTcjJYTU83U0IzVkthWDJCanJPTW0xNHErUnNPR0JIc3dZRk5yK2tZTHpxQU0wM25qQjk5R2pxamthRHhNZk9hTnJXNkU5Vk1sQmlsVFZ4Y1dSaUFKZXYvUCtUNGE0TmJZcUVza2RzUzRhNHJWS0xLUUpOQkpRRmJTcmZqdEJtTW9FVUtTdmpmQWxBbFlUalMwUmgxTkhVdE1XSFc0Rm4zMFlVMEk0STlBUFU5cnd0dU4rYmVubFNjdGlFVFJZbTRnNGo3dDRBSkpHb2Nlb2tPUmdRTTh6MGZIOU5MTGFTUVJFOFdjQzRGZmthc0NiWmhYNms0c1NiR1hOTkxkSXZtUUhPQkdvR1Y0dGdOSzBzOTN4ZkF2cmk3ZW1NQWhhVWdjR0l5eWZmZVhTcGJIZzkvZDhtOTV1OC90K1R1Ny90KzdhNFR4L3NvL2U1TlB3enNwdktSck5UajF6cC9rL2Ivelgyb0UvLy8yU1dlK05xdmdtUmRVMGFLandSSXYxNnBFNUZVZW56YjNvNzVBamdIRU9rSUY5K0dYSTlmRU5ZS0g5Y1JrUHlxUTFHaFBYUytMTEdubVgyZUc1OWs1VFp1eXJGWE05RG1UN0tsNExtbVJ6WVlMaTVSMmZEa3NLSWJmQzVya3hnQURiNlIydVRmZW8xL0phSlA0WjJ0UWJ2NzVpYnVHOXZRYStvTStYYXVpS2FIWnM5MXJJeVFXK3JCbUlvZ3Y0WUV6aDMxOWZkdDZlZ3I4NjVkV1Y1NjRySitKU0srRzdpVStJZWJqL2VMeGZJOWhGWE92RXhjVmROQzk1U3h4MHA5SS9hVXoyYVZZeFh2YXE1YTlqaW03Mm1TY2JzQXoyTGEwT09icjB2Q1E5WUhkaEFwTGxYYS9XTXVvdytjLytxVnYwRHlxTXBYTEptZkVMWDhFYURidTF4ditFV3RKQnZvb1QwYStrVzJPbG00MlkzQWtSbURRWVg2UHJqWld2OTJwSmtVQk5pWDZnbzJkTGhlOFlqRVFPMXd5cWN2L1AyajJ1aTVIMlB5eXRPZDNKT0FNN3UxRTIyL0ZxbmZVUnJkdmIwNGk3b1g0TkRyeWZKTFJvdURJN2FtcnZWcTl3KzdhcDAxNGpGRnhxeE4vZXFWN3I4MmFtYWM3MTI1VUN3dVVkWDYraWxBaWxrdnNXdUdBaFZxbzJPK1ZPSytkV0NmUWNaN1NxQytPcTkvcnJNUElNenVNU2E3S0cyRmpOZ2lMY2szLytvNVZ0RE4xRnhEalJwc2l4TTNqWnd5d1NrQ3NJcnhCR2xtZXhLT3V5WFNxd1gxSXdXaktuVWFOU3J4djdtenFOdVRsVVVWWnEwM2NsYSt3L0xkQk82Vzg1c1VidElLSVlWS0w2SDdIaFdVck9yNENGcVpQRHhtKy9XaDVSUEhxWDRMUk55SWdqUEYwZVVsRElUdEhPZXFyYnVuL1ZUaWZVS3dXaWhtSXBBbzE0Ti9wL2dTcXpnN2x1ajByN1dLS042T0NQeGw0WExCMUJid0tFR3ZZd3F5elViTzduTnF2ckhtN3RvZnFCTTBkTG5kcXV2ZEVMQjhtQjVuMXpQV09qYTVKQXFTRVFyWGRDSDNQRGV3bjJoK3dvSmEvV1N3c1loSzlNaldzbDA2N290M0FGRHNsWG44N2RTaGlSbnZ2bWE2Qk92OG5RT21IVVFUUnd2WFc5L0Q2clFjUzAyWGozM0RiSS92eitmWElidVNwVnZWcXZIMVhmTnZYdXVtaGczVm15K3JRaHlqVjl5WG5SYTJiMmxMZGEvakg4YmJhVXQ3TjZhNFBpbFRaYzNtYmxqSmJveXpvdmNvdTh1ei91UElORHo4ODRST2o2d1cyMTB0eU8wb3JGVW9QWFhOUWJrOVpKWEdWa3JvRzZaTXk5WFVQTGEwejZyU2dxbGdYS2xiVkJicTQwcWNYOTMvdDBQY1p2c2tWSmx0TTFPeWJodktreXRLT1lNL3VWMHNWZ1RVZUlCRldGZzJ1VU8wRGZ6RjliV0JYdGpEanZTSUhsVjI4MmtuQmxML2IvOU5qcTR3TStNQmd0bkVSZUQ1bHpXWURTMkdxMHYvMENibTZSYTEzd0g1QS9ya3R5ZkxlM1kyczhxOXJ4Yi9LdXJHSWptSEhwUS9zYTlGKzNHMWpSbE5tWW9RdzVYMDhYMmZ2clRQbUtTWkR4ZGpNdlVwTEpIcERrZEJiY3h3UlQ2QnhHQ0JzUXgxS3J0U1Rtc2VBQ1pCeDJ3a1YzamZMVFkwSUo2Z2tpN0tlUWNYdWdMK3ViUWo1WFBidERvekJtem9jdFJhK3pOMmt5UXV3WWJLWDNuY29PMFdsa1FzSS9PQ1hyY2ZiN1BHSEpmeWY0VFB2OE9WaTJ0c0p5Yll6Y2JNcmdyQk9YR0pQdS9PaG1CRUpVZmpnbmlHQzZKN3dnQ3VHQzh4eVZSRk5rVW5kNUFWcUgzTEhBeTgxd2swdVJ5SldHZGI4ajcySUMwbGM3TmIyc2dmTTI2ZVVPMllmYncrMW1LU21YMEpsUFdaR3cxVVliNkRHa3laU2xEZXNOdDFiVVhsMFo1bzZFZmU1MEFXbXhzUWQxQnBNTVlkQTR2OVB1RFF3SFhpSDk2Q2I1c01lZlNCb01oWjhTYU0vcS85QzZiTEM1TkdZMHBLZ2haTy8zMnFUMFZVQVlxSFdER3FWYUpoOFRWSDk3TjBSbmlrYXBkeWwybkJKSVpWQnFqdzFDcmpnTGE2V0F6Wm5CM2VZRWhvc3JMNUFZSVoyYTJjeHJuYkwvV1JpVVJmZGkwNE14czI2VHNHMU9sWXYvUEg0Y0FoVG9nSittYXVFSWxpZTBJQXJKTEpORG1iSE1vRTBxci82aUxuQ1NqMTRkOE5INXFhVlc5UVJBdElvdTB5N05rdHV4RVhPTFVHYzZrMjJEOS9UYzJzL2pmblJBaEpJU2hqQXUrNlcyMTREMVFNZkVCZThuZ0krUWtlY09tTkgvNytTbWRNUEdkYmlFMHlhdGd2N052R3I4S0JiQ3lJQWwwMmxvY2RFZTYydXZjYTd1czJkY3V5Zks1eUNMMXN2SmVkNjJ6THJ3UzhuUjduZGloMlJXTkJ2aFN0N29wVzRzM0tHdjlKNEk0bjhmU0tDUHVYcU5BZWFOUlVDUXZObWFWVEJCdU54amhObmN3aXhvTUdkUnpybTh6R3VEMnpTbnpaMFlidWpKV2t5bHJNL1RZZDlZZEVveW1qTjNZYmIzclZyYndYQnpwb1BXSnZCM1VlYzg3MTUrNXNiWENLWk5wa0NLNDJEZmtjNDJFd3E3UlJYNmZQbzI1b3VmNWlkR1dldDg4cDJ0a1dxS3doRmdKV0hNdFJyTTVaNXkxLzY3VDNDUlI2MXN4WDR6VXU2TXBGRGRucklidVdnZlZ6YW5mMkZ0Sktjc24vNnJNclNuS2FFemEwK2MrSENwbStyei9lY2dUUk4rLy9iVldZd3AzaGFHYzNtOWRNanRRaHhOKzJDR0lvU3BKZkhzUXdnWGp2YVJsUDN0SENBSzArZE84MnBoUUdqZVljOVo5dU80dW5hdzBVK3V3cE5TT3FMUk5iZFgwTkR1c21BOE9WVDBua0RWOUpWQUY0QUZSbk04dE5qVGh0U0ZaVG05QTJsMkJOS2EzNXFuMkV5ZElUMkowTG83N29UblFremFkLzJzeEVVU0sveHBBcmJydWxCMWdKajM1ZlZHVzIwTVdhVlk5V3VSbTNWSXhyZWJmNHRwKzVaS094NXNoUFZObkpJRXVQOGNXOFlzY1NoM3BhcEpTOXJSODhQRE9MTEVHT2pjWEViKzVhLytsWnNsL2hHOU9ndnVidkNkL2NYMmRUaFZLS0EyVjZncjVKeHdJOFp4QUNGb3A5V3V1YXZOdDJsUXphYUxxRkdxdkdoVFNna3VSOG9iK3NCWU9lL1Zkb3U5RkZNOTU2cmhROE1PWWVGTkFHWGlHZkdaVU9icE1tT1ZMdmlUNS9tTTRDYmZUclM0OGp0aTlmL25KQ2RjeDZTMnpOUG5KL0x4SHROanJxYXRmS0RLUzVNMXZaMUN2ZmY3NjUyU0lWcCtlUWJvQXZxQU1HVjZQcjUzNGRQYU5wczlVM2ljOVR4S1Z0bis4U0FNekh0bFl2dnpocnkzdkY3NVhZSG5vcTJYTEh2N0svRzdCZTRVMWc0Zi9XVlcvUmlIeEM3MC96NkNPZnY3YTV6cmgvcHovSkwxSzh3YXJhT2J0MWxmNjVBOUNjMStaSTMrVTd3R21WWVRKb2g2U2tqMWcxNWNjMlM1NWQ4L0x3dUxZUE9BZUVJQUlCTTRnTDdvV3EyTC95VGNPclBMZTVZTFU4TTdPN3RzK2ZCc21Wdko5Y05WVUVYbnE2Q25TZ0RzckVQV1JSc0RaTUpzbisrYUZXNktZaHJHVTUyb1M1UmdhNXZtVkZRdVZDOHNoZVlWWkZqQVoxRnZqOVFuSEg5TFhlS3krOWljVEV5eTZpNVd6ZWh1aCsrcTcxeHg3RmxIdFhNU0VKNlpoaGVTUTVENXovVVVWaTVTTFhJbGR1T3kreEVmTUM1RDBzUXpwcmlYVTlSYW4vVE9KcWtFdFdIZTJ6S055ZWlKKzVvN2kwVlZZMjZ6cFh3Q2x4Y2ZTWkQ5Qzc1MS9wY3lZTXZDMTR6TEpWZXhVUmgvWDRuVnFVcFVJWExkcnNBdXBWdFZ0ZnV3WnI5Z0xNUElpUk1zVmpxOWdhSnpHclZKQ1NjZW13WWpmUHhBQm5sVHFRRlFkakk1SE5vZTFDNU8wMVpLaWdZV0JMWUJkTE5Zay9aZGV4Um9WNFNCMmZMdzFjMFhDSXZtenEwcXJ5RktCU2ppVGtmb1ladlRvN3dzckFNSFpmelJBNTlZakJaVzZQMTArdnNwZWorRWVCWnJaOHVlZDA4NTZ5c0M1QkRmdysxY3VFb3BvcmFaVWw5WVZHbkxzalJCWkV4UE5KZ0tCMXNabUhsNlRhQXpZOEcxZUdXRk5HNktDYytQMUlvMHRxOUxIS1lYVWZady9mOFdSTk43M0JmaDVra2dlcWY4WldTMll2a3MzRWo3cGZxaTcxbTVvSk1nR0k2Vk4xT0Y2TW8yL3I0bHVibEFUUnQ2cEJrQk45NW50WFl6SDJUL1B6TVYrWWVpNTg1eHVUVDFZUy84MlY3ZW5OVlpyYTNWUzZPR0JnQyt5c0lWK1kzZUtYcjNBRS9BTzBzNzVsOVlZMHBTTEdxbFVCa2lvRFIveFZEcXQ1Ny9BM2FrKzFUZHVMdUc5YVdmU0F4cVhiNDdSbGpXcThZQ2JEQW0zWUJBR082K0hPUXA1bUhNZHBqRVl1MU40RDZOWEJQZ0l0b2xoQStvbWhjbW5SZEJSTndzZ211VW1mKzh5RkkySUVIbFliRzFaTVF6QjBMRGtOd0hrRTdUVzRmenUzQzB4aHpWM2IybDYxWkFuNkJtU0tlRmFLU01JR0tsa2VBOXg2NHE5K1hOZHZuNW9tWTJXcnd6MTlkY3kvdG1NZnc2MDNPS1Vyd2oxenE1VjkzQWs4NnlaUnFQRmxyUlljcUk1cFBHOGp6M1RiRFRWV0MydHYrOHFGcXNJSTdHaFp5cysrVDFMWFRQM3k0L3p5TGNhYlQ3TjdkQUUzZFR0aWJqTW96eWtWb0tlQUdZMnhxRzZzMktJZTdSSmFnM2tUT29NWmNEOGJuVkVKcVlGNFZySGE2TDdpVEpwa2JNWGMwVHFPR3pLblZHYURVMkkxb1dwelV3ZjVBTlZZTStnbXlFMDdnUk1NaDBXSXNaeVVVbWhodW5YV1pNbTVmKy9IYnZzMDhtREtyT3JjYTVhc0c1aURqN2FKYlk0MFhuT3NFWmNVcXdiRHYvbGZyRGJVZFdweVhxSGF0Y3hiWFRUVGdiZUo3OGVYRjVuM3p5TFpQRnZyT0RnbmhPQnAvdkhUYVdMV2hINlRkbjgzZlI3c3RFeS9YNXY3c3JRSzFYWHZGMk5hWVBSTnFScURCaTQwZi9uNnhRbCtMNVE3WVorNDNwa0VOOVR6QUNZbW9HdWNUeFNpT2N0WW9BM0poQlp5S1hWd2p1Y3ZCbzVHSFJxMWNpS09ML3N1Z1Q0Q0dobStndzdLOEVLeHp2U3ZQNHhCOVlKbVdVN0p5OCtJcFU2REVBMS82NFJQYzBJTlQ2M1N5TVpHd1B2MzhlUHM2NEM3RmNMYXh1MHFjNnE2dDBRNlZFQ2NFTEpjS1ZjMmd1Q0lJMnFsWjkrdS9uWjF3Y2xHQ05va3dESHhyNGVScVNIdlh6dTFPeWZwSC8vejc5aEJzeXpUMjk5YlZVNGRobDFpWWNSNUVtdkJOTkVsTkkxQWxvcTF6RVVKbEY2Uk5MTjB3RDg4TGZ2N3AwK0NiNE9iSmVxMlhOV3cxdTlvQW9OSXAvbUpYd3BLL3ptaDkzNVBnUVBaUmFOUk5KTlBwVWZ2T2ZlT05sZGhGQW8yZ3FBVzhWQ1FkbFdGMjczRFpENmFaTnlWbTZPN0ZsZkRhcnlpcnZFOG1mUTN5NUxwSGZSSEFDNGVKZEU4dXZNclRYYUdxWkRKT3JVODJzYUZ3akVYZkRwanpnbFU0Zy9kUU00SjZhMDRqei8xVUxjaitUZi9ORlRpTldYeXV2OUhVQXczQXZlQlNNSC9DRHV5elNIUjlNTGZRK0JXOHNFUXRFMkVGZ21GQXFKcGRYZmgvU3k4M1dPZXllNUxGaUhnS0VwSjNobC83V0JiNEYxcmw1T1d3WElQaktaQngxeG9YQzE4OXdkdngvaXp1RmRYanFDUEkxUFZGOENPSzk2ajRkTWRqa0JkS3JpdFNIVTduZ0ozZC8zZjd6L0oxazhFelQzenhTTkJhcGgrYjZ5MVRXMHJGcU1Lb2RjKzFTMUZIMHlMcURDQXZEcHZMZy9iVUVxdGZGZnA2cHhwdGxMK0tDRFRzQjExeDJKbDRvNEwxeXZLY205VXVNVllNY3Y2WlFja3U5V091dU9za3VyYis0Y1BwVlBudC8xNFpzYlNDZE9CZVVZNWdPM0FVZTYwU0x2dytCU3NhcGF5cmVFSjBwc1pmLzNXaE9mRkh6bzdvTit6enp2LzNsOGpNVnByc3k4d0VsV1pTcU82SVJNZHVYa1Q0OUlwV29LcUM2K3EwR3ZjUWsxSHNhbGtUd3hkc043NnZoSHJJdkFQMllSWFpMaU5MOHJIc1hmTEpsUzNNV3d0ekhjdkRjZzMrZm1ibTlUOXY1YkgzOWMzRGorekxqbDJmRVMxNlZ1dkx1b29KRFgwOFBqOUN6bWNXL3U1ZkI2dTR0Y2h4dXhSdlJ6eXhWdDhiSm9WYk91bVJVdFl4cnh4bkRNdzJFenZOeDM1M1RueU85NmREM3NXLzhsKzV6V2JKM3NLVjM4MlhMeXl3M0tXM1JmNFBvdlBrMjNNcVJjb3Z0eXZYeW41aU5jKzlHbmk4REN5V3NDOWlrakhOVGVTek1mZkZOZjdjd2NDdkVlZk5aTGU4Z2xobUZHNFBpYjRqdE5DUkVLdWJuekpWNDF1bW1ELzhGTVd6K0Z2dEdCZDNDMHB2SmQwNGN6UlRXYSs1aHhFWmRBOHhmRmM1cmpJdXhkQSt4NHo3TGN5OC8yQ0E2cERnR0g4RVBsbnByRHFzT3p2SWNiOFVaRlhxNW1OMXdkNVNMam40K2JQeHN2Y2FxSU5VUlJvL3pXMlRhOXBYamR2OWYzRmt1TldLem96d3FncXJ4U1VYYW1lUWFYcFN5TVlXVzZsN0JZb1pMRm5lSDdyMHdobTZvQ0ttN01pR0ZHYWZINmYyN3NLV2FYcGVVbDNSajFBb1dWTkdPR0Z3eFlkMGxKUUxJbi9ycXh0VE9tU3NKZDNCNTFoQm16cFJvUDJWYklWaFI5bXJSTFY5aFgzTnRvVFRGakVUV25CK25DazdsT1UydnM5U0xYWmVJaWtUcWZhSmFldndKRnhibERxdmQzdnI5RGRXNy8rNkpGQVByL3YwN3IyUTZqUWZUUWU2THpXUFBCamcrdWQvNFFoSHdkTnZVZmRLUHN0bXhadGlxcnk3S3lnYThZeHlzb2JWOUdxdHRqNEN0Z3RiT0d2aXZycU03b002eU9zbHQ1WlpoL2tzcXFod2ZBQnJVOUpFdHIzS2JGZlJGUDRjMlNtNFA1N2ZTdXFXVlI3Ti9YUlM1dWNHbnByeDVUdlFDZS84VW9SZVRxSE1qTEQ4WXIvdWFHNUhzbnV4NlJBWTkyZWJ4UGVMM1R6UktKV2U3M0R2czlIWThDd080T3Izdlk2Mm1ucGVicGJzOGRtczhVc1hFWW5vQ2NjZ1ZFajhQUVY1Q3JCS3JVTElJS2x1NDZlMmNCeUlPVzZ5WmJDclpoL1Q5MVE3NjZRZFRxY0pXYk9pbzZYMEorMUY5ZDNJR29PM1FrQjFVaElyTE50SlQxL2RmLzZ0ZDlQL245MDYrWEZja3BCd1BtT29UTzZIVStYR2NJakh3T3lMUkRIcVduRUMwdyt1ZkoxSktnZ3BFd2NqVVJqdUVhZmRiMHlmOUxJbG9VWE1DRHdMOFZMbkZZQzhUVTdxVlYraXJScnkveFdTK05MZDAxUnlCQ1VUR3Y5MmI1WFYxSlpQNS9OVHZnSFVkMVI3ZkQyNFdmRGlDcE0yM20xM054Sm1LeDl1a3JybGhGN3pDNlpydDgrMXJmdGUyNFZlNGk5SGEwYU5VSit4WExCL1dmWmZFcnlwY3RYN0hpSHo5bDVOTG1CSjdBVEhFOGZ2SXdkanZHZDMrQ1lBamFUa2tsMy96M3dCVmo4dk1tenZEQVZiYXNBZ0tHMU9mQWpJbUoyV0VQWnNGTTJJWmI1TGRzU0wrN0JNejV3cnZONlJxeFNGVEQvK1c3QWlEL1R2T0lXSnI5azh0NTVYaCsxYVgyVTZxbmx4TXpHMmFRY0x2ekdYYWZ0MG9PY0ZXdkVWMlpxUXJCdERVTzRETEt2RDhmSmlVdlArZnRoQWZraWdHUWlsTkFqdEJVWXFYNC82ZUZrcyt1QzBYSHpxZEtXMDd5TmtKVHpudTIrL1JHNkRIZ2VsYWJtM3o5YlVkNVh6cTQydGpaWTlwU1h4a3NkLzdtbHN0bUh2RytPNlhVZTJJQk16bFN6OFZ4VDhVRmtoMmVReUorM3RmL0cySkNsZUhzYnpQOTBCYlJuQ2F1OUFtdWM2WlBHQ1JYcEhQRGxOYzlTbVl6MVBLUW4xeWViaDJodk1wUXRmYkl3cnBxTkxURzFObGwyaHh2c0czcWFWOUxiYXc1K2RiR2F2UXBOMXNIT3l1MndKTGY1VksrVU9ucEhUMm9veHY0cU1vZFZXZ0pIN0JOZ1pIZU92dGZkL3N0S0lOcmNuVlN6TnhDdXBQUWtBUDM0eXNUblFObXQ3VmJaYSszVU5wWWdqNVpIakJza0tLMFFRdHR6eGRYWHB4OGRjT0RydEp2QjNZdFgzOUc2ZjFUWlkvYlZmWkUvb2lKN3NVRExsdDl0L0taRGMxNXIvZGtldU1iNHVDdVY0OVpFUXlrbjJSWU10bTlSUU4vbDNXR0FCWGtGTDZJb0hmOG42ZHZBa2hHTHloN2JlZ3ZoYzRVU0NvSWNQbmVxYWVYWHZnZ3dBZWR3dDJ3STY0NURYbksxMjFIaFlCeWpWSzA2Tks0LzQ4YUx2b1hVeTJ0NFNwZS9rVjJ6L1RZV3FxajNiQTJHakdzN1dqYm83SFlPbXJXb0NVU1BiTjJ1Q1ZSc1crRVNEWHJSdngrY2lTWkd0WDRmYjVSS3FVZDlubnRWQnArOUl4MFluRUpiVVVhS1dWTkhjWFVLOHkxblpSN2lvOURMUHlmUFN5WFRDVngxNzRucWxsNDlva2IzYXdJTEtodVBhTFdQWFhOdXp1OTJ1SEVPYUo0K2VqNXZhK05xRjVEeG1RMEtIdHl4am5qMDZwNUI5YTk0ZjNhcDZvL01WVWF2ZjB6V1BKQTdoSjhLWWVjNWVXVEF2aE02a1ZKOHNVemlJRE12S1hVYjVCK0pKVzV0OUpSbWZRb1RoK3RabjE0b29wMXRMR3RlR1o3VTlPMG1jNWx5ZFdiQXpZWGJkeDJwK3BPL0M4elNRVkdqTy9CM3RsRDdPODgzRmsyTnFWV0hwcHBXcG5FazFuL21wWm9WNmFKZEpIbU83TzlRVkpTdjBodGE3Q1U0SnR5Y2JndC9tbERyZjRVWjhFUGdLVWcvQ2NJL2dHREpmV043RWtlK3dTYjlUdVhOMWttM0NCZUM3STVudDRDb0RBbG1pNFExRE44UVhkdkFWZzQyMDd4OWZmQklyaW8vcnMvSzF4YVY2UnM5eHM3WHprb1NDM2pReW1Cb0FuYzBmTUdwQmhocHJQZXR2eDlycmRYc3ptZTRRS2dzSjhZUHIwYWFidW5xZ0F4TVFUUUR2K05QY3d4ajJPeU02ZHUvM2ZubWovR3YxMWtQUUlCZk5CY0N3S1R3M1VnUzV3RnJBQWRSeFZ3UmdXOHFRSXVoMXRIS2xPa3I5cll5MThmYW93aVcyc2c2N1lHTDFqSlpNSlV3b2NxNFR1VnlCMi83UUtLN1hRYm9QR3dCcUxXUUQ3V1FMN1hRSDZ6WVEwSUkzN282KzJnYUFINzEyM2QzN2MvUERkY0swSUFoL3ViRVhLM0NXd0hwMkV5UE95Ykg5clltZjBCMlBzaEFQTXNTSFptY2V2NEZzZnV4ZjM5eGYyelYvLzdENHNYa2JnWmh0bDhxd1lPcUlFSDFHQ2YrOEVmTDlOcU01K0d6VmYybjIvK01FZTBtVWV0WmNCZS9TSG9ja1ljY0o3NEJyeDZkUmdBb0QwNEIwNzBxY2hvellMa1dvYjY1YTV2OG1lV0ptb21BR3B3bVBJZlFCZ1c1TzhXYWpBSHZvMWR2L3lpNDhiN2Jmd1RQWjNzeEFHdi9hZW9ZUUFndmw5S0V3RHM2UjY0MGZ2MXdiSHhTOUgrVDk4OXJTck5icTNuTkwxZkhsd0ErRVJET0lBZmgxemt3UlZIV2d1UFRtRWZXSy8vM1h0TjcwY2V6cVhiUkgvL3M2RDNiMytRc3p6c2xOSms3N2Q5R3hsc1RDSHB4ekk4dSsvVDc3ODRRdFc4c29IM1ErakpCSENSOGtyNFJ5QStmNnVETXo0TWNqWVA5N1NodjlIQ25wOEtmM2lHVWd2YmcvZER1TkR4U2FJQUtNVC8yMWNaOEtEOERMM3h1VGhGY1cyaTRwOVY3aFhMVzBCVkgxeUhsNHQ3UEwyL2xRdW91emhYNzRyd2h2MGFrYktucDg5N1BOTzdGSHpqb2l1V2xGTmVzK1Avc0JiUC8yS25IZHo4dW12clBaU3hGYkxpd1Z4eURVb3hwUmszbCsvOHpNZVBoNVIxR0FjQTdzclYrNC9wQW1KWDI1VnNpNGd2QXdxeFdEVGFFRkp1eURRMkVjbldYcWxLb3BLcHVhblJBRFRBaFpPMDdYWmJLamtibG5XcDdSM1lhQU5UUGI0cEdUZHp1VU9xZFkxV2llOG1EM2pvY1QwNlV5d1FBVWxBMjBZQm9LSmxYUkFKRE1sTmtNWjd5U290WkVRalFJL0VVY2xXbGRXT1hWUm1DbGVPZ3JZV1ZJMUJMN21iKzcyZTBkTnJzTDBDNGRaczNvRUtoYXh1TnNuQkViRnhNa1NFUisrWmpMWkhZaEpWVjNteG95VlJhVVQwcWpvdnJlZ2NWZFJzWGprbWFGRnRFZUpsamVRRlZRcG1VMDRRY2JDSGpBejFpVUlhd3ZsT1hrTzZMUjZrWGVvbVhNb2paUk5WM2ZxcXgzN0hoN2ZVZWdEVkMxK1pxRXdscTY2M3pjeTkzcTU3NCtxdUFyMHR0QlVxZitKdGpGaXBjMEJhK3lsNWE4Y203WXpOcktOQStJUUZPM3BmMWZyVmJlMURTcGhOV1J0b0hlSk5oZnNYUmVleHF2c0ZxU2ZVNzU2RTFpeXJzbkJaV3hwWWFHWW1JUkt2V1M3ejdPZy83aTRnZG00SkRhUmNtaGpySzFNNk4vUmFjbU9KaEdobDlZMDRIS3hralovY0d2S0NuQXJ0ZHV3SWRLMUlSaWhXdHN2b2I1SFlXVmFoQ0w1N2laWlM5U1VxK0RUSDg5MXVBSWp5bFZlbk5hMXRTaUdiSFNuMnpYbG5wOHVxZDducW1QbW5Dd1hteDIxWDh1UEh4emdmRUl0RXk1OXR0OSt1djdMWGRsUG95NWw2NzFsNE1BSjFvNVdvS0lGMkYrNlhaMVR0NjJMTjVndXhXV1dsRXRNa3hQZmR2TnhGcllnUjEyMVJsMnZhc29EOGVnNjNzRjR0UTdsUWVHeGJQZUxNQ1RpcXIxd0RMK3ZTSmZWMis2TVhmVzljRU1QSzBMLzg3a0VpOFkycmI5VkR0K1A5R3lMdjVjQldKMW91N2NLZEV4V2VyOGpQNHd2RFNzK3o2QnVQYUdLT0wvQ21saVNhNGJ5aUx1ZyttUkJSUmZCQU43R1NaMDJDNFhIOGVwZFdyL0NCOGdiVVpVcGVTczV4TlFESU9ZVkExRW1JZWlLWFdLWlJBMVZHVENUeG9tT29nT2pRRGNmWCt6MXJsT3loblV3dEVQWmlRRFNsU1EwWEhPVjVzaTllNlozcTY5Qm50QzIrNnZQb1B2Qys0KzBWYlR0NC8xLzh3WEl4RzQ2bUU0d24wSGkzL1hBUXBpTGdBRlpnMExqNUtIKzFYQnJIUW5waFRaMHYrM09qSXArNmIwZ3M2dW9TRTdxVndqdTN0ZWg5SjlCT1hjL0N3RHkvL2FVbUZxbEZMTW1INWxVMVI5aFJVdzRTYUkzMHFGSFdBbm1tU2xxbythdHVHNFhzc1MxNXpmMVNzeWw1YlozYjRwRlg4N2F5QWNkbWNaK3pvZWh6em9YRWRhUVNaa29vTHZtVjRMbXp1eDZ2RXdXN1JWQ0V0V3QzZEFVSzNmRmlaMWFkaTZWT1FYY2g2bXpHenoyaHpqZk1LUXFUamlqMnUyYXBqaVRQcmFSR0o3N2FOalRwY2Q2Z1BKQldBUDlYdGFwY1dQOXgrakw4amRQUHphL3dxaU51ZkRBdzYzYlhLa2xybXNBZStRVThKZnlmQTJ2cUYrUlAzWW4xM2VoaDUrdTVIcmJNUklZdzlQTHRvWDh3T1lHMWtYZUM0ZWE5WjAyTTNhTWF1bno5Y255YXZYcjdMRVFQSHErcXBoaUpIeTBKZ0pnQXlzem9tejNUbGxZQkNkYkl2Uk9jVWVMZ05aTHRMT3BGcHJYMDRXS09nVjVBbGl3OWV4MmJNMndmblkrbk52TVYvaXZ1L2hPenhGSFZibEpEV2FOSjZTUmx1Vkc5c1ZxMHhyVkVYVGZVS0J1TXE2Z1BRWGRVczFJeVZ0U3dKV3h2aGQraW5YUTlJQzVLaHhITE10NGZuSm9zdXRZTXRxWEFMQnZuUUZRQm1IT1dkbFZyK0RUUHhsSWdkMkdNcThsaFA0OFJEWE91RVFNWmk4OStZaWNTa3RnSklMbm1MaDRPaDBPMGVNcXpkbzlieW9md21PMzd1aFBySklkY0w3MnNFNXg4enFpb1ZZbWt4VkZGYTUvYmxhbzNBS2doL2tFT0FtUHV4NWJETk9RcTFiSUt3VW1KaGlZSEMzQ2NtWkx2a1dGVmtRNVplam5FOWNCL3NDSWk0bFUwa1k2ZXRSVU5hWHVvUUx5dEowTm95Mm9NQ2dyTGlKQ2RRUjNEQk9mK3l4VUNqdkxmUUZiRWVhL1RsNzJTdU5PdXBsVCtuQnRhV2dybHl6TmNST3hzYlgvVEZkSnkvMmd4UGEzb1UyR3BZYkNoTDJ2NUgyYXlJTldOUUwvem1LellxVUNzclYyYXNyZVhSTDcvY2w0YVQ2N1NNVEF4RWZKTHdoT2hOaFhPSnUvcDB3Ti92Q1ZNcUN6eE9qZk41ZUxSTE9DS0ljK01yMXhlNmZBd2JGc1c0TDRjMjdtK2F0b0FkQVRicGwvTjNSSmdiQjBuZk0yNkxmdUtrUFJzRFNFQTBWTVRqZERYWTdKNGY3OCtZRi9QNCtzaFYraGNsWlRHZnlQVG05MHVWS1BSY0JodXRLNUNLV1llOXBnYThjdUNxUmpoY01vNXhOaDRRY1k2SlIzYWs1WTQxbTVTUkI0V0ZGVXRzaXFBVWpVU01CWjY3UGNNSWRCTWEyaWNGSjdVN2oxV3NmMU9heUdjcXpFekMzaUFXVWE1Q2pXYWMzaXYwN0NTSlJJbUdGUGJpZDNPcjVXQ3dMZjIrNEoyTHNiVTJVRmhWU3dUckZxRHpJYzRDbUJOakpEV2xWYlRhRFFhNG1Za1hwZHNreUozZFRVZVQxeEd0bFRJSnVGTU9HbmhPbEhLa2hORUdoSno5QmwrakFsRE1Db0RRbXFaekJXeVVWU0lQSFZjNjJRRFpnOVBITndGWlRERWtJa2xtZ1FpWUxCUWtENEhZOVZvckt0YUFvU0xLQUZwTmNaVVNobXdJTzJzbFJXVE5qV21WbEI4ZjRSUnZ1RmV4d29xUTFaa0JhdmpodUppM2dvZHlmREpLd0x6QUZEdm9oYVdoRFJpSjkyalRvd245MzZ0dXdUaTNKbFlsTXR3T0N5dDE1dkYxYUJsQW1aQTgyb3RPZElHQ3gwV1FKb094Ni8zWTFuWm9mZm5sRGxvM2IvSDlyMFNJRExtd1lPdUpjOWRhZjJ0V1JLQUxhM0RWOXBCR0x0bWJ2YTNwQzRhSjYwUjZYcWJHYTdSKy9lVC9kNVFxbitvOG9kWTlXQytwdXlWMDFoaUNId2NvMjRVcFZGMUhSMFNtdjE0SWNxVXNOQmpwWXJhWG9wQkY1SmFoNmNxT2svSmFGWG1wOGxrMEphTWdoQ2tGQnZRRFB6ckZwUXVBT0lzYVkydjkyWXdwMTBnTkZFcGNyZGg3dGFlTUxSdFRNa3hHeVV4U1ZWZ0ZTbVhaYU5Qc3hzWStJWnA4SkdreHBPYkFGOU5kMGFXMFBQd25ycjhIakNiQkN0N3BjcmROeStIMjhtNlErcFhqNDgrVU1IS0MyRk5qMlEzZWYrM2FScUh1UkQrbWIvNVNlZnc5NE1hTUxDZkdWWlpDU2Y2UzQrSmUvUGhCK1NtSzFKZk9EVTZFMVpVcTVNdDZ2V2M5emFPVTlWbGtndnE1SXpoZVhxTGhZM3A5ZE1QNzVvLy9jWGhMR2VmSGV6YUs4OHpKVjFmOC81NWk2cjY5ZVFmWlhEMzFsNzRwT2JqZXJQWmZSazNjNGZ4L0xVeGVZZ3RiTTd1dy8xcW9lOXpiWW5wK1R5TUI3ZFcwOS9CZHl6S2JxdGVLSGtzR2x5UVVGYkt4ZDdOTmR4ZEVrWkFBQkE4aWxNUEd6dlJTZ0dCRUR6WU1Ybm5VRnpSVEhVU2dOWjdWVVQ2a2VBZTI1cHFmOVFYMWY4NHNXRGlJOVBIRWJVNFpXdExZTFBFVDZWMFFObTllbDlpMExROUhlOTRRdkNsdW5JRUdpUmNSbXBQbVpRcERRbm1GNmtoQUFQeHZ4OS8zMy8vOThMSC8xdFNOS0lmQU1CYSt3OFo1QUY4UEcvOXM2SW4rZTVzRGdHZ1lBQUFFTUMvSDhnanQ2dnIvMGE5VTc3WFgwQm9LQlZDZW83ZzNZU050NnZWUTZXZDRuL3dsZXE5UWxaTlptMUl6eS8yeXVjTC9Bb0lSeTREcGZ1TVEzMndKTXJQNkNMUFVEZmg2dWVCbGxyaFJmQWI4SU41VzVlU1ZjYXBPK3JhUGkreGJ6cmZYYXpvN09kOC83TFkxUTZnLzU2bDBwZVpCQXFvL3I0dDRGOHkzK2hpQ0dlNG5rQWowK1hXVWdrdS9teWNmVjJ2eEUwWkR2cTdUK2FVdGhPVXpWZjlPSkFWV0FtQXJ5NXZ3RDRuelNPZmVZMmRwVXR0MithQWZaNnFkME5sTHNjNCs0azRKV0Z2ZjlRVHF2dEdMZVJqWmhPQzl4WjUxY0wzc0lEOVE1VWpaZHV4MndXcWtLcHRGR1VJTFpsSEx3clpJVDdGVUpjaXBCRDhmS0U5dSs4LzRpMFg4dHZidk9ZRTNCQ1BqYkhsSGp0bUl0a3h2aXNpMm9FdWZKeTBJUVlOekQyNm84K0swYkZzbDR2WS91SUpRSFlvZU44K1dRUTZkd0pQUzFpSndrK3oyRlMycHllNnJjMHRiVDNCODFMZmgyUzdoaGZVbXJGeUxxMEVvbWlJYjUzK1lLVmU3NUxNZEF3RGtKc0NjLzBTQ3NUc3hVK1lXbS9LZXVmSytXamNzRjdaWkZ6YmhURWozcG41eXhVdEQ1VldEc3N1ZUN0aWMvQzJNZGZJNTd6STlyMlFIdU5TZkwyOEp5bHo1ZGs3RW5JUlAwdnRYd3h2TzJEck12YXJ4R0pFcTVYWExMK0xGOVJ4d2VsSWRoTngwYlRIdEpvUlBSS1VUaW55bFpJRTRFOVhuYVVUUURnb3hCMk1BcEFuU2tOSzVKN3U0U3ZCdG5PL3NtZS8zdDAwQXViSi9NSGZSK2s4WkVjRnlnTUFCTkNRZnJRMkZJd0R0VHNCK2g4Y2c4TUJDSXpEb1NZSEFKYkJ0d2JFM1hzYzY5Mi9OT0RVcmpZbEdrZzdGOUpBa1U3WElLQllXNE1EM3A3ZHo5SE1NcnNDQXJBcjcwSStmb2FjM1ZlUThMWDVSSUoyUmozTUd0VnJZQ1ZHMHRBNktOV3dvZHJlT3BWYS9ualhVNnlIV0p4WnV5Yko2dTZnVTRkNHcxN2F6RUpNb1Y4cjR3RCt5a3Jrb0VaOTFGWnE1SEx4OWlYb0F3OCtIREFJTTJwcVdYRHd6b2ZYUE53YnNnMmZSKzlrNnlLRmdMc0hKa1g4UXBmbWpWY2RZbUZTZ054ZXIyT1pZZ29FRFpLQjlYMW1zbVJLRW5scklEUU5RUGxBVURZdWxTZkdXTWN4ZUllZmVxTUk2dkJDMWF4dzQ5NXZJYmZ3QldId3hWVXZVSXlXanRUd1cxVGcrY1pURGIxOWphcnArZlZWRWdwNWZYN3M0MEs4TmpucXJqbjB0WTIxRmRNYjdZb3BpVTF4VldLVlB5YXh5S2NrNWxSTmlHMkViUnZnVWlrb1RnOTFTWFNnYkJKY2JTMHdhNlFCcGlScW1VMUlwYW9rS2k1V01aR05pcnBHU3VHVVJDWlFwVFdxaEsrS2VhcUlxd281OFFLYVA1WGgwZEZXa2FseGNGdlkvUFczUXJyNnc5ZGMxM2FsSm0yN3JpdnQybHdWaFY1RklscGtwYW9CRVZaNVlWYXhFRlhhQk5hL3RwamZ4ZFplenV0dytEYytJUC9KLzR5eTROemdyZ2JJd1gwRUdiVkNaYVd3bHJTU2NqNk8vRTArSUJGaDBkMGkrNDV2MzdkbU5aWEs5VFh3R3Y4TWZQYmV0Q3g2WEwrQXBDbERXL0hqTmlLKzd2cnExU3M0MjEyOGJiRy9NdmlNYzVHbzVKYzNLbWRkWjI4bzdFVTdWckNHQlBaNE50TDg5L3RsWEYwYklZbU5Jd0JCQVE9PSkgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO3VuaWNvZGUtcmFuZ2U6dSswMD8/LHUrMDEzMSx1KzAxNTItMDE1Myx1KzAyYmItMDJiYyx1KzAyYzYsdSswMmRhLHUrMDJkYyx1KzIwMDAtMjA2Zix1KzIwNzQsdSsyMGFjLHUrMjEyMix1KzIxOTEsdSsyMTkzLHUrMjIxMix1KzIyMTUsdStmZWZmLHUrZmZmZH1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpzd2FwO2ZvbnQtZmFtaWx5OlF1aWNrc2FuZDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREkwQUJBQUFBQUFkWEFBQURIVEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2x3Ym5GWWNoekFHWUQ5VFZFRlVIQUNGQUJFSUNvR3FJSUdHVmd1RUtBQUJOZ0lrQTRoTUJDQUZoVUlISUF3SEcycGdSUWRpMkRnQWFQQVpGa1d3Y1FBRm0rOFRSZGttblVqMi95bEJtekdoZGVoYlpTRjBSN3VvN2hrWkNaR1Q2aG5wb2JaVFd4eTZjT0RoMEVnLzlvMEZSK0hBOHMzSjFiM3R3NTlYb3pnY0NOd2pabXR0d0NWeFg0aExvcEVrVGFSWHQwWklZMkl0NGpmOTJYc0N2TVJMVXdqMlFvMElraGN4S2tZcTVpUXRjZm5pbXJwWjBqcUh0R25nSmJsL3REcXppaXFkcXdBem9RMFRMeDg2TXpwWDV0STVUL3p2OTY5NzVyNEFvb3NSQkRKZkJibWtXZ3NJdG9xTmJHMlhKOUNrZW9iSGJmM3pCQm1vR0ExSTVhZ3hHTzFHVGFvTkVGVE02N0l1b245Rlh2emYraXVpd1FFSy9XL2FobWlieitWZEViVlZSNFlOK1BkL2pjekNUTzdMbndXZ0lxRmw1UUFsMjFZQjJwNUtKRmxMNkpmN1plQnpmdTRjRkozcStBT0M4UVY2NnpvYld3WWhXd0QvVjVzbXZFWG96RW1FVFd2dEtHMlRQRzNoV2NwUW05blFPdlI4SkZJVmdaQmQybWJGYytJMWZZWHZ3TlFrWml2cXlQMGU5Mzg2eTFiYTlkM3pCcUdMcXdBWDNYcHpiVEg2K3RiWHpHZ2tBMnVKZlF5ZWxmV2VKU3ZnQzBKRlVGMWF4TmRUVTJIVHBTajdsSmwvbmVtcTcrOXZTTWsvNkphZEdzc3FyZ0dlZXRuYU5WUEw0eitkN3F4L3NneG5GMlQ1ZWdIU1VXeVg3QUREVk1LeG94ejBCY2h1WHhpMkFzQ2F0VFB5dmdPT05UT2JyT1NjY0d1Q1FsemhFYktCL3ZydHoxaXJIOGhzWm5hNzluSW5oeTB5UkVMQ0p5TGdXZjg2LzNBZ1REQUFBTHBqTkVnM0pOTlFaTGhzWkxveXBGdzFwazRkY3RoaDVLaWp5QWtuRU1JQlFwK3VKL2lsa2hpcHVDUEhlZytHOWxwRm9RL2EreE9LYzZIRkF4QjJ6cnAzb3pBWGFpQnV4Vk04Vm1Da1dtVjd0dDgzVXFsNmk2eHd5YXN3Q3BWOStjelU1T2Zqck1ySC9CMWJkc1NaSzdtU1cvYS90Q212S29KRWloWWpWaUtQUHJ5bUtWRGtQLzlyTU1Nc2N5MncwRkxMckxQUkRudGRjeDB6S3pNL0U2aUFwQ2o2TC9rL2FLQTNBMjhPeVZ4YUM0T2xUNWFkdVBNUFdmWkIwdkJrUnRuY1lBR2RoU3VXYmxvMjUxclQ5ZUNPQ0tMZ2ZiWUdrcUJKNlZReWE0S1RHSUhVZzVmaHFSU1lFak1IUnhJSEkrbEozRlR6dE4wcFdoN0REREZQcHRvcHVONDRKL0FJa2cxU2VPcGNpOWhQMFJUUUVpV093enhOMDBaSFUrVXBTMUdGOEJZUEVEM0FCTEYxbnFMRmZBdFNJZHM0dFpRckVKQ3o5VEt0WjJUTVVWaGF4SE9MVzNpWVN0MHBvRWNZZ29TeDQ3VkRxY3loa2drRlBZSGR2TVN4OVY5K3Q3Nk5MWnFEQjJtOVlZaG10bXY0ejBsNzFhRFgvaGN6T3dRdXhxNmsxbFVDN25tbnRHL1AzU3p6S0dRL2Z3UlVEL2NPTVFpRElwVGdqeHZ2Yi9QYndFOXNsQTZpakxJVHhia0dscDJtWGhmVTFPNUEveUhlYWJSV0l6SWRXaldaMlcwOThTM05KbXhJVXhEMEpTMklRcWg3L0RMT1ZGVVk5SS8wNzFkcUpGeTRnTjlTTnlQc0Fxa2xKR1hQYWZlTSt4YkY1cUlZYy9JQUJ4bWxtNEJjQitvUE9SejE5Q00yb3VoMm9HdEVOTjJBSkZyQ1Z6TzROb0QzZXhXU0VLRzRzak1EdE9WSlNnWUxWM29TYUxZZWU2T3JFNTlKV3RJN1hxNkZNTkI2cEJhRHptU0c3eDlQL25jb0FRQzBZTzY1QVYvOFZxUjVwQzdPMEtKUlNUaVhNSGVhanp2cThmRDZURWF0ZFNlRWRDeUp5T1A3SFMwSE5zY2puNEVVSDdJVnY1QjlOY0h0NlErUXhyNU5nSmxFWXBCYmw3aVdGVGcyU3ZzdE5McGsxd2QwRU9CL0hLT1A1MW9Ba0tIYmswY3hnYVVTbUVkenZ2UkVYZlhuVUVxeHFHZ2R4LzFwVUJuNnlTVWJpTDhia0lsQ3BPQzJIRi9ZMHg1cXB4VEw2TG1sVVBiRk9KTWpZUURlWUpJY1lBaHRLVnFmckZLSW5nbWpPSTVleCtXYlNVQXJDR053aElEaWFLUFFWMTJlemFkQTA0Q0hHODVMWW1oMmdpTUVvaGd1RkNFN1d0MlJucFpPUDBMQW16akpOSk1sMUZxUTJ3ZmJVQkpiOCtnZGZpU0dTVzFnQzF0WjB6N1FWUWRkb1RTeXNqU2Viem9sZnlvaFN0Z2dCZWVMQ0hPRGZNeW8yQk9TOGExMmhpZHIzWVVoUkRWWFRBSXhFNnh3bXMwREVnMU1SRkhBR3RHWkpMRTZDdEJabDVKMkE3dWxUUDIwTWpRWHUrRkdjUmhqQ29WWHRvd1ppdGhlQWlnYmxuT1pJUmdEQ2dZS2VqakJRb1E2aFJoMkxJYXJHV0I3eitZaXRLQXVxRU1BbDlRRElnSGM5UnNZaVV6QU5nTXNaR0xMb1VheGFra1ZyZkRveksyMTBaYkswNFpwaTZDRUJWb3NNT0FBVVZnUWl3VjJITWpCRHVLVWdKT0lneVhoRU1uc1VDbFNhYVN4dzZUcmlPbU1SVjI0V1NHL0FyMW9iOExOOU1GYWZiRm9xTnJjY0NOeTRraWpxSXdCSmxOd0JDOG1XVmdsRyt0TVordjU1T01WNEVpRjJLQ0liVlNzbEZvWk5wbUZ3ODJYV3N3b0M1NktEK3FVcm9JekttbnU0R0FaZUpaL0VBQk00UVdRUnBGcWhvVllDUWZQZHBPaEhHYVd1eDRldUZpSG51NDAwcG8xTjdDWFZNbmZLalIyWWRGaXNjV3FGcXVCZE52QWE5ZHk4dEVUUCs3MTNMd2NEUHh2RGQwYXcrOW5leWZnZC9ZMzhDRUw1c0ppV0FuciszMy93WktjUW53S2pyWGlNQUJwRHVDb2FVaWtHSVNoQ0FFRnlFRVY1SmVsRmNIQnA5TG5lL2UvYTdiTUV3OEtwUDZaWlZtVlI4UzVvYkFtVlpKV09NNXkwajhCQUJRWVFUVW1ReWFaR0VUMXg5SERDVWtNRzJNMkhFT2h1WDVIalR1QnBTcEFLd2lYT21zcUJxREFYelFVSXdaK2ZPQkh2Z1poWWhQRzMvalZ5SXZKT0RkQklDMGpLNXNLbk43NnFVeHNJNVJqdEFwaXZ3Y21lQVFLOUZZS0dzRVN0Q1FRb2c3Nkc0WmVtcVRKVEFSVzFEOHlCVklRQlZNSWhhWnUvVkg3aFNPQlJGS1JtalFrU2JrZ1FIb2lyWXpoS0ZYWDdMSUpvTEM1YWFuaTB4Z1dMZ1JnVGdsa3JPYTFXTUp3blE5WHpsY2ZtQURzaFE0SDlFb2VueTVTb3JIcldnOXRzMHBJN3YvM3NFZXdBYXpydUMrR0NQQ2Z4cmtUOUNZQTlDOWJBNUJ4U0tLM2R4MEFZSS9leWlxbXRCdUFvMHRjTnVicjgwd2w0K200TVBqOW1LYVdQL0ZKMXRsdFBkVXpPNEcvaEw5V2pwVE5zbFZ1SXlmSTZYSlh1VmllRXdxdDRkYm1majhBQ0NKelNmZG40cE1vNDNLc2tYV3lzUVZwakQ5U3dtMEY5QVBBdndPQU54MnV2Y2IyQzl1QUM5K0VDODk0enpxZkdhUDdLT2Jocm5NN3oyMEJBWUJFUUg4bmdON0s5M1oxZXVWek5QcW43VFBISXZNY2RkVjFpNjJ6M245T21XV1QrWmFhYVlrTHpqbHZnV3VJaGlSUXNHYTBtb3RnWUdSaVpoRWxXcXc0ZGc1T2laSWtTNUZtamYrdDlRQUhva0o2Yi8zZ2JqTDExa2RmT2JRM2dCaDY2bXU5c3Y2M1R1ZFRvRkNSWW1WV3VXZTFTL2FiNjdEampqamh2cHNSY1V1TkxTN2I3SGJVdU91aTMvMFJEbGZjMEJBZXY2bTExVC8rOXErRkJBeEhoU2RTQ3hBdVJLZ3drVnJRMFFzaWE4MnFwYlphT2FPTkJDN3hGS2xpVE5OZUJyZU8ydW1nazY1NjZhNkhub1lZWUtCQlBFYWJZS3h4SmhudnJJbnk1Y2lWcDhSVXBXd21SMDJFalRiWWFaY2RDQTIvRUFCb0RRQnNQOUJ5UUw4Rk1QOEE4SjhETndjQUFEWjJGYnlFaE9NVUxDV3FvcGhJaUZGR1A2L0pTYmJubkpnVXhWMUR6TFFBaENKSXVFYkJvM2d5YVNVSlJTTmRFTEhTSHRJTTNISEdzU054ZmV3RW5jZnI2Y0NnTVdsN2phYUowMGV4UXRRUjlpaUc0Q1V3OGdTaUpubndTYjJyc0FpcFJFbG54Q1lNczZjU3lJK2UyUng2RXFiK0NyR0VIbU9vTkFPRnBKU3lObEFUaEhUTlBvQjlIUU9yeDRqNVhrek9nNFFPQ1dtY1BqUnhUQzNVOFlQb3VVVTdYN3pNdnJraVdvN2RKc1puUVFBRTdubjEvdDVmWjJSRVFtbzB3ZWl1dkprTGxnK3dST2tzNXhTOE04V0xsVG9FeEtSSnVONVpsdWM5VnhtR3AzWG9oU0ZaZzYwMmgwUHBmUWpnSEhMZFU5ZFlHWkdVakY4eEdQYWZwQ2lOQnE5VjZpMDZUMDRZWXA0b0sxNG9jM2VsckNpVkVZRGMvai95UVNuUE90YUpuekhCYWFoY0EwQ2ZBQ3E4Uzc1WnRBazBwVG5LTkF1dU1RV1FiRml2dG5QVXhuTUxRT3UyZkVtTmIxWnE1NUlNYzVRWnRtcDhWeWxSK0ZCWW95bFhwWDdWQkRBbWRtSXRIVjJGUnd4cTNmNHpKb3g0dDNLWmZwc2p5OHUvVldiVWc3WjFSOU1ncGJqSjR0bTRXQURNUWs0NXdEU2tVUmd0eUVtdzJNS1JUV0RGWmROL0ZHYVJmWkhiYTdPTFlPL3VUNGlIQjRxTWNxdEg3S1Z2MGJxd09aRi90ZVkrRFE0b0hVUVloUTRPVlFvYlRXTjFTN0RCOFBYYyt6dXg2T1EzeE8xRmRtRXFBL3Z5aUszdHVhSFNSYVc0ME9ZMDhaVkFQVFdNWHdLNFpFT3hCaEM4ZlR3YXNHaHhLU3Q3eVFsQm9UNTBvcngra05xb21HK3FJTTE0VHlYVmhTSUQxMHVFSTJDY3VGT3E1NENjUXZOengvcGNmOEdvZE5ZL1MzeG1hVit6Slpzdzc5aWxlOUYvVThyaFBWQzRtUWxjTURyYm9EWVM2Q05iNEFLd3hwK1JFRlZTMVRJNlVNWnc0d1lXUU5QUVc1dE5UbkZQZE5ndzBGTStkcWdIZzgyNko4c2lWaTN1blE0VGxzaTlnYjdHNDVtV0xuZC9EeisvUm5hOFJMRWU1OW1xcHI3U2hvcXRWd1NJdmZtR2RWMnY4eXBxalU3djVqNm5yUDExMXBnc2lMeE5qZTFXSEI4Yk1qcFdKODFkdFMycGFud1Rnd25OMjMzV3F3NGJESlNaR2xCSlRTRGxIZU1ZWlhadE85ZnVsV00vZTBETjNaek5GYnpmL2RzMnVYSUxLZ3hka3dOOVdFVFp1N2xzNXJrd3dSS3d5VnVWMkZNMmVhbGZHVmFoM0xVMHI1MXRXZk01V0ZIQ0ovV01ZWVVqaFd5K2NFbzhleVdCTVhFeldDVkxreWJZamoxdnJWSmRuT1JYZXhzcmdVRExxYmFoMm9pRDg1N0VTR0xhdnRrVExKUmZtTldFOGVhRzI5MFdtNUlzWGk1VGg3V3dsTzhjM0xTbjNldWk3V1I1SDh4RFkxMkxDYkN5RXhWKzZ4NGYzdFF3VURHcjNodGxPZkFHNjMxOHhrcnptc2picXdZdEVWU1c4dlI5S0xlaFo3b0ozb2thNWpXTFZuOXBXcWNybUQyVnZHT2FKOGVuK0tpT2RVYmtQWEpRZlc1eFpiN1cyUmVEdE9KVGEwTmJOend0UkpQQVo5UnRxU2F4MHFHbExrOTJndjFEWDVPVVErKzNZNnUwVUszUFB5RFJjOGVJbG1rU2NFWnAwd1MydzZ3Y0szK0txbkozNHllTmFidkY1L1J5RFIwajc4SHc4NUhtekdWT1MwV0lnOUpBZWxnTzQ5d05rdEk3aEEwVzlrd0p1ajlDRWwyR2FCTDVxa0pYSm1nc3NTNmFnTlZ2N29vR2lBZ3hhbCszcXdUWGZUaWxyQ21sVmxvOFkwTE0yRC9BTmhmdWlTSnJOWFZzQngwV3RQYmtWa3ZOYUhsa3dnQTFjT1F0SXl5RVVnME9ISGx6ZDkxUVczcmwzVzAvczNkd25mWUswZ0NPV3p3UHRJQ0hWbk5YN2VCZ1JuUmNHUVNyaml1YzF3bndxV1VsMTZ2Ulo5VmhYU2VNSVMwa2ZKQzcyOGtQay9yMkRFZFRQSTkwR0tBSm10dVJnMHBqSGFFNVMvbG15N0hRQ1kzZ0Jxa2Jia3BEaXQ3S01QcDlMa1FRU1ovUDVJcUR3UkNlUFJ6N2QzNjBPZ2FGVGpzZU41L0RPOG1hNGxDeGw1MVdjcE84VG55ZHVGbG1maGZ6Vm10NmVjaDhMZW04bitnUUtLS2hndzJFWCtwL0Rlc2k5R0FSVmdLOWtUbE9MVGtRSWFyWE1iSlp0YUVEMDZiNWJkSTRhSitFVFgrQWlRNUpkdHVjUTFYYUR6dkRGcTFzTGFKYzN0eEtRM3RRTGV5VXF5S1dWUTNGL3EwZEZqOFlEOGs2eWRkVkZhNStWcytEU0c2dUMvbk45Y2VudUVOcWxqSi80Y290L243ZitwaVllWVVwbytGWk9sRkd4UnZWMVd5NFZFUEdLTEpwWDdBQjN1Q3RMRjJibVdhSUJpTkY2aEI5MjNHL1QybXVkdElFMWZ6NjZUVXczQWJyUXJhbHdFRmhPM1pMTFpKR3pXend6d0xqRHMrejhvWms4NGdPd29IVUFIQWdMdzhYaDJhRk1yNjZqczVTb3hrdEpZQmVUclJqWDV6bkJrZG1JOU0rLzFocmNZall0ZFpyZ2JyVlRSNmMwNm8zbXVhQ2tOWmNqcmZQc1hsaXBhak5Md2F1Zkw1RVZTS0VBSGd6bzdFTXhZSlcwL29pSnh1TnRrbzBXbVUvTzQ0TmRVV3pJdXNOa2RaZmpkZlNWbzJ4OE9ESEg2THpUSHV6MnB3T1QvT2NCRWpKMVJValI4Yjg3NU5JRUJCdW0zQnR0NnpFb2RiMWhNZG9NaHJHR3FYVTQyQjBtNzNreUx1Um9hNThSeG5HaUt4bUlId3RnTlN1dmtBcXV2UjBLTkp3djM0WWU0WTkrcHZXMzVFMHRzRkYxZ3V1alRMVTM1ZnBVOER3bEFmUG5HN0gwM3pXOFgwZEpubXZKenlZNDV4OGxoRDZnMkpBVEVSNW14L3JFdDNtTnpxM09rYVV3SnZJZkd1K2ZxNVhmQk9IamFmdlFENklvd2hoYjluUWF4VDZKRGZTYjhWa3hybVZWbnF1NXJYSTVScTdSSHlNSlJpTkpuT0h0OGttdmJnZ3pZamduVG40ZHlleGNTek8zdlF5RG9KOWxXSWp1SXNSS1I4ZmJBQVhtenZzbHZNdWJib3ZUYW1jN0syYlJVZjJIMHlSakx0SnFlVHV5QWplOFlRY0pKQTFkY2R0enVWQ2UwL0VyaFlOSXd1MFlPekV0ZWIrU2xNS09VUXNFOXV1WnV2dVFYV2JYcFhsQ2J1dkpBUlhQeUFtekZHaEkrdU9HTUJIN0RQTzBvRFV3MU03OEFOM2hKNkVCK3FvMFlSaEk1OGJCWENJVUxJbXlnaFdWc2F5c0lTUUI1NmhxQjJISXBYek96TzlFbEZzZHh1Qk9YMGlQaFN4TlA5ZVZoeVNTSXAyRXpYa2FiUjdmZlF4a2VpVEQ0TDBGWUNHR2lOek1EZElqWGhoZHpYUHplUTZzSFV3RHlnZFVzd3grdW1LaXE0OW81UXJ5NEVKUGNodlgzMm1KMUVaUHZMcko2cGNhVnVtQzNwUXFYemoyZXZYNG9wVTd2TnUyYStPVitlcnh2SWoyVWJsNkEzblJza3hrV3c5Zk5BZWpWd01JRTVSSEVTbzV4cjF4TktzN2NjTjhOdzMxTWYvOXRSQUtORExIRDdjTDY1bW1lcGFvaGtuUGVMWW5jYitaR0FWczNRbWVzNXlCR3Y0eGJKUjdSdVdqS0lXd1E2bGZDdEZ0SEFlMFdDb28xREMrU0I2SnNkbnBFbVBnQjJnU1E2SlVpOFZGb0lCaFYza2hDaGYwMll4ajlKdmVnL1RLcVR3ZzNlSFBPNXNWa1dEWXZHQ1NhQnVxSTduYUE5b05CODcyTmdvdUlRYmtFckhiODhKMmROalM2SnBEclRmVjdyaDhXcnhrcjhjQjNaaDEyS25NbUtxSG8xcE9lbmh0RjQ2YXpFOUxhODd1Y1J2M0pSMnl5UTdtSU5sZmRuR2puVUpldC9GMXVqZStxTzZTdzZ2WVNwNkRSc2lHZ0o1QmN4WFZvM1I1TFYrWVYxdXV6aHZpWEQrYWIxWkdORHgyUHg0bnJhbWFjYnRxSEtvY3l2MzBlekIyOEdya2pYZTAreEFrQndhVE16TGRZbUZPOU8vZzJHSWVIQVNWTnJUejRVeHJJOFR4S2pqVkpxcnQxWHJkSTdETSszRGUrQ1ExZlc1L1YzVFhIZGZ4b3JFd01QVGJ4cnNSYVlwbmxLSE14eFpIcytKY2ZNYjdYR3BQQldtTGZ1Q1EvZlN6ZXYyUFJhdUN6NkFsbC9CNEVDRXZ0Rm85QnJHRWRacG5JT0krTGdnbjVCYnFPd1NiamkvMWhxQmEzNG45Zko5QUQzVThpYnVhbUdHZDNXMUx1UmxOb2h6bkxrdWlQZUQxajNDRERwNVRWTkdBK0ZoZFhvYVlFeU1UMHFUeDJSbndwczhJdEI5ZkhKM3lhNUZlZ0NsZlAwclJsbDlkN0NaMzMzai9oZzNHMk10YXZNMWZCVU5Cck4xVGVGV0Ywb2M3aXdDb1F2S21lU3BoQlJlSHR5dzB5aXc5MG42eHBnQ1l5a21vTktHaG1oMElWWlk4S0JrTzBXMXBxWUlpOU1pVFZHOTRKMmpoK2N2T1MwUnNlUUs1Z1VEOEVBcVAyQ2FyOUlqVmh0VjNzd1BWTnpUQjN2d1lDa2lXQlU3cjczTjQyQkFuNk4xRzlmbDlOWC9ENUErSjNrOVI2TlVXL055YnFUclZzenc1emZPRDhObzFvdFl2WDJTZ1lOWDEwRGM1WW9QdUpMVWo2NmRUdGNPbC9QRWJZWlBocmkzK08rL0U5K045amJlYVFyT1E1Z0oxN3gwQ0oybURvWVlvTkJsVE5XTkh1enhhL0R1Zmpyd3ZyRzBvZytZWWJGQ2IwVEJELzNvN2l0ek43ZHpYR29kejdmSjM2eHNET2t5T1NBNDROOHJIUHYvK1RNYURGcEpuNDM0Tjg1TS9tY3ErQ0tvaWdoeXdkamtsVnpTOThIZzZRR0JHVitrU2FhMUswbHlSNVRrRGNETi9ZSlRwUi96ZmJ6U2trNWV2RjdSdWRGWUtKcW1JaEVpUkVpcjA3RkVCTmF6NEVLejc4MEJOM3FLOXJPYis0WW8xOHo3NThuY2tnUzZPK1BnTEhaayt2WGVyN0lidThCcXRyYnMxZjMzbXg1MkhleVpKeDNvaUc4MFh6ZGJBNVMvK0VKN0x4RWZzMmRQejRZZ2FzZWh3UlJhTEtMVGtZZ1FKWGtQUmJBaDFqcVhtU3JkenZnbWZFKzJUWi9mbTRqdHkrZGorL2ZHODBpUjI2bi82NTFqK2JPZEVlVjNlWkw3NFFVaXNJYlJyM1NKRjVUb25XeGpmaUlHZWQzeGFjdVhZSS9YQzlYdGhZQVlrRFVZM3QxRWdUTk9Sa2dFOFE0VURTZ1VRY09IRUF1Z1BKNkY5dlVaUUo0bkxkUXIvKzlWK0dnYTR2c1F4Q0ROWDc1OTV5TlhwTS9mV3hBbnA5dytDNmpOSW4yNVU1b3NxUUdyR0hYcEJPNE5qYmN1Nnk1ZmN2Sm9kckh3bnBXYUZYV0RWR0ZxWGYzWld1Tno3RjlldnRyeWpHNWhhVG9IUDdYdnhiV3phMmlGZ05sWHB1S2NIeUs2dEhMNUpraXhTKzFqdXVudXdscUQzNy9XMEYzUVRjZElMVVcwR05nM0ZjMmtwNk5LaTVsQVRtZW1vQWtJVDVyWnhYejNmZG1wK1FObUc2UkZ4eDNHNnllWGlvcFprVnpmbGRZclRmVFp6eFk5Z28yK2dZWG1ZSWhTM2NrdDZFRVBlelkyM1pIaGpHMHdQdUh0MXpzejdZc2RHZVB1WllsZU1NSXNLYTBtYlRGcnVsTUd5M3NtSmVSQ3NwZjhQdXpRNEhJUnFkYUlYTGhFODY3WWdZQmRudFhrYzM2YlUvUDR3L2twWlQ4VTlGME0wQjBob0Zub05hMHVjV3d4Rmk1MHM3VDE1d04wd3FUWmZCN3JMVjh5bWhicWJjT0YvamFkYXZVZk4yc2haMEdRMXBiNE40MmtkR24wY1ZURDkxL1dNeWNuNWVxSVJULzErZEZrYjB2VDFnT0p1VnZyQ0lmMjJVdUtwcDkzNlNGVzBxbHNxRnVtSlBXT1RDendVNzRYc0tBK1dCeG5xRE5Wa0FmQXFJM2pXcXNoeW45SE1hOTlTdlpCbUd3L0tjQjFlalF5b1BGWTVzdS9PRVBENzBUeVdvUS9pZlZSM2w4cVRTQXV2VFVYNEY0U2VZMGFORnpRQWlWUUZnM1pEN0cvMzBFS04vcGNFc0FCU2pCWFk5ZGk3NHJsWHBKYzRkVjQ4amFJQnJBeTR3ekx3SURWWnUrM1dnZnN1ME5wT2NZd3czdlhIWlFjclJDM050UXNMUEdtRU1YMUE4c0gzMFladWdCWXVqeENMdzdlKzVORFRkZFE4ZWJHQitZZzVhWDBLcHF3SXVwU0xyM3lENUpuRnhUdmZhbnA2T0cwKzErZG1GMzZJZ0dzdzlCQmNQNTNuZkhQN05uM1FaWHBzeE0rS3B4RE5uMStBcVdCNGtkamJpYVl2dlBxUDdXUTRLL0RqRFVaNzEzL0RiRjdCR0tTS0owOFgrTDFUUlJ5eCtWVzcyb092QTEzQVF1clh1MDQ5dDNOOUZLWUU0VzNjNkU5NmEwMXlZZHZpNzcrREJSWHc5bVJDLzdMUEdKbGtBKzdSNzIyMWNHUWZjV295NlVLY3JmeEF2QWZCeUQ2Y05hY3RlcUhDYWUrcENsbUxHdEdCZ21DU1A3akJIUjF0ZDBYOTR1MzYxYkQrWWwyZ1lzOTl0a29BMXVjODY0UGZCVGljYXBxZXZocVhCZmUyYlBsaStQMUhqTVpGYXU0Qkd1Vk1HbDI2SWFLRGxKNHo2OVhSOUd4eFhIczUwV2JMYmk4QTE4UlRlRXJoNTFXWlpUMWhUVEZncHg4V2o3U1BpcVQ2c2syT0tIODVyNEM2NFVzREt6cW5CR1hmVVVvYUY4OTZuVUpua1N2K21IdlJJaUtNQmhVUU9uenpHdkgwcTkrYXNtWTlhcHFacXdXYzhhR0RPTUVNbGdlUXFCU2gwVWFRRDIySTdzZWZUYXJrRmdMTm5PcEEwZUgrcXdkNmcvb2RYK1Z5V3cwQjFhMW0veUxQYzVWUVo5ejFaSk84TFhiNFlvcmJkMS9XTG1lN1VFQjdCcjEyRmNGZy9aVm8yNlhJc0E5SnRpQktkYXpsb3hGUDBRUXdPSnBRVW9Famd3OTNWc1EzcHQwckNLTm9oNm5KeVhWR2NPd3dmTWFkY1hRK1VSdkgvNTM1KzAwZVk0RWc1L1pMK3dmVXkxcEdKVWtuWk9qbmJqRW1IRVlodXdZMHAreG00eFpNMUswMncxRFdjYzhic2luTXRtaVpXTnl1Q0JaL3RuaEhZanovZ1pPcUx1c2d3QnpRVmR0UEZRWGVZRHZIbFJ4Y3d0c1IySTFqUjlTS2lkdk9iMnBrN0QwL2tpS3VPWHgzcG1EdzVGQUhSYm1YVmxaK2FsU3hlKzRIU3VkaXhmYS9QSllZNkVlbW8wa3RKcjY4aDUyWWNHS3ZzSDlEN3g5RlY3TDlTN3dkS3dLQnVYbUJXN2ZiTXRaMEJJUnpGbFBjYjFtWThudHBzWDJZZ0F1czBjTTBxeFJMUFd0MTFLeHZmY2pxcmdDOWFyRTNtOEo3ZmVKUmNRVkpBZXM4NHI2dS9tZ2JVbnFkei9nMEMydUpvVjdrazkvS1dDVkxvd1c1T1JTN2x2WjJqLzZxQ09rZXcrZjUySTJyeXFqeDQrcTI1Ly8xeVQ5dERvL215K1NsWmx6OWxyOE9kZGp1Q0hHbGRyREJuRUdFd25KWEJYbWRKN1hxK0pLdEJQbVBSZXBld21XOTRST0dWRVk5SzQ4K3I4aUVoQXpuVHhnVkdkRTlPSzBFWG5TQ0ZkeHZGOGE0S1RDMU55OFpxMjc3Qk5MaUZjQ0hNRDVIZWhZdGNoRCtoWjc4RldCb0JBTitraEx5bXl5QUlHV2NsYTdMVzgxbGdpY0NRZHRkaWE4TVBBSGRrSHlIcUczcEl1aHVldk0vYml4Z1B5c1plNFJ3cjRzNExjdkgzVzVCRThnVi82dzErUndlak16Q1IrSnY4L0c5RVc4UXorUXdlSXhaS0NqQStuWDRjNnRuOVlhZlVOZmw4VStjMVdNZHd2WEE4ZGE2WjNSUnVEc1hhZ0FWdlQwWng5UTZway9xc0NLU0F6ODF6WHRmdEZmRUROVHcvbk1iaDZRV1JaVFk0S241L09GWGZmU0FqLzc2YkJBZGlZb1JGcDdjMk1yd1hCVFp0NXBEMXNtMkdJVmNFZnd0cDIwYWRmMmlaVVhJM3dEV2xDQVZaSTVWTGY2Nm1Nd0dZQXh6Q3ZsaUdvKzd2aUwxOVlqNElLejA3Wm9zTVBXL1BxZjAvckl6cCttUC9PN0p4eEgwTHpUWjh6R3RHc08zRUlUNXg2VlRyWFcrTDlsZ2U5VU1MUDVaYmZDdk9ZbEduT2llQnBFblJTQnhOKy9lQk5mMGpidHdFRTZCYW96VnhWNHFXT0xRNys2aWtmZEcrQkt3dXhDeUkrcjJiK2cyTk10a1g3UjdjZlZES1dpL2dDRWtEMWMxS3k4c0xYaHZnZU9Qdmg0cUpaNkU4R3I3TlRiRUZQYzJ2RHNXMlc4bWxqdEZwNmNDWldvc3J5UkhLM1E5RHZSODhtMjlOa1ZuWHVyaVFJT2lTc2FEcCt2MjFNNGZsVWNMellldkJBQzlyK01WcU52b0RSQ2dWRmpjeWdOWEs3Q3hZRmpiL2xvMDdWdlpRdGwwbXpuL090ditkSjExZHRyd0hrMVVBNnRkQ3dlczNrMG5VMkxTeHN4N05NU1BaZXRzbWFNdWtKSG9QWGRDUjlINm96b3hHbXIyV1l5SlpMT1pGQWRndzJrOUJDejNYNjkzT0x5R1RzeTNxK2VlSkpzZTkyeWFJZzY3MS9mOGVnbjRQQU14UUsyWHcwTHZmZEo5QjdjK1FkU1RQU3ZsQ3JaNExoLzJocW03dGJhWERiekFsaHVkU0VvN0FldVdtcXB6eTFYS1YxeTFWQnJwS1JMcVZTNWxacWVOOXE5QnNUbU5Vb1FNV1JOSUlHR0kwWGt5c0VTY2dWWm83SGhZckEwYUFsU293bzhGVmZ1eStYRm1vcmhPRUVvbjh1NXhzRjVZSXc1Y2lvbm9NSUZoMjFYUjBzSGl1dW1EdEpmdytubjVoU1ZGV0wrVjlSVTNGWXlJRkp2U0d3MnBOVXlpZ1g4S3VjRG1qYU9PM0J2bjA2WHNRaGJmT2FVZFBibnVTRFdtaklrazUyVFlWMWFOSTNobGtoV3JLRVpQaXdER3J5UGNQYjcvSXhsejdhcEhrVGgvWVd2Zm1zc0Y2UzRraGJ2RDNxSmtRVVdYQlhuZmlDVVVraUpqUUpsOExYdEU4cWRJNmpGYmRGMko3bXUyN3lYbDQzejk3QzlnMVNOMld3RW8rRERrT2JQZWxwRUhYa2QwbTNETklrdWpWTktORjlUSWV6ZjFxeHBwZENJbWhmOE53bmFydjRQL1ZPTU0vM3dRY3c2NERJSnUzQm5qeER3SURVak4zbmFNbW9qZXptNlBERGNGeCtPbDhPNVF1dzE4R1FtNEM4YTVoL1JTejZQY0ZXNmdCVEYyVEdWeFZRcU9uR1pJYUtHWXlhZE9CVXdXaHdwRk00WTFNcFlBZ0hYcS9CdGVPK2FLYmNHSVVXZ01LS3lOU1I2Tmg5dXVnWXM3Q0NxSEN6MHdxZ3AzWWZZYkhuRWxFWmhnV2ZKUDU0M2ZkK09TNDFJTXFzekdqTTZKR21VdnZnOXRIeUVndkNJWlRLM1dFSEFSQ0xtY2lkaVI4VEIzaVFCcXoxQnFScVdKL0RBUkU4UzFKL1U0SXhMMEVXQmdiNkkrUUx4NXhlUHhyZFY1U2ZyWitGMkdFanNVWlhWTkhnYURNZE5Xa3NRTlovSEFLY05HbVUwbnZFRUJJK3pPbUUxaXh4WFBtNG0xYkJKSFQra1ZIa3dvOHBYRUFrYXNad1RXQzJBRmZSVll3MC9VWTR0THExWXFMU2paeXVhUjZqNXdKYjRBbSt5VDNHV1ZYdWMzWWdOVTgzZ2JibGM4SktzZlVqUTBMNWozcFVGY1hJR2NvQVYwQzd3K2I1cVJpSld4QkVya244WnVYZXlXQW9XZmVtbEF4ZHB2TGR3L3JocVhidmFzRVhZOHNDMWhmeUtjcEI4YjdsYnlQMVhBZTRXc2NMenhVTmJkM1gyMU5ZM1BFRnp3WHVMdHQ1UmY1aUtQU1dRSWpzSXZyL1ZyWWJ3L09DN0NMOHZNL0JUSEhaNTVZYUpNcERPdDdSdGF0cFpPZHcybjE1RGgrdExqUzhBZnVYalBSemV1YjlRQnpWdmRyWUpoUUVVSDJta3YweTQ5OEJHd25mdmlqdG9GYlUzU2RxMlgvZDBTM3RMeXpTTDkxTno4Mk9nQlBnc2F1K3lnVCt0T0FnNTFIQ2ZYZEdmeW5HcUVSVHZhOEEycVBMN1BhMk4zTHMvblpkQUs5OXk2Q2syNTY1RExXM1V4TEpSWSsydDkveHV2clBaMHRwU1diNnQwcmZWMHJTUDA5SFd1cTYxZGJ5MVRRdWlFcnhNcEpmY3ByZERGVFVQVmJORk56dFlhajFsK2RXOG41cGJYdVEwcTF1YUQ0TW5vRkNpMzkwbnVoamY5eURZdnh5eUkzU2FGMTBYeDBybEppdzYzYTNrVTZwMUsyZHdrdnl4V3h5cjFjOFRPa0ZPWFdLS3FqM2JpdklFWDJIR2JicEFZdVhEanFwRDFzRStuMVp0bmNSSnJtbWdjbmlWRE91d3ZQV1NDdXl3bm45YVk3VXYwMURONnhEVHQxcWxROWU3aFV0YmhNS1dwY0pFQlNGYjllVVlYQUpINW5xMGt2c2hEbTFGcldXMzhvN0IyOUJsejg1OVd5UFBBMStiandhcCtQeGtodGQxSUtJdzlmemx5azdWMms1TW5tdVZYc210dFVOenJIM3h0dFlINkpxak9LSzJRK2VtdjE3NVBxUTM4VCs5bTZTN3lmVThxOEQrQnhoVFJlSEN2alRuV2tBTTkxSlkyUWtiNUFHUFFxV0pxQTc2bmx3K3cvZTlPWUJpcGk0ZDJrdEllT1JPdjFCRmNXK2FnQ2hBM2VzbEVYVUdiY0lHQVJUYzRuaFQxMUJaNjZYWHpURkxGTnlaSVQ1TUxXK3J5Qm1vZFcyVnJFWERSTVpxUkQvMnF5TUw3MlhnUXBHRUxmTm96NzBndm83QmtCenhXcDZlaEFWYWNucGV0WGtONnhKR2RnaUp5aHBKaDdhQ01JZ0RNY3BSVDhxaWFMdkw3R2FOVStabjR1aWxyZ2EzWW9NK2lLc0hIcWo5R3U0bmdycEZIb1dydmxGUVBzUGNweGxqcU9Mc3ZkbW1qYnJlbXNIcmE5K3VTc0dEK29WdXBic09iN0Z4WllVNnNxeFJiZHgwbldPeGtra2l1czR2bncvSzBXQ0pSNXVJNzVYWFQzMTRCcys5RFRuQnhieVJtTkc1d3c1QmdXUFVKaG5ac2wyV1czTjUrM1VyZGlVMExpcXhJQzlmSmh1Zk5sK1dUSnF1MExjU2treFg0ekZBZTVSV1JMVmNQajVUTTFORlJ0UDViYmZrYy9ZYk5OVUlpTG5wVEJMVHNyc3BnQ01aeDJuRmFrTXZKdWNvaWp3YVVNYUtlTDdRUXVlajZLTzIzSkZsUUl0VXVqWXpPL1NZdUUwN2ZidklSTkc4TW5jcG81ZDNsNWxLMGpJam1kdTQ5WTliWDZvMjZZbFpjN1BmSGY5MHZNZG1IbHdaUVR5SEROWDFHbDVrMWo3Y1A0LzVNTkVwNDBRSnpUTTNHTGl2MEpyZkJSNHVBZmYwcUJCTVcwS1U0Vm1xMk9NcWNMTWRURGV2YVBpQ21iWTR3WXlWTDFnWk5uVlJzajRITHBhQXVlYW5xNExjQ3BsWHBSS2lreW1VNllhYzRldStFSW8rMS9ONStzOUZ3aTkwUVAyTnJnQ0tHcFRETERLV0xhUlc2a2JQYW1OM0VabUtSSVFReWRVZWJFUzArWEdxZHFoYmdNU200dUg5aGI3d0FhcU9JVjJDNEtQVXZtSUVMMUFQZkEzNEs1bG1peFYzNkc4MEtMc2JVbzFDbnVyQ3lCUkY3a2NGUys5RXNZWC96UWZmOEIvYmZkUGt5enNwTUk0cWpwbnNYcnJBbzcvMXFkZm5TMFRNM0FhUzJVVHZSOGVMVnVMZWp1d0xsSGRid25VV1haRlZtb3hobmFMTGpqQ2JOZmlaMlFKSkxnaUsyOHFPdWt5bHl4WnlldUpQM0MvcEliUTZURjJ1aFhnYWNLWldGYnZnejNHdndoNWdhR2R0SUNIWmRBUHdQYUN6SXVqYWUxZk1kT0Y5MmQ0UXdXSHZPWDJMS0RKbGoyaTZOamZvaHFzZ2hGdXVHOWhLcmFYTjBvaFYwRU9rR2FMTEx6T012dWhYRTh2VTVkYm9jc1pvRE1sTUlUTnkrVFdpMEpLSUw1RFUrMC9wZDBmMFE0bTZDWFdwOE1IUUkrVjluaG5jd1NES01jb1EvY2h6Vjc5YktjKy92dmc1L1NGd083OTA3UEQ1dS9kVXl2ZXY5RDJqWDBaWmRBZVNSaS92ZjZxODNXT3pKeGlZV2hqS0g5cDZEbUtVZHR3MzVmNFN4cXRiSDdvalNjV0hGcm5XK0Q3bFltMU5rK0htYXlyd2RQUkN2ZlltOE1zbGp4b2ZFYzJNdURYMzJ3L01NK2lsdXZ6ckRad1RjZWx0dXA5dWh0MEdsNDhkK1FuSFcwNVVzanpYYS9ubjJiTnM4M1Q5RUhab3U4bnQ0OHNGT1BzMTc4OTNDYlhiMnNOTFdUR05qcFU0QU1PVHJMaFd5NDVQWHF1VlJxeE9WUVRXU0dOV2h5cjh5QjU0OG9KV1lBUFpYY0RoemNLTzkzKzhCK081Ujh4S3FONWNtb3lrRkNvMXJoWUZZSzJvaEdlelJ0UVZqRzZwOGpuQU9sVXBqK1BxYmNTL25sSUNOV1E0QzdCRWNQMU9iOS9ZbmM2dGE0STNMbkpJVmtiN05tSGRXS2oyd3I5WnpLVGk3NXNYSzFORGU1eGRZNG9wejhyRS9RZW5IL2NzV1hZcUZkbWJjUWpYMkFmaXRwQkVHcEc3ZlBJdXZmQ3JLeFZhdjlZUVltV2tqZzQzcUFMVGZKZHR6S29VeG54RS8zZlJPbS9SaktpN3V6QW5PYWdnU0ZuWG5wYnJJSEMyTE5lV292RmwycFpxcmduLzVLTGtzakVpSU1OaS9JaEVvL1JGWlpnL2F4WURLUy9ZSlV6clU3dGdoOXVEbTdqdHBDRklXYjg5MngySTJ5cXlNU3JlYnI5SXEyUFdzSjJNWHJ3ck5TSWgzUUE1QTIvWlVJSzAxZmJ3dm1ZRUY4cUdxcEJpTEdYcVhTOGV1d1ppTEk3VjlxYVBMaGoyMFVKUDkycVZGNlY0dlVRZFlzMzhsOUJWZ1NuY1lPRzdaVmt0aXRyZmZ2dEIyYjdRSitLR21uTmV2SlVqV2V2aGlCQ3ZVaUdOUGR5R2VBWEx0MEo0ZnBDYzJHa0Y5OVhUVWtHNFYvdHFwS1hIOWVtcEJ4Vm52MnVEWFhwZkU4bXNtbU5XbE9NWTJGK3d5VkRNR1NkQ1llUG1ZbTZUb2RPeUN6blQ1bkRJTkZIUUlpWDRZblU2b1YzcTlVZ3duY3lsT0dhU1pvK1hTYVFtVmp1ekJrM0dhS1FYUnhaeHVnMUp2cy8wdzJENGYxdnh5VVFlR0JaNXZUSUQrNGRjOHNkNFQrM1F2bGZBWEIrYUk3K1V6Yzd6RkErTE9aeGY1S0M4UW0xdmY4eElBZEJvVXpsMU5LUCtSSGRGNGZpcDVsY2FtblkzZDFTMXYxYi90V1BJWWk4UmhMMms1UTVuYVVHZzhUb2ExMmlUbUZtYlVBMFVUV2gwQ1RPbVMrcGlnSGNscERoeDhHYW92U1dqTFhRcjBWSUVvaC96MUtVVHRuM1hlT2c3OURDKzVDU1U2UnJkUGVtVFgvMXNpZHY2RDVnVmFWWnNKVFBuVXpzbFY2dkZVdlhWRXVuVkhJbEVjN1ZYWnBOTGJiS3ZNYkJzYjYva3MzK0xvZVhUVjlJUXNnTU45bDBiMmdKWm5QTnBPTTd1dlo0dVdiWWQ1OVJUT1R3M0pHWHBudnFxaGJYK0cwREtWQ3RnRWwxVUxSUGYzZXJna045UEY2NEVFSFdaUnQzRTI2MjFmUFNIYWoreFNMMkhobHp3ZFQyenF2aC93WmRzQ0VqTm80b3VJTGQ3SWNlMWJSSHdmcFZXQlpoamZaaVpUQXRGTlZNTGc2Z1dNaGhxbVdoSzBSM0Vwb0t0eHl1V3pTMXE1bXJwT3dxOGVWeTNDL0ZSZVJNSUhLZVpLRUkrZVlpdW9tbDJDUG9NRmpYNnE4Qmx2MGNFM1Z1b1FrOEs1eWVNcGROSElJa3MzeGhMQ1NYbGZFOHF2M3granc5UVlwaFM0ekxITmYzenRyRW1NSjA0RzAxMlVzUFg1K3RxdWtYYlYyaEtiVWtSVEk2YytEeERmbE1oeG9zQ0ljL3pnSmhIRlV0ZGp5bHZXQ2twdUw0MmRXRGZwT2x1YXFsWjFoTkJ0TnNMZkJHUnFVSm1JU3Y5WjRGRWVrdmdqV3RzYkdyOFFlNTJJN2k5SmZnUlhnT1F2VjdiSk5hdCtPdHRZL1F3eWt1TndINGpDMWI1WlV2WnA3K3VxMkZrdXJzNG1nT2hkclcvZDlqZ1RRNjdwZ0tEcjhobS9rN285bzdzNTA2eTJDZWVZM1B1TzhGbW5ienZidFlQTGEzL1cvclpGSlo3R2dJTTM2N1h3UFlqZ01wci9FTWc0WG9EbTVHdWwxZ0hzNy9DSVNhYjN6dWdrMDRNYUEwSVZFVXZybTN1cFdEUjhEY0tobHRRTUZ5TmdpRVRJL2duZTYya1RkNmMyZGJrNVdIRHJ4N1pKSXNxY0tZdlN1SlJsSWFpb0J0RndUc29DdjZVb2dUQWRjZ0pMY2dKenlJblBJS2M4S0dVb2k5MHdmU2FSdXdBb28rb3FicVIydWNScGc0L2NqM0JUSmo5S2VaeDRHZmptbUFYNVRtV1lDbFRNTnltendRbHhXbURSOVYrL2lPY0pQWmZtQjZIbCtBR2pZMG80dFJ0MXZjSHU0YkZhbjJ5eitBYlJqTmI4bzFTVGpkR0dxTk94WDRTSVRWcHlDUFhJOHloaVQzQkFpWWUzeklWK0toazVpUkNQbWpUKzNTbGVwK3VCdm5nNURHTFFmRVhBOEVBOW5icm5Yb0FzWHd4ZTcrdUl0QUlmbzM2OFVnM1FtQnErd2pvYmZReCtnUjlpajVEbjZNdndKZmdQZWtyVXZ3YXFTSytWZDdENytEM3pBOGUydmgySXpEOXRlbnhWRDZKQzQ1MTJ4dDhsajVIZlQ5UGZ4cCtvczRIdEFWZHdZektuS3ErUXN6eGV4bzNyR3dMY3JkMlZkUVFOMW1YeDFQY3dDMXU0c1BiekJORUx2MkxhTERkVXRQMm9iUXhLOGF6SG9PNFczaUQzVDQ5ZldlVTJlZlIzZjcveUxGWVptRFFYdmM5SzlsYWdVVUFNZUxlZnhhc0FqQ0hmVmdBWkI2SWRZczUwWHUxM2JxTEY5YjI0STlaRDJzRGJpMTQvejhneTFpeGx0amd2T1VCNUxvQWdCWFl6YWxKZ3NhTXJSMXRYWWRSUmxHSDlSUWRzRSs2eG1SZzh5SWVvOG94UnVNUUJTb1B1TU9NWU1MZHM0eEdDSitIMlNNaTVhYnVzL3dDVlk1dE5BMFhtMHk5eEdNMEp0QU9xMXBnSzBCZEtBZjdES0d2ME1mb3k5Ri9aR2xhbE52bHdubENjaGd0Ukw5bFc2QXI0S04rb1NkZ0l4WHBJSnlGMjdnTzJPL05BbGgxVlhlTk95UGQ5LzNTSUtBL1ZDazM5WTRFUFlpdUhlTUJISnBXa20zUWVKRUxQRVlMMFc5Z2daS2E5ekdIenY4Ykk3REhlLzRZYmhmZTJFOWlvTzlKTTMyM2J1YnNTa1F2aU13K24zUU5KVWU4dE90cnp5NXYyRWE2N0EyeFZaVHM0dTh5MWpqbnU1M05DM2tFYmlFL1pqc2l1bE9qMjBRNjhVNllFaW10eGt1dUMzdkw4WVpMbzJzRkVhZFF4dXZHOWxFMGV0Nitsays3TVFIb04wUFlsc2FYYit2YU4zdHIxeTQyZFZta2ZTYlY1eGkzQmJWMXUxMU05d0QwbE96TFhuWUNSOTB0NHd0K3JpdW9LQTE5eXV3RDJwTEFKd1E3WjN5K2NJbmk4a2c2MThuVVNBVDJPNlZLLzNXQklhMWhUMmV3N0VvRlNyYU1JaitUV0UwKzk0cmFIQUp3RVQ5K1o3cGxYRWpxM3hESDNRRGc1SUdPKzVMOEwyK0ovK2l3enhQTXhnRWlCZ0FJL2l5Wm9IQW1NUDAvZUU1azl5NmlOZTFrNnc3V3o0dWNycVRweHlaM0JlVUp2MlJ5cDNYRlRQWWR5TDdKSXdSNFJranpON2F6WGkyQ0lNRTBwVFhvZFpjN0lTamQrckw0Rkh4R0V5M0FSSFVBeDFWL0xadmlqbDh3V1YybTFmU0NmK3N3YzBXMDZPcWE1bTZTS3p5dFJuaFFWYWdNNk1jaFJna0pNWFlFOFloQjl1bUtvb1RwR1JxTmtLNGZ4NE9XK3UrNENyY0dZcmdUWjV2bUc5VFVqdGZuaXFZWlVXVDZVZzBlRTNoa2lVRzVuQnBnakYxNERYYm8rRFFSYmZwVjEzek1wbElKQ3VjK1ZMSnhHZ2F6eEZ3V0kzWkxuajY1WDUwMHhCMDNvWjBNTDRhU1A2R3ZRWEtidVBNclVxdm1hUWgzVUdaclJVWk5pWW85dFhUUlU3eEdsZFN5cFk0NWJBckxVTE16dEFiNjVpbWRJT2FSRFlwSVVGNUJzSW83S1E2L1V6U3d0STJTZWRTMWs3UW9JWFBTYzBHVEY0dXpXaHhMeHZ3TnhGN2g5cjEyTExZWElkOUZENXNyTy9TMzJiS2VXelpQSnFYL0FNM1FoMXB1ZlN0NzZqaVF2WUVsMW1NMGVNN1RNa3dBQTN0OVNEbTc2WmFYS0xaNTY1dnBPMGl4dmZReUNJMmo1Qk9oVi9rMlBpVjNzUnQ0S3FGbC9tRHVEblV6Nm03VnY3OFJQYjNJMWpQTVhWQ3FWWWlmK0VURkhuVzNyY2hNYjUxZTF1dVZwekwwbGdHVElBVU1hUlVGY0tBRHNJRUUwUUlabUtmeURVbEZaWWNvMmE2LzQzUURDYVhza2NNR09LMnM1S0Z6cVB5aTdzamZKOVM4TlZvamo4b1gxTWp1eWZFRVFJQ1BjV2ltQVdnakxCd2tKcTBPSmppZEhaejJpWTNPWnpzRWtkbnJFTmx5blNOWVlsNXloREtYWWc4ajFicVRDQWhzbkM3eTVLdFFLSnRYbG1JeWhVdThOTExCQlppeXVRT1V5RGJKZEVVbXlEV1pyTDlDZWFhWlloSUg3VVMwdUpYbWViVElpalpCY3JGODAyODZKeWV2N0V5MXhFUU9xc21UdzduS3RkQVVaZXp5VGVEbGt5M1hCR1VaNDNMS3BoN1FISzd4cWVBUWV2dG9jV1JsRXRKbEEwMVJaTXBSS1RWRlhlcnB4VnhGeGI2OG5GN2pzcTdHYmRVMjBCdWVJVkpPd3NmRnE0VFBCSVVTT0xpNEpNclFWejk5ZFpNaGFQQzRXVHNZeWdFblpxczRtcndZS2R4ZXVQbFlLVExKcURTL1Y0bzRoQ28rRHZOUWIvUUkrdkhvcmVmZ01UUE1tNFk1dTA3NVA2SklYaEgvZTEveW53RUEpIGZvcm1hdChcXFwid29mZjJcXFwiKTt1bmljb2RlLXJhbmdlOnUrMDA/Pyx1KzAxMzEsdSswMTUyLTAxNTMsdSswMmJiLTAyYmMsdSswMmM2LHUrMDJkYSx1KzAyZGMsdSsyMDAwLTIwNmYsdSsyMDc0LHUrMjBhYyx1KzIxMjIsdSsyMTkxLHUrMjE5Myx1KzIyMTIsdSsyMjE1LHUrZmVmZix1K2ZmZmR9Ym9keSxodG1se2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjR9aHRtbHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSl9Lm1vbnN0ZXItcGFyYWdyYXBoLHB7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNjt0ZXh0LWFsaWduOmp1c3RpZnl9Lm1vbnN0ZXItaDEsaDF7Zm9udC1zaXplOjNyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjRyZW0gMCAxLjVyZW19Lm1vbnN0ZXItaDIsaDJ7Zm9udC1zaXplOjIuNXJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4yO21hcmdpbjo0cmVtIDAgMS41cmVtfS5tb25zdGVyLWgzLGgze2ZvbnQtc2l6ZToycmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjI1O21hcmdpbjo0cmVtIDAgMS4yNXJlbX0ubW9uc3Rlci1oNCxoNHtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luOjRyZW0gMCAxLjI1cmVtfS5tb25zdGVyLWg1LGg1e2ZvbnQtc2l6ZToxLjRyZW07Zm9udC13ZWlnaHQ6Ym9sZGVyO2xpbmUtaGVpZ2h0OjEuMzttYXJnaW46NHJlbSAwIDEuMjVyZW19Lm1vbnN0ZXItaDYsaDZ7Zm9udC1zaXplOjEuM3JlbTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MS4zO21hcmdpbjo0cmVtIDAgMS4yNXJlbX1wK2gxe21hcmdpbi10b3A6My43NXJlbX1wK2gye21hcmdpbi10b3A6M3JlbX1wK2gze21hcmdpbi10b3A6Mi4yNXJlbX1wK2g0e21hcmdpbi10b3A6MS41cmVtfXAraDV7bWFyZ2luLXRvcDouNzVyZW19ZGl2K2gxLGRpditoMixkaXYraDMsZGl2K2g0LGRpditoNSxkaXYraDYscCtoNnttYXJnaW4tdG9wOjB9LmRlY297YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsdmFyKC0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xKSAwLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMikgNTAlLHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMykgMTAwJSk7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLWNsaXA6dGV4dDtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMSk7dGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50fTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xKX06OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTEpfWtiZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOi4yNXJlbTtib3JkZXItcmFkaXVzOjEwcmVtO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6NzUlO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO3BhZGRpbmc6LjI1ZW0gLjZlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXB9ZGV0YWlsc3ttYXJnaW4tYm90dG9tOjFyZW19c3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LWZlYXR1cmUtc2V0dGluZ3M6XFxcInRudW1cXFwiO2ZvbnQtd2VpZ2h0OjcwMDtsZXR0ZXItc3BhY2luZzouMWVtO3BhZGRpbmc6LjZyZW0gMXJlbX1kZXRhaWxzW29wZW5de3BhZGRpbmc6LjZyZW0gMXJlbSAuNzVyZW19ZGV0YWlsc1tvcGVuXSBzdW1tYXJ5e21hcmdpbi1ib3R0b206LjVyZW07cGFkZGluZzowfS5tb25zdGVyLW5vLXVzZXItc2VsZWN0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX1Aa2V5ZnJhbWVzIGRldGFpbHMtc2hvd3swJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41ZW0pfX1kZXRhaWxzW29wZW5dPjpub3Qoc3VtbWFyeSl7YW5pbWF0aW9uOmRldGFpbHMtc2hvdyAuMTVzIGVhc2UtaW4tb3V0fWRldGFpbHNbb3Blbl0+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5tb25vc3BhY2V7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseS1tb25vc3BhY2UpfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3V0bGluZTpub25lO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdLmZsZXh7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2t9OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJRdWlja3NhbmRcXFwiLFxcXCJTZWdvZSBVSVxcXCIsXFxcIlJvYm90b1xcXCIsXFxcIk94eWdlblxcXCIsXFxcIlVidW50dVxcXCIsXFxcIkNhbnRhcmVsbFxcXCIsXFxcIkZpcmEgU2Fuc1xcXCIsXFxcIkRyb2lkIFNhbnNcXFwiLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZixcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCI7LS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTpcXFwiQ29uc29sYXNcXFwiLFxcXCJDb3VyaWVyIE5ld1xcXCIsXFxcIlJvYm90byBNb25vXFxcIixcXFwiU291cmNlIENvZGUgUHJvXFxcIixcXFwiRmlyYSBNb25vXFxcIixtb25vc3BhY2U7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTQpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi02KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTIpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMyl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTYpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTIpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xOiM4MzNhYjQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTI6I2ZkMWQxZDstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMzojZmNiMDQ1Oy0tbW9uc3Rlci1ib3gtc2hhZG93LTE6bm9uZTstLW1vbnN0ZXItYm94LXNoYWRvdy0yOi0xcHggMXB4IDEwcHggMXB4IGhzbGEoMCwwJSw3NiUsLjYxKTstLW1vbnN0ZXItdGV4dC1zaGFkb3c6bm9uZTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTEpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTIpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aDoycHg7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXM6MDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci10aGVtZS1vbi1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLW9uLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci1ib3JkZXItd2lkdGg6M3B4Oy0tbW9uc3Rlci1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLW91dGxpbmUtd2lkdGg6MXB4Oy0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZTotNHB4Oy0tbW9uc3Rlci16LWluZGV4LWRlZmF1bHQ6MDstLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lOjEwOy0tbW9uc3Rlci16LWluZGV4LWRyb3Bkb3duOjIwMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bi1vdmVybGF5OjIxMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3k6MzAwOy0tbW9uc3Rlci16LWluZGV4LXN0aWNreS1vdmVybGF5OjMxMDstLW1vbnN0ZXItei1pbmRleC1maXhlZDo0MDA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQtb3ZlcmxheTo0MTA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtYmFja2Ryb3A6NTAwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wLW92ZXJsYXk6NTEwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhczo2MDA7LS1tb25zdGVyLXotaW5kZXgtb2ZmY2FudmFzLW92ZXJsYXk6NjEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsOjcwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5OjcxMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyOjgwMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyLW92ZXJsYXk6ODEwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXA6ODAwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXAtb3ZlcmxheTo5MTA7LS1tb25zdGVyLXNwYWNlLTA6MDstLW1vbnN0ZXItc3BhY2UtMToycHg7LS1tb25zdGVyLXNwYWNlLTI6NHB4Oy0tbW9uc3Rlci1zcGFjZS0zOjZweDstLW1vbnN0ZXItc3BhY2UtNDoxMHB4Oy0tbW9uc3Rlci1zcGFjZS01OjE2cHg7LS1tb25zdGVyLXNwYWNlLTY6MjZweDstLW1vbnN0ZXItc3BhY2UtNzo0MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTA6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNDo0ODBweDstLW1vbnN0ZXItYnJlYWtwb2ludC03Ojc2OHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTk6OTkycHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtMTI6MTIwMHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLXdpZHRoOjJweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGg6NHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLWhhbmRsZS1oZWlnaHQ6NTBweH1bZGF0YS1tb25zdGVyLXJvbGU9b3ZlcmxheV0uaGlkZS1lbXB0eXtkaXNwbGF5Om5vbmV9W2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXlde2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTIpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0yKTtoZWlnaHQ6MTAwJTtsZWZ0OjA7b3ZlcmZsb3cteDpoaWRkZW47cG9zaXRpb246Zml4ZWQ7dG9wOjA7dHJhbnNpdGlvbjouNXM7d2lkdGg6MDt6LWluZGV4OnZhcigtLW1vbnN0ZXItei1pbmRleC1vZmZjYW52YXMpfVtkYXRhLW1vbnN0ZXItcm9sZT1vdmVybGF5XSBbZGF0YS1tb25zdGVyLXJvbGU9b3ZlcmxheS1jbG9zZV17Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjQwcHg7bGVmdDoxMHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMHB4O3dpZHRoOjQwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXldIFtkYXRhLW1vbnN0ZXItcm9sZT1vdmVybGF5LWNsb3NlXTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlOy13ZWJraXQtbWFzay1pbWFnZTp1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nY3VycmVudENvbG9yJyB2aWV3Qm94PScwIDAgMTYgMTYnJTNFJTNDcGF0aCBkPSdNMi4xNDYgMi44NTRhLjUuNSAwIDEgMSAuNzA4LS43MDhMOCA3LjI5M2w1LjE0Ni01LjE0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsNS4xNDcgNS4xNDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC01LjE0NiA1LjE0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4eicvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTIuMTQ2IDIuODU0YS41LjUgMCAxIDEgLjcwOC0uNzA4TDggNy4yOTNsNS4xNDYtNS4xNDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDUuMTQ3IDUuMTQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtNS4xNDYgNS4xNDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOHonLyUzRSUzQy9zdmclM0VcXFwiKTstd2Via2l0LW1hc2stcG9zaXRpb246Y2VudGVyO21hc2stcG9zaXRpb246Y2VudGVyOy13ZWJraXQtbWFzay1yZXBlYXQ6bm8tcmVwZWF0O21hc2stcmVwZWF0Om5vLXJlcGVhdDstd2Via2l0LW1hc2stc2l6ZTpjb250YWluO21hc2stc2l6ZTpjb250YWluO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXktb3Blbl17Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjQwcHg7bGVmdDoxMHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMHB4O3dpZHRoOjQwcHh9W2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXktb3Blbl06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbnRlbnQ6XFxcIlxcXCI7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTstd2Via2l0LW1hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTEgMmExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFIMmExIDEgMCAwIDEtMS0xem01IDBhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDdhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMWgtMmExIDEgMCAwIDEtMS0xek0xIDdhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDJhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMUg3YTEgMSAwIDAgMS0xLTF6bTUgMGExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFoLTJhMSAxIDAgMCAxLTEtMXpNMSAxMmExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFIMmExIDEgMCAwIDEtMS0xem01IDBhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDdhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMWgtMmExIDEgMCAwIDEtMS0xeicvJTNFJTNDL3N2ZyUzRVxcXCIpO21hc2staW1hZ2U6dXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIGZpbGw9J2N1cnJlbnRDb2xvcicgdmlld0JveD0nMCAwIDE2IDE2JyUzRSUzQ3BhdGggZD0nTTEgMmExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFIMmExIDEgMCAwIDEtMS0xem01IDBhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDdhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMWgtMmExIDEgMCAwIDEtMS0xek0xIDdhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDJhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMUg3YTEgMSAwIDAgMS0xLTF6bTUgMGExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFoLTJhMSAxIDAgMCAxLTEtMXpNMSAxMmExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFIMmExIDEgMCAwIDEtMS0xem01IDBhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDdhMSAxIDAgMCAxLTEtMXptNSAwYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMWgtMmExIDEgMCAwIDEtMS0xeicvJTNFJTNDL3N2ZyUzRVxcXCIpOy13ZWJraXQtbWFzay1wb3NpdGlvbjpjZW50ZXI7bWFzay1wb3NpdGlvbjpjZW50ZXI7LXdlYmtpdC1tYXNrLXJlcGVhdDpuby1yZXBlYXQ7bWFzay1yZXBlYXQ6bm8tcmVwZWF0Oy13ZWJraXQtbWFzay1zaXplOmNvbnRhaW47bWFzay1zaXplOmNvbnRhaW47d2lkdGg6MTAwJX1bZGF0YS1tb25zdGVyLXJvbGU9b3ZlcmxheV0ub3Blbnt3aWR0aDoxMDAlfSBcbn1gLFxuXHRcdDAsXG5cdCk7XG59IGNhdGNoIChlKSB7XG5cdGFkZEF0dHJpYnV0ZVRva2VuKFxuXHRcdGRvY3VtZW50LmdldFJvb3ROb2RlKCkucXVlcnlTZWxlY3RvcihcImh0bWxcIiksXG5cdFx0QVRUUklCVVRFX0VSUk9STUVTU0FHRSxcblx0XHRlICsgXCJcIixcblx0KTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQge1xuXHRhc3NlbWJsZU1ldGhvZFN5bWJvbCxcblx0Q3VzdG9tRWxlbWVudCxcblx0cmVnaXN0ZXJDdXN0b21FbGVtZW50LFxufSBmcm9tIFwiLi4vLi4vZG9tL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5pbXBvcnQgXCIuLi9ub3RpZnkvbm90aWZ5Lm1qc1wiO1xuaW1wb3J0IHsgT3ZlcmxheVN0eWxlU2hlZXQgfSBmcm9tIFwiLi9zdHlsZXNoZWV0L292ZXJsYXkubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfUk9MRSB9IGZyb20gXCIuLi8uLi9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtcblx0ZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQsXG5cdGZpcmVDdXN0b21FdmVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9ldmVudHMubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IE92ZXJsYXkgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgb3ZlcmxheUVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJvdmVybGF5RWxlbWVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgb3ZlcmxheUNsb3NlRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcIm92ZXJsYXlDbG9zZXJFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBvdmVybGF5T3BlbkVsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJvdmVybGF5T3BlbkVsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNsb3NlRXZlbnRIYW5kbGVyU3ltYm9sID0gU3ltYm9sKFwiY2xvc2VFdmVudEhhbmRsZXJcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG9wZW5FdmVudEhhbmRsZXJTeW1ib2wgPSBTeW1ib2woXCJvcGVuRXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfVkFMVUVfT1ZFUkxBWV9PUEVOID0gXCJvdmVybGF5LW9wZW5cIjtcblxuLyoqXG4gKiBUaGUgT3ZlcmxheSBjb21wb25lbnQgaXMgdXNlZCB0byBzaG93IGFuIG92ZXJsYXkgYW5kIGEgYnV0dG9uIHRvIG9wZW4gdGhlIG92ZXJsYXkuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltYWdlcy9vdmVybGF5LnBuZ1wiPlxuICpcbiAqIERlcGVuZGVuY2llczogdGhlIHN5c3RlbSB1c2VzIGZ1bmN0aW9ucyBvZiB0aGUgW21vbnN0ZXJqc10oaHR0cHM6Ly9tb25zdGVyanMub3JnLykgbGlicmFyeVxuICpcbiAqIFlvdSBjYW4gY3JlYXRlIHRoaXMgY29udHJvbCBlaXRoZXIgYnkgc3BlY2lmeWluZyB0aGUgSFRNTCB0YWcgPG1vbnN0ZXItb3ZlcmxheSAvPmAgZGlyZWN0bHkgaW4gdGhlIEhUTUwgb3IgdXNpbmdcbiAqIEphdmFzY3JpcHQgdmlhIHRoZSBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1vdmVybGF5Jyk7YCBtZXRob2QuXG4gKlxuICogYGBgaHRtbFxuICogPG1vbnN0ZXItb3ZlcmxheT48L21vbnN0ZXItb3ZlcmxheT5cbiAqIGBgYFxuICpcbiAqIE9yIHlvdSBjYW4gY3JlYXRlIHRoaXMgQ3VzdG9tQ29udHJvbCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0OlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgJ0BzY2h1a2FpL2NvbXBvbmVudC1zdGF0ZS9zb3VyY2Uvb3ZlcmxheS5tanMnO1xuICogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1vdmVybGF5Jyk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgQm9keSBzaG91bGQgaGF2ZSBhIGNsYXNzIFwiaGlkZGVuXCIgdG8gZW5zdXJlIHRoYXQgdGhlIHN0eWxlcyBhcmUgYXBwbGllZCBjb3JyZWN0bHkuXG4gKlxuICogYGBgY3NzXG4gKiBib2R5LmhpZGRlbiB7XG4gKiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAc3RhcnR1bWwgb3ZlcmxheS5wbmdcbiAqIHNraW5wYXJhbSBtb25vY2hyb21lIHRydWVcbiAqIHNraW5wYXJhbSBzaGFkb3dpbmcgZmFsc2VcbiAqIEhUTUxFbGVtZW50IDx8LS0gQ3VzdG9tRWxlbWVudFxuICogQ3VzdG9tRWxlbWVudCA8fC0tIEN1c3RvbUNvbnRyb2xcbiAqIEN1c3RvbUNvbnRyb2wgPHwtLSBPdmVybGF5XG4gKiBAZW5kdW1sXG4gKlxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgc2ltcGxlIG92ZXJsYXkgY29tcG9uZW50XG4gKiBAZmlyZXMgbW9uc3Rlci1vdmVybGF5LWJlZm9yZS1vcGVuXG4gKiBAZmlyZXMgbW9uc3Rlci1vdmVybGF5LW9wZW5cbiAqIEBmaXJlcyBtb25zdGVyLW92ZXJsYXktYmVmb3JlLWNsb3NlXG4gKiBAZmlyZXMgbW9uc3Rlci1vdmVybGF5LWNsb3NlZFxuICovXG5jbGFzcyBPdmVybGF5IGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2hvc3Qvb3ZlcmxheUBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCB0YWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb250YWluZXIgQ29udGFpbmVyIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7YXJyYXl9IGNvbnRhaW5lciBDb250YWluZXIgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRhaW5lcltdLm5hbWUgTmFtZSBvZiB0aGUgY29udGFpbmVyXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250YWluZXJbXS5jb250ZW50IENvbnRlbnQgb2YgdGhlIGNvbnRhaW5lclxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGFpbmVyW10uY2xhc3MgQ3NzIGNsYXNzIG9mIHRoZSBjb250YWluZXJcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGNsYXNzZXMgQ3NzIGNsYXNzZXNcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzZXMuYm9keSBDc3MgY2xhc3MgdG8gaGlkZSB0aGUgYm9keS4gVGhpcyBjbGFzcyBpcyByZW1vdmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeS5cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzZXMub3ZlcmxheSBDc3MgY2xhc3MgdG8gaGlkZSB0aGUgb3ZlcmxheS4gVGhpcyBjbGFzcyBpcyByZW1vdmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeS5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZlYXR1cmVzIEZlYXR1cmUgZGVmaW5pdGlvbnNcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy5lc2NhcGVLZXkgSWYgdHJ1ZSB0aGUgb3ZlcmxheSBjYW4gYmUgY2xvc2VkIHdpdGggdGhlIGVzY2FwZSBrZXlcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy5vcGVuQnV0dG9uIElmIHRydWUgdGhlIG92ZXJsYXkgY2FuIGJlIG9wZW5lZCB3aXRoIGEgYnV0dG9uXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHR0ZW1wbGF0ZXM6IHtcblx0XHRcdFx0bWFpbjogZ2V0VGVtcGxhdGUoKSxcblx0XHRcdH0sXG5cdFx0XHRvdmVybGF5OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcImNvbnRlbnRcIixcblx0XHRcdFx0XHRjb250ZW50OiBcIjxzbG90Pjwvc2xvdD5cIixcblx0XHRcdFx0XHRjbGFzczogXCJcIixcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0XHRjbGFzc2VzOiB7XG5cdFx0XHRcdGJvZHk6IFwiaGlkZGVuXCIsXG5cdFx0XHRcdG92ZXJsYXk6IFwiaGlkZS1lbXB0eVwiLFxuXHRcdFx0fSxcblx0XHRcdGZlYXR1cmVzOiB7XG5cdFx0XHRcdGVzY2FwZUtleTogdHJ1ZSxcblx0XHRcdFx0b3BlbkJ1dHRvbjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cblx0XHQvKipcblx0XHQgKiBzaG93IHRoZSBzY3JvbGwgYmFyIGFsd2F5c1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICovXG5cdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwic2Nyb2xsXCI7XG5cblx0XHRjb25zdCBjbGFzc05hbWVzID0gdGhpcy5nZXRPcHRpb24oXCJjbGFzc2VzLmJvZHlcIik7XG5cblx0XHRpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lcykpIHtcblx0XHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkhvc3QuT3ZlcmxheX1cblx0ICovXG5cdFthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKSB7XG5cdFx0c3VwZXJbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCk7XG5cblx0XHRpbml0Q29udHJvbFJlZmVyZW5jZXMuY2FsbCh0aGlzKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkhvc3QuT3ZlcmxheX1cblx0ICovXG5cdHRvZ2dsZSgpIHtcblx0XHRpZiAodGhpc1tvdmVybGF5RWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmNvbnRhaW5zKFwib3BlblwiKSkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm9wZW4oKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7TW9uc3Rlci5Db21wb25lbnRzLkhvc3QuT3ZlcmxheX1cblx0ICogQGZpcmVzIG1vbnN0ZXItb3ZlcmxheS1iZWZvcmUtb3BlblxuXHQgKiBAZmlyZXMgbW9uc3Rlci1vdmVybGF5LW9wZW5cblx0ICogQGZpcmVzIG1vbnN0ZXItb3ZlcmxheS1iZWZvcmUtY2xvc2Vcblx0ICogQGZpcmVzIG1vbnN0ZXItb3ZlcmxheS1jbG9zZWRcblx0ICovXG5cdG9wZW4oKSB7XG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1vdmVybGF5LWJlZm9yZS1vcGVuXCIsIHt9KTtcblxuXHRcdHRoaXNbb3ZlcmxheUVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRlLWVtcHR5XCIpO1xuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzW292ZXJsYXlFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuYWRkKFwib3BlblwiKTtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLW92ZXJsYXktb3BlblwiLCB7fSk7XG5cdFx0XHR9LCAwKTtcblx0XHR9LCAwKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge01vbnN0ZXIuQ29tcG9uZW50cy5Ib3N0Lk92ZXJsYXl9XG5cdCAqL1xuXHRjbG9zZSgpIHtcblx0XHRmaXJlQ3VzdG9tRXZlbnQodGhpcywgXCJtb25zdGVyLW92ZXJsYXktYmVmb3JlLWNsb3NlXCIsIHt9KTtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXNbb3ZlcmxheUVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGZpcmVDdXN0b21FdmVudCh0aGlzLCBcIm1vbnN0ZXItb3ZlcmxheS1jbG9zZWRcIiwge30pO1xuXHRcdFx0fSwgMCk7XG5cdFx0fSwgMCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIGdldFRhZygpIHtcblx0XHRyZXR1cm4gXCJtb25zdGVyLW92ZXJsYXlcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0W119XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRyZXR1cm4gW092ZXJsYXlTdHlsZVNoZWV0XTtcblx0fVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtTZWxlY3R9XG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFxuICovXG5mdW5jdGlvbiBpbml0Q29udHJvbFJlZmVyZW5jZXMoKSB7XG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdHRoaXNbb3ZlcmxheUVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKFwib3ZlcmxheVwiKTtcblx0dGhpc1tvdmVybGF5Q2xvc2VFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXktY2xvc2VdXCIsXG5cdCk7XG5cdHRoaXNbb3ZlcmxheU9wZW5FbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPW92ZXJsYXktb3Blbl1cIixcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyKCkge1xuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICovXG5cdHRoaXNbY2xvc2VFdmVudEhhbmRsZXJTeW1ib2xdID0gKGV2ZW50KSA9PiB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9O1xuXG5cdHRoaXNbb3ZlcmxheUNsb3NlRWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcImNsaWNrXCIsXG5cdFx0dGhpc1tjbG9zZUV2ZW50SGFuZGxlclN5bWJvbF0sXG5cdCk7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqL1xuXHR0aGlzW29wZW5FdmVudEhhbmRsZXJTeW1ib2xdID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHRBVFRSSUJVVEVfUk9MRSxcblx0XHRcdEFUVFJJQlVURV9WQUxVRV9PVkVSTEFZX09QRU4sXG5cdFx0KTtcblx0XHRpZiAoZWxlbWVudCkge1xuXHRcdFx0dGhpcy5vcGVuKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXNbb3BlbkV2ZW50SGFuZGxlclN5bWJvbF0pO1xuXG5cdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLmVzY2FwZUtleVwiKSA9PT0gdHJ1ZSkge1xuXHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG5cdFx0XHRcdGNvbnN0IGlzTm90Q29tYmluZWRLZXkgPSAhKFxuXHRcdFx0XHRcdGV2ZW50LmN0cmxLZXkgfHxcblx0XHRcdFx0XHRldmVudC5hbHRLZXkgfHxcblx0XHRcdFx0XHRldmVudC5zaGlmdEtleVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoaXNOb3RDb21iaW5lZEtleSkge1xuXHRcdFx0XHRcdHRoaXMudG9nZ2xlT3ZlcmxheSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8dGVtcGxhdGUgaWQ9XCJob3N0LW92ZXJsYXlcIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmhvc3Qtb3ZlcmxheS5jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJwYXJ0IHBhdGg6aG9zdC1vdmVybGF5Lm5hbWUsIGRhdGEtbW9uc3Rlci1yb2xlIHBhdGg6aG9zdC1jb250YWluZXIub3ZlcmxheVwiPjwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJvdmVybGF5LW9wZW5cIiBwYXJ0PVwib3BlblwiXG5cdFx0XHQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmZlYXR1cmVzLm9wZW5CdXR0b24gfCBpZjp2aXNpYmxlOmhpZGRlblwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJvdmVybGF5XCIgZGF0YS1tb25zdGVyLXJvbGU9XCJvdmVybGF5XCIgcGFydD1cIm92ZXJsYXlcIiBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwiaG9zdC1vdmVybGF5IHBhdGg6b3ZlcmxheVwiXG4gICAgICAgICAgICAgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmNsYXNzZXMub3ZlcmxheVwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cIm92ZXJsYXktY2xvc2VcIiBwYXJ0PVwiY2xvc2VcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbn1cblxucmVnaXN0ZXJDdXN0b21FbGVtZW50KE92ZXJsYXkpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gXCIuLi8uLi9kb20vdXRpbC5tanNcIjtcblxuZXhwb3J0IHsgZ2VuZXJhdGVVbmlxdWVDb25maWdLZXkgfTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSBjb25maWd1cmF0aW9uIGtleSBiYXNlZCBvbiB0aGUgY3VycmVudCBicm93c2VyIGxvY2F0aW9uLFxuICogY29tcG9uZW50IG5hbWUsIGlkLCBhbmQgYSBwcmVmaXguXG4gKlxuICogQHNpbmNlIDMuNTUuMCB0aGUgZnVuY3Rpb24gcmVtb3ZlIHRoZSBoYXNoIGZyb20gdGhlIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gQSBwcmVmaXggdG8gdXNlIGluIHRoZSB1bmlxdWUga2V5LlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHVuaXF1ZSBjb25maWd1cmF0aW9uIGtleS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVVbmlxdWVDb25maWdLZXkoY29tcG9uZW50TmFtZSwgaWQsIHByZWZpeCkge1xuXHQvLyBHZXQgdGhlIGJyb3dzZXIgbG9jYXRpb24gd2l0aG91dCBwYXJhbWV0ZXJzXG5cdGNvbnN0IHVybFdpdGhvdXRQYXJhbXMgPSBnZXRXaW5kb3coKS5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiP1wiKVswXTtcblxuXHQvLyBXaXRob3V0IGhhc2ggKHNpbmNlIDMuNTUuMClcblx0Y29uc3QgdXJsV2l0aG91dFBhcmFtc0FuZEhhc2ggPSB1cmxXaXRob3V0UGFyYW1zLnNwbGl0KFwiI1wiKVswXTtcblxuXHQvLyBDb21iaW5lIHRoZSBwYXJ0cyB0byBjcmVhdGUgYSB1bmlxdWUga2V5XG5cdGNvbnN0IHVuaXF1ZUtleSA9IGAke3ByZWZpeH1fJHt1cmxXaXRob3V0UGFyYW1zQW5kSGFzaH1fJHtjb21wb25lbnROYW1lfV8ke2lkfWA7XG5cblx0Ly8gUmVwbGFjZSBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBzcGFjZXMgd2l0aCB1bmRlcnNjb3Jlc1xuXHRyZXR1cm4gdW5pcXVlS2V5LnJlcGxhY2UoL1teXFx3XFxzXS9naSwgXCJfXCIpLnJlcGxhY2UoL1xccysvZywgXCJfXCIpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IERldGFpbHNTdHlsZVNoZWV0IH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtDU1NTdHlsZVNoZWV0fVxuICovXG5jb25zdCBEZXRhaWxzU3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7XG5cbnRyeSB7XG5cdERldGFpbHNTdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIGRldGFpbHMgeyBcbjp3aGVyZShodG1sKXtsaW5lLWhlaWdodDoxLjE1Oy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tb3otdGV4dC1zaXplLWFkanVzdDoxMDAlO3RleHQtc2l6ZS1hZGp1c3Q6MTAwJX06d2hlcmUoaDEpe2ZvbnQtc2l6ZToyZW07bWFyZ2luLWJsb2NrLWVuZDouNjdlbTttYXJnaW4tYmxvY2stc3RhcnQ6LjY3ZW19OndoZXJlKGRsLG9sLHVsKSA6d2hlcmUoZGwsb2wsdWwpe21hcmdpbi1ibG9jay1lbmQ6MDttYXJnaW4tYmxvY2stc3RhcnQ6MH06d2hlcmUoaHIpe2JveC1zaXppbmc6Y29udGVudC1ib3g7Y29sb3I6aW5oZXJpdDtoZWlnaHQ6MH06d2hlcmUoYWJiclt0aXRsZV0pe3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZH06d2hlcmUoYixzdHJvbmcpe2ZvbnQtd2VpZ2h0OmJvbGRlcn06d2hlcmUoY29kZSxrYmQscHJlLHNhbXApe2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2U7Zm9udC1zaXplOjFlbX06d2hlcmUoc21hbGwpe2ZvbnQtc2l6ZTo4MCV9OndoZXJlKHRhYmxlKXtib3JkZXItY29sb3I6Y3VycmVudENvbG9yO3RleHQtaW5kZW50OjB9OndoZXJlKGJ1dHRvbixpbnB1dCxzZWxlY3Qpe21hcmdpbjowfTp3aGVyZShidXR0b24pe3RleHQtdHJhbnNmb3JtOm5vbmV9OndoZXJlKGJ1dHRvbixpbnB1dDppcyhbdHlwZT1idXR0b24gaV0sW3R5cGU9cmVzZXQgaV0sW3R5cGU9c3VibWl0IGldKSl7LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn06d2hlcmUocHJvZ3Jlc3Mpe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfTp3aGVyZShzZWxlY3Qpe3RleHQtdHJhbnNmb3JtOm5vbmV9OndoZXJlKHRleHRhcmVhKXttYXJnaW46MH06d2hlcmUoaW5wdXRbdHlwZT1zZWFyY2ggaV0pey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjppbmhlcml0O29wYWNpdHk6LjU0fTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fTp3aGVyZShidXR0b24saW5wdXQ6aXMoW3R5cGU9YnV0dG9uIGldLFt0eXBlPWNvbG9yIGldLFt0eXBlPXJlc2V0IGldLFt0eXBlPXN1Ym1pdCBpXSkpOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH06d2hlcmUoYnV0dG9uLGlucHV0OmlzKFt0eXBlPWJ1dHRvbiBpXSxbdHlwZT1jb2xvciBpXSxbdHlwZT1yZXNldCBpXSxbdHlwZT1zdWJtaXQgaV0pKTo6LW1vei1mb2N1c3Jpbmd7b3V0bGluZToxcHggZG90dGVkIEJ1dHRvblRleHR9OndoZXJlKDotbW96LXVpLWludmFsaWQpe2JveC1zaGFkb3c6bm9uZX06d2hlcmUoZGlhbG9nKXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOnNvbGlkO2NvbG9yOiMwMDA7aGVpZ2h0Oi1tb3otZml0LWNvbnRlbnQ7aGVpZ2h0OmZpdC1jb250ZW50O2xlZnQ6MDttYXJnaW46YXV0bztwYWRkaW5nOjFlbTtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3dpZHRoOi1tb3otZml0LWNvbnRlbnQ7d2lkdGg6Zml0LWNvbnRlbnR9OndoZXJlKGRpYWxvZzpub3QoW29wZW5dKSl7ZGlzcGxheTpub25lfTp3aGVyZShzdW1tYXJ5KXtkaXNwbGF5Omxpc3QtaXRlbX1odG1se2hlaWdodDoxMDAlfWJvZHksaHRtbHttaW4taGVpZ2h0OmNhbGMoMTAwdmggLSA0MHB4KX1ib2R5e2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDtwYWRkaW5nOjA7d29yZC1icmVhazpicmVhay13b3JkfWJvZHk6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOm5vbmV9OmZvY3VzLXZpc2libGV7b3V0bGluZTpub25lfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9ja30uZ3JpZHtkaXNwbGF5OmdyaWR9LmlubGluZS1ncmlke2Rpc3BsYXk6aW5saW5lLWdyaWR9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS5oaWRkZW4sLmhpZGUsLm5vbmV7ZGlzcGxheTpub25lfS52aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZX0uaW52aXNpYmxle3Zpc2liaWxpdHk6aGlkZGVufS5tb25zdGVyLWJ1dHRvbi1wcmltYXJ5LGJ1dHRvbnthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofS5tb25zdGVyLWJ1dHRvbi1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLXNlY29uZGFyeSwubW9uc3Rlci1idXR0b24tdGVydGlhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tdGVydGlhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1idXR0b24tb3V0bGluZS1wcmltYXJ5LC5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXNlY29uZGFyeXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofS5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00KX0ubW9uc3Rlci1idXR0b24tb3V0bGluZS10ZXJ0aWFyeXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQpO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JvcmRlci1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNCk7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OnZhcigtLW1vbnN0ZXItZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtnYXA6LjRyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7b3V0bGluZTpub25lO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6LXdlYmtpdC1maWxsLWF2YWlsYWJsZTt3aWR0aDotbW96LWF2YWlsYWJsZTt3aWR0aDpzdHJldGNofWJ1dHRvbjphY3RpdmUsYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTIpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuOHMsY29sb3IgLjI1cyAuMDgzMzMzMzMzM3N9YnV0dG9uOmFjdGl2ZXt6LWluZGV4OnZhcigtLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lKX0ubW9uc3Rlci1idXR0b24tYmFyLC5tb25zdGVyLWJ1dHRvbi1ncm91cHthbGlnbi1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOm5vd3JhcDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ubW9uc3Rlci1idXR0b24tZ3JvdXB7Ym94LXNpemluZzpib3JkZXItYm94O2dhcDowO21hcmdpbjoxcmVtIDB9Lm1vbnN0ZXItYnV0dG9uLWdyb3VwPjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDpjYWxjKHZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKSotMSl9Lm1vbnN0ZXItYnV0dG9uLWdyb3VwIDpob3Zlcntib3gtc2hhZG93Om5vbmV9YnV0dG9uOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00KTtvdXRsaW5lLW9mZnNldDoycHg7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpsaWdodCl7YnV0dG9uOmZvY3Vze291dGxpbmU6MXB4IGRhc2hlZCB2YXIoLS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zKTtvdXRsaW5lLW9mZnNldDoycHg7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9fVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3V0bGluZTpub25lO3dpZHRoOjEwMCV9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdLmZsZXh7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Omhvc3R7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2t9OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJRdWlja3NhbmRcXFwiLFxcXCJTZWdvZSBVSVxcXCIsXFxcIlJvYm90b1xcXCIsXFxcIk94eWdlblxcXCIsXFxcIlVidW50dVxcXCIsXFxcIkNhbnRhcmVsbFxcXCIsXFxcIkZpcmEgU2Fuc1xcXCIsXFxcIkRyb2lkIFNhbnNcXFwiLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZixcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCI7LS1tb25zdGVyLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTpcXFwiQ29uc29sYXNcXFwiLFxcXCJDb3VyaWVyIE5ld1xcXCIsXFxcIlJvYm90byBNb25vXFxcIixcXFwiU291cmNlIENvZGUgUHJvXFxcIixcXFwiRmlyYSBNb25vXFxcIixtb25vc3BhY2U7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWNpbm5hbW9uLTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNCk7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWRlc3RydWN0aXZlLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWRlc3RydWN0aXZlLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTQpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi02KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTIpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMyl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTYpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0zOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTIpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS00KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItY29sb3ItZXJyb3ItMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3ItZXJyb3ItNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMTp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KTstLW1vbnN0ZXItYmctY29sb3ItZXJyb3ItMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMzp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMyk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktZGlzYWJsZWQtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0xOiM4MzNhYjQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTI6I2ZkMWQxZDstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMzojZmNiMDQ1Oy0tbW9uc3Rlci1ib3gtc2hhZG93LTE6bm9uZTstLW1vbnN0ZXItYm94LXNoYWRvdy0yOi0xcHggMXB4IDEwcHggMXB4IGhzbGEoMCwwJSw3NiUsLjYxKTstLW1vbnN0ZXItdGV4dC1zaGFkb3c6bm9uZTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTEpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC02KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTIpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci13aWR0aDoycHg7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1yYWRpdXM6MDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNil9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci10aGVtZS1vbi1iZy1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLXRoZW1lLW9uLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci10aGVtZS1vZmYtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTUpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItYm9yZGVyLXN0eWxlOnNvbGlkOy0tbW9uc3Rlci1ib3JkZXItd2lkdGg6M3B4Oy0tbW9uc3Rlci1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLW91dGxpbmUtd2lkdGg6MXB4Oy0tbW9uc3Rlci1wb3BwZXItd2l0aGFycnJvdy1kaXN0YW5jZTotNHB4Oy0tbW9uc3Rlci16LWluZGV4LWRlZmF1bHQ6MDstLW1vbnN0ZXItei1pbmRleC1vdXRsaW5lOjEwOy0tbW9uc3Rlci16LWluZGV4LWRyb3Bkb3duOjIwMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bi1vdmVybGF5OjIxMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3k6MzAwOy0tbW9uc3Rlci16LWluZGV4LXN0aWNreS1vdmVybGF5OjMxMDstLW1vbnN0ZXItei1pbmRleC1maXhlZDo0MDA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQtb3ZlcmxheTo0MTA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtYmFja2Ryb3A6NTAwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wLW92ZXJsYXk6NTEwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhczo2MDA7LS1tb25zdGVyLXotaW5kZXgtb2ZmY2FudmFzLW92ZXJsYXk6NjEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsOjcwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1vdmVybGF5OjcxMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyOjgwMDstLW1vbnN0ZXItei1pbmRleC1wb3BvdmVyLW92ZXJsYXk6ODEwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXA6ODAwOy0tbW9uc3Rlci16LWluZGV4LXRvb2x0aXAtb3ZlcmxheTo5MTA7LS1tb25zdGVyLXNwYWNlLTA6MDstLW1vbnN0ZXItc3BhY2UtMToycHg7LS1tb25zdGVyLXNwYWNlLTI6NHB4Oy0tbW9uc3Rlci1zcGFjZS0zOjZweDstLW1vbnN0ZXItc3BhY2UtNDoxMHB4Oy0tbW9uc3Rlci1zcGFjZS01OjE2cHg7LS1tb25zdGVyLXNwYWNlLTY6MjZweDstLW1vbnN0ZXItc3BhY2UtNzo0MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTA6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNDo0ODBweDstLW1vbnN0ZXItYnJlYWtwb2ludC03Ojc2OHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTk6OTkycHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtMTI6MTIwMHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLXdpZHRoOjJweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtd2lkdGg6NHB4Oy0tbW9uc3Rlci1kcmFnZ2VyLWhhbmRsZS1oZWlnaHQ6NTBweH1zcGFuLm1vbnN0ZXItZngtcmlwcGxle2FuaW1hdGlvbjptb25zdGVyLWZ4LXJpcHBsZSAuNnMgbGluZWFyO2JhY2tncm91bmQtY29sb3I6aHNsYSgwLDAlLDEwMCUsLjcpO2JvcmRlci1yYWRpdXM6NTAlO3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybTpzY2FsZSgwKX1Aa2V5ZnJhbWVzIG1vbnN0ZXItZngtcmlwcGxle3Rve29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoNCl9fVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEFUVFJJQlVURV9QUkVGSVggfSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuLyoqXG4gKiBUaGlzIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLWJ1dHRvbi1sYWJlbGAgY2FuIGJlIHVzZWQgdG8gcGFzcyBsYWJlbHMuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX0JVVFRPTl9MQUJFTCA9IGAke0FUVFJJQlVURV9QUkVGSVh9YnV0dG9uLWxhYmVsYDtcblxuZXhwb3J0IHsgQVRUUklCVVRFX0JVVFRPTl9MQUJFTCB9O1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywgMjAyNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKi9cblxuaW1wb3J0IHsgYWRkQXR0cmlidXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQgeyBBVFRSSUJVVEVfRVJST1JNRVNTQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IENvbGxhcHNlU3R5bGVTaGVldCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Q1NTU3R5bGVTaGVldH1cbiAqL1xuY29uc3QgQ29sbGFwc2VTdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcblxudHJ5IHtcblx0Q29sbGFwc2VTdHlsZVNoZWV0Lmluc2VydFJ1bGUoXG5cdFx0YFxuQGxheWVyIGNvbGxhcHNlIHsgXG46d2hlcmUoaHRtbCl7bGluZS1oZWlnaHQ6MS4xNTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbW96LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTt0ZXh0LXNpemUtYWRqdXN0OjEwMCV9OndoZXJlKGgxKXtmb250LXNpemU6MmVtO21hcmdpbi1ibG9jay1lbmQ6LjY3ZW07bWFyZ2luLWJsb2NrLXN0YXJ0Oi42N2VtfTp3aGVyZShkbCxvbCx1bCkgOndoZXJlKGRsLG9sLHVsKXttYXJnaW4tYmxvY2stZW5kOjA7bWFyZ2luLWJsb2NrLXN0YXJ0OjB9OndoZXJlKGhyKXtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2NvbG9yOmluaGVyaXQ7aGVpZ2h0OjB9OndoZXJlKGFiYnJbdGl0bGVdKXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9OndoZXJlKGIsc3Ryb25nKXtmb250LXdlaWdodDpib2xkZXJ9OndoZXJlKGNvZGUsa2JkLHByZSxzYW1wKXtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19OndoZXJlKHNtYWxsKXtmb250LXNpemU6ODAlfTp3aGVyZSh0YWJsZSl7Ym9yZGVyLWNvbG9yOmN1cnJlbnRDb2xvcjt0ZXh0LWluZGVudDowfTp3aGVyZShidXR0b24saW5wdXQsc2VsZWN0KXttYXJnaW46MH06d2hlcmUoYnV0dG9uKXt0ZXh0LXRyYW5zZm9ybTpub25lfTp3aGVyZShidXR0b24saW5wdXQ6aXMoW3R5cGU9YnV0dG9uIGldLFt0eXBlPXJlc2V0IGldLFt0eXBlPXN1Ym1pdCBpXSkpey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b259OndoZXJlKHByb2dyZXNzKXt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX06d2hlcmUoc2VsZWN0KXt0ZXh0LXRyYW5zZm9ybTpub25lfTp3aGVyZSh0ZXh0YXJlYSl7bWFyZ2luOjB9OndoZXJlKGlucHV0W3R5cGU9c2VhcmNoIGldKXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO291dGxpbmUtb2Zmc2V0Oi0ycHh9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b306Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6aW5oZXJpdDtvcGFjaXR5Oi41NH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH06d2hlcmUoYnV0dG9uLGlucHV0OmlzKFt0eXBlPWJ1dHRvbiBpXSxbdHlwZT1jb2xvciBpXSxbdHlwZT1yZXNldCBpXSxbdHlwZT1zdWJtaXQgaV0pKTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXItc3R5bGU6bm9uZTtwYWRkaW5nOjB9OndoZXJlKGJ1dHRvbixpbnB1dDppcyhbdHlwZT1idXR0b24gaV0sW3R5cGU9Y29sb3IgaV0sW3R5cGU9cmVzZXQgaV0sW3R5cGU9c3VibWl0IGldKSk6Oi1tb3otZm9jdXNyaW5ne291dGxpbmU6MXB4IGRvdHRlZCBCdXR0b25UZXh0fTp3aGVyZSg6LW1vei11aS1pbnZhbGlkKXtib3gtc2hhZG93Om5vbmV9OndoZXJlKGRpYWxvZyl7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjpzb2xpZDtjb2xvcjojMDAwO2hlaWdodDotbW96LWZpdC1jb250ZW50O2hlaWdodDpmaXQtY29udGVudDtsZWZ0OjA7bWFyZ2luOmF1dG87cGFkZGluZzoxZW07cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt3aWR0aDotbW96LWZpdC1jb250ZW50O3dpZHRoOmZpdC1jb250ZW50fTp3aGVyZShkaWFsb2c6bm90KFtvcGVuXSkpe2Rpc3BsYXk6bm9uZX06d2hlcmUoc3VtbWFyeSl7ZGlzcGxheTpsaXN0LWl0ZW19aHRtbHtoZWlnaHQ6MTAwJX1ib2R5LGh0bWx7bWluLWhlaWdodDpjYWxjKDEwMHZoIC0gNDBweCl9Ym9keXtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7cGFkZGluZzowO3dvcmQtYnJlYWs6YnJlYWstd29yZH1ib2R5OmZvY3VzLXZpc2libGV7b3V0bGluZTpub25lfTpmb2N1cy12aXNpYmxle291dGxpbmU6bm9uZX0uYmxvY2t7ZGlzcGxheTpibG9ja30uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmdyaWR7ZGlzcGxheTpncmlkfS5pbmxpbmUtZ3JpZHtkaXNwbGF5OmlubGluZS1ncmlkfS5mbGV4e2Rpc3BsYXk6ZmxleH0uaW5saW5lLWZsZXh7ZGlzcGxheTppbmxpbmUtZmxleH0uaGlkZGVuLC5oaWRlLC5ub25le2Rpc3BsYXk6bm9uZX0udmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0ubW9uc3Rlci1idXR0b24tcHJpbWFyeSxidXR0b257YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Ym94LXNoYWRvdzp2YXIoLS1tb25zdGVyLWJveC1zaGFkb3ctMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTQpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00KX0ubW9uc3Rlci1idXR0b24tc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbW9uc3Rlci1ib3JkZXItcmFkaXVzKTtib3JkZXItc3R5bGU6dmFyKC0tbW9uc3Rlci1ib3JkZXItc3R5bGUpO2JvcmRlci13aWR0aDp2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCk7Y29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1zZWNvbmRhcnksLm1vbnN0ZXItYnV0dG9uLXRlcnRpYXJ5e2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0xKTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7Zm9udC1mYW1pbHk6dmFyKC0tbW9uc3Rlci1mb250LWZhbWlseSk7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2dhcDouNHJlbTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTtvdXRsaW5lOm5vbmU7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6LjM3NXJlbSAuNzVyZW07cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aWR0aDotd2Via2l0LWZpbGwtYXZhaWxhYmxlO3dpZHRoOi1tb3otYXZhaWxhYmxlO3dpZHRoOnN0cmV0Y2h9Lm1vbnN0ZXItYnV0dG9uLXRlcnRpYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQpfS5tb25zdGVyLWJ1dHRvbi1vdXRsaW5lLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktNCk7Ym9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtcHJpbWFyeSwubW9uc3Rlci1idXR0b24tb3V0bGluZS1zZWNvbmRhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtcG9zaXRpb246NTAlO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH0ubW9uc3Rlci1idXR0b24tb3V0bGluZS1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS00KTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tb25zdGVyLWJvcmRlci1yYWRpdXMpO2JvcmRlci1zdHlsZTp2YXIoLS1tb25zdGVyLWJvcmRlci1zdHlsZSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1vbnN0ZXItYm9yZGVyLXdpZHRoKTtjb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXByaW1hcnktMSk7Y29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNCl9Lm1vbnN0ZXItYnV0dG9uLW91dGxpbmUtdGVydGlhcnl7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LTEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00KTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtib3JkZXItY29sb3I6dmFyKC0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00KTtib3JkZXItcmFkaXVzOnZhcigtLW1vbnN0ZXItYm9yZGVyLXJhZGl1cyk7Ym9yZGVyLXN0eWxlOnZhcigtLW1vbnN0ZXItYm9yZGVyLXN0eWxlKTtib3JkZXItd2lkdGg6dmFyKC0tbW9uc3Rlci1ib3JkZXItd2lkdGgpO2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTEpO2NvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKTtjb2xvcjp2YXIoLS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTQpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmb250LWZhbWlseTp2YXIoLS1tb25zdGVyLWZvbnQtZmFtaWx5KTtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7Z2FwOi40cmVtO2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MS41O291dGxpbmU6bm9uZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzouMzc1cmVtIC43NXJlbTtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOi13ZWJraXQtZmlsbC1hdmFpbGFibGU7d2lkdGg6LW1vei1hdmFpbGFibGU7d2lkdGg6c3RyZXRjaH1idXR0b246YWN0aXZlLGJ1dHRvbjpob3Zlcntib3gtc2hhZG93OnZhcigtLW1vbnN0ZXItYm94LXNoYWRvdy0yKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjhzLGNvbG9yIC4yNXMgLjA4MzMzMzMzMzNzfWJ1dHRvbjphY3RpdmV7ei1pbmRleDp2YXIoLS1tb25zdGVyLXotaW5kZXgtb3V0bGluZSl9Lm1vbnN0ZXItYnV0dG9uLWJhciwubW9uc3Rlci1idXR0b24tZ3JvdXB7YWxpZ24tY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDpub3dyYXA7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59Lm1vbnN0ZXItYnV0dG9uLWdyb3Vwe2JveC1zaXppbmc6Ym9yZGVyLWJveDtnYXA6MDttYXJnaW46MXJlbSAwfS5tb25zdGVyLWJ1dHRvbi1ncm91cD46bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tcmlnaHQ6Y2FsYyh2YXIoLS1tb25zdGVyLWJvcmRlci13aWR0aCkqLTEpfS5tb25zdGVyLWJ1dHRvbi1ncm91cCA6aG92ZXJ7Ym94LXNoYWRvdzpub25lfWJ1dHRvbjpmb2N1c3tvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNCk7b3V0bGluZS1vZmZzZXQ6MnB4O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW91dGxpbmUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6bGlnaHQpe2J1dHRvbjpmb2N1c3tvdXRsaW5lOjFweCBkYXNoZWQgdmFyKC0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMyk7b3V0bGluZS1vZmZzZXQ6MnB4O3otaW5kZXg6dmFyKC0tbW9uc3Rlci16LWluZGV4LW91dGxpbmUpfX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Ym94LXNpemluZzpib3JkZXItYm94O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXS5mbGV4e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fTpob3N0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrfTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1mb250LWZhbWlseTotYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxcXFwiUXVpY2tzYW5kXFxcIixcXFwiU2Vnb2UgVUlcXFwiLFxcXCJSb2JvdG9cXFwiLFxcXCJPeHlnZW5cXFwiLFxcXCJVYnVudHVcXFwiLFxcXCJDYW50YXJlbGxcXFwiLFxcXCJGaXJhIFNhbnNcXFwiLFxcXCJEcm9pZCBTYW5zXFxcIixcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLEFyaWFsLHNhbnMtc2VyaWYsXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIixcXFwiU2Vnb2UgVUkgRW1vamlcXFwiLFxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiOy0tbW9uc3Rlci1mb250LWZhbWlseS1tb25vc3BhY2U6XFxcIkNvbnNvbGFzXFxcIixcXFwiQ291cmllciBOZXdcXFwiLFxcXCJSb2JvdG8gTW9ub1xcXCIsXFxcIlNvdXJjZSBDb2RlIFByb1xcXCIsXFxcIkZpcmEgTW9ub1xcXCIsbW9ub3NwYWNlOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1jaW5uYW1vbi0xKTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItY2lubmFtb24tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXByaW1hcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNCl9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0zKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0zKTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNil9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXs6YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLXNlY29uZGFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1jb2xvci1zZWNvbmRhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC02KTstLW1vbnN0ZXItY29sb3Itc2Vjb25kYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3Itc2Vjb25kYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWJnLWNvbG9yLXNlY29uZGFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWNvbmRhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTE6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0yOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS00KTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMzp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNik7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTEpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTIpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS0xOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItY29sb3ItdGVydGlhcnktMjp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtNik7LS1tb25zdGVyLWNvbG9yLXRlcnRpYXJ5LTM6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTQpOy0tbW9uc3Rlci1jb2xvci10ZXJ0aWFyeS00OnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS00KTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWJnLWNvbG9yLXRlcnRpYXJ5LTI6dmFyKC0tbW9uc3Rlci1jb2xvci1tYWdlbnRhLTIpOy0tbW9uc3Rlci1iZy1jb2xvci10ZXJ0aWFyeS0zOnZhcigtLW1vbnN0ZXItY29sb3ItbWFnZW50YS0xKTstLW1vbnN0ZXItYmctY29sb3ItdGVydGlhcnktNDp2YXIoLS1tb25zdGVyLWNvbG9yLW1hZ2VudGEtMSl9fTphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTYpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0yKTstLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC01KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0xOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0yOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTMpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpOy0tbW9uc3Rlci1jb2xvci1kZXN0cnVjdGl2ZS00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0xOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpOy0tbW9uc3Rlci1iZy1jb2xvci1kZXN0cnVjdGl2ZS0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtMzp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC0xKTstLW1vbnN0ZXItYmctY29sb3ItZGVzdHJ1Y3RpdmUtNDp2YXIoLS1tb25zdGVyLWNvbG9yLXJlZC00KX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi00KTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNik7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0zKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMik7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci1jb2xvci1zdWNjZXNzLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0yKTstLW1vbnN0ZXItY29sb3Itc3VjY2Vzcy0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tNCk7LS1tb25zdGVyLWNvbG9yLXN1Y2Nlc3MtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zdWNjZXNzLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi01KTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItYmctY29sb3Itc3VjY2Vzcy0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JlZW4tMSk7LS1tb25zdGVyLWJnLWNvbG9yLXN1Y2Nlc3MtNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyZWVuLTMpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNCk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS02KTstLW1vbnN0ZXItY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTEpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMyk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctMzp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0yKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy00OnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctMTp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItY29sb3Itd2FybmluZy0yOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTMpOy0tbW9uc3Rlci1jb2xvci13YXJuaW5nLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtNCk7LS1tb25zdGVyLWNvbG9yLXdhcm5pbmctNDp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0xKTstLW1vbnN0ZXItYmctY29sb3Itd2FybmluZy0xOnZhcigtLW1vbnN0ZXItY29sb3Itb3JhbmdlLTUpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci13YXJuaW5nLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1vcmFuZ2UtMSk7LS1tb25zdGVyLWJnLWNvbG9yLXdhcm5pbmctNDp2YXIoLS1tb25zdGVyLWNvbG9yLW9yYW5nZS0zKX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWVycm9yLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWVycm9yLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNik7LS1tb25zdGVyLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTIpOy0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTUpfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWNvbG9yLWVycm9yLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWNvbG9yLWVycm9yLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMyk7LS1tb25zdGVyLWNvbG9yLWVycm9yLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNCk7LS1tb25zdGVyLWNvbG9yLWVycm9yLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtMSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1yZWQtNSk7LS1tb25zdGVyLWJnLWNvbG9yLWVycm9yLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci0zOnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTEpOy0tbW9uc3Rlci1iZy1jb2xvci1lcnJvci00OnZhcigtLW1vbnN0ZXItY29sb3ItcmVkLTQpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0yKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTI6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0zOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tMTp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLWNvbG9yLXNlbGVjdGlvbi0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KTstLW1vbnN0ZXItY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1jb2xvci1zZWxlY3Rpb24tNDp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi0xOnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1zZWxlY3Rpb24tMjp2YXIoLS1tb25zdGVyLWNvbG9yLXllbGxvdy0xKTstLW1vbnN0ZXItYmctY29sb3Itc2VsZWN0aW9uLTM6dmFyKC0tbW9uc3Rlci1jb2xvci15ZWxsb3ctMik7LS1tb25zdGVyLWJnLWNvbG9yLXNlbGVjdGlvbi00OnZhcigtLW1vbnN0ZXItY29sb3IteWVsbG93LTYpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KTstLW1vbnN0ZXItY29sb3ItcHJpbWFyeS1kaXNhYmxlZC00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0xOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0yKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC0zOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0zKTstLW1vbnN0ZXItYmctY29sb3ItcHJpbWFyeS1kaXNhYmxlZC00OnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS02KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTQpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTE6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTI6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTMpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTM6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTIpOy0tbW9uc3Rlci1iZy1jb2xvci1wcmltYXJ5LWRpc2FibGVkLTQ6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTEpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMTojODMzYWI0Oy0tbW9uc3Rlci1jb2xvci1ncmFkaWVudC0yOiNmZDFkMWQ7LS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTM6I2ZjYjA0NTstLW1vbnN0ZXItYm94LXNoYWRvdy0xOm5vbmU7LS1tb25zdGVyLWJveC1zaGFkb3ctMjotMXB4IDFweCAxMHB4IDFweCBoc2xhKDAsMCUsNzYlLC42MSk7LS1tb25zdGVyLXRleHQtc2hhZG93Om5vbmU7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC0xKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLXNlYXNoZWxsLTYpOy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWhvdmVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3Itc2Vhc2hlbGwtNik7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1zZWFzaGVsbC0yKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItd2lkdGg6MnB4Oy0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJvcmRlci1zdHlsZTpzb2xpZDstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ib3JkZXItcmFkaXVzOjA7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1jb250cm9sLWJnLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS01KTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtYm9yZGVyLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0zKTstLW1vbnN0ZXItdGhlbWUtY29udHJvbC1ob3Zlci1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktMSk7LS1tb25zdGVyLXRoZW1lLWNvbnRyb2wtaG92ZXItYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmF5LTYpfX06YWZ0ZXIsOmJlZm9yZSw6cm9vdHstLW1vbnN0ZXItdGhlbWUtb24tY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi0xKTstLW1vbnN0ZXItdGhlbWUtb24tYmctY29sb3I6dmFyKC0tbW9uc3Rlci1jb2xvci1ncmVlbi01KTstLW1vbnN0ZXItdGhlbWUtb2ZmLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS00KX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspezphZnRlciw6YmVmb3JlLDpyb290ey0tbW9uc3Rlci10aGVtZS1vbi1jb2xvcjp2YXIoLS1tb25zdGVyLWNvbG9yLWdyYXktNik7LS1tb25zdGVyLXRoZW1lLW9uLWJnLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtb2ZmLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS0xKTstLW1vbnN0ZXItdGhlbWUtb2ZmLWJnLWNvbG9yOnZhcigtLW1vbnN0ZXItY29sb3ItZ3JheS01KX19OmFmdGVyLDpiZWZvcmUsOnJvb3R7LS1tb25zdGVyLWJvcmRlci1zdHlsZTpzb2xpZDstLW1vbnN0ZXItYm9yZGVyLXdpZHRoOjNweDstLW1vbnN0ZXItYm9yZGVyLXJhZGl1czowOy0tbW9uc3Rlci1vdXRsaW5lLXdpZHRoOjFweDstLW1vbnN0ZXItcG9wcGVyLXdpdGhhcnJyb3ctZGlzdGFuY2U6LTRweDstLW1vbnN0ZXItei1pbmRleC1kZWZhdWx0OjA7LS1tb25zdGVyLXotaW5kZXgtb3V0bGluZToxMDstLW1vbnN0ZXItei1pbmRleC1kcm9wZG93bjoyMDA7LS1tb25zdGVyLXotaW5kZXgtZHJvcGRvd24tb3ZlcmxheToyMTA7LS1tb25zdGVyLXotaW5kZXgtc3RpY2t5OjMwMDstLW1vbnN0ZXItei1pbmRleC1zdGlja3ktb3ZlcmxheTozMTA7LS1tb25zdGVyLXotaW5kZXgtZml4ZWQ6NDAwOy0tbW9uc3Rlci16LWluZGV4LWZpeGVkLW92ZXJsYXk6NDEwOy0tbW9uc3Rlci16LWluZGV4LW1vZGFsLWJhY2tkcm9wOjUwMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbC1iYWNrZHJvcC1vdmVybGF5OjUxMDstLW1vbnN0ZXItei1pbmRleC1vZmZjYW52YXM6NjAwOy0tbW9uc3Rlci16LWluZGV4LW9mZmNhbnZhcy1vdmVybGF5OjYxMDstLW1vbnN0ZXItei1pbmRleC1tb2RhbDo3MDA7LS1tb25zdGVyLXotaW5kZXgtbW9kYWwtb3ZlcmxheTo3MTA7LS1tb25zdGVyLXotaW5kZXgtcG9wb3Zlcjo4MDA7LS1tb25zdGVyLXotaW5kZXgtcG9wb3Zlci1vdmVybGF5OjgxMDstLW1vbnN0ZXItei1pbmRleC10b29sdGlwOjgwMDstLW1vbnN0ZXItei1pbmRleC10b29sdGlwLW92ZXJsYXk6OTEwOy0tbW9uc3Rlci1zcGFjZS0wOjA7LS1tb25zdGVyLXNwYWNlLTE6MnB4Oy0tbW9uc3Rlci1zcGFjZS0yOjRweDstLW1vbnN0ZXItc3BhY2UtMzo2cHg7LS1tb25zdGVyLXNwYWNlLTQ6MTBweDstLW1vbnN0ZXItc3BhY2UtNToxNnB4Oy0tbW9uc3Rlci1zcGFjZS02OjI2cHg7LS1tb25zdGVyLXNwYWNlLTc6NDJweDstLW1vbnN0ZXItYnJlYWtwb2ludC0wOjQ4MHB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTQ6NDgwcHg7LS1tb25zdGVyLWJyZWFrcG9pbnQtNzo3NjhweDstLW1vbnN0ZXItYnJlYWtwb2ludC05Ojk5MnB4Oy0tbW9uc3Rlci1icmVha3BvaW50LTEyOjEyMDBweDstLW1vbnN0ZXItZHJhZ2dlci13aWR0aDoycHg7LS1tb25zdGVyLWRyYWdnZXItaGFuZGxlLXdpZHRoOjRweDstLW1vbnN0ZXItZHJhZ2dlci1oYW5kbGUtaGVpZ2h0OjUwcHh9c3Bhbi5tb25zdGVyLWZ4LXJpcHBsZXthbmltYXRpb246bW9uc3Rlci1meC1yaXBwbGUgLjZzIGxpbmVhcjtiYWNrZ3JvdW5kLWNvbG9yOmhzbGEoMCwwJSwxMDAlLC43KTtib3JkZXItcmFkaXVzOjUwJTtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm06c2NhbGUoMCl9QGtleWZyYW1lcyBtb25zdGVyLWZ4LXJpcHBsZXt0b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDQpfX1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF17Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNn0ub3ZlcmZsb3ctaGlkZGVuW2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xde292ZXJmbG93OmhpZGRlbn1bZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0gYnV0dG9ue2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLXRvcDowfVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSAuYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbW9uc3Rlci1ib3gtc2hhZG93LTIpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuOHMsY29sb3IgLjI1cyAuMDgzMzMzMzMzM3N9W2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIFtkYXRhLW1vbnN0ZXItcm9sZT1kZXRhaWxde2JveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo0MDA7aGVpZ2h0OjA7bGluZS1oZWlnaHQ6MS42O3RyYW5zaXRpb246aGVpZ2h0IC40cyBlYXNlLWluLW91dDt3aWR0aDoxMDAlfTppcyhbZGF0YS1tb25zdGVyLXJvbGU9Y29udHJvbF0gW2RhdGEtbW9uc3Rlci1yb2xlPWRldGFpbF0pIC5wYWRkaW5ne3BhZGRpbmc6MXJlbX06aXMoW2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRyb2xdIFtkYXRhLW1vbnN0ZXItcm9sZT1kZXRhaWxdKSAuZGVjby1saW5le2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHZhcigtLW1vbnN0ZXItY29sb3ItZ3JhZGllbnQtMSkgMCx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTIpIDUwJSx2YXIoLS1tb25zdGVyLWNvbG9yLWdyYWRpZW50LTMpIDEwMCUpO2JvcmRlcjowO2hlaWdodDoycHg7bWFyZ2luOjA7cGFkZGluZzowfUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7OmlzKFtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSBbZGF0YS1tb25zdGVyLXJvbGU9ZGV0YWlsXSkgLmRlY28tbGluZXtiYWNrZ3JvdW5kOnZhcigtLW1vbnN0ZXItY29sb3ItcHJpbWFyeS0xKX19OmlzKFtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSBbZGF0YS1tb25zdGVyLXJvbGU9ZGV0YWlsXSkgLmRlY28tbGluZXt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjRzIGVhc2UtaW4tb3V0fVtkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXSAuYWN0aXZlW2RhdGEtbW9uc3Rlci1yb2xlPWRldGFpbF17aGVpZ2h0OnZhcigtLW1vbnN0ZXItaGVpZ2h0KTt0cmFuc2l0aW9uOmhlaWdodCAuNHMgZWFzZS1pbi1vdXR9IFxufWAsXG5cdFx0MCxcblx0KTtcbn0gY2F0Y2ggKGUpIHtcblx0YWRkQXR0cmlidXRlVG9rZW4oXG5cdFx0ZG9jdW1lbnQuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKSxcblx0XHRBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuXHRcdGUgKyBcIlwiLFxuXHQpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRDdXN0b21FbGVtZW50LFxuXHRnZXRTbG90dGVkRWxlbWVudHMsXG5cdHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCxcbn0gZnJvbSBcIi4uLy4uL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2VTdHlsZVNoZWV0IH0gZnJvbSBcIi4vc3R5bGVzaGVldC9jb2xsYXBzZS5tanNcIjtcbmltcG9ydCB7IGZpcmVDdXN0b21FdmVudCB9IGZyb20gXCIuLi8uLi9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0RG9jdW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tL3V0aWwubWpzXCI7XG5pbXBvcnQgeyBhZGRBdHRyaWJ1dGVUb2tlbiB9IGZyb20gXCIuLi8uLi9kb20vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7IEFUVFJJQlVURV9FUlJPUk1FU1NBR0UgfSBmcm9tIFwiLi4vLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IEhvc3QgfSBmcm9tIFwiLi4vaG9zdC9ob3N0Lm1qc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVDb25maWdLZXkgfSBmcm9tIFwiLi4vaG9zdC91dGlsLm1qc1wiO1xuaW1wb3J0IHsgRGVhZE1hbnNTd2l0Y2ggfSBmcm9tIFwiLi4vLi4vdXRpbC9kZWFkbWFuc3N3aXRjaC5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgQ29sbGFwc2UsIG5hbWVTeW1ib2wgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdGltZXJDYWxsYmFja1N5bWJvbCA9IFN5bWJvbChcInRpbWVyQ2FsbGJhY2tcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGRldGFpbHNFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiZGV0YWlsc0VsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNvbnRyb2xFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiY29udHJvbEVsZW1lbnRcIik7XG5cbi8qKlxuICogbG9jYWwgc3ltYm9sXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcmVzaXplT2JzZXJ2ZXJTeW1ib2wgPSBTeW1ib2woXCJyZXNpemVPYnNlcnZlclwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgZGV0YWlsc1Nsb3RFbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiZGV0YWlsc1Nsb3RFbGVtZW50XCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBkZXRhaWxzQ29udGFpbmVyRWxlbWVudFN5bWJvbCA9IFN5bWJvbChcImRldGFpbHNDb250YWluZXJFbGVtZW50XCIpO1xuLyoqXG5cbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBkZXRhaWxzRGVjb0VsZW1lbnRTeW1ib2wgPSBTeW1ib2woXCJkZXRhaWxzRGVjb0VsZW1lbnRcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG5hbWVTeW1ib2wgPSBTeW1ib2woXCJuYW1lXCIpO1xuXG4vKipcbiAqIEEgQ29sbGFwc2UgY29tcG9uZW50XG4gKlxuICogQGZyYWdtZW50cyAvZnJhZ21lbnRzL2NvbXBvbmVudHMvbGF5b3V0L2NvbGxhcHNlL1xuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2xheW91dC9jb2xsYXBzZS1zaW1wbGVcbiAqXG4gKiBAc2luY2UgMy43NC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgIEEgc2ltcGxlIGNvbGxhcHNlIGNvbXBvbmVudC5cbiAqL1xuY2xhc3MgQ29sbGFwc2UgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbXBvbmVudHMvbGF5b3V0L2NvbGxhcHNlQEBpbnN0YW5jZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHQvLyB0aGUgbmFtZSBpcyBvbmx5IHVzZWQgZm9yIHRoZSBob3N0IGNvbmZpZyBhbmQgdGhlIGV2ZW50IG5hbWVcblx0XHR0aGlzW25hbWVTeW1ib2xdID0gXCJjb2xsYXBzZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvIHNldCB0aGUgb3B0aW9ucyB2aWEgdGhlIEhUTUwgdGFnLCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb3B0aW9uc2AgbXVzdCBiZSB1c2VkLlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL21vbnN0ZXJqcy5vcmcvZW4vZG9jLyNjb25maWd1cmF0ZS1hLW1vbnN0ZXItY29udHJvbH1cblx0ICpcblx0ICogVGhlIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbiB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHRlbXBsYXRlcyBUZW1wbGF0ZSBkZWZpbml0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gdGVtcGxhdGVzLm1haW4gTWFpbiB0ZW1wbGF0ZVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3NlcyBDU1MgY2xhc3Nlc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3Nlcy5jb250YWluZXIgQ1NTIGNsYXNzIGZvciB0aGUgY29udGFpbmVyXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmZWF0dXJlcyBGZWF0dXJlIGNvbmZpZ3VyYXRpb25cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy5hY2NvcmRpb24gRW5hYmxlIGFjY29yZGlvbiBtb2RlXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZmVhdHVyZXMucGVyc2lzdFN0YXRlIEVuYWJsZSBwZXJzaXN0IHN0YXRlIChIb3N0IGFuZCBDb25maWctTWFuYWdlciByZXF1aXJlZClcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBmZWF0dXJlcy51c2VTY3JvbGxWYWx1ZXMgVXNlIHNjcm9sbCB2YWx1ZXMgKHNjcm9sbEhlaWdodCkgaW5zdGVhZCBvZiBjbGllbnRIZWlnaHQgZm9yIHRoZSBoZWlnaHQgY2FsY3VsYXRpb25cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBvcGVuQnlEZWZhdWx0IE9wZW4gdGhlIGRldGFpbHMgYnkgZGVmYXVsdFxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuXHRcdFx0dGVtcGxhdGVzOiB7XG5cdFx0XHRcdG1haW46IGdldFRlbXBsYXRlKCksXG5cdFx0XHR9LFxuXHRcdFx0Y2xhc3Nlczoge1xuXHRcdFx0XHRjb250YWluZXI6IFwicGFkZGluZ1wiLFxuXHRcdFx0fSxcblx0XHRcdGZlYXR1cmVzOiB7XG5cdFx0XHRcdGFjY29yZGlvbjogdHJ1ZSxcblx0XHRcdFx0cGVyc2lzdFN0YXRlOiB0cnVlLFxuXHRcdFx0XHR1c2VTY3JvbGxWYWx1ZXM6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdG9wZW5CeURlZmF1bHQ6IGZhbHNlLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCkge1xuXHRcdHN1cGVyW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpO1xuXHRcdGluaXRDb250cm9sUmVmZXJlbmNlcy5jYWxsKHRoaXMpO1xuXHRcdGluaXRTdGF0ZUZyb21Ib3N0Q29uZmlnLmNhbGwodGhpcyk7XG5cdFx0aW5pdFJlc2l6ZU9ic2VydmVyLmNhbGwodGhpcyk7XG5cdFx0aW5pdEV2ZW50SGFuZGxlci5jYWxsKHRoaXMpO1xuXG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwib3BlbkJ5RGVmYXVsdFwiKSkge1xuXHRcdFx0dGhpcy5vcGVuKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdHVwZGF0ZVJlc2l6ZU9ic2VydmVyT2JzZXJ2YXRpb24uY2FsbCh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtDb2xsYXBzZX1cblx0ICovXG5cdHRvZ2dsZSgpIHtcblx0XHRpZiAodGhpc1tkZXRhaWxzRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWN0aXZlXCIpKSB7XG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub3BlbigpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0aXNDbG9zZWQoKSB7XG5cdFx0cmV0dXJuICF0aGlzW2RldGFpbHNFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuY29udGFpbnMoXCJhY3RpdmVcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGlzT3BlbigpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNDbG9zZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVuIHRoZSBjb2xsYXBzZVxuXHQgKiBAcmV0dXJuIHtDb2xsYXBzZX1cblx0ICogQGZpcmVzIG1vbnN0ZXItY29sbGFwc2UtYmVmb3JlLW9wZW4gVGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIGNvbGxhcHNlIGlzIG9wZW5lZC5cblx0ICogQGZpcmVzIG1vbnN0ZXItY29sbGFwc2Utb3BlbiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBjb2xsYXBzZSBpcyBvcGVuZWQuXG5cdCAqL1xuXHRvcGVuKCkge1xuXHRcdGxldCBub2RlO1xuXHRcdGlmICh0aGlzW2RldGFpbHNFbGVtZW50U3ltYm9sXS5jbGFzc0xpc3QuY29udGFpbnMoXCJhY3RpdmVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGZpcmVDdXN0b21FdmVudCh0aGlzLCBcIm1vbnN0ZXItXCIgKyB0aGlzW25hbWVTeW1ib2xdICsgXCItYmVmb3JlLW9wZW5cIiwge30pO1xuXG5cdFx0YWRqdXN0SGVpZ2h0LmNhbGwodGhpcyk7XG5cdFx0dGhpc1tkZXRhaWxzRWxlbWVudFN5bWJvbF0uY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcblxuXHRcdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLmFjY29yZGlvblwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0bm9kZSA9IHRoaXM7XG5cdFx0XHR3aGlsZSAobm9kZS5uZXh0RWxlbWVudFNpYmxpbmcgaW5zdGFuY2VvZiBDb2xsYXBzZSkge1xuXHRcdFx0XHRub2RlID0gbm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdG5vZGUuY2xvc2UoKTtcblx0XHRcdH1cblxuXHRcdFx0bm9kZSA9IHRoaXM7XG5cdFx0XHR3aGlsZSAobm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGluc3RhbmNlb2YgQ29sbGFwc2UpIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUucHJldmlvdXNFbGVtZW50U2libGluZztcblx0XHRcdFx0bm9kZS5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHVwZGF0ZVN0YXRlQ29uZmlnLmNhbGwodGhpcyk7XG5cdFx0XHRcdGZpcmVDdXN0b21FdmVudCh0aGlzLCBcIm1vbnN0ZXItXCIgKyB0aGlzW25hbWVTeW1ib2xdICsgXCItb3BlblwiLCB7fSk7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXNbY29udHJvbEVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJvdmVyZmxvdy1oaWRkZW5cIik7XG5cdFx0XHRcdH0sIDUwMCk7XG5cdFx0XHR9LCAwKTtcblx0XHR9LCAwKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlIHRoZSBjb2xsYXBzZVxuXHQgKiBAcmV0dXJuIHtDb2xsYXBzZX1cblx0ICogQGZpcmVzIG1vbnN0ZXItY29sbGFwc2UtYmVmb3JlLWNsb3NlIFRoaXMgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBjb2xsYXBzZSBpcyBjbG9zZWQuXG5cdCAqIEBmaXJlcyBtb25zdGVyLWNvbGxhcHNlLWNsb3NlZCBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBjb2xsYXBzZSBpcyBjbG9zZWQuXG5cdCAqL1xuXHRjbG9zZSgpIHtcblx0XHRpZiAoIXRoaXNbZGV0YWlsc0VsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5jb250YWlucyhcImFjdGl2ZVwiKSkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1cIiArIHRoaXNbbmFtZVN5bWJvbF0gKyBcIi1iZWZvcmUtY2xvc2VcIiwge30pO1xuXHRcdHRoaXNbY29udHJvbEVsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5hZGQoXCJvdmVyZmxvdy1oaWRkZW5cIik7XG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXNbZGV0YWlsc0VsZW1lbnRTeW1ib2xdLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dXBkYXRlU3RhdGVDb25maWcuY2FsbCh0aGlzKTtcblx0XHRcdFx0ZmlyZUN1c3RvbUV2ZW50KHRoaXMsIFwibW9uc3Rlci1cIiArIHRoaXNbbmFtZVN5bWJvbF0gKyBcIi1jbG9zZWRcIiwge30pO1xuXHRcdFx0fSwgMCk7XG5cdFx0fSwgMCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0VGFnKCkge1xuXHRcdHJldHVybiBcIm1vbnN0ZXItY29sbGFwc2VcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtBcnJheTxDU1NTdHlsZVNoZWV0Pn1cblx0ICovXG5cdHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuXHRcdHJldHVybiBbQ29sbGFwc2VTdHlsZVNoZWV0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCBpbnRvIGEgZG9jdW1lbnQsIGluY2x1ZGluZyBpbnRvIGEgc2hhZG93IHRyZWUuXG5cdCAqIEByZXR1cm4ge0NvbGxhcHNlfVxuXHQgKiBAZmlyZXMgbW9uc3Rlci1jb2xsYXBzZS1hZGp1c3QtaGVpZ2h0IFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgaGVpZ2h0IGlzIGFkanVzdGVkLiBBcyBhIGRldGFpbCwgdGhlIGhlaWdodCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRhZGp1c3RIZWlnaHQoKSB7XG5cdFx0YWRqdXN0SGVpZ2h0LmNhbGwodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRqdXN0SGVpZ2h0KCkge1xuXHRsZXQgaGVpZ2h0ID0gMDtcblxuXHRpZiAodGhpc1tkZXRhaWxzQ29udGFpbmVyRWxlbWVudFN5bWJvbF0pIHtcblx0XHRpZiAodGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy51c2VTY3JvbGxWYWx1ZXNcIikpIHtcblx0XHRcdGhlaWdodCArPSB0aGlzW2RldGFpbHNDb250YWluZXJFbGVtZW50U3ltYm9sXS5zY3JvbGxIZWlnaHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGhlaWdodCArPSB0aGlzW2RldGFpbHNDb250YWluZXJFbGVtZW50U3ltYm9sXS5jbGllbnRIZWlnaHQ7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRoaXNbZGV0YWlsc0RlY29FbGVtZW50U3ltYm9sXSkge1xuXHRcdGlmICh0aGlzLmdldE9wdGlvbihcImZlYXR1cmVzLnVzZVNjcm9sbFZhbHVlc1wiKSkge1xuXHRcdFx0aGVpZ2h0ICs9IHRoaXNbZGV0YWlsc0RlY29FbGVtZW50U3ltYm9sXS5zY3JvbGxIZWlnaHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGhlaWdodCArPSB0aGlzW2RldGFpbHNEZWNvRWxlbWVudFN5bWJvbF0uY2xpZW50SGVpZ2h0ICsgMTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaGVpZ2h0ID09PSAwKSB7XG5cdFx0aWYgKHRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMudXNlU2Nyb2xsVmFsdWVzXCIpKSB7XG5cdFx0XHRoZWlnaHQgPSB0aGlzW2RldGFpbHNFbGVtZW50U3ltYm9sXS5zY3JvbGxIZWlnaHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGhlaWdodCA9IHRoaXNbZGV0YWlsc0VsZW1lbnRTeW1ib2xdLmNsaWVudEhlaWdodDtcblx0XHR9XG5cblx0XHRpZiAoaGVpZ2h0ID09PSAwKSB7XG5cdFx0XHRoZWlnaHQgPSBcImF1dG9cIjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0aGVpZ2h0ICs9IFwicHhcIjtcblx0fVxuXG5cdHRoaXNbZGV0YWlsc0VsZW1lbnRTeW1ib2xdLnN0eWxlLnNldFByb3BlcnR5KFxuXHRcdFwiLS1tb25zdGVyLWhlaWdodFwiLFxuXHRcdGhlaWdodCxcblx0XHRcImltcG9ydGFudFwiLFxuXHQpO1xuXG5cdGZpcmVDdXN0b21FdmVudCh0aGlzLCBcIm1vbnN0ZXItXCIgKyB0aGlzW25hbWVTeW1ib2xdICsgXCItYWRqdXN0LWhlaWdodFwiLCB7XG5cdFx0aGVpZ2h0LFxuXHR9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVzaXplT2JzZXJ2ZXJPYnNlcnZhdGlvbigpIHtcblx0dGhpc1tyZXNpemVPYnNlcnZlclN5bWJvbF0uZGlzY29ubmVjdCgpO1xuXG5cdGNvbnN0IHNsb3R0ZWROb2RlcyA9IGdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHRoaXMpO1xuXHRzbG90dGVkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLm9ic2VydmUobm9kZSk7XG5cdH0pO1xuXG5cdGlmICh0aGlzW2RldGFpbHNDb250YWluZXJFbGVtZW50U3ltYm9sXSkge1xuXHRcdHRoaXNbcmVzaXplT2JzZXJ2ZXJTeW1ib2xdLm9ic2VydmUodGhpc1tkZXRhaWxzQ29udGFpbmVyRWxlbWVudFN5bWJvbF0pO1xuXHR9XG5cblx0dGhpcy5hZGp1c3RIZWlnaHQoKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpbml0RXZlbnRIYW5kbGVyKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHRpbml0U2xvdENoYW5nZWRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBpbml0U2xvdENoYW5nZWRIYW5kbGVyKCkge1xuXHR0aGlzW2RldGFpbHNTbG90RWxlbWVudFN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcihcInNsb3RjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHVwZGF0ZVJlc2l6ZU9ic2VydmVyT2JzZXJ2YXRpb24uY2FsbCh0aGlzKTtcblx0fSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1NlbGVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGluaXRDb250cm9sUmVmZXJlbmNlcygpIHtcblx0aWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJubyBzaGFkb3ctcm9vdCBpcyBkZWZpbmVkXCIpO1xuXHR9XG5cblx0dGhpc1tjb250cm9sRWxlbWVudFN5bWJvbF0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcihcblx0XHRcIltkYXRhLW1vbnN0ZXItcm9sZT1jb250cm9sXVwiLFxuXHQpO1xuXHR0aGlzW2RldGFpbHNFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPWRldGFpbF1cIixcblx0KTtcblx0dGhpc1tkZXRhaWxzU2xvdEVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJzbG90XCIpO1xuXHR0aGlzW2RldGFpbHNDb250YWluZXJFbGVtZW50U3ltYm9sXSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFxuXHRcdFwiW2RhdGEtbW9uc3Rlci1yb2xlPWNvbnRhaW5lcl1cIixcblx0KTtcblx0dGhpc1tkZXRhaWxzRGVjb0VsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XCJbZGF0YS1tb25zdGVyLXJvbGU9ZGVjb11cIixcblx0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRDb25maWdLZXkoKSB7XG5cdHJldHVybiBnZW5lcmF0ZVVuaXF1ZUNvbmZpZ0tleSh0aGlzW25hbWVTeW1ib2xdLCB0aGlzLmlkLCBcInN0YXRlXCIpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlQ29uZmlnKCkge1xuXHRpZiAoIXRoaXMuZ2V0T3B0aW9uKFwiZmVhdHVyZXMucGVyc2lzdFN0YXRlXCIpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCF0aGlzW2RldGFpbHNFbGVtZW50U3ltYm9sXSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblx0Y29uc3QgaG9zdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtb25zdGVyLWhvc3RcIik7XG5cdGlmICghKGhvc3QgJiYgdGhpcy5pZCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjb25maWdLZXkgPSBnZXRDb25maWdLZXkuY2FsbCh0aGlzKTtcblxuXHR0cnkge1xuXHRcdGhvc3Quc2V0Q29uZmlnKGNvbmZpZ0tleSwgdGhpcy5pc09wZW4oKSk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0YWRkQXR0cmlidXRlVG9rZW4odGhpcywgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgU3RyaW5nKGVycm9yKSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gaW5pdFN0YXRlRnJvbUhvc3RDb25maWcoKSB7XG5cdGlmICghdGhpcy5nZXRPcHRpb24oXCJmZWF0dXJlcy5wZXJzaXN0U3RhdGVcIikpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblx0Y29uc3QgaG9zdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtb25zdGVyLWhvc3RcIik7XG5cblx0aWYgKCEoaG9zdCAmJiB0aGlzLmlkKSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0Y29uc3QgY29uZmlnS2V5ID0gZ2V0Q29uZmlnS2V5LmNhbGwodGhpcyk7XG5cdHJldHVybiBob3N0XG5cdFx0LmdldENvbmZpZyhjb25maWdLZXkpXG5cdFx0LnRoZW4oKHN0YXRlKSA9PiB7XG5cdFx0XHRpZiAoc3RhdGUgPT09IHRydWUpIHtcblx0XHRcdFx0dGhpcy5vcGVuKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRhZGRBdHRyaWJ1dGVUb2tlbih0aGlzLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlcnJvci50b1N0cmluZygpKTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpbml0UmVzaXplT2JzZXJ2ZXIoKSB7XG5cdC8vIGFnYWluc3QgZmxpY2tlcmluZ1xuXHR0aGlzW3Jlc2l6ZU9ic2VydmVyU3ltYm9sXSA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuXHRcdGlmICh0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdIGluc3RhbmNlb2YgRGVhZE1hbnNTd2l0Y2gpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXNbdGltZXJDYWxsYmFja1N5bWJvbF0udG91Y2goKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRkZWxldGUgdGhpc1t0aW1lckNhbGxiYWNrU3ltYm9sXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzW3RpbWVyQ2FsbGJhY2tTeW1ib2xdID0gbmV3IERlYWRNYW5zU3dpdGNoKDIwMCwgKCkgPT4ge1xuXHRcdFx0Y2hlY2tBbmRSZWFycmFuZ2VDb250ZW50LmNhbGwodGhpcyk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBjaGVja0FuZFJlYXJyYW5nZUNvbnRlbnQoKSB7XG5cdHRoaXMuYWRqdXN0SGVpZ2h0KCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoKSB7XG5cdC8vIGxhbmd1YWdlPUhUTUxcblx0cmV0dXJuIGBcbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRyb2xcIiBwYXJ0PVwiY29udHJvbFwiIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiZGV0YWlsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6Y2xhc3Nlcy5jb250YWluZXJcIiBwYXJ0PVwiY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVjby1saW5lXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJkZWNvXCIgcGFydD1cImRlY29cIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gO1xufVxuXG5yZWdpc3RlckN1c3RvbUVsZW1lbnQoQ29sbGFwc2UpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7XG5cdGFzc2VtYmxlTWV0aG9kU3ltYm9sLFxuXHRyZWdpc3RlckN1c3RvbUVsZW1lbnQsXG59IGZyb20gXCIuLi8uLi9kb20vY3VzdG9tZWxlbWVudC5tanNcIjtcbmltcG9ydCB7IERldGFpbHNTdHlsZVNoZWV0IH0gZnJvbSBcIi4vc3R5bGVzaGVldC9kZXRhaWxzLm1qc1wiO1xuaW1wb3J0IHsgQVRUUklCVVRFX0JVVFRPTl9MQUJFTCB9IGZyb20gXCIuLi9ob3N0L2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVDb25maWdLZXkgfSBmcm9tIFwiLi4vaG9zdC91dGlsLm1qc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2UsIG5hbWVTeW1ib2wgfSBmcm9tIFwiLi9jb2xsYXBzZS5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGdldExvY2FsZU9mRG9jdW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tL2xvY2FsZS5tanNcIjtcblxuZXhwb3J0IHsgRGV0YWlscyB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBidXR0b25FbGVtZW50U3ltYm9sID0gU3ltYm9sKFwiYnV0dG9uRWxlbWVudFwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYnV0dG9uRXZlbnRIYW5kbGVyU3ltYm9sID0gU3ltYm9sKFwiYnV0dG9uRXZlbnRIYW5kbGVyXCIpO1xuXG4vKipcbiAqIEEgRGV0YWlscyBjb21wb25lbnRcbiAqXG4gKiBAZnJhZ21lbnRzIC9mcmFnbWVudHMvY29tcG9uZW50cy9sYXlvdXQvZGV0YWlscy9cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvY29tcG9uZW50cy9sYXlvdXQvZGV0YWlscy1zaW1wbGVcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2xheW91dC9kZXRhaWxzLXdpdGgtbGFiZWxcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9jb21wb25lbnRzL2xheW91dC9kZXRhaWxzLWFzLWFjY29yZGlvblxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2NvbXBvbmVudHMvbGF5b3V0L2RldGFpbHMtd2l0aC15b3VyLW93bi1kZXNpZ25cbiAqXG4gKiBAc2luY2UgMy43NC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBzaW1wbGUgYnV0IGNvb2wgZGV0YWlsIGNvbXBvbmVudC4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgY29sbGFwc2UgY29tcG9uZW50IGFuZCBleHRlbmRzIGl0IHdpdGggYSBidXR0b24uXG4gKiBAc3VtbWFyeSBZb3UgY2FuIGFsc28gZWFzaWx5IGJ1aWxkIGFuIGFjY29yZGlvbiBmcm9tIHRoZSBjb21wb25lbnQuXG4gKi9cbmNsYXNzIERldGFpbHMgZXh0ZW5kcyBDb2xsYXBzZSB7XG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb21wb25lbnRzL2xheW91dC9kZXRhaWxzQEBpbnN0YW5jZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHQvLyB0aGUgbmFtZSBpcyBvbmx5IHVzZWQgZm9yIHRoZSBob3N0IGNvbmZpZyBhbmQgdGhlIGV2ZW50IG5hbWVcblx0XHR0aGlzW25hbWVTeW1ib2xdID0gXCJkZXRhaWxzXCI7XG5cdH1cblxuXHQvKipcblx0ICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgSFRNTCBUYWcsIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vcHRpb25zYCBtdXN0IGJlIHVzZWQuXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbW9uc3RlcmpzLm9yZy9lbi9kb2MvI2NvbmZpZ3VyYXRlLWEtbW9uc3Rlci1jb250cm9sfVxuXHQgKlxuXHQgKiBUaGUgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlIGRlZmluaXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbiBNYWluIHRlbXBsYXRlXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBidXR0b24gQnV0dG9uIGNvbmZpZ3VyYXRpb25cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1dHRvbi5sYWJlbCBCdXR0b24gbGFiZWxcblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHRlbXBsYXRlczoge1xuXHRcdFx0XHRtYWluOiBnZXRUZW1wbGF0ZSgpLFxuXHRcdFx0fSxcblx0XHRcdGxhYmVsczogZ2V0VHJhbnNsYXRpb25zKCksXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdFthc3NlbWJsZU1ldGhvZFN5bWJvbF0oKSB7XG5cdFx0c3VwZXJbYXNzZW1ibGVNZXRob2RTeW1ib2xdKCk7XG5cblx0XHRpbml0QnV0dG9uTGFiZWwuY2FsbCh0aGlzKTtcblx0XHRpbml0Q29udHJvbFJlZmVyZW5jZXMuY2FsbCh0aGlzKTtcblx0XHRpbml0RXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cblx0XHRjb25zdCBjb250YWluRG9jdW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q7XG5cblx0XHRpZiAoY29udGFpbkRvY3VtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0VsZW1lbnQgPSB0aGlzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cdFx0XHRpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC50YWdOYW1lID09PSBcIk1PTlNURVItREVUQUlMU1wiKSB7XG5cdFx0XHRcdHRoaXNbYnV0dG9uRWxlbWVudFN5bWJvbF0uc3R5bGUuYm9yZGVyVG9wID0gXCIwXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHN0YXRpYyBnZXRUYWcoKSB7XG5cdFx0cmV0dXJuIFwibW9uc3Rlci1kZXRhaWxzXCI7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7QXJyYXk8Q1NTU3R5bGVTaGVldD59XG5cdCAqL1xuXHRzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblx0XHRjb25zdCBjc3MgPSBzdXBlci5nZXRDU1NTdHlsZVNoZWV0KCk7XG5cdFx0Y3NzLnB1c2goRGV0YWlsc1N0eWxlU2hlZXQpO1xuXHRcdHJldHVybiBjc3M7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkge1xuXHRjb25zdCBsb2NhbGUgPSBnZXRMb2NhbGVPZkRvY3VtZW50KCk7XG5cdHN3aXRjaCAobG9jYWxlLmxhbmd1YWdlKSB7XG5cdFx0Y2FzZSBcImRlXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IFwiRGV0YWlsc1wiLFxuXHRcdFx0fTtcblx0XHRjYXNlIFwiZnJcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJEXHUwMEU5dGFpbHNcIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcInNwXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IFwiRGV0YWxsZXNcIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcIml0XCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IFwiRGV0dGFnbGlcIixcblx0XHRcdH07XG5cdFx0Y2FzZSBcInBsXCI6XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IFwiU3pjemVnXHUwMEYzXHUwMTQyeVwiLFxuXHRcdFx0fTtcblx0XHRjYXNlIFwibm9cIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJEZXRhbGplclwiLFxuXHRcdFx0fTtcblx0XHRjYXNlIFwiZGtcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJEZXRhbGplclwiLFxuXHRcdFx0fTtcblx0XHRjYXNlIFwic3dcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvbjogXCJEZXRhbGplclwiLFxuXHRcdFx0fTtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgXCJlblwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YnV0dG9uOiBcIkRldGFpbHNcIixcblx0XHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7U2VsZWN0fVxuICogQHRocm93cyB7RXJyb3J9IG5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gaW5pdENvbnRyb2xSZWZlcmVuY2VzKCkge1xuXHRpZiAoIXRoaXMuc2hhZG93Um9vdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIm5vIHNoYWRvdy1yb290IGlzIGRlZmluZWRcIik7XG5cdH1cblxuXHR0aGlzW2J1dHRvbkVsZW1lbnRTeW1ib2xdID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XCJbZGF0YS1tb25zdGVyLXJvbGU9YnV0dG9uXVwiLFxuXHQpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRFdmVudEhhbmRsZXIoKSB7XG5cdGlmICghdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwibm8gc2hhZG93LXJvb3QgaXMgZGVmaW5lZFwiKTtcblx0fVxuXG5cdHRoaXNbYnV0dG9uRXZlbnRIYW5kbGVyU3ltYm9sXSA9IChldmVudCkgPT4ge1xuXHRcdHRoaXMudG9nZ2xlKCk7XG5cdH07XG5cblx0dGhpc1tidXR0b25FbGVtZW50U3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFwiY2xpY2tcIixcblx0XHR0aGlzW2J1dHRvbkV2ZW50SGFuZGxlclN5bWJvbF0sXG5cdCk7XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaW5pdEJ1dHRvbkxhYmVsKCkge1xuXHRsZXQgbGFiZWw7XG5cdGNvbnN0IHNldExhYmVsID0gZmFsc2U7XG5cdGlmICh0aGlzLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfQlVUVE9OX0xBQkVMKSkge1xuXHRcdGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0JVVFRPTl9MQUJFTCk7XG5cdH0gZWxzZSB7XG5cdFx0bGFiZWwgPSB0aGlzLmdldE9wdGlvbihcImxhYmVscy5idXR0b25cIiwgXCJEZXRhaWxzXCIpO1xuXHR9XG5cblx0aWYgKCFpc1N0cmluZyhsYWJlbCkpIHtcblx0XHRsYWJlbCA9IFwiXCI7XG5cdH1cblxuXHRpZiAobGFiZWwgPT09IFwiXCIpIHtcblx0XHRsYWJlbCA9IHRoaXMuaW5uZXJUZXh0O1xuXHR9XG5cblx0bGFiZWwgPSBsYWJlbC50cmltKCk7XG5cblx0aWYgKGxhYmVsID09PSBcIlwiKSB7XG5cdFx0bGFiZWwgPSB0aGlzLmdldE9wdGlvbihcImxhYmVscy5idXR0b25cIiwgXCJEZXRhaWxzXCIpO1xuXHR9XG5cblx0aWYgKGxhYmVsLmxlbmd0aCA+IDEwMCkge1xuXHRcdGxhYmVsID0gYCR7bGFiZWwuc3Vic3RyaW5nKDAsIDk5KX1cdTIwMjZgO1xuXHR9XG5cblx0dGhpcy5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0JVVFRPTl9MQUJFTCwgbGFiZWwpO1xuXHR0aGlzLnNldE9wdGlvbihcImxhYmVscy5idXR0b25cIiwgbGFiZWwpO1xuXG5cdHJldHVybiBsYWJlbDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRDb25maWdLZXkoKSB7XG5cdHJldHVybiBnZW5lcmF0ZVVuaXF1ZUNvbmZpZ0tleShcImRldGFpbHNcIiwgdGhpcy5pZCwgXCJzdGF0ZVwiKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZSgpIHtcblx0Ly8gbGFuZ3VhZ2U9SFRNTFxuXHRyZXR1cm4gYFxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwiY29udHJvbFwiIHBhcnQ9XCJjb250cm9sXCIgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdW1tYXJ5XCIgcGFydD1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBhcnQ9XCJidXR0b25cIiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6Y2xhc3Nlcy5idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmxhYmVscy5idXR0b24gfCBkZWZhdWx0OmNsaWNrIG1lXCI+Y2xpY2sgbWVcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cImRldGFpbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmNsYXNzZXMuY29udGFpbmVyXCIgcGFydD1cImNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItcm9sZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHBhcnQ9XCJkZWNvLWxpbmVcIiBjbGFzcz1cImRlY28tbGluZVwiIGRhdGEtbW9uc3Rlci1yb2xlPVwiZGVjb1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG59XG5cbnJlZ2lzdGVyQ3VzdG9tRWxlbWVudChEZXRhaWxzKTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBEZXRhaWxzIGFzIE5ld0RldGFpbHMgfSBmcm9tIFwiLi4vbGF5b3V0L2RldGFpbHMubWpzXCI7XG5leHBvcnQgeyBEZXRhaWxzIH07XG5cbi8qKlxuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBkZXByZWNhdGVkIHNpbmNlIDMuNjQuMCB1c2Uge0BsaW5rIE1vbnN0ZXIuQ29tcG9uZW50cy5MYXlvdXQuRGV0YWlsc31cbiAqL1xuY2xhc3MgRGV0YWlscyBleHRlbmRzIE5ld0RldGFpbHMge31cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyByYW5kb20gfSBmcm9tIFwiLi4vbWF0aC9yYW5kb20ubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tIFwiLi9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBJRCB9IGZyb20gXCIuL2lkLm1qc1wiO1xuXG5leHBvcnQgeyBSYW5kb21JRCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5sZXQgaW50ZXJuYWxDb3VudGVyID0gMDtcblxuLyoqXG4gKiBUaGUgYFJhbmRvbUlEYCBjbGFzcyBwcm92aWRlcyBhIHVuaXF1ZSBJRCBmb3IgYW4gaXRlbS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IGNsYXNzIHRvIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzXG4gKi9cbmNsYXNzIFJhbmRvbUlEIGV4dGVuZHMgSUQge1xuXHQvKipcblx0ICogY3JlYXRlIG5ldyBvYmplY3Rcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpbnRlcm5hbENvdW50ZXIgKz0gMTtcblxuXHRcdHRoaXMuaWQgPVxuXHRcdFx0Z2V0R2xvYmFsKClcblx0XHRcdFx0LmJ0b2EocmFuZG9tKDEsIDEwMDAwKSlcblx0XHRcdFx0LnJlcGxhY2UoLz0vZywgXCJcIilcblx0XHRcdFx0LyoqIE5vIG51bWJlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgSUQsIGJlY2F1c2Ugb2YgcG9zc2libGUgcHJvYmxlbXMgd2l0aCBET00gKi9cblx0XHRcdFx0LnJlcGxhY2UoL15bMC05XSsvLCBcIlhcIikgKyBpbnRlcm5hbENvdW50ZXI7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyByYW5kb20gfSBmcm9tIFwiLi4vbWF0aC9yYW5kb20ubWpzXCI7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tIFwiLi9nbG9iYWwubWpzXCI7XG5cbmV4cG9ydCB7IFVVSUQgfTtcblxuLyoqXG4gKiBUaGUgVVVJRCBjbGFzcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBnZXQgYSB1bmlxdWUgVVVJRCBmb3IgYW4gb2JqZWN0LlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZFxuICovXG5jbGFzcyBVVUlEIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGxldCB1dWlkID0gY3JlYXRlV2l0aENyeXB0bygpO1xuXG5cdFx0aWYgKHV1aWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dXVpZCA9IGNyZWF0ZVdpdGhSYW5kb20oKTtcblx0XHR9XG5cblx0XHRpZiAodXVpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZFwiKTtcblx0XHR9XG5cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcblx0XHRcdHZhbHVlOiB1dWlkLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdW1widmFsdWVcIl07XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV2l0aFJhbmRvbSgpIHtcblx0cmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuXHRcdGNvbnN0IHIgPSAocmFuZG9tKDAsIDY1MDAwKSAqIDE2KSB8IDA7XG5cdFx0Y29uc3QgdiA9IGMgPT09IFwieFwiID8gciA6IChyICYgMHgzKSB8IDB4ODtcblx0XHRyZXR1cm4gdi50b1N0cmluZygxNilbMF07XG5cdH0pO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjcmVhdGVXaXRoQ3J5cHRvKCkge1xuXHRjb25zdCBjcnlwdCA9IGdldEdsb2JhbE9iamVjdChcImNyeXB0b1wiKTtcblx0aWYgKCFpc09iamVjdChjcnlwdCkpIHJldHVybjtcblx0aWYgKHR5cGVvZiBjcnlwdD8uW1wicmFuZG9tVVVJRFwiXSkgcmV0dXJuO1xuXHRyZXR1cm4gY3J5cHQucmFuZG9tVVVJRCgpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgPSB7XG5cdGVuOiBcIkVuZ2xpc2hcIixcblx0XCJlbi1HQlwiOiBcIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKVwiLFxuXHRcImVuLVVTXCI6IFwiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcylcIixcblx0XCJlbi1DQVwiOiBcIkVuZ2xpc2ggKENhbmFkYSlcIixcblx0XCJlbi1BVVwiOiBcIkVuZ2xpc2ggKEF1c3RyYWxpYSlcIixcblx0ZXM6IFwiRXNwYVx1MDBGMW9sXCIsXG5cdFwiZXMtRVNcIjogXCJFc3BhXHUwMEYxb2wgKEVzcGFcdTAwRjFhKVwiLFxuXHRcImVzLU1YXCI6IFwiRXNwYVx1MDBGMW9sIChNXHUwMEU5eGljbylcIixcblx0XCJlcy1BUlwiOiBcIkVzcGFcdTAwRjFvbCAoQXJnZW50aW5hKVwiLFxuXHR6aDogXCJcdTRFMkRcdTY1ODdcIixcblx0XCJ6aC1DTlwiOiBcIlx1NEUyRFx1NjU4N1x1RkYwOFx1N0I4MFx1NEY1M1x1RkYwOVwiLFxuXHRcInpoLVRXXCI6IFwiXHU0RTJEXHU2NTg3XHVGRjA4XHU3RTQxXHU5QUQ0XHVGRjA5XCIsXG5cdFwiemgtSEtcIjogXCJcdTRFMkRcdTY1ODdcdUZGMDhcdTk5OTlcdTZFMkZcdUZGMDlcIixcblx0ZnI6IFwiRnJhblx1MDBFN2Fpc1wiLFxuXHRcImZyLUZSXCI6IFwiRnJhblx1MDBFN2FpcyAoRnJhbmNlKVwiLFxuXHRcImZyLUNBXCI6IFwiRnJhblx1MDBFN2FpcyAoQ2FuYWRhKVwiLFxuXHRcImZyLUJFXCI6IFwiRnJhblx1MDBFN2FpcyAoQmVsZ2lxdWUpXCIsXG5cdGRlOiBcIkRldXRzY2hcIixcblx0XCJkZS1ERVwiOiBcIkRldXRzY2ggKERldXRzY2hsYW5kKVwiLFxuXHRcImRlLUFUXCI6IFwiRGV1dHNjaCAoXHUwMEQ2c3RlcnJlaWNoKVwiLFxuXHRcImRlLUNIXCI6IFwiRGV1dHNjaCAoU2Nod2VpeilcIixcblx0amE6IFwiXHU2NUU1XHU2NzJDXHU4QTlFXCIsXG5cdHJ1OiBcIlx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzOVwiLFxuXHRcInJ1LVJVXCI6IFwiXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IChcdTA0MjBcdTA0M0VcdTA0NDFcdTA0NDFcdTA0MzhcdTA0NEYpXCIsXG5cdGl0OiBcIkl0YWxpYW5vXCIsXG5cdFwiaXQtSVRcIjogXCJJdGFsaWFubyAoSXRhbGlhKVwiLFxuXHRwdDogXCJQb3J0dWd1XHUwMEVBc1wiLFxuXHRcInB0LVBUXCI6IFwiUG9ydHVndVx1MDBFQXMgKFBvcnR1Z2FsKVwiLFxuXHRcInB0LUJSXCI6IFwiUG9ydHVndVx1MDBFQXMgKEJyYXNpbClcIixcblx0a286IFwiXHVENTVDXHVBRDZEXHVDNUI0XCIsXG5cdGFyOiBcIlx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0QVx1MDYyOVwiLFxuXHRoaTogXCJcdTA5MzlcdTA5M0ZcdTA5MjhcdTA5NERcdTA5MjZcdTA5NDBcIixcblx0Ym46IFwiXHUwOUFDXHUwOUJFXHUwOTgyXHUwOUIyXHUwOUJFXCIsXG5cdHBhOiBcIlx1MEEyQVx1MEE3MFx1MEExQ1x1MEEzRVx1MEEyQ1x1MEE0MFwiLFxuXHRpZDogXCJCYWhhc2EgSW5kb25lc2lhXCIsXG5cdHZpOiBcIlRpXHUxRUJGbmcgVmlcdTFFQzd0XCIsXG5cdHRyOiBcIlRcdTAwRkNya1x1MDBFN2VcIixcblx0XCJ0ci1UUlwiOiBcIlRcdTAwRkNya1x1MDBFN2UgKFRcdTAwRkNya2l5ZSlcIixcblx0cGw6IFwiUG9sc2tpXCIsXG5cdFwicGwtUExcIjogXCJQb2xza2kgKFBvbHNrYSlcIixcblx0dWs6IFwiXHUwNDIzXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNEXHUwNDQxXHUwNDRDXHUwNDNBXHUwNDMwXCIsXG5cdFwidWstVUFcIjogXCJcdTA0MjNcdTA0M0FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M0RcdTA0NDFcdTA0NENcdTA0M0FcdTA0MzAgKFx1MDQyM1x1MDQzQVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzRFx1MDQzMClcIixcblx0cm86IFwiUm9tXHUwMEUyblx1MDEwM1wiLFxuXHRcInJvLVJPXCI6IFwiUm9tXHUwMEUyblx1MDEwMyAoUm9tXHUwMEUybmlhKVwiLFxuXHRubDogXCJOZWRlcmxhbmRzXCIsXG5cdFwibmwtTkxcIjogXCJOZWRlcmxhbmRzIChOZWRlcmxhbmQpXCIsXG5cdGVsOiBcIlx1MDM5NVx1MDNCQlx1MDNCQlx1MDNCN1x1MDNCRFx1MDNCOVx1MDNCQVx1MDNBQ1wiLFxuXHRcImVsLUdSXCI6IFwiXHUwMzk1XHUwM0JCXHUwM0JCXHUwM0I3XHUwM0JEXHUwM0I5XHUwM0JBXHUwM0FDIChcdTAzOTVcdTAzQkJcdTAzQkJcdTAzQUNcdTAzQjRcdTAzQjEpXCIsXG5cdGh1OiBcIk1hZ3lhclwiLFxuXHRcImh1LUhVXCI6IFwiTWFneWFyIChNYWd5YXJvcnN6XHUwMEUxZylcIixcblx0c3Y6IFwiU3ZlbnNrYVwiLFxuXHRcInN2LVNFXCI6IFwiU3ZlbnNrYSAoU3ZlcmlnZSlcIixcblx0Y3M6IFwiXHUwMTBDZVx1MDE2MXRpbmFcIixcblx0XCJjcy1DWlwiOiBcIlx1MDEwQ2VcdTAxNjF0aW5hIChcdTAxMENlc2tcdTAwRTEgcmVwdWJsaWthKVwiLFxuXHRiZzogXCJcdTA0MTFcdTA0NEFcdTA0M0JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M0FcdTA0MzhcIixcblx0XCJiZy1CR1wiOiBcIlx1MDQxMVx1MDQ0QVx1MDQzQlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzQVx1MDQzOCAoXHUwNDExXHUwNDRBXHUwNDNCXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDRGKVwiLFxuXHRkYTogXCJEYW5za1wiLFxuXHRcImRhLURLXCI6IFwiRGFuc2sgKERhbm1hcmspXCIsXG5cdGZpOiBcIlN1b21pXCIsXG5cdFwiZmktRklcIjogXCJTdW9taSAoU3VvbWkpXCIsXG5cdHNrOiBcIlNsb3Zlblx1MDEwRGluYVwiLFxuXHRcInNrLVNLXCI6IFwiU2xvdmVuXHUwMTBEaW5hIChTbG92ZW5za28pXCIsXG5cdGhlOiBcIlx1MDVFMlx1MDVEMVx1MDVFOFx1MDVEOVx1MDVFQVwiLFxuXHR0aDogXCJcdTBFNDRcdTBFMTdcdTBFMjJcIixcblx0c3I6IFwiXHUwNDIxXHUwNDQwXHUwNDNGXHUwNDQxXHUwNDNBXHUwNDM4XCIsXG5cdFwic3ItUlNcIjogXCJcdTA0MjFcdTA0NDBcdTA0M0ZcdTA0NDFcdTA0M0FcdTA0MzggKFx1MDQyMVx1MDQ0MFx1MDQzMVx1MDQzOFx1MDQ1OFx1MDQzMClcIixcblx0bm86IFwiTm9yc2tcIixcblx0XCJuby1OT1wiOiBcIk5vcnNrIChOb3JnZSlcIixcblx0bHQ6IFwiTGlldHV2aVx1MDE3M1wiLFxuXHRcImx0LUxUXCI6IFwiTGlldHV2aVx1MDE3MyAoTGlldHV2YSlcIixcblx0bHY6IFwiTGF0dmllXHUwMTYxdVwiLFxuXHRcImx2LUxWXCI6IFwiTGF0dmllXHUwMTYxdSAoTGF0dmlqYSlcIixcblx0ZXQ6IFwiRWVzdGlcIixcblx0XCJldC1FRVwiOiBcIkVlc3RpIChFZXN0aSlcIixcblx0aHI6IFwiSHJ2YXRza2lcIixcblx0XCJoci1IUlwiOiBcIkhydmF0c2tpIChIcnZhdHNrYSlcIixcblx0c2w6IFwiU2xvdmVuXHUwMTYxXHUwMTBEaW5hXCIsXG5cdFwic2wtU0lcIjogXCJTbG92ZW5cdTAxNjFcdTAxMERpbmEgKFNsb3ZlbmlqYSlcIixcblx0bXQ6IFwiTWFsdGlcIixcblx0XCJtdC1NVFwiOiBcIk1hbHRpIChNYWx0YSlcIixcblx0aXM6IFwiXHUwMENEc2xlbnNrYVwiLFxuXHRcImlzLUlTXCI6IFwiXHUwMENEc2xlbnNrYSAoXHUwMENEc2xhbmQpXCIsXG5cdGdhOiBcIkdhZWlsZ2VcIixcblx0XCJnYS1JRVwiOiBcIkdhZWlsZ2UgKFx1MDBDOWlyZSlcIixcblx0Y3k6IFwiQ3ltcmFlZ1wiLFxuXHRcImN5LUdCXCI6IFwiQ3ltcmFlZyAoWSBEZXlybmFzIFVuZWRpZylcIixcblx0c3E6IFwiU2hxaXBcIixcblx0XCJzcS1BTFwiOiBcIlNocWlwIChTaHFpcFx1MDBFQnJpYSlcIixcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgbGFuZ3VhZ2VzIH0gZnJvbSBcIi4vbWFwL2xhbmd1YWdlcy5tanNcIjtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlIGJhc2VkIG9uIGJyb3dzZXIgc2V0dGluZ3MgYW5kIGF2YWlsYWJsZSBsYW5ndWFnZSBvcHRpb25zLlxuICpcbiAqIEl0IGV2YWx1YXRlcyB0aGUgY3VycmVudCBIVE1MIGRvY3VtZW50IGxhbmd1YWdlLCB0aGUgYnJvd3NlcidzIGRlZmluZWQgbGFuZ3VhZ2VzLCBhbmRcbiAqIHRoZSBsYW5ndWFnZSBvcHRpb25zIGZyb20gYDxsaW5rPmAgZWxlbWVudHMgd2l0aCBgaHJlZmxhbmdgIGF0dHJpYnV0ZXMgaW4gdGhlIGRvY3VtZW50LlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldGVjdGVkIGxhbmd1YWdlLCBwcmVmZXJyZWQgbGFuZ3VhZ2UsIGFuZCBhdmFpbGFibGUgbGFuZ3VhZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0VXNlckxhbmd1YWdlUHJlZmVyZW5jZSgpIHtcblx0Y29uc3QgY3VycmVudExhbmcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZztcblxuXHRsZXQgcHJlZmVycmVkTGFuZ3VhZ2VzID0gW107XG5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IubGFuZ3VhZ2UgPT09IFwic3RyaW5nXCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlLmxlbmd0aCA+IDApIHtcblx0XHRwcmVmZXJyZWRMYW5ndWFnZXMgPSBbbmF2aWdhdG9yLmxhbmd1YWdlXTtcblx0fVxuXG5cdGlmIChBcnJheS5pc0FycmF5KG5hdmlnYXRvci5sYW5ndWFnZXMpICYmIG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoID4gMCkge1xuXHRcdHByZWZlcnJlZExhbmd1YWdlcyA9IG5hdmlnYXRvci5sYW5ndWFnZXM7XG5cdH1cblxuXHQvLyBhZGQgdG8gcHJlZmVycmVkTGFuZ3VhZ2VzIGFsbCB0aGUgYmFzZSBsYW5ndWFnZXMgb2YgdGhlIHByZWZlcnJlZCBsYW5ndWFnZXNcblx0cHJlZmVycmVkTGFuZ3VhZ2VzID0gcHJlZmVycmVkTGFuZ3VhZ2VzLmNvbmNhdChcblx0XHRwcmVmZXJyZWRMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnNwbGl0KFwiLVwiKVswXSksXG5cdCk7XG5cblx0aWYgKCFjdXJyZW50TGFuZyAmJiBwcmVmZXJyZWRMYW5ndWFnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6IFwiTm8gbGFuZ3VhZ2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlLlwiLFxuXHRcdH07XG5cdH1cblxuXHRjb25zdCBsaW5rVGFncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW2hyZWZsYW5nXVwiKTtcblx0aWYgKGxpbmtUYWdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjdXJyZW50OiBjdXJyZW50TGFuZyB8fCBudWxsLFxuXHRcdFx0bWVzc2FnZTogXCJObyA8bGluaz4gdGFncyB3aXRoIGhyZWZsYW5nIGF2YWlsYWJsZS5cIixcblx0XHR9O1xuXHR9XG5cblx0Y29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gWy4uLmxpbmtUYWdzXS5tYXAoKGxpbmspID0+IHtcblx0XHRjb25zdCBmdWxsTGFuZyA9IGxpbmsuaHJlZmxhbmc7XG5cdFx0Y29uc3QgYmFzZUxhbmcgPSBmdWxsTGFuZy5zcGxpdChcIi1cIilbMF07XG5cdFx0bGV0IGxhYmVsID0gbGluay5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1vbnN0ZXItbGFiZWxcIik7XG5cdFx0aWYgKCFsYWJlbCkge1xuXHRcdFx0bGFiZWwgPSBsaW5rLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuXHRcdFx0aWYgKCFsYWJlbCkge1xuXHRcdFx0XHRsYWJlbCA9IGxhbmd1YWdlcz8uW2Z1bGxMYW5nXTtcblx0XHRcdFx0aWYgKCFsYWJlbCkge1xuXHRcdFx0XHRcdGxhYmVsID0gbGFuZ3VhZ2VzPy5bYmFzZUxhbmddO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZ1bGxMYW5nLFxuXHRcdFx0YmFzZUxhbmcsXG5cdFx0XHRsYWJlbCxcblx0XHRcdGhyZWY6IGxpbmsuaHJlZixcblx0XHR9O1xuXHR9KTtcblxuXHQvLyBmaWx0ZXIgYXZhaWxhYmxlTGFuZ3VhZ2VzIHRvIG9ubHkgaW5jbHVkZSBsYW5ndWFnZXMgdGhhdCBhcmUgaW4gdGhlIHByZWZlcnJlZExhbmd1YWdlcyBhcnJheVxuXHRjb25zdCBvZmZlcmFibGVMYW5ndWFnZXMgPSBhdmFpbGFibGVMYW5ndWFnZXMuZmlsdGVyKFxuXHRcdChsYW5nKSA9PlxuXHRcdFx0cHJlZmVycmVkTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmcuZnVsbExhbmcpIHx8XG5cdFx0XHRwcmVmZXJyZWRMYW5ndWFnZXMuaW5jbHVkZXMobGFuZy5iYXNlTGFuZyksXG5cdCk7XG5cblx0aWYgKG9mZmVyYWJsZUxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Y3VycmVudDogY3VycmVudExhbmcgfHwgbnVsbCxcblx0XHRcdG1lc3NhZ2U6IFwiTm8gYXZhaWxhYmxlIGxhbmd1YWdlcyBtYXRjaCB0aGUgdXNlcidzIHByZWZlcmVuY2VzLlwiLFxuXHRcdFx0YXZhaWxhYmxlOiBhdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiAoe1xuXHRcdFx0XHQuLi5sYW5nLFxuXHRcdFx0XHR3ZWlnaHQ6IDEsXG5cdFx0XHR9KSksXG5cdFx0fTtcblx0fVxuXG5cdC8vIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIFwid2VpZ2h0XCIgb2YgYSBsYW5ndWFnZSBtYXRjaFxuXHRmdW5jdGlvbiBnZXRXZWlnaHQobGFuZ0VudHJ5KSB7XG5cdFx0Ly8gRnVsbCBtYXRjaCBoYXMgcHJpb3JpdHkgM1xuXHRcdGlmIChwcmVmZXJyZWRMYW5ndWFnZXMuaW5jbHVkZXMobGFuZ0VudHJ5LmZ1bGxMYW5nKSkgcmV0dXJuIDM7XG5cdFx0Ly8gQmFzZSBsYW5ndWFnZSBtYXRjaCBoYXMgcHJpb3JpdHkgMlxuXHRcdGlmIChwcmVmZXJyZWRMYW5ndWFnZXMuaW5jbHVkZXMobGFuZ0VudHJ5LmJhc2VMYW5nKSkgcmV0dXJuIDI7XG5cdFx0Ly8gTm8gbWF0Y2ggaXMgcHJpb3JpdHkgMVxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0Ly8gU29ydCB0aGUgYXZhaWxhYmxlIGxhbmd1YWdlcyBieSBkZXNjZW5kaW5nIHdlaWdodFxuXHRvZmZlcmFibGVMYW5ndWFnZXMuc29ydCgoYSwgYikgPT4gZ2V0V2VpZ2h0KGIpIC0gZ2V0V2VpZ2h0KGEpKTtcblxuXHQvLyBUaGUgYmVzdCBtYXRjaCBpcyB0aGUgZmlyc3QgaW4gdGhlIHNvcnRlZCBsaXN0XG5cdGNvbnN0IGJlc3RNYXRjaCA9IG9mZmVyYWJsZUxhbmd1YWdlc1swXTtcblx0Y29uc3QgYmVzdE1hdGNoV2VpZ2h0ID0gZ2V0V2VpZ2h0KGJlc3RNYXRjaCk7XG5cblx0Y29uc3QgY3VycmVudExhYmVsID0gbGFuZ3VhZ2VzPy5bY3VycmVudExhbmddIHx8IGN1cnJlbnRMYW5nO1xuXG5cdC8vIElmIHdlIGZvdW5kIGEgbGFuZ3VhZ2UgdGhhdCBtYXRjaGVzIHVzZXIgcHJlZmVyZW5jZXMgKHdlaWdodCA+IDEpXG5cdGlmIChiZXN0TWF0Y2hXZWlnaHQgPiAwKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGN1cnJlbnQ6IGN1cnJlbnRMYW5nIHx8IG51bGwsXG5cdFx0XHRjdXJyZW50TGFiZWw6IGN1cnJlbnRMYWJlbCxcblx0XHRcdHByZWZlcnJlZDoge1xuXHRcdFx0XHRmdWxsOiBiZXN0TWF0Y2guZnVsbExhbmcsXG5cdFx0XHRcdGJhc2U6IGJlc3RNYXRjaC5iYXNlTGFuZyxcblx0XHRcdFx0bGFiZWw6IGJlc3RNYXRjaC5sYWJlbCxcblx0XHRcdFx0aHJlZjogYmVzdE1hdGNoLmhyZWYsXG5cdFx0XHR9LFxuXHRcdFx0YXZhaWxhYmxlOiBhdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiAoe1xuXHRcdFx0XHQuLi5sYW5nLFxuXHRcdFx0XHR3ZWlnaHQ6IGdldFdlaWdodChsYW5nKSxcblx0XHRcdH0pKSxcblx0XHRcdG9mZmVyYWJsZTogb2ZmZXJhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZykgPT4gKHtcblx0XHRcdFx0Li4ubGFuZyxcblx0XHRcdFx0d2VpZ2h0OiBnZXRXZWlnaHQobGFuZyksXG5cdFx0XHR9KSksXG5cdFx0fTtcblx0fVxuXG5cdC8vIElmIG5vIGxhbmd1YWdlIG1hdGNoZWQgdGhlIHVzZXIncyBwcmVmZXJlbmNlc1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IGN1cnJlbnRMYW5nIHx8IG51bGwsXG5cdFx0bWVzc2FnZTogXCJOb25lIG9mIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2VzIGFyZSBhdmFpbGFibGUuXCIsXG5cdFx0YXZhaWxhYmxlOiBhdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiAoe1xuXHRcdFx0Li4ubGFuZyxcblx0XHRcdHdlaWdodDogZ2V0V2VpZ2h0KGxhbmcpLFxuXHRcdH0pKSxcblx0fTtcbn1cbiIsICJpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcblxuICAgIChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHNheXN3aG8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwgdGVtLFxuICAgICAgICAgICAgICAgIE0gPSB1YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cXC8pKVxcLz9cXHMqKFxcZCspL2kpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKC90cmlkZW50L2kudGVzdChNWzFdKSkge1xuICAgICAgICAgICAgICAgIHRlbSA9IC9cXGJydlsgOl0rKFxcZCspL2cuZXhlYyh1YSkgfHwgW107XG4gICAgICAgICAgICAgICAgcmV0dXJuICdJRSAnICsgKHRlbVsxXSB8fCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTVsxXSA9PT0gJ0Nocm9tZScpIHtcbiAgICAgICAgICAgICAgICB0ZW0gPSB1YS5tYXRjaCgvXFxiKE9QUnxFZGdlKVxcLyhcXGQrKS8pO1xuICAgICAgICAgICAgICAgIGlmICh0ZW0gIT0gbnVsbCkgcmV0dXJuIHRlbS5zbGljZSgxKS5qb2luKCcgJykucmVwbGFjZSgnT1BSJywgJ09wZXJhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBNID0gTVsyXSA/IFtNWzFdLCBNWzJdXSA6IFtuYXZpZ2F0b3IuYXBwTmFtZSwgbmF2aWdhdG9yLmFwcFZlcnNpb24sICctPyddO1xuICAgICAgICAgICAgaWYgKCh0ZW0gPSB1YS5tYXRjaCgvdmVyc2lvblxcLyhcXGQrKS9pKSkgIT0gbnVsbCkgTS5zcGxpY2UoMSwgMSwgdGVtWzFdKTtcbiAgICAgICAgICAgIHJldHVybiBNLmpvaW4oJyAnKTtcbiAgICAgICAgfSkoKTtcblxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKVxuICAgICAgICBlbGVtZW50LmlubmVySFRNTCArPSBcIiBcIiArIHNheXN3aG87XG5cbiAgICB9KSgpO1xuXG5cbn1cbiIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuXG5cbi8vIGxhbmd1YWdlPWh0bWxcbmxldCBodG1sMSA9IGBcbiAgICA8bW9uc3Rlci10YWJzIGlkPVwibXl0YWJzXCI+XG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLWJ1dHRvbi1sYWJlbD1cIlRBQjFcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgRGFzIGlzdCB0YWIgMVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLWJ1dHRvbi1sYWJlbD1cIlRBQjJcIj5cbiAgICAgICAgICAgIERhcyBpc3QgdGFiIDJcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICBEYXMgaXN0IHRhYiAzIG9obmUgYnV0dG9uXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PjwvZGl2PlxuICAgIDwvbW9uc3Rlci10YWJzPlxuYDtcblxubGV0IFRhYnM7XG5cbmRlc2NyaWJlKCdUYWJzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuXG4gICAgICAgICAgICBpZiAoIWdsb2JhbFsnY3J5cHRvJ10pIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG8gPSBtWydDcnlwdG8nXTtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsWydjcnlwdG8nXSA9IG5ldyBDcnlwdG8oKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3RhYnMubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBUYWJzID0gbVsnVGFicyddO1xuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIGJ1dHRvbnMgYW5kIHRhYnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215dGFicycpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0YWJzKS5pcy5pbnN0YW5jZW9mKFRhYnMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hdiA9IHRhYnMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCduYXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0YWJzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uW3BhcnQ9YnV0dG9uXScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGJ1dHRvbnNbMF0pLmlzLmluc3RhbmNlb2YoSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG5hdi5oYXNDaGlsZE5vZGVzKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoYnV0dG9ucy5sZW5ndGgpLnRvLmJlLmVxdWFsKDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDApXG5cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSwgMClcblxuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX25hbWUgPSAodGFyZ2V0LCB2YWx1ZSkgPT4gX19kZWZQcm9wKHRhcmdldCwgXCJuYW1lXCIsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHtcbiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7XG59O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xuXG4vLyAoZGlzYWJsZWQpOnV0aWxcbnZhciByZXF1aXJlX3V0aWwgPSBfX2NvbW1vbkpTKHtcbiAgXCIoZGlzYWJsZWQpOnV0aWxcIigpIHtcbiAgfVxufSk7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luZGV4LmpzXG52YXIgdXRpbHNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQodXRpbHNfZXhwb3J0cywge1xuICBhZGRDaGFpbmFibGVNZXRob2Q6ICgpID0+IGFkZENoYWluYWJsZU1ldGhvZCxcbiAgYWRkTGVuZ3RoR3VhcmQ6ICgpID0+IGFkZExlbmd0aEd1YXJkLFxuICBhZGRNZXRob2Q6ICgpID0+IGFkZE1ldGhvZCxcbiAgYWRkUHJvcGVydHk6ICgpID0+IGFkZFByb3BlcnR5LFxuICBjaGVja0Vycm9yOiAoKSA9PiBjaGVja19lcnJvcl9leHBvcnRzLFxuICBjb21wYXJlQnlJbnNwZWN0OiAoKSA9PiBjb21wYXJlQnlJbnNwZWN0LFxuICBlcWw6ICgpID0+IGRlZXBfZXFsX2RlZmF1bHQsXG4gIGV4cGVjdFR5cGVzOiAoKSA9PiBleHBlY3RUeXBlcyxcbiAgZmxhZzogKCkgPT4gZmxhZyxcbiAgZ2V0QWN0dWFsOiAoKSA9PiBnZXRBY3R1YWwsXG4gIGdldE1lc3NhZ2U6ICgpID0+IGdldE1lc3NhZ2UyLFxuICBnZXROYW1lOiAoKSA9PiBnZXROYW1lLFxuICBnZXRPcGVyYXRvcjogKCkgPT4gZ2V0T3BlcmF0b3IsXG4gIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzOiAoKSA9PiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyxcbiAgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sczogKCkgPT4gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UGF0aEluZm86ICgpID0+IGdldFBhdGhJbmZvLFxuICBoYXNQcm9wZXJ0eTogKCkgPT4gaGFzUHJvcGVydHksXG4gIGluc3BlY3Q6ICgpID0+IGluc3BlY3QyLFxuICBpc05hTjogKCkgPT4gaXNOYU4yLFxuICBpc051bWVyaWM6ICgpID0+IGlzTnVtZXJpYyxcbiAgaXNQcm94eUVuYWJsZWQ6ICgpID0+IGlzUHJveHlFbmFibGVkLFxuICBpc1JlZ0V4cDogKCkgPT4gaXNSZWdFeHAyLFxuICBvYmpEaXNwbGF5OiAoKSA9PiBvYmpEaXNwbGF5LFxuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2Q6ICgpID0+IG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCxcbiAgb3ZlcndyaXRlTWV0aG9kOiAoKSA9PiBvdmVyd3JpdGVNZXRob2QsXG4gIG92ZXJ3cml0ZVByb3BlcnR5OiAoKSA9PiBvdmVyd3JpdGVQcm9wZXJ0eSxcbiAgcHJveGlmeTogKCkgPT4gcHJveGlmeSxcbiAgdGVzdDogKCkgPT4gdGVzdCxcbiAgdHJhbnNmZXJGbGFnczogKCkgPT4gdHJhbnNmZXJGbGFncyxcbiAgdHlwZTogKCkgPT4gdHlwZVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qc1xudmFyIGNoZWNrX2Vycm9yX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoZWNrX2Vycm9yX2V4cG9ydHMsIHtcbiAgY29tcGF0aWJsZUNvbnN0cnVjdG9yOiAoKSA9PiBjb21wYXRpYmxlQ29uc3RydWN0b3IsXG4gIGNvbXBhdGlibGVJbnN0YW5jZTogKCkgPT4gY29tcGF0aWJsZUluc3RhbmNlLFxuICBjb21wYXRpYmxlTWVzc2FnZTogKCkgPT4gY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogKCkgPT4gZ2V0Q29uc3RydWN0b3JOYW1lLFxuICBnZXRNZXNzYWdlOiAoKSA9PiBnZXRNZXNzYWdlXG59KTtcbmZ1bmN0aW9uIGlzRXJyb3JJbnN0YW5jZShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRXJyb3JdXCI7XG59XG5fX25hbWUoaXNFcnJvckluc3RhbmNlLCBcImlzRXJyb3JJbnN0YW5jZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAsIFwiaXNSZWdFeHBcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuX19uYW1lKGNvbXBhdGlibGVJbnN0YW5jZSwgXCJjb21wYXRpYmxlSW5zdGFuY2VcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpKSB7XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVycm9yTGlrZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZXJyb3JMaWtlID09PSBcImZ1bmN0aW9uXCIpICYmIGVycm9yTGlrZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdGhyb3duLmNvbnN0cnVjdG9yID09PSBlcnJvckxpa2UgfHwgdGhyb3duIGluc3RhbmNlb2YgZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShjb21wYXRpYmxlQ29uc3RydWN0b3IsIFwiY29tcGF0aWJsZUNvbnN0cnVjdG9yXCIpO1xuZnVuY3Rpb24gY29tcGF0aWJsZU1lc3NhZ2UodGhyb3duLCBlcnJNYXRjaGVyKSB7XG4gIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0eXBlb2YgdGhyb3duID09PSBcInN0cmluZ1wiID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChpc1JlZ0V4cChlcnJNYXRjaGVyKSkge1xuICAgIHJldHVybiBlcnJNYXRjaGVyLnRlc3QoY29tcGFyaXNvblN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyck1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUoY29tcGF0aWJsZU1lc3NhZ2UsIFwiY29tcGF0aWJsZU1lc3NhZ2VcIik7XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUoZXJyb3JMaWtlKSB7XG4gIGxldCBjb25zdHJ1Y3Rvck5hbWUgPSBlcnJvckxpa2U7XG4gIGlmIChpc0Vycm9ySW5zdGFuY2UoZXJyb3JMaWtlKSkge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckxpa2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5uYW1lO1xuICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgPT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yTmFtZSA9IG5ldyBlcnJvckxpa2UoKS5uYW1lO1xuICAgICAgY29uc3RydWN0b3JOYW1lID0gbmV3Q29uc3RydWN0b3JOYW1lIHx8IGNvbnN0cnVjdG9yTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cbl9fbmFtZShnZXRDb25zdHJ1Y3Rvck5hbWUsIFwiZ2V0Q29uc3RydWN0b3JOYW1lXCIpO1xuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgbGV0IG1zZyA9IFwiXCI7XG4gIGlmIChlcnJvckxpa2UgJiYgZXJyb3JMaWtlLm1lc3NhZ2UpIHtcbiAgICBtc2cgPSBlcnJvckxpa2UubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZSwgXCJnZXRNZXNzYWdlXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9mbGFnLmpzXG5mdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICB2YXIgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZmxhZ3Nba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmbGFnc1trZXldO1xuICB9XG59XG5fX25hbWUoZmxhZywgXCJmbGFnXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy90ZXN0LmpzXG5mdW5jdGlvbiB0ZXN0KG9iaiwgYXJncykge1xuICB2YXIgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn1cbl9fbmFtZSh0ZXN0LCBcInRlc3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3R5cGUtZGV0ZWN0LmpzXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcbiAgcmV0dXJuIHR5cGUzO1xufVxuX19uYW1lKHR5cGUsIFwidHlwZVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2Fzc2VydGlvbi1lcnJvci9pbmRleC5qc1xudmFyIGNhbkVsaWRlRnJhbWVzID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yO1xudmFyIEFzc2VydGlvbkVycm9yID0gY2xhc3MgX0Fzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMge1xuICAgIF9fbmFtZSh0aGlzLCBcIkFzc2VydGlvbkVycm9yXCIpO1xuICB9XG4gIG1lc3NhZ2U7XG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBcIkFzc2VydGlvbkVycm9yXCI7XG4gIH1cbiAgZ2V0IG9rKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJVbnNwZWNpZmllZCBBc3NlcnRpb25FcnJvclwiLCBwcm9wcywgc3NmKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBpZiAoY2FuRWxpZGVGcmFtZXMpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHNzZiB8fCBfQXNzZXJ0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgaWYgKCEoa2V5IGluIHRoaXMpKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHByb3BzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRvSlNPTihzdGFjaykge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgb2s6IGZhbHNlLFxuICAgICAgc3RhY2s6IHN0YWNrICE9PSBmYWxzZSA/IHRoaXMuc3RhY2sgOiB2b2lkIDBcbiAgICB9O1xuICB9XG59O1xuXG4vLyBsaWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qc1xuZnVuY3Rpb24gZXhwZWN0VHlwZXMob2JqLCB0eXBlcykge1xuICB2YXIgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIHZhciBzc2ZpID0gZmxhZyhvYmosIFwic3NmaVwiKTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgb2JqID0gZmxhZyhvYmosIFwib2JqZWN0XCIpO1xuICB0eXBlcyA9IHR5cGVzLm1hcChmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIHR5cGVzLnNvcnQoKTtcbiAgdmFyIHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbih0LCBpbmRleCkge1xuICAgIHZhciBhcnQgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0LmNoYXJBdCgwKSkgPyBcImFuXCIgOiBcImFcIjtcbiAgICB2YXIgb3IgPSB0eXBlcy5sZW5ndGggPiAxICYmIGluZGV4ID09PSB0eXBlcy5sZW5ndGggLSAxID8gXCJvciBcIiA6IFwiXCI7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgXCIgXCIgKyB0O1xuICB9KS5qb2luKFwiLCBcIik7XG4gIHZhciBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiBvYmpUeXBlID09PSBleHBlY3RlZDtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJvYmplY3QgdGVzdGVkIG11c3QgYmUgXCIgKyBzdHIgKyBcIiwgYnV0IFwiICsgb2JqVHlwZSArIFwiIGdpdmVuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGV4cGVjdFR5cGVzLCBcImV4cGVjdFR5cGVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanNcbmZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn1cbl9fbmFtZShnZXRBY3R1YWwsIFwiZ2V0QWN0dWFsXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2hlbHBlcnMuanNcbnZhciBhbnNpQ29sb3JzID0ge1xuICBib2xkOiBbXCIxXCIsIFwiMjJcIl0sXG4gIGRpbTogW1wiMlwiLCBcIjIyXCJdLFxuICBpdGFsaWM6IFtcIjNcIiwgXCIyM1wiXSxcbiAgdW5kZXJsaW5lOiBbXCI0XCIsIFwiMjRcIl0sXG4gIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICBpbnZlcnNlOiBbXCI3XCIsIFwiMjdcIl0sXG4gIGhpZGRlbjogW1wiOFwiLCBcIjI4XCJdLFxuICBzdHJpa2U6IFtcIjlcIiwgXCIyOVwiXSxcbiAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICBibGFjazogW1wiMzBcIiwgXCIzOVwiXSxcbiAgcmVkOiBbXCIzMVwiLCBcIjM5XCJdLFxuICBncmVlbjogW1wiMzJcIiwgXCIzOVwiXSxcbiAgeWVsbG93OiBbXCIzM1wiLCBcIjM5XCJdLFxuICBibHVlOiBbXCIzNFwiLCBcIjM5XCJdLFxuICBtYWdlbnRhOiBbXCIzNVwiLCBcIjM5XCJdLFxuICBjeWFuOiBbXCIzNlwiLCBcIjM5XCJdLFxuICB3aGl0ZTogW1wiMzdcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0YmxhY2s6IFtcIjMwOzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0cmVkOiBbXCIzMTsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodGdyZWVuOiBbXCIzMjsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodHllbGxvdzogW1wiMzM7MVwiLCBcIjM5XCJdLFxuICBicmlnaHRibHVlOiBbXCIzNDsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodG1hZ2VudGE6IFtcIjM1OzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0Y3lhbjogW1wiMzY7MVwiLCBcIjM5XCJdLFxuICBicmlnaHR3aGl0ZTogW1wiMzc7MVwiLCBcIjM5XCJdLFxuICBncmV5OiBbXCI5MFwiLCBcIjM5XCJdXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgc3BlY2lhbDogXCJjeWFuXCIsXG4gIG51bWJlcjogXCJ5ZWxsb3dcIixcbiAgYmlnaW50OiBcInllbGxvd1wiLFxuICBib29sZWFuOiBcInllbGxvd1wiLFxuICB1bmRlZmluZWQ6IFwiZ3JleVwiLFxuICBudWxsOiBcImJvbGRcIixcbiAgc3RyaW5nOiBcImdyZWVuXCIsXG4gIHN5bWJvbDogXCJncmVlblwiLFxuICBkYXRlOiBcIm1hZ2VudGFcIixcbiAgcmVnZXhwOiBcInJlZFwiXG59O1xudmFyIHRydW5jYXRvciA9IFwiXFx1MjAyNlwiO1xuZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCBcIlwiO1xuICBpZiAoIWNvbG9yKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGBcXHgxQlske2NvbG9yWzBdfW0ke1N0cmluZyh2YWx1ZSl9XFx4MUJbJHtjb2xvclsxXX1tYDtcbn1cbl9fbmFtZShjb2xvcmlzZSwgXCJjb2xvcmlzZVwiKTtcbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoe1xuICBzaG93SGlkZGVuID0gZmFsc2UsXG4gIGRlcHRoID0gMixcbiAgY29sb3JzID0gZmFsc2UsXG4gIGN1c3RvbUluc3BlY3QgPSB0cnVlLFxuICBzaG93UHJveHkgPSBmYWxzZSxcbiAgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSxcbiAgYnJlYWtMZW5ndGggPSBJbmZpbml0eSxcbiAgc2VlbiA9IFtdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRydW5jYXRlOiB0cnVuY2F0ZTIgPSBJbmZpbml0eSxcbiAgc3R5bGl6ZSA9IFN0cmluZ1xufSA9IHt9LCBpbnNwZWN0Mykge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlMiksXG4gICAgc2VlbixcbiAgICBpbnNwZWN0OiBpbnNwZWN0MyxcbiAgICBzdHlsaXplXG4gIH07XG4gIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuX19uYW1lKG5vcm1hbGlzZU9wdGlvbnMsIFwibm9ybWFsaXNlT3B0aW9uc1wiKTtcbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gIHJldHVybiBjaGFyID49IFwiXFx1RDgwMFwiICYmIGNoYXIgPD0gXCJcXHVEQkZGXCI7XG59XG5fX25hbWUoaXNIaWdoU3Vycm9nYXRlLCBcImlzSGlnaFN1cnJvZ2F0ZVwiKTtcbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCB0YWlsID0gdHJ1bmNhdG9yKSB7XG4gIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICBpZiAoZW5kID4gMCAmJiBpc0hpZ2hTdXJyb2dhdGUoc3RyaW5nW2VuZCAtIDFdKSkge1xuICAgICAgZW5kID0gZW5kIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5fX25hbWUodHJ1bmNhdGUsIFwidHJ1bmNhdGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gXCIsIFwiKSB7XG4gIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICBjb25zdCBzaXplID0gbGlzdC5sZW5ndGg7XG4gIGlmIChzaXplID09PSAwKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGU7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBsZXQgcGVlayA9IFwiXCI7XG4gIGxldCB0cnVuY2F0ZWQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGNvbnN0IGxhc3QgPSBpICsgMSA9PT0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgY29uc3QgdmFsdWUgPSBsaXN0W2ldO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpbmcgPSBwZWVrIHx8IGluc3BlY3RJdGVtKHZhbHVlLCBvcHRpb25zKSArIChsYXN0ID8gXCJcIiA6IHNlcGFyYXRvcik7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoO1xuICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGVlayA9IGxhc3QgPyBcIlwiIDogaW5zcGVjdEl0ZW0obGlzdFtpICsgMV0sIG9wdGlvbnMpICsgKHNlY29uZFRvTGFzdCA/IFwiXCIgOiBzZXBhcmF0b3IpO1xuICAgIGlmICghbGFzdCAmJiBzZWNvbmRUb0xhc3QgJiYgdHJ1bmNhdGVkTGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID4gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdHJ1bmNhdGVkID0gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5fX25hbWUoaW5zcGVjdExpc3QsIFwiaW5zcGVjdExpc3RcIik7XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG59XG5fX25hbWUocXVvdGVDb21wbGV4S2V5LCBcInF1b3RlQ29tcGxleEtleVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSAyO1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHtrZXl9OiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdFByb3BlcnR5LCBcImluc3BlY3RQcm9wZXJ0eVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9hcnJheS5qc1xuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gXCJbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBsaXN0Q29udGVudHMubGVuZ3RoO1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICB9XG4gIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6IFwiXCJ9IF1gO1xufVxuX19uYW1lKGluc3BlY3RBcnJheSwgXCJpbnNwZWN0QXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvdHlwZWRhcnJheS5qc1xudmFyIGdldEFycmF5TmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGFycmF5KSA9PiB7XG4gIGlmICh0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gXCJCdWZmZXJcIjtcbiAgfVxuICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgIHJldHVybiBhcnJheVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufSwgXCJnZXRBcnJheU5hbWVcIik7XG5mdW5jdGlvbiBpbnNwZWN0VHlwZWRBcnJheShhcnJheSwgb3B0aW9ucykge1xuICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gYCR7b3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKGFycmF5W2ldLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIil9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gXCJcIiA6IFwiLCBcIn1gO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG91dHB1dCArPSBzdHJpbmc7XG4gIH1cbiAgbGV0IHByb3BlcnR5Q29udGVudHMgPSBcIlwiO1xuICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKChrZXkpID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgfVxuICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogXCJcIn0gXWA7XG59XG5fX25hbWUoaW5zcGVjdFR5cGVkQXJyYXksIFwiaW5zcGVjdFR5cGVkQXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvZGF0ZS5qc1xuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICBjb25zdCBzdHJpbmdSZXByZXNlbnRhdGlvbiA9IGRhdGVPYmplY3QudG9KU09OKCk7XG4gIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIkludmFsaWQgRGF0ZVwiO1xuICB9XG4gIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoXCJUXCIpO1xuICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgXCJkYXRlXCIpO1xufVxuX19uYW1lKGluc3BlY3REYXRlLCBcImluc3BlY3REYXRlXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Z1bmN0aW9uLmpzXG5mdW5jdGlvbiBpbnNwZWN0RnVuY3Rpb24oZnVuYywgb3B0aW9ucykge1xuICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJGdW5jdGlvblwiO1xuICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsIFwic3BlY2lhbFwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgXCJzcGVjaWFsXCIpO1xufVxuX19uYW1lKGluc3BlY3RGdW5jdGlvbiwgXCJpbnNwZWN0RnVuY3Rpb25cIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbWFwLmpzXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAga2V5ID0gb3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyk7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICByZXR1cm4gYCR7a2V5fSA9PiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdE1hcEVudHJ5LCBcImluc3BlY3RNYXBFbnRyeVwiKTtcbmZ1bmN0aW9uIG1hcFRvRW50cmllcyhtYXApIHtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG5fX25hbWUobWFwVG9FbnRyaWVzLCBcIm1hcFRvRW50cmllc1wiKTtcbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gIGNvbnN0IHNpemUgPSBtYXAuc2l6ZSAtIDE7XG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gXCJNYXB7fVwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgcmV0dXJuIGBNYXB7ICR7aW5zcGVjdExpc3QobWFwVG9FbnRyaWVzKG1hcCksIG9wdGlvbnMsIGluc3BlY3RNYXBFbnRyeSl9IH1gO1xufVxuX19uYW1lKGluc3BlY3RNYXAsIFwiaW5zcGVjdE1hcFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9udW1iZXIuanNcbnZhciBpc05hTiA9IE51bWJlci5pc05hTiB8fCAoKGkpID0+IGkgIT09IGkpO1xuZnVuY3Rpb24gaW5zcGVjdE51bWJlcihudW1iZXIsIG9wdGlvbnMpIHtcbiAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiTmFOXCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShcIkluZmluaXR5XCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCItSW5maW5pdHlcIiwgXCJudW1iZXJcIik7XG4gIH1cbiAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoMSAvIG51bWJlciA9PT0gSW5maW5pdHkgPyBcIiswXCIgOiBcIi0wXCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUodHJ1bmNhdGUoU3RyaW5nKG51bWJlciksIG9wdGlvbnMudHJ1bmNhdGUpLCBcIm51bWJlclwiKTtcbn1cbl9fbmFtZShpbnNwZWN0TnVtYmVyLCBcImluc3BlY3ROdW1iZXJcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvYmlnaW50LmpzXG5mdW5jdGlvbiBpbnNwZWN0QmlnSW50KG51bWJlciwgb3B0aW9ucykge1xuICBsZXQgbnVtcyA9IHRydW5jYXRlKG51bWJlci50b1N0cmluZygpLCBvcHRpb25zLnRydW5jYXRlIC0gMSk7XG4gIGlmIChudW1zICE9PSB0cnVuY2F0b3IpXG4gICAgbnVtcyArPSBcIm5cIjtcbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShudW1zLCBcImJpZ2ludFwiKTtcbn1cbl9fbmFtZShpbnNwZWN0QmlnSW50LCBcImluc3BlY3RCaWdJbnRcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvcmVnZXhwLmpzXG5mdW5jdGlvbiBpbnNwZWN0UmVnRXhwKHZhbHVlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGZsYWdzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdChcIi9cIilbMl07XG4gIGNvbnN0IHNvdXJjZUxlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGUgLSAoMiArIGZsYWdzLmxlbmd0aCk7XG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlLnNvdXJjZTtcbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgLyR7dHJ1bmNhdGUoc291cmNlLCBzb3VyY2VMZW5ndGgpfS8ke2ZsYWdzfWAsIFwicmVnZXhwXCIpO1xufVxuX19uYW1lKGluc3BlY3RSZWdFeHAsIFwiaW5zcGVjdFJlZ0V4cFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9zZXQuanNcbmZ1bmN0aW9uIGFycmF5RnJvbVNldChzZXQyKSB7XG4gIGNvbnN0IHZhbHVlcyA9IFtdO1xuICBzZXQyLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cbl9fbmFtZShhcnJheUZyb21TZXQsIFwiYXJyYXlGcm9tU2V0XCIpO1xuZnVuY3Rpb24gaW5zcGVjdFNldChzZXQyLCBvcHRpb25zKSB7XG4gIGlmIChzZXQyLnNpemUgPT09IDApXG4gICAgcmV0dXJuIFwiU2V0e31cIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA3O1xuICByZXR1cm4gYFNldHsgJHtpbnNwZWN0TGlzdChhcnJheUZyb21TZXQoc2V0MiksIG9wdGlvbnMpfSB9YDtcbn1cbl9fbmFtZShpbnNwZWN0U2V0LCBcImluc3BlY3RTZXRcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvc3RyaW5nLmpzXG52YXIgc3RyaW5nRXNjYXBlQ2hhcnMgPSBuZXcgUmVnRXhwKFwiWydcXFxcdTAwMDAtXFxcXHUwMDFmXFxcXHUwMDdmLVxcXFx1MDA5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXVwiLCBcImdcIik7XG52YXIgZXNjYXBlQ2hhcmFjdGVycyA9IHtcbiAgXCJcXGJcIjogXCJcXFxcYlwiLFxuICBcIlx0XCI6IFwiXFxcXHRcIixcbiAgXCJcXG5cIjogXCJcXFxcblwiLFxuICBcIlxcZlwiOiBcIlxcXFxmXCIsXG4gIFwiXFxyXCI6IFwiXFxcXHJcIixcbiAgXCInXCI6IFwiXFxcXCdcIixcbiAgXCJcXFxcXCI6IFwiXFxcXFxcXFxcIlxufTtcbnZhciBoZXggPSAxNjtcbnZhciB1bmljb2RlTGVuZ3RoID0gNDtcbmZ1bmN0aW9uIGVzY2FwZShjaGFyKSB7XG4gIHJldHVybiBlc2NhcGVDaGFyYWN0ZXJzW2NoYXJdIHx8IGBcXFxcdSR7YDAwMDAke2NoYXIuY2hhckNvZGVBdCgwKS50b1N0cmluZyhoZXgpfWAuc2xpY2UoLXVuaWNvZGVMZW5ndGgpfWA7XG59XG5fX25hbWUoZXNjYXBlLCBcImVzY2FwZVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyaW5nLCBvcHRpb25zKSB7XG4gIGlmIChzdHJpbmdFc2NhcGVDaGFycy50ZXN0KHN0cmluZykpIHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShzdHJpbmdFc2NhcGVDaGFycywgZXNjYXBlKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGAnJHt0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMudHJ1bmNhdGUgLSAyKX0nYCwgXCJzdHJpbmdcIik7XG59XG5fX25hbWUoaW5zcGVjdFN0cmluZywgXCJpbnNwZWN0U3RyaW5nXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3N5bWJvbC5qc1xuZnVuY3Rpb24gaW5zcGVjdFN5bWJvbCh2YWx1ZSkge1xuICBpZiAoXCJkZXNjcmlwdGlvblwiIGluIFN5bWJvbC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdmFsdWUuZGVzY3JpcHRpb24gPyBgU3ltYm9sKCR7dmFsdWUuZGVzY3JpcHRpb259KWAgOiBcIlN5bWJvbCgpXCI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5fX25hbWUoaW5zcGVjdFN5bWJvbCwgXCJpbnNwZWN0U3ltYm9sXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3Byb21pc2UuanNcbnZhciBnZXRQcm9taXNlVmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IFwiUHJvbWlzZXtcXHUyMDI2fVwiLCBcImdldFByb21pc2VWYWx1ZVwiKTtcbnRyeSB7XG4gIGNvbnN0IHsgZ2V0UHJvbWlzZURldGFpbHMsIGtQZW5kaW5nLCBrUmVqZWN0ZWQgfSA9IHByb2Nlc3MuYmluZGluZyhcInV0aWxcIik7XG4gIGlmIChBcnJheS5pc0FycmF5KGdldFByb21pc2VEZXRhaWxzKFByb21pc2UucmVzb2x2ZSgpKSkpIHtcbiAgICBnZXRQcm9taXNlVmFsdWUgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgW3N0YXRlLCBpbm5lclZhbHVlXSA9IGdldFByb21pc2VEZXRhaWxzKHZhbHVlKTtcbiAgICAgIGlmIChzdGF0ZSA9PT0ga1BlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIFwiUHJvbWlzZXs8cGVuZGluZz59XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYFByb21pc2Uke3N0YXRlID09PSBrUmVqZWN0ZWQgPyBcIiFcIiA6IFwiXCJ9eyR7b3B0aW9ucy5pbnNwZWN0KGlubmVyVmFsdWUsIG9wdGlvbnMpfX1gO1xuICAgIH0sIFwiZ2V0UHJvbWlzZVZhbHVlXCIpO1xuICB9XG59IGNhdGNoIChub3ROb2RlKSB7XG59XG52YXIgcHJvbWlzZV9kZWZhdWx0ID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL29iamVjdC5qc1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChvYmplY3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAmJiBzeW1ib2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcInt9XCI7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgfVxuICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgY29uc3Qgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcCgoa2V5KSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICBvcHRpb25zLnNlZW4ucG9wKCk7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgIHNlcCA9IFwiLCBcIjtcbiAgfVxuICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuX19uYW1lKGluc3BlY3RPYmplY3QsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9jbGFzcy5qc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICBsZXQgbmFtZSA9IFwiXCI7XG4gIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gIH1cbiAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IFwiX2NsYXNzXCIpIHtcbiAgICBuYW1lID0gXCI8QW5vbnltb3VzIENsYXNzPlwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cbl9fbmFtZShpbnNwZWN0Q2xhc3MsIFwiaW5zcGVjdENsYXNzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2FyZ3VtZW50cy5qc1xuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gXCJBcmd1bWVudHNbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICByZXR1cm4gYEFyZ3VtZW50c1sgJHtpbnNwZWN0TGlzdChhcmdzLCBvcHRpb25zKX0gXWA7XG59XG5fX25hbWUoaW5zcGVjdEFyZ3VtZW50cywgXCJpbnNwZWN0QXJndW1lbnRzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Vycm9yLmpzXG52YXIgZXJyb3JLZXlzID0gW1xuICBcInN0YWNrXCIsXG4gIFwibGluZVwiLFxuICBcImNvbHVtblwiLFxuICBcIm5hbWVcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwiZmlsZU5hbWVcIixcbiAgXCJsaW5lTnVtYmVyXCIsXG4gIFwiY29sdW1uTnVtYmVyXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJjYXVzZVwiXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdDIoZXJyb3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoKGtleSkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcy51bnNoaWZ0KFwibWVzc2FnZVwiKTtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gIG9wdGlvbnMuc2VlbiA9IG9wdGlvbnMuc2VlbiB8fCBbXTtcbiAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gIH1cbiAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiBcIlwifWA7XG59XG5fX25hbWUoaW5zcGVjdE9iamVjdDIsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9odG1sLmpzXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICBvcHRpb25zLnRydW5jYXRlIC09IDM7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCBcInllbGxvd1wiKX1gO1xuICB9XG4gIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksIFwieWVsbG93XCIpfT0ke29wdGlvbnMuc3R5bGl6ZShgXCIke3ZhbHVlfVwiYCwgXCJzdHJpbmdcIil9YDtcbn1cbl9fbmFtZShpbnNwZWN0QXR0cmlidXRlLCBcImluc3BlY3RBdHRyaWJ1dGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0SFRNTENvbGxlY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdEhUTUwsIFwiXFxuXCIpO1xufVxuX19uYW1lKGluc3BlY3RIVE1MQ29sbGVjdGlvbiwgXCJpbnNwZWN0SFRNTENvbGxlY3Rpb25cIik7XG5mdW5jdGlvbiBpbnNwZWN0SFRNTChlbGVtZW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gIGNvbnN0IG5hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaGVhZCA9IG9wdGlvbnMuc3R5bGl6ZShgPCR7bmFtZX1gLCBcInNwZWNpYWxcIik7XG4gIGNvbnN0IGhlYWRDbG9zZSA9IG9wdGlvbnMuc3R5bGl6ZShgPmAsIFwic3BlY2lhbFwiKTtcbiAgY29uc3QgdGFpbCA9IG9wdGlvbnMuc3R5bGl6ZShgPC8ke25hbWV9PmAsIFwic3BlY2lhbFwiKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCAqIDIgKyA1O1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICBwcm9wZXJ0eUNvbnRlbnRzICs9IFwiIFwiO1xuICAgIHByb3BlcnR5Q29udGVudHMgKz0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KV0pLCBvcHRpb25zLCBpbnNwZWN0QXR0cmlidXRlLCBcIiBcIik7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBwcm9wZXJ0eUNvbnRlbnRzLmxlbmd0aDtcbiAgY29uc3QgdHJ1bmNhdGUyID0gb3B0aW9ucy50cnVuY2F0ZTtcbiAgbGV0IGNoaWxkcmVuID0gaW5zcGVjdEhUTUxDb2xsZWN0aW9uKGVsZW1lbnQuY2hpbGRyZW4sIG9wdGlvbnMpO1xuICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gdHJ1bmNhdGUyKSB7XG4gICAgY2hpbGRyZW4gPSBgJHt0cnVuY2F0b3J9KCR7ZWxlbWVudC5jaGlsZHJlbi5sZW5ndGh9KWA7XG4gIH1cbiAgcmV0dXJuIGAke2hlYWR9JHtwcm9wZXJ0eUNvbnRlbnRzfSR7aGVhZENsb3NlfSR7Y2hpbGRyZW59JHt0YWlsfWA7XG59XG5fX25hbWUoaW5zcGVjdEhUTUwsIFwiaW5zcGVjdEhUTUxcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvaW5kZXguanNcbnZhciBzeW1ib2xzU3VwcG9ydGVkID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuZm9yID09PSBcImZ1bmN0aW9uXCI7XG52YXIgY2hhaUluc3BlY3QgPSBzeW1ib2xzU3VwcG9ydGVkID8gU3ltYm9sLmZvcihcImNoYWkvaW5zcGVjdFwiKSA6IFwiQEBjaGFpL2luc3BlY3RcIjtcbnZhciBub2RlSW5zcGVjdCA9IGZhbHNlO1xudHJ5IHtcbiAgY29uc3Qgbm9kZVV0aWwgPSByZXF1aXJlX3V0aWwoKTtcbiAgbm9kZUluc3BlY3QgPSBub2RlVXRpbC5pbnNwZWN0ID8gbm9kZVV0aWwuaW5zcGVjdC5jdXN0b20gOiBmYWxzZTtcbn0gY2F0Y2ggKG5vTm9kZUluc3BlY3QpIHtcbiAgbm9kZUluc3BlY3QgPSBmYWxzZTtcbn1cbnZhciBjb25zdHJ1Y3Rvck1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIHN0cmluZ1RhZ01hcCA9IHt9O1xudmFyIGJhc2VUeXBlc01hcCA9IHtcbiAgdW5kZWZpbmVkOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcInVuZGVmaW5lZFwiLCBcInVuZGVmaW5lZFwiKSxcbiAgbnVsbDogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoXCJudWxsXCIsIFwibnVsbFwiKSxcbiAgYm9vbGVhbjogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoU3RyaW5nKHZhbHVlKSwgXCJib29sZWFuXCIpLFxuICBCb29sZWFuOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCBcImJvb2xlYW5cIiksXG4gIG51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgTnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICBiaWdpbnQ6IGluc3BlY3RCaWdJbnQsXG4gIEJpZ0ludDogaW5zcGVjdEJpZ0ludCxcbiAgc3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICBTdHJpbmc6IGluc3BlY3RTdHJpbmcsXG4gIGZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gIEZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gIHN5bWJvbDogaW5zcGVjdFN5bWJvbCxcbiAgLy8gQSBTeW1ib2wgcG9seWZpbGwgd2lsbCByZXR1cm4gYFN5bWJvbGAgbm90IGBzeW1ib2xgIGZyb20gdHlwZWRldGVjdFxuICBTeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gIEFycmF5OiBpbnNwZWN0QXJyYXksXG4gIERhdGU6IGluc3BlY3REYXRlLFxuICBNYXA6IGluc3BlY3RNYXAsXG4gIFNldDogaW5zcGVjdFNldCxcbiAgUmVnRXhwOiBpbnNwZWN0UmVnRXhwLFxuICBQcm9taXNlOiBwcm9taXNlX2RlZmF1bHQsXG4gIC8vIFdlYWtTZXQsIFdlYWtNYXAgYXJlIHRvdGFsbHkgb3BhcXVlIHRvIHVzXG4gIFdlYWtTZXQ6ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha1NldHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksXG4gIFdlYWtNYXA6ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha01hcHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksXG4gIEFyZ3VtZW50czogaW5zcGVjdEFyZ3VtZW50cyxcbiAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQ2NEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgR2VuZXJhdG9yOiAoKSA9PiBcIlwiLFxuICBEYXRhVmlldzogKCkgPT4gXCJcIixcbiAgQXJyYXlCdWZmZXI6ICgpID0+IFwiXCIsXG4gIEVycm9yOiBpbnNwZWN0T2JqZWN0MixcbiAgSFRNTENvbGxlY3Rpb246IGluc3BlY3RIVE1MQ29sbGVjdGlvbixcbiAgTm9kZUxpc3Q6IGluc3BlY3RIVE1MQ29sbGVjdGlvblxufTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMsIHR5cGUzKSA9PiB7XG4gIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbY2hhaUluc3BlY3RdKG9wdGlvbnMpO1xuICB9XG4gIGlmIChub2RlSW5zcGVjdCAmJiBub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbbm9kZUluc3BlY3RdKG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChcImluc3BlY3RcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaW5zcGVjdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluc3BlY3Qob3B0aW9ucy5kZXB0aCwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKFwiY29uc3RydWN0b3JcIiBpbiB2YWx1ZSAmJiBjb25zdHJ1Y3Rvck1hcC5oYXModmFsdWUuY29uc3RydWN0b3IpKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yTWFwLmdldCh2YWx1ZS5jb25zdHJ1Y3RvcikodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChzdHJpbmdUYWdNYXBbdHlwZTNdKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZ01hcFt0eXBlM10odmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBcIlwiO1xufSwgXCJpbnNwZWN0Q3VzdG9tXCIpO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmZ1bmN0aW9uIGluc3BlY3QodmFsdWUsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXNlT3B0aW9ucyhvcHRzLCBpbnNwZWN0KTtcbiAgY29uc3QgeyBjdXN0b21JbnNwZWN0IH0gPSBvcHRpb25zO1xuICBsZXQgdHlwZTMgPSB2YWx1ZSA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZTMgPT09IFwib2JqZWN0XCIpIHtcbiAgICB0eXBlMyA9IHRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTtcbiAgfVxuICBpZiAodHlwZTMgaW4gYmFzZVR5cGVzTWFwKSB7XG4gICAgcmV0dXJuIGJhc2VUeXBlc01hcFt0eXBlM10odmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChjdXN0b21JbnNwZWN0ICYmIHZhbHVlKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gaW5zcGVjdEN1c3RvbSh2YWx1ZSwgb3B0aW9ucywgdHlwZTMpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgcmV0dXJuIGluc3BlY3Qob3V0cHV0LCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcHJvdG8gPSB2YWx1ZSA/IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgOiBmYWxzZTtcbiAgaWYgKHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIGluc3BlY3RIVE1MKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoXCJjb25zdHJ1Y3RvclwiIGluIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0Q2xhc3ModmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoU3RyaW5nKHZhbHVlKSwgdHlwZTMpO1xufVxuX19uYW1lKGluc3BlY3QsIFwiaW5zcGVjdFwiKTtcblxuLy8gbGliL2NoYWkvY29uZmlnLmpzXG52YXIgY29uZmlnID0ge1xuICAvKipcbiAgICogIyMjIGNvbmZpZy5pbmNsdWRlU3RhY2tcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBzdGFjayB0cmFjZVxuICAgKiBpcyBpbmNsdWRlZCBpbiBBc3NlcnRpb24gZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBvZiBmYWxzZVxuICAgKiBzdXBwcmVzc2VzIHN0YWNrIHRyYWNlIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrID0gdHJ1ZTsgIC8vIGVuYWJsZSBzdGFjayBvbiBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGluY2x1ZGVTdGFjazogZmFsc2UsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnNob3dEaWZmXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBpbmZsdWVuY2VzIHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZSBgc2hvd0RpZmZgIGZsYWcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd25cbiAgICogQXNzZXJ0aW9uRXJyb3JzLiBgZmFsc2VgIHdpbGwgYWx3YXlzIGJlIGBmYWxzZWA7IGB0cnVlYFxuICAgKiB3aWxsIGJlIHRydWUgd2hlbiB0aGUgYXNzZXJ0aW9uIGhhcyByZXF1ZXN0ZWQgYSBkaWZmXG4gICAqIGJlIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHNob3dEaWZmOiB0cnVlLFxuICAvKipcbiAgICogIyMjIGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgc2V0cyBsZW5ndGggdGhyZXNob2xkIGZvciBhY3R1YWwgYW5kXG4gICAqIGV4cGVjdGVkIHZhbHVlcyBpbiBhc3NlcnRpb24gZXJyb3JzLiBJZiB0aGlzIHRocmVzaG9sZCBpcyBleGNlZWRlZCwgZm9yXG4gICAqIGV4YW1wbGUgZm9yIGxhcmdlIGRhdGEgc3RydWN0dXJlcywgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nXG4gICAqIGxpa2UgYFsgQXJyYXkoMykgXWAgb3IgYHsgT2JqZWN0IChwcm9wMSwgcHJvcDIpIH1gLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gemVybyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRydW5jYXRpbmcgYWx0b2dldGhlci5cbiAgICpcbiAgICogVGhpcyBpcyBlc3BlY2lhbGx5IHVzZXJmdWwgd2hlbiBkb2luZyBhc3NlcnRpb25zIG9uIGFycmF5czogaGF2aW5nIHRoaXNcbiAgICogc2V0IHRvIGEgcmVhc29uYWJsZSBsYXJnZSB2YWx1ZSBtYWtlcyB0aGUgZmFpbHVyZSBtZXNzYWdlcyByZWFkaWx5XG4gICAqIGluc3BlY3RhYmxlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPSAwOyAgLy8gZGlzYWJsZSB0cnVuY2F0aW5nXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfVxuICAgKiBAcHVibGljXG4gICAqL1xuICB0cnVuY2F0ZVRocmVzaG9sZDogNDAsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnVzZVByb3h5XG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBkZWZpbmVzIGlmIGNoYWkgd2lsbCB1c2UgYSBQcm94eSB0byB0aHJvd1xuICAgKiBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50IHByb3BlcnR5IGlzIHJlYWQsIHdoaWNoIHByb3RlY3RzIHVzZXJzXG4gICAqIGZyb20gdHlwb3Mgd2hlbiB1c2luZyBwcm9wZXJ0eS1iYXNlZCBhc3NlcnRpb25zLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy51c2VQcm94eSA9IGZhbHNlOyAgLy8gZGlzYWJsZSB1c2Ugb2YgUHJveHlcbiAgICpcbiAgICogVGhpcyBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZyB2YWx1ZVxuICAgKiBpbiBlbnZpcm9ubWVudHMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3hpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgdXNlUHJveHk6IHRydWUsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBkZWZpbmVzIHdoaWNoIHByb3BlcnRpZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvciBpZiB0aGV5IGRvIG5vdCBleGlzdCBvbiB0aGUgYXNzZXJ0aW9uLlxuICAgKiBUaGlzIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgZW52aXJvbm1lbnQgQ2hhaSBpcyBydW5uaW5nIGluIHN1cHBvcnRzIHByb3hpZXMgYW5kXG4gICAqIGlmIHRoZSBgdXNlUHJveHlgIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBpcyBlbmFibGVkLlxuICAgKiBCeSBkZWZhdWx0LCBgdGhlbmAgYW5kIGBpbnNwZWN0YCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciBpZiB0aGV5IGRvIG5vdCBleGlzdCBvbiB0aGVcbiAgICogYXNzZXJ0aW9uIG9iamVjdCBiZWNhdXNlIHRoZSBgLmluc3BlY3RgIHByb3BlcnR5IGlzIHJlYWQgYnkgYHV0aWwuaW5zcGVjdGAgKGZvciBleGFtcGxlLCB3aGVuXG4gICAqIHVzaW5nIGBjb25zb2xlLmxvZ2Agb24gdGhlIGFzc2VydGlvbiBvYmplY3QpIGFuZCBgLnRoZW5gIGlzIG5lY2Vzc2FyeSBmb3IgcHJvbWlzZSB0eXBlLWNoZWNraW5nLlxuICAgKlxuICAgKiAgICAgLy8gQnkgZGVmYXVsdCB0aGVzZSBrZXlzIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24gb2JqZWN0XG4gICAqICAgICBjaGFpLmNvbmZpZy5wcm94eUV4Y2x1ZGVkS2V5cyA9IFsndGhlbicsICdpbnNwZWN0J107XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHByb3h5RXhjbHVkZWRLZXlzOiBbXCJ0aGVuXCIsIFwiY2F0Y2hcIiwgXCJpbnNwZWN0XCIsIFwidG9KU09OXCJdLFxuICAvKipcbiAgICogIyMjIGNvbmZpZy5kZWVwRXF1YWxcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggYSBjdXN0b20gZnVuY3Rpb24gdG8gdXNlIGZvciBkZWVwRXF1YWxcbiAgICogY29tcGFyaXNvbnMuXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBmdW5jdGlvbiB1c2VkIGlzIHRoZSBvbmUgZnJvbSB0aGUgYGRlZXAtZXFsYCBwYWNrYWdlIHdpdGhvdXQgY3VzdG9tIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqICAgICAvLyB1c2UgYSBjdXN0b20gY29tcGFyYXRvclxuICAgKiAgICAgY2hhaS5jb25maWcuZGVlcEVxdWFsID0gKGV4cGVjdGVkLCBhY3R1YWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4gY2hhaS51dGlsLmVxbChleHBlY3RlZCwgYWN0dWFsLCB7XG4gICAqICAgICAgICAgICAgIGNvbXBhcmF0b3I6IChleHBlY3RlZCwgYWN0dWFsKSA9PiB7XG4gICAqICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uIG51bWJlciBjb21wYXJpc29uLCB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICogICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBleHBlY3RlZCAhPT0gJ251bWJlcicpIHJldHVybiBudWxsO1xuICAgKiAgICAgICAgICAgICAgICAgLy8gYWxsb3cgYSBkaWZmZXJlbmNlIG9mIDEwIGJldHdlZW4gY29tcGFyZWQgbnVtYmVyc1xuICAgKiAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhY3R1YWwgPT09ICdudW1iZXInICYmIE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IDEwXG4gICAqICAgICAgICAgICAgIH1cbiAgICogICAgICAgICB9KVxuICAgKiAgICAgfTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZGVlcEVxdWFsOiBudWxsXG59O1xuXG4vLyBsaWIvY2hhaS91dGlscy9pbnNwZWN0LmpzXG5mdW5jdGlvbiBpbnNwZWN0MihvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMpIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgY29sb3JzLFxuICAgIGRlcHRoOiB0eXBlb2YgZGVwdGggPT09IFwidW5kZWZpbmVkXCIgPyAyIDogZGVwdGgsXG4gICAgc2hvd0hpZGRlbixcbiAgICB0cnVuY2F0ZTogY29uZmlnLnRydW5jYXRlVGhyZXNob2xkID8gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkIDogSW5maW5pdHlcbiAgfTtcbiAgcmV0dXJuIGluc3BlY3Qob2JqLCBvcHRpb25zKTtcbn1cbl9fbmFtZShpbnNwZWN0MiwgXCJpbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9vYmpEaXNwbGF5LmpzXG5mdW5jdGlvbiBvYmpEaXNwbGF5KG9iaikge1xuICB2YXIgc3RyID0gaW5zcGVjdDIob2JqKSwgdHlwZTMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgaWYgKGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCAmJiBzdHIubGVuZ3RoID49IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCkge1xuICAgIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKSB7XG4gICAgICByZXR1cm4gIW9iai5uYW1lIHx8IG9iai5uYW1lID09PSBcIlwiID8gXCJbRnVuY3Rpb25dXCIgOiBcIltGdW5jdGlvbjogXCIgKyBvYmoubmFtZSArIFwiXVwiO1xuICAgIH0gZWxzZSBpZiAodHlwZTMgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgcmV0dXJuIFwiWyBBcnJheShcIiArIG9iai5sZW5ndGggKyBcIikgXVwiO1xuICAgIH0gZWxzZSBpZiAodHlwZTMgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKSwga3N0ciA9IGtleXMubGVuZ3RoID4gMiA/IGtleXMuc3BsaWNlKDAsIDIpLmpvaW4oXCIsIFwiKSArIFwiLCAuLi5cIiA6IGtleXMuam9pbihcIiwgXCIpO1xuICAgICAgcmV0dXJuIFwieyBPYmplY3QgKFwiICsga3N0ciArIFwiKSB9XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cbl9fbmFtZShvYmpEaXNwbGF5LCBcIm9iakRpc3BsYXlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE1lc3NhZ2UuanNcbmZ1bmN0aW9uIGdldE1lc3NhZ2UyKG9iaiwgYXJncykge1xuICB2YXIgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCB2YWwgPSBmbGFnKG9iaiwgXCJvYmplY3RcIiksIGV4cGVjdGVkID0gYXJnc1szXSwgYWN0dWFsID0gZ2V0QWN0dWFsKG9iaiwgYXJncyksIG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdLCBmbGFnTXNnID0gZmxhZyhvYmosIFwibWVzc2FnZVwiKTtcbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIilcbiAgICBtc2cgPSBtc2coKTtcbiAgbXNnID0gbXNnIHx8IFwiXCI7XG4gIG1zZyA9IG1zZy5yZXBsYWNlKC8jXFx7dGhpc1xcfS9nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb2JqRGlzcGxheSh2YWwpO1xuICB9KS5yZXBsYWNlKC8jXFx7YWN0XFx9L2csIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvYmpEaXNwbGF5KGFjdHVhbCk7XG4gIH0pLnJlcGxhY2UoLyNcXHtleHBcXH0vZywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9iakRpc3BsYXkoZXhwZWN0ZWQpO1xuICB9KTtcbiAgcmV0dXJuIGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiICsgbXNnIDogbXNnO1xufVxuX19uYW1lKGdldE1lc3NhZ2UyLCBcImdldE1lc3NhZ2VcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3RyYW5zZmVyRmxhZ3MuanNcbmZ1bmN0aW9uIHRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBvYmplY3QsIGluY2x1ZGVBbGwpIHtcbiAgdmFyIGZsYWdzID0gYXNzZXJ0aW9uLl9fZmxhZ3MgfHwgKGFzc2VydGlvbi5fX2ZsYWdzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICBpZiAoIW9iamVjdC5fX2ZsYWdzKSB7XG4gICAgb2JqZWN0Ll9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBpbmNsdWRlQWxsID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMyA/IGluY2x1ZGVBbGwgOiB0cnVlO1xuICBmb3IgKHZhciBmbGFnMyBpbiBmbGFncykge1xuICAgIGlmIChpbmNsdWRlQWxsIHx8IGZsYWczICE9PSBcIm9iamVjdFwiICYmIGZsYWczICE9PSBcInNzZmlcIiAmJiBmbGFnMyAhPT0gXCJsb2NrU3NmaVwiICYmIGZsYWczICE9IFwibWVzc2FnZVwiKSB7XG4gICAgICBvYmplY3QuX19mbGFnc1tmbGFnM10gPSBmbGFnc1tmbGFnM107XG4gICAgfVxuICB9XG59XG5fX25hbWUodHJhbnNmZXJGbGFncywgXCJ0cmFuc2ZlckZsYWdzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvZGVlcC1lcWwvaW5kZXguanNcbmZ1bmN0aW9uIHR5cGUyKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCBzbGljZVN0YXJ0ID0gODtcbiAgY29uc3Qgc2xpY2VFbmQgPSAtMTtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKHNsaWNlU3RhcnQsIHNsaWNlRW5kKTtcbn1cbl9fbmFtZSh0eXBlMiwgXCJ0eXBlXCIpO1xuZnVuY3Rpb24gRmFrZU1hcCgpIHtcbiAgdGhpcy5fa2V5ID0gXCJjaGFpL2RlZXAtZXFsX19cIiArIE1hdGgucmFuZG9tKCkgKyBEYXRlLm5vdygpO1xufVxuX19uYW1lKEZha2VNYXAsIFwiRmFrZU1hcFwiKTtcbkZha2VNYXAucHJvdG90eXBlID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIHJldHVybiBrZXlbdGhpcy5fa2V5XTtcbiAgfSwgXCJnZXRcIiksXG4gIHNldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChPYmplY3QuaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX2tleSwge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFwic2V0XCIpXG59O1xudmFyIE1lbW9pemVNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IEZha2VNYXA7XG5mdW5jdGlvbiBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG1lbW9pemVNYXApIHtcbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgbGVmdEhhbmRNYXAgPSBtZW1vaXplTWFwLmdldChsZWZ0SGFuZE9wZXJhbmQpO1xuICBpZiAobGVmdEhhbmRNYXApIHtcbiAgICB2YXIgcmVzdWx0ID0gbGVmdEhhbmRNYXAuZ2V0KHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5fX25hbWUobWVtb2l6ZUNvbXBhcmUsIFwibWVtb2l6ZUNvbXBhcmVcIik7XG5mdW5jdGlvbiBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCwgcmVzdWx0KSB7XG4gIGlmICghbWVtb2l6ZU1hcCB8fCBpc1ByaW1pdGl2ZShsZWZ0SGFuZE9wZXJhbmQpIHx8IGlzUHJpbWl0aXZlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICB9IGVsc2Uge1xuICAgIGxlZnRIYW5kTWFwID0gbmV3IE1lbW9pemVNYXAoKTtcbiAgICBsZWZ0SGFuZE1hcC5zZXQocmlnaHRIYW5kT3BlcmFuZCwgcmVzdWx0KTtcbiAgICBtZW1vaXplTWFwLnNldChsZWZ0SGFuZE9wZXJhbmQsIGxlZnRIYW5kTWFwKTtcbiAgfVxufVxuX19uYW1lKG1lbW9pemVTZXQsIFwibWVtb2l6ZVNldFwiKTtcbnZhciBkZWVwX2VxbF9kZWZhdWx0ID0gZGVlcEVxdWFsO1xuZnVuY3Rpb24gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICByZXR1cm4gZXh0ZW5zaXZlRGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gIH1cbiAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChzaW1wbGVSZXN1bHQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICB9XG4gIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbn1cbl9fbmFtZShkZWVwRXF1YWwsIFwiZGVlcEVxdWFsXCIpO1xuZnVuY3Rpb24gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQgPT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kICE9PSAwIHx8IDEgLyBsZWZ0SGFuZE9wZXJhbmQgPT09IDEgLyByaWdodEhhbmRPcGVyYW5kO1xuICB9XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQgIT09IGxlZnRIYW5kT3BlcmFuZCAmJiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByaWdodEhhbmRPcGVyYW5kICE9PSByaWdodEhhbmRPcGVyYW5kKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5fX25hbWUoc2ltcGxlRXF1YWwsIFwic2ltcGxlRXF1YWxcIik7XG5mdW5jdGlvbiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLm1lbW9pemUgPSBvcHRpb25zLm1lbW9pemUgPT09IGZhbHNlID8gZmFsc2UgOiBvcHRpb25zLm1lbW9pemUgfHwgbmV3IE1lbW9pemVNYXAoKTtcbiAgdmFyIGNvbXBhcmF0b3IgPSBvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcjtcbiAgdmFyIG1lbW9pemVSZXN1bHRMZWZ0ID0gbWVtb2l6ZUNvbXBhcmUobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdExlZnQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVtb2l6ZVJlc3VsdExlZnQ7XG4gIH1cbiAgdmFyIG1lbW9pemVSZXN1bHRSaWdodCA9IG1lbW9pemVDb21wYXJlKHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplKTtcbiAgaWYgKG1lbW9pemVSZXN1bHRSaWdodCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0UmlnaHQ7XG4gIH1cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgY29tcGFyYXRvclJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoY29tcGFyYXRvclJlc3VsdCA9PT0gZmFsc2UgfHwgY29tcGFyYXRvclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgY29tcGFyYXRvclJlc3VsdCk7XG4gICAgICByZXR1cm4gY29tcGFyYXRvclJlc3VsdDtcbiAgICB9XG4gICAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNpbXBsZVJlc3VsdDtcbiAgICB9XG4gIH1cbiAgdmFyIGxlZnRIYW5kVHlwZSA9IHR5cGUyKGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZFR5cGUgIT09IHR5cGUyKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgZmFsc2UpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCB0cnVlKTtcbiAgdmFyIHJlc3VsdCA9IGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucyk7XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5fX25hbWUoZXh0ZW5zaXZlRGVlcEVxdWFsLCBcImV4dGVuc2l2ZURlZXBFcXVhbFwiKTtcbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucykge1xuICBzd2l0Y2ggKGxlZnRIYW5kVHlwZSkge1xuICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5cIjpcbiAgICBjYXNlIFwiRGF0ZVwiOlxuICAgICAgcmV0dXJuIGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQudmFsdWVPZigpLCByaWdodEhhbmRPcGVyYW5kLnZhbHVlT2YoKSk7XG4gICAgY2FzZSBcIlByb21pc2VcIjpcbiAgICBjYXNlIFwiU3ltYm9sXCI6XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIldlYWtNYXBcIjpcbiAgICBjYXNlIFwiV2Vha1NldFwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZDtcbiAgICBjYXNlIFwiRXJyb3JcIjpcbiAgICAgIHJldHVybiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBbXCJuYW1lXCIsIFwibWVzc2FnZVwiLCBcImNvZGVcIl0sIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJBcmd1bWVudHNcIjpcbiAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQ4QXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgIGNhc2UgXCJVaW50MTZBcnJheVwiOlxuICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgY2FzZSBcIkZsb2F0MzJBcnJheVwiOlxuICAgIGNhc2UgXCJGbG9hdDY0QXJyYXlcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIlJlZ0V4cFwiOlxuICAgICAgcmV0dXJuIHJlZ2V4cEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSBcIkdlbmVyYXRvclwiOlxuICAgICAgcmV0dXJuIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIkRhdGFWaWV3XCI6XG4gICAgICByZXR1cm4gaXRlcmFibGVFcXVhbChuZXcgVWludDhBcnJheShsZWZ0SGFuZE9wZXJhbmQuYnVmZmVyKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZC5idWZmZXIpLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiQXJyYXlCdWZmZXJcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZCksIG5ldyBVaW50OEFycmF5KHJpZ2h0SGFuZE9wZXJhbmQpLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiU2V0XCI6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgICAgcmV0dXJuIGVudHJpZXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJUZW1wb3JhbC5QbGFpbkRhdGVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5UaW1lXCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluRGF0ZVRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuSW5zdGFudFwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5ab25lZERhdGVUaW1lXCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluWWVhck1vbnRoXCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluTW9udGhEYXlcIjpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQuZXF1YWxzKHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGNhc2UgXCJUZW1wb3JhbC5EdXJhdGlvblwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC50b3RhbChcIm5hbm9zZWNvbmRzXCIpID09PSByaWdodEhhbmRPcGVyYW5kLnRvdGFsKFwibmFub3NlY29uZHNcIik7XG4gICAgY2FzZSBcIlRlbXBvcmFsLlRpbWVab25lXCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLkNhbGVuZGFyXCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvU3RyaW5nKCkgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG9TdHJpbmcoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gIH1cbn1cbl9fbmFtZShleHRlbnNpdmVEZWVwRXF1YWxCeVR5cGUsIFwiZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlXCIpO1xuZnVuY3Rpb24gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xufVxuX19uYW1lKHJlZ2V4cEVxdWFsLCBcInJlZ2V4cEVxdWFsXCIpO1xuZnVuY3Rpb24gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSAhPT0gcmlnaHRIYW5kT3BlcmFuZC5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChzaXplRXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlZnRIYW5kSXRlbXMgPSBbXTtcbiAgdmFyIHJpZ2h0SGFuZEl0ZW1zID0gW107XG4gIGxlZnRIYW5kT3BlcmFuZC5mb3JFYWNoKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgbGVmdEhhbmRJdGVtcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sIFwiZ2F0aGVyRW50cmllc1wiKSk7XG4gIHJpZ2h0SGFuZE9wZXJhbmQuZm9yRWFjaCgvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGdhdGhlckVudHJpZXMoa2V5LCB2YWx1ZSkge1xuICAgIHJpZ2h0SGFuZEl0ZW1zLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSwgXCJnYXRoZXJFbnRyaWVzXCIpKTtcbiAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRJdGVtcy5zb3J0KCksIHJpZ2h0SGFuZEl0ZW1zLnNvcnQoKSwgb3B0aW9ucyk7XG59XG5fX25hbWUoZW50cmllc0VxdWFsLCBcImVudHJpZXNFcXVhbFwiKTtcbmZ1bmN0aW9uIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBsZWZ0SGFuZE9wZXJhbmQubGVuZ3RoO1xuICBpZiAobGVuZ3RoICE9PSByaWdodEhhbmRPcGVyYW5kLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTE7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmRbaW5kZXhdLCByaWdodEhhbmRPcGVyYW5kW2luZGV4XSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuX19uYW1lKGl0ZXJhYmxlRXF1YWwsIFwiaXRlcmFibGVFcXVhbFwiKTtcbmZ1bmN0aW9uIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChnZXRHZW5lcmF0b3JFbnRyaWVzKGxlZnRIYW5kT3BlcmFuZCksIGdldEdlbmVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xufVxuX19uYW1lKGdlbmVyYXRvckVxdWFsLCBcImdlbmVyYXRvckVxdWFsXCIpO1xuZnVuY3Rpb24gaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiO1xufVxuX19uYW1lKGhhc0l0ZXJhdG9yRnVuY3Rpb24sIFwiaGFzSXRlcmF0b3JGdW5jdGlvblwiKTtcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRW50cmllcyh0YXJnZXQpIHtcbiAgaWYgKGhhc0l0ZXJhdG9yRnVuY3Rpb24odGFyZ2V0KSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yRW50cmllcyh0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbiAgICB9IGNhdGNoIChpdGVyYXRvckVycm9yKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cbl9fbmFtZShnZXRJdGVyYXRvckVudHJpZXMsIFwiZ2V0SXRlcmF0b3JFbnRyaWVzXCIpO1xuZnVuY3Rpb24gZ2V0R2VuZXJhdG9yRW50cmllcyhnZW5lcmF0b3IpIHtcbiAgdmFyIGdlbmVyYXRvclJlc3VsdCA9IGdlbmVyYXRvci5uZXh0KCk7XG4gIHZhciBhY2N1bXVsYXRvciA9IFtnZW5lcmF0b3JSZXN1bHQudmFsdWVdO1xuICB3aGlsZSAoZ2VuZXJhdG9yUmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG4gICAgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgICBhY2N1bXVsYXRvci5wdXNoKGdlbmVyYXRvclJlc3VsdC52YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuX19uYW1lKGdldEdlbmVyYXRvckVudHJpZXMsIFwiZ2V0R2VuZXJhdG9yRW50cmllc1wiKTtcbmZ1bmN0aW9uIGdldEVudW1lcmFibGVLZXlzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gdGFyZ2V0KSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5fX25hbWUoZ2V0RW51bWVyYWJsZUtleXMsIFwiZ2V0RW51bWVyYWJsZUtleXNcIik7XG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlU3ltYm9scyh0YXJnZXQpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgdmFyIGFsbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBrZXkgPSBhbGxLZXlzW2ldO1xuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KS5lbnVtZXJhYmxlKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5fX25hbWUoZ2V0RW51bWVyYWJsZVN5bWJvbHMsIFwiZ2V0RW51bWVyYWJsZVN5bWJvbHNcIik7XG5mdW5jdGlvbiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgcmlnaHRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuX19uYW1lKGtleXNFcXVhbCwgXCJrZXlzRXF1YWxcIik7XG5mdW5jdGlvbiBvYmplY3RFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlZnRIYW5kS2V5cyA9IGdldEVudW1lcmFibGVLZXlzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIHZhciBsZWZ0SGFuZFN5bWJvbHMgPSBnZXRFbnVtZXJhYmxlU3ltYm9scyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kU3ltYm9scyA9IGdldEVudW1lcmFibGVTeW1ib2xzKHJpZ2h0SGFuZE9wZXJhbmQpO1xuICBsZWZ0SGFuZEtleXMgPSBsZWZ0SGFuZEtleXMuY29uY2F0KGxlZnRIYW5kU3ltYm9scyk7XG4gIHJpZ2h0SGFuZEtleXMgPSByaWdodEhhbmRLZXlzLmNvbmNhdChyaWdodEhhbmRTeW1ib2xzKTtcbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggJiYgbGVmdEhhbmRLZXlzLmxlbmd0aCA9PT0gcmlnaHRIYW5kS2V5cy5sZW5ndGgpIHtcbiAgICBpZiAoaXRlcmFibGVFcXVhbChtYXBTeW1ib2xzKGxlZnRIYW5kS2V5cykuc29ydCgpLCBtYXBTeW1ib2xzKHJpZ2h0SGFuZEtleXMpLnNvcnQoKSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBsZWZ0SGFuZEtleXMsIG9wdGlvbnMpO1xuICB9XG4gIHZhciBsZWZ0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZEVudHJpZXMubGVuZ3RoICYmIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IHJpZ2h0SGFuZEVudHJpZXMubGVuZ3RoKSB7XG4gICAgbGVmdEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByaWdodEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEVudHJpZXMsIHJpZ2h0SGFuZEVudHJpZXMsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChsZWZ0SGFuZEtleXMubGVuZ3RoID09PSAwICYmIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IDAgJiYgcmlnaHRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiYgcmlnaHRIYW5kRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUob2JqZWN0RXF1YWwsIFwib2JqZWN0RXF1YWxcIik7XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiO1xufVxuX19uYW1lKGlzUHJpbWl0aXZlLCBcImlzUHJpbWl0aXZlXCIpO1xuZnVuY3Rpb24gbWFwU3ltYm9scyhhcnIpIHtcbiAgcmV0dXJuIGFyci5tYXAoLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBtYXBTeW1ib2woZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICByZXR1cm4gZW50cnkudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9LCBcIm1hcFN5bWJvbFwiKSk7XG59XG5fX25hbWUobWFwU3ltYm9scywgXCJtYXBTeW1ib2xzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvcGF0aHZhbC9pbmRleC5qc1xuZnVuY3Rpb24gaGFzUHJvcGVydHkob2JqLCBuYW1lKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbmFtZSBpbiBPYmplY3Qob2JqKTtcbn1cbl9fbmFtZShoYXNQcm9wZXJ0eSwgXCJoYXNQcm9wZXJ0eVwiKTtcbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIGNvbnN0IHN0ciA9IHBhdGgucmVwbGFjZSgvKFteXFxcXF0pXFxbL2csIFwiJDEuW1wiKTtcbiAgY29uc3QgcGFydHMgPSBzdHIubWF0Y2goLyhcXFxcXFwufFteLl0rPykrL2cpO1xuICByZXR1cm4gcGFydHMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IHZhbHVlID09PSBcIl9fcHJvdG9fX1wiIHx8IHZhbHVlID09PSBcInByb3RvdHlwZVwiKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4cCA9IC9eXFxbKFxcZCspXFxdJC87XG4gICAgY29uc3QgbUFyciA9IHJlZ2V4cC5leGVjKHZhbHVlKTtcbiAgICBsZXQgcGFyc2VkID0gbnVsbDtcbiAgICBpZiAobUFycikge1xuICAgICAgcGFyc2VkID0geyBpOiBwYXJzZUZsb2F0KG1BcnJbMV0pIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZCA9IHsgcDogdmFsdWUucmVwbGFjZSgvXFxcXChbLltcXF1dKS9nLCBcIiQxXCIpIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQ7XG4gIH0pO1xufVxuX19uYW1lKHBhcnNlUGF0aCwgXCJwYXJzZVBhdGhcIik7XG5mdW5jdGlvbiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCwgcGF0aERlcHRoKSB7XG4gIGxldCB0ZW1wb3JhcnlWYWx1ZSA9IG9iajtcbiAgbGV0IHJlcyA9IG51bGw7XG4gIHBhdGhEZXB0aCA9IHR5cGVvZiBwYXRoRGVwdGggPT09IFwidW5kZWZpbmVkXCIgPyBwYXJzZWQubGVuZ3RoIDogcGF0aERlcHRoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhEZXB0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFydCA9IHBhcnNlZFtpXTtcbiAgICBpZiAodGVtcG9yYXJ5VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5wID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRlbXBvcmFyeVZhbHVlID0gdGVtcG9yYXJ5VmFsdWVbcGFydC5pXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRlbXBvcmFyeVZhbHVlID0gdGVtcG9yYXJ5VmFsdWVbcGFydC5wXTtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBwYXRoRGVwdGggLSAxKSB7XG4gICAgICAgIHJlcyA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuX19uYW1lKGludGVybmFsR2V0UGF0aFZhbHVlLCBcImludGVybmFsR2V0UGF0aFZhbHVlXCIpO1xuZnVuY3Rpb24gZ2V0UGF0aEluZm8ob2JqLCBwYXRoKSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGF0aChwYXRoKTtcbiAgY29uc3QgbGFzdCA9IHBhcnNlZFtwYXJzZWQubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGluZm8gPSB7XG4gICAgcGFyZW50OiBwYXJzZWQubGVuZ3RoID4gMSA/IGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXJzZWQubGVuZ3RoIC0gMSkgOiBvYmosXG4gICAgbmFtZTogbGFzdC5wIHx8IGxhc3QuaSxcbiAgICB2YWx1ZTogaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQpXG4gIH07XG4gIGluZm8uZXhpc3RzID0gaGFzUHJvcGVydHkoaW5mby5wYXJlbnQsIGluZm8ubmFtZSk7XG4gIHJldHVybiBpbmZvO1xufVxuX19uYW1lKGdldFBhdGhJbmZvLCBcImdldFBhdGhJbmZvXCIpO1xuXG4vLyBsaWIvY2hhaS9hc3NlcnRpb24uanNcbmZ1bmN0aW9uIEFzc2VydGlvbihvYmosIG1zZywgc3NmaSwgbG9ja1NzZmkpIHtcbiAgZmxhZyh0aGlzLCBcInNzZmlcIiwgc3NmaSB8fCBBc3NlcnRpb24pO1xuICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgbG9ja1NzZmkpO1xuICBmbGFnKHRoaXMsIFwib2JqZWN0XCIsIG9iaik7XG4gIGZsYWcodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGZsYWcodGhpcywgXCJlcWxcIiwgY29uZmlnLmRlZXBFcXVhbCB8fCBkZWVwX2VxbF9kZWZhdWx0KTtcbiAgcmV0dXJuIHByb3hpZnkodGhpcyk7XG59XG5fX25hbWUoQXNzZXJ0aW9uLCBcIkFzc2VydGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24sIFwiaW5jbHVkZVN0YWNrXCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIik7XG4gICAgcmV0dXJuIGNvbmZpZy5pbmNsdWRlU3RhY2s7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIik7XG4gICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24sIFwic2hvd0RpZmZcIiwge1xuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybihcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIik7XG4gICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybihcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIik7XG4gICAgY29uZmlnLnNob3dEaWZmID0gdmFsdWU7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgYWRkUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbn07XG5Bc3NlcnRpb24uYWRkTWV0aG9kID0gZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgYWRkTWV0aG9kKHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG59O1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCA9IGZ1bmN0aW9uKG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIGFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xufTtcbkFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gIG92ZXJ3cml0ZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG59O1xuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCA9IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gIG92ZXJ3cml0ZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xufTtcbkFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgPSBmdW5jdGlvbihuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKTtcbn07XG5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCA9IGZ1bmN0aW9uKGV4cHIsIG1zZywgbmVnYXRlTXNnLCBleHBlY3RlZCwgX2FjdHVhbCwgc2hvd0RpZmYpIHtcbiAgdmFyIG9rID0gdGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAoZmFsc2UgIT09IHNob3dEaWZmKVxuICAgIHNob3dEaWZmID0gdHJ1ZTtcbiAgaWYgKHZvaWQgMCA9PT0gZXhwZWN0ZWQgJiYgdm9pZCAwID09PSBfYWN0dWFsKVxuICAgIHNob3dEaWZmID0gZmFsc2U7XG4gIGlmICh0cnVlICE9PSBjb25maWcuc2hvd0RpZmYpXG4gICAgc2hvd0RpZmYgPSBmYWxzZTtcbiAgaWYgKCFvaykge1xuICAgIG1zZyA9IGdldE1lc3NhZ2UyKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGFjdHVhbCA9IGdldEFjdHVhbCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMgPSB7XG4gICAgICBhY3R1YWwsXG4gICAgICBleHBlY3RlZCxcbiAgICAgIHNob3dEaWZmXG4gICAgfTtcbiAgICB2YXIgb3BlcmF0b3IgPSBnZXRPcGVyYXRvcih0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChvcGVyYXRvcikge1xuICAgICAgYXNzZXJ0aW9uRXJyb3JPYmplY3RQcm9wZXJ0aWVzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZyxcbiAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcyxcbiAgICAgIGNvbmZpZy5pbmNsdWRlU3RhY2sgPyB0aGlzLmFzc2VydCA6IGZsYWcodGhpcywgXCJzc2ZpXCIpXG4gICAgKTtcbiAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgQXNzZXJ0aW9uLnByb3RvdHlwZSxcbiAgXCJfb2JqXCIsXG4gIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZsYWcodGhpcywgXCJvYmplY3RcIik7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgZmxhZyh0aGlzLCBcIm9iamVjdFwiLCB2YWwpO1xuICAgIH1cbiAgfVxuKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanNcbmZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbl9fbmFtZShpc1Byb3h5RW5hYmxlZCwgXCJpc1Byb3h5RW5hYmxlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanNcbmZ1bmN0aW9uIGFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIGdldHRlciA9IGdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7XG4gIH0gOiBnZXR0ZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBjdHgsXG4gICAgbmFtZSxcbiAgICB7XG4gICAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICAgIGlmICghaXNQcm94eUVuYWJsZWQoKSAmJiAhZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgcHJvcGVydHlHZXR0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgICAgIH0sIFwicHJvcGVydHlHZXR0ZXJcIiksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gICk7XG59XG5fX25hbWUoYWRkUHJvcGVydHksIFwiYWRkUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZExlbmd0aEd1YXJkLmpzXG52YXIgZm5MZW5ndGhEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jdGlvbigpIHtcbn0sIFwibGVuZ3RoXCIpO1xuZnVuY3Rpb24gYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSlcbiAgICByZXR1cm4gZm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJsZW5ndGhcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaXNDaGFpbmFibGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aC4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgKyBhc3NlcnRpb25OYW1lICsgJ1wiLicpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmbjtcbn1cbl9fbmFtZShhZGRMZW5ndGhHdWFyZCwgXCJhZGRMZW5ndGhHdWFyZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0UHJvcGVydGllcy5qc1xuZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGZ1bmN0aW9uIGFkZFByb3BlcnR5Mihwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG4gIF9fbmFtZShhZGRQcm9wZXJ0eTIsIFwiYWRkUHJvcGVydHlcIik7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICB3aGlsZSAocHJvdG8gIT09IG51bGwpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bykuZm9yRWFjaChhZGRQcm9wZXJ0eTIpO1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuX19uYW1lKGdldFByb3BlcnRpZXMsIFwiZ2V0UHJvcGVydGllc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvcHJveGlmeS5qc1xudmFyIGJ1aWx0aW5zID0gW1wiX19mbGFnc1wiLCBcIl9fbWV0aG9kc1wiLCBcIl9vYmpcIiwgXCJhc3NlcnRcIl07XG5mdW5jdGlvbiBwcm94aWZ5KG9iaiwgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUHJveHlFbmFibGVkKCkpXG4gICAgcmV0dXJuIG9iajtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJveHlHZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgKyBcIi5cIiArIHByb3BlcnR5ICsgJy4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgKyBub25DaGFpbmFibGVNZXRob2ROYW1lICsgJ1wiLicpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdWdnZXN0aW9uID0gbnVsbDtcbiAgICAgICAgdmFyIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IDQ7XG4gICAgICAgIGdldFByb3BlcnRpZXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgYnVpbHRpbnMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHZhciBkaXN0ID0gc3RyaW5nRGlzdGFuY2VDYXBwZWQoXG4gICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICBzdWdnZXN0aW9uRGlzdGFuY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZGlzdCA8IHN1Z2dlc3Rpb25EaXN0YW5jZSkge1xuICAgICAgICAgICAgICBzdWdnZXN0aW9uID0gcHJvcDtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbkRpc3RhbmNlID0gZGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIHByb3BlcnR5ICsgJy4gRGlkIHlvdSBtZWFuIFwiJyArIHN1Z2dlc3Rpb24gKyAnXCI/Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYnVpbHRpbnMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFmbGFnKHRhcmdldCwgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgXCJzc2ZpXCIsIHByb3h5R2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9LCBcInByb3h5R2V0dGVyXCIpXG4gIH0pO1xufVxuX19uYW1lKHByb3hpZnksIFwicHJveGlmeVwiKTtcbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuICB2YXIgbWVtbyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoID0gc3RyQS5jaGFyQ29kZUF0KGkgLSAxKTtcbiAgICBmb3IgKHZhciBqID0gMTsgaiA8PSBzdHJCLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoaSAtIGopID49IGNhcCkge1xuICAgICAgICBtZW1vW2ldW2pdID0gY2FwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgbWVtb1tpIC0gMV1bal0gKyAxLFxuICAgICAgICBtZW1vW2ldW2ogLSAxXSArIDEsXG4gICAgICAgIG1lbW9baSAtIDFdW2ogLSAxXSArIChjaCA9PT0gc3RyQi5jaGFyQ29kZUF0KGogLSAxKSA/IDAgOiAxKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbl9fbmFtZShzdHJpbmdEaXN0YW5jZUNhcHBlZCwgXCJzdHJpbmdEaXN0YW5jZUNhcHBlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkTWV0aG9kLmpzXG5mdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgdmFyIG1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMClcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfSwgXCJtZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChtZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkobWV0aG9kV3JhcHBlciwgbmFtZSk7XG59XG5fX25hbWUoYWRkTWV0aG9kLCBcImFkZE1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlUHJvcGVydHkuanNcbmZ1bmN0aW9uIG92ZXJ3cml0ZVByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIHZhciBfZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdHgsIG5hbWUpLCBfc3VwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICB9LCBcIl9zdXBlclwiKTtcbiAgaWYgKF9nZXQgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2dldC5nZXQpXG4gICAgX3N1cGVyID0gX2dldC5nZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBjdHgsXG4gICAgbmFtZSxcbiAgICB7XG4gICAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcigpIHtcbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIoX3N1cGVyKS5jYWxsKHRoaXMpO1xuICAgICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9LCBcIm92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXJcIiksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gICk7XG59XG5fX25hbWUob3ZlcndyaXRlUHJvcGVydHksIFwib3ZlcndyaXRlUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZU1ldGhvZC5qc1xuZnVuY3Rpb24gb3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBfbWV0aG9kID0gY3R4W25hbWVdLCBfc3VwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgXCIgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gIH0sIFwiX3N1cGVyXCIpO1xuICBpZiAoX21ldGhvZCAmJiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfbWV0aG9kKVxuICAgIF9zdXBlciA9IF9tZXRob2Q7XG4gIHZhciBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cbiAgICB2YXIgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcodGhpcywgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUpO1xufVxuX19uYW1lKG92ZXJ3cml0ZU1ldGhvZCwgXCJvdmVyd3JpdGVNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZENoYWluYWJsZU1ldGhvZC5qc1xudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09IFwiZnVuY3Rpb25cIjtcbnZhciB0ZXN0Rm4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xufSwgXCJ0ZXN0Rm5cIik7XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG4gIGlmICh0eXBlb2YgcHJvcERlc2MgIT09IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhcHJvcERlc2MuY29uZmlndXJhYmxlO1xufSk7XG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuZnVuY3Rpb24gYWRkQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIGlmICh0eXBlb2YgY2hhaW5pbmdCZWhhdmlvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2hhaW5pbmdCZWhhdmlvciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgfSwgXCJjaGFpbmluZ0JlaGF2aW9yXCIpO1xuICB9XG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IHtcbiAgICBtZXRob2QsXG4gICAgY2hhaW5pbmdCZWhhdmlvclxuICB9O1xuICBpZiAoIWN0eC5fX21ldGhvZHMpIHtcbiAgICBjdHguX19tZXRob2RzID0ge307XG4gIH1cbiAgY3R4Ll9fbWV0aG9kc1tuYW1lXSA9IGNoYWluYWJsZUJlaGF2aW9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgY3R4LFxuICAgIG5hbWUsXG4gICAge1xuICAgICAgZ2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIGNoYWluYWJsZU1ldGhvZEdldHRlcigpIHtcbiAgICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgY2hhaW5hYmxlTWV0aG9kV3JhcHBlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKCFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgICAgIGZsYWcodGhpcywgXCJzc2ZpXCIsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcmVzdWx0ID0gY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICAgICAgICB9LCBcImNoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG4gICAgICAgIGFkZExlbmd0aEd1YXJkKGNoYWluYWJsZU1ldGhvZFdyYXBwZXIsIG5hbWUsIHRydWUpO1xuICAgICAgICBpZiAoY2FuU2V0UHJvdG90eXBlKSB7XG4gICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgICAgcHJvdG90eXBlLmNhbGwgPSBjYWxsO1xuICAgICAgICAgIHByb3RvdHlwZS5hcHBseSA9IGFwcGx5O1xuICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBwcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhc3NlcnRlck5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3R4KTtcbiAgICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24oYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVkZU5hbWVzLmluZGV4T2YoYXNzZXJ0ZXJOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdHgsIGFzc2VydGVyTmFtZSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgYXNzZXJ0ZXJOYW1lLCBwZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBjaGFpbmFibGVNZXRob2RXcmFwcGVyKTtcbiAgICAgICAgcmV0dXJuIHByb3hpZnkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgICB9LCBcImNoYWluYWJsZU1ldGhvZEdldHRlclwiKSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgKTtcbn1cbl9fbmFtZShhZGRDaGFpbmFibGVNZXRob2QsIFwiYWRkQ2hhaW5hYmxlTWV0aG9kXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QuanNcbmZ1bmN0aW9uIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZChjdHgsIG5hbWUsIG1ldGhvZCwgY2hhaW5pbmdCZWhhdmlvcikge1xuICB2YXIgY2hhaW5hYmxlQmVoYXZpb3IgPSBjdHguX19tZXRob2RzW25hbWVdO1xuICB2YXIgX2NoYWluaW5nQmVoYXZpb3IgPSBjaGFpbmFibGVCZWhhdmlvci5jaGFpbmluZ0JlaGF2aW9yO1xuICBjaGFpbmFibGVCZWhhdmlvci5jaGFpbmluZ0JlaGF2aW9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZEdldHRlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gY2hhaW5pbmdCZWhhdmlvcihfY2hhaW5pbmdCZWhhdmlvcikuY2FsbCh0aGlzKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdDaGFpbmFibGVNZXRob2RHZXR0ZXJcIik7XG4gIHZhciBfbWV0aG9kID0gY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kO1xuICBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9tZXRob2QpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlclwiKTtcbn1cbl9fbmFtZShvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QsIFwib3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9jb21wYXJlQnlJbnNwZWN0LmpzXG5mdW5jdGlvbiBjb21wYXJlQnlJbnNwZWN0KGEsIGIpIHtcbiAgcmV0dXJuIGluc3BlY3QyKGEpIDwgaW5zcGVjdDIoYikgPyAtMSA6IDE7XG59XG5fX25hbWUoY29tcGFyZUJ5SW5zcGVjdCwgXCJjb21wYXJlQnlJbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzLmpzXG5mdW5jdGlvbiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzKG9iaikge1xuICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaikuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKS5lbnVtZXJhYmxlO1xuICB9KTtcbn1cbl9fbmFtZShnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzLCBcImdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHNcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikuY29uY2F0KGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqKSk7XG59XG5fX25hbWUoZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMsIFwiZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXNcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2lzTmFOLmpzXG5mdW5jdGlvbiBfaXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cbl9fbmFtZShfaXNOYU4sIFwiX2lzTmFOXCIpO1xudmFyIGlzTmFOMiA9IE51bWJlci5pc05hTiB8fCBfaXNOYU47XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE9wZXJhdG9yLmpzXG5mdW5jdGlvbiBpc09iamVjdFR5cGUob2JqKSB7XG4gIHZhciBvYmplY3RUeXBlID0gdHlwZShvYmopO1xuICB2YXIgb2JqZWN0VHlwZXMgPSBbXCJBcnJheVwiLCBcIk9iamVjdFwiLCBcIkZ1bmN0aW9uXCJdO1xuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5fX25hbWUoaXNPYmplY3RUeXBlLCBcImlzT2JqZWN0VHlwZVwiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdG9yKG9iaiwgYXJncykge1xuICB2YXIgb3BlcmF0b3IgPSBmbGFnKG9iaiwgXCJvcGVyYXRvclwiKTtcbiAgdmFyIG5lZ2F0ZSA9IGZsYWcob2JqLCBcIm5lZ2F0ZVwiKTtcbiAgdmFyIGV4cGVjdGVkID0gYXJnc1szXTtcbiAgdmFyIG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIilcbiAgICBtc2cgPSBtc2coKTtcbiAgbXNnID0gbXNnIHx8IFwiXCI7XG4gIGlmICghbXNnKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoL1xcc2hhdmVcXHMvLnRlc3QobXNnKSkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgdmFyIGlzT2JqZWN0ID0gaXNPYmplY3RUeXBlKGV4cGVjdGVkKTtcbiAgaWYgKC9cXHNub3RcXHMvLnRlc3QobXNnKSkge1xuICAgIHJldHVybiBpc09iamVjdCA/IFwibm90RGVlcFN0cmljdEVxdWFsXCIgOiBcIm5vdFN0cmljdEVxdWFsXCI7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0ID8gXCJkZWVwU3RyaWN0RXF1YWxcIiA6IFwic3RyaWN0RXF1YWxcIjtcbn1cbl9fbmFtZShnZXRPcGVyYXRvciwgXCJnZXRPcGVyYXRvclwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaW5kZXguanNcbmZ1bmN0aW9uIGdldE5hbWUoZm4pIHtcbiAgcmV0dXJuIGZuLm5hbWU7XG59XG5fX25hbWUoZ2V0TmFtZSwgXCJnZXROYW1lXCIpO1xuZnVuY3Rpb24gaXNSZWdFeHAyKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAyLCBcImlzUmVnRXhwXCIpO1xuZnVuY3Rpb24gaXNOdW1lcmljKG9iaikge1xuICByZXR1cm4gW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqKSk7XG59XG5fX25hbWUoaXNOdW1lcmljLCBcImlzTnVtZXJpY1wiKTtcblxuLy8gbGliL2NoYWkvY29yZS9hc3NlcnRpb25zLmpzXG52YXIgeyBmbGFnOiBmbGFnMiB9ID0gdXRpbHNfZXhwb3J0cztcbltcbiAgXCJ0b1wiLFxuICBcImJlXCIsXG4gIFwiYmVlblwiLFxuICBcImlzXCIsXG4gIFwiYW5kXCIsXG4gIFwiaGFzXCIsXG4gIFwiaGF2ZVwiLFxuICBcIndpdGhcIixcbiAgXCJ0aGF0XCIsXG4gIFwid2hpY2hcIixcbiAgXCJhdFwiLFxuICBcIm9mXCIsXG4gIFwic2FtZVwiLFxuICBcImJ1dFwiLFxuICBcImRvZXNcIixcbiAgXCJzdGlsbFwiLFxuICBcImFsc29cIlxuXS5mb3JFYWNoKGZ1bmN0aW9uKGNoYWluKSB7XG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eShjaGFpbik7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm5vdFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJuZWdhdGVcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImRlZXBcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiZGVlcFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwibmVzdGVkXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIm5lc3RlZFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwib3duXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIm93blwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwib3JkZXJlZFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJvcmRlcmVkXCIsIHRydWUpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhbnlcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiYW55XCIsIHRydWUpO1xuICBmbGFnMih0aGlzLCBcImFsbFwiLCBmYWxzZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImFsbFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJhbGxcIiwgdHJ1ZSk7XG4gIGZsYWcyKHRoaXMsIFwiYW55XCIsIGZhbHNlKTtcbn0pO1xudmFyIGZ1bmN0aW9uVHlwZXMgPSB7XG4gIFwiZnVuY3Rpb25cIjogW1wiZnVuY3Rpb25cIiwgXCJhc3luY2Z1bmN0aW9uXCIsIFwiZ2VuZXJhdG9yZnVuY3Rpb25cIiwgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJdLFxuICBcImFzeW5jZnVuY3Rpb25cIjogW1wiYXN5bmNmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIFwiZ2VuZXJhdG9yZnVuY3Rpb25cIjogW1wiZ2VuZXJhdG9yZnVuY3Rpb25cIiwgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJdLFxuICBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIjogW1wiYXN5bmNnZW5lcmF0b3JmdW5jdGlvblwiXVxufTtcbmZ1bmN0aW9uIGFuKHR5cGUzLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdHlwZTMgPSB0eXBlMy50b0xvd2VyQ2FzZSgpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGFydGljbGUgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0eXBlMy5jaGFyQXQoMCkpID8gXCJhbiBcIiA6IFwiYSBcIjtcbiAgY29uc3QgZGV0ZWN0ZWRUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmdW5jdGlvblR5cGVzW1wiZnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZTMpKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBmdW5jdGlvblR5cGVzW3R5cGUzXS5pbmNsdWRlcyhkZXRlY3RlZFR5cGUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBcIiArIGFydGljbGUgKyB0eXBlM1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB0eXBlMyA9PT0gZGV0ZWN0ZWRUeXBlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBcIiArIGFydGljbGUgKyB0eXBlM1xuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhbiwgXCJhblwiKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJhblwiLCBhbik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiYVwiLCBhbik7XG5mdW5jdGlvbiBTYW1lVmFsdWVaZXJvKGEsIGIpIHtcbiAgcmV0dXJuIGlzTmFOMihhKSAmJiBpc05hTjIoYikgfHwgYSA9PT0gYjtcbn1cbl9fbmFtZShTYW1lVmFsdWVaZXJvLCBcIlNhbWVWYWx1ZVplcm9cIik7XG5mdW5jdGlvbiBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcigpIHtcbiAgZmxhZzIodGhpcywgXCJjb250YWluc1wiLCB0cnVlKTtcbn1cbl9fbmFtZShpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvciwgXCJpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvclwiKTtcbmZ1bmN0aW9uIGluY2x1ZGUodmFsLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBpc0RlZXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIiksIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyBcImRlZXAgXCIgOiBcIlwiLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogU2FtZVZhbHVlWmVybztcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgdmFyIGluY2x1ZGVkID0gZmFsc2U7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vha3NldFwiOlxuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldFwiLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IGluY2x1ZGVkIHx8IGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidGhlIGdpdmVuIGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyAoXCIgKyBvYmpUeXBlICsgXCIgYW5kIFwiICsgdHlwZSh2YWwpLnRvTG93ZXJDYXNlKCkgKyBcIikgaXMgaW52YWxpZCBmb3IgdGhpcyBhc3NlcnRpb24uIFlvdSBjYW4gdXNlIGFuIGFycmF5LCBhIG1hcCwgYW4gb2JqZWN0LCBhIHNldCwgYSBzdHJpbmcsIG9yIGEgd2Vha3NldCBpbnN0ZWFkIG9mIGEgXCIgKyB0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgc3NmaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXModmFsKSwgZmlyc3RFcnIgPSBudWxsLCBudW1FcnJzID0gMDtcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICB2YXIgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBwcm9wQXNzZXJ0aW9uLCB0cnVlKTtcbiAgICAgICAgZmxhZzIocHJvcEFzc2VydGlvbiwgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihlcnIsIEFzc2VydGlvbkVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlyc3RFcnIgPT09IG51bGwpXG4gICAgICAgICAgICBmaXJzdEVyciA9IGVycjtcbiAgICAgICAgICBudW1FcnJzKys7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgICAgaWYgKG5lZ2F0ZSAmJiBwcm9wcy5sZW5ndGggPiAxICYmIG51bUVycnMgPT09IHByb3BzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBmaXJzdEVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpbmNsdWRlZCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZXNjcmlwdG9yICsgXCJpbmNsdWRlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IFwiICsgZGVzY3JpcHRvciArIFwiaW5jbHVkZSBcIiArIGluc3BlY3QyKHZhbClcbiAgKTtcbn1cbl9fbmFtZShpbmNsdWRlLCBcImluY2x1ZGVcIik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiaW5jbHVkZVwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpblwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpbnNcIiwgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImluY2x1ZGVzXCIsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9rXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1dGh5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5XCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidHJ1ZVwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHJ1ZSA9PT0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydWVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJudW1lcmljXCIsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBvYmplY3QgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqZWN0KSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIG51bWVyaWNcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG51bWVyaWNcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJjYWxsYWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgdmFsID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UgPyBgJHttZXNzYWdlfTogYCA6IFwiXCI7XG4gIGNvbnN0IG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpO1xuICBjb25zdCBhc3NlcnRpb25NZXNzYWdlID0gbmVnYXRlID8gYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gbm90IHRvIGJlIGEgY2FsbGFibGUgZnVuY3Rpb25gIDogYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbmA7XG4gIGNvbnN0IGlzQ2FsbGFibGUgPSBbXCJGdW5jdGlvblwiLCBcIkFzeW5jRnVuY3Rpb25cIiwgXCJHZW5lcmF0b3JGdW5jdGlvblwiLCBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZSh2YWwpKTtcbiAgaWYgKGlzQ2FsbGFibGUgJiYgbmVnYXRlIHx8ICFpc0NhbGxhYmxlICYmICFuZWdhdGUpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBhc3NlcnRpb25NZXNzYWdlLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZmFsc2VcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZhbHNlID09PSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZVwiLFxuICAgIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpID8gdHJ1ZSA6IGZhbHNlXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm51bGxcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIG51bGwgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBudWxsXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBudWxsXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidW5kZWZpbmVkXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICB2b2lkIDAgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIHVuZGVmaW5lZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIk5hTlwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNOYU4yKGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgTmFOXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBOYU5cIlxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdCgpIHtcbiAgdmFyIHZhbCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdFwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0RXhpc3QsIFwiYXNzZXJ0RXhpc3RcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdFwiLCBhc3NlcnRFeGlzdCk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdHNcIiwgYXNzZXJ0RXhpc3QpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciB2YWwgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgaXRlbXNDb3VudDtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgc3dpdGNoICh0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1hcFwiOlxuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ3ZWFrbWFwXCI6XG4gICAgY2FzZSBcIndlYWtzZXRcIjpcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb25cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgdmFyIG1zZyA9IGZsYWdNc2cgKyBcIi5lbXB0eSB3YXMgcGFzc2VkIGEgZnVuY3Rpb24gXCIgKyBnZXROYW1lKHZhbCk7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnLnRyaW0oKSwgdm9pZCAwLCBzc2ZpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHZhbCAhPT0gT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyBcIi5lbXB0eSB3YXMgcGFzc2VkIG5vbi1zdHJpbmcgcHJpbWl0aXZlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgc3NmaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaXRlbXNDb3VudCA9IE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIDAgPT09IGl0ZW1zQ291bnQsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGVtcHR5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBlbXB0eVwiXG4gICk7XG59KTtcbmZ1bmN0aW9uIGNoZWNrQXJndW1lbnRzKCkge1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIHR5cGUzID0gdHlwZShvYmopO1xuICB0aGlzLmFzc2VydChcbiAgICBcIkFyZ3VtZW50c1wiID09PSB0eXBlMyxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYXJndW1lbnRzIGJ1dCBnb3QgXCIgKyB0eXBlMyxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFyZ3VtZW50c1wiXG4gICk7XG59XG5fX25hbWUoY2hlY2tBcmd1bWVudHMsIFwiY2hlY2tBcmd1bWVudHNcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhcmd1bWVudHNcIiwgY2hlY2tBcmd1bWVudHMpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiQXJndW1lbnRzXCIsIGNoZWNrQXJndW1lbnRzKTtcbmZ1bmN0aW9uIGFzc2VydEVxdWFsKHZhbCwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgaWYgKGZsYWcyKHRoaXMsIFwiZGVlcFwiKSkge1xuICAgIHZhciBwcmV2TG9ja1NzZmkgPSBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcyKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgdGhpcy5lcWwodmFsKTtcbiAgICBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIsIHByZXZMb2NrU3NmaSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB2YWwgPT09IG9iaixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXF1YWwgI3tleHB9XCIsXG4gICAgICB2YWwsXG4gICAgICB0aGlzLl9vYmosXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEVxdWFsLCBcImFzc2VydEVxdWFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxdWFsXCIsIGFzc2VydEVxdWFsKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJlcXVhbHNcIiwgYXNzZXJ0RXF1YWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxXCIsIGFzc2VydEVxdWFsKTtcbmZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgZXFsID0gZmxhZzIodGhpcywgXCJlcWxcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGVxbChvYmosIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcGx5IGVxdWFsICN7ZXhwfVwiLFxuICAgIG9iaixcbiAgICB0aGlzLl9vYmosXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEVxbCwgXCJhc3NlcnRFcWxcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZXFsXCIsIGFzc2VydEVxbCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZXFsc1wiLCBhc3NlcnRFcWwpO1xuZnVuY3Rpb24gYXNzZXJ0QWJvdmUobiwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgZG9MZW5ndGggPSBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBtc2dQcmVmaXggPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCIsIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIG9ialR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKSwgblR5cGUgPSB0eXBlKG4pLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSBcImRhdGVcIiAmJiBuVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBkYXRlXCIsIHZvaWQgMCwgc3NmaSk7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBudW1iZXJcIiwgdm9pZCAwLCBzc2ZpKTtcbiAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09IFwiZGF0ZVwiICYmICFpc051bWVyaWMob2JqKSkpIHtcbiAgICB2YXIgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnUHJlZml4ICsgXCJleHBlY3RlZCBcIiArIHByaW50T2JqICsgXCIgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlXCIsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA+IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYWJvdmUgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPiBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEFib3ZlLCBcImFzc2VydEFib3ZlXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImFib3ZlXCIsIGFzc2VydEFib3ZlKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJndFwiLCBhc3NlcnRBYm92ZSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3JlYXRlclRoYW5cIiwgYXNzZXJ0QWJvdmUpO1xuZnVuY3Rpb24gYXNzZXJ0TGVhc3QobiwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgZG9MZW5ndGggPSBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBtc2dQcmVmaXggPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCIsIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIG9ialR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKSwgblR5cGUgPSB0eXBlKG4pLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gXCJtYXBcIiAmJiBvYmpUeXBlICE9PSBcInNldFwiKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoXCJsZW5ndGhcIik7XG4gIH1cbiAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbGVhc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gXCJkYXRlXCIgJiYgIWlzTnVtZXJpYyhvYmopKSkge1xuICAgIHZhciBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50ID49IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGF0IGxlYXN0ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBiZWxvdyAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA+PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRMZWFzdCwgXCJhc3NlcnRMZWFzdFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsZWFzdFwiLCBhc3NlcnRMZWFzdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3RlXCIsIGFzc2VydExlYXN0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJncmVhdGVyVGhhbk9yRXF1YWxcIiwgYXNzZXJ0TGVhc3QpO1xuZnVuY3Rpb24gYXNzZXJ0QmVsb3cobiwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgZG9MZW5ndGggPSBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBtc2dQcmVmaXggPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCIsIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIG9ialR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKSwgblR5cGUgPSB0eXBlKG4pLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gXCJtYXBcIiAmJiBvYmpUeXBlICE9PSBcInNldFwiKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoXCJsZW5ndGhcIik7XG4gIH1cbiAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gXCJkYXRlXCIgJiYgIWlzTnVtZXJpYyhvYmopKSkge1xuICAgIHZhciBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50IDwgbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBiZWxvdyAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA8IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYmVsb3cgI3tleHB9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbGVhc3QgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEJlbG93LCBcImFzc2VydEJlbG93XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImJlbG93XCIsIGFzc2VydEJlbG93KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsdFwiLCBhc3NlcnRCZWxvdyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibGVzc1RoYW5cIiwgYXNzZXJ0QmVsb3cpO1xuZnVuY3Rpb24gYXNzZXJ0TW9zdChuLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSBcImRhdGVcIiAmJiBuVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgZGF0ZVwiO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gXCJkYXRlXCIgJiYgIWlzTnVtZXJpYyhvYmopKSkge1xuICAgIHZhciBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50IDw9IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGF0IG1vc3QgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgbixcbiAgICAgIGl0ZW1zQ291bnRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqIDw9IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH1cIixcbiAgICAgIG5cbiAgICApO1xuICB9XG59XG5fX25hbWUoYXNzZXJ0TW9zdCwgXCJhc3NlcnRNb3N0XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm1vc3RcIiwgYXNzZXJ0TW9zdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibHRlXCIsIGFzc2VydE1vc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImxlc3NUaGFuT3JFcXVhbFwiLCBhc3NlcnRNb3N0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ3aXRoaW5cIiwgZnVuY3Rpb24oc3RhcnQsIGZpbmlzaCwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgZG9MZW5ndGggPSBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBtc2dQcmVmaXggPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCIsIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIG9ialR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKSwgc3RhcnRUeXBlID0gdHlwZShzdGFydCkudG9Mb3dlckNhc2UoKSwgZmluaXNoVHlwZSA9IHR5cGUoZmluaXNoKS50b0xvd2VyQ2FzZSgpLCBlcnJvck1lc3NhZ2UsIHNob3VsZFRocm93ID0gdHJ1ZSwgcmFuZ2UgPSBzdGFydFR5cGUgPT09IFwiZGF0ZVwiICYmIGZpbmlzaFR5cGUgPT09IFwiZGF0ZVwiID8gc3RhcnQudG9JU09TdHJpbmcoKSArIFwiLi5cIiArIGZpbmlzaC50b0lTT1N0cmluZygpIDogc3RhcnQgKyBcIi4uXCIgKyBmaW5pc2g7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSBcImRhdGVcIiAmJiAoc3RhcnRUeXBlICE9PSBcImRhdGVcIiB8fCBmaW5pc2hUeXBlICE9PSBcImRhdGVcIikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIGRhdGVzXCI7XG4gIH0gZWxzZSBpZiAoKCFpc051bWVyaWMoc3RhcnQpIHx8ICFpc051bWVyaWMoZmluaXNoKSkgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBudW1iZXJzXCI7XG4gIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpKSB7XG4gICAgdmFyIHByaW50T2JqID0gb2JqVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJleHBlY3RlZCBcIiArIHByaW50T2JqICsgXCIgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlXCI7XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgfVxuICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIGlmIChkb0xlbmd0aCkge1xuICAgIHZhciBkZXNjcmlwdG9yID0gXCJsZW5ndGhcIiwgaXRlbXNDb3VudDtcbiAgICBpZiAob2JqVHlwZSA9PT0gXCJtYXBcIiB8fCBvYmpUeXBlID09PSBcInNldFwiKSB7XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGl0ZW1zQ291bnQgPj0gc3RhcnQgJiYgaXRlbXNDb3VudCA8PSBmaW5pc2gsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIHdpdGhpbiBcIiArIHJhbmdlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgd2l0aGluIFwiICsgcmFuZ2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqID49IHN0YXJ0ICYmIG9iaiA8PSBmaW5pc2gsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgd2l0aGluIFwiICsgcmFuZ2UsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHdpdGhpbiBcIiArIHJhbmdlXG4gICAgKTtcbiAgfVxufSk7XG5mdW5jdGlvbiBhc3NlcnRJbnN0YW5jZU9mKGNvbnN0cnVjdG9yLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIHRhcmdldCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB2YXIgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKTtcbiAgdmFyIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIHRyeSB7XG4gICAgdmFyIGlzSW5zdGFuY2VPZiA9IHRhcmdldCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgOiBcIlwiO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJUaGUgaW5zdGFuY2VvZiBhc3NlcnRpb24gbmVlZHMgYSBjb25zdHJ1Y3RvciBidXQgXCIgKyB0eXBlKGNvbnN0cnVjdG9yKSArIFwiIHdhcyBnaXZlbi5cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgdmFyIG5hbWUgPSBnZXROYW1lKGNvbnN0cnVjdG9yKTtcbiAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgIG5hbWUgPSBcImFuIHVubmFtZWQgY29uc3RydWN0b3JcIjtcbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpc0luc3RhbmNlT2YsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFuIGluc3RhbmNlIG9mIFwiICsgbmFtZSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mIFwiICsgbmFtZVxuICApO1xufVxuX19uYW1lKGFzc2VydEluc3RhbmNlT2YsIFwiYXNzZXJ0SW5zdGFuY2VPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbnN0YW5jZW9mXCIsIGFzc2VydEluc3RhbmNlT2YpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImluc3RhbmNlT2ZcIiwgYXNzZXJ0SW5zdGFuY2VPZik7XG5mdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eShuYW1lLCB2YWwsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgaXNOZXN0ZWQgPSBmbGFnMih0aGlzLCBcIm5lc3RlZFwiKSwgaXNPd24gPSBmbGFnMih0aGlzLCBcIm93blwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIG5hbWVUeXBlID0gdHlwZW9mIG5hbWU7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIGlmIChpc05lc3RlZCkge1xuICAgIGlmIChuYW1lVHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJ0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZyB3aGVuIHVzaW5nIG5lc3RlZCBzeW50YXhcIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobmFtZVR5cGUgIT09IFwic3RyaW5nXCIgJiYgbmFtZVR5cGUgIT09IFwibnVtYmVyXCIgJiYgbmFtZVR5cGUgIT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwidGhlIGFyZ3VtZW50IHRvIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcsIG51bWJlciwgb3Igc3ltYm9sXCIsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzTmVzdGVkICYmIGlzT3duKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgZmxhZ01zZyArICdUaGUgXCJuZXN0ZWRcIiBhbmQgXCJvd25cIiBmbGFncyBjYW5ub3QgYmUgY29tYmluZWQuJyxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJUYXJnZXQgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLlwiLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbiAgdmFyIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgbmVnYXRlID0gZmxhZzIodGhpcywgXCJuZWdhdGVcIiksIHBhdGhJbmZvID0gaXNOZXN0ZWQgPyBnZXRQYXRoSW5mbyhvYmosIG5hbWUpIDogbnVsbCwgdmFsdWUgPSBpc05lc3RlZCA/IHBhdGhJbmZvLnZhbHVlIDogb2JqW25hbWVdLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogKHZhbDEsIHZhbDIpID0+IHZhbDEgPT09IHZhbDI7XG4gIHZhciBkZXNjcmlwdG9yID0gXCJcIjtcbiAgaWYgKGlzRGVlcClcbiAgICBkZXNjcmlwdG9yICs9IFwiZGVlcCBcIjtcbiAgaWYgKGlzT3duKVxuICAgIGRlc2NyaXB0b3IgKz0gXCJvd24gXCI7XG4gIGlmIChpc05lc3RlZClcbiAgICBkZXNjcmlwdG9yICs9IFwibmVzdGVkIFwiO1xuICBkZXNjcmlwdG9yICs9IFwicHJvcGVydHkgXCI7XG4gIHZhciBoYXNQcm9wZXJ0eTI7XG4gIGlmIChpc093bilcbiAgICBoYXNQcm9wZXJ0eTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTtcbiAgZWxzZSBpZiAoaXNOZXN0ZWQpXG4gICAgaGFzUHJvcGVydHkyID0gcGF0aEluZm8uZXhpc3RzO1xuICBlbHNlXG4gICAgaGFzUHJvcGVydHkyID0gaGFzUHJvcGVydHkob2JqLCBuYW1lKTtcbiAgaWYgKCFuZWdhdGUgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaGFzUHJvcGVydHkyLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgXCIgKyBkZXNjcmlwdG9yICsgaW5zcGVjdDIobmFtZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgXCIgKyBkZXNjcmlwdG9yICsgaW5zcGVjdDIobmFtZSlcbiAgICApO1xuICB9XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaGFzUHJvcGVydHkyICYmIGlzRXFsKHZhbCwgdmFsdWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgXCIgKyBkZXNjcmlwdG9yICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvZiAje2V4cH0sIGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgXCIgKyBkZXNjcmlwdG9yICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvZiAje2FjdH1cIixcbiAgICAgIHZhbCxcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCB2YWx1ZSk7XG59XG5fX25hbWUoYXNzZXJ0UHJvcGVydHksIFwiYXNzZXJ0UHJvcGVydHlcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicHJvcGVydHlcIiwgYXNzZXJ0UHJvcGVydHkpO1xuZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHkobmFtZSwgdmFsdWUsIG1zZykge1xuICBmbGFnMih0aGlzLCBcIm93blwiLCB0cnVlKTtcbiAgYXNzZXJ0UHJvcGVydHkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eSwgXCJhc3NlcnRPd25Qcm9wZXJ0eVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJvd25Qcm9wZXJ0eVwiLCBhc3NlcnRPd25Qcm9wZXJ0eSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaGF2ZU93blByb3BlcnR5XCIsIGFzc2VydE93blByb3BlcnR5KTtcbmZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBkZXNjcmlwdG9yLCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZGVzY3JpcHRvcjtcbiAgICBkZXNjcmlwdG9yID0gbnVsbDtcbiAgfVxuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHZhciBhY3R1YWxEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qob2JqKSwgbmFtZSk7XG4gIHZhciBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgaWYgKGFjdHVhbERlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcikge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXFsKGRlc2NyaXB0b3IsIGFjdHVhbERlc2NyaXB0b3IpLFxuICAgICAgXCJleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIFwiICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvbiAje3RoaXN9IHRvIG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvcikgKyBcIiwgZ290IFwiICsgaW5zcGVjdDIoYWN0dWFsRGVzY3JpcHRvciksXG4gICAgICBcImV4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgXCIgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9uICN7dGhpc30gdG8gbm90IG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvciksXG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIHRydWVcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBhY3R1YWxEZXNjcmlwdG9yKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIFwiYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5RGVzY3JpcHRvclwiLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcbmZ1bmN0aW9uIGFzc2VydExlbmd0aENoYWluKCkge1xuICBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIsIHRydWUpO1xufVxuX19uYW1lKGFzc2VydExlbmd0aENoYWluLCBcImFzc2VydExlbmd0aENoYWluXCIpO1xuZnVuY3Rpb24gYXNzZXJ0TGVuZ3RoKG4sIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIG9ialR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoXCJsZW5ndGhcIik7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpdGVtc0NvdW50ID09IG4sXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBvZiAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBvZiAje2FjdH1cIixcbiAgICBuLFxuICAgIGl0ZW1zQ291bnRcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRMZW5ndGgsIFwiYXNzZXJ0TGVuZ3RoXCIpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImxlbmd0aFwiLCBhc3NlcnRMZW5ndGgsIGFzc2VydExlbmd0aENoYWluKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJsZW5ndGhPZlwiLCBhc3NlcnRMZW5ndGgsIGFzc2VydExlbmd0aENoYWluKTtcbmZ1bmN0aW9uIGFzc2VydE1hdGNoKHJlLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICByZS5leGVjKG9iaiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG1hdGNoIFwiICsgcmUsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBtYXRjaCBcIiArIHJlXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0TWF0Y2gsIFwiYXNzZXJ0TWF0Y2hcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWF0Y2hcIiwgYXNzZXJ0TWF0Y2gpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm1hdGNoZXNcIiwgYXNzZXJ0TWF0Y2gpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInN0cmluZ1wiLCBmdW5jdGlvbihzdHIsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwic3RyaW5nXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB+b2JqLmluZGV4T2Yoc3RyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBcIiArIGluc3BlY3QyKHN0ciksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIFwiICsgaW5zcGVjdDIoc3RyKVxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRLZXlzKGtleXMpIHtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLCBrZXlzVHlwZSA9IHR5cGUoa2V5cyksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgc3RyLCBkZWVwU3RyID0gXCJcIiwgYWN0dWFsLCBvayA9IHRydWUsIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIHZhciBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgXCJ3aGVuIHRlc3Rpbmcga2V5cyBhZ2FpbnN0IGFuIG9iamVjdCBvciBhbiBhcnJheSB5b3UgbXVzdCBnaXZlIGEgc2luZ2xlIEFycmF5fE9iamVjdHxTdHJpbmcgYXJndW1lbnQgb3IgbXVsdGlwbGUgU3RyaW5nIGFyZ3VtZW50c1wiO1xuICBpZiAob2JqVHlwZSA9PT0gXCJNYXBcIiB8fCBvYmpUeXBlID09PSBcIlNldFwiKSB7XG4gICAgZGVlcFN0ciA9IGlzRGVlcCA/IFwiZGVlcGx5IFwiIDogXCJcIjtcbiAgICBhY3R1YWwgPSBbXTtcbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgYWN0dWFsLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5c1R5cGUgIT09IFwiQXJyYXlcIikge1xuICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFjdHVhbCA9IGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG4gICAgc3dpdGNoIChrZXlzVHlwZSkge1xuICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzeW1ib2xcIiA/IHZhbCA6IFN0cmluZyh2YWwpO1xuICAgIH0pO1xuICB9XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArIFwia2V5cyByZXF1aXJlZFwiLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIHZhciBsZW4gPSBrZXlzLmxlbmd0aCwgYW55ID0gZmxhZzIodGhpcywgXCJhbnlcIiksIGFsbCA9IGZsYWcyKHRoaXMsIFwiYWxsXCIpLCBleHBlY3RlZCA9IGtleXMsIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgaWYgKCFhbnkgJiYgIWFsbCkge1xuICAgIGFsbCA9IHRydWU7XG4gIH1cbiAgaWYgKGFueSkge1xuICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBpZiAoYWxsKSB7XG4gICAgb2sgPSBleHBlY3RlZC5ldmVyeShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikpIHtcbiAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA+IDEpIHtcbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gaW5zcGVjdDIoa2V5KTtcbiAgICB9KTtcbiAgICB2YXIgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgYW5kIFwiICsgbGFzdDtcbiAgICB9XG4gICAgaWYgKGFueSkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgb3IgXCIgKyBsYXN0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBpbnNwZWN0MihrZXlzWzBdKTtcbiAgfVxuICBzdHIgPSAobGVuID4gMSA/IFwia2V5cyBcIiA6IFwia2V5IFwiKSArIHN0cjtcbiAgc3RyID0gKGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikgPyBcImNvbnRhaW4gXCIgOiBcImhhdmUgXCIpICsgc3RyO1xuICB0aGlzLmFzc2VydChcbiAgICBvayxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgYWN0dWFsLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEtleXMsIFwiYXNzZXJ0S2V5c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJrZXlzXCIsIGFzc2VydEtleXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImtleVwiLCBhc3NlcnRLZXlzKTtcbmZ1bmN0aW9uIGFzc2VydFRocm93cyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpIHx8IGZhbHNlO1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICBpZiAoaXNSZWdFeHAyKGVycm9yTGlrZSkgfHwgdHlwZW9mIGVycm9yTGlrZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGVyck1zZ01hdGNoZXIgPSBlcnJvckxpa2U7XG4gICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgfVxuICBsZXQgY2F1Z2h0RXJyO1xuICBsZXQgZXJyb3JXYXNUaHJvd24gPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBvYmooKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3JXYXNUaHJvd24gPSB0cnVlO1xuICAgIGNhdWdodEVyciA9IGVycjtcbiAgfVxuICB2YXIgZXZlcnlBcmdJc1VuZGVmaW5lZCA9IGVycm9yTGlrZSA9PT0gdm9pZCAwICYmIGVyck1zZ01hdGNoZXIgPT09IHZvaWQgMDtcbiAgdmFyIGV2ZXJ5QXJnSXNEZWZpbmVkID0gQm9vbGVhbihlcnJvckxpa2UgJiYgZXJyTXNnTWF0Y2hlcik7XG4gIHZhciBlcnJvckxpa2VGYWlsID0gZmFsc2U7XG4gIHZhciBlcnJNc2dNYXRjaGVyRmFpbCA9IGZhbHNlO1xuICBpZiAoZXZlcnlBcmdJc1VuZGVmaW5lZCB8fCAhZXZlcnlBcmdJc1VuZGVmaW5lZCAmJiAhbmVnYXRlKSB7XG4gICAgdmFyIGVycm9yTGlrZVN0cmluZyA9IFwiYW4gZXJyb3JcIjtcbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGVycm9yTGlrZVN0cmluZyA9IFwiI3tleHB9XCI7XG4gICAgfSBlbHNlIGlmIChlcnJvckxpa2UpIHtcbiAgICAgIGVycm9yTGlrZVN0cmluZyA9IGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSk7XG4gICAgfVxuICAgIGxldCBhY3R1YWwgPSBjYXVnaHRFcnI7XG4gICAgaWYgKGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3R1YWwgPSBjYXVnaHRFcnIudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYXVnaHRFcnIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGFjdHVhbCA9IGNhdWdodEVycjtcbiAgICB9IGVsc2UgaWYgKGNhdWdodEVyciAmJiAodHlwZW9mIGNhdWdodEVyciA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2F1Z2h0RXJyID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY3R1YWwgPSBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGVycm9yV2FzVGhyb3duLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IFwiICsgZXJyb3JMaWtlU3RyaW5nLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyBhbiBlcnJvciBidXQgI3thY3R9IHdhcyB0aHJvd25cIixcbiAgICAgIGVycm9yTGlrZSAmJiBlcnJvckxpa2UudG9TdHJpbmcoKSxcbiAgICAgIGFjdHVhbFxuICAgICk7XG4gIH1cbiAgaWYgKGVycm9yTGlrZSAmJiBjYXVnaHRFcnIpIHtcbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHZhciBpc0NvbXBhdGlibGVJbnN0YW5jZSA9IGNoZWNrX2Vycm9yX2V4cG9ydHMuY29tcGF0aWJsZUluc3RhbmNlKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcbiAgICAgIGlmIChpc0NvbXBhdGlibGVJbnN0YW5jZSA9PT0gbmVnYXRlKSB7XG4gICAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIG5lZ2F0ZSxcbiAgICAgICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciAmJiAhbmVnYXRlID8gXCIgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIgOiBcIlwiKSxcbiAgICAgICAgICAgIGVycm9yTGlrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgY2F1Z2h0RXJyLnRvU3RyaW5nKClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBpc0NvbXBhdGlibGVDb25zdHJ1Y3RvciA9IGNoZWNrX2Vycm9yX2V4cG9ydHMuY29tcGF0aWJsZUNvbnN0cnVjdG9yKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcbiAgICBpZiAoaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPT09IG5lZ2F0ZSkge1xuICAgICAgaWYgKGV2ZXJ5QXJnSXNEZWZpbmVkICYmIG5lZ2F0ZSkge1xuICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG5lZ2F0ZSxcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgI3tleHB9XCIgKyAoY2F1Z2h0RXJyID8gXCIgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIgOiBcIlwiKSxcbiAgICAgICAgICBlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yTGlrZS50b1N0cmluZygpIDogZXJyb3JMaWtlICYmIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSksXG4gICAgICAgICAgY2F1Z2h0RXJyIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnIudG9TdHJpbmcoKSA6IGNhdWdodEVyciAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjYXVnaHRFcnIgJiYgZXJyTXNnTWF0Y2hlciAhPT0gdm9pZCAwICYmIGVyck1zZ01hdGNoZXIgIT09IG51bGwpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXIgPSBcImluY2x1ZGluZ1wiO1xuICAgIGlmIChpc1JlZ0V4cDIoZXJyTXNnTWF0Y2hlcikpIHtcbiAgICAgIHBsYWNlaG9sZGVyID0gXCJtYXRjaGluZ1wiO1xuICAgIH1cbiAgICB2YXIgaXNDb21wYXRpYmxlTWVzc2FnZSA9IGNoZWNrX2Vycm9yX2V4cG9ydHMuY29tcGF0aWJsZU1lc3NhZ2UoY2F1Z2h0RXJyLCBlcnJNc2dNYXRjaGVyKTtcbiAgICBpZiAoaXNDb21wYXRpYmxlTWVzc2FnZSA9PT0gbmVnYXRlKSB7XG4gICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgIGVyck1zZ01hdGNoZXJGYWlsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG5lZ2F0ZSxcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3IgXCIgKyBwbGFjZWhvbGRlciArIFwiICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyBlcnJvciBub3QgXCIgKyBwbGFjZWhvbGRlciArIFwiICN7ZXhwfVwiLFxuICAgICAgICAgIGVyck1zZ01hdGNoZXIsXG4gICAgICAgICAgY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRNZXNzYWdlKGNhdWdodEVycilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGVycm9yTGlrZUZhaWwgJiYgZXJyTXNnTWF0Y2hlckZhaWwpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG5lZ2F0ZSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICBlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yTGlrZS50b1N0cmluZygpIDogZXJyb3JMaWtlICYmIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSksXG4gICAgICBjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVyci50b1N0cmluZygpIDogY2F1Z2h0RXJyICYmIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0Q29uc3RydWN0b3JOYW1lKGNhdWdodEVycilcbiAgICApO1xuICB9XG4gIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIsIGNhdWdodEVycik7XG59XG5fX25hbWUoYXNzZXJ0VGhyb3dzLCBcImFzc2VydFRocm93c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ0aHJvd1wiLCBhc3NlcnRUaHJvd3MpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInRocm93c1wiLCBhc3NlcnRUaHJvd3MpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIlRocm93XCIsIGFzc2VydFRocm93cyk7XG5mdW5jdGlvbiByZXNwb25kVG8obWV0aG9kLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBpdHNlbGYgPSBmbGFnMih0aGlzLCBcIml0c2VsZlwiKSwgY29udGV4dCA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG9iaiAmJiAhaXRzZWxmID8gb2JqLnByb3RvdHlwZVttZXRob2RdIDogb2JqW21ldGhvZF07XG4gIHRoaXMuYXNzZXJ0KFxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRleHQsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHJlc3BvbmQgdG8gXCIgKyBpbnNwZWN0MihtZXRob2QpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgcmVzcG9uZCB0byBcIiArIGluc3BlY3QyKG1ldGhvZClcbiAgKTtcbn1cbl9fbmFtZShyZXNwb25kVG8sIFwicmVzcG9uZFRvXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInJlc3BvbmRUb1wiLCByZXNwb25kVG8pO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInJlc3BvbmRzVG9cIiwgcmVzcG9uZFRvKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIml0c2VsZlwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJpdHNlbGZcIiwgdHJ1ZSk7XG59KTtcbmZ1bmN0aW9uIHNhdGlzZnkobWF0Y2hlciwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdmFyIHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgcmVzdWx0LFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5IFwiICsgb2JqRGlzcGxheShtYXRjaGVyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnlcIiArIG9iakRpc3BsYXkobWF0Y2hlciksXG4gICAgZmxhZzIodGhpcywgXCJuZWdhdGVcIikgPyBmYWxzZSA6IHRydWUsXG4gICAgcmVzdWx0XG4gICk7XG59XG5fX25hbWUoc2F0aXNmeSwgXCJzYXRpc2Z5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInNhdGlzZnlcIiwgc2F0aXNmeSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic2F0aXNmaWVzXCIsIHNhdGlzZnkpO1xuZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5udW1lcmljO1xuICBsZXQgbWVzc2FnZSA9IFwiQSBgZGVsdGFgIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBgY2xvc2VUb2BcIjtcbiAgaWYgKGRlbHRhID09IHZvaWQgMClcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyA/IGAke2ZsYWdNc2d9OiAke21lc3NhZ2V9YCA6IG1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIG5ldyBBc3NlcnRpb24oZGVsdGEsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIG1lc3NhZ2UgPSBcIkEgYGV4cGVjdGVkYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChleHBlY3RlZCA9PSB2b2lkIDApXG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGZsYWdNc2cgPyBgJHtmbGFnTXNnfTogJHttZXNzYWdlfWAgOiBtZXNzYWdlLCB2b2lkIDAsIHNzZmkpO1xuICBuZXcgQXNzZXJ0aW9uKGV4cGVjdGVkLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5udW1lcmljO1xuICBjb25zdCBhYnMgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh4KSA9PiB4IDwgMG4gPyAteCA6IHgsIFwiYWJzXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBhYnMob2JqIC0gZXhwZWN0ZWQpIDw9IGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGEsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShjbG9zZVRvLCBcImNsb3NlVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2xvc2VUb1wiLCBjbG9zZVRvKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhcHByb3hpbWF0ZWx5XCIsIGNsb3NlVG8pO1xuZnVuY3Rpb24gaXNTdWJzZXRPZihfc3Vic2V0LCBfc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgbGV0IHN1cGVyc2V0ID0gQXJyYXkuZnJvbShfc3VwZXJzZXQpO1xuICBsZXQgc3Vic2V0ID0gQXJyYXkuZnJvbShfc3Vic2V0KTtcbiAgaWYgKCFjb250YWlucykge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgc3VwZXJzZXQgPSBzdXBlcnNldC5zbGljZSgpO1xuICB9XG4gIHJldHVybiBzdWJzZXQuZXZlcnkoZnVuY3Rpb24oZWxlbSwgaWR4KSB7XG4gICAgaWYgKG9yZGVyZWQpXG4gICAgICByZXR1cm4gY21wID8gY21wKGVsZW0sIHN1cGVyc2V0W2lkeF0pIDogZWxlbSA9PT0gc3VwZXJzZXRbaWR4XTtcbiAgICBpZiAoIWNtcCkge1xuICAgICAgdmFyIG1hdGNoSWR4ID0gc3VwZXJzZXQuaW5kZXhPZihlbGVtKTtcbiAgICAgIGlmIChtYXRjaElkeCA9PT0gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghY29udGFpbnMpXG4gICAgICAgIHN1cGVyc2V0LnNwbGljZShtYXRjaElkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyc2V0LnNvbWUoZnVuY3Rpb24oZWxlbTIsIG1hdGNoSWR4Mikge1xuICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKVxuICAgICAgICBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgyLCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcbn1cbl9fbmFtZShpc1N1YnNldE9mLCBcImlzU3Vic2V0T2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWVtYmVyc1wiLCBmdW5jdGlvbihzdWJzZXQsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5pdGVyYWJsZTtcbiAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLml0ZXJhYmxlO1xuICB2YXIgY29udGFpbnMgPSBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIpO1xuICB2YXIgb3JkZXJlZCA9IGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiKTtcbiAgdmFyIHN1YmplY3QsIGZhaWxNc2csIGZhaWxOZWdhdGVNc2c7XG4gIGlmIChjb250YWlucykge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJhbiBvcmRlcmVkIHN1cGVyc2V0XCIgOiBcImEgc3VwZXJzZXRcIjtcbiAgICBmYWlsTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICAgIGZhaWxOZWdhdGVNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICB9IGVsc2Uge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJvcmRlcmVkIG1lbWJlcnNcIiA6IFwibWVtYmVyc1wiO1xuICAgIGZhaWxNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSB0aGUgc2FtZSBcIiArIHN1YmplY3QgKyBcIiBhcyAje2V4cH1cIjtcbiAgICBmYWlsTmVnYXRlTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIHRoZSBzYW1lIFwiICsgc3ViamVjdCArIFwiIGFzICN7ZXhwfVwiO1xuICB9XG4gIHZhciBjbXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIikgPyBmbGFnMih0aGlzLCBcImVxbFwiKSA6IHZvaWQgMDtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNTdWJzZXRPZihzdWJzZXQsIG9iaiwgY21wLCBjb250YWlucywgb3JkZXJlZCksXG4gICAgZmFpbE1zZyxcbiAgICBmYWlsTmVnYXRlTXNnLFxuICAgIHN1YnNldCxcbiAgICBvYmosXG4gICAgdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJpdGVyYWJsZVwiLCBmdW5jdGlvbihtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBvYmogIT0gdm9pZCAwICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpdGVyYWJsZVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYW4gaXRlcmFibGVcIixcbiAgICBvYmpcbiAgKTtcbn0pO1xuZnVuY3Rpb24gb25lT2YobGlzdCwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBleHBlY3RlZCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBjb250YWlucyA9IGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgZXFsID0gZmxhZzIodGhpcywgXCJlcWxcIik7XG4gIG5ldyBBc3NlcnRpb24obGlzdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uYmUuYW4oXCJhcnJheVwiKTtcbiAgaWYgKGNvbnRhaW5zKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBsaXN0LnNvbWUoZnVuY3Rpb24ocG9zc2liaWxpdHkpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkLmluZGV4T2YocG9zc2liaWxpdHkpID4gLTE7XG4gICAgICB9KSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBjb250YWluIG9uZSBvZiAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgY29udGFpbiBvbmUgb2YgI3tleHB9XCIsXG4gICAgICBsaXN0LFxuICAgICAgZXhwZWN0ZWRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmIChpc0RlZXApIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBsaXN0LnNvbWUoZnVuY3Rpb24ocG9zc2liaWxpdHkpIHtcbiAgICAgICAgICByZXR1cm4gZXFsKGV4cGVjdGVkLCBwb3NzaWJpbGl0eSk7XG4gICAgICAgIH0pLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGRlZXBseSBlcXVhbCBvbmUgb2YgI3tleHB9XCIsXG4gICAgICAgIGxpc3QsXG4gICAgICAgIGV4cGVjdGVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbGlzdC5pbmRleE9mKGV4cGVjdGVkKSA+IC0xLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgbGlzdCxcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5fX25hbWUob25lT2YsIFwib25lT2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwib25lT2ZcIiwgb25lT2YpO1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgdmFyIGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIGZuKCk7XG4gIHZhciBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgdmFyIG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImNoYW5nZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgZmluYWwgIT09IGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBpbml0aWFsICE9PSBmaW5hbCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gY2hhbmdlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBjaGFuZ2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydENoYW5nZXMsIFwiYXNzZXJ0Q2hhbmdlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjaGFuZ2VcIiwgYXNzZXJ0Q2hhbmdlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2hhbmdlc1wiLCBhc3NlcnRDaGFuZ2VzKTtcbmZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZylcbiAgICBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgdmFyIGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgdmFyIGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oaW5pdGlhbCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcIm51bWJlclwiKTtcbiAgZm4oKTtcbiAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdm9pZCAwIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICB2YXIgbXNnT2JqID0gcHJvcCA9PT0gdm9pZCAwIHx8IHByb3AgPT09IG51bGwgPyBpbml0aWFsIDogXCIuXCIgKyBwcm9wO1xuICBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIsIG1zZ09iaik7XG4gIGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIiwgaW5pdGlhbCk7XG4gIGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIsIGZpbmFsKTtcbiAgZmxhZzIodGhpcywgXCJkZWx0YUJlaGF2aW9yXCIsIFwiaW5jcmVhc2VcIik7XG4gIGZsYWcyKHRoaXMsIFwicmVhbERlbHRhXCIsIGZpbmFsIC0gaW5pdGlhbCk7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZpbmFsIC0gaW5pdGlhbCA+IDAsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIGluY3JlYXNlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBpbmNyZWFzZVwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0SW5jcmVhc2VzLCBcImFzc2VydEluY3JlYXNlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbmNyZWFzZVwiLCBhc3NlcnRJbmNyZWFzZXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImluY3JlYXNlc1wiLCBhc3NlcnRJbmNyZWFzZXMpO1xuZnVuY3Rpb24gYXNzZXJ0RGVjcmVhc2VzKHN1YmplY3QsIHByb3AsIG1zZykge1xuICBpZiAobXNnKVxuICAgIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB2YXIgZm4gPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKTtcbiAgbmV3IEFzc2VydGlvbihmbiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICB2YXIgaW5pdGlhbDtcbiAgaWYgKCFwcm9wKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gICAgaW5pdGlhbCA9IHN1YmplY3QoKTtcbiAgfSBlbHNlIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gICAgaW5pdGlhbCA9IHN1YmplY3RbcHJvcF07XG4gIH1cbiAgbmV3IEFzc2VydGlvbihpbml0aWFsLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwibnVtYmVyXCIpO1xuICBmbigpO1xuICB2YXIgZmluYWwgPSBwcm9wID09PSB2b2lkIDAgfHwgcHJvcCA9PT0gbnVsbCA/IHN1YmplY3QoKSA6IHN1YmplY3RbcHJvcF07XG4gIHZhciBtc2dPYmogPSBwcm9wID09PSB2b2lkIDAgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiBcIi5cIiArIHByb3A7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFNc2dPYmpcIiwgbXNnT2JqKTtcbiAgZmxhZzIodGhpcywgXCJpbml0aWFsRGVsdGFWYWx1ZVwiLCBpbml0aWFsKTtcbiAgZmxhZzIodGhpcywgXCJmaW5hbERlbHRhVmFsdWVcIiwgZmluYWwpO1xuICBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIiwgXCJkZWNyZWFzZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgaW5pdGlhbCAtIGZpbmFsKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgZmluYWwgLSBpbml0aWFsIDwgMCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gZGVjcmVhc2VcIixcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gbm90IGRlY3JlYXNlXCJcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWNyZWFzZXMsIFwiYXNzZXJ0RGVjcmVhc2VzXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImRlY3JlYXNlXCIsIGFzc2VydERlY3JlYXNlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZGVjcmVhc2VzXCIsIGFzc2VydERlY3JlYXNlcyk7XG5mdW5jdGlvbiBhc3NlcnREZWx0YShkZWx0YSwgbXNnKSB7XG4gIGlmIChtc2cpXG4gICAgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIHZhciBtc2dPYmogPSBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIpO1xuICB2YXIgaW5pdGlhbCA9IGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIik7XG4gIHZhciBmaW5hbCA9IGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIpO1xuICB2YXIgYmVoYXZpb3IgPSBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIik7XG4gIHZhciByZWFsRGVsdGEgPSBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiKTtcbiAgdmFyIGV4cHJlc3Npb247XG4gIGlmIChiZWhhdmlvciA9PT0gXCJjaGFuZ2VcIikge1xuICAgIGV4cHJlc3Npb24gPSBNYXRoLmFicyhmaW5hbCAtIGluaXRpYWwpID09PSBNYXRoLmFicyhkZWx0YSk7XG4gIH0gZWxzZSB7XG4gICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGV4cHJlc3Npb24sXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIFwiICsgYmVoYXZpb3IgKyBcIiBieSBcIiArIGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgXCIgKyBiZWhhdmlvciArIFwiIGJ5IFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWx0YSwgXCJhc3NlcnREZWx0YVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJieVwiLCBhc3NlcnREZWx0YSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleHRlbnNpYmxlXCIsIGZ1bmN0aW9uKCkge1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHZhciBpc0V4dGVuc2libGUgPSBvYmogPT09IE9iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNFeHRlbnNpYmxlLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBleHRlbnNpYmxlXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwic2VhbGVkXCIsIGZ1bmN0aW9uKCkge1xuICB2YXIgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHZhciBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGlzU2VhbGVkLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBzZWFsZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImZyb3plblwiLCBmdW5jdGlvbigpIHtcbiAgdmFyIG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB2YXIgaXNGcm96ZW4gPSBvYmogPT09IE9iamVjdChvYmopID8gT2JqZWN0LmlzRnJvemVuKG9iaikgOiB0cnVlO1xuICB0aGlzLmFzc2VydChcbiAgICBpc0Zyb3plbixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBmcm96ZW5cIlxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJmaW5pdGVcIiwgZnVuY3Rpb24obXNnKSB7XG4gIHZhciBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHlwZW9mIG9iaiA9PT0gXCJudW1iZXJcIiAmJiBpc0Zpbml0ZShvYmopLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhIGZpbml0ZSBudW1iZXJcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGEgZmluaXRlIG51bWJlclwiXG4gICk7XG59KTtcblxuLy8gbGliL2NoYWkvaW50ZXJmYWNlL2V4cGVjdC5qc1xuZnVuY3Rpb24gZXhwZWN0KHZhbCwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IEFzc2VydGlvbih2YWwsIG1lc3NhZ2UpO1xufVxuX19uYW1lKGV4cGVjdCwgXCJleHBlY3RcIik7XG5leHBlY3QuZmFpbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgYWN0dWFsID0gdm9pZCAwO1xuICB9XG4gIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwiZXhwZWN0LmZhaWwoKVwiO1xuICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgIGFjdHVhbCxcbiAgICBleHBlY3RlZCxcbiAgICBvcGVyYXRvclxuICB9LCBleHBlY3QuZmFpbCk7XG59O1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2Uvc2hvdWxkLmpzXG52YXIgc2hvdWxkX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNob3VsZF9leHBvcnRzLCB7XG4gIFNob3VsZDogKCkgPT4gU2hvdWxkLFxuICBzaG91bGQ6ICgpID0+IHNob3VsZFxufSk7XG5mdW5jdGlvbiBsb2FkU2hvdWxkKCkge1xuICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlciB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbCB8fCB0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcy52YWx1ZU9mKCksIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gIH1cbiAgX19uYW1lKHNob3VsZEdldHRlciwgXCJzaG91bGRHZXR0ZXJcIik7XG4gIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3VsZFwiLCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF9fbmFtZShzaG91bGRTZXR0ZXIsIFwic2hvdWxkU2V0dGVyXCIpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJzaG91bGRcIiwge1xuICAgIHNldDogc2hvdWxkU2V0dGVyLFxuICAgIGdldDogc2hvdWxkR2V0dGVyLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgdmFyIHNob3VsZDIgPSB7fTtcbiAgc2hvdWxkMi5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICBhY3R1YWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwic2hvdWxkLmZhaWwoKVwiO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICBhY3R1YWwsXG4gICAgICBleHBlY3RlZCxcbiAgICAgIG9wZXJhdG9yXG4gICAgfSwgc2hvdWxkMi5mYWlsKTtcbiAgfTtcbiAgc2hvdWxkMi5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdHVhbCwgbWVzc2FnZSkudG8uZXF1YWwoZXhwZWN0ZWQpO1xuICB9O1xuICBzaG91bGQyLlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8uVGhyb3coZXJydCwgZXJycyk7XG4gIH07XG4gIHNob3VsZDIuZXhpc3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLmV4aXN0O1xuICB9O1xuICBzaG91bGQyLm5vdCA9IHt9O1xuICBzaG91bGQyLm5vdC5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0dWFsLCBtc2cpLnRvLm5vdC5lcXVhbChleHBlY3RlZCk7XG4gIH07XG4gIHNob3VsZDIubm90LlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICB9O1xuICBzaG91bGQyLm5vdC5leGlzdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmV4aXN0O1xuICB9O1xuICBzaG91bGQyW1widGhyb3dcIl0gPSBzaG91bGQyW1wiVGhyb3dcIl07XG4gIHNob3VsZDIubm90W1widGhyb3dcIl0gPSBzaG91bGQyLm5vdFtcIlRocm93XCJdO1xuICByZXR1cm4gc2hvdWxkMjtcbn1cbl9fbmFtZShsb2FkU2hvdWxkLCBcImxvYWRTaG91bGRcIik7XG52YXIgc2hvdWxkID0gbG9hZFNob3VsZDtcbnZhciBTaG91bGQgPSBsb2FkU2hvdWxkO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzXG5mdW5jdGlvbiBhc3NlcnQoZXhwcmVzcywgZXJybXNnKSB7XG4gIHZhciB0ZXN0MiA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgYXNzZXJ0LCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cHJlc3MsXG4gICAgZXJybXNnLFxuICAgIFwiWyBuZWdhdGlvbiBtZXNzYWdlIHVuYXZhaWxhYmxlIF1cIlxuICApO1xufVxuX19uYW1lKGFzc2VydCwgXCJhc3NlcnRcIik7XG5hc3NlcnQuZmFpbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgYWN0dWFsID0gdm9pZCAwO1xuICB9XG4gIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwiYXNzZXJ0LmZhaWwoKVwiO1xuICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgIGFjdHVhbCxcbiAgICBleHBlY3RlZCxcbiAgICBvcGVyYXRvclxuICB9LCBhc3NlcnQuZmFpbCk7XG59O1xuYXNzZXJ0LmlzT2sgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNPaywgdHJ1ZSkuaXMub2s7XG59O1xuYXNzZXJ0LmlzTm90T2sgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RPaywgdHJ1ZSkuaXMubm90Lm9rO1xufTtcbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBtc2cpIHtcbiAgdmFyIHRlc3QyID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmVxdWFsLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cCA9PSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3tleHB9XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBlcXVhbCAje2FjdH1cIixcbiAgICBleHAsXG4gICAgYWN0LFxuICAgIHRydWVcbiAgKTtcbn07XG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIHZhciB0ZXN0MiA9IG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RFcXVhbCwgdHJ1ZSk7XG4gIHRlc3QyLmFzc2VydChcbiAgICBleHAgIT0gZmxhZyh0ZXN0MiwgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3thY3R9XCIsXG4gICAgZXhwLFxuICAgIGFjdCxcbiAgICB0cnVlXG4gICk7XG59O1xuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuc3RyaWN0RXF1YWwsIHRydWUpLnRvLmVxdWFsKGV4cCk7XG59O1xuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQubm90U3RyaWN0RXF1YWwsIHRydWUpLnRvLm5vdC5lcXVhbChleHApO1xufTtcbmFzc2VydC5kZWVwRXF1YWwgPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZGVlcEVxdWFsLCB0cnVlKS50by5lcWwoZXhwKTtcbn07XG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQubm90RGVlcEVxdWFsLCB0cnVlKS50by5ub3QuZXFsKGV4cCk7XG59O1xuYXNzZXJ0LmlzQWJvdmUgPSBmdW5jdGlvbih2YWwsIGFidiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0Fib3ZlLCB0cnVlKS50by5iZS5hYm92ZShhYnYpO1xufTtcbmFzc2VydC5pc0F0TGVhc3QgPSBmdW5jdGlvbih2YWwsIGF0bHN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRMZWFzdCwgdHJ1ZSkudG8uYmUubGVhc3QoYXRsc3QpO1xufTtcbmFzc2VydC5pc0JlbG93ID0gZnVuY3Rpb24odmFsLCBibHcsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCZWxvdywgdHJ1ZSkudG8uYmUuYmVsb3coYmx3KTtcbn07XG5hc3NlcnQuaXNBdE1vc3QgPSBmdW5jdGlvbih2YWwsIGF0bXN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRNb3N0LCB0cnVlKS50by5iZS5tb3N0KGF0bXN0KTtcbn07XG5hc3NlcnQuaXNUcnVlID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzVHJ1ZSwgdHJ1ZSkuaXNbXCJ0cnVlXCJdO1xufTtcbmFzc2VydC5pc05vdFRydWUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RUcnVlLCB0cnVlKS50by5ub3QuZXF1YWwodHJ1ZSk7XG59O1xuYXNzZXJ0LmlzRmFsc2UgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGYWxzZSwgdHJ1ZSkuaXNbXCJmYWxzZVwiXTtcbn07XG5hc3NlcnQuaXNOb3RGYWxzZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEZhbHNlLCB0cnVlKS50by5ub3QuZXF1YWwoZmFsc2UpO1xufTtcbmFzc2VydC5pc051bGwgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdWxsLCB0cnVlKS50by5lcXVhbChudWxsKTtcbn07XG5hc3NlcnQuaXNOb3ROdWxsID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90TnVsbCwgdHJ1ZSkudG8ubm90LmVxdWFsKG51bGwpO1xufTtcbmFzc2VydC5pc05hTiA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05hTiwgdHJ1ZSkudG8uYmUuTmFOO1xufTtcbmFzc2VydC5pc05vdE5hTiA9IGZ1bmN0aW9uKHZhbHVlLCBtZXNzYWdlKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsdWUsIG1lc3NhZ2UsIGFzc2VydC5pc05vdE5hTiwgdHJ1ZSkubm90LnRvLmJlLk5hTjtcbn07XG5hc3NlcnQuZXhpc3RzID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmV4aXN0cywgdHJ1ZSkudG8uZXhpc3Q7XG59O1xuYXNzZXJ0Lm5vdEV4aXN0cyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5ub3RFeGlzdHMsIHRydWUpLnRvLm5vdC5leGlzdDtcbn07XG5hc3NlcnQuaXNVbmRlZmluZWQgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNVbmRlZmluZWQsIHRydWUpLnRvLmVxdWFsKHZvaWQgMCk7XG59O1xuYXNzZXJ0LmlzRGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0RlZmluZWQsIHRydWUpLnRvLm5vdC5lcXVhbCh2b2lkIDApO1xufTtcbmFzc2VydC5pc0NhbGxhYmxlID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzQ2FsbGFibGUsIHRydWUpLmlzLmNhbGxhYmxlO1xufTtcbmFzc2VydC5pc05vdENhbGxhYmxlID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzTm90Q2FsbGFibGUsIHRydWUpLmlzLm5vdC5jYWxsYWJsZTtcbn07XG5hc3NlcnQuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNPYmplY3QsIHRydWUpLnRvLmJlLmEoXCJvYmplY3RcIik7XG59O1xuYXNzZXJ0LmlzTm90T2JqZWN0ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90T2JqZWN0LCB0cnVlKS50by5ub3QuYmUuYShcIm9iamVjdFwiKTtcbn07XG5hc3NlcnQuaXNBcnJheSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0FycmF5LCB0cnVlKS50by5iZS5hbihcImFycmF5XCIpO1xufTtcbmFzc2VydC5pc05vdEFycmF5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90QXJyYXksIHRydWUpLnRvLm5vdC5iZS5hbihcImFycmF5XCIpO1xufTtcbmFzc2VydC5pc1N0cmluZyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1N0cmluZywgdHJ1ZSkudG8uYmUuYShcInN0cmluZ1wiKTtcbn07XG5hc3NlcnQuaXNOb3RTdHJpbmcgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RTdHJpbmcsIHRydWUpLnRvLm5vdC5iZS5hKFwic3RyaW5nXCIpO1xufTtcbmFzc2VydC5pc051bWJlciA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWJlciwgdHJ1ZSkudG8uYmUuYShcIm51bWJlclwiKTtcbn07XG5hc3NlcnQuaXNOb3ROdW1iZXIgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1iZXIsIHRydWUpLnRvLm5vdC5iZS5hKFwibnVtYmVyXCIpO1xufTtcbmFzc2VydC5pc051bWVyaWMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdW1lcmljLCB0cnVlKS5pcy5udW1lcmljO1xufTtcbmFzc2VydC5pc05vdE51bWVyaWMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1lcmljLCB0cnVlKS5pcy5ub3QubnVtZXJpYztcbn07XG5hc3NlcnQuaXNGaW5pdGUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGaW5pdGUsIHRydWUpLnRvLmJlLmZpbml0ZTtcbn07XG5hc3NlcnQuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQm9vbGVhbiwgdHJ1ZSkudG8uYmUuYShcImJvb2xlYW5cIik7XG59O1xuYXNzZXJ0LmlzTm90Qm9vbGVhbiA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEJvb2xlYW4sIHRydWUpLnRvLm5vdC5iZS5hKFwiYm9vbGVhblwiKTtcbn07XG5hc3NlcnQudHlwZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC50eXBlT2YsIHRydWUpLnRvLmJlLmEodHlwZTMpO1xufTtcbmFzc2VydC5ub3RUeXBlT2YgPSBmdW5jdGlvbih2YWx1ZSwgdHlwZTMsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0Lm5vdFR5cGVPZiwgdHJ1ZSkudG8ubm90LmJlLmEodHlwZTMpO1xufTtcbmFzc2VydC5pbnN0YW5jZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pbnN0YW5jZU9mLCB0cnVlKS50by5iZS5pbnN0YW5jZU9mKHR5cGUzKTtcbn07XG5hc3NlcnQubm90SW5zdGFuY2VPZiA9IGZ1bmN0aW9uKHZhbCwgdHlwZTMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90SW5zdGFuY2VPZiwgdHJ1ZSkudG8ubm90LmJlLmluc3RhbmNlT2YodHlwZTMpO1xufTtcbmFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3RJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZSwgdHJ1ZSkubm90LmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwSW5jbHVkZSwgdHJ1ZSkuZGVlcC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcEluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUsIHRydWUpLm5lc3RlZC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QubmVzdGVkLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSkuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubm90T3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5kZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBPd25JbmNsdWRlLCB0cnVlKS5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm1hdGNoID0gZnVuY3Rpb24oZXhwLCByZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5tYXRjaCwgdHJ1ZSkudG8ubWF0Y2gocmUpO1xufTtcbmFzc2VydC5ub3RNYXRjaCA9IGZ1bmN0aW9uKGV4cCwgcmUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90TWF0Y2gsIHRydWUpLnRvLm5vdC5tYXRjaChyZSk7XG59O1xuYXNzZXJ0LnByb3BlcnR5ID0gZnVuY3Rpb24ob2JqLCBwcm9wLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LnByb3BlcnR5LCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5ub3RQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RQcm9wZXJ0eSwgdHJ1ZSkudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCk7XG59O1xuYXNzZXJ0LnByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQucHJvcGVydHlWYWwsIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQubm90UHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RQcm9wZXJ0eVZhbCwgdHJ1ZSkudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQuZGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcFByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQubm90RGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsLCB0cnVlKS50by5ub3QuaGF2ZS5kZWVwLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm93blByb3BlcnR5ID0gZnVuY3Rpb24ob2JqLCBwcm9wLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5LCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubm90T3duUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90T3duUHJvcGVydHksIHRydWUpLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RPd25Qcm9wZXJ0eVZhbCwgdHJ1ZSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbn07XG5hc3NlcnQuZGVlcE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwT3duUHJvcGVydHlWYWwsIHRydWUpLnRvLmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCwgdHJ1ZSkudG8ubm90LmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5uZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5ID0gZnVuY3Rpb24ob2JqLCBwcm9wLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5LCB0cnVlKS50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG59O1xuYXNzZXJ0Lm5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubmVzdGVkUHJvcGVydHlWYWwsIHRydWUpLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90TmVzdGVkUHJvcGVydHlWYWwsIHRydWUpLnRvLm5vdC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5kZWVwTmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkUHJvcGVydHlWYWwsIHRydWUpLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKS50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uKGV4cCwgbGVuLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG59O1xuYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuaGFzQWxsS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5jb250YWluc0FsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxLZXlzLCB0cnVlKS50by5jb250YWluLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzLCB0cnVlKS50by5ub3QuaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYWxsLmtleXMoa2V5cyk7XG59O1xuYXNzZXJ0Lmhhc0FueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FueURlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFueS5kZWVwLmtleXMoa2V5cyk7XG59O1xuYXNzZXJ0Lmhhc0FsbERlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FsbERlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5kZWVwLmtleXMoa2V5cyk7XG59O1xuYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cywgdHJ1ZSkudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMsIHRydWUpLnRvLm5vdC5oYXZlLmFueS5kZWVwLmtleXMoa2V5cyk7XG59O1xuYXNzZXJ0LmRvZXNOb3RIYXZlQWxsRGVlcEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYWxsLmRlZXAua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oZm4sIGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlciwgbXNnKSB7XG4gIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIGVyck1zZ01hdGNoZXIgPSBlcnJvckxpa2U7XG4gICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgfVxuICB2YXIgYXNzZXJ0RXJyID0gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQudGhyb3dzLCB0cnVlKS50by50aHJvdyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIpO1xuICByZXR1cm4gZmxhZyhhc3NlcnRFcnIsIFwib2JqZWN0XCIpO1xufTtcbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtZXNzYWdlKSB7XG4gIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIGVyck1zZ01hdGNoZXIgPSBlcnJvckxpa2U7XG4gICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtZXNzYWdlLCBhc3NlcnQuZG9lc05vdFRocm93LCB0cnVlKS50by5ub3QudGhyb3coZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyKTtcbn07XG5hc3NlcnQub3BlcmF0b3IgPSBmdW5jdGlvbih2YWwsIG9wZXJhdG9yLCB2YWwyLCBtc2cpIHtcbiAgdmFyIG9rO1xuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSBcIj09XCI6XG4gICAgICBvayA9IHZhbCA9PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIj09PVwiOlxuICAgICAgb2sgPSB2YWwgPT09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPlwiOlxuICAgICAgb2sgPSB2YWwgPiB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIj49XCI6XG4gICAgICBvayA9IHZhbCA+PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIjxcIjpcbiAgICAgIG9rID0gdmFsIDwgdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCI8PVwiOlxuICAgICAgb2sgPSB2YWwgPD0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIhPVwiOlxuICAgICAgb2sgPSB2YWwgIT0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCIhPT1cIjpcbiAgICAgIG9rID0gdmFsICE9PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG1zZyA9IG1zZyA/IG1zZyArIFwiOiBcIiA6IG1zZztcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgbXNnICsgJ0ludmFsaWQgb3BlcmF0b3IgXCInICsgb3BlcmF0b3IgKyAnXCInLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIGFzc2VydC5vcGVyYXRvclxuICAgICAgKTtcbiAgfVxuICB2YXIgdGVzdDIgPSBuZXcgQXNzZXJ0aW9uKG9rLCBtc2csIGFzc2VydC5vcGVyYXRvciwgdHJ1ZSk7XG4gIHRlc3QyLmFzc2VydChcbiAgICB0cnVlID09PSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkIFwiICsgaW5zcGVjdDIodmFsKSArIFwiIHRvIGJlIFwiICsgb3BlcmF0b3IgKyBcIiBcIiArIGluc3BlY3QyKHZhbDIpLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBpbnNwZWN0Mih2YWwpICsgXCIgdG8gbm90IGJlIFwiICsgb3BlcmF0b3IgKyBcIiBcIiArIGluc3BlY3QyKHZhbDIpXG4gICk7XG59O1xuYXNzZXJ0LmNsb3NlVG8gPSBmdW5jdGlvbihhY3QsIGV4cCwgZGVsdGEsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuY2xvc2VUbywgdHJ1ZSkudG8uYmUuY2xvc2VUbyhleHAsIGRlbHRhKTtcbn07XG5hc3NlcnQuYXBwcm94aW1hdGVseSA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5hcHByb3hpbWF0ZWx5LCB0cnVlKS50by5iZS5hcHByb3hpbWF0ZWx5KGV4cCwgZGVsdGEpO1xufTtcbmFzc2VydC5zYW1lTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVNZW1iZXJzLCB0cnVlKS50by5oYXZlLnNhbWUubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihzZXQxLCBtc2csIGFzc2VydC5ub3RTYW1lTWVtYmVycywgdHJ1ZSkudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5zYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihzZXQxLCBtc2csIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5kZWVwLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycywgdHJ1ZSkudG8ubm90LmhhdmUuc2FtZS5kZWVwLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycywgdHJ1ZSkudG8uaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzLCB0cnVlKS50by5ub3QuaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKS50by5pbmNsdWRlLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZU1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMsIHRydWUpLnRvLm5vdC5pbmNsdWRlLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSkudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSkudG8ubm90LmluY2x1ZGUuZGVlcC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpLnRvLmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpLnRvLm5vdC5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpLnRvLmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLCB0cnVlKS50by5ub3QuaW5jbHVkZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5vbmVPZiA9IGZ1bmN0aW9uKGluTGlzdCwgbGlzdCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oaW5MaXN0LCBtc2csIGFzc2VydC5vbmVPZiwgdHJ1ZSkudG8uYmUub25lT2YobGlzdCk7XG59O1xuYXNzZXJ0LmlzSXRlcmFibGUgPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBpZiAob2JqID09IHZvaWQgMCB8fCAhb2JqW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgICBtc2cgPSBtc2cgPyBgJHttc2d9IGV4cGVjdGVkICR7aW5zcGVjdDIob2JqKX0gdG8gYmUgYW4gaXRlcmFibGVgIDogYGV4cGVjdGVkICR7aW5zcGVjdDIob2JqKX0gdG8gYmUgYW4gaXRlcmFibGVgO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZyxcbiAgICAgIHZvaWQgMCxcbiAgICAgIGFzc2VydC5pc0l0ZXJhYmxlXG4gICAgKTtcbiAgfVxufTtcbmFzc2VydC5jaGFuZ2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlcywgdHJ1ZSkudG8uY2hhbmdlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmNoYW5nZXNCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzQnksIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZG9lc05vdENoYW5nZSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90Q2hhbmdlLCB0cnVlKS50by5ub3QuY2hhbmdlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmNoYW5nZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzQnV0Tm90QnksIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5pbmNyZWFzZXMgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzLCB0cnVlKS50by5pbmNyZWFzZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5pbmNyZWFzZXNCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5pbmNyZWFzZXNCeSwgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90SW5jcmVhc2UsIHRydWUpLnRvLm5vdC5pbmNyZWFzZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSwgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZGVjcmVhc2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlcywgdHJ1ZSkudG8uZGVjcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuZGVjcmVhc2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnksIHRydWUpLnRvLmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kb2VzTm90RGVjcmVhc2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlLCB0cnVlKS50by5ub3QuZGVjcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuZG9lc05vdERlY3JlYXNlQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5LCB0cnVlKS50by5ub3QuZGVjcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5LCB0cnVlKS50by5kZWNyZWFzZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24odmFsKSB7XG4gIGlmICh2YWwpIHtcbiAgICB0aHJvdyB2YWw7XG4gIH1cbn07XG5hc3NlcnQuaXNFeHRlbnNpYmxlID0gZnVuY3Rpb24ob2JqLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzRXh0ZW5zaWJsZSwgdHJ1ZSkudG8uYmUuZXh0ZW5zaWJsZTtcbn07XG5hc3NlcnQuaXNOb3RFeHRlbnNpYmxlID0gZnVuY3Rpb24ob2JqLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSwgdHJ1ZSkudG8ubm90LmJlLmV4dGVuc2libGU7XG59O1xuYXNzZXJ0LmlzU2VhbGVkID0gZnVuY3Rpb24ob2JqLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzU2VhbGVkLCB0cnVlKS50by5iZS5zZWFsZWQ7XG59O1xuYXNzZXJ0LmlzTm90U2VhbGVkID0gZnVuY3Rpb24ob2JqLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90U2VhbGVkLCB0cnVlKS50by5ub3QuYmUuc2VhbGVkO1xufTtcbmFzc2VydC5pc0Zyb3plbiA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0Zyb3plbiwgdHJ1ZSkudG8uYmUuZnJvemVuO1xufTtcbmFzc2VydC5pc05vdEZyb3plbiA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdEZyb3plbiwgdHJ1ZSkudG8ubm90LmJlLmZyb3plbjtcbn07XG5hc3NlcnQuaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0VtcHR5LCB0cnVlKS50by5iZS5lbXB0eTtcbn07XG5hc3NlcnQuaXNOb3RFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEVtcHR5LCB0cnVlKS50by5ub3QuYmUuZW1wdHk7XG59O1xuKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gYWxpYXMobmFtZSwgYXMpIHtcbiAgYXNzZXJ0W2FzXSA9IGFzc2VydFtuYW1lXTtcbiAgcmV0dXJuIGFsaWFzO1xufSwgXCJhbGlhc1wiKSkoXCJpc09rXCIsIFwib2tcIikoXCJpc05vdE9rXCIsIFwibm90T2tcIikoXCJ0aHJvd3NcIiwgXCJ0aHJvd1wiKShcInRocm93c1wiLCBcIlRocm93XCIpKFwiaXNFeHRlbnNpYmxlXCIsIFwiZXh0ZW5zaWJsZVwiKShcImlzTm90RXh0ZW5zaWJsZVwiLCBcIm5vdEV4dGVuc2libGVcIikoXCJpc1NlYWxlZFwiLCBcInNlYWxlZFwiKShcImlzTm90U2VhbGVkXCIsIFwibm90U2VhbGVkXCIpKFwiaXNGcm96ZW5cIiwgXCJmcm96ZW5cIikoXCJpc05vdEZyb3plblwiLCBcIm5vdEZyb3plblwiKShcImlzRW1wdHlcIiwgXCJlbXB0eVwiKShcImlzTm90RW1wdHlcIiwgXCJub3RFbXB0eVwiKShcImlzQ2FsbGFibGVcIiwgXCJpc0Z1bmN0aW9uXCIpKFwiaXNOb3RDYWxsYWJsZVwiLCBcImlzTm90RnVuY3Rpb25cIik7XG5cbi8vIGxpYi9jaGFpLmpzXG52YXIgdXNlZCA9IFtdO1xuZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGNvbnN0IGV4cG9ydHMgPSB7XG4gICAgQXNzZXJ0aW9uRXJyb3IsXG4gICAgdXRpbDogdXRpbHNfZXhwb3J0cyxcbiAgICBjb25maWcsXG4gICAgZXhwZWN0LFxuICAgIGFzc2VydCxcbiAgICBBc3NlcnRpb24sXG4gICAgLi4uc2hvdWxkX2V4cG9ydHNcbiAgfTtcbiAgaWYgKCF+dXNlZC5pbmRleE9mKGZuKSkge1xuICAgIGZuKGV4cG9ydHMsIHV0aWxzX2V4cG9ydHMpO1xuICAgIHVzZWQucHVzaChmbik7XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHM7XG59XG5fX25hbWUodXNlLCBcInVzZVwiKTtcbmV4cG9ydCB7XG4gIEFzc2VydGlvbixcbiAgQXNzZXJ0aW9uRXJyb3IsXG4gIFNob3VsZCxcbiAgYXNzZXJ0LFxuICBjb25maWcsXG4gIGV4cGVjdCxcbiAgc2hvdWxkLFxuICB1c2UsXG4gIHV0aWxzX2V4cG9ydHMgYXMgdXRpbFxufTtcbi8qIVxuICogQ2hhaSAtIGZsYWcgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSB0ZXN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gZXhwZWN0VHlwZXMgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSBnZXRBY3R1YWwgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSBtZXNzYWdlIGNvbXBvc2l0aW9uIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gdHJhbnNmZXJGbGFncyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogY2hhaVxuICogaHR0cDovL2NoYWlqcy5jb21cbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gaXNQcm94eUVuYWJsZWQgaGVscGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogQ2hhaSAtIGFkZFByb3BlcnR5IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gYWRkTGVuZ3RoR3VhcmQgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSBnZXRQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gcHJveGlmeSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogQ2hhaSAtIGFkZE1ldGhvZCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogQ2hhaSAtIG92ZXJ3cml0ZVByb3BlcnR5IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gYWRkQ2hhaW5pbmdNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG4vKiFcbiAqIENoYWkgLSBjb21wYXJlQnlJbnNwZWN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogQ2hhaSAtIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBDaGFpIC0gaXNOYU4gdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNSBTYWt0aGlwcml5YW4gVmFpcmFtYW5pIDx0aGVjaGFyZ2luZ3ZvbGNhbm9AZ21haWwuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qIVxuICogY2hhaVxuICogQ29weXJpZ2h0KGMpIDIwMTEgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbi8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246XG5cbmRlZXAtZXFsL2luZGV4LmpzOlxuICAoKiFcbiAgICogZGVlcC1lcWxcbiAgICogQ29weXJpZ2h0KGMpIDIwMTMgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gICAqIE1JVCBMaWNlbnNlZFxuICAgKilcbiAgKCohXG4gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgTWVtb2l6ZU1hcCBoYXMgcmVjb3JkZWQgYSByZXN1bHQgb2YgdGhlIHR3byBvcGVyYW5kc1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge01lbW9pemVNYXB9IG1lbW9pemVNYXBcbiAgICogQHJldHVybnMge0Jvb2xlYW58bnVsbH0gcmVzdWx0XG4gICopXG4gICgqIVxuICAgKiBTZXQgdGhlIHJlc3VsdCBvZiB0aGUgZXF1YWxpdHkgaW50byB0aGUgTWVtb2l6ZU1hcFxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge01lbW9pemVNYXB9IG1lbW9pemVNYXBcbiAgICogQHBhcmFtIHtCb29sZWFufSByZXN1bHRcbiAgKilcbiAgKCohXG4gICAqIFByaW1hcnkgRXhwb3J0XG4gICAqKVxuICAoKiFcbiAgICogVGhlIG1haW4gbG9naWMgb2YgdGhlIGBkZWVwRXF1YWxgIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChvcHRpb25hbCkgQWRkaXRpb25hbCBvcHRpb25zXG4gICAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmNvbXBhcmF0b3JdIChvcHRpb25hbCkgT3ZlcnJpZGUgZGVmYXVsdCBhbGdvcml0aG0sIGRldGVybWluaW5nIGN1c3RvbSBlcXVhbGl0eS5cbiAgICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMubWVtb2l6ZV0gKG9wdGlvbmFsKSBQcm92aWRlIGEgY3VzdG9tIG1lbW9pemF0aW9uIG9iamVjdCB3aGljaCB3aWxsIGNhY2hlIHRoZSByZXN1bHRzIG9mXG4gICAgICBjb21wbGV4IG9iamVjdHMgZm9yIGEgc3BlZWQgYm9vc3QuIEJ5IHBhc3NpbmcgYGZhbHNlYCB5b3UgY2FuIGRpc2FibGUgbWVtb2l6YXRpb24sIGJ1dCB0aGlzIHdpbGwgY2F1c2UgY2lyY3VsYXJcbiAgICAgIHJlZmVyZW5jZXMgdG8gYmxvdyB0aGUgc3RhY2suXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGVxdWFsIG1hdGNoXG4gICopXG4gICgqIVxuICAgKiBDb21wYXJlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBlcXVhbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHB9IGxlZnRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmlnaHRIYW5kT3BlcmFuZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAgICopXG4gICgqIVxuICAgKiBDb21wYXJlIHR3byBTZXRzL01hcHMgZm9yIGVxdWFsaXR5LiBGYXN0ZXIgdGhhbiBvdGhlciBlcXVhbGl0eSBmdW5jdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U2V0fSBsZWZ0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtTZXR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKilcbiAgKCohXG4gICAqIFNpbXBsZSBlcXVhbGl0eSBmb3IgZmxhdCBpdGVyYWJsZSBvYmplY3RzIHN1Y2ggYXMgQXJyYXlzLCBUeXBlZEFycmF5cyBvciBOb2RlLmpzIGJ1ZmZlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7SXRlcmFibGV9IGxlZnRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge0l0ZXJhYmxlfSByaWdodEhhbmRPcGVyYW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAgICopXG4gICgqIVxuICAgKiBTaW1wbGUgZXF1YWxpdHkgZm9yIGdlbmVyYXRvciBvYmplY3RzIHN1Y2ggYXMgdGhvc2UgcmV0dXJuZWQgYnkgZ2VuZXJhdG9yIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtJdGVyYWJsZX0gbGVmdEhhbmRPcGVyYW5kXG4gICAqIEBwYXJhbSB7SXRlcmFibGV9IHJpZ2h0SGFuZE9wZXJhbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKilcbiAgKCohXG4gICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICAgKilcbiAgKCohXG4gICAqIEdldHMgYWxsIGl0ZXJhdG9yIGVudHJpZXMgZnJvbSB0aGUgZ2l2ZW4gT2JqZWN0LiBJZiB0aGUgT2JqZWN0IGhhcyBubyBAQGl0ZXJhdG9yIGZ1bmN0aW9uLCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LlxuICAgKiBUaGlzIHdpbGwgY29uc3VtZSB0aGUgaXRlcmF0b3IgLSB3aGljaCBjb3VsZCBoYXZlIHNpZGUgZWZmZWN0cyBkZXBlbmRpbmcgb24gdGhlIEBAaXRlcmF0b3IgaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBlbnRyaWVzIGZyb20gdGhlIEBAaXRlcmF0b3IgZnVuY3Rpb25cbiAgICopXG4gICgqIVxuICAgKiBHZXRzIGFsbCBlbnRyaWVzIGZyb20gYSBHZW5lcmF0b3IuIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBnZW5lcmF0b3IgLSB3aGljaCBjb3VsZCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtHZW5lcmF0b3J9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGVudHJpZXMgZnJvbSB0aGUgR2VuZXJhdG9yLlxuICAgKilcbiAgKCohXG4gICAqIEdldHMgYWxsIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUga2V5cyBmcm9tIGEgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBrZXlzIGZyb20gdGhlIHRhcmdldC5cbiAgICopXG4gICgqIVxuICAgKiBEZXRlcm1pbmVzIGlmIHR3byBvYmplY3RzIGhhdmUgbWF0Y2hpbmcgdmFsdWVzLCBnaXZlbiBhIHNldCBvZiBrZXlzLiBEZWZlcnMgdG8gZGVlcEVxdWFsIGZvciB0aGUgZXF1YWxpdHkgY2hlY2sgb2ZcbiAgICogZWFjaCBrZXkuIElmIGFueSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBlcXVhbCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChlYXJseSkuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gICAqIEBwYXJhbSB7QXJyYXl9IGtleXMgQW4gYXJyYXkgb2Yga2V5cyB0byBjb21wYXJlIHRoZSB2YWx1ZXMgb2YgbGVmdEhhbmRPcGVyYW5kIGFuZCByaWdodEhhbmRPcGVyYW5kIGFnYWluc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKilcbiAgKCohXG4gICAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBlcXVhbGl0eSBvZiB0d28gT2JqZWN0cy4gT25jZSBiYXNpYyBzYW1lbmVzcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBpdCB3aWxsIGRlZmVyIHRvIGBkZWVwRXF1YWxgXG4gICAqIGZvciBlYWNoIGVudW1lcmFibGUga2V5IGluIHRoZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICAgKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAgICopXG4gICgqIVxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgcHJpbWl0aXZlLlxuICAgKlxuICAgKiBUaGlzIGludGVudGlvbmFsbHkgcmV0dXJucyB0cnVlIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNhbiBiZSBjb21wYXJlZCBieSByZWZlcmVuY2UsXG4gICAqIGluY2x1ZGluZyBmdW5jdGlvbnMgYW5kIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKilcbiovXG4iLCAiLyoqKioqKioqXG5cbiBDb252ZXJ0IGNoYWktZG9tIDEuOC4xIHRvIGVzIG1vZHVsZSwgd2l0aG91dCBhbnkgb3RoZXIgbW9kaWZpY2F0aW9uLlxuIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL25hdGhhbmJva3RhZS9jaGFpLWRvbS9ibG9iLzg2YzM0MjMvY2hhaS1kb20uanNcbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdGhhbmJva3RhZS9jaGFpLWRvbS9pc3N1ZXMvMzhcblxuIFVzYWdlOlxuIGltcG9ydCB7IGNoYWlEb20gfSBmcm9tICc8cGF0aC10bz4vY2hhaS1kb20nO1xuIGNoYWkudXNlKGNoYWlEb20pO1xuXG4gQ29weXJpZ2h0IChjKSAyMDE1IE5hdGhhbiBCbGFjayBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG5cbiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS4gRm9yIGEgY29weSwgc2VlIDxodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uXG5cbiAqKioqKioqKioqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2hhaURvbShjaGFpLCB1dGlscykge1xuICAgIHZhciBmbGFnID0gdXRpbHMuZmxhZyxcblxuICAgICAgICBlbFRvU3RyaW5nID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIGxldCBkZXNjXG4gICAgICAgICAgICBpZiAoaXNOb2RlTGlzdChlbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwubGVuZ3RoID09PSAwKSByZXR1cm4gJ2VtcHR5IE5vZGVMaXN0J1xuICAgICAgICAgICAgICAgIGRlc2MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbCwgMCwgNSkubWFwKGVsVG9TdHJpbmcpLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwubGVuZ3RoID4gNSA/IGRlc2MgKyAnLi4uICgrJyArIChlbC5sZW5ndGggLSA1KSArICcgbW9yZSknIDogZGVzY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc2MgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChlbC5pZCkge1xuICAgICAgICAgICAgICAgIGRlc2MgKz0gJyMnICsgZWwuaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjICs9ICcuJyArIFN0cmluZyhlbC5jbGFzc05hbWUpLnJlcGxhY2UoL1xccysvZywgJy4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZSAhPT0gJ2NsYXNzJyAmJiBhdHRyLm5hbWUgIT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYyArPSAnWycgKyBhdHRyLm5hbWUgKyAoYXR0ci52YWx1ZSA/ICc9XCInICsgYXR0ci52YWx1ZSArICdcIl0nIDogJ10nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gZGVzY1xuICAgICAgICB9LFxuXG4gICAgICAgIGF0dHJBc3NlcnQgPSBmdW5jdGlvbihuYW1lLCB2YWwpIHtcbiAgICAgICAgICAgIGxldCBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSlcblxuICAgICAgICAgICAgaWYgKCFmbGFnKHRoaXMsICduZWdhdGUnKSB8fCB1bmRlZmluZWQgPT09IHZhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAhIWVsLmF0dHJpYnV0ZXNbbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIGFuIGF0dHJpYnV0ZSAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgYW4gYXR0cmlidXRlICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBuYW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgdmFsID09PSBhY3R1YWxcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIGFuIGF0dHJpYnV0ZSAnICsgdXRpbHMuaW5zcGVjdChuYW1lKSArICcgd2l0aCB0aGUgdmFsdWUgI3tleHB9LCBidXQgdGhlIHZhbHVlIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgYW4gYXR0cmlidXRlICcgKyB1dGlscy5pbnNwZWN0KG5hbWUpICsgJyB3aXRoIHRoZSB2YWx1ZSAje2FjdH0nXG4gICAgICAgICAgICAgICAgICAgICwgdmFsXG4gICAgICAgICAgICAgICAgICAgICwgYWN0dWFsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBhY3R1YWwpXG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNIVE1MRWxlbWVudCA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IDEgLy8gd2luZG93Lk5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNOb2RlTGlzdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBOb2RlTGlzdF0nXG4gICAgICAgIH1cblxuICAgIHV0aWxzLmVsVG9TdHJpbmcgPSBlbFRvU3RyaW5nXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdhdHRyJywgYXR0ckFzc2VydClcbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2F0dHJpYnV0ZScsIGF0dHJBc3NlcnQpXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2NsYXNzJywgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSlcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBjbGFzcyAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGNsYXNzICN7ZXhwfSdcbiAgICAgICAgICAgICwgY2xhc3NOYW1lXG4gICAgICAgIClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdpZCcsIGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgZWwuaWQgPT0gaWRcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBpZCAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGlkICN7ZXhwfSdcbiAgICAgICAgICAgICwgaWRcbiAgICAgICAgKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2h0bWwnLCBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBhY3R1YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKS5pbm5lckhUTUxcblxuICAgICAgICBpZiAoZmxhZyh0aGlzLCAnY29udGFpbnMnKSkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgYWN0dWFsLmluZGV4T2YoaHRtbCkgPj0gMFxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7YWN0fSB0byBjb250YWluIEhUTUwgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7YWN0fSBub3QgdG8gY29udGFpbiBIVE1MICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIGh0bWxcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgYWN0dWFsID09PSBodG1sXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIEhUTUwgI3tleHB9LCBidXQgdGhlIEhUTUwgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIEhUTUwgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgaHRtbFxuICAgICAgICAgICAgICAgICwgYWN0dWFsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCd0cmltbWVkJywgbnVsbCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGZsYWcodGhpcywgJ3RyaW0tdGV4dCcsIHRydWUpXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGV4dCcsIGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBjb250YWlucyA9IGZsYWcodGhpcywgJ2NvbnRhaW5zJyksXG4gICAgICAgICAgICB0cmltID0gZmxhZyh0aGlzLCAndHJpbS10ZXh0JyksIGFjdHVhbCwgcmVzdWx0XG5cbiAgICAgICAgaWYgKGlzTm9kZUxpc3Qob2JqKSkge1xuICAgICAgICAgICAgYWN0dWFsID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG9iaiwgZnVuY3Rpb24oZWwpIHsgcmV0dXJuIHRyaW0gPyBlbC50ZXh0Q29udGVudC50cmltKCkgOiBlbC50ZXh0Q29udGVudCB9KVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250YWlucyA/XG4gICAgICAgICAgICAgICAgICAgIHRleHRbZmxhZyh0aGlzLCAnbmVnYXRlJykgPyAnc29tZScgOiAnZXZlcnknXShmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChvYmosIGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cmltID8gZWwudGV4dENvbnRlbnQudHJpbSgpIDogZWwudGV4dENvbnRlbnQpID09PSB0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIHV0aWxzLmVxbChhY3R1YWwsIHRleHQpXG5cbiAgICAgICAgICAgICAgICBhY3R1YWwgPSBhY3R1YWwuam9pbigpXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuam9pbigpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5qb2luKCcnKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRhaW5zID8gYWN0dWFsLmluZGV4T2YodGV4dCkgPj0gMCA6IGFjdHVhbCA9PT0gdGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0dWFsID0gdHJpbSA/IG9iai50ZXh0Q29udGVudC50cmltKCkgOiBvYmoudGV4dENvbnRlbnRcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRhaW5zID8gYWN0dWFsLmluZGV4T2YodGV4dCkgPj0gMCA6IGFjdHVhbCA9PT0gdGV4dFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9iakRlc2MgPSBlbFRvU3RyaW5nKG9iaiksIHRleHRNc2cgPSB0cmltID8gJ3RyaW1tZWQgdGV4dCcgOiAndGV4dCdcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgb2JqRGVzYyArICcgdG8gY29udGFpbiAje2V4cH0sIGJ1dCB0aGUgJyArIHRleHRNc2cgKyAnIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIG5vdCB0byBjb250YWluICN7ZXhwfSwgYnV0IHRoZSAnICsgdGV4dE1zZyArICcgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsIHRleHRcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIHRvIGhhdmUgJyArIHRleHRNc2cgKyAnICN7ZXhwfSwgYnV0IHRoZSAnICsgdGV4dE1zZyArICcgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgb2JqRGVzYyArICcgbm90IHRvIGhhdmUgJyArIHRleHRNc2cgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIHRleHRcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgndmFsdWUnLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKSwgYWN0dWFsID0gZmxhZyh0aGlzLCAnb2JqZWN0JykudmFsdWVcbiAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKS52YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSB2YWx1ZSAje2V4cH0sIGJ1dCB0aGUgdmFsdWUgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgdmFsdWUgI3tleHB9J1xuICAgICAgICAgICAgLCB2YWx1ZVxuICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSgnZXhpc3QnLCBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgICAgICBpZiAoaXNOb2RlTGlzdChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIG9iai5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkIGFuIGVtcHR5IE5vZGVMaXN0IHRvIGhhdmUgbm9kZXMnXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBleGlzdCcpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlUHJvcGVydHkoJ2VtcHR5JywgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQob2JqKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICBvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGJlIGVtcHR5J1xuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgb2JqLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBiZSBlbXB0eSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoJ2xlbmd0aCcsXG4gICAgICAgIGZ1bmN0aW9uKF9zdXBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIGlmIChpc05vZGVMaXN0KG9iaikgfHwgaXNIVE1MRWxlbWVudChvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxMZW5ndGggPSBvYmouY2hpbGRyZW4gPyBvYmouY2hpbGRyZW4ubGVuZ3RoIDogb2JqLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbExlbmd0aCA9PT0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBoYXZlICN7ZXhwfSBjaGlsZHJlbiBidXQgaXQgaGFkICN7YWN0fSBjaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBoYXZlICN7ZXhwfSBjaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgICwgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAsIGFjdHVhbExlbmd0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uKF9zdXBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApXG5cblxuICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnbWF0Y2gnLCBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgb2JqLm1hdGNoZXMoc2VsZWN0b3IpXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBzZWxlY3RvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICghIW9iai5sZW5ndGggJiYgQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwob2JqLCBmdW5jdGlvbihlbCkgeyByZXR1cm4gZWwubWF0Y2hlcyhzZWxlY3RvcikgfSkpXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBzZWxlY3RvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW4nLFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzdWJpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQob2JqKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN1Yml0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIW9iai5xdWVyeVNlbGVjdG9yKHN1Yml0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gY29udGFpbiAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGNvbnRhaW4gI3tleHB9J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5jb250YWlucyhzdWJpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgY29udGFpbiAnICsgZWxUb1N0cmluZyhzdWJpdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdkZXNjZW5kYW50JywgZnVuY3Rpb24oc3ViaXRlbSkge1xuICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksIGFjdHVhbCA9IHN1Yml0ZW1cblxuICAgICAgICBpZiAodHlwZW9mIHN1Yml0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhY3R1YWwgPSBvYmoucXVlcnlTZWxlY3RvcihzdWJpdGVtKVxuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgISFhY3R1YWxcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBoYXZlIGRlc2NlbmRhbnQgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBoYXZlIGRlc2NlbmRhbnQgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgc3ViaXRlbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgIG9iai5jb250YWlucyhzdWJpdGVtKVxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgY29udGFpbiAnICsgZWxUb1N0cmluZyhzdWJpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYWcodGhpcywgJ29iamVjdCcsIGFjdHVhbClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdkZXNjZW5kYW50cycsIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKSxcbiAgICAgICAgICAgIGFjdHVhbCA9IG9iai5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICEhYWN0dWFsLmxlbmd0aFxuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gaGF2ZSBkZXNjZW5kYW50cyAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgaGF2ZSBkZXNjZW5kYW50cyAje2V4cH0nXG4gICAgICAgICAgICAsIHNlbGVjdG9yKVxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBhY3R1YWwpXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdkaXNwbGF5ZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVsID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksXG4gICAgICAgICAgICBhY3R1YWwgPSBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5IDogZWwuc3R5bGUuZGlzcGxheVxuXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgYWN0dWFsICE9PSAnbm9uZSdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gYmUgZGlzcGxheWVkLCBidXQgaXQgd2FzIG5vdCdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gbm90IGJlIGRpc3BsYXllZCwgYnV0IGl0IHdhcyBhcyAnICsgYWN0dWFsXG4gICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICApXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd2aXNpYmxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLFxuICAgICAgICAgICAgYWN0dWFsID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudmlzaWJpbGl0eSA6IGVsLnN0eWxlLnZpc2liaWxpdHlcblxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIGFjdHVhbCAhPT0gJ2hpZGRlbicgJiYgYWN0dWFsICE9PSAnY29sbGFwc2UnXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGJlIHZpc2libGUsIGJ1dCBpdCB3YXMgJyArIChhY3R1YWwgPT09ICdoaWRkZW4nID8gJ2hpZGRlbicgOiAnY29sbGFwc2VkJylcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gbm90IGJlIHZpc2libGUsIGJ1dCBpdCB3YXMnXG4gICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICApXG4gICAgfSlcbn0iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcblxuZXhwb3J0IGNvbnN0IGlzQnJvd3NlciA9IG5ldyBGdW5jdGlvbihcInRyeSB7cmV0dXJuIHRoaXM9PT13aW5kb3c7fWNhdGNoKGUpeyByZXR1cm4gZmFsc2U7fVwiKTtcbmV4cG9ydCBjb25zdCBpc05vZGUgPSBuZXcgRnVuY3Rpb24oXCJ0cnkge3JldHVybiB0aGlzPT09Z2xvYmFsO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fVwiKTtcblxubGV0IEpTRE9NRXhwb3J0ID0gbnVsbDtcblxuLyoqXG4gKiB0aGlzIGhlbHBlciBmdW5jdGlvbiBjcmVhdGVzIHRoZSBkb20gc3RhY2sgaW4gdGhlIG5vZGUgZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVua25vd24+fFByb21pc2U8dm9pZD59XG4gKi9cbmZ1bmN0aW9uIGluaXRKU0RPTShvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93WydET01QYXJzZXInXSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgY29uc3QgZyA9IGdldEdsb2JhbCgpO1xuXG4gICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwge1xuICAgICAgICBwcmV0ZW5kVG9CZVZpc3VhbDogdHJ1ZSxcbiAgICAgICAgY29udGVudFR5cGU6IFwidGV4dC9odG1sXCIsXG4gICAgICAgIGluY2x1ZGVOb2RlTG9jYXRpb25zOiB0cnVlLFxuICAgICAgICBzdG9yYWdlUXVvdGE6IDEwMDAwMDAwLFxuICAgICAgICBydW5TY3JpcHRzOiBcImRhbmdlcm91c2x5XCIsXG4gICAgICAgIHJlc291cmNlczogXCJ1c2FibGVcIlxuICAgIH0sIG9wdGlvbnMgfHwge30pXG5cbiAgICByZXR1cm4gaW1wb3J0KFwianNkb21cIikudGhlbigoe0pTRE9NfSkgPT4ge1xuICAgICAgICBKU0RPTUV4cG9ydCA9IEpTRE9NO1xuICAgICAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTShgPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz1cImVuXCI+PGhlYWQ+PHRpdGxlPlRlc3Q8L3RpdGxlPjwvaGVhZD48Ym9keT48ZGl2IGlkPVwibW9ja3NcIj48L2Rpdj48L2JvZHk+PC9odG1sPmAsIG9wdGlvbnMpO1xuXG4gICAgICAgIGdbJ3dpbmRvdyddID0gd2luZG93O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnQmxvYicsXG4gICAgICAgICAgICAgICAgICAgICdDU1NTdHlsZVNoZWV0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbUVsZW1lbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbUV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0RPTUV4Y2VwdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdET01JbXBsZW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdEb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdEb2N1bWVudEZyYWdtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0RPTVBhcnNlcicsXG4gICAgICAgICAgICAgICAgICAgICdFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0VsZW1lbnRJbnRlcm5hbHMnLFxuICAgICAgICAgICAgICAgICAgICAnRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnRXZlbnRUYXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAnZ2V0Q29tcHV0ZWRTdHlsZScsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MQnV0dG9uRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MRGl2RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTEZvcm1FbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxJbnB1dEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTFNjcmlwdEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAncmVxdWVzdEFuaW1hdGlvbkZyYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxTZWxlY3RFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxUZW1wbGF0ZUVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTFRleHRBcmVhRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdJbnB1dEV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0tleWJvYXJkRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnTXV0YXRpb25PYnNlcnZlcicsXG4gICAgICAgICAgICAgICAgICAgICduYXZpZ2F0b3InLFxuICAgICAgICAgICAgICAgICAgICAnTm9kZScsXG4gICAgICAgICAgICAgICAgICAgICdOb2RlRmlsdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ05vZGVMaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3NlbGYnLFxuICAgICAgICAgICAgICAgICAgICAnU2hhZG93Um9vdCcsXG4gICAgICAgICAgICAgICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdba2V5XSA9IHdpbmRvd1trZXldICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXR0aW5nIGtleVwiLCBrZXksIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpbXBvcnQoXCJkb20tc3RvcmFnZVwiKS50aGVuKCh7ZGVmYXVsdDogU3RvcmFnZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGcubG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UobnVsbCwge3N0cmljdDogdHJ1ZX0pO1xuICAgICAgICAgICAgICAgICAgICBnLnNlc3Npb25TdG9yYWdlID0gbmV3IFN0b3JhZ2UobnVsbCwge3N0cmljdDogdHJ1ZX0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvd1snbG9jYWxTdG9yYWdlJ10gPSBnLmxvY2FsU3RvcmFnZTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93WydzZXNzaW9uU3RvcmFnZSddID0gZy5zZXNzaW9uU3RvcmFnZTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGcpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgZG9tLXN0b3JhZ2VcIiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuXG4gICAgfSk7XG59XG5cbmV4cG9ydCB7aW5pdEpTRE9NLCBKU0RPTUV4cG9ydH0gXG5cbiIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuXG5cbi8vIGxhbmd1YWdlPWh0bWxcbmxldCBodG1sMSA9IGBcbiAgICA8bW9uc3Rlci1zcGxpdC1wYW5lbCBpZD1cIm15LXNwbGl0LXBhbmVsXCI+XG4gICAgICAgXG4gICAgPC9tb25zdGVyLXNwbGl0LXBhbmVsPlxuYDtcblxubGV0IFNwbGl0U2NyZWVuO1xuXG5kZXNjcmliZSgnU3BsaXRTY3JlZW4nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGltcG9ydChcImVsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsXCIpLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG5cbiAgICAgICAgICAgIGlmICghZ2xvYmFsWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IENyeXB0byA9IG1bJ0NyeXB0byddO1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxbJ2NyeXB0byddID0gbmV3IENyeXB0bygpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCIuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9sYXlvdXQvc3BsaXQtcGFuZWwubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBTcGxpdFNjcmVlbiA9IG1bJ1NwbGl0UGFuZWwnXTtcbiAgICAgICAgICAgIH0pKVxuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKT0+e1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSlcblxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgaGF2ZSBidXR0b25zIGFuZCBTcGxpdFNjcmVlbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwbGl0U2NyZWVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LXNwbGl0LXBhbmVsJylcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KFNwbGl0U2NyZWVuKS5pcy5pbnN0YW5jZW9mKEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSBTcGxpdFNjcmVlbi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRpdi5oYXNDaGlsZE5vZGVzKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMClcblxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LCAwKVxuXG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuXG4vLyBsYW5ndWFnZT1odG1sXG5sZXQgaHRtbDEgPSBgXG4gICAgPG1vbnN0ZXItcGFuZWwgaWQ9XCJteS1wYW5lbFwiPlxuICAgICAgIFxuICAgIDwvbW9uc3Rlci1wYW5lbD5cbmA7XG5cbmxldCBTcGxpdFNjcmVlbjtcblxuZGVzY3JpYmUoJ1NwbGl0U2NyZWVuJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuXG4gICAgICAgICAgICBpZiAoIWdsb2JhbFsnY3J5cHRvJ10pIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG8gPSBtWydDcnlwdG8nXTtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsWydjcnlwdG8nXSA9IG5ldyBDcnlwdG8oKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbGF5b3V0L3BhbmVsLm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgU3BsaXRTY3JlZW4gPSBtWydQYW5lbCddO1xuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIGJ1dHRvbnMgYW5kIFNwbGl0U2NyZWVuJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BsaXRTY3JlZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktcGFuZWwnKVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoU3BsaXRTY3JlZW4pLmlzLmluc3RhbmNlb2YoSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpdiA9IFNwbGl0U2NyZWVuLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZGl2Lmhhc0NoaWxkTm9kZXMoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKVxuXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sIDApXG5cblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7c2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlck1vY2t9IGZyb20gXCIuLi8uLi8uLi91dGlsL2ludGVyc2VjdGlvbi1tb2NrLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5sZXQgbW9ja2ludGVyc2VjdGlvbm9ic2VydmVyO1xuXG5sZXQgaHRtbDEgPSBgXG4gICAgPGRpdiBpZD1cInRlc3QxXCI+XG4gICAgPC9kaXY+XG5gO1xuXG5kZXNjcmliZSgnUmVsb2FkJywgZnVuY3Rpb24gKCkge1xuXG4gICAgLy8ganNkb20tdGVzdGluZy1tb2NrcyBuZWVkIGplc3RcbiAgICBsZXQgUmVsb2FkLCB2aWV3cG9ydCwgbW9ja1ZpZXdwb3J0O1xuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NraW50ZXJzZWN0aW9ub2JzZXJ2ZXIucmVzdG9yZSgpO1xuICAgIH0pXG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBtb2NraW50ZXJzZWN0aW9ub2JzZXJ2ZXIgPSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyTW9jaygpO1xuXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3JlbG9hZC5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIFJlbG9hZCA9IG1bJ1JlbG9hZCddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcgUmVsb2FkJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtb25zdGVyLXJlbG9hZD48L21vbnN0ZXItcmVsb2FkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZSBmcm9tIHRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGl0KCdzaG91bGQgY29udGFpbnMgbW9uc3Rlci1yZWxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDInKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1yZWxvYWQnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdkb2N1bWVudC5jcmVhdGVFbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiByZWxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItcmVsb2FkJykpLmlzLmluc3RhbmNlb2YoUmVsb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbW9ja3M7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgbm8gb3B0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItcmVsb2FkJyk7XG4gICAgICAgICAgICBtb2Nrcy5hcHBlbmRDaGlsZChyZWxvYWQpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1yZWxvYWQnKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0sIDApXG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ2xvYWQgY29udGVudCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbW9ja3MsIGZldGNoUmVmZXJlbmNlLCBpbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgICAgICAgYmVmb3JlRWFjaCgoZG9uZSkgPT4ge1xuICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIC8vIGxhbmd1YWdlPUhUTUxcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGhpcy1jb250ZW50XCI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsWydmZXRjaCddO1xuXG4gICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgb2s6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czoyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdDIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTIoJ2hlbGxvIHdvcmxkIScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGdsb2JhbFsnZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgbG9hZCBjb250ZW50IGZyb20gdXJsJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgcmVsb2FkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1yZWxvYWQnKTtcbiAgICAgICAgICAgIHJlbG9hZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci11cmwnLCAnaHR0cDovL2xvY2FsaG9zdC8nKVxuXG4gICAgICAgICAgICByZWxvYWQuYWRkRXZlbnRMaXN0ZW5lcignbW9uc3Rlci1mZXRjaGVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21vbnN0ZXItcmVsb2FkJyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJ2hlbGxvIHdvcmxkJyk7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbW9ja3MuYXBwZW5kQ2hpbGQocmVsb2FkKTtcbiAgICAgICAgICAgIG1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlci5nZXRJbnN0YW5jZSgpLmVudGVyTm9kZSgpO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlck1vY2soXG4gICAge1xuICAgICAgICByb290ID0gbnVsbCxcbiAgICAgICAgcm9vdE1hcmdpbiA9ICcnLFxuICAgICAgICB0aHJlc2hvbGRzID0gW10sXG4gICAgICAgIGRpc2Nvbm5lY3QgPSAoKSA9PiBudWxsLFxuICAgICAgICBvYnNlcnZlID0gKCkgPT4gbnVsbCxcbiAgICAgICAgdGFrZVJlY29yZHMgPSAoKSA9PiBbXSxcbiAgICAgICAgdW5vYnNlcnZlID0gKCkgPT4gbnVsbCxcbiAgICB9ID0ge30pIHtcblxuICAgIGNvbnN0IHNhdmVkSW1wbGVtZW50YXRpb24gPSB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG5cbiAgICBsZXQgbGFzdE9iamVjdDtcblxuICAgIGNsYXNzIE1vY2tJbnRlcnNlY3Rpb25PYnNlcnZlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICAgICAgdGhpcy5yb290TWFyZ2luID0gcm9vdE1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMudGhyZXNob2xkcyA9IHRocmVzaG9sZHM7XG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QgPSBkaXNjb25uZWN0O1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlID0gb2JzZXJ2ZTtcbiAgICAgICAgICAgIHRoaXMudGFrZVJlY29yZHMgPSB0YWtlUmVjb3JkcztcbiAgICAgICAgICAgIHRoaXMudW5vYnNlcnZlID0gdW5vYnNlcnZlO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAgICAgbGFzdE9iamVjdCA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBlbnRlck5vZGUoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaXNJbnRlcnNlY3Rpbmc6IHRydWVcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXNbJ2NhbGxiYWNrJ10oZW50cmllcywgdGhpcyk7XG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ0ludGVyc2VjdGlvbk9ic2VydmVyJywge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogTW9ja0ludGVyc2VjdGlvbk9ic2VydmVyXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBNb2NrSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcbiAgICB9KTtcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdG9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyID0gc2F2ZWRJbXBsZW1lbnRhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SW5zdGFuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0T2JqZWN0O1xuICAgICAgICB9XG4gICAgfVxufSIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcbmltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNb2NrfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9yZXNpemUtb2JzZXJ2ZXIubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxubGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxubGV0IGh0bWwyID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MlwiPlxuICAgIDxtb25zdGVyLXN0YXRlLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDp2YWx1ZXMuY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLW9wdGlvbnM9J3tcbiAgXCJ1cmxcIjogXCJtb2NrLWRhdGEuanNvblwiLFxuICBcIm1hcHBpbmdcIjoge1xuICAgIFwidmFsdWVQYXRoXCI6IFwiXFwke2ZpcnN0X25hbWV9IFxcJHtsYXN0X25hbWV9XCIsXG4gICAgXCJrZXlQYXRoXCI6IFwiaWRcIlxuICB9LFxuICAgICAgXCJ0eXBlXCI6XCJjaGVja2JveFwiXG5cbn0nPjwvbW9uc3Rlci1zdGF0ZS1idXR0b24+XG4gICAgPC9kaXY+XG5gO1xuXG5sZXQgU3RhdGVCdXR0b247XG5cbmRlc2NyaWJlKCdTdGF0ZUJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICB9KVxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgICAgICBpZighZ2xvYmFsLlJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsLlJlc2l6ZU9ic2VydmVyID0gUmVzaXplT2JzZXJ2ZXJNb2NrO1xuICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9mb3JtL3N0YXRlLWJ1dHRvbi5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIFN0YXRlQnV0dG9uID0gbVsnU3RhdGVCdXR0b24nXTtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbmV3IFN0YXRlQnV0dG9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZSBmcm9tIHRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGl0KCdzaG91bGQgY29udGFpbnMgbW9uc3Rlci1zdGF0ZS1idXR0b24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDInKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1zdGF0ZS1idXR0b24nKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdkb2N1bWVudC5jcmVhdGVFbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBzdGF0ZS1idXR0b24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItc3RhdGUtYnV0dG9uJykpLmlzLmluc3RhbmNlb2YoU3RhdGVCdXR0b24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIG9wdGlvbnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItc3RhdGUtYnV0dG9uJyk7XG4gICAgICAgICAgICBtb2Nrcy5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYnV0dG9uLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbnMpLmlzLmluc3RhbmNlb2YoSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9ucy5oYXNDaGlsZE5vZGVzKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9LCAwKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIlxuXG5cbmV4cG9ydCB7UmVzaXplT2JzZXJ2ZXJNb2NrfVxuXG5cbmNsYXNzIFJlc2l6ZU9ic2VydmVyTW9jayB7XG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgfVxuXG4gICAgb2JzZXJ2ZShlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9XG5cbiAgICB1bm9ic2VydmUoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gdGhpcy5lbGVtZW50cy5maWx0ZXIoKGVsKSA9PiBlbCAhPT0gZWxlbWVudCk7XG4gICAgfVxuXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IFtdO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZXNpemUoZW50cmllcykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGVudHJpZXMsIHRoaXMpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCAqIGFzIGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtSZXNpemVPYnNlcnZlck1vY2t9IGZyb20gXCIuLi8uLi8uLi91dGlsL3Jlc2l6ZS1vYnNlcnZlci5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuXG5sZXQgaHRtbDEgPSBgXG4gICAgPGRpdiBpZD1cInRlc3QxXCI+XG4gICAgPC9kaXY+XG5gO1xuXG5sZXQgaHRtbDIgPSBgXG4gICAgPGRpdiBpZD1cInRlc3QyXCI+XG4gICAgPG1vbnN0ZXItc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnZhbHVlcy5jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItb3B0aW9ucz0ne1xuICBcInVybFwiOiBcIm1vY2stZGF0YS5qc29uXCIsXG4gIFwibWFwcGluZ1wiOiB7XG4gICAgXCJzZWxlY3RvclwiOiBcIipcIixcbiAgICBcInZhbHVlVGVtcGxhdGVcIjogXCJcXCR7Zmlyc3RfbmFtZX0gXFwke2xhc3RfbmFtZX1cIixcbiAgICBcImxhYmVsVGVtcGxhdGVcIjogXCJpZFwiXG4gIH0sXG4gICAgICBcInR5cGVcIjpcImNoZWNrYm94XCJcblxufSc+PC9tb25zdGVyLXNlbGVjdD5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBTZWxlY3QsIGZldGNoUmVmZXJlbmNlO1xuXG5kZXNjcmliZSgnU2VsZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFsnZmV0Y2gnXTtcblxuICAgICAgICAgICAgaWYgKCFnbG9iYWwuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWwuUmVzaXplT2JzZXJ2ZXIgPSBSZXNpemVPYnNlcnZlck1vY2s7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vc2VsZWN0Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgU2VsZWN0ID0gbVsnU2VsZWN0J107XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpXG5cblxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ1dpdGggZmV0Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0MikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIkFsZXhpYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhc3RfbmFtZVwiOiBcIk91Z2h0cmlnaHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbWFpbFwiOiBcImFvdWdodHJpZ2h0MEBleGJsb2cuanBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5kZXJcIjogXCJBZ2VuZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY291bnRyeVwiOiBcIm1uXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIkJldGhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYXN0X25hbWVcIjogXCJCb2RkaW5ndG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1haWxcIjogXCJiYm9kZGluZ3RvbjFAc3RhdGNvdW50ZXIuY29tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZGVyXCI6IFwiTm9uLWJpbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvdW50cnlcIjogXCJzeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIlNoZWxsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhc3RfbmFtZVwiOiBcIkEnQmFycm93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1haWxcIjogXCJzYWJhcnJvdzJAZ29vZ2xlLmNvLnVrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZGVyXCI6IFwiUG9seWdlbmRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvdW50cnlcIjogXCJub1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IF1gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlMihKU09OLnN0cmluZ2lmeShqc29uKSlcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIH07XG5cblxuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZ2xvYmFsWydmZXRjaCddID0gZmV0Y2hSZWZlcmVuY2U7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb250YWlucyBtb25zdGVyLXNlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MicpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLXNlbGVjdCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIHNlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXNlbGVjdCcpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzZWxlY3QpLmlzLmluc3RhbmNlb2YoU2VsZWN0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhdmUgb3B0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXNlbGVjdCcpO1xuICAgICAgICAgICAgICAgIHNlbGVjdC5zZXRPcHRpb24oJ3VybCcsICdodHRwczovL2V4YW1wbGUuY29tJylcbiAgICAgICAgICAgICAgICBzZWxlY3Quc2V0T3B0aW9uKCdtYXBwaW5nLnNlbGVjdG9yJywgJyonKVxuICAgICAgICAgICAgICAgIHNlbGVjdC5zZXRPcHRpb24oJ21hcHBpbmcubGFiZWxUZW1wbGF0ZScsICcke2lkfScpXG4gICAgICAgICAgICAgICAgc2VsZWN0LnNldE9wdGlvbignbWFwcGluZy52YWx1ZVRlbXBsYXRlJywgJyR7aWR9JylcblxuICAgICAgICAgICAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdtb25zdGVyLW9wdGlvbnMtc2V0JywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25dJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbnMubGVuZ3RoKS5pcy5lcXVhbCgzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbkh0bWwgPSBzZWxlY3Quc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uc10nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9uSHRtbCkuY29udGFpbi5odG1sKCdkYXRhLW1vbnN0ZXItaW5zZXJ0LXJlZmVyZW5jZT1cIm9wdGlvbnMtMFwiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbkh0bWwpLmNvbnRhaW4uaHRtbCgnZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJvcHRpb25zLTFcIicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChvcHRpb25IdG1sKS5jb250YWluLmh0bWwoJ2RhdGEtbW9uc3Rlci1pbnNlcnQtcmVmZXJlbmNlPVwib3B0aW9ucy0yXCInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9uSHRtbCkuY29udGFpbi5ub3QuaHRtbCgnZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJvcHRpb25zLTNcIicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIG1vY2tzLmFwcGVuZENoaWxkKHNlbGVjdCk7XG5cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkb2N1bWVudC5jcmVhdGVFbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgbm8gb3B0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1zZWxlY3QnKTtcbiAgICAgICAgICAgIG1vY2tzLmFwcGVuZENoaWxkKHNlbGVjdCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3Quc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb25zdGVyLXJvbGU9b3B0aW9uc10nKTtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9ucykuaXMuaW5zdGFuY2VvZihIVE1MRGl2RWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IG9wdGlvbnMucGFyZW50Tm9kZS5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBvcHRpb25zLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9ucy5oYXNDaGlsZE5vZGVzKCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSwgMClcblxuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7RGF0YVVybH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuXG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcbmltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNb2NrfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9yZXNpemUtb2JzZXJ2ZXIubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxubGV0IGh0bWwxLCBvcHRpb25zLCBodG1sMiwgQ29uZmlybUJ1dHRvbjtcblxuZGVzY3JpYmUoJ0NvbmZpcm1CdXR0b24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpOyAgICBcbiAgICAgICAgXG4gICAgICAgIGlmKCFnbG9iYWwuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5SZXNpemVPYnNlcnZlciA9IFJlc2l6ZU9ic2VydmVyTW9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBuZXcgRGF0YVVybChidG9hKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHBvcHBlcjoge1xuICAgICAgICAgICAgICAgIHBsYWNlbWVudDogXCJ0b3BcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSkpLCAnYXBwbGljYXRpb24vanNvbicsIHRydWUpLnRvU3RyaW5nKClcblxuICAgICAgICBodG1sMiA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICA8bW9uc3Rlci1jb25maXJtLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDp2YWx1ZXMuY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLW9wdGlvbnM9XCJgICsgb3B0aW9ucyArIGBcIj48L21vbnN0ZXItY29uZmlybS1idXR0b24+XG4gICAgPC9kaXY+XG5gO1xuXG4gICAgICAgIGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYFxuXG5cbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vY29uZmlybS1idXR0b24ubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBDb25maXJtQnV0dG9uID0gbVsnQ29uZmlybUJ1dHRvbiddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcgQ29uZmlybUJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW5zIG1vbnN0ZXItY29uZmlybS1idXR0b24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDInKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1jb25maXJtLWJ1dHRvbicpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIGJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jb25maXJtLWJ1dHRvbicpKS5pcy5pbnN0YW5jZW9mKENvbmZpcm1CdXR0b24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIGNoaWxkcycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jb25maXJtLWJ1dHRvbicpO1xuICAgICAgICAgICAgbW9ja3MuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGJ1dHRvbi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ21vbnN0ZXItYnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChjb250ZW50Lmhhc0NoaWxkTm9kZXMoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0sIDApXG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHtQcm9jZXNzaW5nfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3V0aWwvcHJvY2Vzc2luZy5tanNcIjtcblxuaW1wb3J0IHtzdG9yYWdlT2JqZWN0U3ltYm9sfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcbi8vXG4vLyBsZXQgaHRtbDEgPSBgXG4vLyAgICAgPGRpdiBpZD1cInRlc3QxXCI+XG4vLyAgICAgPG1vbnN0ZXItZm9ybSBpZD1cImZvcm0xXCI+PC9tb25zdGVyLWZvcm0+XG4vLyAgICAgPC9kaXY+XG4vLyBgO1xuLy9cbi8vIGxldCBodG1sMiA9IGA8ZGl2IGlkPVwidGVzdDJcIj5cbi8vXG4vLyAgICAgPG1vbnN0ZXItZGF0YXNvdXJjZS1kb20gaWQ9XCJkYXRhc291cmNlWGRyZnJcIj5cbi8vICAgICAgICAgPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiPlxuLy8gICAgICAgICAgICAgW1xuLy8gICAgICAgICAgICAgICAgIHtcbi8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxLFxuLy8gICAgICAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCI6IFwibWFydGluODlcIixcbi8vICAgICAgICAgICAgICAgICAgICAgXCJlbWFpbFwiOiBcImVsZW5hLnJpY2hhcmRzQGRvbWFpbi5jb21cIixcbi8vICAgICAgICAgICAgICAgICAgICAgXCJmdWxsX25hbWVcIjogXCJFbGVuYSBSaWNoYXJkc1wiLFxuLy8gICAgICAgICAgICAgICAgICAgICBcImFnZVwiOiAyOSxcbi8vICAgICAgICAgICAgICAgICAgICAgXCJjb3VudHJ5XCI6IFwiR3JlZWNlXCIsXG4vLyAgICAgICAgICAgICAgICAgICAgIFwicmVnaXN0ZXJlZF9kYXRlXCI6IFwiMjAxOS0xMS0yM1wiLFxuLy8gICAgICAgICAgICAgICAgICAgICBcInN0YXR1c1wiOiBcImFjdGl2ZVwiXG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgXVxuLy8gICAgICAgICA8L3NjcmlwdD5cbi8vICAgICA8L21vbnN0ZXItZGF0YXNvdXJjZS1kb20+XG4vL1xuLy9cbi8vICAgICA8bW9uc3Rlci1mb3JtIGlkPVwiZm9ybTJEcmZhMlwiXG4vLyAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItb3B0aW9uLW1hcHBpbmctZGF0YT1cIlwiXG4vLyAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItb3B0aW9uLWRhdGFzb3VyY2Utc2VsZWN0b3I9XCIjZGF0YXNvdXJjZVhkcmZyXCI+XG4vLyAgICAgICAgIDxkaXY+XG4vLyAgICAgICAgICAgICA8ZGl2PlxuLy8gICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiY29udHJvbDFcIlxuLy8gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbnRyb2wxXCJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOmRhdGEuZnVsbF9uYW1lXCI+XG4vLyAgICAgICAgICAgICA8L2Rpdj5cbi8vICAgICAgICAgPC9kaXY+XG4vLyAgICAgICAgIDxkaXY+XG4vLyAgICAgICAgICAgICA8aW5wdXQgbmFtZT1cImNvbnRyb2wyXCJcbi8vICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6ZGF0YS5zdGF0dXNcIj5cbi8vICAgICAgICAgPC9kaXY+XG4vL1xuLy8gICAgIDwvbW9uc3Rlci1mb3JtPlxuLy8gPC9kaXY+XG4vLyBgO1xuLy9cbi8vIGRlc2NyaWJlKCdGb3JtJywgZnVuY3Rpb24gKCkge1xuLy9cbi8vICAgICBsZXQgZm9ybTtcbi8vICAgICBsZXQgdGVzdE1vY2tcbi8vXG4vLyAgICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4vL1xuLy8gICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuLy9cbi8vICAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoeCkgPT4ge1xuLy8gICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9mb3JtLm1qc1wiKS50aGVuKChtKSA9PiB7XG4vLyAgICAgICAgICAgICAgICAgZm9ybSA9IG1bJ0Zvcm0nXTtcbi8vICAgICAgICAgICAgICAgICBkb25lKClcbi8vICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSlcbi8vICAgICAgICAgfSk7XG4vL1xuLy8gICAgIH0pXG4vL1xuLy8gICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuLy8gICAgICAgICAvLyBhZGQgbW9jayB2b250YWluZXIgdG8gYm9keVxuLy8gICAgICAgICB0ZXN0TW9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuLy8gICAgICAgICB0ZXN0TW9jay5pZCA9ICdtb2Nrc1I1MjMnO1xuLy8gICAgICAgICB0ZXN0TW9jay5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4vLyAgICAgICAgIHRlc3RNb2NrLnN0eWxlLnRvcCA9ICctMTAwMDBweCc7XG4vLyAgICAgICAgIHRlc3RNb2NrLnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuLy8gICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlc3RNb2NrKTtcbi8vICAgICB9KVxuLy9cbi8vICAgICBhZnRlckVhY2goKCkgPT4ge1xuLy8gICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbi8vICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbi8vICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3Rlc3Qta2V5Jylcbi8vICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0TW9jayk7XG4vL1xuLy8gICAgIH0pXG4vL1xuLy8gICAgIGRlc2NyaWJlKCdIVE1MLVRlbXBsYXRlcycsIGZ1bmN0aW9uICgpIHtcbi8vXG4vLyAgICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZSBodG1sMScsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuLy8gICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuLy8gICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuLy8gICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0ZXN0LWtleScsICd7fScpXG4vLyAgICAgICAgICAgICB9KTtcbi8vXG4vLyAgICAgICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW5zIG1vbnN0ZXItZm9ybScsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItZm9ybScpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy9cbi8vICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUgaHRtbDInLCBmdW5jdGlvbiAoKSB7XG4vL1xuLy8gICAgICAgICAgICAgYmVmb3JlRWFjaCgoZG9uZSkgPT4ge1xuLy8gICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0ZXN0LWtleScsIEpTT04uc3RyaW5naWZ5KHtcbi8vICAgICAgICAgICAgICAgICAgICAgYTogdHJ1ZSxcbi8vICAgICAgICAgICAgICAgICAgICAgYjogNyxcbi8vICAgICAgICAgICAgICAgICAgICAgYzogWzEsIDUsIDZdLFxuLy8gICAgICAgICAgICAgICAgICAgICBkOiB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBlOiB0cnVlXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgICB9KSlcbi8vICAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbi8vXG4vLyAgICAgICAgICAgICAgICAgdHJ5IHtcbi8vICAgICAgICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDI7XG4vLyAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbi8vICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy9cbi8vICAgICAgICAgICAgIH0pO1xuLy9cbi8vICAgICAgICAgICAgIGl0KCdzaG91bGQgY29udGFpbnMgbW9uc3Rlci1mb3JtJywgZnVuY3Rpb24gKCkge1xuLy9cbi8vICAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbi8vICAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbi8vXG4vLyAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MicpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLWZvcm0nKTtcbi8vICAgICAgICAgICAgIH0pO1xuLy9cbi8vICAgICAgICAgICAgIGl0KCdzaG91bGQgY2xpY2snLCBmdW5jdGlvbiAoZG9uZSkge1xuLy9cbi8vICAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbi8vICAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbi8vXG4vLyAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MicpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLWZvcm0nKTtcbi8vXG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QyJykuaW5uZXJIVE1MKVxuLy9cbi8vICAgICAgICAgICAgICAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvcm0yRHJmYTInKTtcbi8vXG4vL1xuLy8gICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuLy9cbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtLnNoYWRvd1Jvb3QpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG5ldyBFcnJvcignbm8gc2hhZG93Um9vdCcpKVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vL1xuLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sMSA9IGZvcm0uc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzbG90JykuYXNzaWduZWRFbGVtZW50cygpWzBdLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jylcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250cm9sMSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobmV3IEVycm9yKCdubyBjb250cm9sMScpKVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vL1xuLy8gICAgICAgICAgICAgICAgICAgICBjb250cm9sMS5jbGljaygpO1xuLy9cbi8vXG4vLyAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbi8vICAgICAgICAgICAgICAgICB9LCAyKVxuLy9cbi8vICAgICAgICAgICAgIH0pO1xuLy9cbi8vXG4vLyAgICAgICAgIH0pO1xuLy9cbi8vXG4vLyAgICAgfSlcbi8vXG4vLyB9KVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IHBhcnNlRGF0YVVSTCB9IGZyb20gXCIuLi90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBQcm94eU9ic2VydmVyIH0gZnJvbSBcIi4uL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU9iamVjdCB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IFBhdGhmaW5kZXIgfSBmcm9tIFwiLi9wYXRoZmluZGVyLm1qc1wiO1xuXG5leHBvcnQgeyBEYXRhc291cmNlIH07XG5cbi8qKlxuICogVGhpcyBjYWxsYmFjayBjYW4gYmUgcGFzc2VkIHRvIGEgZGF0YXNvdXJjZSBhbmQgaXMgdXNlZCB0byBhZGFwdCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuRGF0YS5EYXRhc291cmNlfmV4YW1wbGVDYWxsYmFja1xuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAgS2V5XG4gKiBAc2VlIE1vbnN0ZXIuRGF0YS5EYXRhc291cmNlXG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBpbnRlcm5hbERhdGFTeW1ib2wgPSBTeW1ib2wuZm9yKFxuXHRcIkBzY2h1a2FpL21vbnN0ZXIvZGF0YS9kYXRhc291cmNlL0BAZGF0YVwiLFxuKTtcblxuLyoqXG4gKiBUaGUgZGF0YXNvdXJjZSBjbGFzcyBpcyB0aGUgYmFzaXMgZm9yIGRlYWxpbmcgd2l0aCBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLlxuICogSXQgcHJvdmlkZXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGRhdGFcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kYXRhL2RhdGFzb3VyY2UubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIyLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgZGF0YXNvdXJjZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byBkYXRhIG9iamVjdHMuXG4gKi9cbmNsYXNzIERhdGFzb3VyY2UgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqIGNyZWF0ZXMgYSBuZXcgZGF0YXNvdXJjZVxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdID0gbmV3IFByb3h5T2JzZXJ2ZXIoe1xuXHRcdFx0b3B0aW9uczogZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzKSxcblx0XHR9KTtcblxuXHRcdHRoaXNbaW50ZXJuYWxEYXRhU3ltYm9sXSA9IG5ldyBQcm94eU9ic2VydmVyKHt9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBhdHRhY2ggYSBuZXcgb2JzZXJ2ZXJcblx0ICpcblx0ICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcblx0ICogQHJldHVybiB7RGF0YXNvdXJjZX1cblx0ICovXG5cdGF0dGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0dGhpc1tpbnRlcm5hbERhdGFTeW1ib2xdLmF0dGFjaE9ic2VydmVyKG9ic2VydmVyKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBkZXRhY2ggYSBvYnNlcnZlclxuXHQgKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuXHQgKi9cblx0ZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcblx0XHR0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRjb250YWluc09ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxEYXRhU3ltYm9sXS5jb250YWluc09ic2VydmVyKG9ic2VydmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCBleHRlbmQgdGhpcyBtZXRob2QgYXMgZm9sbG93cy5cblx0ICpcblx0ICogYGBgXG5cdCAqIGdldCBkZWZhdWx0cygpIHtcblx0ICogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdCAqICAgICAgICBteVZhbHVlOnRydWVcblx0ICogICAgfSk7XG5cdCAqIH1cblx0ICogYGBgXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBvcHRpb25cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuXHQgKi9cblx0c2V0T3B0aW9uKHBhdGgsIHZhbHVlKSB7XG5cdFx0bmV3IFBhdGhmaW5kZXIodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpW1wib3B0aW9uc1wiXSkuc2V0VmlhKFxuXHRcdFx0cGF0aCxcblx0XHRcdHZhbHVlLFxuXHRcdCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm4ge0RhdGFzb3VyY2V9XG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uXG5cdCAqL1xuXHRzZXRPcHRpb25zKG9wdGlvbnMpIHtcblx0XHRpZiAoaXNTdHJpbmcob3B0aW9ucykpIHtcblx0XHRcdG9wdGlvbnMgPSBwYXJzZU9wdGlvbnNKU09OKG9wdGlvbnMpO1xuXHRcdH1cblx0XHRleHRlbmQoXG5cdFx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbXCJvcHRpb25zXCJdLFxuXHRcdFx0dGhpcy5kZWZhdWx0cyxcblx0XHRcdG9wdGlvbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIG5lc3RlZCBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgcGF0aCBgYS5iLmNgXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG5cdCAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqL1xuXHRnZXRPcHRpb24ocGF0aCwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0bGV0IHZhbHVlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhbHVlID0gbmV3IFBhdGhmaW5kZXIoXG5cdFx0XHRcdHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbXCJvcHRpb25zXCJdLFxuXHRcdFx0KS5nZXRWaWEocGF0aCk7XG5cdFx0fSBjYXRjaCAoZSkge31cblxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHRyZWFkKCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdHdyaXRlKCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgcmVhbCBvYmplY3Rcblx0ICpcblx0ICogQHJldHVybiB7T2JqZWN0fEFycmF5fVxuXHQgKi9cblx0Z2V0KCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YVxuXHQgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuXHQgKi9cblx0c2V0KGRhdGEpIHtcblx0XHR0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uc2V0U3ViamVjdChkYXRhKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvZGF0YS9kYXRhc291cmNlXCIpO1xuXHR9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnNKU09OKGRhdGEpIHtcblx0aWYgKGlzU3RyaW5nKGRhdGEpKSB7XG5cdFx0Ly8gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHNwZWNpZmllZCBhcyBhIGRhdGEgdXJsLlxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkYXRhVXJsID0gcGFyc2VEYXRhVVJMKGRhdGEpO1xuXHRcdFx0ZGF0YSA9IGRhdGFVcmwuY29udGVudDtcblx0XHR9IGNhdGNoIChlKSB7fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHR2YWxpZGF0ZU9iamVjdChvYmopO1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGB0aGUgb3B0aW9ucyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uIChhY3R1YWw6ICR7ZGF0YX0pLmAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7fTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCwgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBEYXRhc291cmNlIH0gZnJvbSBcIi4uL2RhdGFzb3VyY2UubWpzXCI7XG5cbmV4cG9ydCB7IFN0b3JhZ2UsIHN0b3JhZ2VPYmplY3RTeW1ib2wgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgc3RvcmFnZU9iamVjdFN5bWJvbCA9IFN5bWJvbC5mb3IoXG5cdFwiQHNjaHVrYWkvbW9uc3Rlci9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS9AQHN0b3JhZ2VPYmplY3RcIixcbik7XG5cbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgYSByZWNvcmQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgVGhlIFN0b3JhZ2UgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gZGF0YSBvYmplY3RzIG92ZXIgV2ViU3RvcmFnZUFQSS5cbiAqL1xuY2xhc3MgU3RvcmFnZSBleHRlbmRzIERhdGFzb3VyY2Uge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBMb2NhbFN0b3JhZ2UgS2V5XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihrZXkpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuc2V0T3B0aW9uKFwia2V5XCIsIHZhbGlkYXRlU3RyaW5nKGtleSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5PXVuZGVmaW5lZCBMb2NhbFN0b3JhZ2UgS2V5XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHRrZXk6IHVuZGVmaW5lZCxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG5cdCAqIEByZXR1cm4ge2V4dGVybmFsOlN0b3JhZ2V9XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRbc3RvcmFnZU9iamVjdFN5bWJvbF0oKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXNcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBvcHRpb25zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb25cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3Rcblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkXG5cdCAqL1xuXHRyZWFkKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdFx0Y29uc3Qgc3RvcmFnZSA9IHNlbGZbc3RvcmFnZU9iamVjdFN5bWJvbF0oKTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc3RvcmFnZS5nZXRJdGVtKHNlbGYuZ2V0T3B0aW9uKFwia2V5XCIpKSk7XG5cdFx0XHRzZWxmLnNldChkYXRhID8/IHt9KTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW5cblx0ICovXG5cdHdyaXRlKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdFx0Y29uc3Qgc3RvcmFnZSA9IHNlbGZbc3RvcmFnZU9iamVjdFN5bWJvbF0oKTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHNlbGYuZ2V0KCk7XG5cdFx0XHRpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHN0b3JhZ2UucmVtb3ZlSXRlbShzZWxmLmdldE9wdGlvbihcImtleVwiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdG9yYWdlLnNldEl0ZW0oc2VsZi5nZXRPcHRpb24oXCJrZXlcIiksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1N0b3JhZ2V9XG5cdCAqL1xuXHRnZXRDbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFN0b3JhZ2UodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVtcIm9wdGlvbnNcIl0ua2V5KTtcblx0fVxufVxuIiwgImltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCAqIGFzIGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBodG1sMiA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICA8bW9uc3Rlci10cmVlLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDp2YWx1ZXMuY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb25zdGVyLW9wdGlvbnM9J3tcbiAgXCJ1cmxcIjogXCJtb2NrLWRhdGEuanNvblwiLFxuICBcIm1hcHBpbmdcIjoge1xuICAgIFwidmFsdWVUZW1wbGF0ZVwiOiBcIlxcJHtmaXJzdF9uYW1lfSBcXCR7bGFzdF9uYW1lfVwiLFxuICAgIFwibGFiZWxUZW1wbGF0ZVwiOiBcImlkXCIsXG4gICAgXCJzZWxlY3RvclwiOiBcIipcIlxuICB9LFxuICAgICAgXCJ0eXBlXCI6XCJjaGVja2JveFwiXG5cbn0nPjwvbW9uc3Rlci10cmVlLXNlbGVjdD5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBUcmVlU2VsZWN0LCBmZXRjaFJlZmVyZW5jZTtcblxuZGVzY3JpYmUoJ1RyZWVzZWxlY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpbXBvcnQoXCJlbGVtZW50LWludGVybmFscy1wb2x5ZmlsbFwiKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICAgICAgZmV0Y2hSZWZlcmVuY2UgPSBnbG9iYWxbJ2ZldGNoJ107XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vdHJlZS1zZWxlY3QubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBUcmVlU2VsZWN0ID0gbVsnVHJlZVNlbGVjdCddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdXaXRoIGZldGNoJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgZ2xvYmFsWydmZXRjaCddID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdDIpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoYFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpcnN0X25hbWVcIjogXCJBbGV4aWFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYXN0X25hbWVcIjogXCJPdWdodHJpZ2h0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1haWxcIjogXCJhb3VnaHRyaWdodDBAZXhibG9nLmpwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZGVyXCI6IFwiQWdlbmRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvdW50cnlcIjogXCJtblwiICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwYXJlbnRcIjogXCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaXJzdF9uYW1lXCI6IFwiQmV0aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhc3RfbmFtZVwiOiBcIkJvZGRpbmd0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbWFpbFwiOiBcImJib2RkaW5ndG9uMUBzdGF0Y291bnRlci5jb21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW5kZXJcIjogXCJOb24tYmluYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY291bnRyeVwiOiBcInN5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGFyZW50XCI6IFwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIlNoZWxsaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhc3RfbmFtZVwiOiBcIkEnQmFycm93XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZW1haWxcIjogXCJzYWJhcnJvdzJAZ29vZ2xlLmNvLnVrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZGVyXCI6IFwiUG9seWdlbmRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvdW50cnlcIjogXCJub1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhcmVudFwiOiBcIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBdYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTIoSlNPTi5zdHJpbmdpZnkoanNvbikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGdsb2JhbFsnZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW5zIG1vbnN0ZXItdHJlZS1zZWxlY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDInKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci10cmVlLXNlbGVjdCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIHNlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10cmVlLXNlbGVjdCcpKS5pcy5pbnN0YW5jZW9mKFRyZWVTZWxlY3QpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGF2ZSBvcHRpb25zJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyZWVzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRyZWUtc2VsZWN0Jyk7XG4gICAgICAgICAgICAgICAgdHJlZXNlbGVjdC5zZXRPcHRpb24oJ3VybCcsICdodHRwczovL2V4YW1wbGUuY29tJylcblxuICAgICAgICAgICAgICAgIHRyZWVzZWxlY3Quc2V0T3B0aW9uKCdtYXBwaW5nLnNlbGVjdG9yJywgJyonKTtcbiAgICAgICAgICAgICAgICB0cmVlc2VsZWN0LnNldE9wdGlvbignbWFwcGluZy5sYWJlbFRlbXBsYXRlJywgJyR7bGFzdF9uYW1lfScpO1xuICAgICAgICAgICAgICAgIHRyZWVzZWxlY3Quc2V0T3B0aW9uKCdtYXBwaW5nLnZhbHVlVGVtcGxhdGUnLCAnJHtpZCB8IHRvc3RyaW5nIH0nKTtcblxuICAgICAgICAgICAgICAgIHRyZWVzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbW9uc3Rlci1vcHRpb25zLXNldCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0cmVlc2VsZWN0LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbl0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgb3B0aW9ucyAoc2VlIGZldGNoIGFib3ZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChvcHRpb25zLmxlbmd0aCkuaXMuZXF1YWwoMyk7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbkh0bWwgPSB0cmVlc2VsZWN0LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtbW9uc3Rlci1yb2xlPW9wdGlvbnNdJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbkh0bWwpLmNvbnRhaW4uaHRtbCgnZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJvcHRpb25zLTBcIicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChvcHRpb25IdG1sKS5jb250YWluLmh0bWwoJ2RhdGEtbW9uc3Rlci1pbnNlcnQtcmVmZXJlbmNlPVwib3B0aW9ucy0xXCInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9uSHRtbCkuY29udGFpbi5odG1sKCdkYXRhLW1vbnN0ZXItaW5zZXJ0LXJlZmVyZW5jZT1cIm9wdGlvbnMtMlwiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbkh0bWwpLmNvbnRhaW4ubm90Lmh0bWwoJ2RhdGEtbW9uc3Rlci1pbnNlcnQtcmVmZXJlbmNlPVwib3B0aW9ucy0zXCInKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBtb2Nrcy5hcHBlbmRDaGlsZCh0cmVlc2VsZWN0KTtcblxuICAgICAgICAgICAgXG5cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkb2N1bWVudC5jcmVhdGVFbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgbm8gb3B0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10cmVlLXNlbGVjdCcpO1xuICAgICAgICAgICAgbW9ja3MuYXBwZW5kQ2hpbGQoc2VsZWN0KTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vbnN0ZXItcm9sZT1vcHRpb25zXScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChvcHRpb25zKS5pcy5pbnN0YW5jZW9mKEhUTUxEaXZFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbnMuaGFzQ2hpbGROb2RlcygpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0sIDApXG5cblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmltcG9ydCAqIGFzIGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBodG1sMiA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICA8bW9uc3Rlci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6dmFsdWVzLmNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9uc3Rlci1vcHRpb25zPSd7XG4gIFwidXJsXCI6IFwibW9jay1kYXRhLmpzb25cIixcbiAgXCJtYXBwaW5nXCI6IHtcbiAgICBcInZhbHVlUGF0aFwiOiBcIlxcJHtmaXJzdF9uYW1lfSBcXCR7bGFzdF9uYW1lfVwiLFxuICAgIFwia2V5UGF0aFwiOiBcImlkXCJcbiAgfSxcbiAgICAgIFwidHlwZVwiOlwiY2hlY2tib3hcIlxuXG59Jz48L21vbnN0ZXItYnV0dG9uPlxuICAgIDwvZGl2PlxuYDtcblxubGV0IEJ1dHRvbjtcblxuZGVzY3JpYmUoJ0J1dHRvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgaW1wb3J0KFwiZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGxcIikuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS9idXR0b24ubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBCdXR0b24gPSBtWydCdXR0b24nXTtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbmV3IEJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW5zIG1vbnN0ZXItYnV0dG9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QyJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItYnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgYnV0dG9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWJ1dHRvbicpKS5pcy5pbnN0YW5jZW9mKEJ1dHRvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkb2N1bWVudC5jcmVhdGVFbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgbm8gb3B0aW9ucycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1idXR0b24nKTtcbiAgICAgICAgICAgIG1vY2tzLmFwcGVuZENoaWxkKGJ1dHRvbik7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYnV0dG9uLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG9wdGlvbnMpLmlzLmluc3RhbmNlb2YoSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qob3B0aW9ucy5oYXNDaGlsZE5vZGVzKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9LCAxMDApXG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxubGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxubGV0IGh0bWwyID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MlwiPlxuICAgICAgICAgPG1vbnN0ZXItdG9nZ2xlLXN3aXRjaD48L21vbnN0ZXItdG9nZ2xlLXN3aXRjaD5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBUb2dnbGVTd2l0Y2g7XG5cbmRlc2NyaWJlKCdUb2dnbGVTd2l0Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGltcG9ydChcImVsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsXCIpLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2Zvcm0vdG9nZ2xlLXN3aXRjaC5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIFRvZ2dsZVN3aXRjaCA9IG1bJ1RvZ2dsZVN3aXRjaCddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcgVG9nZ2xlU3dpdGNoJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZSBmcm9tIHRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGl0KCdzaG91bGQgY29udGFpbnMgbW9uc3Rlci10b2dnbGUtc3dpdGNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QyJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIG1vbnN0ZXItdG9nZ2xlLXN3aXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10b2dnbGUtc3dpdGNoJykpLmlzLmluc3RhbmNlb2YoVG9nZ2xlU3dpdGNoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3RvZ2dsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgICAgICB9KTtcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCd0b2dnbGUgdG8gb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvZ2dsZVN3aXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLnNldE9wdGlvbigndmFsdWVzLm9uJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC5zZXRPcHRpb24oJ3ZhbHVlcy5vZmYnLCAnZmFsc2UnKTtcblxuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLnZhbHVlID0gXCJ0cnVlXCI7XG5cbiAgICAgICAgICAgIGV4cGVjdChcInRydWVcIikuaXMuZXF1YWwodG9nZ2xlU3dpdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGV4cGVjdChcIm9uXCIpLmlzLmVxdWFsKHRvZ2dsZVN3aXRjaC5zdGF0ZSk7XG5cbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC50b2dnbGUoKTtcblxuICAgICAgICAgICAgZXhwZWN0KFwiZmFsc2VcIikuaXMuZXF1YWwodG9nZ2xlU3dpdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGV4cGVjdChcIm9mZlwiKS5pcy5lcXVhbCh0b2dnbGVTd2l0Y2guc3RhdGUpO1xuXG4gICAgICAgICAgICB0b2dnbGVTd2l0Y2gudG9nZ2xlKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChcInRydWVcIikuaXMuZXF1YWwodG9nZ2xlU3dpdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGV4cGVjdChcIm9uXCIpLmlzLmVxdWFsKHRvZ2dsZVN3aXRjaC5zdGF0ZSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3RvZ2dsZSBvbiB0byBvZmYnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvZ2dsZVN3aXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuXG4gICAgICAgICAgICB0b2dnbGVTd2l0Y2gudG9nZ2xlT24oKTtcblxuICAgICAgICAgICAgZXhwZWN0KHRvZ2dsZVN3aXRjaC52YWx1ZSkuaXMuZXF1YWwoJ29uJyk7XG4gICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLnN0YXRlKS5pcy5lcXVhbCgnb24nKTtcblxuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLnRvZ2dsZU9mZigpO1xuXG4gICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLnZhbHVlKS5pcy5lcXVhbCgnb2ZmJyk7XG4gICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLnN0YXRlKS5pcy5lcXVhbCgnb2ZmJyk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Rlc2NyaWJlIGNzcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2NzcyB0b2dnbGUnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIG5ldyBDb250cm9sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHRvZ2dsZVN3aXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHNldCBpbml0IHZhbHVlIHRvIG9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC52YWx1ZSA9IFwib25cIjtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBpbnNlcnQgRE9NXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpLmFwcGVuZENoaWxkKHRvZ2dsZVN3aXRjaCk7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVXBkYXRlciBwcm96ZXNzIHJ1bnMgaW4gc2V0VGltZW91dFxuICAgICAgICAgICAgICogc2VsZltpbnRlcm5hbFN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIoKTtcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogZXhwZWN0IHRoYXQgY2xhc3Nlcy5vbiBpcyBzZXQgdG8gRWxlbWVudCBTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNDbGFzc0EgPSB0b2dnbGVTd2l0Y2guc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tb25zdGVyLXJvbGU9XCJzd2l0Y2hcIl0nKVswXS5jbGFzc0xpc3QuY29udGFpbnModG9nZ2xlU3dpdGNoLmdldE9wdGlvbignY2xhc3Nlcy5vbicpKTtcblxuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChoYXNDbGFzc0EpLmlzLnRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIHN3aXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC52YWx1ZSA9IFwib2ZmXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4cGVjdCB0aGF0IGNsYXNzZXMub24gaXMgcmVtb3ZlZCBmcm9tIEVsZW1lbnQgU3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNDbGFzc0IgPSB0b2dnbGVTd2l0Y2guc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tb25zdGVyLXJvbGU9XCJzd2l0Y2hcIl0nKVswXS5jbGFzc0xpc3QuY29udGFpbnModG9nZ2xlU3dpdGNoLmdldE9wdGlvbignY2xhc3Nlcy5vbicpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChoYXNDbGFzc0IpLmlzLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4cGVjdCB0aGF0IGNsYXNzZXMub2ZmIGlzIHNldCB0byBFbGVtZW50IFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzQ2xhc3NDID0gdG9nZ2xlU3dpdGNoLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9uc3Rlci1yb2xlPVwic3dpdGNoXCJdJylbMF0uY2xhc3NMaXN0LmNvbnRhaW5zKHRvZ2dsZVN3aXRjaC5nZXRPcHRpb24oJ2NsYXNzZXMub2ZmJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGhhc0NsYXNzQykuaXMudHJ1ZTtcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkZXNjcmliZSB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgICAgfSlcblxuICAgICAgICBpdCgndGhlIGRlZmF1bHQgdmFsdWUgaXMgb2ZmJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIG5ldyBDb250cm9sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCB0b2dnbGVTd2l0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRvZ2dsZS1zd2l0Y2gnKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdGhlIHN3aXRjaCBpcyBvZmYgYW5kIHByb3ZpZGVzIHRoZSB2YWx1ZSBmb3Igb2ZmXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgZXhwZWN0KG51bGwpLmlzLmVxdWFsKHRvZ2dsZVN3aXRjaC52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3dpdGNoIGlzIG9mZlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0b2dnbGVTd2l0Y2guc3RhdGUpLmlzLmVxdWFsKCdvZmYnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdpbmNvcnJlY3QgdmFsdWVzIGFyZSBub3QgYWNjZXB0ZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCB0b2dnbGVTd2l0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRvZ2dsZS1zd2l0Y2gnKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBkZWZpbmUgdGhlIHZhbHVlcyBmb3Igb24gYW5kIG9mZlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0b2dnbGVTd2l0Y2guc2V0T3B0aW9uKCd2YWx1ZXMub24nLCAndHJ1ZScpO1xuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLnNldE9wdGlvbigndmFsdWVzLm9mZicsICdmYWxzZScpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgbm90IFwidHJ1ZVwiIGFuZCBub3QgXCJmYWxzZVwiXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC52YWx1ZSA9IFwidGVzdFwiO1xuXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHRoZSBzd2l0Y2ggaXMgb2ZmIGFuZCBwcm92aWRlcyB0aGUgdmFsdWUgZm9yIG9mZlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGV4cGVjdChudWxsKS5pcy5lcXVhbCh0b2dnbGVTd2l0Y2gudmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdGhlIHN3aXRjaCBpcyBvZmZcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLnN0YXRlKS5pcy5lcXVhbCgnb2ZmJyk7XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBkaXNhYmxlZCBhdHRyaWJ1dGUgaXMgb25seSBzZXQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiBtb3VudGVkIGluIHRoZSBET01cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkuaXMuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBpbnNlcnQgRE9NXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJykuYXBwZW5kQ2hpbGQodG9nZ2xlU3dpdGNoKTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIG5vdyB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0b2dnbGVTd2l0Y2guaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKS5pcy5mYWxzZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjb3JyZWN0IHZhbHVlcyBhcmUgYWNjZXB0ZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvZ2dsZVN3aXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdG9nZ2xlLXN3aXRjaCcpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGRlZmluZSB0aGUgdmFsdWVzIGZvciBvbiBhbmQgb2ZmXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC5zZXRPcHRpb24oJ3ZhbHVlcy5vbicsICd0cnVlJyk7XG4gICAgICAgICAgICB0b2dnbGVTd2l0Y2guc2V0T3B0aW9uKCd2YWx1ZXMub2ZmJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjb3JyZWN0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRvZ2dsZVN3aXRjaC52YWx1ZSA9IFwidHJ1ZVwiO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHRoZSBzd2l0Y2ggaXMgb24gYW5kIHByb3ZpZGVzIHRoZSB2YWx1ZSBmb3Igb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZXhwZWN0KHRvZ2dsZVN3aXRjaC52YWx1ZSkuaXMuZXF1YWwoJ3RydWUnKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0aGUgc3dpdGNoIGlzIG9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGV4cGVjdCh0b2dnbGVTd2l0Y2guc3RhdGUpLmlzLmVxdWFsKCdvbicpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGluc2VydCBET01cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJykuYXBwZW5kQ2hpbGQodG9nZ2xlU3dpdGNoKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBkaXNhYmxlZCBhdHRyaWJ1dGUgaXMgbm90IHNldFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBleHBlY3QodG9nZ2xlU3dpdGNoLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkuaXMuZmFsc2U7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge3NldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXJNb2NrfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb24tbW9jay5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xubGV0IG1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlcjtcblxubGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxuZGVzY3JpYmUoJ1RlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgLy8ganNkb20tdGVzdGluZy1tb2NrcyBuZWVkIGplc3RcbiAgICBsZXQgVGVtcGxhdGUsIHZpZXdwb3J0LCBtb2NrVmlld3BvcnQ7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlci5yZXN0b3JlKCk7XG4gICAgfSlcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaW1wb3J0KFwiZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGxcIikuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICAgICAgICAgIG1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlciA9IHNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXJNb2NrKCk7XG5cbiAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvZm9ybS90ZW1wbGF0ZS5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIFRlbXBsYXRlID0gbVsnVGVtcGxhdGUnXTtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbmV3IFRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIGZyb20gdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtb25zdGVyLXRlbXBsYXRlPjwvbW9uc3Rlci10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgZnJvbSB0ZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW5zIG1vbnN0ZXItdGVtcGxhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDInKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci10ZW1wbGF0ZScpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIHRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlbXBsYXRlJykpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBtb2NrcztcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgaGF2ZSBubyBvcHRpb25zJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlbXBsYXRlJyk7XG4gICAgICAgICAgICBtb2Nrcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLXRlbXBsYXRlJyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9LCAwKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdsb2FkIGNvbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG1vY2tzLCBmZXRjaFJlZmVyZW5jZSwgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gICAgICAgIGJlZm9yZUVhY2goKGRvbmUpID0+IHtcbiAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInRoaXMtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFsnZmV0Y2gnXTtcblxuICAgICAgICAgICAgZ2xvYmFsWydmZXRjaCddID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9rOnRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6MjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUyKCdoZWxsbyB3b3JsZCEnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGxvYWQgY29udGVudCBmcm9tIHVybCcsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdXJsJywgJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAgICAgICAgICAgIG1vY2tzLmFwcGVuZENoaWxkKHRlbXBsYXRlKTtcblxuICAgICAgICAgICAgdGVtcGxhdGUuYWRkRXZlbnRMaXN0ZW5lcignbW9uc3Rlci1mZXRjaGVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21vbnN0ZXItdGVtcGxhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IGVsZW1lbnQuc2hhZG93Um9vdDtcblxuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChzaGFkb3dSb290KS5jb250YWluLmh0bWwoJ2hlbGxvIHdvcmxkJyk7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIG1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlci5nZXRJbnN0YW5jZSgpLmVudGVyTm9kZSgpO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pOyIsICJcbmltcG9ydCAqIGFzIGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuXG5cbmxldCBNZXNzYWdlO1xuXG5kZXNjcmliZSgnTWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbm90aWZ5L21lc3NhZ2UubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBNZXNzYWdlID0gbVsnTWVzc2FnZSddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgTWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItbm90aWZ5LW1lc3NhZ2UnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRyb2wpLmlzLmluc3RhbmNlb2YoTWVzc2FnZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pXG4iLCAiLy9pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbi8vIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbCgpO1xuLy9cbi8vIGxldCBodG1sMSA9IGBcbi8vICAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbi8vICAgICA8L2Rpdj5cbi8vIGA7XG4vL1xuLy8gLy8gbGFuZ3VhZ2U9SFRNTFxuLy8gbGV0IGh0bWwyID0gYFxuLy8gICAgIDxkaXYgaWQ9XCJ0ZXN0MlwiPlxuLy8gICAgICAgICA8bW9uc3Rlci1ub3RpZnkgZGF0YS1tb25zdGVyLW9wdGlvbnM9J3t9Jz48L21vbnN0ZXItbm90aXRmeT5cbi8vICAgICA8L2Rpdj5cbi8vIGA7XG5cbmxldCBOb3RpZnksIGZldGNoUmVmZXJlbmNlO1xuXG5kZXNjcmliZSgnTm90aWZ5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vc291cmNlL2NvbXBvbmVudHMvbm90aWZ5L25vdGlmeS5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIE5vdGlmeSA9IG1bJ05vdGlmeSddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2Ygbm90aWZ5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1ub3RpZnknKSkuaXMuaW5zdGFuY2VvZihOb3RpZnkpO1xuICAgICAgICAgICAgXG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhdmUgbWVzc2FnZXMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIGNvbnN0IG5vdGlmeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItbm90aWZ5Jyk7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBub3RpZnkucHVzaChcInRoaXMgaXMgbWVzc2FnZSBcIiArIGkrKyk7XG4gICAgICAgICAgICBub3RpZnkucHVzaChcInRoaXMgaXMgbWVzc2FnZSBcIiArIGkrKyk7XG4gICAgICAgICAgICBub3RpZnkucHVzaChcInRoaXMgaXMgbWVzc2FnZSBcIiArIGkrKyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9ub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIG11dGF0aW9uXSBvZiBtdXRhdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzWzBdLnRhZ05hbWUgPT09ICdNT05TVEVSLU5PVElGWScpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IG5vdGlmeS5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ21vbnN0ZXItbm90aWZ5LW1lc3NhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMyBvcHRpb25zIChzZWUgZmV0Y2ggYWJvdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLmlzLmVxdWFsKDMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG11dGF0aW9ub2JzZXJ2ZXIub2JzZXJ2ZShtb2Nrcywge2NoaWxkTGlzdDogdHJ1ZX0pO1xuICAgICAgICAgICAgbW9ja3MuYXBwZW5kQ2hpbGQobm90aWZ5KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pXG4iLCAiaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuXG5kZXNjcmliZSgnSG9zdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBob3N0O1xuICAgIGxldCBodG1sMSA9IGBcbiAgICAgICAgPG1vbnN0ZXItaG9zdCBpZD1cImhvc3QxXCI+PC9tb25zdGVyLWhvc3Q+XG4gICAgYDtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9jb21wb25lbnRzL2hvc3QvaG9zdC5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIGhvc3QgPSBtWydIb3N0J107XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpXG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cbiAgICAgICAgLy8gcmVnaXN0ZXIgb3duIGRhdGFzb3VyY2UsIGFmdGVyIHRoZSBmb3JtIGlzIGxvYWRlZFxuICAgICAgICAvLyBiZWNhdXNlIGluIHRoZSB3aWxkLCB0aGUgZm9ybSBpcyBwYXJzZWQgYmVmb3JlIHRoZSBkYXRhc291cmNlIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy9mb3JtLnJlZ2lzdGVyRGF0YXNvdXJjZSgndGVzdDMnLCB0ZXN0M0RhdGFzb3VyY2UpO1xuXG5cbiAgICB9KTsgICAgXG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3Rlc3Qta2V5JylcbiAgICB9KVxuICAgIFxuICAgIFxuICAgIGl0KCdzaG91bGQgcnVuJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWhvc3QnKTtcbiAgICAgICAgbW9ja3MuYXBwZW5kQ2hpbGQoZm9ybUNvbnRyb2wpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItaG9zdCBkYXRhLW1vbnN0ZXItb2JqZWN0bGluaz1cIlN5bWJvbChAc2NodWthaS9tb25zdGVyL2RvbS9jdXN0b20tZWxlbWVudEBAb3B0aW9ucy11cGRhdGVyLWxpbmspXCI+PC9tb25zdGVyLWhvc3Q+JylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9LCAwKVxuXG5cblxuXG5cbiAgICB9KTtcblxuXG59KTtcbiIsICJpbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcblxuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cblxuZGVzY3JpYmUoJ092ZXJsYXknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgaG9zdDtcbiAgICBsZXQgaHRtbDEgPSBgXG4gICAgICAgIDxtb25zdGVyLW92ZXJsYXkgaWQ9XCJkZXRhaWxzMVwiPjwvbW9uc3Rlci1vdmVybGF5PlxuICAgIGA7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L292ZXJsYXkubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBob3N0ID0gbVsnRGV0YWlscyddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgIH0pOyAgICBcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG4gICAgXG4gICAgXG4gICAgaXQoJ3Nob3VsZCBydW4nLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItb3ZlcmxheScpO1xuICAgICAgICBtb2Nrcy5hcHBlbmRDaGlsZChmb3JtQ29udHJvbCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKSkuY29udGFpbi5odG1sKFxuICAgICAgICAgICAgICAgICAgICAnIDxtb25zdGVyLW92ZXJsYXkgZGF0YS1tb25zdGVyLW9iamVjdGxpbms9XCJTeW1ib2woQHNjaHVrYWkvbW9uc3Rlci9kb20vY3VzdG9tLWVsZW1lbnRAQG9wdGlvbnMtdXBkYXRlci1saW5rKVwiPjwvbW9uc3Rlci1vdmVybGF5PicpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSwgMClcblxuICAgIH0pO1xuXG59KTtcbiIsICIvLyBJbXBvcnQgdGhlIHJlcXVpcmVkIGxpYnJhcmllc1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnY2hhaSc7XG4vL2ltcG9ydCB7IEpTRE9NIH0gZnJvbSAnanNkb20nO1xuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVDb25maWdLZXkgfSBmcm9tICcuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L3V0aWwubWpzJztcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuLy8gQ3JlYXRlIGEgSlNET00gaW5zdGFuY2UgdG8gc2ltdWxhdGUgdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbi8vY29uc3QgZG9tID0gbmV3IEpTRE9NKCk7XG5cblxuLy8gVGVzdCBzdWl0ZSBmb3IgdGhlIGdlbmVyYXRlVW5pcXVlQ29uZmlnS2V5IGZ1bmN0aW9uXG5kZXNjcmliZSgnZ2VuZXJhdGVVbmlxdWVDb25maWdLZXknLCAoKSA9PiB7XG5cbiAgICAvL2xldCBvcmlnaW5hbFdpbmRvdztcblxuICAgIC8vIGJlZm9yZSgoKSA9PiB7XG4gICAgLy8gICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCB3aW5kb3cgb2JqZWN0XG4gICAgLy8gICAgIG9yaWdpbmFsV2luZG93ID0gZ2xvYmFsVGhpcy53aW5kb3c7XG4gICAgLy9cbiAgICAvLyAgICAgLy8gQ3JlYXRlIGEgSlNET00gaW5zdGFuY2UgdG8gc2ltdWxhdGUgdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgICAvLyAgICAgY29uc3QgZG9tID0gbmV3IEpTRE9NKCk7XG4gICAgLy8gICAgIGdsb2JhbFRoaXMud2luZG93ID0gZG9tLndpbmRvdztcbiAgICAvLyB9KTtcblxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KTtcbiAgICB9KSAgICBcblxuICAgIC8vIC4uLiAoc2FtZSB0ZXN0IGNhc2VzIGFzIGJlZm9yZSlcblxuICAgIGFmdGVyKCgpID0+IHtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgd2luZG93IG9iamVjdFxuICAgICAgIC8vIGdsb2JhbFRoaXMud2luZG93ID0gb3JpZ2luYWxXaW5kb3c7XG4gICAgfSk7ICAgIFxuICAgIFxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSB1bmlxdWUga2V5IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAnTXlDb21wb25lbnQnO1xuICAgICAgICBjb25zdCBpZCA9ICcxMjMnO1xuICAgICAgICBjb25zdCBwcmVmaXggPSAnbXlQcmVmaXgnO1xuXG4gICAgICAgIGNvbnN0IHVuaXF1ZUtleSA9IGdlbmVyYXRlVW5pcXVlQ29uZmlnS2V5KGNvbXBvbmVudE5hbWUsIGlkLCBwcmVmaXgpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdW5pcXVlIGtleSBjb250YWlucyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgZm9sbG93cyB0aGUgZXhwZWN0ZWQgZm9ybWF0XG4gICAgICAgIGV4cGVjdCh1bmlxdWVLZXkpLnRvLmluY2x1ZGUocHJlZml4KTtcbiAgICAgICAgZXhwZWN0KHVuaXF1ZUtleSkudG8uaW5jbHVkZShjb21wb25lbnROYW1lKTtcbiAgICAgICAgZXhwZWN0KHVuaXF1ZUtleSkudG8uaW5jbHVkZShpZCk7XG4gICAgICAgIGV4cGVjdCh1bmlxdWVLZXkpLnRvLm1hdGNoKC9eW2EtekEtWjAtOV9dKyQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gJ015JENvbXBvbmVudCc7XG4gICAgICAgIGNvbnN0IGlkID0gJzEyIzMnO1xuICAgICAgICBjb25zdCBwcmVmaXggPSAnbXkgUHJlZml4JztcblxuICAgICAgICBjb25zdCB1bmlxdWVLZXkgPSBnZW5lcmF0ZVVuaXF1ZUNvbmZpZ0tleShjb21wb25lbnROYW1lLCBpZCwgcHJlZml4KTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHVuaXF1ZSBrZXkgZG9lcyBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIHNwYWNlc1xuICAgICAgICBleHBlY3QodW5pcXVlS2V5KS50by5tYXRjaCgvXlthLXpBLVowLTlfXSskLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgdGhlIGJyb3dzZXIgbG9jYXRpb24gd2l0aG91dCBwYXJhbWV0ZXJzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gJ015Q29tcG9uZW50JztcbiAgICAgICAgY29uc3QgaWQgPSAnMTIzJztcbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ215UHJlZml4JztcblxuICAgICAgICBjb25zdCB1bmlxdWVLZXkgPSBnZW5lcmF0ZVVuaXF1ZUNvbmZpZ0tleShjb21wb25lbnROYW1lLCBpZCwgcHJlZml4KTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHVuaXF1ZSBrZXkgY29udGFpbnMgdGhlIGJyb3dzZXIgbG9jYXRpb24gd2l0aG91dCBwYXJhbWV0ZXJzXG4gICAgICAgIGNvbnN0IHVybFdpdGhvdXRQYXJhbXMgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRVcmwgPSB1cmxXaXRob3V0UGFyYW1zLnJlcGxhY2UoL1teXFx3XFxzXS9naSwgJ18nKS5yZXBsYWNlKC9cXHMrL2csICdfJyk7XG4gICAgICAgIGV4cGVjdCh1bmlxdWVLZXkpLnRvLmluY2x1ZGUoc2FuaXRpemVkVXJsKTtcbiAgICB9KTtcblxuICAgIFxuICAgIFxufSkiLCAiaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge1Jlc2l6ZU9ic2VydmVyTW9ja30gZnJvbSBcIi4uLy4uLy4uL3V0aWwvcmVzaXplLW9ic2VydmVyLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cblxuZGVzY3JpYmUoJ0RldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgaG9zdDtcbiAgICBsZXQgaHRtbDEgPSBgXG4gICAgICAgIDxtb25zdGVyLWRldGFpbHMgaWQ9XCJkZXRhaWxzMVwiPjwvbW9uc3Rlci1kZXRhaWxzPlxuICAgIGA7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi8uLi9zb3VyY2UvY29tcG9uZW50cy9ob3N0L2RldGFpbHMubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBob3N0ID0gbVsnRGV0YWlscyddO1xuXG4gICAgICAgICAgICAgICAgaWYoIWdsb2JhbC5SZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuUmVzaXplT2JzZXJ2ZXIgPSBSZXNpemVPYnNlcnZlck1vY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKVxuXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuICAgIH0pXG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgIH0pOyAgICBcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG4gICAgXG4gICAgXG4gICAgaXQoJ3Nob3VsZCBydW4nLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItZGV0YWlscycpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJykpLmNvbnRhaW4uaHRtbChcbiAgICAgICAgICAgICAgICAgICAgJzxtb25zdGVyLWRldGFpbHMgaWQ9XCJkZXRhaWxzMVwiIGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rPVwiU3ltYm9sKEBzY2h1a2FpL21vbnN0ZXIvZG9tL2N1c3RvbS1lbGVtZW50QEBvcHRpb25zLXVwZGF0ZXItbGluaylcIiBkYXRhLW1vbnN0ZXItYnV0dG9uLWxhYmVsPVwiRGV0YWlsc1wiPjwvbW9uc3Rlci1kZXRhaWxzPicpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSwgMClcblxuICAgIH0pO1xuXG59KTtcbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdGV4dC9mb3JtYXR0ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0Zvcm1hdHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIGh0dHBzOi8vZ2l0bGFiLnNjaHVrYWkuY29tL29zcy9saWJyYXJpZXMvamF2YXNjcmlwdC9tb25zdGVyLy0vaXNzdWVzLzI3NVxuICAgIGRlc2NyaWJlKCdjaGFuZ2UgZW1wdHkgaGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ21vZGlmaWNhdGlvbiAxJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCAgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7XG5cbiAgICAgICAgICAgICAgICBhOiBudWxsLFxuICAgICAgICAgICAgICAgIGI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjIDogMFxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGV4cGVjdChmb3JtYXR0ZXIuZm9ybWF0KFwiJHthIHwgdG9zdHJpbmd9XCIpKS50by5iZS5lcXVhbCgnbnVsbCcpO1xuICAgICAgICAgICAgZXhwZWN0KGZvcm1hdHRlci5mb3JtYXQoXCIke2IgfCB0b3N0cmluZ31cIikpLnRvLmJlLmVxdWFsKCd1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIGV4cGVjdChmb3JtYXR0ZXIuZm9ybWF0KFwiJHtjIHwgdG9zdHJpbmd9XCIpKS50by5iZS5lcXVhbCgnMCcpO1xuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvNDdcbiAgICBkZXNjcmliZSgnZXhhbXBsZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JmYyBleGFtcGxlIHNob3VsZCBydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7XG5cbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiSGVsbG9cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiBcIldvcmxkXCIsXG4gICAgICAgICAgICAgICAgICAgIGU6IDFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pLmZvcm1hdChcIiR7YS5iLmN9ICR7YS5kIHwgdG91cHBlcn0hXCIpKS50by5iZS5lcXVhbCgnSGVsbG8gV09STEQhJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2RvYyBleGFtcGxlIHNob3VsZCBydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7XG5cbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiSGVsbG9cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiBcIndvcmxkXCIsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KS5mb3JtYXQoXCIke2EuYi5jfSAke2EuZCB8IHVjZmlyc3R9IVwiKSkudG8uYmUuZXF1YWwoJ0hlbGxvIFdvcmxkIScpO1xuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3NldCBtYXJrZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnI2EjJywgJyMnLCB1bmRlZmluZWQsICd0ZXN0J10sXG4gICAgICAgICAgICBbJ3thfScsICd7JywgJ30nLCAndGVzdCddLFxuICAgICAgICAgICAgWydpMThue2F9JywgJ2kxOG57JywgJ30nLCAndGVzdCddLFxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyB3aXRoIG1hcmtlciAnICsgYiArICcgYW5kICcgKyBjICsgJyBzaG91bGQgcmV0dXJuICAnICsgYiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybWF0dGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLnNldE1hcmtlcihiLCBjKS5mb3JtYXQoYSlcbiAgICAgICAgICAgICAgICApLnRvLmVxdWFsKGQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZXhhbXBsZXMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJyR7YSB8IHRvanNvbn0nLCBcIntcXFwiYlxcXCI6e1xcXCJjXFxcIjpcXFwiSGVsbG9cXFwifSxcXFwiZFxcXCI6XFxcIldvcmxkXFxcIixcXFwiZVxcXCI6MX1cIl0sXG4gICAgICAgICAgICBbJ2NsaWNrICR7YS5kfSB0aW1lcycsIFwiY2xpY2sgV29ybGQgdGltZXNcIl0sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAnLCAnIEhlbGxvICddLFxuICAgICAgICAgICAgWycgJHthLmIuY30nLCAnIEhlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICcsICdIZWxsbyAnXSxcbiAgICAgICAgICAgIFsnJHthLmIuY30nLCAnSGVsbG8nXSxcbiAgICAgICAgICAgIFsnJHthLmIuY30ke2EuYi5jfScsICdIZWxsb0hlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICR7YS5iLmN9JywgJ0hlbGxvIEhlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICR7YS5iLmN9ICcsICdIZWxsbyBIZWxsbyAnXSxcbiAgICAgICAgICAgIFsnICR7YS5iLmN9ICR7YS5iLmN9ICcsICcgSGVsbG8gSGVsbG8gJ10sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAke2EuZH0gJywgJyBIZWxsbyBXb3JsZCAnXSxcbiAgICAgICAgICAgIFsnICR7YS5iLmN9ICR7YS5iLmMgfCB0b3VwcGVyIHwgbGVuZ3RoIHwgdG9zdHJpbmd9ICcsICcgSGVsbG8gNSAnXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdmb3JtYXQgJyArIGEgKyAnIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcIkhlbGxvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiBcIldvcmxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTWFya2VyIGluIG1hcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgdGV4dCA9ICcke215a2V5JHtzdWJrZXl9fSc7XG4gICAgICAgIGxldCBleHBlY3RlZCA9ICcxJztcblxuICAgICAgICBpdCgnZm9ybWF0ICcgKyB0ZXh0ICsgJyBzaG91bGQgJyArIGV4cGVjdGVkLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgbXlrZXkyOiBcIjFcIixcbiAgICAgICAgICAgICAgICBzdWJrZXk6IFwiMlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcihvYmopLmZvcm1hdCh0ZXh0KSkuaXMuZXF1YWwoZXhwZWN0ZWQpXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldFBhcmFtZXRlckNoYXJzKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3NldFBhcmFtZXRlckNoYXJzKCkgc2hvdWxkIHJldHVybiBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKHt9KS5zZXRQYXJhbWV0ZXJDaGFycygnYScsICdiJykpLmlzLmluc3RhbmNlb2YoRm9ybWF0dGVyKTtcblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCd3aXRoIGNhbGxiYWNrcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnYWRkIGNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7XG4gICAgICAgICAgICAgICAgeDogJzEnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgICAgIG15OiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiFcIiArIHZhbHVlICsgXCIhXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QoZm9ybWF0dGVyLmZvcm1hdCgnJHt4IHwgY2FsbDpteX0nKSkuaXMuZXF1YWwoJyExIScpO1xuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdNYXJrZXIgaW4gbWFya2VyIHdpdGggcGFyYW1ldGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCB0ZXh0ID0gJyR7bXlrZXk6Om15a2V5PSR7c3Via2V5fX0nO1xuICAgICAgICBsZXQgZXhwZWN0ZWQgPSAnMic7XG5cbiAgICAgICAgaXQoJ2Zvcm1hdCAnICsgdGV4dCArICcgc2hvdWxkICcgKyBleHBlY3RlZCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIHN1YmtleTogXCIyXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KHRleHQpKS5pcy5lcXVhbChleHBlY3RlZClcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdleGNlcHRpb25zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnJHthLmIueH0nLCBUeXBlRXJyb3JdLFxuICAgICAgICAgICAgWycke2EuYi5kIHwgdG91cHBlciB8IGxlbmd0aH0nLCBUeXBlRXJyb3JdLFxuICAgICAgICAgICAgWycke2EuYi5kfScsIFR5cGVFcnJvcl0sICAvLyBhLmIuZCByZXR1cm4gdW5kZWZpbmVkIGJ5IHBhdGhmaW5kZXIgXG4gICAgICAgICAgICBbJyR7YS5iLmQgfCB0b2xvd2VyfScsIFR5cGVFcnJvcl0sICAvLyBhLmIuZCByZXR1cm4gdW5kZWZpbmVkIGJ5IHBhdGhmaW5kZXIgXG4gICAgICAgICAgICBbJyR7YSB8IH0nLCBFcnJvcl0sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyBzaG91bGQgdGhyb3cgJyArIHR5cGVvZiBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1hdHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcInRlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ6IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvcm1hdChhKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKS50by50aHJvdyhiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cblxuXG4gICAgZGVzY3JpYmUoJ0Zvcm1hdHRlcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgYSBiYXNpYyBzdHJpbmcgd2l0aCBvYmplY3QgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7bmFtZTogJ0pvaG4nLCBhZ2U6IDMwfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmb3JtYXR0ZXIuZm9ybWF0KCdNeSBuYW1lIGlzICR7bmFtZX0gYW5kIEkgYW0gJHthZ2UgfCB0b3N0cmluZ30geWVhcnMgb2xkLicpO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5lcXVhbCgnTXkgbmFtZSBpcyBKb2huIGFuZCBJIGFtIDMwIHllYXJzIG9sZC4nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgYSBzdHJpbmcgd2l0aCBuZXN0ZWQgbWFya2VycycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAnJHtteWtleSR7c3Via2V5fX0nO1xuICAgICAgICAgICAgY29uc3Qgb2JqID0ge215a2V5MjogJzEnLCBzdWJrZXk6ICcyJ307XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKG9iaik7XG5cbiAgICAgICAgICAgIGV4cGVjdChmb3JtYXR0ZXIuZm9ybWF0KHRleHQpKS50by5lcXVhbCgnMScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBhIHN0cmluZyB3aXRoIGN1c3RvbSBtYXJrZXJzJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7bmFtZTogJ0pvaG4nLCBhZ2U6IDMwfSk7XG4gICAgICAgICAgICBmb3JtYXR0ZXIuc2V0TWFya2VyKCdbJywgJ10nKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdHRlci5mb3JtYXQoJ015IG5hbWUgaXMgW25hbWVdIGFuZCBJIGFtIFthZ2UgfCB0b3N0cmluZ10geWVhcnMgb2xkLicpO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5lcXVhbCgnTXkgbmFtZSBpcyBKb2huIGFuZCBJIGFtIDMwIHllYXJzIG9sZC4nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgYSBzdHJpbmcgdXNpbmcgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHt4OiAnMSd9LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgICAgIHF1b3RlOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KGZvcm1hdHRlci5mb3JtYXQoJyR7eCB8IGNhbGw6cXVvdGV9JykpLnRvLmVxdWFsKCdcIjFcIicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBhIHN0cmluZyB3aXRoIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOiAnSGVsbG8nLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiAnd29ybGQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihvYmopO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm9ybWF0dGVyLmZvcm1hdCgnJHthLmIuY30gJHthLmQgfCB1Y2ZpcnN0fSEnKTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJ0hlbGxvIFdvcmxkIScpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgYSB0b28gZGVlcCBuZXN0aW5nIGVycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7bmFtZTogJ0pvaG4nfSk7XG4gICAgICAgICAgICBjb25zdCBuZXN0ZWRUZXh0ID0gJyR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZSR7bmFtZX19fX19fX19fX19fX19fX19fSc7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZm9ybWF0dGVyLmZvcm1hdChuZXN0ZWRUZXh0KSkudG8udGhyb3coJ3N5bnRheCBlcnJvciBpbiBmb3JtYXR0ZXIgdGVtcGxhdGUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhIHRvbyBkZWVwIG5lc3RpbmcgZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE9iaiA9IHtcbiAgICAgICAgICAgICAgICBteWtleTogJyR7bXlrZXl9JyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoaW5wdXRPYmopO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gJyR7bXlrZXl9JztcbiAgICAgICAgICAgIGxldCBmb3JtYXR0ZWRUZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc3RyaW5nIHdpdGggMjEgbGV2ZWxzIG9mIG5lc3RpbmdcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjE7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFRleHQgPSAnJHsnICsgZm9ybWF0dGVkVGV4dCArICd9JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGZvcm1hdHRlci5mb3JtYXQoZm9ybWF0dGVkVGV4dCkpLnRvLnRocm93KCd0b28gZGVlcCBuZXN0aW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICB9KTtcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuZXhwb3J0IHsgZ2VuZXJhdGVSYW5nZUNvbXBhcmlzb25FeHByZXNzaW9uIH07XG5cbi8qKlxuICogVGhlIGBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oKWAgZnVuY3Rpb24gaXMgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqIG9mIGEgY29tcGFyaXNvbiBleHByZXNzaW9uIGJhc2VkIG9uIGEgcmFuZ2Ugb2YgdmFsdWVzLiBJdCB0YWtlcyB0aHJlZSBhcmd1bWVudHM6XG4gKlxuICogLSBleHByZXNzaW9uIChyZXF1aXJlZCk6IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcmFuZ2Ugb2YgdmFsdWVzIGluIHRoZSBmb3JtYXQgb2Ygc3RhcnQxLWVuZDEsc3RhcnQyLWVuZDIsdmFsdWUzLi4uLlxuICogLSB2YWx1ZU5hbWUgKHJlcXVpcmVkKTogYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nIGNvbXBhcmVkIHRvIHRoZSByYW5nZSBvZiB2YWx1ZXMuXG4gKiAtIG9wdGlvbnMgKG9wdGlvbmFsKTogYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zIHRvIGN1c3RvbWl6ZSB0aGUgY29tcGFyaXNvbiBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oKSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wYXJpc29uIGV4cHJlc3Npb24uXG4gKlxuICogIyMgT3B0aW9uc1xuICogVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIHVybEVuY29kZSAoYm9vbGVhbiwgZGVmYXVsdDogZmFsc2UpOiBpZiBzZXQgdG8gdHJ1ZSwgVVJMIGVuY29kZXMgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICogYW5kT3AgKHN0cmluZywgZGVmYXVsdDogJyYmJyk6IHRoZSBsb2dpY2FsIEFORCBvcGVyYXRvciB0byB1c2UgaW4gdGhlIGV4cHJlc3Npb24uXG4gKiBvck9wIChzdHJpbmcsIGRlZmF1bHQ6ICd8fCcpOiB0aGUgbG9naWNhbCBPUiBvcGVyYXRvciB0byB1c2UgaW4gdGhlIGV4cHJlc3Npb24uXG4gKiBlcU9wIChzdHJpbmcsIGRlZmF1bHQ6ICc9PScpOiB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgdG8gdXNlIGluIHRoZSBleHByZXNzaW9uLlxuICogZ2VPcCAoc3RyaW5nLCBkZWZhdWx0OiAnPj0nKTogdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvcGVyYXRvciB0byB1c2UgaW4gdGhlIGV4cHJlc3Npb24uXG4gKiBsZU9wIChzdHJpbmcsIGRlZmF1bHQ6ICc8PScpOiB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG9wZXJhdG9yIHRvIHVzZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBFeGFtcGxlc1xuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGV4cHJlc3Npb24gPSAnMC0xMCwyMC0zMCc7XG4gKiBjb25zdCB2YWx1ZU5hbWUgPSAnYWdlJztcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IHVybEVuY29kZTogdHJ1ZSwgYW5kT3A6ICdhbmQnLCBvck9wOiAnb3InLCBlcU9wOiAnPScsIGdlT3A6ICc+PScsIGxlT3A6ICc8PScgfTtcbiAqIGNvbnN0IGNvbXBhcmlzb25FeHByZXNzaW9uID0gZ2VuZXJhdGVSYW5nZUNvbXBhcmlzb25FeHByZXNzaW9uKGV4cHJlc3Npb24sIHZhbHVlTmFtZSwgb3B0aW9ucyk7XG4gKlxuICogY29uc29sZS5sb2coY29tcGFyaXNvbkV4cHJlc3Npb24pOyAvLyBhZ2UlM0UlM0QwJTIwYW5kJTIwYWdlJTNDJTNEMTAlMjBvciUyMGFnZSUzRSUzRDIwJTIwYW5kJTIwYWdlJTNDJTNEMzBcbiAqIGBgYFxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIGdlbmVyYXRlUmFuZ2VDb21wYXJpc29uRXhwcmVzc2lvbigpIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tcGFyaXNvblxuICogZXhwcmVzc2lvbiBmb3IgdGhlIGV4cHJlc3Npb24gYW5kIHZhbHVlTmFtZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHNwZWNpZmllZCBvcHRpb25zLiBUaGUgcmVzdWx0aW5nIGNvbXBhcmlzb25cbiAqIGV4cHJlc3Npb24gaXMgJ2FnZT49MCBhbmQgYWdlPD0xMCBvciBhZ2U+PTIwIGFuZCBhZ2U8PTMwJywgVVJMIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSB1cmxFbmNvZGUgb3B0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIC0gVGhlIHN0cmluZyBleHByZXNzaW9uIHRvIGdlbmVyYXRlIHRoZSBjb21wYXJpc29uIGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy51cmxFbmNvZGU9ZmFsc2VdIC0gV2hldGhlciB0byBlbmNvZGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIHVzZSBpbiBhIFVSTC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmRPcD0nJiYnXSAtIFRoZSBsb2dpY2FsIEFORCBvcGVyYXRvciB0byB1c2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3JPcD0nfHwnXSAtIFRoZSBsb2dpY2FsIE9SIG9wZXJhdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5lcU9wPSc9PSddIC0gVGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIGVxdWFsaXR5IHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5nZU9wPSc+PSddIC0gVGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0byB1c2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGVPcD0nPD0nXSAtIFRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdG8gdXNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgaXMgaW52YWxpZC5cbiAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGNvbXBhcmlzb24gZXhwcmVzc2lvbiBiYXNlZCBvbiBhIHJhbmdlIG9mIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVSYW5nZUNvbXBhcmlzb25FeHByZXNzaW9uKFxuXHRleHByZXNzaW9uLFxuXHR2YWx1ZU5hbWUsXG5cdG9wdGlvbnMgPSB7fSxcbikge1xuXHRjb25zdCB7XG5cdFx0dXJsRW5jb2RlID0gZmFsc2UsXG5cdFx0YW5kT3AgPSBcIiYmXCIsXG5cdFx0b3JPcCA9IFwifHxcIixcblx0XHRlcU9wID0gXCI9PVwiLFxuXHRcdGdlT3AgPSBcIj49XCIsXG5cdFx0bGVPcCA9IFwiPD1cIixcblx0fSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJhbmdlcyA9IGV4cHJlc3Npb24uc3BsaXQoXCIsXCIpO1xuXHRsZXQgY29tcGFyaXNvbiA9IFwiXCI7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgcmFuZ2UgPSByYW5nZXNbaV0udHJpbSgpO1xuXHRcdGlmIChyYW5nZSA9PT0gXCJcIikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbmdlICcke3JhbmdlfSdgKTtcblx0XHR9IGVsc2UgaWYgKHJhbmdlLmluY2x1ZGVzKFwiLVwiKSkge1xuXHRcdFx0Y29uc3QgW3N0YXJ0LCBlbmRdID0gcmFuZ2Vcblx0XHRcdFx0LnNwbGl0KFwiLVwiKVxuXHRcdFx0XHQubWFwKChzKSA9PiAocyA9PT0gXCJcIiA/IG51bGwgOiBwYXJzZUZsb2F0KHMpKSk7XG5cdFx0XHRpZiAoKHN0YXJ0ICE9PSBudWxsICYmIGlzTmFOKHN0YXJ0KSkgfHwgKGVuZCAhPT0gbnVsbCAmJiBpc05hTihlbmQpKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgaW4gcmFuZ2UgJyR7cmFuZ2V9J2ApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0YXJ0ICE9PSBudWxsICYmIGVuZCAhPT0gbnVsbCAmJiBzdGFydCA+IGVuZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuZ2UgJyR7cmFuZ2V9J2ApO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29tcFN0YXJ0ID1cblx0XHRcdFx0c3RhcnQgIT09IG51bGxcblx0XHRcdFx0XHQ/IGAke3ZhbHVlTmFtZX0ke3VybEVuY29kZSA/IGVuY29kZVVSSUNvbXBvbmVudChnZU9wKSA6IGdlT3B9JHtzdGFydH1gXG5cdFx0XHRcdFx0OiBcIlwiO1xuXHRcdFx0Y29uc3QgY29tcEVuZCA9XG5cdFx0XHRcdGVuZCAhPT0gbnVsbFxuXHRcdFx0XHRcdD8gYCR7dmFsdWVOYW1lfSR7dXJsRW5jb2RlID8gZW5jb2RlVVJJQ29tcG9uZW50KGxlT3ApIDogbGVPcH0ke2VuZH1gXG5cdFx0XHRcdFx0OiBcIlwiO1xuXHRcdFx0Y29uc3QgY29tcFJhbmdlID0gYCR7Y29tcFN0YXJ0fSR7XG5cdFx0XHRcdGNvbXBTdGFydCAmJiBjb21wRW5kID8gYCAke2FuZE9wfSBgIDogXCJcIlxuXHRcdFx0fSR7Y29tcEVuZH1gO1xuXHRcdFx0Y29tcGFyaXNvbiArPSByYW5nZXMubGVuZ3RoID4gMSA/IGAoJHtjb21wUmFuZ2V9KWAgOiBjb21wUmFuZ2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChyYW5nZSk7XG5cdFx0XHRpZiAoaXNOYU4odmFsdWUpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSAnJHtyYW5nZX0nYCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb21wVmFsdWUgPSBgJHt2YWx1ZU5hbWV9JHtcblx0XHRcdFx0dXJsRW5jb2RlID8gZW5jb2RlVVJJQ29tcG9uZW50KGVxT3ApIDogZXFPcFxuXHRcdFx0fSR7dmFsdWV9YDtcblx0XHRcdGNvbXBhcmlzb24gKz0gcmFuZ2VzLmxlbmd0aCA+IDEgPyBgKCR7Y29tcFZhbHVlfSlgIDogY29tcFZhbHVlO1xuXHRcdH1cblx0XHRpZiAoaSA8IHJhbmdlcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRjb21wYXJpc29uICs9IGAgJHtvck9wfSBgO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY29tcGFyaXNvbjtcbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb259IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdGV4dC91dGlsLm1qc1wiO1xuXG5kZXNjcmliZSgnZ2VuZXJhdGVSYW5nZUNvbXBhcmlzb25FeHByZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBjb21wYXJpc29uIGV4cHJlc3Npb24gZm9yIHNpbmdsZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSAnMSwzLDUnO1xuICAgICAgICBjb25zdCB2YWx1ZU5hbWUgPSAneCc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlUmFuZ2VDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uLCB2YWx1ZU5hbWUpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5lcXVhbCgnKHg9PTEpIHx8ICh4PT0zKSB8fCAoeD09NSknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBjb21wYXJpc29uIGV4cHJlc3Npb24gZm9yIHJhbmdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9ICcxLTMsNi04JztcbiAgICAgICAgY29uc3QgdmFsdWVOYW1lID0gJ3gnO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbiwgdmFsdWVOYW1lKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJyh4Pj0xICYmIHg8PTMpIHx8ICh4Pj02ICYmIHg8PTgpJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGNvcnJlY3QgY29tcGFyaXNvbiBleHByZXNzaW9uIGZvciBtaXhlZCByYW5nZXMgYW5kIHNpbmdsZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSAnMS0zLDUsNy05JztcbiAgICAgICAgY29uc3QgdmFsdWVOYW1lID0gJ3gnO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbiwgdmFsdWVOYW1lKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoJyh4Pj0xICYmIHg8PTMpIHx8ICh4PT01KSB8fCAoeD49NyAmJiB4PD05KScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCByYW5nZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9ICcxLTMsNS00JztcbiAgICAgICAgY29uc3QgdmFsdWVOYW1lID0gJ3gnO1xuICAgICAgICBleHBlY3QoKCkgPT4gZ2VuZXJhdGVSYW5nZUNvbXBhcmlzb25FeHByZXNzaW9uKGV4cHJlc3Npb24sIHZhbHVlTmFtZSkpLnRvLnRocm93KGBJbnZhbGlkIHJhbmdlICc1LTQnYCk7XG4gICAgfSk7XG5cblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGludmFsaWQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSAnMS0zLGEnO1xuICAgICAgICBjb25zdCB2YWx1ZU5hbWUgPSAneCc7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbiwgdmFsdWVOYW1lKSkudG8udGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBjb21wYXJpc29uIGV4cHJlc3Npb24gd2l0aCBjdXN0b20gb3BlcmF0b3JzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gJzEtMyw1JztcbiAgICAgICAgY29uc3QgdmFsdWVOYW1lID0gJ3gnO1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYW5kT3A6ICdBTkQnLFxuICAgICAgICAgICAgb3JPcDogJ09SJyxcbiAgICAgICAgICAgIGVxT3A6ICc9PT0nLFxuICAgICAgICAgICAgZ2VPcDogJz49JyxcbiAgICAgICAgICAgIGxlT3A6ICc8PScsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlUmFuZ2VDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uLCB2YWx1ZU5hbWUsIG9wdGlvbnMpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5lcXVhbCgnKHg+PTEgQU5EIHg8PTMpIE9SICh4PT09NSknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBjb21wYXJpc29uIGV4cHJlc3Npb24gd2l0aCB1cmxFbmNvZGUgb3B0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogJzEsMyw1JyxcbiAgICAgICAgICAgICAgICB2YWx1ZU5hbWU6ICd4JyxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogJyh4JTNEJTNEMSkgfHwgKHglM0QlM0QzKSB8fCAoeCUzRCUzRDUpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogJy0xMCcsXG4gICAgICAgICAgICAgICAgdmFsdWVOYW1lOiAneCcsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6ICd4JTNDJTNEMTAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiAnMTAtJyxcbiAgICAgICAgICAgICAgICB2YWx1ZU5hbWU6ICd4JyxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogJ3glM0UlM0QxMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246ICcxLTMsNi04JyxcbiAgICAgICAgICAgICAgICB2YWx1ZU5hbWU6ICd5JyxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogJyh5JTNFJTNEMSAmJiB5JTNDJTNEMykgfHwgKHklM0UlM0Q2ICYmIHklM0MlM0Q4KScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246ICcxLTMsNSw3LTknLFxuICAgICAgICAgICAgICAgIHZhbHVlTmFtZTogJ3onLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiAnKHolM0UlM0QxICYmIHolM0MlM0QzKSB8fCAoeiUzRCUzRDUpIHx8ICh6JTNFJTNENyAmJiB6JTNDJTNEOSknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgoe2V4cHJlc3Npb24sIHZhbHVlTmFtZSwgZXhwZWN0ZWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVJhbmdlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbiwgdmFsdWVOYW1lLCB7dXJsRW5jb2RlOiB0cnVlfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5lcXVhbChleHBlY3RlZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBjb3JyZWN0IGNvbXBhcmlzb24gZXhwcmVzc2lvbiBmb3Igb3Blbi1lbmRlZCByYW5nZXMgd2l0aCB1cmxFbmNvZGUgb3B0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogJzEwLScsXG4gICAgICAgICAgICAgICAgdmFsdWVOYW1lOiAneCcsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6ICd4JTNFJTNEMTAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiAnLTEwJyxcbiAgICAgICAgICAgICAgICB2YWx1ZU5hbWU6ICd5JyxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogJ3klM0MlM0QxMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7ZXhwcmVzc2lvbiwgdmFsdWVOYW1lLCBleHBlY3RlZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlUmFuZ2VDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uLCB2YWx1ZU5hbWUsIHt1cmxFbmNvZGU6IHRydWV9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKGV4cGVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuZXhwb3J0IHsgcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2gsIGNyZWF0ZUJyYWNrZXRlZEtleVZhbHVlSGFzaCB9O1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGJyYWNrZXRlZCBrZXktdmFsdWUgcGFpcnMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIHJlc3VsdC5cbiAqXG4gKiAtIFRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBoYXNoIHN5bWJvbCAjLlxuICogLSBBZnRlciB0aGUgaGFzaCBzeW1ib2wsIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBzZWxlY3RvciBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgYSBzZW1pY29sb24gOy5cbiAqIC0gRWFjaCBzZWxlY3RvciBzdHJpbmcgaGFzIHRoZSBmb3JtYXQgc2VsZWN0b3JOYW1lKGtleTE9dmFsdWUxLGtleTI9dmFsdWUyLC4uLikuXG4gKiAtIFRoZSBzZWxlY3RvciBuYW1lIGlzIGEgc3RyaW5nIG9mIG9uZSBvciBtb3JlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLlxuICogLSBUaGUga2V5LXZhbHVlIHBhaXJzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzICwgYW5kIGFyZSBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuXG4gKiAtIFRoZSBrZXkgaXMgYSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuXG4gKiAtIFRoZSB2YWx1ZSBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMuXG4gKiAtIElmIHRoZSB2YWx1ZSBjb250YWlucyBjb21tYXMsIGl0IG11c3QgYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBcIi5cbiAqIC0gVGhlIGVudGlyZSBrZXktdmFsdWUgcGFpciBtdXN0IGJlIFVSTC1lbmNvZGVkLlxuICogLSBUaGUgY2xvc2luZyBwYXJlbnRoZXNpcyApIGZvciBlYWNoIHNlbGVjdG9yIG11c3QgYmUgcHJlc2VudCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8ga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gRXhhbXBsZSAxOlxuICogY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3IxKGtleTE9dmFsdWUxLGtleTI9dmFsdWUyKTtzZWxlY3RvcjIoa2V5Mz12YWx1ZTMpJztcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICogLy8gcmVzdWx0ID0+IHsgc2VsZWN0b3IxOiB7IGtleTE6IFwidmFsdWUxXCIsIGtleTI6IFwidmFsdWUyXCIgfSwgc2VsZWN0b3IyOiB7IGtleTM6IFwidmFsdWUzXCIgfSB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIEV4YW1wbGUgMjpcbiAqIGNvbnN0IGhhc2hTdHJpbmcgPSAnI3NlbGVjdG9yMShrZXkxPXZhbHVlMSxrZXkyPXZhbHVlMik7c2VsZWN0b3IyKCc7XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKTtcbiAqIC8vIHJlc3VsdCA9PiB7fVxuICogYGBgXG4gKlxuICogQHNpbmNlIDMuMzcuMFxuICogQHBhcmFtIHtzdHJpbmd9IGhhc2hTdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlLCBjb250YWluaW5nIGJyYWNrZXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIHJlc3VsdCwgd2l0aCBrZXlzIHJlcHJlc2VudGluZyB0aGUgc2VsZWN0b3JzIGFuZCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBrZXktdmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggc2VsZWN0b3IuXG4gKiAgICAgICAgICAgICAgICAgICAgLSBSZXR1cm5zIGFuIGVtcHR5IG9iamVjdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHBhcnNpbmcuICovXG5mdW5jdGlvbiBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKSB7XG5cdGNvbnN0IHNlbGVjdG9ycyA9IHt9O1xuXHQvL2NvbnN0IHNlbGVjdG9yU3RhY2sgPSBbXTtcblx0Ly9jb25zdCBrZXlWYWx1ZVN0YWNrID0gW107XG5cblx0Y29uc3QgdHJpbW1lZEhhc2hTdHJpbmcgPSBoYXNoU3RyaW5nLnRyaW0oKTtcblx0Y29uc3QgY2xlYW5lZEhhc2hTdHJpbmcgPVxuXHRcdHRyaW1tZWRIYXNoU3RyaW5nLmNoYXJBdCgwKSA9PT0gXCIjXCJcblx0XHRcdD8gdHJpbW1lZEhhc2hTdHJpbmcuc2xpY2UoMSlcblx0XHRcdDogdHJpbW1lZEhhc2hTdHJpbmc7XG5cblx0Ly9jb25zdCBzZWxlY3RvcnMgPSAoa2V5VmFsdWVTdGFjay5sZW5ndGggPiAwKSA/IHJlc3VsdFtzZWxlY3RvclN0YWNrW3NlbGVjdG9yU3RhY2subGVuZ3RoIC0gMV1dIDogcmVzdWx0O1xuXHRsZXQgY3VycmVudFNlbGVjdG9yID0gXCJcIjtcblxuXHRmdW5jdGlvbiBhZGRUb1Jlc3VsdChrZXksIHZhbHVlKSB7XG5cdFx0aWYgKGN1cnJlbnRTZWxlY3RvciAmJiBrZXkpIHtcblx0XHRcdGlmICghc2VsZWN0b3JzW2N1cnJlbnRTZWxlY3Rvcl0pIHtcblx0XHRcdFx0c2VsZWN0b3JzW2N1cnJlbnRTZWxlY3Rvcl0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3JzW2N1cnJlbnRTZWxlY3Rvcl1ba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGxldCBjdXJyZW50S2V5ID0gXCJcIjtcblx0bGV0IGN1cnJlbnRWYWx1ZSA9IFwiXCI7XG5cdGxldCBpbktleSA9IHRydWU7XG5cdGxldCBpblZhbHVlID0gZmFsc2U7XG5cdGxldCBpblF1b3RlZFZhbHVlID0gZmFsc2U7XG5cdGxldCBpblNlbGVjdG9yID0gdHJ1ZTtcblx0bGV0IGVzY2FwZWQgPSBmYWxzZTtcblx0bGV0IHF1b3RlZFZhbHVlU3RhcnRDaGFyID0gXCJcIjtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNsZWFuZWRIYXNoU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgYyA9IGNsZWFuZWRIYXNoU3RyaW5nW2ldO1xuXHRcdGNvbnN0IG5leHRDaGFyID0gY2xlYW5lZEhhc2hTdHJpbmc/LltpICsgMV07XG5cblx0XHRpZiAoYyA9PT0gXCJcXFxcXCIgJiYgIWVzY2FwZWQpIHtcblx0XHRcdGVzY2FwZWQgPSB0cnVlO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKGVzY2FwZWQpIHtcblx0XHRcdGlmIChpblNlbGVjdG9yKSB7XG5cdFx0XHRcdGN1cnJlbnRTZWxlY3RvciArPSBjO1xuXHRcdFx0fSBlbHNlIGlmIChpbktleSkge1xuXHRcdFx0XHRjdXJyZW50S2V5ICs9IGM7XG5cdFx0XHR9IGVsc2UgaWYgKGluVmFsdWUpIHtcblx0XHRcdFx0Y3VycmVudFZhbHVlICs9IGM7XG5cdFx0XHR9XG5cdFx0XHRlc2NhcGVkID0gZmFsc2U7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoaW5RdW90ZWRWYWx1ZSAmJiBxdW90ZWRWYWx1ZVN0YXJ0Q2hhciAhPT0gYykge1xuXHRcdFx0aWYgKGluU2VsZWN0b3IpIHtcblx0XHRcdFx0Y3VycmVudFNlbGVjdG9yICs9IGM7XG5cdFx0XHR9IGVsc2UgaWYgKGluS2V5KSB7XG5cdFx0XHRcdGN1cnJlbnRLZXkgKz0gYztcblx0XHRcdH0gZWxzZSBpZiAoaW5WYWx1ZSkge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgKz0gYztcblx0XHRcdH1cblxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKGMgPT09IFwiO1wiICYmIGluU2VsZWN0b3IpIHtcblx0XHRcdGluU2VsZWN0b3IgPSB0cnVlO1xuXHRcdFx0Y3VycmVudFNlbGVjdG9yID0gXCJcIjtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChpblNlbGVjdG9yID09PSB0cnVlICYmIGMgIT09IFwiKFwiKSB7XG5cdFx0XHRjdXJyZW50U2VsZWN0b3IgKz0gYztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChjID09PSBcIihcIiAmJiBpblNlbGVjdG9yKSB7XG5cdFx0XHRpblNlbGVjdG9yID0gZmFsc2U7XG5cdFx0XHRpbktleSA9IHRydWU7XG5cblx0XHRcdGN1cnJlbnRLZXkgPSBcIlwiO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKGluS2V5ID09PSB0cnVlICYmIGMgIT09IFwiPVwiKSB7XG5cdFx0XHRjdXJyZW50S2V5ICs9IGM7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoYyA9PT0gXCI9XCIgJiYgaW5LZXkpIHtcblx0XHRcdGluS2V5ID0gZmFsc2U7XG5cdFx0XHRpblZhbHVlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKG5leHRDaGFyID09PSAnXCInIHx8IG5leHRDaGFyID09PSBcIidcIikge1xuXHRcdFx0XHRpblF1b3RlZFZhbHVlID0gdHJ1ZTtcblx0XHRcdFx0cXVvdGVkVmFsdWVTdGFydENoYXIgPSBuZXh0Q2hhcjtcblx0XHRcdFx0aSsrO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudFZhbHVlID0gXCJcIjtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChpblZhbHVlID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoaW5RdW90ZWRWYWx1ZSkge1xuXHRcdFx0XHRpZiAoYyA9PT0gcXVvdGVkVmFsdWVTdGFydENoYXIpIHtcblx0XHRcdFx0XHRpblF1b3RlZFZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50VmFsdWUgKz0gYztcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjID09PSBcIixcIikge1xuXHRcdFx0XHRpblZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdGluS2V5ID0gdHJ1ZTtcblx0XHRcdFx0Y29uc3QgZGVjb2RlZEN1cnJlbnRWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChjdXJyZW50VmFsdWUpO1xuXHRcdFx0XHRhZGRUb1Jlc3VsdChjdXJyZW50S2V5LCBkZWNvZGVkQ3VycmVudFZhbHVlKTtcblx0XHRcdFx0Y3VycmVudEtleSA9IFwiXCI7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IFwiXCI7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYyA9PT0gXCIpXCIpIHtcblx0XHRcdFx0aW5WYWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHQvL2luS2V5ID0gdHJ1ZTtcblx0XHRcdFx0aW5TZWxlY3RvciA9IHRydWU7XG5cblx0XHRcdFx0Y29uc3QgZGVjb2RlZEN1cnJlbnRWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChjdXJyZW50VmFsdWUpO1xuXHRcdFx0XHRhZGRUb1Jlc3VsdChjdXJyZW50S2V5LCBkZWNvZGVkQ3VycmVudFZhbHVlKTtcblx0XHRcdFx0Y3VycmVudEtleSA9IFwiXCI7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IFwiXCI7XG5cdFx0XHRcdGN1cnJlbnRTZWxlY3RvciA9IFwiXCI7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50VmFsdWUgKz0gYztcblxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGluU2VsZWN0b3IpIHtcblx0XHRyZXR1cm4gc2VsZWN0b3JzO1xuXHR9XG5cblx0cmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIHNlbGVjdG9yIHN0cmluZyBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCBjb250YWluaW5nIHNlbGVjdG9ycyBhbmQga2V5LXZhbHVlIHBhaXJzLlxuICogQHBhcmFtIHtib29sZWFufSBhZGRIYXNoUHJlZml4IC0gV2hldGhlciB0byBhZGQgdGhlIGhhc2ggcHJlZml4ICMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGFzaCBzZWxlY3RvciBzdHJpbmcuXG4gKiBAc2luY2UgMy4zNy4wXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJyYWNrZXRlZEtleVZhbHVlSGFzaChvYmplY3QsIGFkZEhhc2hQcmVmaXggPSB0cnVlKSB7XG5cdGlmICghb2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFkZEhhc2hQcmVmaXggPyBcIiNcIiA6IFwiXCI7XG5cdH1cblxuXHRsZXQgaGFzaFN0cmluZyA9IFwiXCI7XG5cblx0ZnVuY3Rpb24gZW5jb2RlS2V5VmFsdWUoa2V5LCB2YWx1ZSkge1xuXHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcblx0fVxuXG5cdGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gb2JqZWN0KSB7XG5cdFx0aWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShzZWxlY3RvcikpIHtcblx0XHRcdGNvbnN0IGtleVZhbHVlUGFpcnMgPSBvYmplY3Rbc2VsZWN0b3JdO1xuXHRcdFx0bGV0IHNlbGVjdG9yU3RyaW5nID0gc2VsZWN0b3I7XG5cdFx0XHRsZXQga2V5VmFsdWVTdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBrZXlWYWx1ZVBhaXJzKSB7XG5cdFx0XHRcdGlmIChrZXlWYWx1ZVBhaXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IGtleVZhbHVlUGFpcnNba2V5XTtcblx0XHRcdFx0XHRrZXlWYWx1ZVN0cmluZyArPSBrZXlWYWx1ZVN0cmluZy5sZW5ndGggPT09IDAgPyBcIlwiIDogXCIsXCI7XG5cdFx0XHRcdFx0a2V5VmFsdWVTdHJpbmcgKz0gZW5jb2RlS2V5VmFsdWUoa2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGtleVZhbHVlU3RyaW5nLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0c2VsZWN0b3JTdHJpbmcgKz0gXCIoXCIgKyBrZXlWYWx1ZVN0cmluZyArIFwiKVwiO1xuXHRcdFx0XHRoYXNoU3RyaW5nICs9IGhhc2hTdHJpbmcubGVuZ3RoID09PSAwID8gXCJcIiA6IFwiO1wiO1xuXHRcdFx0XHRoYXNoU3RyaW5nICs9IHNlbGVjdG9yU3RyaW5nO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhZGRIYXNoUHJlZml4ID8gXCIjXCIgKyBoYXNoU3RyaW5nIDogaGFzaFN0cmluZztcbn1cbiIsICIvLyB0ZXN0LmpzXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIjtcbmltcG9ydCB7XG4gICAgcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2gsXG4gICAgY3JlYXRlQnJhY2tldGVkS2V5VmFsdWVIYXNoXG59IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdGV4dC9icmFja2V0ZWQta2V5LXZhbHVlLWhhc2gubWpzXCI7XG5cbmRlc2NyaWJlKFwicGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2hcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIGFuIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gXCJcIjtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7fTtcbiAgICAgICAgZXhwZWN0KHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGlucHV0KSkudG8uZGVlcC5lcXVhbChleHBlY3RlZFJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBwYXJzZSBhIHNpbmdsZSBzZWxlY3RvciB3aXRoIG9uZSBrZXktdmFsdWUgcGFpclwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gXCIjc2VsZWN0b3IxKGtleTE9dmFsdWUxKVwiO1xuICAgICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHtcbiAgICAgICAgICAgIHNlbGVjdG9yMToge1xuICAgICAgICAgICAgICAgIGtleTE6IFwidmFsdWUxXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBleHBlY3QocGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaW5wdXQpKS50by5kZWVwLmVxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHBhcnNlIG11bHRpcGxlIHNlbGVjdG9ycyB3aXRoIG11bHRpcGxlIGtleS12YWx1ZSBwYWlyc1wiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gXCIjc2VsZWN0b3IxKGtleTE9dmFsdWUxLGtleTI9dmFsdWUyKTtzZWxlY3RvcjIoa2V5Mz12YWx1ZTMsa2V5ND12YWx1ZTQpXCI7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge1xuICAgICAgICAgICAgc2VsZWN0b3IxOiB7XG4gICAgICAgICAgICAgICAga2V5MTogXCJ2YWx1ZTFcIixcbiAgICAgICAgICAgICAgICBrZXkyOiBcInZhbHVlMlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbGVjdG9yMjoge1xuICAgICAgICAgICAgICAgIGtleTM6IFwidmFsdWUzXCIsXG4gICAgICAgICAgICAgICAga2V5NDogXCJ2YWx1ZTRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGV4cGVjdChwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChpbnB1dCkpLnRvLmRlZXAuZXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgZGVjb2RlIFVSTC1lbmNvZGVkIHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gXCIjc2VsZWN0b3IxKGtleTE9dmFsdWUxJTJDd2l0aCUyMGNvbW1hKVwiO1xuICAgICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHtcbiAgICAgICAgICAgIHNlbGVjdG9yMToge1xuICAgICAgICAgICAgICAgIGtleTE6IFwidmFsdWUxLHdpdGggY29tbWFcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGlucHV0KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5zZWxlY3RvcjEua2V5MSkudG8uZXF1YWwoZXhwZWN0ZWRSZXN1bHQuc2VsZWN0b3IxLmtleTEpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGlucHV0IHdpdGhvdXQgYSBsZWFkaW5nIGhhc2hcIiwgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IFwic2VsZWN0b3IxKGtleTE9dmFsdWUxKVwiO1xuICAgICAgICBjb25zdCBleHBlY3RlZFJlc3VsdCA9IHtcbiAgICAgICAgICAgIHNlbGVjdG9yMToge1xuICAgICAgICAgICAgICAgIGtleTE6IFwidmFsdWUxXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBleHBlY3QocGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaW5wdXQpKS50by5kZWVwLmVxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIGludmFsaWQgaW5wdXRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IFwiI3NlbGVjdG9yMShrZXkxPXZhbHVlMSxrZXkyXCI7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0ge307XG4gICAgICAgIGV4cGVjdChwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChpbnB1dCkpLnRvLmRlZXAuZXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBhbiBlbXB0eSBpbnB1dCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaGFzaFN0cmluZyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBhbiBpbnZhbGlkIGlucHV0IHN0cmluZycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjaW52YWxpZCc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSBzaW1wbGUgaW5wdXQgc3RyaW5nIHdpdGggb25lIHNlbGVjdG9yIGFuZCBvbmUga2V5LXZhbHVlIHBhaXInLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnI3NlbGVjdG9yKGtleT12YWx1ZSknO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7c2VsZWN0b3I6IHtrZXk6ICd2YWx1ZSd9fSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGFuIGlucHV0IHN0cmluZyB3aXRoIG11bHRpcGxlIHNlbGVjdG9ycyBhbmQga2V5LXZhbHVlIHBhaXJzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoU3RyaW5nID0gJyNzZWxlY3RvcjEoa2V5MT12YWx1ZTEpO3NlbGVjdG9yMihrZXkyPXZhbHVlMiknO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7c2VsZWN0b3IxOiB7a2V5MTogJ3ZhbHVlMSd9LCBzZWxlY3RvcjI6IHtrZXkyOiAndmFsdWUyJ319KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IHZhbHVlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3Ioa2V5MT0sa2V5Mj0pJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaGFzaFN0cmluZyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe3NlbGVjdG9yOiB7a2V5MTogJycsIGtleTI6ICcnfX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcGVyY2VudC1lbmNvZGVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3Ioa2V5MT12YWx1ZSUyMDEsa2V5Mj12YWx1ZSUyQzIpJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaGFzaFN0cmluZyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe3NlbGVjdG9yOiB7a2V5MTogJ3ZhbHVlIDEnLCBrZXkyOiAndmFsdWUsMid9fSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkb3VibGUtcXVvdGVkIHZhbHVlcyB3aXRoIGNvbW1hcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3Ioa2V5MT1cInZhbHVlLDFcIixrZXkyPVwidmFsdWUsMlwiKSc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHtzZWxlY3Rvcjoge2tleTE6ICd2YWx1ZSwxJywga2V5MjogJ3ZhbHVlLDInfX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpZ25vcmUgbGVhZGluZyBoYXNoIHN5bWJvbCAoIyknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnc2VsZWN0b3Ioa2V5PXZhbHVlKSc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHtzZWxlY3Rvcjoge2tleTogJ3ZhbHVlJ319KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlIHNwYWNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoU3RyaW5nID0gJyAgI3NlbGVjdG9yKGtleT12YWx1ZSkgICc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHtzZWxlY3Rvcjoge2tleTogJ3ZhbHVlJ319KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgaW5wdXQgc3RyaW5nIGVuZHMgcHJlbWF0dXJlbHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnI3NlbGVjdG9yKGtleT12YWx1ZSc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCBpZiBhIHNlbGVjdG9yIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnIyhrZXk9dmFsdWUpJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaGFzaFN0cmluZyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGlmIGEga2V5IGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnI3NlbGVjdG9yKD12YWx1ZSknO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7fSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgaWZhIHZhbHVlIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hTdHJpbmcgPSAnI3NlbGVjdG9yKGtleT0pJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaGFzaFN0cmluZyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgc2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICBrZXk6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgaWYgdGhlcmUgaXMgbm8gY2xvc2luZyBwYXJlbnRoZXNpcyBmb3IgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3Ioa2V5PXZhbHVlOyc7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGhhc2hTdHJpbmcpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCBpZiB0aGVyZSBpcyBubyBzZW1pY29sb24gYWZ0ZXIgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZyA9ICcjc2VsZWN0b3Ioa2V5PXZhbHVlKXNlbGVjdG9yMihrZXkyPXZhbHVlMiknO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUJyYWNrZXRlZEtleVZhbHVlSGFzaChoYXNoU3RyaW5nKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgICBzZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxlY3RvcjI6IHtcbiAgICAgICAgICAgICAgICBrZXkyOiAndmFsdWUyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZUJyYWNrZXRlZEtleVZhbHVlSGFzaCcsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gaGFzaCBzdHJpbmcgZm9yIGEgc2ltcGxlIG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAgICAgICAgICcuZXhhbXBsZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogJ3JlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmb250LXNpemUnOiAnMTRweCdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICcub3RoZXInOiB7XG4gICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kJzogJ2JsdWUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGlucHV0KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoXCIjLmV4YW1wbGUoY29sb3I9cmVkLGZvbnQtc2l6ZT0xNHB4KTsub3RoZXIoYmFja2dyb3VuZD1ibHVlKVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHVybC1lbmNvZGVkIGhhc2ggc3RyaW5nIGZvciBhIHNpbXBsZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgICAgICAgICAgICAnLmV4YW1wbGUnOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb2xvcic6ICdyXCJlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmb250LXNpemUnOiAnMTRweCdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICcub3RoZXInOiB7XG4gICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kJzogJ2JsdWUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlQnJhY2tldGVkS2V5VmFsdWVIYXNoKGlucHV0LCB0cnVlKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoXCIjLmV4YW1wbGUoY29sb3I9ciUyMmVkLGZvbnQtc2l6ZT0xNHB4KTsub3RoZXIoYmFja2dyb3VuZD1ibHVlKVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaW5wdXQsZmFsc2UpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChcIlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIGFuIGVtcHR5IG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge307XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVCcmFja2V0ZWRLZXlWYWx1ZUhhc2goaW5wdXQsZmFsc2UpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChcIlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgIH0pO1xuXG5cbn0pO1xuIiwgIi8qKiBub2RlanMgZG9lc250IHN1cHBvcnQgd2luZG93LmNyeXB0ICovXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnTWF0aCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCByYW5kb20gPSAoKSA9PiB7fVxuICAgIFxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmICghZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL21hdGgvcmFuZG9tLm1qc1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgcmFuZG9tID0gbS5yYW5kb207XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkpXG5cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcucmFuZG9tKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2EgZ3JlYXRlciBiIHNob3VsZCB0aHJvdyBlcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gcmFuZG9tKDEwLCAyKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHIgPSByYW5kb20oKTtcbiAgICAgICAgICAgIGV4cGVjdChyKS50aGF0LmlzLmEoJ251bWJlcicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHJhbmRvbSg1LCA2KSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCB0aHJvdyBFcnJvciB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiByYW5kb20oLTk5OTk5OTk5OSwgOTk5OTk5OTk5OTk5OTk5OTk5OTkpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcgc2hvdWxkIHRocm93IEVycm9yIHdlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgciA9IHJhbmRvbShhLCBiKTtcblxuICAgICAgICAgICAgICAgIGl0KHIgKyAnIHNob3VsZCByZXR1cm4gdmFsdWUgYmV0d2VlbiAnICsgYSArICcgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPj0gYSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPD0gYikudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCByb3VuZHMgPSA1MDBcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSByb3VuZHM7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcmFuZG9tKGEsIGIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdmcgPSBzdW0gLyByb3VuZHM7XG5cbiAgICAgICAgICAgICAgICBpdChhdmcgKyAnIHNob3VsZCBiZXR3ZWVuICcgKyBhICsgJyAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnID4gYSkudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnIDwgYikudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG5cbn0pIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge3RyaW1TcGFjZXN9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdXRpbC90cmltc3BhY2VzLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCd0cmltU3BhY2VzJywgZnVuY3Rpb24gKCkge1xuICAgIFtcbiAgICAgICAgLy8gb25lIHN0cm9rZSBpcyBlc2NwZWQgYnkgdGhlIGphdmFzY3JpcHQgaW50ZXJwcmV0ZXIsIHRoZSBzZWNvbmQgc3Ryb2tlIGVzY2FwZXMgdGhlIHN0cm9rZVxuICAgICAgICBbJyB2YWx1ZSAnLCAndmFsdWUnXSxcbiAgICAgICAgWycgdmFsdWVcXFxcICcsICd2YWx1ZVxcXFwgJ10sXG4gICAgICAgIFsnXFxcXCB2YWx1ZVxcXFwgJywgJ1xcXFwgdmFsdWVcXFxcICddLFxuICAgICAgICBbJ1xcIHZhbHVlXFwgJywgJ3ZhbHVlJ10sICAgXG4gICAgICAgIFtcIiAgIHZhbHVlIFxcIFwiLCAndmFsdWUnXSwgXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgIGl0KCd0cmltU3BhY2VzKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGIpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QodHJpbVNwYWNlcyhhKSkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4gICAgIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Byb2Nlc3Npbmd9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdXRpbC9wcm9jZXNzaW5nLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdQcm9jZXNzaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBtYW55IGZ1bmN0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHQgPSArbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVzaXJlZERlbGF5ID0gMjAwO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KGRlc2lyZWREZWxheSsxMDApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBkZWxheSAxMiBcbiAgICAgICAgICAgIG5ldyBQcm9jZXNzaW5nKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfSwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9LCBkZXNpcmVkRGVsYXksZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0pLnJ1bigndGVzdCcpLnRoZW4oKHYpID0+IHtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChjb3VudGVyKS50by5iZS5lcXVhbCg0KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHYgPT09ICd0ZXN0JykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZGVsYXlcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCtuZXcgRGF0ZSgpID4gdCArIGRlc2lyZWREZWxheSsxKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIG9uZSBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSkucnVuKCd0ZXN0JykudGhlbigodikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2ID09PSAndGVzdCcpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBubyBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKS5ydW4oJ3Rlc3QnKS50aGVuKCh2KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodiA9PT0gJ3Rlc3QnKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZSBuZXcgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZygpKS50by5iZS5hKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBQcm9jZXNzaW5nKHRydWUpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgUHJvY2Vzc2luZyhcInRlc3RcIikpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSk7IiwgImltcG9ydCB7RGVhZE1hbnNTd2l0Y2h9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdXRpbC9kZWFkbWFuc3N3aXRjaC5tanNcIjtcblxuXG5kZXNjcmliZSgnRGVhZE1hbnNTd2l0Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgncnVuIGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgbXMxID0gIERhdGUubm93KCk7XG5cbiAgICAgICAgICAgIG5ldyBEZWFkTWFuc1N3aXRjaCgxMDAsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1zMiA9ICBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IG1zMiAtIG1zMTtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCd0byBzaG9ydCAnICsgZGlmZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZSBhbmQgdG91Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4nLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBtczEgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICBjb25zdCBkZWFkbWFuc3N3aXRjaCA9IG5ldyBEZWFkTWFuc1N3aXRjaCgxMDAsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1zMiA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbXMyIC0gbXMxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1zMSA+IG1zMikge1xuICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcigndGltaW5nIGVycm9yJykpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPCA2MDApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoJ3RvIHNob3J0ICcgKyBkaWZmKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgLy8gICAwIG1zOiBpbml0KCkgLT4gd2FpdCAxMDAgbXMgXG4gICAgICAgICAgICAvLyAgNTAgbXM6IHRvdWNoKCkgLT4gd2FpdCAxMDAgbXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIC0+IHdhaXQgMTAwXG4gICAgICAgICAgICAvLyAxMDAgbXM6IHRvdWNoKDUwMCkgLT4gd2FpdCA1MDAgbXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIC0+IHdhaXQgNTAwXG4gICAgICAgICAgICAvLyA2MDAgbXM6IGV4ZWN1dGUgY2FsbGJhY2tcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYWRtYW5zc3dpdGNoLnRvdWNoKClcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWFkbWFuc3N3aXRjaC50b3VjaCg1MDApXG4gICAgICAgICAgICAgICAgfSwgNTApXG5cbiAgICAgICAgICAgIH0sIDUwKVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pOyIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuXG5leHBvcnQgeyBDb21wYXJhdG9yIH07XG5cbi8qKlxuICogVGhlIGNvbXBhcmF0b3IgYWxsb3dzIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSBhYnN0cmFjdGVkLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBjbGFzcy5cbiAqXG4gKiBgYGBcbiAqIG5ldyBDb21wYXJhdG9yKCkubGVzc1RoYW5PckVxdWFsKDIsIDUpIC8vIFx1MjFBNiB0cnVlXG4gKiBuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuKDQsIDIpIC8vIFx1MjFBNiB0cnVlXG4gKiBuZXcgQ29tcGFyYXRvcigpLmVxdWFsKDQsIDQpIC8vIFx1MjFBNiB0cnVlXG4gKiBuZXcgQ29tcGFyYXRvcigpLmVxdWFsKDQsIDUpIC8vIFx1MjFBNiBmYWxzZVxuICogYGBgXG4gKlxuICogWW91IGNhbiBhbHNvIHBhc3MgeW91ciBvd24gY29tcGFyaXNvbiBmdW5jdGlvbiwgYW5kIHRodXMgZGVmaW5lIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIGBgYFxuICogbmV3IENvbXBhcmF0b3IoZnVuY3Rpb24gKGEsIGIpIHtcbiAqICAgICAgaWYgKGEudiA9PT0gYi52KSByZXR1cm4gMDtcbiAqICAgICAgICAgcmV0dXJuIGEudiA8IGIudiA/IC0xIDogMTtcbiAqICAgICAgfSkuZXF1YWwoe3Y6IDJ9LCB7djogMn0pOyAgLy8gXHUyMUE2IHRydWVcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlL2NvbXBhcmF0b3Ivc2ltcGxlLyBTaW1wbGUgZXhhbXBsZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4zLjBcbiAqL1xuY2xhc3MgQ29tcGFyYXRvciBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICogY3JlYXRlIG5ldyBjb21wYXJhdG9yXG5cdCAqXG5cdCAqIEBwYXJhbSB7TW9uc3Rlci5VdGlsfmV4YW1wbGVDYWxsYmFja30gW2NhbGxiYWNrXSBDb21wYXJhdG9yIGNhbGxiYWNrXG5cdCAqIEB0aHJvdyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG5cdCAqIEB0aHJvdyB7VHlwZUVycm9yfSBpbXByYWN0aWNhbCBjb21wYXJpc29uXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRcdHRoaXMuY29tcGFyZSA9IGNhbGxiYWNrO1xuXHRcdH0gZWxzZSBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGVcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGRlZmF1bHQgY29tcGFyZSBmdW5jdGlvblxuXG5cdFx0XHQvKipcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0geyp9IGFcblx0XHRcdCAqIEBwYXJhbSB7Kn0gYlxuXHRcdFx0ICogQHJldHVybiB7aW50ZWdlcn0gLTEsIDAgb3IgMVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcImltcHJhY3RpY2FsIGNvbXBhcmlzb25cIiwgXCJ0eXBlcy9jb21wYXJhdG9yLm1qc1wiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChhID09PSBiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGEgPCBiID8gLTEgOiAxO1xuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdG9yc1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtDb21wYXJhdG9yfVxuXHQgKi9cblx0cmV2ZXJzZSgpIHtcblx0XHRjb25zdCBvcmlnaW5hbCA9IHRoaXMuY29tcGFyZTtcblx0XHR0aGlzLmNvbXBhcmUgPSAoYSwgYikgPT4gb3JpZ2luYWwoYiwgYSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHR3byB2YXJpYWJsZXMgYXJlIGVxdWFsLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGFcblx0ICogQHBhcmFtIHsqfSBiXG5cdCAqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRlcXVhbChhLCBiKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29tcGFyZShhLCBiKSA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdmFyaWFibGUgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmBcblx0ICpcblx0ICogQHBhcmFtIHsqfSBhXG5cdCAqIEBwYXJhbSB7Kn0gYlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0Z3JlYXRlclRoYW4oYSwgYikge1xuXHRcdHJldHVybiB0aGlzLmNvbXBhcmUoYSwgYikgPiAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB2YXJpYWJsZSBgYWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBiYFxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGFcblx0ICogQHBhcmFtIHsqfSBiXG5cdCAqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRncmVhdGVyVGhhbk9yRXF1YWwoYSwgYikge1xuXHRcdHJldHVybiB0aGlzLmdyZWF0ZXJUaGFuKGEsIGIpIHx8IHRoaXMuZXF1YWwoYSwgYik7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHZhcmlhYmxlIGBhYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGJgXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYVxuXHQgKiBAcGFyYW0geyp9IGJcblx0ICpcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGxlc3NUaGFuT3JFcXVhbChhLCBiKSB7XG5cdFx0cmV0dXJuIHRoaXMubGVzc1RoYW4oYSwgYikgfHwgdGhpcy5lcXVhbChhLCBiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdmFyaWFibGUgYSBpcyBsZXNzIHRoYW4gYlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGFcblx0ICogQHBhcmFtIHsqfSBiXG5cdCAqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRsZXNzVGhhbihhLCBiKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29tcGFyZShhLCBiKSA8IDA7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIG9wZXJhdG9yXG4gKlxuICogYGBgXG4gKiBuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoYSwgYikge1xuICogICAgICBpZiAoYS52ID09PSBiLnYpIHJldHVybiAwO1xuICogICAgICAgICByZXR1cm4gYS52IDwgYi52ID8gLTEgOiAxO1xuICogICAgICB9KS5lcXVhbCh7djogMn0sIHt2OiAyfSk7ICAvLyBcdTIxQTYgdHJ1ZVxuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuVXRpbH5leGFtcGxlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtpbnRlZ2VyfSAtMSwgMCBvciAxXG4gKiBAc2VlIE1vbnN0ZXIuVXRpbC5Db21wYXJhdG9yXG4gKi9cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtDb21wYXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3V0aWwvY29tcGFyYXRvci5tanNcIjtcblxuXG5kZXNjcmliZSgnQ29tcGFyYXRvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUgbmV3IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29tcGFyYXRvciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29tcGFyYXRvciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgfSkpLnRvLmJlLmEoJ29iamVjdCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29tcGFyYXRvcih0cnVlKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBUeXBlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IENvbXBhcmF0b3IoXCJ0ZXN0XCIpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXF1YWwoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs1LjEsIDUuMSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgWy00LCAtNCwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY29tcGFyZSAnICsgYSArICcgYW5kICcgKyBiICsgJyByZXR1cm4gJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5lcXVhbChhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2VxdWFsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIDVdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIG51bGxdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIHBhcnNlSW50KFwiYVwiKV0sXG4gICAgICAgICAgICBbZmFsc2UsIDVdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgbnVsbF0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IENvbXBhcmF0b3IoKS5lcXVhbChhLCBiKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dyZWF0ZXJUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncmV2ZXJzZSgpLmdyZWF0ZXJUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLnJldmVyc2UoKS5ncmVhdGVyVGhhbihhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dyZWF0ZXJUaGFuT3JFcXVhbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBcInRlc3RcIiwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUuMSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgWy00LCAtNCwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuT3JFcXVhbChhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xlc3NUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmxlc3NUaGFuKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnRhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5sZXNzVGhhbk9yRXF1YWwoMiwgNSkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5ncmVhdGVyVGhhbig0LCAyKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmVxdWFsKDQsIDQpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIHdpdGggb3duIGZ1bmN0aW9uIC4uLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIGlmIChhLnYgPT09IGIudikgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEudiA8IGIudiA/IC0xIDogMTtcbiAgICAgICAgICAgIH0pLmVxdWFsKHt2OiAyfSwge3Y6IDJ9KSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbGVzc1RoYW5PckVxdWFsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCB0cnVlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIC00LCB0cnVlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkubGVzc1RoYW5PckVxdWFsKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IHZhbGlkYXRlT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBkZWVwRnJlZXplIH07XG5cbi8qKlxuICogRGVlcCBmcmVlemUgYSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IG9iamVjdCB0byBiZSBmcmVlemVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmplY3QpIHtcblx0dmFsaWRhdGVPYmplY3Qob2JqZWN0KTtcblxuXHQvLyBSZXRyaWV2ZSB0aGUgZGVmaW5lZCBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgb2JqZWN0XG5cdGxldCBwcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuXG5cdC8vIEZyZWV6ZSBwcm9wZXJ0aWVzIGJlZm9yZSBmcmVlemluZyB5b3Vyc2VsZlxuXHRmb3IgKGNvbnN0IG5hbWUgb2YgcHJvcE5hbWVzKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBvYmplY3RbbmFtZV07XG5cblx0XHRvYmplY3RbbmFtZV0gPVxuXHRcdFx0dmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiID8gZGVlcEZyZWV6ZSh2YWx1ZSkgOiB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QuZnJlZXplKG9iamVjdCk7XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZGVlcEZyZWV6ZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS91dGlsL2ZyZWV6ZS5tanNcIjtcblxuXG5kZXNjcmliZSgnZGVlcEZyZWV6ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdkZWVwRnJlZXplIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGZyZWV6ZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmoxID0ge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzoxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgb2JqMiA9IHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6MlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXhwZWN0KG9iajIpLnRvLm5vdC5lcWwob2JqMSlcbiAgICAgICAgICAgIG9iajEuYS5iLmMgPSAyO1xuICAgICAgICAgICAgZXhwZWN0KG9iajIpLnRvLmVxbChvYmoxKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JqMUZyZWV6ZWQgPSBkZWVwRnJlZXplKG9iajEpO1xuXG4gICAgICAgICAgICBleHBlY3Qob2JqMikudG8uZXFsKG9iajFGcmVlemVkKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZnJlZXplXG4gICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIHRvIHRoZSBvYmplY3QsIGV4Y2VwdGlvbiBkZXBlbmRzIG9uIG1vZGUgKHN0cmljdCBFUyAyMDE1LCBldGMpXG4gICAgICAgICAgICAgICAgb2JqMUZyZWV6ZWQuYS5iLmMgPSAzICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4cGVjdChvYmoyKS50by5lcWwob2JqMUZyZWV6ZWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtjbG9uZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS91dGlsL2Nsb25lLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ0Nsb25lJywgZnVuY3Rpb24gKCkge1xuXG4gICAgY2xhc3MgQSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGIpIHtcbiAgICAgICAgICAgIHRoaXMuYiA9IGJcbiAgICAgICAgfVxuXG4gICAgICAgIGEoKSB7XG5cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjbGFzcyBCIHtcbiAgICAgICAgY29uc3RydWN0b3IoYikge1xuICAgICAgICAgICAgdGhpcy5iID0gYlxuICAgICAgICB9XG5cbiAgICAgICAgYSgpIHtcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBnZXRDbG9uZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkRPTkVcIlxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cblxuICAgIGRlc2NyaWJlKCcuY2xvbmUoQikgd2l0aCBnZXRDbG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJy5jbG9uZShCKSBzaG91bGQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGIgPSBuZXcgQih7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICB5OiAxLCBkOiBuZXcgQSgxKSwgejogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgciA9IGNsb25lKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGIpLnRvLmJlLmluc3RhbmNlT2YoQilcbiAgICAgICAgICAgIGV4cGVjdChyKS5ub3QuZXF1YWwoYik7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkocikpLmVxdWFsKEpTT04uc3RyaW5naWZ5KCdET05FJykpO1xuXG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgXG4gICAgZGVzY3JpYmUoJy5jbG9uZShBKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJy5jbG9uZShBKSBzaG91bGQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGEgPSBuZXcgQSh7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICB5OiAxLCBkOiBuZXcgQSgxKSwgejogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLmluc3RhbmNlT2YoQSlcbiAgICAgICAgICAgIGV4cGVjdChiKS50by5iZS5pbnN0YW5jZU9mKEEpXG4gICAgICAgICAgICBleHBlY3QoYikubm90LmVxdWFsKGEpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGEpKS5lcXVhbChKU09OLnN0cmluZ2lmeShiKSk7XG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIC8vIG5vZGVqcyBkb2VzIG5vdCBoYXZlIGEgRE9NXG4gICAgaWYgKHR5cGVvZiBEb2N1bWVudEZyYWdtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGRlc2NyaWJlKCcuY2xvbmUoRG9jdW1lbnRGcmFnbWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnLmNsb25lKERvY3VtZW50RnJhZ21lbnQpIHNob3VsZCBzYW1lIERvY3VtZW50RnJhZ21lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoYikuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBkZXNjcmliZSgnLmNsb25lKG51bGwpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0eXBlb2YgbnVsbCByZXN1bHRzIGluICdvYmplY3QnLiAgaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTMvMTAvdHlwZW9mLW51bGwuaHRtbFxuICAgICAgICBpdCgnLmNsb25lKG51bGwpIHNob3VsZCAgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gbnVsbFxuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdChiKS5lcXVhbChhKTtcbiAgICAgICAgICAgIGV4cGVjdChiKS50by5iZS5udWxsO1xuICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLm51bGw7XG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnLmNsb25lKHVuZGVmaW5lZCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcuY2xvbmUodW5kZWZpbmVkKSBzaG91bGQgIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGEgPT09IGIpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgYiA9PT0gJ3VuZGVmaW5lZCcpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdChhID09PSB1bmRlZmluZWQpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdChiID09PSB1bmRlZmluZWQpLnRvLmJlLnRydWVcbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcuY2xvbmUob2JqZWN0KScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnLmNsb25lKHt9KSBzaG91bGQgIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0ge31cbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGIgPT09ICdvYmplY3QnKS50by5iZS50cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuY2xvbmUoe3g6MX0pIHNob3VsZCAgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGEgPSB7eDogMX1cbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QoYS54KS5pcy5lcXVhbChiLngpXG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgZGVzY3JpYmUoJy5jbG9uZShmdW5jdGlvbiknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJy5jbG9uZShmdW5jdGlvbikgc2hvdWxkICBmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgYiA9PT0gJ2Z1bmN0aW9uJykudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnLmNsb25lKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsICdzdHJpbmcnXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsICd1bmRlZmluZWQnXSxcbiAgICAgICAgICAgIFtudWxsLCAnb2JqZWN0J10sIC8vIHR5cGVvZiBudWxsIHJlc3VsdHMgaW4gJ29iamVjdCcuICBodHRwczovLzJhbGl0eS5jb20vMjAxMy8xMC90eXBlb2YtbnVsbC5odG1sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgJ2Z1bmN0aW9uJ10sXG4gICAgICAgICAgICBbMiwgJ251bWJlciddLFxuICAgICAgICAgICAgW2ZhbHNlLCAnYm9vbGVhbiddLFxuICAgICAgICAgICAgW3RydWUsICdib29sZWFuJ10sXG4gICAgICAgICAgICBbNC41LCAnbnVtYmVyJ10sXG4gICAgICAgICAgICBbe30sICdvYmplY3QnXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sICdvYmplY3QnXSwgLy8gYXJyYXkgaXN0IGF1Y2ggdHlwZSBvYmplY3RcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksICdzeW1ib2wnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgIGl0KCcuY2xvbmUoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkICAnICsgYiArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBjID0gY2xvbmUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBjKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KTtcblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXIubWpzXCI7XG5pbXBvcnQgeyBMb2dFbnRyeSB9IGZyb20gXCIuLi9sb2dlbnRyeS5tanNcIjtcbmltcG9ydCB7IFRSQUNFLCBXQVJOLCBERUJVRywgRVJST1IsIEZBVEFMLCBJTkZPIH0gZnJvbSBcIi4uL2xvZ2dlci5tanNcIjtcblxuZXhwb3J0IHsgQ29uc29sZUhhbmRsZXIgfTtcblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIHNpbXBseSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5Mb2dnaW5nLkhhbmRsZXIuQ29uc29sZUhhbmRsZXIoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmNsYXNzIENvbnNvbGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7XG5cdC8qKlxuXHQgKiBUaGlzIGlzIHRoZSBjZW50cmFsIGxvZyBmdW5jdGlvbi4gdGhpcyBtZXRob2QgbXVzdCBiZVxuXHQgKiBvdmVyd3JpdHRlbiBieSBkZXJpdmVkIGhhbmRsZXJzIHdpdGggdGhlaXIgb3duIGxvZ2ljLlxuXHQgKlxuXHQgKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGICAoQUxMID0gMHhmZjtPRkYgPSAweDAwO1xuXHQgKlxuXHQgKiBAcGFyYW0ge0xvZ0VudHJ5fSBlbnRyeVxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0bG9nKGVudHJ5KSB7XG5cdFx0aWYgKHN1cGVyLmxvZyhlbnRyeSkpIHtcblx0XHRcdGNvbnN0IGNvbnNvbGUgPSBnZXRHbG9iYWxPYmplY3QoXCJjb25zb2xlXCIpO1xuXHRcdFx0aWYgKCFjb25zb2xlKSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdGlmICghY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvciA9IGNvbnNvbGUubG9nO1xuXHRcdFx0aWYgKCFjb25zb2xlLndhcm4pIGNvbnNvbGUud2FybiA9IGNvbnNvbGUubG9nO1xuXG5cdFx0XHRzd2l0Y2ggKGVudHJ5LmdldExvZ0xldmVsKCkpIHtcblx0XHRcdFx0Y2FzZSBUUkFDRTpcblx0XHRcdFx0Y2FzZSBERUJVRzpcblx0XHRcdFx0Y2FzZSBJTkZPOlxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGVudHJ5LnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIEZBVEFMOlxuXHRcdFx0XHRjYXNlIEVSUk9SOlxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZW50cnkudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgV0FSTjpcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oZW50cnkudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Y29uc29sZS5sb2coZW50cnkudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlSW50ZWdlciB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7IExvZ0VudHJ5IH0gZnJvbSBcIi4vbG9nZW50cnkubWpzXCI7XG5pbXBvcnQgeyBBTEwsIERFQlVHLCBFUlJPUiwgRkFUQUwsIElORk8sIE9GRiwgVFJBQ0UsIFdBUk4gfSBmcm9tIFwiLi9sb2dnZXIubWpzXCI7XG5cbmV4cG9ydCB7IEhhbmRsZXIgfTtcblxuLyoqXG4gKiBUaGUgbG9nIGhhbmRsZXIgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBsb2cgZW50cmllcyBhbmQgdGhlIGxvZyBsaXN0ZW5lcnMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbmNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBCYXNlIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdC8qKlxuXHRcdCAqIExvZ2xldmVsXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7aW50ZWdlcn1cblx0XHQgKi9cblx0XHR0aGlzLmxvZ2xldmVsID0gT0ZGO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgbG9nIGZ1bmN0aW9uLiB0aGlzIG1ldGhvZCBtdXN0IGJlXG5cdCAqIG92ZXJ3cml0dGVuIGJ5IGRlcml2ZWQgaGFuZGxlcnMgd2l0aCB0aGVpciBvd24gbG9naWMuXG5cdCAqXG5cdCAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG5cdCAqXG5cdCAqIEBwYXJhbSB7TG9nRW50cnl9IGVudHJ5XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRsb2coZW50cnkpIHtcblx0XHR2YWxpZGF0ZUluc3RhbmNlKGVudHJ5LCBMb2dFbnRyeSk7XG5cblx0XHRpZiAodGhpcy5sb2dsZXZlbCA8IGVudHJ5LmdldExvZ0xldmVsKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgbG9nbGV2ZWxcblx0ICpcblx0ICogQHBhcmFtIHtpbnRlZ2VyfSBsb2dsZXZlbFxuXHQgKiBAcmV0dXJuIHtIYW5kbGVyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdHNldExvZ0xldmVsKGxvZ2xldmVsKSB7XG5cdFx0dmFsaWRhdGVJbnRlZ2VyKGxvZ2xldmVsKTtcblx0XHR0aGlzLmxvZ2xldmVsID0gbG9nbGV2ZWw7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IGxvZ2xldmVsXG5cdCAqXG5cdCAqIEByZXR1cm4ge2ludGVnZXJ9XG5cdCAqIEBzaW5jZSAxLjUuMFxuXHQgKi9cblx0Z2V0TG9nTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMubG9nbGV2ZWw7XG5cdH1cblxuXHQvKipcblx0ICogIFNldCBsb2cgbGV2ZWwgdG8gQWxsXG5cdCAqXG5cdCAqIEByZXR1cm4ge0hhbmRsZXJ9XG5cdCAqIEBzaW5jZSAxLjUuMFxuXHQgKi9cblx0c2V0QWxsKCkge1xuXHRcdHRoaXMuc2V0TG9nTGV2ZWwoQUxMKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgbG9nIGxldmVsIHRvIFRyYWNlXG5cdCAqXG5cdCAqIEByZXR1cm4ge0hhbmRsZXJ9XG5cdCAqIEBzaW5jZSAxLjUuMFxuXHQgKi9cblx0c2V0VHJhY2UoKSB7XG5cdFx0dGhpcy5zZXRMb2dMZXZlbChUUkFDRSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IGxvZyBsZXZlbCB0byBEZWJ1Z1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtIYW5kbGVyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdHNldERlYnVnKCkge1xuXHRcdHRoaXMuc2V0TG9nTGV2ZWwoREVCVUcpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBsb2cgbGV2ZWwgdG8gSW5mb1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtIYW5kbGVyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdHNldEluZm8oKSB7XG5cdFx0dGhpcy5zZXRMb2dMZXZlbChJTkZPKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgbG9nIGxldmVsIHRvIFdhcm5cblx0ICpcblx0ICogQHJldHVybiB7dW5kZWZpbmVkfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdHNldFdhcm4oKSB7XG5cdFx0dGhpcy5zZXRMb2dMZXZlbChXQVJOKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgbG9nIGxldmVsIHRvIEVycm9yXG5cdCAqXG5cdCAqIEByZXR1cm4ge0hhbmRsZXJ9XG5cdCAqIEBzaW5jZSAxLjUuMFxuXHQgKi9cblx0c2V0RXJyb3IoKSB7XG5cdFx0dGhpcy5zZXRMb2dMZXZlbChFUlJPUik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IGxvZyBsZXZlbCB0byBGYXRhbFxuXHQgKlxuXHQgKiBAcmV0dXJuIHtIYW5kbGVyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdHNldEZhdGFsKCkge1xuXHRcdHRoaXMuc2V0TG9nTGV2ZWwoRkFUQUwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBsb2cgbGV2ZWwgdG8gT2ZmXG5cdCAqXG5cdCAqIEByZXR1cm4ge0hhbmRsZXJ9XG5cdCAqIEBzaW5jZSAxLjUuMFxuXHQgKi9cblx0c2V0T2ZmKCkge1xuXHRcdHRoaXMuc2V0TG9nTGV2ZWwoT0ZGKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW50ZWdlciB9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHsgTG9nRW50cnkgfTtcblxuLyoqXG4gKiBBIGxvZyBlbnRyeSBmb3IgdGhlIGxvZ2dlclxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICovXG5jbGFzcyBMb2dFbnRyeSBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsb2dsZXZlbFxuXHQgKiBAcGFyYW0gey4uLip9IGFyZ3Ncblx0ICovXG5cdGNvbnN0cnVjdG9yKGxvZ2xldmVsLCAuLi5hcmdzKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR2YWxpZGF0ZUludGVnZXIobG9nbGV2ZWwpO1xuXG5cdFx0dGhpcy5sb2dsZXZlbCA9IGxvZ2xldmVsO1xuXHRcdHRoaXMuYXJndW1lbnRzID0gYXJncztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtpbnRlZ2Vycn1cblx0ICovXG5cdGdldExvZ0xldmVsKCkge1xuXHRcdHJldHVybiB0aGlzLmxvZ2xldmVsO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm4ge2FycmF5fVxuXHQgKi9cblx0Z2V0QXJndW1lbnRzKCkge1xuXHRcdHJldHVybiB0aGlzLmFyZ3VtZW50cztcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVyLm1qc1wiO1xuaW1wb3J0IHsgTG9nRW50cnkgfSBmcm9tIFwiLi9sb2dlbnRyeS5tanNcIjtcblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtcblx0dmFsaWRhdGVJbnRlZ2VyLFxuXHR2YWxpZGF0ZU9iamVjdCxcblx0dmFsaWRhdGVTdHJpbmcsXG59IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHsgTG9nZ2VyLCBBTEwsIFRSQUNFLCBERUJVRywgSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMLCBPRkYgfTtcblxuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5jb25zdCBBTEwgPSAyNTU7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IFRSQUNFID0gNjQ7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IERFQlVHID0gMzI7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IElORk8gPSAxNjtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgV0FSTiA9IDg7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IEVSUk9SID0gNDtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgRkFUQUwgPSAyO1xuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5jb25zdCBPRkYgPSAwO1xuXG4vKipcbiAqIFRoZSBsb2dnZXIgaXMgYSBjbGFzcyB0aGF0IHRha2VzIGNhcmUgb2YgbG9nZ2luZy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuY2xhc3MgTG9nZ2VyIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmhhbmRsZXIgPSBuZXcgU2V0KCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtIYW5kbGVyfSBoYW5kbGVyXG5cdCAqIEByZXR1cm4ge0xvZ2dlcn1cblx0ICogQHRocm93cyB7RXJyb3J9IHRoZSBoYW5kbGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSGFuZGxlclxuXHQgKi9cblx0YWRkSGFuZGxlcihoYW5kbGVyKSB7XG5cdFx0dmFsaWRhdGVPYmplY3QoaGFuZGxlcik7XG5cdFx0aWYgKCEoaGFuZGxlciBpbnN0YW5jZW9mIEhhbmRsZXIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgaGFuZGxlciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEhhbmRsZXJcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5oYW5kbGVyLmFkZChoYW5kbGVyKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hhbmRsZXJ9IGhhbmRsZXJcblx0ICogQHJldHVybiB7TG9nZ2VyfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXG5cdCAqL1xuXHRyZW1vdmVIYW5kbGVyKGhhbmRsZXIpIHtcblx0XHR2YWxpZGF0ZU9iamVjdChoYW5kbGVyKTtcblx0XHRpZiAoIShoYW5kbGVyIGluc3RhbmNlb2YgSGFuZGxlcikpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBoYW5kbGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSGFuZGxlclwiKTtcblx0XHR9XG5cblx0XHR0aGlzLmhhbmRsZXIuZGVsZXRlKGhhbmRsZXIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBUcmFjZSBtZXNzYWdlXG5cdCAqXG5cdCAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG5cdCAqIEByZXR1cm4ge0xvZ2dlcn1cblx0ICogQHNpbmNlIDEuNS4wXG5cdCAqL1xuXHRsb2dUcmFjZSguLi5hcmdzKSB7XG5cdFx0aWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IGFyZ3NbMF0gPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0XHR9XG5cblx0XHR0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtUUkFDRSwgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBEZWJ1ZyBtZXNzYWdlXG5cdCAqXG5cdCAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG5cdCAqIEByZXR1cm4ge0xvZ2dlcn1cblx0ICogQHNpbmNlIDEuNS4wXG5cdCAqL1xuXHRsb2dEZWJ1ZyguLi5hcmdzKSB7XG5cdFx0aWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IGFyZ3NbMF0gPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0XHR9XG5cblx0XHR0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtERUJVRywgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBJbmZvIG1lc3NhZ2Vcblx0ICpcblx0ICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHsqfSBhcmd1bWVudHNcblx0ICogQHJldHVybiB7TG9nZ2VyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdGxvZ0luZm8oLi4uYXJncykge1xuXHRcdGlmICh0eXBlb2YgYXJncyAhPT0gXCJvYmplY3RcIiB8fCBhcmdzWzBdID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3RcIik7XG5cdFx0fVxuXG5cdFx0dHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbSU5GTywgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBXYXJuIG1lc3NhZ2Vcblx0ICpcblx0ICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcblx0ICpcblx0ICogQHBhcmFtIHsqfSBhcmd1bWVudHNcblx0ICogQHJldHVybiB7TG9nZ2VyfVxuXHQgKiBAc2luY2UgMS41LjBcblx0ICovXG5cdGxvZ1dhcm4oLi4uYXJncykge1xuXHRcdGlmICh0eXBlb2YgYXJncyAhPT0gXCJvYmplY3RcIiB8fCBhcmdzWzBdID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3RcIik7XG5cdFx0fVxuXG5cdFx0dHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbV0FSTiwgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBFcnJvciBtZXNzYWdlXG5cdCAqXG5cdCAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG5cdCAqIEByZXR1cm4ge0xvZ2dlcn1cblx0ICogQHNpbmNlIDEuNS4wXG5cdCAqL1xuXHRsb2dFcnJvciguLi5hcmdzKSB7XG5cdFx0aWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IGFyZ3NbMF0gPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0XHR9XG5cblx0XHR0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtFUlJPUiwgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvZyBGYXRhbCBtZXNzYWdlXG5cdCAqXG5cdCAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG5cdCAqIEByZXR1cm4ge0xvZ2dlcn1cblx0ICogQHNpbmNlIDEuNS4wXG5cdCAqL1xuXHRsb2dGYXRhbCguLi5hcmdzKSB7XG5cdFx0aWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IGFyZ3NbMF0gPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0XHR9XG5cblx0XHR0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtGQVRBTCwgLi4uYXJnc10pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExhYmVsc1xuXHQgKlxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGxldmVsXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdGdldExhYmVsKGxldmVsKSB7XG5cdFx0dmFsaWRhdGVJbnRlZ2VyKGxldmVsKTtcblxuXHRcdGlmIChsZXZlbCA9PT0gQUxMKSByZXR1cm4gXCJBTExcIjtcblx0XHRpZiAobGV2ZWwgPT09IFRSQUNFKSByZXR1cm4gXCJUUkFDRVwiO1xuXHRcdGlmIChsZXZlbCA9PT0gREVCVUcpIHJldHVybiBcIkRFQlVHXCI7XG5cdFx0aWYgKGxldmVsID09PSBJTkZPKSByZXR1cm4gXCJJTkZPXCI7XG5cdFx0aWYgKGxldmVsID09PSBXQVJOKSByZXR1cm4gXCJXQVJOXCI7XG5cdFx0aWYgKGxldmVsID09PSBFUlJPUikgcmV0dXJuIFwiRVJST1JcIjtcblx0XHRpZiAobGV2ZWwgPT09IEZBVEFMKSByZXR1cm4gXCJGQVRBTFwiO1xuXHRcdGlmIChsZXZlbCA9PT0gT0ZGKSByZXR1cm4gXCJPRkZcIjtcblxuXHRcdHJldHVybiBcInVua25vd25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBMZXZlbFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcblx0ICogQHJldHVybiB7aW50ZWdlcn1cblx0ICovXG5cdGdldExldmVsKGxhYmVsKSB7XG5cdFx0dmFsaWRhdGVTdHJpbmcobGFiZWwpO1xuXG5cdFx0aWYgKGxhYmVsID09PSBcIkFMTFwiKSByZXR1cm4gQUxMO1xuXHRcdGlmIChsYWJlbCA9PT0gXCJUUkFDRVwiKSByZXR1cm4gVFJBQ0U7XG5cdFx0aWYgKGxhYmVsID09PSBcIkRFQlVHXCIpIHJldHVybiBERUJVRztcblx0XHRpZiAobGFiZWwgPT09IFwiSU5GT1wiKSByZXR1cm4gSU5GTztcblx0XHRpZiAobGFiZWwgPT09IFwiV0FSTlwiKSByZXR1cm4gV0FSTjtcblx0XHRpZiAobGFiZWwgPT09IFwiRVJST1JcIikgcmV0dXJuIEVSUk9SO1xuXHRcdGlmIChsYWJlbCA9PT0gXCJGQVRBTFwiKSByZXR1cm4gRkFUQUw7XG5cdFx0aWYgKGxhYmVsID09PSBcIk9GRlwiKSByZXR1cm4gT0ZGO1xuXG5cdFx0cmV0dXJuIDA7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2cgdHJpZ2dlcm5cbiAqXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGxvZ2xldmVsXG4gKiBAcGFyYW0geyp9IGFyZ3NcbiAqIEByZXR1cm4ge0xvZ2dlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJMb2cobG9nbGV2ZWwsIC4uLmFyZ3MpIHtcblx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcikge1xuXHRcdGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShsb2dsZXZlbCwgYXJncykpO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCI7XG5pbXBvcnQge0NvbnNvbGVIYW5kbGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL2xvZ2dpbmcvaGFuZGxlci9jb25zb2xlLm1qc1wiO1xuaW1wb3J0IHtMb2dFbnRyeX0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9sb2dnaW5nL2xvZ2VudHJ5Lm1qc1wiO1xuaW1wb3J0IHtUUkFDRSwgV0FSTiwgREVCVUcsIEVSUk9SLCBGQVRBTCwgSU5GT30gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9sb2dnaW5nL2xvZ2dlci5tanNcIjtcblxuZGVzY3JpYmUoJ0xvZ2dpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnQ29uc29sZUhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgQ29uc29sZUhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbnNvbGVIYW5kbGVyKCkpLnRvLmJlLmluc3RhbmNlb2YoQ29uc29sZUhhbmRsZXIpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgbG9nIHRvIGNvbnNvbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbnNvbGVIYW5kbGVyKCkuc2V0QWxsKCkubG9nKG5ldyBMb2dFbnRyeShGQVRBTCwgWzEsIHRydWUsICdmYXRhbCddKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgbG9nIHRvIGNvbnNvbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbnNvbGVIYW5kbGVyKCkuc2V0QWxsKCkubG9nKG5ldyBMb2dFbnRyeShUUkFDRSwgWzEsIHRydWUsICd0cmFjZSddKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgbG9nIHRvIGNvbnNvbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbnNvbGVIYW5kbGVyKCkuc2V0QWxsKCkubG9nKG5ldyBMb2dFbnRyeShXQVJOLCBbMSwgdHJ1ZSwgJ3dhcm4nXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoREVCVUcsIFsxLCB0cnVlLCAnZGVidWcnXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoRVJST1IsIFsxLCB0cnVlLCAnZXJyb3InXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoSU5GTywgWzEsIHRydWUsICdpbmZvJ10pKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0xvZ2dlciwgT0ZGLCBBTEwsIFRSQUNFLCBERUJVRywgSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2xvZ2dpbmcvbG9nZ2VyLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdMb2dnaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ25ldyBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgTG9nZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nVHJhY2UoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ1RyYWNlKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmxvZ0RlYnVnKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgTG9nZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5sb2dEZWJ1ZyhcInRlc3RcIikpLnRvLmluc3RhbmNlT2YoTG9nZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5sb2dJbmZvKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgTG9nZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5sb2dJbmZvKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmxvZ1dhcm4oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ1dhcm4oXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nRXJyb3IoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0Vycm9yKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmxvZ0ZhdGFsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgTG9nZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5sb2dGYXRhbChcInRlc3RcIikpLnRvLmluc3RhbmNlT2YoTG9nZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5nZXRMZXZlbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBbXG4gICAgICAgICAgICBbJ0FMTCcsIEFMTF0sXG4gICAgICAgICAgICBbJ1RSQUNFJywgVFJBQ0VdLFxuICAgICAgICAgICAgWydERUJVRycsIERFQlVHXSxcbiAgICAgICAgICAgIFsnSU5GTycsIElORk9dLFxuICAgICAgICAgICAgWydXQVJOJywgV0FSTl0sXG4gICAgICAgICAgICBbJ0VSUk9SJywgRVJST1JdLFxuICAgICAgICAgICAgWydGQVRBTCcsIEZBVEFMXSxcbiAgICAgICAgICAgIFsnT0ZGJywgT0ZGXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdChhICsgJyBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5nZXRMZXZlbChhKSkudG8uYmUuZXF1YWxzKGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdMb2dnZXIuZ2V0TGFiZWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgWydBTEwnLCBBTExdLFxuICAgICAgICAgICAgWydUUkFDRScsIFRSQUNFXSxcbiAgICAgICAgICAgIFsnREVCVUcnLCBERUJVR10sXG4gICAgICAgICAgICBbJ0lORk8nLCBJTkZPXSxcbiAgICAgICAgICAgIFsnV0FSTicsIFdBUk5dLFxuICAgICAgICAgICAgWydFUlJPUicsIEVSUk9SXSxcbiAgICAgICAgICAgIFsnRkFUQUwnLCBGQVRBTF0sXG4gICAgICAgICAgICBbJ09GRicsIE9GRl0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoYSArICcgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkuZ2V0TGFiZWwoYikpLnRvLmJlLmVxdWFscyhhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pOyIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIjtcbmltcG9ydCB7QUxMLCBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTCwgT0ZGfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2xvZ2dpbmcvbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHtIYW5kbGVyfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2xvZ2dpbmcvaGFuZGxlci5tanNcIjtcbmltcG9ydCB7TG9nRW50cnl9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvbG9nZ2luZy9sb2dlbnRyeS5tanNcIjtcblxuZGVzY3JpYmUoJ0xvZ2dpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRMb2dMZXZlbCgpLmdldExvZ0xldmVsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW0FMTF0sIFtUUkFDRV0sIFtERUJVR10sIFtJTkZPXSwgW1dBUk5dLCBbRVJST1JdLCBbRkFUQUxdLCBbT0ZGXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCd0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc2V0IHZhbHVlICcgKyBhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0TG9nTGV2ZWwoYSkuZ2V0TG9nTGV2ZWwoKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdIYW5kbGVyLmxvZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5sb2cobmV3IExvZ0VudHJ5KDAsIFwidGVzdFwiKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIubG9nKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGhhbmRsZXI7XG5cbiAgICAgICAgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHtcbiAgICAgICAgICAgIGxvZyhlbnRyeSkge1xuICAgICAgICAgICAgICAgIHN1cGVyLmxvZyhlbnRyeSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5sb2cobmV3IExvZ0VudHJ5KDAsIFwidGVzdFwiKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcubG9nKCkgd2l0aCBsb2dsZXZlbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgVGVzdEhhbmRsZXI7XG5cbiAgICAgICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICAgICAgIFRlc3RIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBIYW5kbGVyIHtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxscyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbG9nKGxvZ2xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBlci5sb2cobG9nbGV2ZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxzKytcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFsgLy8gQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgICAgICAgIFtBTEwsIDZdLFxuICAgICAgICAgICAgW1RSQUNFLCA2XSxcbiAgICAgICAgICAgIFtERUJVRywgNV0sXG4gICAgICAgICAgICBbSU5GTywgNF0sXG4gICAgICAgICAgICBbV0FSTiwgM10sXG4gICAgICAgICAgICBbRVJST1IsIDJdLFxuICAgICAgICAgICAgW0ZBVEFMLCAxXSxcbiAgICAgICAgICAgIFtPRkYsIDBdXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmxvZygnICsgYSArICcpIHNob3VsZCBsb2cgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpLnNldExvZ0xldmVsKGEpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShUUkFDRSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShERUJVRykpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShJTkZPKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KFdBUk4pKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoRVJST1IpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoRkFUQUwpKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxzKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0TG9nTGV2ZWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0TG9nTGV2ZWwoQUxMKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSGFuZGxlci5nZXRMb2dMZXZlbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IGxvZ2dlciBzaG91bGQgYmUgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLmdldExvZ0xldmVsKCkpLnRvLmJlLmVxdWFsKE9GRik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0QWxsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcgc2hvdWxkIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldEFsbCgpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRUcmFjZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IGxvZ2dlciBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0VHJhY2UoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0RGVidWcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJyBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0RGVidWcoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0SW5mbygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRJbmZvKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldFdhcm4oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJyBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0V2FybigpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRFcnJvcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRFcnJvcigpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRGYXRhbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRGYXRhbCgpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRPZmYoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0T2ZmKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0xvZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCduZXcgTG9nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nRW50cnkoMSwgJ2EnLCAnYicsICdjJykpLnRvLmluc3RhbmNlT2YoTG9nRW50cnkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdMb2cubG9nbGV2ZWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGxvZztcblxuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxvZyA9IG5ldyBMb2dFbnRyeSgxLCBmYWxzZSwgJ3Rlc3QnLCA5OSwge2E6IHRydWV9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBsb2dsZXZlbCAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGxvZy5nZXRMb2dMZXZlbCgpKS50by5iZS5lcXVhbCgxKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobG9nLmdldEFyZ3VtZW50cygpKS50by5oYXZlLmRlZXAubWVtYmVycyhbZmFsc2UsICd0ZXN0JywgOTksIHthOiB0cnVlfV0pXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgaXNJbnRlZ2VyLCBpc1N0cmluZywgaXNPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBCYXNlV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVF1ZXVlIH0gZnJvbSBcIi4uL3R5cGVzL29ic2VydmFibGVxdWV1ZS5tanNcIjtcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiLi93ZWJjb25uZWN0L21lc3NhZ2UubWpzXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxGdW5jdGlvbiB9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmV4cG9ydCB7IFdlYkNvbm5lY3QgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcmVjZWl2ZVF1ZXVlU3ltYm9sID0gU3ltYm9sKFwicmVjZWl2ZVF1ZXVlXCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgc2VuZFF1ZXVlU3ltYm9sID0gU3ltYm9sKFwic2VuZFF1ZXVlXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICpcbiAqIGhpbnQ6IHRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZSB0ZXN0cy4gaWYgeW91IHdhbnQgdG8gY2hhbmdlIGl0LCBwbGVhc2UgY2hhbmdlIGl0IGluIHRoZSB0ZXN0cyBhcyB3ZWxsLlxuICovXG5jb25zdCBjb25uZWN0aW9uU3ltYm9sID0gU3ltYm9sKFwiY29ubmVjdGlvblwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgbWFudWFsQ2xvc2VTeW1ib2wgPSBTeW1ib2woXCJtYW51YWxDbG9zZVwiKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tNy40LjFcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbmNvbnN0IGNvbm5lY3Rpb25TdGF0dXNDb2RlID0ge1xuXHQxMDAwOiBcIk5vcm1hbCBjbG9zdXJlXCIsXG5cdDEwMDE6IFwiR29pbmcgYXdheVwiLFxuXHQxMDAyOiBcIlByb3RvY29sIGVycm9yXCIsXG5cdDEwMDM6IFwiVW5zdXBwb3J0ZWQgZGF0YVwiLFxuXHQxMDA0OiBcIlJlc2VydmVkXCIsXG5cdDEwMDU6IFwiTm8gc3RhdHVzIGNvZGVcIixcblx0MTAwNjogXCJDb25uZWN0aW9uIGNsb3NlZCBhYm5vcm1hbGx5XCIsXG5cdDEwMDc6IFwiSW52YWxpZCBmcmFtZSBwYXlsb2FkIGRhdGFcIixcblx0MTAwODogXCJQb2xpY3kgdmlvbGF0aW9uXCIsXG5cdDEwMDk6IFwiVGhlIE1lc3NhZ2UgaXMgdG9vIGJpZ1wiLFxuXHQxMDEwOiBcIk1hbmRhdG9yeSBleHRlbnNpb25cIixcblx0MTAxMTogXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcblx0MTAxNTogXCJUTFMgaGFuZHNoYWtlXCIsXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhpcyB7V2ViQ29ubmVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBObyB1cmwgZGVmaW5lZCBmb3Igd2Vic29ja2V0IGRhdGFzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbm5lY3RTZXJ2ZXIocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdGNvbnN0IHVybCA9IHNlbGYuZ2V0T3B0aW9uKFwidXJsXCIpO1xuXHRpZiAoIXVybCkge1xuXHRcdHJlamVjdChcIk5vIHVybCBkZWZpbmVkIGZvciB3ZWIgY29ubmVjdC5cIik7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IHByb21pc2VBbGxyZWR5UmVzb2x2ZWQgPSBmYWxzZTtcblxuXHRsZXQgY29ubmVjdGlvblRpbWVvdXQgPSBzZWxmLmdldE9wdGlvbihcImNvbm5lY3Rpb24udGltZW91dFwiKTtcblx0aWYgKCFpc0ludGVnZXIoY29ubmVjdGlvblRpbWVvdXQpIHx8IGNvbm5lY3Rpb25UaW1lb3V0IDwgMTAwKSB7XG5cdFx0Y29ubmVjdGlvblRpbWVvdXQgPSA1MDAwO1xuXHR9XG5cblx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0aWYgKHByb21pc2VBbGxyZWR5UmVzb2x2ZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmVqZWN0KG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gdGltZW91dFwiKSk7XG5cdH0sIGNvbm5lY3Rpb25UaW1lb3V0KTtcblxuXHRsZXQgcmVjb25uZWN0VGltZW91dCA9IHNlbGYuZ2V0T3B0aW9uKFwiY29ubmVjdGlvbi5yZWNvbm5lY3QudGltZW91dFwiKTtcblx0aWYgKCFpc0ludGVnZXIocmVjb25uZWN0VGltZW91dCkgfHwgcmVjb25uZWN0VGltZW91dCA8IDEwMDApXG5cdFx0cmVjb25uZWN0VGltZW91dCA9IDEwMDA7XG5cdGxldCByZWNvbm5lY3RBdHRlbXB0cyA9IHNlbGYuZ2V0T3B0aW9uKFwiY29ubmVjdGlvbi5yZWNvbm5lY3QuYXR0ZW1wdHNcIik7XG5cdGlmICghaXNJbnRlZ2VyKHJlY29ubmVjdEF0dGVtcHRzKSB8fCByZWNvbm5lY3RBdHRlbXB0cyA8IDEpXG5cdFx0cmVjb25uZWN0QXR0ZW1wdHMgPSAxO1xuXHRsZXQgcmVjb25uZWN0RW5hYmxlZCA9IHNlbGYuZ2V0T3B0aW9uKFwiY29ubmVjdGlvbi5yZWNvbm5lY3QuZW5hYmxlZFwiKTtcblx0aWYgKHJlY29ubmVjdEVuYWJsZWQgIT09IHRydWUpIHJlY29ubmVjdEVuYWJsZWQgPSBmYWxzZTtcblxuXHRzZWxmW21hbnVhbENsb3NlU3ltYm9sXSA9IGZhbHNlO1xuXHRzZWxmW2Nvbm5lY3Rpb25TeW1ib2xdLnJlY29ubmVjdENvdW50ZXIrKztcblxuXHRpZiAoXG5cdFx0c2VsZltjb25uZWN0aW9uU3ltYm9sXS5zb2NrZXQgJiZcblx0XHRzZWxmW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldC5yZWFkeVN0YXRlIDwgMlxuXHQpIHtcblx0XHRzZWxmW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldC5jbG9zZSgpO1xuXHR9XG5cdHNlbGZbY29ubmVjdGlvblN5bWJvbF0uc29ja2V0ID0gbnVsbDtcblxuXHRjb25zdCBXZWJTb2NrZXQgPSBnZXRHbG9iYWxGdW5jdGlvbihcIldlYlNvY2tldFwiKTtcblx0aWYgKCFXZWJTb2NrZXQpIHtcblx0XHRyZWplY3QobmV3IEVycm9yKFwiV2ViU29ja2V0IGlzIG5vdCBhdmFpbGFibGVcIikpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHNlbGZbY29ubmVjdGlvblN5bWJvbF0uc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuXG5cdHNlbGZbY29ubmVjdGlvblN5bWJvbF0uc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdGlmIChldmVudC5kYXRhIGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0Y29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblx0XHRcdHJlYWRlci5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVuZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGZbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5hZGQobmV3IE1lc3NhZ2UocmVhZGVyLnJlc3VsdCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZWFkZXIucmVhZEFzVGV4dChuZXcgTWVzc2FnZShldmVudC5kYXRhKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGZbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5hZGQoTWVzc2FnZS5mcm9tSlNPTihldmVudC5kYXRhKSk7XG5cdFx0fVxuXHR9O1xuXG5cdHNlbGZbY29ubmVjdGlvblN5bWJvbF0uc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRzZWxmW2Nvbm5lY3Rpb25TeW1ib2xdLnJlY29ubmVjdENvdW50ZXIgPSAwO1xuXHRcdGlmICh0eXBlb2YgcmVzb2x2ZSA9PT0gXCJmdW5jdGlvblwiICYmICFwcm9taXNlQWxscmVkeVJlc29sdmVkKSB7XG5cdFx0XHRwcm9taXNlQWxscmVkeVJlc29sdmVkID0gdHJ1ZTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9XG5cdH07XG5cblx0c2VsZltjb25uZWN0aW9uU3ltYm9sXS5zb2NrZXQuY2xvc2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRpZiAoc2VsZlttYW51YWxDbG9zZVN5bWJvbF0pIHtcblx0XHRcdHNlbGZbbWFudWFsQ2xvc2VTeW1ib2xdID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0cmVjb25uZWN0RW5hYmxlZCAmJlxuXHRcdFx0dGhpc1tjb25uZWN0aW9uU3ltYm9sXS5yZWNvbm5lY3RDb3VudGVyIDwgcmVjb25uZWN0QXR0ZW1wdHNcblx0XHQpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRzZWxmLmNvbm5lY3QoKTtcblx0XHRcdH0sIHJlY29ubmVjdFRpbWVvdXQgKiB0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdLnJlY29ubmVjdENvdW50ZXIpO1xuXHRcdH1cblx0fTtcblxuXHRzZWxmW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldC5vbmVycm9yID0gKGVycm9yKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0cmVjb25uZWN0RW5hYmxlZCAmJlxuXHRcdFx0c2VsZltjb25uZWN0aW9uU3ltYm9sXS5yZWNvbm5lY3RDb3VudGVyIDwgcmVjb25uZWN0QXR0ZW1wdHNcblx0XHQpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRzZWxmLmNvbm5lY3QoKTtcblx0XHRcdH0sIHJlY29ubmVjdFRpbWVvdXQgKiB0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdLnJlY29ubmVjdENvdW50ZXIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodHlwZW9mIHJlamVjdCA9PT0gXCJmdW5jdGlvblwiICYmICFwcm9taXNlQWxscmVkeVJlc29sdmVkKSB7XG5cdFx0XHRcdHByb21pc2VBbGxyZWR5UmVzb2x2ZWQgPSB0cnVlO1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBUaGUgUmVzdEFQSSBpcyBhIGNsYXNzIHRoYXQgZW5hYmxlcyBhIFJFU1QgQVBJIHNlcnZlci5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvbmV0L3dlYmNvbm5lY3QubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjEuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBMb2NhbFN0b3JhZ2UgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gZGF0YSBvYmplY3RzLlxuICovXG5jbGFzcyBXZWJDb25uZWN0IGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9ucyBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIHdlYmNvbm5lY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0aWYgKGlzU3RyaW5nKG9wdGlvbnMpKSB7XG5cdFx0XHRvcHRpb25zID0geyB1cmw6IG9wdGlvbnMgfTtcblx0XHR9XG5cblx0XHRzdXBlcihvcHRpb25zKTtcblxuXHRcdHRoaXNbcmVjZWl2ZVF1ZXVlU3ltYm9sXSA9IG5ldyBPYnNlcnZhYmxlUXVldWUoKTtcblx0XHR0aGlzW3NlbmRRdWV1ZVN5bWJvbF0gPSBuZXcgT2JzZXJ2YWJsZVF1ZXVlKCk7XG5cblx0XHR0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdID0ge307XG5cdFx0dGhpc1tjb25uZWN0aW9uU3ltYm9sXS5zb2NrZXQgPSBudWxsO1xuXHRcdHRoaXNbY29ubmVjdGlvblN5bWJvbF0ucmVjb25uZWN0Q291bnRlciA9IDA7XG5cdFx0dGhpc1ttYW51YWxDbG9zZVN5bWJvbF0gPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29ubmVjdCgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29ubmVjdFNlcnZlci5jYWxsKHRoaXMsIHJlc29sdmUsIHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGlzQ29ubmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdPy5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IDE7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvbmV0L3dlYmNvbm5lY3RcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHVybD11bmRlZmluZWQgRGVmaW5lcyB0aGUgcmVzb3VyY2UgdGhhdCB5b3Ugd2lzaCB0byBmZXRjaC5cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGNvbm5lY3Rpb25cblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGNvbm5lY3Rpb24udGltZW91dD01MDAwIERlZmluZXMgdGhlIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uLlxuXHQgKiBAcHJvcGVydHkge051bWJlcn0gY29ubmVjdGlvbi5yZWNvbm5lY3QudGltZW91dCBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSByZWNvbm5lY3QuXG5cdCAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjb25uZWN0aW9uLnJlY29ubmVjdC5hdHRlbXB0cyBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb25uZWN0cy5cblx0ICogQHByb3BlcnR5IHtCb29sfSBjb25uZWN0aW9uLnJlY29ubmVjdC5lbmFibGVkIElmIHRoZSByZWNvbm5lY3QgaXMgZW5hYmxlZC5cblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHVybDogdW5kZWZpbmVkLFxuXHRcdFx0Y29ubmVjdGlvbjoge1xuXHRcdFx0XHR0aW1lb3V0OiA1MDAwLFxuXHRcdFx0XHRyZWNvbm5lY3Q6IHtcblx0XHRcdFx0XHR0aW1lb3V0OiAxMDAwLFxuXHRcdFx0XHRcdGF0dGVtcHRzOiAxLFxuXHRcdFx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZT0xMDAwXSBUaGUgY2xvc2UgY29kZS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtyZWFzb249XCJcIl0gVGhlIGNsb3NlIHJlYXNvbi5cblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tNy40LjFcblx0ICovXG5cdGNsb3NlKHN0YXR1c0NvZGUsIHJlYXNvbikge1xuXHRcdGlmICghaXNJbnRlZ2VyKHN0YXR1c0NvZGUpIHx8IHN0YXR1c0NvZGUgPCAxMDAwIHx8IHN0YXR1c0NvZGUgPiA0OTk5KSB7XG5cdFx0XHRzdGF0dXNDb2RlID0gMTAwMDtcblx0XHR9XG5cdFx0aWYgKCFpc1N0cmluZyhyZWFzb24pKSB7XG5cdFx0XHRyZWFzb24gPSBcIlwiO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzW21hbnVhbENsb3NlU3ltYm9sXSA9IHRydWU7XG5cdFx0XHRcdGlmICh0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldCkge1xuXHRcdFx0XHRcdHRoaXNbY29ubmVjdGlvblN5bWJvbF0uc29ja2V0LmNsb3NlKHN0YXR1c0NvZGUsIHJlYXNvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHR9XG5cdFx0XHRyZXNvbHZlKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUG9sbHMgdGhlIHJlY2VpdmUgcXVldWUgZm9yIG5ldyBtZXNzYWdlcy5cblx0ICpcblx0ICogQHJldHVybiB7TWVzc2FnZX1cblx0ICovXG5cdHBvbGwoKSB7XG5cdFx0cmV0dXJuIHRoaXNbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5wb2xsKCk7XG5cdH1cblxuXHQvKipcblx0ICogQXJlIHRoZXJlIGFueSBtZXNzYWdlcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZT9cblx0ICpcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGRhdGFSZWNlaXZlZCgpIHtcblx0XHRyZXR1cm4gIXRoaXNbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5pc0VtcHR5KCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IE1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZSBxdWV1ZSwgYnV0IGRvIG5vdCByZW1vdmUgaXQuXG5cdCAqXG5cdCAqIEByZXR1cm4ge09iamVjdH1cblx0ICovXG5cdHBlZWsoKSB7XG5cdFx0cmV0dXJuIHRoaXNbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5wZWVrKCk7XG5cdH1cblxuXHQvKipcblx0ICogQXR0YWNoIGEgbmV3IG9ic2VydmVyXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge1Byb3h5T2JzZXJ2ZXJ9XG5cdCAqL1xuXHRhdHRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuXHRcdHRoaXNbcmVjZWl2ZVF1ZXVlU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogRGV0YWNoIGEgb2JzZXJ2ZXJcblx0ICpcblx0ICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcblx0ICogQHJldHVybiB7UHJveHlPYnNlcnZlcn1cblx0ICovXG5cdGRldGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0dGhpc1tyZWNlaXZlUXVldWVTeW1ib2xdLmRldGFjaE9ic2VydmVyKG9ic2VydmVyKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0Y29udGFpbnNPYnNlcnZlcihvYnNlcnZlcikge1xuXHRcdHJldHVybiB0aGlzW3JlY2VpdmVRdWV1ZVN5bWJvbF0uY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcik7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtNZXNzYWdlfE9iamVjdH0gbWVzc2FnZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0c2VuZChtZXNzYWdlKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGlmICh0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldC5yZWFkeVN0YXRlICE9PSAxKSB7XG5cdFx0XHRcdHJlamVjdChcInRoZSBzb2NrZXQgaXMgbm90IHJlYWR5XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzW2Nvbm5lY3Rpb25TeW1ib2xdLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCwgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJMaXN0IH0gZnJvbSBcIi4vb2JzZXJ2ZXJsaXN0Lm1qc1wiO1xuXG5leHBvcnQgeyBPYnNlcnZhYmxlUXVldWUgfTtcblxuLyoqXG4gKiBBbiBvYnNlcnZhYmxlIHF1ZXVlIGlzIGEgbGlzdCBvZiBpdGVtcyB0aGF0IGFyZSBwcm9jZXNzZWQgb25lIGFmdGVyIGFub3RoZXIgKGZpcnN0IGluLCBmaXJzdCBvdXQpLlxuICpcbiAqIGBRdWV1ZS5hZGQoKWAgYW5kIGBRdWV1ZS5jbGVhcigpYCBub3RpZnkgYWxsIG9ic2VydmVycy5cbiAqXG4gKiBAc2luY2UgMy4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBbiBvYnNlcnZhYmxlIFF1ZXVlIChGaWZvKVxuICovXG5jbGFzcyBPYnNlcnZhYmxlUXVldWUgZXh0ZW5kcyBRdWV1ZSB7XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcblx0XHRcdG9ic2VydmVyczogbmV3IE9ic2VydmVyTGlzdCgpLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvdHlwZXMvb2JzZXJ2YWJsZXF1ZXVlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm4ge1F1ZXVlfVxuXHQgKi9cblx0YWRkKHZhbHVlKSB7XG5cdFx0c3VwZXIuYWRkKHZhbHVlKTtcblx0XHR0aGlzLm5vdGlmeU9ic2VydmVycygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJlbW92ZSBhbGwgZW50cmllc1xuXHQgKlxuXHQgKiBAcmV0dXJuIHtRdWV1ZX1cblx0ICovXG5cdGNsZWFyKCkge1xuXHRcdHN1cGVyLmNsZWFyKCk7XG5cdFx0dGhpcy5ub3RpZnlPYnNlcnZlcnMoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBBdHRhY2ggYSBuZXcgb2JzZXJ2ZXJcblx0ICpcblx0ICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcblx0ICogQHJldHVybiB7UHJveHlPYnNlcnZlcn1cblx0ICovXG5cdGF0dGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0ub2JzZXJ2ZXJzLmF0dGFjaChvYnNlcnZlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogRGV0YWNoIGEgb2JzZXJ2ZXJcblx0ICpcblx0ICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcblx0ICogQHJldHVybiB7UHJveHlPYnNlcnZlcn1cblx0ICovXG5cdGRldGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0ub2JzZXJ2ZXJzLmRldGFjaChvYnNlcnZlcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogTm90aWZ5IGFsbCBvYnNlcnZlclxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0bm90aWZ5T2JzZXJ2ZXJzKCkge1xuXHRcdHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5vYnNlcnZlcnMubm90aWZ5KHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqL1xuXHRjb250YWluc09ic2VydmVyKG9ic2VydmVyKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLm9ic2VydmVycy5jb250YWlucyhvYnNlcnZlcik7XG5cdH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IE1lc3NhZ2UgfTtcblxuY29uc3QgZGF0YVN5bWJvbCA9IFN5bWJvbChcIkBAZGF0YVwiKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXZWJTb2NrZXQgbWVzc2FnZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBNZXNzYWdlIGNsYXNzIGVuY2Fwc3VsYXRlcyBhIFdlYlNvY2tldCBtZXNzYWdlLlxuICovXG5jbGFzcyBNZXNzYWdlIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuXHQgKi9cblx0Y29uc3RydWN0b3IoZGF0YSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1tkYXRhU3ltYm9sXSA9IHZhbGlkYXRlT2JqZWN0KGRhdGEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJhdyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtvYmplY3R9XG5cdCAqL1xuXHRnZXREYXRhKCkge1xuXHRcdHJldHVybiB0aGlzW2RhdGFTeW1ib2xdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqL1xuXHR0b0pTT04oKSB7XG5cdFx0cmV0dXJuIHRoaXNbZGF0YVN5bWJvbF07XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGpzb25cblx0ICogQHJldHVybiB7TWVzc2FnZX1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcblx0ICovXG5cdHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG5cdFx0dmFsaWRhdGVTdHJpbmcoanNvbik7XG5cdFx0cmV0dXJuIG5ldyBNZXNzYWdlKEpTT04ucGFyc2UoanNvbikpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7V2ViQ29ubmVjdH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9uZXQvd2ViY29ubmVjdC5tanNcIjtcbmltcG9ydCB7TWVzc2FnZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9uZXQvd2ViY29ubmVjdC9tZXNzYWdlLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7aW5pdFdlYlNvY2tldH0gZnJvbSBcIi4uLy4uL3V0aWwvd2Vic29ja2V0Lm1qc1wiO1xuXG5jb25zdCB0ZXN0VXJsID0gXCJ3c3M6Ly93cy5wb3N0bWFuLWVjaG8uY29tL3Jhd1wiXG5cbmRlc2NyaWJlKCdXZWJzb2NrZXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgZHMgPSB1bmRlZmluZWRcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0V2ViU29ja2V0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpZiAoZHMpIHtcbiAgICAgICAgICAgIGRzLmNsb3NlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcywgdGhlIG5vZGUgdGVzdCB3aWxsIGhhbmcgXG4gICAgICAgIGZvciAoY29uc3Qgc3ltIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZHMpKSB7XG4gICAgICAgICAgICBpZiAoc3ltLnRvU3RyaW5nKCkgPT09ICdTeW1ib2woY29ubmVjdGlvbiknKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkc1tzeW1dPy5zb2NrZXQ/LnRlcm1pbmF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBkc1tzeW1dPy5zb2NrZXQ/LlsndGVybWluYXRlJ10oKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRvbmUoKVxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHRyYW5zZm9ybSBkYXRhJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBkcyA9IG5ldyBXZWJDb25uZWN0KCB7XG4gICAgICAgICAgICB1cmw6IHRlc3RVcmwsXG4gICAgICAgIH0pXG5cbiAgICAgICAgZHMuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBkcy5hdHRhY2hPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoKCk9PiB7XG4gICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBkcy5zZW5kKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSGVsbG8gV29ybGRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgfSlcblxuXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY29ubmVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGRzID0gbmV3IFdlYkNvbm5lY3Qoe1xuICAgICAgICAgICAgdXJsOiB0ZXN0VXJsLFxuICAgICAgICAgICAgcmVjb25uZWN0OiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgZG9uZShlKVxuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBzZW5kIG1lc3NhZ2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBkcyA9IG5ldyBXZWJDb25uZWN0KHtcbiAgICAgICAgICAgIHVybDogdGVzdFVybCxcbiAgICAgICAgICAgIHJlY29ubmVjdDoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGRzLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcigoKT0+IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBleHBlY3QoZHMuZGF0YVJlY2VpdmVkKCkpLnRvLmJlLnRydWVcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBkcy5wb2xsKClcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG1zZykudG8uYmUuaW5zdGFuY2VPZihNZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbXNnLmdldERhdGEoKVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZGF0YSkudG8uYmUuZGVlcC5lcXVhbCh7bWVzc2FnZTogXCJIZWxsbyBXb3JsZFwifSlcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIGRzLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkhlbGxvIFdvcmxkXCJcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgfSlcblxuXG4gICAgfSkudGltZW91dCgxMDAwMCk7XG5cbn0pO1xuIiwgImltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcblxuZnVuY3Rpb24gaW5pdFdlYlNvY2tldCgpIHtcblxuLy8gICAgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgJ1tvYmplY3QgV2luZG93XScgPT09IHdpbmRvdy50b1N0cmluZy5jYWxsKHdpbmRvdylcbiAgICBjb25zdCBpc05vZGUgPSB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyAmJiAnW29iamVjdCBnbG9iYWxdJyA9PT0gZ2xvYmFsLnRvU3RyaW5nLmNhbGwoZ2xvYmFsKVxuXG5cbiAgICBpZiAoIWlzTm9kZSkge1xuICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnQoXCJ3c1wiKS50aGVuKCh3cykgPT4ge1xuICAgICAgICBnZXRHbG9iYWwoKS5XZWJTb2NrZXQgPSBjbGFzcyBleHRlbmRzIHdzWydXZWJTb2NrZXQnXSB7XG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcih1cmwsIHByb3RvY29scykge1xuICAgICAgICAgICAgICAgIHN1cGVyKHVybCwgcHJvdG9jb2xzLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZVRpbWVvdXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIG1heFBheWxvYWQ6IDEwMjQgKiAxMDI0ICogMTAyNCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgfSk7XG5cblxufVxuXG5leHBvcnQge2luaXRXZWJTb2NrZXR9IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge01lc3NhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvbmV0L3dlYmNvbm5lY3QvbWVzc2FnZS5tanNcIjtcblxuZGVzY3JpYmUoJ01lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBpdCgnY29uc3RydWN0IHdpdGhvdXRoIHBhcmFtZXRlcnMgc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgTWVzc2FnZSgpO1xuICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoJ3Nob3VsZCB0aHJvdycpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG5cbiAgICB9KVxuICAgIFxuICAgIGl0KCdmcm9tIGpzb24gc2hvdWxkICcgLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAgXCJpZFwiOiBcIjEyM1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidGVzdFwiLFxuICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJ0ZXN0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tSlNPTihKU09OLnN0cmluZ2lmeShqc29uKSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtZXNzYWdlLmdldERhdGEoKTtcbiAgICAgICAgZXhwZWN0KGRhdGEuaWQpLnRvLmVxdWFsKGpzb24uaWQpO1xuICAgICAgICBleHBlY3QoZGF0YS50eXBlKS50by5lcXVhbChqc29uLnR5cGUpO1xuICAgICAgICBleHBlY3QoZGF0YS5kYXRhKS50by5kZWVwLmVxdWFsKGpzb24uZGF0YSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9KVxuICAgIFxuICAgIGl0IChcInRvIGpzb24gc2hvdWxkXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgICAgIFwiaWRcIjogXCIxMjNcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInRlc3RcIixcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwidGVzdFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKG9iaik7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcbiAgICAgICAgZXhwZWN0KGRhdGEpLnRvLmVxdWFsKCd7XCJpZFwiOlwiMTIzXCIsXCJ0eXBlXCI6XCJ0ZXN0XCIsXCJkYXRhXCI6e1widGVzdFwiOlwidGVzdFwifX0nKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH0pXG5cblxuXG59KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgVmVyc2lvbiwgZ2V0TW9uc3RlclZlcnNpb24gfTtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvYmplY3QgY29udGFpbnMgYSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlclxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy92ZXJzaW9uLTEubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBvYmplY3QgY29udGFpbnMgYSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlclxuICovXG5jbGFzcyBWZXJzaW9uIGV4dGVuZHMgQmFzZSB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFqb3Jcblx0ICogQHBhcmFtIG1pbm9yXG5cdCAqIEBwYXJhbSBwYXRjaFxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gbWFqb3IgaXMgbm90IGEgbnVtYmVyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBtaW5vciBpcyBub3QgYSBudW1iZXJcblx0ICogQHRocm93cyB7RXJyb3J9IHBhdGNoIGlzIG5vdCBhIG51bWJlclxuXHQgKi9cblx0Y29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBwYXRjaCkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAoXG5cdFx0XHR0eXBlb2YgbWFqb3IgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdG1pbm9yID09PSB1bmRlZmluZWQgJiZcblx0XHRcdHBhdGNoID09PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IHBhcnRzID0gbWFqb3IudG9TdHJpbmcoKS5zcGxpdChcIi5cIik7XG5cdFx0XHRtYWpvciA9IHBhcnNlSW50KHBhcnRzWzBdIHx8IDApO1xuXHRcdFx0bWlub3IgPSBwYXJzZUludChwYXJ0c1sxXSB8fCAwKTtcblx0XHRcdHBhdGNoID0gcGFyc2VJbnQocGFydHNbMl0gfHwgMCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1ham9yID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm1ham9yIHZlcnNpb24gaXMgdW5kZWZpbmVkXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtaW5vciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtaW5vciA9IDA7XG5cdFx0fVxuXG5cdFx0aWYgKHBhdGNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhdGNoID0gMDtcblx0XHR9XG5cblx0XHR0aGlzLm1ham9yID0gcGFyc2VJbnQobWFqb3IpO1xuXHRcdHRoaXMubWlub3IgPSBwYXJzZUludChtaW5vcik7XG5cdFx0dGhpcy5wYXRjaCA9IHBhcnNlSW50KHBhdGNoKTtcblxuXHRcdGlmIChpc05hTih0aGlzLm1ham9yKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWFqb3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuXHRcdH1cblxuXHRcdGlmIChpc05hTih0aGlzLm1pbm9yKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibWlub3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuXHRcdH1cblxuXHRcdGlmIChpc05hTih0aGlzLnBhdGNoKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGF0Y2ggaXMgbm90IGEgbnVtYmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvdHlwZXMvdmVyc2lvblwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIDAgaWYgZXF1YWwsIC0xIGlmIHRoZSBvYmplY3QgdmVyc2lvbiBpcyBsZXNzIGFuZCAxIGlmIGdyZWF0ZXJcblx0ICogdGhhbiB0aGUgY29tcGFyZWQgdmVyc2lvblxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xWZXJzaW9ufSB2ZXJzaW9uIFZlcnNpb24gdG8gY29tcGFyZVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuXHRjb21wYXJlVG8odmVyc2lvbikge1xuXHRcdGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgVmVyc2lvbikge1xuXHRcdFx0dmVyc2lvbiA9IHZlcnNpb24udG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHZlcnNpb24gIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInR5cGUgZXhjZXB0aW9uXCIpO1xuXHRcdH1cblxuXHRcdGlmICh2ZXJzaW9uID09PSB0aGlzLnRvU3RyaW5nKCkpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdGNvbnN0IGEgPSBbdGhpcy5tYWpvciwgdGhpcy5taW5vciwgdGhpcy5wYXRjaF07XG5cdFx0Y29uc3QgYiA9IHZlcnNpb24uc3BsaXQoXCIuXCIpO1xuXHRcdGNvbnN0IGxlbiA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChhW2ldICYmICFiW2ldICYmIHBhcnNlSW50KGFbaV0pID4gMCkgfHxcblx0XHRcdFx0cGFyc2VJbnQoYVtpXSkgPiBwYXJzZUludChiW2ldKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KGJbaV0gJiYgIWFbaV0gJiYgcGFyc2VJbnQoYltpXSkgPiAwKSB8fFxuXHRcdFx0XHRwYXJzZUludChhW2ldKSA8IHBhcnNlSW50KGJbaV0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAwO1xuXHR9XG59XG5cbmxldCBtb25zdGVyVmVyc2lvbjtcblxuLyoqXG4gKiBWZXJzaW9uIG9mIG1vbnN0ZXJcbiAqXG4gKiBAcmV0dXJuIHtWZXJzaW9ufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5mdW5jdGlvbiBnZXRNb25zdGVyVmVyc2lvbigpIHtcblx0aWYgKG1vbnN0ZXJWZXJzaW9uIGluc3RhbmNlb2YgVmVyc2lvbikge1xuXHRcdHJldHVybiBtb25zdGVyVmVyc2lvbjtcblx0fVxuXG5cdC8qKiBkb24ndCB0b3VjaCwgcmVwbGFjZWQgYnkgbWFrZSB3aXRoIHBhY2thZ2UuanNvbiB2ZXJzaW9uICovXG5cdG1vbnN0ZXJWZXJzaW9uID0gbmV3IFZlcnNpb24oXCIzLjk4LjNcIik7XG5cblx0cmV0dXJuIG1vbnN0ZXJWZXJzaW9uO1xufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1ZlcnNpb24sIGdldE1vbnN0ZXJWZXJzaW9ufSBmcm9tIFwiLi4vLi4vc291cmNlL3R5cGVzL3ZlcnNpb24ubWpzXCI7XG5cbmRlc2NyaWJlKCdNb25zdGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5nZXRNb25zdGVyVmVyc2lvbigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbW9uc3RlclZlcnNpb25cblxuICAgICAgICAvKiogZG9uXHUwMEI0dCB0b3VjaCwgcmVwbGFjZWQgYnkgbWFrZSB3aXRoIHBhY2thZ2UuanNvbiB2ZXJzaW9uICovXG4gICAgICAgIG1vbnN0ZXJWZXJzaW9uID0gbmV3IFZlcnNpb24oXCIzLjk4LjNcIilcblxuICAgICAgICBsZXQgbSA9IGdldE1vbnN0ZXJWZXJzaW9uKCk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCAnICsgbW9uc3RlclZlcnNpb24gKyAnIGlzICcgKyBtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobS5jb21wYXJlVG8obW9uc3RlclZlcnNpb24pKS5pcy5lcXVhbCgwKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgZ2V0V2luZG93IH0gZnJvbSBcIi4vdXRpbC5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBjb252ZXJ0VG9QaXhlbHMsIGdldERldmljZURQSSB9O1xuXG4vKipcbiAqIFN0b3JlcyB0aGUgRFBJIG9mIHRoZSBkZXZpY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBzaW5jZSAzLjM0LjBcbiAqIEB0eXBlIHtudW1iZXJ8ZnVuY3Rpb259XG4gKi9cbmxldCBDVVJSRU5UX0RFVklDRV9EUEkgPSBmdW5jdGlvbiAoKSB7XG5cdGxldCBpID0gMDtcblx0Zm9yIChpID0gNTY7IGkgPCAyMDAwOyBpKyspIHtcblx0XHRpZiAoZ2V0V2luZG93KCkubWF0Y2hNZWRpYShgKG1heC1yZXNvbHV0aW9uOiAke2l9ZHBpKWApLm1hdGNoZXMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgRFBJIG9mIHRoZSBkZXZpY2UuXG4gKlxuICogQHNpbmNlIDMuMzQuMFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXREZXZpY2VEUEkoKSB7XG5cdC8vIG9ubHkgY2FsbCB0aGUgZnVuY3Rpb24gb25jZVxuXHRpZiAodHlwZW9mIENVUlJFTlRfREVWSUNFX0RQSSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Q1VSUkVOVF9ERVZJQ0VfRFBJID0gQ1VSUkVOVF9ERVZJQ0VfRFBJKCk7XG5cdH1cblxuXHRyZXR1cm4gZ2V0V2luZG93KCkuZGV2aWNlUGl4ZWxSYXRpbyAqIENVUlJFTlRfREVWSUNFX0RQSTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIENTUyB2YWx1ZSB0byBwaXhlbHMuXG4gKlxuICogQXMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29udmVydFRvUGl4ZWxzKCcxZW0nKSAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZvbnQgc2l6ZSBpbiBwaXhlbHNcbiAqIGNvbnZlcnRUb1BpeGVscygnMXJlbScpIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgcm9vdCBmb250IHNpemUgaW4gcGl4ZWxzXG4gKiBjb252ZXJ0VG9QaXhlbHMoJzFweCcpIC8vIHJldHVybnMgMVxuICogY29udmVydFRvUGl4ZWxzKCcxMDAlJykgLy8gcmV0dXJucyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgcGFyZW50IGVsZW1lbnQgaW4gcGl4ZWxzXG4gKiBgYGBcbiAqXG4gKiBGb2xsb3dpbmcgdW5pdHMgYXJlIHN1cHBvcnRlZDpcbiAqIC0gcHhcbiAqIC0gZW1cbiAqIC0gcmVtXG4gKiAtICVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtwYXJlbnRFbGVtZW50PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudF1cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtmb250U2l6ZUVsZW1lbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XVxuICogQHJldHVybiB7bnVtYmVyfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy4zNC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7RXJyb3J9IFVuc3VwcG9ydGVkIHVuaXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHZhbHVlIGZvcm1hdFxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnRUb1BpeGVscyhcblx0dmFsdWUsXG5cdHBhcmVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG5cdGZvbnRTaXplRWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbikge1xuXHR2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cblx0Y29uc3QgcmVnZXggPSAvXigtP1tcXGQuXSspKC4qKSQvO1xuXHRjb25zdCBtYXRjaFJlc3VsdCA9IHZhbHVlLm1hdGNoKHJlZ2V4KTtcblxuXHRpZiAoIW1hdGNoUmVzdWx0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvcm1hdDogJHt2YWx1ZX1gKTtcblx0fVxuXG5cdGNvbnN0IFssIG51bSwgdW5pdF0gPSBtYXRjaFJlc3VsdDtcblx0Y29uc3QgbnVtYmVyID0gcGFyc2VGbG9hdChudW0pO1xuXHRjb25zdCBkcGkgPSBnZXREZXZpY2VEUEkoKTtcblxuXHRpZiAodW5pdCA9PT0gXCJweFwiKSB7XG5cdFx0cmV0dXJuIG51bWJlcjtcblx0fSBlbHNlIGlmICh1bml0ID09PSBcImVtXCIpIHtcblx0XHRjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoXG5cdFx0XHR3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmb250U2l6ZUVsZW1lbnQpLmZvbnRTaXplLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG51bWJlciAqIGZvbnRTaXplO1xuXHR9IGVsc2UgaWYgKHVuaXQgPT09IFwicmVtXCIpIHtcblx0XHRjb25zdCByb290Rm9udFNpemUgPSBwYXJzZUZsb2F0KFxuXHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50RWxlbWVudCkuZm9udFNpemUsXG5cdFx0KTtcblx0XHRyZXR1cm4gbnVtYmVyICogcm9vdEZvbnRTaXplO1xuXHR9IGVsc2UgaWYgKHVuaXQgPT09IFwiJVwiKSB7XG5cdFx0Y29uc3QgcGFyZW50V2lkdGggPSBwYXJzZUZsb2F0KFxuXHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50RWxlbWVudCkud2lkdGgsXG5cdFx0KTtcblx0XHRyZXR1cm4gKG51bWJlciAqIHBhcmVudFdpZHRoKSAvIDEwMDtcblx0fSBlbHNlIGlmICh1bml0ID09PSBcImluXCIpIHtcblx0XHRyZXR1cm4gbnVtYmVyICogZHBpO1xuXHR9IGVsc2UgaWYgKHVuaXQgPT09IFwiY21cIikge1xuXHRcdHJldHVybiAobnVtYmVyICogZHBpKSAvIDIuNTQ7XG5cdH0gZWxzZSBpZiAodW5pdCA9PT0gXCJtbVwiKSB7XG5cdFx0cmV0dXJuIChudW1iZXIgKiBkcGkpIC8gMjUuNDtcblx0fSBlbHNlIGlmICh1bml0ID09PSBcInB0XCIpIHtcblx0XHRyZXR1cm4gKG51bWJlciAqIGRwaSkgLyA3Mjtcblx0fSBlbHNlIGlmICh1bml0ID09PSBcInBjXCIpIHtcblx0XHRyZXR1cm4gKG51bWJlciAqIGRwaSkgLyA2O1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdW5pdDogJHt1bml0fWApO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtjb252ZXJ0VG9QaXhlbHMsIGdldERldmljZURQSX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vZGltZW5zaW9uLm1qc1wiO1xuaW1wb3J0IHtnZXRXaW5kb3d9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTSwgaXNCcm93c2VyLCBKU0RPTUV4cG9ydCBhcyBKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2RldGVjdFJ1bnRpbWVFbnZpcm9ubWVudH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS91dGlsL3J1bnRpbWUubWpzXCI7XG5cblxuZnVuY3Rpb24gZ2V0TW9ja1dpbmRvdyhkcGkpIHtcblxuICAgIGlmKGRldGVjdFJ1bnRpbWVFbnZpcm9ubWVudCgpID09PSAnYnJvd3NlcicpIHtcbiAgICAgICAgcmV0dXJuIGdldFdpbmRvdygpO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICBjb25zdCBkb20gPSBuZXcgSlNET00oJycsIHtcbiAgICAgICAgcHJldGVuZFRvQmVWaXN1YWw6IHRydWUsXG4gICAgICAgIHJlc291cmNlczogJ3VzYWJsZScsXG4gICAgfSk7XG5cbiAgICBkb20ud2luZG93Lm1hdGNoTWVkaWEgPSAocXVlcnkpID0+IHtcbiAgICAgICAgY29uc3QgZHBpUmVnZXggPSAvXFwobWF4LXJlc29sdXRpb246IChcXGQrKWRwaVxcKS87XG4gICAgICAgIGNvbnN0IG1hdGNoID0gcXVlcnkubWF0Y2goZHBpUmVnZXgpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgbWF4RHBpID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgIHJldHVybiB7bWF0Y2hlczogZHBpIDw9IG1heERwaX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge21hdGNoZXM6IGZhbHNlfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRvbS53aW5kb3c7XG59XG5cbmRlc2NyaWJlKCdkaW1lbnNpb24nLCAoKSA9PiB7XG4gICAgbGV0IGN1cnJlbnRFbnZpcm9ubWVudDtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vY2hhaURvbShnZXREb2N1bWVudCgpKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHRlc3REcGkgPSA5NjtcbiAgICAgICAgY29uc3QgdGVzdFdpbmRvdyA9IGdldE1vY2tXaW5kb3codGVzdERwaSk7XG4gICAgICAgIGdldEdsb2JhbCgpLndpbmRvdyA9IHRlc3RXaW5kb3c7XG5cbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBnZXRHbG9iYWwoKS53aW5kb3c7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29udmVydFRvUGl4ZWxzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IHB4IHZhbHVlcycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUb1BpeGVscygnMTAwcHgnKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKDEwMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KFwic2hvdWxkIHRocm93IGFuIGVycm9yIHdoZW4gdGhlIGlucHV0IHZhbHVlIGhhcyBhbiBpbnZhbGlkIGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWUgPSBcImludmFsaWRfdmFsdWVcIjtcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9QaXhlbHMoaW52YWxpZFZhbHVlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4cGVjdChlcnJvckZuKS50by50aHJvdyhFcnJvciwgYEludmFsaWQgdmFsdWUgZm9ybWF0OiAke2ludmFsaWRWYWx1ZX1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoXCJzaG91bGQgaGFuZGxlIG5lZ2F0aXZlIHZhbHVlcyBjb3JyZWN0bHlcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmVnYXRpdmVWYWx1ZSA9IFwiLTEwcHhcIjtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0gLTEwO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9QaXhlbHMobmVnYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKGV4cGVjdGVkUmVzdWx0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY29udmVydCBlbSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGVzdEVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlc3RFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvUGl4ZWxzKCcyZW0nLCB0ZXN0RWxlbWVudCwgdGVzdEVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoMzIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlc3RFbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY29udmVydCByZW0gdmFsdWVzJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRlc3RFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRlc3RFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRvUGl4ZWxzKCcycmVtJywgdGVzdEVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoMzIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGVzdEVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IHBlcmNlbnRhZ2UgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRlc3RFbGVtZW50LnN0eWxlLndpZHRoID0gJzUwMHB4JztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VG9QaXhlbHMoJzUwJScsIHRlc3RFbGVtZW50KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmVxdWFsKDI1MCk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVzdEVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciB1bnN1cHBvcnRlZCB1bml0cycsICgpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBjb252ZXJ0VG9QaXhlbHMoJzEwdW5zdXBwb3J0ZWRVbml0JykpLnRvLnRocm93KCdVbnN1cHBvcnRlZCB1bml0OiB1bnN1cHBvcnRlZFVuaXQnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdnZXREZXZpY2VEUEknLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGRldmljZSBEUEknLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0RHBpID0gOTY7XG4gICAgICAgICAgICBjb25zdCB0ZXN0V2luZG93ID0gZ2V0TW9ja1dpbmRvdyh0ZXN0RHBpKTtcbiAgICAgICAgICAgIGdldEdsb2JhbCgpLndpbmRvdyA9IHRlc3RXaW5kb3c7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldmljZURwaSA9IGdldERldmljZURQSSgpO1xuICAgICAgICAgICAgZXhwZWN0KGRldmljZURwaSkudG8uZXF1YWwodGVzdERwaSAqIHRlc3RXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBnZXRHbG9iYWwoKS53aW5kb3c7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY2FjaGUgdGhlIHJlc3VsdCBhbmQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVzdERwaSA9IDk2O1xuICAgICAgICAgICAgY29uc3QgdGVzdFdpbmRvdyA9IGdldE1vY2tXaW5kb3codGVzdERwaSk7XG4gICAgICAgICAgICBnZXRHbG9iYWwoKS53aW5kb3cgPSB0ZXN0V2luZG93O1xuXG4gICAgICAgICAgICBjb25zdCBkZXZpY2VEcGkxID0gZ2V0RGV2aWNlRFBJKCk7XG4gICAgICAgICAgICBjb25zdCBkZXZpY2VEcGkyID0gZ2V0RGV2aWNlRFBJKCk7XG4gICAgICAgICAgICBleHBlY3QoZGV2aWNlRHBpMSkudG8uZXF1YWwoZGV2aWNlRHBpMik7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBnZXRHbG9iYWwoKS53aW5kb3c7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuY29uc3QgRU5WX0FXU19MQU1CREEgPSBcImF3cy1sYW1iZGFcIjtcbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgRU5WX0dPT0dMRV9GVU5DVElPTlMgPSBcImdvb2dsZS1mdW5jdGlvbnNcIjtcbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgRU5WX0VMRUNUUk9OID0gXCJlbGVjdHJvblwiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBFTlZfTk9ERSA9IFwibm9kZVwiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBFTlZfQlJPV1NFUiA9IFwiYnJvd3NlclwiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBFTlZfV0VCX1dPUktFUiA9IFwid2ViLXdvcmtlclwiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBFTlZfREVOTyA9IFwiZGVub1wiO1xuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBFTlZfVU5LTk9XTiA9IFwidW5rbm93blwiO1xuXG4vKipcbiAqIERldGVjdHMgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgcnVudGltZSBlbnZpcm9ubWVudC5cbiAqXG4gKiAtICdhd3MtbGFtYmRhJzogQVdTIExhbWJkYSBlbnZpcm9ubWVudFxuICogLSAnZ29vZ2xlLWZ1bmN0aW9ucyc6IEdvb2dsZSBDbG91ZCBGdW5jdGlvbnMgZW52aXJvbm1lbnRcbiAqIC0gJ2VsZWN0cm9uJzogRWxlY3Ryb24gZW52aXJvbm1lbnRcbiAqIC0gJ25vZGUnOiBOb2RlLmpzIGVudmlyb25tZW50XG4gKiAtICdicm93c2VyJzogQnJvd3NlciBlbnZpcm9ubWVudFxuICogLSAnd2ViLXdvcmtlcic6IFdlYiBXb3JrZXIgZW52aXJvbm1lbnRcbiAqIC0gJ2Rlbm8nOiBEZW5vIGVudmlyb25tZW50XG4gKiAtICdyZWFjdC1uYXRpdmUnOiBSZWFjdCBOYXRpdmUgZW52aXJvbm1lbnRcbiAqIC0gJ3Vua25vd24nOiBVbmtub3duIGVudmlyb25tZW50XG4gKlxuICogQHNpbmNlIDMuMzQuMFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGV0ZWN0ZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUG9zc2libGUgdmFsdWVzIGFyZTpcbiAqL1xuZnVuY3Rpb24gZGV0ZWN0UnVudGltZUVudmlyb25tZW50KCkge1xuXHQvLyBBV1MgTGFtYmRhIGVudmlyb25tZW50XG5cdGlmIChcblx0XHR0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdHByb2Nlc3MuZW52ICE9IG51bGwgJiZcblx0XHRwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUVcblx0KSB7XG5cdFx0cmV0dXJuIEVOVl9BV1NfTEFNQkRBO1xuXHR9XG5cblx0Ly8gR29vZ2xlIENsb3VkIEZ1bmN0aW9ucyBlbnZpcm9ubWVudFxuXHRpZiAoXG5cdFx0dHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRwcm9jZXNzLmVudiAhPSBudWxsICYmXG5cdFx0cHJvY2Vzcy5lbnYuRlVOQ1RJT05fTkFNRVxuXHQpIHtcblx0XHRyZXR1cm4gRU5WX0dPT0dMRV9GVU5DVElPTlM7XG5cdH1cblxuXHQvLyBOb2RlLmpzIGVudmlyb25tZW50XG5cdGlmIChcblx0XHR0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdHByb2Nlc3MudmVyc2lvbnMgIT0gbnVsbCAmJlxuXHRcdHByb2Nlc3MudmVyc2lvbnMubm9kZSAhPSBudWxsXG5cdCkge1xuXHRcdC8vIEVsZWN0cm9uIGVudmlyb25tZW50XG5cdFx0aWYgKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIEVOVl9FTEVDVFJPTjtcblx0XHR9XG5cdFx0cmV0dXJuIEVOVl9OT0RFO1xuXHR9XG5cblx0Ly8gQnJvd3NlciBlbnZpcm9ubWVudFxuXHRpZiAoXG5cdFx0dHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHR0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0dHlwZW9mIG5hdmlnYXRvci51c2VyQWdlbnQgPT09IFwic3RyaW5nXCJcblx0KSB7XG5cdFx0Ly8gV2ViIFdvcmtlciBlbnZpcm9ubWVudFxuXHRcdGlmICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRyZXR1cm4gRU5WX1dFQl9XT1JLRVI7XG5cdFx0fVxuXHRcdHJldHVybiBFTlZfQlJPV1NFUjtcblx0fVxuXG5cdC8vIERlbm8gZW52aXJvbm1lbnRcblx0aWYgKHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0cmV0dXJuIEVOVl9ERU5PO1xuXHR9XG5cblx0Ly8gVW5rbm93biBlbnZpcm9ubWVudFxuXHRyZXR1cm4gRU5WX1VOS05PV047XG59XG5cbmV4cG9ydCB7XG5cdEVOVl9BV1NfTEFNQkRBLFxuXHRFTlZfR09PR0xFX0ZVTkNUSU9OUyxcblx0RU5WX0VMRUNUUk9OLFxuXHRFTlZfTk9ERSxcblx0RU5WX0JST1dTRVIsXG5cdEVOVl9XRUJfV09SS0VSLFxuXHRFTlZfREVOTyxcblx0RU5WX1VOS05PV04sXG5cdGRldGVjdFJ1bnRpbWVFbnZpcm9ubWVudCxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtTdHlsZXNoZWV0fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc291cmNlL2RvbS9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzXCI7XG5pbXBvcnQge0RhdGFVcmx9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuXG5gO1xuXG5cbmRlc2NyaWJlKCdTdHlsZXNoZWV0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSh7XG4gICAgICAgICAgICBydW5TY3JpcHRzOiBcImRhbmdlcm91c2x5XCIsXG4gICAgICAgICAgICByZXNvdXJjZXM6IFwidXNhYmxlXCJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3RpbmcoKVxuICAgIH0pXG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBjbGVhbnVwRE9NRnJvbVRlc3RpbmcoKTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ1N0eWxlc2hlZXQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ2Nvbm5lY3QoKS5hdmFpbGFibGUoKScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBuZXcgU3R5bGVzaGVldCh7XG4gICAgICAgICAgICAgICAgaHJlZjogbmV3IERhdGFVcmwoJycsICd0ZXh0L2NzcycpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc3R5bGVzaGVldC5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBzdHlsZXNoZWV0LmdldE9wdGlvbignaWQnKVxuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0V4dGVybmFsIFN0eWxlc2hlZXQnLCAoKSA9PiB7XG5cbiAgICAgICAgbGV0IGlkID0gbmV3IElEKCdTdHlsZXNoZWV0JykudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IHN0eWxlc2hlZXQsIHVybCA9ICdodHRwczovL2FsdmluZS5pby9tYWluLm1pbi5jc3MnO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICBzdHlsZXNoZWV0ID0gbmV3IFN0eWxlc2hlZXQoe1xuICAgICAgICAgICAgICAgIGhyZWY6IHVybCxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYXBwZW5kIGFuZCByZW1vdmUgU3R5bGVzaGVldCAnLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBleHBlY3Qoc3R5bGVzaGVldC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgc3R5bGVzaGVldC5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3R5bGVzaGVldC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChzdHlsZXNoZWV0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbmxldCBhZGRlZE5vZGVzLCBtdXRhdGlvbm9ic2VydmVyO1xuXG5mdW5jdGlvbiBpbml0KCkge1xuXG4gICAgYWRkZWROb2RlcyA9IFtdO1xuICAgIG11dGF0aW9ub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChtdXRhdGlvbikge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLnJlbW92ZWROb2Rlcykge1xuXG4gICAgICAgICAgICAgICAgbXV0YXRpb24uYWRkZWROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkTm9kZXMucHVzaChuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3RpbmcoKSB7XG5cbiAgICBpZiAobXV0YXRpb25vYnNlcnZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluaXQoKVxuICAgIH1cblxuICAgIG11dGF0aW9ub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyksIHtjaGlsZExpc3Q6IHRydWV9KTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cERPTUZyb21UZXN0aW5nKCkge1xuICAgIG11dGF0aW9ub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXG4gICAgZm9yIChjb25zdCBuIG9mIGFkZGVkTm9kZXMpIHtcbiAgICAgICAgbi5yZW1vdmUoKTtcbiAgICB9XG59IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7TGlua30gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay5tanNcIjtcbmltcG9ydCB7RGF0YVVybH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2NsZWFudXBET01Gcm9tVGVzdGluZywgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jbGVhbnVwZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmNoYWkudXNlKGNoYWlEb20pO1xuXG5cblxuZGVzY3JpYmUoJ0xpbmsnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdMaW5rKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCg1MDAwKTtcblxuICAgICAgICBpdCgnY29ubmVjdCgpLmF2YWlsYWJsZSgpJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgbGluayA9IG5ldyBMaW5rKHtcbiAgICAgICAgICAgICAgICBocmVmOiBuZXcgRGF0YVVybCgnJywgJ3RleHQvY3NzJykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxpbmsuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0V4dGVybmFsIExpbmsnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMudGltZW91dCg1MDAwKTtcblxuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoJ2xpbmsnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgbGluaywgdXJsID0gJ2h0dHBzOi8vYWx2aW5lLmlvL21haW4ubWluLmNzcyc7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGxpbmsgPSBuZXcgTGluayh7XG4gICAgICAgICAgICAgICAgaHJlZjogdXJsLFxuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwcGVuZCBhbmQgcmVtb3ZlIExpbmsgJywgKGRvbmUpID0+IHtcblxuICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgIGxpbmsuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChsaW5rLmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgbGluay5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChsaW5rLmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaHJlZj1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QobGluay5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7U2NyaXB0fSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL2RvbS9yZXNvdXJjZS9zY3JpcHQubWpzXCI7XG5pbXBvcnQge0RhdGFVcmx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuXG5gO1xuXG5cbmRlc2NyaWJlKCdTY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdTY3JpcHQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3NldEV2ZW50VHlwZXMoKScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IG5ldyBTY3JpcHQoe1xuICAgICAgICAgICAgICAgIHNyYzogbmV3IERhdGFVcmwoJycsICd0ZXh0L2phdmFzY3JpcHQnKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcbiAgICAgICAgICAgICAgICBkZWZlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW50ZWdyaXR5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbm9tb2R1bGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVmZXJyZXJwb2xpY3k6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC9qYXZhc2NyaXB0J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjcmlwdC5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHNjcmlwdC5nZXRPcHRpb24oJ2lkJylcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFeHRlcm5hbCBKUycsICgpID0+IHtcblxuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoJ3NjcmlwdCcpLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBzZXJ2ZXIsIHNjcmlwdCwgdXJsID0gJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xheXpyLmpzLzIuMi4yL2xheXpyLm1pbi5qcyc7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgIHNjcmlwdCA9IG5ldyBTY3JpcHQoe1xuICAgICAgICAgICAgICAgIHNyYzogdXJsLFxuICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcbiAgICAgICAgICAgICAgICBkZWZlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW50ZWdyaXR5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbm9tb2R1bGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVmZXJyZXJwb2xpY3k6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgICAgICAgICBpZDogaWRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhcHBlbmQgYW5kIHJlbW92ZSBzY3JpcHQgJywgKGRvbmUpID0+IHtcblxuICAgICAgICAgICAgZXhwZWN0KHNjcmlwdC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgc2NyaXB0LmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tzcmM9XCInICsgdXJsICsgJ1wiXScpKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbc3JjPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgc2NyaXB0LmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHNjcmlwdC5pc0Nvbm5lY3RlZCgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3NyYz1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tzcmM9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChzY3JpcHQuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCAqIGFzIGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQge0RhdGF9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzXCI7XG5pbXBvcnQge0RhdGFVcmx9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuXG5gO1xuXG5cbmRlc2NyaWJlKCdEYXRhJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGZldGNoUmVmZXJlbmNlLCByZXR1cm5TdGF0dXMsIG11dGF0aW9ub2JzZXJ2ZXIsIGFkZGVkTm9kZXMgPSBbXTtcblxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcblxuICAgICAgICByZXR1cm5TdGF0dXMgPSAyMDA7XG4gICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snZmV0Y2gnXTtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1cmwnKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJldHVyblN0YXR1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9O1xuXG5cbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgICAgICBjbGVhbnVwRE9NRnJvbVRlc3RpbmcoKTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ0RhdGEoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3NldEV2ZW50VHlwZXMoKScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YSh7XG4gICAgICAgICAgICAgICAgc3JjOiBuZXcgRGF0YVVybCgnJywgJ3RleHQvamF2YXNjcmlwdCcpLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFeHRlcm5hbCBEYXRhJywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpZCA9IG5ldyBJRCgnZGF0YScpLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBzZXJ2ZXIsIGRhdGEsIHVybCA9ICdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sYXl6ci5qcy8yLjIuMi9sYXl6ci5taW4uanMnO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICBkYXRhID0gbmV3IERhdGEoe1xuICAgICAgICAgICAgICAgIHNyYzogdXJsLFxuICAgICAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2RhdGEgaXMgbm90IGNvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChkYXRhLmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjb25uZWN0IGFuZCBjaGVjayBhdmFpbGFiaWxpdHknLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBkYXRhLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZGF0YS5pc0Nvbm5lY3RlZCgpLCAnaXNDb25uZWN0ZWQgMScpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXScpLCAnZXhpc3RzIDEnKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucGFyZW50RWxlbWVudDtcblxuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRhdGEuaXNDb25uZWN0ZWQoKSwgJ2lzQ29ubmVjdGVkIDInKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3R5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJdJyksICdleGlzdHMgMicpLm5vdC50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGRhdGEuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZGF0YS5pc0Nvbm5lY3RlZCgpLCAnaXNDb25uZWN0ZWQgMycpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIl0nKSwgJ2V4aXN0cyAzJykudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3R5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJdJyksICdleGlzdHMgNCcpLm5vdC50by5leGlzdDtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRhdGEuaXNDb25uZWN0ZWQoKSwgJ2lzQ29ubmVjdGVkIDQnKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ2luaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgbGV0IGVsZW1lbnQ7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgbGV0IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXM7XG5cbiAgICBiZWZvcmUoIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL3NvdXJjZS9kb20vdXRpbC9pbml0LW9wdGlvbnMtZnJvbS1hdHRyaWJ1dGVzLm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyA9IG1bJ2luaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMnXTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIG9wdGlvbnMgPSB7dXJsOiBcIlwiLCBrZXk6IHtzdWJrZXk6IFwiXCIsIGNhc2VTZW5zaXRpdmU6IHRydWV9fTtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIG9wdGlvbnMgd2l0aCBtYXRjaGluZyBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLW9wdGlvbi11cmwnLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLW9wdGlvbi1rZXktc3Via2V5JywgJ3Rlc3QnKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQudXJsKS50by5lcXVhbCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleS5zdWJrZXkpLnRvLmVxdWFsKCd0ZXN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBtb2RpZnkgb3B0aW9ucyB3aXRob3V0IG1hdGNoaW5nIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC51cmwpLnRvLmVxdWFsKCcnKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5rZXkuc3Via2V5KS50by5lcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBhdHRyaWJ1dGVzIHdpdGhvdXQgdGhlIGNvcnJlY3QgcHJlZml4JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1zb21lLW9wdGlvbi11cmwnLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC51cmwpLnRvLmVxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaWdub3JlIGF0dHJpYnV0ZXMgd2l0aCBpbnZhbGlkIG9wdGlvbiBwYXRocycsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1vcHRpb24tbm9uZXhpc3RlbnQnLCAndmFsdWUnKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwob3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IG1hcHBpbmcgZm9yIGEgc2luZ2xlIGF0dHJpYnV0ZScsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1vcHRpb24tdXJsJywgJ2V4YW1wbGUnKTtcbiAgICAgICAgY29uc3QgbWFwcGluZyA9IHtcbiAgICAgICAgICAgICd1cmwnOiAodmFsdWUpID0+ICdodHRwczovLycgKyB2YWx1ZSArICcuY29tJ1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucywgbWFwcGluZyk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC51cmwpLnRvLmVxdWFsKCdodHRwczovL2V4YW1wbGUuY29tJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IG1hcHBpbmcgZm9yIGEgbmVzdGVkIGF0dHJpYnV0ZScsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1vcHRpb24ta2V5LXN1YmtleScsICcxMjMnKTtcbiAgICAgICAgY29uc3QgbWFwcGluZyA9IHtcbiAgICAgICAgICAgICdrZXkuc3Via2V5JzogKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSwgMTApICogMlxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucywgbWFwcGluZyk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5rZXkuc3Via2V5KS50by5lcXVhbChcIjI0NlwiKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXBwbHkgbXVsdGlwbGUgbWFwcGluZ3MnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItb3B0aW9uLXVybCcsICdleGFtcGxlJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItb3B0aW9uLWtleS1zdWJrZXknLCAnMTIzJyk7XG4gICAgICAgIGNvbnN0IG1hcHBpbmcgPSB7XG4gICAgICAgICAgICAndXJsJzogKHZhbHVlKSA9PiAnaHR0cHM6Ly8nICsgdmFsdWUgKyAnLmNvbScsXG4gICAgICAgICAgICAna2V5LnN1YmtleSc6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSAqIDJcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMsIG1hcHBpbmcpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQudXJsKS50by5lcXVhbCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleS5zdWJrZXkpLnRvLmVxdWFsKFwiMjQ2XCIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpZ25vcmUgbWFwcGluZ3MgZm9yIG5vbi1leGlzdGluZyBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXBwaW5nID0ge1xuICAgICAgICAgICAgJ3VybCc6ICh2YWx1ZSkgPT4gJ2h0dHBzOi8vJyArIHZhbHVlICsgJy5jb20nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLCBtYXBwaW5nKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnVybCkudG8uZXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpZ25vcmUgbWFwcGluZ3MgZm9yIGludmFsaWQgb3B0aW9uIHBhdGhzJywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLW9wdGlvbi1ub25leGlzdGVudCcsICd2YWx1ZScpO1xuICAgICAgICBjb25zdCBtYXBwaW5nID0ge1xuICAgICAgICAgICAgJ25vbmV4aXN0ZW50JzogKHZhbHVlKSA9PiB2YWx1ZSArICdiYXInXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLCBtYXBwaW5nKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKG9wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhcHBseSBtYXBwaW5nIG9ubHkgdG8gc3BlY2lmaWVkIGF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItb3B0aW9uLXVybCcsICdleGFtcGxlJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItb3B0aW9uLWtleS1zdWJrZXknLCAnMTIzJyk7XG4gICAgICAgIGNvbnN0IG1hcHBpbmcgPSB7XG4gICAgICAgICAgICAndXJsJzogKHZhbHVlKSA9PiAnaHR0cHM6Ly8nICsgdmFsdWUgKyAnLmNvbSdcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMsIG1hcHBpbmcpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQudXJsKS50by5lcXVhbCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleS5zdWJrZXkpLnRvLmVxdWFsKCcxMjMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFwcGx5IG1hcHBpbmcgaWYgbm90IGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItb3B0aW9uLXVybCcsICdleGFtcGxlJyk7XG4gICAgICAgIGNvbnN0IG1hcHBpbmcgPSB7XG4gICAgICAgICAgICAndXJsJzogJ2h0dHBzOi8vZXhhbXBsZS5jb20nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLCBtYXBwaW5nKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnVybCkudG8uZXF1YWwoJ2V4YW1wbGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXBwbHkgbWFwcGluZyB3aXRoIGN1c3RvbSBwcmVmaXgnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWN1c3RvbS1vcHRpb24tdXJsJywgJ2V4YW1wbGUnKTtcbiAgICAgICAgY29uc3QgbWFwcGluZyA9IHtcbiAgICAgICAgICAgICd1cmwnOiAodmFsdWUpID0+ICdodHRwczovLycgKyB2YWx1ZSArICcuY29tJ1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucywgbWFwcGluZywgJ2RhdGEtY3VzdG9tLW9wdGlvbi0nKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnVybCkudG8uZXF1YWwoJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFwcGx5IG1hcHBpbmcgd2l0aCBpbmNvcnJlY3QgY3VzdG9tIHByZWZpeCcsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VzdG9tLW9wdGlvbi11cmwnLCAnZXhhbXBsZScpO1xuICAgICAgICBjb25zdCBtYXBwaW5nID0ge1xuICAgICAgICAgICAgJ3VybCc6ICh2YWx1ZSkgPT4gJ2h0dHBzOi8vJyArIHZhbHVlICsgJy5jb20nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLCBtYXBwaW5nKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0LnVybCkudG8uZXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhcHBseSBjYXNlIHNlbnNpdGl2ZSBtYXBwaW5nJywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLW9wdGlvbi1rZXktY2FzZVNlbnNpdGl2ZScsICdmYWxzZScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQua2V5LmNhc2VTZW5zaXRpdmUpLnRvLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxufSk7XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtleHRyYWN0S2V5c30gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9kb20vdXRpbC9leHRyYWN0LWtleXMubWpzXCI7XG5cblxuZGVzY3JpYmUoJ2V4dHJhY3RLZXlzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBrZXlzIGZyb20gdGhlIGdpdmVuIG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICAgICAgZmlyc3ROYW1lOiAnSm9obicsXG4gICAgICAgICAgICBsYXN0TmFtZTogJ0RvZScsXG4gICAgICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgICAgICAgc3RyZWV0OiAnMTIzIE1haW4gU3QnLFxuICAgICAgICAgICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gbmV3IE1hcChbXG4gICAgICAgICAgICBbJ2ZpcnN0bmFtZScsICdmaXJzdE5hbWUnXSxcbiAgICAgICAgICAgIFsnbGFzdG5hbWUnLCAnbGFzdE5hbWUnXSxcbiAgICAgICAgICAgIFsnYWRkcmVzcy1zdHJlZXQnLCAnYWRkcmVzcy5zdHJlZXQnXSxcbiAgICAgICAgICAgIFsnYWRkcmVzcy1jaXR5JywgJ2FkZHJlc3MuY2l0eSddLFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleHRyYWN0S2V5cyhvYmopO1xuXG4gICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlc3VsdCkpKS50by5lcXVhbChKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKGV4cGVjdGVkKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY3VzdG9tIGtleSBhbmQgdmFsdWUgc2VwYXJhdG9ycycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICAgICAgZmlyc3ROYW1lOiAnSm9obicsXG4gICAgICAgICAgICBsYXN0TmFtZTogJ0RvZScsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBuZXcgTWFwKFtcbiAgICAgICAgICAgIFsncHJlZml4K2ZpcnN0bmFtZScsICdwcmVmaXgrZmlyc3ROYW1lJ10sXG4gICAgICAgICAgICBbJ3ByZWZpeCtsYXN0bmFtZScsICdwcmVmaXgrbGFzdE5hbWUnXSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXh0cmFjdEtleXMob2JqLCAncHJlZml4JywgJysnLCAnKycpO1xuXG4gICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlc3VsdCkpKS50by5lcXVhbChKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKGV4cGVjdGVkKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoZWNrIGlmIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgICAgICAgICAgbGFzdE5hbWU6ICdEb2UnLFxuICAgICAgICAgICAgYWRkcmVzczogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleHBlY3RlZCA9IG5ldyBNYXAoW1xuICAgICAgICAgICAgWydmaXJzdG5hbWUnLCAnZmlyc3ROYW1lJ10sXG4gICAgICAgICAgICBbJ2xhc3RuYW1lJywgJ2xhc3ROYW1lJ10sXG4gICAgICAgICAgICBbJ2FkZHJlc3MnLCAnYWRkcmVzcyddLFxuICAgICAgICAgICAgXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RLZXlzKG9iaik7XG5cbiAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVzdWx0KSkpLnRvLmVxdWFsKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20oZXhwZWN0ZWQpKSk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgbW9yZSB0ZXN0IGNhc2VzIGFzIG5lZWRlZFxufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi8uLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsLCBnZXRHbG9iYWxGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7IEZhY3RvcnkgfTtcblxuLyoqXG4gKiBBIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHdvcmtlciBpbnN0YW5jZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBzbWFsbCBmYWN0b3J5IHRvIGNyZWF0ZSB3b3JrZXJcbiAqL1xuY2xhc3MgRmFjdG9yeSBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG5cdFx0XHR3b3JrZXI6IG5ldyBXZWFrTWFwKCksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgd29ya2VyIGZyb20gYSBVUkxcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3JIYW5kbGVyXG5cdCAqIEByZXR1cm4ge1dvcmtlcn1cblx0ICovXG5cdGNyZWF0ZUZyb21VUkwgPSBmdW5jdGlvbiAodXJsLCBtZXNzYWdlSGFuZGxlciwgZXJyb3JIYW5kbGVyKSB7XG5cdFx0aWYgKHVybCBpbnN0YW5jZW9mIFVSTCkge1xuXHRcdFx0dXJsID0gdXJsLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgd29ya2VyQ2xhc3MgPSBnZXRHbG9iYWxGdW5jdGlvbihcIldvcmtlclwiKTtcblx0XHR2YXIgd29ya2VyID0gbmV3IHdvcmtlckNsYXNzKHZhbGlkYXRlU3RyaW5nKHVybCkpO1xuXG5cdFx0aWYgKGlzRnVuY3Rpb24obWVzc2FnZUhhbmRsZXIpKSB7XG5cdFx0XHR3b3JrZXIub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLmNhbGwod29ya2VyLCBldmVudCk7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChpc0Z1bmN0aW9uKGVycm9ySGFuZGxlcikpIHtcblx0XHRcdHdvcmtlci5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGVycm9ySGFuZGxlci5jYWxsKHdvcmtlciwgZXZlbnQpO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd29ya2VyO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgd29ya2VyIGZyb20gYSBzY3JpcHRcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3JIYW5kbGVyXG5cdCAqIEByZXR1cm4ge1dvcmtlcn1cblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9BUEkvVVJML2NyZWF0ZU9iamVjdFVSTFxuXHQgKi9cblx0Y3JlYXRlRnJvbVNjcmlwdCA9IGZ1bmN0aW9uIChjb250ZW50LCBtZXNzYWdlSGFuZGxlciwgZXJyb3JIYW5kbGVyKSB7XG5cdFx0Y29uc3QgYmxvYkZ1bmN0aW9uID0gbmV3IGdldEdsb2JhbEZ1bmN0aW9uKFwiQmxvYlwiKTtcblx0XHRjb25zdCBibG9iID0gbmV3IGJsb2JGdW5jdGlvbihbdmFsaWRhdGVTdHJpbmcoY29udGVudCldLCB7XG5cdFx0XHR0eXBlOiBcInNjcmlwdC9qYXZhc2NyaXB0XCIsXG5cdFx0fSk7XG5cblx0XHRjb25zdCB1cmwgPSBnZXRHbG9iYWxGdW5jdGlvbihcIlVSTFwiKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdFx0Y29uc3Qgd29ya2VyID0gdGhpcy5jcmVhdGVGcm9tVVJMKHVybCwgbWVzc2FnZUhhbmRsZXIsIGVycm9ySGFuZGxlcik7XG5cblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXVtcIndvcmtlclwiXS5zZXQod29ya2VyLCB1cmwpO1xuXG5cdFx0cmV0dXJuIHdvcmtlcjtcblx0fTtcblxuXHQvKipcblx0ICogVGVybWluYXRlIHRoZSB3b3JrZXIgYW5kIGNhbGwgcmV2b2tlT2JqZWN0VVJMIGlmIG5lY2Vzc2FyeS5cblx0ICpcblx0ICogQHBhcmFtIHdvcmtlclxuXHQgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Xb3JrZXIuRmFjdG9yeX1cblx0ICovXG5cdHRlcm1pbmF0ZSh3b3JrZXIpIHtcblx0XHRjb25zdCB3b3JrZXJDbGFzcyA9IGdldEdsb2JhbEZ1bmN0aW9uKFwiV29ya2VyXCIpO1xuXHRcdHZhbGlkYXRlSW5zdGFuY2Uod29ya2VyLCB3b3JrZXJDbGFzcyk7XG5cblx0XHR3b3JrZXIudGVybWluYXRlKCk7XG5cblx0XHRpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJ3b3JrZXJcIl0uaGFzKHdvcmtlcikpIHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wid29ya2VyXCJdLmdldCh3b3JrZXIpO1xuXHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtGYWN0b3J5fSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL2RvbS93b3JrZXIvZmFjdG9yeS5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NLCBpc05vZGV9IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuZGVzY3JpYmUoJ1dvcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFsnVVJMJ10sICdjcmVhdGVPYmplY3RVUkwnLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiL2V4YW1wbGUubWpzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBnbG9iYWxbJ1dvcmtlciddID0gY2xhc3Mge1xuICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb25lcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb25tZXNzYWdlKCkge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhID0gdHlwZW9mIGdsb2JhbFsnV29ya2VyJ107XG4gICAgICAgICAgICBsZXQgYTEgPSB0eXBlb2YgV29ya2VyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqc2RvbSA9IGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdGYWN0b3J5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdjcmVhdGUgd29ya2VyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGZhY3RvcnkuY3JlYXRlRnJvbVNjcmlwdCgnY29uc29sZS5sb2coXCJoZWxsbyB3b3JsZFwiKTsnKVxuICAgICAgICAgICAgZXhwZWN0KHdvcmtlcikuaXMuaW5zdGFuY2VvZihXb3JrZXIpO1xuXG4gICAgICAgICAgICBleHBlY3QoZmFjdG9yeS50ZXJtaW5hdGUod29ya2VyKSkuaXMuaW5zdGFuY2VvZihGYWN0b3J5KVxuXG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuICAgIDx0ZW1wbGF0ZSBpZD1cImN1cnJlbnRcIj5cbiAgICAgICAgPGxpIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDpjdXJyZW50IHwgdG9qc29uXCI+PC9saT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgICAgICA8dWwgZGF0YS1tb25zdGVyLWluc2VydD1cImN1cnJlbnQgcGF0aDphLmJcIj5cbiAgICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwidGVzdDJcIj5cbiAgICAgICAgPHVsIGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJjdXJyZW50IHBhdGg6YS5iIHwgZG9pdFwiPlxuICAgICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJ0ZXN0M1wiPlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2xhc3MgcGF0aDphLmJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5jXCIgaWQ9XCJpbnB1dDFcIj5cbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNoZWNrZWQgcGF0aDphLmNoZWNrYm94XCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNoZWNrYm94XCIgaWQ9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwidmFsdWUgcGF0aDphLnRleHRcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJ0ZXh0XCIgaWQ9XCJ0ZXh0XCI+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjaGVja2VkIHBhdGg6YS5yYWRpb1wiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjFcIiBpZD1cInJhZGlvXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyMlwiIGlkPVwicjJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInJ4XCIgaWQ9XCJyeFwiPlxuXG4gICAgICAgICAgICA8c2VsZWN0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwidmFsdWUgcGF0aDphLnNlbGVjdFwiIG5hbWU9XCJzZWxlY3RcIiBpZD1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvdGhlci12YWx1ZVwiPnZhbHVlMTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUyPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgPHNlbGVjdCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5tdWx0aXNlbGVjdFwiIG5hbWU9XCJtdWx0aXNlbGVjdFwiIG11bHRpcGxlIGlkPVwibXVsdGlzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlNDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvdGhlci12YWx1ZTVcIj52YWx1ZTU8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT1cInRleHRhcmVhXCIgaWQ9XCJ0ZXh0YXJlYVwiIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwidmFsdWUgcGF0aDphLnRleHRhcmVhXCI+PC90ZXh0YXJlYT5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuYDtcblxubGV0IGh0bWwyID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDp0ZXh0IHwgdG9sb3dlclwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDp0ZXh0IHwgY2FsbDpteWZvcm1hdHRlclwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbmA7XG5cbmxldCBodG1sMyA9IGBcblxuICAgIDx0ZW1wbGF0ZSBpZD1cIm15aW5uZXJpZFwiPlxuICAgICAgICA8c3BhbiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6bXlpbm5lcmlkIHwgdG9qc29uXCI+PC9zcGFuPlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgaWQ9XCJteWlkXCI+XG4gICAgICAgIDxwIGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJteWlubmVyaWQgcGF0aDphLmJcIj48L3A+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJteWlkIHBhdGg6YS5iXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbmA7XG5cbmxldCBodG1sNCA9IGBcbiAgICA8ZGl2PlxuICAgICAgICA8Zm9ybSBpZD1cImZvcm0xXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJjaGVja2VkXCIgbmFtZT1cImNoZWNrYm94XCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnN0YXRlXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidGV4dFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjFcIiBpZD1cInIxXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnJhZGlvXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyMlwiIGlkPVwicjJcIiBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6cmFkaW9cIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInJ4XCIgaWQ9XCJyeFwiIGRhdGEtY29tbWVudD1cIm5vdCBjYWxsZWQgYmVjYXVzZSBubyBiaW5kIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIiBuYW1lPVwiYnV0dG9uXCI+XG5cbiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInNlbGVjdDFcIiBpZD1cInNlbGVjdDFcIiBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6c2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInNlbGVjdDJcIiBtdWx0aXBsZSBpZD1cInNlbGVjdDJcIiBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6bXVsdGlzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlNDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWU1PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9XCJ0ZXh0YXJlYVwiIGlkPVwidGV4dGFyZWFcIiBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6dGV4dGFyZWFcIj5cbiAgICAgICAgICAgIFxuICAgICAgICA8L3RleHRhcmVhPlxuXG4gICAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cblxuYDtcblxuXG5cbmRlc2NyaWJlKCdET00nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgVXBkYXRlciA9IG51bGw7XG4gICAgXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdEpTRE9NKG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3VwZGF0ZXIubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBVcGRhdGVyID0gbS5VcGRhdGVyO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd0ZXN0IEdldHRlciAmJiBTZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2V0RXZlbnRUeXBlcygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCkuc2V0RXZlbnRUeXBlcyhbJ3RvdWNoJ10pKS50by5iZS5pbnN0YW5jZW9mKFVwZGF0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGl0KCdnZXRTdWJqZWN0KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0ge2E6IDF9O1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVXBkYXRlcihlbGVtZW50LCBzdWJqZWN0KS5nZXRTdWJqZWN0KCkuYSkudG8uYmUuZXF1YWwoMSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgndGVzdCBjb250cm9sIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVXBkYXRlcihlbGVtZW50KS5lbmFibGVFdmVudFByb2Nlc3NpbmcoKSkudG8uYmUuaW5zdGFuY2VvZihVcGRhdGVyKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdkaXNhYmxlRXZlbnRQcm9jZXNzaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVXBkYXRlcihlbGVtZW50KS5kaXNhYmxlRXZlbnRQcm9jZXNzaW5nKCkpLnRvLmJlLmluc3RhbmNlb2YoVXBkYXRlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgndGVzdCBFcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IEVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVXBkYXRlcigpKS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IHZhbHVlIGlzIHdyb25nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVXBkYXRlcihlbGVtZW50LCBudWxsKSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBFcnJvcjogdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1LnJ1bigpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihcInNob3VsZCBuZXZlciBjYWxsZWQhXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZSkuaXMuaW5zdGFuY2VPZihFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZSArIFwiXCIpLnRvLmJlLmVxdWFsKCdFcnJvcjogdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG5cbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnbmV3IFVwZGF0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRvY3VtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpXG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IG5ldyBVcGRhdGVyKFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCdSZXBlYXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgYnVpbGQgNiBsaSBlbGVtZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICcwJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzInfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICczJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnNCd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzUnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGxpIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDphLmIuJyArIGkgKyAnIHwgdG9qc29uXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJjdXJyZW50LScgKyBpICsgJ1wiPntcImlcIjpcIicgKyBpICsgJ1wifTwvbGk+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcblxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKGUpKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDQ7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ0V2ZW50aGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCB1cGRhdGVyLCBmb3JtMSwgcHJveHlvYnNlcnZlcjtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHByb3h5b2JzZXJ2ZXIgPSBuZXcgUHJveHlPYnNlcnZlcih7fSlcbiAgICAgICAgICAgICAgICB1cGRhdGVyID0gbmV3IFVwZGF0ZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvcm0xJyksIHByb3h5b2JzZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIGZvcm0xID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvcm0xJyk7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIGhlcmUgY2xpY2sgZXZlbnRzIGFyZSB0aHJvd24gb24gdGhlIGNoZWNrYm94IGFuZCB0aGUgc2V0dGluZyBvZiB0aGUgdmFsdWUgaXMgb2JzZXJ2ZWQgdmlhIHRoZSBwcm94eW9ic2VydmVyLlxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgY2hlY2tib3ggY2xpY2sgZXZlbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHVwZGF0ZXIuZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS5pcy5lcXVhbChwcm94eW9ic2VydmVyLmdldFN1YmplY3QoKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBbJ2NoZWNrZWQnLCB1bmRlZmluZWQsICdjaGVja2VkJ107XG4gICAgICAgICAgICAgICAgLy8gaGVyZSB0aGUgbm90YXRpb24gd2l0aCBmdW5jdGlvbiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgdGhlIHBvaW50ZXIgaXMgc2V0LlxuICAgICAgICAgICAgICAgIHByb3h5b2JzZXJ2ZXIuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IGV4cGVjdGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB1bmRlZmluZWQgJiYgZXhwZWN0ZWQubGVuZ3RoID09PSAwKSBkb25lKG5ldyBFcnJvcigndG8gbWFueSBjYWxscycpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTdWJqZWN0KClbJ3N0YXRlJ10gIT09IGUpIGRvbmUobmV3IEVycm9yKHRoaXMuZ2V0U3ViamVjdCgpWydzdGF0ZSddICsgJyBzaG91bGQgJyArIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtMS5xdWVyeVNlbGVjdG9yKCdbbmFtZT1jaGVja2JveF0nKS5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtMS5xdWVyeVNlbGVjdG9yKCdbbmFtZT1jaGVja2JveF0nKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0sIDEwKVxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHJhZGlvIGNsaWNrIGV2ZW50cyAxJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHVwZGF0ZXIuZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS5pcy5lcXVhbChwcm94eW9ic2VydmVyLmdldFN1YmplY3QoKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBbJ3IxJywgJ3IyJywgJ3IxJ107XG4gICAgICAgICAgICAgICAgbGV0IGNsaWNrVGFyZ2V0cyA9IFsncjInLCAncjEnXVxuICAgICAgICAgICAgICAgIC8vIGhlcmUgdGhlIG5vdGF0aW9uIHdpdGggZnVuY3Rpb24gaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSB0aGlzIHBvaW50ZXIgaXMgc2V0LlxuICAgICAgICAgICAgICAgIHByb3h5b2JzZXJ2ZXIuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IGV4cGVjdGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB1bmRlZmluZWQgJiYgZXhwZWN0ZWQubGVuZ3RoID09PSAwKSBkb25lKG5ldyBFcnJvcigndG8gbWFueSBjYWxscycpKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IHRoaXMuZ2V0U3ViamVjdCgpWydyYWRpbyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAhPT0gZSkgZG9uZShuZXcgRXJyb3IodiArICcgc2hvdWxkICcgKyBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsaWNrVGFyZ2V0cy5zaGlmdCgpKS5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncjEnKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0sIDEwKVxuXG4gICAgICAgICAgICAgICAgLy8gbm8gaGFuZGxlciAvLyBiaW5kXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyeCcpLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfSwgMjApXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHNlbGVjdCBjbGljayBldmVudHMgMicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3QxJyk7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWyd2YWx1ZTInLCAndmFsdWUxJywgJ3ZhbHVlMiddO1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgdGhlIG5vdGF0aW9uIHdpdGggZnVuY3Rpb24gaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSB0aGlzIHBvaW50ZXIgaXMgc2V0LlxuICAgICAgICAgICAgICAgIHByb3h5b2JzZXJ2ZXIuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IGV4cGVjdGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB1bmRlZmluZWQgJiYgZXhwZWN0ZWQubGVuZ3RoID09PSAwKSBkb25lKG5ldyBFcnJvcigndG8gbWFueSBjYWxscycpKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IHRoaXMuZ2V0U3ViamVjdCgpWydzZWxlY3QnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IGUpIGRvbmUobmV3IEVycm9yKHYgKyAnIHNob3VsZCAnICsgZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXggPSBzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMClcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhbmQgc2ltdWxhdGUgY2xpY2sgZXZlbnQgZm9yIGJ1YmJsZVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXggPSAxO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmNsaWNrKCk7XG5cbiAgICAgICAgICAgICAgICB9LCAyMClcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHRleHRhcmVhIGV2ZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dGFyZWFFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHRhcmVhJyk7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWyd0ZXN0WCcsICdsb3JlbSBpcHN1bScsICcnXTtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFZhbHVlcyA9IFtcImxvcmVtIGlwc3VtXCIsIFwiXCJdO1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgdGhlIG5vdGF0aW9uIHdpdGggZnVuY3Rpb24gaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSB0aGlzIHBvaW50ZXIgaXMgc2V0LlxuICAgICAgICAgICAgICAgIHByb3h5b2JzZXJ2ZXIuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IGV4cGVjdGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB1bmRlZmluZWQgJiYgZXhwZWN0ZWQubGVuZ3RoID09PSAwKSBkb25lKG5ldyBFcnJvcigndG8gbWFueSBjYWxscycpKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IHRoaXMuZ2V0U3ViamVjdCgpWyd0ZXh0YXJlYSddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodikgIT09IEpTT04uc3RyaW5naWZ5KGUpKSBkb25lKG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh2KSArICcgc2hvdWxkICcgKyBKU09OLnN0cmluZ2lmeShlKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYUVsZW1lbnQudmFsdWUgPSB0ZXN0VmFsdWVzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMClcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHZhbHVlIGFuZCBzaW11bGF0ZSBjbGljayBldmVudCBmb3IgYnViYmxlXG4gICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWxlbWVudC52YWx1ZSA9IFwidGVzdFhcIjtcbiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbGVtZW50LmNsaWNrKCk7XG5cbiAgICAgICAgICAgICAgICB9LCAyMClcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG11bHRpcGxlIHNlbGVjdCBldmVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0MicpO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLmlzLmVxdWFsKHByb3h5b2JzZXJ2ZXIuZ2V0U3ViamVjdCgpKTtcblxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFtcbiAgICAgICAgICAgICAgICAgICAgWyd2YWx1ZTEnXSxcbiAgICAgICAgICAgICAgICAgICAgWyd2YWx1ZTInLCAndmFsdWUzJywgJ3ZhbHVlNCddLFxuICAgICAgICAgICAgICAgICAgICBbJ3ZhbHVlMScsICd2YWx1ZTQnXSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRlc3RTZWxlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICBbZmFsc2UsIHRydWUsIHRydWUsIHRydWVdLFxuICAgICAgICAgICAgICAgICAgICBbdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsnbXVsdGlzZWxlY3QnXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodikgIT09IEpTT04uc3RyaW5naWZ5KGUpKSBkb25lKG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh2KSArICcgc2hvdWxkICcgKyBKU09OLnN0cmluZ2lmeShlKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IHRlc3RTZWxlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzBdLnNlbGVjdGVkID0gdlswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMV0uc2VsZWN0ZWQgPSB2WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1syXS5zZWxlY3RlZCA9IHZbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzNdLnNlbGVjdGVkID0gdlszXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMClcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzFdLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1syXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbM10uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfSwgMjApXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ1JlcGxhY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgYWRkIGxvd2VyIGhlbGxvIGFuZCBIRUxMT3llcyEnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogXCJIQUxMT1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG5cbiAgICAgICAgICAgICAgICBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMztcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnUmVwbGFjZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCAnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFVwZGF0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMCd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG5cblxuICAgICAgICAgICAgICAgIGQucnVuKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJteWlkIHBhdGg6YS5iXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8cCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpbm5lcmlkIHBhdGg6YS5iXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJteWlkLTBcIj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxzcGFuIGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwicGF0aDphLmIuMCB8IHRvanNvblwiIGRhdGEtbW9uc3Rlci1pbnNlcnQtcmVmZXJlbmNlPVwibXlpbm5lcmlkLTBcIj57XCJpXCI6XCIwXCJ9PC9zcGFuPicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcblxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKGUpKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIGF0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QzJylcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZXh0LnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuICAgICAgICAgICAgICAgIGxldCByYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWRpbycpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHJhZGlvLmNoZWNrZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrYm94JylcbiAgICAgICAgICAgICAgICBleHBlY3QoY2hlY2tib3guY2hlY2tlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHNlbGVjdC5zZWxlY3RlZEluZGV4KS50by5iZS5lcXVhbCgwKTtcblxuICAgICAgICAgICAgICAgIGxldCBtdWx0aXNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtdWx0aXNlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KG11bHRpc2VsZWN0LnNlbGVjdGVkSW5kZXgpLnRvLmJlLmVxdWFsKC0xKTtcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0YXJlYScpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFwiZGl2LWNsYXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCJoZWxsb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IFwiaGVsbG9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpbzogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWE6IFwidGVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpc2VsZWN0OiBbJ3ZhbHVlMycsICd2YWx1ZTQnLCAnb3RoZXItdmFsdWU1J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiBcInZhbHVlMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94OiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmEuYlwiIGNsYXNzPVwiZGl2LWNsYXNzXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEuY1wiIGlkPVwiaW5wdXQxXCIgdmFsdWU9XCJoZWxsb1wiPicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPHRleHRhcmVhIG5hbWU9XCJ0ZXh0YXJlYVwiIGlkPVwidGV4dGFyZWFcIiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS50ZXh0YXJlYVwiIHZhbHVlPVwidGVzdFwiPicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2hlY2tlZCBwYXRoOmEucmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyYWRpb1wiIGNoZWNrZWQ9XCJ0cnVlXCI+Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0ZXh0LnZhbHVlLCAndGV4dCBjb250cm9sJykudG8uYmUuZXF1YWwoZC5nZXRTdWJqZWN0KClbJ2EnXVsnYyddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChyYWRpby5jaGVja2VkLCAncmFkaW8gY29udHJvbCcpLnRvLmJlLmVxdWFsKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlLCAndGV4dGFyZWEgY29udHJvbCcpLnRvLmJlLmVxdWFsKGQuZ2V0U3ViamVjdCgpWydhJ11bJ3RleHRhcmVhJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHNlbGVjdC5zZWxlY3RlZEluZGV4LCAnc2VsZWN0IGNvbnRyb2wnKS50by5iZS5lcXVhbCgxKTsgLy8gWzA9Pm90aGVyLXZhbHVlLCAxPT52YWx1ZTJdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdWx0aXNlbGVjdFNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9ial0gb2YgT2JqZWN0LmVudHJpZXMobXVsdGlzZWxlY3Quc2VsZWN0ZWRPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpc2VsZWN0U2VsZWN0ZWRPcHRpb25zLnB1c2gob2JqLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkobXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMpLCAnbXVsdGlzZWxlY3QgY29udHJvbCcpLnRvLmJlLmVxdWFsKEpTT04uc3RyaW5naWZ5KGQuZ2V0U3ViamVjdCgpWydhJ11bJ211bHRpc2VsZWN0J10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChjaGVja2JveC5jaGVja2VkLCAnY2hlY2tib3ggY29udHJvbCcpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0dldCBBdHRyaWJ1dGUgUGlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgaWQgPSBuZXcgSUQoJ21vbnN0ZXInKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGAgPGRpdiBpZD1cImAgKyBpZCArIGBcIlxuICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEgfCBpZjp2YWx1ZTpcXFxcIFwiPjwvZGl2PmBcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGluY2x1ZGUgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZC50b1N0cmluZygpKVxuXG4gICAgICAgICAgICBjb25zdCBwaXBlID0gZGl2LmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXJlcGxhY2UnKTtcbiAgICAgICAgICAgIGV4cGVjdChwaXBlLmxlbmd0aCkudG8uYmUuZXF1YWwoMjApO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnbWFudWVsIHVwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBpZCA9IG5ldyBJRCgnbW9uc3RlcicpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgPGlucHV0IGlkPVwiYCArIGlkICsgYFwiZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOm15dmFsdWVcIj5gXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZSA9IFwiaGVsbG9cIjtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXIgPSBuZXcgVXBkYXRlcihtb2Nrcyk7XG4gICAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnbXl2YWx1ZScpO1xuICAgICAgICAgICAgdXBkYXRlci5yZXRyaWV2ZSgpO1xuICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvLmhhdmUucHJvcGVydHkoJ215dmFsdWUnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICAvKipcbiAgICAgKiBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTJcbiAgICAgKi9cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpIDIwMjIwMTA3JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICBgO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdCdWdmaXggIzExMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBhZGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gJ3llYWghIDxiPlRlc3Q8L2I+ISc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJIVE1MID0gY29udGFpbmVyRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SFRNTCA9IG5ld0VsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogbmV3RWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoY29udGFpbmVyRWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2PnllYWghIDxiPlRlc3Q8L2I+ITwvZGl2PicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCAxMDApXG5cbiAgICAgICAgICAgICAgICAvLyBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBkLnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSwgMTAwKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtMb2NhbGV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi9sb2NhbGUubWpzXCI7XG5pbXBvcnQge2dldExvY2FsZU9mRG9jdW1lbnR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldExvY2FsZU9mRG9jdW1lbnQnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbXCJkZVwiXSxcbiAgICAgICAgICAgIFtcInNsLUlULW5lZGlzXCJdLFxuICAgICAgICAgICAgW1wiZW4tR0JcIl0sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJ3JldHVybiBsYW5ndWFnZSAnICsgYSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGh0bWwuaXRlbSgwKTtcblxuICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdsYW5nJywgYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGdldExvY2FsZU9mRG9jdW1lbnQoKS50b1N0cmluZygpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGl0KCdyZXR1cm4gbGFuZ3VhZ2UgZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKTtcbiAgICAgICAgbGV0IG5vZGUgPSBodG1sLml0ZW0oMCk7XG4gICAgICAgIGxldCBsYW5nPSBub2RlLmdldEF0dHJpYnV0ZSgnbGFuZycpO1xuXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdsYW5nJyk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IGdldExvY2FsZU9mRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KGxvY2FsZSkudG8uYmUuaW5zdGFuY2VPZihMb2NhbGUpO1xuICAgICAgICBleHBlY3QobG9jYWxlLmxvY2FsZVN0cmluZykudG8uYmUuZXF1YWwobmF2aWdhdG9yLmxhbmd1YWdlKTtcblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnbGFuZycsIGxhbmcpO1xuICAgICAgICBcbiAgICB9KVxuXG5cbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtnZXREb2N1bWVudEZyYWdtZW50RnJvbVN0cmluZ30gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1RoZW1lLCBnZXREb2N1bWVudFRoZW1lfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RvbS90aGVtZS5tanNcIjtcblxuZGVzY3JpYmUoJ1RoZW1lJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCduZXcgVGhlbWUoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gVGhlbWUgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUaGVtZSgnbXktdGhlbWUnKSkuaXMuYS5pbnN0YW5jZU9mKFRoZW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFRoZW1lLU5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRoZW1lKCdteS10aGVtZScpLmdldE5hbWUoKSkuaXMuZXF1YWwoJ215LXRoZW1lJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IEVycm9yIGJlY2F1c2UgZW1wdHkgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFRoZW1lKCkpLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgRXJyb3IgYmVjYXVzZSBubyBzdHJpbmcgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFRoZW1lKDIpKS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldERvY3VtZW50VGhlbWUoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gVGhlbWUgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGdldERvY3VtZW50VGhlbWUoKSkuaXMuYS5pbnN0YW5jZU9mKFRoZW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gRGVmYXVsdCBUaGVtZSBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGdldERvY3VtZW50VGhlbWUoKS5nZXROYW1lKCkpLmlzLmVxdWFsKCdtb25zdGVyJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0RG9jdW1lbnRUaGVtZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXRoZW1lLW5hbWUnLCAndGVzdHRoZW1lJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci10aGVtZS1uYW1lJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGVzdHRoZW1lIFRoZW1lIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoZ2V0RG9jdW1lbnRUaGVtZSgpLmdldE5hbWUoKSkuaXMuZXF1YWwoJ3Rlc3R0aGVtZScpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxubGV0IGh0bWwyID0gYFxuICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItYmluZD1cInBhdGg6YVwiIGlkPVwidGVzdDJcIiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YVwiPlxuYDtcblxuLy8gZGVmaW5lZCBpbiBjb25zdGFudHMubWpzXG5jb25zdCB1cGRhdGVyU3ltYm9sS2V5ID0gXCJAc2NodWthaS9tb25zdGVyL2RvbS9jdXN0b20tZWxlbWVudEBAb3B0aW9ucy11cGRhdGVyLWxpbmtcIlxuY29uc3QgdXBkYXRlclN5bWJvbFN5bWJvbCA9IFN5bWJvbC5mb3IodXBkYXRlclN5bWJvbEtleSk7XG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBDdXN0b21FbGVtZW50LCByZWdpc3RlckN1c3RvbUVsZW1lbnQsIFRlc3RDb21wb25lbnQsIGRvY3VtZW50LCBUZXN0Q29tcG9uZW50MiwgYXNzaWduVXBkYXRlclRvRWxlbWVudCxcbiAgICAgICAgYWRkT2JqZWN0V2l0aFVwZGF0ZXJUb0VsZW1lbnQ7XG5cbiAgICBkZXNjcmliZShcImFzc2lnblVwZGF0ZXJUb0VsZW1lbnRcIiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaW5pdEpTRE9NKG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uL3NvdXJjZS9kb20vdXBkYXRlci5tanNcIikudGhlbigoeXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkT2JqZWN0V2l0aFVwZGF0ZXJUb0VsZW1lbnQgPSB5eVsnYWRkT2JqZWN0V2l0aFVwZGF0ZXJUb0VsZW1lbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUVsZW1lbnQgPSBtWydDdXN0b21FbGVtZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduVXBkYXRlclRvRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50cywgb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRPYmplY3RXaXRoVXBkYXRlclRvRWxlbWVudC5jYWxsKHRoaXMsIGVsZW1lbnRzLCB1cGRhdGVyU3ltYm9sU3ltYm9sLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGlzIHRlc3QgdHJ5IHRvIHNpbXVsYXRlIHRoZSBidWcgdGhhdCB3YXMgZm91bmQgaW4gdGhlIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQgZnVuY3Rpb24uXG4gICAgICAgICAqIFRoZSBidWcgd2FzIHRoYXQgdGhlIHVwZGF0ZXIgd2FzIG5vdCBhc3NpZ25lZCB0byB0aGUgZWxlbWVudCB3aGVuIHRoZSBlbGVtZW50IHdhcyBjcmVhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiB1bmZvcnR1bmF0ZWx5LCB0aGlzIHRlc3QgZG9lcyBub3QgcmVwcm9kdWNlIHRoZSBidWcuXG4gICAgICAgICAqL1xuICAgICAgICBpdChcInNob3VsZCBhc3NpZ24gYW4gdXBkYXRlciB0byBhbiBlbGVtZW50XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MicpO1xuXG4gICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtb2Nrc1wiKS5pbm5lckhUTUwpLnRvLmVxdWFsKGh0bWwyKTtcblxuICAgICAgICAgICAgY29uc3QgYSA9IHthOiAxfTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB7YjogMn07XG5cbiAgICAgICAgICAgIGNvbnN0IGFwID0gbmV3IFByb3h5T2JzZXJ2ZXIoYSk7XG4gICAgICAgICAgICBjb25zdCBicCA9IG5ldyBQcm94eU9ic2VydmVyKGIpO1xuXG4gICAgICAgICAgICBjb25zdCB4ID0gYXAuZ2V0U3ViamVjdCgpXG4gICAgICAgICAgICBjb25zdCB5ID0gYnAuZ2V0U3ViamVjdCgpXG5cbiAgICAgICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHNldC5hZGQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQuY2FsbChlbGVtZW50LCBzZXQsIGFwKTtcbiAgICAgICAgICAgIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQuY2FsbChlbGVtZW50LCBzZXQsIGJwKTtcblxuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHgpKS50by5lcXVhbCgne1wiYVwiOjF9Jyk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoeSkpLnRvLmVxdWFsKCd7XCJiXCI6Mn0nKTtcblxuICAgICAgICAgICAgY29uc3Qgc3kgPSB1cGRhdGVyU3ltYm9sU3ltYm9sO1xuXG4gICAgICAgICAgICBsZXQgdiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tb25zdGVyLW9iamVjdGxpbmtcIik7XG4gICAgICAgICAgICBleHBlY3QodikudG8uZXF1YWwoJ1N5bWJvbCgnICsgdXBkYXRlclN5bWJvbEtleSArICcpJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXIgPSBlbGVtZW50W3N5XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHVwZGF0ZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHUgb2Ygdikge1xuICAgICAgICAgICAgICAgICAgICB1LnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdS5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleHBlY3QodXBkYXRlcikudG8uYmUuYW4uaW5zdGFuY2VvZihTZXQpO1xuICAgICAgICAgICAgZXhwZWN0KHVwZGF0ZXIpLnRvLmJlLmEoXCJTZXRcIik7XG5cbiAgICAgICAgICAgIHguYSA9IDM7XG4gICAgICAgICAgICBicC5nZXRTdWJqZWN0KCkuYiA9IDQ7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbGV0IG1vY2tIVE1MID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtb2Nrc1wiKTtcblxuICAgICAgICAgICAgICAgIC8vIGh0bWwgZXhwZXh0ZWQ6XG4gICAgICAgICAgICAgICAgLy8gPGlucHV0IGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDphXCIgaWQ9XCJ0ZXN0MlwiIGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwidmFsdWUgcGF0aDphXCIgZGF0YS1tb25zdGVyLW9iamVjdGxpbms9XCJTeW1ib2woQHNjaHVrYWkvbW9uc3Rlci9kb20vQEBvYmplY3QtdXBkYXRlci1saW5rKVwiIHZhbHVlPVwiM1wiPlxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KG1vY2tIVE1MLnF1ZXJ5U2VsZWN0b3IoXCIjdGVzdDJcIikpLnRvLmhhdmUudmFsdWUoJzMnKVxuICAgICAgICAgICAgICAgIGV4cGVjdChtb2NrSFRNTC5xdWVyeVNlbGVjdG9yKFwiI3Rlc3QyXCIpKS50by5oYXZlLmF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLW9iamVjdGxpbmsnLCAnU3ltYm9sKCcgKyB1cGRhdGVyU3ltYm9sS2V5ICsgJyknKVxuICAgICAgICAgICAgICAgIC8vZXhwZWN0KG1vY2tIVE1MKS50by5oYXZlLmh0bWwocmVzdWx0SFRNTCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudC52YWx1ZSkudG8uZXF1YWwoXCIzXCIpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGFwLmdldFJlYWxTdWJqZWN0KCkpKS50by5lcXVhbCgne1wiYVwiOjN9Jyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGJwLmdldFJlYWxTdWJqZWN0KCkpKS50by5lcXVhbCgne1wiYlwiOjR9Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9LCA1MClcblxuICAgICAgICB9KVxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdDdXN0b21FbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBpbml0SlNET00oe30pLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiKS50aGVuKChtKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUVsZW1lbnQgPSBtWydDdXN0b21FbGVtZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQgPSBtWydyZWdpc3RlckN1c3RvbUVsZW1lbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnQgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm1vbnN0ZXItdGVzdGNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50MiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibW9uc3Rlci10ZXN0Y2xhc3MyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vdGVzdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogJzxoMT48L2gxPjxhcnRpY2xlPjxwPnRlc3Q8L3A+PGRpdiBpZD1cImNvbnRhaW5lclwiPjwvZGl2PjwvYXJ0aWNsZT4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudDIpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnQ3VzdG9tRWxlbWVudCgpIHdpdGggQ29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZWFkIGNvbmZpZyBmcm9tIHRhZycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8c2NyaXB0IGlkPVwiY29uZmlnMVwiIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCI+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImRlbW90ZXN0XCI6MTQyNVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8bW9uc3Rlci10ZXN0Y2xhc3MyIGlkPVwidGhpc2lzYXRlc3RcIiBkYXRhLW1vbnN0ZXItb3B0aW9ucy1zZWxlY3Rvcj1cIiNjb25maWcxXCI+XG4gICAgICAgICAgICAgICAgPC9tb25zdGVyLXRlc3RjbGFzczI+XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBtb25zdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoaXNpc2F0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1vbnN0ZXIuZ2V0T3B0aW9uKCdkZW1vdGVzdCcpKS5pcy5lcWwoMTQyNSk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY3VzdG9tLWVsZW1lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFRlc3RDb21wb25lbnQoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY29ubmVjdCBlbXB0eSBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2RvY3VtZW50IHNob3VsZCBjb250YWluIG1vbnN0ZXItdGVzdGNsYXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKS5hcHBlbmRDaGlsZChkKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21vbnN0ZXItdGVzdGNsYXNzJykubGVuZ3RoKS5pcy5lcXVhbCgxKTtcbiAgICAgICAgICAgICAgICAvLyBubyBkYXRhLW1vbnN0ZXItb2JqZWN0bGluaz1cIlN5bWJvbChtb25zdGVyVXBkYXRlcilcIiBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIHVwZGF0ZVxuICAgICAgICAgICAgICAgIC8vIGJ1dCBkYXRhLW1vbnN0ZXItZXJyb3I9XCJFcnJvcjogaHRtbCBpcyBub3Qgc2V0LlwiXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLXRlc3RjbGFzcyBkYXRhLW1vbnN0ZXItZXJyb3I9XCJFcnJvcjogaHRtbCBpcyBub3Qgc2V0LlwiPjwvbW9uc3Rlci10ZXN0Y2xhc3M+Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2Nvbm5lY3QgZWxlbWVudCB3aXRoIGh0bWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnZG9jdW1lbnQgc2hvdWxkIGNvbnRhaW4gbW9uc3Rlci10ZXN0Y2xhc3MyJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzMicpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0IERPTSBydW4gaW4gZXh0cmEgcHJvY2VzcyB2aWEgc2V0VGltZW91dCFcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci10ZXN0Y2xhc3MyJykubGVuZ3RoKS5pcy5lcXVhbCgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci10ZXN0Y2xhc3MyJykuaXRlbSgwKS5zaGFkb3dSb290LmlubmVySFRNTCkuaXMuZXF1YWwoJzxoMT48L2gxPjxhcnRpY2xlPjxwPnRlc3Q8L3A+PGRpdiBpZD1cImNvbnRhaW5lclwiPjwvZGl2PjwvYXJ0aWNsZT4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci10ZXN0Y2xhc3MyIGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rPVwiU3ltYm9sKCcgKyB1cGRhdGVyU3ltYm9sS2V5ICsgJylcIj48L21vbnN0ZXItdGVzdGNsYXNzMj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDEwKTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdPcHRpb25zIGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ2RlbGVnYXRlc0ZvY3VzIHNob3VsZCBjaGFuZ2UgZnJvbSB0cnVlIHRvIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0O1xuICAgICAgICAgICAgICAgIGV4cGVjdChPYmplY3QuaXMoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3QsIG8pKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0Lm9wdGlvbnMuZGVsZWdhdGVzRm9jdXMpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3Qub3B0aW9ucy5kZWxlZ2F0ZXNGb2N1cykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KE9iamVjdC5pcyhlbGVtZW50W2ludGVybmFsU3ltYm9sXS5yZWFsU3ViamVjdCwgbykpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OUywgSlNPTi5zdHJpbmdpZnkoe2RlbGVnYXRlc0ZvY3VzOiBmYWxzZX0pKTtcbiAgICAgICAgICAgICAgICAvLyBleHBlY3QoT2JqZWN0LmlzKGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0LCBvKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0Lm9wdGlvbnMuZGVsZWdhdGVzRm9jdXMpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGV4cGVjdChPYmplY3QuaXMoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3QsIG8pKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnc2V0T3B0aW9ucygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnc2hhZG93TW9kZScsICd4MSddLFxuICAgICAgICAgICAgICAgIFsndGVtcGxhdGVzLm1haW4nLCAneDInXSwgLy8gaXMgZXhwbGljaXRseSBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgWydkZWxlZ2F0ZXNGb2N1cycsICd4NCddLFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cblxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0ga2V5ICsgJyBzaG91bGQgcmV0dXJuICcgKyBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0ga2V5ICsgJyB3YXMgbm90IHNldCwgdGhlcmVmb3JlIGRlZmF1bHQgJyArIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaXQodGV4dCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGQuZ2V0T3B0aW9uKGtleSkpLnRvLmJlLm5vdC5lcXVhbChuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4ID0gZC5zZXRPcHRpb24oa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkLmdldE9wdGlvbihrZXkpKS50by5iZS5lcXVhbChuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnZ2V0T3B0aW9ucygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydzaGFkb3dNb2RlJywgJ29wZW4nXSxcbiAgICAgICAgICAgICAgICBbJ3RlbXBsYXRlcy5tYWluJywgdW5kZWZpbmVkXSwgLy8gaXMgZXhwbGljaXRseSBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgWydkZWxlZ2F0ZXNGb2N1cycsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsneC55LnonLCB0cnVlLCB0cnVlXSwgLy8geC55LnogaXNudCBzZXQsIGRlZmF1bHRWYWx1ZSBpcyB1c2VkXG4gICAgICAgICAgICAgICAgWyd4JywgdHJ1ZSwgdHJ1ZV0gLy8geCBpc250IHNldCwgZGVmYXVsdFZhbHVlIGlzIHVzZWRcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG5cbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBrZXkgKyAnIHNob3VsZCByZXR1cm4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0ga2V5ICsgJyB3YXMgbm90IHNldCwgdGhlcmVmb3JlIGRlZmF1bHQgJyArIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGl0KHRleHQsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4ID0gZC5nZXRPcHRpb24oa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoeCkudG8uYmUuZXF1YWwodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IHdpdGggd3JvbmcgdHlwZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgaHRtbFRBRyA9ICdtb25zdGVyLXRlc3RjbGFzcy14MSc7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxO1xuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG5cbiAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50WDEgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxUQUdcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiAnPGgxPnRlc3Q8L2gxPidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMSlcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIHRocm93IEV4Y2VwdGlvblwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZGl2KS5jb250YWluLmh0bWwoJ2RhdGEtbW9uc3Rlci1lcnJvcj1cIlR5cGVFcnJvcjogdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIENTU1N0eWxlU2hlZXRcIicpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IGFuZCBDU1NTdHlsZXNoZWV0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBodG1sVEFHID0gJ21vbnN0ZXItdGVzdGNsYXNzLXgxMTMtMic7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxMTNYMjtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMTEzWDIgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxUQUdcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXM6IHttYWluOiAnPGgxPnRlc3Q8L2gxPid9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSAobmV3IENTU1N0eWxlU2hlZXQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuaW5zZXJ0UnVsZSgnYSB7IGNvbG9yIDogcmVkfScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMTEzWDIpXG5cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoaHRtbFRBRyArIFwiIHNob3VsZCB0aHJvdyBFeGNlcHRpb24gMlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTNcbiAgICAgICAgICovXG4gICAgICAgIGRlc2NyaWJlKCdBc3NpZ24gQ1NTU3R5bGUgYXMgQXJyYXkgYW5kIENTUyBhcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWxUQUcgPSAnbW9uc3Rlci10ZXN0Y2xhc3MteDExMy0yMSc7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxMTNYMjI7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cbiAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50WDExM1gyMiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge21haW46ICc8aDE+dGVzdDwvaDE+J30sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYSB7IGNvbG9yOnJlZCB9JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50WDExM1gyMilcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIGVxIDxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT5cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbFRBRyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8c3R5bGU+YSB7IGNvbG9yOnJlZCB9PC9zdHlsZT48aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IGFuZCBDU1MgYXMgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBodG1sVEFHID0gJ21vbnN0ZXItdGVzdGNsYXNzLXgxMTMtMjInO1xuXG4gICAgICAgICAgICBsZXQgbW9ja3MsIFRlc3RDb21wb25lbnRYMTEzWDIyMztcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMTEzWDIyMyA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge21haW46ICc8aDE+dGVzdDwvaDE+J30sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbJ2EgeyBjb2xvcjpyZWQgfSddO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMTEzWDIyMylcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIGVxIDxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT5cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbFRBRyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8c3R5bGU+YSB7IGNvbG9yOnJlZCB9PC9zdHlsZT48aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdoYXNOb2RlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcztcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoXCJoYXNOb2RlIG1vbnN0ZXItdGVzdGNsYXNzIHNob3VsZCByZXR1cm4gLi4uXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgcDEuYXBwZW5kQ2hpbGQodDEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChwMSk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZCh0KTtcbiAgICAgICAgICAgICAgICBkLmFwcGVuZENoaWxkKHApO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cblxuICAgICAgICAgICAgICAgIGxldCBuMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUobjEpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHQpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUocCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShwMSkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZSh0MSkpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KFwiaGFzTm9kZSBtb25zdGVyLXRlc3RjbGFzczIgc2hvdWxkIHJldHVybiAuLi5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MyJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgcDEuYXBwZW5kQ2hpbGQodDEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChwMSk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZCh0KTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGQuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgICAgICBkLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLmFwcGVuZENoaWxkKHApO1xuXG4gICAgICAgICAgICAgICAgbGV0IG4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShuMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUodCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShwKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHAxKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHQxKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pXG5cbiAgICB9KTtcbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCI7XG5pbXBvcnQge0ZvY3VzTWFuYWdlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vZm9jdXNtYW5hZ2VyLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0ZvY3VzTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpLmlubmVySFRNTCA9ICcnXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBGb2N1c01hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvY3VzTWFuYWdlcigpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG4gICAgICAgIH0pXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3N0b3JlIGFuZCByZXN0b3JlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbWFuYWdlcjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgRm9jdXNNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4MVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRlc3RpdFwiIGlkPVwidHgzXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4NFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXN0aXRcIiB0YWJpbmRleD1cIjJcIiBpZD1cInR4NVwiPmhlbGxvPC9wPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4N1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGVzdGl0JykpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IDIwMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdydW4gaXN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBtYW5hZ2VyLmZvY3VzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eDEnKSk7XG4gICAgICAgICAgICBtYW5hZ2VyLnN0b3JlRm9jdXMoKTtcblxuICAgICAgICAgICAgY29uc3QgZTEgPSBtYW5hZ2VyLmdldEFjdGl2ZSgpO1xuICAgICAgICAgICAgZXhwZWN0KGUxLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yMScpLnRvLmJlLmVxdWFsKCd0eDEnKTtcblxuICAgICAgICAgICAgbWFuYWdlci5mb2N1cyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHgyJykpO1xuXG4gICAgICAgICAgICBtYW5hZ2VyLnN0b3JlRm9jdXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yMicpLnRvLmJlLmVxdWFsKCd0eDInKTtcbiAgICAgICAgICAgIG1hbmFnZXIuZm9jdXNOZXh0KCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjMnKS50by5iZS5lcXVhbCgndHg0Jyk7XG4gICAgICAgICAgICBtYW5hZ2VyLmZvY3VzTmV4dCgpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3I0JykudG8uYmUuZXF1YWwoJ3R4NScpO1xuICAgICAgICAgICAgbWFuYWdlci5yZXN0b3JlRm9jdXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yNScpLnRvLmJlLmVxdWFsKCd0eDInKTtcbiAgICAgICAgICAgIG1hbmFnZXIucmVzdG9yZUZvY3VzKCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjYnKS50by5iZS5lcXVhbCgndHgxJyk7XG4gICAgICAgICAgICBtYW5hZ2VyLnJlc3RvcmVGb2N1cygpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3I3JykudG8uYmUuZXF1YWwoJ3R4MScpO1xuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3JldHVybnR5cGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGZvY3VzbWFuYWdlcjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvY3VzbWFuYWdlciA9IG5ldyBGb2N1c01hbmFnZXIoKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnY2hlY2sgcmV0dXJucycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5nZXRGb2N1c2FibGUoKSkuaXMuaW5zdGFuY2VvZihBcnJheSk7XG4gICAgICAgICAgICBleHBlY3QoZm9jdXNtYW5hZ2VyLmdldEFjdGl2ZSgpKS5pcy5pbnN0YW5jZW9mKEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZm9jdXNOZXh0KCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZm9jdXNQcmV2KCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuc3RvcmVGb2N1cygpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG4gICAgICAgICAgICBleHBlY3QoZm9jdXNtYW5hZ2VyLmZvY3VzKGRvY3VtZW50LmJvZHkpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG4gICAgICAgICAgICBleHBlY3QoZm9jdXNtYW5hZ2VyLnJlc3RvcmVGb2N1cygpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG5cbiAgICAgICAgfSlcblxuICAgIH0pXG5cblxufSk7IiwgImltcG9ydCB7XG4gICAgZmluZEVsZW1lbnRXaXRoSWRVcHdhcmRzXG59IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZnVuY3Rpb24gc2V0dXBUZXN0RW52aXJvbm1lbnQoKSB7XG5cblxuICAgIGNsYXNzIFRlc3RDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KCd0ZXN0LWNvbXBvbmVudCcpKSB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgndGVzdC1jb21wb25lbnQnLCBUZXN0Q29tcG9uZW50KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBUZXN0RW52aXJvbm1lbnQoKSB7XG4gICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbn1cblxuZGVzY3JpYmUoJ2ZpbmRFbGVtZW50V2l0aElkVXB3YXJkcycsICgpID0+IHtcbiAgICBiZWZvcmUoKGRvbmUpID0+IHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBzZXR1cFRlc3RFbnZpcm9ubWVudCgpO1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwVGVzdEVudmlyb25tZW50KCk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gU2V0IHVwIHRoZSBET01cblxuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGlkPVwicGFyZW50XCI+XG4gICAgICAgICAgPGRpdiBpZD1cImNoaWxkXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcblxuICAgICAgICBjb25zdCBzaGFkb3dIb3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2hhZG93SG9zdCk7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBzaGFkb3dIb3N0LmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7XG4gICAgICAgIGNvbnN0IGlubmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lckVsZW1lbnQuaWQgPSAnaW5uZXInO1xuICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKGlubmVyRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgdGFyZ2V0IElEIGluIHRoZSBub3JtYWwgRE9NJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGlsZCcpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmaW5kRWxlbWVudFdpdGhJZFVwd2FyZHMoY2hpbGQsICdwYXJlbnQnKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcmVudCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmluZCB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YXJnZXQgSUQgaW4gdGhlIHNoYWRvdyBET00nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2RpdltzaGFkb3dyb290XSA+IGRpdicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmaW5kRWxlbWVudFdpdGhJZFVwd2FyZHMoaW5uZXJFbGVtZW50LCAnaW5uZXInKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXF1YWwoaW5uZXJFbGVtZW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgd2l0aCB0aGUgdGFyZ2V0IElEIGlzIG5vdCBmb3VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hpbGQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZEVsZW1lbnRXaXRoSWRVcHdhcmRzKGNoaWxkLCAnbm9uZXhpc3RlbnQnKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUubnVsbDtcbiAgICB9KTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCB3aW5kb3dSZWFkeTtcbmxldCBkb21SZWFkeTtcblxuZGVzY3JpYmUoJ1JlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3JlYWR5Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9tUmVhZHkgPSBtWydkb21SZWFkeSddO1xuICAgICAgICAgICAgICAgIHdpbmRvd1JlYWR5ID0gbVsnd2luZG93UmVhZHknXTtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2RvbVJlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgZG9tUmVhZHkudGhlbihkb25lKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpbmRvd1JlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgd2luZG93UmVhZHkudGhlbihkb25lKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge1xuICAgIGdldERvY3VtZW50LCBnZXRXaW5kb3csIGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nXG59IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5cbmltcG9ydCB7Z2V0Q29udGFpbmluZ0RvY3VtZW50fSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RvbS91dGlsLm1qc1wiO1xuXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBpbml0SlNET00oKTtcbiAgICB9KVxuICAgIGRlc2NyaWJlKCdnZXREb2N1bWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGdldERvY3VtZW50KCk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0V2luZG93KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRvY3VtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gZ2V0V2luZG93KCk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnPGRpdj48L2Rpdj4nXSxcbiAgICAgICAgICAgIFsnPGRpdj48ZGl2PjI8L2Rpdj48L2Rpdj4nXSxcbiAgICAgICAgICAgIFsnPGRpdj48ZGl2PjI8L2Rpdj4nLCAnPGRpdj48ZGl2PjI8L2Rpdj48L2Rpdj4nXSwgLy8gdGVzdCBpbnZhbGlkIGh0bWxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoIWIpIGIgPSBhO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudEZyYWdtZW50IG9iamVjdCAnICsgYSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFnbWVudCA9IGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nKGEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChmcmFnbWVudCkudG8uYmUuaW5zdGFuY2VPZihEb2N1bWVudEZyYWdtZW50KTtcblxuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZGl2LmlubmVySFRNTCkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnZ2V0Q29udGFpbmluZ0RvY3VtZW50JywgKCkgPT4ge1xuICAgICAgICBsZXQgIGpzRG9tRG9jdW1lbnQ7XG5cbiAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgIGpzRG9tRG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgICAgICAgfSk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIC8vICAgICBkb20ud2luZG93LmNsb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGdldENvbnRhaW5pbmdEb2N1bWVudChudWxsKSkudG8udGhyb3coJ0ludmFsaWQgYXJndW1lbnQuIEV4cGVjdGVkIGFuIEhUTUxFbGVtZW50LicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBjb250YWluaW5nIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IGluIHRoZSBtYWluIGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGpzRG9tRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluaW5nRG9jdW1lbnQgPSBnZXRDb250YWluaW5nRG9jdW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChjb250YWluaW5nRG9jdW1lbnQpLnRvLm51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGNvbnRhaW5pbmcgZG9jdW1lbnQgZm9yIGFuIGVsZW1lbnQgaW5zaWRlIGEgc2hhZG93IHJvb3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBob3N0ID0ganNEb21Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBqc0RvbURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5pbmdEb2N1bWVudCA9IGdldENvbnRhaW5pbmdEb2N1bWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIGV4cGVjdChjb250YWluaW5nRG9jdW1lbnQpLnRvLm5vdC5udWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBjb250YWluaW5nIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IGluc2lkZSBhIG5lc3RlZCBzaGFkb3cgcm9vdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG91dGVySG9zdCA9IGpzRG9tRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb25zdCBvdXRlclNoYWRvd1Jvb3QgPSBvdXRlckhvc3QuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBpbm5lckhvc3QgPSBqc0RvbURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgb3V0ZXJTaGFkb3dSb290LmFwcGVuZENoaWxkKGlubmVySG9zdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlubmVyU2hhZG93Um9vdCA9IGlubmVySG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBqc0RvbURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIGlubmVyU2hhZG93Um9vdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgY29udGFpbmluZ0RvY3VtZW50ID0gZ2V0Q29udGFpbmluZ0RvY3VtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5pbmdEb2N1bWVudCkudG8ubm90Lm51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgZWxlbWVudCBpcyBub3QgYXR0YWNoZWQgdG8gYW55IGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGV0YWNoZWRFbGVtZW50ID0ganNEb21Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRldGFjaGVkRWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICAgICAgY29uc3QgY29udGFpbmluZ0RvY3VtZW50ID0gZ2V0Q29udGFpbmluZ0RvY3VtZW50KGRldGFjaGVkRWxlbWVudCk7XG4gICAgICAgICAgICBleHBlY3QoY29udGFpbmluZ0RvY3VtZW50KS50by5iZS5udWxsO1xuICAgICAgICB9KTtcbiAgICB9KTsgICAgXG4gICAgXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbi8vIGxldCBodG1sMSA9IGBcbi8vICAgICA8ZGl2IGlkPVwic2NyaXB0aG9zdFwiPlxuLy8gICAgIDwvZGl2PlxuLy8gICAgXG4vLyAgICAgPGRpdj5cbi8vICAgICA8XG4vLyA8L2Rpdj5cbi8vIGA7XG5cblxuLy8gZGVmaW5lZCBpbiBjb25zdGFudHMubWpzXG4vLyBjb25zdCB1cGRhdGVyU3ltYm9sS2V5ID0gXCJAc2NodWthaS9tb25zdGVyL2RvbS9jdXN0b20tZWxlbWVudEBAb3B0aW9ucy11cGRhdGVyLWxpbmtcIlxuLy8gY29uc3QgdXBkYXRlclN5bWJvbFN5bWJvbCA9IFN5bWJvbC5mb3IodXBkYXRlclN5bWJvbEtleSk7XG5cblxuXG5kZXNjcmliZSgnRE9NJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IEN1c3RvbUVsZW1lbnQsIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCwgVGVzdENvbXBvbmVudCwgZG9jdW1lbnQsIFRlc3RDb21wb25lbnQyLGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQ7XG5cbiAgICBkZXNjcmliZSgnaW5pdEZyb21TY3JpcHRIb3N0KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgcmFuZG9tVGFnTnVtYmVyID0gXCJtb25zdGVyLXRlc3RcIitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTtcbiAgICAgICAgXG4gICAgICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2N1c3RvbWVsZW1lbnQubWpzXCIpLnRoZW4oKG0pID0+IHtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tRWxlbWVudCA9IG1bJ0N1c3RvbUVsZW1lbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IG1bJ3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCddO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50MiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbVRhZ051bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogJzxoMT48L2gxPjxhcnRpY2xlPjxwPnRlc3Q8L3A+PGRpdiBpZD1cImNvbnRhaW5lclwiPjwvZGl2PjwvYXJ0aWNsZT4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudDIpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ2NhbGwgY2FsbGJhY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIG5vdCBmb3VuZCBjYWxsYmFjayBhbmQgYWRkIGVycm9yIGF0dHJpYnV0ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGA8ZGl2IGlkPVwiY2FsbC1iYWNrLWhvc3RcIj48L2Rpdj48ZGl2IGlkPVwiY29udGFpbmVyXCI+PC9kaXY+YDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocmFuZG9tVGFnTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXNjcmlwdC1ob3N0JywgXCJjYWxsLWJhY2staG9zdFwiKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuYXBwZW5kQ2hpbGQoY29udHJvbCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRyb2wuZ2V0T3B0aW9uKCd0ZXN0JykpLmlzLmVxbCgwKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoY29udHJvbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1lcnJvcicpKS5pcy50cnVlO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBmb3VuZCBjYWxsYmFjayBpbml0Q3VzdG9tQ29udHJvbENhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYDxkaXYgaWQ9XCJjYWxsLWJhY2staG9zdFwiPjwvZGl2PjxkaXYgaWQ9XCJjb250YWluZXJcIj48L2Rpdj5gO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxsLWJhY2staG9zdCcpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbml0Q3VzdG9tQ29udHJvbENhbGxiYWNrID0gZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRPcHRpb24oJ3Rlc3QnLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJhbmRvbVRhZ051bWJlcik7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1zY3JpcHQtaG9zdCcsIFwiY2FsbC1iYWNrLWhvc3RcIik7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLmFwcGVuZENoaWxkKGNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChjb250cm9sLmdldE9wdGlvbigndGVzdCcpKS5pcy5lcWwoMSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRyb2wuaGFzQXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItZXJyb3InKSkuaXMuZmFsc2U7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGZvdW5kIGNhbGxiYWNrIGluaXRDdXN0b21Db250cm9sQ2FsbGJhY2sgZnJvbSBzZWxmJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYDxkaXYgaWQ9XCJjYWxsLWJhY2staG9zdFwiPjwvZGl2PjxkaXYgaWQ9XCJjb250YWluZXJcIj48L2Rpdj5gO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJhbmRvbVRhZ051bWJlcik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRyb2wuZ2V0T3B0aW9uKCd0ZXN0JykpLmlzLmVxbCgwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmluaXRDdXN0b21Db250cm9sQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldE9wdGlvbigndGVzdCcsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXNjcmlwdC1ob3N0JywgXCJjYWxsLWJhY2staG9zdFwiKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuYXBwZW5kQ2hpbGQoY29udHJvbCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRyb2wuZ2V0T3B0aW9uKCd0ZXN0JykpLmlzLmVxbCgyKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoY29udHJvbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1lcnJvcicpKS5pcy5mYWxzZTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICB9KTtcbn0pIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7Z2V0U2xvdHRlZE5vZGVzfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RvbS9zbG90dGVkLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdnZXRTbG90dGVkTm9kZXMnLCAoKSA9PiB7XG5cblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGVtcHR5IFNldCBpZiB0aGVyZSBpcyBubyBTaGFkb3dSb290JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoZ2V0U2xvdHRlZE5vZGVzKS5pcy5hKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG5cbn0pO1xuXG4iLCAiXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge1xuICAgIGFkZEF0dHJpYnV0ZVRva2VuLFxuICAgIGFkZFRvT2JqZWN0TGluayxcbiAgICBjbGVhckF0dHJpYnV0ZVRva2VucyxcbiAgICBjb250YWluc0F0dHJpYnV0ZVRva2VuLFxuICAgIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUsXG4gICAgZmluZENsb3Nlc3RPYmplY3RMaW5rLFxuICAgIGdldExpbmtlZE9iamVjdHMsXG4gICAgaGFzT2JqZWN0TGluayxcbiAgICByZW1vdmVBdHRyaWJ1dGVUb2tlbixcbiAgICByZW1vdmVPYmplY3RMaW5rLFxuICAgIHJlcGxhY2VBdHRyaWJ1dGVUb2tlbixcbiAgICB0b2dnbGVBdHRyaWJ1dGVUb2tlbixcbiAgICBmaW5kQ2xvc2VzdEJ5Q2xhc3Ncbn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanNcIjtcblxuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgaHRtbDEsIGh0bWwyLCBodG1sMztcblxuZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgaHRtbDEgPSBgPGRpdiBpZD1cInRlc3QxXCI+PC9kaXY+YDtcbiAgICAgICAgaHRtbDIgPSBgPGRpdiBpZD1cInRlc3QxXCI+XG4gICAgPGRpdiBpZD1cInN1YjFcIj5cbiAgICAgICAgPGRpdiBpZD1cInN1YjJcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzdWIzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInN1YjRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInN1YjVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYDtcbiAgICAgICAgXG4gICAgICAgIGh0bWwzID0gYDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJ0ZXN0MVwiPlxuICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdWIxXCIgaWQ9XCJhMVwiIGNsYXNzPVwic3ViMVwiPlxuICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3ViMlwiIGlkPVwiYTJcIiBjbGFzcz1cInN1YjJcIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdWIzXCIgaWQ9XCJhM1wiIGNsYXNzPVwic3ViM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdWI0XCIgaWQ9XCJhNFwiIGNsYXNzPVwic3ViNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3ViNVwiIGlkPVwiYTVcIiBjbGFzcz1cInN1YjVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYDtcblxuXG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnT2JqZWN0TGluaycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2woJ215dGVzdCcpO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG9iamVjdC1saW5rcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYmogPSB7YTogMX07XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZXhwZWN0KGhhc09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBhZGRUb09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sLCBvYmopO1xuICAgICAgICAgICAgZXhwZWN0KGhhc09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgbGV0IG8gPSBnZXRMaW5rZWRPYmplY3RzKGVsZW1lbnQsIHN5bWJvbCkubmV4dCgpO1xuICAgICAgICAgICAgZXhwZWN0KG8udmFsdWUpLnRvLmVxdWFsKG9iaik7XG5cbiAgICAgICAgICAgIHJlbW92ZU9iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKTtcbiAgICAgICAgICAgIGV4cGVjdChoYXNPYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGdldExpbmtlZE9iamVjdHMoZWxlbWVudCwgc3ltYm9sKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KVxuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdmaW5kQ2xvc2VzdE9iamVjdExpbmsoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2woJ215dGVzdCcpO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMjtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIG9iamVjdGxpbmsnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBzdWI0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YjQnKVxuICAgICAgICAgICAgbGV0IHN1YjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViMicpXG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7fTtcblxuICAgICAgICAgICAgZXhwZWN0KGhhc09iamVjdExpbmsoc3ViMiwgc3ltYm9sKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBhZGRUb09iamVjdExpbmsoc3ViMiwgc3ltYm9sLCBvYmopO1xuICAgICAgICAgICAgZXhwZWN0KGhhc09iamVjdExpbmsoc3ViMiwgc3ltYm9sKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBmaW5kQ2xvc2VzdE9iamVjdExpbmsoc3ViNCk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuaXMuaW5zdGFuY2VPZihIVE1MRGl2RWxlbWVudCk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJykpLnRvLmJlLmVxdWFsKCdzdWIyJyk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDM7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnZmluZCBjbG9zZXN0IEF0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2E1JywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgdW5kZWZpbmVkLCAnc3ViNSddLFxuICAgICAgICAgICAgICAgIFsnYTUnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCAnc3ViMycsICdzdWIzJ10sXG4gICAgICAgICAgICAgICAgWydhNScsICdkYXRhLW1vbnN0ZXItcm9sZScsICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2E0JywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTMnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhMicsICdkYXRhLW1vbnN0ZXItcm9sZScsIHVuZGVmaW5lZCwgJ3N1YjInXSxcbiAgICAgICAgICAgICAgICBbJ2E1JywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgJ3N1YjUnLCAnc3ViNSddXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBkID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBpdCgnZmluZENsb3Nlc3RCeUF0dHJpYnV0ZSgnICsgYSArICcsICcgKyBiICsgJywnICsgYyArICcpIHNob3VsZCByZXR1cm4gJyArIGQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSksIGIsIGMpLmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXJvbGUnKSkudG8uYmUuZXF1YWwoZCk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IFxuICAgICAgICBcbiAgICAgICAgZGVzY3JpYmUoJ2ZpbmQgY2xvc2VzdCBFbGVtZW50IHdpdGggY2xhc3MnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2E1JywgICdzdWIzJywgJ3N1YjMnXSxcbiAgICAgICAgICAgICAgICBbJ2E1JywgICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2E0JywgICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2EzJywgICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2E1JywgICdzdWI1JywgJ3N1YjUnXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBpdCgnZmluZENsb3Nlc3RCeUNsYXNzKCcgKyBhICsgJywgJyArIGIgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChmaW5kQ2xvc2VzdEJ5Q2xhc3MoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSksIGIpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG8uYmUuZXF1YWwoYyk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQXR0cmlidXRlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBhdHJpYnV0ZUtleSA9ICdkYXRhLXRlc3QnO1xuXG4gICAgICAgIGl0KCd0b2dnbGVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHZhbHVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0cmlidXRlS2V5LCAnYXBwbGUgYmFuYW5uYScpXG4gICAgICAgICAgICB0b2dnbGVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgYmFuYW5uYSBwaW5hcHBsZScpO1xuICAgICAgICAgICAgdG9nZ2xlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIGJhbmFubmEnKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnYWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB2YWx1ZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgncGluYXBwbGUnKTtcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAnYmFuYW5uYScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ3BpbmFwcGxlIGJhbmFubmEnKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgncmVtb3ZlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB2YWx1ZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXksICdhcHBsZSBiYW5hbm5hIGxlbW1vbicpXG4gICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgYmFuYW5uYSBsZW1tb24nKTtcbiAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAnYmFuYW5uYScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIGxlbW1vbicpO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2NvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB2YWx1ZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0cmlidXRlS2V5LCAnYXBwbGUgYmFuYW5uYScpXG4gICAgICAgICAgICBleHBlY3QoY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJykpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdiYW5hbm5hJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QoY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ2FwcGxlJykpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnIHJlcGxhY2VBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHZhbHVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSwgJ2FwcGxlIGJhbmFubmEgdG9tYXRvJylcbiAgICAgICAgICAgIHJlcGxhY2VBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3RvbWF0bycsICdsZW1tb24nKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBiYW5hbm5hIGxlbW1vbicpO1xuICAgICAgICAgICAgcmVwbGFjZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAnYmFuYW5uYScsICdwZWFyJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgcGVhciBsZW1tb24nKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnY2xlYXJBdHRyaWJ1dGVUb2tlbnMoZWxlbWVudCwga2V5KScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSwgJ2FwcGxlIGJhbmFubmEnKVxuICAgICAgICAgICAgY2xlYXJBdHRyaWJ1dGVUb2tlbnMoZWxlbWVudCwgYXRyaWJ1dGVLZXkpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJycpO1xuXG4gICAgICAgIH0pXG5cblxuICAgIH0pXG59KSIsICIndXNlIHN0cmljdCc7XG5cblxuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmxldCBSZXNvdXJjZSxEZXJpdmVkUmVzb3VyY2U7XG5cblxuXG5kZXNjcmliZSgnUmVzb3VyY2UnLCBmdW5jdGlvbigpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL2RvbS9yZXNvdXJjZS5tanNcIikudGhlbigobSkgPT4ge1xuICAgICAgICAgICAgICAgIFJlc291cmNlID0gbVsnUmVzb3VyY2UnXTtcblxuXG4gICAgICAgICAgICAgICAgRGVyaXZlZFJlc291cmNlID0gY2xhc3MgIGV4dGVuZHMgUmVzb3VyY2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtdXJsXCI6IFwiaHR0cDovL2V4YW1wbGUuY29tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RhdGEtdXJsJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdEZXJpdmVkUmVzb3VyY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZW9mIFJlc291cmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBEZXJpdmVkUmVzb3VyY2UoKSkudG8uYmUuYW4uaW5zdGFuY2VvZihSZXNvdXJjZSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtSZXNvdXJjZU1hbmFnZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3Jlc291cmNlbWFuYWdlci5tanNcIjtcbmltcG9ydCB7Y2xlYW51cERPTUZyb21UZXN0aW5nLCBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3Rpbmd9IGZyb20gXCIuLi8uLi91dGlsL2NsZWFudXBkb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgZmV0Y2hSZWZlcmVuY2UsIHJldHVyblN0YXR1cztcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgICAgICBjbGVhbnVwRE9NRnJvbVRlc3RpbmcoKTtcbiAgICB9KVxuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcblxuICAgICAgICByZXR1cm5TdGF0dXMgPSAyMDA7XG4gICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snZmV0Y2gnXTtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1cmwnKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJldHVyblN0YXR1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9O1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCduZXcgUmVzb3VyY2VNYW5hZ2VyKCkgc2hvdWxkIHJldHVybiBSZXNvdXJjZU1hbmFnZXIgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7XG4gICAgICAgICAgICBleHBlY3QoZCkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdsb2FkIHJlc291cmNlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbWFuYWdlcjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2FkZCBzY3JpcHQgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFNjcmlwdCgnL2V4YW1wbGUuanMnKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYWRkIHN0eWxlIHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTdHlsZXNoZWV0KCcvc3R5bGUuanMnKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYWRkIGRhdGEgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZERhdGEoJy9kYXRhLmpzb24nKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY29ubmVjdCByZXNvdXJjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnYWRkIHNjcmlwdCBhbmQgY29ubmVjdCBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFNjcmlwdCgnL2V4YW1wbGUuanMnKS5jb25uZWN0KCkpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnYWRkIHN0eWxlIGFuZCBjb25uZWN0IHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU3R5bGVzaGVldCgnL3N0eWxlLmpzJykuY29ubmVjdCgpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2FkZCBkYXRhIGFuZCBjb25uZWN0ICBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZERhdGEoJy9kYXRhLmpzb24nKS5jb25uZWN0KCkpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG5cbiAgICAgICAgZGVzY3JpYmUoJ2NoZWNrIGF2YWlsYWJpbGl0eSByZXNvdXJjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnYWRkIHNjcmlwdCBhbmQgY2hlY2sgYXZhaWxhYmlsaXR5IHNob3VsZCByZXR1cm4gUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTY3JpcHQoJy9leGFtcGxlLmpzJykuYXZhaWxhYmxlKCkpLnRvLmJlLmluc3RhbmNlT2YoUHJvbWlzZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2FkZCBzdHlsZSBhbmQgY2hlY2sgYXZhaWxhYmlsaXR5IHNob3VsZCBzaG91bGQgcmV0dXJuIFByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU3R5bGVzaGVldCgnL3N0eWxlLmpzJykuYXZhaWxhYmxlKCkpLnRvLmJlLmluc3RhbmNlT2YoUHJvbWlzZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2FkZCBkYXRhIGFuZCBjaGVjayBhdmFpbGFiaWxpdHkgIHNob3VsZCBzaG91bGQgcmV0dXJuIFByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkRGF0YSgnL2RhdGEuanNvbicpLmF2YWlsYWJsZSgpKS50by5iZS5pbnN0YW5jZU9mKFByb21pc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ2NoZWNrIGF2YWlsYWJpbGl0eSBleGFtcGxlLmpzb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnYWRkIGRhdGEgYW5kIGNoZWNrIGNvbnRlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIG1hbmFnZXIuYWRkRGF0YSgnaHR0cHM6Ly9leGFtcGxlLmNvbS9leGFtcGxlLmpzb24nKS5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKS5vdXRlckhUTUwpLmNvbnRhaW5zKCc+e1wiYVwiOlwidGVzdFwifTwvc2NyaXB0PjwvaGVhZD4nKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbEZ1bmN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IFByb3h5T2JzZXJ2ZXIgfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7IHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBBVFRSSUJVVEVQUkVGSVgsIEFzc2VtYmxlciB9O1xuXG4vKipcbiAqIGF0dHJpYnV0ZSBwcmVmaXhcbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVQUkVGSVggPSBcImRhdGEtbW9uc3Rlci1cIjtcblxuLyoqXG4gKiBBc3NlbWJsZXIgY2xhc3NcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEFsbG93cyB5b3UgdG8gYnVpbGQgYW4gaHRtbCBmcmFnbWVudFxuICovXG5jbGFzcyBBc3NlbWJsZXIgZXh0ZW5kcyBCYXNlIHtcblx0LyoqXG5cdCAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Zcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihmcmFnbWVudCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5hdHRyaWJ1dGVQcmVmaXggPSBBVFRSSUJVVEVQUkVGSVg7XG5cdFx0dmFsaWRhdGVJbnN0YW5jZShmcmFnbWVudCwgZ2V0R2xvYmFsRnVuY3Rpb24oXCJEb2N1bWVudEZyYWdtZW50XCIpKTtcblx0XHR0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuXHQgKiBAcmV0dXJuIHtBc3NlbWJsZXJ9XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG5cdCAqL1xuXHRzZXRBdHRyaWJ1dGVQcmVmaXgocHJlZml4KSB7XG5cdFx0dmFsaWRhdGVTdHJpbmcocHJlZml4KTtcblx0XHR0aGlzLmF0dHJpYnV0ZVByZWZpeCA9IHByZWZpeDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXRBdHRyaWJ1dGVQcmVmaXgoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlUHJlZml4O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7UHJveHlPYnNlcnZlcnx1bmRlZmluZWR9IGRhdGFcblx0ICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH1cblx0ICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Zcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoZGF0YSkge1xuXHRcdGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGRhdGEgPSBuZXcgUHJveHlPYnNlcnZlcih7fSk7XG5cdFx0fVxuXG5cdFx0dmFsaWRhdGVJbnN0YW5jZShkYXRhLCBQcm94eU9ic2VydmVyKTtcblx0XHRjb25zdCBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpO1xuXHRcdHJldHVybiBmcmFnbWVudDtcblx0fVxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7QVRUUklCVVRFUFJFRklYLCBBc3NlbWJsZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2Fzc2VtYmxlci5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0Fzc2VtYmxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBpbml0SlNET00oKTtcbiAgICB9KVxuICAgIGRlc2NyaWJlKCdjcmVhdGVEb2N1bWVudEZyYWdtZW50KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIDxkaXY+T25lPC9kaXY+PGRpdj5Ud288L2Rpdj4nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KCc8ZGl2Pk9uZTwvZGl2PjxkaXY+VHdvPC9kaXY+Jyk7XG5cbiAgICAgICAgICAgIGxldCBmID0gbmV3IEFzc2VtYmxlcihmcmFnbWVudCk7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5lci5pbm5lckhUTUwpLnRvLmJlLmVxdWFsKCc8ZGl2Pk9uZTwvZGl2PjxkaXY+VHdvPC9kaXY+Jyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZURvY3VtZW50RnJhZ21lbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gRG9jdW1lbnRGcmFnbWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBBc3NlbWJsZXIoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgIGV4cGVjdChkLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSkudG8uYmUuaW5zdGFuY2VPZihEb2N1bWVudEZyYWdtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbmV3JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFJlbmRlcmVyKCkgc2hvdWxkIHJldHVybiBBc3NlbWJsZXIgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgQXNzZW1ibGVyKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICAgICAgICBleHBlY3QoZCkudG8uYmUuaW5zdGFuY2VPZihBc3NlbWJsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRBdHRyaWJ1dGVQcmVmaXgoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gJyArIEFUVFJJQlVURVBSRUZJWCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgQXNzZW1ibGVyKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICAgICAgICBleHBlY3QoZC5nZXRBdHRyaWJ1dGVQcmVmaXgoKSkudG8uYmUuZXF1YWwoQVRUUklCVVRFUFJFRklYKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0QXR0cmlidXRlUHJlZml4KCkuZ2V0QXR0cmlidXRlUHJlZml4KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHNhbWUgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBBc3NlbWJsZXIoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnNldEF0dHJpYnV0ZVByZWZpeCgndGVzdDAxJykuZ2V0QXR0cmlidXRlUHJlZml4KCkpLnRvLmJlLmVxdWFsKCd0ZXN0MDEnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Z2V0RG9jdW1lbnR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cbmRlc2NyaWJlKCdET00nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgQ3VzdG9tQ29udHJvbCwgcmVnaXN0ZXJDdXN0b21FbGVtZW50LCBUZXN0Q29tcG9uZW50LCBkb2N1bWVudCwganNkb21GbGFnO1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSh7fSkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGltcG9ydChcImVsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBtLnBvbHlmaWxsKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8ganNkb20gZG9lcyBub3Qgc3VwcG9ydCBFbGVtZW50SW50ZXJuYWxzXG4gICAgICAgICAgICBqc2RvbUZsYWcgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKFwianNkb21cIik7XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uL3NvdXJjZS9kb20vY3VzdG9tZWxlbWVudC5tanNcIikudGhlbigobSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50ID0gbVsncmVnaXN0ZXJDdXN0b21FbGVtZW50J107XG5cblxuICAgICAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uL3NvdXJjZS9kb20vY3VzdG9tY29udHJvbC5tanNcIikudGhlbigobSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tQ29udHJvbCA9IG1bJ0N1c3RvbUNvbnRyb2wnXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudCA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tQ29udHJvbCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibW9uc3Rlci1jdXN0b21jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZm9ybURpc2FibGVkQ2FsbGJhY2soKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgXG4gICAgICAgIGxldCBlbGVtZW50XG4gICAgICAgIFxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgVGVzdENvbXBvbmVudDIgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUNvbnRyb2wge1xuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IGRlc2NyaXB0aW9uIG9mIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm1vbnN0ZXItY3VzdG9tY29udHJvbDJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50MilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSkudG8uYmUubm90Lm51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sMicpO1xuXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZm9ybURpc2FibGVkQ2FsbGJhY2soKSkudG8uYmUudW5kZWZpbmVkO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmZvcm1EaXNhYmxlZENhbGxiYWNrKHRydWUpKS50by5iZS51bmRlZmluZWQ7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBjb25zdCBkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICBleHBlY3QoZCkudG8ubm90LmJlLm51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG5cbiAgICBkZXNjcmliZSgnQ3VzdG9tQ29udHJvbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1c3RvbS1lbGVtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZFxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGQgPSBuZXcgVGVzdENvbXBvbmVudCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGUpLnRvLmJlLm51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2Nvbm5lY3QgZW1wdHkgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdkb2N1bWVudCBzaG91bGQgY29udGFpbiBtb25zdGVyLWN1c3RvbWNvbnRyb2wnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKS5sZW5ndGgpLmlzLmVxdWFsKDEpO1xuICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rPVwiU3ltYm9sKG1vbnN0ZXJVcGRhdGVyKVwiIGJlY2F1c2UgaXQgaGFzIG5vdGhpbmcgdG8gdXBkYXRlIFxuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1jdXN0b21jb250cm9sIGRhdGEtbW9uc3Rlci1lcnJvcj1cIkVycm9yOiBodG1sIGlzIG5vdCBzZXQuXCI+PC9tb25zdGVyLWN1c3RvbWNvbnRyb2w+JylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBkZXNjcmliZSgnT3B0aW9ucyBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBpdCgnZGVsZWdhdGVzRm9jdXMgc2hvdWxkIGNoYW5nZSBmcm9tIHRydWUgdG8gZmFsc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJylcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJykpLnRvLmJlLnRydWU7XG4gICAgICAgIC8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TLCBKU09OLnN0cmluZ2lmeSh7ZGVsZWdhdGVzRm9jdXM6IGZhbHNlfSkpO1xuICAgICAgICAvLyAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIC8vICAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgLy8gICAgICAgICB9LCAxMCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICB9KS50aW1lb3V0KDEwMCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ1Rlc3QgRWxlbWVudEludGVybmFscycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IGZvcm07XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnZm9ybUFzc29jaWF0ZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5jb25zdHJ1Y3Rvci5mb3JtQXNzb2NpYXRlZCkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdmb3JtJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuZm9ybSkudG8uYmUuaW5zdGFuY2VvZihIVE1MRm9ybUVsZW1lbnQpXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGV4cGVjdCgoKSA9PiBkLmZvcm0pLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBleHBlY3QoZC5mb3JtKS50by5iZS5pbnN0YW5jZW9mKEhUTUxGb3JtRWxlbWVudClcbiAgICAgICAgICAgICAgICAvLyB9XG5cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd2YWx1ZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC52YWx1ZSkudG8udGhyb3coRXJyb3IpO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3ZhbHVlIHNldHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLnZhbHVlID0gNCkudG8udGhyb3coRXJyb3IpO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3NldEZvcm1WYWx1ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCduYW1lIGdldHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkLm5hbWUpLnRvLmJlLm51bGw7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgndHlwZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC50eXBlKS50by5iZS5lcXVhbCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgndmFsaWRpdHkgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3ZhbGlkYXRpb25NZXNzYWdlIGdldHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3dpbGxWYWxpZGF0ZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpdCgnY2hlY2tWYWxpZGl0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgncmVwb3J0VmFsaWRpdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICBpdCgnc2V0VmFsaWRpdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5zZXRWYWxpZGl0eSh7J3ZhbHVlTWlzc2luZyc6IHRydWV9LCBcIm15IG1lc3NhZ2VcIikpLnRvLmJlLnVuZGVmaW5lZDtcblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxufSk7XG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7QVRUUklCVVRFX1RIRU1FX05BTUV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtmaW5kRG9jdW1lbnRUZW1wbGF0ZSwgVGVtcGxhdGV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRKU0RPTSgpO1xuICAgIH0pXG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGVcIj48L3RlbXBsYXRlPmA7XG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnY3JlYXRlIEhUTUxGcmFnbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgW1wiPGRpdj5maXJzdDwvZGl2PjxkaXY+c2Vjb25kPC9kaXY+XCJdLFxuICAgICAgICAgICAgW1wiPGRpdj5maXJzdDwvZGl2PlwiXSxcbiAgICAgICAgICAgIFtcIjxkaXY+Zmlyc3Q8L2Rpdj48cD5zZWNvbmQ8L3A+XCJdXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCduZXcgVGVtcGxhdGUoKS5nZXROZXdEb2N1bWVudEZyYWdtZW50QXNTdHJpbmcoKSBzaG91bGQgcmV0dXJuIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGE7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoY29udGFpbmVyLmlubmVySFRNTCkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlIGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFRlbXBsYXRlKCkgc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBUZW1wbGF0ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTtcbiAgICAgICAgICAgIGV4cGVjdChkKS50by5iZS5pbnN0YW5jZU9mKFRlbXBsYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmdldFRlbXBsYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFRlbXBsYXRlKCkuZ2V0VGVtcGxhdGVFbGVtZW50KCkgc2hvdWxkIHJldHVybiBIVE1MVGVtcGxhdGVFbGVtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IFRlbXBsYXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykpO1xuICAgICAgICAgICAgZXhwZWN0KGQuZ2V0VGVtcGxhdGVFbGVtZW50KCkpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFRlbXBsYXRlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5maW5kRG9jdW1lbnRUZW1wbGF0ZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFRlbXBsYXRlIG5vdCBmb3VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm5vd2F5XCIsIGRpdilcbiAgICAgICAgICAgIH0pLnRvLnRocm93cyhFcnJvcik7XG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmZpbmREb2N1bWVudFRlbXBsYXRlKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCdUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgZmluZCB0ZW1wbGF0ZSBvdmVyIG93bmVyRG9jdW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCB0ID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnVGhtZW5lZCBUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBtZW1BdHRyaWJ1dGVWYWx1ZTtcblxuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXRlbXBsYXRlXCI+PHA+MTwvcD48L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXRlbXBsYXRlLW1vbnN0ZXJcIj48cD4yPC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGUtdGVzdHRoZW1lXCI+PHA+NDwvcD48L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXByZWZpeC1teXRlbXBsYXRlLW1vbnN0ZXJcIj48cD4zPC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuICAgICAgICAgICAgICAgIGlmIChodG1sLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVtQXR0cmlidXRlVmFsdWUgPSBodG1sLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGh0bWwuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKSkge1xuICAgICAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lbUF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FLCBtZW1BdHRyaWJ1dGVWYWx1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBmaW5kIHRlbXBsYXRlIG92ZXIgb3duZXJEb2N1bWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGVtcGxhdGUtcHJlZml4JywgJ215cHJlZml4JylcbiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQxKS5pcy5pbnN0YW5jZW9mKFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLnRleHRDb250ZW50KS5pcy5lcXVhbChcIjNcIik7XG5cbiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGVtcGxhdGUtcHJlZml4JylcbiAgICAgICAgICAgICAgICBsZXQgdDIgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15dGVtcGxhdGVcIiwgZGl2KTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDIpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0Mi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkudGV4dENvbnRlbnQpLmlzLmVxdWFsKFwiMlwiKTtcblxuICAgICAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FLCd0ZXN0dGhlbWUnKTtcbiAgICAgICAgICAgICAgICBsZXQgYT0gaHRtbC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgbGV0IHQzID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQzKS5pcy5pbnN0YW5jZW9mKFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLnRleHRDb250ZW50KS5pcy5lcXVhbChcIjRcIik7XG5cblxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge2ZpcmVFdmVudCwgZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQsIGZpcmVDdXN0b21FdmVudH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5kZXNjcmliZSgnRXZlbnRzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgaW5pdEpTRE9NKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdmaW5kIG9iamVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXInLCAnaGVsbG8nKTtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChldmVudCwgJ2RhdGEtbW9uc3RlcicpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChlLmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyJykpLnRvLmJlLmVxdWFsKCdoZWxsbycpXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZpcmVFdmVudChkaXYsICdjbGljaycpO1xuICAgICAgICAgICAgfSwgMClcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2ZpcmVFdmVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSBjbGljayBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVFdmVudChkaXYsICdjbGljaycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVFdmVudChkaXYsICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCBvbiBjb2xsZWN0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG5cblxuICAgICAgICAgICAgZmlyZUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xuXG5cbiAgICAgICAgICAgIGZpcmVFdmVudChjb2xsZWN0aW9uLCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBmaXJlRXZlbnQoe30sICd0b3VjaCcpKS50by50aHJvdyhFcnJvcik7XG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZmlyZUN1c3RvbUV2ZW50KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZmlyZSBhIGNsaWNrIGV2ZW50JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGRpdiwgJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlyZSBhIHRvdWNoIGV2ZW50JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGRpdiwgJ3RvdWNoJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlyZSBhIHRvdWNoIGV2ZW50IG9uIGNvbGxlY3Rpb24xJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsLmRldGFpbCAhPT0gJ2hlbGxvIHdvcmxkJykge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCdlcnJvcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChjb2xsZWN0aW9uLCAndG91Y2gnLCBcImhlbGxvIHdvcmxkXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCBvbiBjb2xsZWN0aW9uMicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbC5hICE9PSAnaGVsbG8gd29ybGQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgICAgICBsZXQgY29sbGVjdGlvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKTtcblxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcsIHthOiBcImhlbGxvIHdvcmxkXCJ9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgICAgICBsZXQgY29sbGVjdGlvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKTtcblxuXG4gICAgICAgICAgICBmaXJlQ3VzdG9tRXZlbnQoY29sbGVjdGlvbiwgJ3RvdWNoJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZmlyZUN1c3RvbUV2ZW50KHt9LCAndG91Y2gnKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgZmluZEVsZW1lbnRXaXRoU2VsZWN0b3JVcHdhcmRzIH0gZnJvbSBcIi4uLy4uL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBEYXRhc291cmNlIH0gZnJvbSBcIi4uL2RhdGFzb3VyY2UubWpzXCI7XG5cbmV4cG9ydCB7IERvbVN0b3JhZ2UgfTtcblxuLyoqXG4gKiBUaGUgRG9tU3RvcmFnZSBpcyBhIGNsYXNzIHRoYXQgc3RvcmVzIGRhdGEgaW4gbWVtb3J5LlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuY2xhc3MgRG9tU3RvcmFnZSBleHRlbmRzIERhdGFzb3VyY2Uge1xuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25zIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgZGF0YXNvdXJjZS5cblx0ICovXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0XHR0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL2RvbS1zdG9yYWdlXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkZWZhdWx0c1xuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZGVmYXVsdHMucmVhZFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gZGVmYXVsdHMucmVhZC5zZWxlY3RvclxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZGVmYXVsdHMud3JpdGVcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGRlZmF1bHRzLndyaXRlLnNlbGVjdG9yXG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHRyZWFkOiB7XG5cdFx0XHRcdHNlbGVjdG9yOiB1bmRlZmluZWQsXG5cdFx0XHR9LFxuXHRcdFx0d3JpdGU6IHtcblx0XHRcdFx0c2VsZWN0b3I6IHVuZGVmaW5lZCxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICogQHRocm93cyB7RXJyb3J9IFRoZSByZWFkIHNlbGVjdG9yIGlzIG5vdCBkZWZpbmVkXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBUaGVyZSBhcmUgbm8gc3RvcmFnZSBlbGVtZW50XG5cdCAqL1xuXHRyZWFkKCkge1xuXHRcdGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRPcHRpb24oXCJyZWFkLnNlbGVjdG9yXCIsIHVuZGVmaW5lZCk7XG5cdFx0aWYgKCFzZWxlY3Rvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlYWQgc2VsZWN0b3IgaXMgbm90IGRlZmluZWRcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc3RvcmFnZSA9IGZpbmRFbGVtZW50V2l0aFNlbGVjdG9yVXB3YXJkcyh0aGlzLCBzZWxlY3Rvcik7XG5cdFx0aWYgKCFzdG9yYWdlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzdG9yYWdlIGVsZW1lbnRcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2UuaW5uZXJIVE1MKTtcblx0XHRcdFx0dGhpcy5zZXQoZGF0YSk7XG5cdFx0XHRcdHJlc29sdmUoZGF0YSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gVGhlIHdyaXRlIHNlbGVjdG9yIGlzIG5vdCBkZWZpbmVkXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBUaGVyZSBhcmUgbm8gc3RvcmFnZSBlbGVtZW50XG5cdCAqL1xuXHR3cml0ZSgpIHtcblx0XHRjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0T3B0aW9uKFwid3JpdGUuc2VsZWN0b3JcIik7XG5cdFx0aWYgKCFzZWxlY3Rvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIG9wdGlvbiB3cml0ZS5zZWxlY3RvciBpcyBub3QgZGVmaW5lZFwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBzdG9yYWdlID0gZmluZEVsZW1lbnRXaXRoU2VsZWN0b3JVcHdhcmRzKHRoaXMsIHNlbGVjdG9yKTtcblx0XHRpZiAoIXN0b3JhZ2UpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIHN0b3JhZ2UgZWxlbWVudFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0c3RvcmFnZS5pbm5lckhUTUwgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdldCgpKTtcblx0XHRcdFx0cmVzb2x2ZShzdG9yYWdlKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmVqZWN0KGUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7RG9tU3RvcmFnZX0gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UvZG9tLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdTZXJ2ZURvbXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBpdCgnc2hvdWxkIGluaXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgZG9tID0gbmV3IERvbVN0b3JhZ2Uoe1xuICAgICAgICAgICAgXG4gICAgICAgIH0pXG5cbiAgICAgICAgZXhwZWN0KGRvbSkudG8uYmUubm90Lm51bGxcblxuXG4gICAgfSlcblxufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wsIGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQgeyBEYXRhc291cmNlIH0gZnJvbSBcIi4uLy4uL2RhdGFzb3VyY2UubWpzXCI7XG5pbXBvcnQgeyBTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sIH0gZnJvbSBcIi4uL3N0b3JhZ2UubWpzXCI7XG5cbmV4cG9ydCB7IExvY2FsU3RvcmFnZSB9O1xuXG4vKipcbiAqIFRoZSBMb2NhbFN0b3JhZ2UgRGF0YXNvdXJjZSBwcm92aWRlcyBhIGRhdGEgc3RvcmUgaW4gdGhlIGJyb3dzZXIgbG9jYWxTdG9yYWdlLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBMb2NhbFN0b3JhZ2UgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gZGF0YSBvYmplY3RzLlxuICovXG5jbGFzcyBMb2NhbFN0b3JhZ2UgZXh0ZW5kcyBTdG9yYWdlIHtcblx0LyoqXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cblx0ICogQHJldHVybiB7ZXh0ZXJuYWw6bG9jYWxTdG9yYWdlfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0W3N0b3JhZ2VPYmplY3RTeW1ib2xdKCkge1xuXHRcdHJldHVybiBnZXRHbG9iYWxPYmplY3QoXCJsb2NhbFN0b3JhZ2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL2xvY2Fsc3RvcmFnZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgY2xvbmVcblx0ICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuXHQgKi9cblx0Z2V0Q2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBMb2NhbFN0b3JhZ2UoXG5cdFx0XHR0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpW1wib3B0aW9uc1wiXS5rZXksXG5cdFx0KTtcblx0fVxufVxuIiwgImZ1bmN0aW9uIGNyZWF0ZVN0b3JhZ2UoKSB7XG4gICAgXG4gICAgbGV0IFVOU0VUID0gU3ltYm9sKCk7XG4gICAgbGV0IHMgPSB7fSxcbiAgICAgICAgbm9vcENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICB9LFxuICAgICAgICBfaXRlbUluc2VydGlvbkNhbGxiYWNrID0gbm9vcENhbGxiYWNrO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdzZXRJdGVtJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaywgdiA9IFVOU0VUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IFVOU0VUKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlICdzZXRJdGVtJyBvbiAnU3RvcmFnZSc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGsgPSBrICsgJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2socy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzW2tdID0gdiArICcnO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCAnZ2V0SXRlbScsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gayA9PiB7XG4gICAgICAgICAgICAgICAgayA9IGsgKyAnJztcbiAgICAgICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1trXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdyZW1vdmVJdGVtJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBrID0+IHtcbiAgICAgICAgICAgICAgICBrID0gayArICcnO1xuICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2NsZWFyJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc1trXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2xlbmd0aCcsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocykubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIFwia2V5XCIsIHtcbiAgICAgICAgdmFsdWU6IGsgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKHMpW2tdO1xuICAgICAgICAgICAgcmV0dXJuICgha2V5KSA/IG51bGwgOiBrZXk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdpdGVtSW5zZXJ0aW9uQ2FsbGJhY2snLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogdiA9PiB7XG4gICAgICAgICAgICBpZiAoIXYgfHwgdHlwZW9mIHYgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHYgPSBub29wQ2FsbGJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfaXRlbUluc2VydGlvbkNhbGxiYWNrID0gdjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzO1xufVxuXG5cbmV4cG9ydCB7Y3JlYXRlU3RvcmFnZX07IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtMb2NhbFN0b3JhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qc1wiO1xuaW1wb3J0IHtjcmVhdGVTdG9yYWdlfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzXCI7XG5cblxubGV0IGxvY2FsU3RvcmFnZVJlZmVyZW5jZTtcblxuZGVzY3JpYmUoJ0xvY2FsU3RvcmFnZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2xvY2FsU3RvcmFnZSddID0gbG9jYWxTdG9yYWdlUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ11cbiAgICAgICAgZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ10gPSBjcmVhdGVTdG9yYWdlKCk7XG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBMb2NhbFN0b3JhZ2UgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IExvY2FsU3RvcmFnZSgnbXlrZXknKSkudG8uYmUuaW5zdGFuY2VvZihMb2NhbFN0b3JhZ2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JlYWQgc2hvdWxkIHJldHVybiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgTG9jYWxTdG9yYWdlKCdteWtleScpXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBMb2NhbFN0b3JhZ2UoJ215a2V5JylcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCwgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IERhdGFzb3VyY2UgfSBmcm9tIFwiLi4vLi4vZGF0YXNvdXJjZS5tanNcIjtcbmltcG9ydCB7IFN0b3JhZ2UsIHN0b3JhZ2VPYmplY3RTeW1ib2wgfSBmcm9tIFwiLi4vc3RvcmFnZS5tanNcIjtcblxuZXhwb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfTtcblxuLyoqXG4gKiBUaGUgU2Vzc2lvblN0b3JhZ2UgY2xhc3MgcHJvdmlkZXMgYSBkYXRhIHNvdXJjZSB0aGF0IHVzZXMgdGhlIFNlc3Npb25TdG9yYWdlIEFQSSBvbiB0aGUgY2xpZW50LlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBMb2NhbFN0b3JhZ2UgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gZGF0YSBvYmplY3RzLlxuICovXG5jbGFzcyBTZXNzaW9uU3RvcmFnZSBleHRlbmRzIFN0b3JhZ2Uge1xuXHQvKipcblx0ICogQHRocm93cyB7RXJyb3J9IHRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzLlxuXHQgKiBAcmV0dXJuIHtleHRlcm5hbDpzZXNzaW9uU3RvcmFnZX1cblx0ICogQHByaXZhdGVcblx0ICovXG5cdFtzdG9yYWdlT2JqZWN0U3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gZ2V0R2xvYmFsT2JqZWN0KFwic2Vzc2lvblN0b3JhZ2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXG5cdFx0XHRcIkBzY2h1a2FpL21vbnN0ZXIvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2Uvc2Vzc2lvbi1zdG9yYWdlXCIsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgQ2xvbmVcblx0ICpcblx0ICogQHJldHVybiB7U2Vzc2lvblN0b3JhZ2V9XG5cdCAqL1xuXHRnZXRDbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFNlc3Npb25TdG9yYWdlKFxuXHRcdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVtcIm9wdGlvbnNcIl0ua2V5LFxuXHRcdCk7XG5cdH1cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7U2Vzc2lvblN0b3JhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UubWpzXCI7XG5pbXBvcnQge2NyZWF0ZVN0b3JhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi91dGlsL2xvY2Fsc3RvcmFnZS5tanNcIjtcblxuXG5sZXQgc3RvcmFnZVJlZmVyZW5jZTtcblxuZGVzY3JpYmUoJ1Nlc3Npb25TdG9yYWdlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snc2Vzc2lvblN0b3JhZ2UnXSA9IHN0b3JhZ2VSZWZlcmVuY2U7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBzdG9yYWdlUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snc2Vzc2lvblN0b3JhZ2UnXVxuICAgICAgICBnbG9iYWxUaGlzWydzZXNzaW9uU3RvcmFnZSddID0gY3JlYXRlU3RvcmFnZSgpO1xuXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgU2Vzc2lvblN0b3JhZ2UgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IFNlc3Npb25TdG9yYWdlKCdteWtleScpKS50by5iZS5pbnN0YW5jZW9mKFNlc3Npb25TdG9yYWdlKVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J3JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZWFkIHNob3VsZCByZXR1cm4gb2JqZWN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFNlc3Npb25TdG9yYWdlKCdteWtleScpXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBTZXNzaW9uU3RvcmFnZSgnbXlrZXknKVxuICAgICAgICAgICAgZHMud3JpdGUoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG5cbn0pIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzRnVuY3Rpb24sIGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgRGF0YXNvdXJjZSB9IGZyb20gXCIuLi9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCIuLi9kaWZmLm1qc1wiO1xuaW1wb3J0IHsgUGF0aGZpbmRlciB9IGZyb20gXCIuLi9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHsgUGlwZSB9IGZyb20gXCIuLi9waXBlLm1qc1wiO1xuXG5leHBvcnQgeyBTZXJ2ZXIgfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgc2VydmVyVmVyc2lvblN5bWJvbCA9IFN5bWJvbChcInNlcnZlclZlcnNpb25cIik7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlcnZlciBkYXRhIHNvdXJjZXNcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBTZXJ2ZXIgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gYSBzZXJ2ZXIgZGF0YXNvdXJjZVxuICovXG5jbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBEYXRhc291cmNlIHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXJcIik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBwcmVwYXJlcyB0aGUgZGF0YSB0aGF0IGNvbWVzIGZyb20gdGhlIHNlcnZlci5cblx0ICogU2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG5cdCAqIEByZXR1cm4ge09iamVjdH1cblx0ICovXG5cdHRyYW5zZm9ybVNlcnZlclBheWxvYWQocGF5bG9hZCkge1xuXHRcdHBheWxvYWQgPSBkb1RyYW5zZm9ybS5jYWxsKHRoaXMsIFwicmVhZFwiLCBwYXlsb2FkKTtcblx0XHR0aGlzW3NlcnZlclZlcnNpb25TeW1ib2xdID0gcGF5bG9hZDtcblxuXHRcdGNvbnN0IGRhdGFQYXRoID0gdGhpcy5nZXRPcHRpb24oXCJyZWFkLnBhdGhcIik7XG5cdFx0aWYgKGRhdGFQYXRoKSB7XG5cdFx0XHRwYXlsb2FkID0gbmV3IFBhdGhmaW5kZXIocGF5bG9hZCkuZ2V0VmlhKGRhdGFQYXRoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGF5bG9hZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIHByZXBhcmVzIHRoZSBkYXRhIGZvciB3cml0aW5nIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcblx0ICogQHJldHVybiB7T2JqZWN0fVxuXHQgKi9cblx0cHJlcGFyZVNlcnZlclBheWxvYWQocGF5bG9hZCkge1xuXHRcdHBheWxvYWQgPSBkb1RyYW5zZm9ybS5jYWxsKHRoaXMsIFwid3JpdGVcIiwgcGF5bG9hZCk7XG5cdFx0cGF5bG9hZCA9IGRvRGlmZi5jYWxsKHRoaXMsIHBheWxvYWQpO1xuXG5cdFx0Y29uc3Qgc2hlYXRoaW5nT2JqZWN0ID0gdGhpcy5nZXRPcHRpb24oXCJ3cml0ZS5zaGVhdGhpbmcub2JqZWN0XCIpO1xuXHRcdGNvbnN0IHNoZWF0aGluZ1BhdGggPSB0aGlzLmdldE9wdGlvbihcIndyaXRlLnNoZWF0aGluZy5wYXRoXCIpO1xuXG5cdFx0aWYgKHNoZWF0aGluZ09iamVjdCAmJiBzaGVhdGhpbmdQYXRoKSB7XG5cdFx0XHRjb25zdCBzdWIgPSBwYXlsb2FkO1xuXHRcdFx0cGF5bG9hZCA9IHNoZWF0aGluZ09iamVjdDtcblx0XHRcdG5ldyBQYXRoZmluZGVyKHBheWxvYWQpLnNldFZpYShzaGVhdGhpbmdQYXRoLCBzdWIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXlsb2FkO1xuXHR9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBvYmpcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGRvRGlmZihvYmopIHtcblx0aWYgKFxuXHRcdHRoaXNbc2VydmVyVmVyc2lvblN5bWJvbF0gPT09IG51bGwgfHxcblx0XHR0aGlzW3NlcnZlclZlcnNpb25TeW1ib2xdID09PSB1bmRlZmluZWRcblx0KSB7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXG5cdGNvbnN0IGNhbGxiYWNrID0gdGhpcy5nZXRPcHRpb24oXCJ3cml0ZS5wYXJ0aWFsLmNhbGxiYWNrXCIpO1xuXHRpZiAoIWlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXG5cdGNvbnN0IHJlc3VsdHMgPSBkaWZmKHRoaXNbc2VydmVyVmVyc2lvblN5bWJvbF0sIG9iaik7XG5cdGlmICghcmVzdWx0cykge1xuXHRcdHJldHVybiBvYmo7XG5cdH1cblxuXHRvYmogPSBjYWxsYmFjayhvYmosIHJlc3VsdHMpO1xuXHR0aGlzW3NlcnZlclZlcnNpb25TeW1ib2xdID0gb2JqO1xuXG5cdHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRvVHJhbnNmb3JtKHR5cGUsIG9iaikge1xuXHRjb25zdCB0cmFuc2Zvcm1hdGlvbiA9IHRoaXMuZ2V0T3B0aW9uKGAke3R5cGV9Lm1hcHBpbmcudHJhbnNmb3JtZXJgKTtcblxuXHRpZiAodHJhbnNmb3JtYXRpb24gIT09IHVuZGVmaW5lZCAmJiB0cmFuc2Zvcm1hdGlvbiAhPT0gbnVsbCkge1xuXHRcdGNvbnN0IHBpcGUgPSBuZXcgUGlwZSh0cmFuc2Zvcm1hdGlvbik7XG5cdFx0Y29uc3QgY2FsbGJhY2tzID0gdGhpcy5nZXRPcHRpb24oYCR7dHlwZX0ubWFwcGluZy5jYWxsYmFja3NgKTtcblxuXHRcdGlmIChpc0FycmF5KGNhbGxiYWNrcykpIHtcblx0XHRcdGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHBpcGUuc2V0Q2FsbGJhY2soY2FsbGJhY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzT2JqZWN0KGNhbGxiYWNrcykpIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0Y2FsbGJhY2tzLmhhc093blByb3BlcnR5KGtleSkgJiZcblx0XHRcdFx0XHR0eXBlb2YgY2FsbGJhY2tzW2tleV0gPT09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRwaXBlLnNldENhbGxiYWNrKGtleSwgY2FsbGJhY2tzW2tleV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b2JqID0gcGlwZS5ydW4ob2JqKTtcblx0fVxuXG5cdHJldHVybiBvYmo7XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7U2VydmVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ1NlcnZlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGl0KCdzaG91bGQgdHJhbnNmb3JtIGRhdGEnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHdyaXRlQ2FsbGJhY2tDYWxsZWQgPSBmYWxzZVxuICAgICAgICBsZXQgcmVhZENhbGxiYWNrQ2FsbGVkID0gZmFsc2VcblxuICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgU2VydmVyKHtcbiAgICAgICAgICAgIHdyaXRlOiB7XG4gICAgICAgICAgICAgICAgbWFwcGluZzoge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjogXCJjYWxsOm9uV3JpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbldyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ2FsbGJhY2tDYWxsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2hlYXRoaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVtbzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eXo6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBcImRhdGEueHl6XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkOiB7XG4gICAgICAgICAgICAgICAgbWFwcGluZzoge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjogXCJjYWxsOm9uUmVhZFwiLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ2FsbGJhY2tDYWxsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGF0aDogJ2RhdGEueHl6JyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBleHBlY3Qoc2VydmVyLnRyYW5zZm9ybVNlcnZlclBheWxvYWQoe2RlbW86IDEsIGRhdGE6IHt4eXo6IDJ9fSkpLnRvLmRlZXAuZXF1YWwoe2RlbW86IDEsIGRhdGE6IHt4eXo6IDJ9fSlcbiAgICAgICAgZXhwZWN0KHNlcnZlci5wcmVwYXJlU2VydmVyUGF5bG9hZCh7ZGVtbzogMSwgZGF0YToge3h5ejogMn19KSkudG8uZGVlcC5lcXVhbCh7ZGVtbzogMSwgZGF0YToge3h5ejogMn19KVxuXG5cbiAgICB9KVxuXG59KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcm5hbFN5bWJvbCwgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgV2ViQ29ubmVjdCBhcyBOZXRXZWJDb25uZWN0IH0gZnJvbSBcIi4uLy4uLy4uL25ldC93ZWJjb25uZWN0Lm1qc1wiO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi9uZXQvd2ViY29ubmVjdC9tZXNzYWdlLm1qc1wiO1xuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSBcIi4uL3NlcnZlci5tanNcIjtcblxuZXhwb3J0IHsgV2ViQ29ubmVjdCB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICpcbiAqIGhpbnQ6IHRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZSB0ZXN0cy4gaWYgeW91IHdhbnQgdG8gY2hhbmdlIGl0LCBwbGVhc2UgY2hhbmdlIGl0IGluIHRoZSB0ZXN0cyBhcyB3ZWxsLlxuICovXG5jb25zdCB3ZWJDb25uZWN0U3ltYm9sID0gU3ltYm9sKFwiY29ubmVjdGlvblwiKTtcblxuLyoqXG4gKiBUaGUgUmVzdEFQSSBpcyBhIGNsYXNzIHRoYXQgZW5hYmxlcyBhIFJFU1QgQVBJIHNlcnZlci5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uLy4uLy4uL2V4YW1wbGUvZGF0YS9kYXRhc291cmNlL3NlcnZlci93ZWJjb25uZWN0Lm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMy4xLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgTG9jYWxTdG9yYWdlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgV2ViQ29ubmVjdCBleHRlbmRzIFNlcnZlciB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBkYXRhc291cmNlLlxuXHQgKi9cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAoaXNTdHJpbmcob3B0aW9ucykpIHtcblx0XHRcdG9wdGlvbnMgPSB7IHVybDogb3B0aW9ucyB9O1xuXHRcdH1cblxuXHRcdGlmICghaXNPYmplY3Qob3B0aW9ucykpIG9wdGlvbnMgPSB7fTtcblx0XHR0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG5cdFx0dGhpc1t3ZWJDb25uZWN0U3ltYm9sXSA9IG5ldyBOZXRXZWJDb25uZWN0KHtcblx0XHRcdHVybDogdGhpcy5nZXRPcHRpb24oXCJ1cmxcIiksXG5cdFx0XHRjb25uZWN0aW9uOiB7XG5cdFx0XHRcdHRpbWVvdXQ6IHRoaXMuZ2V0T3B0aW9uKFwiY29ubmVjdGlvbi50aW1lb3V0XCIpLFxuXHRcdFx0XHRyZWNvbm5lY3Q6IHtcblx0XHRcdFx0XHR0aW1lb3V0OiB0aGlzLmdldE9wdGlvbihcImNvbm5lY3Rpb24ucmVjb25uZWN0LnRpbWVvdXRcIiksXG5cdFx0XHRcdFx0YXR0ZW1wdHM6IHRoaXMuZ2V0T3B0aW9uKFwiY29ubmVjdGlvbi5yZWNvbm5lY3QuYXR0ZW1wdHNcIiksXG5cdFx0XHRcdFx0ZW5hYmxlZDogdGhpcy5nZXRPcHRpb24oXCJjb25uZWN0aW9uLnJlY29ubmVjdC5lbmFibGVkXCIpLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29ubmVjdCgpIHtcblx0XHRyZXR1cm4gdGhpc1t3ZWJDb25uZWN0U3ltYm9sXS5jb25uZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdGlzQ29ubmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW3dlYkNvbm5lY3RTeW1ib2xdLmlzQ29ubmVjdGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvZGF0YS9kYXRhc291cmNlL3NlcnZlci93ZWJjb25uZWN0XCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmw9dW5kZWZpbmVkIERlZmluZXMgdGhlIHJlc291cmNlIHRoYXQgeW91IHdpc2ggdG8gZmV0Y2guXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25uZWN0aW9uXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25uZWN0aW9uLnRpbWVvdXQ9NTAwMCBEZWZpbmVzIHRoZSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbi5cblx0ICogQHByb3BlcnR5IHtOdW1iZXJ9IGNvbm5lY3Rpb24ucmVjb25uZWN0LnRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcmVjb25uZWN0LlxuXHQgKiBAcHJvcGVydHkge051bWJlcn0gY29ubmVjdGlvbi5yZWNvbm5lY3QuYXR0ZW1wdHMgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29ubmVjdHMuXG5cdCAqIEBwcm9wZXJ0eSB7Qm9vbH0gY29ubmVjdGlvbi5yZWNvbm5lY3QuZW5hYmxlZCBJZiB0aGUgcmVjb25uZWN0IGlzIGVuYWJsZWQuXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZT17fSBPcHRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5tYXBwaW5nIHRoZSBtYXBwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHdyaXRpbmcuXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3cml0ZS5tYXBwaW5nLnRyYW5zZm9ybWVyIFRyYW5zZm9ybWVyIHRvIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgZW50cmllc1xuXHQgKiBAcHJvcGVydHkge01vbnN0ZXIuRGF0YS5EYXRhc291cmNlfmV4YW1wbGVDYWxsYmFja1tdfSB3cml0ZS5tYXBwaW5nLmNhbGxiYWNrIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNhbGxiYWNrLCB0aGUgc3RydWN0dXJlcyBjYW4gYmUgYWRqdXN0ZWQgYmVmb3JlIHdyaXRpbmcuXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5zaGVhdGhpbmdcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlLnNoZWF0aGluZy5vYmplY3QgT2JqZWN0IHRvIGJlIHdyYXBwZWRcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHdyaXRlLnNoZWF0aGluZy5wYXRoIFBhdGggdG8gdGhlIGRhdGFcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHJlYWQ9e30gT3B0aW9uc1xuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gcmVhZC5wYXRoIFBhdGggdG8gZGF0YVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gcmVhZC5tYXBwaW5nIHRoZSBtYXBwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcmVhZGluZy5cblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWQubWFwcGluZy50cmFuc2Zvcm1lciBUcmFuc2Zvcm1lciB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcblx0ICogQHByb3BlcnR5IHtNb25zdGVyLkRhdGEuRGF0YXNvdXJjZX5leGFtcGxlQ2FsbGJhY2tbXX0gcmVhZC5tYXBwaW5nLmNhbGxiYWNrIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNhbGxiYWNrLCB0aGUgc3RydWN0dXJlcyBjYW4gYmUgYWRqdXN0ZWQgYWZ0ZXIgcmVhZGluZy5cblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHVybDogdW5kZWZpbmVkLFxuXHRcdFx0d3JpdGU6IHtcblx0XHRcdFx0bWFwcGluZzoge1xuXHRcdFx0XHRcdHRyYW5zZm9ybWVyOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Y2FsbGJhY2tzOiB7fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c2hlYXRoaW5nOiB7XG5cdFx0XHRcdFx0b2JqZWN0OiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0cGF0aDogdW5kZWZpbmVkLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHJlYWQ6IHtcblx0XHRcdFx0bWFwcGluZzoge1xuXHRcdFx0XHRcdHRyYW5zZm9ybWVyOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Y2FsbGJhY2tzOiB7fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0cGF0aDogdW5kZWZpbmVkLFxuXHRcdFx0fSxcblx0XHRcdGNvbm5lY3Rpb246IHtcblx0XHRcdFx0dGltZW91dDogNTAwMCxcblx0XHRcdFx0cmVjb25uZWN0OiB7XG5cdFx0XHRcdFx0dGltZW91dDogMTAwMCxcblx0XHRcdFx0XHRhdHRlbXB0czogMSxcblx0XHRcdFx0XHRlbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY2xvc2VzIHRoZSBjb25uZWN0aW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y2xvc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXNbd2ViQ29ubmVjdFN5bWJvbF0uY2xvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0cmVhZCgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0d2hpbGUgKHRoaXNbd2ViQ29ubmVjdFN5bWJvbF0uZGF0YVJlY2VpdmVkKCkgPT09IHRydWUpIHtcblx0XHRcdFx0bGV0IG9iaiA9IHRoaXNbd2ViQ29ubmVjdFN5bWJvbF0ucG9sbCgpO1xuXHRcdFx0XHRpZiAoIWlzT2JqZWN0KG9iaikpIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiVGhlIHJlY2VpdmVkIGRhdGEgaXMgbm90IGFuIG9iamVjdC5cIikpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2UpKSB7XG5cdFx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihcIlRoZSByZWNlaXZlZCBkYXRhIGlzIG5vdCBhIE1lc3NhZ2UuXCIpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmogPSBvYmouZ2V0RGF0YSgpO1xuXHRcdFx0XHRvYmogPSB0aGlzLnRyYW5zZm9ybVNlcnZlclBheWxvYWQuY2FsbCh0aGlzLCBvYmopO1xuXHRcdFx0XHR0aGlzLnNldChvYmopO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNvbHZlKHRoaXMuZ2V0KCkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHR3cml0ZSgpIHtcblx0XHRjb25zdCBvYmogPSB0aGlzLnByZXBhcmVTZXJ2ZXJQYXlsb2FkKHRoaXMuZ2V0KCkpO1xuXHRcdHJldHVybiB0aGlzW3dlYkNvbm5lY3RTeW1ib2xdLnNlbmQob2JqKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtSZXN0QVBJfVxuXHQgKi9cblx0Z2V0Q2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBXZWJDb25uZWN0KHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbXCJvcHRpb25zXCJdKTtcblx0fVxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1dlYkNvbm5lY3R9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3NlcnZlci93ZWJjb25uZWN0Lm1qc1wiO1xuaW1wb3J0IHtpbml0V2ViU29ja2V0fSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC93ZWJzb2NrZXQubWpzXCI7XG5cbmNvbnN0IHRlc3RVcmwgPSBcIndzczovL3dzLnBvc3RtYW4tZWNoby5jb20vcmF3XCJcblxuZGVzY3JpYmUoJ1dlYnNvY2tldCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBkcyA9IHVuZGVmaW5lZFxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRXZWJTb2NrZXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgZG9uZShlKVxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGlmIChkcykge1xuICAgICAgICAgICAgZHMuY2xvc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gd29ya2Fyb3VuZDogd2l0aG91dCB0aGlzLCB0aGUgbm9kZSB0ZXN0IHdpbGwgbm90IGV4aXQgXG4gICAgICAgIGZvciAoY29uc3Qgc3ltIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZHMpKSB7XG4gICAgICAgICAgICBpZiAoc3ltLnRvU3RyaW5nKCkgPT09ICdTeW1ib2woY29ubmVjdGlvbiknKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGRzW3N5bV1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN5bTIgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ltMi50b1N0cmluZygpID09PSAnU3ltYm9sKGNvbm5lY3Rpb24pJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2V0ID0gY29ubmVjdGlvbltzeW0yXT8uc29ja2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc29ja2V0Py50ZXJtaW5hdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0Py5bJ3Rlcm1pbmF0ZSddKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkb25lKClcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGNsb25lJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGRzID0gbmV3IFdlYkNvbm5lY3QodGVzdFVybClcbiAgICAgICAgY29uc3QgY2xvbmUgPSBkcy5nZXRDbG9uZSgpXG4gICAgICAgIGV4cGVjdChjbG9uZSkudG8uYmUuYW4uaW5zdGFuY2VvZihXZWJDb25uZWN0KVxuXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgdHJhbnNmb3JtIGRhdGEnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCB3cml0ZUNhbGxiYWNrQ2FsbGVkID0gZmFsc2VcbiAgICAgICAgbGV0IHJlYWRDYWxsYmFja0NhbGxlZCA9IGZhbHNlXG5cbiAgICAgICAgZHMgPSBuZXcgV2ViQ29ubmVjdCh7XG4gICAgICAgICAgICB1cmw6IHRlc3RVcmwsXG4gICAgICAgICAgICB3cml0ZToge1xuICAgICAgICAgICAgICAgIG1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IFwiY2FsbDpvbldyaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25Xcml0ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUNhbGxiYWNrQ2FsbGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNoZWF0aGluZzoge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbW86IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHl6OiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogXCJkYXRhLnh5elwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZDoge1xuICAgICAgICAgICAgICAgIG1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IFwiY2FsbDpvblJlYWRcIixcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblJlYWQ6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZENhbGxiYWNrQ2FsbGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhdGg6ICdkYXRhLnh5eicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgZHMuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZHMuc2V0KHtcbiAgICAgICAgICAgICAgICBlbnZlbG9wOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSGVsbG8gV29ybGRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBkcy5zZXQoe30pXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRzLmdldCgpKS50by5iZS5kZWVwLmVxdWFsKHt9KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG5cbiAgICAgICAgICAgICAgICAgICAgZHMucmVhZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRzLmdldCgpKS50by5iZS5kZWVwLmVxdWFsKHtlbnZlbG9wOnttZXNzYWdlOiBcIkhlbGxvIFdvcmxkXCJ9fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Qod3JpdGVDYWxsYmFja0NhbGxlZCkudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHJlYWRDYWxsYmFja0NhbGxlZCkudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgMjAwKVxuXG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgfSlcblxuXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgY29ubmVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGRzID0gbmV3IFdlYkNvbm5lY3Qoe1xuICAgICAgICAgICAgdXJsOiB0ZXN0VXJsLFxuICAgICAgICAgICAgcmVjb25uZWN0OiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgZG9uZShlKVxuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBzZW5kIGEgbWVzc2FnZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRpbWVvdXQoMTAwMDApXG4gICAgICAgIFxuICAgICAgICBkcyA9IG5ldyBXZWJDb25uZWN0KHtcbiAgICAgICAgICAgIHVybDogdGVzdFVybCxcbiAgICAgICAgICAgIHJlY29ubmVjdDoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgZHMuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZHMuc2V0KHtcbiAgICAgICAgICAgICAgICBlbnZlbG9wOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSGVsbG8gV29ybGRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBkcy5zZXQoe30pXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRzLmdldCgpKS50by5iZS5kZWVwLmVxdWFsKHt9KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIGRzLnJlYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRzLmdldCgpKS50by5iZS5kZWVwLmVxdWFsKHtlbnZlbG9wOnttZXNzYWdlOiBcIkhlbGxvIFdvcmxkXCJ9fSk7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sNTAwKVxuICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIGRvbmUoZSlcbiAgICAgICAgfSlcblxuXG4gICAgfSk7XG5cbn0pO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sLCBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBpc09iamVjdCwgaXNGdW5jdGlvbiwgaXNBcnJheSB9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7IGRpZmYgfSBmcm9tIFwiLi4vLi4vZGlmZi5tanNcIjtcbmltcG9ydCB7IFNlcnZlciB9IGZyb20gXCIuLi9zZXJ2ZXIubWpzXCI7XG5pbXBvcnQgeyBXcml0ZUVycm9yIH0gZnJvbSBcIi4vcmVzdGFwaS93cml0ZWVycm9yLm1qc1wiO1xuaW1wb3J0IHsgRGF0YUZldGNoRXJyb3IgfSBmcm9tIFwiLi9yZXN0YXBpL2RhdGEtZmV0Y2gtZXJyb3IubWpzXCI7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gXCIuLi8uLi8uLi91dGlsL2Nsb25lLm1qc1wiO1xuXG5leHBvcnQgeyBSZXN0QVBJIH07XG5cbi8qKlxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDMuMTIuMFxuICovXG5jb25zdCByYXdEYXRhU3ltYm9sID0gU3ltYm9sLmZvcihcblx0XCJAc2NodWthaS9tb25zdGVyL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIvcmVzdGFwaS9yYXdkYXRhXCIsXG4pO1xuXG4vKipcbiAqIFRoZSBSZXN0QVBJIGlzIGEgY2xhc3MgdGhhdCBlbmFibGVzIGEgUkVTVCBBUEkgc2VydmVyLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vLi4vLi4vZXhhbXBsZS9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3Jlc3RhcGkubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIyLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBUaGUgUmVzdEFQSSBpcyBhIGNsYXNzIHRoYXQgYmluZHMgYSBSRVNUIEFQSSBzZXJ2ZXIuXG4gKi9cbmNsYXNzIFJlc3RBUEkgZXh0ZW5kcyBTZXJ2ZXIge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25zIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgZGF0YXNvdXJjZS5cblx0ICovXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0XHR0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3Jlc3RhcGlcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlPXt9IE9wdGlvbnNcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlLmluaXQ9e30gQW4gb3B0aW9uIG9iamVjdCwgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuIFRoZSBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwgdG8gdGhvc2Ugb2YgdGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdC9SZXF1ZXN0fFJlcXVlc3QgY29uc3RydWN0b3J9XG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3cml0ZS5pbml0Lm1ldGhvZD1QT1NUXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5pbml0LmhlYWRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgYW55IGN1c3RvbSBoZWFkZXJzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3cml0ZS5yZXNwb25zZUNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGNvbXBsZXRlZC5cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHdyaXRlLmFjY2VwdGVkU3RhdHVzPVsyMDAsMjAxXVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUudXJsIFVSTFxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gd3JpdGUubWFwcGluZyB0aGUgbWFwcGluZyBpcyBhcHBsaWVkIGJlZm9yZSB3cml0aW5nLlxuXHQgKiBAcHJvcGVydHkge1N0cmluZ30gd3JpdGUubWFwcGluZy50cmFuc2Zvcm1lciBUcmFuc2Zvcm1lciB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcblx0ICogQHByb3BlcnR5IHtleGFtcGxlQ2FsbGJhY2tbXX0gd3JpdGUubWFwcGluZy5jYWxsYmFjayB3aXRoIHRoZSBoZWxwIG9mIHRoZSBjYWxsYmFjaywgdGhlIHN0cnVjdHVyZXMgY2FuIGJlIGFkanVzdGVkIGJlZm9yZSB3cml0aW5nLlxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gd3JpdGUucmVwb3J0XG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3cml0ZS5yZXBvcnQucGF0aCBQYXRoIHRvIHZhbGlkYXRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5wYXJ0aWFsXG5cdCAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHdyaXRlLnBhcnRpYWwuY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLiAob2JqLCBkaWZmUmVzdWx0KSA9PiBvYmpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlLnNoZWF0aGluZ1xuXHQgKiBAcHJvcGVydHkge09iamVjdH0gd3JpdGUuc2hlYXRoaW5nLm9iamVjdCBPYmplY3QgdG8gYmUgd3JhcHBlZFxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUuc2hlYXRoaW5nLnBhdGggUGF0aCB0byB0aGUgZGF0YVxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gcmVhZD17fSBPcHRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByZWFkLmluaXQ9e30gQW4gb3B0aW9uIG9iamVjdCBjb250YWluaW5nIGFueSBjdXN0b20gc2V0dGluZ3MgdGhhdCB5b3Ugd2FudCB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4gVGhlIHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBvZiB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3R8UmVxdWVzdCBjb25zdHJ1Y3Rvcn1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQuaW5pdC5tZXRob2Q9R0VUXG5cdCAqIEBwcm9wZXJ0eSB7YXJyYXl9IHJlYWQuYWNjZXB0ZWRTdGF0dXM9WzIwMF1cblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQudXJsIFVSTFxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gcmVhZC5tYXBwaW5nIHRoZSBtYXBwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcmVhZGluZy5cblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWQubWFwcGluZy50cmFuc2Zvcm1lciBUcmFuc2Zvcm1lciB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcblx0ICogQHByb3BlcnR5IHtleGFtcGxlQ2FsbGJhY2tbXX0gcmVhZC5tYXBwaW5nLmNhbGxiYWNrIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNhbGxiYWNrLCB0aGUgc3RydWN0dXJlcyBjYW4gYmUgYWRqdXN0ZWQgYWZ0ZXIgcmVhZGluZy5cblx0ICovXG5cdGdldCBkZWZhdWx0cygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcblx0XHRcdHdyaXRlOiB7XG5cdFx0XHRcdGluaXQ6IHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXNwb25zZUNhbGxiYWNrOiBudWxsLFxuXHRcdFx0XHRhY2NlcHRlZFN0YXR1czogWzIwMCwgMjAxXSxcblx0XHRcdFx0dXJsOiBudWxsLFxuXHRcdFx0XHRtYXBwaW5nOiB7XG5cdFx0XHRcdFx0dHJhbnNmb3JtZXI6IG51bGwsXG5cdFx0XHRcdFx0Y2FsbGJhY2tzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c2hlYXRoaW5nOiB7XG5cdFx0XHRcdFx0b2JqZWN0OiBudWxsLFxuXHRcdFx0XHRcdHBhdGg6IG51bGwsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcG9ydDoge1xuXHRcdFx0XHRcdHBhdGg6IG51bGwsXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0cGFydGlhbDoge1xuXHRcdFx0XHRcdGNhbGxiYWNrOiBudWxsLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHJlYWQ6IHtcblx0XHRcdFx0aW5pdDoge1xuXHRcdFx0XHRcdG1ldGhvZDogXCJHRVRcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0cGF0aDogbnVsbCxcblx0XHRcdFx0cmVzcG9uc2VDYWxsYmFjazogbnVsbCxcblx0XHRcdFx0YWNjZXB0ZWRTdGF0dXM6IFsyMDBdLFxuXHRcdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRcdG1hcHBpbmc6IHtcblx0XHRcdFx0XHR0cmFuc2Zvcm1lcjogbnVsbCxcblx0XHRcdFx0XHRjYWxsYmFja3M6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGRhdGEgY2Fubm90IGJlIHJlYWRcblx0ICovXG5cdHJlYWQoKSB7XG5cdFx0bGV0IGluaXQgPSB0aGlzLmdldE9wdGlvbihcInJlYWQuaW5pdFwiKTtcblx0XHRpZiAoIWlzT2JqZWN0KGluaXQpKSBpbml0ID0ge307XG5cdFx0aWYgKCFpbml0W1wibWV0aG9kXCJdKSBpbml0W1wibWV0aG9kXCJdID0gXCJHRVRcIjtcblxuXHRcdGxldCBjYWxsYmFjayA9IHRoaXMuZ2V0T3B0aW9uKFwicmVhZC5yZXNwb25zZUNhbGxiYWNrXCIpO1xuXHRcdGlmICghY2FsbGJhY2spIHtcblx0XHRcdGNhbGxiYWNrID0gKG9iaikgPT4ge1xuXHRcdFx0XHR0aGlzLnNldCh0aGlzLnRyYW5zZm9ybVNlcnZlclBheWxvYWQuY2FsbCh0aGlzLCBvYmopKTtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZldGNoRGF0YS5jYWxsKHRoaXMsIGluaXQsIFwicmVhZFwiLCBjYWxsYmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICogQHRocm93cyB7V3JpdGVFcnJvcn0gdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW5cblx0ICovXG5cdHdyaXRlKCkge1xuXHRcdGxldCBpbml0ID0gdGhpcy5nZXRPcHRpb24oXCJ3cml0ZS5pbml0XCIpO1xuXHRcdGlmICghaXNPYmplY3QoaW5pdCkpIGluaXQgPSB7fTtcblx0XHRpZiAodHlwZW9mIGluaXRbXCJoZWFkZXJzXCJdICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRpbml0W1wiaGVhZGVyc1wiXSA9IHtcblx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRpZiAoIWluaXRbXCJtZXRob2RcIl0pIGluaXRbXCJtZXRob2RcIl0gPSBcIlBPU1RcIjtcblxuXHRcdGNvbnN0IG9iaiA9IHRoaXMucHJlcGFyZVNlcnZlclBheWxvYWQodGhpcy5nZXQoKSk7XG5cdFx0aW5pdFtcImJvZHlcIl0gPSBKU09OLnN0cmluZ2lmeShvYmopO1xuXG5cdFx0Y29uc3QgY2FsbGJhY2sgPSB0aGlzLmdldE9wdGlvbihcIndyaXRlLnJlc3BvbnNlQ2FsbGJhY2tcIik7XG5cdFx0cmV0dXJuIGZldGNoRGF0YS5jYWxsKHRoaXMsIGluaXQsIFwid3JpdGVcIiwgY2FsbGJhY2spO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1Jlc3RBUEl9XG5cdCAqL1xuXHRnZXRDbG9uZSgpIHtcblx0XHRjb25zdCBhcGkgPSBuZXcgUmVzdEFQSSgpO1xuXG5cdFx0Y29uc3QgcmVhZCA9IGNsb25lKHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbXCJvcHRpb25zXCJdLnJlYWQpO1xuXHRcdGNvbnN0IHdyaXRlID0gY2xvbmUodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVtcIm9wdGlvbnNcIl0ud3JpdGUpO1xuXG5cdFx0YXBpLnNldE9wdGlvbihcInJlYWRcIiwgcmVhZCk7XG5cdFx0YXBpLnNldE9wdGlvbihcIndyaXRlXCIsIHdyaXRlKTtcblxuXHRcdHJldHVybiBhcGk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGluaXRcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBmZXRjaERhdGEoaW5pdCwga2V5LCBjYWxsYmFjaykge1xuXHRsZXQgcmVzcG9uc2U7XG5cblx0cmV0dXJuIGZldGNoKHRoaXMuZ2V0T3B0aW9uKGAke2tleX0udXJsYCksIGluaXQpXG5cdFx0LnRoZW4oKHJlc3ApID0+IHtcblx0XHRcdHJlc3BvbnNlID0gcmVzcDtcblxuXHRcdFx0Y29uc3QgYWNjZXB0ZWRTdGF0dXMgPSB0aGlzLmdldE9wdGlvbihgJHtrZXl9LmFjY2VwdGVkU3RhdHVzYCwgWzIwMF0pLm1hcChcblx0XHRcdFx0TnVtYmVyLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFjY2VwdGVkU3RhdHVzLmluZGV4T2YocmVzcC5zdGF0dXMpID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRGF0YUZldGNoRXJyb3IoXG5cdFx0XHRcdFx0YHRoZSByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFuIGFjY2VwdGVkIHN0YXR1cyAoYWN0dWFsOiAke3Jlc3Auc3RhdHVzfSkuYCxcblx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3AudGV4dCgpO1xuXHRcdH0pXG5cdFx0LnRoZW4oKGJvZHkpID0+IHtcblx0XHRcdGxldCBvYmo7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9iaiA9IEpTT04ucGFyc2UoYm9keSk7XG5cblx0XHRcdFx0cmVzcG9uc2VbcmF3RGF0YVN5bWJvbF0gPSBvYmo7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChib2R5Lmxlbmd0aCA+IDEwMCkge1xuXHRcdFx0XHRcdGJvZHkgPSBgJHtib2R5LnN1YnN0cmluZygwLCA5Nyl9Li4uYDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRocm93IG5ldyBEYXRhRmV0Y2hFcnJvcihcblx0XHRcdFx0XHRgdGhlIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIChhY3R1YWw6ICR7Ym9keX0pLmAsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuXHRcdFx0XHRjYWxsYmFjayhvYmopO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdH0pXG5cdFx0LmNhdGNoKChlKSA9PiB7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sLCBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7IFdyaXRlRXJyb3IgfTtcblxuLyoqXG4gKiBFcnJvciBtZXNzYWdlIGZvciBBUEkgcmVxdWVzdHMgd2l0aCBleHRlbnNpb24gb2YgcmVxdWVzdCBhbmQgdmFsaWRhdGlvbi5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSB0aGUgZXJyb3IgaXMgdGhyb3duIGJ5IHRoZSByZXN0IGFwaSBpbiBjYXNlIG9mIGVycm9yXG4gKi9cbmNsYXNzIFdyaXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuXHQgKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNwb25zZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsaWRhdGlvblxuXHQgKi9cblx0Y29uc3RydWN0b3IobWVzc2FnZSwgcmVzcG9uc2UsIHZhbGlkYXRpb24pIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcblx0XHRcdHJlc3BvbnNlOiByZXNwb25zZSxcblx0XHRcdHZhbGlkYXRpb246IHZhbGlkYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcblx0XHRcdFwiQHNjaHVrYWkvbW9uc3Rlci9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3Jlc3RhcGkvd3JpdGUtZXJyb3JcIixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1Jlc3BvbnNlfVxuXHQgKi9cblx0Z2V0UmVzcG9uc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wicmVzcG9uc2VcIl07XG5cdH1cblxuXHQvKipcblx0ICogQHJldHVybiB7T2JqZWN0fVxuXHQgKi9cblx0Z2V0VmFsaWRhdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJ2YWxpZGF0aW9uXCJdO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaW50ZXJuYWxTeW1ib2wsIGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHsgRGF0YUZldGNoRXJyb3IgfTtcblxuLyoqXG4gKiBFcnJvciBtZXNzYWdlIGZvciBBUEkgcmVxdWVzdHNcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAzLjQzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSB0aGUgZXJyb3IgaXMgdGhyb3duIGJ5IHRoZSByZXN0IGFwaSBpbiBjYXNlIG9mIGVycm9yXG4gKi9cbmNsYXNzIERhdGFGZXRjaEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2Vcblx0ICogQHBhcmFtIHtSZXNwb25zZX0gcmVzcG9uc2Vcblx0ICovXG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHJlc3BvbnNlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG5cdFx0XHRyZXNwb25zZTogcmVzcG9uc2UsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFxuXHRcdFx0XCJAc2NodWthaS9tb25zdGVyL2RhdGEvZGF0YXNvdXJjZS9zZXJ2ZXIvcmVzdGFwaS9kYXRhZmV0Y2hlcnJvckBAaW5zdGFuY2VcIixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZXR1cm4ge1Jlc3BvbnNlfVxuXHQgKi9cblx0Z2V0UmVzcG9uc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdW1wicmVzcG9uc2VcIl07XG5cdH1cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UmVzdEFQSX0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc2VydmVyL3Jlc3RhcGkubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5kZXNjcmliZSgnUmVzdEFQSScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBmZXRjaFJlZmVyZW5jZTtcbiAgICBsZXQgcmV0dXJuU3RhdHVzO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgcmV0dXJuU3RhdHVzID0gMjAwO1xuICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFRoaXNbJ2ZldGNoJ107XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJldHVyblN0YXR1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9O1xuXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgUmVzdEFQSSAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgUmVzdEFQSSgnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJykpLnRvLmJlLmluc3RhbmNlb2YoUmVzdEFQSSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdydycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVhZCBzaG91bGQgcmV0dXJuIG9iamVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBSZXN0QVBJKHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSlcbiAgICAgICAgICAgIGRzLnJlYWQoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0KGRhdGEpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFJlc3RBUEkoe1xuICAgICAgICAgICAgICAgICAgICByZWFkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRTdGF0dXM6IFs5OV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKFwic2hvdWxkIG5vdCBiZSBoZXJlXCIpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ3J3IHdpdGggZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZWFkIHNob3VsZCB0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuU3RhdHVzID0gNDAwOyAvLyBmZXRjaCByZXNwb25zZSB3aXRoIDQwMFxuXG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBSZXN0QVBJKHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSlcbiAgICAgICAgICAgIGRzLnJlYWQoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoXCJzaG91bGQgbm90IHJ1bi5cIik7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoKSk7IC8vIHNob3VsZCB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSByZXR1cm5TdGF0dXM9NDAwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVyblN0YXR1cyA9IDQwMDsgLy8gZmV0Y2ggcmVzcG9uc2Ugd2l0aCA0MDBcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFJlc3RBUEkoe3VybDogJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbid9LCB7dXJsOiAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJ30pXG4gICAgICAgICAgICBkcy53cml0ZSgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgZG9uZShcImVycm9yXCIpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKCkpOyAvLyBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIGJlY2F1c2UgcmV0dXJuU3RhdHVzPTQwMFxuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtEYXRhc291cmNlfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RhdGEvZGF0YXNvdXJjZS5tanNcIjtcblxuXG5kZXNjcmliZSgnRGF0YXNvdXJjZScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBEYXRhc291cmNlICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBEYXRhc291cmNlKCkpLnRvLmJlLmluc3RhbmNlb2YoRGF0YXNvdXJjZSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdPcHRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2V0T3B0aW9uIHNob3VsZCBjaGFuZ2UgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc291cmNlID0gbmV3IERhdGFzb3VyY2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChkYXRhc291cmNlLmdldE9wdGlvbignZGVmYXVsdCcpKS50by5iZS51bmRlZmluZWRcbiAgICAgICAgICAgIGRhdGFzb3VyY2Uuc2V0T3B0aW9uKCdkZWZhdWx0JywgdHJ1ZSlcbiAgICAgICAgICAgIGV4cGVjdChkYXRhc291cmNlLmdldE9wdGlvbignZGVmYXVsdCcpKS50by5iZS50cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzZXRPcHRpb25zIHNob3VsZCBzZXQgYWxsIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSBuZXcgRGF0YXNvdXJjZSgpO1xuICAgICAgICAgICAgZXhwZWN0KGRhdGFzb3VyY2UuZ2V0T3B0aW9uKCdkZWZhdWx0JykpLnRvLmJlLnVuZGVmaW5lZFxuICAgICAgICAgICAgZGF0YXNvdXJjZS5zZXRPcHRpb25zKHtkZWZhdWx0OiB0cnVlfSlcbiAgICAgICAgICAgIGV4cGVjdChkYXRhc291cmNlLmdldE9wdGlvbignZGVmYXVsdCcpKS50by5iZS50cnVlXG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdydycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZGF0YXNvdXJjZSA9IG5ldyBEYXRhc291cmNlKCk7XG4gICAgICAgIGl0KCdyZWFkIHNob3VsZCB0aHJvdyBleGVwdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkYXRhc291cmNlLnJlYWQoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgdGhyb3cgZXhlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZGF0YXNvdXJjZS5yZWFkKCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG4gICAgXG4gICAgZGVzY3JpYmUoJ2dldC9zZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSBuZXcgRGF0YXNvdXJjZSgpO1xuICAgICAgICBpdCgnZ2V0IHNob3VsZCByZXR1cm4gdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLmdldCgpKS50by5iZS5lcWwoe30pO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgdGhyb3cgZXhlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoIGRhdGFzb3VyY2UuZ2V0KCkpLnRvLmJlLmVxbCh7fSk7XG4gICAgICAgICAgICBleHBlY3QoIGRhdGFzb3VyY2Uuc2V0KHthOidteXZhbHVlJ30pKS50by5iZS5pbnN0YW5jZW9mKERhdGFzb3VyY2UpO1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLmdldCgpKS50by5iZS5lcWwoe2E6J215dmFsdWUnfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG5cbn0pIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtidWlsZE1hcH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kYXRhL2J1aWxkbWFwLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdidWlsZE1hcCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBjb252ZXJ0TWFwUmVzdWx0ID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIHIgPSBPYmplY3QuZnJvbUVudHJpZXMocik7XG4gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgciA9IHIubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TWFwUmVzdWx0KGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgb10gb2YgT2JqZWN0LmVudHJpZXMocikpIHtcbiAgICAgICAgICAgICAgICAgICAgcltrXSA9IGNvbnZlcnRNYXBSZXN1bHQobyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIE1hcCB3aXRoIGNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnZGVmaW5pdGlvbiBzaG91bGQgcmV0dXJuIG1hcCB3aXRoIHN1YiBhbmQgcGFyZW50IGtleXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogNCwgbGFiZWw6IFwiTFwiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IG0gPSBuZXcgTWFwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgYl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViamVjdC5kYXRhKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkxID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtqLCBjXSBvZiBPYmplY3QuZW50cmllcyhiLmVucmljaG1lbnQudmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MiA9IGo7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIGRdIG9mIE9iamVjdC5lbnRyaWVzKGMucHJpY2UpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MyA9IGs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm5hbWUgPSBiLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sYWJlbCA9IGMubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5pZCA9IFtrZXkxLCBrZXkyLCBrZXkzXS5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldChkLmlkLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbWFwID0gYnVpbGRNYXAob2JqLCBjYWxsYmFjaywgJyR7bmFtZX0gJHtsYWJlbH0nLCAnJHtpZH0nKVxuICAgICAgICAgICAgbGV0IGkgPSBjb252ZXJ0TWFwUmVzdWx0KG1hcCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShpKSkudG8uYmUuZXF1YWwoJ3tcIjAuMC4wXCI6XCJDYXNzYW5kcmEgWFhTXCIsXCIwLjAuMVwiOlwiQ2Fzc2FuZHJhIFhYU1wiLFwiMC4xLjBcIjpcIkNhc3NhbmRyYSBYU1wiLFwiMC4xLjFcIjpcIkNhc3NhbmRyYSBYU1wiLFwiMC4yLjBcIjpcIkNhc3NhbmRyYSBTXCIsXCIwLjIuMVwiOlwiQ2Fzc2FuZHJhIFNcIixcIjAuMy4wXCI6XCJDYXNzYW5kcmEgTFwiLFwiMC4zLjFcIjpcIkNhc3NhbmRyYSBMXCIsXCIxLjAuMFwiOlwiWWVzc2V5ISBYWFNcIixcIjEuMC4xXCI6XCJZZXNzZXkhIFhYU1wiLFwiMS4xLjBcIjpcIlllc3NleSEgWFNcIixcIjEuMS4xXCI6XCJZZXNzZXkhIFhTXCIsXCIxLjIuMFwiOlwiWWVzc2V5ISBTXCIsXCIxLjIuMVwiOlwiWWVzc2V5ISBTXCIsXCIxLjMuMFwiOlwiWWVzc2V5ISBMXCIsXCIxLjMuMVwiOlwiWWVzc2V5ISBMXCJ9Jyk7XG5cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIHN1Ym1hcCB3aXRoIConLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdkZWZpbml0aW9uIHNob3VsZCByZXR1cm4ge1wiMTBcIjpcIkNhc3NhbmRyYSAxMFwiLFwiMjBcIjpcIlllc3NleSEgMjBcIn0nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gJHtpZH0nLCAnJHtpZH0nKVxuICAgICAgICAgICAgbGV0IGkgPSBjb252ZXJ0TWFwUmVzdWx0KG1hcCk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoaSkpLnRvLmJlLmVxdWFsKCd7XCIxMFwiOlwiQ2Fzc2FuZHJhIDEwXCIsXCIyMFwiOlwiWWVzc2V5ISAyMFwifScpO1xuXG4gICAgICAgIH0pXG4gICAgfSlcblxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIHN1Ym1hcCB3aXRoICoqJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnZGVmaW5pdGlvbiBzaG91bGQgcmV0dXJuIE1hcCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICBcImRhdGFcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ2Fzc2FuZHJhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQycsIGlkOiAxfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnLCBpZDogMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnLCBpZDogM30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJywgaWQ6IDR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnLCBpZDogNX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJywgaWQ6IDZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogNCwgbGFiZWw6IFwiTFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnLCBpZDogN30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJywgaWQ6IDh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIlllc3NleSFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJywgaWQ6IDl9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQycsIGlkOiAxMH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnLCBpZDogMTF9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQycsIGlkOiAxMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQycsIGlkOiAxM30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJywgaWQ6IDE0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJMXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQycsIGlkOiAxNX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJywgaWQ6IDE2fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0NC4xMiBcdTIwQUMnLCBpZDogMTd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLiouZW5yaWNobWVudC52YXJpYW50cy4qLnByaWNlLionLCAnJHt2a30gJHteLmxhYmVsfSAke14uXi5uYW1lfScsICcke14uXi5za3V9JylcbiAgICAgICAgICAgIGxldCBpID0gY29udmVydE1hcFJlc3VsdChtYXApO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGkpKS50by5iZS5lcXVhbCgne1wiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4wXCI6XCIxMi4xMiBcdTIwQUMgWFhTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4xXCI6XCIxMi4xMiBcdTIwQUMgWFhTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMS5wcmljZS4wXCI6XCIyMi4xMiBcdTIwQUMgWFMgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4xLnByaWNlLjFcIjpcIjIyLjEyIFx1MjBBQyBYUyBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjIucHJpY2UuMFwiOlwiMzIuMTIgXHUyMEFDIFMgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4yLnByaWNlLjFcIjpcIjMyLjEyIFx1MjBBQyBTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMy5wcmljZS4wXCI6XCI0Mi4xMiBcdTIwQUMgTCBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMVwiOlwiNDIuMTIgXHUyMEFDIEwgQ2Fzc2FuZHJhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4wLnByaWNlLjBcIjpcIjEyLjEyIFx1MjBBQyBYWFMgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4xXCI6XCIxMi4xMiBcdTIwQUMgWFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjEucHJpY2UuMFwiOlwiMjIuMTIgXHUyMEFDIFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjEucHJpY2UuMVwiOlwiMjIuMTIgXHUyMEFDIFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjIucHJpY2UuMFwiOlwiMzIuMTIgXHUyMEFDIFMgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMi5wcmljZS4xXCI6XCIzMi4xMiBcdTIwQUMgUyBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4zLnByaWNlLjBcIjpcIjQyLjEyIFx1MjBBQyBMIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMVwiOlwiNDIuMTIgXHUyMEFDIEwgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMy5wcmljZS4yXCI6XCI0NC4xMiBcdTIwQUMgTCBZZXNzZXkhXCJ9Jyk7XG5cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGVjb2RlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBleGFtcGxlIGNvZGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhZGRyZXNzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0cmVldFwiOiBcIjQ5My00MTA1IFZ1bHB1dGF0ZSBTdHJlZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJTYXVtdXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjUyNjI4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkhvbGx5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyZWV0XCI6IFwiMTc2MiBFZ2V0IFJkLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2l0eVwiOiBcIlNjaHdhbGJhY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjk1MjM0MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMzAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJHdXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjogXCI5NTctMzg4IFNvbGxpY2l0dWRpbiBBdmVudWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJQYW5jaGlcdTAwRTBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjQyMDcyOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgbWFwO1xuICAgICAgICAgICAgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gKCR7YWRkcmVzcy56aXB9ICR7YWRkcmVzcy5jaXR5fSknLCAnaWQnKVxuICAgICAgICAgICAgZXhwZWN0KG1hcCkudG8uYmUuaW5zdGFuY2VPZihNYXApO1xuXG4gICAgICAgICAgICBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLionLCAnJHtuYW1lfSAoJHthZGRyZXNzLnppcH0gJHthZGRyZXNzLmNpdHl9KScpXG4gICAgICAgICAgICBleHBlY3QobWFwKS50by5iZS5pbnN0YW5jZU9mKE1hcCk7XG5cbiAgICAgICAgICAgIG1hcCA9IGJ1aWxkTWFwKG9iaiwgJ2RhdGEuKicsICcke25hbWV9ICgke2FkZHJlc3MuemlwfSAke2FkZHJlc3MuY2l0eX0pJywgJ2lkJywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWydpZCddID49IDIwKSA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGV4cGVjdChtYXApLnRvLmJlLmluc3RhbmNlT2YoTWFwKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkbWFwKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgXCIxMDA4MlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAxXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAxXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiMTAwODRcIjoge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIE1hcCBJbnN0YW5jZS4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoYnVpbGRNYXAoe30sICcnKSkudG8uYmUuaW5zdGFuY2VPZihNYXApO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtvYmoxLCAnZGF0YXNldC4qJywgJ2FkZHJlc3MnLCAne1wiZGF0YXNldC4xMDA4MlwiOlwiSGVyZSAxXCIsXCJkYXRhc2V0LjEwMDg0XCI6XCJIZXJlIDJcIn0nXSxcbiAgICAgICAgICAgIFtvYmoxLCAneCcsIHVuZGVmaW5lZCwgJ3t9J10sXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICduYW1lJywgJ3tcImRhdGFzZXQuMTAwODJcIjpcIlRlc3QgMVwiLFwiZGF0YXNldC4xMDA4NFwiOlwiVGVzdCAyXCJ9J10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnYnVpbGRNYXAoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJywnICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnLCcgKyBKU09OLnN0cmluZ2lmeShjKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGQpICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBidWlsZE1hcChhLCBiLCBjKTtcbiAgICAgICAgICAgICAgICBsZXQgbSA9IEpTT04uc3RyaW5naWZ5KGNvbnZlcnRNYXBSZXN1bHQodCkpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChtKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RhdGEvdHJhbnNmb3JtZXIubWpzXCI7XG5pbXBvcnQge2dldExvY2FsZU9mRG9jdW1lbnR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7RW1iZWR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi9wcm92aWRlcnMvZW1iZWQubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdUcmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIHByb21pc2VzLnB1c2goaW5pdEpTRE9NKCkpO1xuICAgICAgICBpZiAoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUcmFuc2Zvcm1lci5ydW4oKSBsb2NhbGl6ZSBjb21tYW5kcycsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIGNvbnN0IGlzTm9kZSA9IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmICdbb2JqZWN0IGdsb2JhbF0nID09PSBnbG9iYWwudG9TdHJpbmcuY2FsbChnbG9iYWwpO1xuXG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydkYXRldGltZWZvcm1hdCcsIFwiMjAyMy0wMi0wNCAwODowMjowMVwiLCBcIkZlYiA0LCAyMDIzLCAwODowMjowMVwiLCBcIjQgRmViIDIwMjMsIDA4OjAyOjAxXCJdLFxuICAgICAgICAgICAgWydkYXRldGltZWZvcm1hdDpsb25nOnNob3J0JywgXCIyMDIzLTAyLTA0IDA4OjAyOjAxXCIsIFwiRmVicnVhcnkgNCwgMjAyMyBhdCAwODowMlwiLCBcIjQgRmVicnVhcnkgMjAyMyBhdCAwODowMlwiXSxcbiAgICAgICAgICAgIFsnZGF0ZXRpbWVmb3JtYXQ6c2hvcnQ6c2hvcnQnLCBcIjIwMjMtMDItMDQgMDg6MDI6MDFcIiwgXCIyLzQvMjMsIDA4OjAyXCIsIFwiMDQvMDIvMjAyMywgMDg6MDJcIl0sXG4gICAgICAgICAgICBbJ2N1cnJlbmN5JywgXCJFVVIwXCIsIFwiXHUyMEFDMC4wMFwiLCBcIlx1MjBBQzAuMDBcIl0sXG4vLyAgICAgICAgICAgIFsnY3VycmVuY3k6MToyJywgXCJFVVIxNC4yNVwiLCBcIlx1MjBBQzE0LjNcIiwgXCJcdTIwQUMxNC4yXCJdLFxuICAgICAgICAgICAgWydjdXJyZW5jeScsIFwiRVVSMTQuMjVcIiwgXCJcdTIwQUMxNC4yNVwiLCBcIlx1MjBBQzE0LjI1XCJdLFxuICAgICAgICAgICAgWydkYXRldGltZScsIFwiMjAyMy0wMi0xNCAxNDoxMjoxMFwiLCBcIjIvMTQvMjAyMywgMTQ6MTI6MTBcIixcIjE0LzAyLzIwMjMsIDE0OjEyOjEwXCJdLFxuICAgICAgICAgICAgWydkYXRldGltZScsIFwiMjAyMy0wMi0xNCAwODowMjowMVwiLCBcIjIvMTQvMjAyMywgMDg6MDI6MDFcIixcIjE0LzAyLzIwMjMsIDA4OjAyOjAxXCJdLFxuICAgICAgICAgICAgWydkYXRlJywgXCIyMDIzLTAyLTE0XCIsIFwiMDIvMTQvMjAyM1wiLFwiMTQvMDIvMjAyM1wiXSxcblxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMjRcblxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKSAvLyBjb21tYW5kXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKSAvLyB2YWx1ZVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KCkgLy8gZXhwZWN0ZWQgcmVzdWx0IG5vZGUgICAgXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKSAvLyBleHBlY3RlZCByZXN1bHQgYnJvd3NlciAgICBcblxuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBpc05vZGUgPyBjIDogZFxuXG4gICAgICAgICAgICBpdCgnVHJhbnNmb3JtZXIucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShleHBlY3RlZCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5ldyBUcmFuc2Zvcm1lcihhKTtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdC5ydW4oYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGV4cGVjdGVkKS50by5iZS5lcWwociwgXCJUcmFuc2Zvcm1lci5ydW4oXCIgKyBKU09OLnN0cmluZ2lmeShhKSArIFwiKS5ydW4oXCIgKyBKU09OLnN0cmluZ2lmeShiKSArIFwiKSBzaG91bGQgcmV0dXJuIFwiICsgSlNPTi5zdHJpbmdpZnkoYykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdUcmFuc2Zvcm1lci5ydW4oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ2VxdWFsczphJywgXCJhXCIsIHRydWVdLFxuICAgICAgICAgICAgWydlcXVhbHM6YScsIFwiYlwiLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2VxdWFsczozJywgMywgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2VxdWFsczozJywgNiwgZmFsc2VdLFxuICAgICAgICAgICAgWydlcXVhbHM6b24nLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOnRydWUnLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOm9uJywgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOnRydWUnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgWydlcXVhbHM6b2ZmJywgZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgWydlcXVhbHM6ZmFsc2UnLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2VxdWFsczpvZmYnLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2VxdWFsczpmYWxzZScsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOjMnLCAzLCB0cnVlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOjMnLCA2LCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2VxdWFsczp1bmRlZmluZWQnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydlcXVhbHM6dW5kZWZpbmVkJywgMywgZmFsc2VdLFxuICAgICAgICAgICAgWydlcXVhbHM6bnVsbCcsIG51bGwsIHRydWVdLFxuICAgICAgICAgICAgWydlcXVhbHM6bnVsbCcsIDMsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnZXF1YWxzOjMnLCA2LCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2hhcy1lbnRyaWVzJywge30sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnaGFzLWVudHJpZXMnLCB7YTogNH0sIHRydWVdLFxuICAgICAgICAgICAgWydoYXMtZW50cmllcycsIFtdLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2hhcy1lbnRyaWVzJywgXCJcIiwgZmFsc2VdLFxuICAgICAgICAgICAgWydoYXMtZW50cmllcycsIFsxLCAyLCAzXSwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2hhcy1lbnRyaWVzJywgWzFdLCB0cnVlXSxcbiAgICAgICAgICAgIFsnaGFzLWVudHJpZXMnLCBbXCIxXCJdLCB0cnVlXSxcbiAgICAgICAgICAgIFsnaGFzLWVudHJpZXMnLCBbdHJ1ZV0sIHRydWVdLFxuICAgICAgICAgICAgWydjb250YWluczp4JywgXCJhc2Qgd3hkIHNkZlwiLCB0cnVlXSxcbiAgICAgICAgICAgIFsnY29udGFpbnM6eCcsIFwiYXNkIHdkIHNkZlwiLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2NvbnRhaW5zOmInLCBbXCJhXCIsIFwiYlwiLCBcImNcIl0sIHRydWVdLFxuICAgICAgICAgICAgWydjb250YWluczp4JywgW1wiYVwiLCBcImJcIiwgXCJjXCJdLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2lzdW5kZWZpbmVkJywgXCJhXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnaXN1bmRlZmluZWQnLCBudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2lzdW5kZWZpbmVkJywgdW5kZWZpbmVkLCB0cnVlXSxcbiAgICAgICAgICAgIFsnaXNudWxsJywgXCJhXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnaXNudWxsJywgbnVsbCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2lzc2V0JywgbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWydpc3NldCcsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWydpc3NldCcsIFwiXCIsIHRydWVdLFxuICAgICAgICAgICAgWydpc251bWJlcicsIFwiYVwiLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2lzbnVtYmVyJywgNCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2lzbnVtYmVyJywgNC41LCB0cnVlXSxcbiAgICAgICAgICAgIFsnaXNpbnRlZ2VyJywgNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2lzaW50ZWdlcicsIDQsIHRydWVdLFxuICAgICAgICAgICAgWydpc2Zsb2F0JywgNS42LCB0cnVlXSxcbiAgICAgICAgICAgIFsnaXNmbG9hdCcsIDUsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnaXNvYmplY3QnLCA0LCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2lzb2JqZWN0Jywge30sIHRydWVdLFxuICAgICAgICAgICAgWydpc2FycmF5JywgW3t9XSwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2lzYXJyYXknLCBcImFcIiwgZmFsc2VdLFxuICAgICAgICAgICAgWydub3QnLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ25vdCcsIGZhbHNlLCB0cnVlXSxcbiAgICAgICAgICAgIFsnbWFwOmE9NDpiPTU6Yz02JywgXCJhXCIsIFwiNFwiXSxcbiAgICAgICAgICAgIFsneWVhcicsIFwiMjAyMy0wMi0xNFwiLCAyMDIzXSxcbiAgICAgICAgICAgIFsnbW9udGgnLCBcIjIwMjMtMDItMTRcIiwgMl0sXG4gICAgICAgICAgICBbJ2RheScsIFwiMjAyMy0wMi0xNFwiLCAxNF0sXG4gICAgICAgICAgICBbJ3dlZWtkYXknLCBcIjIwMjMtMDItMTRcIiwgMl0sXG4gICAgICAgICAgICBbJ21pbnV0ZXMnLCBcIjIwMjMtMDItMTQgMDY6MTI6MjFcIiwgMTJdLFxuICAgICAgICAgICAgWydzZWNvbmRzJywgXCIyMDIzLTAyLTE0IDA2OjEyOjIxXCIsIDIxXSxcbiAgICAgICAgICAgIFsnaG91cnMnLCBcIjIwMjMtMDItMTQgMDY6MTI6MjFcIiwgNl0sXG4gICAgICAgICAgICBbJ3RpbWUnLCBcIjIwMjMtMDItMTQgMDY6MTI6MjFcIiwgXCIwNjoxMjoyMVwiXSxcbiAgICAgICAgICAgIFsndGltZXN0YW1wJywgXCIyMDIzLTAyLTE0XCIsIDE2NzYzMzI4MDAwMDBdLFxuICAgICAgICAgICAgWydjb25jYXQ6YS5iLmM6dGVzdDphLmIuZCcsIHthOiB7Yjoge2M6IDQsIGQ6IDZ9fX0sIFwiNHRlc3Q2XCJdLFxuICAgICAgICAgICAgWydjb25jYXQ6YS5iLmM6XFxcXCBcXFxcIDphLmIuZCcsIHthOiB7Yjoge2M6IDQsIGQ6IDZ9fX0sIFwiNCAgNlwiXSxcbiAgICAgICAgICAgIFsnY29uY2F0OmEuYi5jOiw6YS5iLmQnLCB7YToge2I6IHtjOiA0LCBkOiA2fX19LCBcIjQsNlwiXSxcbiAgICAgICAgICAgIFsnY29uY2F0OmEuYi5jOiw6XFxcXCA6YS5iLmQnLCB7YToge2I6IHtjOiA0LCBkOiA2fX19LCBcIjQsIDZcIl0sXG4gICAgICAgICAgICBbJz8/OmEnLCBudWxsLCAnYSddLFxuICAgICAgICAgICAgWyc/PzphJywgdW5kZWZpbmVkLCAnYSddLFxuICAgICAgICAgICAgWyc/PzphJywgJ3RydWUnLCAndHJ1ZSddLFxuICAgICAgICAgICAgWyc/PzphJywgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnIGlmOmE6ICcsIGZhbHNlLCB1bmRlZmluZWRdLCAvLyB3aXRob3V0IFxcXFxcbiAgICAgICAgICAgIFsnIGlmOmE6XFxcXCAnLCBmYWxzZSwgXCIgXCJdLFxuICAgICAgICAgICAgWycgaWY6YTpcXFxcICcsIHRydWUsIFwiYVwiXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp1bmRlZmluZWQ6Ym9vbCcsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnllcycsIG51bGwsICd5ZXMnXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp5ZXMnLCB1bmRlZmluZWQsICd5ZXMnXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDoxOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0Om9uOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnRydWU6Ym9vbCcsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6eWVzOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0OmZhbHNlOmJvb2wnLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDoxOmludCcsIHVuZGVmaW5lZCwgMV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6MTpzdHJpbmcnLCB1bmRlZmluZWQsICcxJ10sXG4gICAgICAgICAgICBbJ2ZpcnN0LWtleScsIHthOiAxLCBjOiAzLCBiOiAyfSwgMV0sXG4gICAgICAgICAgICBbJ2xhc3Qta2V5Jywge2E6IDEsIGM6IDMsIGI6IDJ9LCAzXSxcbiAgICAgICAgICAgIFsnbnRoLWxhc3Qta2V5OjAnLCB7YTogMSwgYzogMywgYjogMn0sIDNdLFxuICAgICAgICAgICAgWydudGgtbGFzdC1rZXk6MScsIHthOiAxLCBjOiAzLCBiOiAyfSwgMl0sXG4gICAgICAgICAgICBbJ250aC1sYXN0LWtleToyJywge2E6IDEsIGM6IDMsIGI6IDJ9LCAxXSxcbiAgICAgICAgICAgIFsnbnRoLWtleToyJywge2E6IDEsIGI6IDIsIGM6IDN9LCAzXSxcbiAgICAgICAgICAgIFsnbnRoLWtleTowJywge2M6IDMsIGE6IDEsIGI6IDJ9LCAxXSxcbiAgICAgICAgICAgIFsnbnRoLWtleToyJywge2E6IDEsIGM6IDMsIGI6IDJ9LCAzXSxcbiAgICAgICAgICAgIFsncHJlZml4OkhlbGxvXFxcXCAnLCAndGVzdCcsIFwiSGVsbG8gdGVzdFwiXSxcbiAgICAgICAgICAgIFsndG9qc29uJywge2E6IDR9LCBcIntcXFwiYVxcXCI6NH1cIl0sXG4gICAgICAgICAgICBbJ3ByZWZpeDphXFxcXFxcXFw6ICcsICd0ZXN0JywgXCJhXFxcXHRlc3RcIl0sXG4gICAgICAgICAgICBbJ3ByZWZpeDphXFxcXCAnLCAndGVzdCcsIFwiYSB0ZXN0XCJdLFxuICAgICAgICAgICAgWydzdGF0aWM6YWJjOmE6Yjp4JywgXCJ0ZXN0XCIsIFwiYWJjOmE6Yjp4XCJdLFxuICAgICAgICAgICAgWyd0b2xvd2VyY2FzZScsIFwiQTpiOkNzZTRcIiwgXCJhOmI6Y3NlNFwiXSxcbiAgICAgICAgICAgIFsndG91cHBlcicsIFwiQTpiOkNzZTRcIiwgXCJBOkI6Q1NFNFwiXSxcbiAgICAgICAgICAgIFsndG9zdHJpbmcnLCA1LCBcIjVcIl0sXG4gICAgICAgICAgICBbJ3Rvc3RyaW5nJywgWzEsIDIsIDMsIHt9XSwgXCIxLDIsMyxbb2JqZWN0IE9iamVjdF1cIl0sXG4gICAgICAgICAgICBbJ3RvaW50ZWdlcicsIFwiNVwiLCA1XSxcbiAgICAgICAgICAgIFsndHJpbScsIFwiIDUgXCIsIFwiNVwiXSxcbiAgICAgICAgICAgIFsndHJpbScsIFwiIGFcIiwgXCJhXCJdLFxuICAgICAgICAgICAgWyd0cmltJywgXCIgXCIsIFwiXCJdLFxuICAgICAgICAgICAgWydyYXd1cmxlbmNvZGUnLCBcIlx1MDBGQ1x1MDBGNlx1MDBFNFwiLCBcIiVDMyVCQyVDMyVCNiVDMyVBNFwiXSxcbiAgICAgICAgICAgIFsnY2FsbDp0ZXN0Y2FsbGJhY2s6NDo1OjYnLCBcInRlc3RcIiwgXCJ0ZXN0NDU2XCJdLFxuICAgICAgICAgICAgWydwbGFpbicsICd0PGJyPmVzdCcsIFwidGVzdFwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgdHJ1ZSwgXCJhXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCAnb24nLCBcImFcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsICd0cnVlJywgXCJhXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCAnZmFsc2UnLCBcImJcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsIDksIFwiYVwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgJycsIFwiYlwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgdW5kZWZpbmVkLCBcImJcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsIGZhbHNlLCBcImJcIl0sXG4gICAgICAgICAgICBbJ3VjZmlyc3QnLCAnY2FyJywgXCJDYXJcIl0sXG4gICAgICAgICAgICBbJ3VjZmlyc3QnLCAnY0FyJywgXCJDQXJcIl0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6dGVzdCcsICdhJywgXCJhXCJdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnRlc3QnLCB1bmRlZmluZWQsIFwidGVzdFwiXSxcbiAgICAgICAgICAgIFsnZnJvbWpzb24nLCAne30nLCB7fV0sXG4gICAgICAgICAgICBbJ2Zyb21qc29uJywgJ3tcImFcIjoxfScsIHthOiAxfV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCAnY0FyIHJ1bnMnLCBcIkNBciBSdW5zXCJdLFxuICAgICAgICAgICAgWyd0b2ludGVnZXInLCAnNicsIDZdLFxuICAgICAgICAgICAgWydsZW5ndGgnLCAndGVzdCcsIDRdLFxuICAgICAgICAgICAgWyd0by1iYXNlNjQnLCAnSGVsbG8gV29ybGQhJywgXCJTR1ZzYkc4Z1YyOXliR1FoXCJdLFxuICAgICAgICAgICAgWydmcm9tLWJhc2U2NCcsICdTR1ZzYkc4Z1YyOXliR1FoJywgXCJIZWxsbyBXb3JsZCFcIl0sXG4gICAgICAgICAgICBbJ3RvLWJhc2U2NCcsICd0ZXN0JywgXCJkR1Z6ZEE9PVwiXSxcbiAgICAgICAgICAgIFsnZnJvbS1iYXNlNjQnLCBcImRHVnpkQT09XCIsICd0ZXN0J10sXG4gICAgICAgICAgICBbJ3ByZWZpeDphJywgJ3Rlc3QnLCBcImF0ZXN0XCJdLFxuICAgICAgICAgICAgWydzdWZmaXg6YScsICd0ZXN0JywgXCJ0ZXN0YVwiXSxcbiAgICAgICAgICAgIFsnaW5kZXg6YScsIHthOiA0fSwgNF0sXG4gICAgICAgICAgICBbJ2luZGV4OjInLCBbMiwgNCwgN10sIDddLFxuICAgICAgICAgICAgWydpbmRleDp4OnRlc3QnLCBbMiwgNCwgN10sICd0ZXN0J10sXG4gICAgICAgICAgICBbJ3BhdGg6YS5iLmMnLCB7YToge2I6IHtjOiA0fX19LCA0XSxcbiAgICAgICAgICAgIFsncGF0aDphLmIuZCcsIHthOiB7Yjoge2M6IDR9fX0sIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbJ2luZGV4OmEnLCBuZXcgTWFwKCkuc2V0KCdhJywgNSksIDVdLFxuICAgICAgICAgICAgWydzdWJzdHJpbmc6Mjo0JywgJ2FiY2RlZmdoaWprbG1ub3AnLCAnY2RlZiddLFxuICAgICAgICAgICAgWydub3AnLCAnYWJjZGVmZ2hpamtsbW5vcCcsICdhYmNkZWZnaGlqa2xtbm9wJ10sXG4gICAgICAgICAgICBbJ3NldC10b2dnbGU6YycsICdhIGIgYycsICdhIGInXSxcbiAgICAgICAgICAgIFsnc2V0LXRvZ2dsZTpjJywgJ2EgYicsICdhIGIgYyddLFxuICAgICAgICAgICAgWydzZXQtc2V0OmMnLCAnYSBiJywgJ2EgYiBjJ10sXG4gICAgICAgICAgICBbJ3NldC1zZXQ6YycsICdhIGIgYycsICdhIGIgYyddLFxuICAgICAgICAgICAgWydzZXQtcmVtb3ZlOmMnLCAnYSBiIGMnLCAnYSBiJ10sXG4gICAgICAgICAgICBbJ3NldC10b2dnbGU6YzosJywgJ2EsYixjJywgJ2EsYiddLFxuICAgICAgICAgICAgWydzZXQtdG9nZ2xlOmM6LCcsICdhLGInLCAnYSxiLGMnXSxcbiAgICAgICAgICAgIFsnc2V0LXNldDpjOiwnLCAnYSxiJywgJ2EsYixjJ10sXG4gICAgICAgICAgICBbJ3NldC1zZXQ6YzosJywgJ2EsYixjJywgJ2EsYixjJ10sXG4gICAgICAgICAgICBbJ3NldC1yZW1vdmU6YzosJywgJ2EsYixjJywgJ2EsYiddLFxuICAgICAgICAgICAgWydzZXQtdG9nZ2xlOmMsZDosJywgJ2EsYixjJywgJ2EsYixkJ10sXG4gICAgICAgICAgICBbJ3NldC10b2dnbGU6YyxkOiwnLCAnYSxiLGMsZCcsICdhLGInXSxcbiAgICAgICAgICAgIFsnc2V0LXRvZ2dsZTpjLGQ6LCcsICdhLGInLCAnYSxiLGMsZCddLFxuICAgICAgICAgICAgWydzZXQtc2V0OmMsZDosJywgJ2EsYicsICdhLGIsYyxkJ10sXG4gICAgICAgICAgICBbJ3NldC1zZXQ6YyxkOiwnLCAnYSxiLGMnLCAnYSxiLGMsZCddLFxuICAgICAgICAgICAgWydzZXQtcmVtb3ZlOmM6LCcsICdhLGIsYycsICdhLGInXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdUcmFuc2Zvcm1lci5ydW4oJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykucnVuKCcgKyBKU09OLnN0cmluZ2lmeShiKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGMpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBuZXcgVHJhbnNmb3JtZXIoYSk7XG5cbiAgICAgICAgICAgICAgICB0LnNldENhbGxiYWNrKCd0ZXN0Y2FsbGJhY2snLCBmdW5jdGlvbiAoYSwgYiwgYywgZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSArIGIgKyBjICsgZDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0LnJ1bihiKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoYykudG8uYmUuZXFsKHIsIFwiVHJhbnNmb3JtZXIucnVuKFwiICsgSlNPTi5zdHJpbmdpZnkoYSkgKyBcIikucnVuKFwiICsgSlNPTi5zdHJpbmdpZnkoYikgKyBcIikgc2hvdWxkIHJldHVybiBcIiArIEpTT04uc3RyaW5naWZ5KGMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zZm9ybWVyLnJ1bigpIHRocm93cyBFcnJvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3RvbG93ZXJjYXNlJywgW11dLFxuICAgICAgICAgICAgWyd0b2xvd2VyY2FzZScsIHt9XSxcbiAgICAgICAgICAgIFsndG9sb3dlcmNhc2UnLCA0LjVdLFxuICAgICAgICAgICAgWyd0b3VwcGVyJywgdHJ1ZV0sXG4gICAgICAgICAgICBbJ3RvdXBwZXInLCA1XSxcbiAgICAgICAgICAgIFsndG9pbnRlZ2VyJywgXCJhXCJdLFxuICAgICAgICAgICAgWyd0cmltJywgNV0sXG4gICAgICAgICAgICBbJ3RyaW0nLCB0cnVlXSxcbiAgICAgICAgICAgIFsndHJpbScsIHt9XSxcbiAgICAgICAgICAgIFsndHJpbScsIFtdXSxcbiAgICAgICAgICAgIFsncmF3dXJsZW5jb2RlJywgW11dLFxuICAgICAgICAgICAgWydpZjphOmInLCB7fV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCB7fV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCA0XSxcbiAgICAgICAgICAgIFsncGF0aDphLmIuYycsIFwiXCIsIDRdLFxuICAgICAgICAgICAgWyd0b2ludGVnZXInLCB7fV0sXG4gICAgICAgICAgICBbJ2Jhc2U2NCcsIHt9XSxcbiAgICAgICAgICAgIFsnZnJvbWpzb24nLCAnJ10sXG4gICAgICAgICAgICBbJ3ByZWZpeCcsIHt9XSxcbiAgICAgICAgICAgIFsnc3VmZml4Jywge31dLFxuICAgICAgICAgICAgWydpbmRleCcsIFwidGVzdFwiXSxcbiAgICAgICAgICAgIFsneHh4eHh4JywgXCJ0ZXN0XCJdLCAvLyB1bnN1cHBvcnRlZCBjb21tYW5kXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ1RyYW5zZm9ybWVyLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKS5ydW4oJyArIEpTT04uc3RyaW5naWZ5KGIpICsgJykgc2hvdWxkIHRocm93IEVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5ldyBUcmFuc2Zvcm1lcihhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdC5ydW4oYikpLnRvLnRocm93KEVycm9yKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbmV3IFRyYW5zZm9ybWVyKCkucnVuKFwidW5pcWlkXCIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBTdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IG5ldyBUcmFuc2Zvcm1lcigndW5pcWlkJyk7XG4gICAgICAgICAgICBleHBlY3QodC5ydW4oXCJcIikpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25ldyBUcmFuc2Zvcm1lcigpLnJ1bihcImRlZmF1bHQ6ZXlKaUlqb3hmUT09Om9iamVjdFwiKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHQgPSBuZXcgVHJhbnNmb3JtZXIoJ2RlZmF1bHQ6ZXlKaUlqb3hmUT09Om9iamVjdCcpO1xuICAgICAgICAgICAgZXhwZWN0KHQucnVuKHVuZGVmaW5lZCkpLnRvLmVxbCh7YjogMX0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnbmV3IFRyYW5zZm9ybWVyKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgVHJhbnNmb3JtZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRyYW5zZm9ybWVyKFwiXCIpKS50by5pbnN0YW5jZU9mKFRyYW5zZm9ybWVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBUcmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVHJhbnNmb3JtZXIoXCJzdWZmaXg6YWJjXCIpKS50by5pbnN0YW5jZU9mKFRyYW5zZm9ybWVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2ZhbHNlIGFzIGFyZ3VtZW50IHNob3VsZCB0aHJvdyBUeXBlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lcihmYWxzZSlcbiAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdvYmplY3QgYXMgYXJndW1lbnQgc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKHt9KVxuICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdpMThuJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBodG1sMSA9IGBcbjxkaXYgaWQ9XCJtb2NrLXRyYW5zbGF0aW9uc1wiPjwvZGl2PlxuPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiIGRhdGEtbW9uc3Rlci1yb2xlPVwidHJhbnNsYXRpb25zXCI+XG4gICAge1xuICAgICAgICBcInRlc3QxXCI6IFwieHl6XCIsXG4gICAgICAgIFwidGVzdDNcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcInh5elwiXG4gICAgICAgIH1cbiAgICB9XG48L3NjcmlwdD4gIFxuYDtcblxuICAgICAgICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9jay10cmFuc2xhdGlvbnMnKTtcbiAgICAgICAgICAgIEVtYmVkLmFzc2lnblRyYW5zbGF0aW9uc1RvRWxlbWVudChlbGVtKS50aGVuKChvKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpMThuOnRlc3QxJywgXCJcIiwgXCJ4eXpcIl0sXG4gICAgICAgICAgICBbJ2kxOG46JywgXCJ0ZXN0MVwiLCBcInh5elwiXSwgLy8ga2V5IGJ5IHZhbHVlXG4gICAgICAgICAgICBbJ2kxOG46OicsIFwidGVzdDFcIiwgXCJ4eXpcIl0sIC8vIGtleSBieSB2YWx1ZSBubyBkZWZhdWx0XG4gICAgICAgICAgICBbJ2kxOG46OmVlZScsIFwidGVzdDJcIiwgXCJlZWVcIl0sIC8vIGtleSBieSB2YWx1ZSB3aXRoIGRlZmF1bHRcbiAgICAgICAgICAgIFsnaTE4bjo6ZGRkJywgXCJ0ZXN0MlwiLCBcImRkZFwiXSwgLy8ga2V5IGJ5IHZhbHVlIGFuZCBkZWZhdWx0XG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0cmFuc2Zvcm0oJyArIGEgKyAnKS5ydW4oJyArIGIgKyAnKSByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGMpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBUcmFuc2Zvcm1lcihhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodC5ydW4oYikpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH0pXG5cblxufSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2RpZmZ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZGF0YS9kaWZmLm1qc1wiO1xuaW1wb3J0IHtRdWV1ZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9xdWV1ZS5tanNcIjtcblxuZGVzY3JpYmUoJ0RpZmYnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgndGVzdCB0byBkYXRhc2V0cycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgb2JqMSwgb2JqMjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG9iajEgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIsXG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRlc3QyXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG5cbiAgICAgICAgICAgIG9iajIgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEsXG4gICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IFwiM1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJ0ZXN0MlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGFzZXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBkaWZmKG9iajEsIG9iajIpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGQpKS5pcy5lcXVhbCgnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCIxXCIsXCJpZFwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoyLFwidHlwZVwiOlwibnVtYmVyXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjpcIjNcIixcInR5cGVcIjpcInN0cmluZ1wifX1dJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgfSlcbiAgICBcbiAgICBkZXNjcmliZSgnRGlmZiBzcGVjaWFsIGNhc2VzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciBvYmoxLCBvYmoyO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgb2JqMSA9IHtcbiAgICAgICAgICAgICAgICBcImNvdW50XCI6IDEsXG4gICAgICAgICAgICAgICAgXCJyZWFzb25cIjogbnVsbCxcbiAgICAgICAgICAgICAgICBcImluZm9cIjogXCJ0ZXN0XCIsXG4gICAgICAgICAgICAgICAgXCJleGNoYW5nZVwiOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG9iajIgPSB7XG4gICAgICAgICAgICAgICAgXCJjb3VudFwiOiAyLFxuICAgICAgICAgICAgICAgIFwicmVhc29uXCI6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJpbmZvXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBcImV4Y2hhbmdlXCI6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdEaWZmIHZhbHVlIHdpdGggbnVsbCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGRpZmYob2JqMSwgb2JqMik7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoZCkpLmlzLmVxdWFsKCdbe1wib3BlcmF0b3JcIjpcInVwZGF0ZVwiLFwicGF0aFwiOltcImNvdW50XCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjIsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJpbmZvXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOlwidGVzdFwiLFwidHlwZVwiOlwic3RyaW5nXCJ9fV0nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ0RpZmYgaWRlbnRpY2FsIHZhbHVlIHdpdGggbnVsbCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGRpZmYob2JqMSwgb2JqMSk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoZCkpLmlzLmVxdWFsKCdbXScpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGNvbnN0IGRhdGUxID0gbmV3IERhdGU7XG5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL3BhcnNlXG4gICAgY29uc3QgZGF0ZTIgPSBEYXRlLnBhcnNlKCcwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnKTtcbiAgICBjb25zdCBkYXRlMyA9IERhdGUucGFyc2UoJzA0IERlYyAxOTk1IDAwOjEyOjAwIEdNVCcpOyAvLyBOdW1iZXJcbiAgICBjb25zdCBkYXRlNCA9IERhdGUucGFyc2UoJzA0IERlYyAxOTk1IDAwOjEyOjAxIEdNVCcpOyAvLyBOdW1iZXJcblxuICAgIGNvbnN0IGRhdGU1ID0gbmV3IERhdGUoRGF0ZS5wYXJzZSgnMDQgRGVjIDE5OTUgMDA6MTI6MDEgR01UJykpOyAvLyBEYXRlXG4gICAgY29uc3QgZGF0ZTYgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKCcwNCBEZWMgMTk5NSAwMDoxMjowMiBHTVQnKSk7IC8vIERhdGVcblxuICAgIFtcblxuICAgICAgICBbXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBuZXcgUXVldWUoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImFcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOntcImRhdGFcIjpbXX0sXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJRdWV1ZVwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IDFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGM6IHtcbiAgICAgICAgICAgICAgICAgICAgZDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBlOiAzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiYVwiLFwiYlwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYVwiLFwiZVwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6MyxcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImNcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6e1wiZFwiOjJ9LFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiT2JqZWN0XCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiZlwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6e1wiZFwiOjJ9LFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiT2JqZWN0XCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUxLFxuICAgICAgICAgICAgICAgIGM6IGRhdGU0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUyLFxuICAgICAgICAgICAgICAgIGI6IGRhdGUzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwidXBkYXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjpcIicgKyBkYXRlMS50b0lTT1N0cmluZygpICsgJ1wiLFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiRGF0ZVwifSxcInNlY29uZFwiOntcInZhbHVlXCI6MCxcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImNcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6ODE4MDM1OTIxMDAwLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYlwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6ODE4MDM1OTIwMDAwLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGU1XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGI6IGRhdGU2XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjpcIjE5OTUtMTItMDRUMDA6MTI6MDEuMDAwWlwiLFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiRGF0ZVwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImJcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOlwiMTk5NS0xMi0wNFQwMDoxMjowMi4wMDBaXCIsXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJEYXRlXCJ9fV0nXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbXSdcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJhXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjo4MTgwMzU5MjAwMDAsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjAsXCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjgxODAzNTkyMDAwMCxcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjIsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB4OiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wieFwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IDIsXG4gICAgICAgICAgICAgICAgeDogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcInVwZGF0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifSxcInNlY29uZFwiOntcInZhbHVlXCI6MixcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcInhcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6bnVsbCxcInR5cGVcIjpcIm9iamVjdFwifX1dJ1xuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1tdJ1xuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYVwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6bnVsbCxcInR5cGVcIjpcIm9iamVjdFwifX1dJ1xuICAgICAgICBdLCBbXG4gICAgICAgIHt9LFxuICAgICAgICB7YTogdW5kZWZpbmVkfSxcbiAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYVwiXSxcInNlY29uZFwiOntcInR5cGVcIjpcInVuZGVmaW5lZFwifX1dJ1xuICAgIF1cblxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgIGl0KCdEaWZmIHNob3VsZCByZXN1bHQgJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gZGlmZihhLCBiKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShkKSkuaXMuZXF1YWwoYyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSkiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2J1aWxkVHJlZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kYXRhL2J1aWxkdHJlZS5tanNcIjtcbmltcG9ydCB7Tm9kZUxpc3R9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvbm9kZWxpc3QubWpzXCI7XG5cblxuZGVzY3JpYmUoJ2J1aWxkVHJlZScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgZGVzY3JpYmUoJ2xlZ2FjeSBuYXZpZ2F0aW9uIGV4YW1wbGUgKGlzc3VlICMyMzApJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIGV4YW1wbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG9iamVjdHMgPSBKU09OLnBhcnNlKGB7XG4gICAgXCJkYXRhc2V0XCI6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiAxMDAwMDEsXG4gICAgICAgICAgICBcInBhcmVudF9pZFwiOiAyMDAwMDEsXG4gICAgICAgICAgICBcInRpdGxlXCI6IFwiZUJheVwiLFxuICAgICAgICAgICAgXCJ1cmxcIjogXCIvXCIsXG4gICAgICAgICAgICBcIndlaWdodFwiOiAxLFxuICAgICAgICAgICAgXCJjc3Nfc3R5bGVzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImNzc19jbGFzc2VzXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiAyMDAwMDEsXG4gICAgICAgICAgICBcInBhcmVudF9pZFwiOiAyMDAwMDEsXG4gICAgICAgICAgICBcInRpdGxlXCI6IFwiYWx2aW5lY29uc29sZVwiLFxuICAgICAgICAgICAgXCJ1cmxcIjogXCJcIixcbiAgICAgICAgICAgIFwid2VpZ2h0XCI6IDEsXG4gICAgICAgICAgICBcImNzc19zdHlsZXNcIjogXCJcIixcbiAgICAgICAgICAgIFwiY3NzX2NsYXNzZXNcIjogXCJcIlxuICAgICAgICB9XG4gICAgXSxcbiAgICBcInN5c1wiOiB7XG4gICAgICAgIFwiY29kZVwiOiAyMDAsXG4gICAgICAgIFwicmVzdWx0XCI6IHt9LFxuICAgICAgICBcImFwaV92ZXJzaW9uXCI6IFwiMVwiXG4gICAgfVxufWApO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJ1aWxkVHJlZShvYmplY3RzLCAnZGF0YXNldC4qJywgJ2lkJywgJ3BhcmVudF9pZCcpOyAgICBcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGVycm9yKS50by5iZS5pbnN0YW5jZU9mKEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBcblxuICAgICAgICB9KVxuICAgIH0pICAgIFxuICAgIFxuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gZXhhbXBsZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0cyA9IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIFwiMVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInZlaGljbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbFxuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiMlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImNhclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIjNcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0cnVja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIjRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJtb3RvcmN5Y2xlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiNVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCI1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNVVlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIjZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzcG9ydHMgY2FyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gYnVpbGRUcmVlKG9iamVjdHMsICdkYXRhc2V0LionLCAnaWQnLCAncGFyZW50Jyk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlcykudG8uYmUuaW5zdGFuY2VPZihOb2RlTGlzdCk7XG4gICAgICAgICAgICBleHBlY3Qobm9kZXMubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgICAgICAgIGV4cGVjdChub2Rlcy50b1N0cmluZygpKS50by5iZS5lcXVhbCgne1wiaWRcIjpcIjFcIixcIm5hbWVcIjpcInZlaGljbGVcIixcInBhcmVudFwiOm51bGx9XFxuIFx1MjUxQ3tcImlkXCI6XCIyXCIsXCJuYW1lXCI6XCJjYXJcIixcInBhcmVudFwiOlwiMVwifVxcbiB8IFx1MjUxQ3tcImlkXCI6XCI1XCIsXCJuYW1lXCI6XCJTVVZcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IFx1MjUxNHtcImlkXCI6XCI2XCIsXCJuYW1lXCI6XCJzcG9ydHMgY2FyXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gXHUyNTFDe1wiaWRcIjpcIjNcIixcIm5hbWVcIjpcInRydWNrXCIsXCJwYXJlbnRcIjpcIjFcIn1cXG4gXHUyNTE0e1wiaWRcIjpcIjRcIixcIm5hbWVcIjpcIm1vdG9yY3ljbGVcIixcInBhcmVudFwiOlwiMVwifScgKTtcblxuXG4gICAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdidWlsZFRyZWUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgb2JqMSA9IHtcbiAgICAgICAgICAgIGRhdGFzZXQ6IHtcbiAgICAgICAgICAgICAgICBcIjFcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAxXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAxXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbFxuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjJcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIyXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAyXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAyXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiM1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjNcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDNcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDNcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI0XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNFwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNFwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNFwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjVcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI1XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA1XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA1XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjZcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDZcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDZcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBOb2RlIEluc3RhbmNlLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChidWlsZFRyZWUoe30sICcnKSkudG8uYmUuaW5zdGFuY2VPZihOb2RlTGlzdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtvYmoxLCAnZGF0YXNldC4qJywgJ3tcImlkXCI6XCIxXCIsXCJuYW1lXCI6XCJUZXN0IDFcIixcImFkZHJlc3NcIjpcIkhlcmUgMVwiLFwicGFyZW50XCI6bnVsbH1cXG4gXHUyNTFDe1wiaWRcIjpcIjJcIixcIm5hbWVcIjpcIlRlc3QgMlwiLFwiYWRkcmVzc1wiOlwiSGVyZSAyXCIsXCJwYXJlbnRcIjpcIjFcIn1cXG4gfCBcdTI1MUN7XCJpZFwiOlwiM1wiLFwibmFtZVwiOlwiVGVzdCAzXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDNcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IFx1MjUxNHtcImlkXCI6XCI0XCIsXCJuYW1lXCI6XCJUZXN0IDRcIixcImFkZHJlc3NcIjpcIkhlcmUgNFwiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgfCBcdTI1MTR7XCJpZFwiOlwiNlwiLFwibmFtZVwiOlwiVGVzdCA2XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDZcIixcInBhcmVudFwiOlwiNFwifVxcbiBcdTI1MTR7XCJpZFwiOlwiNVwiLFwibmFtZVwiOlwiVGVzdCA1XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDVcIixcInBhcmVudFwiOlwiMVwifSddLFxuICAgICAgICAgICAgW29iajEsICd4JywgJyddLFxuICAgICAgICAgICAgW29iajEsICdkYXRhc2V0LionLCAne1wiaWRcIjpcIjFcIixcIm5hbWVcIjpcIlRlc3QgMVwiLFwiYWRkcmVzc1wiOlwiSGVyZSAxXCIsXCJwYXJlbnRcIjpudWxsfVxcbiBcdTI1MUN7XCJpZFwiOlwiMlwiLFwibmFtZVwiOlwiVGVzdCAyXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDJcIixcInBhcmVudFwiOlwiMVwifVxcbiB8IFx1MjUxQ3tcImlkXCI6XCIzXCIsXCJuYW1lXCI6XCJUZXN0IDNcIixcImFkZHJlc3NcIjpcIkhlcmUgM1wiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgXHUyNTE0e1wiaWRcIjpcIjRcIixcIm5hbWVcIjpcIlRlc3QgNFwiLFwiYWRkcmVzc1wiOlwiSGVyZSA0XCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCB8IFx1MjUxNHtcImlkXCI6XCI2XCIsXCJuYW1lXCI6XCJUZXN0IDZcIixcImFkZHJlc3NcIjpcIkhlcmUgNlwiLFwicGFyZW50XCI6XCI0XCJ9XFxuIFx1MjUxNHtcImlkXCI6XCI1XCIsXCJuYW1lXCI6XCJUZXN0IDVcIixcImFkZHJlc3NcIjpcIkhlcmUgNVwiLFwicGFyZW50XCI6XCIxXCJ9J10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdidWlsZFRyZWUoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJywnICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBub2RlbGlzdCA9IGJ1aWxkVHJlZShhLCBiLCAnaWQnLCAncGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5vZGVsaXN0LnRvU3RyaW5nKCkpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnYnVpbGRUcmVlKCkgdGVzdCAyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAyXG4gICAgICAgICAqICAgIDFcbiAgICAgICAgICogICAgM1xuICAgICAgICAgKiA0XG4gICAgICAgICAqICAgIDZcbiAgICAgICAgICogNVxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMVwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjJcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIyXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAyXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAyXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIwXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiM1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjNcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDNcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDNcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI0XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNFwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNFwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNFwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjVcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI1XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA1XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA1XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIwXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjZcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDZcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDZcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI3XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiN1wiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgN1wiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgN1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIE5vZGUgSW5zdGFuY2UuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGJ1aWxkVHJlZSh7fSwgJycpKS50by5iZS5pbnN0YW5jZU9mKE5vZGVMaXN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW29iajEsICdkYXRhc2V0LionLCAne1wiaWRcIjpcIjJcIixcIm5hbWVcIjpcIlRlc3QgMlwiLFwiYWRkcmVzc1wiOlwiSGVyZSAyXCIsXCJwYXJlbnRcIjpcIjBcIn1cXG4gXHUyNTFDe1wiaWRcIjpcIjFcIixcIm5hbWVcIjpcIlRlc3QgMVwiLFwiYWRkcmVzc1wiOlwiSGVyZSAxXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCBcdTI1MTR7XCJpZFwiOlwiN1wiLFwibmFtZVwiOlwiVGVzdCA3XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDdcIixcInBhcmVudFwiOlwiMVwifVxcbiBcdTI1MTR7XCJpZFwiOlwiM1wiLFwibmFtZVwiOlwiVGVzdCAzXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDNcIixcInBhcmVudFwiOlwiMlwifVxcbntcImlkXCI6XCI0XCIsXCJuYW1lXCI6XCJUZXN0IDRcIixcImFkZHJlc3NcIjpcIkhlcmUgNFwiLFwicGFyZW50XCI6XCIwXCJ9XFxuIFx1MjUxNHtcImlkXCI6XCI2XCIsXCJuYW1lXCI6XCJUZXN0IDZcIixcImFkZHJlc3NcIjpcIkhlcmUgNlwiLFwicGFyZW50XCI6XCI0XCJ9XFxue1wiaWRcIjpcIjVcIixcIm5hbWVcIjpcIlRlc3QgNVwiLFwiYWRkcmVzc1wiOlwiSGVyZSA1XCIsXCJwYXJlbnRcIjpcIjBcIn0nXSxcbiAgICAgICAgICAgIFtvYmoxLCAneCcsICcnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2J1aWxkVHJlZSgnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnLCcgKyBKU09OLnN0cmluZ2lmeShiKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGMpICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVsaXN0ID0gYnVpbGRUcmVlKGEsIGIsICdpZCcsICdwYXJlbnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHJvb3RSZWZlcmVuY2VzOiBbJzAnXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KG5vZGVsaXN0LnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGMpO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuICAgIFxuICAgIFxuICAgIFxuXG5cbn0pO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcblxuZGVzY3JpYmUoJ1BhdGhmaW5kZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgY29udmVydE1hcFJlc3VsdCA9IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICByID0gT2JqZWN0LmZyb21FbnRyaWVzKHIpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHIgPSByLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydE1hcFJlc3VsdChlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIG9dIG9mIE9iamVjdC5lbnRyaWVzKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJba10gPSBjb252ZXJ0TWFwUmVzdWx0KG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGRlc2NyaWJlKFwidmFsdWUgaXMgbm90IGFuIGludGVnZXIgaXNzdWUgIzI3NFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KFwic2hvdWxkIG5vdCBiZSBmYWlsIHdpdGhcIiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBwZiA9IG5ldyBQYXRoZmluZGVyKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7fVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGYuc2V0VmlhKFwiZGF0YS5hZ2VcIiwgMTApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlKS50by5iZS5udWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleHBlY3QocGYuZ2V0VmlhKFwiZGF0YS5hZ2VcIikpLnRvLmJlLmVxdWFsKDEwKTtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ3dpdGggV2lsZGNhcmQgYW5kIEl0ZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBwZiwgb2JqO1xuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgICAgIGE6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCIxLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcIjEtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ6ICchJ1xuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiMi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCIyLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiAnPydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBmID0gbmV3IFBhdGhmaW5kZXIob2JqKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydhLiouYi4qJywgJ3tcIjBcIjp7XCIwXCI6e1wiY1wiOlwiMS0xXCJ9LFwiMVwiOntcImNcIjpcIjEtMlwifX0sXCIxXCI6e1wiMFwiOntcImNcIjpcIjItMVwifSxcIjFcIjp7XCJjXCI6XCIyLTJcIn19fSddLFxuICAgICAgICAgICAgWydhLiouYicsICd7XCIwXCI6W3tcImNcIjpcIjEtMVwifSx7XCJjXCI6XCIxLTJcIn1dLFwiMVwiOlt7XCJjXCI6XCIyLTFcIn0se1wiY1wiOlwiMi0yXCJ9XX0nXSxcbiAgICAgICAgICAgIFsnYS4xLmInLCAnW3tcImNcIjpcIjItMVwifSx7XCJjXCI6XCIyLTJcIn1dJ10sXG4gICAgICAgICAgICBbJ2EuMC5iJywgJ1t7XCJjXCI6XCIxLTFcIn0se1wiY1wiOlwiMS0yXCJ9XSddLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGEgKyAnKSBzaG91bGQgcmVzdWx0IGluICcgKyBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgciA9IHBmLmdldFZpYShhKTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGNvbnZlcnRNYXBSZXN1bHQocik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGkpKS5pcy5lcXVhbChiKTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnYXBpIHRlc3RzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBwYXRoZmluZGVyLCBvYmplY3Q7XG5cblxuICAgICAgICBjbGFzcyBBIHtcbiAgICAgICAgICAgIGdldCBhKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgb2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIFwidGVzdDFcIiwgZmFsc2UsIHVuZGVmaW5lZCwgcGFyc2VJbnQoXCJhXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBmOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTogW1widGVzdDJcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgajoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBrOiAobmV3IE1hcCkuc2V0KCdtJywge246IDN9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGw6IChuZXcgU2V0KS5hZGQoe246IDR9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiOiBuZXcgQVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGF0aGZpbmRlciA9IG5ldyBQYXRoZmluZGVyKG9iamVjdCk7XG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlIG5ldyBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbMTJdLFxuICAgICAgICAgICAgICAgIFt1bmRlZmluZWRdLFxuICAgICAgICAgICAgICAgIFtudWxsXSxcbiAgICAgICAgICAgICAgICBbXCJ0ZXN0XCJdXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gdHlwZW9mIGE7XG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IG51bGwpIGxhYmVsID0gJ251bGwnO1xuXG5cbiAgICAgICAgICAgICAgICBpdChsYWJlbCArICcgc2hvdWxkIHRocm93IGVycm9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aGZpbmRlcihhKVxuICAgICAgICAgICAgICAgICAgICB9KS50by50aHJvdyhFcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCcuc2V0VmlhKHgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgcGYsIG9iajtcblxuICAgICAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgb2JqID0ge31cbiAgICAgICAgICAgICAgICBwZiA9IG5ldyBQYXRoZmluZGVyKG9iaik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYS5iLjAuMC5jJywgdHJ1ZSwgJ3tcImFcIjp7XCJiXCI6W1t7XCJjXCI6dHJ1ZX1dXX19J10sXG4gICAgICAgICAgICAgICAgWydhLmIuMC5jJywgdHJ1ZSwgJ3tcImFcIjp7XCJiXCI6W3tcImNcIjp0cnVlfV19fSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLjMuYycsIHRydWUsICd7XCJhXCI6e1wiYlwiOltudWxsLG51bGwsbnVsbCx7XCJjXCI6dHJ1ZX1dfX0nXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5jJywgdHJ1ZSwgJ3tcImFcIjp7XCJiXCI6e1wiY1wiOnRydWV9fX0nXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGEgKyAnLCAnICsgYiArICcpIHNob3VsZCByZXN1bHQgaW4gJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGYuc2V0VmlhKGEsIGIpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvYmopKS5pcy5lcXVhbChjKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCcuc2V0VmlhKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBhO1xuICAgICAgICAgICAgbGV0IGI7XG4gICAgICAgICAgICBsZXQgYztcblxuICAgICAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYSA9IFwiYS54XCI7XG4gICAgICAgICAgICAgICAgYiA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIGMgPSBcImEueS5kXCI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnLnNldFZpYSgnICsgYSArICcsICcgKyBiICsgJykgc2hvdWxkIHJldHVybiBQYXRoZmluZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChwYXRoZmluZGVyLnNldFZpYShhLCBiKSkuaXMuaW5zdGFuY2VPZihQYXRoZmluZGVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnLnNldFZpYSgnICsgYSArICcsICcgKyBiICsgJykgc2hvdWxkIGNoYW5nZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGF0aGZpbmRlci5zZXRWaWEoYSwgYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG9iamVjdCkpLmlzLmVxdWFsKCd7XCJhXCI6e1wiYlwiOntcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImVcIjpmYWxzZSxcImZcIjpbe1wiZ1wiOmZhbHNlLFwiaFwiOjMsXCJpXCI6W1widGVzdDJcIl19XSxcImpcIjp7fSxcImtcIjp7fSxcImxcIjp7fX0sXCJ4XCI6XCJ0cnVlXCJ9LFwiYlwiOnt9fScpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCcuc2V0VmlhKCcgKyBjICsgJywgJyArIGIgKyAnKSBzaG91bGQgY2hhbmdlIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXRoZmluZGVyLnNldFZpYShjLCBiKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSkuaXMuZXF1YWwoJ3tcImFcIjp7XCJiXCI6e1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZVwiOmZhbHNlLFwiZlwiOlt7XCJnXCI6ZmFsc2UsXCJoXCI6MyxcImlcIjpbXCJ0ZXN0MlwiXX1dLFwialwiOnt9LFwia1wiOnt9LFwibFwiOnt9fSxcInlcIjp7XCJkXCI6XCJ0cnVlXCJ9fSxcImJcIjp7fX0nKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgZGVzY3JpYmUoJy5leGlzdHMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2EuYi5jLjEnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2IuYScsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYS5iLngnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydhLngnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydhLmIucScsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5jLjAnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5kJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZi4wLmcnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mLjAuaS4wJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZi4wLmkuMicsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5lJywgdHJ1ZV0sXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgICAgICAgICAgaXQoJy5leGlzdHMoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChwYXRoZmluZGVyLmV4aXN0cyhhKSkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnLmRlbGV0ZVZpYSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYS5iLmUnLCAne1wiYVwiOntcImJcIjp7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJmXCI6W3tcImdcIjpmYWxzZSxcImhcIjozLFwiaVwiOltcInRlc3QyXCJdfV0sXCJqXCI6e30sXCJrXCI6e30sXCJsXCI6e319fSxcImJcIjp7fX0nXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mJywgJ3tcImFcIjp7XCJiXCI6e1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZVwiOmZhbHNlLFwialwiOnt9LFwia1wiOnt9LFwibFwiOnt9fX0sXCJiXCI6e319J10sXG4gICAgICAgICAgICAgICAgWydhLmIuaicsICd7XCJhXCI6e1wiYlwiOntcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImVcIjpmYWxzZSxcImZcIjpbe1wiZ1wiOmZhbHNlLFwiaFwiOjMsXCJpXCI6W1widGVzdDJcIl19XSxcImtcIjp7fSxcImxcIjp7fX19LFwiYlwiOnt9fSddLFxuXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgIGl0KCcuZGVsZXRlVmlhKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoZmluZGVyLmRlbGV0ZVZpYShhKVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJy5nZXRWaWEoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRlc2NyaWJlKCcuZ2V0VmlhKCknLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICAgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIFwidGVzdDFcIiwgZmFsc2UsIHVuZGVmaW5lZCwgcGFyc2VJbnQoXCJhXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6IFtcInRlc3QyXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGo6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOiAobmV3IE1hcCkuc2V0KCdtJywge246IDN9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDogKG5ldyBTZXQpLmFkZCh7bjogNH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cDoge3E6IDEsIHI6IHRydWV9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwOiB7cTogMiwgcjogdHJ1ZX19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3A6IHtxOiAzLCByOiB0cnVlfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cDoge3E6IDQsIHI6IHRydWV9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwOiB7cTogNSwgcjogdHJ1ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ6IHthOiAxfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU6IHthOiAyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY6IHthOiAzfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHthOiA0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhdGhmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihvYmplY3QpO1xuXG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgWydhLionLCAnW1tcImJcIix7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJlXCI6ZmFsc2UsXCJmXCI6W3tcImdcIjpmYWxzZSxcImhcIjozLFwiaVwiOltcInRlc3QyXCJdfV0sXCJqXCI6e30sXCJrXCI6e30sXCJsXCI6e30sXCJvXCI6W3tcInBcIjp7XCJxXCI6MSxcInJcIjp0cnVlfX0se1wicFwiOntcInFcIjoyLFwiclwiOnRydWV9fSx7XCJwXCI6e1wicVwiOjMsXCJyXCI6dHJ1ZX19LHtcInBcIjp7XCJxXCI6NCxcInJcIjp0cnVlfX0se1wicFwiOntcInFcIjo1LFwiclwiOnRydWV9fV0sXCJzXCI6e1widFwiOntcImFcIjoxfSxcInVcIjp7XCJhXCI6Mn0sXCJ2XCI6e1wiYVwiOjN9LFwieFwiOntcImFcIjo0fX19XV0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydhLmIucy4qLmEnLCAnW1tcInRcIiwxXSxbXCJ1XCIsMl0sW1widlwiLDNdLFtcInhcIiw0XV0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydhLmIucy4qJywgJ1tbXCJ0XCIse1wiYVwiOjF9XSxbXCJ1XCIse1wiYVwiOjJ9XSxbXCJ2XCIse1wiYVwiOjN9XSxbXCJ4XCIse1wiYVwiOjR9XV0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydhLmIuby4qLnAucScsICdbW1wiMFwiLDFdLFtcIjFcIiwyXSxbXCIyXCIsM10sW1wiM1wiLDRdLFtcIjRcIiw1XV0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydhLmIuby4qLnAucicsICdbW1wiMFwiLHRydWVdLFtcIjFcIix0cnVlXSxbXCIyXCIsdHJ1ZV0sW1wiM1wiLHRydWVdLFtcIjRcIix0cnVlXV0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydhLmIuby4qLnAnLCAnW1tcIjBcIix7XCJxXCI6MSxcInJcIjp0cnVlfV0sW1wiMVwiLHtcInFcIjoyLFwiclwiOnRydWV9XSxbXCIyXCIse1wicVwiOjMsXCJyXCI6dHJ1ZX1dLFtcIjNcIix7XCJxXCI6NCxcInJcIjp0cnVlfV0sW1wiNFwiLHtcInFcIjo1LFwiclwiOnRydWV9XV0nXVxuICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICAgICAgaXQoJy5nZXRWaWEoJyArIGEgKyAnKSBzaG91bGQgcmVzdWx0ICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHBhdGhmaW5kZXIuZ2V0VmlhKGEpXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbShyKSkpLmlzLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnLmdldFZpYSgpIHNob3VsZCByZXN1bHQgJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHAgPSBuZXcgUGF0aGZpbmRlcih7XG4gICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YzogMX0sIHtjOiAyfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjOiAxLCBkOiBmYWxzZX0sIHtjOiAyfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxldCByID0gcC5nZXRWaWEoXCIqLnguKi5jXCIpXG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXBUb09iaihtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9XG4gICAgICAgICAgICAgICAgICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IG1hcFRvT2JqKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IHZcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG1hcFRvT2JqKHIpKSkuaXMuZXF1YWwoJ3tcImFcIjp7XCIwXCI6MSxcIjFcIjoyfSxcImJcIjp7XCIwXCI6MSxcIjFcIjoyfX0nKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnLmdldFZpYShhLmIubC4wLm4pIHdpdGggbWFwIHNob3VsZCByZXR1cm4gNCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHBhdGhmaW5kZXIuZ2V0VmlhKCdhLmIubC4wLm4nKSkuaXMuZXF1YWwoNCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYS5iLmsubS5uJywgM10sXG4gICAgICAgICAgICAgICAgWydhLmIubC4wLm4nLCA0XSxcbiAgICAgICAgICAgICAgICBbJ2EueCcsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICAgICAgWydhLmIucScsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICAgICAgWydhLmIuYy4xJywgXCJ0ZXN0MVwiXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5jLjAnLCA0XSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5kJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mLjAuZycsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mLjAuaS4wJywgXCJ0ZXN0MlwiXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5lJywgZmFsc2VdLFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgICAgIGl0KCcuZ2V0VmlhKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QocGF0aGZpbmRlci5nZXRWaWEoYSkpLmlzLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhLmIuZC5lJ10sXG4gICAgICAgICAgICAgICAgWydhLmIuZC54J10sXG4gICAgICAgICAgICAgICAgWydhLmIubC5lLm4nXSxcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgIGl0KCcuZ2V0VmlhKCcgKyBhICsgJykgc2hvdWxkIHRocm93IEVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHBhdGhmaW5kZXIuZ2V0VmlhKGEpKS50by50aHJvdyhFcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbn0pO1xuXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1BpcGV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZGF0YS9waXBlLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtFbWJlZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9pMThuL3Byb3ZpZGVycy9lbWJlZC5tanNcIjtcblxuXG5kZXNjcmliZSgnUGlwZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmICghZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBkaWZmZXJlbnQgcGlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFtcbiAgICAgICAgICAgIFsncGF0aDpiIHwgaWY6eDpcXFxcICcsIHthOiB0cnVlfSwgJyAnXSwgICAvLyAnXFxcXCAnLmxlbmd0aCBcdTIxQTYgMlxuICAgICAgICAgICAgWydwYXRoOmEgfCBpZjp4OlxcXFwgJywge2E6IHRydWV9LCAneCddLFxuICAgICAgICAgICAgWydub3AnLCAnYWJjZGVmZ2hpamtsbW5vcCcsICdhYmNkZWZnaGlqa2xtbm9wJ10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ1BpcGUucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdC5ydW4oYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCduZXcgUGlwZSBzaG91bGQgY3JlYXRlIG5ldyBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUGlwZSgnJykpLnRvLmJlLmluc3RhbmNlT2YoUGlwZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIEluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBQaXBlKCdpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJykucnVuKHthOiBcInRlc3RcIn0pKS50by5iZS5lcXVhbCgnYVRFU1QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJywge2E6IFwidGVzdFwifSwgJ2FURVNUJ10sXG4gICAgICAgICAgICBbJ3BhdGg6YS5iLmMuZCB8IHRvdXBwZXIgfCBwcmVmaXg6SGVsbG9cXFxcICcsIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiBcIndvcmxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sICdIZWxsbyBXT1JMRCddLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5jfGluZGV4OmR8dG91cHBlciB8c3VmZml4OngnLCB7YToge2I6IHtjOiB7ZDogXCJ0ZXN0XCJ9fX19LCAnVEVTVHgnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ25ldyBQaXBlKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQucnVuKGIpKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbmV3IFBpcGUgYW5kIGxvY2FsZScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIGxldCBodG1sMSA9IGBcbjxkaXYgaWQ9XCJtb2NrLXRyYW5zbGF0aW9uc1wiPjwvZGl2PlxuPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiIGRhdGEtbW9uc3Rlci1yb2xlPVwidHJhbnNsYXRpb25zXCI+XG4gICAge1xuICAgICAgICBcIjUxXCI6IFwieHl6XCIsXG4gICAgICAgIFwiNTJcIjogXCJhYmNcIixcbiAgICAgICAgXCI1M1wiOiBcImRlZlwiXG4gICAgfVxuPC9zY3JpcHQ+ICBcbmA7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoZG9uZSkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2stdHJhbnNsYXRpb25zJyk7XG4gICAgICAgICAgICBFbWJlZC5hc3NpZ25UcmFuc2xhdGlvbnNUb0VsZW1lbnQoZWxlbSkudGhlbigobykgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKGUpXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydwYXRoOnN0YXR1cyB8IHRvc3RyaW5nIHwgaTE4bicsIHtzdGF0dXM6IDUxfSwgXCJ4eXpcIl1cblxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgcGlwZSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IG9iaiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdHJhbnNmb3JtKCcgKyBwaXBlICsgJykucnVuKCcgKyBKU09OLnN0cmluZ2lmeShvYmopICsgJykgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShleHBlY3RlZCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5ldyBQaXBlKHBpcGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0LnJ1bihvYmopKS50by5iZS5lcXVhbChleHBlY3RlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuXG4gICAgfSlcblxuXG59KTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5cbmNsYXNzIE1vY2tGb3JFeHRlbmRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5cblxuZGVzY3JpYmUoJ2V4dGVuZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgICAne1widGhla2V5XCI6e319Jyx7fSx7dGhla2V5Om5ldyBNb2NrRm9yRXh0ZW5kc30gXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICd7XCJhXCI6e1wiYlwiOltdfX0nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiM1wiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLCAgICAgICAgW1xuICAgICAgICAgICAgJ3tcImFcIjp7XCJiXCI6MSxcImRcIjoxfX0nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBkOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICAne1wiYVwiOntcImJcIjoxLFwiZFwiOntcInhcIjpbXCJjYXJcIl0sXCJmXCI6dHJ1ZSxcImdcIjpbXX19fScsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IDEsXG4gICAgICAgICAgICAgICAgICAgIGQ6IHt4OiBbXCJjYXJcIl19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGY6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGQgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGEgPSBkYXRhXG5cbiAgICAgICAgaXQoJy5leHRlbmQoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHJlc3VsdCBpbiAnICsgZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHggPSBleHRlbmQuYXBwbHkodGhpcywgYSk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoeCkpLmlzLmVxdWFsKGQpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIFtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogMSxcbiAgICAgICAgICAgICAgICAgICAgZDogW1wiY2FyXCJdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGY6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YVxuXG4gICAgICAgIGl0KCcuZXh0ZW5kKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpIHNob3VsZCB0aHJvdyBFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZXh0ZW5kLmFwcGx5KHRoaXMsIGEpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSlcblxuXG5cbmRlc2NyaWJlKCdleHRlbmQgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHRlbmQgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBmcm9tIGFub3RoZXIgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB7IGE6IDEgfTtcbiAgICAgICAgY29uc3Qgc291cmNlID0geyBiOiAyIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dGVuZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoeyBhOiAxLCBiOiAyIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3Igbm9uLW9iamVjdCB0YXJnZXQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHsgYjogMiB9O1xuICAgICAgICBleHBlY3QoKCkgPT4gZXh0ZW5kKHRhcmdldCwgc291cmNlKSkudG8udGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIG5vbi1vYmplY3Qgc291cmNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB7IGE6IDEgfTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gXCJub3QgYW4gb2JqZWN0XCI7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBleHRlbmQodGFyZ2V0LCBzb3VyY2UpKS50by50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZGVlcCBvYmplY3QgZXh0ZW5zaW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB7IGE6IHsgYjogMSB9IH07XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHsgYTogeyBjOiAyIH0sIGQ6IDMgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXh0ZW5kKHRhcmdldCwgc291cmNlKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7IGE6IHsgYjogMSwgYzogMiB9LCBkOiAzIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJyYXkgZXh0ZW5zaW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB7IGE6IFsxLCAyXSB9O1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB7IGE6IFszLCA0XSB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBleHRlbmQodGFyZ2V0LCBzb3VyY2UpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKHsgYTogWzMsIDRdIH0pO1xuICAgIH0pO1xufSk7XG5cblxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQgeyBBYnN0cmFjdENvbnN0cmFpbnQgfTtcblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIGFic3RyYWN0IGNvbnN0cmFpbnQgZGVmaW5lcyB0aGUgYXBpIGZvciBhbGwgY29uc3RyYWludHMuIG1haW5seSB0aGUgbWV0aG9kIGlzVmFsaWQoKSBpcyBkZWZpbmVkLlxuICpcbiAqIERlcml2ZWQgY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgbWV0aG9kIGlzVmFsaWQoKS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IFRoZSBhYnN0cmFjdCBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFic3RyYWN0Q29uc3RyYWludCBleHRlbmRzIEJhc2Uge1xuXHQvKipcblx0ICogdGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdGlzVmFsaWQodmFsdWUpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb25zdHJhaW50cy9hYnN0cmFjdC1jb25zdHJhaW50XCIpO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQWJzdHJhY3RDb25zdHJhaW50IH0gZnJvbSBcIi4vYWJzdHJhY3QubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBJbnZhbGlkIH07XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICpcbiAqIFRoZSBpbnZhbGlkIGNvbnN0cmFpbnQgYWxsb3dzIGFuIGFsd2F5cyBpbnZhbGlkIHF1ZXJ5IHRvIGJlIHBlcmZvcm1lZC4gdGhpcyBjb25zdHJhaW50IGlzIG1haW5seSBpbnRlbmRlZCBmb3IgdGVzdGluZy5cbiAqXG4gKiBAZXhhbXBsZSAvZXhhbXBsZXMvbGlicmFyaWVzL2NvbnN0cmFpbnRzL2ludmFsaWQvIEEgc2ltcGxlIGV4YW1wbGVcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgY29uc3RyYWludCB0aGF0IGFsd2F5cyBpbnZhbGlkXG4gKi9cbmNsYXNzIEludmFsaWQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQge1xuXHQvKipcblx0ICogdGhpcyBtZXRob2QgcmV0dXJucyBhIHJlamVjdGVkIHByb21pc2Vcblx0ICpcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0aXNWYWxpZCh2YWx1ZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbnN0cmFpbnRzL2ludmFsaWRcIik7XG5cdH1cbn1cbiIsICJpbXBvcnQge0ludmFsaWR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RyYWludHMvaW52YWxpZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdJbnZhbGlkJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBpc3ZhbGlkID0gbmV3IEludmFsaWQoKVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGlzdmFsaWQuaXNWYWxpZCgpLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChlKS50by5iZS51bmRlZmluZWRcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7QmFzZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdE9wZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2NvbnN0cmFpbnRzL2Fic3RyYWN0b3BlcmF0b3IubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5jbGFzcyBBYnN0cmFjdENvbnN0cmFpbnRNb2NrIGV4dGVuZHMgQmFzZSB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxufVxuXG5cbmRlc2NyaWJlKCdBYnN0cmFjdE9wZXJhdG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiB0aGUgY29uc3RyYWludCBpcyBub3QgY2FsbCB3aXRoIHBhcmFtZXRlcicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgQWJzdHJhY3RPcGVyYXRvcigpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBub3QgYW4gZXJyb3Igd2hlbiB0aGUgY29uc3RyYWludCBpcyBub3QgY2FsbCB3aXRoIHBhcmFtZXRlcicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBuZXcgQWJzdHJhY3RPcGVyYXRvcihuZXcgQWJzdHJhY3RDb25zdHJhaW50TW9jaygpLCBuZXcgQWJzdHJhY3RDb25zdHJhaW50TW9jaygpKSAgICBcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgIFxuXG4gICAgfSk7XG59KTtcblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEFic3RyYWN0Q29uc3RyYWludCB9IGZyb20gXCIuL2Fic3RyYWN0Lm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgQWJzdHJhY3RPcGVyYXRvciB9O1xuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBPcGVyYXRvcnMgYWxsb3cgeW91IHRvIGxpbmsgY29uc3RyYWludHMgdG9nZXRoZXIuIGZvciBleGFtcGxlLCB5b3UgY2FuIGNoZWNrIHdoZXRoZXIgYSB2YWx1ZSBpc1xuICogYW4gb2JqZWN0IG9yIGFuIGFycmF5LiBlYWNoIG9wZXJhdG9yIGhhcyB0d28gb3BlcmFuZHMgdGhhdCBhcmUgbGlua2VkIHRvZ2V0aGVyLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgVGhlIGFic3RyYWN0IG9wZXJhdG9yIGNvbnN0cmFpbnRcbiAqL1xuY2xhc3MgQWJzdHJhY3RPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7XG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Fic3RyYWN0Q29uc3RyYWludH0gb3BlcmFudEFcblx0ICogQHBhcmFtIHtBYnN0cmFjdENvbnN0cmFpbnR9IG9wZXJhbnRCXG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gXCJwYXJhbWV0ZXJzIG11c3QgYmUgZnJvbSB0eXBlIEFic3RyYWN0Q29uc3RyYWludFwiXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvcGVyYW50QSwgb3BlcmFudEIpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKFxuXHRcdFx0IShcblx0XHRcdFx0b3BlcmFudEEgaW5zdGFuY2VvZiBBYnN0cmFjdENvbnN0cmFpbnQgJiZcblx0XHRcdFx0b3BlcmFudEIgaW5zdGFuY2VvZiBBYnN0cmFjdENvbnN0cmFpbnRcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJwYXJhbWV0ZXJzIG11c3QgYmUgZnJvbSB0eXBlIEFic3RyYWN0Q29uc3RyYWludFwiKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wZXJhbnRBID0gb3BlcmFudEE7XG5cdFx0dGhpcy5vcGVyYW50QiA9IG9wZXJhbnRCO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb25zdHJhaW50cy9hYnN0cmFjdC1vcGVyYXRvclwiKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEFic3RyYWN0Q29uc3RyYWludCB9IGZyb20gXCIuL2Fic3RyYWN0Lm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgVmFsaWQgfTtcblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIHZhbGlkIGNvbnN0cmFpbnQgYWxsb3dzIGFuIGFsd2F5cyB2YWxpZCBxdWVyeSB0byBiZSBwZXJmb3JtZWQuIHRoaXMgY29uc3RyYWludCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcuXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2xpYnJhcmllcy9jb25zdHJhaW50cy92YWxpZC8gQSBzaW1wbGUgZXhhbXBsZVxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBjb25zdHJhaW50IHRoYXQgYWx3YXlzIHZhbGlkXG4gKi9cbmNsYXNzIFZhbGlkIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblx0LyoqXG5cdCAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cblx0ICpcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0aXNWYWxpZCh2YWx1ZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLlxuXHQgKiBAcmV0dXJuIHtzeW1ib2x9XG5cdCAqIEBzaW5jZSAyLjEuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9jb25zdHJhaW50cy92YWxpZFwiKTtcblx0fVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IEFic3RyYWN0T3BlcmF0b3IgfSBmcm9tIFwiLi9hYnN0cmFjdG9wZXJhdG9yLm1qc1wiO1xuaW1wb3J0IHsgaW5zdGFuY2VTeW1ib2wgfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuZXhwb3J0IHsgT3JPcGVyYXRvciB9O1xuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBUaGUgT3JPcGVyYXRvciBpcyB1c2VkIHRvIGxpbmsgc2V2ZXJhbCBjb25zdHJhaW50cy4gVGhlIGNvbnN0cmFpbnQgaXMgZnVsZmlsbGVkIGlmIG9uZSBvZiB0aGUgY29uc3RyYWludHMgaXMgZnVsZmlsbGVkLlxuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9saWJyYXJpZXMvY29uc3RyYWludHMvb3JvcGVyYXRvci8gQSBzaW1wbGUgZXhhbXBsZVxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHN1bW1hcnkgQSBvciBvcGVyYXRvclxuICovXG5jbGFzcyBPck9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRvciB7XG5cdC8qKlxuXHQgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHRpc1ZhbGlkKHZhbHVlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGxldCBhO1xuXHRcdFx0bGV0IGI7XG5cblx0XHRcdHNlbGYub3BlcmFudEFcblx0XHRcdFx0LmlzVmFsaWQodmFsdWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YSA9IGZhbHNlO1xuXHRcdFx0XHRcdC8qKiBiIGhhcyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkIGFuZCB3YXMgbm90IHRydWUgKi9cblx0XHRcdFx0XHRpZiAoYiA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdHNlbGYub3BlcmFudEJcblx0XHRcdFx0LmlzVmFsaWQodmFsdWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YiA9IGZhbHNlO1xuXHRcdFx0XHRcdC8qKiBiIGhhcyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkIGFuZCB3YXMgbm90IHRydWUgKi9cblx0XHRcdFx0XHRpZiAoYSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbnN0cmFpbnRzL29yLW9wZXJhdG9yXCIpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHtWYWxpZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy92YWxpZC5tanNcIjtcbmltcG9ydCB7SW52YWxpZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy9pbnZhbGlkLm1qc1wiO1xuaW1wb3J0IHtPck9wZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2NvbnN0cmFpbnRzL29yb3BlcmF0b3IubWpzXCI7XG5cbmRlc2NyaWJlKCdPck9wZXJhdG9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW25ldyBWYWxpZCgpLCBuZXcgVmFsaWQoKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IFZhbGlkKCksIG5ldyBJbnZhbGlkKCksIHRydWVdLFxuICAgICAgICAgICAgW25ldyBJbnZhbGlkKCksIG5ldyBWYWxpZCgpLCB0cnVlXSxcbiAgICAgICAgICAgIFtuZXcgSW52YWxpZCgpLCBuZXcgSW52YWxpZCgpLCBmYWxzZV1cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2NvbnN0cmFpbnQuaXNWYWxpZCgpIHNob3VsZCByZXR1cm4gJyArIGMsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29uc3RyYWludCA9IG5ldyBPck9wZXJhdG9yKGEsIGIpO1xuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuaXNWYWxpZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjID09PSB0cnVlID8gZG9uZSgpIDogZG9uZShuZXcgRXJyb3IoKSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjID09PSB0cnVlID8gZG9uZShuZXcgRXJyb3IoKSkgOiBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbn0pO1xuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnN0cmFpbnQgfSBmcm9tIFwiLi9hYnN0cmFjdC5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmV4cG9ydCB7IElzT2JqZWN0IH07XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9saWJyYXJpZXMvY29uc3RyYWludHMvaXNvYmplY3QvIEEgc2ltcGxlIGV4YW1wbGVcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgY29uc3RyYWludCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdFxuICovXG5jbGFzcyBJc09iamVjdCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7XG5cdC8qKlxuXHQgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdCAqL1xuXHRpc1ZhbGlkKHZhbHVlKSB7XG5cdFx0aWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGBpbnN0YW5jZW9mYCBvcGVyYXRvci5cblx0ICogQHJldHVybiB7c3ltYm9sfVxuXHQgKiBAc2luY2UgMi4xLjBcblx0ICovXG5cdHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcblx0XHRyZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvY29uc3RyYWludC9pcy1vYmplY3RcIik7XG5cdH1cbn1cbiIsICJpbXBvcnQge0lzT2JqZWN0fSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2NvbnN0cmFpbnRzL2lzb2JqZWN0Lm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ0lzT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IElzT2JqZWN0KClcblxuICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdHJhaW50LmlzVmFsaWQoe30pLnRoZW4ociA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLmlzLmEoJ29iamVjdCcpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwic2hvdWxkIG5vdCByZWFjaGVkOiBcIiArIGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgXHUwMEE5IHNjaHVrYWkgR21iSCBhbmQgYWxsIGNvbnRyaWJ1dGluZyBhdXRob3JzLCB7e2NvcHlSaWdodFllYXJ9fS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyAoQUdQTHYzKS5cbiAqIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqXG4gKiBGb3IgdGhvc2Ugd2hvIGRvIG5vdCB3aXNoIHRvIGFkaGVyZSB0byB0aGUgQUdQTHYzLCBhIGNvbW1lcmNpYWwgbGljZW5zZSBpcyBhdmFpbGFibGUuXG4gKiBBY3F1aXJpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UgYWxsb3dzIHlvdSB0byB1c2UgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IGNvbXBseWluZyB3aXRoIHRoZSBBR1BMdjMgdGVybXMuXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwdXJjaGFzaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlLCBwbGVhc2UgY29udGFjdCBzY2h1a2FpIEdtYkguXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wXG4gKi9cblxuaW1wb3J0IHsgQWJzdHJhY3RPcGVyYXRvciB9IGZyb20gXCIuL2Fic3RyYWN0b3BlcmF0b3IubWpzXCI7XG5pbXBvcnQgeyBpbnN0YW5jZVN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5leHBvcnQgeyBBbmRPcGVyYXRvciB9O1xuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBUaGUgQW5kT3BlcmF0b3IgaXMgdXNlZCB0byBsaW5rIHNldmVyYWwgY29uc3RyYWludHMuIFRoZSBjb25zdHJhaW50IGlzIGZ1bGZpbGxlZCBpZiBhbGwgY29uc3RyYWludHMgb2YgdGhlIG9wZXJhdG9ycyBhcmUgZnVsZmlsbGVkLlxuICpcbiAqIEBleGFtcGxlIC9leGFtcGxlcy9saWJyYXJpZXMvY29uc3RyYWludHMvYW5kb3BlcmF0b3IvIEEgc2ltcGxlIGV4YW1wbGVcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzdW1tYXJ5IEEgYW5kIG9wZXJhdG9yIGNvbnN0cmFpbnRcbiAqL1xuY2xhc3MgQW5kT3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdG9yIHtcblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdGlzVmFsaWQodmFsdWUpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW1xuXHRcdFx0dGhpcy5vcGVyYW50QS5pc1ZhbGlkKHZhbHVlKSxcblx0XHRcdHRoaXMub3BlcmFudEIuaXNWYWxpZCh2YWx1ZSksXG5cdFx0XSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbnN0cmFpbnRzL2FuZC1vcGVyYXRvclwiKTtcblx0fVxufVxuIiwgImltcG9ydCB7VmFsaWR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RyYWludHMvdmFsaWQubWpzXCI7XG5pbXBvcnQge0ludmFsaWR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RyYWludHMvaW52YWxpZC5tanNcIjtcbmltcG9ydCB7QW5kT3BlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RyYWludHMvYW5kb3BlcmF0b3IubWpzXCI7XG5cbmRlc2NyaWJlKCdBbmRPcGVyYXRvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuaXNWYWxpZCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtuZXcgVmFsaWQoKSwgbmV3IFZhbGlkKCksIHRydWVdLFxuICAgICAgICAgICAgW25ldyBWYWxpZCgpLCBuZXcgSW52YWxpZCgpLCBmYWxzZV0sXG4gICAgICAgICAgICBbbmV3IEludmFsaWQoKSwgbmV3IFZhbGlkKCksIGZhbHNlXSxcbiAgICAgICAgICAgIFtuZXcgSW52YWxpZCgpLCBuZXcgSW52YWxpZCgpLCBmYWxzZV1cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2NvbnN0cmFpbnQuaXNWYWxpZCgpIHNob3VsZCByZXR1cm4gJyArIGMsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29uc3RyYWludCA9IG5ldyBBbmRPcGVyYXRvcihhLCBiKTtcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LmlzVmFsaWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYyA9PT0gdHJ1ZSA/IGRvbmUoKSA6IGRvbmUobmV3IEVycm9yKCkpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYyA9PT0gdHJ1ZSA/IGRvbmUobmV3IEVycm9yKCkpIDogZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG59KTtcblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnN0cmFpbnQgfSBmcm9tIFwiLi9hYnN0cmFjdC5tanNcIjtcbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sIH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmV4cG9ydCB7IElzQXJyYXkgfTtcblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogQGV4YW1wbGUgL2V4YW1wbGVzL2xpYnJhcmllcy9jb25zdHJhaW50cy9pc2FycmF5LyBBIHNpbXBsZSBleGFtcGxlXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAc3VtbWFyeSBBIGNvbnN0cmFpbnQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBhcnJheVxuICovXG5jbGFzcyBJc0FycmF5IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblx0LyoqXG5cdCAqIHRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0ICovXG5cdGlzVmFsaWQodmFsdWUpIHtcblx0XHRpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDIuMS4wXG5cdCAqL1xuXHRzdGF0aWMgZ2V0IFtpbnN0YW5jZVN5bWJvbF0oKSB7XG5cdFx0cmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2NvbnN0cmFpbnQvaXMtYXJyYXlcIik7XG5cdH1cbn1cbiIsICJpbXBvcnQge0lzQXJyYXl9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvY29uc3RyYWludHMvaXNhcnJheS5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdJc0FycmF5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IElzQXJyYXkoKVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuaXNWYWxpZChbMSwyLDNdKS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChyKS5pcy5hKCdhcnJheScpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwic2hvdWxkIG5vdCByZWFjaGVkOiBcIiArIGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtWYWxpZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9jb25zdHJhaW50cy92YWxpZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdWYWxpZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuaXNWYWxpZCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgY29uc3RyYWludCA9IG5ldyBWYWxpZCgpXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKHt9KS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwic2hvdWxkIG5vdCByZWFjaGVkOiBcIiArIGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJyNjb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdChbXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JylcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QyID0gbmV3IE5vZGVMaXN0KG5vZGVMaXN0KTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0Mi5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgIH0pO1xuICAgIFxuICAgICBcbiAgICBpdCgnY3JlYXRlIE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkpLmlzLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnYWRkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgncmVtb3ZlIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5yZW1vdmUobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIHVua25vd24gTm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmhhcyhuZXcgTm9kZSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIGFkZGVkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuKS5oYXMobikpLnRvLmJlLnRydWU7XG4gICAgfSlcbiAgICBcbiAgICBpdCgndG9TdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuZXcgTm9kZSgnYScpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCdiJykpKS50b1N0cmluZygpKS50by5iZS5lcXVhbCgnYVxcbiBcdTI1MTRiJyk7XG4gICAgfSlcblxuICAgIGl0KCd0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgTm9kZUxpc3QoKS5hZGQoMSkpLnRvLnRocm93KEVycm9yKTtcbiAgICB9KVxuXG5cbn0pOyIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtpbnN0YW5jZVN5bWJvbH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9jb25zdGFudHMubWpzXCI7XG5cblxuXG5jbGFzcyBCYXNlRGlmZmVyZW50UmVhbG0gZXh0ZW5kcyBPYmplY3Qge1xuICAgIFxuXG4gICAgc3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gU3ltYm9sLmZvcihcIkBzY2h1a2FpL21vbnN0ZXIvdHlwZXMvYmFzZVwiKTtcbiAgICB9XG5cblxufVxuXG5jbGFzcyBTdWJjbGFzcyBleHRlbmRzIEJhc2VEaWZmZXJlbnRSZWFsbSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgW2luc3RhbmNlU3ltYm9sXSgpIHtcbiAgICAgICAgcmV0dXJuIFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL3R5cGVzL3N1YmNsYXNzXCIpO1xuICAgIH1cbn1cblxuZGVzY3JpYmUoJ0Jhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIEJhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoQmFzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdpcyBpbnN0YW5jZSBvZiBPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoT2JqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdpbnN0YW5jb2YnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIEJhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoQmFzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaXQoJ3N1YmNsYXNzIGluc3RhbmNlb2YnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChuZXcgU3ViY2xhc3MgaW5zdGFuY2VvZiBCYXNlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHRydWUpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICB9IGVsc2UgIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZmFsc2UpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge01lZGlhVHlwZSwgcGFyc2VNZWRpYVR5cGV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvbWVkaWF0eXBlLm1qc1wiO1xuXG5kZXNjcmliZSgnRGF0YXVybCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1wiKi8qXCIsXCIqXCIsJyonXSxcbiAgICAgICAgW1widGV4dC8qXCIsXCJ0ZXh0XCIsJyonXSxcbiAgICAgICAgW1wiKi90ZXN0XCIsXCIqXCIsJ3Rlc3QnXSxcbiAgICAgICAgW1wiaW1hZ2UvcG5nXCIsIFwiaW1hZ2VcIiwgXCJwbmdcIl0sXG4gICAgICAgIFtcImF1ZGlvL21wM1wiLCBcImF1ZGlvXCIsIFwibXAzXCJdLFxuICAgICAgICBbXCJ2aWRlby9tcGVnXCIsIFwidmlkZW9cIiwgXCJtcGVnXCJdLFxuICAgICAgICBbXCJ0ZXh0L3BsYWluXCIsIFwidGV4dFwiLCBcInBsYWluXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWxcIiwgXCJ0ZXh0XCIsIFwiaHRtbFwiXSxcbiAgICAgICAgW1widGV4dC9odG1sO2NoYXJzZXQ9VVMtQVNDSUlcIiwgXCJ0ZXh0XCIsIFwiaHRtbFwiXSxcbiAgICAgICAgW1widGV4dC9odG1sO2NoYXJzZXQ9XFxcIlVTLUFTQ0lJXFxcIlwiLCBcInRleHRcIiwgXCJodG1sXCJdLFxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgIGl0KCdwYXJzZU1lZGlhVHlwZSgnICsgYSArICcpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBkID0gcGFyc2VNZWRpYVR5cGUoYSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChkKS5pcy5pbnN0YW5jZW9mKE1lZGlhVHlwZSk7XG4gICAgICAgICAgICBleHBlY3QoZC50b1N0cmluZygpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnR5cGUpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGQuc3VidHlwZSkudG8uYmUuZXF1YWwoYyk7XG4gICAgICAgICAgICBleHBlY3QoZC5wYXJhbWV0ZXIpLmlzLmluc3RhbmNlb2YoTWFwKVxuICAgICAgICB9KVxuXG4gICAgfSk7XG5cbiAgICBbXG4gICAgICAgIFtcInZpZGVvL1wiXSxcbiAgICAgICAgW1widGV4dFwiXSxcbiAgICAgICAgW1wiL21wM1wiXSxcbiAgICAgICAgW1widGV4dC9odG1sO2NoYXJzZXRVUy1BU0NJSVwiXSxcbiAgICAgICAgW1widGV4dC9odG1sO2NoYXJzZXRcXFwiVVMtQVNDSUlcXFwiXCJdLFxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICBpdCgnJyArIGEgKyAnIHNob3VsZCB0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3BhcnNlTWVkaWFUeXBlKGEpfSkudGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Rva2VuTGlzdH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy90b2tlbmxpc3QubWpzXCI7XG5cblxuZGVzY3JpYmUoJ1Rva2VuTGlzdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHRva2VuTGlzdCA9IG5ldyBUb2tlbkxpc3QoKVxuICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW5MaXN0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3NldCBhbmQgcmVtb3ZlIHJldHVybiBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdpbml0IHdpdGggc3RyaW5nIGl0ZXJhYmxlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCcgKyB0eXBlb2YgYSArICcpIHRocm93IFR5cGVFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCB0b2tlbnMgPSBbXCJhYmNcIiwgXCJkZWZcIiwgXCJnaGlcIl1cbiAgICAgICAgICAgIGxldCBsaXN0ID0gbmV3IFRva2VuTGlzdCh0b2tlbnMpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJhYmMgZGVmIGdoaVwiKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpbml0IHdpdGggaXRlcmFibGUgd2l0aG91dCBzdHJpbmcgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCcgKyB0eXBlb2YgYSArICcpIHRocm93IFR5cGVFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdG9rZW5zID0gW1wiYWJjXCIsIDQsIFwiZ2hpXCJdXG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFRva2VuTGlzdCh0b2tlbnMpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2luaXQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIGV4cGVjdGVkLCB0eXBlcnJvclxuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdDFcIiwgZmFsc2VdLFxuICAgICAgICAgICAgWyd0ZXN0MSB0ZXN0MicsIFwidGVzdDEgdGVzdDJcIiwgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgXCJcIiwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCB1bmRlZmluZWQsIHRydWVdLCAvLyBOYU5cbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWzIsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlXSxcbiAgICAgICAgICAgIFs0LjUsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbe30sIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbW1wiMVwiLCBcIjJcIiwgXCIzXCJdLCAnMSAyIDMnLCBmYWxzZV0sIC8vIGl0ZXJhYmxlIHN0cmluZ3NcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChjID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoJyArIHR5cGVvZiBhICsgJykgdGhyb3cgVHlwZUVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBUb2tlbkxpc3QoYSkpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBUb2tlbkxpc3QoYSkudG9TdHJpbmcoKSkuaXMuZXF1YWwoYilcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaXRlcmF0b3IgcHJvdG9jb2wnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGxpc3Q7XG4gICAgICAgIGl0KCcuYWRkKCcgKyBcInNlY29uZFwiICsgJykgc2hvdWxkIHJldHVybiBUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuZ2V0SXRlcmF0b3IoKSkudG8uYmUuYW4oJ29iamVjdCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmFkZCgnICsgXCJzZWNvbmRcIiArICcpIHNob3VsZCByZXR1cm4gVG9rZW5MaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QoWy4uLmxpc3RdKS50by5iZS5hbignYXJyYXknKTtcbiAgICAgICAgICAgIGV4cGVjdChbLi4ubGlzdF0pLnRvLmJlLmFuKCdhcnJheScpLnRvLmluY2x1ZGUoJ3N0YXJ0JykudG8uaW5jbHVkZSgnZW5kJyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZW50cmllcygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0O1xuICAgICAgICBpdCgnLmVudHJpZXMoKSBzaG91bGQgcmV0dXJuIEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmVudHJpZXMoKSkudG8uYmUuYW4oJ2FycmF5Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuZW50cmllcygpIHNob3VsZCByZXR1cm4gQXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IGVuZFwiKS5lbnRyaWVzKCk7XG4gICAgICAgICAgICBleHBlY3QobGlzdCkudG8uYmUuYW4oJ2FycmF5JykudG8uaW5jbHVkZSgnc3RhcnQnKS50by5pbmNsdWRlKCdlbmQnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5mb3JFYWNoKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGxpc3Q7XG4gICAgICAgIGl0KCcuZm9yRWFjaCgpIHNob3VsZCBpdGVyYXRlIG92ZXIgdG9rZW5saXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJhYWEgYmJiIGNjYyBkZGQgZWVlIGZmZlwiKTtcblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCJcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIiFcIiArIGEgKyBcIiFcIjtcbiAgICAgICAgICAgICAgICBleHBlY3QoYSkudG8uYmUuYW4oJ3N0cmluZycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS5pcy5lcXVhbChcIiFhYWEhIWJiYiEhY2NjISFkZGQhIWVlZSEhZmZmIVwiKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmVudHJpZXMoKSBzaG91bGQgcmV0dXJuIEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBlbmRcIikuZW50cmllcygpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QpLnRvLmJlLmFuKCdhcnJheScpLnRvLmluY2x1ZGUoJ3N0YXJ0JykudG8uaW5jbHVkZSgnZW5kJyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjb250YWlucyB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBsaXN0XG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0LCBtaWRkbGUgZW5kKSBzaG91bGQgY29udGFpbiBtaWRkbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygnc3RhcnQnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKCdtaWRkbGUnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKCdlbmQnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKFsnZW5kJywgJ3N0YXJ0JywgJ21pZGRsZSddKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3Qoc3RhcnQsIG1pZGRsZSBlbmQpIHNob3VsZCBub3QgY29udGFpbiB4eXonLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygneHl6JykpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMoWydlbmQnLCAnc3RhcnQnLCAnbWlkZGxlJywgJ3h5eiddKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0LCBtaWRkbGUgZW5kKSBzaG91bGQgbm90IGNvbnRhaW4gdW5kZWZpbmVkIG51bGwgTmFOJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBtaWRkbGUgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnModW5kZWZpbmVkKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucyhwYXJzZUludChcImFcIikpKS50by5iZS5mYWxzZTsgLy8gTmFOXG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucyhudWxsKSkudG8uYmUuZmFsc2U7IC8vIE5hTlxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3RvZ2dsZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBsaXN0XG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0IG1pZGRsZSBlbmQpLnRvZ2dsZShuZXctdmFsdWUpIHNob3VsZCBjb250YWluIG5ldy12YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvZ2dsZSgnbmV3LXZhbHVlJykudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBtaWRkbGUgZW5kIG5ldy12YWx1ZVwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3Qoc3RhcnQgbWlkZGxlIGVuZCkudG9nZ2xlKG1pZGRsZSkgc2hvdWxkIG5vdCBjb250YWluIG1pZGRsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvZ2dsZSgnbWlkZGxlJykudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBlbmRcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCkudG9nZ2xlKCkgc2hvdWxkIC4uLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVG9rZW5MaXN0KFwiYWJjIGRlZiBnaGlcIikudG9nZ2xlKFwiZGVmIHh5elwiKS50b1N0cmluZygpKS50by5lcXVhbChcImFiYyBnaGkgeHl6XCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgpLnRvZ2dsZSgpIHNob3VsZCAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZShbXCJhYmNcIiwgXCJ4eXpcIl0pLnRvU3RyaW5nKCkpLnRvLmVxdWFsKFwiZGVmIGdoaSB4eXpcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCkudG9nZ2xlKCkgc2hvdWxkIC4uLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVG9rZW5MaXN0KFwiYWJjIGRlZiBnaGlcIikudG9nZ2xlKHVuZGVmaW5lZCkudG9TdHJpbmcoKSkudG8uZXF1YWwoXCJhYmMgZGVmIGdoaVwiKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ21hbmlwdWxhdGUgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0XG5cbiAgICAgICAgaXQoJ3Jlc3VsdCBUb2tlbkxpc3QoXCInICsgXCJzdGFydFwiICsgJ1wiKSBzaG91bGQgYmUgXCInICsgXCJzdGFydFwiICsgJ1wiJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnRcIilcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kXCIgKyAnKSBzaG91bGQgcmV0dXJuIFRva2VuTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5hZGQoXCJzZWNvbmRcIikpLnRvLmJlLmFuLmluc3RhbmNlb2YoVG9rZW5MaXN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kXCIgKyAnKS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFwic2Vjb25kXCIpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgc2Vjb25kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmFkZCgnICsgXCJzZWNvbmQgdGhpcmRcIiArICcpLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHNlY29uZCB0aGlyZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5hZGQoXCJzZWNvbmQgdGhpcmRcIikudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBzZWNvbmQgdGhpcmRcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuYWRkKCcgKyBcIltzZWNvbmQsdGhpcmRdXCIgKyAnKS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmQgdGhpcmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFtcInNlY29uZFwiLCBcInRoaXJkXCJdKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHNlY29uZCB0aGlyZFwiKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBpdCgnLmNsZWFyKCkudG9TdHJpbmcoKSBzaG91bGQgXCJcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFtcInNlY29uZFwiLCBcInRoaXJkXCJdKS5jbGVhcigpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwiXCIpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKS5yZW1vdmUoJyArIFwic2Vjb25kXCIgKyAnKSBzaG91bGQgcmV0dXJuIFRva2VuTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlbW92ZShcInNlY29uZFwiKSkudG8uYmUuYW4uaW5zdGFuY2VvZihUb2tlbkxpc3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVtb3ZlKCcgKyBcInNlY29uZFwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgdGhpcmQgZW5kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVtb3ZlKFwic2Vjb25kXCIpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgdGhpcmQgZW5kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVtb3ZlKCcgKyBcInNlY29uZCB0aGlyZFwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgZW5kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVtb3ZlKFwic2Vjb25kIHRoaXJkXCIpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgZW5kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVtb3ZlKCcgKyBcIltzZWNvbmQsdGhpcmRdXCIgKyAnKS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBlbmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZW1vdmUoW1wic2Vjb25kXCIsIFwidGhpcmRcIl0pLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgZW5kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVwbGFjZShzZWNvbmQsIHh5eikudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgeHl6IHRoaXJkIGVuZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlcGxhY2UoXCJzZWNvbmRcIiwgXCJ4eXpcIikpLnRvLmJlLmluc3RhbmNlT2YoVG9rZW5MaXN0KTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgeHl6IHRoaXJkIGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlcGxhY2UoZW5kLCB4eXopLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHNlY29uZCB0aGlyZCB4eXpcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZXBsYWNlKFwiZW5kXCIsIFwieHl6XCIpKS50by5iZS5pbnN0YW5jZU9mKFRva2VuTGlzdCk7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHNlY29uZCB0aGlyZCB4eXpcIik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge09ic2VydmVyfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuXG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcblxuZGVzY3JpYmUoJ1Byb3h5T2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBQcm94eU9ic2VydmVyKHt9KTtcbiAgICAgICAgICAgIGV4dGVuZChvLmdldFN1YmplY3QoKSwge2E6IDR9KTtcbiAgICAgICAgICAgIGV4cGVjdChvLmdldFJlYWxTdWJqZWN0KCkpLmlzLmVxbCh7YTogNH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXRTdWJqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJ1biBvYnNlcnZlcicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBQcm94eU9ic2VydmVyKHthOiAxfSk7XG4gICAgICAgICAgICBleHBlY3Qoby5nZXRSZWFsU3ViamVjdCgpKS5pcy5lcWwoe2E6IDF9KTtcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgIG8uYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGhpcykgJiYgdGhpcyBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBjaGFuZ2UgYXMgbm90aWZ5IHJ1bnMgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkb25lKFwiY2FsbGVkIGZvciBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwidGhpcyBpcyBub3QgUHJveHlPYnNlcnZlclwiKSlcbiAgICAgICAgICAgIH0pKVxuXG4gICAgICAgICAgICBvLmdldFN1YmplY3QoKS5jID0gNDtcbiAgICAgICAgICAgIGV4cGVjdChvLmdldFJlYWxTdWJqZWN0KCkpLmlzLmVxbCh7YTogMSwgYzogNH0pO1xuXG4gICAgICAgICAgICBvLnNldFN1YmplY3Qoe2I6IDJ9KTtcbiAgICAgICAgICAgIGV4cGVjdChvLmdldFJlYWxTdWJqZWN0KCkpLmlzLmVxbCh7YjogMn0pO1xuXG4gICAgICAgICAgICBvLmdldFN1YmplY3QoKS5kID0gNTtcbiAgICAgICAgICAgIGV4cGVjdChvLmdldFJlYWxTdWJqZWN0KCkpLmlzLmVxbCh7YjogMiwgZDogNX0pO1xuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBQcm94eU9ic2VydmVyKHt9KTtcbiAgICAgICAgICAgIGV4cGVjdChvKS5pcy5pbnN0YW5jZU9mKFByb3h5T2JzZXJ2ZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwcm94eSBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnUHJveHkgb2JqZWN0cyBzaG91bGQgbm90IGJlIHJlY29tbWl0dGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG8gPSBuZXcgUHJveHlPYnNlcnZlcih7YToge2I6IHRydWV9fSk7XG4gICAgICAgICAgICBvLmdldFN1YmplY3QoKS5hLmIgPSBvLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgIG8uZ2V0U3ViamVjdCgpLmEuYi5hLmIgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vZXhwZWN0KG8uZ2V0U3ViamVjdCgpPT09cC5nZXRTdWJqZWN0KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vdGlmeSBvYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBpbmZvcm0gb2JzZXJ2ZXInLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIGRlZmluZVByb3BlcnR5IGFuZCBmb3Igc2V0IHRyYXBcbiAgICAgICAgICAgIGxldCBvID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHRoaXMpICYmIHRoaXMgaW5zdGFuY2VvZiBQcm94eU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJ0aGlzIGlzIG5vdCBQcm94eU9ic2VydmVyXCIpKVxuICAgICAgICAgICAgfSwgdHJ1ZSlcblxuICAgICAgICAgICAgbGV0IHJlYWxTdWJqZWN0ID0ge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiA1XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcCA9IG5ldyBQcm94eU9ic2VydmVyKHJlYWxTdWJqZWN0KTtcbiAgICAgICAgICAgIGV4cGVjdChwKS5pcy5pbnN0YW5jZU9mKFByb3h5T2JzZXJ2ZXIpO1xuICAgICAgICAgICAgZXhwZWN0KHAuYXR0YWNoT2JzZXJ2ZXIobykpLmlzLmluc3RhbmNlT2YoUHJveHlPYnNlcnZlcik7XG5cbiAgICAgICAgICAgIGxldCBzID0gcC5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICBsZXQgciA9IHAuZ2V0UmVhbFN1YmplY3QoKTtcblxuICAgICAgICAgICAgcy5hLmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHMuYS5iLmQgPSAyO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy80M1xuICAgICAqL1xuICAgIGRlc2NyaWJlKCdSZWZsZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdjaGVjayBSZWZsZWN0LnNldCgpIHdpdGggU3ViamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCByO1xuXG4gICAgICAgICAgICBjb25zdCBvYmogPSAobmV3IFByb3h5T2JzZXJ2ZXIoe30pKS5nZXRTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcInllcyFcIixcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgXCJub1wiXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydkYXRhJ10gPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH0pLnRvLm5vdC50aHJvdygpO1xuICAgICAgICAgICAgICAgIC8vciA9IFJlZmxlY3Quc2V0KG9iaiwgJ2RhdGEnLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAvL2V4cGVjdChyKS50by5iZS50cnVlO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0aGF0Jywge3RoYXQ6ICdjaGVja2VkMSd9XSxcbiAgICAgICAgICAgIFsndGhhdCcsIG5ldyBQcm94eSh7dGhhdDogJ2NoZWNrZWQyJ30sIHt9KV0sXG4gICAgICAgICAgICBbJ3RoYXQnLCAobmV3IFByb3h5T2JzZXJ2ZXIoe3RoYXQ6ICdjaGVja2VkMyd9KSkuZ2V0UmVhbFN1YmplY3QoKV0sXG4gICAgICAgICAgICBbJ3RoYXQnLCAobmV3IFByb3h5T2JzZXJ2ZXIoe3RoYXQ6ICdjaGVja2VkNCd9KSkuZ2V0U3ViamVjdCgpXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGtleSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnY2hlY2sgUmVmbGVjdC5zZXQoJyArIGtleSArICcsJyArIEpTT04uc3RyaW5naWZ5KHRhcmdldCkgKyAnKSBzaG91bGQgd3JpdGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwga2V5KVsnd3JpdGFibGUnXSwgJ3dyaXRhYmxlIGZvciAnICsgdmFsdWUgKyAnIHNob3VsZCByZXR1cm4gdHJ1ZScpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSksICdzZXQgZm9yICcgKyB2YWx1ZSArICcgc2hvdWxkIHJldHVybiB0cnVlJykudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGtleSlbJ3dyaXRhYmxlJ10sICd3cml0YWJsZSBmb3IgJyArIHZhbHVlICsgJyBzaG91bGQgcmV0dXJuIHRydWUnKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdub3RpZnkgb2JzZXJ2ZXIgd2l0aCBjaGFuZ2VzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvcmlnaW5hbCwgb2JzZXJ2ZXIsIHByb3h5O1xuXG4gICAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvcmlnaW5hbCA9IHt9O1xuICAgICAgICAgICAgcHJveHkgPSBuZXcgUHJveHlPYnNlcnZlcihvcmlnaW5hbCk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydhJywgNCwgSlNPTi5zdHJpbmdpZnkoe2E6IDR9KV0sXG4gICAgICAgICAgICBbJ2InLCA5LCBKU09OLnN0cmluZ2lmeSh7YTogNCwgYjogOX0pXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2V0IGtleSAnICsgYSArICcgdmFsdWUgJyArIGIgKyAnIGV4cGVjdCAnICsgYywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgICAgICBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0UmVhbFN1YmplY3QoKSkpLmlzLmVxdWFsKGMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2hPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcHJveHkuYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSBwcm94eS5nZXRTdWJqZWN0KClcblxuICAgICAgICAgICAgICAgIHN1YmplY3RbYV0gPSBiO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdub3RpZnkgb2JzZXJ2ZXIgJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgcHJveHkgPSBuZXcgUHJveHlPYnNlcnZlcih7fSk7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHByb3h5LmF0dGFjaE9ic2VydmVyKG9ic2VydmVyKVxuICAgICAgICAgICAgZXhwZWN0KHByb3h5Lm5vdGlmeU9ic2VydmVycygpKS5pcy5pbnN0YW5jZU9mKFByb21pc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxufSlcblxuIiwgImltcG9ydCB7XG4gICAgVmVyc2lvblxufSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL3ZlcnNpb24ubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ1ZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmNvbXBhcmVUbygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnMS4yLjMnLCAnMS4yLjMnLCAwXSxcbiAgICAgICAgICAgIFsnMS4yLjInLCAnMS4yLjMnLCAtMV0sXG4gICAgICAgICAgICBbJzInLCAnMi4wLjAnLCAwXSxcbiAgICAgICAgICAgIFsnMS4yLjQnLCAnMS4yLjMnLCAxXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgYyArICcgd2hlbiB0aGUgdmFsdWUgJyArIGEgKyAnIGlzICcgKyBiICsgJycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFZlcnNpb24oYSkuY29tcGFyZVRvKGIpKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy50b1N0cmluZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnMS4xLjEnLCAnMi4zJywgMywgJzEuMi4zJ10sXG4gICAgICAgICAgICBbJzEuMi40JywgJzEuMi4zJywgNSwgJzEuMS41J11cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBkID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyBkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBWZXJzaW9uKGEsIGIsIGMpLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pXG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtnZXRHbG9iYWwsIGdldEdsb2JhbE9iamVjdCwgZ2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ0dsb2JhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnZ2V0R2xvYmFsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGdsb2JhbCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IHR5cGVvZiBnZXRHbG9iYWwoKTtcbiAgICAgICAgICAgIGV4cGVjdCh0KS50by5iZS5lcXVhbCgnb2JqZWN0JylcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZ2V0R2xvYmFsRnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2xvYmFsIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHQgPSB0eXBlb2YgZ2V0R2xvYmFsRnVuY3Rpb24oJ3BhcnNlSW50Jyk7XG4gICAgICAgICAgICBleHBlY3QodCkudG8uYmUuZXF1YWwoJ2Z1bmN0aW9uJylcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZ2V0R2xvYmFsT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGdsb2JhbCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IHR5cGVvZiBnZXRHbG9iYWxPYmplY3QoJ0pTT04nKTtcbiAgICAgICAgICAgIGV4cGVjdCh0KS50by5iZS5lcXVhbCgnb2JqZWN0JylcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbn0pO1xuXG4iLCAiaW1wb3J0IHtPYnNlcnZlckxpc3R9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXJsaXN0Lm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdPYnNlcnZlckxpc3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmF0dGFjaCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXJMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG9ic2VydmVyTGlzdC5hdHRhY2gobmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUuaW5zdGFuY2VPZihPYnNlcnZlckxpc3QpXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZGV0YWNoKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBPYnNlcnZlckxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gb2JzZXJ2ZXJMaXN0LmRldGFjaChuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5iZS5pbnN0YW5jZU9mKE9ic2VydmVyTGlzdClcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5ub3RpZnkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCByZXN1bHRWYWx1ZSA9IFwiWWVzIVwiO1xuICAgICAgICBsZXQgbztcbiAgICAgICAgbGV0IG9ic2VydmVyTGlzdDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG8gPSBuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRWYWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgb2JzZXJ2ZXJMaXN0LmF0dGFjaChvKVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaW5zdGFuY2VvZiBQcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5ub3RpZnkoe30pKS50by5iZS5pbnN0YW5jZU9mKFByb21pc2UpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyByZXN1bHRWYWx1ZSwgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IG9iaiA9IHt9XG5cbiAgICAgICAgICAgIG9ic2VydmVyTGlzdC5ub3RpZnkob2JqKS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChyKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKHJlc3VsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5jb250YWlucygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvMSA9IG5ldyBPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbzIgPSBuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIG5vdCBjb250YWluIG8xIGFuZCBvMicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcblxuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNvbnRhaW4gbzIgYW5kIG5vdCBvMScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIG9ic2VydmVyTGlzdC5hdHRhY2gobzIpXG4gICAgICAgICAgICBleHBlY3Qob2JzZXJ2ZXJMaXN0LmNvbnRhaW5zKG8xKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3Qob2JzZXJ2ZXJMaXN0LmNvbnRhaW5zKG8yKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb250YWluIG8xIGFuZCBub3QgbzInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QuYXR0YWNoKG8xKVxuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMSkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3Qob2JzZXJ2ZXJMaXN0LmNvbnRhaW5zKG8yKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb250YWluIG8yIGFuZCBvMScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIG9ic2VydmVyTGlzdC5hdHRhY2gobzIpLmF0dGFjaChvMSlcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzEpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTtcblxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtlcXVpcFdpdGhJbnRlcm5hbH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9pbnRlcm5hbC5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5cbmNsYXNzIFNvbWVSYW5kb21DbGFzczEgZXh0ZW5kcyBPYmplY3Qge1xuXG4gICAgZG9pdCgpIHtcbiAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgIH1cbn1cblxuY2xhc3MgU29tZVJhbmRvbUNsYXNzMiBleHRlbmRzIE9iamVjdCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgZXF1aXBXaXRoSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdEludGVybmFsKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdDogXCJ0ZXN0XCJcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5kZXNjcmliZSgnQmFzZSBpbmplY3Qgd2l0aCBvcHRpb25zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ25ldyBTb21lUmFuZG9tQ2xhc3MnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIFNvbWVSYW5kb21DbGFzczEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFNvbWVSYW5kb21DbGFzczIpLm5vdC50by5iZS5pbnN0YW5jZU9mKFNvbWVSYW5kb21DbGFzczEpO1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBTb21lUmFuZG9tQ2xhc3MyKS50by5iZS5pbnN0YW5jZU9mKFNvbWVSYW5kb21DbGFzczIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaXMgaW5zdGFuY2Ugb2YgU29tZVJhbmRvbUNsYXNzMicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgU29tZVJhbmRvbUNsYXNzMSkudG8uYmUuaW5zdGFuY2VPZihTb21lUmFuZG9tQ2xhc3MxKTtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgU29tZVJhbmRvbUNsYXNzMSkubm90LnRvLmJlLmluc3RhbmNlT2YoU29tZVJhbmRvbUNsYXNzMik7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdFeHRlbmRzIFNvbWVSYW5kb21DbGFzcyB3aXRoIGludGVybmFscycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnYXR0YWNoIGFuZCBub3RpZnkgaW50ZXJuYWwgb2JzZXJ2ZXInLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG5ldyBTb21lUmFuZG9tQ2xhc3MyO1xuICAgICAgICAgICAgYy5hdHRhY2hJbnRlcm5hbE9ic2VydmVyKG5ldyBPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBjLnNldEludGVybmFsKFwidGVzdFwiLCBcInRlc3RcIik7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2F0dGFjaCBhbmQgcmVtb3ZlIGludGVybmFsIG9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG5ldyBTb21lUmFuZG9tQ2xhc3MyO1xuXG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKCgpID0+IHtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChjLmNvbnRhaW5zSW50ZXJuYWxPYnNlcnZlcihvYnNlcnZlcikpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgYy5hdHRhY2hJbnRlcm5hbE9ic2VydmVyKG9ic2VydmVyKTtcbiAgICAgICAgICAgIGV4cGVjdChjLmNvbnRhaW5zSW50ZXJuYWxPYnNlcnZlcihvYnNlcnZlcikpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBjLmRldGFjaEludGVybmFsT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgICAgICAgICAgZXhwZWN0KGMuY29udGFpbnNJbnRlcm5hbE9ic2VydmVyKG9ic2VydmVyKSkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoXCJnZXRJbnRlcm5hbCBhbmQgc2V0SW50ZXJuYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG5ldyBTb21lUmFuZG9tQ2xhc3MyO1xuICAgICAgICAgICAgZXhwZWN0KGMuc2V0SW50ZXJuYWwoXCJ0ZXN0XCIsIFwieWVhaFwiKSkudG8uYmUuaW5zdGFuY2VPZihTb21lUmFuZG9tQ2xhc3MyKTtcbiAgICAgICAgICAgIGV4cGVjdChjLmdldEludGVybmFsKFwidGVzdFwiKSkudG8uYmUuZXF1YWwoXCJ5ZWFoXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdChcImRlYWwgd2l0aCBkZWZhdWx0IHZhbHVlc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0Q2xhc3MgPSBjbGFzcyBleHRlbmRzIE9iamVjdCB7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGVxdWlwV2l0aEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2V0IGludGVybmFsRGVmYXVsdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0OiBcInh5elwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgY29uc3QgYyA9IG5ldyB0ZXN0Q2xhc3M7XG4gICAgICAgICAgICBleHBlY3QoYy5nZXRJbnRlcm5hbChcInRlc3RcIikpLnRvLmJlLmVxdWFsKFwieHl6XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGMuZ2V0SW50ZXJuYWwoXCJ0ZXN0MlwiLCBcImFiY1wiKSkudG8uYmUuZXF1YWwoXCJhYmNcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KFwiZGVhbCB3aXRoIGRlZmF1bHRzIGZyb20gZGVmYXVsdHNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdGVzdENsYXNzID0gY2xhc3MgZXh0ZW5kcyBPYmplY3Qge1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgICAgICAgICBlcXVpcFdpdGhJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGdldCBpbnRlcm5hbERlZmF1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDogXCJ4eXpcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0ZXN0Q2xhc3MyID0gY2xhc3MgZXh0ZW5kcyB0ZXN0Q2xhc3Mge1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgICAgICAgICBlcXVpcFdpdGhJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGdldCBpbnRlcm5hbERlZmF1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuaW50ZXJuYWxEZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDI6IFwiYWJjXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGMgPSBuZXcgdGVzdENsYXNzMjtcbiAgICAgICAgICAgIGV4cGVjdChjLmdldEludGVybmFsKFwidGVzdFwiKSkudG8uYmUuZXF1YWwoXCJ4eXpcIik7XG4gICAgICAgICAgICBleHBlY3QoYy5nZXRJbnRlcm5hbChcInRlc3QyXCIpKS50by5iZS5lcXVhbChcImFiY1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdChcInNldCBtdWx0aXBsZSB2YWx1ZXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG5ldyBTb21lUmFuZG9tQ2xhc3MyO1xuICAgICAgICAgICAgZXhwZWN0KGMuc2V0SW50ZXJuYWxzKHtcbiAgICAgICAgICAgICAgICB0ZXN0OiBcInllYWhcIixcbiAgICAgICAgICAgICAgICB0ZXN0MjogXCJ5ZWFoMlwiXG4gICAgICAgICAgICB9KSkudG8uYmUuaW5zdGFuY2VPZihTb21lUmFuZG9tQ2xhc3MyKTtcbiAgICAgICAgICAgIGV4cGVjdChjLmdldEludGVybmFsKFwidGVzdFwiKSkudG8uYmUuZXF1YWwoXCJ5ZWFoXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGMuZ2V0SW50ZXJuYWwoXCJ0ZXN0MlwiKSkudG8uYmUuZXF1YWwoXCJ5ZWFoMlwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgYy5zZXRJbnRlcm5hbHMoe1xuICAgICAgICAgICAgICAgIHRlc3QyOiBcInllYWgyLW5ld1wiLFxuICAgICAgICAgICAgICAgIHRlc3QzOiBcInllYWgzXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBleHBlY3QoYy5nZXRJbnRlcm5hbChcInRlc3RcIikpLnRvLmJlLmVxdWFsKFwieWVhaFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChjLmdldEludGVybmFsKFwidGVzdDJcIikpLnRvLmJlLmVxdWFsKFwieWVhaDItbmV3XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGMuZ2V0SW50ZXJuYWwoXCJ0ZXN0M1wiKSkudG8uYmUuZXF1YWwoXCJ5ZWFoM1wiKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KSIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtPYnNlcnZhYmxlUXVldWV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvb2JzZXJ2YWJsZXF1ZXVlLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanNcIjtcblxuZGVzY3JpYmUoJ09ic2VydmFibGVRdWV1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnT2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBub3RpZnknLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IHF1ZXVlID0gbmV3IE9ic2VydmFibGVRdWV1ZTtcbiAgICAgICAgICAgIGxldCBvID0gbmV3IE9ic2VydmVyKChxKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHF1ZXVlLmF0dGFjaE9ic2VydmVyKG8pO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYScpKS50by5iZS5pbnN0YW5jZU9mKE9ic2VydmFibGVRdWV1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSkiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtwYXJzZURhdGFVUkx9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcblxuZGVzY3JpYmUoJ0RhdGF1cmwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBbXG4gICAgICAgIFtcIiBkYXRhOnRleHQvaHRtbCwlM0NoMSUzRUhlbGxvJTJDJTIwV29ybGQhJTNDJTJGaDElM0VcIl0sXG4gICAgICAgIFtcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9VVMtQVNDSUksJTNDaDElM0VIZWxsbyElM0MlMkZoMSUzRVwiXSxcbiAgICAgICAgW1wiZGF0YTosQSUyMGJyaWVmJTIwbm90ZVwiLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUksQSUyMGJyaWVmJTIwbm90ZSddLFxuICAgICAgICBbXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFBUU1BQUFBbFBXMGlBQUFBQmxCTVZFVUFBQUQvLy8rbDJaL2RBQUFBTTBsRVFWUjRuR1A0LzUvaC8xK0cvNThaRHJBejNEL01jSDh5dzgzTkREZU5HZTRVZzlDOXp3ejNnVkxNREEvQTZQOS9BRkdHRnlqT1hadFFBQUFBQUVsRlRrU3VRbUNDXCJdLFxuICAgICAgICBbXCIgZGF0YTosSGVsbG8lMkMlMjBXb3JsZCFcIiwgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLEhlbGxvJTJDJTIwV29ybGQhJ10sXG4gICAgICAgIFtcIiAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUJBTUFBQUEySWFPNEFBQUFGVkJNVkVYazVPVG41K2Z0N2UzMTlmWDI5dmI1K2ZuLy8vKytHVW1WQUFBQUxVbEVRVlFJSFdOSUNuWUxabkFMVGdwbU1HWUlGV1lJWlRBMlpGQXpUVEZsU0RGVk13VnlRaG1Bd3NZTUFLRGFCeTBheFgvaUFBQUFBRWxGVGtTdVFtQ0MgICBcIl0sXG4gICAgICAgIFtcIiBkYXRhOixIZWxsbyBXb3JsZCFcIiwgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLEhlbGxvJTIwV29ybGQhJ10sXG4gICAgICAgIFtcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUJBTUFBQUEySWFPNEFBQUFGVkJNVkVYazVPVG41K2Z0N2UzMTlmWDI5dmI1K2ZuLy8vKytHVW1WQUFBQUxVbEVRVlFJSFdOSUNuWUxabkFMVGdwbU1HWUlGV1lJWlRBMlpGQXpUVEZsU0RGVk13VnlRaG1Bd3NZTUFLRGFCeTBheFgvaUFBQUFBRWxGVGtTdVFtQ0NcIl0sXG4gICAgICAgIFtcIiBkYXRhOnRleHQvcGxhaW47YmFzZTY0LFNHVnNiRzhzSUZkdmNteGtJUSUzRCUzRFwiXVxuXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIGIgPSBhLnRyaW0oKTtcblxuXG4gICAgICAgIGl0KCdwYXJzZURhdGFVUkwoJyArIGEgKyAnKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KHBhcnNlRGF0YVVSTChhKS50b1N0cmluZygpKS50by5iZS5lcXVhbChiKTtcbiAgICAgICAgfSlcblxuICAgIH0pO1xuXG4gICAgW1xuICAgICAgICBbXCJkYXRheGJhc2U2NFwiXSxcbiAgICAgICAgW1wiZGF0YTpIZWxsb1dvcmxkXCJdLFxuICAgICAgICBbXCJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PSwlM0NoMSUzRUhlbGxvISUzQyUyRmgxJTNFXCJdLFxuICAgICAgICBbXCJkYXRhOnRleHQvaHRtbDtjaGFyc2V0LCUzQ2gxJTNFSGVsbG8hJTNDJTJGaDElM0VcIiwgXCJkYXRhOmJhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFCbEJNVkVVQUFBRC8vLytsMlovZEFBQUFNMGxFUVZSNG5HUDQvNS9oLzErRy81OFpEckF6M0QvTWNIOHl3ODNORERlTkdlNFVnOUM5end6M2dWTE1EQS9BNlA5L0FGR0dGeWpPWFp0UUFBQUFBRWxGVGtTdVFtQ0NcIl0sXG4gICAgICAgIFtcIlwiXSxcbiAgICAgICAgW1wiaHR0cDovL3dpa2lwZWRpYS5vcmdcIl0sXG4gICAgICAgIFtcImJhc2U2NFwiXSxcbiAgICAgICAgW1wiaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFBUU1BQUFBbFBXMGlBQUFBQmxCTVZFVUFBQUQvLy8rbDJaL2RBQUFBTTBsRVFWUjRuR1A0LzUvaC8xK0cvNThaRHJBejNEL01jSDh5dzgzTkREZU5HZTRVZzlDOXp3ejNnVkxNREEvQTZQOS9BRkdHRnlqT1hadFFBQUFBQUVsRlRrU3VRbUNDXCJdXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBleGNlcHRpb24gcGFyc2VEYXRhVVJMKCcgKyBhICsgJyknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBwYXJzZURhdGFVUkwoYSkpLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgfSlcblxuICAgIH0pO1xuXG5cbn0pOyIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyB0b0JpbmFyeSwgZnJvbUJpbmFyeSB9O1xuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy50b0JpbmFyeSgpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYmluYXJ5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xOC4wXG4gKi9cbmZ1bmN0aW9uIHRvQmluYXJ5KHN0cmluZykge1xuXHRjb25zdCBjb2RlVW5pdHMgPSBuZXcgVWludDE2QXJyYXkodmFsaWRhdGVTdHJpbmcoc3RyaW5nKS5sZW5ndGgpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVVbml0cy5sZW5ndGg7IGkrKykge1xuXHRcdGNvZGVVbml0c1tpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXHR9XG5cblx0Y29uc3QgY2hhckNvZGVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZVVuaXRzLmJ1ZmZlcik7XG5cdGxldCByZXN1bHQgPSBcIlwiO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckNvZGVzLmJ5dGVMZW5ndGg7IGkrKykge1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1tpXSk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5mcm9tQmluYXJ5KClgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBiaW5hcnlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE4LjBcbiAqL1xuZnVuY3Rpb24gZnJvbUJpbmFyeShiaW5hcnkpIHtcblx0Y29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh2YWxpZGF0ZVN0cmluZyhiaW5hcnkpLmxlbmd0aCk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xuXHR9XG5cdGNvbnN0IGNoYXJDb2RlcyA9IG5ldyBVaW50MTZBcnJheShieXRlcy5idWZmZXIpO1xuXHRsZXQgcmVzdWx0ID0gXCJcIjtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQ29kZXMubGVuZ3RoOyBpKyspIHtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZXNbaV0pO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtmcm9tQmluYXJ5LCB0b0JpbmFyeX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9iaW5hcnkubWpzXCI7XG5cbmRlc2NyaWJlKCdCaW5hcnknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBbXG4gICAgICAgIFsnYScsICdhXFx1MDAwMCddLFxuICAgICAgICBbJ1x1MjYzOScsICc5JiddLFxuICAgICAgICBbJ0lcdTAwRjF0XHUwMEVCcm5cdTAwRTJ0aVx1MDBGNG5cdTAwRTBsaXpcdTAwRTZ0aVx1MDBGOG4nLCAnSVxcdTAwMDBcdTAwRjFcXHUwMDAwdFxcdTAwMDBcdTAwRUJcXHUwMDAwclxcdTAwMDBuXFx1MDAwMFx1MDBFMlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY0XFx1MDAwMG5cXHUwMDAwXHUwMEUwXFx1MDAwMGxcXHUwMDAwaVxcdTAwMDB6XFx1MDAwMFx1MDBFNlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY4XFx1MDAwMG5cXHUwMDAwJ11cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ2Zyb21CaW5hcnkodG9CaW5hcnkoJyArIGEgKyAnKSkgc2hvdWxkIHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgciA9IHRvQmluYXJ5KGEpO1xuICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGZyb21CaW5hcnkocikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ09ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG5cbiAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoY2FsbGJhY2spXG5cbiAgICBkZXNjcmliZSgnLmFkZFRhZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnXSxcbiAgICAgICAgICAgIFsndGVzdDInXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdhZGRUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyLmFkZFRhZyhhKSkuaXMuaW5zdGFuY2VPZihPYnNlcnZlcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5yZW1vdmVUYWcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJ10sXG4gICAgICAgICAgICBbJ3Rlc3QyJ10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgncmVtb3ZlVGFnKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIE9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlci5yZW1vdmVUYWcoYSkpLmlzLmluc3RhbmNlT2YoT2JzZXJ2ZXIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaGFzVGFnKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MicsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MycsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDQnLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ29ic2VydmVyLmhhc3RUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGEpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuaGFzVGFnKGEpKS5pcy5iZS50cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRlbXBPYnNlcnZlci5oYXNUYWcoYSkpLmlzLmJlLmZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnVwZGF0ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvYmogPSB7fVxuICAgICAgICBpdCgnb2JzZXJ2ZXIudXBkYXRlKCcgKyBvYmogKyAnKSBpcyAnICsgMSArIDMgKyA2LCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiICsgY1xuICAgICAgICAgICAgfSwgMSwgMywgNilcblxuXG4gICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIudXBkYXRlKG9iaikudGhlbihhID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoYSkuaXMuZXF1YWwoMSArIDMgKyA2KVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBmdW5jdGlvbiAudXBkYXRlKCkgc2V2ZXJhbCB0aW1lcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgaXQoJ29ic2VydmVyLnVwZGF0ZSgnICsgb2JqICsgJykgaXMgJyArIDEgKyAzICsgNiwgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHRlbXBPYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKS50aGVuKF8gPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZ2V0VGFncygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtbJ3Rlc3QxJywgJ3Rlc3QyJywgJ3Rlc3QzJywgJ3Rlc3Q0J10sIDRdLFxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDMnLCAndGVzdDQnXSwgM10sIC8vIGRvdWJsZSB0ZXN0MSAoc2V0IGlzIHVuaXF1ZXVlKVxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDEnLCAndGVzdDQnXSwgMl0sIC8vIG11bHRpcGxlIHRlc3QxIChzZXQgaXMgdW5pcXVldWUpXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGEubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGFbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdCgnb2JzZXJ2ZXIuZ2V0VGFncygnICsgYSArICcpIGlzIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpKS50by5iZS5hbignYXJyYXknKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdvYnNlcnZlci5nZXRUYWdzKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArIFwiIHRhZ3NcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpLmxlbmd0aCkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBcdTAwQTkgc2NodWthaSBHbWJIIGFuZCBhbGwgY29udHJpYnV0aW5nIGF1dGhvcnMsIHt7Y29weVJpZ2h0WWVhcn19LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIChBR1BMdjMpLlxuICogVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBjYW4gYmUgZm91bmQgYXQ6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICpcbiAqIEZvciB0aG9zZSB3aG8gZG8gbm90IHdpc2ggdG8gYWRoZXJlIHRvIHRoZSBBR1BMdjMsIGEgY29tbWVyY2lhbCBsaWNlbnNlIGlzIGF2YWlsYWJsZS5cbiAqIEFjcXVpcmluZyBhIGNvbW1lcmNpYWwgbGljZW5zZSBhbGxvd3MgeW91IHRvIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY29tcGx5aW5nIHdpdGggdGhlIEFHUEx2MyB0ZXJtcy5cbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHB1cmNoYXNpbmcgYSBjb21tZXJjaWFsIGxpY2Vuc2UsIHBsZWFzZSBjb250YWN0IHNjaHVrYWkgR21iSC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjBcbiAqL1xuXG5pbXBvcnQgeyB2YWxpZGF0ZVN0cmluZyB9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQgeyBlc2NhcGVTdHJpbmcgfTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHByZWZpeGVzIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBtYXkgYXBwZWFyIGluIGEgcmVnZXggd2l0aCBhIHNsYXNoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHZhbHVlKSB7XG5cdHJldHVybiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSlcblx0XHQucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csIFwiXFxcXCQmXCIpXG5cdFx0LnJlcGxhY2UoLy0vZywgXCJcXFxceDJkXCIpO1xufVxuIiwgIlxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZXNjYXBlU3RyaW5nfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL3JlZ2V4Lm1qc1wiXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxuZGVzY3JpYmUoJ2VzY2FwZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIHByb21pc2VzLnB1c2goaW5pdEpTRE9NKCkpO1xuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG4gICAgXG4gICAgW1xuICAgICAgICBbJ3Rlc3QxJywgJ3Rlc3QxJ10sXG4gICAgICAgIFsnJHsnLCAnXFxcXCRcXFxceyddLFxuICAgICAgICBbJ2kxOG57JywgJ2kxOG5cXFxceyddLFxuICAgICAgICBbJy8vJywgJy8vJ10sXG4gICAgICAgIFsnXFxcXCcsICdcXFxcXFxcXCddLFxuICAgICAgIFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ2VzY2FwZVN0cmluZygnICsgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChlc2NhcGVTdHJpbmcoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ1JhbmRvbUlEJywgZnVuY3Rpb24gKCkge1xuXG4gICAgY2xhc3MgUmFuZG9tSUQge31cbiAgICBcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL3JhbmRvbWlkLm1qc1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgUmFuZG9tSUQgPSBtLlJhbmRvbUlEO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pKVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBpZCA9IG5ldyBSYW5kb21JRCgpXG4gICAgICAgIGxldCByZXN1bHQgPSBpZC50b1N0cmluZygpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkuaXMuYSgnc3RyaW5nJylcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0lEJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgaWYoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBpZCA9IG5ldyBJRCgpXG4gICAgICAgIGxldCByZXN1bHQgPSBpZC50b1N0cmluZygpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkuaXMuYSgnc3RyaW5nJylcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSUQoJ3RleHQxNDI1aWQnKS50b1N0cmluZygpKS5pcy5lcXVhbCgndGV4dDE0MjVpZDEnKVxuICAgICAgICAgICAgZXhwZWN0KG5ldyBJRCgndGV4dDE0MjVpZCcpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKCd0ZXh0MTQyNWlkMicpXG4gICAgICAgICAgICBleHBlY3QobmV3IElEKCd0ZXh0MTQyNWlkJykudG9TdHJpbmcoKSkuaXMuZXF1YWwoJ3RleHQxNDI1aWQzJylcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnVVVJRCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGNsYXNzIFVVSUQge31cbiAgICBcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBcbiAgICAgICAgaWYoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy91dWlkLm1qc1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgVVVJRCA9IG0uVVVJRDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSlcbiAgICAgICAgXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHV1aWQgPSBuZXcgVVVJRCgpXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdXVpZC50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS5pcy5hKCdzdHJpbmcnKVxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLmlzLmVxdWFsKDM2KVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgndGVzdCBmb3JtYXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IHV1aWQgPSBuZXcgVVVJRCgpXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdXVpZC50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBjb25zdCByZWdleEV4cCA9IC9eW0EtRlxcZF17OH0tW0EtRlxcZF17NH0tNFtBLUZcXGRdezN9LVs4OUFCXVtBLUZcXGRdezN9LVtBLUZcXGRdezEyfSQvaTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1ID0gbmV3IFVVSUQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSByZWdleEV4cC50ZXN0KHUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHIgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgnbm8gdXVpZCAnICsgdSArICcgPT4gJyArIHIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge1xuICAgIGlzUHJpbWl0aXZlLFxuICAgIGlzQm9vbGVhbixcbiAgICBpc1N0cmluZyxcbiAgICBpc09iamVjdCxcbiAgICBpc0FycmF5LFxuICAgIGlzSW5zdGFuY2UsXG4gICAgaXNGdW5jdGlvbixcbiAgICBpc0l0ZXJhYmxlLFxuICAgIGlzSW50ZWdlcixcbiAgICBpc1N5bWJvbFxufSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL2lzLm1qc1wiO1xuXG5cbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0lzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgaWYoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLmlzUHJpbWl0aXZlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdpcy5pc1ByaW1pdGl2ZSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzUHJpbWl0aXZlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcbiAgICBkZXNjcmliZSgnLmlzU3ltYm9sKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzU3ltYm9sKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNTeW1ib2woYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5pc0ludGVnZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnRlZ2VyKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNJdGVyYWJsZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdHJ1ZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc0l0ZXJhYmxlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNCb29sZWFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNCb29sZWFuKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNCb29sZWFuKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNTdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc1N0cmluZyhhKSkuaXMuZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmlzSW5zdGFuY2UoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IElEKCksIElELCAgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IElEKCksICgpPT57fSwgIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDEnLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSW5zdGFuY2UoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHJldHVybiAnICsgdHlwZW9mIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnN0YW5jZShhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNJbnN0YW5jZUV4dGVuZGVkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNsYXNzIEJhc2Uge31cbiAgICAgICAgY2xhc3MgRGVyaXZlZCBleHRlbmRzIEJhc2Uge31cbiAgICAgICAgZnVuY3Rpb24gQW5vdGhlckNsYXNzKCkge31cblxuICAgICAgICBsZXQgYmFzZUluc3RhbmNlID0gbmV3IEJhc2UoKTtcbiAgICAgICAgbGV0IGRlcml2ZWRJbnN0YW5jZSA9IG5ldyBEZXJpdmVkKCk7XG5cbiAgICAgICAgLy8gVGVzdCBjYXNlc1xuICAgICAgICBjb25zdCBjYXNlcyA9IFtcbiAgICAgICAgICAgIFsoKSA9PiB7fSwgdW5kZWZpbmVkLCBmYWxzZSxcImZ1bmN0aW9uIHZzIHVuZGVmaW5lZFwiXSxcbiAgICAgICAgICAgIFtuZXcgSUQoKSwgKCk9Pnt9LCBmYWxzZSwgXCJJRCBpbnN0YW5jZSB2cyBmdW5jdGlvblwiXSxcbiAgICAgICAgICAgIFtuZXcgSUQoKSwgSUQsIHRydWUsIFwiSUQgaW5zdGFuY2UgdnMgSURcIl0sXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdW5kZWZpbmVkLCBmYWxzZSwgXCJzdHJpbmcgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSwgXCJ1bmRlZmluZWQgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgW251bGwsIHVuZGVmaW5lZCwgZmFsc2UsIFwibnVsbCB2cyB1bmRlZmluZWRcIl0sXG4gICAgICAgICAgICBbMiwgdW5kZWZpbmVkLCBmYWxzZSwgXCJudW1iZXIgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIGZhbHNlLCBcImZhbHNlIHZzIHVuZGVmaW5lZFwiXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIHVuZGVmaW5lZCwgZmFsc2UsIFwiTmFOIHZzIHVuZGVmaW5lZFwiXSxcbiAgICAgICAgICAgIFt0cnVlLCB1bmRlZmluZWQsIGZhbHNlLCBcInRydWUgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgWzQuNSwgdW5kZWZpbmVkLCBmYWxzZSwgXCJmbG9hdCB2cyB1bmRlZmluZWRcIl0sXG4gICAgICAgICAgICBbe30sIHVuZGVmaW5lZCwgZmFsc2UsIFwib2JqZWN0IHZzIHVuZGVmaW5lZFwiXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIHVuZGVmaW5lZCwgZmFsc2UsIFwiYXJyYXkgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdW5kZWZpbmVkLCBmYWxzZSwgXCJzeW1ib2wgdnMgdW5kZWZpbmVkXCJdLFxuICAgICAgICAgICAgW2Jhc2VJbnN0YW5jZSwgQmFzZSwgdHJ1ZSwgXCJCYXNlIGluc3RhbmNlIHZzIEJhc2VcIl0sXG4gICAgICAgICAgICBbZGVyaXZlZEluc3RhbmNlLCBCYXNlLCB0cnVlLCBcIkRlcml2ZWQgaW5zdGFuY2UgdnMgQmFzZVwiXSxcbiAgICAgICAgICAgIFtkZXJpdmVkSW5zdGFuY2UsIERlcml2ZWQsIHRydWUsIFwiRGVyaXZlZCBpbnN0YW5jZSB2cyBEZXJpdmVkXCJdLFxuICAgICAgICAgICAgW2Jhc2VJbnN0YW5jZSwgRGVyaXZlZCwgZmFsc2UsIFwiQmFzZSBpbnN0YW5jZSB2cyBEZXJpdmVkXCJdLFxuICAgICAgICAgICAgW2Jhc2VJbnN0YW5jZSwgQW5vdGhlckNsYXNzLCBmYWxzZSwgXCJCYXNlIGluc3RhbmNlIHZzIEFub3RoZXJDbGFzc1wiXSxcbiAgICAgICAgICAgIFtkZXJpdmVkSW5zdGFuY2UsICgpPT57fSwgZmFsc2UsIFwiRGVyaXZlZCBpbnN0YW5jZSB2cyBmdW5jdGlvblwiXSxcbiAgICAgICAgICAgIFtuZXcgQW5vdGhlckNsYXNzKCksIEFub3RoZXJDbGFzcywgdHJ1ZSwgXCJBbm90aGVyQ2xhc3MgaW5zdGFuY2UgdnMgQW5vdGhlckNsYXNzXCJdLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIEFkZGluZyBwcm90b3R5cGUgbW9kaWZpY2F0aW9uIHRlc3RcbiAgICAgICAgbGV0IHByb3RvTW9kaWZpZWRJbnN0YW5jZSA9IG5ldyBCYXNlKCk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90b01vZGlmaWVkSW5zdGFuY2UsIERlcml2ZWQucHJvdG90eXBlKTtcbiAgICAgICAgY2FzZXMucHVzaChcbiAgICAgICAgICAgIFtwcm90b01vZGlmaWVkSW5zdGFuY2UsIEJhc2UsIHRydWUsIFwiUHJvdG8gbW9kaWZpZWQgQmFzZSBpbnN0YW5jZSB2cyBCYXNlXCJdLCBcbiAgICAgICAgICAgIFtwcm90b01vZGlmaWVkSW5zdGFuY2UsIERlcml2ZWQsIHRydWUsIFwiUHJvdG8gbW9kaWZpZWQgQmFzZSBpbnN0YW5jZSB2cyBEZXJpdmVkXCJdXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUnVubmluZyB0aGUgdGVzdHNcbiAgICAgICAgY2FzZXMuZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IGRhdGEuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBkYXRhLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCBjID0gZGF0YS5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3QgZCA9IGRhdGEuc2hpZnQoKTtcblxuICAgICAgICAgICAgaXQoJ2lzSW5zdGFuY2UoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJywgW0Z1bmN0aW9uXSkgc2hvdWxkIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChpc0luc3RhbmNlKGEsIGIpIT09Yykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnN0YW5jZShhLCBiKSkudG8uZXF1YWwoYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJy5pc09iamVjdCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHRydWVdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdpcy5pc09iamVjdCgnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzT2JqZWN0KGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJy5pc0FycmF5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdHJ1ZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzQXJyYXkoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc0FycmF5KGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5pc0Z1bmN0aW9uKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgdHJ1ZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzRnVuY3Rpb24oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc0Z1bmN0aW9uKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7XG4gICAgdmFsaWRhdGVQcmltaXRpdmUsXG4gICAgdmFsaWRhdGVCb29sZWFuLFxuICAgIHZhbGlkYXRlU3RyaW5nLFxuICAgIHZhbGlkYXRlT2JqZWN0LFxuICAgIHZhbGlkYXRlQXJyYXksXG4gICAgdmFsaWRhdGVGdW5jdGlvbixcbiAgICB2YWxpZGF0ZUludGVnZXIsXG4gICAgdmFsaWRhdGVJbnN0YW5jZSxcbiAgICB2YWxpZGF0ZUl0ZXJhYmxlLFxuICAgIHZhbGlkYXRlU3ltYm9sXG59IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzXCJcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL2Jhc2UubWpzXCJcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ3ZhbGlkYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVByaW1pdGl2ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW251bGwsIHRydWVdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCB0cnVlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZVByaW1pdGl2ZShhKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVQcmltaXRpdmUoYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVJbnRlZ2VyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW50ZWdlcignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVJbnRlZ2VyKGEpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVJbnRlZ2VyKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN5bWJvbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVTeW1ib2woYSkpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgbm90IHRocm93IFR5cGVFeGNlcHRpb24gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlU3ltYm9sKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlSXRlcmFibGUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIHRydWVdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUl0ZXJhYmxlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhYmxlKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUl0ZXJhYmxlKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQm9vbGVhbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlQm9vbGVhbignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCb29sZWFuKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUJvb2xlYW4oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUJvb2xlYW4oYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN0cmluZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN0cmluZygnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZVN0cmluZyhhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZU9iamVjdCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHRydWVdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZU9iamVjdCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVPYmplY3QoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZU9iamVjdChhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIE9iamVjdF0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBPYmplY3RdLFxuICAgICAgICAgICAgW251bGwsIE9iamVjdF0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgT2JqZWN0XSxcbiAgICAgICAgICAgIFsyLCBPYmplY3RdLFxuICAgICAgICAgICAgW2ZhbHNlLCBPYmplY3RdLFxuICAgICAgICAgICAgW3RydWUsIE9iamVjdF0sXG4gICAgICAgICAgICBbNC41LCBPYmplY3RdLFxuICAgICAgICAgICAgW3t9LCBCYXNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIE9iamVjdF0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBPYmplY3RdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUluc3RhbmNlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShhLCBiKVxuICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW3t9LCBPYmplY3QsIHRydWVdLFxuICAgICAgICAgICAgW25ldyBCYXNlLCBCYXNlLCB0cnVlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW5zdGFuY2UoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlSW5zdGFuY2UoYSwgYikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQXJyYXkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB0cnVlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoYiA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVBcnJheSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBcnJheShhKVxuICAgICAgICAgICAgICAgICAgICB9KS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUFycmF5KCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVBcnJheShhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVGdW5jdGlvbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHRydWVdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUZ1bmN0aW9uKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlRnVuY3Rpb24oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUZ1bmN0aW9uKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7U3RhY2t9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvc3RhY2subWpzXCI7XG5pbXBvcnQge1xuICAgIHR5cGVPZlxufSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL3R5cGVvZi5tanNcIlxuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgndHlwZU9mJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy50eXBlT2YoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbdHJ1ZSwgJ2Jvb2xlYW4nXSxcbiAgICAgICAgICAgIFtudWxsLCAnbnVsbCddLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgJ3VuZGVmaW5lZCddLFxuICAgICAgICAgICAgW1Byb21pc2UucmVzb2x2ZSgpLCAncHJvbWlzZSddLFxuICAgICAgICAgICAgW25ldyBXZWFrTWFwKCksICd3ZWFrbWFwJ10sXG4gICAgICAgICAgICBbbmV3IE1hcCgpLCAnbWFwJ10sXG4gICAgICAgICAgICBbTmFOLCAnbnVtYmVyJ10sXG4gICAgICAgICAgICBbZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIH0sICdnZW5lcmF0b3JmdW5jdGlvbiddLFxuICAgICAgICAgICAgWzUsICdudW1iZXInXSxcbiAgICAgICAgICAgIFtmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9LCAnZnVuY3Rpb24nXSxcbiAgICAgICAgICAgIFsvYS8sICdyZWdleHAnXSxcbiAgICAgICAgICAgIFtuZXcgRGF0ZSgpLCAnZGF0ZSddLFxuICAgICAgICAgICAgW3t9LCAnb2JqZWN0J10sXG4gICAgICAgICAgICBbW10sICdhcnJheSddLFxuICAgICAgICAgICAgWycnLCAnc3RyaW5nJ10sXG4gICAgICAgICAgICBbbmV3IEVycm9yLCAnZXJyb3InXSxcbiAgICAgICAgICAgIFtuZXcgU3RhY2ssICdzdGFjayddXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgYiArICcgd2hlbiB0aGUgdmFsdWUgJyArIHR5cGVPZihhKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0eXBlT2YoYSkpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtVbmlxdWVRdWV1ZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy91bmlxdWVxdWV1ZS5tanNcIjtcblxuXG5kZXNjcmliZSgnVW5pcXVlUXVldWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHF1ZXVlO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBxdWV1ZSA9IG5ldyBVbmlxdWVRdWV1ZTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2lzRW1wdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnZmlyc3QgaXQgc2hvdWxkIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2FkZCBzZXF1ZW5jZSBwZWVrIGFuZCBwb2xsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXN1bHQgYSxhLGEsYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoe2E6IDF9KSkudG8uYmUuaW5zdGFuY2VPZihVbmlxdWVRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoe2E6IDJ9KSkudG8uYmUuaW5zdGFuY2VPZihVbmlxdWVRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuYWRkKHthOiAzfSkpLnRvLmJlLmluc3RhbmNlT2YoVW5pcXVlUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBlZWsoKSkudG8uZGVlcC5lcXVhbCh7YToxfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5kZWVwLmVxdWFsKHthOjF9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wb2xsKCkpLnRvLmRlZXAuZXF1YWwoe2E6MX0pO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uZGVlcC5lcXVhbCh7YToyfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmRlZXAuZXF1YWwoe2E6M30pO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uZGVlcC5lcXVhbCh7YTozfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIGFuZCBjbGVhcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoe2E6IDF9KSkudG8uYmUuaW5zdGFuY2VPZihVbmlxdWVRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5jbGVhcigpKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcbiAgICBcbiAgICBkZXNjcmliZSgnYWRkIG5vIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZChbXSl9KS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgICAgICBleHBlY3QoKCk9PntxdWV1ZS5hZGQoMSl9KS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgICAgICBleHBlY3QoKCk9PntxdWV1ZS5hZGQodHJ1ZSl9KS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgICAgICBleHBlY3QoKCk9PntxdWV1ZS5hZGQoKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZChTeW1ib2woXCIxXCIpKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZChmdW5jdGlvbigpe30pfSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICB9KTtcblxuICAgIH0pXG59KSIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtTdGFja30gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9zdGFjay5tanNcIjtcblxuXG5kZXNjcmliZSgnU3RhY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0YWNrO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBzdGFjayA9IG5ldyBTdGFjaztcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2lzRW1wdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnZmlyc3QgaXQgc2hvdWxkIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2FkZCBzZXF1ZW5jZSBwZWVrIGFuZCBwdWxsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXN1bHQgYSxhLGEsYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wdXNoKCdhJykpLnRvLmJlLmluc3RhbmNlT2YoU3RhY2spO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucHVzaCgnYicpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wdXNoKCdjJykpLnRvLmJlLmluc3RhbmNlT2YoU3RhY2spO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnBlZWsoKSkudG8uYmUuZXF1YWwoJ2MnKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wZWVrKCkpLnRvLmJlLmVxdWFsKCdjJyk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucG9wKCkpLnRvLmJlLmVxdWFsKCdjJyk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucGVlaygpKS50by5iZS5lcXVhbCgnYicpO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnB1c2goJ2EnKSkudG8uYmUuaW5zdGFuY2VPZihTdGFjayk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5jbGVhcigpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcbn0pIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdCYXNlV2l0aE9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2VXaXRoT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnaXMgaW5zdGFuY2Ugb2YgQmFzZVdpdGhPcHRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBCYXNlV2l0aE9wdGlvbnMpLnRvLmJlLmluc3RhbmNlT2YoQmFzZVdpdGhPcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIE9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQmFzZVdpdGhPcHRpb25zKS50by5iZS5pbnN0YW5jZU9mKE9iamVjdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdnZXQgb3B0aW9uIGlzIHRydWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2VXaXRoT3B0aW9ucyh7YTogdHJ1ZX0pLmdldE9wdGlvbignYScpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9ub2RlLm1qc1wiO1xuaW1wb3J0IHtOb2RlTGlzdH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9ub2RlbGlzdC5tanNcIjtcbmltcG9ydCB7Tm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanNcIjtcblxuZGVzY3JpYmUoJ05vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCcjY29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdC5zaXplKS50by5lcXVhbCgwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSBOb2RlTGlzdCBmcm9tIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KFtcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKVxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdC5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSBOb2RlTGlzdCBmcm9tIGEgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgbGV0IG5vZGVMaXN0MiA9IG5ldyBOb2RlTGlzdChub2RlTGlzdCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdDIuc2l6ZSkudG8uZXF1YWwoMyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpKS5pcy5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ2FkZCBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkuYWRkKG5ldyBOb2RlKCkpKS50by5iZS5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ3JlbW92ZSBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkucmVtb3ZlKG5ldyBOb2RlKCkpKS50by5iZS5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ2hhcyB1bmtub3duIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5oYXMobmV3IE5vZGUpKS50by5iZS5mYWxzZTtcbiAgICB9KVxuXG4gICAgaXQoJ2hhcyBhZGRlZCBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE5vZGU7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobikuaGFzKG4pKS50by5iZS50cnVlO1xuICAgIH0pXG5cbiAgICBpdCgndGhyb3cgZXhjZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QoKCkgPT4gbmV3IE5vZGVMaXN0KCkuYWRkKDEpKS50by50aHJvdyhFcnJvcik7XG4gICAgfSlcblxuICAgIGl0KCdjaGVjayBsZXZlbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCByb290ID0gbmV3IE5vZGUoJ3Jvb3QnKTtcblxuICAgICAgICBjb25zdCBuMSA9IG5ldyBOb2RlKCduMScpO1xuICAgICAgICBjb25zdCBuMiA9IG5ldyBOb2RlKCduMicpO1xuICAgICAgICBjb25zdCBuMyA9IG5ldyBOb2RlKCduMycpO1xuICAgICAgICBjb25zdCBuNCA9IG5ldyBOb2RlKCduNCcpO1xuXG4gICAgICAgIGNvbnN0IG4xMSA9IG5ldyBOb2RlKCduMTEnKTtcbiAgICAgICAgY29uc3QgbjEyID0gbmV3IE5vZGUoJ24xMicpO1xuICAgICAgICBjb25zdCBuMTMgPSBuZXcgTm9kZSgnbjEzJyk7XG5cbiAgICAgICAgY29uc3QgbjIxID0gbmV3IE5vZGUoJ24yMScpO1xuICAgICAgICBjb25zdCBuMjIgPSBuZXcgTm9kZSgnbjIyJyk7XG4gICAgICAgIGNvbnN0IG4yMyA9IG5ldyBOb2RlKCduMjMnKTtcblxuICAgICAgICBjb25zdCBuNDEgPSBuZXcgTm9kZSgnbjQxJyk7XG4gICAgICAgIGNvbnN0IG40MiA9IG5ldyBOb2RlKCduNDInKTtcblxuICAgICAgICBjb25zdCBuNDExID0gbmV3IE5vZGUoJ240MTEnKTtcbiAgICAgICAgY29uc3QgbjQxMiA9IG5ldyBOb2RlKCduNDEyJyk7XG4gICAgICAgIGNvbnN0IG40MTMgPSBuZXcgTm9kZSgnbjQxMycpO1xuXG4gICAgICAgIGNvbnN0IG40MTIxID0gbmV3IE5vZGUoJ240MTIxJyk7XG5cbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChuMSkuYXBwZW5kQ2hpbGQobjIpLmFwcGVuZENoaWxkKG4zKS5hcHBlbmRDaGlsZChuNCk7XG4gICAgICAgIG4xLmFwcGVuZENoaWxkKG4xMSkuYXBwZW5kQ2hpbGQobjEyKS5hcHBlbmRDaGlsZChuMTMpO1xuICAgICAgICBuMi5hcHBlbmRDaGlsZChuMjEpLmFwcGVuZENoaWxkKG4yMikuYXBwZW5kQ2hpbGQobjIzKTtcbiAgICAgICAgbjQuYXBwZW5kQ2hpbGQobjQxKS5hcHBlbmRDaGlsZChuNDIpO1xuICAgICAgICBuNDEuYXBwZW5kQ2hpbGQobjQxMSkuYXBwZW5kQ2hpbGQobjQxMikuYXBwZW5kQ2hpbGQobjQxMyk7XG4gICAgICAgIG40MTIuYXBwZW5kQ2hpbGQobjQxMjEpO1xuXG4gICAgICAgIGxldCBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iocm9vdCk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGV4cGVjdChuKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSArIFwiOlwiICsgbi5sZXZlbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW1xuICAgICAgICAgICAgJ3Jvb3Q6MCcsXG4gICAgICAgICAgICAnbjE6MScsXG4gICAgICAgICAgICAnbjExOjInLFxuICAgICAgICAgICAgJ24xMjoyJyxcbiAgICAgICAgICAgICduMTM6MicsXG4gICAgICAgICAgICAnbjI6MScsXG4gICAgICAgICAgICAnbjIxOjInLFxuICAgICAgICAgICAgJ24yMjoyJyxcbiAgICAgICAgICAgICduMjM6MicsXG4gICAgICAgICAgICAnbjM6MScsXG4gICAgICAgICAgICAnbjQ6MScsXG4gICAgICAgICAgICAnbjQxOjInLFxuICAgICAgICAgICAgJ240MTE6MycsXG4gICAgICAgICAgICAnbjQxMjozJyxcbiAgICAgICAgICAgICduNDEyMTo0JyxcbiAgICAgICAgICAgICduNDEzOjMnLFxuICAgICAgICAgICAgJ240MjoyJ1xuXG4gICAgICAgIF0pO1xuXG4gICAgICAgIG40MTIxLmFwcGVuZENoaWxkKG5ldyBOb2RlKCduNDEyMTEnKSk7XG5cbiAgICAgICAgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKHJvb3QpO1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBleHBlY3QobikudG8uYmUuYW4uaW5zdGFuY2VvZihOb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG4udmFsdWUgKyBcIjpcIiArIG4ubGV2ZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbXG4gICAgICAgICAgICAncm9vdDowJyxcbiAgICAgICAgICAgICduMToxJyxcbiAgICAgICAgICAgICduMTE6MicsXG4gICAgICAgICAgICAnbjEyOjInLFxuICAgICAgICAgICAgJ24xMzoyJyxcbiAgICAgICAgICAgICduMjoxJyxcbiAgICAgICAgICAgICduMjE6MicsXG4gICAgICAgICAgICAnbjIyOjInLFxuICAgICAgICAgICAgJ24yMzoyJyxcbiAgICAgICAgICAgICduMzoxJyxcbiAgICAgICAgICAgICduNDoxJyxcbiAgICAgICAgICAgICduNDE6MicsXG4gICAgICAgICAgICAnbjQxMTozJyxcbiAgICAgICAgICAgICduNDEyOjMnLFxuICAgICAgICAgICAgJ240MTIxOjQnLFxuICAgICAgICAgICAgJ240MTIxMTo1JyxcbiAgICAgICAgICAgICduNDEzOjMnLFxuICAgICAgICAgICAgJ240MjoyJ1xuXG4gICAgICAgIF0pO1xuXG5cbiAgICAgICAgY29uc3QgYmIgPSBuZXcgTm9kZSgnYmInKSAvLyBiaWcgYmFuZ1xuXG4gICAgICAgIGJiLmFwcGVuZENoaWxkKHJvb3QpO1xuICAgICAgICBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3IoYmIpO1xuXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGV4cGVjdChuKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSArIFwiOlwiICsgbi5sZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFtcbiAgICAgICAgICAgICdiYjowJyxcbiAgICAgICAgICAgICdyb290OjEnLFxuICAgICAgICAgICAgJ24xOjInLFxuICAgICAgICAgICAgJ24xMTozJyxcbiAgICAgICAgICAgICduMTI6MycsXG4gICAgICAgICAgICAnbjEzOjMnLFxuICAgICAgICAgICAgJ24yOjInLFxuICAgICAgICAgICAgJ24yMTozJyxcbiAgICAgICAgICAgICduMjI6MycsXG4gICAgICAgICAgICAnbjIzOjMnLFxuICAgICAgICAgICAgJ24zOjInLFxuICAgICAgICAgICAgJ240OjInLFxuICAgICAgICAgICAgJ240MTozJyxcbiAgICAgICAgICAgICduNDExOjQnLFxuICAgICAgICAgICAgJ240MTI6NCcsXG4gICAgICAgICAgICAnbjQxMjE6NScsXG4gICAgICAgICAgICAnbjQxMjExOjYnLFxuICAgICAgICAgICAgJ240MTM6NCcsXG4gICAgICAgICAgICAnbjQyOjMnXG5cbiAgICAgICAgXSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ0xldmVscycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnbjIgc2hvdWxkIGxldmVsIDInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG4wID0gbmV3IE5vZGUoJ2FiYycpO1xuXG4gICAgICAgICAgICBjb25zdCBuMSA9IG5ldyBOb2RlKCdkZWYnKTtcbiAgICAgICAgICAgIG4wLmFwcGVuZENoaWxkKG4xKVxuXG4gICAgICAgICAgICBjb25zdCBuMiA9IG5ldyBOb2RlKCdnaGknKTtcbiAgICAgICAgICAgIG4xLmFwcGVuZENoaWxkKG4yKTtcblxuICAgICAgICAgICAgY29uc3QgbjMgPSBuZXcgTm9kZSgnamtsJyk7XG4gICAgICAgICAgICBuMi5hcHBlbmRDaGlsZChuMyk7XG5cbiAgICAgICAgICAgIGV4cGVjdChuMC5sZXZlbCkudG8uYmUuZXF1YWwoMCk7XG4gICAgICAgICAgICBleHBlY3QobjEubGV2ZWwpLnRvLmJlLmVxdWFsKDEpO1xuICAgICAgICAgICAgZXhwZWN0KG4yLmxldmVsKS50by5iZS5lcXVhbCgyKTtcbiAgICAgICAgICAgIGV4cGVjdChuMy5sZXZlbCkudG8uYmUuZXF1YWwoMyk7XG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCd0b1N0cmluZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgb3V0cHV0IGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgTm9kZSgpO1xuICAgICAgICAgICAgZXhwZWN0KG5vZGUudG9TdHJpbmcoKSkuaXMuZXF1YWwoJycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIG91dHB1dCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBuMCA9IG5ldyBOb2RlKCdhYmMnKTtcblxuICAgICAgICAgICAgY29uc3QgbjEgPSBuZXcgTm9kZSgnZGVmJyk7XG4gICAgICAgICAgICBuMC5hcHBlbmRDaGlsZChuMSlcblxuICAgICAgICAgICAgY29uc3QgbjExID0gbmV3IE5vZGUoJ2doaScpO1xuICAgICAgICAgICAgbjAuYXBwZW5kQ2hpbGQobjExKVxuXG4gICAgICAgICAgICBjb25zdCBuMiA9IG5ldyBOb2RlKCdqa2wnKTtcbiAgICAgICAgICAgIG4xLmFwcGVuZENoaWxkKG4yKTtcblxuICAgICAgICAgICAgY29uc3QgbjMgPSBuZXcgTm9kZSgnbW5vJyk7XG4gICAgICAgICAgICBuMS5hcHBlbmRDaGlsZChuMyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG40ID0gbmV3IE5vZGUoJ3BxcicpO1xuICAgICAgICAgICAgbjIuYXBwZW5kQ2hpbGQobjQpO1xuXG4gICAgICAgICAgICBleHBlY3QobjIubGV2ZWwpLnRvLmJlLmVxdWFsKDIpXG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobjAudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAvLyBleHBlY3QobjAudG9TdHJpbmcoKSkuaXMuZXF1YWwoJycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UXVldWV9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvdHlwZXMvcXVldWUubWpzXCI7XG5cbmRlc2NyaWJlKCdRdWV1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcXVldWU7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHF1ZXVlID0gbmV3IFF1ZXVlO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnaXNFbXB0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdmaXJzdCBpdCBzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIHNlcXVlbmNlIHBlZWsgYW5kIHBvbGwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Jlc3VsdCBhLGEsYSxiJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYicpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoJ2MnKSkudG8uYmUuaW5zdGFuY2VPZihRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5iZS5lcXVhbCgnYScpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBlZWsoKSkudG8uYmUuZXF1YWwoJ2EnKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wb2xsKCkpLnRvLmJlLmVxdWFsKCdhJyk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5iZS5lcXVhbCgnYicpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmNsZWFyKCkpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG5cbiAgICBcbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9ub2RlLm1qc1wiO1xuaW1wb3J0IHtOb2RlTGlzdH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS90eXBlcy9ub2RlbGlzdC5tanNcIjtcbmltcG9ydCB7Tm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanNcIjtcblxuZGVzY3JpYmUoJ05vZGVSZWN1cnNpdmVJdGVyYXRvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXhlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKCkpLnRvLnRocm93KEVycm9yKVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYmUgYSBmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KE5vZGVSZWN1cnNpdmVJdGVyYXRvcikudG8uYmUuYSgnZnVuY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYSBjb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3IobmV3IE5vZGUpKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGVSZWN1cnNpdmVJdGVyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy95aWVsZFxuICAgICAqL1xuICAgIGl0KCd1bmRlZmluZWQgc2hvdWxkIG5vdCByZXN1bHQgaW4gdW5kZWZpbmVkIG5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihuZXcgTm9kZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW3VuZGVmaW5lZF0pO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGl0ZXJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPVxuICAgICAgICAgICAgbmV3IE5vZGUoJzEnKVxuICAgICAgICBub2RlLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgKG5ldyBOb2RlKCcyJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjEnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMicpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4zJykpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMycpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNCcpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0LjEnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQuMicpKSk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5vZGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGV4cGVjdChuKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFsnMScsICcyJywgJzIuMScsICcyLjInLCAnMi4zJywgJzMnLCAnNCcsICc0LjEnLCAnNC4yJ10pO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGl0ZXJhdGUgbm9kZWxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KCk7XG5cbiAgICAgICAgbm9kZUxpc3QuYWRkKFxuICAgICAgICAgICAgKG5ldyBOb2RlKCcyJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjEnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMicpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4zJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCczJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0JykuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4yJykpKSk7XG5cbiAgICAgICAgbm9kZUxpc3QuYWRkKG5ldyBOb2RlKCd4JykpO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihub2RlTGlzdCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbJzInLCAnMi4xJywgJzIuMicsICcyLjMnLCAnMycsICc0JywgJzQuMScsICc0LjInLCAneCddKTtcblxuICAgIH0pO1xuXG59KTsiLCAiXG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2Zvcm1hdFRpbWVBZ299IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi90aW1lLWFnby5tanNcIjtcblxuZGVzY3JpYmUoJ2Zvcm1hdFRpbWVBZ28nLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgXCJqdXN0IG5vd1wiIGZvciB0aW1lcyBsZXNzIHRoYW4gYSBzZWNvbmQgYWdvJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBleHBlY3QoZm9ybWF0VGltZUFnbyhub3csICdlbicpKS50by5lcXVhbCgnanVzdCBub3cnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIFwiaW4gMSBzZWNvbmRcIiBmb3Igb25lIHNlY29uZCBpbiB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbmVTZWNvbmRGdXR1cmUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAwMCk7XG4gICAgICAgIGV4cGVjdChmb3JtYXRUaW1lQWdvKG9uZVNlY29uZEZ1dHVyZSwgJ2VuJykpLnRvLmVxdWFsKCdpbiAxIHNlY29uZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgXCIxIHNlY29uZCBhZ29cIiBmb3Igb25lIHNlY29uZCBpbiB0aGUgcGFzdCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb25lU2Vjb25kUGFzdCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAxMDAwKTtcbiAgICAgICAgZXhwZWN0KGZvcm1hdFRpbWVBZ28ob25lU2Vjb25kUGFzdCwgJ2VuJykpLnRvLmVxdWFsKCcxIHNlY29uZCBhZ28nKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIFwiaW4gMSBtaW51dGUsIDMwIHNlY29uZHNcIiBmb3IgOTAgc2Vjb25kcyBpbiB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuaW5ldHlTZWNvbmRzRnV0dXJlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDkwMDAwKTtcbiAgICAgICAgZXhwZWN0KGZvcm1hdFRpbWVBZ28obmluZXR5U2Vjb25kc0Z1dHVyZSwgJ2VuJykpLnRvLmVxdWFsKCdpbiAxIG1pbnV0ZSBhbmQgMzAgc2Vjb25kcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgXCIxIG1pbnV0ZSwgMzAgc2Vjb25kcyBhZ29cIiBmb3IgOTAgc2Vjb25kcyBpbiB0aGUgcGFzdCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmluZXR5U2Vjb25kc1Bhc3QgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gOTAwMDApO1xuICAgICAgICBleHBlY3QoZm9ybWF0VGltZUFnbyhuaW5ldHlTZWNvbmRzUGFzdCwgJ2VuJykpLnRvLmVxdWFsKCcxIG1pbnV0ZSBhbmQgMzAgc2Vjb25kcyBhZ28nKTtcbiAgICB9KTtcblxuICAgIC8vIFdlaXRlcmUgVGVzdHMga1x1MDBGNm5uZW4gaGluenVnZWZcdTAwRkNndCB3ZXJkZW5cbn0pO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGluc3RhbmNlU3ltYm9sLCBpbnRlcm5hbFN5bWJvbCB9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHRlciBhcyBUZXh0Rm9ybWF0dGVyIH0gZnJvbSBcIi4uL3RleHQvZm9ybWF0dGVyLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbnMgfSBmcm9tIFwiLi90cmFuc2xhdGlvbnMubWpzXCI7XG5cbmV4cG9ydCB7IEZvcm1hdHRlciB9O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbFRyYW5zbGF0aW9uU3ltYm9sID0gU3ltYm9sKFwiaW50ZXJuYWxUcmFuc2xhdGlvblwiKTtcblxuLyoqXG4gKiBUaGUgRm9ybWF0dGVyIGV4dGVuZHMgdGhlIFRleHQuRm9ybWF0dGVyIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UgdGhlIGtleSBieSBhIHRyYW5zbGF0aW9uLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuY2xhc3MgRm9ybWF0dGVyIGV4dGVuZHMgVGV4dEZvcm1hdHRlciB7XG5cdC8qKlxuXHQgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1hcmtlcnMgYXJlIGAke2AgYW5kIGB9YFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG5cdCAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvYmplY3QsIHRyYW5zbGF0aW9uLCBvcHRpb25zKSB7XG5cdFx0c3VwZXIob2JqZWN0LCBvcHRpb25zKTtcblx0XHR0aGlzW2ludGVybmFsVHJhbnNsYXRpb25TeW1ib2xdID0gdmFsaWRhdGVJbnN0YW5jZShcblx0XHRcdHRyYW5zbGF0aW9uLFxuXHRcdFx0VHJhbnNsYXRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBgaW5zdGFuY2VvZmAgb3BlcmF0b3IuXG5cdCAqIEByZXR1cm4ge3N5bWJvbH1cblx0ICogQHNpbmNlIDMuMjcuMFxuXHQgKi9cblx0c3RhdGljIGdldCBbaW5zdGFuY2VTeW1ib2xdKCkge1xuXHRcdHJldHVybiBTeW1ib2wuZm9yKFwiQHNjaHVrYWkvbW9uc3Rlci9pMThuL2Zvcm1hdHRlckBAaW5zdGFuY2VcIik7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3BlcnR5IHtvYmplY3R9IG1hcmtlclxuXHQgKiBAcHJvcGVydHkge2FycmF5fSBtYXJrZXIub3Blbj1bXCJpMThue1wiLFwiJHtcIl1cblx0ICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLmNsb3NlPVtcIiR7XCJdXG5cdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXJhbWV0ZXJcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5kZWxpbWl0ZXI9XCI6OlwiXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJhbWV0ZXIuYXNzaWdubWVudD1cIj1cIlxuXHQgKiBAcHJvcGVydHkge29iamVjdH0gY2FsbGJhY2tzXG5cdCAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGNhbGxiYWNrcy5pMThuPSgpPT57fVxuXHQgKi9cblx0Z2V0IGRlZmF1bHRzKCkge1xuXHRcdHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG5cdFx0XHRjYWxsYmFja3M6IHtcblx0XHRcdFx0aTE4bjogKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXNbaW50ZXJuYWxUcmFuc2xhdGlvblN5bWJvbF0uZ2V0VGV4dCh2YWxpZGF0ZVN0cmluZyh2YWx1ZSkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdG1hcmtlcjoge1xuXHRcdFx0XHRvcGVuOiBbXCJpMThue1wiLCBcIiR7XCJdLFxuXHRcdFx0XHRjbG9zZTogW1wifVwiXSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHRcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdG9vIGRlZXAgbmVzdGluZ1xuXHQgKiBAdGhyb3dzIHtFcnJvcn0ga2V5IG5vdCBmb3VuZFxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGNsb3NpbmcgbWFya2VyIGlzIG1pc3Npbmdcblx0ICovXG5cdGZvcm1hdCh0ZXh0KSB7XG5cdFx0dmFsaWRhdGVTdHJpbmcodGV4dCk7XG5cblx0XHRjb25zdCBvcGVuTWFya2VyID0gdGhpc1tpbnRlcm5hbFN5bWJvbF1bXCJtYXJrZXJcIl1bXCJvcGVuXCJdPy5bMF07XG5cdFx0Y29uc3QgY2xvc2VNYXJrZXIgPSB0aGlzW2ludGVybmFsU3ltYm9sXVtcIm1hcmtlclwiXVtcImNsb3NlXCJdPy5bMF07XG5cblx0XHRpZiAodGV4dC5pbmRleE9mKG9wZW5NYXJrZXIpID09PSAwKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5zdWJzdHJpbmcob3Blbk1hcmtlci5sZW5ndGgpO1xuXG5cdFx0XHRpZiAodGV4dC5pbmRleE9mKGNsb3NlTWFya2VyKSA9PT0gdGV4dC5sZW5ndGggLSBjbG9zZU1hcmtlci5sZW5ndGgpIHtcblx0XHRcdFx0dGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoIC0gY2xvc2VNYXJrZXIubGVuZ3RoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInRoZSBjbG9zaW5nIG1hcmtlciBpcyBtaXNzaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHBhcnRzID0gdmFsaWRhdGVTdHJpbmcodGV4dCkuc3BsaXQoXCI6OlwiKTtcblx0XHRjb25zdCB0cmFuc2xhdGlvbktleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpOyAvLyBrZXkgdmFsdWUgZGVsaW1pdGVyXG5cdFx0Y29uc3QgcGFyYW1ldGVyID0gcGFydHMuam9pbihcIjo6XCIpLnRyaW0oKTtcblxuXHRcdGxldCBhc3NlbWJsZWRUZXh0ID0gYCR7b3Blbk1hcmtlcn1zdGF0aWM6JHt0cmFuc2xhdGlvbktleX0gfCBjYWxsOmkxOG5gO1xuXHRcdGlmIChwYXJhbWV0ZXIubGVuZ3RoID4gMCkge1xuXHRcdFx0YXNzZW1ibGVkVGV4dCArPSBgOjoke3BhcmFtZXRlcn1gO1xuXHRcdH1cblx0XHRhc3NlbWJsZWRUZXh0ICs9IGNsb3NlTWFya2VyO1xuXHRcdHJldHVybiBzdXBlci5mb3JtYXQoYXNzZW1ibGVkVGV4dCk7XG5cdH1cbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi9mb3JtYXR0ZXIubWpzXCI7XG5pbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9pMThuL3RyYW5zbGF0aW9ucy5tanNcIjtcblxuXG5kZXNjcmliZSgnRm9ybWF0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gd2l0aCBtYXJrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnMoJ2VuJylcbiAgICAgICAgICAgICAgICAuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdGhla2V5OiBcIiR7YW5pbWFsfSBoYXMgZWF0ZW4gdGhlICR7Zm9vZH0hXCJcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZiA9IG5ldyBGb3JtYXR0ZXIoe30sIHRyYW5zbGF0aW9ucyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGV4cGVjdChmLmZvcm1hdChcImkxOG57dGhla2V5OjphbmltYWw9ZG9nOjpmb29kPWNha2V9XCIpKS50by5iZS5lcXVhbCgnZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSEnKTtcbiAgICAgICAgICAgIC8vIFx1MjFBNiBkb2cgaGFzIGVhdGVuIHRoZSBjYWtlISAgICAgICAgICAgICAgICBcblxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIHdpdGhvdXQgbWFya2VyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBuZXcgVHJhbnNsYXRpb25zKCdlbicpXG4gICAgICAgICAgICAgICAgLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIHRoZWtleTogXCIke2FuaW1hbH0gaGFzIGVhdGVuIHRoZSAke2Zvb2R9IVwiXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIG1pc3NpbmcgbWFya2VyXG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7fSwgdHJhbnNsYXRpb25zKS5mb3JtYXQoXCJ0aGVrZXk6OmFuaW1hbD1kb2c6OmZvb2Q9Y2FrZVwiKSkudG8uYmUuZXF1YWwoJ2RvZyBoYXMgZWF0ZW4gdGhlIGNha2UhJyk7XG4gICAgICAgICAgICAvLyBcdTIxQTYgZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSEgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpMThue3RyYW5zbGF0aW9ua2V5OjphPTM6OmI9NX0nLCAndGVzdCBpcyAzIGFuZCA1J10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyBzaG91bGQgJyArIGIsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnMoJ2RlJykuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25rZXk6IFwidGVzdCBpcyAke2F9IGFuZCAke2J9XCJcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybWF0dGVyKHt9LCB0cmFuc2xhdGlvbnMpLmZvcm1hdChhKVxuICAgICAgICAgICAgICAgICkudG8uZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KVxuOyIsICJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7cGFyc2VMb2NhbGUsIExvY2FsZX0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9pMThuL2xvY2FsZS5tanNcIjtcblxuXG5kZXNjcmliZSgnTG9jYWxlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ25ldyBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICAvLyBsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nLCBwcml2YXRlVXNlXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTY0Ni5odG1sXG4gICAgICAgICAgICBbJ3poJywgdW5kZWZpbmVkLCAnSGFudCcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICd6aC1IYW50J10sIC8vIHpoLUhhbnQgKENoaW5lc2Ugd3JpdHRlbiB1c2luZyB0aGUgVHJhZGl0aW9uYWwgQ2hpbmVzZSBzY3JpcHQpXG4gICAgICAgICAgICBbJ2RlJywgJ0NIJywgdW5kZWZpbmVkLCAnMTkwMScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnZGUtQ0gtMTkwMSddLCAgLy8gZGUtQ0gtMTkwMSAoR2VybWFuIGFzIHVzZWQgaW4gU3dpdHplcmxhbmQgdXNpbmcgdGhlIDE5MDEgdmFyaWFudCBbb3J0aG9ncmFwaHldKVxuICAgICAgICAgICAgWydzbCcsICdJVCcsIHVuZGVmaW5lZCwgJ25lZGlzJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzbC1JVC1uZWRpcyddLCAgLy8gc2wtSVQtbmVkaXMgKFNsb3ZlbmlhbiBhcyB1c2VkIGluIEl0YWx5LCBOYWRpemEgZGlhbGVjdClcbiAgICAgICAgICAgIFsnaHknLCAnSVQnLCAnTGF0bicsICdhcmV2ZWxhJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdoeS1MYXRuLUlULWFyZXZlbGEnXSwgLy8gaHktTGF0bi1JVC1hcmV2ZWxhIChFYXN0ZXJuIEFybWVuaWFuIHdyaXR0ZW4gaW4gTGF0aW4gc2NyaXB0LCBhcyB1c2VkIGluIEl0YWx5KVxuICAgICAgICAgICAgWyd6aCcsICdDTicsICdIYW5zJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnMtQ04nXSwgLy8gemgtSGFucy1DTiAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBTaW1wbGlmaWVkIHNjcmlwdCBhcyB1c2VkIGluICBtYWlubGFuZCBDaGluYSlcbiAgICAgICAgICAgIFsnc3InLCAnUlMnLCAnTGF0bicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzci1MYXRuLVJTJ10sIC8vIHNyLUxhdG4tUlMgKFNlcmJpYW4gd3JpdHRlbiB1c2luZyB0aGUgTGF0aW4gc2NyaXB0IGFzIHVzZWQgaW4gU2VyYmlhKVxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGUgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBmID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnbmV3IExvY2FsZSgnICsgYSArICcsJyArIGIgKyAnLCcgKyBjICsgJywnICsgZCArICcsJyArIGUgKyAnLCcgKyBmICsgJykgc2hvdWxkIHJldHVybiAnICsgZywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2NhbGUoYSwgYiwgYywgZCwgZSwgZikudG9TdHJpbmcoKSkuaXMuZXF1YWwoZylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3BhcnNlTG9jYWxlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuXG4gICAgICAgICAgICAvLyBsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nLCBwcml2YXRlVXNlXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTY0Ni5odG1sXG4gICAgICAgICAgICBbJ3poJywgdW5kZWZpbmVkLCAnSGFudCcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICd6aC1IYW50J10sIC8vIHpoLUhhbnQgKENoaW5lc2Ugd3JpdHRlbiB1c2luZyB0aGUgVHJhZGl0aW9uYWwgQ2hpbmVzZSBzY3JpcHQpXG4gICAgICAgICAgICBbJ2RlJywgJ0NIJywgdW5kZWZpbmVkLCAnMTkwMScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnZGUtQ0gtMTkwMSddLCAgLy8gZGUtQ0gtMTkwMSAoR2VybWFuIGFzIHVzZWQgaW4gU3dpdHplcmxhbmQgdXNpbmcgdGhlIDE5MDEgdmFyaWFudCBbb3J0aG9ncmFwaHldKVxuICAgICAgICAgICAgWydzbCcsICdJVCcsIHVuZGVmaW5lZCwgJ25lZGlzJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzbC1JVC1uZWRpcyddLCAgLy8gc2wtSVQtbmVkaXMgKFNsb3ZlbmlhbiBhcyB1c2VkIGluIEl0YWx5LCBOYWRpemEgZGlhbGVjdClcbiAgICAgICAgICAgIFsnaHknLCAnSVQnLCAnTGF0bicsICdhcmV2ZWxhJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdoeS1MYXRuLUlULWFyZXZlbGEnXSwgLy8gaHktTGF0bi1JVC1hcmV2ZWxhIChFYXN0ZXJuIEFybWVuaWFuIHdyaXR0ZW4gaW4gTGF0aW4gc2NyaXB0LCBhcyB1c2VkIGluIEl0YWx5KVxuICAgICAgICAgICAgWyd6aCcsICdDTicsICdIYW5zJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnMtQ04nXSwgLy8gemgtSGFucy1DTiAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBTaW1wbGlmaWVkIHNjcmlwdCBhcyB1c2VkIGluICBtYWlubGFuZCBDaGluYSlcbiAgICAgICAgICAgIFsnc3InLCAnUlMnLCAnTGF0bicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzci1MYXRuLVJTJ10sIC8vIHNyLUxhdG4tUlMgKFNlcmJpYW4gd3JpdHRlbiB1c2luZyB0aGUgTGF0aW4gc2NyaXB0IGFzIHVzZWQgaW4gU2VyYmlhKVxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGUgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBmID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnbmV3IExvY2FsZSgnICsgYSArICcsJyArIGIgKyAnLCcgKyBjICsgJywnICsgZCArICcsJyArIGUgKyAnLCcgKyBmICsgJykgc2hvdWxkIHJldHVybiAnICsgZywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxlID0gcGFyc2VMb2NhbGUoZylcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLmxvY2FsZVN0cmluZykudG8uYmUuZXF1YWwoZyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5sYW5ndWFnZSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5yZWdpb24pLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUuc2NyaXB0KS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLnZhcmlhbnRzKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLmV4dGxhbmcpLnRvLmJlLmVxdWFsKGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUucHJpdmF0ZVVzZSkudG8uYmUuZXF1YWwoZik7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IExvY2FsZShhLCBiLCBjLCBkLCBlLCBmKS50b1N0cmluZygpKS5pcy5lcXVhbChnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0FUVFJJQlVURV9PQkpFQ1RMSU5LfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2dldExpbmtlZE9iamVjdHN9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2kxOG4vcHJvdmlkZXIubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5pbXBvcnQge2dldERvY3VtZW50VHJhbnNsYXRpb25zLCBUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5cbmRlc2NyaWJlKCdQcm92aWRlcicsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgbGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cblxuICAgIH0pXG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9KVxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1Byb3ZpZGVyIGFuZCBEb20nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zTGlua1N5bWJvbCA9IFN5bWJvbC5mb3IoXCJAc2NodWthaS9tb25zdGVyL2kxOG4vdHJhbnNsYXRpb25zQEBsaW5rXCIpO1xuXG4gICAgICAgIGl0KCdhc3NpZ25Ub0VsZW1lbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgY29uc3QgcCA9IG5ldyBQcm92aWRlcigpO1xuICAgICAgICAgICAgY29uc3QgciA9IHAuYXNzaWduVG9FbGVtZW50KHVuZGVmaW5lZCwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHIudGhlbigoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfT0JKRUNUTElOSyk7XG4gICAgICAgICAgICAgICAgaWYgKHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJBdHRyaWJ1dGUgbm90IHNldFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpID0gZ2V0TGlua2VkT2JqZWN0cyhlbGVtZW50LCB0cmFuc2xhdGlvbnNMaW5rU3ltYm9sKVxuICAgICAgICAgICAgICAgIGlmIChpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwiTm8gbGlua2VkIG9iamVjdCBmb3VuZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdiBvZiBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY291bnRlciAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihcIk5vIGxpbmtlZCBvYmplY3QgZm91bmRcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZG9jVHJhbnMgPSBnZXREb2N1bWVudFRyYW5zbGF0aW9ucyhlbGVtZW50KVxuICAgICAgICAgICAgICAgIGV4cGVjdChkb2NUcmFucykuaXMuaW5zdGFuY2VvZihUcmFuc2xhdGlvbnMpO1xuXG5cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IFx1MDBBOSBzY2h1a2FpIEdtYkggYW5kIGFsbCBjb250cmlidXRpbmcgYXV0aG9ycywge3tjb3B5UmlnaHRZZWFyfX0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgKEFHUEx2MykuXG4gKiBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGNhbiBiZSBmb3VuZCBhdDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKlxuICogRm9yIHRob3NlIHdobyBkbyBub3Qgd2lzaCB0byBhZGhlcmUgdG8gdGhlIEFHUEx2MywgYSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlLlxuICogQWNxdWlyaW5nIGEgY29tbWVyY2lhbCBsaWNlbnNlIGFsbG93cyB5b3UgdG8gdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjb21wbHlpbmcgd2l0aCB0aGUgQUdQTHYzIHRlcm1zLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHVyY2hhc2luZyBhIGNvbW1lcmNpYWwgbGljZW5zZSwgcGxlYXNlIGNvbnRhY3Qgc2NodWthaSBHbWJILlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMFxuICovXG5cbmltcG9ydCB7IGludGVybmFsU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi8uLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7IEZvcm1hdHRlciB9IGZyb20gXCIuLi8uLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7IGdldEdsb2JhbEZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7IGlzSW5zdGFuY2UsIGlzU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VMb2NhbGUgfSBmcm9tIFwiLi4vbG9jYWxlLm1qc1wiO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiLi4vcHJvdmlkZXIubWpzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbnMgfSBmcm9tIFwiLi4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5leHBvcnQgeyBGZXRjaCB9O1xuXG4vKipcbiAqIFRoZSBmZXRjaCBwcm92aWRlciByZXRyaWV2ZXMgYSBKU09OIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gb2JqZWN0LlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vLi4vZXhhbXBsZS9pMThuL3Byb3ZpZGVycy9mZXRjaC5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzA2Nn1cbiAqIEB0dXRvcmlhbCBpMThuLWxvY2FsZS1hbmQtZm9ybWF0dGVyXG4gKi9cbmNsYXNzIEZldGNoIGV4dGVuZHMgUHJvdmlkZXIge1xuXHQvKipcblx0ICogQXMgb3B0aW9ucyB0aGUga2V5IGBmZXRjaGAgY2FuIGJlIHBhc3NlZC4gVGhpcyBjb25maWcgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgZmV0Y2ggbWV0aG9kIGFzIGluaXQuXG5cdCAqXG5cdCAqIFRoZSB1cmwgbWF5IGNvbnRhaW4gcGxhY2Vob2xkZXJzIChsYW5ndWFnZSwgc2NyaXB0LCByZWdpb24sIHZhcmlhbnRzLCBleHRsYW5nLCBwcml2YXRlVXNlKSwgc28geW91IGNhbiBzcGVjaWZ5IG9uZSB1cmwgZm9yIGFsbCB0cmFuc2xhdGlvbnMuXG5cdCAqXG5cdCAqIGBgYFxuXHQgKiBuZXcgRmV0Y2goJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2Fzc2V0cy8ke2xhbmd1YWdlfS5qc29uJylcblx0ICogYGBgXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNlZSB7QGxpbmsgTW9uc3Rlci5JMThuLlByb3ZpZGVycy5GZXRjaCNkZWZhdWx0c31cblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL2ZldGNofVxuXHQgKi9cblx0Y29uc3RydWN0b3IodXJsLCBvcHRpb25zKSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cblx0XHRpZiAoaXNJbnN0YW5jZSh1cmwsIFVSTCkpIHtcblx0XHRcdHVybCA9IHVybC50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMgPSB7fTtcblx0XHR9XG5cblx0XHR2YWxpZGF0ZVN0cmluZyh1cmwpO1xuXG5cdFx0LyoqXG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9XG5cdFx0ICovXG5cdFx0dGhpcy51cmwgPSB1cmw7XG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBleHRlbmQoXG5cdFx0XHR7fSxcblx0XHRcdHN1cGVyLmRlZmF1bHRzLFxuXHRcdFx0dGhpcy5kZWZhdWx0cyxcblx0XHRcdHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmYXVsdHNcblx0ICpcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5tZXRob2Q9R0VUXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5tb2RlPWNvcnNcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNhY2hlPW5vLWNhY2hlXG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5jcmVkZW50aWFscz1vbWl0XG5cdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmZXRjaC5yZWRpcmVjdD1mb2xsb3dcblx0ICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLnJlZmVycmVyUG9saWN5PW5vLXJlZmVycmVyXG5cdCAqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEl9XG5cdCAqL1xuXHRnZXQgZGVmYXVsdHMoKSB7XG5cdFx0cmV0dXJuIGV4dGVuZChcblx0XHRcdHtcblx0XHRcdFx0ZmV0Y2g6IHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXG5cdFx0XHRcdFx0bW9kZTogXCJjb3JzXCIsIC8vIG5vLWNvcnMsICpjb3JzLCBzYW1lLW9yaWdpblxuXHRcdFx0XHRcdGNhY2hlOiBcIm5vLWNhY2hlXCIsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcblx0XHRcdFx0XHRjcmVkZW50aWFsczogXCJvbWl0XCIsIC8vIGluY2x1ZGUsICpzYW1lLW9yaWdpbiwgb21pdFxuXHRcdFx0XHRcdHJlZGlyZWN0OiBcImZvbGxvd1wiLCAvLyBtYW51YWwsICpmb2xsb3csIGVycm9yXG5cdFx0XHRcdFx0cmVmZXJyZXJQb2xpY3k6IFwibm8tcmVmZXJyZXJcIiwgLy8gbm8tcmVmZXJyZXIsICpuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSwgb3JpZ2luLCBvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHNhbWUtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCB1bnNhZmUtdXJsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0c3VwZXIuZGVmYXVsdHMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0xvY2FsZXxzdHJpbmd9IGxvY2FsZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Z2V0VHJhbnNsYXRpb25zKGxvY2FsZSkge1xuXHRcdGlmIChpc1N0cmluZyhsb2NhbGUpKSB7XG5cdFx0XHRsb2NhbGUgPSBwYXJzZUxvY2FsZShsb2NhbGUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobG9jYWxlLmdldE1hcCgpKTtcblxuXHRcdHJldHVybiBnZXRHbG9iYWxGdW5jdGlvbihcImZldGNoXCIpKFxuXHRcdFx0Zm9ybWF0dGVyLmZvcm1hdCh0aGlzLnVybCksXG5cdFx0XHR0aGlzLmdldE9wdGlvbihcImZldGNoXCIsIHt9KSxcblx0XHQpXG5cdFx0XHQudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcblx0XHRcdC50aGVuKChkYXRhKSA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgVHJhbnNsYXRpb25zKGxvY2FsZSkuYXNzaWduVHJhbnNsYXRpb25zKGRhdGEpO1xuXHRcdFx0fSk7XG5cdH1cbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5cbmltcG9ydCB7RmV0Y2h9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzXCI7XG5pbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9pMThuL3RyYW5zbGF0aW9ucy5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcblxuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcbmxldCBmZXRjaFJlZmVyZW5jZTtcblxuXG5kZXNjcmliZSgnVHJhbnNsYXRpb24gUHJvdmlkZXIgRmV0Y2gnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFsnZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgZmV0Y2hSZWZlcmVuY2UgPSBnbG9iYWxbJ2ZldGNoJ107XG4gICAgICAgIGdsb2JhbFsnZmV0Y2gnXSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIGpzb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYTogXCJ0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9O1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdmZXRjaCBtb2NrIGRhdGEgYW5kIGNyZWF0ZSB0cmFuc2xhdGlvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnZmV0Y2gnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgcCA9IChuZXcgRmV0Y2gobmV3IFVSTCgnaHR0cDovL2V4YW1wbGUuY29tJykpKS5nZXRUcmFuc2xhdGlvbnMoJ2VuJyk7XG5cbiAgICAgICAgICAgIGV4cGVjdChwKS5pcy5pbnN0YW5jZW9mKFByb21pc2UpO1xuXG4gICAgICAgICAgICBwLnRoZW4ociA9PiB7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QocikuaXMuaW5zdGFuY2VvZihUcmFuc2xhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5cbmltcG9ydCB7RW1iZWR9IGZyb20gXCIuLi8uLi8uLi8uLi9zb3VyY2UvaTE4bi9wcm92aWRlcnMvZW1iZWQubWpzXCI7XG5pbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSBcIi4uLy4uLy4uLy4uL3NvdXJjZS9pMThuL3RyYW5zbGF0aW9ucy5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuY29uc3QgaHRtbDEgPSBgXG48c2NyaXB0IGlkPVwidGVtcGxvY2FsZVwiIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCI+XG57XG4gICAgICAgIFwia2V5XCI6IFwidHJhbnNsYXRpb25cIlxufVxuPC9zY3JpcHQ+XG5gO1xuXG5kZXNjcmliZSgnVHJhbnNsYXRpb24gUHJvdmlkZXIgRW1iZWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZ2V0IG1vY2sgZGF0YSBhbmQgY3JlYXRlIHRyYW5zbGF0aW9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdlbWJlZCcsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgRW1iZWQoJ3RlbXBsb2NhbGUnKTtcbiAgICAgICAgICAgIGxldCBwID0gZS5nZXRUcmFuc2xhdGlvbnMoJ2VuJyk7XG4gICAgICAgICAgICBleHBlY3QocCkuaXMuaW5zdGFuY2VvZihQcm9taXNlKTtcblxuICAgICAgICAgICAgcC50aGVuKHIgPT4ge1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSByLmdldFRleHQoJ2tleScpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0KS5pcy5lcXVhbCgndHJhbnNsYXRpb24nKTtcblxuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcblxuaW1wb3J0ICogYXMgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbmNoYWkudXNlKGNoYWlEb20pO1xuXG5kZXNjcmliZSgnTG9jYWxQaWNrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgTG9jYWxQaWNrZXIsIGRvY3VtZW50TGFuZ3VhZ2UsIGxpbmtUYWdzLCBvcmlnaW5hbExhbmd1YWdlcywgZ2V0UHJlZmVycmVkTGFuZ3VhZ2U7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGRvY3VtZW50TGFuZ3VhZ2UgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZztcbiAgICAgICAgICAgIGxpbmtUYWdzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cImFsdGVybmF0ZVwiXScpKTtcbiAgICAgICAgICAgIGxpbmtUYWdzLmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZSgpKTtcblxuICAgICAgICAgICAgaW1wb3J0KFwiZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGxcIikuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vc291cmNlL2kxOG4vdXRpbC5tanNcIikudGhlbigobSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgTG9jYWxQaWNrZXIgPSBtWydMb2NhbFBpY2tlciddO1xuICAgICAgICAgICAgICAgIGdldFByZWZlcnJlZExhbmd1YWdlID0gbVsnZGV0ZWN0VXNlckxhbmd1YWdlUHJlZmVyZW5jZSddO1xuXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxMYW5ndWFnZXMgPSBuYXZpZ2F0b3IubGFuZ3VhZ2VzO1xuXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpXG5cblxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyA9IGRvY3VtZW50TGFuZ3VhZ2U7XG5cbiAgICAgICAgbGlua1RhZ3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ2FsdGVybmF0ZScpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWZsYW5nJywgaXRlbS5ocmVmbGFuZyk7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGl0ZW0uaHJlZik7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgZXhpdHNcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tocmVmbGFuZz1cIiR7aXRlbS5ocmVmbGFuZ31cIl1gKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAnbGFuZ3VhZ2VzJywge1xuICAgICAgICAgICAgdmFsdWU6IG9yaWdpbmFsTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICAvLyBIaWxmc2Z1bmt0aW9uIHp1bSBTZXR1cCBlaW5lcyBKU0RPTS1Eb2t1bWVudHMgbWl0IDxodG1sPiB1bmQgZ2dmLiBsaW5rLVRhZ3NcbiAgICBmdW5jdGlvbiBzZXR1cERPTSh7aHRtbExhbmcgPSAnJywgbGlua0hyZWZsYW5ncyA9IFtdLCBuYXZMYW5nID0gXCJcIn0pIHtcblxuICAgICAgICBsaW5rVGFncyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJhbHRlcm5hdGVcIl0nKSk7XG4gICAgICAgIGxpbmtUYWdzLmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZSgpKTtcblxuICAgICAgICAvLyBMaW5rcyBoaW56dWZcdTAwRkNnZW5cbiAgICAgICAgY29uc3QgaGVhZCA9IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgICAgIGxpbmtIcmVmbGFuZ3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdhbHRlcm5hdGUnKTtcbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmbGFuZycsIGl0ZW0uaHJlZmxhbmcpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpdGVtLmhyZWYpO1xuICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nID0gaHRtbExhbmc7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAnbGFuZ3VhZ2UnLCB7XG4gICAgICAgICAgICB2YWx1ZTogbmF2TGFuZ1swXSB8fCBcIlwiLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ2xhbmd1YWdlcycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuYXZMYW5nLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ2dldFByZWZlcnJlZExhbmd1YWdlKCknLCAoKSA9PiB7XG5cbiAgICAgICAgLy8gMSkgTm8gZG9jdW1lbnQgbGFuZ3VhZ2UsIG5vIG5hdmlnYXRvci5sYW5ndWFnZXMgPT4gXCJObyBsYW5ndWFnZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuXCJcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gXCJObyBsYW5ndWFnZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuXCIgd2hlbiBubyBjdXJyZW50IGFuZCBubyB1c2VyIHByZWZlcmVuY2VzJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe2h0bWxMYW5nOiAnJywgbGlua0hyZWZsYW5nczogW10sIG5hdkxhbmc6IFtdfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZWZlcnJlZExhbmd1YWdlKCk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJykudGhhdC5ub3QuZW1wdHk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDIpIERvY3VtZW50IGxhbmcgaXMgc2V0LCBidXQgbm8gPGxpbms+IHRhZ3MgPT4gXCJObyA8bGluaz4gdGFncyB3aXRoIGhyZWZsYW5nIGF2YWlsYWJsZS5cIlxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBcIk5vIDxsaW5rPiB0YWdzIHdpdGggaHJlZmxhbmcgYXZhaWxhYmxlLlwiIHdoZW4gdGhlcmUgYXJlIG5vIGxpbmsgdGFncycsICgpID0+IHtcbiAgICAgICAgICAgIHNldHVwRE9NKHtodG1sTGFuZzogJ2VuJywgbGlua0hyZWZsYW5nczogW119KTtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZWZlcnJlZExhbmd1YWdlKCk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdjdXJyZW50JywgJ2VuJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJykudGhhdC5lcXVhbHMoJ05vIDxsaW5rPiB0YWdzIHdpdGggaHJlZmxhbmcgYXZhaWxhYmxlLicpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAzKSBEb2N1bWVudCBsYW5nICdlbicsIG5vIHVzZXIgcHJlZmVyZW5jZXMsIGJ1dCBsaW5rIHRhZ3MgZXhpc3QgPT4gXCJOb25lIG9mIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2VzIGFyZSBhdmFpbGFibGUuXCJcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gXCJOb25lIG9mIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2VzIGFyZSBhdmFpbGFibGUuXCIgd2hlbiB0aGVyZSBhcmUgbGluayB0YWdzIGJ1dCBubyBtYXRjaGluZyB1c2VyIHByZWZlcmVuY2VzJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe1xuICAgICAgICAgICAgICAgIGh0bWxMYW5nOiAnZW4nLFxuICAgICAgICAgICAgICAgIGxpbmtIcmVmbGFuZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZGUnLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2RlJ30sXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2ZyJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9mcid9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBuYXZMYW5nOiBbXVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZWZlcnJlZExhbmd1YWdlKCk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdjdXJyZW50JywgJ2VuJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdtZXNzYWdlJykudGhhdC5lcXVhbHMoJ05vIGF2YWlsYWJsZSBsYW5ndWFnZXMgbWF0Y2ggdGhlIHVzZXJcXCdzIHByZWZlcmVuY2VzLicpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5hdmFpbGFibGUpLnRvLmJlLmFuKCdhcnJheScpLnRoYXQuaGFzLmxlbmd0aE9mKDIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyA0KSBEb2N1bWVudCBsYW5nICdlbicsIHVzZXIgcHJlZmVycyBbJ2VuJ10sIGxpbmsgdGFncyB3aXRoICdlbicgYW5kICdkZScgPT4gYmVzdCBtYXRjaCBpcyAnZW4nXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGJlc3QgbWF0Y2ggPSBcImVuXCIgd2hlbiB1c2VyIHByZWZlcnMgZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICBzZXR1cERPTSh7XG4gICAgICAgICAgICAgICAgaHRtbExhbmc6ICdlbicsXG4gICAgICAgICAgICAgICAgbGlua0hyZWZsYW5nczogW1xuICAgICAgICAgICAgICAgICAgICB7aHJlZmxhbmc6ICdlbicsIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20vZW4nfSxcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZGUnLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2RlJ31cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID0gWydlbiddO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRQcmVmZXJyZWRMYW5ndWFnZSgpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uaGF2ZS5wcm9wZXJ0eSgnY3VycmVudCcsICdlbicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LnByZWZlcnJlZCkpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Z1bGwnLCBcImVuXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Jhc2UnLCBcImVuXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2xhYmVsJywgXCJFbmdsaXNoXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2hyZWYnLCBcImh0dHA6Ly9leGFtcGxlLmNvbS9lblwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNSkgRG9jdW1lbnQgbGFuZyAnZGUtREUnLCB1c2VyIHByZWZlcnMgWydkZS1ERSddLCBsaW5rIHRhZ3Mgd2l0aCAnZGUtREUnICYgJ2VuLVVTJyA9PiBiZXN0IG1hdGNoIGlzICdkZS1ERSdcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYmVzdCBtYXRjaCA9IFwiZGUtREVcIiB3aGVuIHVzZXIgcHJlZmVycyBkZS1ERScsICgpID0+IHtcbiAgICAgICAgICAgIHNldHVwRE9NKHtcbiAgICAgICAgICAgICAgICBodG1sTGFuZzogJ2RlLURFJyxcbiAgICAgICAgICAgICAgICBsaW5rSHJlZmxhbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2RlLURFJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9kZS1ERSd9LFxuICAgICAgICAgICAgICAgICAgICB7aHJlZmxhbmc6ICdlbi1VUycsIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20vZW4tVVMnfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgPSBbJ2RlLURFJ107XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZWZlcnJlZExhbmd1YWdlKCk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5oYXZlLnByb3BlcnR5KCdjdXJyZW50JywgJ2RlLURFJyk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdmdWxsJywgXCJkZS1ERVwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdiYXNlJywgXCJkZVwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdsYWJlbCcsIFwiRGV1dHNjaCAoRGV1dHNjaGxhbmQpXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2hyZWYnLCBcImh0dHA6Ly9leGFtcGxlLmNvbS9kZS1ERVwiKTtcblxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8vIDV4KSBEb2N1bWVudCBsYW5nICdkZS1ERScsIHVzZXIgcHJlZmVycyBbJ2RlLURFJ10sIGxpbmsgdGFncyB3aXRoICdkZS1ERScgJiAnZW4tVVMnID0+IGJlc3QgbWF0Y2ggaXMgJ2RlLURFJ1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBiZXN0IG1hdGNoID0gXCJkZS1ERVwiIHdoZW4gdXNlciBwcmVmZXJzIGRlLURFJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe1xuICAgICAgICAgICAgICAgIGh0bWxMYW5nOiAnZW4nLFxuICAgICAgICAgICAgICAgIGxpbmtIcmVmbGFuZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZGUnLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2RlLURFJ30sXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2VuJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9lbi1VUyd9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyA9IFsnZGUtREUnXTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2N1cnJlbnQnLCAnZW4nKTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Z1bGwnLCBcImRlXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Jhc2UnLCBcImRlXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2xhYmVsJywgXCJEZXV0c2NoXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2hyZWYnLCBcImh0dHA6Ly9leGFtcGxlLmNvbS9kZS1ERVwiKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyA2KSBEb2N1bWVudCBsYW5nICdkZS1ERScsIHVzZXIgcHJlZmVycyBbJ2VuLVVTJywgJ2VuJ10sIGxpbmsgdGFncyB3aXRoICdlbi1VUycgJiAnZW4tR0InID0+IGJlc3QgbWF0Y2ggPSAnZW4tVVMnXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGJlc3QgbWF0Y2ggPSBcImVuLVVTXCIgZm9yIHVzZXIgcHJlZmVyZW5jZXMgW2VuLVVTLCBlbl0nLCAoKSA9PiB7XG4gICAgICAgICAgICBzZXR1cERPTSh7XG4gICAgICAgICAgICAgICAgaHRtbExhbmc6ICdkZS1ERScsXG4gICAgICAgICAgICAgICAgbGlua0hyZWZsYW5nczogW1xuICAgICAgICAgICAgICAgICAgICB7aHJlZmxhbmc6ICdlbi1VUycsIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20vZW4tVVMnfSxcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZW4tR0InLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2VuLUdCJ31cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID0gWydlbi1VUycsICdlbiddO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRQcmVmZXJyZWRMYW5ndWFnZSgpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uaGF2ZS5wcm9wZXJ0eSgnY3VycmVudCcsICdkZS1ERScpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Z1bGwnLCBcImVuLVVTXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Jhc2UnLCBcImVuXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2xhYmVsJywgXCJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKVwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdocmVmJywgXCJodHRwOi8vZXhhbXBsZS5jb20vZW4tVVNcIik7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNykgRG9jdW1lbnQgbGFuZyAnZGUtREUnLCB1c2VyIHByZWZlcnMgWydkZScsJ2VuJ10sIGxpbmsgdGFncyB3aXRoICdkZS1ERScgJiAnZW4tVVMnID0+IGJlc3QgbWF0Y2ggPSAnZGUtREUnIChiYXNlTGFuZyA9ICdkZScpXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGJlc3QgbWF0Y2ggPSBcImRlLURFXCIgd2hlbiB1c2VyIHByZWZlcmVuY2VzIGluY2x1ZGUgaXRzIGJhc2UgbGFuZ3VhZ2UgXCJkZVwiJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe1xuICAgICAgICAgICAgICAgIGh0bWxMYW5nOiAnZGUtREUnLFxuICAgICAgICAgICAgICAgIGxpbmtIcmVmbGFuZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZGUtREUnLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2RlLURFJ30sXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2VuLVVTJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9lbi1VUyd9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyA9IFsnZGUnLCAnZW4nXTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2N1cnJlbnQnLCAnZGUtREUnKTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Z1bGwnLCBcImRlLURFXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2Jhc2UnLCBcImRlXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5wcmVmZXJyZWQpLnRvLmhhdmUucHJvcGVydHkoJ2xhYmVsJywgXCJEZXV0c2NoIChEZXV0c2NobGFuZClcIik7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LnByZWZlcnJlZCkudG8uaGF2ZS5wcm9wZXJ0eSgnaHJlZicsIFwiaHR0cDovL2V4YW1wbGUuY29tL2RlLURFXCIpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDgpIE11bHRpcGxlIGxpbmsgdGFncyBzaGFyZSB0aGUgc2FtZSB3ZWlnaHQgPT4gdGhlIGZpcnN0IGluIHRoZSBzb3J0ZWQgYXJyYXkgc2hvdWxkIGJlIHJldHVybmVkXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBmaXJzdCBpdGVtIHdoZW4gbXVsdGlwbGUgbGluayB0YWdzIGhhdmUgdGhlIHNhbWUgd2VpZ2h0JywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe1xuICAgICAgICAgICAgICAgIGh0bWxMYW5nOiAnZW4nLFxuICAgICAgICAgICAgICAgIGxpbmtIcmVmbGFuZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZnInLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2ZyJ30sXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2VzJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9lcyd9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBOZWl0aGVyIFwiZnJcIiBub3IgXCJlc1wiIGlzIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzID0+IGJvdGggaGF2ZSB3ZWlnaHQgPSAxXG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyA9IFsnZGUnXTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIC8vIEJvdGggJ2ZyJyBhbmQgJ2VzJyBoYXZlIHdlaWdodCAxLiBBZnRlciBzb3J0aW5nLCAnZnInIGFwcGVhcnMgZmlyc3QgKGFzIGl0IHdhcyBhZGRlZCBmaXJzdCkuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmF2YWlsYWJsZVswXS5mdWxsTGFuZykudG8uZXF1YWwoJ2ZyJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmF2YWlsYWJsZVsxXS5mdWxsTGFuZykudG8uZXF1YWwoJ2VzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0Lm9mZmVyYWJsZSkudG8uYmUudW5kZWZpbmVkO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uaGF2ZS5wcm9wZXJ0eSgnbWVzc2FnZScsICdObyBhdmFpbGFibGUgbGFuZ3VhZ2VzIG1hdGNoIHRoZSB1c2VyXFwncyBwcmVmZXJlbmNlcy4nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gOSkgQ2hlY2sgdGhhdCBiZXN0VVJMIGlzIHJldHVybmVkIGlmIGEgYmVzdCBtYXRjaCBpcyBmb3VuZFxuICAgICAgICBpdCgnc2hvdWxkIGluY2x1ZGUgYmVzdFVSTCB3aGVuIGEgYmVzdCBtYXRjaCBpcyBmb3VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIHNldHVwRE9NKHtcbiAgICAgICAgICAgICAgICBodG1sTGFuZzogJ2ZyJyxcbiAgICAgICAgICAgICAgICBsaW5rSHJlZmxhbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2ZyLUZSJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9mci1GUid9LFxuICAgICAgICAgICAgICAgICAgICB7aHJlZmxhbmc6ICdkZS1ERScsIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20vZGUtREUnfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgPSBbJ2ZyLUZSJywgJ2RlLURFJ107XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZWZlcnJlZExhbmd1YWdlKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdmdWxsJywgXCJmci1GUlwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdiYXNlJywgXCJmclwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdsYWJlbCcsIFwiRnJhblx1MDBFN2FpcyAoRnJhbmNlKVwiKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQucHJlZmVycmVkKS50by5oYXZlLnByb3BlcnR5KCdocmVmJywgXCJodHRwOi8vZXhhbXBsZS5jb20vZnItRlJcIik7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMTApIENoZWNrIHByZXNlbmNlIG9mIGF2YWlsYWJsZUxhbmd1YWdlcyBhcnJheSwgZW5zdXJpbmcgaXQgaGFzIHdlaWdodCBpbmZvXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGF2YWlsYWJsZUxhbmd1YWdlcyB3aXRoIHdlaWdodCBmb3IgZWFjaCBsaW5rJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0dXBET00oe1xuICAgICAgICAgICAgICAgIGh0bWxMYW5nOiAnZW4tR0InLFxuICAgICAgICAgICAgICAgIGxpbmtIcmVmbGFuZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAge2hyZWZsYW5nOiAnZW4tR0InLCBocmVmOiAnaHR0cDovL2V4YW1wbGUuY29tL2VuLUdCJ30sXG4gICAgICAgICAgICAgICAgICAgIHtocmVmbGFuZzogJ2VuLVVTJywgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbS9lbi1VUyd9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyA9IFsnZW4tR0InLCAnZW4nLCAnZW4tVVMnXTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuYXZhaWxhYmxlKS50by5iZS5hbignYXJyYXknKS53aXRoLmxlbmd0aE9mKDIpO1xuICAgICAgICAgICAgcmVzdWx0LmF2YWlsYWJsZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpdGVtKS50by5oYXZlLnByb3BlcnR5KCd3ZWlnaHQnKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXRlbSkudG8uaGF2ZS5wcm9wZXJ0eSgnZnVsbExhbmcnKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXRlbSkudG8uaGF2ZS5wcm9wZXJ0eSgnYmFzZUxhbmcnKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXRlbSkudG8uaGF2ZS5wcm9wZXJ0eSgnaHJlZicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge3BhcnNlTG9jYWxlfSBmcm9tIFwiLi4vLi4vLi4vc291cmNlL2kxOG4vbG9jYWxlLm1qc1wiO1xuaW1wb3J0IHtFbWJlZH0gZnJvbSBcIi4uLy4uLy4uL3NvdXJjZS9pMThuL3Byb3ZpZGVycy9lbWJlZC5tanNcIjtcbmltcG9ydCB7XG4gICAgVHJhbnNsYXRpb25zLFxuICAgIGdldERvY3VtZW50VHJhbnNsYXRpb25zXG4gICAgXG59IGZyb20gXCIuLi8uLi8uLi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdUcmFuc2xhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnSW5zdGFuY2UgYW5kIEluaXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBuZXcgVHJhbnNsYXRpb25zKHBhcnNlTG9jYWxlKCdlbi1HQicpKTtcblxuICAgICAgICAgICAgdHJhbnNsYXRpb24uYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICB0ZXN0MTogXCJhYmNcIixcbiAgICAgICAgICAgICAgICB0ZXN0MjogeydvdGhlcic6ICd4eXonfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2NyZWF0ZSBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVHJhbnNsYXRpb25zKHBhcnNlTG9jYWxlKCdlbi1HQicpKSkuaXMuaW5zdGFuY2VvZihUcmFuc2xhdGlvbnMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaW5pdCB0cmFuc2xhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QodHJhbnNsYXRpb24uYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICB0ZXN0MTogXCJhYmNcIixcbiAgICAgICAgICAgICAgICB0ZXN0MjogeydvdGhlcic6ICd4eXonfVxuICAgICAgICAgICAgfSkpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRUZXh0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gbmV3IFRyYW5zbGF0aW9ucyhwYXJzZUxvY2FsZSgnZW4tR0InKSk7XG5cbiAgICAgICAgICAgIHRyYW5zbGF0aW9uLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgdGVzdDE6IFwiYWJjXCIsXG4gICAgICAgICAgICAgICAgdGVzdDI6IHsnb3RoZXInOiAneHl6J31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjcmVhdGUsIHNldCBhbmQgZ2V0IGVuLUdCJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHRyYW5zbGF0aW9uLmdldFRleHQoJ3Rlc3QxJykpLmlzLmVxdWFsKCdhYmMnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2NyZWF0ZSwgc2V0IGFuZCBnZXQgIGVuLUdCIHdpdGggcGx1cmFscnVsZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QodHJhbnNsYXRpb24uZ2V0VGV4dCgndGVzdDInKSkuaXMuZXF1YWwoJ3h5eicpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBpbml0RG9jdW1lbnRUcmFuc2xhdGlvblxuICAgICAqL1xuXG4gICAgZGVzY3JpYmUoXCJ0ZXN0IGluaXREb2N1bWVudFRyYW5zbGF0aW9uIFwiLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBsZXQgaHRtbDEgPSBgPGRpdiBpZD1cIm1vY2stdHJhbnNsYXRpb25zXCI+PC9kaXY+XG4gICAgXG48c2NyaXB0IHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJ0cmFuc2xhdGlvbnNcIj5cbiAgICB7XG4gICAgICAgIFwidGVzdDFcIjogXCJhYmNcIixcbiAgICAgICAgXCJ0ZXN0MlwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwieHl6XCJcbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PlxuXG48c2NyaXB0IHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCIgZGF0YS1tb25zdGVyLXJvbGU9XCJ0cmFuc2xhdGlvbnNcIj5cbiAgICB7XG4gICAgICAgIFwidGVzdDFcIjogXCJ4eXpcIixcbiAgICAgICAgXCJ0ZXN0M1wiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwieHl6XCJcbiAgICAgICAgfVxuICAgIH1cbjwvc2NyaXB0PiAgICBcbiAgICBcbmA7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJ0luaXQgdHJhbnNsYXRpb25zJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9jay10cmFuc2xhdGlvbnMnKTtcbiAgICAgICAgICAgIEVtYmVkLmFzc2lnblRyYW5zbGF0aW9uc1RvRWxlbWVudChlbGVtKS50aGVuKChvKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBubyBleGNlcHRpb24gYmVjYXVzZSBvZiBkZWZhdWx0XG4gICAgICAgICAgICAgICAgZXhwZWN0KGdldERvY3VtZW50VHJhbnNsYXRpb25zKGVsZW0pLmdldFRleHQoJ25vLWtleScsJ3dpdGgtZGVmYXVsdCcpKVxuICAgICAgICAgICAgICAgICAgICAuaXMuZXF1YWwoJ3dpdGgtZGVmYXVsdCcpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGV4cGVjdChnZXREb2N1bWVudFRyYW5zbGF0aW9ucyhlbGVtKS5nZXRUZXh0KCd0ZXN0MScpKVxuICAgICAgICAgICAgICAgICAgICAuaXMuZXF1YWwoJ3h5eicpO1xuXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cblxufSk7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLFNBQVM7QUFBQSxRQUNULElBQUk7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QUEsUUFDVCxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBR0QsU0FBRyxxQkFBcUIsU0FBVSxNQUFNO0FBRXBDLFlBQUksT0FBTyxTQUFTLGVBQWUsbUJBQW1CO0FBQ3RELGNBQU0sNEJBQTRCLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTTtBQUVoRCxjQUFJLFFBQVEsU0FBUyxlQUFlLE9BQU87QUFHM0MsaUJBQU8sd0JBQXdCLElBQUksRUFBRSxRQUFRLFVBQVMsY0FBYyxDQUFDLEVBQ2hFLEdBQUcsTUFBTSxjQUFjO0FBRTVCLGlCQUFPLHdCQUF3QixJQUFJLEVBQUUsUUFBUSxPQUFPLENBQUMsRUFDaEQsR0FBRyxNQUFNLEtBQUs7QUFFbkIsZUFBSztBQUFBLFFBRVQsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQ2QsZUFBSyxDQUFDO0FBQUEsUUFDUixDQUFDO0FBQUEsTUFHTCxDQUFDO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFHTCxDQUFDOyIsCiAgIm5hbWVzIjogWyJ0eXBlIiwgInR5cGUiLCAiYSIsICJTdG9yYWdlIiwgInNlbGYiLCAibm9kZSIsICJhZGRlZE5vZGVzIiwgIl9hIiwgImdldCIsICJhIiwgIm9wdGlvbnMiLCAiQnVmZmVyU291cmNlQ29udmVydGVyIiwgInR5cGUiLCAiYSIsICJzaXplIiwgIm9mZnNldCIsICJDb252ZXJ0IiwgImNvbWJpbmUiLCAicmV0QnVmIiwgInJldFZpZXciLCAiQm9vbGVhbiIsICJTZXQiLCAiX2EiLCAibWF4IiwgInJldFZpZXciLCAic2l6ZSIsICJ0ZW1wQnVmZmVyVmlldyIsICJvZmZzZXQiLCAiZmxhZyIsICJoZXgiLCAiQXNuVHlwZVR5cGVzIiwgIkFzblByb3BUeXBlcyIsICJpbXBvcnRfcHZ0c3V0aWxzIiwgInR5cGUiLCAiQm9vbGVhbiIsICJfYSIsICJTZXQiLCAib3B0aW9ucyIsICJkZWZhdWx0Q29udmVydGVyIiwgIl9hIiwgIlNldCIsICJTZXQiLCAiaW1wb3J0X3B2dHN1dGlscyIsICJ0eXBlIiwgImlzQ29udmVydGlibGUiLCAic2NoZW1hU3RvcmFnZSIsICJpbml0X2luZGV4X2VzIiwgIkpzb25Qcm9wVHlwZXMiLCAibWluIiwgIm1heCIsICJvcHRpb25zIiwgImltcG9ydF9wdnRzdXRpbHMiLCAiT2JqZWN0SWRlbnRpZmllciIsICJpbml0X2luZGV4X2VzIiwgIm9mZnNldCIsICJvcHRpb25zIiwgImZvcm1hdCIsICJfYSIsICJ0eXBlIiwgIkVjUHVibGljS2V5IiwgInNpemUiLCAiRWRQcml2YXRlS2V5IiwgIkVkUHVibGljS2V5IiwgIkN1cnZlUHJpdmF0ZUtleSIsICJsZW4iLCAiaSIsICJzdGFydCIsICJlbmQiLCAibGVuMiIsICJvZmZzZXQiLCAiQnVmZmVyIiwgImlzSW5zdGFuY2UiLCAic2l6ZSIsICJhIiwgImNvbmNhdCIsICJzdGFydCIsICJlbmQiLCAidG9TdHJpbmciLCAiaW5zcGVjdCIsICJtYXgiLCAicmVhZCIsICJpIiwgIm9mZnNldCIsICJ3cml0ZSIsICJieXRlTGVuZ3RoIiwgIm1pbiIsICJ0eXBlIiwgIkNyeXB0byIsICJCdWZmZXIkMSIsICJhIiwgImNyeXB0byIsICJzdGFydCIsICJlbmQiLCAicHJvY2VzcyIsICJpbXBvcnRfcHZ0c3V0aWxzIiwgIkNyeXB0b0tleSIsICJBZXNDYmNQcm92aWRlciIsICJBZXNDbWFjUHJvdmlkZXIiLCAiQWVzQ3RyUHJvdmlkZXIiLCAiQWVzR2NtUHJvdmlkZXIiLCAiQWVzS3dQcm92aWRlciIsICJBZXNFY2JQcm92aWRlciIsICJSc2FQcml2YXRlS2V5IiwgIlJzYVB1YmxpY0tleSIsICJSc2FTc2FQcm92aWRlciIsICJSc2FQc3NQcm92aWRlciIsICJSc2FPYWVwUHJvdmlkZXIiLCAiRWNQcml2YXRlS2V5IiwgIkVjUHVibGljS2V5IiwgIkVjZHNhUHJvdmlkZXIiLCAiRWNkaFByb3ZpZGVyIiwgIkVkUHJpdmF0ZUtleSIsICJFZFB1YmxpY0tleSIsICJFZERzYVByb3ZpZGVyIiwgIkVjZGhFc1Byb3ZpZGVyIiwgIkVkMjU1MTlQcm92aWRlciIsICJYMjU1MTlQcm92aWRlciIsICJQYmtkZjJQcm92aWRlciIsICJIbWFjUHJvdmlkZXIiLCAiSGtkZlByb3ZpZGVyIiwgIlNoYWtlMTI4UHJvdmlkZXIiLCAiU2hha2UyNTZQcm92aWRlciIsICJTdWJ0bGVDcnlwdG8iLCAiaW5pdF9pbmRleF9lcyIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJoYXNoIiwgInR5cGUiLCAiX2EiLCAiaW5pdF9lbnVtcyIsICJuYW1lIiwgInN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJ3aW5kb3ciLCAibWluIiwgIm1heCIsICJvcHRpb25zIiwgInBvcHBlck9mZnNldHMiLCAibWluIiwgIm1heCIsICJvZmZzZXQiLCAiZWZmZWN0IiwgImluaXRfZW51bXMiLCAidG9QYWRkaW5nT2JqZWN0IiwgInBvcHBlciIsICJnZXRDb21wdXRlZFN0eWxlIiwgIm9wdGlvbnMiLCAiaW5pdF9lbnVtcyIsICJlZmZlY3QiLCAib3B0aW9ucyIsICJ3aW5kb3ciLCAiaGFzaCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiY2xpcHBpbmdQYXJlbnRzIiwgImdldENvbXB1dGVkU3R5bGUiLCAiaW5pdF9lbnVtcyIsICJyZWZlcmVuY2UiLCAiaW5pdF9lbnVtcyIsICJvcHRpb25zIiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgImluaXRfZW51bXMiLCAib3B0aW9ucyIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJhIiwgImluaXRfZW51bXMiLCAib3B0aW9ucyIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJfbG9vcCIsICJfaSIsICJjaGVja3MiLCAiaW5pdF9lbnVtcyIsICJoaWRlIiwgImluaXRfZW51bXMiLCAib2Zmc2V0IiwgIm9wdGlvbnMiLCAiaW5pdF9lbnVtcyIsICJvcHRpb25zIiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgIm1pbiIsICJtYXgiLCAiaW5pdF9lbnVtcyIsICJpbml0X2VudW1zIiwgImZuIiwgIm1lcmdlZCIsICJkZWZhdWx0TW9kaWZpZXJzIiwgImNyZWF0ZVBvcHBlciIsICJyZWZlcmVuY2UiLCAicG9wcGVyIiwgIm9wdGlvbnMiLCAiZm4iLCAic3RhdGUiLCAiZWZmZWN0IiwgIm5vb3BGbiIsICJpbml0X2VudW1zIiwgInN5bWJvbCIsICJpbml0IiwgImEiLCAiaW5pdF9jb25zdGFudHMiLCAic3ltYm9sIiwgImluaXRfY29uc3RhbnRzIiwgImRvY3VtZW50IiwgImdldFdpbmRvdyIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAiaW5pdF9sb2NhbGUiLCAibmF2aWdhdG9yIiwgImxhbmd1YWdlcyIsICJvcHRpb25zIiwgImluaXRfbG9jYWxlIiwgInRyYW5zbGF0aW9ucyIsICJpbml0X2NvbnN0YW50cyIsICJ0cmFuc2xhdGlvbnMiLCAiY29uc29sZSIsICJ0cmFuc2xhdGlvbnMiLCAiY29uY2F0IiwgInN0YXJ0IiwgImVuZCIsICJvcHRpb25zIiwgInNldCIsICJ0b2dnbGUiLCAiaW5pdF9sb2NhbGUiLCAiREVMSU1JVEVSIiwgIm9wdGlvbnMiLCAidHlwZSIsICJhIiwgImludGVybmFsIiwgInNlbGYiLCAiZG9jdW1lbnQiLCAiaW5pdF9jb25zdGFudHMiLCAiZG9jdW1lbnQiLCAiSFRNTFRlbXBsYXRlRWxlbWVudCIsICJEb2N1bWVudEZyYWdtZW50IiwgIkRvY3VtZW50IiwgImluaXRfY29uc3RhbnRzIiwgImEiLCAidHlwZSIsICJkaWZmIiwgImdldE9wZXJhdG9yIiwgInR5cGUiLCAiZG9jdW1lbnQiLCAib3B0aW9ucyIsICJ2YWx1ZSIsICJ0eXBlIiwgImUiLCAiaSIsICJzeW1ib2wiLCAiY29uZmlnIiwgImluaXRfY29uc3RhbnRzIiwgImdldFdpbmRvdyIsICJvcHRpb25zIiwgIm9wdGlvbnMiLCAiaW5pdF9jb25zdGFudHMiLCAic2VsZiIsICJmbGFnIiwgIm9wdGlvbnMiLCAiY3VzdG9tRWxlbWVudHMiLCAiaW5pdF9jb25zdGFudHMiLCAidHJhbnNsYXRpb25zIiwgIm1pbiIsICJtYXgiLCAiZ2xvYmFsUmVmZXJlbmNlIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRfY29uc3RhbnRzIiwgIm9wdGlvbnMiLCAidCIsICJpbml0X3RoZW1lIiwgImluaXRfY29uc3RhbnRzIiwgIm9wdGlvbnMiLCAiaW5pdF9wb3BwZXIiLCAidHlwZSIsICJzZWxmIiwgIm9wdGlvbnMiLCAic2hvdyIsICJyZWZlcmVuY2UiLCAiZ2V0V2luZG93IiwgImluaXRfdGFicyIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X3RoZW1lIiwgImluaXRfcG9wcGVyIiwgImluaXRfbG9jYWxlIiwgImRvY3VtZW50IiwgImluaXRfY29uc3RhbnRzIiwgImluaXRDb250cm9sUmVmZXJlbmNlcyIsICJjb250cm9sRWxlbWVudFN5bWJvbCIsICJpbml0RXZlbnRIYW5kbGVyIiwgImdldFRlbXBsYXRlIiwgImluaXRfbWVzc2FnZSIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2NvbnN0YW50cyIsICJpbml0Q29udHJvbFJlZmVyZW5jZXMiLCAiY29udHJvbEVsZW1lbnRTeW1ib2wiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9ub3RpZnkiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9tZXNzYWdlIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRDb250cm9sUmVmZXJlbmNlcyIsICJpbml0RXZlbnRIYW5kbGVyIiwgInNlbGYiLCAibWluIiwgIm1heCIsICJhcHBseSIsICJnZXRUZW1wbGF0ZSIsICJpbml0X3NwbGl0X3BhbmVsIiwgImluaXRfbm90aWZ5IiwgImluaXRfY29uc3RhbnRzIiwgImF0dGFjaFJlc2l6ZU9ic2VydmVyIiwgInJlc2l6ZU9ic2VydmVyU3ltYm9sIiwgInRpbWVyQ2FsbGJhY2tTeW1ib2wiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImluaXRFdmVudEhhbmRsZXIiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9wYW5lbCIsICJvcHRpb25zIiwgIm9ic2VydmVyIiwgImxvYWRDb250ZW50IiwgImdldFRlbXBsYXRlIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRFdmVudEhhbmRsZXIiLCAic2VsZiIsICJ0eXBlIiwgImluaXRDb250cm9sUmVmZXJlbmNlcyIsICJnZXRUZW1wbGF0ZSIsICJpbml0X2J1dHRvbiIsICJpbml0X2NvbnN0YW50cyIsICJvcHRpb25zIiwgImluaXRfY29uc3RhbnRzIiwgImludGVybmFsU3ltYm9sIiwgImdldFRlbXBsYXRlIiwgImluaXRfc3RhdGVfYnV0dG9uIiwgImluaXRfYnV0dG9uIiwgInN0eWxlcyIsICJhIiwgInN0YXJ0IiwgImVuZCIsICJtYXgiLCAibWluIiwgImdldE9wcG9zaXRlUGxhY2VtZW50IiwgInJlY3RUb0NsaWVudFJlY3QiLCAicGxhY2VtZW50cyIsICJyb3VuZCIsICJyZWZlcmVuY2UiLCAiZGV0ZWN0T3ZlcmZsb3ciLCAib3B0aW9ucyIsICJwbGF0Zm9ybSIsICJyZWN0VG9DbGllbnRSZWN0IiwgImFycm93IiwgImZsaXAiLCAib2Zmc2V0IiwgImNvbmZpZyIsICJmbiIsICJtaW4iLCAibWF4IiwgInBsYWNlbWVudHMiLCAiYWxpZ25tZW50IiwgImEiLCAiZ2V0T3Bwb3NpdGVQbGFjZW1lbnQiLCAic2lkZXMiLCAic2lkZSIsICJwbGFjZW1lbnQiLCAib3ZlcmZsb3ciLCAieCIsICJ5IiwgImFwcGx5IiwgImdldE5vZGVOYW1lIiwgImlzTm9kZSIsICJnZXRXaW5kb3ciLCAiZ2V0RG9jdW1lbnRFbGVtZW50IiwgImlzRWxlbWVudCIsICJpc0hUTUxFbGVtZW50IiwgImlzU2hhZG93Um9vdCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImlzVGFibGVFbGVtZW50IiwgImdldENvbnRhaW5pbmdCbG9jayIsICJnZXRQYXJlbnROb2RlIiwgImdldE5vZGVTY3JvbGwiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJpc0hUTUxFbGVtZW50IiwgInJvdW5kIiwgImlzRWxlbWVudCIsICJnZXRXaW5kb3ciLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgImxlZnQiLCAidG9wIiwgInJlY3RUb0NsaWVudFJlY3QiLCAiZ2V0V2luZG93U2Nyb2xsQmFyWCIsICJnZXROb2RlU2Nyb2xsIiwgImdldERvY3VtZW50RWxlbWVudCIsICJnZXROb2RlTmFtZSIsICJnZXREb2N1bWVudFJlY3QiLCAibWF4IiwgImdldFZpZXdwb3J0UmVjdCIsICJnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdCIsICJnZXRQYXJlbnROb2RlIiwgImdldENsaXBwaW5nUmVjdCIsICJtaW4iLCAiZ2V0VHJ1ZU9mZnNldFBhcmVudCIsICJnZXRPZmZzZXRQYXJlbnQiLCAiaXNUYWJsZUVsZW1lbnQiLCAiZ2V0Q29udGFpbmluZ0Jsb2NrIiwgImEiLCAib3B0aW9ucyIsICJyZWZlcmVuY2UiLCAiZGV0ZWN0T3ZlcmZsb3ciLCAib2Zmc2V0IiwgImF1dG9QbGFjZW1lbnQiLCAic2hpZnQiLCAiZmxpcCIsICJzaXplIiwgImFycm93IiwgImNvbXB1dGVQb3NpdGlvbiIsICJvcHRpb25zIiwgImNvbmZpZyIsICJmbiIsICJmbGlwIiwgInNoaWZ0IiwgImxpbmUiLCAiYXV0b1BsYWNlbWVudCIsICJkZXRlY3RPdmVyZmxvdyIsICJhcnJvdyIsICJzaXplIiwgIm9mZnNldCIsICJjb21wdXRlUG9zaXRpb24iLCAieCIsICJ5IiwgImluaXRfY29uc3RhbnRzIiwgInBvcHBlckVsZW1lbnRTeW1ib2wiLCAiZ2V0VHJhbnNsYXRpb25zIiwgInNlbGYiLCAiaW5pdE9wdGlvbnNGcm9tQXJndW1lbnRzIiwgIm9wdGlvbnMiLCAiYXR0YWNoUmVzaXplT2JzZXJ2ZXIiLCAicmVzaXplT2JzZXJ2ZXJTeW1ib2wiLCAidGltZXJDYWxsYmFja1N5bWJvbCIsICJkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIiLCAib2JzZXJ2ZXIiLCAicnVuIiwgInNob3ciLCAiaGlkZSIsICJpbml0T3B0aW9uT2JzZXJ2ZXIiLCAidHJhbnNsYXRpb25zIiwgIm1heCIsICJzdHlsZXMiLCAiY29udHJvbEVsZW1lbnRTeW1ib2wiLCAiZm9jdXNGaWx0ZXIiLCAidHlwZSIsICJhIiwgImdsb2JhbCIsICJpbml0RXZlbnRIYW5kbGVyIiwgImNsb3NlRXZlbnRIYW5kbGVyIiwgImVsZW1lbnQiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImNvbnRhaW5lckVsZW1lbnRTeW1ib2wiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9zZWxlY3QiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9sb2NhbGUiLCAiZG9jdW1lbnQiLCAiZmxhZyIsICJpbml0X3BvcHBlciIsICJpbml0X2NvbnN0YW50cyIsICJpbml0RXZlbnRIYW5kbGVyIiwgImNsb3NlRXZlbnRIYW5kbGVyIiwgImhpZGUiLCAiYnV0dG9uRWxlbWVudFN5bWJvbCIsICJhdHRhY2hSZXNpemVPYnNlcnZlciIsICJyZXNpemVPYnNlcnZlclN5bWJvbCIsICJ0aW1lckNhbGxiYWNrU3ltYm9sIiwgInVwZGF0ZVBvcHBlciIsICJkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIiLCAic2VsZiIsICJwb3BwZXJFbGVtZW50U3ltYm9sIiwgImNvbnRyb2xFbGVtZW50U3ltYm9sIiwgInNob3ciLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImdldFRlbXBsYXRlIiwgImluaXRfcG9wcGVyIiwgImluaXRfY29uc3RhbnRzIiwgImRvY3VtZW50IiwgInR5cGUiLCAiUG9wcGVyIiwgImluaXRfcG9wcGVyIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRFdmVudEhhbmRsZXIiLCAiY2xvc2VFdmVudEhhbmRsZXIiLCAiYXR0YWNoUmVzaXplT2JzZXJ2ZXIiLCAicmVzaXplT2JzZXJ2ZXJTeW1ib2wiLCAidGltZXJDYWxsYmFja1N5bWJvbCIsICJ1cGRhdGVQb3BwZXIiLCAiZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyIiwgInBvcHBlckVsZW1lbnRTeW1ib2wiLCAiY29udHJvbEVsZW1lbnRTeW1ib2wiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImJ1dHRvbkVsZW1lbnRTeW1ib2wiLCAiYXJyb3dFbGVtZW50U3ltYm9sIiwgImdldFRlbXBsYXRlIiwgImluaXRfcG9wcGVyX2J1dHRvbiIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X3BvcHBlciIsICJpbml0X2J1dHRvbiIsICJQb3BwZXIiLCAic3R5bGVzIiwgImRvY3VtZW50IiwgInR5cGUiLCAib3B0aW9ucyIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2NvbnN0YW50cyIsICJpbml0RXZlbnRIYW5kbGVyQnlNb2RlIiwgImJ1dHRvbkVsZW1lbnRTeW1ib2wiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImdldFRlbXBsYXRlIiwgImluaXRfbWVzc2FnZV9zdGF0ZV9idXR0b24iLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9wb3BwZXIiLCAiaW5pdF9zdGF0ZV9idXR0b24iLCAiUG9wcGVyIiwgInN0eWxlcyIsICJvcHRpb25zIiwgInR5cGUiLCAic2VsZiIsICJpbml0Q29udHJvbFJlZmVyZW5jZXMiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9jb25maXJtX2J1dHRvbiIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2J1dHRvbiIsICJpbml0X3BvcHBlcl9idXR0b24iLCAiaW5pdF9tZXNzYWdlX3N0YXRlX2J1dHRvbiIsICJzdHlsZXMiLCAiTm9kZUxpc3QiLCAiTm9kZSIsICJzZWxmIiwgIk5vZGUiLCAiTm9kZUxpc3QiLCAib3B0aW9ucyIsICJOb2RlIiwgIk5vZGVMaXN0IiwgIk5vZGVMaXN0IiwgIk5vZGUiLCAiaW5pdF9jb25zdGFudHMiLCAiaGFuZGxlT3B0aW9uS2V5Ym9hcmRFdmVudHMiLCAiTm9kZSIsICJpbml0RXZlbnRIYW5kbGVyIiwgImEiLCAia2V5RXZlbnRIYW5kbGVyIiwgImluaXRPcHRpb25zRnJvbUFyZ3VtZW50cyIsICJvcHRpb25zIiwgImdldFRlbXBsYXRlIiwgImluaXRfdHJlZV9zZWxlY3QiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9zZWxlY3QiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgInN3aXRjaEVsZW1lbnRTeW1ib2wiLCAiaW5pdEV2ZW50SGFuZGxlciIsICJzZWxmIiwgImdldFRlbXBsYXRlIiwgImluaXRfdG9nZ2xlX3N3aXRjaCIsICJpbml0X2NvbnN0YW50cyIsICJnZXRXaW5kb3ciLCAiVGVtcGxhdGUiLCAiaW5pdE9wdGlvbnNGcm9tQXJndW1lbnRzIiwgIm9wdGlvbnMiLCAiaW5pdEludGVyc2VjdGlvbk9ic2VydmVyIiwgImludGVyc2VjdGlvbk9ic2VydmVyV2FzSW5pdGlhbGl6ZWQiLCAib2JzZXJ2ZXIiLCAibG9hZENvbnRlbnQiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF90ZW1wbGF0ZSIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2NvbnN0YW50cyIsICJvcHRpb25zIiwgInRyYW5zbGF0aW9ucyIsICJkb2N1bWVudCIsICJ3aW5kb3ciLCAiZ2V0V2luZG93IiwgIm9wdGlvbnMiLCAib3B0aW9ucyIsICJwYXJzZU9wdGlvbnNKU09OIiwgIktFWV9ET0NVTUVOVCIsICJpbml0X2NvbnN0YW50cyIsICJvcHRpb25zIiwgInNlbGYiLCAiZG9jdW1lbnQiLCAiS0VZX0RPQ1VNRU5UIiwgImFwcGVuZFRvRG9jdW1lbnQiLCAiaW5pdF9jb25zdGFudHMiLCAic2VsZiIsICJjcmVhdGVFbGVtZW50IiwgImRvY3VtZW50IiwgIktFWV9ET0NVTUVOVCIsICJpbml0X2NvbnN0YW50cyIsICJjcmVhdGVFbGVtZW50IiwgImRvY3VtZW50IiwgIktFWV9ET0NVTUVOVCIsICJpbml0X2NvbnN0YW50cyIsICJ0eXBlIiwgIm9wdGlvbnMiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9jb25zdGFudHMiLCAid2luZG93IiwgImdldFdpbmRvdyIsICJ2ZXJzaW9uIiwgImV2ZW50IiwgImdldFRlbXBsYXRlIiwgImluaXRfY29uZmlnX21hbmFnZXIiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImluaXRFdmVudEhhbmRsZXIiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9ob3N0IiwgImluaXRfbm90aWZ5IiwgImluaXRfbG9jYWxlIiwgImluaXRfY29uZmlnX21hbmFnZXIiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgIm92ZXJsYXlFbGVtZW50U3ltYm9sIiwgImluaXRFdmVudEhhbmRsZXIiLCAiZ2V0VGVtcGxhdGUiLCAiaW5pdF9vdmVybGF5IiwgImluaXRfbm90aWZ5IiwgImluaXRfY29uc3RhbnRzIiwgImdldFdpbmRvdyIsICJpbml0X3V0aWwiLCAiaW5pdF9jb25zdGFudHMiLCAiQVRUUklCVVRFX0JVVFRPTl9MQUJFTCIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2NvbnN0YW50cyIsICJyZXNpemVPYnNlcnZlclN5bWJvbCIsICJpbml0RXZlbnRIYW5kbGVyIiwgImluaXRDb250cm9sUmVmZXJlbmNlcyIsICJjb250cm9sRWxlbWVudFN5bWJvbCIsICJkb2N1bWVudCIsICJ0aW1lckNhbGxiYWNrU3ltYm9sIiwgImdldFRlbXBsYXRlIiwgImluaXRfY29sbGFwc2UiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdF9ob3N0IiwgImluaXRfdXRpbCIsICJnZXRUcmFuc2xhdGlvbnMiLCAiaW5pdENvbnRyb2xSZWZlcmVuY2VzIiwgImJ1dHRvbkVsZW1lbnRTeW1ib2wiLCAiaW5pdEV2ZW50SGFuZGxlciIsICJBVFRSSUJVVEVfQlVUVE9OX0xBQkVMIiwgImdldFRlbXBsYXRlIiwgImluaXRfZGV0YWlscyIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X3V0aWwiLCAiaW5pdF9jb2xsYXBzZSIsICJpbml0X2xvY2FsZSIsICJEZXRhaWxzIiwgImluaXRfZGV0YWlscyIsICJpbnRlcm5hbENvdW50ZXIiLCAiYSIsICJpbml0X3V0aWwiLCAiX19kZWZQcm9wIiwgIl9fZ2V0T3duUHJvcE5hbWVzIiwgIl9fY29tbW9uSlMiLCAiX19yZXF1aXJlIiwgIl9fZXhwb3J0IiwgImlzTmFOMiIsICJvcHRpb25zIiwgImVuZCIsICJzaXplIiwgImlzTmFOIiwgImVzY2FwZSIsICJpc1ByaW1pdGl2ZSIsICJmbiIsICJhIiwgImlzT2JqZWN0IiwgInN0YXJ0IiwgImNvbnRhaW5zIiwgImZsYWciLCAiaXNIVE1MRWxlbWVudCIsICJjb250YWlucyIsICJvcHRpb25zIiwgIndpbmRvdyIsICJTdG9yYWdlIiwgImV4cGVjdCIsICJnbG9iYWwiLCAiVGFicyIsICJDcnlwdG8iLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJDcnlwdG8iLCAiU3BsaXRTY3JlZW4iLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJTcGxpdFNjcmVlbiIsICJDcnlwdG8iLCAiZ2xvYmFsIiwgIm9wdGlvbnMiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJSZWxvYWQiLCAidmlld3BvcnQiLCAiZmV0Y2hSZWZlcmVuY2UiLCAib3B0aW9ucyIsICJleHBlY3QiLCAiZ2xvYmFsIiwgImh0bWwxIiwgIlN0YXRlQnV0dG9uIiwgIm9wdGlvbnMiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJodG1sMiIsICJTZWxlY3QiLCAib3B0aW9ucyIsICJlIiwgImEiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJodG1sMiIsICJDb25maXJtQnV0dG9uIiwgIm9wdGlvbnMiLCAicGFyc2VPcHRpb25zSlNPTiIsICJzZWxmIiwgImV4cGVjdCIsICJnbG9iYWwiLCAiaHRtbDEiLCAiaHRtbDIiLCAiVHJlZVNlbGVjdCIsICJmZXRjaFJlZmVyZW5jZSIsICJvcHRpb25zIiwgImUiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJodG1sMiIsICJCdXR0b24iLCAib3B0aW9ucyIsICJleHBlY3QiLCAiZ2xvYmFsIiwgImh0bWwxIiwgImh0bWwyIiwgIlRvZ2dsZVN3aXRjaCIsICJleHBlY3QiLCAiZ2xvYmFsIiwgIm1vY2tpbnRlcnNlY3Rpb25vYnNlcnZlciIsICJodG1sMSIsICJUZW1wbGF0ZSIsICJ2aWV3cG9ydCIsICJmZXRjaFJlZmVyZW5jZSIsICJvcHRpb25zIiwgImV4cGVjdCIsICJNZXNzYWdlIiwgImV4cGVjdCIsICJOb3RpZnkiLCAiTm90aWZ5IiwgImV4cGVjdCIsICJtdXRhdGlvbm9ic2VydmVyIiwgImV4cGVjdCIsICJnbG9iYWwiLCAiaHRtbDEiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJpbml0X3V0aWwiLCAiZXhwZWN0IiwgImdsb2JhbCIsICJodG1sMSIsICJhIiwgIm9wdGlvbnMiLCAic3RhcnQiLCAiZW5kIiwgIm9wdGlvbnMiLCAicmFuZG9tIiwgImEiLCAibWF4IiwgImEiLCAiZGlmZiIsICJhIiwgImEiLCAiYSIsICJjb25zb2xlIiwgImEiLCAiYSIsICJoYW5kbGVyIiwgIk1lc3NhZ2UiLCAic2VsZiIsICJNZXNzYWdlIiwgIm9wdGlvbnMiLCAiaXNOb2RlIiwgIk1lc3NhZ2UiLCAiTWVzc2FnZSIsICJ2ZXJzaW9uIiwgImEiLCAibW9uc3RlclZlcnNpb24iLCAiZ2V0V2luZG93IiwgImdldFdpbmRvdyIsICJpbml0IiwgImV4cGVjdCIsICJleHBlY3QiLCAiZXhwZWN0IiwgImV4cGVjdCIsICJleHBlY3QiLCAiZXhwZWN0IiwgImZldGNoUmVmZXJlbmNlIiwgIm11dGF0aW9ub2JzZXJ2ZXIiLCAiYWRkZWROb2RlcyIsICJvcHRpb25zIiwgImV4cGVjdCIsICJlIiwgIm9wdGlvbnMiLCAiaW5pdE9wdGlvbnNGcm9tQXR0cmlidXRlcyIsICJnbG9iYWwiLCAiYSIsICJleHBlY3QiLCAiaHRtbDEiLCAiaHRtbDIiLCAiVXBkYXRlciIsICJvcHRpb25zIiwgInYiLCAiYSIsICJpbml0X2xvY2FsZSIsICJhIiwgImV4cGVjdCIsICJodG1sMSIsICJodG1sMiIsICJDdXN0b21FbGVtZW50IiwgInJlZ2lzdGVyQ3VzdG9tRWxlbWVudCIsICJkb2N1bWVudCIsICJhZGRPYmplY3RXaXRoVXBkYXRlclRvRWxlbWVudCIsICJvcHRpb25zIiwgImEiLCAic2V0IiwgInYiLCAid2luZG93UmVhZHkiLCAiZG9tUmVhZHkiLCAiZ2V0V2luZG93IiwgImEiLCAiZXhwZWN0IiwgIkN1c3RvbUVsZW1lbnQiLCAicmVnaXN0ZXJDdXN0b21FbGVtZW50IiwgImRvY3VtZW50IiwgImNvbnRyb2wiLCAiaHRtbDEiLCAiaHRtbDIiLCAiaHRtbDMiLCAic3ltYm9sIiwgImEiLCAiUmVzb3VyY2UiLCAiZmV0Y2hSZWZlcmVuY2UiLCAib3B0aW9ucyIsICJleHBlY3QiLCAiaHRtbDEiLCAiQ3VzdG9tQ29udHJvbCIsICJyZWdpc3RlckN1c3RvbUVsZW1lbnQiLCAiZG9jdW1lbnQiLCAibSIsICJpbml0X2NvbnN0YW50cyIsICJhIiwgIm9wdGlvbnMiLCAiZG9EaWZmIiwgInR5cGUiLCAiV2ViQ29ubmVjdCIsICJvcHRpb25zIiwgIk1lc3NhZ2UiLCAidGVzdFVybCIsICJXZWJDb25uZWN0IiwgImNsb25lIiwgIm9wdGlvbnMiLCAiaW5pdCIsICJmZXRjaERhdGEiLCAicmVhZCIsICJ3cml0ZSIsICJmZXRjaFJlZmVyZW5jZSIsICJvcHRpb25zIiwgInJlc29sdmUiLCAicmVqZWN0IiwgImkiLCAiYSIsICJpbml0X2xvY2FsZSIsICJpc05vZGUiLCAiYSIsICJiIiwgImMiLCAiaHRtbDEiLCAiYSIsICJOb2RlTGlzdCIsICJhIiwgImEiLCAiYSIsICJodG1sMSIsICJhIiwgInNlbGYiLCAiYSIsICJhIiwgImEiLCAiTm9kZUxpc3QiLCAiTm9kZSIsICJhIiwgImEiLCAiYSIsICJhIiwgImEiLCAiYSIsICJhIiwgIm1heCIsICJhIiwgIlJhbmRvbUlEIiwgIlVVSUQiLCAiYSIsICJCYXNlIiwgImEiLCAiYSIsICJOb2RlTGlzdCIsICJOb2RlIiwgIk5vZGUiLCAiTm9kZUxpc3QiLCAiRm9ybWF0dGVyIiwgIm9wdGlvbnMiLCAidHJhbnNsYXRpb25zIiwgIkZvcm1hdHRlciIsICJhIiwgImEiLCAiaW5pdF9jb25zdGFudHMiLCAiaHRtbDEiLCAidHJhbnNsYXRpb25zTGlua1N5bWJvbCIsICJvcHRpb25zIiwgImdsb2JhbCIsICJmZXRjaFJlZmVyZW5jZSIsICJvcHRpb25zIiwgImdsb2JhbCIsICJodG1sMSIsICJlIiwgImV4cGVjdCIsICJodG1sMSJdCn0K } catch (e) { document.getElementById('mocha-errors').insertAdjacentHTML('afterbegin', e ); document.getElementById('mocha-stats').style.backgroundColor = 'red'; }