From db57f94c2739e3832c1a815d61ab4de29e467e44 Mon Sep 17 00:00:00 2001 From: Jean Ouina Date: Sat, 23 May 2020 05:03:03 +0200 Subject: [PATCH] Added themes and plugins by default. --- BetterDiscordApp/js/main.js | 6 +-- BetterDiscordApp/src/modules/core.js | 7 +++ BetterDiscordApp/src/modules/utils.js | 41 +++++++++++++++- BetterDiscordApp/src/ui/presenceSettings.jsx | 11 +++++ .../assets/DiscordDark.theme.css | 12 +++++ .../core/app/BetterDiscord/index.js | 47 +++++++++++++++++-- 6 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 modules/discord_desktop_core/core/app/BetterDiscord/assets/DiscordDark.theme.css diff --git a/BetterDiscordApp/js/main.js b/BetterDiscordApp/js/main.js index c2c1189..5426ff0 100644 --- a/BetterDiscordApp/js/main.js +++ b/BetterDiscordApp/js/main.js @@ -227,7 +227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _0gl /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/modules/utils.js\");\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ \"./src/modules/settingsPanel.js\");\n/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ \"./src/modules/pluginModule.js\");\n/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ \"./src/modules/themeModule.js\");\n/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ \"./src/modules/dataStore.js\");\n/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ \"./src/modules/webpackModules.js\");\n/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ \"./src/modules/domtools.js\");\n/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ \"./src/ui/bdLogo.js\");\n/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ \"./src/ui/tooltipWrap.js\");\n/* harmony import */ var _ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../ui/lightcordLogo */ \"./src/ui/lightcordLogo.js\");\n/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ \"./src/modules/pluginCertifier.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));\n // this.init();\n}\n\nCore.prototype.setConfig = function (config) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"], config);\n};\n\nCore.prototype.init = async function () {\n if (!Array.prototype.flat) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BetterDiscord v\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] + \" does not support this old version (\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"currentDiscordVersion\"] + \") of Discord. Please update your Discord installation before proceeding.\");\n return;\n }\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__[\"minSupportedVersion\"]) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BetterDiscord v\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version + \" (your version)\" + \" is not supported by the latest js (\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] + \").

Please download the latest version from GitHub\");\n return;\n }\n\n if (window.ED) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.\");\n return;\n }\n\n if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes(\"Patched\")) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BandagedBD does not work with Powercord. Please uninstall one of them.\");\n return;\n }\n\n const latestLocalVersion = _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].updater ? _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].updater.LatestVersion : _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].latestVersion;\n\n if (latestLocalVersion > _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showConfirmationModal(\"Update Available\", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, \"You can either update and restart now, or later.\"], {\n confirmText: \"Update Now\",\n cancelText: \"Maybe Later\",\n onConfirm: async () => {\n const onUpdateFailed = () => {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Could Not Update\", `Unable to update automatically, please download the installer and reinstall normally.

Download Installer`);\n };\n\n try {\n const didUpdate = await this.updateInjector();\n if (!didUpdate) return onUpdateFailed();\n\n const app = __webpack_require__(/*! electron */ \"electron\").remote.app;\n\n app.relaunch();\n app.exit();\n } catch (err) {\n onUpdateFailed();\n }\n }\n });\n }\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Initializing Settings\");\n this.initSettings();\n await this.checkForGuilds();\n _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].initialize();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Updating Settings\");\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].initializeSettings();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Loading Plugins\");\n _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"].loadPlugins();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Loading Themes\");\n _themeModule__WEBPACK_IMPORTED_MODULE_5__[\"default\"].loadThemes();\n _domtools__WEBPACK_IMPORTED_MODULE_8__[\"default\"].addStyle(\"customcss\", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBDData(\"bdcustomcss\")));\n window.addEventListener(\"beforeunload\", function () {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][\"bda-dc-0\"]) document.querySelector(\".btn.btn-disconnect\").click();\n });\n new _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__[\"default\"]().start();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Removing Loading Icon\");\n if (document.getElementsByClassName(\"bd-loaderv2\").length) document.getElementsByClassName(\"bd-loaderv2\")[0].remove();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Initializing Main Observer\");\n this.initObserver(); // Show loading errors\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][\"fork-ps-1\"]) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Collecting Startup Errors\");\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showContentErrors({\n plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdpluginErrors\"],\n themes: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdthemeErrors\"]\n });\n }\n\n const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBDData(\"version\");\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] > previousVersion) {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdChangelog\"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdChangelog\"]);\n _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setBDData(\"version\", _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]);\n }\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchSocial.bind(this), \"BD Social Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildPills.bind(this), \"BD Guild Pills Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildListItems.bind(this), \"BD Guild List Items Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildSeparator.bind(this), \"BD Guild Separator Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchMessageHeader.bind(this), \"BD Badge Chat Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchMemberList.bind(this), \"BD Badge Member List Patch\")();\n};\n\nCore.prototype.checkForGuilds = function () {\n let timesChecked = 0;\n return new Promise(resolve => {\n const checkForGuilds = function () {\n const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.wrapper.split(\" \")[0];\n if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;\n const guild = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.listItem.split(\" \")[0];\n const blob = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.blobContainer.split(\" \")[0];\n if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].deferLoaded = true);\n setTimeout(checkForGuilds, 100);\n };\n\n if (document.readyState != \"loading\") setTimeout(checkForGuilds, 100);\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(checkForGuilds, 100);\n });\n });\n};\n\nCore.prototype.injectExternals = async function () {\n await _domtools__WEBPACK_IMPORTED_MODULE_8__[\"default\"].addScript(\"ace-script\", \"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js\");\n if (window.require.original) window.require = window.require.original;\n};\n\nCore.prototype.initSettings = function () {\n _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].initialize();\n\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"settings\") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"rpc\")) {\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"settings\")) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"], _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"]);\n }\n\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"rpc\")) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsRPC\"], _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultRPC\"]);\n }\n\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].saveSettings();\n } else {\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].loadSettings();\n\n for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"]) {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][setting] == undefined) {\n _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"][setting];\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].saveSettings();\n }\n }\n }\n};\n\nCore.prototype.initObserver = function () {\n const mainObserver = new MutationObserver(mutations => {\n for (let i = 0, mlen = mutations.length; i < mlen; i++) {\n const mutation = mutations[i];\n if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"] !== \"undefined\") _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"].rawObserver(mutation); // if there was nothing added, skip\n\n if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue;\n const node = mutation.addedNodes[0];\n let [classNameLayer, classNameSocialLinks] = [BDModules.get(e => e.layer && typeof e.layer === \"string\" && e.animating)[0].layer, BDModules.get(e => e.socialLinks && typeof e.socialLinks === \"string\")[0].socialLinks];\n\n if (node.classList.contains(classNameLayer)) {\n if (node.getElementsByClassName(\"guild-settings-base-section\").length) node.setAttribute(\"layer-id\", \"server-settings\");\n\n if (node.getElementsByClassName(classNameSocialLinks).length) {\n node.setAttribute(\"layer-id\", \"user-settings\");\n node.setAttribute(\"id\", \"user-settings\");\n if (!document.getElementById(\"bd-settings-sidebar\")) _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].renderSidebar();\n }\n }\n\n if (node.parentElement == document.body && node.querySelector(\"#ace_settingsmenu\")) node.id = \"ace_settingsmenu_container\"; // Emoji Picker\n //node.getElementsByClassName(\"emojiPicker-3m1S-j\").length && !node.querySelector(\".emojiPicker-3m1S-j\").parentElement.classList.contains(\"animatorLeft-1EQxU0\")\n //if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector(\".\"+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node);\n }\n });\n mainObserver.observe(document, {\n childList: true,\n subtree: true\n });\n};\n\nCore.prototype.showChangelogModal = function (options = {}) {\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showChangelogModal(options);\n};\n\nCore.prototype.alert = function (title, content) {\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(title, content);\n};\n\nCore.prototype.patchSocial = function () {\n if (this.socialPatch) return;\n const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"TabBar\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!TabBar) return;\n this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(TabBar.prototype, \"render\", {\n after: data => {\n const children = data.returnValue.props.children;\n if (!children || !children.length || children.length < 3) return;\n if (children[children.length - 3].type.displayName !== \"Separator\") return;\n if (!children[children.length - 2].type.toString().includes(\"socialLinks\")) return;\n\n if (Anchor) {\n let socialModule1 = BDModules.get(e => e.socialLinks)[0];\n const original = children[children.length - 2].type;\n\n const newOne = function () {\n const returnVal = original(...arguments);\n returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-social-link \" + socialModule1.link,\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"17px\",\n className: \"bd-social-logo\"\n }))));\n returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-social-link \" + socialModule1.link,\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-social-logo\"\n }))));\n return returnVal;\n };\n\n children[children.length - 2].type = newOne;\n }\n\n let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash];\n const injector = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"div\", {\n className: `${classNameColorMuted} ${sizes.size12}`\n }, `Injector ${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version}`);\n const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].branch})`;\n const additional = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"div\", {\n className: `${classNameColorMuted} ${sizes.size12}`\n }, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"span\", {\n className: classNameVersionHash + \" da-versionHash\"\n }, versionHash));\n const originalVersions = children[children.length - 1].type;\n\n children[children.length - 1].type = function () {\n const returnVal = originalVersions(...arguments);\n returnVal.props.children.splice(returnVal.props.children.length - 1, 0, injector);\n returnVal.props.children.splice(1, 0, additional);\n return returnVal;\n };\n }\n });\n};\n\nconst getGuildClasses = function () {\n const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"wrapper\", \"unreadMentionsBar\");\n const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"guildsError\", \"selected\");\n const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"blobContainer\");\n return Object.assign({}, guildsWrapper, guilds, pill);\n};\n\nCore.prototype.patchGuildListItems = function () {\n if (this.guildListItemsPatch) return;\n const GuildClasses = getGuildClasses();\n const listItemClass = GuildClasses.listItem.split(\" \")[0];\n const blobClass = GuildClasses.blobContainer.split(\" \")[0];\n const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);\n const GuildComponent = reactInstance.return.type;\n if (!GuildComponent) return;\n this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(GuildComponent.prototype, \"render\", {\n after: data => {\n if (data.returnValue && data.thisObject) {\n const returnValue = data.returnValue;\n const guildData = data.thisObject.props;\n returnValue.props.className += \" bd-guild\";\n if (guildData.unread) returnValue.props.className += \" bd-unread\";\n if (guildData.selected) returnValue.props.className += \" bd-selected\";\n if (guildData.audio) returnValue.props.className += \" bd-audio\";\n if (guildData.video) returnValue.props.className += \" bd-video\";\n if (guildData.badge) returnValue.props.className += \" bd-badge\";\n if (guildData.animatable) returnValue.props.className += \" bd-animatable\";\n return returnValue;\n }\n }\n });\n};\n\nCore.prototype.patchGuildPills = function () {\n if (this.guildPillPatch) return;\n const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes(\"translate3d\"));\n if (!guildPill) return;\n this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(guildPill, \"default\", {\n after: data => {\n const props = data.methodArguments[0];\n if (props.unread) data.returnValue.props.className += \" bd-unread\";\n if (props.selected) data.returnValue.props.className += \" bd-selected\";\n if (props.hovered) data.returnValue.props.className += \" bd-hovered\";\n return data.returnValue;\n }\n });\n};\n\nCore.prototype.patchGuildSeparator = function () {\n if (this.guildSeparatorPatch) return;\n const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByDisplayName(\"Guilds\");\n const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"renderListItem\");\n if (!guildComponents || !Guilds) return;\n\n const GuildSeparator = function () {\n const returnValue = guildComponents.Separator(...arguments);\n returnValue.props.className += \" bd-guild-separator\";\n return returnValue;\n };\n\n this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(Guilds.prototype, \"render\", {\n after: data => {\n data.returnValue.props.children[1].props.children[3].type = GuildSeparator;\n }\n });\n};\n\nCore.prototype.patchMessageHeader = function () {\n if (this.messageHeaderPatch) return;\n const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"MessageTimestamp\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!Anchor || !MessageHeader || !MessageHeader.default) return;\n this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(MessageHeader, \"default\", {\n after: data => {\n const author = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.methodArguments[0], \"message.author\"); // const header = Utils.getNestedProp(data.returnValue, \"props.children.1.props\");\n\n const children = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.returnValue, \"props.children.1.props.children.1.props.children\");\n if (!children || !author || !author.id) return; // if (header && header.className) header.className += \" \"\n\n if (!Array.isArray(children)) return;\n\n if (author.id === \"249746236008169473\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-chat-badge\",\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-logo\"\n }))));\n } else if (author.id === \"696481194443014174\" || author.id === \"696003456611385396\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-chat-badge\",\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"32px\",\n className: \"bd-logo\"\n }))));\n }\n }\n });\n};\n\nCore.prototype.patchMemberList = function () {\n if (this.memberListPatch) return;\n const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByDisplayName(\"MemberListItem\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;\n this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(MemberListItem.prototype, \"renderDecorators\", {\n after: data => {\n const user = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.thisObject, \"props.user\");\n const children = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.returnValue, \"props.children\");\n if (!children || !user || !user.id) return; // if (header && header.className) header.className += \" \"\n\n if (!Array.isArray(children)) return;\n\n if (user.id === \"249746236008169473\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-member-badge\",\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-logo\"\n }))));\n } else if (user.id === \"696481194443014174\" || user.id === \"696003456611385396\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-member-badge\",\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"32px\",\n className: \"bd-logo\"\n }))));\n }\n }\n });\n};\n\nCore.prototype.updateInjector = async function () {\n const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].injectionPath;\n if (!injectionPath) return false;\n\n const fs = __webpack_require__(/*! fs */ \"fs\");\n\n const path = __webpack_require__(/*! path */ \"path\");\n\n const rmrf = __webpack_require__(/*! rimraf */ \"rimraf\");\n\n const yauzl = __webpack_require__(/*! yauzl */ \"yauzl\");\n\n const mkdirp = __webpack_require__(/*! mkdirp */ \"mkdirp\");\n\n const request =\n /*require(\"request\");*/\n null;\n const parentPath = path.resolve(injectionPath, \"..\");\n const folderName = path.basename(injectionPath);\n const zipLink = \"https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip\";\n const savedZip = path.resolve(parentPath, \"injector.zip\");\n const extractedFolder = path.resolve(parentPath, \"BetterDiscordApp-injector\"); // Download the injector zip file\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Downloading \" + zipLink);\n let success = await new Promise(resolve => {\n request.get({\n url: zipLink,\n encoding: null\n }, async (error, response, body) => {\n if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy\n\n const alreadyExists = await new Promise(res => fs.exists(savedZip, res));\n if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Writing \" + savedZip);\n fs.writeFile(savedZip, body, err => resolve(!err));\n });\n });\n if (!success) return success; // Check and delete rename extraction\n\n const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));\n if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file\n\n const zipfile = await new Promise(r => yauzl.open(savedZip, {\n lazyEntries: true\n }, (err, zip) => r(zip)));\n zipfile.on(\"entry\", function (entry) {\n // Skip directories, they are handled with mkdirp\n if (entry.fileName.endsWith(\"/\")) return zipfile.readEntry();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Extracting \" + entry.fileName); // Make any needed parent directories\n\n const fullPath = path.resolve(parentPath, entry.fileName);\n mkdirp.sync(path.dirname(fullPath));\n zipfile.openReadStream(entry, function (err, readStream) {\n if (err) return success = false;\n readStream.on(\"end\", function () {\n zipfile.readEntry();\n }); // Go to next file after this\n\n readStream.pipe(fs.createWriteStream(fullPath));\n });\n });\n zipfile.readEntry(); // Start reading\n // Wait for the final file to finish\n\n await new Promise(resolve => zipfile.once(\"end\", resolve)); // Save a backup in case something goes wrong during final step\n\n const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);\n await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);\n success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));\n\n if (!success) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].err(\"InjectorUpdate\", \"Failed to rename the final directory\");\n return success;\n } // If rename had issues, delete what we tried to rename and restore backup\n\n\n if (!success) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].err(\"InjectorUpdate\", \"Something went wrong... restoring backups.\");\n await new Promise(resolve => rmrf(extractedFolder, resolve));\n await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));\n return success;\n } // If we've gotten to this point, everything should have gone smoothly.\n // Cleanup the backup folder then remove the zip\n\n\n await new Promise(resolve => rmrf(backupFolder, resolve));\n await new Promise(resolve => fs.unlink(savedZip, resolve));\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Injector Updated!\");\n return success;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (new Core());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy9jb3JlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvcmUuanM/MTNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBCRExvZ28gZnJvbSBcIi4uL3VpL2JkTG9nb1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3VpL2xpZ2h0Y29yZExvZ29cIjtcbmltcG9ydCBQbHVnaW5DZXJ0aWZpZXIgZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XG5cbmZ1bmN0aW9uIENvcmUoKSB7Ly8gT2JqZWN0LmFzc2lnbihiZENvbmZpZywgX19ub25fd2VicGFja19yZXF1aXJlX18oRGF0YVN0b3JlLmNvbmZpZ0ZpbGUpKTtcbiAgLy8gdGhpcy5pbml0KCk7XG59XG5cbkNvcmUucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgT2JqZWN0LmFzc2lnbihiZENvbmZpZywgY29uZmlnKTtcbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcbiAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XG4gICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5FRCkge1xuICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIEVuaGFuY2VkRGlzY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcbiAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxhdGVzdExvY2FsVmVyc2lvbiA9IGJkQ29uZmlnLnVwZGF0ZXIgPyBiZENvbmZpZy51cGRhdGVyLkxhdGVzdFZlcnNpb24gOiBiZENvbmZpZy5sYXRlc3RWZXJzaW9uO1xuXG4gIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XG4gICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xuICAgICAgY29uZmlybVRleHQ6IFwiVXBkYXRlIE5vd1wiLFxuICAgICAgY2FuY2VsVGV4dDogXCJNYXliZSBMYXRlclwiLFxuICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uVXBkYXRlRmFpbGVkID0gKCkgPT4ge1xuICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ291bGQgTm90IFVwZGF0ZVwiLCBgVW5hYmxlIHRvIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LCBwbGVhc2UgZG93bmxvYWQgdGhlIGluc3RhbGxlciBhbmQgcmVpbnN0YWxsIG5vcm1hbGx5LjxiciAvPjxiciAvPjxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvcmVsZWFzZXMvbGF0ZXN0JyB0YXJnZXQ9J19ibGFuayc+RG93bmxvYWQgSW5zdGFsbGVyPC9hPmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGlkVXBkYXRlID0gYXdhaXQgdGhpcy51cGRhdGVJbmplY3RvcigpO1xuICAgICAgICAgIGlmICghZGlkVXBkYXRlKSByZXR1cm4gb25VcGRhdGVGYWlsZWQoKTtcblxuICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xuXG4gICAgICAgICAgYXBwLnJlbGF1bmNoKCk7XG4gICAgICAgICAgYXBwLmV4aXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcbiAgdGhpcy5pbml0U2V0dGluZ3MoKTtcbiAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xuICBCRFYyLmluaXRpYWxpemUoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlVwZGF0aW5nIFNldHRpbmdzXCIpO1xuICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xuICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBQbHVnaW5zXCIpO1xuICBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgVGhlbWVzXCIpO1xuICB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XG4gIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCBhdG9iKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSkpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XG4gIH0pO1xuICBuZXcgUGx1Z2luQ2VydGlmaWVyKCkuc3RhcnQoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlJlbW92aW5nIExvYWRpbmcgSWNvblwiKTtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xuICB0aGlzLmluaXRPYnNlcnZlcigpOyAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXG5cbiAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XG4gICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe1xuICAgICAgcGx1Z2luczogYmRwbHVnaW5FcnJvcnMsXG4gICAgICB0aGVtZXM6IGJkdGhlbWVFcnJvcnNcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xuXG4gIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcbiAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcbiAgfVxuXG4gIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hTb2NpYWwuYmluZCh0aGlzKSwgXCJCRCBTb2NpYWwgUGF0Y2hcIikoKTtcbiAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xuICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XG4gIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFNlcGFyYXRvci5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFNlcGFyYXRvciBQYXRjaFwiKSgpO1xuICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcbiAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xufTtcblxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCB0aW1lc0NoZWNrZWQgPSAwO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcbiAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7ZWxzZSBpZiAodGltZXNDaGVja2VkID49IDUwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xuICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICB9O1xuXG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gXCJsb2FkaW5nXCIpIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcbiAgaWYgKHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsKSB3aW5kb3cucmVxdWlyZSA9IHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsO1xufTtcblxuQ29yZS5wcm90b3R5cGUuaW5pdFNldHRpbmdzID0gZnVuY3Rpb24gKCkge1xuICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xuXG4gIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XG4gICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIGRlZmF1bHRDb29raWUpO1xuICAgIH1cblxuICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgZGVmYXVsdFJQQyk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nIGluIGRlZmF1bHRDb29raWUpIHtcbiAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPSBkZWZhdWx0Q29va2llW3NldHRpbmddO1xuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUuaW5pdE9ic2VydmVyID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xuICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XG4gICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTsgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcblxuICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XG4gICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcbiAgICAgIGxldCBbY2xhc3NOYW1lTGF5ZXIsIGNsYXNzTmFtZVNvY2lhbExpbmtzXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIsIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc107XG5cbiAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcbiAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImd1aWxkLXNldHRpbmdzLWJhc2Utc2VjdGlvblwiKS5sZW5ndGgpIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG5cbiAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJkLXNldHRpbmdzLXNpZGViYXJcIikpIHNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjsgLy8gRW1vamkgUGlja2VyXG4gICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXG4gICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcbiAgICB9XG4gIH0pO1xuICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xufTtcblxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcbiAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gIGlmICghVGFiQmFyKSByZXR1cm47XG4gIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgYWZ0ZXI6IGRhdGEgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcbiAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XG4gICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XG5cbiAgICAgIGlmIChBbmNob3IpIHtcbiAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZTtcblxuICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBzaWRlOiBcInRvcFwiLFxuICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmRcIlxuICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIiArIHNvY2lhbE1vZHVsZTEubGluayxcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2plYW5vdWluYS9MaWdodGNvcmRcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtcbiAgICAgICAgICAgIHNpemU6IFwiMTdweFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJcbiAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBzaWRlOiBcInRvcFwiLFxuICAgICAgICAgICAgdGV4dDogXCJCYW5kYWdlZEJEXCJcbiAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIgKyBzb2NpYWxNb2R1bGUxLmxpbmssXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtcbiAgICAgICAgICAgIHNpemU6IFwiMTZweFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJcbiAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XG4gICAgICB9XG5cbiAgICAgIGxldCBbY2xhc3NOYW1lQ29sb3JNdXRlZCwgc2l6ZXMsIGNsYXNzTmFtZVZlcnNpb25IYXNoXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hdO1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWBcbiAgICAgIH0sIGBJbmplY3RvciAke2JkQ29uZmlnLnZlcnNpb259YCk7XG4gICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGAoJHtiZENvbmZpZy5oYXNoID8gYmRDb25maWcuaGFzaC5zdWJzdHJpbmcoMCwgNykgOiBiZENvbmZpZy5icmFuY2h9KWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gXG4gICAgICB9LCBgQkJEICR7YmJkVmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2ggKyBcIiBkYS12ZXJzaW9uSGFzaFwiXG4gICAgICB9LCB2ZXJzaW9uSGFzaCkpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzaW9ucyA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGU7XG5cbiAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZShyZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgMCwgaW5qZWN0b3IpO1xuICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XG4gIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcbiAgY29uc3QgcGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYmxvYkNvbnRhaW5lclwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XG4gIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xuICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcbiAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcbiAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xuICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XG4gIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xuICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcbiAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xuICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xuICBpZiAoIWd1aWxkUGlsbCkgcmV0dXJuO1xuICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XG4gICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcbiAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XG4gICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcbiAgaWYgKCFndWlsZENvbXBvbmVudHMgfHwgIUd1aWxkcykgcmV0dXJuO1xuXG4gIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xuICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH07XG5cbiAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xuICAgIH1cbiAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBNZXNzYWdlSGVhZGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJNZXNzYWdlVGltZXN0YW1wXCIpO1xuICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xuICB0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lc3NhZ2VIZWFkZXIsIFwiZGVmYXVsdFwiLCB7XG4gICAgYWZ0ZXI6IGRhdGEgPT4ge1xuICAgICAgY29uc3QgYXV0aG9yID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJtZXNzYWdlLmF1dGhvclwiKTsgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcbiAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKSByZXR1cm47IC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XG5cbiAgICAgIGlmIChhdXRob3IuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLFxuICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLFxuICAgICAgICAgIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIixcbiAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge1xuICAgICAgICAgIHNpemU6IFwiMTZweFwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJcbiAgICAgICAgfSkpKSk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsXG4gICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vamVhbm91aW5hL0xpZ2h0Y29yZFwiLFxuICAgICAgICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxuICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge1xuICAgICAgICAgIHNpemU6IFwiMzJweFwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJcbiAgICAgICAgfSkpKSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XG4gIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcbiAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xuICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHtcbiAgICBhZnRlcjogZGF0YSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZCkgcmV0dXJuOyAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xuXG4gICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge1xuICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgc2lkZTogXCJ0b3BcIixcbiAgICAgICAgICB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIixcbiAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIixcbiAgICAgICAgICB0aXRsZTogXCJCYW5kYWdlZEJEXCIsXG4gICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtcbiAgICAgICAgICBzaXplOiBcIjE2cHhcIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiXG4gICAgICAgIH0pKSkpO1xuICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIixcbiAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qZWFub3VpbmEvTGlnaHRjb3JkXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7XG4gICAgICAgICAgc2l6ZTogXCIzMnB4XCIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIlxuICAgICAgICB9KSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcbiAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5cbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xuXG4gIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xuXG4gIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XG5cbiAgY29uc3QgcmVxdWVzdCA9XG4gIC8qcmVxdWlyZShcInJlcXVlc3RcIik7Ki9cbiAgbnVsbDtcbiAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xuICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcbiAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xuICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcbiAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTsgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXG5cbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xuICBsZXQgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgIHVybDogemlwTGluayxcbiAgICAgIGVuY29kaW5nOiBudWxsXG4gICAgfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpOyAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcblxuICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xuICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xuICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xuICAgICAgZnMud3JpdGVGaWxlKHNhdmVkWmlwLCBib2R5LCBlcnIgPT4gcmVzb2x2ZSghZXJyKSk7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzOyAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXG5cbiAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoZXh0cmFjdGVkRm9sZGVyLCByZXMpKTtcbiAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7IC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXG5cbiAgY29uc3QgemlwZmlsZSA9IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4geWF1emwub3BlbihzYXZlZFppcCwge1xuICAgIGxhenlFbnRyaWVzOiB0cnVlXG4gIH0sIChlcnIsIHppcCkgPT4gcih6aXApKSk7XG4gIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAvLyBTa2lwIGRpcmVjdG9yaWVzLCB0aGV5IGFyZSBoYW5kbGVkIHdpdGggbWtkaXJwXG4gICAgaWYgKGVudHJ5LmZpbGVOYW1lLmVuZHNXaXRoKFwiL1wiKSkgcmV0dXJuIHppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpOyAvLyBNYWtlIGFueSBuZWVkZWQgcGFyZW50IGRpcmVjdG9yaWVzXG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XG4gICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XG4gICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24gKGVyciwgcmVhZFN0cmVhbSkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpO1xuICAgICAgfSk7IC8vIEdvIHRvIG5leHQgZmlsZSBhZnRlciB0aGlzXG5cbiAgICAgIHJlYWRTdHJlYW0ucGlwZShmcy5jcmVhdGVXcml0ZVN0cmVhbShmdWxsUGF0aCkpO1xuICAgIH0pO1xuICB9KTtcbiAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xuICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcblxuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHppcGZpbGUub25jZShcImVuZFwiLCByZXNvbHZlKSk7IC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxuXG4gIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTsgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXG5cbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XG4gIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XG5cbiAgaWYgKCFzdWNjZXNzKSB7XG4gICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH0gLy8gSWYgcmVuYW1lIGhhZCBpc3N1ZXMsIGRlbGV0ZSB3aGF0IHdlIHRyaWVkIHRvIHJlbmFtZSBhbmQgcmVzdG9yZSBiYWNrdXBcblxuXG4gIGlmICghc3VjY2Vzcykge1xuICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihleHRyYWN0ZWRGb2xkZXIsIHJlc29sdmUpKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShiYWNrdXBGb2xkZXIsIGluamVjdGlvblBhdGgsIHJlc29sdmUpKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfSAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxuICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcblxuXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcbiAgcmV0dXJuIHN1Y2Nlc3M7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/core.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/modules/utils.js\");\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ \"./src/modules/settingsPanel.js\");\n/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ \"./src/modules/pluginModule.js\");\n/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ \"./src/modules/themeModule.js\");\n/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ \"./src/modules/dataStore.js\");\n/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ \"./src/modules/webpackModules.js\");\n/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ \"./src/modules/domtools.js\");\n/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ \"./src/ui/bdLogo.js\");\n/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ \"./src/ui/tooltipWrap.js\");\n/* harmony import */ var _ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../ui/lightcordLogo */ \"./src/ui/lightcordLogo.js\");\n/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ \"./src/modules/pluginCertifier.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));\n // this.init();\n}\n\nCore.prototype.setConfig = function (config) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"], config);\n};\n\nCore.prototype.init = async function () {\n if (!Array.prototype.flat) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BetterDiscord v\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] + \" does not support this old version (\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"currentDiscordVersion\"] + \") of Discord. Please update your Discord installation before proceeding.\");\n return;\n }\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__[\"minSupportedVersion\"]) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BetterDiscord v\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version + \" (your version)\" + \" is not supported by the latest js (\" + _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] + \").

