\\n
\\u8FD4\\u56DE \\n
\\u7EDF\\u8BA1 \\n
\\n
\\n
\\u6210\\u5C31\\u6392\\u884C\\u699C \\n
\\n ");\n achievementPage.find(\'#specialthanks\').click(function () {\n return _this2.switch(\'index\');\n });\n achievementPage.find(\'#rank\').click(function () {\n return _this2.hint(\'别卷了,没有排行榜\');\n }); // Talent\n\n var talentPage = $("\\n
\\n
\\u5929\\u8D4B\\u62BD\\u5361
\\n
10\\u8FDE\\u62BD\\uFF01 \\n
\\n
\\u8BF7\\u9009\\u62E93\\u4E2A \\n
\\n ");\n\n var createTalent = function createTalent(_ref2) {\n var grade = _ref2.grade,\n name = _ref2.name,\n description = _ref2.description;\n return $("
").concat(name, "\\uFF08").concat(description, "\\uFF09 "));\n };\n\n talentPage.find(\'#random\').click(function () {\n talentPage.find(\'#random\').hide();\n var ul = talentPage.find(\'#talents\');\n\n app_classPrivateFieldGet(_this2, _life).talentRandom().forEach(function (talent) {\n var li = createTalent(talent);\n ul.append(li);\n li.click(function () {\n if (li.hasClass(\'selected\')) {\n li.removeClass(\'selected\');\n\n app_classPrivateFieldGet(_this2, _talentSelected).delete(talent);\n\n if (app_classPrivateFieldGet(_this2, _talentSelected).size < 3) {\n talentPage.find(\'#next\').text(\'请选择3个\');\n }\n } else {\n if (app_classPrivateFieldGet(_this2, _talentSelected).size == 3) {\n _this2.hint(\'只能选3个天赋\');\n\n return;\n }\n\n var exclusive = app_classPrivateFieldGet(_this2, _life).exclusive(Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref3) {\n var id = _ref3.id;\n return id;\n }), talent.id);\n\n if (exclusive != null) {\n var _iterator = app_createForOfIteratorHelper(app_classPrivateFieldGet(_this2, _talentSelected)),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = _step.value,\n name = _step$value.name,\n id = _step$value.id;\n\n if (id == exclusive) {\n _this2.hint("\\u4E0E\\u5DF2\\u9009\\u62E9\\u7684\\u5929\\u8D4B\\u3010".concat(name, "\\u3011\\u51B2\\u7A81"));\n\n return;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return;\n }\n\n li.addClass(\'selected\');\n\n app_classPrivateFieldGet(_this2, _talentSelected).add(talent);\n\n if (app_classPrivateFieldGet(_this2, _talentSelected).size == 3) {\n talentPage.find(\'#next\').text(\'开始新人生\');\n }\n }\n });\n });\n\n talentPage.find(\'#next\').show();\n });\n talentPage.find(\'#next\').click(function () {\n if (app_classPrivateFieldGet(_this2, _talentSelected).size != 3) {\n _this2.hint(\'请选择3个天赋\');\n\n return;\n }\n\n talentPage.find(\'#next\').hide();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20 + app_classPrivateFieldGet(_this2, _life).getTalentAllocationAddition(Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref4) {\n var id = _ref4.id;\n return id;\n })));\n\n _this2.switch(\'property\');\n }); // Property\n // hint of extension tobermory.es6-string-html\n\n var propertyPage = $(\n /*html*/\n "\\n
\\n
\\n
\\u8C03\\u6574\\u521D\\u59CB\\u5C5E\\u6027
\\n
\\u53EF\\u7528\\u5C5E\\u6027\\u70B9\\uFF1A0
\\n
\\n
\\n
\\n
\\n \\u968F\\u673A\\u5206\\u914D \\n \\u5F00\\u59CB\\u65B0\\u4EBA\\u751F \\n
\\n
\\n ");\n\n propertyPage.mounted = function () {\n propertyPage.find(\'#talentSelectedView\').append("
\\u5DF2\\u9009\\u5929\\u8D4B " + Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref5) {\n var name = _ref5.name,\n description = _ref5.description;\n return "
".concat(name, "(").concat(description, ") ");\n }).join(\'\'));\n };\n\n var groups = {};\n\n var total = function total() {\n var t = 0;\n\n for (var type in groups) {\n t += groups[type].get();\n }\n\n return t;\n };\n\n var freshTotal = function freshTotal() {\n propertyPage.find(\'#total\').text("\\u53EF\\u7528\\u5C5E\\u6027\\u70B9\\uFF1A".concat(app_classPrivateFieldGet(_this2, _totalMax) - total()));\n };\n\n var getBtnGroups = function getBtnGroups(name, min, max) {\n var group = $("
".concat(name, " "));\n var btnSub = $("
");\n var inputBox = $("
");\n var btnAdd = $("
");\n group.append(btnSub);\n group.append(inputBox);\n group.append(btnAdd);\n\n var limit = function limit(v) {\n v = Number(v) || 0;\n v = Math.round(v);\n return v < min ? min : v > max ? max : v;\n };\n\n var get = function get() {\n return Number(inputBox.val());\n };\n\n var set = function set(v) {\n inputBox.val(limit(v));\n freshTotal();\n };\n\n btnAdd.click(function () {\n if (total() >= app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint(\'没有可分配的点数了\');\n\n return;\n }\n\n set(get() + 1);\n });\n btnSub.click(function () {\n return set(get() - 1);\n });\n inputBox.on(\'input\', function () {\n var t = total();\n var val = get();\n\n if (t > app_classPrivateFieldGet(_this2, _totalMax)) {\n val -= t - app_classPrivateFieldGet(_this2, _totalMax);\n }\n\n val = limit(val);\n\n if (val != inputBox.val()) {\n set(val);\n }\n\n freshTotal();\n });\n return {\n group: group,\n get: get,\n set: set\n };\n };\n\n groups.CHR = getBtnGroups("颜值", 0, 10); // 颜值 charm CHR\n\n groups.INT = getBtnGroups("智力", 0, 10); // 智力 intelligence INT\n\n groups.STR = getBtnGroups("体质", 0, 10); // 体质 strength STR\n\n groups.MNY = getBtnGroups("家境", 0, 10); // 家境 money MNY\n\n var ul = propertyPage.find(\'#propertyAllocation\');\n\n for (var type in groups) {\n ul.append(groups[type].group);\n }\n\n propertyPage.find(\'#random\').click(function () {\n var t = app_classPrivateFieldGet(_this2, _totalMax);\n\n var arr = [10, 10, 10, 10];\n\n while (t > 0) {\n var sub = Math.round(Math.random() * (Math.min(t, 10) - 1)) + 1;\n\n while (true) {\n var select = Math.floor(Math.random() * 4) % 4;\n if (arr[select] - sub < 0) continue;\n arr[select] -= sub;\n t -= sub;\n break;\n }\n }\n\n groups.CHR.set(10 - arr[0]);\n groups.INT.set(10 - arr[1]);\n groups.STR.set(10 - arr[2]);\n groups.MNY.set(10 - arr[3]);\n });\n propertyPage.find(\'#start\').click(function () {\n if (total() < app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint("\\u4F60\\u8FD8\\u6709".concat(app_classPrivateFieldGet(_this2, _totalMax) - total(), "\\u5C5E\\u6027\\u70B9\\u6CA1\\u6709\\u5206\\u914D\\u5B8C"));\n\n return;\n } else if (total() > app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint("\\u4F60\\u591A\\u4F7F\\u7528\\u4E86".concat(total() - app_classPrivateFieldGet(_this2, _totalMax), "\\u5C5E\\u6027\\u70B9"));\n\n return;\n }\n\n var contents = app_classPrivateFieldGet(_this2, _life).restart({\n CHR: groups.CHR.get(),\n INT: groups.INT.get(),\n STR: groups.STR.get(),\n MNY: groups.MNY.get(),\n SPR: 5,\n TLT: Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref6) {\n var id = _ref6.id;\n return id;\n })\n });\n\n _this2.switch(\'trajectory\');\n\n app_classPrivateFieldGet(_this2, _pages).trajectory.born(contents); // $(document).keydown(function(event){\n // if(event.which == 32 || event.which == 13){\n // $(\'#lifeTrajectory\').click();\n // }\n // })\n\n }); // Trajectory\n\n var trajectoryPage = $("\\n
\\n
\\n
\\n
\\n \\u81EA\\u52A8\\u64AD\\u653E \\n \\u81EA\\u52A8\\u64AD\\u653E2x \\n \\u4EBA\\u751F\\u603B\\u7ED3 \\n \\u4EBA\\u751F\\u56DE\\u653E \\n
\\n
\\n
\\n
\\n
\\n ");\n trajectoryPage.find(\'#lifeTrajectory\').click(function () {\n if (app_classPrivateFieldGet(_this2, _isEnd)) return;\n\n var trajectory = app_classPrivateFieldGet(_this2, _life).next();\n\n var age = trajectory.age,\n content = trajectory.content,\n isEnd = trajectory.isEnd;\n var li = $("
".concat(age, "\\u5C81\\uFF1A ").concat(content.map(function (_ref7) {\n var type = _ref7.type,\n description = _ref7.description,\n grade = _ref7.grade,\n name = _ref7.name,\n postEvent = _ref7.postEvent;\n\n switch (type) {\n case \'TLT\':\n return "\\u5929\\u8D4B\\u3010".concat(name, "\\u3011\\u53D1\\u52A8\\uFF1A").concat(description);\n\n case \'EVT\':\n return description + (postEvent ? " ".concat(postEvent) : \'\');\n }\n }).join(\' \'), " "));\n li.appendTo(\'#lifeTrajectory\');\n $("#lifeTrajectory").scrollTop($("#lifeTrajectory")[0].scrollHeight);\n\n if (isEnd) {\n $(document).unbind("keydown");\n\n app_classPrivateFieldSet(_this2, _isEnd, true);\n\n trajectoryPage.find(\'#summary\').show();\n trajectoryPage.find(\'#auto\').hide();\n trajectoryPage.find(\'#auto2x\').hide(); // trajectoryPage.find(\'#domToImage\').show();\n }\n\n var property = app_classPrivateFieldGet(_this2, _life).getLastRecord();\n\n $("#lifeProperty").html("\\n
\\u989C\\u503C ".concat(property.CHR, " \\n
\\u667A\\u529B ").concat(property.INT, " \\n
\\u4F53\\u8D28 ").concat(property.STR, " \\n
\\u5BB6\\u5883 ").concat(property.MNY, " \\n
\\u5FEB\\u4E50 ").concat(property.SPR, " \\n "));\n }); // html2canvas\n\n trajectoryPage.find(\'#domToImage\').click(function () {\n $("#lifeTrajectory").addClass("deleteFixed");\n var ua = navigator.userAgent.toLowerCase();\n domtoimage.toJpeg(document.getElementById(\'lifeTrajectory\')).then(function (dataUrl) {\n var link = document.createElement(\'a\');\n link.download = \'我的人生回放.jpeg\';\n link.href = dataUrl;\n link.click();\n $("#lifeTrajectory").removeClass("deleteFixed"); // 微信内置浏览器,显示图片,需要用户单独保存\n\n if (ua.match(/MicroMessenger/i) == "micromessenger") {\n $(\'#endImage\').attr(\'src\', dataUrl);\n }\n });\n }).hide();\n trajectoryPage.find(\'#summary\').click(function () {\n clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n\n _this2.switch(\'summary\');\n });\n\n var auto = function auto(tick) {\n if (app_classPrivateFieldGet(_this2, _autoTrajectory)) {\n clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n } else {\n if (!_this2.isEnd) trajectoryPage.find(\'#lifeTrajectory\').click();\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, setInterval(function () {\n if (_this2.isEnd) {\n clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n } else {\n trajectoryPage.find(\'#lifeTrajectory\').click();\n }\n }, tick));\n }\n };\n\n trajectoryPage.find(\'#auto\').click(function () {\n return auto(1000);\n });\n trajectoryPage.find(\'#auto2x\').click(function () {\n return auto(500);\n }); // Summary\n\n var summaryPage = $("\\n
\\n
\\u4EBA\\u751F\\u603B\\u7ED3
\\n
\\n \\u989C\\u503C\\uFF1A 9\\u7EA7 \\u7F8E\\u82E5\\u5929\\u4ED9 \\n \\u667A\\u529B\\uFF1A 4\\u7EA7 \\u667A\\u529B\\u4E00\\u822C \\n \\u4F53\\u8D28\\uFF1A 1\\u7EA7 \\u6781\\u5EA6\\u865A\\u5F31 \\n \\u5BB6\\u5883\\uFF1A 6\\u7EA7 \\u5C0F\\u5EB7\\u4E4B\\u5BB6 \\n \\u4EAB\\u5E74\\uFF1A 3\\u5C81 \\u65E9\\u592D \\n \\u5FEB\\u4E50\\uFF1A 3\\u7EA7 \\u4E0D\\u592A\\u5E78\\u798F\\u7684\\u4EBA\\u751F \\n \\n
\\u5929\\u8D4B\\uFF0C\\u4F60\\u53EF\\u4EE5\\u9009\\u4E00\\u4E2A\\uFF0C\\u4E0B\\u8F88\\u5B50\\u8FD8\\u80FD\\u62BD\\u5230
\\n
\\n \\u9ED1\\u5E55\\uFF08\\u9762\\u8BD5\\u4E00\\u5B9A\\u6210\\u529F\\uFF09 \\n \\n
\\u518D\\u6B21\\u91CD\\u5F00\\n
\\n ");\n summaryPage.find(\'#again\').click(function () {\n _this2.times++;\n\n app_classPrivateFieldGet(_this2, _life).talentExtend(app_classPrivateFieldGet(_this2, _selectedExtendTalent));\n\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, null);\n\n app_classPrivateFieldGet(_this2, _talentSelected).clear();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20);\n\n app_classPrivateFieldSet(_this2, _isEnd, false);\n\n _this2.switch(\'index\');\n });\n\n app_classPrivateFieldSet(this, _pages, {\n loading: {\n page: loadingPage,\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'loading\');\n }\n },\n index: {\n page: indexPage,\n btnAchievement: indexPage.find(\'#achievement\'),\n btnRestart: indexPage.find(\'#restart\'),\n hint: indexPage.find(\'.hint\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).index.btnRestart.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'index\');\n\n indexPage.find(\'.hint\').hide();\n var times = _this2.times;\n var achievement = indexPage.find(\'#achievement\');\n var discord = indexPage.find(\'#discord\');\n var specialthanks = indexPage.find(\'#specialthanks\');\n\n if (times > 0) {\n achievement.show();\n discord.show();\n specialthanks.show();\n return;\n }\n\n achievement.hide();\n discord.hide();\n specialthanks.hide();\n }\n },\n specialthanks: {\n page: specialThanksPage,\n clear: function clear() {\n var groups = [specialThanksPage.find(\'#spthx > ul.g1\'), specialThanksPage.find(\'#spthx > ul.g2\')];\n groups.forEach(function (g) {\n return g.empty();\n });\n\n app_classPrivateFieldGet(_this2, _specialthanks).sort(function () {\n return 0.5 - Math.random();\n }).forEach(function (_ref8) {\n var group = _ref8.group,\n name = _ref8.name,\n comment = _ref8.comment,\n color = _ref8.color;\n return groups[--group].append("\\n
\\n ").concat(name, " \\n \\n \\n "));\n });\n }\n },\n achievement: {\n page: achievementPage,\n clear: function clear() {\n var total = achievementPage.find("ul#total");\n var achievements = achievementPage.find("ul#achievements");\n total.empty();\n achievements.empty();\n\n var formatRate = function formatRate(type, value) {\n var rate = getRate(type, value);\n var color = Object.keys(rate)[0];\n\n switch (parseInt(color)) {\n case 0:\n color = \'白色\';\n break;\n\n case 1:\n color = \'蓝色\';\n break;\n\n case 2:\n color = \'紫色\';\n break;\n\n case 3:\n color = \'橙色\';\n break;\n\n default:\n break;\n }\n\n var r = Object.values(rate)[0];\n\n switch (parseInt(r)) {\n case 1:\n r = \'不变\';\n break;\n\n case 2:\n r = \'翻倍\';\n break;\n\n case 3:\n r = \'三倍\';\n break;\n\n case 4:\n r = \'四倍\';\n break;\n\n case 5:\n r = \'五倍\';\n break;\n\n case 6:\n r = \'六倍\';\n break;\n\n default:\n break;\n }\n\n return "\\u62BD\\u5230".concat(color, "\\u6982\\u7387").concat(r);\n };\n\n var _classPrivateFieldGet3 = app_classPrivateFieldGet(_this2, _life).getTotal(),\n times = _classPrivateFieldGet3.times,\n achievement = _classPrivateFieldGet3.achievement,\n talentRate = _classPrivateFieldGet3.talentRate,\n eventRate = _classPrivateFieldGet3.eventRate;\n\n total.append("\\n
\\u5DF2\\u91CD\\u5F00").concat(times, "\\u6B21 ").concat(formatRate(\'times\', times), "\\n
\\u6210\\u5C31\\u8FBE\\u6210").concat(achievement, "\\u4E2A ").concat(formatRate(\'achievement\', achievement), "\\n
\\u4E8B\\u4EF6\\u6536\\u96C6\\u7387 ").concat(Math.floor(eventRate * 100), "%\\n
\\u5929\\u8D4B\\u6536\\u96C6\\u7387 ").concat(Math.floor(talentRate * 100), "%\\n "));\n\n var achievementsData = app_classPrivateFieldGet(_this2, _life).getAchievements();\n\n achievementsData.forEach(function (_ref9) {\n var name = _ref9.name,\n description = _ref9.description,\n hide = _ref9.hide,\n grade = _ref9.grade,\n isAchieved = _ref9.isAchieved;\n if (hide && !isAchieved) name = description = \'???\';\n achievements.append("
").concat(name, " ").concat(description, ""));\n });\n }\n },\n talent: {\n page: talentPage,\n talentList: talentPage.find(\'#talents\'),\n btnRandom: talentPage.find(\'#random\'),\n btnNext: talentPage.find(\'#next\'),\n pressEnter: function pressEnter() {\n var talentList = app_classPrivateFieldGet(_this2, _pages).talent.talentList;\n\n var btnRandom = app_classPrivateFieldGet(_this2, _pages).talent.btnRandom;\n\n var btnNext = app_classPrivateFieldGet(_this2, _pages).talent.btnNext;\n\n if (talentList.children().length) {\n btnNext.click();\n } else {\n btnRandom.click();\n }\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'talent\');\n\n talentPage.find(\'ul.selectlist\').empty();\n talentPage.find(\'#random\').show();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20);\n }\n },\n property: {\n page: propertyPage,\n btnStart: propertyPage.find(\'#start\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).property.btnStart.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'property\');\n\n freshTotal();\n propertyPage.find(\'#talentSelectedView\').empty();\n }\n },\n trajectory: {\n page: trajectoryPage,\n lifeTrajectory: trajectoryPage.find(\'#lifeTrajectory\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).trajectory.lifeTrajectory.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'trajectory\');\n\n trajectoryPage.find(\'#lifeTrajectory\').empty();\n trajectoryPage.find(\'#summary\').hide();\n trajectoryPage.find(\'#auto\').show();\n trajectoryPage.find(\'#auto2x\').show();\n\n app_classPrivateFieldSet(_this2, _isEnd, false);\n },\n born: function born(contents) {\n if (contents.length > 0) $(\'#lifeTrajectory\').append("
\\u521D\\u59CB\\uFF1A ".concat(contents.map(function (_ref10) {\n var source = _ref10.source,\n target = _ref10.target;\n return "\\u5929\\u8D4B\\u3010".concat(source.name, "\\u3011\\u53D1\\u52A8\\uFF1A\\u66FF\\u6362\\u4E3A\\u5929\\u8D4B\\u3010").concat(target.name, "\\u3011");\n }).join(\' \'), " "));\n trajectoryPage.find(\'#lifeTrajectory\').trigger("click");\n }\n },\n summary: {\n page: summaryPage,\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'summary\');\n\n var judge = summaryPage.find(\'#judge\');\n var talents = summaryPage.find(\'#talents\');\n judge.empty();\n talents.empty();\n\n var lastExtendTalent = app_classPrivateFieldGet(_this2, _life).getLastExtendTalent();\n\n Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).sort(function (_ref11, _ref12) {\n var a = _ref11.id,\n ag = _ref11.grade;\n var b = _ref12.id,\n bg = _ref12.grade;\n if (a == lastExtendTalent) return -1;\n if (b == lastExtendTalent) return 1;\n return bg - ag;\n }).forEach(function (talent, i) {\n var li = createTalent(talent);\n talents.append(li);\n li.click(function () {\n if (li.hasClass(\'selected\')) {\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, null);\n\n li.removeClass(\'selected\');\n } else if (app_classPrivateFieldGet(_this2, _selectedExtendTalent) != null) {\n _this2.hint(\'只能继承一个天赋\');\n\n return;\n } else {\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, talent.id);\n\n li.addClass(\'selected\');\n }\n });\n if (!i) li.click();\n });\n\n var summaryData = app_classPrivateFieldGet(_this2, _life).getSummary();\n\n var format = function format(discription, type) {\n var value = summaryData[type];\n\n var _summary = summary(type, value),\n judge = _summary.judge,\n grade = _summary.grade;\n\n return "
").concat(discription, "\\uFF1A ").concat(value, " ").concat(judge, " ");\n };\n\n judge.append("\\n ".concat(format(\'颜值\', \'CHR\'), "\\n ").concat(format(\'智力\', \'INT\'), "\\n ").concat(format(\'体质\', \'STR\'), "\\n ").concat(format(\'家境\', \'MNY\'), "\\n ").concat(format(\'快乐\', \'SPR\'), "\\n ").concat(format(\'享年\', \'AGE\'), "\\n ").concat(format(\'总评\', \'SUM\'), "\\n "));\n }\n }\n });\n\n $$on(\'achievement\', function (_ref13) {\n var name = _ref13.name;\n\n _this2.hint("\\u89E3\\u9501\\u6210\\u5C31\\u3010".concat(name, "\\u3011"), \'success\');\n });\n }\n }, {\n key: "switch",\n value: function _switch(page) {\n var p = app_classPrivateFieldGet(this, _pages)[page];\n\n if (!p) return;\n $(\'#main\').detach();\n p.clear();\n p.page.appendTo(\'body\');\n\n if (typeof p.page.mounted === \'function\') {\n p.page.mounted();\n }\n }\n }, {\n key: "hint",\n value: function hint(message) {\n var _this3 = this;\n\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'info\';\n\n if (app_classPrivateFieldGet(this, _hintTimeout)) {\n clearTimeout(app_classPrivateFieldGet(this, _hintTimeout));\n\n app_classPrivateFieldSet(this, _hintTimeout, null);\n }\n\n hideBanners();\n requestAnimationFrame(function () {\n var banner = $(".banner.".concat(type));\n banner.addClass(\'visible\');\n banner.find(\'.banner-message\').text(message);\n\n if (type != \'error\') {\n app_classPrivateFieldSet(_this3, _hintTimeout, setTimeout(hideBanners, 3000));\n }\n });\n }\n }, {\n key: "setTheme",\n value: function setTheme(theme) {\n var themeLink = $(document).find(\'#themeLink\');\n\n switch (theme) {\n case \'dark\':\n case \'light\':\n case \'halloween\':\n themeLink.attr(\'href\', "".concat(theme, ".css"));\n break;\n\n default:\n themeLink.attr(\'href\', \'dark.css\');\n }\n }\n }, {\n key: "times",\n get: function get() {\n var _classPrivateFieldGet4;\n\n return ((_classPrivateFieldGet4 = app_classPrivateFieldGet(this, _life)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.times) || 0;\n },\n set: function set(v) {\n if (app_classPrivateFieldGet(this, _life)) app_classPrivateFieldGet(this, _life).times = v;\n }\n }]);\n\n return App;\n}();\n\n/* harmony default export */ const app = (App);\n;// CONCATENATED MODULE: ./src/index.js\n\n\nfunction src_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); } }\n\nfunction src_asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { src_asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { src_asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\n\n\n\n\n\n\n\n\n\n\nglobalThis.$$eventMap = new Map();\n\nglobalThis.$$event = function (tag, data) {\n var listener = $$eventMap.get(tag);\n if (listener) listener.forEach(function (fn) {\n return fn(data);\n });\n};\n\nglobalThis.$$on = function (tag, fn) {\n var listener = $$eventMap.get(tag);\n\n if (!listener) {\n listener = new Set();\n $$eventMap.set(tag, listener);\n }\n\n listener.add(fn);\n};\n\nglobalThis.$$off = function (tag, fn) {\n var listener = $$eventMap.get(tag);\n if (listener) listener.delete(fn);\n};\n\nglobalThis.json = /*#__PURE__*/function () {\n var _ref = src_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(fileName) {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return fetch("../data/".concat(fileName, ".json"));\n\n case 2:\n _context.next = 4;\n return _context.sent.json();\n\n case 4:\n return _context.abrupt("return", _context.sent);\n\n case 5:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}(); // Pssst, I\'ve created a github package - https://github.com/brookesb91/dismissible\n\n\nglobalThis.hideBanners = function (e) {\n document.querySelectorAll(".banner.visible").forEach(function (b) {\n return b.classList.remove("visible");\n });\n};\n\nvar src_app = new app();\nsrc_app.initial();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE1RUE7O0FBZ0ZBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQWZBO0FBaUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQWpCQTtBQW1CQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTs7QUFDQTtBQUFBO0FBTkE7QUFRQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFEQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFEQTtBQUFBOztBQUFBO0FBRUE7QUFBQTtBQUFBOztBQUNBO0FBREE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUtBOztBQUxBO0FBQUE7O0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQURBO0FBTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFTQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1Q0E7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTs7QUExQ0E7O0FBRkE7QUFrREE7QUFDQTtBQUZBOztBQWpEQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBOERBO0FBQUE7O0FBRUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQ0E7O0FBNEJBO0FBQ0E7QUFEQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFBQTtBQXJEQTtBQXVEQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFoQkE7QUFrQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBbkJBO0FBcUJBOzs7QUFFQTtBQUFBOztBQUNBO0FBUUE7OztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBQUE7QUExQkE7QUE0QkE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFGQTtBQUlBOzs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUtBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBUEE7O0FBU0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUlBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQVZBOztBQVlBO0FBQ0E7QUFVQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUlBOzs7Ozs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBdEJBO0FBd0JBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQVJBO0FBVUE7O0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTs7QUFDQTs7QUFFQTtBQUFBO0FBNUJBO0FBOEJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlIQTtBQUNBOzs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUFBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2REE7QUFDQTtBQUNBOzs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUFBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQURBO0FBQUE7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTs7QUFGQTtBQUFBOztBQUFBO0FBR0E7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQVFBO0FBQ0E7OztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQURBOztBQUdBO0FBQ0E7QUFEQTs7QUFHQTtBQUNBO0FBREE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOztBQURBO0FBQUE7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBOztBQWhDQTtBQUFBOztBQUFBO0FBaUNBO0FBQUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBd0NBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQURBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0tBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQUE7O0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTs7QUFKQTs7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7OztBQVlBO0FBQUE7O0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUhBO0FBSEE7QUFRQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFEQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7Ozs7O0FBUUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBTUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQVZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0FBYUE7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUNBOztBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTs7QUFDQTtBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRkE7QUFJQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7O0FBTEE7QUFBQTs7QUFBQTtBQU1BO0FBQUE7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7O0FBQ0E7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQW9CQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFDQTtBQUVBO0FBQUE7O0FBQUE7QUFBQTtBQUdBOzs7QUFFQTtBQUNBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUVBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUNBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTs7O0FBRUE7QUFBQTs7QUFBQTtBQUFBO0FBQ0E7QUFBQTs7QUFDQTs7QUFDQTtBQUlBOzs7Ozs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNU5BO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOzs7OztBQWFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFHQTs7QUFJQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFuQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7QUFzQkE7QUFBQTs7QUFFQTtBQUNBOztBQVVBOztBQWlCQTs7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFFQTtBQVlBO0FBRUE7QUFBQTtBQUVBO0FBVUE7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUFBOztBQUVBOztBQVNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBQ0E7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUdBO0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFPQTtBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUdBOztBQUNBO0FBQUE7QUFBQTs7QUFjQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTs7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFEQTs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBOztBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTkE7O0FBUUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFHQTtBQWdCQTtBQUdBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFHQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7O0FBQ0E7QUFPQTs7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBR0E7O0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBQUE7O0FBR0E7QUFtQkE7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUEzQkE7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFoQkE7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFMQTs7QUFPQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFQQTs7QUFTQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7O0FBT0E7O0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFsREE7QUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFwQkE7QUFzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBR0E7QUFaQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUF4QkE7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTs7QUFFQTtBQVNBO0FBckRBO0FBeEtBOztBQWlPQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBUEE7QUFTQTs7O0FBRUE7QUFBQTs7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3ekJBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUFHQTtBQUNBO0FBRUE7QUFBQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZnVuY3Rpb25zL3N1bW1hcnkuanM/NGRhZSIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZnVuY3Rpb25zL2FkZGl0aW9uLmpzPzgwM2QiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy91dGlsLmpzP2FlZGMiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL3Byb3BlcnR5LmpzPzI5YTYiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy9jb25kaXRpb24uanM/NmQwOCIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZXZlbnQuanM/NDAyYSIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvdGFsZW50LmpzP2M1NmYiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2FjaGlldmVtZW50LmpzP2U0MjIiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2xpZmUuanM/OTEwNyIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvYXBwLmpzPzExMTIiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2luZGV4LmpzP2I2MzUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGF0YSA9IHtcclxuICAgIFwiQ0hSXCI6IFtcclxuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjoyLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcclxuICAgICAgICB7XCJtaW5cIjo5LCBcImp1ZGdlXCI6IFwi572V6KeBXCIsIFwiZ3JhZGVcIjogMn0sXHJcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgIF0sXHJcbiAgICBcIk1OWVwiOiBbXHJcbiAgICAgICAge1wianVkZ2VcIjogXCLlnLDni7FcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6MiwgXCJqdWRnZVwiOiBcIuS4jeS9s1wiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjQsIFwianVkZ2VcIjogXCLmma7pgJpcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjo3LCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXHJcbiAgICAgICAge1wibWluXCI6OSwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxyXG4gICAgICAgIHtcIm1pblwiOjExLCBcImp1ZGdlXCI6IFwi6YCG5aSpXCIsIFwiZ3JhZGVcIjogM30sXHJcbiAgICBdLFxyXG4gICAgXCJTUFJcIjogW1xyXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6MSwgXCJqdWRnZVwiOiBcIuaKmOejqFwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjIsIFwianVkZ2VcIjogXCLkuI3lubhcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjo0LCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6NywgXCJqdWRnZVwiOiBcIuW5uOemj1wiLCBcImdyYWRlXCI6IDF9LFxyXG4gICAgICAgIHtcIm1pblwiOjksIFwianVkZ2VcIjogXCLmnoHkuZBcIiwgXCJncmFkZVwiOiAyfSxcclxuICAgICAgICB7XCJtaW5cIjoxMSwgXCJqdWRnZVwiOiBcIuWkqeWRvVwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgXSxcclxuICAgIFwiSU5UXCI6IFtcclxuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjoyLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcclxuICAgICAgICB7XCJtaW5cIjo5LCBcImp1ZGdlXCI6IFwi572V6KeBXCIsIFwiZ3JhZGVcIjogMn0sXHJcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgICAgICB7XCJtaW5cIjoyMSwgXCJqdWRnZVwiOiBcIuivhua1t1wiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjEzMSwgXCJqdWRnZVwiOiBcIuWFg+elnlwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjUwMSwgXCJqdWRnZVwiOiBcIuS7memtglwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgXSxcclxuICAgIFwiU1RSXCI6IFtcclxuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjoyLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcclxuICAgICAgICB7XCJtaW5cIjo5LCBcImp1ZGdlXCI6IFwi572V6KeBXCIsIFwiZ3JhZGVcIjogMn0sXHJcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgICAgICB7XCJtaW5cIjoyMSwgXCJqdWRnZVwiOiBcIuWHneawlFwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjEwMSwgXCJqdWRnZVwiOiBcIuetkeWfulwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjQwMSwgXCJqdWRnZVwiOiBcIumHkeS4uVwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjEwMDEsIFwianVkZ2VcIjogXCLlhYPlqbRcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgICAgICB7XCJtaW5cIjoyMDAxLCBcImp1ZGdlXCI6IFwi5LuZ5L2TXCIsIFwiZ3JhZGVcIjogM30sXHJcbiAgICBdLFxyXG4gICAgXCJBR0VcIjogW1xyXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi6IOO5q276IW55LitXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6MSwgXCJqdWRnZVwiOiBcIuaXqeWkrVwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjEwLCBcImp1ZGdlXCI6IFwi5bCR5bm0XCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6MTgsIFwianVkZ2VcIjogXCLnm5vlubRcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjo0MCwgXCJqdWRnZVwiOiBcIuS4reW5tFwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjYwLCBcImp1ZGdlXCI6IFwi6Iqx55SyXCIsIFwiZ3JhZGVcIjogMX0sXHJcbiAgICAgICAge1wibWluXCI6NzAsIFwianVkZ2VcIjogXCLlj6TnqIBcIiwgXCJncmFkZVwiOiAxfSxcclxuICAgICAgICB7XCJtaW5cIjo4MCwgXCJqdWRnZVwiOiBcIuadluacnVwiLCBcImdyYWRlXCI6IDJ9LFxyXG4gICAgICAgIHtcIm1pblwiOjkwLCBcImp1ZGdlXCI6IFwi5Y2X5bGxXCIsIFwiZ3JhZGVcIjogMn0sXHJcbiAgICAgICAge1wibWluXCI6OTUsIFwianVkZ2VcIjogXCLkuI3ogIFcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgICAgICB7XCJtaW5cIjoxMDAsIFwianVkZ2VcIjogXCLkv67ku5lcIiwgXCJncmFkZVwiOiAzfSxcclxuICAgICAgICB7XCJtaW5cIjo1MDAsIFwianVkZ2VcIjogXCLku5nlr79cIiwgXCJncmFkZVwiOiAzfSxcclxuICAgIF0sXHJcbiAgICBcIlNVTVwiOiBbXHJcbiAgICAgICAge1wianVkZ2VcIjogXCLlnLDni7FcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjo0MSwgXCJqdWRnZVwiOiBcIuaKmOejqFwiLCBcImdyYWRlXCI6IDB9LFxyXG4gICAgICAgIHtcIm1pblwiOjUwLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXHJcbiAgICAgICAge1wibWluXCI6NjAsIFwianVkZ2VcIjogXCLmma7pgJpcIiwgXCJncmFkZVwiOiAwfSxcclxuICAgICAgICB7XCJtaW5cIjo4MCwgXCJqdWRnZVwiOiBcIuS8mOengFwiLCBcImdyYWRlXCI6IDF9LFxyXG4gICAgICAgIHtcIm1pblwiOjEwMCwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxyXG4gICAgICAgIHtcIm1pblwiOjExMCwgXCJqdWRnZVwiOiBcIumAhuWkqVwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgICAgIHtcIm1pblwiOjEyMCwgXCJqdWRnZVwiOiBcIuS8oOivtFwiLCBcImdyYWRlXCI6IDN9LFxyXG4gICAgXVxyXG59XHJcblxyXG5mdW5jdGlvbiBzdW1tYXJ5KHR5cGUsIHZhbHVlKSB7XHJcbiAgICBsZXQgbGVuZ3RoID0gZGF0YVt0eXBlXS5sZW5ndGg7XHJcbiAgICB3aGlsZShsZW5ndGgtLSkge1xyXG4gICAgICAgIGNvbnN0IHttaW4sIGp1ZGdlLCBncmFkZX0gPSBkYXRhW3R5cGVdW2xlbmd0aF07XHJcbiAgICAgICAgaWYobWluPT12b2lkIDAgfHwgdmFsdWUgPj0gbWluKSByZXR1cm4ge2p1ZGdlLCBncmFkZX07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7IHN1bW1hcnkgfTsiLCJleHBvcnQgZnVuY3Rpb24gZ2V0UmF0ZSh0eXBlLCB2YWx1ZSkge1xyXG4gICAgc3dpdGNoKHR5cGUpIHtcclxuICAgICAgICBjYXNlICd0aW1lcyc6XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwMCkgcmV0dXJuIHsyOjZ9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSA3MCkgcmV0dXJuIHsyOjV9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSA1MCkgcmV0dXJuIHsyOjR9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAzMCkgcmV0dXJuIHsyOjN9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMCkgcmV0dXJuIHsyOjJ9O1xyXG4gICAgICAgICAgICByZXR1cm4gezI6IDF9O1xyXG4gICAgICAgIGNhc2UgJ2FjaGlldmVtZW50JzpcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTAwKSByZXR1cm4gezM6Nn07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDcwKSByZXR1cm4gezM6NX07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDUwKSByZXR1cm4gezM6NH07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDMwKSByZXR1cm4gezM6M307XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwKSByZXR1cm4gezM6Mn07XHJcbiAgICAgICAgICAgIHJldHVybiB7MzoxfTtcclxuICAgICAgICBkZWZhdWx0OiByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkZSh0eXBlLCB2YWx1ZSkge1xyXG4gICAgc3dpdGNoKHR5cGUpIHtcclxuICAgICAgICBjYXNlICd0aW1lcyc6XHJcbiAgICAgICAgY2FzZSAnYWNoaWV2ZW1lbnQnOlxyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMDApIHJldHVybiAzO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSA1MCkgcmV0dXJuIDI7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgY2FzZSAndGFsZW50UmF0ZSc6XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuOSkgcmV0dXJuIDM7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuNikgcmV0dXJuIDI7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuMykgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIGNhc2UgJ2V2ZW50UmF0ZSc6XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuNikgcmV0dXJuIDM7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuNCkgcmV0dXJuIDI7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDAuMikgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiAwO1xyXG4gICAgfVxyXG59IiwiZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcclxuICAgIHN3aXRjaCh0eXBlb2YgdmFsdWUpIHtcclxuICAgICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCh2PT5jbG9uZSh2KSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09iaiA9IHt9O1xyXG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIHZhbHVlKSBuZXdPYmpba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3T2JqO1xyXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWF4KC4uLmFycikge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLmFyci5mbGF0KCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtaW4oLi4uYXJyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4oLi4uYXJyLmZsYXQoKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN1bSguLi5hcnIpIHtcclxuICAgIGxldCBzID0gMDtcclxuICAgIGFyci5mbGF0KCkuZm9yRWFjaCh2PT5zKz12KTtcclxuICAgIHJldHVybiBzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhdmVyYWdlKC4uLmFycikge1xyXG4gICAgY29uc3QgcyA9IHN1bSguLi5hcnIpO1xyXG4gICAgcmV0dXJuIHMgLyBhcnIuZmxhdCgpLmxlbmd0aDtcclxufVxyXG5cclxuZnVuY3Rpb24gd2VpZ2h0UmFuZG9tKGxpc3QpIHtcclxuICAgIGxldCB0b3RhbFdlaWdodHMgPSAwO1xyXG4gICAgZm9yKGNvbnN0IFssIHdlaWdodF0gb2YgbGlzdClcclxuICAgICAgICB0b3RhbFdlaWdodHMgKz0gd2VpZ2h0O1xyXG5cclxuICAgIGxldCByYW5kb20gPSBNYXRoLnJhbmRvbSgpICogdG90YWxXZWlnaHRzO1xyXG4gICAgZm9yKGNvbnN0IFtpZCwgd2VpZ2h0XSBvZiBsaXN0KVxyXG4gICAgICAgIGlmKChyYW5kb20tPXdlaWdodCk8MClcclxuICAgICAgICAgICAgcmV0dXJuIGlkO1xyXG4gICAgcmV0dXJuIGxpc3RbbGlzdC5sZW5ndGgtMV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RSYW5kb20obGlzdCkge1xyXG4gICAgcmV0dXJuIGxpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGlzdC5sZW5ndGgpXTtcclxufVxyXG5cclxuZXhwb3J0IHsgY2xvbmUsIG1heCwgbWluLCBzdW0sIGF2ZXJhZ2UsIHdlaWdodFJhbmRvbSwgbGlzdFJhbmRvbSB9OyIsImltcG9ydCB7IG1heCwgbWluLCBzdW0sIGNsb25lLCBsaXN0UmFuZG9tIH0gZnJvbSAnLi9mdW5jdGlvbnMvdXRpbC5qcyc7XHJcblxyXG5jbGFzcyBQcm9wZXJ0eSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgVFlQRVMgPSB7XHJcbiAgICAgICAgLy8g5pys5bGAXHJcbiAgICAgICAgQUdFOiBcIkFHRVwiLCAvLyDlubTpvoQgYWdlIEFHRVxyXG4gICAgICAgIENIUjogXCJDSFJcIiwgLy8g6aKc5YC8IGNoYXJtIENIUlxyXG4gICAgICAgIElOVDogXCJJTlRcIiwgLy8g5pm65YqbIGludGVsbGlnZW5jZSBJTlRcclxuICAgICAgICBTVFI6IFwiU1RSXCIsIC8vIOS9k+i0qCBzdHJlbmd0aCBTVFJcclxuICAgICAgICBNTlk6IFwiTU5ZXCIsIC8vIOWutuWigyBtb25leSBNTllcclxuICAgICAgICBTUFI6IFwiU1BSXCIsIC8vIOW/q+S5kCBzcGlyaXQgU1BSXHJcbiAgICAgICAgTElGOiBcIkxJRlwiLCAvLyDnlJ/lkb0gbGlmZSBMSUZFXHJcbiAgICAgICAgVExUOiBcIlRMVFwiLCAvLyDlpKnotYsgdGFsZW50IFRMVFxyXG4gICAgICAgIEVWVDogXCJFVlRcIiwgLy8g5LqL5Lu2IGV2ZW50IEVWVFxyXG4gICAgICAgIFRNUzogXCJUTVNcIiwgLy8g5qyh5pWwIHRpbWVzIFRNU1xyXG5cclxuICAgICAgICAvLyBBdXRvIGNhbGNcclxuICAgICAgICBMQUdFOiBcIkxBR0VcIiwgLy8g5pyA5L2O5bm06b6EIExvdyBBZ2VcclxuICAgICAgICBIQUdFOiBcIkhBR0VcIiwgLy8g5pyA6auY5bm06b6EIEhpZ2ggQWdlXHJcbiAgICAgICAgTENIUjogXCJMQ0hSXCIsIC8vIOacgOS9juminOWAvCBMb3cgQ2hhcm1cclxuICAgICAgICBIQ0hSOiBcIkhDSFJcIiwgLy8g5pyA6auY6aKc5YC8IEhpZ2ggQ2hhcm1cclxuICAgICAgICBMSU5UOiBcIkxJTlRcIiwgLy8g5pyA5L2O5pm65YqbIExvdyBJbnRlbGxpZ2VuY2VcclxuICAgICAgICBISU5UOiBcIkhJTlRcIiwgLy8g5pyA6auY5pm65YqbIEhpZ2ggSW50ZWxsaWdlbmNlXHJcbiAgICAgICAgTFNUUjogXCJMU1RSXCIsIC8vIOacgOS9juS9k+i0qCBMb3cgU3RyZW5ndGhcclxuICAgICAgICBIU1RSOiBcIkhTVFJcIiwgLy8g5pyA6auY5L2T6LSoIEhpZ2ggU3RyZW5ndGhcclxuICAgICAgICBMTU5ZOiBcIkxNTllcIiwgLy8g5pyA5L2O5a625aKDIExvdyBNb25leVxyXG4gICAgICAgIEhNTlk6IFwiSE1OWVwiLCAvLyDmnIDpq5jlrrblooMgSGlnaCBNb25leVxyXG4gICAgICAgIExTUFI6IFwiTFNQUlwiLCAvLyDmnIDkvY7lv6vkuZAgTG93IFNwaXJpdFxyXG4gICAgICAgIEhTUFI6IFwiSFNQUlwiLCAvLyDmnIDpq5jlv6vkuZAgSGlnaCBTcGlyaXRcclxuXHJcbiAgICAgICAgU1VNOiBcIlNVTVwiLCAvLyDmgLvor4Qgc3VtbWFyeSBTVU1cclxuXHJcbiAgICAgICAgRVhUOiBcIkVYVFwiLCAvLyDnu6fmib/lpKnotYtcclxuXHJcbiAgICAgICAgLy8g5oC76K6hXHJcbiAgICAgICAgLy8gQWNoaWV2ZW1lbnQgVG90YWxcclxuICAgICAgICBBVExUOiBcIkFUTFRcIiwgLy8g5oul5pyJ6L+H55qE5aSp6LWLIEFjaGlldmUgVGFsZW50XHJcbiAgICAgICAgQUVWVDogXCJBRVZUXCIsIC8vIOinpuWPkei/h+eahOS6i+S7tiBBY2hpZXZlIEV2ZW50XHJcbiAgICAgICAgQUNIVjogXCJBQ0hWXCIsIC8vIOi+vuaIkOeahOaIkOWwsSBBY2hpZXZlbWVudFxyXG5cclxuICAgICAgICBDVExUOiBcIlJUTFRcIiwgLy8g5aSp6LWL6YCJ5oup5pWwIENvdW50IFRhbGVudFxyXG4gICAgICAgIENFVlQ6IFwiUkVWVFwiLCAvLyDkuovku7bmlLbpm4bmlbAgQ291bnQgRXZlbnRcclxuICAgICAgICBDQUNIVjogXCJDQUNIVlwiLCAvLyDmiJDlsLHovr7miJDmlbAgQ291bnQgQWNoaWV2ZW1lbnRcclxuXHJcbiAgICAgICAgLy8gU1BFQ0lBTFxyXG4gICAgICAgIFJETTogJ1JETScsIC8vIOmaj+acuuWxnuaApyByYW5kb20gUkRNXHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDnibnmrornsbvlnotcclxuICAgIFNQRUNJQUwgPSB7XHJcbiAgICAgICAgUkRNOiBbIC8vIOmaj+acuuWxnuaApyByYW5kb20gUkRNXHJcbiAgICAgICAgICAgIHRoaXMuVFlQRVMuQ0hSLFxyXG4gICAgICAgICAgICB0aGlzLlRZUEVTLklOVCxcclxuICAgICAgICAgICAgdGhpcy5UWVBFUy5TVFIsXHJcbiAgICAgICAgICAgIHRoaXMuVFlQRVMuTU5ZLFxyXG4gICAgICAgICAgICB0aGlzLlRZUEVTLlNQUixcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgI2FnZURhdGE7XHJcbiAgICAjZGF0YSA9IHt9O1xyXG5cclxuICAgIGluaXRpYWwoe2FnZX0pIHtcclxuXHJcbiAgICAgICAgdGhpcy4jYWdlRGF0YSA9IGFnZTtcclxuICAgICAgICBmb3IoY29uc3QgYSBpbiBhZ2UpIHtcclxuICAgICAgICAgICAgbGV0IHsgZXZlbnQsIHRhbGVudCB9ID0gYWdlW2FdO1xyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShldmVudCkpXHJcbiAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSBldmVudC5tYXAodj0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt2fWAuc3BsaXQoJyonKS5tYXAobj0+TnVtYmVyKG4pKTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlLmxlbmd0aD09MSkgdmFsdWUucHVzaCgxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheSh0YWxlbnQpKVxyXG4gICAgICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Lm1hcCh2PT5OdW1iZXIodikpO1xyXG5cclxuICAgICAgICAgICAgYWdlW2FdID0geyBldmVudCwgdGFsZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnQoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuI2RhdGEgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IC0xLFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSU5UXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1RSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1BSXTogMCxcclxuXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxJRl06IDEsXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5UTFRdOiBbXSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuRVZUXTogW10sXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MQUdFXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxDSFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTElOVF06IEluZmluaXR5LFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MU1RSXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxTUFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTE1OWV06IEluZmluaXR5LFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSEFHRV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSENIUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSElOVF06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNUUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSE1OWV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNQUl06IC1JbmZpbml0eSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2Uoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnRMYXN0U3RlcCgpIHtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MSU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxTUFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5TUFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MTU5ZXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuTU5ZKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5ISU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhNTlldID0gdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5IU1BSXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1BSKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQocHJvcCkge1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmUodGhpcy4jZGF0YVtwcm9wXSk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVU06XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIQUdFID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IQUdFKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhDSFIgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhDSFIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSElOVCA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSElOVCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIU1RSID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IU1RSKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhNTlkgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhNTlkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSFNQUiA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSFNQUik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihzdW0oSENIUiwgSElOVCwgSFNUUiwgSE1OWSwgSFNQUikqMiArIEhBR0UvMik7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldCgndGltZXMnKSB8fCAwO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuRVhUOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubHNnZXQoJ2V4dGVuZFRhbGVudCcpIHx8IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BVExUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQUVWVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldChwcm9wKSB8fCBbXTtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFjayhwcm9wKVxyXG4gICAgICAgICAgICAgICAgKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmYWxsYmFjayhwcm9wKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxBR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOiByZXR1cm4gdGhpcy5UWVBFUy5BR0U7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQ0hSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjogcmV0dXJuIHRoaXMuVFlQRVMuQ0hSO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTElOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6IHJldHVybiB0aGlzLlRZUEVTLklOVDtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOiByZXR1cm4gdGhpcy5UWVBFUy5TVFI7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MTU5ZOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTogcmV0dXJuIHRoaXMuVFlQRVMuTU5ZO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTFNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6IHJldHVybiB0aGlzLlRZUEVTLlNQUjtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6IHJldHVybiB0aGlzLlRZUEVTLkFUTFQ7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOiByZXR1cm4gdGhpcy5UWVBFUy5BRVZUO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6IHJldHVybiB0aGlzLlRZUEVTLkFDSFY7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFHRTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLklOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNUUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLk1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJRjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlRMVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkVWVDpcclxuICAgICAgICAgICAgICAgIHRoaXMuaGwocHJvcCwgdGhpcy4jZGF0YVtwcm9wXSA9IGNsb25lKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjaGlldmUocHJvcCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuVE1TOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3NldCgndGltZXMnLCBwYXJzZUludCh2YWx1ZSkgfHwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FWFQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxzc2V0KCdleHRlbmRUYWxlbnQnLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0UmVjb3JkKCkge1xyXG4gICAgICAgIHJldHVybiBjbG9uZSh7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuQUdFKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5JTlRdOiB0aGlzLmdldCh0aGlzLlRZUEVTLklOVCksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLlNUUl06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1RSKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5TUFJdOiB0aGlzLmdldCh0aGlzLlRZUEVTLlNQUiksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlKHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IHYgb2YgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZShwcm9wLCBOdW1iZXIodikpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhsKHByb3AsIHRoaXMuI2RhdGFbcHJvcF0gKz0gTnVtYmVyKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jZGF0YVtwcm9wXTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlPDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHYuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXghPS0xKSB2LnNwbGljZShpbmRleCwxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCF2LmluY2x1ZGVzKHZhbHVlKSkgdi5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNoaWV2ZShwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldChcclxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0KHByb3ApICsgcGFyc2VJbnQodmFsdWUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhvb2tTcGVjaWFsKHByb3ApIHtcclxuICAgICAgICBzd2l0Y2gocHJvcCkge1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuUkRNOiByZXR1cm4gbGlzdFJhbmRvbSh0aGlzLlNQRUNJQUwuUkRNKTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHByb3A7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVmZmVjdChlZmZlY3RzKSB7XHJcbiAgICAgICAgZm9yKGxldCBwcm9wIGluIGVmZmVjdHMpXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rU3BlY2lhbChwcm9wKSxcclxuICAgICAgICAgICAgICAgIE51bWJlcihlZmZlY3RzW3Byb3BdKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRW5kKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLlRZUEVTLkxJRikgPCAxO1xyXG4gICAgfVxyXG5cclxuICAgIGFnZU5leHQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2UodGhpcy5UWVBFUy5BR0UsIDEpO1xyXG4gICAgICAgIGNvbnN0IGFnZSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuQUdFKTtcclxuICAgICAgICBjb25zdCB7ZXZlbnQsIHRhbGVudH0gPSB0aGlzLmdldEFnZURhdGEoYWdlKTtcclxuICAgICAgICByZXR1cm4ge2FnZSwgZXZlbnQsIHRhbGVudH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWdlRGF0YShhZ2UpIHtcclxuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy4jYWdlRGF0YVthZ2VdKTtcclxuICAgIH1cclxuXHJcbiAgICBobChwcm9wLCB2YWx1ZSkge1xyXG4gICAgICAgIGxldCBrZXlzO1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6IGtleXMgPSBbdGhpcy5UWVBFUy5MQUdFLCB0aGlzLlRZUEVTLkhBR0VdOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNIUjoga2V5cyA9IFt0aGlzLlRZUEVTLkxDSFIsIHRoaXMuVFlQRVMuSENIUl07IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSU5UOiBrZXlzID0gW3RoaXMuVFlQRVMuTElOVCwgdGhpcy5UWVBFUy5ISU5UXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6IGtleXMgPSBbdGhpcy5UWVBFUy5MU1RSLCB0aGlzLlRZUEVTLkhTVFJdOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLk1OWToga2V5cyA9IFt0aGlzLlRZUEVTLkxNTlksIHRoaXMuVFlQRVMuSE1OWV07IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuU1BSOiBrZXlzID0gW3RoaXMuVFlQRVMuTFNQUiwgdGhpcy5UWVBFUy5IU1BSXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgW2wsIGhdID0ga2V5cztcclxuICAgICAgICB0aGlzLiNkYXRhW2xdID0gbWluKHRoaXMuI2RhdGFbbF0sIHZhbHVlKTtcclxuICAgICAgICB0aGlzLiNkYXRhW2hdID0gbWF4KHRoaXMuI2RhdGFbaF0sIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBhY2hpZXZlKHByb3AsIG5ld0RhdGEpIHtcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BQ0hWOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdERhdGEgPSB0aGlzLmxzZ2V0KHByb3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3NldChcclxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgIChsYXN0RGF0YSB8fCBbXSkuY29uY2F0KFtbbmV3RGF0YSwgRGF0ZS5ub3coKV1dKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlRMVDoga2V5ID0gdGhpcy5UWVBFUy5BVExUOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkVWVDoga2V5ID0gdGhpcy5UWVBFUy5BRVZUOyBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsYXN0RGF0YSA9IHRoaXMubHNnZXQoa2V5KSB8fCBbXTtcclxuICAgICAgICB0aGlzLmxzc2V0KFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oXHJcbiAgICAgICAgICAgICAgICBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgICAgICAgIGxhc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQobmV3RGF0YXx8W10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0KClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBsc2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZihkYXRhID09PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgbHNzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb3BlcnR5OyIsImZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbikge1xyXG5cclxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXTtcclxuICAgIGNvbnN0IGxlbmd0aCA9IGNvbmRpdGlvbi5sZW5ndGg7XHJcbiAgICBjb25zdCBzdGFjayA9IFtdO1xyXG4gICAgc3RhY2sudW5zaGlmdChjb25kaXRpb25zKTtcclxuICAgIGxldCBjdXJzb3IgPSAwO1xyXG4gICAgY29uc3QgY2F0Y2hTdHJpbmcgPSBpID0+IHtcclxuICAgICAgICBjb25zdCBzdHIgPSBjb25kaXRpb24uc3Vic3RyaW5nKGN1cnNvciwgaSkudHJpbSgpO1xyXG4gICAgICAgIGN1cnNvciA9IGk7XHJcbiAgICAgICAgaWYoc3RyKSBzdGFja1swXS5wdXNoKHN0cik7XHJcbiAgICB9O1xyXG5cclxuICAgIGZvcihsZXQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgc3dpdGNoKGNvbmRpdGlvbltpXSkge1xyXG4gICAgICAgICAgICBjYXNlICcgJzogY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjYXNlICcoJzpcclxuICAgICAgICAgICAgICAgIGNhdGNoU3RyaW5nKGkpO1xyXG4gICAgICAgICAgICAgICAgY3Vyc29yICsrO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViID0gW107XHJcbiAgICAgICAgICAgICAgICBzdGFja1swXS5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay51bnNoaWZ0KHN1Yik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJyknOlxyXG4gICAgICAgICAgICAgICAgY2F0Y2hTdHJpbmcoaSk7XHJcbiAgICAgICAgICAgICAgICBjdXJzb3IgKys7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgICAgY2FzZSAnJic6XHJcbiAgICAgICAgICAgICAgICBjYXRjaFN0cmluZyhpKTtcclxuICAgICAgICAgICAgICAgIGNhdGNoU3RyaW5nKGkrMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNhdGNoU3RyaW5nKGxlbmd0aCk7XHJcblxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pIHtcclxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pO1xyXG4gICAgcmV0dXJuIGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9ucyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9ucykge1xyXG4gICAgaWYoIUFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHJldHVybiBjaGVja1Byb3AocHJvcGVydHksIGNvbmRpdGlvbnMpO1xyXG4gICAgaWYoY29uZGl0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICBpZihjb25kaXRpb25zLmxlbmd0aCA9PSAxKSByZXR1cm4gY2hlY2tQYXJzZWRDb25kaXRpb25zKHByb3BlcnR5LCBjb25kaXRpb25zWzBdKTtcclxuXHJcbiAgICBsZXQgcmV0ID0gY2hlY2tQYXJzZWRDb25kaXRpb25zKHByb3BlcnR5LCBjb25kaXRpb25zWzBdKTtcclxuICAgIGZvcihsZXQgaT0xOyBpPGNvbmRpdGlvbnMubGVuZ3RoOyBpKz0yKSB7XHJcbiAgICAgICAgc3dpdGNoKGNvbmRpdGlvbnNbaV0pIHtcclxuICAgICAgICAgICAgY2FzZSAnJic6XHJcbiAgICAgICAgICAgICAgICBpZihyZXQpIHJldCA9IGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9uc1tpKzFdKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgICAgICAgIGlmKHJldCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXQgPSBjaGVja1BhcnNlZENvbmRpdGlvbnMocHJvcGVydHksIGNvbmRpdGlvbnNbaSsxXSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrUHJvcChwcm9wZXJ0eSwgY29uZGl0aW9uKSB7XHJcblxyXG4gICAgY29uc3QgbGVuZ3RoID0gY29uZGl0aW9uLmxlbmd0aDtcclxuICAgIGxldCBpID0gY29uZGl0aW9uLnNlYXJjaCgvWz48XFwhXFw/PV0vKTtcclxuXHJcbiAgICBjb25zdCBwcm9wID0gY29uZGl0aW9uLnN1YnN0cmluZygwLGkpO1xyXG4gICAgY29uc3Qgc3ltYm9sID0gY29uZGl0aW9uLnN1YnN0cmluZyhpLCBpKz0oY29uZGl0aW9uW2krMV09PSc9Jz8yOjEpKTtcclxuICAgIGNvbnN0IGQgPSBjb25kaXRpb24uc3Vic3RyaW5nKGksIGxlbmd0aCk7XHJcblxyXG4gICAgY29uc3QgcHJvcERhdGEgPSBwcm9wZXJ0eS5nZXQocHJvcCk7XHJcbiAgICBjb25zdCBjb25kaXRpb25EYXRhID0gZFswXT09J1snPyBKU09OLnBhcnNlKGQpOiBOdW1iZXIoZCk7XHJcblxyXG4gICAgc3dpdGNoKHN5bWJvbCkge1xyXG4gICAgICAgIGNhc2UgJz4nOiAgcmV0dXJuIHByb3BEYXRhID4gIGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPCc6ICByZXR1cm4gcHJvcERhdGEgPCAgY29uZGl0aW9uRGF0YTtcclxuICAgICAgICBjYXNlICc+PSc6IHJldHVybiBwcm9wRGF0YSA+PSBjb25kaXRpb25EYXRhO1xyXG4gICAgICAgIGNhc2UgJzw9JzogcmV0dXJuIHByb3BEYXRhIDw9IGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPSc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEYXRhLmluY2x1ZGVzKGNvbmRpdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvcERhdGEgPT0gY29uZGl0aW9uRGF0YTtcclxuICAgICAgICBjYXNlICchPSc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wRGF0YS5pbmNsdWRlcyhjb25kaXRpb25EYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3BEYXRhICE9IGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPyc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgcCBvZiBwcm9wRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICBpZihjb25kaXRpb25EYXRhLmluY2x1ZGVzKHApKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRGF0YS5pbmNsdWRlcyhwcm9wRGF0YSk7XHJcbiAgICAgICAgY2FzZSAnISc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgcCBvZiBwcm9wRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICBpZihjb25kaXRpb25EYXRhLmluY2x1ZGVzKHApKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gIWNvbmRpdGlvbkRhdGEuaW5jbHVkZXMocHJvcERhdGEpO1xyXG5cclxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RNYXhUcmlnZ2Vycyhjb25kaXRpb24pIHtcclxuICAgIC8vIEFzc3VtaW5nIG9ubHkgYWdlIHJlbGF0ZWQgdGFsZW50cyBjYW4gYmUgdHJpZ2dlcmVkIG11bHRpcGxlIHRpbWVzLlxyXG4gICAgY29uc3QgUkVfQUdFX0NPTkRJVElPTiA9IC9BR0VcXD9cXFsoWzAtOVxcLF0rKVxcXS87XHJcbiAgICBjb25zdCBtYXRjaF9vYmplY3QgPSBSRV9BR0VfQ09ORElUSU9OLmV4ZWMoY29uZGl0aW9uKTtcclxuICAgIGlmIChtYXRjaF9vYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIE5vdCBhZ2UgcmVsYXRlZCwgc2luZ2xlIHRyaWdnZXIuXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IGFnZV9saXN0ID0gbWF0Y2hfb2JqZWN0WzFdLnNwbGl0KFwiLFwiKTtcclxuICAgIHJldHVybiBhZ2VfbGlzdC5sZW5ndGg7XHJcbn1cclxuXHJcbmV4cG9ydCB7IGNoZWNrQ29uZGl0aW9uLCBleHRyYWN0TWF4VHJpZ2dlcnMgfTsiLCJpbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnO1xyXG5pbXBvcnQgeyBjaGVja0NvbmRpdGlvbiB9IGZyb20gJy4vZnVuY3Rpb25zL2NvbmRpdGlvbi5qcyc7XHJcblxyXG5jbGFzcyBFdmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgI2V2ZW50cztcclxuXHJcbiAgICBpbml0aWFsKHtldmVudHN9KSB7XHJcbiAgICAgICAgdGhpcy4jZXZlbnRzID0gZXZlbnRzO1xyXG4gICAgICAgIGZvcihjb25zdCBpZCBpbiBldmVudHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaWRdO1xyXG4gICAgICAgICAgICBpZighZXZlbnQuYnJhbmNoKSBjb250aW51ZTtcclxuICAgICAgICAgICAgZXZlbnQuYnJhbmNoID0gZXZlbnQuYnJhbmNoLm1hcChiPT57XHJcbiAgICAgICAgICAgICAgICBiID0gYi5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICAgICAgYlsxXSA9IE51bWJlcihiWzFdKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuI2V2ZW50cykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKGV2ZW50SWQsIHByb3BlcnR5KSB7XHJcbiAgICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBOb1JhbmRvbSB9ID0gdGhpcy5nZXQoZXZlbnRJZCk7XHJcbiAgICAgICAgaWYoTm9SYW5kb20pIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZihleGNsdWRlICYmIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBleGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmKGluY2x1ZGUpIHJldHVybiBjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgaW5jbHVkZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGV2ZW50SWQpIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuI2V2ZW50c1tldmVudElkXTtcclxuICAgICAgICBpZighZXZlbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBFdmVudFske2V2ZW50SWR9XWApO1xyXG4gICAgICAgIHJldHVybiBjbG9uZShldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5mb3JtYXRpb24oZXZlbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHsgZXZlbnQ6IGRlc2NyaXB0aW9uIH0gPSB0aGlzLmdldChldmVudElkKVxyXG4gICAgICAgIHJldHVybiB7IGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcblxyXG4gICAgZG8oZXZlbnRJZCwgcHJvcGVydHkpIHtcclxuICAgICAgICBjb25zdCB7IGVmZmVjdCwgYnJhbmNoLCBldmVudDogZGVzY3JpcHRpb24sIHBvc3RFdmVudCB9ID0gdGhpcy5nZXQoZXZlbnRJZCk7XHJcbiAgICAgICAgaWYoYnJhbmNoKVxyXG4gICAgICAgICAgICBmb3IoY29uc3QgW2NvbmQsIG5leHRdIG9mIGJyYW5jaClcclxuICAgICAgICAgICAgICAgIGlmKGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlZmZlY3QsIG5leHQsIGRlc2NyaXB0aW9uIH07XHJcbiAgICAgICAgcmV0dXJuIHsgZWZmZWN0LCBwb3N0RXZlbnQsIGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFdmVudDsiLCJpbXBvcnQgeyBjbG9uZSwgd2VpZ2h0UmFuZG9tIH0gZnJvbSAnLi9mdW5jdGlvbnMvdXRpbC5qcyc7XHJcbmltcG9ydCB7IGNoZWNrQ29uZGl0aW9uLCBleHRyYWN0TWF4VHJpZ2dlcnMgfSBmcm9tICcuL2Z1bmN0aW9ucy9jb25kaXRpb24uanMnO1xyXG5pbXBvcnQgeyBnZXRSYXRlIH0gZnJvbSAnLi9mdW5jdGlvbnMvYWRkaXRpb24uanMnO1xyXG5cclxuY2xhc3MgVGFsZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgICAjdGFsZW50cztcclxuXHJcbiAgICBpbml0aWFsKHt0YWxlbnRzfSkge1xyXG4gICAgICAgIHRoaXMuI3RhbGVudHMgPSB0YWxlbnRzO1xyXG4gICAgICAgIGZvcihjb25zdCBpZCBpbiB0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhbGVudCA9IHRhbGVudHNbaWRdO1xyXG4gICAgICAgICAgICB0YWxlbnQuaWQ9IE51bWJlcihpZCk7XHJcbiAgICAgICAgICAgIHRhbGVudC5ncmFkZSA9IE51bWJlcih0YWxlbnQuZ3JhZGUpO1xyXG4gICAgICAgICAgICB0YWxlbnQubWF4X3RyaWdnZXJzID0gZXh0cmFjdE1heFRyaWdnZXJzKHRhbGVudC5jb25kaXRpb24pO1xyXG4gICAgICAgICAgICBpZih0YWxlbnQucmVwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHRhbGVudC5yZXBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdmFsdWUgb2YgdGFsZW50LnJlcGxhY2VtZW50W2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gLnNwbGl0KCcqJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialt2YWx1ZVswXXx8MF0gPSBOdW1iZXIodmFsdWVbMV0pIHx8IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRhbGVudC5yZXBsYWNlbWVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvdW50KCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLiN0YWxlbnRzKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2sodGFsZW50SWQsIHByb3BlcnR5KSB7XHJcbiAgICAgICAgY29uc3QgeyBjb25kaXRpb24gfSA9IHRoaXMuZ2V0KHRhbGVudElkKTtcclxuICAgICAgICByZXR1cm4gY2hlY2tDb25kaXRpb24ocHJvcGVydHksIGNvbmRpdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KHRhbGVudElkKSB7XHJcbiAgICAgICAgY29uc3QgdGFsZW50ID0gdGhpcy4jdGFsZW50c1t0YWxlbnRJZF07XHJcbiAgICAgICAgaWYoIXRhbGVudCkgdGhyb3cgbmV3IEVycm9yKGBbRVJST1JdIE5vIFRhbGVudFske3RhbGVudElkfV1gKTtcclxuICAgICAgICByZXR1cm4gY2xvbmUodGFsZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpbmZvcm1hdGlvbih0YWxlbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH0gPSB0aGlzLmdldCh0YWxlbnRJZClcclxuICAgICAgICByZXR1cm4geyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24gfTtcclxuICAgIH1cclxuXHJcbiAgICBleGNsdXNpdmUodGFsZW5kcywgZXhjbHVzaXZlSWQpIHtcclxuICAgICAgICBjb25zdCB7IGV4Y2x1c2l2ZSB9ID0gdGhpcy5nZXQoZXhjbHVzaXZlSWQpO1xyXG4gICAgICAgIGlmKCFleGNsdXNpdmUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGZvcihjb25zdCB0YWxlbnQgb2YgdGFsZW5kcykge1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgZSBvZiBleGNsdXNpdmUpIHtcclxuICAgICAgICAgICAgICAgIGlmKHRhbGVudCA9PSBlKSByZXR1cm4gdGFsZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRhbGVudFJhbmRvbShpbmNsdWRlLCB7dGltZXMgPSAwLCBhY2hpZXZlbWVudCA9IDB9ID0ge30pIHtcclxuICAgICAgICBjb25zdCByYXRlID0geyAxOjEwMCwgMjoxMCwgMzoxLCB9O1xyXG4gICAgICAgIGNvbnN0IHJhdGVBZGRpdGlvbiA9IHsgMToxLCAyOjEsIDM6MSwgfTtcclxuICAgICAgICBjb25zdCB0aW1lc1JhdGUgPSBnZXRSYXRlKCd0aW1lcycsIHRpbWVzKTtcclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudFJhdGUgPSBnZXRSYXRlKCdhY2hpZXZlbWVudCcsIGFjaGlldmVtZW50KTtcclxuXHJcbiAgICAgICAgZm9yKGNvbnN0IGdyYWRlIGluIHRpbWVzUmF0ZSlcclxuICAgICAgICAgICAgcmF0ZUFkZGl0aW9uW2dyYWRlXSArPSB0aW1lc1JhdGVbZ3JhZGVdIC0gMTtcclxuXHJcbiAgICAgICAgZm9yKGNvbnN0IGdyYWRlIGluIGFjaGlldmVtZW50UmF0ZSlcclxuICAgICAgICAgICAgcmF0ZUFkZGl0aW9uW2dyYWRlXSArPSBhY2hpZXZlbWVudFJhdGVbZ3JhZGVdIC0gMTtcclxuXHJcbiAgICAgICAgZm9yKGNvbnN0IGdyYWRlIGluIHJhdGVBZGRpdGlvbilcclxuICAgICAgICAgICAgcmF0ZVtncmFkZV0gKj0gcmF0ZUFkZGl0aW9uW2dyYWRlXTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZG9tR3JhZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByYW5kb21OdW1iZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcclxuICAgICAgICAgICAgaWYoKHJhbmRvbU51bWJlciAtPSByYXRlWzNdKSA8IDApIHJldHVybiAzO1xyXG4gICAgICAgICAgICBpZigocmFuZG9tTnVtYmVyIC09IHJhdGVbMl0pIDwgMCkgcmV0dXJuIDI7XHJcbiAgICAgICAgICAgIGlmKChyYW5kb21OdW1iZXIgLT0gcmF0ZVsxXSkgPCAwKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAxMDAwLCAxMDAsIDEwLCAxXHJcbiAgICAgICAgY29uc3QgdGFsZW50TGlzdCA9IHt9O1xyXG4gICAgICAgIGZvcihjb25zdCB0YWxlbnRJZCBpbiB0aGlzLiN0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaWQsIGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9ID0gdGhpcy4jdGFsZW50c1t0YWxlbnRJZF07XHJcbiAgICAgICAgICAgIGlmKGlkID09IGluY2x1ZGUpIHtcclxuICAgICAgICAgICAgICAgIGluY2x1ZGUgPSB7IGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiwgaWQgfTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCF0YWxlbnRMaXN0W2dyYWRlXSkgdGFsZW50TGlzdFtncmFkZV0gPSBbeyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24sIGlkIH1dO1xyXG4gICAgICAgICAgICBlbHNlIHRhbGVudExpc3RbZ3JhZGVdLnB1c2goeyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24sIGlkIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheSgxMClcclxuICAgICAgICAgICAgLmZpbGwoMSkubWFwKCh2LCBpKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYoIWkgJiYgaW5jbHVkZSkgcmV0dXJuIGluY2x1ZGU7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JhZGUgPSByYW5kb21HcmFkZSgpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUodGFsZW50TGlzdFtncmFkZV0ubGVuZ3RoID09IDApIGdyYWRlLS07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSB0YWxlbnRMaXN0W2dyYWRlXS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxlbmd0aCkgJSBsZW5ndGg7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFsZW50TGlzdFtncmFkZV0uc3BsaWNlKHJhbmRvbSwxKVswXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWxsb2NhdGlvbkFkZGl0aW9uKHRhbGVudHMpIHtcclxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHRhbGVudHMpKSB7XHJcbiAgICAgICAgICAgIGxldCBhZGRpdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIGZvcihjb25zdCB0YWxlbnQgb2YgdGFsZW50cylcclxuICAgICAgICAgICAgICAgIGFkZGl0aW9uICs9IHRoaXMuYWxsb2NhdGlvbkFkZGl0aW9uKHRhbGVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmdldCh0YWxlbnRzKS5zdGF0dXMpIHx8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZG8odGFsZW50SWQsIHByb3BlcnR5KSB7XHJcbiAgICAgICAgY29uc3QgeyBlZmZlY3QsIGNvbmRpdGlvbiwgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH0gPSB0aGlzLmdldCh0YWxlbnRJZCk7XHJcbiAgICAgICAgaWYoY29uZGl0aW9uICYmICFjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgY29uZGl0aW9uKSlcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHsgZWZmZWN0LCBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24gfTtcclxuICAgIH1cclxuXHJcbiAgICByZXBsYWNlKHRhbGVudHMpIHtcclxuICAgICAgICBjb25zdCBnZXRSZXBsYWNlTGlzdCA9ICh0YWxlbnQsIHRhbGVudHMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyByZXBsYWNlbWVudCB9ID0gdGhpcy5nZXQodGFsZW50KTtcclxuICAgICAgICAgICAgaWYoIXJlcGxhY2VtZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IFtdO1xyXG4gICAgICAgICAgICBpZihyZXBsYWNlbWVudC5ncmFkZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JFYWNoKCh7aWQsIGdyYWRlfSk9PntcclxuICAgICAgICAgICAgICAgICAgICBpZighcmVwbGFjZW1lbnQuZ3JhZGVbZ3JhZGVdKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5leGNsdXNpdmUodGFsZW50cywgaWQpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKFtpZCwgcmVwbGFjZW1lbnQuZ3JhZGVbZ3JhZGVdXSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJlcGxhY2VtZW50LnRhbGVudCkge1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpZCBpbiByZXBsYWNlbWVudC50YWxlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZCA9IE51bWJlcihpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5leGNsdXNpdmUodGFsZW50cywgaWQpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0LnB1c2goW2lkLCByZXBsYWNlbWVudC50YWxlbnRbaWRdXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXBsYWNlID0gKHRhbGVudCwgdGFsZW50cykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlTGlzdCA9IGdldFJlcGxhY2VMaXN0KHRhbGVudCwgdGFsZW50cyk7XHJcbiAgICAgICAgICAgIGlmKCFyZXBsYWNlTGlzdCkgcmV0dXJuIHRhbGVudDtcclxuICAgICAgICAgICAgY29uc3QgcmFuZCA9IHdlaWdodFJhbmRvbShyZXBsYWNlTGlzdCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgcmFuZCwgdGFsZW50cy5jb25jYXQocmFuZClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld1RhbGVudHMgPSBjbG9uZSh0YWxlbnRzKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcclxuICAgICAgICBmb3IoY29uc3QgdGFsZW50IG9mIHRhbGVudHMpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZUlkID0gcmVwbGFjZSh0YWxlbnQsIG5ld1RhbGVudHMpO1xyXG4gICAgICAgICAgICBpZihyZXBsYWNlSWQgIT0gdGFsZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbdGFsZW50XSA9IHJlcGxhY2VJZDtcclxuICAgICAgICAgICAgICAgIG5ld1RhbGVudHMucHVzaChyZXBsYWNlSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKSByZXR1cm47XHJcbiAgICAgICAgZm9yKGNvbnN0IGlkIGluIHRoaXMuI3RhbGVudHMpXHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGNsb25lKHRoaXMuI3RhbGVudHNbaWRdKSwgaWQpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGFsZW50OyIsImltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi9mdW5jdGlvbnMvdXRpbC5qcyc7XHJcbmltcG9ydCB7IGNoZWNrQ29uZGl0aW9uIH0gZnJvbSAnLi9mdW5jdGlvbnMvY29uZGl0aW9uLmpzJztcclxuXHJcbmNsYXNzIEFjaGlldmVtZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgICAvLyDml7bmnLpcclxuICAgIE9wcG9ydHVuaXR5ID0ge1xyXG4gICAgICAgIFNUQVJUOiBcIlNUQVJUXCIsICAgICAgICAgICAgIC8vIOWIhumFjeWujOaIkOeCueaVsO+8jOeCueWHu+W8gOWni+aWsOS6uueUn+WQjlxyXG4gICAgICAgIFRSQUpFQ1RPUlk6IFwiVFJBSkVDVE9SWVwiLCAgIC8vIOavj+S4gOW5tOeahOS6uueUn+e7j+WOhuS4rVxyXG4gICAgICAgIFNVTU1BUlk6IFwiU1VNTUFSWVwiLCAgICAgICAgIC8vIOS6uueUn+e7k+adn++8jOeCueWHu+S6uueUn+aAu+e7k+WQjlxyXG4gICAgICAgIEVORDogXCJFTkRcIiwgICAgICAgICAgICAgICAgIC8vIOa4uOaIj+WujOaIkO+8jOeCueWHu+mHjeW8gCDph43lvIDmrKHmlbDlnKjov5nkuYvlkI7miY3kvJorMVxyXG4gICAgfTtcclxuXHJcbiAgICAjYWNoaWV2ZW1lbnRzO1xyXG5cclxuICAgIGluaXRpYWwoe2FjaGlldmVtZW50c30pIHtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudHMgPSBhY2hpZXZlbWVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgY291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuI2FjaGlldmVtZW50cykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3QocHJvcGVydHkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0XHJcbiAgICAgICAgICAgIC52YWx1ZXModGhpcy4jYWNoaWV2ZW1lbnRzKVxyXG4gICAgICAgICAgICAubWFwKCh7XHJcbiAgICAgICAgICAgICAgICBpZCwgbmFtZSwgb3Bwb3J0dW5pdHksXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwgaGlkZSwgZ3JhZGUsXHJcbiAgICAgICAgICAgIH0pPT4oe1xyXG4gICAgICAgICAgICAgICAgaWQsIG5hbWUsIG9wcG9ydHVuaXR5LFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGhpZGUsIGdyYWRlLFxyXG4gICAgICAgICAgICAgICAgaXNBY2hpZXZlZDogdGhpcy5pc0FjaGlldmVkKGlkLCBwcm9wZXJ0eSksXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQoYWNoaWV2ZW1lbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IGFjaGlldmVtZW50ID0gdGhpcy4jYWNoaWV2ZW1lbnRzW2FjaGlldmVtZW50SWRdO1xyXG4gICAgICAgIGlmKCFhY2hpZXZlbWVudCkgdGhyb3cgbmV3IEVycm9yKGBbRVJST1JdIE5vIEFjaGlldmVtZW50WyR7YWNoaWV2ZW1lbnRJZH1dYCk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lKGFjaGlldmVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVjayhhY2hpZXZlbWVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGNvbnN0IHsgY29uZGl0aW9uIH0gPSB0aGlzLmdldChhY2hpZXZlbWVudElkKTtcclxuICAgICAgICByZXR1cm4gY2hlY2tDb25kaXRpb24ocHJvcGVydHksIGNvbmRpdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaXNBY2hpZXZlZChhY2hpZXZlbWVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGZvcihjb25zdCBbYWNoaWV2ZWRdIG9mIChwcm9wZXJ0eS5nZXQocHJvcGVydHkuVFlQRVMuQUNIVil8fFtdKSlcclxuICAgICAgICAgICAgaWYoYWNoaWV2ZWQgPT0gYWNoaWV2ZW1lbnRJZCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFjaGlldmUob3Bwb3J0dW5pdHksIHByb3BlcnR5KSB7XHJcbiAgICAgICAgdGhpcy5saXN0KHByb3BlcnR5KVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7aXNBY2hpZXZlZH0pPT4haXNBY2hpZXZlZClcclxuICAgICAgICAgICAgLmZpbHRlcigoe29wcG9ydHVuaXR5OiBvfSk9Pm89PW9wcG9ydHVuaXR5KVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7aWR9KT0+dGhpcy5jaGVjayhpZCwgcHJvcGVydHkpKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgoe2lkfSk9PntcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5LmFjaGlldmUocHJvcGVydHkuVFlQRVMuQUNIViwgaWQpXHJcbiAgICAgICAgICAgICAgICAkJGV2ZW50KCdhY2hpZXZlbWVudCcsIHRoaXMuZ2V0KGlkKSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFjaGlldmVtZW50OyIsImltcG9ydCB7IHdlaWdodFJhbmRvbSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnXHJcbmltcG9ydCBQcm9wZXJ0eSBmcm9tICcuL3Byb3BlcnR5LmpzJztcclxuaW1wb3J0IEV2ZW50IGZyb20gJy4vZXZlbnQuanMnO1xyXG5pbXBvcnQgVGFsZW50IGZyb20gJy4vdGFsZW50LmpzJztcclxuaW1wb3J0IEFjaGlldmVtZW50IGZyb20gJy4vYWNoaWV2ZW1lbnQuanMnO1xyXG5cclxuY2xhc3MgTGlmZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eSgpO1xyXG4gICAgICAgIHRoaXMuI2V2ZW50ID0gbmV3IEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy4jdGFsZW50ID0gbmV3IFRhbGVudCgpO1xyXG4gICAgICAgIHRoaXMuI2FjaGlldmVtZW50ID0gbmV3IEFjaGlldmVtZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgI3Byb3BlcnR5O1xyXG4gICAgI2V2ZW50O1xyXG4gICAgI3RhbGVudDtcclxuICAgICNhY2hpZXZlbWVudDtcclxuICAgICN0cmlnZ2VyVGFsZW50cztcclxuXHJcbiAgICBhc3luYyBpbml0aWFsKCkge1xyXG4gICAgICAgIGNvbnN0IFthZ2UsIHRhbGVudHMsIGV2ZW50cywgYWNoaWV2ZW1lbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgIGpzb24oJ2FnZScpLFxyXG4gICAgICAgICAganNvbigndGFsZW50cycpLFxyXG4gICAgICAgICAganNvbignZXZlbnRzJyksXHJcbiAgICAgICAgICBqc29uKCdhY2hpZXZlbWVudCcpLFxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHkuaW5pdGlhbCh7YWdlfSk7XHJcbiAgICAgICAgdGhpcy4jdGFsZW50LmluaXRpYWwoe3RhbGVudHN9KTtcclxuICAgICAgICB0aGlzLiNldmVudC5pbml0aWFsKHtldmVudHN9KTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5pbml0aWFsKHthY2hpZXZlbWVudHN9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0YXJ0KGFsbG9jYXRpb24pIHtcclxuICAgICAgICB0aGlzLiN0cmlnZ2VyVGFsZW50cyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy50YWxlbnRSZXBsYWNlKGFsbG9jYXRpb24uVExUKTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5yZXN0YXJ0KGFsbG9jYXRpb24pO1xyXG4gICAgICAgIHRoaXMuZG9UYWxlbnQoKVxyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LnJlc3RhcnRMYXN0U3RlcCgpO1xyXG4gICAgICAgIHRoaXMuI2FjaGlldmVtZW50LmFjaGlldmUoXHJcbiAgICAgICAgICAgIHRoaXMuI2FjaGlldmVtZW50Lk9wcG9ydHVuaXR5LlNUQVJULFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4gY29udGVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFsZW50QWxsb2NhdGlvbkFkZGl0aW9uKHRhbGVudHMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jdGFsZW50LmFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUYWxlbnRDdXJyZW50VHJpZ2dlckNvdW50KHRhbGVudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyaWdnZXJUYWxlbnRzW3RhbGVudElkXSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIG5leHQoKSB7XHJcbiAgICAgICAgY29uc3Qge2FnZSwgZXZlbnQsIHRhbGVudH0gPSB0aGlzLiNwcm9wZXJ0eS5hZ2VOZXh0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhbGVudENvbnRlbnQgPSB0aGlzLmRvVGFsZW50KHRhbGVudCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gdGhpcy5kb0V2ZW50KHRoaXMucmFuZG9tKGV2ZW50KSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzRW5kID0gdGhpcy4jcHJvcGVydHkuaXNFbmQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IFt0YWxlbnRDb250ZW50LCBldmVudENvbnRlbnRdLmZsYXQoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5UUkFKRUNUT1JZLFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4geyBhZ2UsIGNvbnRlbnQsIGlzRW5kIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGFsZW50UmVwbGFjZSh0YWxlbnRzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jdGFsZW50LnJlcGxhY2UodGFsZW50cyk7XHJcbiAgICAgICAgY29uc3QgY29udGVudHMgPSBbXTtcclxuICAgICAgICBmb3IoY29uc3QgaWQgaW4gcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRhbGVudHMucHVzaChyZXN1bHRbaWRdKTtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy4jdGFsZW50LmdldChpZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhbGVudC5nZXQocmVzdWx0W2lkXSk7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RhbGVudFJlcGxhY2UnLFxyXG4gICAgICAgICAgICAgICAgc291cmNlLCB0YXJnZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBkb1RhbGVudCh0YWxlbnRzKSB7XHJcbiAgICAgICAgaWYodGFsZW50cykgdGhpcy4jcHJvcGVydHkuY2hhbmdlKHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRMVCwgdGFsZW50cyk7XHJcbiAgICAgICAgdGFsZW50cyA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTFQpXHJcbiAgICAgICAgICAgIC5maWx0ZXIodGFsZW50SWQgPT4gdGhpcy5nZXRUYWxlbnRDdXJyZW50VHJpZ2dlckNvdW50KHRhbGVudElkKSA8IHRoaXMuI3RhbGVudC5nZXQodGFsZW50SWQpLm1heF90cmlnZ2Vycyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gW107XHJcbiAgICAgICAgZm9yKGNvbnN0IHRhbGVudElkIG9mIHRhbGVudHMpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jdGFsZW50LmRvKHRhbGVudElkLCB0aGlzLiNwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgIGlmKCFyZXN1bHQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB0aGlzLiN0cmlnZ2VyVGFsZW50c1t0YWxlbnRJZF0gPSB0aGlzLmdldFRhbGVudEN1cnJlbnRUcmlnZ2VyQ291bnQodGFsZW50SWQpICsgMTtcclxuICAgICAgICAgICAgY29uc3QgeyBlZmZlY3QsIG5hbWUsIGRlc2NyaXB0aW9uLCBncmFkZSB9ID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRMVCxcclxuICAgICAgICAgICAgICAgIG5hbWUsXHJcbiAgICAgICAgICAgICAgICBncmFkZSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighZWZmZWN0KSBjb250aW51ZTtcclxuICAgICAgICAgICAgdGhpcy4jcHJvcGVydHkuZWZmZWN0KGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBkb0V2ZW50KGV2ZW50SWQpIHtcclxuICAgICAgICBjb25zdCB7IGVmZmVjdCwgbmV4dCwgZGVzY3JpcHRpb24sIHBvc3RFdmVudCB9ID0gdGhpcy4jZXZlbnQuZG8oZXZlbnRJZCwgdGhpcy4jcHJvcGVydHkpO1xyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LmNoYW5nZSh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5FVlQsIGV2ZW50SWQpO1xyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LmVmZmVjdChlZmZlY3QpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuI3Byb3BlcnR5LlRZUEVTLkVWVCxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIHBvc3RFdmVudCxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYobmV4dCkgcmV0dXJuIFtjb250ZW50LCB0aGlzLmRvRXZlbnQobmV4dCldLmZsYXQoKTtcclxuICAgICAgICByZXR1cm4gW2NvbnRlbnRdO1xyXG4gICAgfVxyXG5cclxuICAgIHJhbmRvbShldmVudHMpIHtcclxuICAgICAgICByZXR1cm4gd2VpZ2h0UmFuZG9tKFxyXG4gICAgICAgICAgICBldmVudHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgKFtldmVudElkXSk9PnRoaXMuI2V2ZW50LmNoZWNrKGV2ZW50SWQsIHRoaXMuI3Byb3BlcnR5KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0YWxlbnRSYW5kb20oKSB7XHJcbiAgICAgICAgY29uc3QgdGltZXMgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuVE1TKTtcclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudCA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5DQUNIVik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhbGVudC50YWxlbnRSYW5kb20odGhpcy5nZXRMYXN0RXh0ZW5kVGFsZW50KCksIHsgdGltZXMsIGFjaGlldmVtZW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRhbGVudEV4dGVuZCh0YWxlbnRJZCkge1xyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LnNldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5FWFQsIHRhbGVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0RXh0ZW5kVGFsZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuRVhUKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdW1tYXJ5KCkge1xyXG4gICAgICAgIHRoaXMuI2FjaGlldmVtZW50LmFjaGlldmUoXHJcbiAgICAgICAgICAgIHRoaXMuI2FjaGlldmVtZW50Lk9wcG9ydHVuaXR5LlNVTU1BUlksXHJcbiAgICAgICAgICAgIHRoaXMuI3Byb3BlcnR5XHJcbiAgICAgICAgKVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIEFHRTogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhBR0UpLFxyXG4gICAgICAgICAgICBDSFI6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5IQ0hSKSxcclxuICAgICAgICAgICAgSU5UOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSElOVCksXHJcbiAgICAgICAgICAgIFNUUjogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhTVFIpLFxyXG4gICAgICAgICAgICBNTlk6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5ITU5ZKSxcclxuICAgICAgICAgICAgU1BSOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSFNQUiksXHJcbiAgICAgICAgICAgIFNVTTogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLlNVTSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0UmVjb3JkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wZXJ0eS5nZXRMYXN0UmVjb3JkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhjbHVzaXZlKHRhbGVudHMsIGV4Y2x1c2l2ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiN0YWxlbnQuZXhjbHVzaXZlKHRhbGVudHMsIGV4Y2x1c2l2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWNoaWV2ZW1lbnRzKCkge1xyXG4gICAgICAgIGNvbnN0IHRpY2tzID0ge307XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHlcclxuICAgICAgICAgICAgLmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5BQ0hWKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgoW2lkLCB0aWNrXSkgPT4gdGlja3NbaWRdID0gdGljayk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICAgICAgLiNhY2hpZXZlbWVudFxyXG4gICAgICAgICAgICAubGlzdCh0aGlzLiNwcm9wZXJ0eSlcclxuICAgICAgICAgICAgLnNvcnQoKFxyXG4gICAgICAgICAgICAgICAge2lkOiBhLCBncmFkZTogYWcsIGhpZGU6IGFofSxcclxuICAgICAgICAgICAgICAgIHtpZDogYiwgZ3JhZGU6IGJnLCBoaWRlOiBiaH1cclxuICAgICAgICAgICAgKT0+e1xyXG4gICAgICAgICAgICAgICAgYSA9IHRpY2tzW2FdO1xyXG4gICAgICAgICAgICAgICAgYiA9IHRpY2tzW2JdO1xyXG4gICAgICAgICAgICAgICAgaWYoYSYmYikgcmV0dXJuIGIgLSBhO1xyXG4gICAgICAgICAgICAgICAgaWYoIWEmJiFiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYWgmJmJoKSByZXR1cm4gYmcgLSBhZztcclxuICAgICAgICAgICAgICAgICAgICBpZihhaCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYmgpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmcgLSBhZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCFhKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgIGlmKCFiKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRvdGFsKCkge1xyXG4gICAgICAgIGNvbnN0IFRNUyA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTVMpO1xyXG4gICAgICAgIGNvbnN0IENBQ0hWID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkNBQ0hWKTtcclxuICAgICAgICBjb25zdCBDVExUID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkNUTFQpO1xyXG4gICAgICAgIGNvbnN0IENFVlQgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuQ0VWVCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvdGFsVGFsZW50ID0gdGhpcy4jdGFsZW50LmNvdW50KCk7XHJcbiAgICAgICAgY29uc3QgdG90YWxFdmVudCA9IHRoaXMuI2V2ZW50LmNvdW50KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWVzOiBUTVMsXHJcbiAgICAgICAgICAgIGFjaGlldmVtZW50OiBDQUNIVixcclxuICAgICAgICAgICAgdGFsZW50UmF0ZTogQ1RMVCAvIHRvdGFsVGFsZW50LFxyXG4gICAgICAgICAgICBldmVudFJhdGU6IENFVlQgLyB0b3RhbEV2ZW50LFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgdGltZXMoKSB7IHJldHVybiB0aGlzLiNwcm9wZXJ0eT8uZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRNUykgfHwgMDsgfVxyXG4gICAgc2V0IHRpbWVzKHYpIHtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eT8uc2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRNUywgdikgfHwgMDtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5FTkQsXHJcbiAgICAgICAgICAgIHRoaXMuI3Byb3BlcnR5XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlO1xyXG5cclxuIiwiaW1wb3J0IHsgc3VtbWFyeSB9IGZyb20gJy4vZnVuY3Rpb25zL3N1bW1hcnkuanMnO1xyXG5pbXBvcnQgeyBnZXRSYXRlLCBnZXRHcmFkZSB9IGZyb20gJy4vZnVuY3Rpb25zL2FkZGl0aW9uLmpzJztcclxuaW1wb3J0IExpZmUgZnJvbSAnLi9saWZlLmpzJztcclxuXHJcbmNsYXNzIEFwcHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy4jbGlmZSA9IG5ldyBMaWZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgI2xpZmU7XHJcbiAgICAjcGFnZXM7XHJcbiAgICAjY3VycmVudFBhZ2U7XHJcbiAgICAjdGFsZW50U2VsZWN0ZWQgPSBuZXcgU2V0KCk7XHJcbiAgICAjdG90YWxNYXg9MjA7XHJcbiAgICAjaXNFbmQgPSBmYWxzZTtcclxuICAgICNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IG51bGw7XHJcbiAgICAjaGludFRpbWVvdXQ7XHJcbiAgICAjc3BlY2lhbHRoYW5rcztcclxuICAgICNhdXRvVHJhamVjdG9yeTtcclxuXHJcbiAgICBhc3luYyBpbml0aWFsKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2goJ2xvYWRpbmcnKTtcclxuICAgICAgICBjb25zdCBbLHNwZWNpYWx0aGFua3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLiNsaWZlLmluaXRpYWwoKSxcclxuICAgICAgICAgICAganNvbignc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgdGhpcy4jc3BlY2lhbHRoYW5rcyA9IHNwZWNpYWx0aGFua3M7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2goJ2luZGV4Jyk7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5vbmVycm9yID0gKGV2ZW50LCBzb3VyY2UsIGxpbmVubywgY29sbm8sIGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGludChgW0VSUk9SXSBhdCAoJHtzb3VyY2V9OiR7bGluZW5vfToke2NvbG5vfSlcXG5cXG4ke2Vycm9yPy5zdGFja3x8ZXJyb3J8fCd1bmtub3cgRXJyb3InfWAsICdlcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlEb3duQ2FsbGJhY2sgPSAoe3doaWNoOiB3LCBrZXlDb2RlOiBrfSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIHcgPT09IDEzIHx8IGsgPT09IDEzIHx8IHcgPT09IDMyIHx8IGsgPT09IDMyICkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlc3NFbnRlckZ1bmMgPSB0aGlzLiNwYWdlc1t0aGlzLiNjdXJyZW50UGFnZV0/LnByZXNzRW50ZXI7XHJcbiAgICAgICAgICAgICAgICBwcmVzc0VudGVyRnVuYyAmJiB0eXBlb2YgcHJlc3NFbnRlckZ1bmMgPT09ICdmdW5jdGlvbicgJiYgcHJlc3NFbnRlckZ1bmMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlEb3duQ2FsbGJhY2spO1xyXG4gICAgICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleURvd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFBhZ2VzKCkge1xyXG5cclxuICAgICAgICAvLyBMb2FkaW5nXHJcbiAgICAgICAgY29uc3QgbG9hZGluZ1BhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIOS6uueUn+mHjeW8gOaooeaLn+WZqDxicj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MS41cmVtOyBmb250LXdlaWdodDpub3JtYWw7XCI+5Yqg6L295LitLi4uPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIGApO1xyXG5cclxuICAgICAgICAvLyBJbmRleFxyXG4gICAgICAgIGNvbnN0IGluZGV4UGFnZSA9ICQoYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJhY2hpZXZlbWVudFwiPuaIkOWwsTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3BlY2lhbHRoYW5rc1wiPueJueWIq+aEn+iwojwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidGhlbWVUb2dnbGVCdG5cIj7pu5E8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmVcIj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsb2FkXCI+TG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIOS6uueUn+mHjeW8gOaooeaLn+WZqDxicj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MS41cmVtOyBmb250LXdlaWdodDpub3JtYWw7XCI+6L+Z5Z6D5Zy+5Lq655Sf5LiA56eS5Lmf5LiN5oOz5ZGG5LqGPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVzdGFydFwiIGNsYXNzPVwibWFpbmJ0blwiPjxzcGFuIGNsYXNzPVwiaWNvbmZvbnRcIj4mI3hlNmE3Ozwvc3Bhbj7nq4vljbPph43lvIA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGEgaWQ9XCJkaXNjb3JkXCIgaHJlZj1cImh0dHBzOi8vZGlzY29yZC5nZy9VM3FyZjQ5Tk1RXCIgc3R5bGU9XCJ6LWluZGV4OiA5OTk5O1wiIGFyaWEtbGFiZWw9XCJDaGF0IG9uIERpc2NvcmRcIj48YnV0dG9uIGNsYXNzPVwiZGlzY29yZC1idG5cIj48c3ZnIHdpZHRoPVwiNTAlXCIgaGVpZ2h0PVwiNTVcIiB2aWV3Qm94PVwiMCAwIDcxIDU1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMClcIj48cGF0aCBkPVwiTTYwLjEwNDUgNC44OTc4QzU1LjU3OTIgMi44MjE0IDUwLjcyNjUgMS4yOTE2IDQ1LjY1MjcgMC40MTU0MkM0NS41NjAzIDAuMzk4NTEgNDUuNDY4IDAuNDQwNzY5IDQ1LjQyMDQgMC41MjUyODlDNDQuNzk2MyAxLjYzNTMgNDQuMTA1IDMuMDgzNCA0My42MjA5IDQuMjIxNkMzOC4xNjM3IDMuNDA0NiAzMi43MzQ1IDMuNDA0NiAyNy4zODkyIDQuMjIxNkMyNi45MDUgMy4wNTgxIDI2LjE4ODYgMS42MzUzIDI1LjU2MTcgMC41MjUyODlDMjUuNTE0MSAwLjQ0MzU4OSAyNS40MjE4IDAuNDAxMzMgMjUuMzI5NCAwLjQxNTQyQzIwLjI1ODQgMS4yODg4IDE1LjQwNTcgMi44MTg2IDEwLjg3NzYgNC44OTc4QzEwLjgzODQgNC45MTQ3IDEwLjgwNDggNC45NDI5IDEwLjc4MjUgNC45Nzk1QzEuNTc3OTUgMTguNzMwOSAtMC45NDM1NjEgMzIuMTQ0MyAwLjI5MzQwOCA0NS4zOTE0QzAuMjk5MDA1IDQ1LjQ1NjIgMC4zMzUzODYgNDUuNTE4MiAwLjM4NTc2MSA0NS41NTc2QzYuNDU4NjYgNTAuMDE3NCAxMi4zNDEzIDUyLjcyNDkgMTguMTE0NyA1NC41MTk1QzE4LjIwNzEgNTQuNTQ3NyAxOC4zMDUgNTQuNTEzOSAxOC4zNjM4IDU0LjQzNzhDMTkuNzI5NSA1Mi41NzI4IDIwLjk0NjkgNTAuNjA2MyAyMS45OTA3IDQ4LjUzODNDMjIuMDUyMyA0OC40MTcyIDIxLjk5MzUgNDguMjczNSAyMS44Njc2IDQ4LjIyNTZDMTkuOTM2NiA0Ny40OTMxIDE4LjA5NzkgNDYuNiAxNi4zMjkyIDQ1LjU4NThDMTYuMTg5MyA0NS41MDQxIDE2LjE3ODEgNDUuMzA0IDE2LjMwNjggNDUuMjA4MkMxNi42NzkgNDQuOTI5MyAxNy4wNTEzIDQ0LjYzOTEgMTcuNDA2NyA0NC4zNDYxQzE3LjQ3MSA0NC4yOTI2IDE3LjU2MDYgNDQuMjgxMyAxNy42MzYyIDQ0LjMxNTFDMjkuMjU1OCA0OS42MjAyIDQxLjgzNTQgNDkuNjIwMiA1My4zMTc5IDQ0LjMxNTFDNTMuMzkzNSA0NC4yNzg1IDUzLjQ4MzEgNDQuMjg5OCA1My41NTAyIDQ0LjM0MzNDNTMuOTA1NyA0NC42MzYzIDU0LjI3NzkgNDQuOTI5MyA1NC42NTI5IDQ1LjIwODJDNTQuNzgxNiA0NS4zMDQgNTQuNzczMiA0NS41MDQxIDU0LjYzMzMgNDUuNTg1OEM1Mi44NjQ2IDQ2LjYxOTcgNTEuMDI1OSA0Ny40OTMxIDQ5LjA5MjEgNDguMjIyOEM0OC45NjYyIDQ4LjI3MDcgNDguOTEwMiA0OC40MTcyIDQ4Ljk3MTggNDguNTM4M0M1MC4wMzggNTAuNjAzNCA1MS4yNTU0IDUyLjU2OTkgNTIuNTk1OSA1NC40MzVDNTIuNjUxOSA1NC41MTM5IDUyLjc1MjYgNTQuNTQ3NyA1Mi44NDUgNTQuNTE5NUM1OC42NDY0IDUyLjcyNDkgNjQuNTI5IDUwLjAxNzQgNzAuNjAxOSA0NS41NTc2QzcwLjY1NTEgNDUuNTE4MiA3MC42ODg3IDQ1LjQ1OSA3MC42OTQzIDQ1LjM5NDJDNzIuMTc0NyAzMC4wNzkxIDY4LjIxNDcgMTYuNzc1NyA2MC4xOTY4IDQuOTgyM0M2MC4xNzcyIDQuOTQyOSA2MC4xNDM3IDQuOTE0NyA2MC4xMDQ1IDQuODk3OFpNMjMuNzI1OSAzNy4zMjUzQzIwLjIyNzYgMzcuMzI1MyAxNy4zNDUxIDM0LjExMzYgMTcuMzQ1MSAzMC4xNjkzQzE3LjM0NTEgMjYuMjI1IDIwLjE3MTcgMjMuMDEzMyAyMy43MjU5IDIzLjAxMzNDMjcuMzA4IDIzLjAxMzMgMzAuMTYyNiAyNi4yNTMyIDMwLjEwNjYgMzAuMTY5M0MzMC4xMDY2IDM0LjExMzYgMjcuMjggMzcuMzI1MyAyMy43MjU5IDM3LjMyNTNaTTQ3LjMxNzggMzcuMzI1M0M0My44MTk2IDM3LjMyNTMgNDAuOTM3MSAzNC4xMTM2IDQwLjkzNzEgMzAuMTY5M0M0MC45MzcxIDI2LjIyNSA0My43NjM2IDIzLjAxMzMgNDcuMzE3OCAyMy4wMTMzQzUwLjkgMjMuMDEzMyA1My43NTQ1IDI2LjI1MzIgNTMuNjk4NiAzMC4xNjkzQzUzLjY5ODYgMzQuMTEzNiA1MC45IDM3LjMyNTMgNDcuMzE3OCAzNy4zMjUzWlwiIGZpbGw9XCIjZmZmZmZmXCIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9XCJjbGlwMFwiPjxyZWN0IHdpZHRoPVwiNzFcIiBoZWlnaHQ9XCI1NVwiIGZpbGw9XCJ3aGl0ZVwiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz5DSEFUPC9idXR0b24+PHN0eWxlPi5kaXNjb3JkLWJ0biB7cG9zaXRpb246IGZpeGVkO2JvdHRvbTogMC41cmVtO2xlZnQ6IDAuNXJlbTtiYWNrZ3JvdW5kLWNvbG9yOiAjNTg2NUYyO3BhZGRpbmc6IDAuN3JlbTtoZWlnaHQ6IGF1dG87Y29sb3I6IHdoaXRlO3RleHQtYWxpZ246IHJpZ2h0O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyOiBub25lO3dpZHRoOiA2LjVyZW07Zm9udC1zaXplOiAxcmVtO2JvcmRlci1yYWRpdXM6IDRweDt9LmRpc2NvcmQtYnRuIHN2ZyB7aGVpZ2h0OiAxLjVyZW07cG9zaXRpb246IGFic29sdXRlO3RvcDogNTAlO2xlZnQ6IDA7dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO30uZGlzY29yZC1idG46aG92ZXIgc3Zne2FuaW1hdGlvbjpkaXNjb3JkLXdhdmUgNTYwbXMgZWFzZS1pbi1vdXQ7fUBrZXlmcmFtZXMgZGlzY29yZC13YXZlezAlLDEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDApfTIwJSw2MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKC0yNWRlZyl9NDAlLDgwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMTBkZWcpfX1AbWVkaWEgKG1heC13aWR0aDo1MDBweCl7LmRpc2NvcmQtYnRuOmhvdmVyIHN2Z3thbmltYXRpb246bm9uZX0uZGlzY29yZC1idG4gc3Zne2FuaW1hdGlvbjpkaXNjb3JkLXdhdmUgNTYwbXMgZWFzZS1pbi1vdXR9fTwvc3R5bGU+PC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIGApO1xyXG5cclxuICAgICAgICAvLyBJbml0IHRoZW1lXHJcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGlmKCBkYXRlLmdldE1vbnRoKCkgPT0gOSAmJiBkYXRlLmdldERhdGUoKSA9PSAzMVxyXG4gICAgICAgICAgICB8fCBkYXRlLmdldE1vbnRoKCkgPT0gMTAgJiYgZGF0ZS5nZXREYXRlKCkgPT0gMVxyXG4gICAgICAgICl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGhlbWUoJ2hhbGxvd2VlbicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGhlbWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNyZXN0YXJ0JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgndGFsZW50JykpO1xyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNhY2hpZXZlbWVudCcpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ2FjaGlldmVtZW50JykpO1xyXG5cclxuXHJcbiAgICAgICAgaW5kZXhQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc2F2ZScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLmtleXMobG9jYWxTdG9yYWdlKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodj0+di5zdWJzdHIoMCw0KSE9J2dvb2cnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGtleT0+ZGF0YVtrZXldID0gbG9jYWxTdG9yYWdlW2tleV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzbGljZSA9IGJsb2Iuc2xpY2UgfHwgYmxvYi53ZWJraXRTbGljZSB8fCBibG9iLm1velNsaWNlO1xyXG4gICAgICAgICAgICAgICAgYmxvYiA9IHNsaWNlLmNhbGwoYmxvYiwgMCwgYmxvYi5zaXplLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2EnKTtcclxuICAgICAgICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gYFJlbWFrZV9zYXZlXyR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoJzonLCcuJyl9Lmpzb25gO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xyXG4gICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaW5kZXhQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjbG9hZCcpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9ICQoYDxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPmApXHJcbiAgICAgICAgICAgICAgICBmaWxlLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICAgICAgICAgICAgICBmaWxlLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICBmaWxlLm9uKCdjaGFuZ2UnLCAoZSk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgnbG9hZGluZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcclxuICAgICAgICAgICAgICAgICAgICBpZighZmlsZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocmVhZGVyLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlW2tleV0gPSBkYXRhW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2goJ2luZGV4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGhlbWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfpu5EnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFBhZ2UuZmluZCgnI3RoZW1lVG9nZ2xlQnRuJykudGV4dCgn55m9JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoJ+WKoOi9veWtmOaho+aIkOWKnycsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSA9PSAnbGlnaHQnKSB7XHJcbiAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfpu5EnKVxyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJyN0aGVtZVRvZ2dsZUJ0bicpLnRleHQoJ+eZvScpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoXCIjdGhlbWVUb2dnbGVCdG5cIilcclxuICAgICAgICAgICAgLmNsaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnZGFyaycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfnmb0nKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnbGlnaHQnKTtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleFBhZ2UuZmluZCgnI3RoZW1lVG9nZ2xlQnRuJykudGV4dCgn6buRJylcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRoZW1lKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaW5kZXhQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ3NwZWNpYWx0aGFua3MnKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNwZWNpYWxUaGFua3NQYWdlID0gJChgXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNwZWNpYWx0aGFua3NcIj7ov5Tlm548L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInNwdGh4XCI+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnMVwiPjwvdWw+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnMlwiPjwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3BvbnNvclwiIG9uY2xpY2s9XCJnbG9iYWxUaGlzLm9wZW4oJ2h0dHBzOi8vYWZkaWFuLm5ldC9ATGlmZVJlc3RhcnQnKVwiIHN0eWxlPVwiYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCM5NDZjZTYsIzdlNWZkOSk7IGxlZnQ6YXV0bzsgcmlnaHQ6NTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMnJlbSwtNTAlKTtcIj7miZPotY/nrZbliJIo54ix5Y+R55S1KTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3BvbnNvclwiIG9uY2xpY2s9XCJnbG9iYWxUaGlzLm9wZW4oJ2h0dHBzOi8vZHVuLm1pYW5iYW9kdW8uY29tL0B2aWNrc2NhcmxldCcpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiNjNjk7IGxlZnQ6NTAlOyByaWdodDphdXRvOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgycmVtLC01MCUpO1wiPuaJk+i1j+eoi+W6jyjpob/pob/ppa0pPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHNwZWNpYWxUaGFua3NQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ2luZGV4JykpO1xyXG5cclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudFBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3BlY2lhbHRoYW5rc1wiPui/lOWbnjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+57uf6K6hPC9zcGFuPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJ0b3RhbFwiPjwvdWw+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwicGFkZGluZzowLjI1cmVtOyBtYXJnaW46IDAuNXJlbSAwOyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6ICNjY2M7XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+5oiQ5bCxPGJ1dHRvbiBpZD1cInJhbmtcIj7mjpLooYzmppw8L2J1dHRvbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cImFjaGlldmVtZW50c1wiPjwvdWw+XHJcbiAgICAgICAgYClcclxuXHJcbiAgICAgICAgYWNoaWV2ZW1lbnRQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ2luZGV4JykpO1xyXG5cclxuICAgICAgICBhY2hpZXZlbWVudFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNyYW5rJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLmhpbnQoJ+WIq+WNt+S6hu+8jOayoeacieaOkuihjOamnCcpKTtcclxuICAgICAgICAvLyBUYWxlbnRcclxuICAgICAgICBjb25zdCB0YWxlbnRQYWdlID0gJChgXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMS42cmVtXCI+5aSp6LWL5oq95Y2hPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyYW5kb21cIiBjbGFzcz1cIm1haW5idG5cIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZDsgdG9wOiA1MCU7IGxlZnQ6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCJcIj4xMOi/nuaKve+8gTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJ0YWxlbnRzXCIgY2xhc3M9XCJzZWxlY3RsaXN0XCI+PC91bD5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cIm5leHRcIiBjbGFzcz1cIm1haW5idG5cIj7or7fpgInmi6kz5LiqPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRhbGVudCA9ICh7IGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKGA8bGkgY2xhc3M9XCJncmFkZSR7Z3JhZGV9YlwiPiR7bmFtZX3vvIgke2Rlc2NyaXB0aW9ufe+8iTwvbGk+YClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0YWxlbnRQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjcmFuZG9tJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJyNyYW5kb20nKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1bCA9IHRhbGVudFBhZ2UuZmluZCgnI3RhbGVudHMnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2xpZmUudGFsZW50UmFuZG9tKClcclxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh0YWxlbnQ9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGkgPSBjcmVhdGVUYWxlbnQodGFsZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdWwuYXBwZW5kKGxpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGkuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN0YWxlbnRTZWxlY3RlZC5kZWxldGUodGFsZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLiN0YWxlbnRTZWxlY3RlZC5zaXplPDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjbmV4dCcpLnRleHQoJ+ivt+mAieaLqTPkuKonKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy4jdGFsZW50U2VsZWN0ZWQuc2l6ZT09Mykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoJ+WPquiDvemAiTPkuKrlpKnotYsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjbHVzaXZlID0gdGhpcy4jbGlmZS5leGNsdXNpdmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpLm1hcCgoe2lkfSk9PmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFsZW50LmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihleGNsdXNpdmUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoY29uc3QgeyBuYW1lLCBpZCB9IG9mIHRoaXMuI3RhbGVudFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpZCA9PSBleGNsdXNpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoYOS4juW3sumAieaLqeeahOWkqei1i+OAkCR7bmFtZX3jgJHlhrLnqoFgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN0YWxlbnRTZWxlY3RlZC5hZGQodGFsZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLiN0YWxlbnRTZWxlY3RlZC5zaXplPT0zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI25leHQnKS50ZXh0KCflvIDlp4vmlrDkurrnlJ8nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJyNuZXh0Jykuc2hvdygpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0YWxlbnRQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjbmV4dCcpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy4jdGFsZW50U2VsZWN0ZWQuc2l6ZSE9Mykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn6K+36YCJ5oupM+S4quWkqei1iycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI25leHQnKS5oaWRlKClcclxuICAgICAgICAgICAgICAgIHRoaXMuI3RvdGFsTWF4ID0gMjAgKyB0aGlzLiNsaWZlLmdldFRhbGVudEFsbG9jYXRpb25BZGRpdGlvbihBcnJheS5mcm9tKHRoaXMuI3RhbGVudFNlbGVjdGVkKS5tYXAoKHtpZH0pPT5pZCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2goJ3Byb3BlcnR5Jyk7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIC8vIFByb3BlcnR5XHJcbiAgICAgICAgLy8gaGludCBvZiBleHRlbnNpb24gdG9iZXJtb3J5LmVzNi1zdHJpbmctaHRtbFxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5UGFnZSA9ICQoLypodG1sKi9gXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMS42cmVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2Puiwg+aVtOWIneWni+WxnuaApzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInRvdGFsXCIgc3R5bGU9XCJmb250LXNpemU6MXJlbTsgZm9udC13ZWlnaHQ6bm9ybWFsO1wiPuWPr+eUqOWxnuaAp+eCue+8mjA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cInByb3BlcnR5QWxsb2NhdGlvblwiIGNsYXNzPVwicHJvcGluaXRpYWxcIj48L3VsPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJzZWxlY3RsaXN0XCIgaWQ9XCJ0YWxlbnRTZWxlY3RlZFZpZXdcIj48L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWFyZWFcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyYW5kb21cIiBjbGFzcz1cIm1haW5idG5cIj7pmo/mnLrliIbphY08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzdGFydFwiIGNsYXNzPVwibWFpbmJ0blwiPuW8gOWni+aWsOS6uueUnzwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuICAgICAgICBwcm9wZXJ0eVBhZ2UubW91bnRlZCA9ICgpPT57XHJcbiAgICAgICAgICAgIHByb3BlcnR5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3RhbGVudFNlbGVjdGVkVmlldycpLmFwcGVuZChcclxuICAgICAgICAgICAgICAgIGA8bGk+5bey6YCJ5aSp6LWLPC9saT5gICtcclxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpXHJcbiAgICAgICAgICAgICAgICAubWFwKCh7bmFtZSxkZXNjcmlwdGlvbn0pPT5gPGxpIGNsYXNzPVwiZ3JhZGUwYlwiPiR7bmFtZX0oJHtkZXNjcmlwdGlvbn0pPC9saT5gKVxyXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0ge307XHJcbiAgICAgICAgY29uc3QgdG90YWwgPSAoKT0+e1xyXG4gICAgICAgICAgICBsZXQgdCA9IDA7XHJcbiAgICAgICAgICAgIGZvcihjb25zdCB0eXBlIGluIGdyb3VwcylcclxuICAgICAgICAgICAgICAgIHQgKz0gZ3JvdXBzW3R5cGVdLmdldCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZnJlc2hUb3RhbCA9ICgpPT57XHJcbiAgICAgICAgICAgIHByb3BlcnR5UGFnZS5maW5kKCcjdG90YWwnKS50ZXh0KGDlj6/nlKjlsZ7mgKfngrnvvJoke3RoaXMuI3RvdGFsTWF4IC0gdG90YWwoKX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZ2V0QnRuR3JvdXBzID0gKG5hbWUsIG1pbiwgbWF4KT0+e1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9ICQoYDxsaT4ke25hbWV9Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9saT5gKTtcclxuICAgICAgICAgICAgY29uc3QgYnRuU3ViID0gJChgPHNwYW4gY2xhc3M9XCJpY29uZm9udCBwcm9wYnRuXCI+JiN4ZTZhNTs8L3NwYW4+YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0Qm94ID0gJChgPGlucHV0IHZhbHVlPVwiMFwiIHR5cGU9XCJudW1iZXJcIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCBidG5BZGQgPSAkKGA8c3BhbiBjbGFzcz1cImljb25mb250IHByb3BidG5cIj4mI3hlNmE2Ozwvc3Bhbj5gKTtcclxuICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKGJ0blN1Yik7XHJcbiAgICAgICAgICAgIGdyb3VwLmFwcGVuZChpbnB1dEJveCk7XHJcbiAgICAgICAgICAgIGdyb3VwLmFwcGVuZChidG5BZGQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbGltaXQgPSB2PT57XHJcbiAgICAgICAgICAgICAgICB2ID0gTnVtYmVyKHYpfHwwO1xyXG4gICAgICAgICAgICAgICAgdiA9IE1hdGgucm91bmQodik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdiA8IG1pbiA/IG1pbiA6IChcclxuICAgICAgICAgICAgICAgICAgICB2ID4gbWF4ID8gbWF4IDogdlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGdldCA9ICgpPT5OdW1iZXIoaW5wdXRCb3gudmFsKCkpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXQgPSB2PT57XHJcbiAgICAgICAgICAgICAgICBpbnB1dEJveC52YWwobGltaXQodikpO1xyXG4gICAgICAgICAgICAgICAgZnJlc2hUb3RhbCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJ0bkFkZC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYodG90YWwoKSA+PSB0aGlzLiN0b3RhbE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn5rKh5pyJ5Y+v5YiG6YWN55qE54K55pWw5LqGJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0KGdldCgpKzEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYnRuU3ViLmNsaWNrKCgpPT5zZXQoZ2V0KCktMSkpO1xyXG4gICAgICAgICAgICBpbnB1dEJveC5vbignaW5wdXQnLCAoKT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRvdGFsKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gZ2V0KCk7XHJcbiAgICAgICAgICAgICAgICBpZih0ID4gdGhpcy4jdG90YWxNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWwgLT0gdCAtIHRoaXMuI3RvdGFsTWF4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsID0gbGltaXQodmFsKTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbCAhPSBpbnB1dEJveC52YWwoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZnJlc2hUb3RhbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHtncm91cCwgZ2V0LCBzZXR9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ3JvdXBzLkNIUiA9IGdldEJ0bkdyb3VwcyhcIuminOWAvFwiLCAwLCAxMCk7IC8vIOminOWAvCBjaGFybSBDSFJcclxuICAgICAgICBncm91cHMuSU5UID0gZ2V0QnRuR3JvdXBzKFwi5pm65YqbXCIsIDAsIDEwKTsgLy8g5pm65YqbIGludGVsbGlnZW5jZSBJTlRcclxuICAgICAgICBncm91cHMuU1RSID0gZ2V0QnRuR3JvdXBzKFwi5L2T6LSoXCIsIDAsIDEwKTsgLy8g5L2T6LSoIHN0cmVuZ3RoIFNUUlxyXG4gICAgICAgIGdyb3Vwcy5NTlkgPSBnZXRCdG5Hcm91cHMoXCLlrrblooNcIiwgMCwgMTApOyAvLyDlrrblooMgbW9uZXkgTU5ZXHJcblxyXG4gICAgICAgIGNvbnN0IHVsID0gcHJvcGVydHlQYWdlLmZpbmQoJyNwcm9wZXJ0eUFsbG9jYXRpb24nKTtcclxuXHJcbiAgICAgICAgZm9yKGNvbnN0IHR5cGUgaW4gZ3JvdXBzKSB7XHJcbiAgICAgICAgICAgIHVsLmFwcGVuZChncm91cHNbdHlwZV0uZ3JvdXApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvcGVydHlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjcmFuZG9tJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IHRoaXMuI3RvdGFsTWF4O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gWzEwLCAxMCwgMTAsIDEwXTtcclxuICAgICAgICAgICAgICAgIHdoaWxlKHQ+MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChNYXRoLm1pbih0LCAxMCkgLSAxKSkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCkgJSA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJbc2VsZWN0XSAtIHN1YiA8MCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltzZWxlY3RdIC09IHN1YjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdCAtPSBzdWI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3Vwcy5DSFIuc2V0KDEwIC0gYXJyWzBdKTtcclxuICAgICAgICAgICAgICAgIGdyb3Vwcy5JTlQuc2V0KDEwIC0gYXJyWzFdKTtcclxuICAgICAgICAgICAgICAgIGdyb3Vwcy5TVFIuc2V0KDEwIC0gYXJyWzJdKTtcclxuICAgICAgICAgICAgICAgIGdyb3Vwcy5NTlkuc2V0KDEwIC0gYXJyWzNdKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByb3BlcnR5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3N0YXJ0JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBpZih0b3RhbCgpIDwgdGhpcy4jdG90YWxNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoYOS9oOi/mOaciSR7dGhpcy4jdG90YWxNYXgtdG90YWwoKX3lsZ7mgKfngrnmsqHmnInliIbphY3lroxgKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvdGFsKCkgPiB0aGlzLiN0b3RhbE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGludChg5L2g5aSa5L2/55So5LqGJHt0b3RhbCgpIC0gdGhpcy4jdG90YWxNYXh95bGe5oCn54K5YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSB0aGlzLiNsaWZlLnJlc3RhcnQoe1xyXG4gICAgICAgICAgICAgICAgICAgIENIUjogZ3JvdXBzLkNIUi5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBJTlQ6IGdyb3Vwcy5JTlQuZ2V0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgU1RSOiBncm91cHMuU1RSLmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIE1OWTogZ3JvdXBzLk1OWS5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBTUFI6IDUsXHJcbiAgICAgICAgICAgICAgICAgICAgVExUOiBBcnJheS5mcm9tKHRoaXMuI3RhbGVudFNlbGVjdGVkKS5tYXAoKHtpZH0pPT5pZCksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoKCd0cmFqZWN0b3J5Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNwYWdlcy50cmFqZWN0b3J5LmJvcm4oY29udGVudHMpO1xyXG4gICAgICAgICAgICAgICAgLy8gJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihldmVudCl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYoZXZlbnQud2hpY2ggPT0gMzIgfHwgZXZlbnQud2hpY2ggPT0gMTMpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAkKCcjbGlmZVRyYWplY3RvcnknKS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUcmFqZWN0b3J5XHJcbiAgICAgICAgY29uc3QgdHJhamVjdG9yeVBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJsaWZlUHJvcGVydHlcIiBjbGFzcz1cImxpZmVQcm9wZXJ0eVwiPjwvdWw+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cImxpZmVUcmFqZWN0b3J5XCIgY2xhc3M9XCJsaWZlVHJhamVjdG9yeVwiPjwvdWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tYXJlYVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImF1dG9cIiBjbGFzcz1cIm1haW5idG5cIj7oh6rliqjmkq3mlL48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJhdXRvMnhcIiBjbGFzcz1cIm1haW5idG5cIj7oh6rliqjmkq3mlL4yeDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInN1bW1hcnlcIiBjbGFzcz1cIm1haW5idG5cIj7kurrnlJ/mgLvnu5M8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkb21Ub0ltYWdlXCIgY2xhc3M9XCJtYWluYnRuXCI+5Lq655Sf5Zue5pS+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9tVG9JbWFnZTJ3eFwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJcIiBpZD1cImVuZEltYWdlXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjbGlmZVRyYWplY3RvcnknKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuI2lzRW5kKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFqZWN0b3J5ID0gdGhpcy4jbGlmZS5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFnZSwgY29udGVudCwgaXNFbmQgfSA9IHRyYWplY3Rvcnk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaSA9ICQoYDxsaT48c3Bhbj4ke2FnZX3lsoHvvJo8L3NwYW4+PHNwYW4+JHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Lm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHt0eXBlLCBkZXNjcmlwdGlvbiwgZ3JhZGUsIG5hbWUsIHBvc3RFdmVudH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVExUJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGDlpKnotYvjgJAke25hbWV944CR5Y+R5Yqo77yaJHtkZXNjcmlwdGlvbn1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VWVCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbiArIChwb3N0RXZlbnQ/YDxicj4ke3Bvc3RFdmVudH1gOicnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICkuam9pbignPGJyPicpXHJcbiAgICAgICAgICAgICAgICB9PC9zcGFuPjwvbGk+YCk7XHJcbiAgICAgICAgICAgICAgICBsaS5hcHBlbmRUbygnI2xpZmVUcmFqZWN0b3J5Jyk7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2xpZmVUcmFqZWN0b3J5XCIpLnNjcm9sbFRvcCgkKFwiI2xpZmVUcmFqZWN0b3J5XCIpWzBdLnNjcm9sbEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBpZihpc0VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnVuYmluZChcImtleWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaXNFbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNzdW1tYXJ5Jykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNhdXRvJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNhdXRvMngnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJhamVjdG9yeVBhZ2UuZmluZCgnI2RvbVRvSW1hZ2UnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuI2xpZmUuZ2V0TGFzdFJlY29yZCgpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNsaWZlUHJvcGVydHlcIikuaHRtbChgXHJcbiAgICAgICAgICAgICAgICA8bGk+PHNwYW4+6aKc5YC8PC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuQ0hSfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxzcGFuPuaZuuWKmzwvc3Bhbj48c3Bhbj4ke3Byb3BlcnR5LklOVH08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48c3Bhbj7kvZPotKg8L3NwYW4+PHNwYW4+JHtwcm9wZXJ0eS5TVFJ9PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGk+PHNwYW4+5a625aKDPC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuTU5ZfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxzcGFuPuW/q+S5kDwvc3Bhbj48c3Bhbj4ke3Byb3BlcnR5LlNQUn08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyBodG1sMmNhbnZhc1xyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjZG9tVG9JbWFnZScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgJChcIiNsaWZlVHJhamVjdG9yeVwiKS5hZGRDbGFzcyhcImRlbGV0ZUZpeGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBkb210b2ltYWdlLnRvSnBlZyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlmZVRyYWplY3RvcnknKSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluay5kb3dubG9hZCA9ICfmiJHnmoTkurrnlJ/lm57mlL4uanBlZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGRhdGFVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNsaWZlVHJhamVjdG9yeVwiKS5yZW1vdmVDbGFzcyhcImRlbGV0ZUZpeGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDlvq7kv6HlhoXnva7mtY/op4jlmajvvIzmmL7npLrlm77niYfvvIzpnIDopoHnlKjmiLfljZXni6zkv53lrZhcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodWEubWF0Y2goL01pY3JvTWVzc2VuZ2VyL2kpPT1cIm1pY3JvbWVzc2VuZ2VyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNlbmRJbWFnZScpLmF0dHIoJ3NyYycsIGRhdGFVcmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuaGlkZSgpO1xyXG5cclxuICAgICAgICB0cmFqZWN0b3J5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3N1bW1hcnknKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4jYXV0b1RyYWplY3RvcnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jYXV0b1RyYWplY3RvcnkgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2goJ3N1bW1hcnknKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGF1dG8gPSB0aWNrPT57XHJcbiAgICAgICAgICAgIGlmKHRoaXMuI2F1dG9UcmFqZWN0b3J5KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuI2F1dG9UcmFqZWN0b3J5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2F1dG9UcmFqZWN0b3J5ID0gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzRW5kKVxyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcjbGlmZVRyYWplY3RvcnknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2F1dG9UcmFqZWN0b3J5ID0gc2V0SW50ZXJ2YWwoKCk9PntcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmlzRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4jYXV0b1RyYWplY3RvcnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNhdXRvVHJhamVjdG9yeSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcjbGlmZVRyYWplY3RvcnknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgdGljayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cmFqZWN0b3J5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI2F1dG8nKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PmF1dG8oMTAwMCkpO1xyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjYXV0bzJ4JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT5hdXRvKDUwMCkpO1xyXG5cclxuICAgICAgICAvLyBTdW1tYXJ5XHJcbiAgICAgICAgY29uc3Qgc3VtbWFyeVBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZFwiPuS6uueUn+aAu+e7kzwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJqdWRnZVwiIGNsYXNzPVwianVkZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMlwiPjxzcGFuPuminOWAvO+8mjwvc3Bhbj48c3Bhbj4557qnIOe+juiLpeWkqeS7mTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUwXCI+PHNwYW4+5pm65Yqb77yaPC9zcGFuPjxzcGFuPjTnuqcg5pm65Yqb5LiA6IisPC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7kvZPotKjvvJo8L3NwYW4+PHNwYW4+Mee6pyDmnoHluqbomZrlvLE8L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMFwiPjxzcGFuPuWutuWig++8mjwvc3Bhbj48c3Bhbj4257qnIOWwj+W6t+S5i+Wutjwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUwXCI+PHNwYW4+5Lqr5bm077yaPC9zcGFuPjxzcGFuPjPlsoEg5pep5aStPC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7lv6vkuZDvvJo8L3NwYW4+PHNwYW4+PC9zcGFuPjPnuqcg5LiN5aSq5bm456aP55qE5Lq655SfPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRcIiBzdHlsZT1cImhlaWdodDphdXRvO1wiPuWkqei1i++8jOS9oOWPr+S7pemAieS4gOS4qu+8jOS4i+i+iOWtkOi/mOiDveaKveWIsDwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJ0YWxlbnRzXCIgY2xhc3M9XCJzZWxlY3RsaXN0XCIgc3R5bGU9XCJmbGV4OiAwIDEgYXV0bztcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMmJcIj7pu5HluZXvvIjpnaLor5XkuIDlrprmiJDlip/vvIk8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYWdhaW5cIiBjbGFzcz1cIm1haW5idG5cIj48c3BhbiBjbGFzcz1cImljb25mb250XCI+JiN4ZTZhNzs8L3NwYW4+5YaN5qyh6YeN5byAPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHN1bW1hcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjYWdhaW4nKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZXMgKys7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNsaWZlLnRhbGVudEV4dGVuZCh0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0YWxlbnRTZWxlY3RlZC5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jdG90YWxNYXggPSAyMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2lzRW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgnaW5kZXgnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuI3BhZ2VzID0ge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiBsb2FkaW5nUGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRQYWdlID0gJ2xvYWRpbmcnO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaW5kZXg6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IGluZGV4UGFnZSxcclxuICAgICAgICAgICAgICAgIGJ0bkFjaGlldmVtZW50OiBpbmRleFBhZ2UuZmluZCgnI2FjaGlldmVtZW50JyksXHJcbiAgICAgICAgICAgICAgICBidG5SZXN0YXJ0OiBpbmRleFBhZ2UuZmluZCgnI3Jlc3RhcnQnKSxcclxuICAgICAgICAgICAgICAgIGhpbnQ6IGluZGV4UGFnZS5maW5kKCcuaGludCcpLFxyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwYWdlcy5pbmRleC5idG5SZXN0YXJ0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAnaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcuaGludCcpLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXMgPSB0aGlzLnRpbWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjaGlldmVtZW50ID0gaW5kZXhQYWdlLmZpbmQoJyNhY2hpZXZlbWVudCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2NvcmQgPSBpbmRleFBhZ2UuZmluZCgnI2Rpc2NvcmQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjaWFsdGhhbmtzID0gaW5kZXhQYWdlLmZpbmQoJyNzcGVjaWFsdGhhbmtzJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRpbWVzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvcmQuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsdGhhbmtzLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2NvcmQuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNwZWNpYWx0aGFua3MuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3BlY2lhbHRoYW5rczoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogc3BlY2lhbFRoYW5rc1BhZ2UsXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRoYW5rc1BhZ2UuZmluZCgnI3NwdGh4ID4gdWwuZzEnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRoYW5rc1BhZ2UuZmluZCgnI3NwdGh4ID4gdWwuZzInKSxcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKGc9PmcuZW1wdHkoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3BlY2lhbHRoYW5rc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoKT0+MC41LU1hdGgucmFuZG9tKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKCh7Z3JvdXAsIG5hbWUsIGNvbW1lbnQsIGNvbG9yfSk9Pmdyb3Vwc1stLWdyb3VwXS5hcHBlbmQoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiICR7Y29sb3I/KCdzdHlsZT1cImNvbG9yOicrY29sb3IrJ1wiJyk6Jyd9PiR7bmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21tZW50XCI+JHtjb21tZW50fHwnJ308L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWNoaWV2ZW1lbnQ6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IGFjaGlldmVtZW50UGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBhY2hpZXZlbWVudFBhZ2UuZmluZChcInVsI3RvdGFsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjaGlldmVtZW50cyA9IGFjaGlldmVtZW50UGFnZS5maW5kKFwidWwjYWNoaWV2ZW1lbnRzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLmVtcHR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZW1lbnRzLmVtcHR5KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdFJhdGUgPSAodHlwZSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF0ZSA9IGdldFJhdGUodHlwZSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3IgPSBPYmplY3Qua2V5cyhyYXRlKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBhcnNlSW50KGNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjb2xvciA9ICfnmb3oibInOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogY29sb3IgPSAn6JOd6ImyJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNvbG9yID0gJ+e0q+iJsic7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBjb2xvciA9ICfmqZnoibInOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0gT2JqZWN0LnZhbHVlcyhyYXRlKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBhcnNlSW50KHIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHIgPSAn5LiN5Y+YJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHIgPSAn57+75YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHIgPSAn5LiJ5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHIgPSAn5Zub5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHIgPSAn5LqU5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHIgPSAn5YWt5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYOaKveWIsCR7Y29sb3J95qaC546HJHtyfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRpbWVzLCBhY2hpZXZlbWVudCwgdGFsZW50UmF0ZSwgZXZlbnRSYXRlIH0gPSB0aGlzLiNsaWZlLmdldFRvdGFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwuYXBwZW5kKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYWNodmcke2dldEdyYWRlKCd0aW1lcycsIHRpbWVzKX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7lt7Lph43lvIAke3RpbWVzfeasoTwvc3Bhbj4ke2Zvcm1hdFJhdGUoJ3RpbWVzJywgdGltZXMpfTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFjaHZnJHtnZXRHcmFkZSgnYWNoaWV2ZW1lbnQnLCBhY2hpZXZlbWVudCl9XCI+PHNwYW4gY2xhc3M9XCJhY2hpZXZlbWVudHRpdGxlXCI+5oiQ5bCx6L6+5oiQJHthY2hpZXZlbWVudH3kuKo8L3NwYW4+JHtmb3JtYXRSYXRlKCdhY2hpZXZlbWVudCcsIGFjaGlldmVtZW50KX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2h2ZyR7Z2V0R3JhZGUoJ2V2ZW50UmF0ZScsIGV2ZW50UmF0ZSl9XCI+PHNwYW4gY2xhc3M9XCJhY2hpZXZlbWVudHRpdGxlXCI+5LqL5Lu25pS26ZuG546HPC9zcGFuPiR7TWF0aC5mbG9vcihldmVudFJhdGUgKiAxMDApfSU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2h2ZyR7Z2V0R3JhZGUoJ3RhbGVudFJhdGUnLCB0YWxlbnRSYXRlKX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7lpKnotYvmlLbpm4bnjoc8L3NwYW4+JHtNYXRoLmZsb29yKHRhbGVudFJhdGUgKiAxMDApfSU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIGApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2hpZXZlbWVudHNEYXRhID0gdGhpcy4jbGlmZS5nZXRBY2hpZXZlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudHNEYXRhLmZvckVhY2goKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZGVzY3JpcHRpb24sIGhpZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRlLCBpc0FjaGlldmVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaGlkZSAmJiAhaXNBY2hpZXZlZCkgbmFtZSA9IGRlc2NyaXB0aW9uID0gJz8/Pyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjaGlldmVtZW50cy5hcHBlbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPGxpIGNsYXNzPVwiYWNodmcke2dyYWRlfSAke2lzQWNoaWV2ZWQ/Jyc6J21hc2snfVwiPjxzcGFuIGNsYXNzPVwiYWNoaWV2ZW1lbnR0aXRsZVwiPiR7bmFtZX08L3NwYW4+JHtkZXNjcmlwdGlvbn08L2xpPmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGFsZW50OiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiB0YWxlbnRQYWdlLFxyXG4gICAgICAgICAgICAgICAgdGFsZW50TGlzdDogdGFsZW50UGFnZS5maW5kKCcjdGFsZW50cycpLFxyXG4gICAgICAgICAgICAgICAgYnRuUmFuZG9tOiB0YWxlbnRQYWdlLmZpbmQoJyNyYW5kb20nKSxcclxuICAgICAgICAgICAgICAgIGJ0bk5leHQ6IHRhbGVudFBhZ2UuZmluZCgnI25leHQnKSxcclxuICAgICAgICAgICAgICAgIHByZXNzRW50ZXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFsZW50TGlzdCA9IHRoaXMuI3BhZ2VzLnRhbGVudC50YWxlbnRMaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0blJhbmRvbSA9IHRoaXMuI3BhZ2VzLnRhbGVudC5idG5SYW5kb207XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRuTmV4dCA9IHRoaXMuI3BhZ2VzLnRhbGVudC5idG5OZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWxlbnRMaXN0LmNoaWxkcmVuKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0bk5leHQuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidG5SYW5kb20uY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAndGFsZW50JztcclxuICAgICAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJ3VsLnNlbGVjdGxpc3QnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI3JhbmRvbScpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiN0b3RhbE1heCA9IDIwO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHJvcGVydHk6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHByb3BlcnR5UGFnZSxcclxuICAgICAgICAgICAgICAgIGJ0blN0YXJ0OiBwcm9wZXJ0eVBhZ2UuZmluZCgnI3N0YXJ0JyksXHJcbiAgICAgICAgICAgICAgICBwcmVzc0VudGVyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLnByb3BlcnR5LmJ0blN0YXJ0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAncHJvcGVydHknO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyZXNoVG90YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyN0YWxlbnRTZWxlY3RlZFZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYWplY3Rvcnk6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHRyYWplY3RvcnlQYWdlLFxyXG4gICAgICAgICAgICAgICAgbGlmZVRyYWplY3Rvcnk6IHRyYWplY3RvcnlQYWdlLmZpbmQoJyNsaWZlVHJhamVjdG9yeScpLFxyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwYWdlcy50cmFqZWN0b3J5LmxpZmVUcmFqZWN0b3J5LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAndHJhamVjdG9yeSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2xpZmVUcmFqZWN0b3J5JykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjc3VtbWFyeScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjYXV0bycpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjYXV0bzJ4Jykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2lzRW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYm9ybjogY29udGVudHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsaWZlVHJhamVjdG9yeScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGA8bGk+PHNwYW4+5Yid5aeL77yaPC9zcGFuPjxzcGFuPiR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe3NvdXJjZSwgdGFyZ2V0fSkgPT4gYOWkqei1i+OAkCR7c291cmNlLm5hbWV944CR5Y+R5Yqo77ya5pu/5o2i5Li65aSp6LWL44CQJHt0YXJnZXQubmFtZX3jgJFgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5qb2luKCc8YnI+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L3NwYW4+PC9saT5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2xpZmVUcmFqZWN0b3J5JykudHJpZ2dlcihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdW1tYXJ5OiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiBzdW1tYXJ5UGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRQYWdlID0gJ3N1bW1hcnknO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp1ZGdlID0gc3VtbWFyeVBhZ2UuZmluZCgnI2p1ZGdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFsZW50cyA9IHN1bW1hcnlQYWdlLmZpbmQoJyN0YWxlbnRzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAganVkZ2UuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICB0YWxlbnRzLmVtcHR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEV4dGVuZFRhbGVudCA9IHRoaXMuI2xpZmUuZ2V0TGFzdEV4dGVuZFRhbGVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIEFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKHRoaXMuI3RhbGVudFNlbGVjdGVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6YSwgZ3JhZGU6YWd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lkOmIsIGdyYWRlOmJnfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYSA9PSBsYXN0RXh0ZW5kVGFsZW50KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiID09IGxhc3RFeHRlbmRUYWxlbnQpIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJnIC0gYWc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKCh0YWxlbnQsIGkpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGNyZWF0ZVRhbGVudCh0YWxlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFsZW50cy5hcHBlbmQobGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaS5oYXNDbGFzcygnc2VsZWN0ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZih0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn5Y+q6IO957un5om/5LiA5Liq5aSp6LWLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IHRhbGVudC5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaSkgbGkuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy4jbGlmZS5nZXRTdW1tYXJ5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRpc2NyaXB0aW9uLCB0eXBlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN1bW1hcnlEYXRhW3R5cGVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGp1ZGdlLCBncmFkZSB9ID0gc3VtbWFyeSh0eXBlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGxpIGNsYXNzPVwiZ3JhZGUke2dyYWRlfVwiPjxzcGFuPiR7ZGlzY3JpcHRpb25977yaPC9zcGFuPjxzcGFuPiR7dmFsdWV9ICR7anVkZ2V9PC9zcGFuPjwvbGk+YDtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqdWRnZS5hcHBlbmQoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn6aKc5YC8JywgJ0NIUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5pm65YqbJywgJ0lOVCcpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5L2T6LSoJywgJ1NUUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5a625aKDJywgJ01OWScpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5b+r5LmQJywgJ1NQUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5Lqr5bm0JywgJ0FHRScpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5oC76K+EJywgJ1NVTScpfVxyXG4gICAgICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCRvbignYWNoaWV2ZW1lbnQnLCAoe25hbWV9KT0+e1xyXG4gICAgICAgICAgICB0aGlzLmhpbnQoYOino+mUgeaIkOWwseOAkCR7bmFtZX3jgJFgLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoKHBhZ2UpIHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy4jcGFnZXNbcGFnZV07XHJcbiAgICAgICAgaWYoIXApIHJldHVybjtcclxuICAgICAgICAkKCcjbWFpbicpLmRldGFjaCgpO1xyXG4gICAgICAgIHAuY2xlYXIoKTtcclxuICAgICAgICBwLnBhZ2UuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgICAgICBpZih0eXBlb2YgcC5wYWdlLm1vdW50ZWQgPT09ICdmdW5jdGlvbicpe1xyXG4gICAgICAgICAgICBwLnBhZ2UubW91bnRlZCgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhpbnQobWVzc2FnZSwgdHlwZT0naW5mbycpIHtcclxuICAgICAgICBpZih0aGlzLiNoaW50VGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jaGludFRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLiNoaW50VGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZGVCYW5uZXJzKCk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYmFubmVyID0gJChgLmJhbm5lci4ke3R5cGV9YCk7XHJcbiAgICAgICAgICAgIGJhbm5lci5hZGRDbGFzcygndmlzaWJsZScpO1xyXG4gICAgICAgICAgICBiYW5uZXIuZmluZCgnLmJhbm5lci1tZXNzYWdlJykudGV4dChtZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYodHlwZSAhPSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNoaW50VGltZW91dCA9IHNldFRpbWVvdXQoaGlkZUJhbm5lcnMsIDMwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGhlbWUodGhlbWUpIHtcclxuICAgICAgICBjb25zdCB0aGVtZUxpbmsgPSAkKGRvY3VtZW50KS5maW5kKCcjdGhlbWVMaW5rJyk7XHJcblxyXG4gICAgICAgIHN3aXRjaCh0aGVtZSl7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhcmsnOlxyXG4gICAgICAgICAgICBjYXNlICdsaWdodCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2hhbGxvd2Vlbic6XHJcbiAgICAgICAgICAgICAgICB0aGVtZUxpbmsuYXR0cignaHJlZicsIGAke3RoZW1lfS5jc3NgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhlbWVMaW5rLmF0dHIoJ2hyZWYnLCAnZGFyay5jc3MnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpbWVzKCkge3JldHVybiB0aGlzLiNsaWZlPy50aW1lcyB8fCAwO31cclxuICAgIHNldCB0aW1lcyh2KSB7IGlmKHRoaXMuI2xpZmUpIHRoaXMuI2xpZmUudGltZXMgPSB2IH07XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBcHA7XHJcbiIsImltcG9ydCBBcHAgZnJvbSAnLi4vc3JjL2FwcC5qcyc7XHJcblxyXG5nbG9iYWxUaGlzLiQkZXZlbnRNYXAgPSBuZXcgTWFwKCk7XHJcbmdsb2JhbFRoaXMuJCRldmVudCA9ICh0YWcsIGRhdGEpID0+IHtcclxuICAgIGNvbnN0IGxpc3RlbmVyID0gJCRldmVudE1hcC5nZXQodGFnKTtcclxuICAgIGlmKGxpc3RlbmVyKSBsaXN0ZW5lci5mb3JFYWNoKGZuPT5mbihkYXRhKSk7XHJcbn1cclxuZ2xvYmFsVGhpcy4kJG9uID0gKHRhZywgZm4pID0+IHtcclxuICAgIGxldCBsaXN0ZW5lciA9ICQkZXZlbnRNYXAuZ2V0KHRhZyk7XHJcbiAgICBpZighbGlzdGVuZXIpIHtcclxuICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZXQoKTtcclxuICAgICAgICAkJGV2ZW50TWFwLnNldCh0YWcsIGxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIGxpc3RlbmVyLmFkZChmbik7XHJcbn1cclxuZ2xvYmFsVGhpcy4kJG9mZiA9ICh0YWcsIGZuKSA9PiB7XHJcbiAgICBjb25zdCBsaXN0ZW5lciA9ICQkZXZlbnRNYXAuZ2V0KHRhZyk7XHJcbiAgICBpZihsaXN0ZW5lcikgbGlzdGVuZXIuZGVsZXRlKGZuKTtcclxufVxyXG5cclxuZ2xvYmFsVGhpcy5qc29uID0gYXN5bmMgZmlsZU5hbWUgPT4gYXdhaXQgKGF3YWl0IGZldGNoKGAuLi9kYXRhLyR7ZmlsZU5hbWV9Lmpzb25gKSkuanNvbigpO1xyXG5cclxuLy8gUHNzc3QsIEkndmUgY3JlYXRlZCBhIGdpdGh1YiBwYWNrYWdlIC0gaHR0cHM6Ly9naXRodWIuY29tL2Jyb29rZXNiOTEvZGlzbWlzc2libGVcclxuZ2xvYmFsVGhpcy5oaWRlQmFubmVycyA9IChlKSA9PiB7XHJcbiAgICBkb2N1bWVudFxyXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhbm5lci52aXNpYmxlXCIpXHJcbiAgICAgICAgLmZvckVhY2goKGIpID0+IGIuY2xhc3NMaXN0LnJlbW92ZShcInZpc2libGVcIikpO1xyXG59O1xyXG5cclxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xyXG5hcHAuaW5pdGlhbCgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3785\n')}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var __webpack_exports__=__webpack_require__(3785)})();
\ No newline at end of file