From 1781abda91d9fe2d16c9752f6d52e85cedd3bb40 Mon Sep 17 00:00:00 2001 From: hanfi <ccc@spahan.ch> Date: Fri, 11 Aug 2023 22:05:43 +0200 Subject: [PATCH] fix auth --- dist/bundle.js | 2 +- src/js/main.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dist/bundle.js b/dist/bundle.js index f8c4fca..7d22278 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -17,7 +17,7 @@ var lib; /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemByTag: () => (/* binding */ addItemByTag),\n/* harmony export */ addItemImage: () => (/* binding */ addItemImage),\n/* harmony export */ addItemScan: () => (/* binding */ addItemScan),\n/* harmony export */ checkinItems: () => (/* binding */ checkinItems),\n/* harmony export */ checkoutByTag: () => (/* binding */ checkoutByTag),\n/* harmony export */ checkoutItem: () => (/* binding */ checkoutItem),\n/* harmony export */ decreaseItemCount: () => (/* binding */ decreaseItemCount),\n/* harmony export */ increaseItemCount: () => (/* binding */ increaseItemCount),\n/* harmony export */ loadStorages: () => (/* binding */ loadStorages),\n/* harmony export */ onPageLoad: () => (/* binding */ onPageLoad),\n/* harmony export */ onTagInputChanged: () => (/* binding */ onTagInputChanged),\n/* harmony export */ onTagTextUpdate: () => (/* binding */ onTagTextUpdate),\n/* harmony export */ scanReceiver: () => (/* binding */ scanReceiver),\n/* harmony export */ stopScanningItem: () => (/* binding */ stopScanningItem)\n/* harmony export */ });\n/* harmony import */ var html5_qrcode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! html5-qrcode */ \"./node_modules/html5-qrcode/esm/index.js\");\n/* harmony import */ var _noble_curves_ed448__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @noble/curves/ed448 */ \"./node_modules/@noble/curves/esm/ed448.js\");\n/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\n\nvar currentlyAddingItemByTag = new Map();\nvar received_items = {};\nvar config;\nvar scanner = new html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScanner(\"reader\", {\n fps: 10,\n qrbox: {\n width: 250,\n height: 250\n },\n showTorchButtonIfSupported: true,\n formatsToSupport: [html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeSupportedFormats.QR_CODE],\n //there are many other types of codes on the labels we do not want\n rememberLastUsedCamera: true\n});\nvar scanner_audio = new Audio(\"/beep.wav\");\nscanner_audio.load();\nvar toastDiv = document.getElementById(\"bottomToast\");\n\n/*\n * Helper functions\n */\nfunction htoa(h) {\n return Uint8Array.from(buffer__WEBPACK_IMPORTED_MODULE_2__.Buffer.from(h, \"hex\"));\n}\nfunction toast(title, message) {\n toastDiv.children[0].children[0].innerHTML = title;\n toastDiv.children[1].innerHTML = message;\n toastDiv.classList.remove(\"hide\");\n toastDiv.classList.add(\"show\");\n toastDiv.classList.add(\"showing\");\n setTimeout(function () {\n toastDiv.classList.remove(\"show\");\n toastDiv.classList.remove(\"showing\");\n toastDiv.classList.add(\"hide\");\n }, 3000);\n}\nfunction fetchWithAuth(_x, _x2) {\n return _fetchWithAuth.apply(this, arguments);\n}\nfunction _fetchWithAuth() {\n _fetchWithAuth = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(input, init) {\n var response;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n if (init == undefined || init == null) {\n init = {};\n }\n if (init[\"headers\"] == null) {\n init[\"headers\"] = {};\n }\n if (window.sessionStorage.getItem(\"access_token\")) {\n _context.next = 5;\n break;\n }\n _context.next = 5;\n return login();\n case 5:\n init[\"headers\"][\"Authorization\"] = \"Bearer \" + window.sessionStorage.getItem(\"access_token\");\n _context.next = 8;\n return fetch(input, init);\n case 8:\n response = _context.sent;\n case 9:\n if (!(response.status == 401)) {\n _context.next = 19;\n break;\n }\n console.log(\"Fetch with auth failed for\", input);\n _context.next = 13;\n return login();\n case 13:\n init[\"headers\"][\"Authorization\"] = \"Bearer \" + window.sessionStorage.getItem(\"access_token\");\n _context.next = 16;\n return fetch(input, init);\n case 16:\n response = _context.sent;\n _context.next = 9;\n break;\n case 19:\n return _context.abrupt(\"return\", response);\n case 20:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return _fetchWithAuth.apply(this, arguments);\n}\nfunction checkResponseForError(_x3, _x4) {\n return _checkResponseForError.apply(this, arguments);\n}\nfunction _checkResponseForError() {\n _checkResponseForError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(response, message) {\n var content;\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(response.status !== 200)) {\n _context2.next = 7;\n break;\n }\n _context2.next = 3;\n return response.text();\n case 3:\n content = _context2.sent;\n console.log(\"Got Response Error:\", message, response);\n alert(message + \"; Status: \" + response.status + \"; Content: \" + content);\n return _context2.abrupt(\"return\", false);\n case 7:\n return _context2.abrupt(\"return\", true);\n case 8:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return _checkResponseForError.apply(this, arguments);\n}\nfunction getConfig() {\n return _getConfig.apply(this, arguments);\n}\nfunction _getConfig() {\n _getConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n var config_request;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n if (!(config == undefined)) {\n _context3.next = 12;\n break;\n }\n _context3.next = 3;\n return fetch(\"config.json\");\n case 3:\n config_request = _context3.sent;\n console.log(\"Loading config\");\n _context3.next = 7;\n return checkResponseForError(config_request, \"Could not load config\");\n case 7:\n if (!_context3.sent) {\n _context3.next = 12;\n break;\n }\n _context3.next = 10;\n return config_request.json();\n case 10:\n config = _context3.sent;\n console.log(\"Loaded config\");\n case 12:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n return _getConfig.apply(this, arguments);\n}\nfunction login(_x5) {\n return _login.apply(this, arguments);\n}\nfunction _login() {\n _login = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(passwordToTry) {\n var loginSuccess, password, form, response, result;\n return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n console.log(\"Performing login\");\n loginSuccess = false;\n case 2:\n if (passwordToTry !== undefined) {\n console.log(\"Using password to try from parameter\");\n password = passwordToTry;\n passwordToTry = undefined;\n } else {\n console.log(\"Prompting user for shared secret.\");\n password = prompt(\"provide the shared secret\");\n }\n form = new FormData();\n form.append(\"grant_type\", \"password\");\n form.append(\"username\", \"worker\");\n form.append(\"password\", password);\n console.log(\"Requesting token.\");\n _context4.next = 10;\n return fetch(config.backend_url + \"/token\", {\n method: \"POST\",\n body: form\n });\n case 10:\n response = _context4.sent;\n _context4.next = 13;\n return checkResponseForError(response, \"Login failed\");\n case 13:\n if (!_context4.sent) {\n _context4.next = 20;\n break;\n }\n _context4.next = 16;\n return response.json();\n case 16:\n result = _context4.sent;\n console.log(\"Got token\");\n window.sessionStorage.setItem(\"access_token\", result.access_token);\n loginSuccess = true;\n case 20:\n if (!loginSuccess) {\n _context4.next = 2;\n break;\n }\n case 21:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return _login.apply(this, arguments);\n}\nfunction updateItemsView() {\n console.log(\"Updating items view\");\n var items = document.querySelector(\"#items\");\n items.innerHTML = \"\";\n for (var item in received_items) {\n var li = document.createElement(\"li\");\n console.log(item);\n console.log(received_items[item]);\n li.innerHTML = \"<div id=\\\"item_\" + received_items[item].item.uuid + \"\\\" class=\\\"alert alert-success\\\" role=\\\"alert\\\">\" + received_items[item].item.tag + \" (\" + received_items[item].item.addressee + \", \" + received_items[item].item.team + \")\" + \" <span class=\\\"badge badge-light\\\">\" + received_items[item].num + \"</span>\" + \" <button class=\\\"btn btn-primary\\\" onclick=\\\"lib.increaseItemCount('\" + received_items[item].item.uuid + \"')\\\">+</button>\" + \" <button class=\\\"btn btn-primary\\\" onclick=\\\"lib.decreaseItemCount('\" + received_items[item].item.uuid + \"')\\\">-</button></div>\";\n items.appendChild(li);\n }\n}\n\n/*\n * various add Items functions\n */\n\nfunction onTagTextUpdate(_x6) {\n return _onTagTextUpdate.apply(this, arguments);\n}\nfunction _onTagTextUpdate() {\n _onTagTextUpdate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(element) {\n return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(element.value.length == 0)) {\n _context5.next = 5;\n break;\n }\n element.setCustomValidity(\"\");\n element.classList.remove(\"is-invalid\");\n _context5.next = 12;\n break;\n case 5:\n if (!(element.value.length != 6)) {\n _context5.next = 11;\n break;\n }\n element.setCustomValidity(\"Code must be 6 chars long.\");\n element.classList.add(\"is-invalid\");\n return _context5.abrupt(\"return\");\n case 11:\n tagEntered(element);\n case 12:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return _onTagTextUpdate.apply(this, arguments);\n}\nfunction onTagInputChanged(_x7) {\n return _onTagInputChanged.apply(this, arguments);\n}\nfunction _onTagInputChanged() {\n _onTagInputChanged = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(element) {\n return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n // Element lost focus or user pressed enter\n if (element.value.length == 6) {\n tagEntered(element);\n } else {\n element.reportValidity();\n }\n case 1:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6);\n }));\n return _onTagInputChanged.apply(this, arguments);\n}\nfunction tagEntered(_x8) {\n return _tagEntered.apply(this, arguments);\n}\nfunction _tagEntered() {\n _tagEntered = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(element) {\n var tag, succ;\n return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n tag = element.value;\n console.log(\"Tag Entered\", tag);\n if (!currentlyAddingItemByTag.has(tag)) {\n _context7.next = 4;\n break;\n }\n return _context7.abrupt(\"return\");\n case 4:\n currentlyAddingItemByTag.set(tag, \"\");\n _context7.next = 7;\n return addItemByTag(element.value);\n case 7:\n succ = _context7.sent;\n if (succ) {\n element.classList.remove(\"is-invalid\");\n element.value = \"\";\n element.setCustomValidity(\"\");\n } else {\n element.setCustomValidity(\"Unknown item\");\n element.classList.add(\"is-invalid\");\n }\n element.reportValidity();\n currentlyAddingItemByTag[\"delete\"](tag);\n case 11:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n return _tagEntered.apply(this, arguments);\n}\nfunction addItemByTag(_x9) {\n return _addItemByTag.apply(this, arguments);\n}\nfunction _addItemByTag() {\n _addItemByTag = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(tag) {\n var response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n if (!(tag.length != 6)) {\n _context8.next = 2;\n break;\n }\n throw \"Internal Error: Tag not length 6.\";\n case 2:\n tag = tag.toLowerCase();\n console.log(\"Trying to add item by tag:\", tag);\n _context8.next = 6;\n return fetchWithAuth(config.backend_url + \"/tag/\" + tag);\n case 6:\n response = _context8.sent;\n if (!(response.status == 200)) {\n _context8.next = 19;\n break;\n }\n _context8.next = 10;\n return response.json();\n case 10:\n tracking_item = _context8.sent;\n if (tracking_item.received_at != null && tracking_item.deployed_at == null) {\n alert(\"item already checked in at \" + tracking_item.storage);\n }\n if (tracking_item.uuid in received_items) {\n received_items[tracking_item.uuid].num += 1;\n } else {\n received_items[tracking_item.uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n }\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by tag\");\n return _context8.abrupt(\"return\", true);\n case 19:\n if (!(response.status == 404)) {\n _context8.next = 24;\n break;\n }\n console.log(\"Item not found\");\n return _context8.abrupt(\"return\", false);\n case 24:\n checkResponseForError(response, \"Failed to get item from backend\");\n return _context8.abrupt(\"return\", false);\n case 26:\n case \"end\":\n return _context8.stop();\n }\n }, _callee8);\n }));\n return _addItemByTag.apply(this, arguments);\n}\nfunction handleQrError(_x10, _x11) {\n return _handleQrError.apply(this, arguments);\n}\nfunction _handleQrError() {\n _handleQrError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(msg, err) {\n return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n return _context9.abrupt(\"return\");\n case 1:\n case \"end\":\n return _context9.stop();\n }\n }, _callee9);\n }));\n return _handleQrError.apply(this, arguments);\n}\nfunction debounceScanner() {\n if (scanner.getState() != html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScannerState.SCANNING) {\n return;\n }\n scanner.pause(false);\n setTimeout(function () {\n if (scanner.getState() == html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScannerState.PAUSED) {\n scanner.resume();\n }\n }, 1000);\n}\nfunction handleItemScanResult(_x12) {\n return _handleItemScanResult.apply(this, arguments);\n}\nfunction _handleItemScanResult() {\n _handleItemScanResult = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(item_uuid) {\n var response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n debounceScanner();\n if (!(item_uuid.length == 36)) {\n _context10.next = 28;\n break;\n }\n console.log(\"Trying to add item by uuid (scanned)\");\n if (!(item_uuid in received_items)) {\n _context10.next = 10;\n break;\n }\n received_items[item_uuid].num += 1;\n console.log(\"Increased count of existing item uuid\");\n updateItemsView();\n scanner_audio.play();\n _context10.next = 26;\n break;\n case 10:\n received_items[item_uuid] = {\n \"num\": 1,\n \"item\": null\n };\n _context10.next = 13;\n return fetchWithAuth(config.backend_url + \"/item/\" + item_uuid);\n case 13:\n response = _context10.sent;\n if (!(response.status == 200)) {\n _context10.next = 25;\n break;\n }\n _context10.next = 17;\n return response.json();\n case 17:\n tracking_item = _context10.sent;\n if (tracking_item.received_at != null && tracking_item.deployed_at == null) {\n alert(\"item already checked in at \" + tracking_item.storage);\n }\n received_items[item_uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by uuid.\");\n _context10.next = 26;\n break;\n case 25:\n if (response.status == 404) {\n alert(\"Item not found\");\n console.log(\"Item not found\");\n } else {\n alert(response.status);\n checkResponseForError(response, \"Failed to get item from backend\");\n }\n case 26:\n _context10.next = 29;\n break;\n case 28:\n alert(\"QR Code is not a bgp checkin code.\");\n case 29:\n case \"end\":\n return _context10.stop();\n }\n }, _callee10);\n }));\n return _handleItemScanResult.apply(this, arguments);\n}\nfunction addItemScan() {\n return _addItemScan.apply(this, arguments);\n}\nfunction _addItemScan() {\n _addItemScan = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {\n return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n console.log(\"Starting scanner\");\n scanner.render(handleItemScanResult, handleQrError);\n document.getElementById(\"startScan\").style.display = \"none\";\n document.getElementById(\"stopScan\").style.display = \"inline-block\";\n case 4:\n case \"end\":\n return _context11.stop();\n }\n }, _callee11);\n }));\n return _addItemScan.apply(this, arguments);\n}\nfunction stopScanningItem() {\n return _stopScanningItem.apply(this, arguments);\n}\nfunction _stopScanningItem() {\n _stopScanningItem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {\n return _regeneratorRuntime().wrap(function _callee12$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n console.log(\"Stopping scanner\");\n scanner.clear();\n document.getElementById(\"startScan\").style.display = \"inline-block\";\n document.getElementById(\"stopScan\").style.display = \"none\";\n case 4:\n case \"end\":\n return _context12.stop();\n }\n }, _callee12);\n }));\n return _stopScanningItem.apply(this, arguments);\n}\nfunction addItemImage(_x13) {\n return _addItemImage.apply(this, arguments);\n}\nfunction _addItemImage() {\n _addItemImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(e) {\n var form, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee13$(_context13) {\n while (1) switch (_context13.prev = _context13.next) {\n case 0:\n console.log(\"Adding item by image\");\n form = new FormData();\n form.append(\"image\", e.files[0]);\n _context13.next = 5;\n return fetchWithAuth(config.backend_url + \"/item/register\", {\n method: \"POST\",\n body: form\n });\n case 5:\n response = _context13.sent;\n _context13.next = 8;\n return checkResponseForError(response, \"Failed to save item\");\n case 8:\n if (!_context13.sent) {\n _context13.next = 16;\n break;\n }\n _context13.next = 11;\n return response.json();\n case 11:\n tracking_item = _context13.sent;\n received_items[tracking_item.uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by image.\");\n case 16:\n case \"end\":\n return _context13.stop();\n }\n }, _callee13);\n }));\n return _addItemImage.apply(this, arguments);\n}\nfunction decreaseItemCount(_x14) {\n return _decreaseItemCount.apply(this, arguments);\n}\nfunction _decreaseItemCount() {\n _decreaseItemCount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(uuid) {\n return _regeneratorRuntime().wrap(function _callee14$(_context14) {\n while (1) switch (_context14.prev = _context14.next) {\n case 0:\n if (!(received_items[uuid] == null)) {\n _context14.next = 3;\n break;\n }\n console.log(\"Trying to decrease item count of unknown item\", uuid);\n return _context14.abrupt(\"return\");\n case 3:\n console.log(\"Decreasing item count of\", uuid);\n received_items[uuid][\"num\"]--;\n if (received_items[uuid][\"num\"] <= 0) {\n delete received_items[uuid];\n }\n updateItemsView();\n case 7:\n case \"end\":\n return _context14.stop();\n }\n }, _callee14);\n }));\n return _decreaseItemCount.apply(this, arguments);\n}\nfunction increaseItemCount(_x15) {\n return _increaseItemCount.apply(this, arguments);\n}\n\n/*\n * Checkin the selected items\n */\nfunction _increaseItemCount() {\n _increaseItemCount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(uuid) {\n return _regeneratorRuntime().wrap(function _callee15$(_context15) {\n while (1) switch (_context15.prev = _context15.next) {\n case 0:\n if (!(received_items[uuid] == null)) {\n _context15.next = 3;\n break;\n }\n console.log(\"Trying to increase item count of unknown item\", uuid);\n return _context15.abrupt(\"return\");\n case 3:\n console.log(\"Increasing item count of\", uuid);\n received_items[uuid][\"num\"]++;\n updateItemsView();\n case 6:\n case \"end\":\n return _context15.stop();\n }\n }, _callee15);\n }));\n return _increaseItemCount.apply(this, arguments);\n}\nfunction checkinItems() {\n return _checkinItems.apply(this, arguments);\n}\nfunction _checkinItems() {\n _checkinItems = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {\n var successfullCount, item, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee16$(_context16) {\n while (1) switch (_context16.prev = _context16.next) {\n case 0:\n console.log(\"Checking in items\");\n successfullCount = 0;\n _context16.t0 = _regeneratorRuntime().keys(received_items);\n case 3:\n if ((_context16.t1 = _context16.t0()).done) {\n _context16.next = 18;\n break;\n }\n item = _context16.t1.value;\n _context16.next = 7;\n return fetchWithAuth(config.backend_url + \"/checkin\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"item_uuid\": received_items[item].item.uuid,\n \"storage_name\": document.querySelector(\"#storage_select\").value,\n \"amount\": received_items[item].num\n })\n });\n case 7:\n response = _context16.sent;\n _context16.next = 10;\n return checkResponseForError(response, \"Failed to checkin item \" + received_items[item].item.tag);\n case 10:\n if (!_context16.sent) {\n _context16.next = 16;\n break;\n }\n _context16.next = 13;\n return response.json();\n case 13:\n tracking_item = _context16.sent;\n // eslint-disable-line no-unused-vars\n delete received_items[tracking_item.uuid];\n successfullCount++;\n case 16:\n _context16.next = 3;\n break;\n case 18:\n toast(\"Check-In successfull.\", \"The check-in of \" + successfullCount + \" items completed succesfully.\");\n updateItemsView();\n case 20:\n case \"end\":\n return _context16.stop();\n }\n }, _callee16);\n }));\n return _checkinItems.apply(this, arguments);\n}\nfunction updateCheckoutItem(tracking_item) {\n document.querySelector(\"#uuid\").innerHTML = tracking_item.uuid;\n document.querySelector(\"#tag\").innerHTML = tracking_item.tag;\n document.querySelector(\"#storage\").innerHTML = tracking_item.storage;\n document.querySelector(\"#addressee\").innerHTML = tracking_item.addressee;\n document.querySelector(\"#team\").innerHTML = tracking_item.team;\n}\nfunction checkoutItem() {\n return _checkoutItem.apply(this, arguments);\n}\nfunction _checkoutItem() {\n _checkoutItem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {\n var confirmed, response;\n return _regeneratorRuntime().wrap(function _callee17$(_context17) {\n while (1) switch (_context17.prev = _context17.next) {\n case 0:\n confirmed = confirm(\"Did you make sure the recipient is really the right person?\");\n if (confirmed) {\n _context17.next = 4;\n break;\n }\n console.log(\"Recipient confirmation denied.\");\n return _context17.abrupt(\"return\");\n case 4:\n _context17.next = 6;\n return fetchWithAuth(config.backend_url + \"/checkout/\" + document.querySelector(\"#uuid\").innerHTML);\n case 6:\n response = _context17.sent;\n case 7:\n case \"end\":\n return _context17.stop();\n }\n }, _callee17);\n }));\n return _checkoutItem.apply(this, arguments);\n}\nfunction onRecevierScanSuccess(_x16) {\n return _onRecevierScanSuccess.apply(this, arguments);\n}\nfunction _onRecevierScanSuccess() {\n _onRecevierScanSuccess = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(scannedCode) {\n var _scannedCode$split, _scannedCode$split2, uuid, signature, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee18$(_context18) {\n while (1) switch (_context18.prev = _context18.next) {\n case 0:\n debounceScanner();\n _scannedCode$split = scannedCode.split(\"/\"), _scannedCode$split2 = _slicedToArray(_scannedCode$split, 2), uuid = _scannedCode$split2[0], signature = _scannedCode$split2[1];\n console.log(\"Receiver scan success\");\n scanner_audio.play();\n _context18.next = 6;\n return getConfig();\n case 6:\n _context18.next = 8;\n return fetch(config.backend_url + \"/item/\" + uuid, {\n headers: {}\n });\n case 8:\n response = _context18.sent;\n if (!(response.status == 200)) {\n _context18.next = 26;\n break;\n }\n _context18.next = 12;\n return response.json();\n case 12:\n tracking_item = _context18.sent;\n if (!_noble_curves_ed448__WEBPACK_IMPORTED_MODULE_1__.ed448.verify(htoa(signature), new TextEncoder().encode(tracking_item.uuid), htoa(tracking_item.verification))) {\n _context18.next = 22;\n break;\n }\n if (!(tracking_item.storage == undefined || tracking_item.storage == null || tracking_item.storage.length == 0)) {\n _context18.next = 18;\n break;\n }\n alert(\"Item not yet received.\");\n console.log(\"Item not yet received.\");\n return _context18.abrupt(\"return\");\n case 18:\n updateCheckoutItem(tracking_item);\n console.log(\"Receiver verify success\");\n _context18.next = 24;\n break;\n case 22:\n alert(\"Could not verify signature.\");\n console.log(\"Could not verify signature.\");\n case 24:\n _context18.next = 27;\n break;\n case 26:\n if (response.status == 404) {\n alert(\"Item not found.\");\n } else {\n checkResponseForError(response, \"Failed to get item from backend.\");\n }\n case 27:\n case \"end\":\n return _context18.stop();\n }\n }, _callee18);\n }));\n return _onRecevierScanSuccess.apply(this, arguments);\n}\nfunction scanReceiver() {\n return _scanReceiver.apply(this, arguments);\n}\nfunction _scanReceiver() {\n _scanReceiver = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {\n return _regeneratorRuntime().wrap(function _callee19$(_context19) {\n while (1) switch (_context19.prev = _context19.next) {\n case 0:\n console.log(\"Scanning receiver.\");\n scanner.render(onRecevierScanSuccess, handleQrError);\n case 2:\n case \"end\":\n return _context19.stop();\n }\n }, _callee19);\n }));\n return _scanReceiver.apply(this, arguments);\n}\nfunction loadStorages(_x17) {\n return _loadStorages.apply(this, arguments);\n}\nfunction _loadStorages() {\n _loadStorages = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20(selectedStorage) {\n var response, storages, select, i, option;\n return _regeneratorRuntime().wrap(function _callee20$(_context20) {\n while (1) switch (_context20.prev = _context20.next) {\n case 0:\n console.log(\"Retrieving storages\");\n _context20.next = 3;\n return fetchWithAuth(config.backend_url + \"/storages\");\n case 3:\n response = _context20.sent;\n _context20.next = 6;\n return checkResponseForError(response, \"Failed to load storages.\");\n case 6:\n if (!_context20.sent) {\n _context20.next = 13;\n break;\n }\n _context20.next = 9;\n return response.json();\n case 9:\n storages = _context20.sent;\n select = document.querySelector(\"#storage_select\");\n console.log(\"Got storages\");\n for (i in storages) {\n option = document.createElement(\"option\");\n option.textContent = storages[i].name;\n option.value = storages[i].name;\n select.appendChild(option);\n if (selectedStorage == storages[i].name) {\n select.value = selectedStorage;\n }\n }\n case 13:\n case \"end\":\n return _context20.stop();\n }\n }, _callee20);\n }));\n return _loadStorages.apply(this, arguments);\n}\nfunction onPageLoad(_x18) {\n return _onPageLoad.apply(this, arguments);\n}\nfunction _onPageLoad() {\n _onPageLoad = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(doloadStorages) {\n var pw;\n return _regeneratorRuntime().wrap(function _callee21$(_context21) {\n while (1) switch (_context21.prev = _context21.next) {\n case 0:\n _context21.next = 2;\n return getConfig();\n case 2:\n pw = window.location.hash.substring(1);\n if (!(pw.length > 1)) {\n _context21.next = 8;\n break;\n }\n _context21.next = 6;\n return login(pw);\n case 6:\n _context21.next = 10;\n break;\n case 8:\n _context21.next = 10;\n return login();\n case 10:\n if (doloadStorages) {\n loadStorages(document.location.search.substring(1));\n }\n case 11:\n case \"end\":\n return _context21.stop();\n }\n }, _callee21);\n }));\n return _onPageLoad.apply(this, arguments);\n}\nfunction checkoutByTag() {\n return _checkoutByTag.apply(this, arguments);\n}\nfunction _checkoutByTag() {\n _checkoutByTag = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22() {\n var el, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee22$(_context22) {\n while (1) switch (_context22.prev = _context22.next) {\n case 0:\n console.log(\"Checkout by tag\");\n el = document.getElementById(\"checkoutByTag\");\n if (!(el.value.length != 6)) {\n _context22.next = 6;\n break;\n }\n alert(\"Not a BGP tag!\");\n console.log(\"Not a BGP tag\");\n return _context22.abrupt(\"return\");\n case 6:\n _context22.next = 8;\n return fetchWithAuth(config.backend_url + \"/tag/\" + el.value);\n case 8:\n response = _context22.sent;\n if (!(response.status == 200)) {\n _context22.next = 21;\n break;\n }\n _context22.next = 12;\n return response.json();\n case 12:\n tracking_item = _context22.sent;\n if (!(tracking_item.storage == undefined || tracking_item.storage == null || tracking_item.storage.length == 0)) {\n _context22.next = 17;\n break;\n }\n alert(\"Item not yet received.\");\n console.log(\"Item not yet received.\");\n return _context22.abrupt(\"return\");\n case 17:\n console.log(\"Checkout item by tag success.\");\n updateCheckoutItem(tracking_item);\n _context22.next = 22;\n break;\n case 21:\n if (response.status == 404) {\n console.log(\"Item not found\");\n alert(\"Item not found!\");\n } else {\n checkResponseForError(response, \"Failed to get item from backend\");\n }\n case 22:\n case \"end\":\n return _context22.stop();\n }\n }, _callee22);\n }));\n return _checkoutByTag.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvbWFpbi5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbGliLy4vc3JjL2pzL21haW4uanM/MDAzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gX2kpIHsgdmFyIF9zLCBfZSwgX3gsIF9yLCBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITE7IHRyeSB7IGlmIChfeCA9IChfaSA9IF9pLmNhbGwoYXJyKSkubmV4dCwgMCA9PT0gaSkgeyBpZiAoT2JqZWN0KF9pKSAhPT0gX2kpIHJldHVybjsgX24gPSAhMTsgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApOyB9IGNhdGNoIChlcnIpIHsgX2QgPSAhMCwgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsgXCJ1c2Ugc3RyaWN0XCI7IC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi8gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7IHJldHVybiBleHBvcnRzOyB9OyB2YXIgZXhwb3J0cyA9IHt9LCBPcCA9IE9iamVjdC5wcm90b3R5cGUsIGhhc093biA9IE9wLmhhc093blByb3BlcnR5LCBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHsgb2JqW2tleV0gPSBkZXNjLnZhbHVlOyB9LCAkU3ltYm9sID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSwgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiLCBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjsgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgeyByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSwgb2JqW2tleV07IH0gdHJ5IHsgZGVmaW5lKHt9LCBcIlwiKTsgfSBjYXRjaCAoZXJyKSB7IGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7IH07IH0gZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkgeyB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvciwgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpLCBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOyByZXR1cm4gZGVmaW5lUHJvcGVydHkoZ2VuZXJhdG9yLCBcIl9pbnZva2VcIiwgeyB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB9KSwgZ2VuZXJhdG9yOyB9IGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgeyB0cnkgeyByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07IH0gY2F0Y2ggKGVycikgeyByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07IH0gfSBleHBvcnRzLndyYXAgPSB3cmFwOyB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OyBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fSBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9IGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30gdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307IGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pOyB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOyBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSAmJiAoSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSk7IHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkgeyBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7IGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTsgfSk7IH0pOyB9IGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkgeyBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgeyB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsgaWYgKFwidGhyb3dcIiAhPT0gcmVjb3JkLnR5cGUpIHsgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsIHZhbHVlID0gcmVzdWx0LnZhbHVlOyByZXR1cm4gdmFsdWUgJiYgXCJvYmplY3RcIiA9PSBfdHlwZW9mKHZhbHVlKSAmJiBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpID8gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeyBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpOyB9LCBmdW5jdGlvbiAoZXJyKSB7IGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTsgfSkgOiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHsgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkLCByZXNvbHZlKHJlc3VsdCk7IH0sIGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7IH0pOyB9IHJlamVjdChyZWNvcmQuYXJnKTsgfSB2YXIgcHJldmlvdXNQcm9taXNlOyBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9pbnZva2VcIiwgeyB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHsgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7IHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7IH0pOyB9IHJldHVybiBwcmV2aW91c1Byb21pc2UgPSBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcpIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTsgfSB9KTsgfSBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHsgdmFyIHN0YXRlID0gXCJzdXNwZW5kZWRTdGFydFwiOyByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7IGlmIChcImV4ZWN1dGluZ1wiID09PSBzdGF0ZSkgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTsgaWYgKFwiY29tcGxldGVkXCIgPT09IHN0YXRlKSB7IGlmIChcInRocm93XCIgPT09IG1ldGhvZCkgdGhyb3cgYXJnOyByZXR1cm4gZG9uZVJlc3VsdCgpOyB9IGZvciAoY29udGV4dC5tZXRob2QgPSBtZXRob2QsIGNvbnRleHQuYXJnID0gYXJnOzspIHsgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTsgaWYgKGRlbGVnYXRlKSB7IHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOyBpZiAoZGVsZWdhdGVSZXN1bHQpIHsgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OyB9IH0gaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHsgaWYgKFwic3VzcGVuZGVkU3RhcnRcIiA9PT0gc3RhdGUpIHRocm93IHN0YXRlID0gXCJjb21wbGV0ZWRcIiwgY29udGV4dC5hcmc7IGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpOyB9IGVsc2UgXCJyZXR1cm5cIiA9PT0gY29udGV4dC5tZXRob2QgJiYgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpOyBzdGF0ZSA9IFwiZXhlY3V0aW5nXCI7IHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsgaWYgKFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlKSB7IGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IFwiY29tcGxldGVkXCIgOiBcInN1c3BlbmRlZFlpZWxkXCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOyByZXR1cm4geyB2YWx1ZTogcmVjb3JkLmFyZywgZG9uZTogY29udGV4dC5kb25lIH07IH0gXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTsgfSB9OyB9IGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHsgdmFyIG1ldGhvZE5hbWUgPSBjb250ZXh0Lm1ldGhvZCwgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07IGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBcInRocm93XCIgPT09IG1ldGhvZE5hbWUgJiYgZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0gJiYgKGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCBcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSB8fCBcInJldHVyblwiICE9PSBtZXRob2ROYW1lICYmIChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnXCIgKyBtZXRob2ROYW1lICsgXCInIG1ldGhvZFwiKSksIENvbnRpbnVlU2VudGluZWw7IHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7IHZhciBpbmZvID0gcmVjb3JkLmFyZzsgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7IH0gZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTsgMSBpbiBsb2NzICYmIChlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV0pLCAyIGluIGxvY3MgJiYgKGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdLCBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7IH0gZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkgeyB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDsgfSBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7IHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7IH0gZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7IGlmIChpdGVyYWJsZSkgeyB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07IGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpOyBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7IGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeyB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OyByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7IH07IHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OyB9IH0gcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9OyB9IGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7IHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6ICEwIH07IH0gcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgXCJjb25zdHJ1Y3RvclwiLCB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgY29uZmlndXJhYmxlOiAhMCB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwgeyB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sIGNvbmZpZ3VyYWJsZTogITAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeyB2YXIgY3RvciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTsgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeyByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07IH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7IHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7IHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTsgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7IH0pOyB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiOyB9KSwgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKHZhbCkgeyB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksIGtleXMgPSBbXTsgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7IHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7IGtleXMubGVuZ3RoOykgeyB2YXIga2V5ID0ga2V5cy5wb3AoKTsgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsgfSByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7IH07IH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IENvbnRleHQsIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7IGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgXCJ0XCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpOyB9LCBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgeyB0aGlzLmRvbmUgPSAhMDsgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsgaWYgKFwidGhyb3dcIiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZzsgcmV0dXJuIHRoaXMucnZhbDsgfSwgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgeyBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247IHZhciBjb250ZXh0ID0gdGhpczsgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7IHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7IH0gZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247IGlmIChcInJvb3RcIiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKFwiZW5kXCIpOyBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgeyB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSwgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7IGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOyBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsgfSBlbHNlIGlmIChoYXNDYXRjaCkgeyBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsgfSBlbHNlIHsgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTsgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7IH0gfSB9IH0sIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7IHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsgYnJlYWs7IH0gfSBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7IHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OyByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOyB9LCBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgeyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsgcmV0dXJuIFwiYnJlYWtcIiA9PT0gcmVjb3JkLnR5cGUgfHwgXCJjb250aW51ZVwiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiBcInJldHVyblwiID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsOyB9LCBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsgfSB9LCBcImNhdGNoXCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHsgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07IGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykgeyB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHsgdmFyIHRocm93biA9IHJlY29yZC5hcmc7IHJlc2V0VHJ5RW50cnkoZW50cnkpOyB9IHJldHVybiB0aHJvd247IH0gfSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7IH0sIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHsgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7IGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLCByZXN1bHROYW1lOiByZXN1bHROYW1lLCBuZXh0TG9jOiBuZXh0TG9jIH0sIFwibmV4dFwiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB1bmRlZmluZWQpLCBDb250aW51ZVNlbnRpbmVsOyB9IH0sIGV4cG9ydHM7IH1cbmZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfVxuaW1wb3J0IHsgSHRtbDVRcmNvZGVTY2FubmVyLCBIdG1sNVFyY29kZVNjYW5uZXJTdGF0ZSwgSHRtbDVRcmNvZGVTdXBwb3J0ZWRGb3JtYXRzIH0gZnJvbSBcImh0bWw1LXFyY29kZVwiO1xuaW1wb3J0IHsgZWQ0NDggfSBmcm9tIFwiQG5vYmxlL2N1cnZlcy9lZDQ0OFwiO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlclwiO1xudmFyIGN1cnJlbnRseUFkZGluZ0l0ZW1CeVRhZyA9IG5ldyBNYXAoKTtcbnZhciByZWNlaXZlZF9pdGVtcyA9IHt9O1xudmFyIGNvbmZpZztcbnZhciBzY2FubmVyID0gbmV3IEh0bWw1UXJjb2RlU2Nhbm5lcihcInJlYWRlclwiLCB7XG4gIGZwczogMTAsXG4gIHFyYm94OiB7XG4gICAgd2lkdGg6IDI1MCxcbiAgICBoZWlnaHQ6IDI1MFxuICB9LFxuICBzaG93VG9yY2hCdXR0b25JZlN1cHBvcnRlZDogdHJ1ZSxcbiAgZm9ybWF0c1RvU3VwcG9ydDogW0h0bWw1UXJjb2RlU3VwcG9ydGVkRm9ybWF0cy5RUl9DT0RFXSxcbiAgLy90aGVyZSBhcmUgbWFueSBvdGhlciB0eXBlcyBvZiBjb2RlcyBvbiB0aGUgbGFiZWxzIHdlIGRvIG5vdCB3YW50XG4gIHJlbWVtYmVyTGFzdFVzZWRDYW1lcmE6IHRydWVcbn0pO1xudmFyIHNjYW5uZXJfYXVkaW8gPSBuZXcgQXVkaW8oXCIvYmVlcC53YXZcIik7XG5zY2FubmVyX2F1ZGlvLmxvYWQoKTtcbnZhciB0b2FzdERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm90dG9tVG9hc3RcIik7XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGh0b2EoaCkge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKGgsIFwiaGV4XCIpKTtcbn1cbmZ1bmN0aW9uIHRvYXN0KHRpdGxlLCBtZXNzYWdlKSB7XG4gIHRvYXN0RGl2LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmlubmVySFRNTCA9IHRpdGxlO1xuICB0b2FzdERpdi5jaGlsZHJlblsxXS5pbm5lckhUTUwgPSBtZXNzYWdlO1xuICB0b2FzdERpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZVwiKTtcbiAgdG9hc3REaXYuY2xhc3NMaXN0LmFkZChcInNob3dcIik7XG4gIHRvYXN0RGl2LmNsYXNzTGlzdC5hZGQoXCJzaG93aW5nXCIpO1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0b2FzdERpdi5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd1wiKTtcbiAgICB0b2FzdERpdi5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd2luZ1wiKTtcbiAgICB0b2FzdERpdi5jbGFzc0xpc3QuYWRkKFwiaGlkZVwiKTtcbiAgfSwgMzAwMCk7XG59XG5mdW5jdGlvbiBmZXRjaFdpdGhBdXRoKF94LCBfeDIpIHtcbiAgcmV0dXJuIF9mZXRjaFdpdGhBdXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZmV0Y2hXaXRoQXV0aCgpIHtcbiAgX2ZldGNoV2l0aEF1dGggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoaW5wdXQsIGluaXQpIHtcbiAgICB2YXIgcmVzcG9uc2U7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKGluaXQgPT0gdW5kZWZpbmVkIHx8IGluaXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaW5pdCA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5pdFtcImhlYWRlcnNcIl0gPT0gbnVsbCkge1xuICAgICAgICAgICAgaW5pdFtcImhlYWRlcnNcIl0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzX3Rva2VuXCIpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICByZXR1cm4gbG9naW4oKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGluaXRbXCJoZWFkZXJzXCJdW1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDg7XG4gICAgICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGlmICghKHJlc3BvbnNlLnN0YXR1cyA9PSA0MDEpKSB7XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJGZXRjaCB3aXRoIGF1dGggZmFpbGVkIGZvclwiLCBpbnB1dCk7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgIHJldHVybiBsb2dpbigpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGluaXRbXCJoZWFkZXJzXCJdW1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE2O1xuICAgICAgICAgIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCk7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgcmVzcG9uc2UpO1xuICAgICAgICBjYXNlIDIwOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2ZldGNoV2l0aEF1dGguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihfeDMsIF94NCkge1xuICByZXR1cm4gX2NoZWNrUmVzcG9uc2VGb3JFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2NoZWNrUmVzcG9uc2VGb3JFcnJvcigpIHtcbiAgX2NoZWNrUmVzcG9uc2VGb3JFcnJvciA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIocmVzcG9uc2UsIG1lc3NhZ2UpIHtcbiAgICB2YXIgY29udGVudDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjb250ZW50ID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJHb3QgUmVzcG9uc2UgRXJyb3I6XCIsIG1lc3NhZ2UsIHJlc3BvbnNlKTtcbiAgICAgICAgICBhbGVydChtZXNzYWdlICsgXCI7IFN0YXR1czogXCIgKyByZXNwb25zZS5zdGF0dXMgKyBcIjsgQ29udGVudDogXCIgKyBjb250ZW50KTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB0cnVlKTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIpO1xuICB9KSk7XG4gIHJldHVybiBfY2hlY2tSZXNwb25zZUZvckVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBnZXRDb25maWcoKSB7XG4gIHJldHVybiBfZ2V0Q29uZmlnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZ2V0Q29uZmlnKCkge1xuICBfZ2V0Q29uZmlnID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICB2YXIgY29uZmlnX3JlcXVlc3Q7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKGNvbmZpZyA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMztcbiAgICAgICAgICByZXR1cm4gZmV0Y2goXCJjb25maWcuanNvblwiKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbmZpZ19yZXF1ZXN0ID0gX2NvbnRleHQzLnNlbnQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJMb2FkaW5nIGNvbmZpZ1wiKTtcbiAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDc7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihjb25maWdfcmVxdWVzdCwgXCJDb3VsZCBub3QgbG9hZCBjb25maWdcIik7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBpZiAoIV9jb250ZXh0My5zZW50KSB7XG4gICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDEyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTA7XG4gICAgICAgICAgcmV0dXJuIGNvbmZpZ19yZXF1ZXN0Lmpzb24oKTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjb25maWcgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkxvYWRlZCBjb25maWdcIik7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMyk7XG4gIH0pKTtcbiAgcmV0dXJuIF9nZXRDb25maWcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGxvZ2luKF94NSkge1xuICByZXR1cm4gX2xvZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfbG9naW4oKSB7XG4gIF9sb2dpbiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQocGFzc3dvcmRUb1RyeSkge1xuICAgIHZhciBsb2dpblN1Y2Nlc3MsIHBhc3N3b3JkLCBmb3JtLCByZXNwb25zZSwgcmVzdWx0O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBlcmZvcm1pbmcgbG9naW5cIik7XG4gICAgICAgICAgbG9naW5TdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAocGFzc3dvcmRUb1RyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVzaW5nIHBhc3N3b3JkIHRvIHRyeSBmcm9tIHBhcmFtZXRlclwiKTtcbiAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmRUb1RyeTtcbiAgICAgICAgICAgIHBhc3N3b3JkVG9UcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUHJvbXB0aW5nIHVzZXIgZm9yIHNoYXJlZCBzZWNyZXQuXCIpO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSBwcm9tcHQoXCJwcm92aWRlIHRoZSBzaGFyZWQgc2VjcmV0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoXCJncmFudF90eXBlXCIsIFwicGFzc3dvcmRcIik7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoXCJ1c2VybmFtZVwiLCBcIndvcmtlclwiKTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChcInBhc3N3b3JkXCIsIHBhc3N3b3JkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlcXVlc3RpbmcgdG9rZW4uXCIpO1xuICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTA7XG4gICAgICAgICAgcmV0dXJuIGZldGNoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL3Rva2VuXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBib2R5OiBmb3JtXG4gICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDQuc2VudDtcbiAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDEzO1xuICAgICAgICAgIHJldHVybiBjaGVja1Jlc3BvbnNlRm9yRXJyb3IocmVzcG9uc2UsIFwiTG9naW4gZmFpbGVkXCIpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGlmICghX2NvbnRleHQ0LnNlbnQpIHtcbiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNjtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiR290IHRva2VuXCIpO1xuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiYWNjZXNzX3Rva2VuXCIsIHJlc3VsdC5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgIGxvZ2luU3VjY2VzcyA9IHRydWU7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgaWYgKCFsb2dpblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU0KTtcbiAgfSkpO1xuICByZXR1cm4gX2xvZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiB1cGRhdGVJdGVtc1ZpZXcoKSB7XG4gIGNvbnNvbGUubG9nKFwiVXBkYXRpbmcgaXRlbXMgdmlld1wiKTtcbiAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNpdGVtc1wiKTtcbiAgaXRlbXMuaW5uZXJIVE1MID0gXCJcIjtcbiAgZm9yICh2YXIgaXRlbSBpbiByZWNlaXZlZF9pdGVtcykge1xuICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKTtcbiAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICBjb25zb2xlLmxvZyhyZWNlaXZlZF9pdGVtc1tpdGVtXSk7XG4gICAgbGkuaW5uZXJIVE1MID0gXCI8ZGl2IGlkPVxcXCJpdGVtX1wiICsgcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS51dWlkICsgXCJcXFwiIGNsYXNzPVxcXCJhbGVydCBhbGVydC1zdWNjZXNzXFxcIiByb2xlPVxcXCJhbGVydFxcXCI+XCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnRhZyArIFwiIChcIiArIHJlY2VpdmVkX2l0ZW1zW2l0ZW1dLml0ZW0uYWRkcmVzc2VlICsgXCIsIFwiICsgcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS50ZWFtICsgXCIpXCIgKyBcIiZlbXNwOzxzcGFuIGNsYXNzPVxcXCJiYWRnZSBiYWRnZS1saWdodFxcXCI+XCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5udW0gKyBcIjwvc3Bhbj5cIiArIFwiJmVtc3A7PGJ1dHRvbiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBvbmNsaWNrPVxcXCJsaWIuaW5jcmVhc2VJdGVtQ291bnQoJ1wiICsgcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS51dWlkICsgXCInKVxcXCI+KzwvYnV0dG9uPlwiICsgXCImZW1zcDs8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIG9uY2xpY2s9XFxcImxpYi5kZWNyZWFzZUl0ZW1Db3VudCgnXCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnV1aWQgKyBcIicpXFxcIj4tPC9idXR0b24+PC9kaXY+XCI7XG4gICAgaXRlbXMuYXBwZW5kQ2hpbGQobGkpO1xuICB9XG59XG5cbi8qXG4gKiB2YXJpb3VzIGFkZCBJdGVtcyBmdW5jdGlvbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb25UYWdUZXh0VXBkYXRlKF94Nikge1xuICByZXR1cm4gX29uVGFnVGV4dFVwZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX29uVGFnVGV4dFVwZGF0ZSgpIHtcbiAgX29uVGFnVGV4dFVwZGF0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUoZWxlbWVudCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIShlbGVtZW50LnZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDEyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaWYgKCEoZWxlbWVudC52YWx1ZS5sZW5ndGggIT0gNikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eShcIkNvZGUgbXVzdCBiZSA2IGNoYXJzIGxvbmcuXCIpO1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImlzLWludmFsaWRcIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgdGFnRW50ZXJlZChlbGVtZW50KTtcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDUuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU1KTtcbiAgfSkpO1xuICByZXR1cm4gX29uVGFnVGV4dFVwZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9uVGFnSW5wdXRDaGFuZ2VkKF94Nykge1xuICByZXR1cm4gX29uVGFnSW5wdXRDaGFuZ2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfb25UYWdJbnB1dENoYW5nZWQoKSB7XG4gIF9vblRhZ0lucHV0Q2hhbmdlZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYoZWxlbWVudCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAvLyBFbGVtZW50IGxvc3QgZm9jdXMgb3IgdXNlciBwcmVzc2VkIGVudGVyXG4gICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUubGVuZ3RoID09IDYpIHtcbiAgICAgICAgICAgIHRhZ0VudGVyZWQoZWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDYuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU2KTtcbiAgfSkpO1xuICByZXR1cm4gX29uVGFnSW5wdXRDaGFuZ2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiB0YWdFbnRlcmVkKF94OCkge1xuICByZXR1cm4gX3RhZ0VudGVyZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF90YWdFbnRlcmVkKCkge1xuICBfdGFnRW50ZXJlZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTcoZWxlbWVudCkge1xuICAgIHZhciB0YWcsIHN1Y2M7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRhZyA9IGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJUYWcgRW50ZXJlZFwiLCB0YWcpO1xuICAgICAgICAgIGlmICghY3VycmVudGx5QWRkaW5nSXRlbUJ5VGFnLmhhcyh0YWcpKSB7XG4gICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjdXJyZW50bHlBZGRpbmdJdGVtQnlUYWcuc2V0KHRhZywgXCJcIik7XG4gICAgICAgICAgX2NvbnRleHQ3Lm5leHQgPSA3O1xuICAgICAgICAgIHJldHVybiBhZGRJdGVtQnlUYWcoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBzdWNjID0gX2NvbnRleHQ3LnNlbnQ7XG4gICAgICAgICAgaWYgKHN1Y2MpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImlzLWludmFsaWRcIik7XG4gICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJVbmtub3duIGl0ZW1cIik7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpcy1pbnZhbGlkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgICAgY3VycmVudGx5QWRkaW5nSXRlbUJ5VGFnW1wiZGVsZXRlXCJdKHRhZyk7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNyk7XG4gIH0pKTtcbiAgcmV0dXJuIF90YWdFbnRlcmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkSXRlbUJ5VGFnKF94OSkge1xuICByZXR1cm4gX2FkZEl0ZW1CeVRhZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2FkZEl0ZW1CeVRhZygpIHtcbiAgX2FkZEl0ZW1CeVRhZyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgodGFnKSB7XG4gICAgdmFyIHJlc3BvbnNlLCB0cmFja2luZ19pdGVtO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlOCQoX2NvbnRleHQ4KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDgucHJldiA9IF9jb250ZXh0OC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoISh0YWcubGVuZ3RoICE9IDYpKSB7XG4gICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgXCJJbnRlcm5hbCBFcnJvcjogVGFnIG5vdCBsZW5ndGggNi5cIjtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJ5aW5nIHRvIGFkZCBpdGVtIGJ5IHRhZzpcIiwgdGFnKTtcbiAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGZldGNoV2l0aEF1dGgoY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvdGFnL1wiICsgdGFnKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQ4LnNlbnQ7XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMTk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAxMDtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHRyYWNraW5nX2l0ZW0gPSBfY29udGV4dDguc2VudDtcbiAgICAgICAgICBpZiAodHJhY2tpbmdfaXRlbS5yZWNlaXZlZF9hdCAhPSBudWxsICYmIHRyYWNraW5nX2l0ZW0uZGVwbG95ZWRfYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYWxlcnQoXCJpdGVtIGFscmVhZHkgY2hlY2tlZCBpbiBhdCBcIiArIHRyYWNraW5nX2l0ZW0uc3RvcmFnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFja2luZ19pdGVtLnV1aWQgaW4gcmVjZWl2ZWRfaXRlbXMpIHtcbiAgICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW3RyYWNraW5nX2l0ZW0udXVpZF0ubnVtICs9IDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW3RyYWNraW5nX2l0ZW0udXVpZF0gPSB7XG4gICAgICAgICAgICAgIFwibnVtXCI6IDEsXG4gICAgICAgICAgICAgIFwiaXRlbVwiOiB0cmFja2luZ19pdGVtXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVJdGVtc1ZpZXcoKTtcbiAgICAgICAgICBzY2FubmVyX2F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFkZGVkIGl0ZW0gYnkgdGFnXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDguYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIGlmICghKHJlc3BvbnNlLnN0YXR1cyA9PSA0MDQpKSB7XG4gICAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDI0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiSXRlbSBub3QgZm91bmRcIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5hYnJ1cHQoXCJyZXR1cm5cIiwgZmFsc2UpO1xuICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gZ2V0IGl0ZW0gZnJvbSBiYWNrZW5kXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDguYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDguc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU4KTtcbiAgfSkpO1xuICByZXR1cm4gX2FkZEl0ZW1CeVRhZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gaGFuZGxlUXJFcnJvcihfeDEwLCBfeDExKSB7XG4gIHJldHVybiBfaGFuZGxlUXJFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2hhbmRsZVFyRXJyb3IoKSB7XG4gIF9oYW5kbGVRckVycm9yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlOShtc2csIGVycikge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlOSQoX2NvbnRleHQ5KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDkucHJldiA9IF9jb250ZXh0OS5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0OS5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTkpO1xuICB9KSk7XG4gIHJldHVybiBfaGFuZGxlUXJFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gZGVib3VuY2VTY2FubmVyKCkge1xuICBpZiAoc2Nhbm5lci5nZXRTdGF0ZSgpICE9IEh0bWw1UXJjb2RlU2Nhbm5lclN0YXRlLlNDQU5OSU5HKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNjYW5uZXIucGF1c2UoZmFsc2UpO1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nhbm5lci5nZXRTdGF0ZSgpID09IEh0bWw1UXJjb2RlU2Nhbm5lclN0YXRlLlBBVVNFRCkge1xuICAgICAgc2Nhbm5lci5yZXN1bWUoKTtcbiAgICB9XG4gIH0sIDEwMDApO1xufVxuZnVuY3Rpb24gaGFuZGxlSXRlbVNjYW5SZXN1bHQoX3gxMikge1xuICByZXR1cm4gX2hhbmRsZUl0ZW1TY2FuUmVzdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfaGFuZGxlSXRlbVNjYW5SZXN1bHQoKSB7XG4gIF9oYW5kbGVJdGVtU2NhblJlc3VsdCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEwKGl0ZW1fdXVpZCkge1xuICAgIHZhciByZXNwb25zZSwgdHJhY2tpbmdfaXRlbTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEwJChfY29udGV4dDEwKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEwLnByZXYgPSBfY29udGV4dDEwLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGRlYm91bmNlU2Nhbm5lcigpO1xuICAgICAgICAgIGlmICghKGl0ZW1fdXVpZC5sZW5ndGggPT0gMzYpKSB7XG4gICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRyeWluZyB0byBhZGQgaXRlbSBieSB1dWlkIChzY2FubmVkKVwiKTtcbiAgICAgICAgICBpZiAoIShpdGVtX3V1aWQgaW4gcmVjZWl2ZWRfaXRlbXMpKSB7XG4gICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAxMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWNlaXZlZF9pdGVtc1tpdGVtX3V1aWRdLm51bSArPSAxO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW5jcmVhc2VkIGNvdW50IG9mIGV4aXN0aW5nIGl0ZW0gdXVpZFwiKTtcbiAgICAgICAgICB1cGRhdGVJdGVtc1ZpZXcoKTtcbiAgICAgICAgICBzY2FubmVyX2F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyNjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICByZWNlaXZlZF9pdGVtc1tpdGVtX3V1aWRdID0ge1xuICAgICAgICAgICAgXCJudW1cIjogMSxcbiAgICAgICAgICAgIFwiaXRlbVwiOiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAxMztcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi9pdGVtL1wiICsgaXRlbV91dWlkKTtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0MTAuc2VudDtcbiAgICAgICAgICBpZiAoIShyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gMjU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gMTc7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICB0cmFja2luZ19pdGVtID0gX2NvbnRleHQxMC5zZW50O1xuICAgICAgICAgIGlmICh0cmFja2luZ19pdGVtLnJlY2VpdmVkX2F0ICE9IG51bGwgJiYgdHJhY2tpbmdfaXRlbS5kZXBsb3llZF9hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhbGVydChcIml0ZW0gYWxyZWFkeSBjaGVja2VkIGluIGF0IFwiICsgdHJhY2tpbmdfaXRlbS5zdG9yYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjZWl2ZWRfaXRlbXNbaXRlbV91dWlkXSA9IHtcbiAgICAgICAgICAgIFwibnVtXCI6IDEsXG4gICAgICAgICAgICBcIml0ZW1cIjogdHJhY2tpbmdfaXRlbVxuICAgICAgICAgIH07XG4gICAgICAgICAgdXBkYXRlSXRlbXNWaWV3KCk7XG4gICAgICAgICAgc2Nhbm5lcl9hdWRpby5wbGF5KCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZGRlZCBpdGVtIGJ5IHV1aWQuXCIpO1xuICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgICAgICBhbGVydChcIkl0ZW0gbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gZ2V0IGl0ZW0gZnJvbSBiYWNrZW5kXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyOTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICBhbGVydChcIlFSIENvZGUgaXMgbm90IGEgYmdwIGNoZWNraW4gY29kZS5cIik7XG4gICAgICAgIGNhc2UgMjk6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTEwKTtcbiAgfSkpO1xuICByZXR1cm4gX2hhbmRsZUl0ZW1TY2FuUmVzdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkSXRlbVNjYW4oKSB7XG4gIHJldHVybiBfYWRkSXRlbVNjYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9hZGRJdGVtU2NhbigpIHtcbiAgX2FkZEl0ZW1TY2FuID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTEoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxMSQoX2NvbnRleHQxMSkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxMS5wcmV2ID0gX2NvbnRleHQxMS5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0YXJ0aW5nIHNjYW5uZXJcIik7XG4gICAgICAgICAgc2Nhbm5lci5yZW5kZXIoaGFuZGxlSXRlbVNjYW5SZXN1bHQsIGhhbmRsZVFyRXJyb3IpO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3RhcnRTY2FuXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0b3BTY2FuXCIpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMS5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTExKTtcbiAgfSkpO1xuICByZXR1cm4gX2FkZEl0ZW1TY2FuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcFNjYW5uaW5nSXRlbSgpIHtcbiAgcmV0dXJuIF9zdG9wU2Nhbm5pbmdJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfc3RvcFNjYW5uaW5nSXRlbSgpIHtcbiAgX3N0b3BTY2FubmluZ0l0ZW0gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMigpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEyJChfY29udGV4dDEyKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEyLnByZXYgPSBfY29udGV4dDEyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RvcHBpbmcgc2Nhbm5lclwiKTtcbiAgICAgICAgICBzY2FubmVyLmNsZWFyKCk7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGFydFNjYW5cIikuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdG9wU2NhblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDEyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTIpO1xuICB9KSk7XG4gIHJldHVybiBfc3RvcFNjYW5uaW5nSXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFkZEl0ZW1JbWFnZShfeDEzKSB7XG4gIHJldHVybiBfYWRkSXRlbUltYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfYWRkSXRlbUltYWdlKCkge1xuICBfYWRkSXRlbUltYWdlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTMoZSkge1xuICAgIHZhciBmb3JtLCByZXNwb25zZSwgdHJhY2tpbmdfaXRlbTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTEzJChfY29udGV4dDEzKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDEzLnByZXYgPSBfY29udGV4dDEzLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkaW5nIGl0ZW0gIGJ5IGltYWdlXCIpO1xuICAgICAgICAgIGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChcImltYWdlXCIsIGUuZmlsZXNbMF0pO1xuICAgICAgICAgIF9jb250ZXh0MTMubmV4dCA9IDU7XG4gICAgICAgICAgcmV0dXJuIGZldGNoV2l0aEF1dGgoY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvaXRlbS9yZWdpc3RlclwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgYm9keTogZm9ybVxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDEzLnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gODtcbiAgICAgICAgICByZXR1cm4gY2hlY2tSZXNwb25zZUZvckVycm9yKHJlc3BvbnNlLCBcIkZhaWxlZCB0byBzYXZlIGl0ZW1cIik7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBpZiAoIV9jb250ZXh0MTMuc2VudCkge1xuICAgICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMTY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gMTE7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICB0cmFja2luZ19pdGVtID0gX2NvbnRleHQxMy5zZW50O1xuICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW3RyYWNraW5nX2l0ZW0udXVpZF0gPSB7XG4gICAgICAgICAgICBcIm51bVwiOiAxLFxuICAgICAgICAgICAgXCJpdGVtXCI6IHRyYWNraW5nX2l0ZW1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHVwZGF0ZUl0ZW1zVmlldygpO1xuICAgICAgICAgIHNjYW5uZXJfYXVkaW8ucGxheSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkZWQgaXRlbSBieSBpbWFnZS5cIik7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxMy5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTEzKTtcbiAgfSkpO1xuICByZXR1cm4gX2FkZEl0ZW1JbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY3JlYXNlSXRlbUNvdW50KF94MTQpIHtcbiAgcmV0dXJuIF9kZWNyZWFzZUl0ZW1Db3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2RlY3JlYXNlSXRlbUNvdW50KCkge1xuICBfZGVjcmVhc2VJdGVtQ291bnQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNCh1dWlkKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNCQoX2NvbnRleHQxNCkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNC5wcmV2ID0gX2NvbnRleHQxNC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIShyZWNlaXZlZF9pdGVtc1t1dWlkXSA9PSBudWxsKSkge1xuICAgICAgICAgICAgX2NvbnRleHQxNC5uZXh0ID0gMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRyeWluZyB0byBkZWNyZWFzZSBpdGVtIGNvdW50IG9mIHVua25vd24gaXRlbVwiLCB1dWlkKTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlY3JlYXNpbmcgaXRlbSBjb3VudCBvZlwiLCB1dWlkKTtcbiAgICAgICAgICByZWNlaXZlZF9pdGVtc1t1dWlkXVtcIm51bVwiXS0tO1xuICAgICAgICAgIGlmIChyZWNlaXZlZF9pdGVtc1t1dWlkXVtcIm51bVwiXSA8PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgcmVjZWl2ZWRfaXRlbXNbdXVpZF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUl0ZW1zVmlldygpO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE0KTtcbiAgfSkpO1xuICByZXR1cm4gX2RlY3JlYXNlSXRlbUNvdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5jcmVhc2VJdGVtQ291bnQoX3gxNSkge1xuICByZXR1cm4gX2luY3JlYXNlSXRlbUNvdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbi8qXG4gKiBDaGVja2luIHRoZSBzZWxlY3RlZCBpdGVtc1xuICovXG5mdW5jdGlvbiBfaW5jcmVhc2VJdGVtQ291bnQoKSB7XG4gIF9pbmNyZWFzZUl0ZW1Db3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE1KHV1aWQpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE1JChfY29udGV4dDE1KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE1LnByZXYgPSBfY29udGV4dDE1Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKHJlY2VpdmVkX2l0ZW1zW3V1aWRdID09IG51bGwpKSB7XG4gICAgICAgICAgICBfY29udGV4dDE1Lm5leHQgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJ5aW5nIHRvIGluY3JlYXNlIGl0ZW0gY291bnQgb2YgdW5rbm93biBpdGVtXCIsIHV1aWQpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDE1LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW5jcmVhc2luZyBpdGVtIGNvdW50IG9mXCIsIHV1aWQpO1xuICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW3V1aWRdW1wibnVtXCJdKys7XG4gICAgICAgICAgdXBkYXRlSXRlbXNWaWV3KCk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDE1LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTUpO1xuICB9KSk7XG4gIHJldHVybiBfaW5jcmVhc2VJdGVtQ291bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja2luSXRlbXMoKSB7XG4gIHJldHVybiBfY2hlY2tpbkl0ZW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfY2hlY2tpbkl0ZW1zKCkge1xuICBfY2hlY2tpbkl0ZW1zID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTYoKSB7XG4gICAgdmFyIHN1Y2Nlc3NmdWxsQ291bnQsIGl0ZW0sIHJlc3BvbnNlLCB0cmFja2luZ19pdGVtO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTYkKF9jb250ZXh0MTYpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTYucHJldiA9IF9jb250ZXh0MTYubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJDaGVja2luZyBpbiBpdGVtc1wiKTtcbiAgICAgICAgICBzdWNjZXNzZnVsbENvdW50ID0gMDtcbiAgICAgICAgICBfY29udGV4dDE2LnQwID0gX3JlZ2VuZXJhdG9yUnVudGltZSgpLmtleXMocmVjZWl2ZWRfaXRlbXMpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKChfY29udGV4dDE2LnQxID0gX2NvbnRleHQxNi50MCgpKS5kb25lKSB7XG4gICAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAxODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpdGVtID0gX2NvbnRleHQxNi50MS52YWx1ZTtcbiAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSA3O1xuICAgICAgICAgIHJldHVybiBmZXRjaFdpdGhBdXRoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL2NoZWNraW5cIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIFwiaXRlbV91dWlkXCI6IHJlY2VpdmVkX2l0ZW1zW2l0ZW1dLml0ZW0udXVpZCxcbiAgICAgICAgICAgICAgXCJzdG9yYWdlX25hbWVcIjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNzdG9yYWdlX3NlbGVjdFwiKS52YWx1ZSxcbiAgICAgICAgICAgICAgXCJhbW91bnRcIjogcmVjZWl2ZWRfaXRlbXNbaXRlbV0ubnVtXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDE2LnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQxNi5uZXh0ID0gMTA7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gY2hlY2tpbiBpdGVtIFwiICsgcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS50YWcpO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGlmICghX2NvbnRleHQxNi5zZW50KSB7XG4gICAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAxNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAxMztcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHRyYWNraW5nX2l0ZW0gPSBfY29udGV4dDE2LnNlbnQ7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICAgIGRlbGV0ZSByZWNlaXZlZF9pdGVtc1t0cmFja2luZ19pdGVtLnV1aWRdO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxsQ291bnQrKztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIHRvYXN0KFwiQ2hlY2stSW4gc3VjY2Vzc2Z1bGwuXCIsIFwiVGhlIGNoZWNrLWluIG9mIFwiICsgc3VjY2Vzc2Z1bGxDb3VudCArIFwiIGl0ZW1zIGNvbXBsZXRlZCBzdWNjZXNmdWxseS5cIik7XG4gICAgICAgICAgdXBkYXRlSXRlbXNWaWV3KCk7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE2KTtcbiAgfSkpO1xuICByZXR1cm4gX2NoZWNraW5JdGVtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tvdXRJdGVtKHRyYWNraW5nX2l0ZW0pIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN1dWlkXCIpLmlubmVySFRNTCA9IHRyYWNraW5nX2l0ZW0udXVpZDtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0YWdcIikuaW5uZXJIVE1MID0gdHJhY2tpbmdfaXRlbS50YWc7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjc3RvcmFnZVwiKS5pbm5lckhUTUwgPSB0cmFja2luZ19pdGVtLnN0b3JhZ2U7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYWRkcmVzc2VlXCIpLmlubmVySFRNTCA9IHRyYWNraW5nX2l0ZW0uYWRkcmVzc2VlO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3RlYW1cIikuaW5uZXJIVE1MID0gdHJhY2tpbmdfaXRlbS50ZWFtO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrb3V0SXRlbSgpIHtcbiAgcmV0dXJuIF9jaGVja291dEl0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9jaGVja291dEl0ZW0oKSB7XG4gIF9jaGVja291dEl0ZW0gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNygpIHtcbiAgICB2YXIgY29uZmlybWVkLCByZXNwb25zZTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE3JChfY29udGV4dDE3KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE3LnByZXYgPSBfY29udGV4dDE3Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbmZpcm1lZCA9IGNvbmZpcm0oXCJEaWQgeW91IG1ha2Ugc3VyZSB0aGUgcmVjaXBpZW50IGlzIHJlYWxseSB0aGUgcmlnaHQgcGVyc29uP1wiKTtcbiAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICBfY29udGV4dDE3Lm5leHQgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVjaXBpZW50IGNvbmZpcm1hdGlvbiBkZW5pZWQuXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9jb250ZXh0MTcubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGZldGNoV2l0aEF1dGgoY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvY2hlY2tvdXQvXCIgKyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3V1aWRcIikuaW5uZXJIVE1MKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQxNy5zZW50O1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxNy5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE3KTtcbiAgfSkpO1xuICByZXR1cm4gX2NoZWNrb3V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gb25SZWNldmllclNjYW5TdWNjZXNzKF94MTYpIHtcbiAgcmV0dXJuIF9vblJlY2V2aWVyU2NhblN1Y2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vblJlY2V2aWVyU2NhblN1Y2Nlc3MoKSB7XG4gIF9vblJlY2V2aWVyU2NhblN1Y2Nlc3MgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxOChzY2FubmVkQ29kZSkge1xuICAgIHZhciBfc2Nhbm5lZENvZGUkc3BsaXQsIF9zY2FubmVkQ29kZSRzcGxpdDIsIHV1aWQsIHNpZ25hdHVyZSwgcmVzcG9uc2UsIHRyYWNraW5nX2l0ZW07XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOCQoX2NvbnRleHQxOCkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOC5wcmV2ID0gX2NvbnRleHQxOC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBkZWJvdW5jZVNjYW5uZXIoKTtcbiAgICAgICAgICBfc2Nhbm5lZENvZGUkc3BsaXQgPSBzY2FubmVkQ29kZS5zcGxpdChcIi9cIiksIF9zY2FubmVkQ29kZSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfc2Nhbm5lZENvZGUkc3BsaXQsIDIpLCB1dWlkID0gX3NjYW5uZWRDb2RlJHNwbGl0MlswXSwgc2lnbmF0dXJlID0gX3NjYW5uZWRDb2RlJHNwbGl0MlsxXTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlY2VpdmVyIHNjYW4gc3VjY2Vzc1wiKTtcbiAgICAgICAgICBzY2FubmVyX2F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSA2O1xuICAgICAgICAgIHJldHVybiBnZXRDb25maWcoKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDg7XG4gICAgICAgICAgcmV0dXJuIGZldGNoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL2l0ZW0vXCIgKyB1dWlkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDE4LnNlbnQ7XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDI2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDEyO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgdHJhY2tpbmdfaXRlbSA9IF9jb250ZXh0MTguc2VudDtcbiAgICAgICAgICBpZiAoIWVkNDQ4LnZlcmlmeShodG9hKHNpZ25hdHVyZSksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0cmFja2luZ19pdGVtLnV1aWQpLCBodG9hKHRyYWNraW5nX2l0ZW0udmVyaWZpY2F0aW9uKSkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDIyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKHRyYWNraW5nX2l0ZW0uc3RvcmFnZSA9PSB1bmRlZmluZWQgfHwgdHJhY2tpbmdfaXRlbS5zdG9yYWdlID09IG51bGwgfHwgdHJhY2tpbmdfaXRlbS5zdG9yYWdlLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMTg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYWxlcnQoXCJJdGVtIG5vdCB5ZXQgcmVjZWl2ZWQuXCIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiSXRlbSBub3QgeWV0IHJlY2VpdmVkLlwiKTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgdXBkYXRlQ2hlY2tvdXRJdGVtKHRyYWNraW5nX2l0ZW0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVjZWl2ZXIgdmVyaWZ5IHN1Y2Nlc3NcIik7XG4gICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMjQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgYWxlcnQoXCJDb3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZS5cIik7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJDb3VsZCBub3QgdmVyaWZ5IHNpZ25hdHVyZS5cIik7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMjc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSA0MDQpIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiSXRlbSBub3QgZm91bmQuXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGVja1Jlc3BvbnNlRm9yRXJyb3IocmVzcG9uc2UsIFwiRmFpbGVkIHRvIGdldCBpdGVtIGZyb20gYmFja2VuZC5cIik7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTguc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxOCk7XG4gIH0pKTtcbiAgcmV0dXJuIF9vblJlY2V2aWVyU2NhblN1Y2Nlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzY2FuUmVjZWl2ZXIoKSB7XG4gIHJldHVybiBfc2NhblJlY2VpdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfc2NhblJlY2VpdmVyKCkge1xuICBfc2NhblJlY2VpdmVyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTkoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxOSQoX2NvbnRleHQxOSkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxOS5wcmV2ID0gX2NvbnRleHQxOS5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNjYW5uaW5nIHJlY2VpdmVyLlwiKTtcbiAgICAgICAgICBzY2FubmVyLnJlbmRlcihvblJlY2V2aWVyU2NhblN1Y2Nlc3MsIGhhbmRsZVFyRXJyb3IpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOS5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE5KTtcbiAgfSkpO1xuICByZXR1cm4gX3NjYW5SZWNlaXZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdG9yYWdlcyhfeDE3KSB7XG4gIHJldHVybiBfbG9hZFN0b3JhZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfbG9hZFN0b3JhZ2VzKCkge1xuICBfbG9hZFN0b3JhZ2VzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMjAoc2VsZWN0ZWRTdG9yYWdlKSB7XG4gICAgdmFyIHJlc3BvbnNlLCBzdG9yYWdlcywgc2VsZWN0LCBpLCBvcHRpb247XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMCQoX2NvbnRleHQyMCkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyMC5wcmV2ID0gX2NvbnRleHQyMC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlJldHJpZXZpbmcgc3RvcmFnZXNcIik7XG4gICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gMztcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi9zdG9yYWdlc1wiKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQyMC5zZW50O1xuICAgICAgICAgIF9jb250ZXh0MjAubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gbG9hZCBzdG9yYWdlcy5cIik7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBpZiAoIV9jb250ZXh0MjAuc2VudCkge1xuICAgICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gMTM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gOTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgc3RvcmFnZXMgPSBfY29udGV4dDIwLnNlbnQ7XG4gICAgICAgICAgc2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNzdG9yYWdlX3NlbGVjdFwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkdvdCBzdG9yYWdlc1wiKTtcbiAgICAgICAgICBmb3IgKGkgaW4gc3RvcmFnZXMpIHtcbiAgICAgICAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBzdG9yYWdlc1tpXS5uYW1lO1xuICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gc3RvcmFnZXNbaV0ubmFtZTtcbiAgICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RvcmFnZSA9PSBzdG9yYWdlc1tpXS5uYW1lKSB7XG4gICAgICAgICAgICAgIHNlbGVjdC52YWx1ZSA9IHNlbGVjdGVkU3RvcmFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIwKTtcbiAgfSkpO1xuICByZXR1cm4gX2xvYWRTdG9yYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9uUGFnZUxvYWQoX3gxOCkge1xuICByZXR1cm4gX29uUGFnZUxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vblBhZ2VMb2FkKCkge1xuICBfb25QYWdlTG9hZCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIxKGRvbG9hZFN0b3JhZ2VzKSB7XG4gICAgdmFyIHB3O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMjEkKF9jb250ZXh0MjEpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MjEucHJldiA9IF9jb250ZXh0MjEubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMjtcbiAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnKCk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwdyA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKTtcbiAgICAgICAgICBpZiAoIShwdy5sZW5ndGggPiAxKSkge1xuICAgICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA2O1xuICAgICAgICAgIHJldHVybiBsb2dpbihwdyk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAxMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEwO1xuICAgICAgICAgIHJldHVybiBsb2dpbigpO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGlmIChkb2xvYWRTdG9yYWdlcykge1xuICAgICAgICAgICAgbG9hZFN0b3JhZ2VzKGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIxLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMjEpO1xuICB9KSk7XG4gIHJldHVybiBfb25QYWdlTG9hZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrb3V0QnlUYWcoKSB7XG4gIHJldHVybiBfY2hlY2tvdXRCeVRhZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2NoZWNrb3V0QnlUYWcoKSB7XG4gIF9jaGVja291dEJ5VGFnID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMjIoKSB7XG4gICAgdmFyIGVsLCByZXNwb25zZSwgdHJhY2tpbmdfaXRlbTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIyJChfY29udGV4dDIyKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIyLnByZXYgPSBfY29udGV4dDIyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tvdXQgYnkgdGFnXCIpO1xuICAgICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGVja291dEJ5VGFnXCIpO1xuICAgICAgICAgIGlmICghKGVsLnZhbHVlLmxlbmd0aCAhPSA2KSkge1xuICAgICAgICAgICAgX2NvbnRleHQyMi5uZXh0ID0gNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbGVydChcIk5vdCBhIEJHUCB0YWchXCIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm90IGEgQkdQIHRhZ1wiKTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMi5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSA4O1xuICAgICAgICAgIHJldHVybiBmZXRjaFdpdGhBdXRoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL3RhZy9cIiArIGVsLnZhbHVlKTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQyMi5zZW50O1xuICAgICAgICAgIGlmICghKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSAyMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSAxMjtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIHRyYWNraW5nX2l0ZW0gPSBfY29udGV4dDIyLnNlbnQ7XG4gICAgICAgICAgaWYgKCEodHJhY2tpbmdfaXRlbS5zdG9yYWdlID09IHVuZGVmaW5lZCB8fCB0cmFja2luZ19pdGVtLnN0b3JhZ2UgPT0gbnVsbCB8fCB0cmFja2luZ19pdGVtLnN0b3JhZ2UubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSAxNztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbGVydChcIkl0ZW0gbm90IHlldCByZWNlaXZlZC5cIik7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCB5ZXQgcmVjZWl2ZWQuXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIyLmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNoZWNrb3V0IGl0ZW0gYnkgdGFnIHN1Y2Nlc3MuXCIpO1xuICAgICAgICAgIHVwZGF0ZUNoZWNrb3V0SXRlbSh0cmFja2luZ19pdGVtKTtcbiAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSAyMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDQwNCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgIGFsZXJ0KFwiSXRlbSBub3QgZm91bmQhXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGVja1Jlc3BvbnNlRm9yRXJyb3IocmVzcG9uc2UsIFwiRmFpbGVkIHRvIGdldCBpdGVtIGZyb20gYmFja2VuZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyMi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIyKTtcbiAgfSkpO1xuICByZXR1cm4gX2NoZWNrb3V0QnlUYWcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/main.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addItemByTag: () => (/* binding */ addItemByTag),\n/* harmony export */ addItemImage: () => (/* binding */ addItemImage),\n/* harmony export */ addItemScan: () => (/* binding */ addItemScan),\n/* harmony export */ checkinItems: () => (/* binding */ checkinItems),\n/* harmony export */ checkoutByTag: () => (/* binding */ checkoutByTag),\n/* harmony export */ checkoutItem: () => (/* binding */ checkoutItem),\n/* harmony export */ decreaseItemCount: () => (/* binding */ decreaseItemCount),\n/* harmony export */ increaseItemCount: () => (/* binding */ increaseItemCount),\n/* harmony export */ loadStorages: () => (/* binding */ loadStorages),\n/* harmony export */ onPageLoad: () => (/* binding */ onPageLoad),\n/* harmony export */ onTagInputChanged: () => (/* binding */ onTagInputChanged),\n/* harmony export */ onTagTextUpdate: () => (/* binding */ onTagTextUpdate),\n/* harmony export */ scanReceiver: () => (/* binding */ scanReceiver),\n/* harmony export */ stopScanningItem: () => (/* binding */ stopScanningItem)\n/* harmony export */ });\n/* harmony import */ var html5_qrcode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! html5-qrcode */ \"./node_modules/html5-qrcode/esm/index.js\");\n/* harmony import */ var _noble_curves_ed448__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @noble/curves/ed448 */ \"./node_modules/@noble/curves/esm/ed448.js\");\n/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\n\n\nvar currentlyAddingItemByTag = new Map();\nvar received_items = {};\nvar config;\nvar scanner = new html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScanner(\"reader\", {\n fps: 10,\n qrbox: {\n width: 250,\n height: 250\n },\n showTorchButtonIfSupported: true,\n formatsToSupport: [html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeSupportedFormats.QR_CODE],\n //there are many other types of codes on the labels we do not want\n rememberLastUsedCamera: true\n});\nvar scanner_audio = new Audio(\"/beep.wav\");\nscanner_audio.load();\nvar toastDiv = document.getElementById(\"bottomToast\");\n\n/*\n * Helper functions\n */\nfunction htoa(h) {\n return Uint8Array.from(buffer__WEBPACK_IMPORTED_MODULE_2__.Buffer.from(h, \"hex\"));\n}\nfunction toast(title, message) {\n toastDiv.children[0].children[0].innerHTML = title;\n toastDiv.children[1].innerHTML = message;\n toastDiv.classList.remove(\"hide\");\n toastDiv.classList.add(\"show\");\n toastDiv.classList.add(\"showing\");\n setTimeout(function () {\n toastDiv.classList.remove(\"show\");\n toastDiv.classList.remove(\"showing\");\n toastDiv.classList.add(\"hide\");\n }, 3000);\n}\nfunction fetchWithAuth(_x, _x2) {\n return _fetchWithAuth.apply(this, arguments);\n}\nfunction _fetchWithAuth() {\n _fetchWithAuth = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(input, init) {\n var response;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n if (init == undefined || init == null) {\n init = {};\n }\n if (init[\"headers\"] == null) {\n init[\"headers\"] = {};\n }\n if (window.sessionStorage.getItem(\"access_token\")) {\n _context.next = 5;\n break;\n }\n _context.next = 5;\n return login();\n case 5:\n init[\"headers\"][\"Authorization\"] = \"Bearer \" + window.sessionStorage.getItem(\"access_token\");\n _context.next = 8;\n return fetch(input, init);\n case 8:\n response = _context.sent;\n case 9:\n if (!(response.status == 401)) {\n _context.next = 19;\n break;\n }\n console.log(\"Fetch with auth failed for\", input);\n _context.next = 13;\n return login();\n case 13:\n init[\"headers\"][\"Authorization\"] = \"Bearer \" + window.sessionStorage.getItem(\"access_token\");\n _context.next = 16;\n return fetch(input, init);\n case 16:\n response = _context.sent;\n _context.next = 9;\n break;\n case 19:\n return _context.abrupt(\"return\", response);\n case 20:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return _fetchWithAuth.apply(this, arguments);\n}\nfunction checkResponseForError(_x3, _x4) {\n return _checkResponseForError.apply(this, arguments);\n}\nfunction _checkResponseForError() {\n _checkResponseForError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(response, message) {\n var content;\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(response.status !== 200)) {\n _context2.next = 7;\n break;\n }\n _context2.next = 3;\n return response.text();\n case 3:\n content = _context2.sent;\n console.log(\"Got Response Error:\", message, response);\n alert(message + \"; Status: \" + response.status + \"; Content: \" + content);\n return _context2.abrupt(\"return\", false);\n case 7:\n return _context2.abrupt(\"return\", true);\n case 8:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return _checkResponseForError.apply(this, arguments);\n}\nfunction getConfig() {\n return _getConfig.apply(this, arguments);\n}\nfunction _getConfig() {\n _getConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n var config_request;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n if (!(config == undefined)) {\n _context3.next = 12;\n break;\n }\n _context3.next = 3;\n return fetch(\"config.json\");\n case 3:\n config_request = _context3.sent;\n console.log(\"Loading config\");\n _context3.next = 7;\n return checkResponseForError(config_request, \"Could not load config\");\n case 7:\n if (!_context3.sent) {\n _context3.next = 12;\n break;\n }\n _context3.next = 10;\n return config_request.json();\n case 10:\n config = _context3.sent;\n console.log(\"Loaded config\");\n case 12:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n return _getConfig.apply(this, arguments);\n}\nfunction login(_x5) {\n return _login.apply(this, arguments);\n}\nfunction _login() {\n _login = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(passwordToTry) {\n var loginSuccess, password, form, response, result;\n return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n console.log(\"Performing login\");\n loginSuccess = false;\n case 2:\n if (passwordToTry !== undefined) {\n console.log(\"Using password to try from parameter\");\n password = passwordToTry;\n passwordToTry = undefined;\n } else {\n console.log(\"Prompting user for shared secret.\");\n password = prompt(\"provide the shared secret\");\n }\n form = new FormData();\n form.append(\"grant_type\", \"password\");\n form.append(\"username\", \"worker\");\n form.append(\"password\", password);\n console.log(\"Requesting token.\");\n _context4.next = 10;\n return fetch(config.backend_url + \"/token\", {\n method: \"POST\",\n body: form\n });\n case 10:\n response = _context4.sent;\n _context4.next = 13;\n return checkResponseForError(response, \"Login failed\");\n case 13:\n if (!_context4.sent) {\n _context4.next = 20;\n break;\n }\n _context4.next = 16;\n return response.json();\n case 16:\n result = _context4.sent;\n console.log(\"Got token\");\n window.sessionStorage.setItem(\"access_token\", result.access_token);\n loginSuccess = true;\n case 20:\n if (!loginSuccess) {\n _context4.next = 2;\n break;\n }\n case 21:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return _login.apply(this, arguments);\n}\nfunction updateItemsView() {\n console.log(\"Updating items view\");\n var items = document.querySelector(\"#items\");\n items.innerHTML = \"\";\n for (var item in received_items) {\n var li = document.createElement(\"li\");\n console.log(item);\n console.log(received_items[item]);\n li.innerHTML = \"<div id=\\\"item_\" + received_items[item].item.uuid + \"\\\" class=\\\"alert alert-success\\\" role=\\\"alert\\\">\" + received_items[item].item.tag + \" (\" + received_items[item].item.addressee + \", \" + received_items[item].item.team + \")\" + \" <span class=\\\"badge badge-light\\\">\" + received_items[item].num + \"</span>\" + \" <button class=\\\"btn btn-primary\\\" onclick=\\\"lib.increaseItemCount('\" + received_items[item].item.uuid + \"')\\\">+</button>\" + \" <button class=\\\"btn btn-primary\\\" onclick=\\\"lib.decreaseItemCount('\" + received_items[item].item.uuid + \"')\\\">-</button></div>\";\n items.appendChild(li);\n }\n}\n\n/*\n * various add Items functions\n */\n\nfunction onTagTextUpdate(_x6) {\n return _onTagTextUpdate.apply(this, arguments);\n}\nfunction _onTagTextUpdate() {\n _onTagTextUpdate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(element) {\n return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(element.value.length == 0)) {\n _context5.next = 5;\n break;\n }\n element.setCustomValidity(\"\");\n element.classList.remove(\"is-invalid\");\n _context5.next = 12;\n break;\n case 5:\n if (!(element.value.length != 6)) {\n _context5.next = 11;\n break;\n }\n element.setCustomValidity(\"Code must be 6 chars long.\");\n element.classList.add(\"is-invalid\");\n return _context5.abrupt(\"return\");\n case 11:\n tagEntered(element);\n case 12:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return _onTagTextUpdate.apply(this, arguments);\n}\nfunction onTagInputChanged(_x7) {\n return _onTagInputChanged.apply(this, arguments);\n}\nfunction _onTagInputChanged() {\n _onTagInputChanged = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(element) {\n return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n // Element lost focus or user pressed enter\n if (element.value.length == 6) {\n tagEntered(element);\n } else {\n element.reportValidity();\n }\n case 1:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6);\n }));\n return _onTagInputChanged.apply(this, arguments);\n}\nfunction tagEntered(_x8) {\n return _tagEntered.apply(this, arguments);\n}\nfunction _tagEntered() {\n _tagEntered = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(element) {\n var tag, succ;\n return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n tag = element.value;\n console.log(\"Tag Entered\", tag);\n if (!currentlyAddingItemByTag.has(tag)) {\n _context7.next = 4;\n break;\n }\n return _context7.abrupt(\"return\");\n case 4:\n currentlyAddingItemByTag.set(tag, \"\");\n _context7.next = 7;\n return addItemByTag(element.value);\n case 7:\n succ = _context7.sent;\n if (succ) {\n element.classList.remove(\"is-invalid\");\n element.value = \"\";\n element.setCustomValidity(\"\");\n } else {\n element.setCustomValidity(\"Unknown item\");\n element.classList.add(\"is-invalid\");\n }\n element.reportValidity();\n currentlyAddingItemByTag[\"delete\"](tag);\n case 11:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n return _tagEntered.apply(this, arguments);\n}\nfunction addItemByTag(_x9) {\n return _addItemByTag.apply(this, arguments);\n}\nfunction _addItemByTag() {\n _addItemByTag = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(tag) {\n var response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n if (!(tag.length != 6)) {\n _context8.next = 2;\n break;\n }\n throw \"Internal Error: Tag not length 6.\";\n case 2:\n tag = tag.toLowerCase();\n console.log(\"Trying to add item by tag:\", tag);\n _context8.next = 6;\n return fetchWithAuth(config.backend_url + \"/tag/\" + tag);\n case 6:\n response = _context8.sent;\n if (!(response.status == 200)) {\n _context8.next = 19;\n break;\n }\n _context8.next = 10;\n return response.json();\n case 10:\n tracking_item = _context8.sent;\n if (tracking_item.received_at != null && tracking_item.deployed_at == null) {\n alert(\"item already checked in at \" + tracking_item.storage);\n }\n if (tracking_item.uuid in received_items) {\n received_items[tracking_item.uuid].num += 1;\n } else {\n received_items[tracking_item.uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n }\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by tag\");\n return _context8.abrupt(\"return\", true);\n case 19:\n if (!(response.status == 404)) {\n _context8.next = 24;\n break;\n }\n console.log(\"Item not found\");\n return _context8.abrupt(\"return\", false);\n case 24:\n checkResponseForError(response, \"Failed to get item from backend\");\n return _context8.abrupt(\"return\", false);\n case 26:\n case \"end\":\n return _context8.stop();\n }\n }, _callee8);\n }));\n return _addItemByTag.apply(this, arguments);\n}\nfunction handleQrError(_x10, _x11) {\n return _handleQrError.apply(this, arguments);\n}\nfunction _handleQrError() {\n _handleQrError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(msg, err) {\n return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n return _context9.abrupt(\"return\");\n case 1:\n case \"end\":\n return _context9.stop();\n }\n }, _callee9);\n }));\n return _handleQrError.apply(this, arguments);\n}\nfunction debounceScanner() {\n if (scanner.getState() != html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScannerState.SCANNING) {\n return;\n }\n scanner.pause(false);\n setTimeout(function () {\n if (scanner.getState() == html5_qrcode__WEBPACK_IMPORTED_MODULE_0__.Html5QrcodeScannerState.PAUSED) {\n scanner.resume();\n }\n }, 1000);\n}\nfunction handleItemScanResult(_x12) {\n return _handleItemScanResult.apply(this, arguments);\n}\nfunction _handleItemScanResult() {\n _handleItemScanResult = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(item_uuid) {\n var response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n debounceScanner();\n if (!(item_uuid.length == 36)) {\n _context10.next = 28;\n break;\n }\n console.log(\"Trying to add item by uuid (scanned)\");\n if (!(item_uuid in received_items)) {\n _context10.next = 10;\n break;\n }\n received_items[item_uuid].num += 1;\n console.log(\"Increased count of existing item uuid\");\n updateItemsView();\n scanner_audio.play();\n _context10.next = 26;\n break;\n case 10:\n received_items[item_uuid] = {\n \"num\": 1,\n \"item\": null\n };\n _context10.next = 13;\n return fetchWithAuth(config.backend_url + \"/item/\" + item_uuid);\n case 13:\n response = _context10.sent;\n if (!(response.status == 200)) {\n _context10.next = 25;\n break;\n }\n _context10.next = 17;\n return response.json();\n case 17:\n tracking_item = _context10.sent;\n if (tracking_item.received_at != null && tracking_item.deployed_at == null) {\n alert(\"item already checked in at \" + tracking_item.storage);\n }\n received_items[item_uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by uuid.\");\n _context10.next = 26;\n break;\n case 25:\n if (response.status == 404) {\n alert(\"Item not found\");\n console.log(\"Item not found\");\n } else {\n alert(response.status);\n checkResponseForError(response, \"Failed to get item from backend\");\n }\n case 26:\n _context10.next = 29;\n break;\n case 28:\n alert(\"QR Code is not a bgp checkin code.\");\n case 29:\n case \"end\":\n return _context10.stop();\n }\n }, _callee10);\n }));\n return _handleItemScanResult.apply(this, arguments);\n}\nfunction addItemScan() {\n return _addItemScan.apply(this, arguments);\n}\nfunction _addItemScan() {\n _addItemScan = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {\n return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n console.log(\"Starting scanner\");\n scanner.render(handleItemScanResult, handleQrError);\n document.getElementById(\"startScan\").style.display = \"none\";\n document.getElementById(\"stopScan\").style.display = \"inline-block\";\n case 4:\n case \"end\":\n return _context11.stop();\n }\n }, _callee11);\n }));\n return _addItemScan.apply(this, arguments);\n}\nfunction stopScanningItem() {\n return _stopScanningItem.apply(this, arguments);\n}\nfunction _stopScanningItem() {\n _stopScanningItem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {\n return _regeneratorRuntime().wrap(function _callee12$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n console.log(\"Stopping scanner\");\n scanner.clear();\n document.getElementById(\"startScan\").style.display = \"inline-block\";\n document.getElementById(\"stopScan\").style.display = \"none\";\n case 4:\n case \"end\":\n return _context12.stop();\n }\n }, _callee12);\n }));\n return _stopScanningItem.apply(this, arguments);\n}\nfunction addItemImage(_x13) {\n return _addItemImage.apply(this, arguments);\n}\nfunction _addItemImage() {\n _addItemImage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(e) {\n var form, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee13$(_context13) {\n while (1) switch (_context13.prev = _context13.next) {\n case 0:\n console.log(\"Adding item by image\");\n form = new FormData();\n form.append(\"image\", e.files[0]);\n _context13.next = 5;\n return fetchWithAuth(config.backend_url + \"/item/register\", {\n method: \"POST\",\n body: form\n });\n case 5:\n response = _context13.sent;\n _context13.next = 8;\n return checkResponseForError(response, \"Failed to save item\");\n case 8:\n if (!_context13.sent) {\n _context13.next = 16;\n break;\n }\n _context13.next = 11;\n return response.json();\n case 11:\n tracking_item = _context13.sent;\n received_items[tracking_item.uuid] = {\n \"num\": 1,\n \"item\": tracking_item\n };\n updateItemsView();\n scanner_audio.play();\n console.log(\"Added item by image.\");\n case 16:\n case \"end\":\n return _context13.stop();\n }\n }, _callee13);\n }));\n return _addItemImage.apply(this, arguments);\n}\nfunction decreaseItemCount(_x14) {\n return _decreaseItemCount.apply(this, arguments);\n}\nfunction _decreaseItemCount() {\n _decreaseItemCount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(uuid) {\n return _regeneratorRuntime().wrap(function _callee14$(_context14) {\n while (1) switch (_context14.prev = _context14.next) {\n case 0:\n if (!(received_items[uuid] == null)) {\n _context14.next = 3;\n break;\n }\n console.log(\"Trying to decrease item count of unknown item\", uuid);\n return _context14.abrupt(\"return\");\n case 3:\n console.log(\"Decreasing item count of\", uuid);\n received_items[uuid][\"num\"]--;\n if (received_items[uuid][\"num\"] <= 0) {\n delete received_items[uuid];\n }\n updateItemsView();\n case 7:\n case \"end\":\n return _context14.stop();\n }\n }, _callee14);\n }));\n return _decreaseItemCount.apply(this, arguments);\n}\nfunction increaseItemCount(_x15) {\n return _increaseItemCount.apply(this, arguments);\n}\n\n/*\n * Checkin the selected items\n */\nfunction _increaseItemCount() {\n _increaseItemCount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(uuid) {\n return _regeneratorRuntime().wrap(function _callee15$(_context15) {\n while (1) switch (_context15.prev = _context15.next) {\n case 0:\n if (!(received_items[uuid] == null)) {\n _context15.next = 3;\n break;\n }\n console.log(\"Trying to increase item count of unknown item\", uuid);\n return _context15.abrupt(\"return\");\n case 3:\n console.log(\"Increasing item count of\", uuid);\n received_items[uuid][\"num\"]++;\n updateItemsView();\n case 6:\n case \"end\":\n return _context15.stop();\n }\n }, _callee15);\n }));\n return _increaseItemCount.apply(this, arguments);\n}\nfunction checkinItems() {\n return _checkinItems.apply(this, arguments);\n}\nfunction _checkinItems() {\n _checkinItems = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {\n var successfullCount, item, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee16$(_context16) {\n while (1) switch (_context16.prev = _context16.next) {\n case 0:\n console.log(\"Checking in items\");\n successfullCount = 0;\n _context16.t0 = _regeneratorRuntime().keys(received_items);\n case 3:\n if ((_context16.t1 = _context16.t0()).done) {\n _context16.next = 18;\n break;\n }\n item = _context16.t1.value;\n _context16.next = 7;\n return fetchWithAuth(config.backend_url + \"/checkin\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n \"item_uuid\": received_items[item].item.uuid,\n \"storage_name\": document.querySelector(\"#storage_select\").value,\n \"amount\": received_items[item].num\n })\n });\n case 7:\n response = _context16.sent;\n _context16.next = 10;\n return checkResponseForError(response, \"Failed to checkin item \" + received_items[item].item.tag);\n case 10:\n if (!_context16.sent) {\n _context16.next = 16;\n break;\n }\n _context16.next = 13;\n return response.json();\n case 13:\n tracking_item = _context16.sent;\n // eslint-disable-line no-unused-vars\n delete received_items[tracking_item.uuid];\n successfullCount++;\n case 16:\n _context16.next = 3;\n break;\n case 18:\n toast(\"Check-In successfull.\", \"The check-in of \" + successfullCount + \" items completed succesfully.\");\n updateItemsView();\n case 20:\n case \"end\":\n return _context16.stop();\n }\n }, _callee16);\n }));\n return _checkinItems.apply(this, arguments);\n}\nfunction updateCheckoutItem(tracking_item) {\n document.querySelector(\"#uuid\").innerHTML = tracking_item.uuid;\n document.querySelector(\"#tag\").innerHTML = tracking_item.tag;\n document.querySelector(\"#storage\").innerHTML = tracking_item.storage;\n document.querySelector(\"#addressee\").innerHTML = tracking_item.addressee;\n document.querySelector(\"#team\").innerHTML = tracking_item.team;\n}\nfunction checkoutItem() {\n return _checkoutItem.apply(this, arguments);\n}\nfunction _checkoutItem() {\n _checkoutItem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {\n var confirmed, response;\n return _regeneratorRuntime().wrap(function _callee17$(_context17) {\n while (1) switch (_context17.prev = _context17.next) {\n case 0:\n confirmed = confirm(\"Did you make sure the recipient is really the right person?\");\n if (confirmed) {\n _context17.next = 4;\n break;\n }\n console.log(\"Recipient confirmation denied.\");\n return _context17.abrupt(\"return\");\n case 4:\n _context17.next = 6;\n return fetchWithAuth(config.backend_url + \"/checkout/\" + document.querySelector(\"#uuid\").innerHTML);\n case 6:\n response = _context17.sent;\n case 7:\n case \"end\":\n return _context17.stop();\n }\n }, _callee17);\n }));\n return _checkoutItem.apply(this, arguments);\n}\nfunction onRecevierScanSuccess(_x16) {\n return _onRecevierScanSuccess.apply(this, arguments);\n}\nfunction _onRecevierScanSuccess() {\n _onRecevierScanSuccess = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(scannedCode) {\n var _scannedCode$split, _scannedCode$split2, uuid, signature, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee18$(_context18) {\n while (1) switch (_context18.prev = _context18.next) {\n case 0:\n debounceScanner();\n _scannedCode$split = scannedCode.split(\"/\"), _scannedCode$split2 = _slicedToArray(_scannedCode$split, 2), uuid = _scannedCode$split2[0], signature = _scannedCode$split2[1];\n console.log(\"Receiver scan success\");\n scanner_audio.play();\n _context18.next = 6;\n return getConfig();\n case 6:\n _context18.next = 8;\n return fetchWithAuth(config.backend_url + \"/item/\" + uuid);\n case 8:\n response = _context18.sent;\n if (!(response.status == 200)) {\n _context18.next = 26;\n break;\n }\n _context18.next = 12;\n return response.json();\n case 12:\n tracking_item = _context18.sent;\n if (!_noble_curves_ed448__WEBPACK_IMPORTED_MODULE_1__.ed448.verify(htoa(signature), new TextEncoder().encode(tracking_item.uuid), htoa(tracking_item.verification))) {\n _context18.next = 22;\n break;\n }\n if (!(tracking_item.storage == undefined || tracking_item.storage == null || tracking_item.storage.length == 0)) {\n _context18.next = 18;\n break;\n }\n alert(\"Item not yet received.\");\n console.log(\"Item not yet received.\");\n return _context18.abrupt(\"return\");\n case 18:\n updateCheckoutItem(tracking_item);\n console.log(\"Receiver verify success\");\n _context18.next = 24;\n break;\n case 22:\n alert(\"Could not verify signature.\");\n console.log(\"Could not verify signature.\");\n case 24:\n _context18.next = 27;\n break;\n case 26:\n if (response.status == 404) {\n alert(\"Item not found.\");\n } else {\n checkResponseForError(response, \"Failed to get item from backend.\");\n }\n case 27:\n case \"end\":\n return _context18.stop();\n }\n }, _callee18);\n }));\n return _onRecevierScanSuccess.apply(this, arguments);\n}\nfunction scanReceiver() {\n return _scanReceiver.apply(this, arguments);\n}\nfunction _scanReceiver() {\n _scanReceiver = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {\n return _regeneratorRuntime().wrap(function _callee19$(_context19) {\n while (1) switch (_context19.prev = _context19.next) {\n case 0:\n console.log(\"Scanning receiver.\");\n scanner.render(onRecevierScanSuccess, handleQrError);\n case 2:\n case \"end\":\n return _context19.stop();\n }\n }, _callee19);\n }));\n return _scanReceiver.apply(this, arguments);\n}\nfunction loadStorages(_x17) {\n return _loadStorages.apply(this, arguments);\n}\nfunction _loadStorages() {\n _loadStorages = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20(selectedStorage) {\n var response, storages, select, i, option;\n return _regeneratorRuntime().wrap(function _callee20$(_context20) {\n while (1) switch (_context20.prev = _context20.next) {\n case 0:\n console.log(\"Retrieving storages\");\n _context20.next = 3;\n return fetchWithAuth(config.backend_url + \"/storages\");\n case 3:\n response = _context20.sent;\n _context20.next = 6;\n return checkResponseForError(response, \"Failed to load storages.\");\n case 6:\n if (!_context20.sent) {\n _context20.next = 13;\n break;\n }\n _context20.next = 9;\n return response.json();\n case 9:\n storages = _context20.sent;\n select = document.querySelector(\"#storage_select\");\n console.log(\"Got storages\");\n for (i in storages) {\n option = document.createElement(\"option\");\n option.textContent = storages[i].name;\n option.value = storages[i].name;\n select.appendChild(option);\n if (selectedStorage == storages[i].name) {\n select.value = selectedStorage;\n }\n }\n case 13:\n case \"end\":\n return _context20.stop();\n }\n }, _callee20);\n }));\n return _loadStorages.apply(this, arguments);\n}\nfunction onPageLoad(_x18) {\n return _onPageLoad.apply(this, arguments);\n}\nfunction _onPageLoad() {\n _onPageLoad = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(doloadStorages) {\n var pw;\n return _regeneratorRuntime().wrap(function _callee21$(_context21) {\n while (1) switch (_context21.prev = _context21.next) {\n case 0:\n _context21.next = 2;\n return getConfig();\n case 2:\n pw = window.location.hash.substring(1);\n if (!(pw.length > 1)) {\n _context21.next = 8;\n break;\n }\n _context21.next = 6;\n return login(pw);\n case 6:\n _context21.next = 10;\n break;\n case 8:\n _context21.next = 10;\n return login();\n case 10:\n if (doloadStorages) {\n loadStorages(document.location.search.substring(1));\n }\n case 11:\n case \"end\":\n return _context21.stop();\n }\n }, _callee21);\n }));\n return _onPageLoad.apply(this, arguments);\n}\nfunction checkoutByTag() {\n return _checkoutByTag.apply(this, arguments);\n}\nfunction _checkoutByTag() {\n _checkoutByTag = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22() {\n var el, response, tracking_item;\n return _regeneratorRuntime().wrap(function _callee22$(_context22) {\n while (1) switch (_context22.prev = _context22.next) {\n case 0:\n console.log(\"Checkout by tag\");\n el = document.getElementById(\"checkoutByTag\");\n if (!(el.value.length != 6)) {\n _context22.next = 6;\n break;\n }\n alert(\"Not a BGP tag!\");\n console.log(\"Not a BGP tag\");\n return _context22.abrupt(\"return\");\n case 6:\n _context22.next = 8;\n return fetchWithAuth(config.backend_url + \"/tag/\" + el.value);\n case 8:\n response = _context22.sent;\n if (!(response.status == 200)) {\n _context22.next = 21;\n break;\n }\n _context22.next = 12;\n return response.json();\n case 12:\n tracking_item = _context22.sent;\n if (!(tracking_item.storage == undefined || tracking_item.storage == null || tracking_item.storage.length == 0)) {\n _context22.next = 17;\n break;\n }\n alert(\"Item not yet received.\");\n console.log(\"Item not yet received.\");\n return _context22.abrupt(\"return\");\n case 17:\n console.log(\"Checkout item by tag success.\");\n updateCheckoutItem(tracking_item);\n _context22.next = 22;\n break;\n case 21:\n if (response.status == 404) {\n console.log(\"Item not found\");\n alert(\"Item not found!\");\n } else {\n checkResponseForError(response, \"Failed to get item from backend\");\n }\n case 22:\n case \"end\":\n return _context22.stop();\n }\n }, _callee22);\n }));\n return _checkoutByTag.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvbWFpbi5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9saWIvLi9zcmMvanMvbWFpbi5qcz8wMDNhIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pW1wicmV0dXJuXCJdICYmIChfciA9IF9pW1wicmV0dXJuXCJdKCksIE9iamVjdChfcikgIT09IF9yKSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgeyBcInVzZSBzdHJpY3RcIjsgLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUgLS0gQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuIC0tIGxpY2Vuc2UgKE1JVCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vTElDRU5TRSAqLyBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsgcmV0dXJuIGV4cG9ydHM7IH07IHZhciBleHBvcnRzID0ge30sIE9wID0gT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgeyBvYmpba2V5XSA9IGRlc2MudmFsdWU7IH0sICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LCBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCIsIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIiwgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiOyBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH0pLCBvYmpba2V5XTsgfSB0cnkgeyBkZWZpbmUoe30sIFwiXCIpOyB9IGNhdGNoIChlcnIpIHsgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgeyByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsgfTsgfSBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7IHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLCBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7IHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIH0pLCBnZW5lcmF0b3I7IH0gZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7IHRyeSB7IHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTsgfSBjYXRjaCAoZXJyKSB7IHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTsgfSB9IGV4cG9ydHMud3JhcCA9IHdyYXA7IHZhciBDb250aW51ZVNlbnRpbmVsID0ge307IGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9IGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30gZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fSB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7IHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpOyBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7IFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOyB9KTsgfSk7IH0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7IGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7IHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOyBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkgeyB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywgdmFsdWUgPSByZXN1bHQudmFsdWU7IHJldHVybiB2YWx1ZSAmJiBcIm9iamVjdFwiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7IGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpOyB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkgeyByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsgfSwgZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmVqZWN0KHJlY29yZC5hcmcpOyB9IHZhciBwcmV2aW91c1Byb21pc2U7IGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShtZXRob2QsIGFyZykgeyBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOyB9IH0pOyB9IGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgeyB2YXIgc3RhdGUgPSBcInN1c3BlbmRlZFN0YXJ0XCI7IHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsgaWYgKFwiZXhlY3V0aW5nXCIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpOyBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHsgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7IHJldHVybiBkb25lUmVzdWx0KCk7IH0gZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7OykgeyB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOyBpZiAoZGVsZWdhdGUpIHsgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7IGlmIChkZWxlZ2F0ZVJlc3VsdCkgeyBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOyByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7IH0gfSBpZiAoXCJuZXh0XCIgPT09IGNvbnRleHQubWV0aG9kKSBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7ZWxzZSBpZiAoXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkgeyBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZzsgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7IH0gZWxzZSBcInJldHVyblwiID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7IHN0YXRlID0gXCJleGVjdXRpbmdcIjsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOyBpZiAoXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUpIHsgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwic3VzcGVuZGVkWWllbGRcIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7IHJldHVybiB7IHZhbHVlOiByZWNvcmQuYXJnLCBkb25lOiBjb250ZXh0LmRvbmUgfTsgfSBcInRocm93XCIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOyB9IH07IH0gZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgeyB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLCBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbDsgdmFyIGluZm8gPSByZWNvcmQuYXJnOyByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgXCJyZXR1cm5cIiAhPT0gY29udGV4dC5tZXRob2QgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIiksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKTsgfSBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykgeyB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9OyAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsgfSBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7IHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9OyByZWNvcmQudHlwZSA9IFwibm9ybWFsXCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOyB9IGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHsgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsgfSBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHsgaWYgKGl0ZXJhYmxlKSB7IHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7IGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGl0ZXJhYmxlLm5leHQpIHJldHVybiBpdGVyYWJsZTsgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7IHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkgeyBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7IHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsgfTsgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7IH0gfSByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07IH0gZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogITAgfTsgfSByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZVByb3BlcnR5KEdwLCBcImNvbnN0cnVjdG9yXCIsIHsgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBjb25maWd1cmFibGU6ICEwIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwgY29uZmlndXJhYmxlOiAhMCB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7IHZhciBjdG9yID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOyByZXR1cm4gISFjdG9yICYmIChjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgPT09IChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkpOyB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7IHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOyB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykgeyByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTsgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOyByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsgfSk7IH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSwgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7IH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7IHZhciBvYmplY3QgPSBPYmplY3QodmFsKSwga2V5cyA9IFtdOyBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBrZXlzLnB1c2goa2V5KTsgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgeyBmb3IgKDsga2V5cy5sZW5ndGg7KSB7IHZhciBrZXkgPSBrZXlzLnBvcCgpOyBpZiAoa2V5IGluIG9iamVjdCkgcmV0dXJuIG5leHQudmFsdWUgPSBrZXksIG5leHQuZG9uZSA9ICExLCBuZXh0OyB9IHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsgfTsgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0geyBjb25zdHJ1Y3RvcjogQ29udGV4dCwgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSBcInRcIiA9PT0gbmFtZS5jaGFyQXQoMCkgJiYgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiYgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSAmJiAodGhpc1tuYW1lXSA9IHVuZGVmaW5lZCk7IH0sIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7IHRoaXMuZG9uZSA9ICEwOyB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOyBpZiAoXCJ0aHJvd1wiID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOyByZXR1cm4gdGhpcy5ydmFsOyB9LCBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7IGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjsgdmFyIGNvbnRleHQgPSB0aGlzOyBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHsgcmV0dXJuIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCAhIWNhdWdodDsgfSBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSwgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsgaWYgKFwicm9vdFwiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoXCJlbmRcIik7IGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7IHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpLCBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTsgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOyB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOyB9IGVsc2UgeyBpZiAoIWhhc0ZpbmFsbHkpIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpOyBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsgfSB9IH0gfSwgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OyBicmVhazsgfSB9IGZpbmFsbHlFbnRyeSAmJiAoXCJicmVha1wiID09PSB0eXBlIHx8IFwiY29udGludWVcIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTsgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307IHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7IH0sIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB0aHJvdyByZWNvcmQuYXJnOyByZXR1cm4gXCJicmVha1wiID09PSByZWNvcmQudHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6IFwicmV0dXJuXCIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSBcInJldHVyblwiLCB0aGlzLm5leHQgPSBcImVuZFwiKSA6IFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7IH0sIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07IGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSByZXR1cm4gdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkoZW50cnkpLCBDb250aW51ZVNlbnRpbmVsOyB9IH0sIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7IHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgeyB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsgcmVzZXRUcnlFbnRyeShlbnRyeSk7IH0gcmV0dXJuIHRocm93bjsgfSB9IHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTsgfSwgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgeyByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsIG5leHRMb2M6IG5leHRMb2MgfSwgXCJuZXh0XCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7IH0gfSwgZXhwb3J0czsgfVxuZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfVxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9XG5pbXBvcnQgeyBIdG1sNVFyY29kZVNjYW5uZXIsIEh0bWw1UXJjb2RlU2Nhbm5lclN0YXRlLCBIdG1sNVFyY29kZVN1cHBvcnRlZEZvcm1hdHMgfSBmcm9tIFwiaHRtbDUtcXJjb2RlXCI7XG5pbXBvcnQgeyBlZDQ0OCB9IGZyb20gXCJAbm9ibGUvY3VydmVzL2VkNDQ4XCI7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyXCI7XG52YXIgY3VycmVudGx5QWRkaW5nSXRlbUJ5VGFnID0gbmV3IE1hcCgpO1xudmFyIHJlY2VpdmVkX2l0ZW1zID0ge307XG52YXIgY29uZmlnO1xudmFyIHNjYW5uZXIgPSBuZXcgSHRtbDVRcmNvZGVTY2FubmVyKFwicmVhZGVyXCIsIHtcbiAgZnBzOiAxMCxcbiAgcXJib3g6IHtcbiAgICB3aWR0aDogMjUwLFxuICAgIGhlaWdodDogMjUwXG4gIH0sXG4gIHNob3dUb3JjaEJ1dHRvbklmU3VwcG9ydGVkOiB0cnVlLFxuICBmb3JtYXRzVG9TdXBwb3J0OiBbSHRtbDVRcmNvZGVTdXBwb3J0ZWRGb3JtYXRzLlFSX0NPREVdLFxuICAvL3RoZXJlIGFyZSBtYW55IG90aGVyIHR5cGVzIG9mIGNvZGVzIG9uIHRoZSBsYWJlbHMgd2UgZG8gbm90IHdhbnRcbiAgcmVtZW1iZXJMYXN0VXNlZENhbWVyYTogdHJ1ZVxufSk7XG52YXIgc2Nhbm5lcl9hdWRpbyA9IG5ldyBBdWRpbyhcIi9iZWVwLndhdlwiKTtcbnNjYW5uZXJfYXVkaW8ubG9hZCgpO1xudmFyIHRvYXN0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJib3R0b21Ub2FzdFwiKTtcblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqL1xuZnVuY3Rpb24gaHRvYShoKSB7XG4gIHJldHVybiBVaW50OEFycmF5LmZyb20oQnVmZmVyLmZyb20oaCwgXCJoZXhcIikpO1xufVxuZnVuY3Rpb24gdG9hc3QodGl0bGUsIG1lc3NhZ2UpIHtcbiAgdG9hc3REaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uaW5uZXJIVE1MID0gdGl0bGU7XG4gIHRvYXN0RGl2LmNoaWxkcmVuWzFdLmlubmVySFRNTCA9IG1lc3NhZ2U7XG4gIHRvYXN0RGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRlXCIpO1xuICB0b2FzdERpdi5jbGFzc0xpc3QuYWRkKFwic2hvd1wiKTtcbiAgdG9hc3REaXYuY2xhc3NMaXN0LmFkZChcInNob3dpbmdcIik7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRvYXN0RGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJzaG93XCIpO1xuICAgIHRvYXN0RGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJzaG93aW5nXCIpO1xuICAgIHRvYXN0RGl2LmNsYXNzTGlzdC5hZGQoXCJoaWRlXCIpO1xuICB9LCAzMDAwKTtcbn1cbmZ1bmN0aW9uIGZldGNoV2l0aEF1dGgoX3gsIF94Mikge1xuICByZXR1cm4gX2ZldGNoV2l0aEF1dGguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9mZXRjaFdpdGhBdXRoKCkge1xuICBfZmV0Y2hXaXRoQXV0aCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShpbnB1dCwgaW5pdCkge1xuICAgIHZhciByZXNwb25zZTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoaW5pdCA9PSB1bmRlZmluZWQgfHwgaW5pdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbml0ID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbml0W1wiaGVhZGVyc1wiXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbml0W1wiaGVhZGVyc1wiXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAod2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgIHJldHVybiBsb2dpbigpO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgaW5pdFtcImhlYWRlcnNcIl1bXCJBdXRob3JpemF0aW9uXCJdID0gXCJCZWFyZXIgXCIgKyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc190b2tlblwiKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dC5zZW50O1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID09IDQwMSkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxOTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZldGNoIHdpdGggYXV0aCBmYWlsZWQgZm9yXCIsIGlucHV0KTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgcmV0dXJuIGxvZ2luKCk7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgaW5pdFtcImhlYWRlcnNcIl1bXCJBdXRob3JpemF0aW9uXCJdID0gXCJCZWFyZXIgXCIgKyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc190b2tlblwiKTtcbiAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCByZXNwb25zZSk7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfZmV0Y2hXaXRoQXV0aC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gY2hlY2tSZXNwb25zZUZvckVycm9yKF94MywgX3g0KSB7XG4gIHJldHVybiBfY2hlY2tSZXNwb25zZUZvckVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfY2hlY2tSZXNwb25zZUZvckVycm9yKCkge1xuICBfY2hlY2tSZXNwb25zZUZvckVycm9yID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXNwb25zZSwgbWVzc2FnZSkge1xuICAgIHZhciBjb250ZW50O1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIShyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbnRlbnQgPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkdvdCBSZXNwb25zZSBFcnJvcjpcIiwgbWVzc2FnZSwgcmVzcG9uc2UpO1xuICAgICAgICAgIGFsZXJ0KG1lc3NhZ2UgKyBcIjsgU3RhdHVzOiBcIiArIHJlc3BvbnNlLnN0YXR1cyArIFwiOyBDb250ZW50OiBcIiArIGNvbnRlbnQpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMik7XG4gIH0pKTtcbiAgcmV0dXJuIF9jaGVja1Jlc3BvbnNlRm9yRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGdldENvbmZpZygpIHtcbiAgcmV0dXJuIF9nZXRDb25maWcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9nZXRDb25maWcoKSB7XG4gIF9nZXRDb25maWcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKCkge1xuICAgIHZhciBjb25maWdfcmVxdWVzdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEoY29uZmlnID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAzO1xuICAgICAgICAgIHJldHVybiBmZXRjaChcImNvbmZpZy5qc29uXCIpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY29uZmlnX3JlcXVlc3QgPSBfY29udGV4dDMuc2VudDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkxvYWRpbmcgY29uZmlnXCIpO1xuICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNztcbiAgICAgICAgICByZXR1cm4gY2hlY2tSZXNwb25zZUZvckVycm9yKGNvbmZpZ19yZXF1ZXN0LCBcIkNvdWxkIG5vdCBsb2FkIGNvbmZpZ1wiKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGlmICghX2NvbnRleHQzLnNlbnQpIHtcbiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMDtcbiAgICAgICAgICByZXR1cm4gY29uZmlnX3JlcXVlc3QuanNvbigpO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNvbmZpZyA9IF9jb250ZXh0My5zZW50O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9hZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUzKTtcbiAgfSkpO1xuICByZXR1cm4gX2dldENvbmZpZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gbG9naW4oX3g1KSB7XG4gIHJldHVybiBfbG9naW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9sb2dpbigpIHtcbiAgX2xvZ2luID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNChwYXNzd29yZFRvVHJ5KSB7XG4gICAgdmFyIGxvZ2luU3VjY2VzcywgcGFzc3dvcmQsIGZvcm0sIHJlc3BvbnNlLCByZXN1bHQ7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGVyZm9ybWluZyBsb2dpblwiKTtcbiAgICAgICAgICBsb2dpblN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmIChwYXNzd29yZFRvVHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNpbmcgcGFzc3dvcmQgdG8gdHJ5IGZyb20gcGFyYW1ldGVyXCIpO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZFRvVHJ5O1xuICAgICAgICAgICAgcGFzc3dvcmRUb1RyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tcHRpbmcgdXNlciBmb3Igc2hhcmVkIHNlY3JldC5cIik7XG4gICAgICAgICAgICBwYXNzd29yZCA9IHByb21wdChcInByb3ZpZGUgdGhlIHNoYXJlZCBzZWNyZXRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChcImdyYW50X3R5cGVcIiwgXCJwYXNzd29yZFwiKTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChcInVzZXJuYW1lXCIsIFwid29ya2VyXCIpO1xuICAgICAgICAgIGZvcm0uYXBwZW5kKFwicGFzc3dvcmRcIiwgcGFzc3dvcmQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdGluZyB0b2tlbi5cIik7XG4gICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxMDtcbiAgICAgICAgICByZXR1cm4gZmV0Y2goY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvdG9rZW5cIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IGZvcm1cbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMTM7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJMb2dpbiBmYWlsZWRcIik7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgaWYgKCFfY29udGV4dDQuc2VudCkge1xuICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDE2O1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQ0LnNlbnQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJHb3QgdG9rZW5cIik7XG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIiwgcmVzdWx0LmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgbG9naW5TdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICBpZiAoIWxvZ2luU3VjY2Vzcykge1xuICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTQpO1xuICB9KSk7XG4gIHJldHVybiBfbG9naW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUl0ZW1zVmlldygpIHtcbiAgY29uc29sZS5sb2coXCJVcGRhdGluZyBpdGVtcyB2aWV3XCIpO1xuICB2YXIgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2l0ZW1zXCIpO1xuICBpdGVtcy5pbm5lckhUTUwgPSBcIlwiO1xuICBmb3IgKHZhciBpdGVtIGluIHJlY2VpdmVkX2l0ZW1zKSB7XG4gICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xuICAgIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgIGNvbnNvbGUubG9nKHJlY2VpdmVkX2l0ZW1zW2l0ZW1dKTtcbiAgICBsaS5pbm5lckhUTUwgPSBcIjxkaXYgaWQ9XFxcIml0ZW1fXCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnV1aWQgKyBcIlxcXCIgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcXFwiIHJvbGU9XFxcImFsZXJ0XFxcIj5cIiArIHJlY2VpdmVkX2l0ZW1zW2l0ZW1dLml0ZW0udGFnICsgXCIgKFwiICsgcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS5hZGRyZXNzZWUgKyBcIiwgXCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnRlYW0gKyBcIilcIiArIFwiJmVtc3A7PHNwYW4gY2xhc3M9XFxcImJhZGdlIGJhZGdlLWxpZ2h0XFxcIj5cIiArIHJlY2VpdmVkX2l0ZW1zW2l0ZW1dLm51bSArIFwiPC9zcGFuPlwiICsgXCImZW1zcDs8YnV0dG9uIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIG9uY2xpY2s9XFxcImxpYi5pbmNyZWFzZUl0ZW1Db3VudCgnXCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnV1aWQgKyBcIicpXFxcIj4rPC9idXR0b24+XCIgKyBcIiZlbXNwOzxidXR0b24gY2xhc3M9XFxcImJ0biBidG4tcHJpbWFyeVxcXCIgb25jbGljaz1cXFwibGliLmRlY3JlYXNlSXRlbUNvdW50KCdcIiArIHJlY2VpdmVkX2l0ZW1zW2l0ZW1dLml0ZW0udXVpZCArIFwiJylcXFwiPi08L2J1dHRvbj48L2Rpdj5cIjtcbiAgICBpdGVtcy5hcHBlbmRDaGlsZChsaSk7XG4gIH1cbn1cblxuLypcbiAqIHZhcmlvdXMgYWRkIEl0ZW1zIGZ1bmN0aW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvblRhZ1RleHRVcGRhdGUoX3g2KSB7XG4gIHJldHVybiBfb25UYWdUZXh0VXBkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfb25UYWdUZXh0VXBkYXRlKCkge1xuICBfb25UYWdUZXh0VXBkYXRlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNShlbGVtZW50KSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NS5wcmV2ID0gX2NvbnRleHQ1Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKGVsZW1lbnQudmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDUubmV4dCA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKTtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJpcy1pbnZhbGlkXCIpO1xuICAgICAgICAgIF9jb250ZXh0NS5uZXh0ID0gMTI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpZiAoIShlbGVtZW50LnZhbHVlLmxlbmd0aCAhPSA2KSkge1xuICAgICAgICAgICAgX2NvbnRleHQ1Lm5leHQgPSAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KFwiQ29kZSBtdXN0IGJlIDYgY2hhcnMgbG9uZy5cIik7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICB0YWdFbnRlcmVkKGVsZW1lbnQpO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTUpO1xuICB9KSk7XG4gIHJldHVybiBfb25UYWdUZXh0VXBkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gb25UYWdJbnB1dENoYW5nZWQoX3g3KSB7XG4gIHJldHVybiBfb25UYWdJbnB1dENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vblRhZ0lucHV0Q2hhbmdlZCgpIHtcbiAgX29uVGFnSW5wdXRDaGFuZ2VkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNihlbGVtZW50KSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU2JChfY29udGV4dDYpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Ni5wcmV2ID0gX2NvbnRleHQ2Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIC8vIEVsZW1lbnQgbG9zdCBmb2N1cyBvciB1c2VyIHByZXNzZWQgZW50ZXJcbiAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZS5sZW5ndGggPT0gNikge1xuICAgICAgICAgICAgdGFnRW50ZXJlZChlbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ni5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTYpO1xuICB9KSk7XG4gIHJldHVybiBfb25UYWdJbnB1dENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIHRhZ0VudGVyZWQoX3g4KSB7XG4gIHJldHVybiBfdGFnRW50ZXJlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX3RhZ0VudGVyZWQoKSB7XG4gIF90YWdFbnRlcmVkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNyhlbGVtZW50KSB7XG4gICAgdmFyIHRhZywgc3VjYztcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0Nykge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdGFnID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRhZyBFbnRlcmVkXCIsIHRhZyk7XG4gICAgICAgICAgaWYgKCFjdXJyZW50bHlBZGRpbmdJdGVtQnlUYWcuaGFzKHRhZykpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGN1cnJlbnRseUFkZGluZ0l0ZW1CeVRhZy5zZXQodGFnLCBcIlwiKTtcbiAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDc7XG4gICAgICAgICAgcmV0dXJuIGFkZEl0ZW1CeVRhZyhlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHN1Y2MgPSBfY29udGV4dDcuc2VudDtcbiAgICAgICAgICBpZiAoc3VjYykge1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiaXMtaW52YWxpZFwiKTtcbiAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eShcIlVua25vd24gaXRlbVwiKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImlzLWludmFsaWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICBjdXJyZW50bHlBZGRpbmdJdGVtQnlUYWdbXCJkZWxldGVcIl0odGFnKTtcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDcuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWU3KTtcbiAgfSkpO1xuICByZXR1cm4gX3RhZ0VudGVyZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRJdGVtQnlUYWcoX3g5KSB7XG4gIHJldHVybiBfYWRkSXRlbUJ5VGFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfYWRkSXRlbUJ5VGFnKCkge1xuICBfYWRkSXRlbUJ5VGFnID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlOCh0YWcpIHtcbiAgICB2YXIgcmVzcG9uc2UsIHRyYWNraW5nX2l0ZW07XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU4JChfY29udGV4dDgpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OC5wcmV2ID0gX2NvbnRleHQ4Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKHRhZy5sZW5ndGggIT0gNikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBcIkludGVybmFsIEVycm9yOiBUYWcgbm90IGxlbmd0aCA2LlwiO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJUcnlpbmcgdG8gYWRkIGl0ZW0gYnkgdGFnOlwiLCB0YWcpO1xuICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gNjtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi90YWcvXCIgKyB0YWcpO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDguc2VudDtcbiAgICAgICAgICBpZiAoIShyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQ4Lm5leHQgPSAxOTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDgubmV4dCA9IDEwO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgdHJhY2tpbmdfaXRlbSA9IF9jb250ZXh0OC5zZW50O1xuICAgICAgICAgIGlmICh0cmFja2luZ19pdGVtLnJlY2VpdmVkX2F0ICE9IG51bGwgJiYgdHJhY2tpbmdfaXRlbS5kZXBsb3llZF9hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhbGVydChcIml0ZW0gYWxyZWFkeSBjaGVja2VkIGluIGF0IFwiICsgdHJhY2tpbmdfaXRlbS5zdG9yYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyYWNraW5nX2l0ZW0udXVpZCBpbiByZWNlaXZlZF9pdGVtcykge1xuICAgICAgICAgICAgcmVjZWl2ZWRfaXRlbXNbdHJhY2tpbmdfaXRlbS51dWlkXS5udW0gKz0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjZWl2ZWRfaXRlbXNbdHJhY2tpbmdfaXRlbS51dWlkXSA9IHtcbiAgICAgICAgICAgICAgXCJudW1cIjogMSxcbiAgICAgICAgICAgICAgXCJpdGVtXCI6IHRyYWNraW5nX2l0ZW1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUl0ZW1zVmlldygpO1xuICAgICAgICAgIHNjYW5uZXJfYXVkaW8ucGxheSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkZWQgaXRlbSBieSB0YWdcIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5hYnJ1cHQoXCJyZXR1cm5cIiwgdHJ1ZSk7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID09IDQwNCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0OC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ4LmFicnVwdChcInJldHVyblwiLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgY2hlY2tSZXNwb25zZUZvckVycm9yKHJlc3BvbnNlLCBcIkZhaWxlZCB0byBnZXQgaXRlbSBmcm9tIGJhY2tlbmRcIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5hYnJ1cHQoXCJyZXR1cm5cIiwgZmFsc2UpO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0OC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTgpO1xuICB9KSk7XG4gIHJldHVybiBfYWRkSXRlbUJ5VGFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBoYW5kbGVRckVycm9yKF94MTAsIF94MTEpIHtcbiAgcmV0dXJuIF9oYW5kbGVRckVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfaGFuZGxlUXJFcnJvcigpIHtcbiAgX2hhbmRsZVFyRXJyb3IgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU5KG1zZywgZXJyKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU5JChfY29udGV4dDkpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0OS5wcmV2ID0gX2NvbnRleHQ5Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDkuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlOSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9oYW5kbGVRckVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBkZWJvdW5jZVNjYW5uZXIoKSB7XG4gIGlmIChzY2FubmVyLmdldFN0YXRlKCkgIT0gSHRtbDVRcmNvZGVTY2FubmVyU3RhdGUuU0NBTk5JTkcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2Nhbm5lci5wYXVzZShmYWxzZSk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY2FubmVyLmdldFN0YXRlKCkgPT0gSHRtbDVRcmNvZGVTY2FubmVyU3RhdGUuUEFVU0VEKSB7XG4gICAgICBzY2FubmVyLnJlc3VtZSgpO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59XG5mdW5jdGlvbiBoYW5kbGVJdGVtU2NhblJlc3VsdChfeDEyKSB7XG4gIHJldHVybiBfaGFuZGxlSXRlbVNjYW5SZXN1bHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9oYW5kbGVJdGVtU2NhblJlc3VsdCgpIHtcbiAgX2hhbmRsZUl0ZW1TY2FuUmVzdWx0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTAoaXRlbV91dWlkKSB7XG4gICAgdmFyIHJlc3BvbnNlLCB0cmFja2luZ19pdGVtO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTAkKF9jb250ZXh0MTApIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTAucHJldiA9IF9jb250ZXh0MTAubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZGVib3VuY2VTY2FubmVyKCk7XG4gICAgICAgICAgaWYgKCEoaXRlbV91dWlkLmxlbmd0aCA9PSAzNikpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJ5aW5nIHRvIGFkZCBpdGVtIGJ5IHV1aWQgKHNjYW5uZWQpXCIpO1xuICAgICAgICAgIGlmICghKGl0ZW1fdXVpZCBpbiByZWNlaXZlZF9pdGVtcykpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW2l0ZW1fdXVpZF0ubnVtICs9IDE7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJbmNyZWFzZWQgY291bnQgb2YgZXhpc3RpbmcgaXRlbSB1dWlkXCIpO1xuICAgICAgICAgIHVwZGF0ZUl0ZW1zVmlldygpO1xuICAgICAgICAgIHNjYW5uZXJfYXVkaW8ucGxheSgpO1xuICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW2l0ZW1fdXVpZF0gPSB7XG4gICAgICAgICAgICBcIm51bVwiOiAxLFxuICAgICAgICAgICAgXCJpdGVtXCI6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDEzO1xuICAgICAgICAgIHJldHVybiBmZXRjaFdpdGhBdXRoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL2l0ZW0vXCIgKyBpdGVtX3V1aWQpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJlc3BvbnNlID0gX2NvbnRleHQxMC5zZW50O1xuICAgICAgICAgIGlmICghKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAyNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDEwLm5leHQgPSAxNztcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIHRyYWNraW5nX2l0ZW0gPSBfY29udGV4dDEwLnNlbnQ7XG4gICAgICAgICAgaWYgKHRyYWNraW5nX2l0ZW0ucmVjZWl2ZWRfYXQgIT0gbnVsbCAmJiB0cmFja2luZ19pdGVtLmRlcGxveWVkX2F0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiaXRlbSBhbHJlYWR5IGNoZWNrZWQgaW4gYXQgXCIgKyB0cmFja2luZ19pdGVtLnN0b3JhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWNlaXZlZF9pdGVtc1tpdGVtX3V1aWRdID0ge1xuICAgICAgICAgICAgXCJudW1cIjogMSxcbiAgICAgICAgICAgIFwiaXRlbVwiOiB0cmFja2luZ19pdGVtXG4gICAgICAgICAgfTtcbiAgICAgICAgICB1cGRhdGVJdGVtc1ZpZXcoKTtcbiAgICAgICAgICBzY2FubmVyX2F1ZGlvLnBsYXkoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFkZGVkIGl0ZW0gYnkgdXVpZC5cIik7XG4gICAgICAgICAgX2NvbnRleHQxMC5uZXh0ID0gMjY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSA0MDQpIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiSXRlbSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGZvdW5kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGVydChyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgY2hlY2tSZXNwb25zZUZvckVycm9yKHJlc3BvbnNlLCBcIkZhaWxlZCB0byBnZXQgaXRlbSBmcm9tIGJhY2tlbmRcIik7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIF9jb250ZXh0MTAubmV4dCA9IDI5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgIGFsZXJ0KFwiUVIgQ29kZSBpcyBub3QgYSBiZ3AgY2hlY2tpbiBjb2RlLlwiKTtcbiAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDEwLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTApO1xuICB9KSk7XG4gIHJldHVybiBfaGFuZGxlSXRlbVNjYW5SZXN1bHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRJdGVtU2NhbigpIHtcbiAgcmV0dXJuIF9hZGRJdGVtU2Nhbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2FkZEl0ZW1TY2FuKCkge1xuICBfYWRkSXRlbVNjYW4gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMSgpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTExJChfY29udGV4dDExKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDExLnByZXYgPSBfY29udGV4dDExLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnRpbmcgc2Nhbm5lclwiKTtcbiAgICAgICAgICBzY2FubmVyLnJlbmRlcihoYW5kbGVJdGVtU2NhblJlc3VsdCwgaGFuZGxlUXJFcnJvcik7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGFydFNjYW5cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3RvcFNjYW5cIikuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDExLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTEpO1xuICB9KSk7XG4gIHJldHVybiBfYWRkSXRlbVNjYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdG9wU2Nhbm5pbmdJdGVtKCkge1xuICByZXR1cm4gX3N0b3BTY2FubmluZ0l0ZW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9zdG9wU2Nhbm5pbmdJdGVtKCkge1xuICBfc3RvcFNjYW5uaW5nSXRlbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTEyKCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTIkKF9jb250ZXh0MTIpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTIucHJldiA9IF9jb250ZXh0MTIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJTdG9wcGluZyBzY2FubmVyXCIpO1xuICAgICAgICAgIHNjYW5uZXIuY2xlYXIoKTtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXJ0U2NhblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0b3BTY2FuXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTIuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxMik7XG4gIH0pKTtcbiAgcmV0dXJuIF9zdG9wU2Nhbm5pbmdJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkSXRlbUltYWdlKF94MTMpIHtcbiAgcmV0dXJuIF9hZGRJdGVtSW1hZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9hZGRJdGVtSW1hZ2UoKSB7XG4gIF9hZGRJdGVtSW1hZ2UgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxMyhlKSB7XG4gICAgdmFyIGZvcm0sIHJlc3BvbnNlLCB0cmFja2luZ19pdGVtO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTMkKF9jb250ZXh0MTMpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTMucHJldiA9IF9jb250ZXh0MTMubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZGRpbmcgaXRlbSAgYnkgaW1hZ2VcIik7XG4gICAgICAgICAgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgIGZvcm0uYXBwZW5kKFwiaW1hZ2VcIiwgZS5maWxlc1swXSk7XG4gICAgICAgICAgX2NvbnRleHQxMy5uZXh0ID0gNTtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi9pdGVtL3JlZ2lzdGVyXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBib2R5OiBmb3JtXG4gICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0MTMuc2VudDtcbiAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSA4O1xuICAgICAgICAgIHJldHVybiBjaGVja1Jlc3BvbnNlRm9yRXJyb3IocmVzcG9uc2UsIFwiRmFpbGVkIHRvIHNhdmUgaXRlbVwiKTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGlmICghX2NvbnRleHQxMy5zZW50KSB7XG4gICAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDEzLm5leHQgPSAxMTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHRyYWNraW5nX2l0ZW0gPSBfY29udGV4dDEzLnNlbnQ7XG4gICAgICAgICAgcmVjZWl2ZWRfaXRlbXNbdHJhY2tpbmdfaXRlbS51dWlkXSA9IHtcbiAgICAgICAgICAgIFwibnVtXCI6IDEsXG4gICAgICAgICAgICBcIml0ZW1cIjogdHJhY2tpbmdfaXRlbVxuICAgICAgICAgIH07XG4gICAgICAgICAgdXBkYXRlSXRlbXNWaWV3KCk7XG4gICAgICAgICAgc2Nhbm5lcl9hdWRpby5wbGF5KCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZGRlZCBpdGVtIGJ5IGltYWdlLlwiKTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDEzLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTMpO1xuICB9KSk7XG4gIHJldHVybiBfYWRkSXRlbUltYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjcmVhc2VJdGVtQ291bnQoX3gxNCkge1xuICByZXR1cm4gX2RlY3JlYXNlSXRlbUNvdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZGVjcmVhc2VJdGVtQ291bnQoKSB7XG4gIF9kZWNyZWFzZUl0ZW1Db3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE0KHV1aWQpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE0JChfY29udGV4dDE0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE0LnByZXYgPSBfY29udGV4dDE0Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKHJlY2VpdmVkX2l0ZW1zW3V1aWRdID09IG51bGwpKSB7XG4gICAgICAgICAgICBfY29udGV4dDE0Lm5leHQgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJ5aW5nIHRvIGRlY3JlYXNlIGl0ZW0gY291bnQgb2YgdW5rbm93biBpdGVtXCIsIHV1aWQpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVjcmVhc2luZyBpdGVtIGNvdW50IG9mXCIsIHV1aWQpO1xuICAgICAgICAgIHJlY2VpdmVkX2l0ZW1zW3V1aWRdW1wibnVtXCJdLS07XG4gICAgICAgICAgaWYgKHJlY2VpdmVkX2l0ZW1zW3V1aWRdW1wibnVtXCJdIDw9IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSByZWNlaXZlZF9pdGVtc1t1dWlkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlSXRlbXNWaWV3KCk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDE0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTQpO1xuICB9KSk7XG4gIHJldHVybiBfZGVjcmVhc2VJdGVtQ291bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUl0ZW1Db3VudChfeDE1KSB7XG4gIHJldHVybiBfaW5jcmVhc2VJdGVtQ291bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuLypcbiAqIENoZWNraW4gdGhlIHNlbGVjdGVkIGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIF9pbmNyZWFzZUl0ZW1Db3VudCgpIHtcbiAgX2luY3JlYXNlSXRlbUNvdW50ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMTUodXVpZCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTUkKF9jb250ZXh0MTUpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTUucHJldiA9IF9jb250ZXh0MTUubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCEocmVjZWl2ZWRfaXRlbXNbdXVpZF0gPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTUubmV4dCA9IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJUcnlpbmcgdG8gaW5jcmVhc2UgaXRlbSBjb3VudCBvZiB1bmtub3duIGl0ZW1cIiwgdXVpZCk7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTUuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJbmNyZWFzaW5nIGl0ZW0gY291bnQgb2ZcIiwgdXVpZCk7XG4gICAgICAgICAgcmVjZWl2ZWRfaXRlbXNbdXVpZF1bXCJudW1cIl0rKztcbiAgICAgICAgICB1cGRhdGVJdGVtc1ZpZXcoKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTUuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUxNSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9pbmNyZWFzZUl0ZW1Db3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNraW5JdGVtcygpIHtcbiAgcmV0dXJuIF9jaGVja2luSXRlbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9jaGVja2luSXRlbXMoKSB7XG4gIF9jaGVja2luSXRlbXMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxNigpIHtcbiAgICB2YXIgc3VjY2Vzc2Z1bGxDb3VudCwgaXRlbSwgcmVzcG9uc2UsIHRyYWNraW5nX2l0ZW07XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUxNiQoX2NvbnRleHQxNikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQxNi5wcmV2ID0gX2NvbnRleHQxNi5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNoZWNraW5nIGluIGl0ZW1zXCIpO1xuICAgICAgICAgIHN1Y2Nlc3NmdWxsQ291bnQgPSAwO1xuICAgICAgICAgIF9jb250ZXh0MTYudDAgPSBfcmVnZW5lcmF0b3JSdW50aW1lKCkua2V5cyhyZWNlaXZlZF9pdGVtcyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAoKF9jb250ZXh0MTYudDEgPSBfY29udGV4dDE2LnQwKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDE4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGl0ZW0gPSBfY29udGV4dDE2LnQxLnZhbHVlO1xuICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDc7XG4gICAgICAgICAgcmV0dXJuIGZldGNoV2l0aEF1dGgoY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvY2hlY2tpblwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgXCJpdGVtX3V1aWRcIjogcmVjZWl2ZWRfaXRlbXNbaXRlbV0uaXRlbS51dWlkLFxuICAgICAgICAgICAgICBcInN0b3JhZ2VfbmFtZVwiOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3N0b3JhZ2Vfc2VsZWN0XCIpLnZhbHVlLFxuICAgICAgICAgICAgICBcImFtb3VudFwiOiByZWNlaXZlZF9pdGVtc1tpdGVtXS5udW1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0MTYuc2VudDtcbiAgICAgICAgICBfY29udGV4dDE2Lm5leHQgPSAxMDtcbiAgICAgICAgICByZXR1cm4gY2hlY2tSZXNwb25zZUZvckVycm9yKHJlc3BvbnNlLCBcIkZhaWxlZCB0byBjaGVja2luIGl0ZW0gXCIgKyByZWNlaXZlZF9pdGVtc1tpdGVtXS5pdGVtLnRhZyk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgaWYgKCFfY29udGV4dDE2LnNlbnQpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDE2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDEzO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgdHJhY2tpbmdfaXRlbSA9IF9jb250ZXh0MTYuc2VudDtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgICAgZGVsZXRlIHJlY2VpdmVkX2l0ZW1zW3RyYWNraW5nX2l0ZW0udXVpZF07XG4gICAgICAgICAgc3VjY2Vzc2Z1bGxDb3VudCsrO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIF9jb250ZXh0MTYubmV4dCA9IDM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgdG9hc3QoXCJDaGVjay1JbiBzdWNjZXNzZnVsbC5cIiwgXCJUaGUgY2hlY2staW4gb2YgXCIgKyBzdWNjZXNzZnVsbENvdW50ICsgXCIgaXRlbXMgY29tcGxldGVkIHN1Y2Nlc2Z1bGx5LlwiKTtcbiAgICAgICAgICB1cGRhdGVJdGVtc1ZpZXcoKTtcbiAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDE2LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTYpO1xuICB9KSk7XG4gIHJldHVybiBfY2hlY2tpbkl0ZW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja291dEl0ZW0odHJhY2tpbmdfaXRlbSkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3V1aWRcIikuaW5uZXJIVE1MID0gdHJhY2tpbmdfaXRlbS51dWlkO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3RhZ1wiKS5pbm5lckhUTUwgPSB0cmFja2luZ19pdGVtLnRhZztcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNzdG9yYWdlXCIpLmlubmVySFRNTCA9IHRyYWNraW5nX2l0ZW0uc3RvcmFnZTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhZGRyZXNzZWVcIikuaW5uZXJIVE1MID0gdHJhY2tpbmdfaXRlbS5hZGRyZXNzZWU7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdGVhbVwiKS5pbm5lckhUTUwgPSB0cmFja2luZ19pdGVtLnRlYW07XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tvdXRJdGVtKCkge1xuICByZXR1cm4gX2NoZWNrb3V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX2NoZWNrb3V0SXRlbSgpIHtcbiAgX2NoZWNrb3V0SXRlbSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE3KCkge1xuICAgIHZhciBjb25maXJtZWQsIHJlc3BvbnNlO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMTckKF9jb250ZXh0MTcpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MTcucHJldiA9IF9jb250ZXh0MTcubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY29uZmlybWVkID0gY29uZmlybShcIkRpZCB5b3UgbWFrZSBzdXJlIHRoZSByZWNpcGllbnQgaXMgcmVhbGx5IHRoZSByaWdodCBwZXJzb24/XCIpO1xuICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MTcubmV4dCA9IDQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJSZWNpcGllbnQgY29uZmlybWF0aW9uIGRlbmllZC5cIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MTcuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgX2NvbnRleHQxNy5uZXh0ID0gNjtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi9jaGVja291dC9cIiArIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXVpZFwiKS5pbm5lckhUTUwpO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDE3LnNlbnQ7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDE3LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTcpO1xuICB9KSk7XG4gIHJldHVybiBfY2hlY2tvdXRJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBvblJlY2V2aWVyU2NhblN1Y2Nlc3MoX3gxNikge1xuICByZXR1cm4gX29uUmVjZXZpZXJTY2FuU3VjY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX29uUmVjZXZpZXJTY2FuU3VjY2VzcygpIHtcbiAgX29uUmVjZXZpZXJTY2FuU3VjY2VzcyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTE4KHNjYW5uZWRDb2RlKSB7XG4gICAgdmFyIF9zY2FubmVkQ29kZSRzcGxpdCwgX3NjYW5uZWRDb2RlJHNwbGl0MiwgdXVpZCwgc2lnbmF0dXJlLCByZXNwb25zZSwgdHJhY2tpbmdfaXRlbTtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE4JChfY29udGV4dDE4KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE4LnByZXYgPSBfY29udGV4dDE4Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGRlYm91bmNlU2Nhbm5lcigpO1xuICAgICAgICAgIF9zY2FubmVkQ29kZSRzcGxpdCA9IHNjYW5uZWRDb2RlLnNwbGl0KFwiL1wiKSwgX3NjYW5uZWRDb2RlJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9zY2FubmVkQ29kZSRzcGxpdCwgMiksIHV1aWQgPSBfc2Nhbm5lZENvZGUkc3BsaXQyWzBdLCBzaWduYXR1cmUgPSBfc2Nhbm5lZENvZGUkc3BsaXQyWzFdO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVjZWl2ZXIgc2NhbiBzdWNjZXNzXCIpO1xuICAgICAgICAgIHNjYW5uZXJfYXVkaW8ucGxheSgpO1xuICAgICAgICAgIF9jb250ZXh0MTgubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGdldENvbmZpZygpO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gODtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hXaXRoQXV0aChjb25maWcuYmFja2VuZF91cmwgKyBcIi9pdGVtL1wiICsgdXVpZCk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXNwb25zZSA9IF9jb250ZXh0MTguc2VudDtcbiAgICAgICAgICBpZiAoIShyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSkge1xuICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMjY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMTI7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICB0cmFja2luZ19pdGVtID0gX2NvbnRleHQxOC5zZW50O1xuICAgICAgICAgIGlmICghZWQ0NDgudmVyaWZ5KGh0b2Eoc2lnbmF0dXJlKSwgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRyYWNraW5nX2l0ZW0udXVpZCksIGh0b2EodHJhY2tpbmdfaXRlbS52ZXJpZmljYXRpb24pKSkge1xuICAgICAgICAgICAgX2NvbnRleHQxOC5uZXh0ID0gMjI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEodHJhY2tpbmdfaXRlbS5zdG9yYWdlID09IHVuZGVmaW5lZCB8fCB0cmFja2luZ19pdGVtLnN0b3JhZ2UgPT0gbnVsbCB8fCB0cmFja2luZ19pdGVtLnN0b3JhZ2UubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSAxODtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbGVydChcIkl0ZW0gbm90IHlldCByZWNlaXZlZC5cIik7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCB5ZXQgcmVjZWl2ZWQuXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDE4LmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICB1cGRhdGVDaGVja291dEl0ZW0odHJhY2tpbmdfaXRlbSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJSZWNlaXZlciB2ZXJpZnkgc3VjY2Vzc1wiKTtcbiAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSAyNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICBhbGVydChcIkNvdWxkIG5vdCB2ZXJpZnkgc2lnbmF0dXJlLlwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCB2ZXJpZnkgc2lnbmF0dXJlLlwiKTtcbiAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICBfY29udGV4dDE4Lm5leHQgPSAyNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDQwNCkge1xuICAgICAgICAgICAgYWxlcnQoXCJJdGVtIG5vdCBmb3VuZC5cIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gZ2V0IGl0ZW0gZnJvbSBiYWNrZW5kLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQxOC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTE4KTtcbiAgfSkpO1xuICByZXR1cm4gX29uUmVjZXZpZXJTY2FuU3VjY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNjYW5SZWNlaXZlcigpIHtcbiAgcmV0dXJuIF9zY2FuUmVjZWl2ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9zY2FuUmVjZWl2ZXIoKSB7XG4gIF9zY2FuUmVjZWl2ZXIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUxOSgpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTE5JChfY29udGV4dDE5KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDE5LnByZXYgPSBfY29udGV4dDE5Lm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU2Nhbm5pbmcgcmVjZWl2ZXIuXCIpO1xuICAgICAgICAgIHNjYW5uZXIucmVuZGVyKG9uUmVjZXZpZXJTY2FuU3VjY2VzcywgaGFuZGxlUXJFcnJvcik7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDE5LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMTkpO1xuICB9KSk7XG4gIHJldHVybiBfc2NhblJlY2VpdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9hZFN0b3JhZ2VzKF94MTcpIHtcbiAgcmV0dXJuIF9sb2FkU3RvcmFnZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9sb2FkU3RvcmFnZXMoKSB7XG4gIF9sb2FkU3RvcmFnZXMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMChzZWxlY3RlZFN0b3JhZ2UpIHtcbiAgICB2YXIgcmVzcG9uc2UsIHN0b3JhZ2VzLCBzZWxlY3QsIGksIG9wdGlvbjtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIwJChfY29udGV4dDIwKSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIwLnByZXYgPSBfY29udGV4dDIwLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmV0cmlldmluZyBzdG9yYWdlc1wiKTtcbiAgICAgICAgICBfY29udGV4dDIwLm5leHQgPSAzO1xuICAgICAgICAgIHJldHVybiBmZXRjaFdpdGhBdXRoKGNvbmZpZy5iYWNrZW5kX3VybCArIFwiL3N0b3JhZ2VzXCIpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDIwLnNlbnQ7XG4gICAgICAgICAgX2NvbnRleHQyMC5uZXh0ID0gNjtcbiAgICAgICAgICByZXR1cm4gY2hlY2tSZXNwb25zZUZvckVycm9yKHJlc3BvbnNlLCBcIkZhaWxlZCB0byBsb2FkIHN0b3JhZ2VzLlwiKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGlmICghX2NvbnRleHQyMC5zZW50KSB7XG4gICAgICAgICAgICBfY29udGV4dDIwLm5leHQgPSAxMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY29udGV4dDIwLm5leHQgPSA5O1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBzdG9yYWdlcyA9IF9jb250ZXh0MjAuc2VudDtcbiAgICAgICAgICBzZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3N0b3JhZ2Vfc2VsZWN0XCIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiR290IHN0b3JhZ2VzXCIpO1xuICAgICAgICAgIGZvciAoaSBpbiBzdG9yYWdlcykge1xuICAgICAgICAgICAgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IHN0b3JhZ2VzW2ldLm5hbWU7XG4gICAgICAgICAgICBvcHRpb24udmFsdWUgPSBzdG9yYWdlc1tpXS5uYW1lO1xuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRTdG9yYWdlID09IHN0b3JhZ2VzW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgc2VsZWN0LnZhbHVlID0gc2VsZWN0ZWRTdG9yYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIwLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMjApO1xuICB9KSk7XG4gIHJldHVybiBfbG9hZFN0b3JhZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gb25QYWdlTG9hZChfeDE4KSB7XG4gIHJldHVybiBfb25QYWdlTG9hZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX29uUGFnZUxvYWQoKSB7XG4gIF9vblBhZ2VMb2FkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMjEoZG9sb2FkU3RvcmFnZXMpIHtcbiAgICB2YXIgcHc7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyMSQoX2NvbnRleHQyMSkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyMS5wcmV2ID0gX2NvbnRleHQyMS5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSAyO1xuICAgICAgICAgIHJldHVybiBnZXRDb25maWcoKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHB3ID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIGlmICghKHB3Lmxlbmd0aCA+IDEpKSB7XG4gICAgICAgICAgICBfY29udGV4dDIxLm5leHQgPSA4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDY7XG4gICAgICAgICAgcmV0dXJuIGxvZ2luKHB3KTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9jb250ZXh0MjEubmV4dCA9IDEwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2NvbnRleHQyMS5uZXh0ID0gMTA7XG4gICAgICAgICAgcmV0dXJuIGxvZ2luKCk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgaWYgKGRvbG9hZFN0b3JhZ2VzKSB7XG4gICAgICAgICAgICBsb2FkU3RvcmFnZXMoZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjEuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyMSk7XG4gIH0pKTtcbiAgcmV0dXJuIF9vblBhZ2VMb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tvdXRCeVRhZygpIHtcbiAgcmV0dXJuIF9jaGVja291dEJ5VGFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfY2hlY2tvdXRCeVRhZygpIHtcbiAgX2NoZWNrb3V0QnlUYWcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyMigpIHtcbiAgICB2YXIgZWwsIHJlc3BvbnNlLCB0cmFja2luZ19pdGVtO1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMjIkKF9jb250ZXh0MjIpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0MjIucHJldiA9IF9jb250ZXh0MjIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJDaGVja291dCBieSB0YWdcIik7XG4gICAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoZWNrb3V0QnlUYWdcIik7XG4gICAgICAgICAgaWYgKCEoZWwudmFsdWUubGVuZ3RoICE9IDYpKSB7XG4gICAgICAgICAgICBfY29udGV4dDIyLm5leHQgPSA2O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsZXJ0KFwiTm90IGEgQkdQIHRhZyFcIik7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJOb3QgYSBCR1AgdGFnXCIpO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIyLmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9jb250ZXh0MjIubmV4dCA9IDg7XG4gICAgICAgICAgcmV0dXJuIGZldGNoV2l0aEF1dGgoY29uZmlnLmJhY2tlbmRfdXJsICsgXCIvdGFnL1wiICsgZWwudmFsdWUpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmVzcG9uc2UgPSBfY29udGV4dDIyLnNlbnQ7XG4gICAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID09IDIwMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MjIubmV4dCA9IDIxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jb250ZXh0MjIubmV4dCA9IDEyO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgdHJhY2tpbmdfaXRlbSA9IF9jb250ZXh0MjIuc2VudDtcbiAgICAgICAgICBpZiAoISh0cmFja2luZ19pdGVtLnN0b3JhZ2UgPT0gdW5kZWZpbmVkIHx8IHRyYWNraW5nX2l0ZW0uc3RvcmFnZSA9PSBudWxsIHx8IHRyYWNraW5nX2l0ZW0uc3RvcmFnZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0MjIubmV4dCA9IDE3O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsZXJ0KFwiSXRlbSBub3QgeWV0IHJlY2VpdmVkLlwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IHlldCByZWNlaXZlZC5cIik7XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0MjIuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tvdXQgaXRlbSBieSB0YWcgc3VjY2Vzcy5cIik7XG4gICAgICAgICAgdXBkYXRlQ2hlY2tvdXRJdGVtKHRyYWNraW5nX2l0ZW0pO1xuICAgICAgICAgIF9jb250ZXh0MjIubmV4dCA9IDIyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgYWxlcnQoXCJJdGVtIG5vdCBmb3VuZCFcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrUmVzcG9uc2VGb3JFcnJvcihyZXNwb25zZSwgXCJGYWlsZWQgdG8gZ2V0IGl0ZW0gZnJvbSBiYWNrZW5kXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dDIyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMjIpO1xuICB9KSk7XG4gIHJldHVybiBfY2hlY2tvdXRCeVRhZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/js/main.js\n"); /***/ }), diff --git a/src/js/main.js b/src/js/main.js index 53a7c46..51d8c24 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -381,10 +381,7 @@ async function onRecevierScanSuccess(scannedCode) { console.log("Receiver scan success"); scanner_audio.play(); await getConfig(); - var response = await fetch(config.backend_url + "/item/"+uuid, { - headers: { - } - }); + var response = await fetchWithAuth(config.backend_url + "/item/"+uuid); if (response.status == 200) { var tracking_item = await response.json(); if (ed448.verify(htoa(signature),new TextEncoder().encode(tracking_item.uuid),htoa(tracking_item.verification))) { -- GitLab