Please download the latest version from GitHub\");\n return;\n }\n\n if (window.ED) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.\");\n return;\n }\n\n if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes(\"Patched\")) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Not Supported\", \"BandagedBD does not work with Powercord. Please uninstall one of them.\");\n return;\n }\n\n const latestLocalVersion = _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].updater ? _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].updater.LatestVersion : _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].latestVersion;\n\n if (latestLocalVersion > _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showConfirmationModal(\"Update Available\", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, \"You can either update and restart now, or later.\"], {\n confirmText: \"Update Now\",\n cancelText: \"Maybe Later\",\n onConfirm: async () => {\n const onUpdateFailed = () => {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"Could Not Update\", `Unable to update automatically, please download the installer and reinstall normally.

Download Installer`);\n };\n\n try {\n const didUpdate = await this.updateInjector();\n if (!didUpdate) return onUpdateFailed();\n\n const app = __webpack_require__(/*! electron */ \"electron\").remote.app;\n\n app.relaunch();\n app.exit();\n } catch (err) {\n onUpdateFailed();\n }\n }\n });\n }\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Initializing Settings\");\n this.initSettings();\n await this.checkForGuilds();\n _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].initialize();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Updating Settings\");\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].initializeSettings();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Loading Plugins\");\n _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"].loadPlugins();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Loading Themes\");\n _themeModule__WEBPACK_IMPORTED_MODULE_5__[\"default\"].loadThemes();\n _domtools__WEBPACK_IMPORTED_MODULE_8__[\"default\"].addStyle(\"customcss\", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBDData(\"bdcustomcss\")));\n window.addEventListener(\"beforeunload\", function () {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][\"bda-dc-0\"]) document.querySelector(\".btn.btn-disconnect\").click();\n });\n new _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__[\"default\"]().start();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Removing Loading Icon\");\n if (document.getElementsByClassName(\"bd-loaderv2\").length) document.getElementsByClassName(\"bd-loaderv2\")[0].remove();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Initializing Main Observer\");\n this.initObserver(); // Show loading errors\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][\"fork-ps-1\"]) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"Startup\", \"Collecting Startup Errors\");\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showContentErrors({\n plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdpluginErrors\"],\n themes: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdthemeErrors\"]\n });\n }\n\n const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBDData(\"version\");\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"] > previousVersion) {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdChangelog\"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdChangelog\"]);\n _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setBDData(\"version\", _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]);\n }\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchSocial.bind(this), \"BD Social Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildPills.bind(this), \"BD Guild Pills Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildListItems.bind(this), \"BD Guild List Items Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchGuildSeparator.bind(this), \"BD Guild Separator Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchMessageHeader.bind(this), \"BD Badge Chat Patch\")();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].suppressErrors(this.patchMemberList.bind(this), \"BD Badge Member List Patch\")();\n\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].haveInstalledDefault) {\n let alert = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(\"First Installation\", \"As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.\");\n await new Promise(resolve => {\n alert.onClose(resolve);\n });\n }\n};\n\nCore.prototype.checkForGuilds = function () {\n let timesChecked = 0;\n return new Promise(resolve => {\n const checkForGuilds = function () {\n const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.wrapper.split(\" \")[0];\n if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;\n const guild = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.listItem.split(\" \")[0];\n const blob = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].guildClasses.blobContainer.split(\" \")[0];\n if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].deferLoaded = true);\n setTimeout(checkForGuilds, 100);\n };\n\n if (document.readyState != \"loading\") setTimeout(checkForGuilds, 100);\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(checkForGuilds, 100);\n });\n });\n};\n\nCore.prototype.injectExternals = async function () {\n await _domtools__WEBPACK_IMPORTED_MODULE_8__[\"default\"].addScript(\"ace-script\", \"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js\");\n if (window.require.original) window.require = window.require.original;\n};\n\nCore.prototype.initSettings = function () {\n _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].initialize();\n\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"settings\") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"rpc\")) {\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"settings\")) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"], _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"]);\n }\n\n if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSettingGroup(\"rpc\")) {\n Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsRPC\"], _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultRPC\"]);\n }\n\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].saveSettings();\n } else {\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].loadSettings();\n\n for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"]) {\n if (_0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][setting] == undefined) {\n _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__[\"defaultCookie\"][setting];\n _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].saveSettings();\n }\n }\n }\n};\n\nCore.prototype.initObserver = function () {\n const mainObserver = new MutationObserver(mutations => {\n for (let i = 0, mlen = mutations.length; i < mlen; i++) {\n const mutation = mutations[i];\n if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"] !== \"undefined\") _pluginModule__WEBPACK_IMPORTED_MODULE_4__[\"default\"].rawObserver(mutation); // if there was nothing added, skip\n\n if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue;\n const node = mutation.addedNodes[0];\n let [classNameLayer, classNameSocialLinks] = [BDModules.get(e => e.layer && typeof e.layer === \"string\" && e.animating)[0].layer, BDModules.get(e => e.socialLinks && typeof e.socialLinks === \"string\")[0].socialLinks];\n\n if (node.classList.contains(classNameLayer)) {\n if (node.getElementsByClassName(\"guild-settings-base-section\").length) node.setAttribute(\"layer-id\", \"server-settings\");\n\n if (node.getElementsByClassName(classNameSocialLinks).length) {\n node.setAttribute(\"layer-id\", \"user-settings\");\n node.setAttribute(\"id\", \"user-settings\");\n if (!document.getElementById(\"bd-settings-sidebar\")) _settingsPanel__WEBPACK_IMPORTED_MODULE_3__[\"default\"].renderSidebar();\n }\n }\n\n if (node.parentElement == document.body && node.querySelector(\"#ace_settingsmenu\")) node.id = \"ace_settingsmenu_container\"; // Emoji Picker\n //node.getElementsByClassName(\"emojiPicker-3m1S-j\").length && !node.querySelector(\".emojiPicker-3m1S-j\").parentElement.classList.contains(\"animatorLeft-1EQxU0\")\n //if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector(\".\"+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node);\n }\n });\n mainObserver.observe(document, {\n childList: true,\n subtree: true\n });\n};\n\nCore.prototype.showChangelogModal = function (options = {}) {\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].showChangelogModal(options);\n};\n\nCore.prototype.alert = function (title, content) {\n return _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].alert(title, content);\n};\n\nCore.prototype.patchSocial = function () {\n if (this.socialPatch) return;\n const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"TabBar\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!TabBar) return;\n this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(TabBar.prototype, \"render\", {\n after: data => {\n const children = data.returnValue.props.children;\n if (!children || !children.length || children.length < 3) return;\n if (children[children.length - 3].type.displayName !== \"Separator\") return;\n if (!children[children.length - 2].type.toString().includes(\"socialLinks\")) return;\n\n if (Anchor) {\n let socialModule1 = BDModules.get(e => e.socialLinks)[0];\n const original = children[children.length - 2].type;\n\n const newOne = function () {\n const returnVal = original(...arguments);\n returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-social-link \" + socialModule1.link,\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"17px\",\n className: \"bd-social-logo\"\n }))));\n returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-social-link \" + socialModule1.link,\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-social-logo\"\n }))));\n return returnVal;\n };\n\n children[children.length - 2].type = newOne;\n }\n\n let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash];\n const injector = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"div\", {\n className: `${classNameColorMuted} ${sizes.size12}`\n }, `Injector ${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].version}`);\n const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__[\"bdConfig\"].branch})`;\n const additional = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"div\", {\n className: `${classNameColorMuted} ${sizes.size12}`\n }, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].react.createElement(\"span\", {\n className: classNameVersionHash + \" da-versionHash\"\n }, versionHash));\n const originalVersions = children[children.length - 1].type;\n\n children[children.length - 1].type = function () {\n const returnVal = originalVersions(...arguments);\n returnVal.props.children.splice(returnVal.props.children.length - 1, 0, injector);\n returnVal.props.children.splice(1, 0, additional);\n return returnVal;\n };\n }\n });\n};\n\nconst getGuildClasses = function () {\n const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"wrapper\", \"unreadMentionsBar\");\n const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"guildsError\", \"selected\");\n const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"blobContainer\");\n return Object.assign({}, guildsWrapper, guilds, pill);\n};\n\nCore.prototype.patchGuildListItems = function () {\n if (this.guildListItemsPatch) return;\n const GuildClasses = getGuildClasses();\n const listItemClass = GuildClasses.listItem.split(\" \")[0];\n const blobClass = GuildClasses.blobContainer.split(\" \")[0];\n const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);\n const GuildComponent = reactInstance.return.type;\n if (!GuildComponent) return;\n this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(GuildComponent.prototype, \"render\", {\n after: data => {\n if (data.returnValue && data.thisObject) {\n const returnValue = data.returnValue;\n const guildData = data.thisObject.props;\n returnValue.props.className += \" bd-guild\";\n if (guildData.unread) returnValue.props.className += \" bd-unread\";\n if (guildData.selected) returnValue.props.className += \" bd-selected\";\n if (guildData.audio) returnValue.props.className += \" bd-audio\";\n if (guildData.video) returnValue.props.className += \" bd-video\";\n if (guildData.badge) returnValue.props.className += \" bd-badge\";\n if (guildData.animatable) returnValue.props.className += \" bd-animatable\";\n return returnValue;\n }\n }\n });\n};\n\nCore.prototype.patchGuildPills = function () {\n if (this.guildPillPatch) return;\n const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes(\"translate3d\"));\n if (!guildPill) return;\n this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(guildPill, \"default\", {\n after: data => {\n const props = data.methodArguments[0];\n if (props.unread) data.returnValue.props.className += \" bd-unread\";\n if (props.selected) data.returnValue.props.className += \" bd-selected\";\n if (props.hovered) data.returnValue.props.className += \" bd-hovered\";\n return data.returnValue;\n }\n });\n};\n\nCore.prototype.patchGuildSeparator = function () {\n if (this.guildSeparatorPatch) return;\n const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByDisplayName(\"Guilds\");\n const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"renderListItem\");\n if (!guildComponents || !Guilds) return;\n\n const GuildSeparator = function () {\n const returnValue = guildComponents.Separator(...arguments);\n returnValue.props.className += \" bd-guild-separator\";\n return returnValue;\n };\n\n this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(Guilds.prototype, \"render\", {\n after: data => {\n data.returnValue.props.children[1].props.children[3].type = GuildSeparator;\n }\n });\n};\n\nCore.prototype.patchMessageHeader = function () {\n if (this.messageHeaderPatch) return;\n const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByProps(\"MessageTimestamp\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!Anchor || !MessageHeader || !MessageHeader.default) return;\n this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(MessageHeader, \"default\", {\n after: data => {\n const author = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.methodArguments[0], \"message.author\"); // const header = Utils.getNestedProp(data.returnValue, \"props.children.1.props\");\n\n const children = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.returnValue, \"props.children.1.props.children.1.props.children\");\n if (!children || !author || !author.id) return; // if (header && header.className) header.className += \" \"\n\n if (!Array.isArray(children)) return;\n\n if (author.id === \"249746236008169473\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-chat-badge\",\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-logo\"\n }))));\n } else if (author.id === \"696481194443014174\" || author.id === \"696003456611385396\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-chat-badge\",\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"32px\",\n className: \"bd-logo\"\n }))));\n }\n }\n });\n};\n\nCore.prototype.patchMemberList = function () {\n if (this.memberListPatch) return;\n const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].findByDisplayName(\"MemberListItem\");\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__[\"default\"].find(m => m.displayName == \"Anchor\");\n if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;\n this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].monkeyPatch(MemberListItem.prototype, \"renderDecorators\", {\n after: data => {\n const user = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.thisObject, \"props.user\");\n const children = _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getNestedProp(data.returnValue, \"props.children\");\n if (!children || !user || !user.id) return; // if (header && header.className) header.className += \" \"\n\n if (!Array.isArray(children)) return;\n\n if (user.id === \"249746236008169473\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"BandagedBD Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-member-badge\",\n href: \"https://github.com/rauenzi/BetterDiscordApp\",\n title: \"BandagedBD\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: \"16px\",\n className: \"bd-logo\"\n }))));\n } else if (user.id === \"696481194443014174\" || user.id === \"696003456611385396\") {\n children.push(_v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: \"black\",\n side: \"top\",\n text: \"Lightcord Developer\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Anchor, {\n className: \"bd-member-badge\",\n href: \"https://github.com/jeanouina/Lightcord\",\n title: \"Lightcord\",\n target: \"_blank\"\n }, _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(_ui_lightcordLogo__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: \"32px\",\n className: \"bd-logo\"\n }))));\n }\n }\n });\n};\n\nCore.prototype.updateInjector = async function () {\n const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__[\"default\"].injectionPath;\n if (!injectionPath) return false;\n\n const fs = __webpack_require__(/*! fs */ \"fs\");\n\n const path = __webpack_require__(/*! path */ \"path\");\n\n const rmrf = __webpack_require__(/*! rimraf */ \"rimraf\");\n\n const yauzl = __webpack_require__(/*! yauzl */ \"yauzl\");\n\n const mkdirp = __webpack_require__(/*! mkdirp */ \"mkdirp\");\n\n const request =\n /*require(\"request\");*/\n null;\n const parentPath = path.resolve(injectionPath, \"..\");\n const folderName = path.basename(injectionPath);\n const zipLink = \"https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip\";\n const savedZip = path.resolve(parentPath, \"injector.zip\");\n const extractedFolder = path.resolve(parentPath, \"BetterDiscordApp-injector\"); // Download the injector zip file\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Downloading \" + zipLink);\n let success = await new Promise(resolve => {\n request.get({\n url: zipLink,\n encoding: null\n }, async (error, response, body) => {\n if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy\n\n const alreadyExists = await new Promise(res => fs.exists(savedZip, res));\n if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Writing \" + savedZip);\n fs.writeFile(savedZip, body, err => resolve(!err));\n });\n });\n if (!success) return success; // Check and delete rename extraction\n\n const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));\n if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file\n\n const zipfile = await new Promise(r => yauzl.open(savedZip, {\n lazyEntries: true\n }, (err, zip) => r(zip)));\n zipfile.on(\"entry\", function (entry) {\n // Skip directories, they are handled with mkdirp\n if (entry.fileName.endsWith(\"/\")) return zipfile.readEntry();\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Extracting \" + entry.fileName); // Make any needed parent directories\n\n const fullPath = path.resolve(parentPath, entry.fileName);\n mkdirp.sync(path.dirname(fullPath));\n zipfile.openReadStream(entry, function (err, readStream) {\n if (err) return success = false;\n readStream.on(\"end\", function () {\n zipfile.readEntry();\n }); // Go to next file after this\n\n readStream.pipe(fs.createWriteStream(fullPath));\n });\n });\n zipfile.readEntry(); // Start reading\n // Wait for the final file to finish\n\n await new Promise(resolve => zipfile.once(\"end\", resolve)); // Save a backup in case something goes wrong during final step\n\n const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);\n await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be\n\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);\n success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));\n\n if (!success) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].err(\"InjectorUpdate\", \"Failed to rename the final directory\");\n return success;\n } // If rename had issues, delete what we tried to rename and restore backup\n\n\n if (!success) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].err(\"InjectorUpdate\", \"Something went wrong... restoring backups.\");\n await new Promise(resolve => rmrf(extractedFolder, resolve));\n await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));\n return success;\n } // If we've gotten to this point, everything should have gone smoothly.\n // Cleanup the backup folder then remove the zip\n\n\n await new Promise(resolve => rmrf(backupFolder, resolve));\n await new Promise(resolve => fs.unlink(savedZip, resolve));\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].log(\"InjectorUpdate\", \"Injector Updated!\");\n return success;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (new Core());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy9jb3JlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvcmUuanM/MTNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBCRExvZ28gZnJvbSBcIi4uL3VpL2JkTG9nb1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3VpL2xpZ2h0Y29yZExvZ29cIjtcbmltcG9ydCBQbHVnaW5DZXJ0aWZpZXIgZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XG5cbmZ1bmN0aW9uIENvcmUoKSB7Ly8gT2JqZWN0LmFzc2lnbihiZENvbmZpZywgX19ub25fd2VicGFja19yZXF1aXJlX18oRGF0YVN0b3JlLmNvbmZpZ0ZpbGUpKTtcbiAgLy8gdGhpcy5pbml0KCk7XG59XG5cbkNvcmUucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgT2JqZWN0LmFzc2lnbihiZENvbmZpZywgY29uZmlnKTtcbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcbiAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XG4gICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5FRCkge1xuICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIEVuaGFuY2VkRGlzY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcbiAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxhdGVzdExvY2FsVmVyc2lvbiA9IGJkQ29uZmlnLnVwZGF0ZXIgPyBiZENvbmZpZy51cGRhdGVyLkxhdGVzdFZlcnNpb24gOiBiZENvbmZpZy5sYXRlc3RWZXJzaW9uO1xuXG4gIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XG4gICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xuICAgICAgY29uZmlybVRleHQ6IFwiVXBkYXRlIE5vd1wiLFxuICAgICAgY2FuY2VsVGV4dDogXCJNYXliZSBMYXRlclwiLFxuICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uVXBkYXRlRmFpbGVkID0gKCkgPT4ge1xuICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ291bGQgTm90IFVwZGF0ZVwiLCBgVW5hYmxlIHRvIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LCBwbGVhc2UgZG93bmxvYWQgdGhlIGluc3RhbGxlciBhbmQgcmVpbnN0YWxsIG5vcm1hbGx5LjxiciAvPjxiciAvPjxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvcmVsZWFzZXMvbGF0ZXN0JyB0YXJnZXQ9J19ibGFuayc+RG93bmxvYWQgSW5zdGFsbGVyPC9hPmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGlkVXBkYXRlID0gYXdhaXQgdGhpcy51cGRhdGVJbmplY3RvcigpO1xuICAgICAgICAgIGlmICghZGlkVXBkYXRlKSByZXR1cm4gb25VcGRhdGVGYWlsZWQoKTtcblxuICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xuXG4gICAgICAgICAgYXBwLnJlbGF1bmNoKCk7XG4gICAgICAgICAgYXBwLmV4aXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcbiAgdGhpcy5pbml0U2V0dGluZ3MoKTtcbiAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xuICBCRFYyLmluaXRpYWxpemUoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlVwZGF0aW5nIFNldHRpbmdzXCIpO1xuICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xuICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBQbHVnaW5zXCIpO1xuICBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgVGhlbWVzXCIpO1xuICB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XG4gIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCBhdG9iKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSkpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XG4gIH0pO1xuICBuZXcgUGx1Z2luQ2VydGlmaWVyKCkuc3RhcnQoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlJlbW92aW5nIExvYWRpbmcgSWNvblwiKTtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcbiAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xuICB0aGlzLmluaXRPYnNlcnZlcigpOyAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXG5cbiAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XG4gICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe1xuICAgICAgcGx1Z2luczogYmRwbHVnaW5FcnJvcnMsXG4gICAgICB0aGVtZXM6IGJkdGhlbWVFcnJvcnNcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xuXG4gIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcbiAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcbiAgfVxuXG4gIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hTb2NpYWwuYmluZCh0aGlzKSwgXCJCRCBTb2NpYWwgUGF0Y2hcIikoKTtcbiAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xuICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XG4gIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFNlcGFyYXRvci5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFNlcGFyYXRvciBQYXRjaFwiKSgpO1xuICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcbiAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xuXG4gIGlmIChiZENvbmZpZy5oYXZlSW5zdGFsbGVkRGVmYXVsdCkge1xuICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCB0aW1lc0NoZWNrZWQgPSAwO1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcbiAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7ZWxzZSBpZiAodGltZXNDaGVja2VkID49IDUwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xuICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICB9O1xuXG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gXCJsb2FkaW5nXCIpIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcbiAgaWYgKHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsKSB3aW5kb3cucmVxdWlyZSA9IHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsO1xufTtcblxuQ29yZS5wcm90b3R5cGUuaW5pdFNldHRpbmdzID0gZnVuY3Rpb24gKCkge1xuICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xuXG4gIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XG4gICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIGRlZmF1bHRDb29raWUpO1xuICAgIH1cblxuICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgZGVmYXVsdFJQQyk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nIGluIGRlZmF1bHRDb29raWUpIHtcbiAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPSBkZWZhdWx0Q29va2llW3NldHRpbmddO1xuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUuaW5pdE9ic2VydmVyID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xuICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XG4gICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTsgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcblxuICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XG4gICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcbiAgICAgIGxldCBbY2xhc3NOYW1lTGF5ZXIsIGNsYXNzTmFtZVNvY2lhbExpbmtzXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIsIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc107XG5cbiAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcbiAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImd1aWxkLXNldHRpbmdzLWJhc2Utc2VjdGlvblwiKS5sZW5ndGgpIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG5cbiAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJkLXNldHRpbmdzLXNpZGViYXJcIikpIHNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjsgLy8gRW1vamkgUGlja2VyXG4gICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXG4gICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcbiAgICB9XG4gIH0pO1xuICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xufTtcblxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcbiAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gIGlmICghVGFiQmFyKSByZXR1cm47XG4gIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgYWZ0ZXI6IGRhdGEgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcbiAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XG4gICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XG5cbiAgICAgIGlmIChBbmNob3IpIHtcbiAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZTtcblxuICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBzaWRlOiBcInRvcFwiLFxuICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmRcIlxuICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIiArIHNvY2lhbE1vZHVsZTEubGluayxcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2plYW5vdWluYS9MaWdodGNvcmRcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtcbiAgICAgICAgICAgIHNpemU6IFwiMTdweFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJcbiAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBzaWRlOiBcInRvcFwiLFxuICAgICAgICAgICAgdGV4dDogXCJCYW5kYWdlZEJEXCJcbiAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIgKyBzb2NpYWxNb2R1bGUxLmxpbmssXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIixcbiAgICAgICAgICAgIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtcbiAgICAgICAgICAgIHNpemU6IFwiMTZweFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJcbiAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XG4gICAgICB9XG5cbiAgICAgIGxldCBbY2xhc3NOYW1lQ29sb3JNdXRlZCwgc2l6ZXMsIGNsYXNzTmFtZVZlcnNpb25IYXNoXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hdO1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWBcbiAgICAgIH0sIGBJbmplY3RvciAke2JkQ29uZmlnLnZlcnNpb259YCk7XG4gICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGAoJHtiZENvbmZpZy5oYXNoID8gYmRDb25maWcuaGFzaC5zdWJzdHJpbmcoMCwgNykgOiBiZENvbmZpZy5icmFuY2h9KWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gXG4gICAgICB9LCBgQkJEICR7YmJkVmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2ggKyBcIiBkYS12ZXJzaW9uSGFzaFwiXG4gICAgICB9LCB2ZXJzaW9uSGFzaCkpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzaW9ucyA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGU7XG5cbiAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZShyZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgMCwgaW5qZWN0b3IpO1xuICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XG4gIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcbiAgY29uc3QgcGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYmxvYkNvbnRhaW5lclwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XG4gIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xuICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcbiAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcbiAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xuICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XG4gIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xuICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcbiAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XG4gICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xuICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xuICBpZiAoIWd1aWxkUGlsbCkgcmV0dXJuO1xuICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XG4gICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcbiAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XG4gICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcbiAgaWYgKCFndWlsZENvbXBvbmVudHMgfHwgIUd1aWxkcykgcmV0dXJuO1xuXG4gIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xuICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH07XG5cbiAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGFmdGVyOiBkYXRhID0+IHtcbiAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xuICAgIH1cbiAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xuICBjb25zdCBNZXNzYWdlSGVhZGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJNZXNzYWdlVGltZXN0YW1wXCIpO1xuICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xuICB0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lc3NhZ2VIZWFkZXIsIFwiZGVmYXVsdFwiLCB7XG4gICAgYWZ0ZXI6IGRhdGEgPT4ge1xuICAgICAgY29uc3QgYXV0aG9yID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJtZXNzYWdlLmF1dGhvclwiKTsgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcbiAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKSByZXR1cm47IC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XG5cbiAgICAgIGlmIChhdXRob3IuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLFxuICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLFxuICAgICAgICAgIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIixcbiAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge1xuICAgICAgICAgIHNpemU6IFwiMTZweFwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJcbiAgICAgICAgfSkpKSk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsXG4gICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vamVhbm91aW5hL0xpZ2h0Y29yZFwiLFxuICAgICAgICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxuICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxuICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge1xuICAgICAgICAgIHNpemU6IFwiMzJweFwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJcbiAgICAgICAgfSkpKSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XG4gIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcbiAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xuICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHtcbiAgICBhZnRlcjogZGF0YSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZCkgcmV0dXJuOyAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xuXG4gICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge1xuICAgICAgICAgIGNvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgICAgc2lkZTogXCJ0b3BcIixcbiAgICAgICAgICB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIixcbiAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIixcbiAgICAgICAgICB0aXRsZTogXCJCYW5kYWdlZEJEXCIsXG4gICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtcbiAgICAgICAgICBzaXplOiBcIjE2cHhcIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiXG4gICAgICAgIH0pKSkpO1xuICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtcbiAgICAgICAgICBjb2xvcjogXCJibGFja1wiLFxuICAgICAgICAgIHNpZGU6IFwidG9wXCIsXG4gICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJcbiAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIixcbiAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qZWFub3VpbmEvTGlnaHRjb3JkXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7XG4gICAgICAgICAgc2l6ZTogXCIzMnB4XCIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIlxuICAgICAgICB9KSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcbiAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5cbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xuXG4gIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xuXG4gIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XG5cbiAgY29uc3QgcmVxdWVzdCA9XG4gIC8qcmVxdWlyZShcInJlcXVlc3RcIik7Ki9cbiAgbnVsbDtcbiAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xuICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcbiAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xuICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcbiAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTsgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXG5cbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xuICBsZXQgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgIHVybDogemlwTGluayxcbiAgICAgIGVuY29kaW5nOiBudWxsXG4gICAgfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpOyAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcblxuICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xuICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xuICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xuICAgICAgZnMud3JpdGVGaWxlKHNhdmVkWmlwLCBib2R5LCBlcnIgPT4gcmVzb2x2ZSghZXJyKSk7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzOyAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXG5cbiAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoZXh0cmFjdGVkRm9sZGVyLCByZXMpKTtcbiAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7IC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXG5cbiAgY29uc3QgemlwZmlsZSA9IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4geWF1emwub3BlbihzYXZlZFppcCwge1xuICAgIGxhenlFbnRyaWVzOiB0cnVlXG4gIH0sIChlcnIsIHppcCkgPT4gcih6aXApKSk7XG4gIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAvLyBTa2lwIGRpcmVjdG9yaWVzLCB0aGV5IGFyZSBoYW5kbGVkIHdpdGggbWtkaXJwXG4gICAgaWYgKGVudHJ5LmZpbGVOYW1lLmVuZHNXaXRoKFwiL1wiKSkgcmV0dXJuIHppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpOyAvLyBNYWtlIGFueSBuZWVkZWQgcGFyZW50IGRpcmVjdG9yaWVzXG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XG4gICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XG4gICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24gKGVyciwgcmVhZFN0cmVhbSkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpO1xuICAgICAgfSk7IC8vIEdvIHRvIG5leHQgZmlsZSBhZnRlciB0aGlzXG5cbiAgICAgIHJlYWRTdHJlYW0ucGlwZShmcy5jcmVhdGVXcml0ZVN0cmVhbShmdWxsUGF0aCkpO1xuICAgIH0pO1xuICB9KTtcbiAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xuICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcblxuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHppcGZpbGUub25jZShcImVuZFwiLCByZXNvbHZlKSk7IC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxuXG4gIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xuICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTsgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXG5cbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XG4gIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XG5cbiAgaWYgKCFzdWNjZXNzKSB7XG4gICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH0gLy8gSWYgcmVuYW1lIGhhZCBpc3N1ZXMsIGRlbGV0ZSB3aGF0IHdlIHRyaWVkIHRvIHJlbmFtZSBhbmQgcmVzdG9yZSBiYWNrdXBcblxuXG4gIGlmICghc3VjY2Vzcykge1xuICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihleHRyYWN0ZWRGb2xkZXIsIHJlc29sdmUpKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShiYWNrdXBGb2xkZXIsIGluamVjdGlvblBhdGgsIHJlc29sdmUpKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfSAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxuICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcblxuXG4gIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcbiAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcbiAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcbiAgcmV0dXJuIHN1Y2Nlc3M7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/modules/core.js\n"); /***/ }), @@ -359,7 +359,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _0gl /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Utils; });\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ \"./src/modules/webpackModules.js\");\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ \"./src/modules/domtools.js\");\n\n\n\n\nclass Utils {\n /** Document/window width */\n static get screenWidth() {\n return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n /** Document/window height */\n\n\n static get screenHeight() {\n return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n }\n\n static get WindowConfigFile() {\n return this._windowConfigFile = null;\n }\n\n static getAllWindowPreferences() {\n return {\n transparent: true,\n frame: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame\n };\n }\n\n static getWindowPreference(key) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame;\n return null;\n }\n\n static setWindowPreference(key, value) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame = value;\n return null;\n }\n\n static stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n\n return content;\n }\n\n static getTextArea() {\n return _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\".\" + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(\" \")[0] + \" textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escapeID(id) {\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\n }\n\n static log(moduleName, message) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #3a71c1; font-weight: 700;\", \"color: #3a71c1;\", \"\");\n }\n\n static warn(moduleName, message) {\n console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #E8A400; font-weight: 700;\", \"color: #E8A400;\", \"\");\n }\n\n static err(moduleName, message, error) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: red; font-weight: 700;\", \"color: red;\", \"\");\n\n if (error) {\n console.groupCollapsed(\"%cError: \" + error.message, \"color: red;\");\n console.error(error.stack);\n console.groupEnd();\n }\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n } catch (err) {\n return false;\n }\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof obj !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n\n return true;\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try {\n return method(...params);\n } catch (e) {\n this.err(\"SuppressedError\", \"Error occurred in \" + message, e);\n }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {\n before,\n after,\n instead,\n once = false,\n silent = false,\n force = false\n } = options;\n const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n if (!what[methodName]) {\n if (force) what[methodName] = function () {};else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n\n const origMethod = what[methodName];\n\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n what[methodName] = origMethod;\n };\n\n what[methodName] = function () {\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n\n if (instead) {\n const tempRet = Utils.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n } else {\n if (before) Utils.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utils.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n\n if (once) cancel();\n return data.returnValue;\n };\n\n Object.assign(what[methodName], origMethod);\n what[methodName].__monkeyPatched = true;\n what[methodName].displayName = displayName;\n\n if (!what[methodName].__originalMethod) {\n what[methodName].__originalMethod = origMethod;\n\n what[methodName].toString = function () {\n return origMethod.toString();\n };\n }\n\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver(mutations => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n observer.observe(document.body, {\n subtree: true,\n childList: true\n });\n }\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function (obj, prop) {\n return obj && obj[prop];\n }, obj);\n }\n /**\r\n * This shows a toast similar to android towards the bottom of the screen.\r\n *\r\n * @param {string} content The string to show in the toast.\r\n * @param {object} options Options object. Optional parameter.\r\n * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: \"\", \"info\", \"success\", \"danger\"/\"error\", \"warning\"/\"warn\". Default: \"\"\r\n * @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true\r\n * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000\r\n */\n\n\n static showToast(content, options = {}) {\n if (!document.querySelector(\".bd-toasts\")) {\n const container = document.querySelector(\".\" + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(\" \")[9] + \" + div\") || null;\n const memberlist = container ? container.querySelector(\".\" + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;\n const form = container ? container.querySelector(\"form\") : null;\n const left = container ? container.getBoundingClientRect().left : 310;\n const right = memberlist ? memberlist.getBoundingClientRect().left : 0;\n const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;\n const bottom = form ? form.offsetHeight : 80;\n const toastWrapper = document.createElement(\"div\");\n toastWrapper.classList.add(\"bd-toasts\");\n toastWrapper.style.setProperty(\"left\", left + \"px\");\n toastWrapper.style.setProperty(\"width\", width + \"px\");\n toastWrapper.style.setProperty(\"bottom\", bottom + \"px\");\n document.querySelector(\"#app-mount\").appendChild(toastWrapper);\n }\n\n const {\n type = \"\",\n icon = true,\n timeout = 3000\n } = options;\n const toastElem = document.createElement(\"div\");\n toastElem.classList.add(\"bd-toast\");\n if (type) toastElem.classList.add(\"toast-\" + type);\n if (type && icon) toastElem.classList.add(\"icon\");\n toastElem.innerText = content;\n document.querySelector(\".bd-toasts\").appendChild(toastElem);\n setTimeout(() => {\n toastElem.classList.add(\"closing\");\n setTimeout(() => {\n toastElem.remove();\n if (!document.querySelectorAll(\".bd-toasts .bd-toast\").length) document.querySelector(\".bd-toasts\").remove();\n }, 300);\n }, timeout);\n }\n\n static alert(title, content) {\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];\n const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
\n
${title}
\n
\n
\n
\n
\n ${content}\n
\n
\n
\n
\n \n
\n
\n
\n
`);\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\"#app-mount\").append(modal);\n }\n\n static showContentErrors({\n plugins: pluginErrors = [],\n themes: themeErrors = []\n }) {\n if (!pluginErrors || !themeErrors) return;\n if (!pluginErrors.length && !themeErrors.length) return;\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];\n const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
`);\n\n function generateTab(errors) {\n const container = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
`);\n\n for (const err of errors) {\n const error = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
${err.name ? err.name : err.file}
\n
${err.message}
\n \n
`);\n container.append(error);\n\n if (err.error) {\n error.querySelectorAll(\"a\").forEach(el => el.addEventListener(\"click\", e => {\n e.preventDefault();\n Utils.err(\"ContentManager\", `Error details for ${err.name ? err.name : err.file}.`, err.error);\n }));\n }\n }\n\n return container;\n }\n\n const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];\n modal.querySelectorAll(\".tab-bar-item\").forEach(el => el.addEventListener(\"click\", e => {\n e.preventDefault();\n const selected = modal.querySelector(\".tab-bar-item.selected\");\n if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].removeClass(selected, \"selected\");\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(e.target, \"selected\");\n const scroller = modal.querySelector(\".scroller\");\n scroller.innerHTML = \"\";\n scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].index(e.target)]);\n }));\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\"#app-mount\").append(modal);\n if (pluginErrors.length) modal.querySelector(\".tab-bar-item\").click();else modal.querySelectorAll(\".tab-bar-item\")[1].click();\n }\n\n static showChangelogModal(options = {}) {\n const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"fixed\", \"improved\");\n const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByDisplayName(\"Text\");\n const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"Child\");\n const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"Tags\", \"default\");\n const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.defaultProps && m.defaultProps.selectable == false);\n const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"defaultRules\", \"parse\");\n if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;\n const {\n image = \"https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5\",\n description = \"\",\n changes = [],\n title = \"BandagedBD\",\n subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]}`,\n footer\n } = options;\n const ce = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement;\n const changelogItems = [ce(\"img\", {\n src: image\n })];\n if (description) changelogItems.push(ce(\"p\", null, MarkdownParser.parse(description)));\n\n for (let c = 0; c < changes.length; c++) {\n const entry = changes[c];\n const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;\n const margin = c == 0 ? ChangelogClasses.marginTop : \"\";\n changelogItems.push(ce(\"h1\", {\n className: `${type} ${margin}`\n }, entry.title));\n const list = ce(\"ul\", null, entry.items.map(i => ce(\"li\", null, MarkdownParser.parse(i))));\n changelogItems.push(list);\n }\n\n const renderHeader = function () {\n return ce(FlexChild.Child, {\n grow: 1,\n shrink: 1\n }, ce(Titles.default, {\n tag: Titles.Tags.H4\n }, title), ce(TextElement, {\n size: TextElement.Sizes.SMALL,\n color: TextElement.Colors.STANDARD,\n className: ChangelogClasses.date\n }, subtitle));\n };\n\n const renderFooter = () => {\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.displayName == \"Anchor\");\n const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"anchorUnderlineOnHover\") || {\n anchor: \"anchor-3Z-8Bb\",\n anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"\n };\n\n const joinSupportServer = click => {\n click.preventDefault();\n click.stopPropagation();\n ModalStack.pop();\n _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].joinBD2();\n };\n\n const supportLink = Anchor ? ce(Anchor, {\n onClick: joinSupportServer\n }, \"Join our Discord Server.\") : ce(\"a\", {\n className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,\n onClick: joinSupportServer\n }, \"Join our Discord Server.\");\n const defaultFooter = ce(TextElement, {\n size: TextElement.Sizes.SMALL,\n color: TextElement.Colors.STANDARD\n }, \"Need support? \", supportLink);\n return ce(FlexChild.Child, {\n grow: 1,\n shrink: 1\n }, footer ? footer : defaultFooter);\n };\n\n return ModalStack.push(function (props) {\n return ce(Changelog, Object.assign({\n className: ChangelogClasses.container,\n selectable: true,\n onScroll: _ => _,\n onClose: _ => _,\n renderHeader: renderHeader,\n renderFooter: renderFooter,\n children: changelogItems\n }, props));\n });\n }\n /**\r\n * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.\r\n * @param {string} title - title of the modal\r\n * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.\r\n * @param {object} [options] - options to modify the modal\r\n * @param {boolean} [options.danger=false] - whether the main button should be red or not\r\n * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button\r\n * @param {string} [options.cancelText=Cancel] - text for the cancel button\r\n * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button\r\n * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button\r\n * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned\r\n * @returns {string} - the key used for this modal\r\n */\n\n\n static showConfirmationModal(title, content, options = {}) {\n const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByDisplayName(\"Markdown\");\n const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.defaultProps && m.key && m.key() == \"confirm-modal\");\n if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content);\n\n const emptyFunction = () => {};\n\n const {\n onConfirm = emptyFunction,\n onCancel = emptyFunction,\n confirmText = \"Okay\",\n cancelText = \"Cancel\",\n danger = false,\n key = undefined\n } = options;\n if (!Array.isArray(content)) content = [content];\n content = content.map(c => typeof c === \"string\" ? _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Markdown, null, c) : c);\n return ModalStack.push(ConfirmationModal, {\n header: title,\n children: content,\n red: danger,\n confirmText: confirmText,\n cancelText: cancelText,\n onConfirm: onConfirm,\n onCancel: onCancel\n }, key);\n }\n\n}\nUtils.showToast = Utils.suppressErrors(Utils.showToast, \"Could not show toast.\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy91dGlscy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy91dGlscy5qcz9jMGY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlscyB7XG4gIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cbiAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgfVxuICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xuXG5cbiAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgZnJhbWU6IHNldHRpbmdzQ29va2llLmZyYW1lXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xuICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gc2V0dGluZ3NDb29raWUuZnJhbWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBzZXR0aW5nc0Nvb2tpZS5mcmFtZSA9IHZhbHVlO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgc3RhdGljIGdldFRleHRBcmVhKCkge1xuICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIgKyBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYS5zcGxpdChcIiBcIilbMF0gKyBcIiB0ZXh0YXJlYVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XG4gICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xuICB9XG5cbiAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6IHJlZDtcIiwgXCJcIik7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZXNjYXBlKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbiAgfVxuXG4gIHN0YXRpYyB0ZXN0SlNPTihkYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWV0aG9kKC4uLnBhcmFtcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBiZWZvcmUsXG4gICAgICBhZnRlcixcbiAgICAgIGluc3RlYWQsXG4gICAgICBvbmNlID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIGZvcmNlID0gZmFsc2VcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbiAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0pIHtcbiAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHt9O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcblxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInVucGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXG4gICAgICB3aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcbiAgICB9O1xuXG4gICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXG4gICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxuICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcbiAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RlYWQpIHtcbiAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XG4gICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25jZSkgY2FuY2VsKCk7XG4gICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcbiAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XG4gICAgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcbiAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XG5cbiAgICAgIHdoYXRbbWV0aG9kTmFtZV0udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjYW5jZWw7XG4gIH1cblxuICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcbiAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuXG4gICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xuICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7XG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgY2hpbGRMaXN0OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XG4gICAgfSwgb2JqKTtcbiAgfVxuICAvKipcclxuICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgQ2hhbmdlcyB0aGUgdHlwZSBvZiB0aGUgdG9hc3Qgc3R5bGlzdGljYWxseSBhbmQgc2VtYW50aWNhbGx5LiBDaG9pY2VzOiBcIlwiLCBcImluZm9cIiwgXCJzdWNjZXNzXCIsIFwiZGFuZ2VyXCIvXCJlcnJvclwiLCBcIndhcm5pbmdcIi9cIndhcm5cIi4gRGVmYXVsdDogXCJcIlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcclxuICAgKi9cblxuXG4gIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIiArIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXIgJiYgZS5oYXNOb3RpY2UpWzBdLnNpZGViYXIuc3BsaXQoXCIgXCIpWzldICsgXCIgKyBkaXZcIikgfHwgbnVsbDtcbiAgICAgIGNvbnN0IG1lbWJlcmxpc3QgPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5cIiArIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lbWJlcnNXcmFwKVswXS5tZW1iZXJzV3JhcCkgOiBudWxsO1xuICAgICAgY29uc3QgZm9ybSA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiZm9ybVwiKSA6IG51bGw7XG4gICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAzMTA7XG4gICAgICBjb25zdCByaWdodCA9IG1lbWJlcmxpc3QgPyBtZW1iZXJsaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAwO1xuICAgICAgY29uc3Qgd2lkdGggPSByaWdodCA/IHJpZ2h0IC0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiBVdGlscy5zY3JlZW5XaWR0aCAtIGxlZnQgLSAyNDA7XG4gICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcbiAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0c1wiKTtcbiAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgbGVmdCArIFwicHhcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJib3R0b21cIiwgYm90dG9tICsgXCJweFwiKTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgdHlwZSA9IFwiXCIsXG4gICAgICBpY29uID0gdHJ1ZSxcbiAgICAgIHRpbWVvdXQgPSAzMDAwXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xuICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XG4gICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xuICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfVxuXG4gIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xuICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF07XG4gICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdO1xuICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXTtcbiAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiR7dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9KTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBtb2RhbC5yZW1vdmUoKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfSk7XG4gICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICB9XG5cbiAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtcbiAgICBwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSxcbiAgICB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW11cbiAgfSkge1xuICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xuICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXTtcbiAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF07XG4gICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdO1xuICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+PGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGVudCBFcnJvcnM8L2Rpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyIFRPUFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFiKGVycm9ycykge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcblxuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPjxhIGNsYXNzPVwiZXJyb3ItbGlua1wiIGhyZWY9XCJcIj4ke2Vyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogXCJcIn08L2E+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kKGVycm9yKTtcblxuICAgICAgICBpZiAoZXJyLmVycm9yKSB7XG4gICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfVxuXG4gICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcbiAgICAgIGlmIChzZWxlY3RlZCkgRE9NLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCBcInNlbGVjdGVkXCIpO1xuICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xuICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xuICAgICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcbiAgICB9KSk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBtb2RhbC5yZW1vdmUoKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfSk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICB9LCAzMDApO1xuICAgIH0pO1xuICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcbiAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XG4gIH1cblxuICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xuICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XG4gICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XG4gICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcbiAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xuICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcbiAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XG4gICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBpbWFnZSA9IFwiaHR0cHM6Ly9yZXBvc2l0b3J5LWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA1NDczNTM3Lzk1N2I1NDgwLTdjMjYtMTFlOS04NDAxLTUwZmE4MjBjYmFlNVwiLFxuICAgICAgZGVzY3JpcHRpb24gPSBcIlwiLFxuICAgICAgY2hhbmdlcyA9IFtdLFxuICAgICAgdGl0bGUgPSBcIkJhbmRhZ2VkQkRcIixcbiAgICAgIHN1YnRpdGxlID0gYHYke2JiZFZlcnNpb259YCxcbiAgICAgIGZvb3RlclxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNlID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50O1xuICAgIGNvbnN0IGNoYW5nZWxvZ0l0ZW1zID0gW2NlKFwiaW1nXCIsIHtcbiAgICAgIHNyYzogaW1hZ2VcbiAgICB9KV07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcblxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xuICAgICAgY29uc3QgdHlwZSA9IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gPyBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdIDogQ2hhbmdlbG9nQ2xhc3Nlcy5hZGRlZDtcbiAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcbiAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7dHlwZX0gJHttYXJnaW59YFxuICAgICAgfSwgZW50cnkudGl0bGUpKTtcbiAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XG4gICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGxpc3QpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtcbiAgICAgICAgZ3JvdzogMSxcbiAgICAgICAgc2hyaW5rOiAxXG4gICAgICB9LCBjZShUaXRsZXMuZGVmYXVsdCwge1xuICAgICAgICB0YWc6IFRpdGxlcy5UYWdzLkg0XG4gICAgICB9LCB0aXRsZSksIGNlKFRleHRFbGVtZW50LCB7XG4gICAgICAgIHNpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLFxuICAgICAgICBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELFxuICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZVxuICAgICAgfSwgc3VidGl0bGUpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHtcbiAgICAgICAgYW5jaG9yOiBcImFuY2hvci0zWi04QmJcIixcbiAgICAgICAgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwiXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IGNsaWNrID0+IHtcbiAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XG4gICAgICAgIEJEVjIuam9pbkJEMigpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtcbiAgICAgICAgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJcbiAgICAgIH0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCxcbiAgICAgICAgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJcbiAgICAgIH0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xuICAgICAgY29uc3QgZGVmYXVsdEZvb3RlciA9IGNlKFRleHRFbGVtZW50LCB7XG4gICAgICAgIHNpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLFxuICAgICAgICBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEXG4gICAgICB9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcbiAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtcbiAgICAgICAgZ3JvdzogMSxcbiAgICAgICAgc2hyaW5rOiAxXG4gICAgICB9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxuICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxuICAgICAgICBvbkNsb3NlOiBfID0+IF8sXG4gICAgICAgIHJlbmRlckhlYWRlcjogcmVuZGVySGVhZGVyLFxuICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXG4gICAgICB9LCBwcm9wcykpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxyXG4gICAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICAgKi9cblxuXG4gIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xuICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcbiAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmtleSAmJiBtLmtleSgpID09IFwiY29uZmlybS1tb2RhbFwiKTtcbiAgICBpZiAoIU1vZGFsU3RhY2sgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcblxuICAgIGNvbnN0IGVtcHR5RnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIGNvbnN0IHtcbiAgICAgIG9uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sXG4gICAgICBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sXG4gICAgICBjb25maXJtVGV4dCA9IFwiT2theVwiLFxuICAgICAgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsXG4gICAgICBkYW5nZXIgPSBmYWxzZSxcbiAgICAgIGtleSA9IHVuZGVmaW5lZFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcbiAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YgYyA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcbiAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKENvbmZpcm1hdGlvbk1vZGFsLCB7XG4gICAgICBoZWFkZXI6IHRpdGxlLFxuICAgICAgY2hpbGRyZW46IGNvbnRlbnQsXG4gICAgICByZWQ6IGRhbmdlcixcbiAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcbiAgICAgIGNhbmNlbFRleHQ6IGNhbmNlbFRleHQsXG4gICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxuICAgIH0sIGtleSk7XG4gIH1cblxufVxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/modules/utils.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Utils; });\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ \"./src/modules/webpackModules.js\");\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ \"./src/modules/domtools.js\");\n\n\n\n\nclass Utils {\n /** Document/window width */\n static get screenWidth() {\n return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n /** Document/window height */\n\n\n static get screenHeight() {\n return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n }\n\n static get WindowConfigFile() {\n return this._windowConfigFile = null;\n }\n\n static getAllWindowPreferences() {\n return {\n transparent: true,\n frame: _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame\n };\n }\n\n static getWindowPreference(key) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame;\n return null;\n }\n\n static setWindowPreference(key, value) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return _0globals__WEBPACK_IMPORTED_MODULE_0__[\"settingsCookie\"].frame = value;\n return null;\n }\n\n static stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n\n return content;\n }\n\n static getTextArea() {\n return _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\".\" + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(\" \")[0] + \" textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escapeID(id) {\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\n }\n\n static log(moduleName, message) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #3a71c1; font-weight: 700;\", \"color: #3a71c1;\", \"\");\n }\n\n static warn(moduleName, message) {\n console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #E8A400; font-weight: 700;\", \"color: #E8A400;\", \"\");\n }\n\n static err(moduleName, message, error) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: red; font-weight: 700;\", \"color: red;\", \"\");\n\n if (error) {\n console.groupCollapsed(\"%cError: \" + error.message, \"color: red;\");\n console.error(error.stack);\n console.groupEnd();\n }\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n } catch (err) {\n return false;\n }\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof obj !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n\n return true;\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try {\n return method(...params);\n } catch (e) {\n this.err(\"SuppressedError\", \"Error occurred in \" + message, e);\n }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {\n before,\n after,\n instead,\n once = false,\n silent = false,\n force = false\n } = options;\n const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n if (!what[methodName]) {\n if (force) what[methodName] = function () {};else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n\n const origMethod = what[methodName];\n\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n what[methodName] = origMethod;\n };\n\n what[methodName] = function () {\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n\n if (instead) {\n const tempRet = Utils.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n } else {\n if (before) Utils.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utils.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n\n if (once) cancel();\n return data.returnValue;\n };\n\n Object.assign(what[methodName], origMethod);\n what[methodName].__monkeyPatched = true;\n what[methodName].displayName = displayName;\n\n if (!what[methodName].__originalMethod) {\n what[methodName].__originalMethod = origMethod;\n\n what[methodName].toString = function () {\n return origMethod.toString();\n };\n }\n\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver(mutations => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n observer.observe(document.body, {\n subtree: true,\n childList: true\n });\n }\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function (obj, prop) {\n return obj && obj[prop];\n }, obj);\n }\n /**\r\n * This shows a toast similar to android towards the bottom of the screen.\r\n *\r\n * @param {string} content The string to show in the toast.\r\n * @param {object} options Options object. Optional parameter.\r\n * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: \"\", \"info\", \"success\", \"danger\"/\"error\", \"warning\"/\"warn\". Default: \"\"\r\n * @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true\r\n * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000\r\n */\n\n\n static showToast(content, options = {}) {\n if (!document.querySelector(\".bd-toasts\")) {\n const container = document.querySelector(\".\" + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(\" \")[9] + \" + div\") || null;\n const memberlist = container ? container.querySelector(\".\" + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;\n const form = container ? container.querySelector(\"form\") : null;\n const left = container ? container.getBoundingClientRect().left : 310;\n const right = memberlist ? memberlist.getBoundingClientRect().left : 0;\n const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;\n const bottom = form ? form.offsetHeight : 80;\n const toastWrapper = document.createElement(\"div\");\n toastWrapper.classList.add(\"bd-toasts\");\n toastWrapper.style.setProperty(\"left\", left + \"px\");\n toastWrapper.style.setProperty(\"width\", width + \"px\");\n toastWrapper.style.setProperty(\"bottom\", bottom + \"px\");\n document.querySelector(\"#app-mount\").appendChild(toastWrapper);\n }\n\n const {\n type = \"\",\n icon = true,\n timeout = 3000\n } = options;\n const toastElem = document.createElement(\"div\");\n toastElem.classList.add(\"bd-toast\");\n if (type) toastElem.classList.add(\"toast-\" + type);\n if (type && icon) toastElem.classList.add(\"icon\");\n toastElem.innerText = content;\n document.querySelector(\".bd-toasts\").appendChild(toastElem);\n setTimeout(() => {\n toastElem.classList.add(\"closing\");\n setTimeout(() => {\n toastElem.remove();\n if (!document.querySelectorAll(\".bd-toasts .bd-toast\").length) document.querySelector(\".bd-toasts\").remove();\n }, 300);\n }, timeout);\n }\n\n static alert(title, content) {\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];\n const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
\n
${title}
\n
\n
\n
\n
\n ${content}\n
\n
\n
\n
\n \n
\n
\n
\n
`);\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n closingListeners.forEach(listener => {\n try {\n listener();\n } catch (e) {\n console.error(e);\n }\n });\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n closingListeners.forEach(listener => {\n try {\n listener();\n } catch (e) {\n console.error(e);\n }\n });\n }, 300);\n });\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\"#app-mount\").append(modal);\n const closingListeners = [];\n return {\n close: () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n closingListeners.forEach(listener => {\n try {\n listener();\n } catch (e) {\n console.error(e);\n }\n });\n }, 300);\n },\n onClose: listener => {\n closingListeners.push(listener);\n }\n };\n }\n\n static showContentErrors({\n plugins: pluginErrors = [],\n themes: themeErrors = []\n }) {\n if (!pluginErrors || !themeErrors) return;\n if (!pluginErrors.length && !themeErrors.length) return;\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];\n const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
`);\n\n function generateTab(errors) {\n const container = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
`);\n\n for (const err of errors) {\n const error = _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].createElement(`
\n
${err.name ? err.name : err.file}
\n
${err.message}
\n \n
`);\n container.append(error);\n\n if (err.error) {\n error.querySelectorAll(\"a\").forEach(el => el.addEventListener(\"click\", e => {\n e.preventDefault();\n Utils.err(\"ContentManager\", `Error details for ${err.name ? err.name : err.file}.`, err.error);\n }));\n }\n }\n\n return container;\n }\n\n const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];\n modal.querySelectorAll(\".tab-bar-item\").forEach(el => el.addEventListener(\"click\", e => {\n e.preventDefault();\n const selected = modal.querySelector(\".tab-bar-item.selected\");\n if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].removeClass(selected, \"selected\");\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(e.target, \"selected\");\n const scroller = modal.querySelector(\".scroller\");\n scroller.innerHTML = \"\";\n scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].index(e.target)]);\n }));\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].addClass(modal, \"closing\");\n setTimeout(() => {\n modal.remove();\n }, 300);\n });\n _domtools__WEBPACK_IMPORTED_MODULE_3__[\"default\"].query(\"#app-mount\").append(modal);\n if (pluginErrors.length) modal.querySelector(\".tab-bar-item\").click();else modal.querySelectorAll(\".tab-bar-item\")[1].click();\n }\n\n static showChangelogModal(options = {}) {\n const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"fixed\", \"improved\");\n const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByDisplayName(\"Text\");\n const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"Child\");\n const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"Tags\", \"default\");\n const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.defaultProps && m.defaultProps.selectable == false);\n const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"defaultRules\", \"parse\");\n if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;\n const {\n image = \"https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5\",\n description = \"\",\n changes = [],\n title = \"BandagedBD\",\n subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__[\"bbdVersion\"]}`,\n footer\n } = options;\n const ce = _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement;\n const changelogItems = [ce(\"img\", {\n src: image\n })];\n if (description) changelogItems.push(ce(\"p\", null, MarkdownParser.parse(description)));\n\n for (let c = 0; c < changes.length; c++) {\n const entry = changes[c];\n const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;\n const margin = c == 0 ? ChangelogClasses.marginTop : \"\";\n changelogItems.push(ce(\"h1\", {\n className: `${type} ${margin}`\n }, entry.title));\n const list = ce(\"ul\", null, entry.items.map(i => ce(\"li\", null, MarkdownParser.parse(i))));\n changelogItems.push(list);\n }\n\n const renderHeader = function () {\n return ce(FlexChild.Child, {\n grow: 1,\n shrink: 1\n }, ce(Titles.default, {\n tag: Titles.Tags.H4\n }, title), ce(TextElement, {\n size: TextElement.Sizes.SMALL,\n color: TextElement.Colors.STANDARD,\n className: ChangelogClasses.date\n }, subtitle));\n };\n\n const renderFooter = () => {\n const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.displayName == \"Anchor\");\n const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"anchorUnderlineOnHover\") || {\n anchor: \"anchor-3Z-8Bb\",\n anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"\n };\n\n const joinSupportServer = click => {\n click.preventDefault();\n click.stopPropagation();\n ModalStack.pop();\n _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].joinBD2();\n };\n\n const supportLink = Anchor ? ce(Anchor, {\n onClick: joinSupportServer\n }, \"Join our Discord Server.\") : ce(\"a\", {\n className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,\n onClick: joinSupportServer\n }, \"Join our Discord Server.\");\n const defaultFooter = ce(TextElement, {\n size: TextElement.Sizes.SMALL,\n color: TextElement.Colors.STANDARD\n }, \"Need support? \", supportLink);\n return ce(FlexChild.Child, {\n grow: 1,\n shrink: 1\n }, footer ? footer : defaultFooter);\n };\n\n return ModalStack.push(function (props) {\n return ce(Changelog, Object.assign({\n className: ChangelogClasses.container,\n selectable: true,\n onScroll: _ => _,\n onClose: _ => _,\n renderHeader: renderHeader,\n renderFooter: renderFooter,\n children: changelogItems\n }, props));\n });\n }\n /**\r\n * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.\r\n * @param {string} title - title of the modal\r\n * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.\r\n * @param {object} [options] - options to modify the modal\r\n * @param {boolean} [options.danger=false] - whether the main button should be red or not\r\n * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button\r\n * @param {string} [options.cancelText=Cancel] - text for the cancel button\r\n * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button\r\n * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button\r\n * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned\r\n * @returns {string} - the key used for this modal\r\n */\n\n\n static showConfirmationModal(title, content, options = {}) {\n const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].findByDisplayName(\"Markdown\");\n const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__[\"default\"].find(m => m.defaultProps && m.key && m.key() == \"confirm-modal\");\n if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content);\n\n const emptyFunction = () => {};\n\n const {\n onConfirm = emptyFunction,\n onCancel = emptyFunction,\n confirmText = \"Okay\",\n cancelText = \"Cancel\",\n danger = false,\n key = undefined\n } = options;\n if (!Array.isArray(content)) content = [content];\n content = content.map(c => typeof c === \"string\" ? _v2__WEBPACK_IMPORTED_MODULE_2__[\"default\"].React.createElement(Markdown, null, c) : c);\n return ModalStack.push(ConfirmationModal, {\n header: title,\n children: content,\n red: danger,\n confirmText: confirmText,\n cancelText: cancelText,\n onConfirm: onConfirm,\n onCancel: onCancel\n }, key);\n }\n\n}\nUtils.showToast = Utils.suppressErrors(Utils.showToast, \"Could not show toast.\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy91dGlscy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy91dGlscy5qcz9jMGY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlscyB7XG4gIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cbiAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgfVxuICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xuXG5cbiAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgZnJhbWU6IHNldHRpbmdzQ29va2llLmZyYW1lXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xuICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gc2V0dGluZ3NDb29raWUuZnJhbWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBzZXR0aW5nc0Nvb2tpZS5mcmFtZSA9IHZhbHVlO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgc3RhdGljIGdldFRleHRBcmVhKCkge1xuICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIgKyBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYS5zcGxpdChcIiBcIilbMF0gKyBcIiB0ZXh0YXJlYVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XG4gICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xuICB9XG5cbiAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6IHJlZDtcIiwgXCJcIik7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZXNjYXBlKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbiAgfVxuXG4gIHN0YXRpYyB0ZXN0SlNPTihkYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWV0aG9kKC4uLnBhcmFtcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBiZWZvcmUsXG4gICAgICBhZnRlcixcbiAgICAgIGluc3RlYWQsXG4gICAgICBvbmNlID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIGZvcmNlID0gZmFsc2VcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbiAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0pIHtcbiAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHt9O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcblxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInVucGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXG4gICAgICB3aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcbiAgICB9O1xuXG4gICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXG4gICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxuICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcbiAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RlYWQpIHtcbiAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XG4gICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25jZSkgY2FuY2VsKCk7XG4gICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcbiAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XG4gICAgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcbiAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XG5cbiAgICAgIHdoYXRbbWV0aG9kTmFtZV0udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjYW5jZWw7XG4gIH1cblxuICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcbiAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuXG4gICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xuICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7XG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgY2hpbGRMaXN0OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XG4gICAgfSwgb2JqKTtcbiAgfVxuICAvKipcclxuICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgQ2hhbmdlcyB0aGUgdHlwZSBvZiB0aGUgdG9hc3Qgc3R5bGlzdGljYWxseSBhbmQgc2VtYW50aWNhbGx5LiBDaG9pY2VzOiBcIlwiLCBcImluZm9cIiwgXCJzdWNjZXNzXCIsIFwiZGFuZ2VyXCIvXCJlcnJvclwiLCBcIndhcm5pbmdcIi9cIndhcm5cIi4gRGVmYXVsdDogXCJcIlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcclxuICAgKi9cblxuXG4gIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIiArIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXIgJiYgZS5oYXNOb3RpY2UpWzBdLnNpZGViYXIuc3BsaXQoXCIgXCIpWzldICsgXCIgKyBkaXZcIikgfHwgbnVsbDtcbiAgICAgIGNvbnN0IG1lbWJlcmxpc3QgPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5cIiArIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lbWJlcnNXcmFwKVswXS5tZW1iZXJzV3JhcCkgOiBudWxsO1xuICAgICAgY29uc3QgZm9ybSA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiZm9ybVwiKSA6IG51bGw7XG4gICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAzMTA7XG4gICAgICBjb25zdCByaWdodCA9IG1lbWJlcmxpc3QgPyBtZW1iZXJsaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAwO1xuICAgICAgY29uc3Qgd2lkdGggPSByaWdodCA/IHJpZ2h0IC0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiBVdGlscy5zY3JlZW5XaWR0aCAtIGxlZnQgLSAyNDA7XG4gICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcbiAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0c1wiKTtcbiAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgbGVmdCArIFwicHhcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XG4gICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJib3R0b21cIiwgYm90dG9tICsgXCJweFwiKTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgdHlwZSA9IFwiXCIsXG4gICAgICBpY29uID0gdHJ1ZSxcbiAgICAgIHRpbWVvdXQgPSAzMDAwXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xuICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XG4gICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xuICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfVxuXG4gIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xuICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF07XG4gICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdO1xuICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXTtcbiAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiR7dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfSk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMzAwKTtcbiAgICB9KTtcbiAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XG4gICAgY29uc3QgY2xvc2luZ0xpc3RlbmVycyA9IFtdO1xuICAgIHJldHVybiB7XG4gICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbW9kYWwucmVtb3ZlKCk7XG4gICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9LFxuICAgICAgb25DbG9zZTogbGlzdGVuZXIgPT4ge1xuICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe1xuICAgIHBsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLFxuICAgIHRoZW1lczogdGhlbWVFcnJvcnMgPSBbXVxuICB9KSB7XG4gICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XG4gICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcbiAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdO1xuICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXTtcbiAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF07XG4gICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgYmQtY29udGVudC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5QbHVnaW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPk1lc3NhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yc1wiPmApO1xuXG4gICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+JHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xuXG4gICAgICAgIGlmIChlcnIuZXJyb3IpIHtcbiAgICAgICAgICBlcnJvci5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGBFcnJvciBkZXRhaWxzIGZvciAke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX0uYCwgZXJyLmVycm9yKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJzID0gW2dlbmVyYXRlVGFiKHBsdWdpbkVycm9ycyksIGdlbmVyYXRlVGFiKHRoZW1lRXJyb3JzKV07XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xuICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XG4gICAgICBET00uYWRkQ2xhc3MoZS50YXJnZXQsIFwic2VsZWN0ZWRcIik7XG4gICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XG4gICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgc2Nyb2xsZXIuYXBwZW5kKHRhYnNbRE9NLmluZGV4KGUudGFyZ2V0KV0pO1xuICAgIH0pKTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9KTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBtb2RhbC5yZW1vdmUoKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfSk7XG4gICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO2Vsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcbiAgfVxuXG4gIHN0YXRpYyBzaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XG4gICAgY29uc3QgQ2hhbmdlbG9nQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZml4ZWRcIiwgXCJpbXByb3ZlZFwiKTtcbiAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcbiAgICBjb25zdCBGbGV4Q2hpbGQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIkNoaWxkXCIpO1xuICAgIGNvbnN0IFRpdGxlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiVGFnc1wiLCBcImRlZmF1bHRcIik7XG4gICAgY29uc3QgQ2hhbmdlbG9nID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLnNlbGVjdGFibGUgPT0gZmFsc2UpO1xuICAgIGNvbnN0IE1hcmtkb3duUGFyc2VyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJkZWZhdWx0UnVsZXNcIiwgXCJwYXJzZVwiKTtcbiAgICBpZiAoIUNoYW5nZWxvZyB8fCAhTW9kYWxTdGFjayB8fCAhQ2hhbmdlbG9nQ2xhc3NlcyB8fCAhVGV4dEVsZW1lbnQgfHwgIUZsZXhDaGlsZCB8fCAhVGl0bGVzIHx8ICFNYXJrZG93blBhcnNlcikgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsXG4gICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsXG4gICAgICBjaGFuZ2VzID0gW10sXG4gICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLFxuICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLFxuICAgICAgZm9vdGVyXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge1xuICAgICAgc3JjOiBpbWFnZVxuICAgIH0pXTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xuXG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFuZ2VzLmxlbmd0aDsgYysrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XG4gICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xuICAgICAgY29uc3QgbWFyZ2luID0gYyA9PSAwID8gQ2hhbmdlbG9nQ2xhc3Nlcy5tYXJnaW5Ub3AgOiBcIlwiO1xuICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gXG4gICAgICB9LCBlbnRyeS50aXRsZSkpO1xuICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcbiAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge1xuICAgICAgICBncm93OiAxLFxuICAgICAgICBzaHJpbms6IDFcbiAgICAgIH0sIGNlKFRpdGxlcy5kZWZhdWx0LCB7XG4gICAgICAgIHRhZzogVGl0bGVzLlRhZ3MuSDRcbiAgICAgIH0sIHRpdGxlKSwgY2UoVGV4dEVsZW1lbnQsIHtcbiAgICAgICAgc2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsXG4gICAgICAgIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkQsXG4gICAgICAgIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5kYXRlXG4gICAgICB9LCBzdWJ0aXRsZSkpO1xuICAgIH07XG5cbiAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge1xuICAgICAgICBhbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLFxuICAgICAgICBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gY2xpY2sgPT4ge1xuICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcbiAgICAgICAgQkRWMi5qb2luQkQyKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge1xuICAgICAgICBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlclxuICAgICAgfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLFxuICAgICAgICBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlclxuICAgICAgfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XG4gICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQsIHtcbiAgICAgICAgc2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsXG4gICAgICAgIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkRcbiAgICAgIH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xuICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge1xuICAgICAgICBncm93OiAxLFxuICAgICAgICBzaHJpbms6IDFcbiAgICAgIH0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5jb250YWluZXIsXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXG4gICAgICAgIG9uQ2xvc2U6IF8gPT4gXyxcbiAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXG4gICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICBjaGlsZHJlbjogY2hhbmdlbG9nSXRlbXNcbiAgICAgIH0sIHByb3BzKSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXHJcbiAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gICAqL1xuXG5cbiAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XG4gICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xuICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0ua2V5ICYmIG0ua2V5KCkgPT0gXCJjb25maXJtLW1vZGFsXCIpO1xuICAgIGlmICghTW9kYWxTdGFjayB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xuXG4gICAgY29uc3Qge1xuICAgICAgb25Db25maXJtID0gZW1wdHlGdW5jdGlvbixcbiAgICAgIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbixcbiAgICAgIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsXG4gICAgICBjYW5jZWxUZXh0ID0gXCJDYW5jZWxcIixcbiAgICAgIGRhbmdlciA9IGZhbHNlLFxuICAgICAga2V5ID0gdW5kZWZpbmVkXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xuICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZiBjID09PSBcInN0cmluZ1wiID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtkb3duLCBudWxsLCBjKSA6IGMpO1xuICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goQ29uZmlybWF0aW9uTW9kYWwsIHtcbiAgICAgIGhlYWRlcjogdGl0bGUsXG4gICAgICBjaGlsZHJlbjogY29udGVudCxcbiAgICAgIHJlZDogZGFuZ2VyLFxuICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXG4gICAgfSwga2V5KTtcbiAgfVxuXG59XG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/modules/utils.js\n"); /***/ }), @@ -623,7 +623,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return V2C_PresenceSettings; });\n/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ \"./src/ui/settingsTitle.js\");\n/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ \"./src/ui/settingsGroup.js\");\n/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ \"./src/modules/dataStore.js\");\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ \"./src/modules/CustomRichPresence.js\");\n/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ \"./src/ui/select.jsx\");\n/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ \"./src/ui/timestampRender.js\");\n\n\n\n\n\n\n\n\n/**\r\n * @type {typeof import(\"react\")}\r\n */\n\nconst React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__[\"default\"].React;\nclass V2C_PresenceSettings extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getSettingGroup(\"rpc\") || _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"],\n assets: []\n };\n this.preview = null;\n this.isfetching = false;\n\n if (this.state.data.application_id) {\n this.fetchAssets();\n }\n }\n /**\r\n * \r\n * @param {InputText} setting \r\n */\n\n\n onChange(setting, value) {\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id);\n this.setState({\n data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"], this.state.data, {\n [defaultSetting.id]: !!value ? value : null\n }),\n assets: this.state.assets\n });\n\n if (setting.props.id === \"application_id\") {\n this.fetchAssets();\n }\n\n _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__[\"default\"].setSettingGroup(\"rpc\", _0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"]);\n this.preview.forceUpdate();\n _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"]);\n }\n\n fetchAssets() {\n if (this.isfetching === true) {\n let app = this.state.data.application_id;\n setTimeout(() => {\n if (this.state.data.application_id !== app) {\n return;\n }\n\n this.fetchAssets();\n }, 5000);\n }\n\n if (!this.state.data.application_id) {\n this.setState({\n data: this.state.data,\n assets: []\n });\n return;\n }\n\n this.isfetching = true;\n _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__[\"default\"].fetchAssets(this.state.data.application_id).then(assets => {\n this.isfetching = false;\n this.setState({\n data: this.state.data,\n assets: Object.keys(assets).map(k => {\n let asset = assets[k];\n return {\n id: asset.id,\n name: asset.name,\n type: asset.type\n };\n })\n });\n this.forceUpdate();\n }).catch(() => {\n this.isfetching = false;\n this.setState({\n data: this.state.data,\n assets: []\n });\n this.forceUpdate();\n });\n }\n\n updatePreview(data) {\n this.setState({\n data\n });\n }\n\n render() {\n let contentModule = BDModules.get(e => e.contentColumn)[0];\n return React.createElement(\"div\", {\n className: contentModule.contentColumn + \" \" + contentModule.contentColumnDefault + \" content-column default\",\n style: {\n padding: \"60px 40px 0px\"\n }\n }, React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n title: \"RichPresence Settings\",\n settings: this.props.settings,\n onChange: this.props.onChange\n }), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n text: \"RichPresence\"\n }), React.createElement(\"div\", null, RPCProps.map(e => {\n if (e.type === \"text\") {\n return React.createElement(InputText, {\n setting: e,\n manager: this,\n id: e.id\n });\n } else if (e.type === \"number\") {\n let array = [React.createElement(InputNumber, {\n setting: e,\n manager: this,\n id: e.id\n })];\n /*\r\n if(e.id === \"timestamps.start\"){\r\n array.unshift( {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} />)\r\n }*/\n\n return array;\n } else if (e.type === \"choice\") {\n if ([\"assets.small\", \"assets.large\"].includes(e.id)) {\n return React.createElement(InputChoice, {\n setting: e,\n manager: this,\n id: e.id,\n choices: [{\n value: \"none\",\n label: \"No assets\"\n }].concat(this.state.assets.map(e => {\n return {\n value: \"asset-\" + e.id,\n label: e.name\n };\n }))\n });\n } else {\n return \"Unknown choice.\";\n }\n }\n })), React.createElement(\"div\", null, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n text: \"Preview\"\n }), React.createElement(RpcPreview, {\n settings: this\n })), React.createElement(\"div\", {\n className: BDModules.get(e => e.marginBottom20)[0].marginBottom20\n }));\n }\n\n}\nconst RPCProps = [{\n title: \"Application ID\",\n id: \"application_id\",\n type: \"number\"\n}, {\n title: \"Name\",\n id: \"name\",\n type: \"text\"\n}, {\n title: \"Details\",\n id: \"details\",\n type: \"text\"\n}, {\n title: \"State\",\n id: \"state\",\n type: \"text\"\n}, {\n title: \"Timestamp Start\",\n id: \"timestamps.start\",\n type: \"number\"\n}, {\n title: \"LargeAsset\",\n id: \"assets.large\",\n type: \"choice\"\n}, {\n title: \"SmallAsset\",\n id: \"assets.small\",\n type: \"choice\"\n}];\n\nclass InputText extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let inputModule = BDModules.get(e => e.inputMini)[0];\n let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(\"div\", {\n className: inputModule.inputWrapper\n }, React.createElement(\"input\", {\n class: `${inputModule.inputDefault} ${sizeModule2.size16}`,\n name: \"state\",\n type: \"text\",\n placeholder: \"\",\n maxlength: \"999\",\n value: this.props.manager.state.data[setting.id],\n onChange: ev => {\n this.props.manager.onChange(this, ev.target.value);\n }\n }))), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass InputNumber extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let inputModule = BDModules.get(e => e.inputMini)[0];\n let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];\n let euhModule1 = BDModules.get(e => e.colorTransparent)[0];\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(\"div\", {\n className: inputModule.inputWrapper\n }, React.createElement(\"input\", {\n class: `${inputModule.inputDefault} ${sizeModule2.size16}`,\n name: \"state\",\n type: \"text\",\n placeholder: \"\",\n maxlength: \"999\",\n value: this.props.manager.state.data[setting.id],\n onChange: ev => {\n let newValue = ev.target.value.replace(/[^\\d]+/g, \"\");\n\n if (newValue !== ev.target.value) {\n ev.target.value = newValue;\n }\n\n this.props.manager.onChange(this, newValue);\n }\n })), setting.id === \"timestamps.start\" ? React.createElement(\"div\", {\n className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper\n }, React.createElement(\"button\", {\n type: \"button\",\n class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,\n style: {\n flex: \"0 1 auto\"\n },\n onClick: () => {\n DiscordNative.clipboard.copy(Date.now() + \"\");\n }\n }, React.createElement(\"div\", {\n class: euhModule1.contents\n }, \"Copy current timestamp\"))) : null), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass InputChoice extends React.Component {\n onChange(data) {\n this.props.manager.onChange(this, data.value === \"none\" ? null : data.value.replace(\"asset-\", \"\"));\n }\n\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let options = this.props.choices;\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(_select__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n value: \"asset-\" + this.props.manager.state.data[setting.id] || false,\n onChange: this.onChange.bind(this),\n options: options\n })), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass DiscordButton extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let euhModule1 = BDModules.get(e => e.colorTransparent)[0];\n let options = this.props.choices;\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"div\", {\n className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper\n }, React.createElement(\"button\", {\n type: \"button\",\n class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,\n style: {\n flex: \"0 1 auto\"\n },\n onClick: this.onClick\n }, React.createElement(\"div\", {\n class: euhModule1.contents\n }, this.props.title)))));\n }\n\n}\n\nclass RpcPreview extends React.Component {\n constructor(props = {}) {\n super(props);\n this.state = {\n active: \"profile\"\n };\n this.tabs = [];\n this.props.settings.preview = this;\n }\n\n changeTab(tab) {\n let ancientTab = this.state.active;\n if (ancientTab === tab.props.id) return;\n this.tabs.forEach(e => {\n e.setActive(false);\n });\n tab.setActive(true);\n this.setState({\n active: tab.props.id\n });\n }\n\n render() {\n let preview = new this.preview({\n preview: this\n });\n preview.setState(this.state.rpc);\n return React.createElement(\"div\", {\n className: \"lc-tabWrapper\"\n }, React.createElement(\"div\", {\n className: \"lc-tabnav\",\n style: {\n flex: \"0 1 auto\"\n }\n }, React.createElement(Tab, {\n preview: this,\n title: \"Full Profile\",\n id: \"profile\"\n }), React.createElement(Tab, {\n preview: this,\n title: \"User Popout\",\n id: \"popout\"\n })), preview.render());\n }\n\n isActive(tab) {\n return this.state.active === tab;\n }\n\n get preview() {\n if (this.state.active === \"profile\") return Profile;\n return Popout;\n }\n\n}\n\nclass Tab extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n active: props.preview.isActive(props.id)\n };\n props.preview.tabs.push(this);\n }\n\n setActive(isActive) {\n this.setState({\n active: !!isActive\n });\n }\n\n render() {\n let className = `lc-navItem`;\n\n if (this.state.active) {\n className += ` lc-navItemActive`;\n } else {\n className += ` lc-navItemInactive`;\n }\n\n return React.createElement(\"div\", {\n className: className,\n onClick: () => {\n this.props.preview.changeTab(this);\n }\n }, this.props.title);\n }\n\n}\n\nclass Popout extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let avatarURL = user.getAvatarURL(user.avatar.startsWith(\"a_\") ? \"gif\" : \"png\");\n let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1] = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0]];\n let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"], this.props.preview.props.settings.state.data);\n timestampClass = timestampClass || activityModule1.timestamp;\n return React.createElement(\"div\", {\n className: \"lc-userPopout\"\n }, React.createElement(\"div\", {\n class: rootModule1.userPopout,\n role: \"dialog\",\n tabindex: \"-1\"\n }, React.createElement(\"div\", {\n class: rootModule1.headerPlaying\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: rootModule1.avatarWrapperNormal,\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"div\", {\n class: avatarModule1,\n role: \"img\",\n style: {\n width: \"80px\",\n height: \"80px\"\n }\n }, React.createElement(\"svg\", {\n width: \"92\",\n height: \"80\",\n viewBox: \"0 0 92 80\",\n class: `${avatarModule1.mask} ${avatarModule1.svg}`\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"img\", {\n src: avatarURL,\n alt: \" \",\n class: avatarModule1.avatar\n })), React.createElement(Status, null))), React.createElement(\"svg\", {\n width: \"80\",\n height: \"80\",\n class: rootModule1.avatarHint,\n viewBox: \"0 0 80 80\"\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"div\", {\n class: rootModule1.avatarHintInner\n }, Messages.VIEW_PROFILE)))), React.createElement(\"div\", {\n class: rootModule1.headerText\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`\n }, React.createElement(\"span\", {\n class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`\n }, user.username), React.createElement(\"span\", null, \"#\", user.discriminator))))), React.createElement(\"div\", {\n class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`\n }, React.createElement(\"h3\", {\n class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`\n }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement(\"div\", {\n class: activityModule1.bodyNormal\n }, (() => {\n if (!data[\"assets.large\"]) return null;\n let images = [];\n\n if (data[\"assets.large\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.large\"]}.png`,\n class: `${activityModule1.assetsLargeImageUserPopout} ${data[\"assets.small\"] ? activityModule1.assetsLargeMaskUserPopout : \"\"}`\n }));\n }\n\n if (data[\"assets.small\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.small\"]}.png`,\n class: activityModule1.assetsSmallImageUserPopout\n }));\n }\n\n return React.createElement(\"div\", {\n class: activityModule1.assets\n }, images);\n })(), React.createElement(\"div\", {\n class: activityModule1.contentImagesUserPopout,\n style: {\n flex: \"1 1 auto\"\n }\n }, (() => {\n if (!data.name) return null;\n return React.createElement(\"h3\", {\n class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,\n title: data.name\n }, React.createElement(\"span\", {\n class: activityModule1.activityName\n }, data.name));\n })(), (() => {\n if (!data.details) return null;\n return React.createElement(\"div\", {\n title: data.title,\n class: activityModule1.details\n }, data.details);\n })(), (() => {\n if (!data.state) return null;\n return React.createElement(\"div\", {\n class: activityModule1.state\n }, React.createElement(\"span\", {\n title: data.state\n }, data.state));\n })(), (() => {\n if (!data[\"timestamps.start\"]) return null;\n let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(Timestamp, Messages);\n return React.createElement(\"div\", {\n class: activityModule1.timestamp\n }, React.createElement(timeComponent, {\n timestamps: {\n end: null,\n start: data[\"timestamps.start\"]\n }\n }));\n })())))), React.createElement(\"div\", {\n class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`\n }, React.createElement(\"div\", {\n class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`\n }, React.createElement(\"div\", {\n class: rootModule1.bodyTitle\n }, Messages.NOTE), React.createElement(\"div\", {\n class: `${noteModule1.note} ${rootModule1.note}`\n }, React.createElement(\"textarea\", {\n placeholder: Messages.NOTE_PLACEHOLDER,\n maxlength: \"256\",\n autocorrect: \"off\",\n class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,\n style: {\n height: \"36px\"\n },\n disabled: true\n })))), React.createElement(\"div\", {\n class: rootModule1.footer\n }, React.createElement(\"div\", {\n class: `${rootModule1.protip} ${protipModule1.inline}`\n }, React.createElement(\"h3\", {\n class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,\n style: {\n color: \"rgb(67, 181, 129)\"\n }\n }, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement(\"div\", {\n class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`\n }, Messages.CONTEXT_MENU_HINT)))));\n }\n\n}\n\nclass Status extends React.Component {\n render() {\n let status = BDModules.get(e => e.default && e.default.getPresence)[0].default.getPresence().status;\n if (status === \"invisible\") status = \"offline\";\n let className = BDModules.get(e => e.pointerEvents)[0].pointerEvents;\n return React.createElement(\"rect\", {\n width: \"16\",\n height: \"16\",\n x: \"60\",\n y: \"60\",\n fill: \"#ffffff\",\n mask: `url(#svg-mask-status-${status})`,\n className: className\n });\n }\n\n}\n\nlet timestampClass = \"\";\n\nclass Profile extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let avatarURL = user.getAvatarURL(user.avatar.startsWith(\"a_\") ? \"gif\" : \"png\");\n let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages];\n let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"], this.props.preview.props.settings.state.data);\n timestampClass = timestampClass || activityModule1.timestamp;\n return [React.createElement(\"div\", {\n className: \"lc-tab\"\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: rootModule1.topSectionPlaying\n }, React.createElement(\"header\", {\n class: rootModule1.header\n }, React.createElement(\"div\", {\n class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,\n role: \"img\",\n style: {\n width: \"80px\",\n height: \"80px\"\n }\n }, React.createElement(\"svg\", {\n width: \"92\",\n height: \"80\",\n viewBox: \"0 0 92 80\",\n class: `${avatarModule1.mask} ${avatarModule1.svg}`\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"img\", {\n src: avatarURL,\n alt: \" \",\n class: avatarModule1.avatar\n })), React.createElement(Status, null))), React.createElement(\"div\", {\n class: `${rootModule1.headerInfo}`\n }, React.createElement(\"div\", {\n class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`\n }, React.createElement(\"span\", {\n class: `${rootModule1.username} ${rootModule1.username}`\n }, user.username), React.createElement(\"span\", {\n class: rootModule1.discriminator\n }, \"#\", user.discriminator)), React.createElement(\"div\", {\n class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(Badges, null)))), React.createElement(\"div\", {\n class: rootModule1.headerFill\n }, React.createElement(\"div\", {\n class: `${activityModule1.activityProfile} ${rootModule1.activity}`\n }, React.createElement(\"h3\", {\n class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`\n }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement(\"div\", {\n class: activityModule1.bodyNormal\n }, (() => {\n if (!data[\"assets.large\"]) return null;\n let images = [];\n\n if (data[\"assets.large\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.large\"]}.png`,\n class: `${activityModule1.assetsLargeImageProfile} ${data[\"assets.small\"] ? activityModule1.assetsLargeMaskProfile : \"\"}`\n }));\n }\n\n if (data[\"assets.small\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.small\"]}.png`,\n class: activityModule1.assetsSmallImageProfile\n }));\n }\n\n return React.createElement(\"div\", {\n class: activityModule1.assets\n }, images);\n })(), React.createElement(\"div\", {\n class: activityModule1.contentImagesProfile,\n style: {\n flex: \"1 1 auto\"\n }\n }, (() => {\n if (!data.name) return null;\n return React.createElement(\"h3\", {\n class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,\n title: data.name\n }, React.createElement(\"span\", {\n class: activityModule1.activityName\n }, data.name));\n })(), (() => {\n if (!data.details) return null;\n return React.createElement(\"div\", {\n title: data.title,\n class: activityModule1.details\n }, data.details);\n })(), (() => {\n if (!data.state) return null;\n return React.createElement(\"div\", {\n class: activityModule1.state\n }, React.createElement(\"span\", {\n title: data.state\n }, data.state));\n })(), (() => {\n if (!data[\"timestamps.start\"]) return null;\n let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(Timestamp, Messages);\n return React.createElement(\"div\", {\n class: activityModule1.timestamp\n }, React.createElement(timeComponent, {\n timestamps: {\n end: null,\n start: data[\"timestamps.start\"]\n }\n }));\n })()))))), React.createElement(\"div\", {\n class: rootModule1.body\n }, React.createElement(\"div\", {\n class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`\n }, React.createElement(\"div\", {\n class: scrollerModule1.scroller\n }, React.createElement(\"div\", {\n class: rootModule1.userInfoSection\n }, React.createElement(\"div\", {\n class: rootModule1.userInfoSectionHeader\n }, Messages.NOTE), React.createElement(\"div\", {\n class: `${rootModule1.note} ${noteModule1.note}`\n }, React.createElement(\"textarea\", {\n placeholder: Messages.NOTE_PLACEHOLDER,\n maxlength: \"256\",\n autocorrect: \"off\",\n class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,\n style: {\n height: \"40px\"\n },\n disabled: true\n }))), React.createElement(ConnectedAccounts, null)))))), React.createElement(\"div\", {\n class: \"lc- \"\n })];\n }\n\n}\n\nclass ConnectedAccounts extends React.Component {\n render() {\n let accounts = [];\n let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];\n let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default;\n let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1);\n\n for (let acc of accs) {\n accounts.push(React.createElement(ConnectedAccount, {\n acc: acc\n }));\n }\n\n if (accounts.length > 0) {\n return React.createElement(\"div\", {\n class: rootModule1.userInfoSection\n }, React.createElement(\"div\", {\n class: rootModule1.connectedAccounts\n }, accounts));\n }\n\n return null;\n }\n\n}\n\nclass ConnectedAccount extends React.Component {\n render() {\n let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default];\n let acc = this.props.acc;\n let constantsSocial = SocialConstants.get(acc.type);\n return React.createElement(\"div\", {\n class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,\n style: {\n flex: \"0 1 auto\"\n }\n }, React.createElement(\"img\", {\n alt: `Logo ${constantsSocial.name}`,\n class: rootModule1.connectedAccountIcon,\n src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey\n }), React.createElement(\"div\", {\n class: rootModule1.connectedAccountNameInner\n }, React.createElement(\"div\", {\n class: rootModule1.connectedAccountName\n }, acc.name), acc.verified ? React.createElement(\"span\", null, React.createElement(\"div\", {\n class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, React.createElement(\"svg\", {\n class: flowerModule1.flowerStar,\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 16 15.2\"\n }, React.createElement(\"path\", {\n fill: \"#4f545c\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), React.createElement(\"div\", {\n class: flowerModule1.childContainer\n }, React.createElement(\"svg\", {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 16 15.2\"\n }, React.createElement(\"path\", {\n d: \"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\",\n fill: \"#ffffff\"\n }))))) : null), React.createElement(\"a\", {\n class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,\n rel: \"noreferrer noopener\",\n target: \"_blank\",\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"svg\", {\n class: rootModule1.connectedAccountOpenIcon,\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\"\n }, React.createElement(\"path\", {\n fill: \"currentColor\",\n d: \"M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z\"\n }), React.createElement(\"path\", {\n fill: \"currentColor\",\n d: \"M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z\"\n }))));\n }\n\n}\n\nclass Badges extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let rootModule = BDModules.get(e => e.topSectionStreaming)[0];\n let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags;\n let badges = [];\n let serialized = [];\n\n for (let flagName in UserFlags) {\n if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName);\n }\n\n for (let flagName of serialized) {\n let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, \" \").split(\" \").map(e => e[0].toUpperCase() + e.slice(1)).join(\"\")}`;\n searchable = searchable.replace(\"HypesquadOnline\", \"HypeSquadOnline\");\n if (!rootModule[searchable]) continue;\n badges.push(React.createElement(Badge, {\n name: searchable\n }));\n }\n\n if (user.hasPremiumSubscription) {\n badges.push(React.createElement(Badge, {\n name: \"profileBadgePremium\"\n }));\n }\n\n return badges;\n }\n\n}\n\nclass Badge extends React.Component {\n render() {\n let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];\n return React.createElement(\"div\", {\n class: rootModule1.profileBadgeWrapper\n }, React.createElement(\"div\", null, React.createElement(\"div\", {\n class: \"\",\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"div\", {\n class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`\n }))));\n }\n\n}\n\nclass Timestamp extends React.Component {\n render() {\n return React.createElement(\"div\", {\n className: timestampClass\n }, this.props.message);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3guanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4P2NlZWYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xuaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi9zZWxlY3RcIjtcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCI7XG4vKipcclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cclxuICovXG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRhdGE6IGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikgfHwgZGVmYXVsdFJQQyxcbiAgICAgIGFzc2V0czogW11cbiAgICB9O1xuICAgIHRoaXMucHJldmlldyA9IG51bGw7XG4gICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKSB7XG4gICAgICB0aGlzLmZldGNoQXNzZXRzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAqL1xuXG5cbiAgb25DaGFuZ2Uoc2V0dGluZywgdmFsdWUpIHtcbiAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcbiAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxuICAgICAgfSksXG4gICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXG4gICAgfSk7XG5cbiAgICBpZiAoc2V0dGluZy5wcm9wcy5pZCA9PT0gXCJhcHBsaWNhdGlvbl9pZFwiKSB7XG4gICAgICB0aGlzLmZldGNoQXNzZXRzKCk7XG4gICAgfVxuXG4gICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XG4gICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKCk7XG4gICAgQ3VzdG9tUmljaFByZXNlbmNlLnNldChzZXR0aW5nc1JQQyk7XG4gIH1cblxuICBmZXRjaEFzc2V0cygpIHtcbiAgICBpZiAodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKSB7XG4gICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKTtcbiAgICAgIH0sIDUwMDApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICBhc3NldHM6IFtdXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlO1xuICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpLnRoZW4oYXNzZXRzID0+IHtcbiAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgYXNzZXRzOiBPYmplY3Qua2V5cyhhc3NldHMpLm1hcChrID0+IHtcbiAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgYXNzZXRzOiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVQcmV2aWV3KGRhdGEpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBsZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uICsgXCIgXCIgKyBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0ICsgXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19TZXR0aW5nc0dyb3VwLCB7XG4gICAgICB0aXRsZTogXCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIixcbiAgICAgIHNldHRpbmdzOiB0aGlzLnByb3BzLnNldHRpbmdzLFxuICAgICAgb25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2VcbiAgICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChWMkNfU2V0dGluZ3NUaXRsZSwge1xuICAgICAgdGV4dDogXCJSaWNoUHJlc2VuY2VcIlxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIFJQQ1Byb3BzLm1hcChlID0+IHtcbiAgICAgIGlmIChlLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KElucHV0VGV4dCwge1xuICAgICAgICAgIHNldHRpbmc6IGUsXG4gICAgICAgICAgbWFuYWdlcjogdGhpcyxcbiAgICAgICAgICBpZDogZS5pZFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGxldCBhcnJheSA9IFtSZWFjdC5jcmVhdGVFbGVtZW50KElucHV0TnVtYmVyLCB7XG4gICAgICAgICAgc2V0dGluZzogZSxcbiAgICAgICAgICBtYW5hZ2VyOiB0aGlzLFxuICAgICAgICAgIGlkOiBlLmlkXG4gICAgICAgIH0pXTtcbiAgICAgICAgLypcclxuICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgfSovXG5cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09IFwiY2hvaWNlXCIpIHtcbiAgICAgICAgaWYgKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSkge1xuICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KElucHV0Q2hvaWNlLCB7XG4gICAgICAgICAgICBzZXR0aW5nOiBlLFxuICAgICAgICAgICAgbWFuYWdlcjogdGhpcyxcbiAgICAgICAgICAgIGlkOiBlLmlkLFxuICAgICAgICAgICAgY2hvaWNlczogW3tcbiAgICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxuICAgICAgICAgICAgICBsYWJlbDogXCJObyBhc3NldHNcIlxuICAgICAgICAgICAgfV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIiArIGUuaWQsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgUmVhY3QuY3JlYXRlRWxlbWVudChWMkNfU2V0dGluZ3NUaXRsZSwge1xuICAgICAgdGV4dDogXCJQcmV2aWV3XCJcbiAgICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChScGNQcmV2aWV3LCB7XG4gICAgICBzZXR0aW5nczogdGhpc1xuICAgIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMFxuICAgIH0pKTtcbiAgfVxuXG59XG5jb25zdCBSUENQcm9wcyA9IFt7XG4gIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXG4gIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXG4gIHR5cGU6IFwibnVtYmVyXCJcbn0sIHtcbiAgdGl0bGU6IFwiTmFtZVwiLFxuICBpZDogXCJuYW1lXCIsXG4gIHR5cGU6IFwidGV4dFwiXG59LCB7XG4gIHRpdGxlOiBcIkRldGFpbHNcIixcbiAgaWQ6IFwiZGV0YWlsc1wiLFxuICB0eXBlOiBcInRleHRcIlxufSwge1xuICB0aXRsZTogXCJTdGF0ZVwiLFxuICBpZDogXCJzdGF0ZVwiLFxuICB0eXBlOiBcInRleHRcIlxufSwge1xuICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcbiAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxuICB0eXBlOiBcIm51bWJlclwiXG59LCB7XG4gIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcbiAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXG4gIHR5cGU6IFwiY2hvaWNlXCJcbn0sIHtcbiAgdGl0bGU6IFwiU21hbGxBc3NldFwiLFxuICBpZDogXCJhc3NldHMuc21hbGxcIixcbiAgdHlwZTogXCJjaG9pY2VcIlxufV07XG5cbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZztcbiAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF07XG4gICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF07XG4gICAgbGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF07XG4gICAgbGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdO1xuICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdO1xuICAgIGxldCBpbnB1dE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF07XG4gICAgbGV0IHNpemVNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IHJvd01vZHVsZS5yb3cgKyBcIiBcIiArIG1hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImg1XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCArIFwiIFwiICsgc2l6ZU1vZHVsZS5zaXplMTQgKyBcIiBcIiArIG1hcmdpbk1vZHVsZTIuaDUgKyBcIiBcIiArIG1hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1XG4gICAgfSwgc2V0dGluZy50aXRsZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBpbnB1dE1vZHVsZS5pbnB1dFdyYXBwZXJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgICAgY2xhc3M6IGAke2lucHV0TW9kdWxlLmlucHV0RGVmYXVsdH0gJHtzaXplTW9kdWxlMi5zaXplMTZ9YCxcbiAgICAgIG5hbWU6IFwic3RhdGVcIixcbiAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgcGxhY2Vob2xkZXI6IFwiXCIsXG4gICAgICBtYXhsZW5ndGg6IFwiOTk5XCIsXG4gICAgICB2YWx1ZTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0sXG4gICAgICBvbkNoYW5nZTogZXYgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgZXYudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nO1xuICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXTtcbiAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF07XG4gICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF07XG4gICAgbGV0IGlucHV0TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdO1xuICAgIGxldCBldWhNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JUcmFuc3BhcmVudClbMF07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByb3dNb2R1bGUucm93ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNVwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQgKyBcIiBcIiArIHNpemVNb2R1bGUuc2l6ZTE0ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmg1ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNVxuICAgIH0sIHNldHRpbmcudGl0bGUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogaW5wdXRNb2R1bGUuaW5wdXRXcmFwcGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtpbnB1dE1vZHVsZS5pbnB1dERlZmF1bHR9ICR7c2l6ZU1vZHVsZTIuc2l6ZTE2fWAsXG4gICAgICBuYW1lOiBcInN0YXRlXCIsXG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgICAgbWF4bGVuZ3RoOiBcIjk5OVwiLFxuICAgICAgdmFsdWU6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdLFxuICAgICAgb25DaGFuZ2U6IGV2ID0+IHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gZXYudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1teXFxkXSsvZywgXCJcIik7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBldi50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfSkpLCBzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5idXR0b25XcmFwcGVyKVswXS5idXR0b25XcmFwcGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUuZmxleENoaWxkfSAke2V1aE1vZHVsZTEuYnV0dG9ufSAke2V1aE1vZHVsZTEubG9va0ZpbGxlZH0gJHtldWhNb2R1bGUxLmNvbG9yQnJhbmR9ICR7ZXVoTW9kdWxlMS5zaXplU21hbGx9ICR7ZXVoTW9kdWxlMS5ncm93fWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjAgMSBhdXRvXCJcbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKSArIFwiXCIpO1xuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGV1aE1vZHVsZTEuY29udGVudHNcbiAgICB9LCBcIkNvcHkgY3VycmVudCB0aW1lc3RhbXBcIikpKSA6IG51bGwpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgb25DaGFuZ2UoZGF0YSkge1xuICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBkYXRhLnZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiBkYXRhLnZhbHVlLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nO1xuICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXTtcbiAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF07XG4gICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF07XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLmNob2ljZXM7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByb3dNb2R1bGUucm93ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNVwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQgKyBcIiBcIiArIHNpemVNb2R1bGUuc2l6ZTE0ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmg1ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNVxuICAgIH0sIHNldHRpbmcudGl0bGUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdCwge1xuICAgICAgdmFsdWU6IFwiYXNzZXQtXCIgKyB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSB8fCBcIm5vbmVcIixcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmc7XG4gICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF07XG4gICAgbGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdO1xuICAgIGxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdO1xuICAgIGxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXTtcbiAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXTtcbiAgICBsZXQgZXVoTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdO1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5jaG9pY2VzO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogcm93TW9kdWxlLnJvdyArIFwiIFwiICsgbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuYnV0dG9uV3JhcHBlcilbMF0uYnV0dG9uV3JhcHBlclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIGNsYXNzOiBgJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH0gJHtldWhNb2R1bGUxLmJ1dHRvbn0gJHtldWhNb2R1bGUxLmxvb2tGaWxsZWR9ICR7ZXVoTW9kdWxlMS5jb2xvckJyYW5kfSAke2V1aE1vZHVsZTEuc2l6ZVNtYWxsfSAke2V1aE1vZHVsZTEuZ3Jvd31gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIwIDEgYXV0b1wiXG4gICAgICB9LFxuICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogZXVoTW9kdWxlMS5jb250ZW50c1xuICAgIH0sIHRoaXMucHJvcHMudGl0bGUpKSkpKTtcbiAgfVxuXG59XG5cbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXG4gICAgfTtcbiAgICB0aGlzLnRhYnMgPSBbXTtcbiAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzO1xuICB9XG5cbiAgY2hhbmdlVGFiKHRhYikge1xuICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmU7XG4gICAgaWYgKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZCkgcmV0dXJuO1xuICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xuICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH0pO1xuICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBwcmV2aWV3ID0gbmV3IHRoaXMucHJldmlldyh7XG4gICAgICBwcmV2aWV3OiB0aGlzXG4gICAgfSk7XG4gICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnN0YXRlLnJwYyk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYldyYXBwZXJcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYm5hdlwiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIwIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChUYWIsIHtcbiAgICAgIHByZXZpZXc6IHRoaXMsXG4gICAgICB0aXRsZTogXCJGdWxsIFByb2ZpbGVcIixcbiAgICAgIGlkOiBcInByb2ZpbGVcIlxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFRhYiwge1xuICAgICAgcHJldmlldzogdGhpcyxcbiAgICAgIHRpdGxlOiBcIlVzZXIgUG9wb3V0XCIsXG4gICAgICBpZDogXCJwb3BvdXRcIlxuICAgIH0pKSwgcHJldmlldy5yZW5kZXIoKSk7XG4gIH1cblxuICBpc0FjdGl2ZSh0YWIpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYjtcbiAgfVxuXG4gIGdldCBwcmV2aWV3KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpIHJldHVybiBQcm9maWxlO1xuICAgIHJldHVybiBQb3BvdXQ7XG4gIH1cblxufVxuXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxuICAgIH07XG4gICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcyk7XG4gIH1cblxuICBzZXRBY3RpdmUoaXNBY3RpdmUpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWA7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmUpIHtcbiAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpO1xuICAgICAgfVxuICAgIH0sIHRoaXMucHJvcHMudGl0bGUpO1xuICB9XG5cbn1cblxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpO1xuICAgIGxldCBbcm9vdE1vZHVsZTEsIGZsZXhNb2R1bGUxLCBzdHlsaW5nTW9kdWxlMSwgbmFtZVRhZ01vZHVsZTEsIGFjdGl2aXR5TW9kdWxlMSwgdGV4dE1vZHVsZTEsIHNpemVNb2R1bGUxLCBzY3JvbGxlck1vZHVsZTEsIG5vdGVNb2R1bGUxLCBwcm90aXBNb2R1bGUxLCBjb2xvck1vZHVsZTEsIE1lc3NhZ2VzLCBhdmF0YXJNb2R1bGUxXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyUG9wb3V0KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlVc2VyUG9wb3V0KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wcm8gJiYgZS5pbmxpbmUpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXMsIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdXTtcbiAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKTtcbiAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXA7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXVzZXJQb3BvdXRcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLnVzZXJQb3BvdXQsXG4gICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgdGFiaW5kZXg6IFwiLTFcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlclBsYXlpbmdcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlDZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRvcH1gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYXZhdGFyV3JhcHBlck5vcm1hbCxcbiAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICB0YWJpbmRleDogXCIwXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBhdmF0YXJNb2R1bGUxLFxuICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBcIjgwcHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjgwcHhcIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgd2lkdGg6IFwiOTJcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgdmlld0JveDogXCIwIDAgOTIgODBcIixcbiAgICAgIGNsYXNzOiBgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JlaWduT2JqZWN0XCIsIHtcbiAgICAgIHg6IFwiMFwiLFxuICAgICAgeTogXCIwXCIsXG4gICAgICB3aWR0aDogXCI4MFwiLFxuICAgICAgaGVpZ2h0OiBcIjgwXCIsXG4gICAgICBtYXNrOiBcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgc3JjOiBhdmF0YXJVUkwsXG4gICAgICBhbHQ6IFwiIFwiLFxuICAgICAgY2xhc3M6IGF2YXRhck1vZHVsZTEuYXZhdGFyXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFN0YXR1cywgbnVsbCkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICB3aWR0aDogXCI4MFwiLFxuICAgICAgaGVpZ2h0OiBcIjgwXCIsXG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYXZhdGFySGludCxcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDgwIDgwXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZm9yZWlnbk9iamVjdFwiLCB7XG4gICAgICB4OiBcIjBcIixcbiAgICAgIHk6IFwiMFwiLFxuICAgICAgd2lkdGg6IFwiODBcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgbWFzazogXCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS5hdmF0YXJIaW50SW5uZXJcbiAgICB9LCBNZXNzYWdlcy5WSUVXX1BST0ZJTEUpKSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS5oZWFkZXJUZXh0XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9YCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZsZXg6IFwiMSAxIGF1dG9cIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ05vTmlja25hbWV9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IGAke25hbWVUYWdNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZX1gXG4gICAgfSwgdXNlci51c2VybmFtZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiI1wiLCB1c2VyLmRpc2NyaW1pbmF0b3IpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5VXNlclBvcG91dH0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gXG4gICAgfSwgTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlORyksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5ib2R5Tm9ybWFsXG4gICAgfSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YVtcImFzc2V0cy5sYXJnZVwiXSkgcmV0dXJuIG51bGw7XG4gICAgICBsZXQgaW1hZ2VzID0gW107XG5cbiAgICAgIGlmIChkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKSB7XG4gICAgICAgIGltYWdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgICBzcmM6IGBodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgLFxuICAgICAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pIHtcbiAgICAgICAgaW1hZ2VzLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICAgIHNyYzogYGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2AsXG4gICAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNcbiAgICAgIH0sIGltYWdlcyk7XG4gICAgfSkoKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YS5uYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgICBjbGFzczogYCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YCxcbiAgICAgICAgdGl0bGU6IGRhdGEubmFtZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZVxuICAgICAgfSwgZGF0YS5uYW1lKSk7XG4gICAgfSkoKSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YS5kZXRhaWxzKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuZGV0YWlsc1xuICAgICAgfSwgZGF0YS5kZXRhaWxzKTtcbiAgICB9KSgpLCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLnN0YXRlKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5zdGF0ZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICB0aXRsZTogZGF0YS5zdGF0ZVxuICAgICAgfSwgZGF0YS5zdGF0ZSkpO1xuICAgIH0pKCksICgoKSA9PiB7XG4gICAgICBpZiAoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XG4gICAgICAgIHRpbWVzdGFtcHM6IHtcbiAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9KSgpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtyb290TW9kdWxlMS5ib2R5fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0gJHtyb290TW9kdWxlMS5ib2R5SW5uZXJ9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmJvZHlUaXRsZVxuICAgIH0sIE1lc3NhZ2VzLk5PVEUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtub3RlTW9kdWxlMS5ub3RlfSAke3Jvb3RNb2R1bGUxLm5vdGV9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7XG4gICAgICBwbGFjZWhvbGRlcjogTWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUixcbiAgICAgIG1heGxlbmd0aDogXCIyNTZcIixcbiAgICAgIGF1dG9jb3JyZWN0OiBcIm9mZlwiLFxuICAgICAgY2xhc3M6IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBoZWlnaHQ6IFwiMzZweFwiXG4gICAgICB9LFxuICAgICAgZGlzYWJsZWQ6IHRydWVcbiAgICB9KSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuZm9vdGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7cm9vdE1vZHVsZTEucHJvdGlwfSAke3Byb3RpcE1vZHVsZTEuaW5saW5lfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgY2xhc3M6IGAke3Byb3RpcE1vZHVsZTEucHJvfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiXG4gICAgICB9XG4gICAgfSwgTWVzc2FnZXMuUElOTkVEX01FU1NBR0VTX1BST19USVApLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtjb2xvck1vZHVsZTEuY29sb3JTdGFuZGFyZH0gJHtzaXplTW9kdWxlMS5zaXplMTR9ICR7cHJvdGlwTW9kdWxlMS50aXB9YFxuICAgIH0sIE1lc3NhZ2VzLkNPTlRFWFRfTUVOVV9ISU5UKSkpKSk7XG4gIH1cblxufVxuXG5jbGFzcyBTdGF0dXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHN0YXR1cyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFByZXNlbmNlKVswXS5kZWZhdWx0LmdldFByZXNlbmNlKCkuc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IFwiaW52aXNpYmxlXCIpIHN0YXR1cyA9IFwib2ZmbGluZVwiO1xuICAgIGxldCBjbGFzc05hbWUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE2XCIsXG4gICAgICB4OiBcIjYwXCIsXG4gICAgICB5OiBcIjYwXCIsXG4gICAgICBmaWxsOiBcIiNmZmZmZmZcIixcbiAgICAgIG1hc2s6IGB1cmwoI3N2Zy1tYXNrLXN0YXR1cy0ke3N0YXR1c30pYCxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSk7XG4gIH1cblxufVxuXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiO1xuXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpO1xuICAgIGxldCBbZmxleE1vZHVsZTEsIHN0eWxpbmdNb2R1bGUxLCByb290TW9kdWxlMSwgYXZhdGFyTW9kdWxlMSwgbmFtZVRhZ01vZHVsZTEsIGFjdGl2aXR5TW9kdWxlMSwgdGV4dE1vZHVsZTEsIHNpemVNb2R1bGUxLCBzY3JvbGxlck1vZHVsZTEsIG5vdGVNb2R1bGUxLCBNZXNzYWdlc10gPSBbQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlQcm9maWxlKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyRmFkZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXNdO1xuICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpO1xuICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcDtcbiAgICByZXR1cm4gW1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYlwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS52ZXJ0aWNhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5yb290fWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS50b3BTZWN0aW9uUGxheWluZ1xuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmF2YXRhcn0gJHthdmF0YXJNb2R1bGUxLndyYXBwZXJ9YCxcbiAgICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogXCI4MHB4XCIsXG4gICAgICAgIGhlaWdodDogXCI4MHB4XCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgIHdpZHRoOiBcIjkyXCIsXG4gICAgICBoZWlnaHQ6IFwiODBcIixcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDkyIDgwXCIsXG4gICAgICBjbGFzczogYCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZm9yZWlnbk9iamVjdFwiLCB7XG4gICAgICB4OiBcIjBcIixcbiAgICAgIHk6IFwiMFwiLFxuICAgICAgd2lkdGg6IFwiODBcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgbWFzazogXCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgIHNyYzogYXZhdGFyVVJMLFxuICAgICAgYWx0OiBcIiBcIixcbiAgICAgIGNsYXNzOiBhdmF0YXJNb2R1bGUxLmF2YXRhclxuICAgIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChTdGF0dXMsIG51bGwpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmhlYWRlckluZm99YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLm5hbWVUYWd9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLnVzZXJuYW1lfWBcbiAgICB9LCB1c2VyLnVzZXJuYW1lKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmRpc2NyaW1pbmF0b3JcbiAgICB9LCBcIiNcIiwgdXNlci5kaXNjcmltaW5hdG9yKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VzfWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KEJhZGdlcywgbnVsbCkpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlckZpbGxcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlQcm9maWxlfSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgY2xhc3M6IGAke2FjdGl2aXR5TW9kdWxlMS5oZWFkZXJUZXh0Tm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWBcbiAgICB9LCBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWxcbiAgICB9LCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCBpbWFnZXMgPSBbXTtcblxuICAgICAgaWYgKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pIHtcbiAgICAgICAgaW1hZ2VzLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICAgIHNyYzogYGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2AsXG4gICAgICAgICAgY2xhc3M6IGAke2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlUHJvZmlsZX0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1Byb2ZpbGUgOiBcIlwifWBcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSkge1xuICAgICAgICBpbWFnZXMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgICBhbHQ6IFwiXCIsXG4gICAgICAgICAgc3JjOiBgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYCxcbiAgICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFzc2V0c1xuICAgICAgfSwgaW1hZ2VzKTtcbiAgICB9KSgpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1Byb2ZpbGUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLm5hbWUpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gLFxuICAgICAgICB0aXRsZTogZGF0YS5uYW1lXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlOYW1lXG4gICAgICB9LCBkYXRhLm5hbWUpKTtcbiAgICB9KSgpLCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLmRldGFpbHMpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5kZXRhaWxzXG4gICAgICB9LCBkYXRhLmRldGFpbHMpO1xuICAgIH0pKCksICgoKSA9PiB7XG4gICAgICBpZiAoIWRhdGEuc3RhdGUpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLnN0YXRlXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIHRpdGxlOiBkYXRhLnN0YXRlXG4gICAgICB9LCBkYXRhLnN0YXRlKSk7XG4gICAgfSkoKSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pIHJldHVybiBudWxsO1xuICAgICAgbGV0IHRpbWVDb21wb25lbnQgPSB0aW1lc3RhbXBSZW5kZXIoVGltZXN0YW1wLCBNZXNzYWdlcyk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcbiAgICAgICAgdGltZXN0YW1wczoge1xuICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0pKCkpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYm9keVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uSGVhZGVyXG4gICAgfSwgTWVzc2FnZXMuTk9URSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLm5vdGV9ICR7bm90ZU1vZHVsZTEubm90ZX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIsIHtcbiAgICAgIHBsYWNlaG9sZGVyOiBNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSLFxuICAgICAgbWF4bGVuZ3RoOiBcIjI1NlwiLFxuICAgICAgYXV0b2NvcnJlY3Q6IFwib2ZmXCIsXG4gICAgICBjbGFzczogQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogXCI0MHB4XCJcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgIH0pKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdGVkQWNjb3VudHMsIG51bGwpKSkpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwibGMtIFwiXG4gICAgfSldO1xuICB9XG5cbn1cblxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IGFjY291bnRzID0gW107XG4gICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF07XG4gICAgbGV0IEFjY291bnRNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0QWNjb3VudHMpWzBdLmRlZmF1bHQ7XG4gICAgbGV0IGFjY3MgPSBBY2NvdW50TW9kdWxlMS5nZXRBY2NvdW50cygpLmZpbHRlcihlID0+IGUudmlzaWJpbGl0eSA9PT0gMSk7XG5cbiAgICBmb3IgKGxldCBhY2Mgb2YgYWNjcykge1xuICAgICAgYWNjb3VudHMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3RlZEFjY291bnQsIHtcbiAgICAgICAgYWNjOiBhY2NcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRzXG4gICAgICB9LCBhY2NvdW50cykpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbn1cblxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgW2ZsZXhNb2R1bGUxLCBzdHlsaW5nTW9kdWxlMSwgcm9vdE1vZHVsZTEsIGZsb3dlck1vZHVsZTEsIGFuY2hvck1vZHVsZTEsIFNvY2lhbENvbnN0YW50c10gPSBbQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYW5jaG9yKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0ICYmIGUuZGVmYXVsdC5tYXApWzBdLmRlZmF1bHRdO1xuICAgIGxldCBhY2MgPSB0aGlzLnByb3BzLmFjYztcbiAgICBsZXQgY29uc3RhbnRzU29jaWFsID0gU29jaWFsQ29uc3RhbnRzLmdldChhY2MudHlwZSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnR9YCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZsZXg6IFwiMCAxIGF1dG9cIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgYWx0OiBgTG9nbyAke2NvbnN0YW50c1NvY2lhbC5uYW1lfWAsXG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudEljb24sXG4gICAgICBzcmM6IGNvbnN0YW50c1NvY2lhbC5pY29uLmNvbG9yIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLndoaXRlIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLmdyZXlcbiAgICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lXG4gICAgfSwgYWNjLm5hbWUpLCBhY2MudmVyaWZpZWQgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJDb250YWluZXJ9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbn1gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IFwiMTZweFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICBjbGFzczogZmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyLFxuICAgICAgd2lkdGg6IFwiMTZcIixcbiAgICAgIGhlaWdodDogXCIxNlwiLFxuICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgICAgZmlsbDogXCIjNGY1NDVjXCIsXG4gICAgICBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIixcbiAgICAgIGQ6IFwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwiXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBmbG93ZXJNb2R1bGUxLmNoaWxkQ29udGFpbmVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE2XCIsXG4gICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNS4yXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCIsXG4gICAgICBmaWxsOiBcIiNmZmZmZmZcIlxuICAgIH0pKSkpKSA6IG51bGwpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICBjbGFzczogYCR7YW5jaG9yTW9kdWxlMS5hbmNob3J9ICR7YW5jaG9yTW9kdWxlMS5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsXG4gICAgICByZWw6IFwibm9yZWZlcnJlciBub29wZW5lclwiLFxuICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgIHRhYmluZGV4OiBcIjBcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRPcGVuSWNvbixcbiAgICAgIHdpZHRoOiBcIjI0XCIsXG4gICAgICBoZWlnaHQ6IFwiMjRcIixcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgICAgZDogXCJNMTAgNVYzSDUuMzc1QzQuMDY1MTkgMyAzIDQuMDY1MTkgMyA1LjM3NVYxOC42MjVDMyAxOS45MzYgNC4wNjUxOSAyMSA1LjM3NSAyMUgxOC42MjVDMTkuOTM2IDIxIDIxIDE5LjkzNiAyMSAxOC42MjVWMTRIMTlWMTlINVY1SDEwWlwiXG4gICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgICBkOiBcIk0yMSAyLjk5OTAySDE0VjQuOTk5MDJIMTcuNTg2TDkuMjkyOTcgMTMuMjkyTDEwLjcwNyAxNC43MDZMMTkgNi40MTMwMlY5Ljk5OTAySDIxVjIuOTk5MDJaXCJcbiAgICB9KSkpKTtcbiAgfVxuXG59XG5cbmNsYXNzIEJhZGdlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKCk7XG4gICAgbGV0IHJvb3RNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXTtcbiAgICBsZXQgVXNlckZsYWdzID0gQkRNb2R1bGVzLmdldChlID0+IGUuVXNlckZsYWdzKVswXS5Vc2VyRmxhZ3M7XG4gICAgbGV0IGJhZGdlcyA9IFtdO1xuICAgIGxldCBzZXJpYWxpemVkID0gW107XG5cbiAgICBmb3IgKGxldCBmbGFnTmFtZSBpbiBVc2VyRmxhZ3MpIHtcbiAgICAgIGlmICh1c2VyLmhhc0ZsYWcoVXNlckZsYWdzW2ZsYWdOYW1lXSkpIHNlcmlhbGl6ZWQucHVzaChmbGFnTmFtZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZmxhZ05hbWUgb2Ygc2VyaWFsaXplZCkge1xuICAgICAgbGV0IHNlYXJjaGFibGUgPSBgcHJvZmlsZUJhZGdlJHtmbGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCIgXCIpLnNwbGl0KFwiIFwiKS5tYXAoZSA9PiBlWzBdLnRvVXBwZXJDYXNlKCkgKyBlLnNsaWNlKDEpKS5qb2luKFwiXCIpfWA7XG4gICAgICBzZWFyY2hhYmxlID0gc2VhcmNoYWJsZS5yZXBsYWNlKFwiSHlwZXNxdWFkT25saW5lXCIsIFwiSHlwZVNxdWFkT25saW5lXCIpO1xuICAgICAgaWYgKCFyb290TW9kdWxlW3NlYXJjaGFibGVdKSBjb250aW51ZTtcbiAgICAgIGJhZGdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgbmFtZTogc2VhcmNoYWJsZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICh1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pIHtcbiAgICAgIGJhZGdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgbmFtZTogXCJwcm9maWxlQmFkZ2VQcmVtaXVtXCJcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFkZ2VzO1xuICB9XG5cbn1cblxuY2xhc3MgQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZVdyYXBwZXJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwiXCIsXG4gICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgdGFiaW5kZXg6IFwiMFwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlfSAke3Jvb3RNb2R1bGUxW3RoaXMucHJvcHMubmFtZV19YFxuICAgIH0pKSkpO1xuICB9XG5cbn1cblxuY2xhc3MgVGltZXN0YW1wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogdGltZXN0YW1wQ2xhc3NcbiAgICB9LCB0aGlzLnByb3BzLm1lc3NhZ2UpO1xuICB9XG5cbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/presenceSettings.jsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return V2C_PresenceSettings; });\n/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ \"./src/ui/settingsTitle.js\");\n/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ \"./src/ui/settingsGroup.js\");\n/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ \"./src/modules/dataStore.js\");\n/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ \"./src/0globals.js\");\n/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ \"./src/modules/CustomRichPresence.js\");\n/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ \"./src/ui/select.jsx\");\n/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ \"./src/ui/timestampRender.js\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n/**\r\n * @type {typeof import(\"react\")}\r\n */\n\nconst React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__[\"default\"].React;\nclass V2C_PresenceSettings extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getSettingGroup(\"rpc\") || _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"],\n assets: []\n };\n this.preview = null;\n this.isfetching = false;\n\n if (this.state.data.application_id) {\n this.fetchAssets();\n }\n }\n /**\r\n * \r\n * @param {InputText} setting \r\n */\n\n\n onChange(setting, value) {\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id);\n this.setState({\n data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"], this.state.data, {\n [defaultSetting.id]: !!value ? value : null\n }),\n assets: this.state.assets\n });\n\n if (setting.props.id === \"application_id\") {\n this.fetchAssets();\n }\n\n _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__[\"default\"].setSettingGroup(\"rpc\", _0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"]);\n this.preview.forceUpdate();\n _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__[\"settingsRPC\"]);\n }\n\n fetchAssets() {\n if (this.isfetching === true) {\n let app = this.state.data.application_id;\n setTimeout(() => {\n if (this.state.data.application_id !== app) {\n return;\n }\n\n this.fetchAssets();\n }, 5000);\n }\n\n if (!this.state.data.application_id) {\n this.setState({\n data: this.state.data,\n assets: []\n });\n return;\n }\n\n this.isfetching = true;\n _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__[\"default\"].fetchAssets(this.state.data.application_id).then(assets => {\n this.isfetching = false;\n this.setState({\n data: this.state.data,\n assets: Object.keys(assets).map(k => {\n let asset = assets[k];\n return {\n id: asset.id,\n name: asset.name,\n type: asset.type\n };\n })\n });\n this.forceUpdate();\n }).catch(() => {\n this.isfetching = false;\n this.setState({\n data: this.state.data,\n assets: []\n });\n this.forceUpdate();\n });\n }\n\n updatePreview(data) {\n this.setState({\n data\n });\n }\n\n render() {\n let contentModule = BDModules.get(e => e.contentColumn)[0];\n return React.createElement(\"div\", {\n className: contentModule.contentColumn + \" \" + contentModule.contentColumnDefault + \" content-column default\",\n style: {\n padding: \"60px 40px 0px\"\n }\n }, React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n title: \"RichPresence Settings\",\n settings: this.props.settings,\n onChange: this.props.onChange\n }), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n text: \"RichPresence\"\n }), React.createElement(\"div\", null, RPCProps.map(e => {\n if (e.type === \"text\") {\n return React.createElement(InputText, {\n setting: e,\n manager: this,\n id: e.id\n });\n } else if (e.type === \"number\") {\n let array = [React.createElement(InputNumber, {\n setting: e,\n manager: this,\n id: e.id\n })];\n /*\r\n if(e.id === \"timestamps.start\"){\r\n array.unshift( {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} />)\r\n }*/\n\n return array;\n } else if (e.type === \"choice\") {\n if ([\"assets.small\", \"assets.large\"].includes(e.id)) {\n return React.createElement(InputChoice, {\n setting: e,\n manager: this,\n id: e.id,\n choices: [{\n value: \"none\",\n label: \"No assets\"\n }].concat(this.state.assets.map(e => {\n return {\n value: \"asset-\" + e.id,\n label: e.name\n };\n }))\n });\n } else {\n return \"Unknown choice.\";\n }\n }\n })), React.createElement(\"div\", null, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n text: \"Preview\"\n }), React.createElement(RpcPreview, {\n settings: this\n })), React.createElement(\"div\", {\n className: BDModules.get(e => e.marginBottom20)[0].marginBottom20\n }), React.createElement(\"button\", {\n style: {\n opacity: 0.01\n },\n onClick: window.ohgodohfuck\n }, \"Oh god Oh fuck\"), React.createElement(\"button\", {\n style: {\n opacity: 0.01\n },\n onclick: () => {\n electron__WEBPACK_IMPORTED_MODULE_8__[\"remote\"].shell.openExternal(\"https://www.youtube.com/watch?v=LkYa7rps_g4\", {\n activate: false\n });\n }\n }, \"See ? I pulled a litle sneaky on ya\"));\n }\n\n}\nconst RPCProps = [{\n title: \"Application ID\",\n id: \"application_id\",\n type: \"number\"\n}, {\n title: \"Name\",\n id: \"name\",\n type: \"text\"\n}, {\n title: \"Details\",\n id: \"details\",\n type: \"text\"\n}, {\n title: \"State\",\n id: \"state\",\n type: \"text\"\n}, {\n title: \"Timestamp Start\",\n id: \"timestamps.start\",\n type: \"number\"\n}, {\n title: \"LargeAsset\",\n id: \"assets.large\",\n type: \"choice\"\n}, {\n title: \"SmallAsset\",\n id: \"assets.small\",\n type: \"choice\"\n}];\n\nclass InputText extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let inputModule = BDModules.get(e => e.inputMini)[0];\n let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(\"div\", {\n className: inputModule.inputWrapper\n }, React.createElement(\"input\", {\n class: `${inputModule.inputDefault} ${sizeModule2.size16}`,\n name: \"state\",\n type: \"text\",\n placeholder: \"\",\n maxlength: \"999\",\n value: this.props.manager.state.data[setting.id],\n onChange: ev => {\n this.props.manager.onChange(this, ev.target.value);\n }\n }))), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass InputNumber extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let inputModule = BDModules.get(e => e.inputMini)[0];\n let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];\n let euhModule1 = BDModules.get(e => e.colorTransparent)[0];\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(\"div\", {\n className: inputModule.inputWrapper\n }, React.createElement(\"input\", {\n class: `${inputModule.inputDefault} ${sizeModule2.size16}`,\n name: \"state\",\n type: \"text\",\n placeholder: \"\",\n maxlength: \"999\",\n value: this.props.manager.state.data[setting.id],\n onChange: ev => {\n let newValue = ev.target.value.replace(/[^\\d]+/g, \"\");\n\n if (newValue !== ev.target.value) {\n ev.target.value = newValue;\n }\n\n this.props.manager.onChange(this, newValue);\n }\n })), setting.id === \"timestamps.start\" ? React.createElement(\"div\", {\n className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper\n }, React.createElement(\"button\", {\n type: \"button\",\n class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,\n style: {\n flex: \"0 1 auto\"\n },\n onClick: () => {\n DiscordNative.clipboard.copy(Date.now() + \"\");\n }\n }, React.createElement(\"div\", {\n class: euhModule1.contents\n }, \"Copy current timestamp\"))) : null), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass InputChoice extends React.Component {\n onChange(data) {\n this.props.manager.onChange(this, data.value === \"none\" ? null : data.value.replace(\"asset-\", \"\"));\n }\n\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let options = this.props.choices;\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"h5\", {\n className: colorModule.colorStandard + \" \" + sizeModule.size14 + \" \" + marginModule2.h5 + \" \" + marginModule2.defaultMarginh5\n }, setting.title), React.createElement(_select__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n value: \"asset-\" + this.props.manager.state.data[setting.id] || false,\n onChange: this.onChange.bind(this),\n options: options\n })), React.createElement(\"div\", {\n class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`\n }));\n }\n\n}\n\nclass DiscordButton extends React.Component {\n render() {\n let setting = this.props.setting;\n let rowModule = BDModules.get(e => e.removeKeybind)[0];\n let marginModule = BDModules.get(e => e.marginBottom20)[0];\n let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];\n let colorModule = BDModules.get(e => e.colorStandard)[0];\n let sizeModule = BDModules.get(e => e.size32)[0];\n let flexModule = BDModules.get(e => e._horizontal)[0];\n let euhModule1 = BDModules.get(e => e.colorTransparent)[0];\n let options = this.props.choices;\n return React.createElement(\"div\", {\n className: rowModule.row + \" \" + marginModule.marginBottom20\n }, React.createElement(\"div\", {\n className: `${rowModule.item} ${flexModule.flexChild}`\n }, React.createElement(\"div\", {\n className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper\n }, React.createElement(\"button\", {\n type: \"button\",\n class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,\n style: {\n flex: \"0 1 auto\"\n },\n onClick: this.onClick\n }, React.createElement(\"div\", {\n class: euhModule1.contents\n }, this.props.title)))));\n }\n\n}\n\nclass RpcPreview extends React.Component {\n constructor(props = {}) {\n super(props);\n this.state = {\n active: \"profile\"\n };\n this.tabs = [];\n this.props.settings.preview = this;\n }\n\n changeTab(tab) {\n let ancientTab = this.state.active;\n if (ancientTab === tab.props.id) return;\n this.tabs.forEach(e => {\n e.setActive(false);\n });\n tab.setActive(true);\n this.setState({\n active: tab.props.id\n });\n }\n\n render() {\n let preview = new this.preview({\n preview: this\n });\n preview.setState(this.state.rpc);\n return React.createElement(\"div\", {\n className: \"lc-tabWrapper\"\n }, React.createElement(\"div\", {\n className: \"lc-tabnav\",\n style: {\n flex: \"0 1 auto\"\n }\n }, React.createElement(Tab, {\n preview: this,\n title: \"Full Profile\",\n id: \"profile\"\n }), React.createElement(Tab, {\n preview: this,\n title: \"User Popout\",\n id: \"popout\"\n })), preview.render());\n }\n\n isActive(tab) {\n return this.state.active === tab;\n }\n\n get preview() {\n if (this.state.active === \"profile\") return Profile;\n return Popout;\n }\n\n}\n\nclass Tab extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n active: props.preview.isActive(props.id)\n };\n props.preview.tabs.push(this);\n }\n\n setActive(isActive) {\n this.setState({\n active: !!isActive\n });\n }\n\n render() {\n let className = `lc-navItem`;\n\n if (this.state.active) {\n className += ` lc-navItemActive`;\n } else {\n className += ` lc-navItemInactive`;\n }\n\n return React.createElement(\"div\", {\n className: className,\n onClick: () => {\n this.props.preview.changeTab(this);\n }\n }, this.props.title);\n }\n\n}\n\nclass Popout extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let avatarURL = user.getAvatarURL(user.avatar.startsWith(\"a_\") ? \"gif\" : \"png\");\n let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1] = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0]];\n let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"], this.props.preview.props.settings.state.data);\n timestampClass = timestampClass || activityModule1.timestamp;\n return React.createElement(\"div\", {\n className: \"lc-userPopout\"\n }, React.createElement(\"div\", {\n class: rootModule1.userPopout,\n role: \"dialog\",\n tabindex: \"-1\"\n }, React.createElement(\"div\", {\n class: rootModule1.headerPlaying\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: rootModule1.avatarWrapperNormal,\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"div\", {\n class: avatarModule1,\n role: \"img\",\n style: {\n width: \"80px\",\n height: \"80px\"\n }\n }, React.createElement(\"svg\", {\n width: \"92\",\n height: \"80\",\n viewBox: \"0 0 92 80\",\n class: `${avatarModule1.mask} ${avatarModule1.svg}`\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"img\", {\n src: avatarURL,\n alt: \" \",\n class: avatarModule1.avatar\n })), React.createElement(Status, null))), React.createElement(\"svg\", {\n width: \"80\",\n height: \"80\",\n class: rootModule1.avatarHint,\n viewBox: \"0 0 80 80\"\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"div\", {\n class: rootModule1.avatarHintInner\n }, Messages.VIEW_PROFILE)))), React.createElement(\"div\", {\n class: rootModule1.headerText\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`\n }, React.createElement(\"span\", {\n class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`\n }, user.username), React.createElement(\"span\", null, \"#\", user.discriminator))))), React.createElement(\"div\", {\n class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`\n }, React.createElement(\"h3\", {\n class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`\n }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement(\"div\", {\n class: activityModule1.bodyNormal\n }, (() => {\n if (!data[\"assets.large\"]) return null;\n let images = [];\n\n if (data[\"assets.large\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.large\"]}.png`,\n class: `${activityModule1.assetsLargeImageUserPopout} ${data[\"assets.small\"] ? activityModule1.assetsLargeMaskUserPopout : \"\"}`\n }));\n }\n\n if (data[\"assets.small\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.small\"]}.png`,\n class: activityModule1.assetsSmallImageUserPopout\n }));\n }\n\n return React.createElement(\"div\", {\n class: activityModule1.assets\n }, images);\n })(), React.createElement(\"div\", {\n class: activityModule1.contentImagesUserPopout,\n style: {\n flex: \"1 1 auto\"\n }\n }, (() => {\n if (!data.name) return null;\n return React.createElement(\"h3\", {\n class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,\n title: data.name\n }, React.createElement(\"span\", {\n class: activityModule1.activityName\n }, data.name));\n })(), (() => {\n if (!data.details) return null;\n return React.createElement(\"div\", {\n title: data.title,\n class: activityModule1.details\n }, data.details);\n })(), (() => {\n if (!data.state) return null;\n return React.createElement(\"div\", {\n class: activityModule1.state\n }, React.createElement(\"span\", {\n title: data.state\n }, data.state));\n })(), (() => {\n if (!data[\"timestamps.start\"]) return null;\n let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(Timestamp, Messages);\n return React.createElement(\"div\", {\n class: activityModule1.timestamp\n }, React.createElement(timeComponent, {\n timestamps: {\n end: null,\n start: data[\"timestamps.start\"]\n }\n }));\n })())))), React.createElement(\"div\", {\n class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`\n }, React.createElement(\"div\", {\n class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`\n }, React.createElement(\"div\", {\n class: rootModule1.bodyTitle\n }, Messages.NOTE), React.createElement(\"div\", {\n class: `${noteModule1.note} ${rootModule1.note}`\n }, React.createElement(\"textarea\", {\n placeholder: Messages.NOTE_PLACEHOLDER,\n maxlength: \"256\",\n autocorrect: \"off\",\n class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,\n style: {\n height: \"36px\"\n },\n disabled: true\n })))), React.createElement(\"div\", {\n class: rootModule1.footer\n }, React.createElement(\"div\", {\n class: `${rootModule1.protip} ${protipModule1.inline}`\n }, React.createElement(\"h3\", {\n class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,\n style: {\n color: \"rgb(67, 181, 129)\"\n }\n }, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement(\"div\", {\n class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`\n }, Messages.CONTEXT_MENU_HINT)))));\n }\n\n}\n\nclass Status extends React.Component {\n render() {\n let status = BDModules.get(e => e.default && e.default.getPresence)[0].default.getPresence().status;\n if (status === \"invisible\") status = \"offline\";\n let className = BDModules.get(e => e.pointerEvents)[0].pointerEvents;\n return React.createElement(\"rect\", {\n width: \"16\",\n height: \"16\",\n x: \"60\",\n y: \"60\",\n fill: \"#ffffff\",\n mask: `url(#svg-mask-status-${status})`,\n className: className\n });\n }\n\n}\n\nlet timestampClass = \"\";\n\nclass Profile extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let avatarURL = user.getAvatarURL(user.avatar.startsWith(\"a_\") ? \"gif\" : \"png\");\n let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages];\n let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__[\"defaultRPC\"], this.props.preview.props.settings.state.data);\n timestampClass = timestampClass || activityModule1.timestamp;\n return [React.createElement(\"div\", {\n className: \"lc-tab\"\n }, React.createElement(\"div\", {\n class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(\"div\", {\n class: rootModule1.topSectionPlaying\n }, React.createElement(\"header\", {\n class: rootModule1.header\n }, React.createElement(\"div\", {\n class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,\n role: \"img\",\n style: {\n width: \"80px\",\n height: \"80px\"\n }\n }, React.createElement(\"svg\", {\n width: \"92\",\n height: \"80\",\n viewBox: \"0 0 92 80\",\n class: `${avatarModule1.mask} ${avatarModule1.svg}`\n }, React.createElement(\"foreignObject\", {\n x: \"0\",\n y: \"0\",\n width: \"80\",\n height: \"80\",\n mask: \"url(#svg-mask-avatar-status-round-80)\"\n }, React.createElement(\"img\", {\n src: avatarURL,\n alt: \" \",\n class: avatarModule1.avatar\n })), React.createElement(Status, null))), React.createElement(\"div\", {\n class: `${rootModule1.headerInfo}`\n }, React.createElement(\"div\", {\n class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`\n }, React.createElement(\"span\", {\n class: `${rootModule1.username} ${rootModule1.username}`\n }, user.username), React.createElement(\"span\", {\n class: rootModule1.discriminator\n }, \"#\", user.discriminator)), React.createElement(\"div\", {\n class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,\n style: {\n flex: \"1 1 auto\"\n }\n }, React.createElement(Badges, null)))), React.createElement(\"div\", {\n class: rootModule1.headerFill\n }, React.createElement(\"div\", {\n class: `${activityModule1.activityProfile} ${rootModule1.activity}`\n }, React.createElement(\"h3\", {\n class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`\n }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement(\"div\", {\n class: activityModule1.bodyNormal\n }, (() => {\n if (!data[\"assets.large\"]) return null;\n let images = [];\n\n if (data[\"assets.large\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.large\"]}.png`,\n class: `${activityModule1.assetsLargeImageProfile} ${data[\"assets.small\"] ? activityModule1.assetsLargeMaskProfile : \"\"}`\n }));\n }\n\n if (data[\"assets.small\"]) {\n images.push(React.createElement(\"img\", {\n alt: \"\",\n src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data[\"assets.small\"]}.png`,\n class: activityModule1.assetsSmallImageProfile\n }));\n }\n\n return React.createElement(\"div\", {\n class: activityModule1.assets\n }, images);\n })(), React.createElement(\"div\", {\n class: activityModule1.contentImagesProfile,\n style: {\n flex: \"1 1 auto\"\n }\n }, (() => {\n if (!data.name) return null;\n return React.createElement(\"h3\", {\n class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,\n title: data.name\n }, React.createElement(\"span\", {\n class: activityModule1.activityName\n }, data.name));\n })(), (() => {\n if (!data.details) return null;\n return React.createElement(\"div\", {\n title: data.title,\n class: activityModule1.details\n }, data.details);\n })(), (() => {\n if (!data.state) return null;\n return React.createElement(\"div\", {\n class: activityModule1.state\n }, React.createElement(\"span\", {\n title: data.state\n }, data.state));\n })(), (() => {\n if (!data[\"timestamps.start\"]) return null;\n let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(Timestamp, Messages);\n return React.createElement(\"div\", {\n class: activityModule1.timestamp\n }, React.createElement(timeComponent, {\n timestamps: {\n end: null,\n start: data[\"timestamps.start\"]\n }\n }));\n })()))))), React.createElement(\"div\", {\n class: rootModule1.body\n }, React.createElement(\"div\", {\n class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`\n }, React.createElement(\"div\", {\n class: scrollerModule1.scroller\n }, React.createElement(\"div\", {\n class: rootModule1.userInfoSection\n }, React.createElement(\"div\", {\n class: rootModule1.userInfoSectionHeader\n }, Messages.NOTE), React.createElement(\"div\", {\n class: `${rootModule1.note} ${noteModule1.note}`\n }, React.createElement(\"textarea\", {\n placeholder: Messages.NOTE_PLACEHOLDER,\n maxlength: \"256\",\n autocorrect: \"off\",\n class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,\n style: {\n height: \"40px\"\n },\n disabled: true\n }))), React.createElement(ConnectedAccounts, null)))))), React.createElement(\"div\", {\n class: \"lc- \"\n })];\n }\n\n}\n\nclass ConnectedAccounts extends React.Component {\n render() {\n let accounts = [];\n let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];\n let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default;\n let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1);\n\n for (let acc of accs) {\n accounts.push(React.createElement(ConnectedAccount, {\n acc: acc\n }));\n }\n\n if (accounts.length > 0) {\n return React.createElement(\"div\", {\n class: rootModule1.userInfoSection\n }, React.createElement(\"div\", {\n class: rootModule1.connectedAccounts\n }, accounts));\n }\n\n return null;\n }\n\n}\n\nclass ConnectedAccount extends React.Component {\n render() {\n let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default];\n let acc = this.props.acc;\n let constantsSocial = SocialConstants.get(acc.type);\n return React.createElement(\"div\", {\n class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,\n style: {\n flex: \"0 1 auto\"\n }\n }, React.createElement(\"img\", {\n alt: `Logo ${constantsSocial.name}`,\n class: rootModule1.connectedAccountIcon,\n src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey\n }), React.createElement(\"div\", {\n class: rootModule1.connectedAccountNameInner\n }, React.createElement(\"div\", {\n class: rootModule1.connectedAccountName\n }, acc.name), acc.verified ? React.createElement(\"span\", null, React.createElement(\"div\", {\n class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, React.createElement(\"svg\", {\n class: flowerModule1.flowerStar,\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 16 15.2\"\n }, React.createElement(\"path\", {\n fill: \"#4f545c\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), React.createElement(\"div\", {\n class: flowerModule1.childContainer\n }, React.createElement(\"svg\", {\n width: \"16\",\n height: \"16\",\n viewBox: \"0 0 16 15.2\"\n }, React.createElement(\"path\", {\n d: \"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\",\n fill: \"#ffffff\"\n }))))) : null), React.createElement(\"a\", {\n class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,\n rel: \"noreferrer noopener\",\n target: \"_blank\",\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"svg\", {\n class: rootModule1.connectedAccountOpenIcon,\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\"\n }, React.createElement(\"path\", {\n fill: \"currentColor\",\n d: \"M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z\"\n }), React.createElement(\"path\", {\n fill: \"currentColor\",\n d: \"M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z\"\n }))));\n }\n\n}\n\nclass Badges extends React.Component {\n render() {\n let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();\n let rootModule = BDModules.get(e => e.topSectionStreaming)[0];\n let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags;\n let badges = [];\n let serialized = [];\n\n for (let flagName in UserFlags) {\n if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName);\n }\n\n for (let flagName of serialized) {\n let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, \" \").split(\" \").map(e => e[0].toUpperCase() + e.slice(1)).join(\"\")}`;\n searchable = searchable.replace(\"HypesquadOnline\", \"HypeSquadOnline\");\n if (!rootModule[searchable]) continue;\n badges.push(React.createElement(Badge, {\n name: searchable\n }));\n }\n\n if (user.hasPremiumSubscription) {\n badges.push(React.createElement(Badge, {\n name: \"profileBadgePremium\"\n }));\n }\n\n return badges;\n }\n\n}\n\nclass Badge extends React.Component {\n render() {\n let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];\n return React.createElement(\"div\", {\n class: rootModule1.profileBadgeWrapper\n }, React.createElement(\"div\", null, React.createElement(\"div\", {\n class: \"\",\n role: \"button\",\n tabindex: \"0\"\n }, React.createElement(\"div\", {\n class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`\n }))));\n }\n\n}\n\nclass Timestamp extends React.Component {\n render() {\n return React.createElement(\"div\", {\n className: timestampClass\n }, this.props.message);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3guanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4P2NlZWYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xuaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi9zZWxlY3RcIjtcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCI7XG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxuICAgICAgYXNzZXRzOiBbXVxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3ID0gbnVsbDtcbiAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpIHtcbiAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXHJcbiAgICovXG5cblxuICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSkge1xuICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xuICAgICAgICBbZGVmYXVsdFNldHRpbmcuaWRdOiAhIXZhbHVlID8gdmFsdWUgOiBudWxsXG4gICAgICB9KSxcbiAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcbiAgICB9KTtcblxuICAgIGlmIChzZXR0aW5nLnByb3BzLmlkID09PSBcImFwcGxpY2F0aW9uX2lkXCIpIHtcbiAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKTtcbiAgICB9XG5cbiAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcbiAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKTtcbiAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKTtcbiAgfVxuXG4gIGZldGNoQXNzZXRzKCkge1xuICAgIGlmICh0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpIHtcbiAgICAgIGxldCBhcHAgPSB0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQ7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpO1xuICAgICAgfSwgNTAwMCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXG4gICAgICAgIGFzc2V0czogW11cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNmZXRjaGluZyA9IHRydWU7XG4gICAgQ3VzdG9tUmljaFByZXNlbmNlLmZldGNoQXNzZXRzKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCkudGhlbihhc3NldHMgPT4ge1xuICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xuICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxuICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICBhc3NldHM6IFtdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVByZXZpZXcoZGF0YSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIiArIGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQgKyBcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsXG4gICAgICBzdHlsZToge1xuICAgICAgICBwYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1NldHRpbmdzR3JvdXAsIHtcbiAgICAgIHRpdGxlOiBcIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiLFxuICAgICAgc2V0dGluZ3M6IHRoaXMucHJvcHMuc2V0dGluZ3MsXG4gICAgICBvbkNoYW5nZTogdGhpcy5wcm9wcy5vbkNoYW5nZVxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19TZXR0aW5nc1RpdGxlLCB7XG4gICAgICB0ZXh0OiBcIlJpY2hQcmVzZW5jZVwiXG4gICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgUlBDUHJvcHMubWFwKGUgPT4ge1xuICAgICAgaWYgKGUudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXRUZXh0LCB7XG4gICAgICAgICAgc2V0dGluZzogZSxcbiAgICAgICAgICBtYW5hZ2VyOiB0aGlzLFxuICAgICAgICAgIGlkOiBlLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgbGV0IGFycmF5ID0gW1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXROdW1iZXIsIHtcbiAgICAgICAgICBzZXR0aW5nOiBlLFxuICAgICAgICAgIG1hbmFnZXI6IHRoaXMsXG4gICAgICAgICAgaWQ6IGUuaWRcbiAgICAgICAgfSldO1xuICAgICAgICAvKlxyXG4gICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICB9fSAvPilcclxuICAgICAgICB9Ki9cblxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gXCJjaG9pY2VcIikge1xuICAgICAgICBpZiAoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXRDaG9pY2UsIHtcbiAgICAgICAgICAgIHNldHRpbmc6IGUsXG4gICAgICAgICAgICBtYW5hZ2VyOiB0aGlzLFxuICAgICAgICAgICAgaWQ6IGUuaWQsXG4gICAgICAgICAgICBjaG9pY2VzOiBbe1xuICAgICAgICAgICAgICB2YWx1ZTogXCJub25lXCIsXG4gICAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXG4gICAgICAgICAgICB9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiICsgZS5pZCxcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gXCJVbmtub3duIGNob2ljZS5cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBSZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19TZXR0aW5nc1RpdGxlLCB7XG4gICAgICB0ZXh0OiBcIlByZXZpZXdcIlxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFJwY1ByZXZpZXcsIHtcbiAgICAgIHNldHRpbmdzOiB0aGlzXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLm1hcmdpbkJvdHRvbTIwXG4gICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgb3BhY2l0eTogMC4wMVxuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IHdpbmRvdy5vaGdvZG9oZnVja1xuICAgIH0sIFwiT2ggZ29kIE9oIGZ1Y2tcIiksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgb3BhY2l0eTogMC4wMVxuICAgICAgfSxcbiAgICAgIG9uY2xpY2s6ICgpID0+IHtcbiAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIiwge1xuICAgICAgICAgIGFjdGl2YXRlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBcIlNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXCIpKTtcbiAgfVxuXG59XG5jb25zdCBSUENQcm9wcyA9IFt7XG4gIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXG4gIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXG4gIHR5cGU6IFwibnVtYmVyXCJcbn0sIHtcbiAgdGl0bGU6IFwiTmFtZVwiLFxuICBpZDogXCJuYW1lXCIsXG4gIHR5cGU6IFwidGV4dFwiXG59LCB7XG4gIHRpdGxlOiBcIkRldGFpbHNcIixcbiAgaWQ6IFwiZGV0YWlsc1wiLFxuICB0eXBlOiBcInRleHRcIlxufSwge1xuICB0aXRsZTogXCJTdGF0ZVwiLFxuICBpZDogXCJzdGF0ZVwiLFxuICB0eXBlOiBcInRleHRcIlxufSwge1xuICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcbiAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxuICB0eXBlOiBcIm51bWJlclwiXG59LCB7XG4gIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcbiAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXG4gIHR5cGU6IFwiY2hvaWNlXCJcbn0sIHtcbiAgdGl0bGU6IFwiU21hbGxBc3NldFwiLFxuICBpZDogXCJhc3NldHMuc21hbGxcIixcbiAgdHlwZTogXCJjaG9pY2VcIlxufV07XG5cbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZztcbiAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF07XG4gICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF07XG4gICAgbGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF07XG4gICAgbGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdO1xuICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdO1xuICAgIGxldCBpbnB1dE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF07XG4gICAgbGV0IHNpemVNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IHJvd01vZHVsZS5yb3cgKyBcIiBcIiArIG1hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImg1XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCArIFwiIFwiICsgc2l6ZU1vZHVsZS5zaXplMTQgKyBcIiBcIiArIG1hcmdpbk1vZHVsZTIuaDUgKyBcIiBcIiArIG1hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1XG4gICAgfSwgc2V0dGluZy50aXRsZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBpbnB1dE1vZHVsZS5pbnB1dFdyYXBwZXJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgICAgY2xhc3M6IGAke2lucHV0TW9kdWxlLmlucHV0RGVmYXVsdH0gJHtzaXplTW9kdWxlMi5zaXplMTZ9YCxcbiAgICAgIG5hbWU6IFwic3RhdGVcIixcbiAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgcGxhY2Vob2xkZXI6IFwiXCIsXG4gICAgICBtYXhsZW5ndGg6IFwiOTk5XCIsXG4gICAgICB2YWx1ZTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0sXG4gICAgICBvbkNoYW5nZTogZXYgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgZXYudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nO1xuICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXTtcbiAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF07XG4gICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF07XG4gICAgbGV0IGlucHV0TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdO1xuICAgIGxldCBldWhNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JUcmFuc3BhcmVudClbMF07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByb3dNb2R1bGUucm93ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNVwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQgKyBcIiBcIiArIHNpemVNb2R1bGUuc2l6ZTE0ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmg1ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNVxuICAgIH0sIHNldHRpbmcudGl0bGUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogaW5wdXRNb2R1bGUuaW5wdXRXcmFwcGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtpbnB1dE1vZHVsZS5pbnB1dERlZmF1bHR9ICR7c2l6ZU1vZHVsZTIuc2l6ZTE2fWAsXG4gICAgICBuYW1lOiBcInN0YXRlXCIsXG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgICAgbWF4bGVuZ3RoOiBcIjk5OVwiLFxuICAgICAgdmFsdWU6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdLFxuICAgICAgb25DaGFuZ2U6IGV2ID0+IHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gZXYudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1teXFxkXSsvZywgXCJcIik7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBldi50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfSkpLCBzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5idXR0b25XcmFwcGVyKVswXS5idXR0b25XcmFwcGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUuZmxleENoaWxkfSAke2V1aE1vZHVsZTEuYnV0dG9ufSAke2V1aE1vZHVsZTEubG9va0ZpbGxlZH0gJHtldWhNb2R1bGUxLmNvbG9yQnJhbmR9ICR7ZXVoTW9kdWxlMS5zaXplU21hbGx9ICR7ZXVoTW9kdWxlMS5ncm93fWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjAgMSBhdXRvXCJcbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKSArIFwiXCIpO1xuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGV1aE1vZHVsZTEuY29udGVudHNcbiAgICB9LCBcIkNvcHkgY3VycmVudCB0aW1lc3RhbXBcIikpKSA6IG51bGwpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgb25DaGFuZ2UoZGF0YSkge1xuICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBkYXRhLnZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiBkYXRhLnZhbHVlLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nO1xuICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXTtcbiAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXTtcbiAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXTtcbiAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF07XG4gICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF07XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLmNob2ljZXM7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByb3dNb2R1bGUucm93ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNVwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQgKyBcIiBcIiArIHNpemVNb2R1bGUuc2l6ZTE0ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmg1ICsgXCIgXCIgKyBtYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNVxuICAgIH0sIHNldHRpbmcudGl0bGUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdCwge1xuICAgICAgdmFsdWU6IFwiYXNzZXQtXCIgKyB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSB8fCBcIm5vbmVcIixcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YFxuICAgIH0pKTtcbiAgfVxuXG59XG5cbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmc7XG4gICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdO1xuICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF07XG4gICAgbGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdO1xuICAgIGxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdO1xuICAgIGxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXTtcbiAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXTtcbiAgICBsZXQgZXVoTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdO1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5jaG9pY2VzO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogcm93TW9kdWxlLnJvdyArIFwiIFwiICsgbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuYnV0dG9uV3JhcHBlcilbMF0uYnV0dG9uV3JhcHBlclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIGNsYXNzOiBgJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH0gJHtldWhNb2R1bGUxLmJ1dHRvbn0gJHtldWhNb2R1bGUxLmxvb2tGaWxsZWR9ICR7ZXVoTW9kdWxlMS5jb2xvckJyYW5kfSAke2V1aE1vZHVsZTEuc2l6ZVNtYWxsfSAke2V1aE1vZHVsZTEuZ3Jvd31gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIwIDEgYXV0b1wiXG4gICAgICB9LFxuICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogZXVoTW9kdWxlMS5jb250ZW50c1xuICAgIH0sIHRoaXMucHJvcHMudGl0bGUpKSkpKTtcbiAgfVxuXG59XG5cbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXG4gICAgfTtcbiAgICB0aGlzLnRhYnMgPSBbXTtcbiAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzO1xuICB9XG5cbiAgY2hhbmdlVGFiKHRhYikge1xuICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmU7XG4gICAgaWYgKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZCkgcmV0dXJuO1xuICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xuICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH0pO1xuICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBwcmV2aWV3ID0gbmV3IHRoaXMucHJldmlldyh7XG4gICAgICBwcmV2aWV3OiB0aGlzXG4gICAgfSk7XG4gICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnN0YXRlLnJwYyk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYldyYXBwZXJcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYm5hdlwiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIwIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChUYWIsIHtcbiAgICAgIHByZXZpZXc6IHRoaXMsXG4gICAgICB0aXRsZTogXCJGdWxsIFByb2ZpbGVcIixcbiAgICAgIGlkOiBcInByb2ZpbGVcIlxuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFRhYiwge1xuICAgICAgcHJldmlldzogdGhpcyxcbiAgICAgIHRpdGxlOiBcIlVzZXIgUG9wb3V0XCIsXG4gICAgICBpZDogXCJwb3BvdXRcIlxuICAgIH0pKSwgcHJldmlldy5yZW5kZXIoKSk7XG4gIH1cblxuICBpc0FjdGl2ZSh0YWIpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYjtcbiAgfVxuXG4gIGdldCBwcmV2aWV3KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpIHJldHVybiBQcm9maWxlO1xuICAgIHJldHVybiBQb3BvdXQ7XG4gIH1cblxufVxuXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxuICAgIH07XG4gICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcyk7XG4gIH1cblxuICBzZXRBY3RpdmUoaXNBY3RpdmUpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWA7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmUpIHtcbiAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpO1xuICAgICAgfVxuICAgIH0sIHRoaXMucHJvcHMudGl0bGUpO1xuICB9XG5cbn1cblxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpO1xuICAgIGxldCBbcm9vdE1vZHVsZTEsIGZsZXhNb2R1bGUxLCBzdHlsaW5nTW9kdWxlMSwgbmFtZVRhZ01vZHVsZTEsIGFjdGl2aXR5TW9kdWxlMSwgdGV4dE1vZHVsZTEsIHNpemVNb2R1bGUxLCBzY3JvbGxlck1vZHVsZTEsIG5vdGVNb2R1bGUxLCBwcm90aXBNb2R1bGUxLCBjb2xvck1vZHVsZTEsIE1lc3NhZ2VzLCBhdmF0YXJNb2R1bGUxXSA9IFtCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyUG9wb3V0KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlVc2VyUG9wb3V0KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wcm8gJiYgZS5pbmxpbmUpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXMsIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdXTtcbiAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKTtcbiAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXA7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXVzZXJQb3BvdXRcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLnVzZXJQb3BvdXQsXG4gICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgdGFiaW5kZXg6IFwiLTFcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlclBsYXlpbmdcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlDZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRvcH1gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYXZhdGFyV3JhcHBlck5vcm1hbCxcbiAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICB0YWJpbmRleDogXCIwXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBhdmF0YXJNb2R1bGUxLFxuICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBcIjgwcHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjgwcHhcIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgd2lkdGg6IFwiOTJcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgdmlld0JveDogXCIwIDAgOTIgODBcIixcbiAgICAgIGNsYXNzOiBgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmb3JlaWduT2JqZWN0XCIsIHtcbiAgICAgIHg6IFwiMFwiLFxuICAgICAgeTogXCIwXCIsXG4gICAgICB3aWR0aDogXCI4MFwiLFxuICAgICAgaGVpZ2h0OiBcIjgwXCIsXG4gICAgICBtYXNrOiBcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgc3JjOiBhdmF0YXJVUkwsXG4gICAgICBhbHQ6IFwiIFwiLFxuICAgICAgY2xhc3M6IGF2YXRhck1vZHVsZTEuYXZhdGFyXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFN0YXR1cywgbnVsbCkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICB3aWR0aDogXCI4MFwiLFxuICAgICAgaGVpZ2h0OiBcIjgwXCIsXG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYXZhdGFySGludCxcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDgwIDgwXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZm9yZWlnbk9iamVjdFwiLCB7XG4gICAgICB4OiBcIjBcIixcbiAgICAgIHk6IFwiMFwiLFxuICAgICAgd2lkdGg6IFwiODBcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgbWFzazogXCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS5hdmF0YXJIaW50SW5uZXJcbiAgICB9LCBNZXNzYWdlcy5WSUVXX1BST0ZJTEUpKSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS5oZWFkZXJUZXh0XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9YCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZsZXg6IFwiMSAxIGF1dG9cIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ05vTmlja25hbWV9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IGAke25hbWVUYWdNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZX1gXG4gICAgfSwgdXNlci51c2VybmFtZSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiI1wiLCB1c2VyLmRpc2NyaW1pbmF0b3IpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5VXNlclBvcG91dH0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gXG4gICAgfSwgTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlORyksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5ib2R5Tm9ybWFsXG4gICAgfSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YVtcImFzc2V0cy5sYXJnZVwiXSkgcmV0dXJuIG51bGw7XG4gICAgICBsZXQgaW1hZ2VzID0gW107XG5cbiAgICAgIGlmIChkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKSB7XG4gICAgICAgIGltYWdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgICBzcmM6IGBodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgLFxuICAgICAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pIHtcbiAgICAgICAgaW1hZ2VzLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICAgIHNyYzogYGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2AsXG4gICAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNcbiAgICAgIH0sIGltYWdlcyk7XG4gICAgfSkoKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiXG4gICAgICB9XG4gICAgfSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YS5uYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgICBjbGFzczogYCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YCxcbiAgICAgICAgdGl0bGU6IGRhdGEubmFtZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZVxuICAgICAgfSwgZGF0YS5uYW1lKSk7XG4gICAgfSkoKSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YS5kZXRhaWxzKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuZGV0YWlsc1xuICAgICAgfSwgZGF0YS5kZXRhaWxzKTtcbiAgICB9KSgpLCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLnN0YXRlKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5zdGF0ZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICB0aXRsZTogZGF0YS5zdGF0ZVxuICAgICAgfSwgZGF0YS5zdGF0ZSkpO1xuICAgIH0pKCksICgoKSA9PiB7XG4gICAgICBpZiAoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XG4gICAgICAgIHRpbWVzdGFtcHM6IHtcbiAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9KSgpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtyb290TW9kdWxlMS5ib2R5fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0gJHtyb290TW9kdWxlMS5ib2R5SW5uZXJ9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmJvZHlUaXRsZVxuICAgIH0sIE1lc3NhZ2VzLk5PVEUpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtub3RlTW9kdWxlMS5ub3RlfSAke3Jvb3RNb2R1bGUxLm5vdGV9YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7XG4gICAgICBwbGFjZWhvbGRlcjogTWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUixcbiAgICAgIG1heGxlbmd0aDogXCIyNTZcIixcbiAgICAgIGF1dG9jb3JyZWN0OiBcIm9mZlwiLFxuICAgICAgY2xhc3M6IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBoZWlnaHQ6IFwiMzZweFwiXG4gICAgICB9LFxuICAgICAgZGlzYWJsZWQ6IHRydWVcbiAgICB9KSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuZm9vdGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7cm9vdE1vZHVsZTEucHJvdGlwfSAke3Byb3RpcE1vZHVsZTEuaW5saW5lfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgY2xhc3M6IGAke3Byb3RpcE1vZHVsZTEucHJvfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiXG4gICAgICB9XG4gICAgfSwgTWVzc2FnZXMuUElOTkVEX01FU1NBR0VTX1BST19USVApLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtjb2xvck1vZHVsZTEuY29sb3JTdGFuZGFyZH0gJHtzaXplTW9kdWxlMS5zaXplMTR9ICR7cHJvdGlwTW9kdWxlMS50aXB9YFxuICAgIH0sIE1lc3NhZ2VzLkNPTlRFWFRfTUVOVV9ISU5UKSkpKSk7XG4gIH1cblxufVxuXG5jbGFzcyBTdGF0dXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHN0YXR1cyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFByZXNlbmNlKVswXS5kZWZhdWx0LmdldFByZXNlbmNlKCkuc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IFwiaW52aXNpYmxlXCIpIHN0YXR1cyA9IFwib2ZmbGluZVwiO1xuICAgIGxldCBjbGFzc05hbWUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE2XCIsXG4gICAgICB4OiBcIjYwXCIsXG4gICAgICB5OiBcIjYwXCIsXG4gICAgICBmaWxsOiBcIiNmZmZmZmZcIixcbiAgICAgIG1hc2s6IGB1cmwoI3N2Zy1tYXNrLXN0YXR1cy0ke3N0YXR1c30pYCxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSk7XG4gIH1cblxufVxuXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiO1xuXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpO1xuICAgIGxldCBbZmxleE1vZHVsZTEsIHN0eWxpbmdNb2R1bGUxLCByb290TW9kdWxlMSwgYXZhdGFyTW9kdWxlMSwgbmFtZVRhZ01vZHVsZTEsIGFjdGl2aXR5TW9kdWxlMSwgdGV4dE1vZHVsZTEsIHNpemVNb2R1bGUxLCBzY3JvbGxlck1vZHVsZTEsIG5vdGVNb2R1bGUxLCBNZXNzYWdlc10gPSBbQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlQcm9maWxlKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyRmFkZSlbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXNdO1xuICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpO1xuICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcDtcbiAgICByZXR1cm4gW1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImxjLXRhYlwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS52ZXJ0aWNhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5yb290fWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiByb290TW9kdWxlMS50b3BTZWN0aW9uUGxheWluZ1xuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmF2YXRhcn0gJHthdmF0YXJNb2R1bGUxLndyYXBwZXJ9YCxcbiAgICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogXCI4MHB4XCIsXG4gICAgICAgIGhlaWdodDogXCI4MHB4XCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgIHdpZHRoOiBcIjkyXCIsXG4gICAgICBoZWlnaHQ6IFwiODBcIixcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDkyIDgwXCIsXG4gICAgICBjbGFzczogYCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZm9yZWlnbk9iamVjdFwiLCB7XG4gICAgICB4OiBcIjBcIixcbiAgICAgIHk6IFwiMFwiLFxuICAgICAgd2lkdGg6IFwiODBcIixcbiAgICAgIGhlaWdodDogXCI4MFwiLFxuICAgICAgbWFzazogXCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgIHNyYzogYXZhdGFyVVJMLFxuICAgICAgYWx0OiBcIiBcIixcbiAgICAgIGNsYXNzOiBhdmF0YXJNb2R1bGUxLmF2YXRhclxuICAgIH0pKSwgUmVhY3QuY3JlYXRlRWxlbWVudChTdGF0dXMsIG51bGwpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLmhlYWRlckluZm99YFxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLm5hbWVUYWd9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLnVzZXJuYW1lfWBcbiAgICB9LCB1c2VyLnVzZXJuYW1lKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmRpc2NyaW1pbmF0b3JcbiAgICB9LCBcIiNcIiwgdXNlci5kaXNjcmltaW5hdG9yKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VzfWAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KEJhZGdlcywgbnVsbCkpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmhlYWRlckZpbGxcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlQcm9maWxlfSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWBcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgY2xhc3M6IGAke2FjdGl2aXR5TW9kdWxlMS5oZWFkZXJUZXh0Tm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWBcbiAgICB9LCBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWxcbiAgICB9LCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCBpbWFnZXMgPSBbXTtcblxuICAgICAgaWYgKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pIHtcbiAgICAgICAgaW1hZ2VzLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICAgIHNyYzogYGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2AsXG4gICAgICAgICAgY2xhc3M6IGAke2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlUHJvZmlsZX0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1Byb2ZpbGUgOiBcIlwifWBcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSkge1xuICAgICAgICBpbWFnZXMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgICBhbHQ6IFwiXCIsXG4gICAgICAgICAgc3JjOiBgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYCxcbiAgICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLmFzc2V0c1xuICAgICAgfSwgaW1hZ2VzKTtcbiAgICB9KSgpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1Byb2ZpbGUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcbiAgICAgIH1cbiAgICB9LCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLm5hbWUpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzOiBgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gLFxuICAgICAgICB0aXRsZTogZGF0YS5uYW1lXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlOYW1lXG4gICAgICB9LCBkYXRhLm5hbWUpKTtcbiAgICB9KSgpLCAoKCkgPT4ge1xuICAgICAgaWYgKCFkYXRhLmRldGFpbHMpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgY2xhc3M6IGFjdGl2aXR5TW9kdWxlMS5kZXRhaWxzXG4gICAgICB9LCBkYXRhLmRldGFpbHMpO1xuICAgIH0pKCksICgoKSA9PiB7XG4gICAgICBpZiAoIWRhdGEuc3RhdGUpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogYWN0aXZpdHlNb2R1bGUxLnN0YXRlXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIHRpdGxlOiBkYXRhLnN0YXRlXG4gICAgICB9LCBkYXRhLnN0YXRlKSk7XG4gICAgfSkoKSwgKCgpID0+IHtcbiAgICAgIGlmICghZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pIHJldHVybiBudWxsO1xuICAgICAgbGV0IHRpbWVDb21wb25lbnQgPSB0aW1lc3RhbXBSZW5kZXIoVGltZXN0YW1wLCBNZXNzYWdlcyk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzOiBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcbiAgICAgICAgdGltZXN0YW1wczoge1xuICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0pKCkpKSkpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuYm9keVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uSGVhZGVyXG4gICAgfSwgTWVzc2FnZXMuTk9URSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke3Jvb3RNb2R1bGUxLm5vdGV9ICR7bm90ZU1vZHVsZTEubm90ZX1gXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIsIHtcbiAgICAgIHBsYWNlaG9sZGVyOiBNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSLFxuICAgICAgbWF4bGVuZ3RoOiBcIjI1NlwiLFxuICAgICAgYXV0b2NvcnJlY3Q6IFwib2ZmXCIsXG4gICAgICBjbGFzczogQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogXCI0MHB4XCJcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgIH0pKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdGVkQWNjb3VudHMsIG51bGwpKSkpKSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwibGMtIFwiXG4gICAgfSldO1xuICB9XG5cbn1cblxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IGFjY291bnRzID0gW107XG4gICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF07XG4gICAgbGV0IEFjY291bnRNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0QWNjb3VudHMpWzBdLmRlZmF1bHQ7XG4gICAgbGV0IGFjY3MgPSBBY2NvdW50TW9kdWxlMS5nZXRBY2NvdW50cygpLmZpbHRlcihlID0+IGUudmlzaWJpbGl0eSA9PT0gMSk7XG5cbiAgICBmb3IgKGxldCBhY2Mgb2YgYWNjcykge1xuICAgICAgYWNjb3VudHMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3RlZEFjY291bnQsIHtcbiAgICAgICAgYWNjOiBhY2NcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogcm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9uXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRzXG4gICAgICB9LCBhY2NvdW50cykpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbn1cblxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgW2ZsZXhNb2R1bGUxLCBzdHlsaW5nTW9kdWxlMSwgcm9vdE1vZHVsZTEsIGZsb3dlck1vZHVsZTEsIGFuY2hvck1vZHVsZTEsIFNvY2lhbENvbnN0YW50c10gPSBbQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuYW5jaG9yKVswXSwgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0ICYmIGUuZGVmYXVsdC5tYXApWzBdLmRlZmF1bHRdO1xuICAgIGxldCBhY2MgPSB0aGlzLnByb3BzLmFjYztcbiAgICBsZXQgY29uc3RhbnRzU29jaWFsID0gU29jaWFsQ29uc3RhbnRzLmdldChhY2MudHlwZSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IGAke2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnR9YCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZsZXg6IFwiMCAxIGF1dG9cIlxuICAgICAgfVxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgYWx0OiBgTG9nbyAke2NvbnN0YW50c1NvY2lhbC5uYW1lfWAsXG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudEljb24sXG4gICAgICBzcmM6IGNvbnN0YW50c1NvY2lhbC5pY29uLmNvbG9yIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLndoaXRlIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLmdyZXlcbiAgICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogcm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lclxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lXG4gICAgfSwgYWNjLm5hbWUpLCBhY2MudmVyaWZpZWQgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBgJHtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJDb250YWluZXJ9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbn1gLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IFwiMTZweFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICB9XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICBjbGFzczogZmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyLFxuICAgICAgd2lkdGg6IFwiMTZcIixcbiAgICAgIGhlaWdodDogXCIxNlwiLFxuICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgICAgZmlsbDogXCIjNGY1NDVjXCIsXG4gICAgICBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIixcbiAgICAgIGQ6IFwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwiXG4gICAgfSkpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBmbG93ZXJNb2R1bGUxLmNoaWxkQ29udGFpbmVyXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE2XCIsXG4gICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNS4yXCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCIsXG4gICAgICBmaWxsOiBcIiNmZmZmZmZcIlxuICAgIH0pKSkpKSA6IG51bGwpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICBjbGFzczogYCR7YW5jaG9yTW9kdWxlMS5hbmNob3J9ICR7YW5jaG9yTW9kdWxlMS5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsXG4gICAgICByZWw6IFwibm9yZWZlcnJlciBub29wZW5lclwiLFxuICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgIHRhYmluZGV4OiBcIjBcIlxuICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRPcGVuSWNvbixcbiAgICAgIHdpZHRoOiBcIjI0XCIsXG4gICAgICBoZWlnaHQ6IFwiMjRcIixcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgICAgZDogXCJNMTAgNVYzSDUuMzc1QzQuMDY1MTkgMyAzIDQuMDY1MTkgMyA1LjM3NVYxOC42MjVDMyAxOS45MzYgNC4wNjUxOSAyMSA1LjM3NSAyMUgxOC42MjVDMTkuOTM2IDIxIDIxIDE5LjkzNiAyMSAxOC42MjVWMTRIMTlWMTlINVY1SDEwWlwiXG4gICAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgICBkOiBcIk0yMSAyLjk5OTAySDE0VjQuOTk5MDJIMTcuNTg2TDkuMjkyOTcgMTMuMjkyTDEwLjcwNyAxNC43MDZMMTkgNi40MTMwMlY5Ljk5OTAySDIxVjIuOTk5MDJaXCJcbiAgICB9KSkpKTtcbiAgfVxuXG59XG5cbmNsYXNzIEJhZGdlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKCk7XG4gICAgbGV0IHJvb3RNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXTtcbiAgICBsZXQgVXNlckZsYWdzID0gQkRNb2R1bGVzLmdldChlID0+IGUuVXNlckZsYWdzKVswXS5Vc2VyRmxhZ3M7XG4gICAgbGV0IGJhZGdlcyA9IFtdO1xuICAgIGxldCBzZXJpYWxpemVkID0gW107XG5cbiAgICBmb3IgKGxldCBmbGFnTmFtZSBpbiBVc2VyRmxhZ3MpIHtcbiAgICAgIGlmICh1c2VyLmhhc0ZsYWcoVXNlckZsYWdzW2ZsYWdOYW1lXSkpIHNlcmlhbGl6ZWQucHVzaChmbGFnTmFtZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZmxhZ05hbWUgb2Ygc2VyaWFsaXplZCkge1xuICAgICAgbGV0IHNlYXJjaGFibGUgPSBgcHJvZmlsZUJhZGdlJHtmbGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCIgXCIpLnNwbGl0KFwiIFwiKS5tYXAoZSA9PiBlWzBdLnRvVXBwZXJDYXNlKCkgKyBlLnNsaWNlKDEpKS5qb2luKFwiXCIpfWA7XG4gICAgICBzZWFyY2hhYmxlID0gc2VhcmNoYWJsZS5yZXBsYWNlKFwiSHlwZXNxdWFkT25saW5lXCIsIFwiSHlwZVNxdWFkT25saW5lXCIpO1xuICAgICAgaWYgKCFyb290TW9kdWxlW3NlYXJjaGFibGVdKSBjb250aW51ZTtcbiAgICAgIGJhZGdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgbmFtZTogc2VhcmNoYWJsZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICh1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pIHtcbiAgICAgIGJhZGdlcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgbmFtZTogXCJwcm9maWxlQmFkZ2VQcmVtaXVtXCJcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFkZ2VzO1xuICB9XG5cbn1cblxuY2xhc3MgQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IHJvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZVdyYXBwZXJcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwiXCIsXG4gICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgdGFiaW5kZXg6IFwiMFwiXG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzczogYCR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlfSAke3Jvb3RNb2R1bGUxW3RoaXMucHJvcHMubmFtZV19YFxuICAgIH0pKSkpO1xuICB9XG5cbn1cblxuY2xhc3MgVGltZXN0YW1wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogdGltZXN0YW1wQ2xhc3NcbiAgICB9LCB0aGlzLnByb3BzLm1lc3NhZ2UpO1xuICB9XG5cbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/presenceSettings.jsx\n"); /***/ }), diff --git a/BetterDiscordApp/src/modules/core.js b/BetterDiscordApp/src/modules/core.js index 54e442e..7158049 100644 --- a/BetterDiscordApp/src/modules/core.js +++ b/BetterDiscordApp/src/modules/core.js @@ -110,6 +110,13 @@ Core.prototype.init = async function() { Utils.suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")(); Utils.suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")(); Utils.suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")(); + + if(bdConfig.haveInstalledDefault){ + let alert = Utils.alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.") + await new Promise((resolve) => { + alert.onClose(resolve) + }) + } }; Core.prototype.checkForGuilds = function() { diff --git a/BetterDiscordApp/src/modules/utils.js b/BetterDiscordApp/src/modules/utils.js index 13c961f..e647f84 100644 --- a/BetterDiscordApp/src/modules/utils.js +++ b/BetterDiscordApp/src/modules/utils.js @@ -234,13 +234,50 @@ export default class Utils {
`); modal.querySelector(".footer button").addEventListener("click", () => { DOM.addClass(modal, "closing"); - setTimeout(() => { modal.remove(); }, 300); + setTimeout(() => { + modal.remove(); + closingListeners.forEach((listener) => { + try{ + listener() + }catch(e){ + console.error(e) + } + }) + }, 300); }); modal.querySelector(".bd-backdrop").addEventListener("click", () => { DOM.addClass(modal, "closing"); - setTimeout(() => { modal.remove(); }, 300); + setTimeout(() => { + modal.remove(); + closingListeners.forEach((listener) => { + try{ + listener() + }catch(e){ + console.error(e) + } + }) + }, 300); }); DOM.query("#app-mount").append(modal); + const closingListeners = [] + return { + close: () => { + DOM.addClass(modal, "closing"); + setTimeout(() => { + modal.remove(); + closingListeners.forEach((listener) => { + try{ + listener() + }catch(e){ + console.error(e) + } + }) + }, 300); + }, + onClose: (listener) => { + closingListeners.push(listener) + } + } } static showContentErrors({plugins: pluginErrors = [], themes: themeErrors = []}) { diff --git a/BetterDiscordApp/src/ui/presenceSettings.jsx b/BetterDiscordApp/src/ui/presenceSettings.jsx index f38f41f..40bcd0e 100644 --- a/BetterDiscordApp/src/ui/presenceSettings.jsx +++ b/BetterDiscordApp/src/ui/presenceSettings.jsx @@ -6,6 +6,7 @@ import { defaultRPC, settingsRPC } from "../0globals"; import CustomRichPresence from "../modules/CustomRichPresence" import Select from "./select"; import timestampRender from "./timestampRender" +import { remote } from "electron"; /** * @type {typeof import("react")} @@ -138,6 +139,16 @@ export default class V2C_PresenceSettings extends React.Component {
e.marginBottom20)[0].marginBottom20}>
+ + ) } } diff --git a/modules/discord_desktop_core/core/app/BetterDiscord/assets/DiscordDark.theme.css b/modules/discord_desktop_core/core/app/BetterDiscord/assets/DiscordDark.theme.css new file mode 100644 index 0000000..cd7bf87 --- /dev/null +++ b/modules/discord_desktop_core/core/app/BetterDiscord/assets/DiscordDark.theme.css @@ -0,0 +1,12 @@ +/** + * @name Dark Discord + * @version 1.0 + * @description An actual dark mode for discord. + * @source https://github.com/zzzmario/dark-discord + * @authorId 583062692596547585 + * @author mario + * @donate https://paypal.me/zzzmario + * @invite sSeBYs +**/ + +@import url(https://zzzmario.github.io/dark-discord/src/source.css); \ No newline at end of file diff --git a/modules/discord_desktop_core/core/app/BetterDiscord/index.js b/modules/discord_desktop_core/core/app/BetterDiscord/index.js index 1910200..feba95b 100644 --- a/modules/discord_desktop_core/core/app/BetterDiscord/index.js +++ b/modules/discord_desktop_core/core/app/BetterDiscord/index.js @@ -4,6 +4,7 @@ const Logger = require("./Logger") const fs = require("fs") const path = require("path") const electron = require("electron") +const fetch = require("node-fetch").default const events = exports.events = new EventEmitter() const logger = exports.logger = new Logger("LightCord") @@ -76,8 +77,45 @@ async function privateInit(){ let pluginPath = path.join(BetterDiscordConfig.dataPath, "plugins") let themePath = path.join(BetterDiscordConfig.dataPath, "themes") console.log(`Plugins: ${pluginPath}\nThemes: ${themePath}`) - if(!fs.existsSync(pluginPath))fs.mkdirSync(pluginPath, {recursive: true}) - if(!fs.existsSync(themePath))fs.mkdirSync(themePath, {recursive: true}) + if(!fs.existsSync(pluginPath)){ + fs.mkdirSync(pluginPath, {recursive: true}) + + /** Downloads Util Plugins So the user don't have to install it manually */ + + /** ZeresPluginLibrary */ + const ZeresPluginLibraryPath = path.join(pluginPath, "0PluginLibrary.plugin.js") + fetch("https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js") + .then(async res => { + if(res.status !== 200)return + const content = await res.buffer() + fs.writeFileSync(ZeresPluginLibraryPath, content) + }) + + // Should we download 1XenoLib and BDFDB too ? + + BetterDiscordConfig.haveInstalledDefault = true // Inform User about what we just did + } + if(!fs.existsSync(themePath)){ + fs.mkdirSync(themePath, {recursive: true}) + + /** Downloads Basic Themes to guide user and showcase features */ + + /** Discord Dark */ + const DiscordDarkPath = path.join(themePath, "DiscordDark.theme.css") + const themeContent = fs.readFileSync(path.join(__dirname, "assets", "DiscordDark.theme.css"), "utf8") + fs.writeFileSync(DiscordDarkPath, themeContent, "utf8") + + /** Glasscord Example */ + const GlasscordExamplePath = path.join(themePath, "glasscord_example.theme.css") + fetch("https://raw.githubusercontent.com/AryToNeX/Glasscord/master/extras/discord_example.theme.css") + .then(async res => { + if(res.status !== 200)return + const content = await res.buffer() + fs.writeFileSync(GlasscordExamplePath, content) + }) + + BetterDiscordConfig.haveInstalledDefault = true // Inform User about what we just did + } // setting Discord Internal Developer Mode for developement and test purposes. Object.defineProperty(ModuleLoader.get(e => e.default && typeof e.default === "object" && ("isDeveloper" in e.default))[0].default, "isDeveloper", { @@ -136,7 +174,7 @@ const LightcordBDFolder = path.join(electron.remote.app.getPath("appData"), "Lig const BetterDiscordConfig = window.BetterDiscordConfig = { "branch": "lightcord", - dataPath: LightcordBDFolder, + dataPath: LightcordBDFolder+"/", os: process.platform, latestVersion: "0.3.4", version: "0.3.4" @@ -180,6 +218,9 @@ const BetterDiscordFolder = function() { } }() +console.log(`Original BetterDiscord Path: ${BetterDiscordFolder} +Lightcord's BetterDiscord Path: ${LightcordBDFolder}`) + path.resolve = (...args) => { // Patching BetterDiscord folder by Lightcord's BetterDiscord folder let resp = originalResolve.call(path, ...args) if(resp.startsWith(BetterDiscordFolder))resp = resp.replace(BetterDiscordFolder, LightcordBDFolder)